Initial Contribution
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..49ce8e3
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,7 @@
+/.java_bin
+/.java_src
+/.jgit_version
+/.protobuf_version
+/config.mak
+/release
+/test
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/DEPLOY_GAE b/DEPLOY_GAE
new file mode 100644
index 0000000..4dea8b3
--- /dev/null
+++ b/DEPLOY_GAE
@@ -0,0 +1,90 @@
+Deploying Gerrit to Google App Engine
+=====================================
+
+To deploy Gerrit to a new (or an upgrade for an existing) Google
+App Engine instance:
+
+----
+	make update APPID=your-application-id ADMIN=your@email
+----
+
+where "your-application-id" is the unique application id you chose
+for the application instance at the time you registered it with
+Google App Engine;
+
+and where "your@email" is a Google Account username that is
+registered as a developer/administrator of the Google App Engine
+instance identified by $APPID.
+
+
+Saving Configuration
+--------------------
+
+If you are frequently deploying via the same user account or to the
+same instance you may want to save your configuration options into
+a local config.mak file:
+
+----
+	$ cat config.mak
+	ADMIN = your@email
+	APPID = your-application
+----
+
+as these parameters can then be left off of the make update
+command line:
+
+----
+	make update
+----
+
+
+Admin Only Lockout
+------------------
+
+When updating a Google App Engine instance Gerrit can be configured
+to only permit admin logins.  This may be useful when setting up
+a testing/development environment, where external users are not
+desired yet.
+
+Simply set ADMIN_ONLY=1 when running the build:
+
+----
+	make update ADMIN_ONLY=1 [other options...]
+----
+
+You may wish to have this configured in your config.mak file:
+
+----
+	$ cat config.mak
+	ifeq ($(APPID),your-private-id)
+		ADMIN_ONLY=1
+	endif
+----
+
+This way the lockout is automatically enabled when you run a build.
+
+To disable the lockout, run "make update" without ADMIN_ONLY set
+(e.g. delete or comment it out from your config.mak file).
+
+
+
+Special Options
+---------------
+
+When deploying to an internal Google App Engine instance you may
+need to set APPCFG_OPTS to point to the internal admin console.
+This is best configured in your config.mak file:
+
+----
+	$ cat config.mak
+	ADMIN = you@google.com
+	APPID = your-application
+
+	ifeq ($(APPID),internal-app-id)
+		APPCFG_OPTS = -s admin-console.some.internal.host.name
+	endif
+----
+
+As a Googler you will need to search the intranet to locate the
+correct hostname for the internal admin-console, or ask someone who
+is involved with Gerrit or the Google App Engine team for the name.
diff --git a/DEPLOY_MGR b/DEPLOY_MGR
new file mode 100644
index 0000000..ff330ac
--- /dev/null
+++ b/DEPLOY_MGR
@@ -0,0 +1,182 @@
+Deploying Gerrit's Manager Backend
+==================================
+
+The manager backend is a Java process that performs batch operations
+on local Git repositories, based on the metadata recorded into the
+Gerrit instance running on Google App Engine.
+
+To deploy the backend:
+
+----
+	$ make release-mgr
+	$ scp -r release/mgr you@some.server:mgr
+---
+
+
+Running
+-------
+
+To start the backend server process:
+
+----
+	$ ./bin/mgr mgr.config &
+----
+
+where mgr.config is the backend's configuration file (see below
+for details on its format and options).
+
+To stop the backend, send it a SIGINT:
+
+----
+	kill -INT $mgrpid
+----
+
+
+Creating Gerrit Projects and Branches
+-------------------------------------
+
+To create new projects/branches in Gerrit to match those available
+locally in Git run the mgr in the foreground with its sync option:
+
+----
+	$ ./bin/mgr mgr.config sync
+----
+
+The sync subcommand will create a new Gerrit project for any new
+Git repository found under codereview.basedir.  It also creates
+a new branch in Gerrit for any branch in any new or existing Git
+repository.
+
+
+
+Manager Configuration
+---------------------
+
+The manager backend requires a configuration file to designate
+which Git repositories it will have access to, and which Gerrit
+instance it communicates with.
+
+The configuration file is in `git config` format and can thus be
+automatically read/updated via `git config --file=<name>`.  It can
+also be hand-modified.  For more details on the file format, see
+`man git-config`.
+
+----
+	$ cat mgr.config
+	[user]
+	  name = Gerrit Code Review
+	  email = gerrit@localhost
+
+	[codereview]
+	  server = http://androidreview.appspot.com/
+	  basedir = /pub/scm/git
+	  username = role-account@gmail.com
+	  secureconfig = .secure-mgr-config
+	  sleep = 60
+
+	[log]
+	  file = mgr.log
+	  level = debug
+----
+
+A description of the major options follows:
+
+user.name::
+	Author/committer name Gerrit records when creating an
+	automatic merge commit.
+
+user.email::
+	Author/committer email Gerrit records when creating an
+	automatic merge commit.
+
+codereview.server::
+	URL of the Gerrit Google App Engine instance providing
+	database support and web user interface to the code review
+	system.  Presently only HTTP is supported.  Future releases
+	of Gerrit may support HTTPS, if/when Google App Engine ever
+	supports HTTPS.
+
+codereview.basedir::
+	Root directory that all Git repositories are relative to.
+	Repositories in this directory should be bare repositories.
+	The name of a project in Gerrit is appended to this directory
+	to determine the path of the corresponding Git repository
+	where change branches are stored and merges take place.
+
+codereview.username::
+	(Optional) Google Account username to authenticate to
+	codereview.server with.  This option is only required if the
+	Gerrit instance has been set to ADMIN_ONLY=1.  (Normally the
+	manager backend uses a more secure authentication strategy.)
+	If set, make sure codereview.password is also in the secure
+	configuration file.
+
+codereview.secureconfig::
+	Path to the secure configuration file (see below).
+	A relative path is evaluated relative to the main
+	configuration file.
+
+codereview.sleep::
+	Number of seconds between queries when Gerrit says there
+	is nothing waiting to be processed.  This is the maximum
+	latency between when an upload or merge request is first
+	stored in the data store and when the backend can process it.
+
+codereview.memory::
+	Maximum amount of Java heap memory to give to the manager
+	process.  Valid values are in bytes, with standard "m" and
+	"g" suffixes for "megabytes" and "gigabytes".  E.g. "256m"
+	would assign up to 256 megabytes of memory to the manager.
+
+log.file::
+	Path to the log file the server writes messages to.  If not
+	set messages are sent to stdout.
+
+log.level::
+	Set the verbosity of the logging.  Supported values are:
+	fatal, error, warning, info, debug, trace.  Later levels
+	include all messages from all earlier levels.
+
+
+Secure Configuration File
+-------------------------
+
+The secure configuration file stores additional details which
+should never be made public.  This file should be protected with
+filesystem level access controls, e.g. "chmod 0600" on UNIX prior
+to writing any information into it.
+
+----
+	$ cat .secure-mgr-config
+	[codereview]
+	  password = g3rr1t1sc001
+	  internalapikey = somebiglongkeystring
+----
+
+codereview.password::
+	(Optional) Password matching the Google Account listed
+	in codereview.username in the main configuration file.
+	This value is only required if the Gerrit instance is in
+	ADMIN_ONLY=1 mode and thus needs the backend to authenticate
+	with a Google Account.
+
+codereview.internalapikey::
+	The private key used for HMAC authentication between the
+	manager backend and the Gerrit instance running on Google
+	App Engine.  Any application developer/administrator can
+	get this key from http://APPID.appspot.com/admin/settings
+
+
+Parallel Operation Concerns
+---------------------------
+
+The backend uses aggressive caching, and is not yet fully safe to
+run concurrently with command line Git operations such as `git gc`,
+`git repack` or `git pack-refs`.
+
+Until the backend has been fully patched to support concurrent
+operations, do not run Git operations in repositories under
+codereview.basedir while a backend is running on that directory.
+
+In order to repack safely, stop the backend, run the repack activity,
+then start it back up again.
diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN
new file mode 100755
index 0000000..684610c
--- /dev/null
+++ b/GIT-VERSION-GEN
@@ -0,0 +1,31 @@
+#!/bin/sh
+#
+# Copyright 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+VN=$(git describe --abbrev=8 HEAD 2>/dev/null)
+case "$VN" in
+v[0-9]*) : happy ;;
+*)       exit 1  ;;
+esac
+
+dirty=$(sh -c 'git diff-index --name-only HEAD' 2>/dev/null) || dirty=
+case "$dirty" in
+'')
+	;;
+*)
+	VN="$VN-dirty" ;;
+esac
+
+echo $VN
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..b52d80d
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,401 @@
+# Gerrit
+#
+# Copyright 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+# Define DATASTORE to the location where 'make serve' should store its
+# runtime data files; by default this is /tmp/dev_appserver.datastore.
+#
+# Define REMOTE=1 to enable remote hosts to connect to the development
+# web server started by 'make serve'.  This may be a security risk.
+#
+# Define EMAIL=1 to enable sending email messages during 'make serve'.
+# This may spam invalid addresses, so it is off by default.
+#
+# Define APPID to the unique Google App Engine application instance
+# 'make update' will upload the application files to.
+#
+# Define SDK to the location of the Google App Engine SDK download.
+#
+# Define PYSDK to the location of a 'python2.5' interpreter.
+#
+# Define ADMIN_ONLY to lock the release application build to only
+# its Google App Engine administrative accounts.
+#
+# Define ADMIN to the email address of an admin account that can
+# run appcfg.py to update the code.  This parameter is only used
+# by the administrative targets.
+#
+
+ifeq ($(shell uname),Darwin)
+	SDK = /usr/local/bin
+else
+	SDK = $(HOME)/google_appengine
+endif
+
+APPID         = gerrit-code-review-tool-demo
+APPNAME_HTML  = <i>Gerrit</i> Code Review Tool
+
+ADMIN         = set.ADMIN@read.the.docs
+PYSDK         = python2.5
+JAVAC         = javac -target 1.5
+CPIO          = cpio -pd
+DEV_APPSERVER = $(PYSDK) $(SDK)/dev_appserver.py
+APPCFG        = $(PYSDK) $(SDK)/appcfg.py $(APPCFG_OPTS) -e '$(ADMIN)'
+
+-include config.mak
+
+ifeq ($(APPID),android-codereview)
+APPNAME_HTML  = Android Code Review
+endif
+
+protobuf := ../protobuf
+PROTOC   := $(abspath $(protobuf)/src/protoc)
+jgit     := ../jgit
+MGR_APP  := mgrapp
+WEB_APP  := webapp
+WEB_ARG  :=
+
+ifdef DATASTORE
+	WEB_ARG += --datastore_path=$(DATASTORE)
+endif
+ifeq (1,$(REMOTE))
+	WEB_ARG += --address 0.0.0.0
+endif
+ifeq (1,$(EMAIL))
+	WEB_ARG += --enable_sendmail
+endif
+
+R_WEB      := release/web
+R_MGR      := release/mgr
+R_PYCLIENT := release/pyclient
+
+PYZIP_IGNORE := $(strip \
+	.gitignore \
+	.gitattributes \
+	\*.pyc \
+	\*.pyo \
+)
+django_IGNORE := $(strip \
+	.svn \
+	gis \
+	admin \
+	localflavor \
+	mysql \
+	mysql_old \
+	oracle \
+	postgresql \
+	postgresql_psycopg2 \
+	sqlite3 \
+	test \
+	\*.po \
+	\*.mo \
+)
+
+WEB_INCLUDE := $(strip \
+	__init__.py \
+	app.yaml \
+	index.yaml \
+	main.py \
+	settings.py \
+	static \
+	templates \
+)
+WEB_HASH := $(strip $(patsubst $(WEB_APP)/%,%,\
+	$(wildcard $(WEB_APP)/static/*.js) \
+	$(wildcard $(WEB_APP)/static/*.css) \
+))
+WEB_PYZIP := $(strip \
+	codereview \
+	django \
+	froofle \
+)
+PYCLIENT_INCLUDE := $(strip \
+	froofle \
+	codereview/__init__.py \
+	codereview/proto_client.py \
+	codereview/*_pb2.py \
+)
+
+PROTO_SRC            := proto
+PUBLIC_PROTO         := $(wildcard $(PROTO_SRC)/*.proto)
+INTERNAL_PROTO       := $(wildcard $(PROTO_SRC)/internal/*.proto)
+
+jgit_jar               := $(MGR_APP)/lib/jgit.jar
+jsch_jar               := $(MGR_APP)/lib/jsch.jar
+protobuf_jar           := $(MGR_APP)/lib/protobuf.jar
+protobuf_jar_src       := $(protobuf)/java/src/main/java
+codereview_proto_jar   := $(MGR_APP)/lib/codereview_proto.jar
+codereview_manager_jar := $(MGR_APP)/lib/codereview_manager.jar
+
+ALL_PROTO := $(strip \
+	$(PUBLIC_PROTO) \
+	$(INTERNAL_PROTO) \
+)
+
+MGR_LIB := $(strip \
+	$(jsch_jar) \
+	$(jgit_jar) \
+	$(wildcard $(MGR_APP)/lib/*.jar) \
+	$(protobuf_jar) \
+	$(codereview_proto_jar) \
+)
+MGR_LIB := $(sort $(MGR_LIB))
+MGR_LIB := $(filter-out $(codereview_manager_jar),$(MGR_LIB))
+
+GEN_JAR := $(strip \
+	$(jsch_jar) \
+	$(jgit_jar) \
+	$(protobuf_jar) \
+	$(codereview_proto_jar) \
+	$(codereview_manager_jar) \
+	\
+	$(basename $(jsch_jar))_src.zip \
+	$(basename $(jgit_jar))_src.zip \
+)
+
+PROTO_PY := $(patsubst $(PROTO_SRC)/%,$(WEB_APP)/codereview/%,\
+            $(patsubst %.proto,%_pb2.py,$(ALL_PROTO))) \
+            $(WEB_APP)/froofle/__init__.py
+
+
+## Top level targets
+##
+
+all: web mgr
+release: release-web release-mgr release-pyclient
+
+clean:
+	@rm -rf release .java_src .java_bin .proto_out
+	@rm -f .jgit_version .protobuf_version
+	@rm -f $(protobuf_jar_src)/com/google/protobuf/DescriptorProtos.java
+	@rm -f $(GEN_JAR)
+	@rm -rf $(WEB_APP)/froofle $(WEB_APP)/froofle+
+	@find $(WEB_APP)/codereview -name '*.pyc' | xargs rm -f
+	@find $(WEB_APP)/codereview -name '*_pb2.py' | xargs rm -f
+
+
+## Web application
+##
+
+web: $(PROTO_PY)
+
+serve: web
+	$(DEV_APPSERVER) $(WEB_ARG) $(WEB_APP)
+
+release-web: web
+	@echo Building Gerrit `./GIT-VERSION-GEN` for $(APPID):
+	@rm -rf $(R_WEB)
+	@mkdir -p $(R_WEB)
+	@cd $(WEB_APP) && \
+	 $(foreach a,$(WEB_PYZIP),\
+	   echo "  Packing $a.zip" && \
+	   find $a \
+	    $(foreach i,$(PYZIP_IGNORE), -name $i -prune -o) \
+	    $(foreach i,$(value $(a)_IGNORE), -name $i -prune -o) \
+	    -type f -print | \
+	   zip -q9 $(abspath $(R_WEB)/$a.zip) -@ &&) \
+	 echo "  Copying loose files" && \
+	 find $(WEB_INCLUDE) \
+	  $(foreach i,$(WEB_HASH), -path $i -prune -o) \
+	  -type f -print | $(CPIO) $(abspath $(R_WEB)) && \
+	 echo "  Hashing loose files" && \
+	 $(foreach i,$(WEB_HASH),\
+	   h=$$(openssl sha1 <$i) && \
+	   d=$(basename $i)-$$h$(suffix $i) && \
+	   echo "    $$d" && \
+	   cp $i $(abspath $(R_WEB))/$$d && \
+	   find $(abspath $(R_WEB)/templates) -type f \
+	   | xargs perl -pi -e "s,$i,$$d,g" && ) \
+	 true
+	@./GIT-VERSION-GEN >$(R_WEB)/static/application_version
+	@echo "This is Gerrit `./GIT-VERSION-GEN`" >$(R_WEB)/templates/live_revision.html
+	@perl -pi -e 's{PUBLIC APPLICATION NAME}{$(APPNAME_HTML)}' $(R_WEB)/templates/base.html
+	@perl -pi -e 's/(application:).*/$$1 $(APPID)/' $(R_WEB)/app.yaml
+ifdef ADMIN_ONLY
+	@echo '*** SETTING ADMIN_ONLY ***'
+	@perl -pi -e 's/^(.*)(script:.*main.py)/$$1login: admin\n$$1$$2/' $(R_WEB)/app.yaml
+endif
+	@echo $(R_WEB) built for $(APPID).
+
+update: release-web
+	$(APPCFG) update $(R_WEB)
+
+version:
+	@printf '%s = ' '$(APPID)'
+	@curl http://$(APPID).appspot.com/application_version
+
+## Python RPC client
+##
+
+release-pyclient: $(PROTO_PY)
+	@echo Building Python RPC client $(R_PYCLIENT)
+	@rm -rf $(R_PYCLIENT)
+	@mkdir -p $(R_PYCLIENT)
+	@cd $(WEB_APP) && \
+	 find $(PYCLIENT_INCLUDE) \
+	   $(foreach i,$(PYZIP_IGNORE), -name $i -prune -o) \
+	   -type f -print \
+	 | $(CPIO) $(abspath $(R_PYCLIENT))
+	@echo "__version__ = '`./GIT-VERSION-GEN`'" >>$(R_PYCLIENT)/codereview/__init__.py
+
+
+## Manager backend
+##
+
+mgr: $(codereview_manager_jar)
+
+release-mgr: mgr
+	@rm -rf $(R_MGR)
+	@mkdir -p $(R_MGR)
+	@cd $(MGR_APP) && \
+	 find bin \
+	  $(foreach i,.gitignore .gitattributes, -name $i -prune -o) \
+	  -type f -print \
+	 | $(CPIO) $(abspath $(R_MGR)) && \
+	 find lib -name \*.jar -type f -print \
+	 | $(CPIO) $(abspath $(R_MGR))
+	@echo $(R_MGR) built for `./GIT-VERSION-GEN`
+
+
+## Basic productions
+##
+
+$(PROTOC): .protobuf_version $(protobuf)/Makefile
+	$(MAKE) -C $(protobuf)
+	@touch $(PROTOC)
+$(protobuf)/configure: $(protobuf)/configure.ac .protobuf_version
+	cd $(protobuf) && ./autogen.sh
+$(protobuf)/Makefile: $(protobuf)/configure .protobuf_version
+	cd $(protobuf) && ./configure
+
+$(WEB_APP)/froofle/__init__.py: .protobuf_version $(PROTOC)
+	@echo Updating $(WEB_APP)/froofle ...
+	@rm -rf $(WEB_APP)/froofle $(WEB_APP)/froofle+
+	@mkdir $(WEB_APP)/froofle+
+	@cd $(protobuf)/python/google && \
+	 find . \
+	 $(foreach i,test_util.py \*_test.py, -name $i -prune -o) \
+	 -type f -name \*.py -print \
+	 | $(CPIO) $(abspath $(WEB_APP)/froofle+)
+	@cd $(protobuf)/python && \
+	 t=$(abspath .proto_out) && \
+	 rm -rf $$t && \
+	 mkdir -p $$t/google/protobuf && \
+	 $(PROTOC) -I../src -I. \
+	           --python_out=$$t \
+	           ../src/google/protobuf/descriptor.proto
+	@cp .proto_out/google/protobuf/descriptor_pb2.py \
+	    $(WEB_APP)/froofle+/protobuf
+	@rm -rf .proto_out
+	@find $(WEB_APP)/froofle+ -name __init__.py | xargs perl -ni -e ''
+	@find $(WEB_APP)/froofle+ -name '*.py' | xargs chmod a-x
+	@find $(WEB_APP)/froofle+ -name '*.py' \
+	 | xargs perl -pi -e 's/google(?!\.com)/froofle/g'
+	@mv $(WEB_APP)/froofle+ $(WEB_APP)/froofle
+
+$(WEB_APP)/codereview/%_pb2.py: $(PROTO_SRC)/%.proto $(PROTOC)
+	@echo protoc $< && \
+	 $(PROTOC) --python_out=$(dir $@) --proto_path=$(dir $<) $< && \
+	 perl -pi -e 's/google(?!\.com)/froofle/g' $@
+
+$(codereview_manager_jar): \
+		$(MGR_LIB) \
+		$(shell find $(MGR_APP)/src -type f)
+	@echo build $@
+	@rm -rf .java_bin && \
+	 b=$(abspath .java_bin) && \
+	 cd $(MGR_APP)/src && \
+	 mkdir $$b && \
+	 mkdir $$b/META-INF && \
+	 find META-INF/MANIFEST.MF | $(CPIO) $$b && \
+	 CLASSPATH=$$b && \
+	 $(foreach c,$(MGR_LIB),CLASSPATH=$$CLASSPATH:$(abspath $c) &&) \
+	 export CLASSPATH && \
+	 find . -name \*.java | xargs $(JAVAC) \
+		-encoding UTF-8 \
+		-g \
+		-d $$b
+	@cd .java_bin && jar cf $(abspath $@) .
+	@rm -rf .java_bin
+
+$(codereview_proto_jar): $(ALL_PROTO) $(protobuf_jar) $(PROTOC)
+	@echo build $@
+	@rm -rf .java_src .java_bin && \
+	 mkdir .java_src .java_bin && \
+	 $(foreach p,$(ALL_PROTO),\
+	  $(PROTOC) --java_out=.java_src --proto_path=$(dir $p) $p &&) \
+	 unset CLASSPATH && \
+	 cd .java_src && \
+	 find . -name '*.java' | xargs $(JAVAC) \
+		-encoding UTF-8 \
+		-g:none \
+		-nowarn \
+		-classpath $(abspath $(protobuf_jar)) \
+		-d ../.java_bin && \
+	 cd ../.java_bin && jar cf $(abspath $@) .
+	@rm -rf .java_src .java_bin
+
+$(protobuf_jar): \
+		$(protobuf)/src/google/protobuf/descriptor.proto \
+		$(shell find $(protobuf_jar_src) -type f)
+	@echo build $@
+	@rm -rf .java_bin && \
+	 b=$(abspath .java_bin) && \
+	 cd $(protobuf_jar_src) && \
+	 mkdir $$b && \
+	 CLASSPATH=$$b && \
+	 export CLASSPATH && \
+	 $(PROTOC) \
+		--java_out=. \
+		-I$(abspath $(protobuf)/src) \
+		$(abspath $(protobuf)/src/google/protobuf/descriptor.proto) && \
+	 find . -name \*.java | xargs $(JAVAC) \
+		-encoding UTF-8 \
+		-g \
+		-d $$b
+	@cd .java_bin && jar cf $(abspath $@) .
+	@rm -f $(protobuf_jar_src)/com/google/protobuf/DescriptorProtos.java
+	@rm -rf .java_bin
+
+$(jsch_jar): $(jgit)/org.spearce.jgit/lib/jsch-0.1.37.jar
+	rm -f $@ $(basename $@)_src.zip
+	cp $< $@
+	cp $(basename $<).zip $(basename $@)_src.zip
+
+$(jgit_jar): .jgit_version
+	rm -f $@ $(basename $@)_src.zip
+	cd $(jgit) && $(SHELL) ./make_jgit.sh
+	cp $(jgit)/jgit.jar $@
+	chmod 644 $@
+	cp $(jgit)/jgit_src.zip $(basename $@)_src.zip
+
+.jgit_version: jgit_phony
+	@a=`git --git-dir=$(jgit)/.git rev-parse HEAD 2>/dev/null`; \
+	 b=`cat .jgit_version 2>/dev/null`; \
+	 if test z$$a = z$$b; then : up to date; \
+	 else echo $$a >$@; fi
+
+.protobuf_version: protobuf_phony
+	@a=`git --git-dir=$(protobuf)/.git rev-parse HEAD 2>/dev/null`; \
+	 b=`cat .protobuf_version 2>/dev/null`; \
+	 if test z$$a = z$$b; then : up to date; \
+	 else echo $$a >$@; fi
+
+.PHONY: all clean release
+.PHONY: web release-web
+.PHONY: mgr release-mgr
+.PHONY: protobuf_phony
+.PHONY: jgit_phony
diff --git a/crm-data.tar.gz b/crm-data.tar.gz
new file mode 100644
index 0000000..b275dc9
--- /dev/null
+++ b/crm-data.tar.gz
Binary files differ
diff --git a/mgrapp/.classpath b/mgrapp/.classpath
new file mode 100644
index 0000000..4251917
--- /dev/null
+++ b/mgrapp/.classpath
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry exported="true" kind="lib" path="lib/codereview_proto.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/protobuf.jar" sourcepath="lib/protobuf_src.zip"/>
+	<classpathentry exported="true" kind="lib" path="lib/jgit.jar" sourcepath="lib/jgit_src.zip"/>
+	<classpathentry exported="true" kind="lib" path="lib/commons-httpclient.jar" sourcepath="lib/commons-httpclient_src.zip"/>
+	<classpathentry exported="true" kind="lib" path="lib/commons-codec.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/commons-logging.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/jsch.jar"/>
+	<classpathentry kind="lib" path="lib/commons-net.jar" sourcepath="lib/commons-net_src.zip"/>
+	<classpathentry kind="output" path="out_classes"/>
+</classpath>
diff --git a/mgrapp/.gitignore b/mgrapp/.gitignore
new file mode 100644
index 0000000..f0ca765
--- /dev/null
+++ b/mgrapp/.gitignore
@@ -0,0 +1,8 @@
+/lib/*_src.zip
+/lib/codereview_proto.jar
+/lib/codereview_manager.jar
+/lib/protobuf.jar
+/lib/jsch.jar
+/lib/jgit.jar
+/out_classes
+/.password-*
diff --git a/mgrapp/.project b/mgrapp/.project
new file mode 100644
index 0000000..868f04e
--- /dev/null
+++ b/mgrapp/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>mgrapp</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/mgrapp/.settings/org.eclipse.core.resources.prefs b/mgrapp/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..82eb859
--- /dev/null
+++ b/mgrapp/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,3 @@
+#Tue Sep 02 16:59:24 PDT 2008
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/mgrapp/.settings/org.eclipse.core.runtime.prefs b/mgrapp/.settings/org.eclipse.core.runtime.prefs
new file mode 100644
index 0000000..8667cfd
--- /dev/null
+++ b/mgrapp/.settings/org.eclipse.core.runtime.prefs
@@ -0,0 +1,3 @@
+#Tue Sep 02 16:59:24 PDT 2008
+eclipse.preferences.version=1
+line.separator=\n
diff --git a/mgrapp/.settings/org.eclipse.jdt.core.prefs b/mgrapp/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..fa64d21
--- /dev/null
+++ b/mgrapp/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,268 @@
+#Thu Sep 04 11:18:51 PDT 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=16
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=0
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=0
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=2
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=true
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
+org.eclipse.jdt.core.formatter.comment.line_length=80
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=true
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=80
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=3
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=false
+org.eclipse.jdt.core.formatter.tabulation.char=space
+org.eclipse.jdt.core.formatter.tabulation.size=2
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/mgrapp/.settings/org.eclipse.jdt.ui.prefs b/mgrapp/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..f37f6f0
--- /dev/null
+++ b/mgrapp/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,9 @@
+#Tue Sep 02 17:00:18 PDT 2008
+eclipse.preferences.version=1
+formatter_profile=_Google Format
+formatter_settings_version=11
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=com.google;com;junit;net;org;java;javax;
+org.eclipse.jdt.ui.ondemandthreshold=99
+org.eclipse.jdt.ui.staticondemandthreshold=99
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates/>
diff --git a/mgrapp/bin/mgr b/mgrapp/bin/mgr
new file mode 100755
index 0000000..70ba710
--- /dev/null
+++ b/mgrapp/bin/mgr
@@ -0,0 +1,64 @@
+#!/bin/sh
+#
+# Copyright 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+if [ -z "$MGR_HOME" ]
+then
+	MGR_HOME=`which $0 2>/dev/null`
+	MGR_HOME=`dirname $MGR_HOME`
+	MGR_HOME=`dirname $MGR_HOME`
+fi
+
+if [ -z "$MGR_HOME" ]
+then
+	echo >&2 "error: MGR_HOME not set, cannot guess"
+	exit 1
+fi
+
+if ! [ -f "$MGR_HOME/lib/codereview_manager.jar" ]
+then
+	echo >&2 "error: MGR_HOME $MGR_HOME not compiled"
+	exit 1
+fi
+
+if [ -z "$1" ]
+then
+	echo >&2 "usage: $0 app.config [args]"
+	exit 1
+fi
+config_file=$1
+shift
+
+java_opts=
+
+m=`GIT_CONFIG=$config_file git config --get codereview.memory`
+if [ -n "$m" ]
+then
+	java_opts="$java_opts -Xmx${m}"
+fi
+
+CLASSPATH=
+for j in $MGR_HOME/lib/*.jar
+do
+	if [ -z "$CLASSPATH" ]
+	then
+		CLASSPATH=$j
+	else
+		CLASSPATH=$CLASSPATH:$j
+	fi
+done
+export CLASSPATH
+
+exec java $java_opts com.google.codereview.Main "$config_file" "$@"
diff --git a/mgrapp/compile.sh b/mgrapp/compile.sh
new file mode 100755
index 0000000..0a45a69
--- /dev/null
+++ b/mgrapp/compile.sh
@@ -0,0 +1,31 @@
+#!/bin/sh
+#
+# Copyright 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+CLASSPATH=
+for j in `pwd`/lib/*.jar
+do
+	CLASSPATH=$CLASSPATH:$j
+done
+export CLASSPATH
+
+(cd src &&
+ mkdir -p ../bin &&
+ mkdir -p ../bin/META-INF &&
+ cp -f META-INF/MANIFEST.MF ../bin/META-INF &&
+ find . -name \*.java | xargs javac -g -d ../bin) &&
+(cd bin &&
+ rm -f ../codereview_manager.jar &&
+ jar cf ../codereview_manager.jar . ) || exit
diff --git a/mgrapp/lib/commons-codec.jar b/mgrapp/lib/commons-codec.jar
new file mode 100644
index 0000000..957b675
--- /dev/null
+++ b/mgrapp/lib/commons-codec.jar
Binary files differ
diff --git a/mgrapp/lib/commons-httpclient.jar b/mgrapp/lib/commons-httpclient.jar
new file mode 100644
index 0000000..7c59774
--- /dev/null
+++ b/mgrapp/lib/commons-httpclient.jar
Binary files differ
diff --git a/mgrapp/lib/commons-logging.jar b/mgrapp/lib/commons-logging.jar
new file mode 100644
index 0000000..8758a96
--- /dev/null
+++ b/mgrapp/lib/commons-logging.jar
Binary files differ
diff --git a/mgrapp/lib/commons-net.jar b/mgrapp/lib/commons-net.jar
new file mode 100644
index 0000000..9666a92
--- /dev/null
+++ b/mgrapp/lib/commons-net.jar
Binary files differ
diff --git a/mgrapp/src/META-INF/MANIFEST.MF b/mgrapp/src/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..db91724
--- /dev/null
+++ b/mgrapp/src/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Main-Class: com.google.codereview.Main
+
diff --git a/mgrapp/src/com/google/codereview/Main.java b/mgrapp/src/com/google/codereview/Main.java
new file mode 100644
index 0000000..95a31b9
--- /dev/null
+++ b/mgrapp/src/com/google/codereview/Main.java
@@ -0,0 +1,284 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.codereview;
+
+import com.google.codereview.manager.Backend;
+import com.google.codereview.manager.ProjectSync;
+import com.google.codereview.manager.RepositoryCache;
+import com.google.codereview.manager.merge.PendingMerger;
+import com.google.codereview.manager.prune.BuildPruner;
+import com.google.codereview.manager.prune.BundlePruner;
+import com.google.codereview.manager.unpack.ReceivedBundleUnpacker;
+import com.google.codereview.rpc.HttpRpc;
+import com.google.githacks.BrokenShallowRepositoryCreator;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.spearce.jgit.lib.PersonIdent;
+import org.spearce.jgit.lib.RepositoryConfig;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Formatter;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+import java.util.logging.Logger;
+import java.util.logging.StreamHandler;
+
+/** Server startup, invoked from the command line. */
+public class Main {
+  private static final Log LOG = LogFactory.getLog("main");
+  private static final String SEC_CODEREVIEW = "codereview";
+  private static final String SEC_LOG = "log";
+  private static final int FOUR_HOURS = 4 * 60 * 60; // seconds
+  private static final int ONCE_PER_DAY = 24 * 60 * 60;// seconds
+
+  public static void main(final String[] args) {
+    if (args.length == 0) {
+      System.err.println("usage: " + Main.class.getName() + " configfile");
+      System.exit(1);
+    }
+
+    final File configPath = new File(args[0]).getAbsoluteFile();
+    final RepositoryConfig config = new RepositoryConfig(null, configPath);
+    try {
+      config.load();
+    } catch (FileNotFoundException e) {
+      System.err.println("error: " + configPath + " not found");
+      System.exit(1);
+    } catch (IOException e) {
+      System.err.println("error: " + configPath + " not readable");
+      e.printStackTrace(System.err);
+      System.exit(1);
+    }
+
+    configureLogging(config, args.length > 1);
+    LOG.info("Read " + configPath);
+    final Main me = new Main(configPath, config);
+
+    if (args.length == 1) {
+      me.addShutdownHook();
+      me.start();
+    } else {
+      final String cmd = args[1];
+      if (cmd.equals("sync")) {
+        new ProjectSync(me.backend).sync();
+      } else if (cmd.equals("bsclone")) {
+        try {
+          final File src = new File(args[2]);
+          final File dst = new File(args[3]);
+          BrokenShallowRepositoryCreator.createRecursive(src, dst);
+        } catch (IOException err) {
+          System.err.println("error: " + err);
+        }
+      } else {
+        System.err.println("error: " + cmd + " not recognized");
+      }
+    }
+  }
+
+  private final RepositoryConfig config;
+  private final ScheduledThreadPoolExecutor pool;
+  private final int taskSleep;
+  private final Backend backend;
+
+  private Main(final File configPath, final RepositoryConfig rc) {
+    config = rc;
+
+    final int threads = config.getInt(SEC_CODEREVIEW, "threads", 10);
+    taskSleep = config.getInt(SEC_CODEREVIEW, "sleep", 10);
+    LOG.info("Starting thread pool with " + threads + " initial threads.");
+    pool = new ScheduledThreadPoolExecutor(threads);
+
+    final RepositoryCache repoCache = createRepositoryCache();
+    final HttpRpc rpc = createHttpRpc(configPath.getParentFile());
+    backend = new Backend(repoCache, rpc, pool, createUserPersonIdent());
+  }
+
+  private RepositoryCache createRepositoryCache() {
+    final File basedir = new File(required(SEC_CODEREVIEW, "basedir"));
+    return new RepositoryCache(basedir);
+  }
+
+  private HttpRpc createHttpRpc(final File base) throws ThreadDeath {
+    final URL serverUrl;
+    try {
+      serverUrl = new URL(required(SEC_CODEREVIEW, "server"));
+    } catch (MalformedURLException err) {
+      System.err.println("error: Bad URL in " + SEC_CODEREVIEW + ".server");
+      System.exit(1);
+      throw new ThreadDeath();
+    }
+
+    final String roleUser = config.getString(SEC_CODEREVIEW, null, "username");
+    File pwf = new File(required(SEC_CODEREVIEW, "secureconfig"));
+    if (!pwf.isAbsolute()) {
+      pwf = new File(base, pwf.getPath());
+    }
+
+    final RepositoryConfig pwc = new RepositoryConfig(null, pwf);
+    try {
+      pwc.load();
+    } catch (IOException e) {
+      System.err.println("error: Cannot read secureconfig: " + pwf + ": "
+          + e.getMessage());
+      System.exit(1);
+      throw new ThreadDeath();
+    }
+
+    final String rolePass = pwc.getString(SEC_CODEREVIEW, null, "password");
+    final String apiKey = pwc.getString(SEC_CODEREVIEW, null, "internalapikey");
+    return new HttpRpc(serverUrl, roleUser, rolePass, apiKey);
+  }
+
+  private PersonIdent createUserPersonIdent() {
+    final String name = required("user", "name");
+    final String email = required("user", "email");
+    return new PersonIdent(name, email, System.currentTimeMillis(), 0);
+  }
+
+  private void addShutdownHook() {
+    Runtime.getRuntime().addShutdownHook(new Thread() {
+      @Override
+      public void run() {
+        LOG.info("Shutting down thread pool.");
+        pool.shutdownNow();
+      }
+    });
+  }
+
+  private void start() {
+    schedule(new ReceivedBundleUnpacker(backend));
+    schedule(new PendingMerger(backend));
+    schedule(new BundlePruner(backend), FOUR_HOURS);
+    schedule(new BuildPruner(backend), ONCE_PER_DAY);
+  }
+
+  private void schedule(final Runnable t) {
+    schedule(t, taskSleep);
+  }
+
+  private void schedule(final Runnable t, final int sleep) {
+    pool.scheduleWithFixedDelay(t, 0, sleep, TimeUnit.SECONDS);
+  }
+
+  private String required(final String sec, final String key) {
+    final String r = config.getString(sec, null, key);
+    if (r == null || r.length() == 0) {
+      System.err.println("error: Missing required config " + sec + "." + key);
+      System.exit(1);
+    }
+    return r;
+  }
+
+  private static void configureLogging(final RepositoryConfig config,
+      final boolean interactive) {
+    final Logger root = Logger.getLogger("");
+    for (final Handler h : root.getHandlers())
+      root.removeHandler(h);
+
+    OutputStream out = System.out;
+    final String logfile = config.getString(SEC_LOG, null, "file");
+    if (logfile != null && !interactive) {
+      try {
+        out = new FileOutputStream(logfile, true);
+      } catch (IOException err) {
+        System.err.println("error: Cannot append to " + logfile);
+        System.err.println("error: " + err.toString());
+        System.exit(1);
+        throw new ThreadDeath();
+      }
+    }
+
+    final StreamHandler ch = new StreamHandler(out, new Formatter() {
+      private final SimpleDateFormat sdf;
+      private final StringWriter stringBuffer = new StringWriter();
+      private final PrintWriter p = new PrintWriter(stringBuffer);
+      {
+        sdf = new SimpleDateFormat("yyyyMMdd.HHmmss");
+      }
+
+      @Override
+      public String format(final LogRecord record) {
+        stringBuffer.getBuffer().setLength(0);
+        final String levelName = record.getLevel().getName();
+        p.print(sdf.format(new Date(record.getMillis())));
+        p.print(' ');
+        p.print(levelName);
+        for (int cnt = "WARNING".length() - levelName.length(); --cnt >= 0;) {
+          p.print(' ');
+        }
+        p.print(' ');
+        p.print(record.getLoggerName());
+        p.print(" - ");
+        p.print(record.getMessage());
+        p.print('\n');
+        if (record.getThrown() != null) {
+          record.getThrown().printStackTrace(p);
+          p.print('\n');
+        }
+        p.flush();
+        return stringBuffer.toString();
+      }
+    }) {
+      @Override
+      public synchronized void publish(final LogRecord record) {
+        super.publish(record);
+        flush();
+      }
+    };
+    root.addHandler(ch);
+
+    final Level levelObj;
+    final String levelStr = config.getString(SEC_LOG, null, "level");
+    if (levelStr == null || levelStr.length() == 0) {
+      levelObj = Level.INFO;
+    } else if ("trace".equalsIgnoreCase(levelStr)) {
+      levelObj = Level.FINEST;
+    } else if ("debug".equalsIgnoreCase(levelStr)) {
+      levelObj = Level.FINE;
+    } else if ("info".equalsIgnoreCase(levelStr)) {
+      levelObj = Level.INFO;
+    } else if ("warning".equalsIgnoreCase(levelStr)
+        || "warn".equalsIgnoreCase(levelStr)) {
+      levelObj = Level.WARNING;
+    } else if ("error".equalsIgnoreCase(levelStr)) {
+      levelObj = Level.SEVERE;
+    } else if ("fatal".equalsIgnoreCase(levelStr)) {
+      levelObj = Level.SEVERE;
+    } else {
+      System.out.println("warning: Bad " + SEC_LOG + ".level " + levelStr
+          + "; assuming info");
+      levelObj = Level.INFO;
+    }
+    ch.setLevel(levelObj);
+    root.setLevel(levelObj);
+
+    Logger.getLogger("httpclient").setLevel(Level.WARNING);
+    Logger.getLogger("org.apache.commons.httpclient").setLevel(Level.WARNING);
+  }
+}
diff --git a/mgrapp/src/com/google/codereview/manager/Backend.java b/mgrapp/src/com/google/codereview/manager/Backend.java
new file mode 100644
index 0000000..58167f2
--- /dev/null
+++ b/mgrapp/src/com/google/codereview/manager/Backend.java
@@ -0,0 +1,108 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.codereview.manager;
+
+import com.google.codereview.internal.Admin.AdminService;
+import com.google.codereview.internal.Build.BuildService;
+import com.google.codereview.internal.BundleStore.BundleStoreService;
+import com.google.codereview.internal.Change.ChangeService;
+import com.google.codereview.internal.Merge.MergeService;
+import com.google.protobuf.RpcChannel;
+
+import org.spearce.jgit.lib.PersonIdent;
+
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Configuration and state related to a single Gerrit backend process.
+ */
+public class Backend {
+  private final RepositoryCache repoCache;
+  private final RpcChannel rpc;
+  private final ScheduledExecutorService executor;
+  private final PersonIdent mergeIdent;
+
+  private final AdminService adminSvc;
+  private final BuildService buildSvc;
+  private final BundleStoreService bundleStoreSvc;
+  private final ChangeService changeSvc;
+  private final MergeService mergeSvc;
+
+  public Backend(final RepositoryCache cache, final RpcChannel api,
+      final ScheduledExecutorService threadPool,
+      final PersonIdent performMergsAs) {
+    repoCache = cache;
+    rpc = api;
+    executor = threadPool;
+    mergeIdent = performMergsAs;
+
+    adminSvc = AdminService.newStub(rpc);
+    buildSvc = BuildService.newStub(rpc);
+    bundleStoreSvc = BundleStoreService.newStub(rpc);
+    changeSvc = ChangeService.newStub(rpc);
+    mergeSvc = MergeService.newStub(rpc);
+  }
+
+  public RepositoryCache getRepositoryCache() {
+    return repoCache;
+  }
+
+  public RpcChannel getRpcChannel() {
+    return rpc;
+  }
+
+  public PersonIdent getMergeIdentity() {
+    return mergeIdent;
+  }
+
+  /**
+   * @return a copy of {@link #getMergeIdentity()} modified to use the current
+   *         system clock as the time, in the GMT/UTC time zone.
+   */
+  public PersonIdent newMergeIdentity() {
+    return new PersonIdent(getMergeIdentity(), System.currentTimeMillis(), 0);
+  }
+
+  /**
+   * Schedule a task for execution on a background thread.
+   * 
+   * @param task runnable to perform the task. The task will be executed once,
+   *        as soon as a thread is available.
+   */
+  public void asyncExec(final Runnable task) {
+    executor.schedule(task, 0, TimeUnit.MILLISECONDS);
+  }
+
+  public AdminService getAdminService() {
+    return adminSvc;
+  }
+
+  public BuildService getBuildService() {
+    return buildSvc;
+  }
+
+  public BundleStoreService getBundleStoreService() {
+    return bundleStoreSvc;
+  }
+
+  public ChangeService getChangeService() {
+    return changeSvc;
+  }
+
+  public MergeService getMergeService() {
+    return mergeSvc;
+  }
+}
diff --git a/mgrapp/src/com/google/codereview/manager/InvalidRepositoryException.java b/mgrapp/src/com/google/codereview/manager/InvalidRepositoryException.java
new file mode 100644
index 0000000..0928418
--- /dev/null
+++ b/mgrapp/src/com/google/codereview/manager/InvalidRepositoryException.java
@@ -0,0 +1,26 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.codereview.manager;
+
+/** Indicates a directory does not contain a valid Git repository. */
+public class InvalidRepositoryException extends Exception {
+  public InvalidRepositoryException(final String name) {
+    super(name);
+  }
+
+  public InvalidRepositoryException(final String name, final Throwable err) {
+    super(name, err);
+  }
+}
diff --git a/mgrapp/src/com/google/codereview/manager/ProjectSync.java b/mgrapp/src/com/google/codereview/manager/ProjectSync.java
new file mode 100644
index 0000000..b3d2d9e
--- /dev/null
+++ b/mgrapp/src/com/google/codereview/manager/ProjectSync.java
@@ -0,0 +1,132 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.codereview.manager;
+
+import com.google.codereview.internal.SyncProject.BranchSync;
+import com.google.codereview.internal.SyncProject.SyncProjectRequest;
+import com.google.codereview.internal.SyncProject.SyncProjectResponse;
+import com.google.codereview.rpc.SimpleController;
+import com.google.codereview.util.GitMetaUtil;
+import com.google.protobuf.RpcCallback;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.spearce.jgit.errors.IncorrectObjectTypeException;
+import org.spearce.jgit.lib.Constants;
+import org.spearce.jgit.lib.Ref;
+import org.spearce.jgit.lib.Repository;
+import org.spearce.jgit.revwalk.RevCommit;
+import org.spearce.jgit.revwalk.RevWalk;
+
+import java.io.File;
+import java.io.IOException;
+
+public class ProjectSync {
+  private static final Log LOG = LogFactory.getLog(ProjectSync.class);
+
+  private final Backend server;
+
+  public ProjectSync(final Backend be) {
+    server = be;
+  }
+
+  public void sync() {
+    syncDirectoryImpl(server.getRepositoryCache().getBaseDirectory(), "");
+  }
+
+  private void syncDirectoryImpl(final File root, final String prefix) {
+    final File[] entries = root.listFiles();
+    if (entries == null) {
+      return;
+    }
+
+    for (final File f : entries) {
+      final String fName = f.getName();
+      if (fName.equals(".") || fName.equals("..")) {
+        continue;
+      }
+
+      if (!f.isDirectory()) {
+        continue;
+      }
+
+      String fullName = prefix + fName;
+      final Repository db;
+      try {
+        db = GitMetaUtil.open(f);
+      } catch (IOException e) {
+        LOG.error("Cannot open " + f + ": " + e.toString());
+        continue;
+      }
+
+      if (db != null) {
+        try {
+          if (fullName.endsWith(".git")) {
+            fullName = fullName.substring(0, fullName.length() - 4);
+          }
+          sync(fullName, db);
+        } finally {
+          db.close();
+        }
+      } else {
+        syncDirectoryImpl(f, fullName + "/");
+      }
+    }
+  }
+
+  public void sync(final String name, final Repository db) {
+    final SyncProjectRequest.Builder req = SyncProjectRequest.newBuilder();
+    req.setProjectName(name);
+
+    try {
+      final RevWalk rw = new RevWalk(db);
+      for (final Ref ref : db.getAllRefs().values()) {
+        if (ref.getName().startsWith(Constants.R_HEADS)) {
+          final RevCommit c;
+          try {
+            c = rw.parseCommit(ref.getObjectId());
+          } catch (IncorrectObjectTypeException e) {
+            continue;
+          }
+          req.addBranch(toBranch(ref, c));
+        }
+      }
+    } catch (IOException err) {
+      LOG.error("Cannot synchronize " + name, err);
+    }
+
+    send(req.build());
+  }
+
+  private BranchSync toBranch(final Ref r, final RevCommit c) {
+    final BranchSync.Builder bs = BranchSync.newBuilder();
+    bs.setBranchName(r.getName());
+    bs.setCommit(GitMetaUtil.toGitCommit(c));
+    return bs.build();
+  }
+
+  private void send(final SyncProjectRequest req) {
+    final SimpleController ctrl = new SimpleController();
+    server.getAdminService().syncProject(ctrl, req,
+        new RpcCallback<SyncProjectResponse>() {
+          public void run(final SyncProjectResponse rsp) {
+          }
+        });
+    if (ctrl.failed()) {
+      final String name = req.getProjectName();
+      LOG.error("syncProject " + name + ": " + ctrl.errorText());
+    }
+  }
+}
diff --git a/mgrapp/src/com/google/codereview/manager/RepositoryCache.java b/mgrapp/src/com/google/codereview/manager/RepositoryCache.java
new file mode 100644
index 0000000..bc106b2
--- /dev/null
+++ b/mgrapp/src/com/google/codereview/manager/RepositoryCache.java
@@ -0,0 +1,89 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.codereview.manager;
+
+import com.google.codereview.util.GitMetaUtil;
+
+import org.spearce.jgit.lib.Repository;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.ref.Reference;
+import java.lang.ref.SoftReference;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Pattern;
+
+/** Cache of active Git repositories being used by the manager. */
+public class RepositoryCache {
+  private static final Pattern REPO_NAME =
+      Pattern.compile("^[A-Za-z][A-Za-z0-9/_-]+$");
+
+  private final File base;
+
+  private final Map<String, Reference<Repository>> cache;
+
+  /**
+   * Create a new cache to manage a specific base directory (and below).
+   * 
+   * @param basedir top level directory that contains all repositories.
+   */
+  public RepositoryCache(final File basedir) {
+    base = basedir;
+    cache = new HashMap<String, Reference<Repository>>();
+  }
+
+  /**
+   * @return the base directory which contains all known repositories.
+   */
+  public File getBaseDirectory() {
+    return base;
+  }
+
+  /**
+   * Get (or open) a repository by name.
+   * 
+   * @param name the repository name, relative to the base directory supplied
+   *        when the cache was created.
+   * @return the cached Repository instance.
+   * @throws InvalidRepositoryException the name does not denote an existing
+   *         repository, or the name cannot be read as a repository.
+   */
+  public synchronized Repository get(String name)
+      throws InvalidRepositoryException {
+    if (name.endsWith(".git")) {
+      name = name.substring(0, name.length() - 4);
+    }
+
+    if (!REPO_NAME.matcher(name).matches()) {
+      throw new InvalidRepositoryException(name);
+    }
+
+    final Reference<Repository> ref = cache.get(name);
+    Repository db = ref != null ? ref.get() : null;
+    if (db == null) {
+      try {
+        db = GitMetaUtil.open(new File(base, name));
+        if (db == null) {
+          throw new InvalidRepositoryException(name);
+        }
+      } catch (IOException err) {
+        throw new InvalidRepositoryException(name, err);
+      }
+      cache.put(name, new SoftReference<Repository>(db));
+    }
+    return db;
+  }
+}
diff --git a/mgrapp/src/com/google/codereview/manager/StopProcessingException.java b/mgrapp/src/com/google/codereview/manager/StopProcessingException.java
new file mode 100644
index 0000000..ac0b2fa
--- /dev/null
+++ b/mgrapp/src/com/google/codereview/manager/StopProcessingException.java
@@ -0,0 +1,30 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.codereview.manager;
+
+/** Indicates the worker task wants to be unscheduled and never run again. */
+public class StopProcessingException extends RuntimeException {
+  public StopProcessingException(String message) {
+    super(message);
+  }
+
+  public StopProcessingException(Throwable cause) {
+    super(cause);
+  }
+
+  public StopProcessingException(String message, Throwable cause) {
+    super(message, cause);
+  }
+}
diff --git a/mgrapp/src/com/google/codereview/manager/merge/BranchUpdater.java b/mgrapp/src/com/google/codereview/manager/merge/BranchUpdater.java
new file mode 100644
index 0000000..3304d74
--- /dev/null
+++ b/mgrapp/src/com/google/codereview/manager/merge/BranchUpdater.java
@@ -0,0 +1,69 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.codereview.manager.merge;
+
+import com.google.codereview.internal.PostBranchUpdate.PostBranchUpdateRequest;
+import com.google.codereview.internal.PostBranchUpdate.PostBranchUpdateResponse;
+import com.google.codereview.internal.PostBuildResult.PostBuildResultResponse;
+import com.google.codereview.manager.Backend;
+import com.google.codereview.rpc.SimpleController;
+import com.google.protobuf.RpcCallback;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+public class BranchUpdater {
+  private static final Log LOG = LogFactory.getLog(BranchUpdater.class);
+
+  private final Backend server;
+
+  public BranchUpdater(final Backend be) {
+    server = be;
+  }
+
+  public void updateBranch(final PostBuildResultResponse buildInfo) {
+    if (new UpdateOp(server.getRepositoryCache(), buildInfo).update()) {
+      final PostBranchUpdateRequest.Builder req;
+
+      req = PostBranchUpdateRequest.newBuilder();
+      req.setBranchKey(buildInfo.getDestBranchKey());
+      req.addAllNewChange(buildInfo.getNewChangeList());
+      send(req.build());
+    } else {
+      final PostBranchUpdateRequest.Builder req;
+
+      req = PostBranchUpdateRequest.newBuilder();
+      req.setBranchKey(buildInfo.getDestBranchKey());
+      // Don't mark any changes merged.
+      send(req.build());
+    }
+  }
+
+  private void send(final PostBranchUpdateRequest msg) {
+    if (LOG.isDebugEnabled()) {
+      LOG.debug("\n" + msg);
+    }
+
+    final SimpleController ctrl = new SimpleController();
+    server.getMergeService().postBranchUpdate(ctrl, msg,
+        new RpcCallback<PostBranchUpdateResponse>() {
+          public void run(final PostBranchUpdateResponse rsp) {
+          }
+        });
+    if (ctrl.failed()) {
+      LOG.warn("postBranchUpdate failed: " + ctrl.errorText());
+    }
+  }
+}
diff --git a/mgrapp/src/com/google/codereview/manager/merge/CodeReviewCommit.java b/mgrapp/src/com/google/codereview/manager/merge/CodeReviewCommit.java
new file mode 100644
index 0000000..7d64ebb
--- /dev/null
+++ b/mgrapp/src/com/google/codereview/manager/merge/CodeReviewCommit.java
@@ -0,0 +1,51 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.codereview.manager.merge;
+
+import com.google.codereview.internal.PostMergeResult.MergeResultItem;
+
+import org.spearce.jgit.lib.AnyObjectId;
+import org.spearce.jgit.revwalk.RevCommit;
+
+/** Extended commit entity with code review specific metadata. */
+class CodeReviewCommit extends RevCommit {
+  /**
+   * Unique key of the PatchSet entity from the code review system.
+   * <p>
+   * This value is only available on commits that have a PatchSet represented in
+   * the code review system and whose PatchSet is in the current submit queue.
+   * Merge commits created during the merge or commits that aren't in the submit
+   * queue will keep this member null.
+   */
+  String patchsetKey;
+
+  /**
+   * Ordinal position of this commit within the submit queue.
+   * <p>
+   * Only valid if {@link #patchsetKey} is not null.
+   */
+  int originalOrder;
+
+  /**
+   * The result status for this commit.
+   * <p>
+   * Only valid if {@link #patchsetKey} is not null.
+   */
+  MergeResultItem.CodeType statusCode;
+
+  CodeReviewCommit(final AnyObjectId id) {
+    super(id);
+  }
+}
diff --git a/mgrapp/src/com/google/codereview/manager/merge/MergeException.java b/mgrapp/src/com/google/codereview/manager/merge/MergeException.java
new file mode 100644
index 0000000..3928a33
--- /dev/null
+++ b/mgrapp/src/com/google/codereview/manager/merge/MergeException.java
@@ -0,0 +1,26 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.codereview.manager.merge;
+
+/** Indicates the current branch's queue cannot be processed at this time. */
+class MergeException extends Exception {
+  MergeException(final String msg) {
+    super(msg, null);
+  }
+
+  MergeException(final String msg, final Throwable why) {
+    super(msg, why);
+  }
+}
diff --git a/mgrapp/src/com/google/codereview/manager/merge/MergeOp.java b/mgrapp/src/com/google/codereview/manager/merge/MergeOp.java
new file mode 100644
index 0000000..aabd3e5
--- /dev/null
+++ b/mgrapp/src/com/google/codereview/manager/merge/MergeOp.java
@@ -0,0 +1,386 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.codereview.manager.merge;
+
+import com.google.codereview.internal.PendingMerge.PendingMergeItem;
+import com.google.codereview.internal.PendingMerge.PendingMergeResponse;
+import com.google.codereview.internal.PostMergeResult.MergeResultItem;
+import com.google.codereview.internal.PostMergeResult.PostMergeResultRequest;
+import com.google.codereview.manager.Backend;
+import com.google.codereview.manager.InvalidRepositoryException;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.spearce.jgit.errors.IncorrectObjectTypeException;
+import org.spearce.jgit.errors.MissingObjectException;
+import org.spearce.jgit.lib.AnyObjectId;
+import org.spearce.jgit.lib.Commit;
+import org.spearce.jgit.lib.Constants;
+import org.spearce.jgit.lib.ObjectId;
+import org.spearce.jgit.lib.PersonIdent;
+import org.spearce.jgit.lib.Ref;
+import org.spearce.jgit.lib.RefUpdate;
+import org.spearce.jgit.lib.Repository;
+import org.spearce.jgit.merge.MergeStrategy;
+import org.spearce.jgit.merge.Merger;
+import org.spearce.jgit.revwalk.RevCommit;
+import org.spearce.jgit.revwalk.RevSort;
+import org.spearce.jgit.revwalk.RevWalk;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Merges changes in submission order into a single branch.
+ * <p>
+ * Branches are reduced to the minimum number of heads needed to merge
+ * everything. This allows commits to be entered into the queue in any order
+ * (such as ancestors before descendants) and only the most recent commit on any
+ * line of development will be merged. All unmerged commits along a line of
+ * development must be in the submission queue in order to merge the tip of that
+ * line.
+ * <p>
+ * Conflicts are handled by discarding the entire line of development and
+ * marking it as conflicting, even if an earlier commit along that same line can
+ * be merged cleanly.
+ */
+class MergeOp {
+  private static final Log LOG = LogFactory.getLog(MergeOp.class);
+
+  static String mergePinName(final AnyObjectId id) {
+    return mergePinName(id.name());
+  }
+
+  static String mergePinName(final String idstr) {
+    return "refs/merges/" + idstr;
+  }
+
+  private final Backend server;
+  private final PendingMergeResponse in;
+  private final PersonIdent mergeIdent;
+  private final Collection<MergeResultItem> updates;
+  private final List<CodeReviewCommit> toMerge;
+  private Repository db;
+  private RevWalk rw;
+  private CodeReviewCommit branchTip;
+  private CodeReviewCommit mergeTip;
+  private final List<CodeReviewCommit> newChanges;
+
+  MergeOp(final Backend be, final PendingMergeResponse mergeInfo) {
+    server = be;
+    in = mergeInfo;
+    mergeIdent = server.newMergeIdentity();
+    updates = new ArrayList<MergeResultItem>();
+    toMerge = new ArrayList<CodeReviewCommit>();
+    newChanges = new ArrayList<CodeReviewCommit>();
+  }
+
+  PostMergeResultRequest merge() {
+    final String loc = in.getDestProjectName() + " " + in.getDestBranchName();
+    LOG.debug("Merging " + loc);
+    try {
+      mergeImpl();
+
+      final PostMergeResultRequest.Builder update;
+      update = PostMergeResultRequest.newBuilder();
+      update.setDestBranchKey(in.getDestBranchKey());
+      update.addAllChange(updates);
+      return update.build();
+    } catch (MergeException ee) {
+      LOG.error("Error merging " + loc, ee);
+
+      mergeTip = null;
+
+      final PostMergeResultRequest.Builder update;
+      update = PostMergeResultRequest.newBuilder();
+      update.setDestBranchKey(in.getDestBranchKey());
+      for (final PendingMergeItem pmi : in.getChangeList()) {
+        update.addChange(suspend(pmi));
+      }
+      return update.build();
+    }
+  }
+
+  CodeReviewCommit getMergeTip() {
+    return mergeTip;
+  }
+
+  Collection<CodeReviewCommit> getNewChanges() {
+    return Collections.unmodifiableCollection(newChanges);
+  }
+
+  private void mergeImpl() throws MergeException {
+    openRepository();
+    openBranch();
+    validateChangeList();
+    reduceToMinimalMerge();
+    mergeTopics();
+    markCleanMerges();
+    pinMergeCommit();
+  }
+
+  private void openRepository() throws MergeException {
+    final String name = in.getDestProjectName();
+    try {
+      db = server.getRepositoryCache().get(name);
+    } catch (InvalidRepositoryException notGit) {
+      final String m = "Repository \"" + name + "\" unknown.";
+      throw new MergeException(m, notGit);
+    }
+
+    rw = new RevWalk(db) {
+      @Override
+      protected RevCommit createCommit(final AnyObjectId id) {
+        return new CodeReviewCommit(id);
+      }
+    };
+  }
+
+  private void openBranch() throws MergeException {
+    try {
+      final RefUpdate ru = db.updateRef(in.getDestBranchName());
+      if (ru.getOldObjectId() != null) {
+        branchTip = (CodeReviewCommit) rw.parseCommit(ru.getOldObjectId());
+      } else {
+        branchTip = null;
+      }
+    } catch (IOException e) {
+      throw new MergeException("Cannot open branch", e);
+    }
+  }
+
+  private void validateChangeList() throws MergeException {
+    final Set<ObjectId> tips = new HashSet<ObjectId>();
+    for (final Ref r : db.getAllRefs().values()) {
+      tips.add(r.getObjectId());
+    }
+
+    int commitOrder = 0;
+    for (final PendingMergeItem pmi : in.getChangeList()) {
+      final String idstr = pmi.getRevisionId();
+      final ObjectId id;
+      try {
+        id = ObjectId.fromString(idstr);
+      } catch (IllegalArgumentException iae) {
+        throw new MergeException("Invalid ObjectId: " + idstr);
+      }
+
+      if (!tips.contains(id)) {
+        // TODO Technically the proper way to do this test is to use a
+        // RevWalk on "$id --not --all" and test for an empty set. But
+        // that is way slower than looking for a ref directly pointing
+        // at the desired tip. We should always have a ref available.
+        //
+        // TODO this is actually an error, the branch is gone but we
+        // want to merge the issue. We can't safely do that if the
+        // tip is not reachable.
+
+        LOG.error("Cannot find branch head for " + id.name());
+        updates.add(suspend(pmi));
+        continue;
+      }
+
+      final CodeReviewCommit commit;
+      try {
+        commit = (CodeReviewCommit) rw.parseCommit(id);
+      } catch (IOException e) {
+        throw new MergeException("Invalid issue commit " + id, e);
+      }
+      commit.patchsetKey = pmi.getPatchsetKey();
+      commit.originalOrder = commitOrder++;
+      LOG.debug("Commit " + commit.name() + " is " + commit.patchsetKey);
+
+      if (branchTip != null) {
+        // If this commit is already merged its a bug in the queuing code
+        // that we got back here. Just mark it complete and move on. Its
+        // merged and that is all that mattered to the requestor.
+        //
+        try {
+          if (rw.isMergedInto(commit, branchTip)) {
+            commit.statusCode = MergeResultItem.CodeType.ALREADY_MERGED;
+            updates.add(toResult(commit));
+            LOG.debug("Already merged " + commit.name());
+            continue;
+          }
+        } catch (IOException err) {
+          throw new MergeException("Cannot perform merge base test", err);
+        }
+      }
+
+      toMerge.add(commit);
+    }
+  }
+
+  private void reduceToMinimalMerge() throws MergeException {
+    final Collection<CodeReviewCommit> heads;
+    try {
+      heads = new MergeSorter(rw, branchTip).sort(toMerge);
+    } catch (IOException e) {
+      throw new MergeException("Branch head sorting failed", e);
+    }
+
+    for (final CodeReviewCommit c : toMerge) {
+      if (c.statusCode != null) {
+        updates.add(toResult(c));
+      }
+    }
+
+    toMerge.clear();
+    toMerge.addAll(heads);
+    Collections.sort(toMerge, new Comparator<CodeReviewCommit>() {
+      public int compare(final CodeReviewCommit a, final CodeReviewCommit b) {
+        return a.originalOrder - b.originalOrder;
+      }
+    });
+  }
+
+  private void mergeTopics() throws MergeException {
+    mergeTip = branchTip;
+
+    // Take the first fast-forward available, if any is available in the set.
+    //
+    for (final Iterator<CodeReviewCommit> i = toMerge.iterator(); i.hasNext();) {
+      try {
+        final CodeReviewCommit n = i.next();
+        if (mergeTip == null || rw.isMergedInto(mergeTip, n)) {
+          mergeTip = n;
+          i.remove();
+          LOG.debug("Fast-forward to " + n.name());
+          break;
+        }
+      } catch (IOException e) {
+        throw new MergeException("Cannot fast-forward test during merge", e);
+      }
+    }
+
+    // For every other commit do a pair-wise merge.
+    //
+    while (!toMerge.isEmpty()) {
+      final CodeReviewCommit n = toMerge.remove(0);
+      final Merger m = MergeStrategy.SIMPLE_TWO_WAY_IN_CORE.newMerger(db);
+      try {
+        if (m.merge(new AnyObjectId[] {mergeTip, n})) {
+          writeMergeCommit(m, n);
+
+          LOG.debug("Merged " + n.name());
+        } else {
+          rw.reset();
+          rw.markStart(n);
+          rw.markUninteresting(mergeTip);
+          CodeReviewCommit failed;
+          while ((failed = (CodeReviewCommit) rw.next()) != null) {
+            if (failed.patchsetKey != null) {
+              failed.statusCode = MergeResultItem.CodeType.PATH_CONFLICT;
+              updates.add(toResult(failed));
+            }
+          }
+          LOG.debug("Rejected (path conflict) " + n.name());
+        }
+      } catch (IOException e) {
+        throw new MergeException("Cannot merge " + n.name(), e);
+      }
+    }
+  }
+
+  private void writeMergeCommit(final Merger m, final CodeReviewCommit n)
+      throws IOException, MissingObjectException, IncorrectObjectTypeException {
+    final Commit mergeCommit = new Commit(db);
+    mergeCommit.setTreeId(m.getResultTreeId());
+    mergeCommit.setParentIds(new ObjectId[] {mergeTip, n});
+    mergeCommit.setAuthor(mergeIdent);
+    mergeCommit.setCommitter(mergeCommit.getAuthor());
+    mergeCommit.setMessage("Merge");
+
+    final ObjectId id = m.getObjectWriter().writeCommit(mergeCommit);
+    mergeTip = (CodeReviewCommit) rw.parseCommit(id);
+  }
+
+  private void markCleanMerges() throws MergeException {
+    try {
+      rw.reset();
+      rw.sort(RevSort.REVERSE);
+      rw.markStart(mergeTip);
+      if (branchTip != null) {
+        rw.markUninteresting(branchTip);
+      } else {
+        for (final Ref r : db.getAllRefs().values()) {
+          if (r.getName().startsWith(Constants.R_HEADS)
+              || r.getName().startsWith(Constants.R_TAGS)) {
+            try {
+              rw.markUninteresting(rw.parseCommit(r.getObjectId()));
+            } catch (IncorrectObjectTypeException iote) {
+              // Not a commit? Skip over it.
+            }
+          }
+        }
+      }
+
+      CodeReviewCommit c;
+      while ((c = (CodeReviewCommit) rw.next()) != null) {
+        if (c.patchsetKey != null) {
+          c.statusCode = MergeResultItem.CodeType.CLEAN_MERGE;
+          updates.add(toResult(c));
+          newChanges.add(c);
+        }
+      }
+    } catch (IOException e) {
+      throw new MergeException("Cannot mark clean merges", e);
+    }
+  }
+
+  private void pinMergeCommit() throws MergeException {
+    final String name = mergePinName(mergeTip.getId());
+    final RefUpdate.Result r;
+    try {
+      final RefUpdate u = db.updateRef(name);
+      u.setNewObjectId(mergeTip.getId());
+      u.setRefLogMessage("Merged submit queue", false);
+      r = u.update();
+    } catch (IOException err) {
+      final String m = "Failure creating " + name;
+      throw new MergeException(m, err);
+    }
+
+    if (r == RefUpdate.Result.NEW) {
+    } else if (r == RefUpdate.Result.FAST_FORWARD) {
+    } else if (r == RefUpdate.Result.FORCED) {
+    } else if (r == RefUpdate.Result.NO_CHANGE) {
+    } else {
+      final String m = "Failure creating " + name + ": " + r.name();
+      throw new MergeException(m);
+    }
+  }
+
+  private static MergeResultItem suspend(final PendingMergeItem pmi) {
+    final MergeResultItem.Builder delay = MergeResultItem.newBuilder();
+    delay.setStatusCode(MergeResultItem.CodeType.MISSING_DEPENDENCY);
+    delay.setPatchsetKey(pmi.getPatchsetKey());
+    return delay.build();
+  }
+
+  private static MergeResultItem toResult(final CodeReviewCommit c) {
+    final MergeResultItem.Builder delay = MergeResultItem.newBuilder();
+    delay.setStatusCode(c.statusCode);
+    delay.setPatchsetKey(c.patchsetKey);
+    return delay.build();
+  }
+}
diff --git a/mgrapp/src/com/google/codereview/manager/merge/MergeSorter.java b/mgrapp/src/com/google/codereview/manager/merge/MergeSorter.java
new file mode 100644
index 0000000..0fa45ba
--- /dev/null
+++ b/mgrapp/src/com/google/codereview/manager/merge/MergeSorter.java
@@ -0,0 +1,96 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.codereview.manager.merge;
+
+import com.google.codereview.internal.PostMergeResult.MergeResultItem;
+
+import org.spearce.jgit.revwalk.RevCommit;
+import org.spearce.jgit.revwalk.RevCommitList;
+import org.spearce.jgit.revwalk.RevFlag;
+import org.spearce.jgit.revwalk.RevWalk;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+class MergeSorter {
+  private final RevWalk rw;
+  private final RevCommit base;
+  private final RevFlag CAN_MERGE;
+
+  MergeSorter(final RevWalk walk, final RevCommit branchHead) {
+    rw = walk;
+    CAN_MERGE = rw.newFlag("CAN_MERGE");
+    base = branchHead;
+  }
+
+  Collection<CodeReviewCommit> sort(final Collection<CodeReviewCommit> incoming)
+      throws IOException {
+    final Set<CodeReviewCommit> heads = new HashSet<CodeReviewCommit>();
+    final Set<CodeReviewCommit> sort = prepareList(incoming);
+    INCOMING: while (!sort.isEmpty()) {
+      final CodeReviewCommit n = removeOne(sort);
+
+      rw.resetRetain(CAN_MERGE);
+      rw.markStart(n);
+      if (base != null) {
+        rw.markUninteresting(base);
+      }
+
+      RevCommit c;
+      final RevCommitList<RevCommit> contents = new RevCommitList<RevCommit>();
+      while ((c = rw.next()) != null) {
+        if (!c.has(CAN_MERGE)) {
+          // We cannot merge n as it would bring something we
+          // aren't permitted to merge at this time. Drop n.
+          //
+          n.statusCode = MergeResultItem.CodeType.MISSING_DEPENDENCY;
+          continue INCOMING;
+        }
+        contents.add(c);
+      }
+
+      // Anything reachable through us is better merged by just
+      // merging us directly. So prune our ancestors out and let
+      // us merge instead.
+      //
+      sort.removeAll(contents);
+      heads.removeAll(contents);
+      heads.add(n);
+    }
+    return heads;
+  }
+
+  private Set<CodeReviewCommit> prepareList(
+      final Collection<CodeReviewCommit> in) {
+    final HashSet<CodeReviewCommit> sort = new HashSet<CodeReviewCommit>();
+    for (final CodeReviewCommit c : in) {
+      if (!c.has(CAN_MERGE)) {
+        c.add(CAN_MERGE);
+        sort.add(c);
+      }
+    }
+    return sort;
+  }
+
+  private static <T> T removeOne(final Collection<T> c) {
+    final Iterator<T> i = c.iterator();
+    final T r = i.next();
+    i.remove();
+    return r;
+  }
+}
diff --git a/mgrapp/src/com/google/codereview/manager/merge/PendingMerger.java b/mgrapp/src/com/google/codereview/manager/merge/PendingMerger.java
new file mode 100644
index 0000000..bad3aa0
--- /dev/null
+++ b/mgrapp/src/com/google/codereview/manager/merge/PendingMerger.java
@@ -0,0 +1,197 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.codereview.manager.merge;
+
+import com.google.codereview.internal.PendingMerge.PendingMergeRequest;
+import com.google.codereview.internal.PendingMerge.PendingMergeResponse;
+import com.google.codereview.internal.PostBranchUpdate.PostBranchUpdateRequest;
+import com.google.codereview.internal.PostBranchUpdate.PostBranchUpdateResponse;
+import com.google.codereview.internal.PostBuildResult.PostBuildResultRequest;
+import com.google.codereview.internal.PostBuildResult.PostBuildResultResponse;
+import com.google.codereview.internal.PostMergeResult.PostMergeResultRequest;
+import com.google.codereview.internal.PostMergeResult.PostMergeResultResponse;
+import com.google.codereview.internal.SubmitBuild.SubmitBuildRequest;
+import com.google.codereview.internal.SubmitBuild.SubmitBuildResponse;
+import com.google.codereview.manager.Backend;
+import com.google.codereview.manager.StopProcessingException;
+import com.google.codereview.rpc.SimpleController;
+import com.google.codereview.util.MutableBoolean;
+import com.google.protobuf.RpcCallback;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.spearce.jgit.lib.ObjectId;
+
+/** Merges changes from branches with changes waiting to be merged. */
+public class PendingMerger implements Runnable {
+  private static final Log LOG = LogFactory.getLog(PendingMerger.class);
+
+  private static final PendingMergeRequest NEXT_REQ =
+      PendingMergeRequest.getDefaultInstance();
+
+  private final Backend server;
+  private final BranchUpdater updater;
+
+  public PendingMerger(final Backend be) {
+    server = be;
+    updater = new BranchUpdater(server);
+  }
+
+  public void run() {
+    try {
+      runImpl();
+    } catch (RuntimeException err) {
+      LOG.fatal("Unexpected runtime failure", err);
+      throw err;
+    } catch (Error err) {
+      LOG.fatal("Unexpected runtime failure", err);
+      throw err;
+    }
+  }
+
+  private void runImpl() {
+    boolean tryAnother;
+    do {
+      tryAnother = next();
+    } while (tryAnother);
+  }
+
+  private boolean next() {
+    final MutableBoolean tryAnother = new MutableBoolean();
+    final SimpleController ctrl = new SimpleController();
+    server.getMergeService().nextPendingMerge(ctrl, NEXT_REQ,
+        new RpcCallback<PendingMergeResponse>() {
+          public void run(final PendingMergeResponse rsp) {
+            tryAnother.value = merge(rsp);
+          }
+        });
+    if (ctrl.failed()) {
+      LOG.warn("nextPendingMerge failed: " + ctrl.errorText());
+      tryAnother.value = false;
+    }
+    return tryAnother.value;
+  }
+
+  private boolean merge(final PendingMergeResponse rsp) {
+    final PendingMergeResponse.CodeType sc = rsp.getStatusCode();
+    if (sc == PendingMergeResponse.CodeType.QUEUE_EMPTY) {
+      return false;
+    }
+
+    if (sc == PendingMergeResponse.CodeType.MERGE_READY) {
+      mergeImpl(rsp);
+      return true;
+    }
+
+    throw new StopProcessingException("unknown status " + sc.name());
+  }
+
+  protected void mergeImpl(final PendingMergeResponse rsp) {
+    final MergeOp mo = new MergeOp(server, rsp);
+    final PostMergeResultRequest result = mo.merge();
+
+    send(result);
+
+    if (mo.getMergeTip() != null && !mo.getNewChanges().isEmpty()) {
+      final SubmitBuildRequest.Builder b = SubmitBuildRequest.newBuilder();
+      b.setBranchKey(rsp.getDestBranchKey());
+      b.setRevisionId(mo.getMergeTip().name());
+      for (final CodeReviewCommit c : mo.getNewChanges()) {
+        if (c.patchsetKey != null) {
+          b.addNewChange(c.patchsetKey);
+        }
+      }
+      send(b.build(), mo.getMergeTip().getId());
+    } else {
+      final PostBranchUpdateRequest.Builder b;
+
+      b = PostBranchUpdateRequest.newBuilder();
+      b.setBranchKey(rsp.getDestBranchKey());
+      // Don't mark any changes merged.
+      send(b.build());
+    }
+  }
+
+  private void send(final PostMergeResultRequest msg) {
+    if (LOG.isDebugEnabled()) {
+      LOG.debug("\n" + msg);
+    }
+
+    final SimpleController ctrl = new SimpleController();
+    server.getMergeService().postMergeResult(ctrl, msg,
+        new RpcCallback<PostMergeResultResponse>() {
+          public void run(final PostMergeResultResponse rsp) {
+          }
+        });
+    if (ctrl.failed()) {
+      LOG.warn("postMergeResult failed: " + ctrl.errorText());
+    }
+  }
+
+  private void send(final SubmitBuildRequest msg, final ObjectId id) {
+    if (LOG.isDebugEnabled()) {
+      LOG.debug("\n" + msg);
+    }
+
+    final SimpleController ctrl = new SimpleController();
+    server.getBuildService().submitBuild(ctrl, msg,
+        new RpcCallback<SubmitBuildResponse>() {
+          public void run(final SubmitBuildResponse rsp) {
+            scheduleBuild(rsp, id);
+          }
+        });
+    if (ctrl.failed()) {
+      LOG.warn("submitBuild failed: " + ctrl.errorText());
+    }
+  }
+
+  private void scheduleBuild(final SubmitBuildResponse rsp, final ObjectId id) {
+    final int buildId = rsp.getBuildId();
+    LOG.debug("Merge commit " + id.name() + " is build " + buildId);
+
+    // For now assume the build was successful.
+    //
+    final PostBuildResultRequest.Builder req;
+    req = PostBuildResultRequest.newBuilder();
+    req.setBuildId(buildId);
+    req.setBuildStatus(PostBuildResultRequest.ResultType.SUCCESS);
+    final SimpleController ctrl = new SimpleController();
+    server.getBuildService().postBuildResult(ctrl, req.build(),
+        new RpcCallback<PostBuildResultResponse>() {
+          public void run(final PostBuildResultResponse rsp) {
+            updater.updateBranch(rsp);
+          }
+        });
+    if (ctrl.failed()) {
+      LOG.warn("postBuildResult failed: " + ctrl.errorText());
+    }
+  }
+
+  private void send(final PostBranchUpdateRequest msg) {
+    if (LOG.isDebugEnabled()) {
+      LOG.debug("\n" + msg);
+    }
+
+    final SimpleController ctrl = new SimpleController();
+    server.getMergeService().postBranchUpdate(ctrl, msg,
+        new RpcCallback<PostBranchUpdateResponse>() {
+          public void run(final PostBranchUpdateResponse rsp) {
+          }
+        });
+    if (ctrl.failed()) {
+      LOG.warn("postBranchUpdate failed: " + ctrl.errorText());
+    }
+  }
+}
diff --git a/mgrapp/src/com/google/codereview/manager/merge/UpdateOp.java b/mgrapp/src/com/google/codereview/manager/merge/UpdateOp.java
new file mode 100644
index 0000000..efc715d
--- /dev/null
+++ b/mgrapp/src/com/google/codereview/manager/merge/UpdateOp.java
@@ -0,0 +1,130 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.codereview.manager.merge;
+
+import com.google.codereview.internal.PostBuildResult.PostBuildResultResponse;
+import com.google.codereview.manager.InvalidRepositoryException;
+import com.google.codereview.manager.RepositoryCache;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.spearce.jgit.lib.ObjectId;
+import org.spearce.jgit.lib.RefUpdate;
+import org.spearce.jgit.lib.Repository;
+import org.spearce.jgit.revwalk.RevCommit;
+import org.spearce.jgit.revwalk.RevWalk;
+
+import java.io.IOException;
+
+public class UpdateOp {
+  private static final Log LOG = LogFactory.getLog(UpdateOp.class);
+
+  private final RepositoryCache repoCache;
+  private final PostBuildResultResponse in;
+  private Repository db;
+  private RevCommit newCommit;
+  private RevWalk rw;
+  private RefUpdate branch;
+
+  UpdateOp(final RepositoryCache rc, final PostBuildResultResponse mergeInfo) {
+    repoCache = rc;
+    in = mergeInfo;
+  }
+
+  boolean update() {
+    final String loc = in.getDestProjectName() + " " + in.getDestBranchName();
+    LOG.debug("Updating " + loc);
+    try {
+      updateImpl();
+      return true;
+    } catch (MergeException ee) {
+      LOG.error("Error updating " + loc, ee);
+      return false;
+    } finally {
+      if (db != null && rw != null) {
+        unpinMerge();
+      }
+    }
+  }
+
+  private void unpinMerge() {
+    final String name = MergeOp.mergePinName(in.getRevisionId());
+    try {
+      final RefUpdate ru = db.updateRef(name);
+      ru.setNewObjectId(ru.getOldObjectId());
+      ru.delete(rw);
+    } catch (IOException err) {
+      LOG.warn("Cannot remove " + name, err);
+    }
+  }
+
+  private void updateImpl() throws MergeException {
+    openRepository();
+    openBranch();
+    parseCommit();
+    updateBranch();
+  }
+
+  private void openRepository() throws MergeException {
+    final String name = in.getDestProjectName();
+    try {
+      db = repoCache.get(name);
+    } catch (InvalidRepositoryException notGit) {
+      final String m = "Repository \"" + name + "\" unknown.";
+      throw new MergeException(m, notGit);
+    }
+    rw = new RevWalk(db);
+  }
+
+  private void openBranch() throws MergeException {
+    try {
+      branch = db.updateRef(in.getDestBranchName());
+    } catch (IOException e) {
+      throw new MergeException("Cannot open branch", e);
+    }
+  }
+
+  private void parseCommit() throws MergeException {
+    try {
+      newCommit = rw.parseCommit(ObjectId.fromString(in.getRevisionId()));
+    } catch (IllegalArgumentException e) {
+      throw new MergeException("Not a commit name: " + in.getRevisionId());
+    } catch (IOException e) {
+      throw new MergeException("Not a commit name: " + in.getRevisionId(), e);
+    }
+  }
+
+  private void updateBranch() throws MergeException {
+    branch.setForceUpdate(false);
+    branch.setNewObjectId(newCommit);
+    branch.setRefLogMessage(newCommit.getShortMessage(), false);
+
+    final RefUpdate.Result r;
+    try {
+      r = branch.update(rw);
+    } catch (IOException err) {
+      final String m = "Failure updating " + branch.getName();
+      throw new MergeException(m, err);
+    }
+
+    if (r == RefUpdate.Result.NEW) {
+    } else if (r == RefUpdate.Result.FAST_FORWARD) {
+    } else if (r == RefUpdate.Result.NO_CHANGE) {
+    } else {
+      final String m = "Failure updating " + branch.getName() + ": " + r.name();
+      throw new MergeException(m);
+    }
+  }
+}
diff --git a/mgrapp/src/com/google/codereview/manager/prune/BuildPruner.java b/mgrapp/src/com/google/codereview/manager/prune/BuildPruner.java
new file mode 100644
index 0000000..cf93325
--- /dev/null
+++ b/mgrapp/src/com/google/codereview/manager/prune/BuildPruner.java
@@ -0,0 +1,89 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.codereview.manager.prune;
+
+import com.google.codereview.internal.PruneBuilds.PruneBuildsRequest;
+import com.google.codereview.internal.PruneBuilds.PruneBuildsResponse;
+import com.google.codereview.manager.Backend;
+import com.google.codereview.manager.StopProcessingException;
+import com.google.codereview.rpc.SimpleController;
+import com.google.codereview.util.MutableBoolean;
+import com.google.protobuf.RpcCallback;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/** Deletes unnecessary builds from the data store. */
+public class BuildPruner implements Runnable {
+  private static final Log LOG = LogFactory.getLog(BuildPruner.class);
+
+  private static final PruneBuildsRequest NEXT_REQ =
+      PruneBuildsRequest.getDefaultInstance();
+
+  private final Backend server;
+
+  public BuildPruner(final Backend be) {
+    server = be;
+  }
+
+  public void run() {
+    try {
+      runImpl();
+    } catch (RuntimeException err) {
+      LOG.fatal("Unexpected runtime failure", err);
+      throw err;
+    } catch (Error err) {
+      LOG.fatal("Unexpected runtime failure", err);
+      throw err;
+    }
+  }
+
+  private void runImpl() {
+    boolean tryAnother;
+    do {
+      tryAnother = next();
+    } while (tryAnother);
+  }
+
+  private boolean next() {
+    final MutableBoolean tryAnother = new MutableBoolean();
+    final SimpleController ctrl = new SimpleController();
+    server.getBuildService().pruneBuilds(ctrl, NEXT_REQ,
+        new RpcCallback<PruneBuildsResponse>() {
+          public void run(final PruneBuildsResponse rsp) {
+            tryAnother.value = prune(rsp);
+          }
+        });
+    if (ctrl.failed()) {
+      LOG.warn("pruneBuilds failed: " + ctrl.errorText());
+      tryAnother.value = false;
+    }
+    return tryAnother.value;
+  }
+
+  private boolean prune(final PruneBuildsResponse rsp) {
+    final PruneBuildsResponse.CodeType sc = rsp.getStatusCode();
+
+    if (sc == PruneBuildsResponse.CodeType.QUEUE_EMPTY) {
+      return false;
+    }
+
+    if (sc == PruneBuildsResponse.CodeType.BUILDS_PRUNED) {
+      return true;
+    }
+
+    throw new StopProcessingException("unknown status " + sc.name());
+  }
+}
diff --git a/mgrapp/src/com/google/codereview/manager/prune/BundlePruner.java b/mgrapp/src/com/google/codereview/manager/prune/BundlePruner.java
new file mode 100644
index 0000000..60a9bad
--- /dev/null
+++ b/mgrapp/src/com/google/codereview/manager/prune/BundlePruner.java
@@ -0,0 +1,89 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.codereview.manager.prune;
+
+import com.google.codereview.internal.PruneBundles.PruneBundlesRequest;
+import com.google.codereview.internal.PruneBundles.PruneBundlesResponse;
+import com.google.codereview.manager.Backend;
+import com.google.codereview.manager.StopProcessingException;
+import com.google.codereview.rpc.SimpleController;
+import com.google.codereview.util.MutableBoolean;
+import com.google.protobuf.RpcCallback;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/** Deletes invalid bundles from the data store. */
+public class BundlePruner implements Runnable {
+  private static final Log LOG = LogFactory.getLog(BundlePruner.class);
+
+  private static final PruneBundlesRequest NEXT_REQ =
+      PruneBundlesRequest.getDefaultInstance();
+
+  private final Backend server;
+
+  public BundlePruner(final Backend be) {
+    server = be;
+  }
+
+  public void run() {
+    try {
+      runImpl();
+    } catch (RuntimeException err) {
+      LOG.fatal("Unexpected runtime failure", err);
+      throw err;
+    } catch (Error err) {
+      LOG.fatal("Unexpected runtime failure", err);
+      throw err;
+    }
+  }
+
+  private void runImpl() {
+    boolean tryAnother;
+    do {
+      tryAnother = next();
+    } while (tryAnother);
+  }
+
+  private boolean next() {
+    final MutableBoolean tryAnother = new MutableBoolean();
+    final SimpleController ctrl = new SimpleController();
+    server.getBundleStoreService().pruneBundles(ctrl, NEXT_REQ,
+        new RpcCallback<PruneBundlesResponse>() {
+          public void run(final PruneBundlesResponse rsp) {
+            tryAnother.value = prune(rsp);
+          }
+        });
+    if (ctrl.failed()) {
+      LOG.warn("pruneBundles failed: " + ctrl.errorText());
+      tryAnother.value = false;
+    }
+    return tryAnother.value;
+  }
+
+  private boolean prune(final PruneBundlesResponse rsp) {
+    final PruneBundlesResponse.CodeType sc = rsp.getStatusCode();
+
+    if (sc == PruneBundlesResponse.CodeType.QUEUE_EMPTY) {
+      return false;
+    }
+
+    if (sc == PruneBundlesResponse.CodeType.BUNDLES_PRUNED) {
+      return true;
+    }
+
+    throw new StopProcessingException("unknown status " + sc.name());
+  }
+}
diff --git a/mgrapp/src/com/google/codereview/manager/unpack/DiffReader.java b/mgrapp/src/com/google/codereview/manager/unpack/DiffReader.java
new file mode 100644
index 0000000..866ca75
--- /dev/null
+++ b/mgrapp/src/com/google/codereview/manager/unpack/DiffReader.java
@@ -0,0 +1,149 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.codereview.manager.unpack;
+
+import static org.spearce.jgit.lib.Constants.encodeASCII;
+
+import com.google.codereview.internal.UploadPatchsetFile.UploadPatchsetFileRequest.StatusType;
+
+import org.spearce.jgit.lib.Constants;
+import org.spearce.jgit.lib.ObjectId;
+import org.spearce.jgit.lib.ObjectWriter;
+import org.spearce.jgit.lib.Repository;
+import org.spearce.jgit.lib.Tree;
+import org.spearce.jgit.revwalk.RevCommit;
+import org.spearce.jgit.util.RawParseUtils;
+
+import java.io.IOException;
+
+/** Parses 'git diff-tree' output into {@link FileDiff} objects. */
+class DiffReader {
+  private static final byte[] GIT_DIFF = encodeASCII("diff --git a/");
+  private static final byte[] H_DELETED_FILE = encodeASCII("deleted file ");
+  private static final byte[] H_NEW_FILE = encodeASCII("new file ");
+  private static final byte[] H_INDEX = encodeASCII("index ");
+  static final byte[] H_NEWPATH = encodeASCII("+++ b/");
+  private static final byte[] H_BINARY = encodeASCII("Binary file");
+  private static final int MAX_PATCH_SIZE = 1024 * 1024; // bytes
+
+  static boolean match(final byte[] key, final byte[] line, int offset) {
+    int remain = line.length - offset;
+    if (remain < key.length) {
+      return false;
+    }
+    for (int k = 0; k < key.length;) {
+      if (key[k++] != line[offset++]) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  private static String str(final byte[] b, final int off) {
+    return RawParseUtils.decode(Constants.CHARSET, b, off, b.length);
+  }
+
+  private Process proc;
+  private RecordInputStream in;
+  private FileDiff current;
+
+  DiffReader(final Repository db, final RevCommit c) throws IOException {
+    final String baseTree;
+    if (c.getParentCount() > 0) {
+      baseTree = c.getParent(0).getTree().getId().name();
+    } else {
+      baseTree = new ObjectWriter(db).writeTree(new Tree(db)).name();
+    }
+    final String headTree = c.getTree().getId().name();
+    proc =
+        Runtime.getRuntime().exec(
+            new String[] {"git", "--git-dir=.", "diff-tree", "--unified=1",
+                "-M", "--full-index", baseTree, headTree}, null,
+            db.getDirectory());
+    proc.getOutputStream().close();
+    proc.getErrorStream().close();
+    in = new RecordInputStream(proc.getInputStream());
+  }
+
+  FileDiff next() throws IOException {
+    return readOneDiff();
+  }
+
+  private FileDiff readOneDiff() throws IOException {
+    boolean consume = false;
+    for (;;) {
+      final byte[] hdr = in.readRecord('\n');
+      if (hdr == null) {
+        final FileDiff prior = current;
+        current = null;
+        return prior;
+      }
+
+      if (match(GIT_DIFF, hdr, 0)) {
+        final FileDiff prior = current;
+        current = new FileDiff();
+        current.appendLine(hdr);
+
+        // TODO(sop) This can split the old and new names wrong if the
+        // old name was "f b/c". Until we can do diffs in-core we'll
+        // just assume nobody uses spaces in filenames.
+        //
+        final String hdrStr = str(hdr, 0);
+        final int newpos = hdrStr.indexOf(" b/");
+        if (newpos > 0) {
+          current.setFilename(hdrStr.substring(newpos + 3));
+        }
+
+        if (prior != null) {
+          return prior;
+        } else {
+          continue;
+        }
+      }
+
+      if (match(H_INDEX, hdr, 0)) {
+        current.setBaseId(ObjectId.fromString(hdr, H_INDEX.length));
+        current.setFinalId(ObjectId.fromString(hdr, H_INDEX.length
+            + Constants.OBJECT_ID_LENGTH * 2 + 2));
+      } else if (match(H_NEW_FILE, hdr, 0)) {
+        current.setStatus(StatusType.ADD);
+      } else if (match(H_DELETED_FILE, hdr, 0)) {
+        current.setStatus(StatusType.DELETE);
+      } else if (match(H_BINARY, hdr, 0)) {
+        current.setBinary(true);
+      } else if (match(H_NEWPATH, hdr, 0)) {
+        current.setFilename(str(hdr, H_NEWPATH.length));
+      }
+
+      if (consume) {
+        continue;
+      } else if (current.getPatchSize() + hdr.length >= MAX_PATCH_SIZE) {
+        current.truncatePatch();
+        consume = true;
+      } else {
+        current.appendLine(hdr);
+      }
+    }
+  }
+
+  void close() throws IOException {
+    in.close();
+    try {
+      proc.waitFor();
+    } catch (InterruptedException ie) {
+      //
+    }
+  }
+}
diff --git a/mgrapp/src/com/google/codereview/manager/unpack/FileDiff.java b/mgrapp/src/com/google/codereview/manager/unpack/FileDiff.java
new file mode 100644
index 0000000..ec0f67f
--- /dev/null
+++ b/mgrapp/src/com/google/codereview/manager/unpack/FileDiff.java
@@ -0,0 +1,119 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.codereview.manager.unpack;
+
+import static org.spearce.jgit.lib.Constants.encodeASCII;
+
+import com.google.codereview.internal.UploadPatchsetFile.UploadPatchsetFileRequest.StatusType;
+
+import org.spearce.jgit.lib.AnyObjectId;
+import org.spearce.jgit.lib.ObjectId;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/** Computed difference for a single file. */
+class FileDiff {
+  private ObjectId baseId;
+  private ObjectId finalId;
+  private String filename;
+  private boolean binary;
+  private boolean truncated;
+  private List<byte[]> lines = new ArrayList<byte[]>();
+  private StatusType status = StatusType.MODIFY;
+  private int linesSize;
+
+  ObjectId getBaseId() {
+    return baseId;
+  }
+
+  void setBaseId(final AnyObjectId id) {
+    baseId = id.toObjectId();
+  }
+
+  ObjectId getFinalId() {
+    return finalId;
+  }
+
+  void setFinalId(final AnyObjectId id) {
+    finalId = id.toObjectId();
+  }
+
+  String getFilename() {
+    return filename;
+  }
+
+  void setFilename(final String name) {
+    filename = name;
+  }
+
+  StatusType getStatus() {
+    return status;
+  }
+
+  void setStatus(final StatusType t) {
+    status = t;
+  }
+
+  boolean isBinary() {
+    return binary;
+  }
+
+  void setBinary(final boolean b) {
+    binary = b;
+  }
+
+  boolean isTruncated() {
+    return truncated;
+  }
+
+  void setTruncated(final boolean b) {
+    truncated = b;
+  }
+
+  byte[] getPatch() {
+    final byte[] r = new byte[linesSize + lines.size()];
+    int pos = 0;
+    for (final byte[] line : lines) {
+      System.arraycopy(line, 0, r, pos, line.length);
+      pos += line.length;
+      r[pos++] = '\n';
+    }
+    return r;
+  }
+
+  int getPatchSize() {
+    return linesSize;
+  }
+
+  void appendLine(final byte[] line) {
+    lines.add(line);
+    linesSize += line.length;
+  }
+
+  void truncatePatch() {
+    final List<byte[]> oldLines = lines;
+
+    linesSize = 0;
+    lines = new ArrayList<byte[]>();
+    for (final byte[] b : oldLines) {
+      appendLine(b);
+      if (DiffReader.match(DiffReader.H_NEWPATH, b, 0)) {
+        appendLine(encodeASCII("File content is too large to display"));
+        break;
+      }
+    }
+  }
+}
diff --git a/mgrapp/src/com/google/codereview/manager/unpack/PatchSetUploader.java b/mgrapp/src/com/google/codereview/manager/unpack/PatchSetUploader.java
new file mode 100644
index 0000000..160a3d6
--- /dev/null
+++ b/mgrapp/src/com/google/codereview/manager/unpack/PatchSetUploader.java
@@ -0,0 +1,256 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.codereview.manager.unpack;
+
+import com.google.codereview.internal.CompletePatchset.CompletePatchsetRequest;
+import com.google.codereview.internal.CompletePatchset.CompletePatchsetResponse;
+import com.google.codereview.internal.UploadPatchsetFile.UploadPatchsetFileRequest;
+import com.google.codereview.internal.UploadPatchsetFile.UploadPatchsetFileResponse;
+import com.google.codereview.manager.Backend;
+import com.google.codereview.manager.StopProcessingException;
+import com.google.codereview.rpc.SimpleController;
+import com.google.protobuf.ByteString;
+import com.google.protobuf.RpcCallback;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.spearce.jgit.lib.Constants;
+import org.spearce.jgit.lib.ObjectId;
+import org.spearce.jgit.lib.ObjectLoader;
+import org.spearce.jgit.lib.Repository;
+import org.spearce.jgit.revwalk.RevCommit;
+
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.security.MessageDigest;
+import java.util.zip.Deflater;
+import java.util.zip.DeflaterOutputStream;
+import java.util.zip.InflaterInputStream;
+
+
+class PatchSetUploader implements Runnable {
+  private static final Log LOG = LogFactory.getLog(PatchSetUploader.class);
+  private static final int MAX_DATA_SIZE = 1022 * 1024; // bytes
+  private static final String EMPTY_BLOB_ID;
+  private static final ByteString EMPTY_DEFLATE;
+
+  static {
+    final MessageDigest md = Constants.newMessageDigest();
+    md.update(Constants.encodeASCII("blob 0\0"));
+    EMPTY_BLOB_ID = ObjectId.fromRaw(md.digest()).name();
+    EMPTY_DEFLATE = deflate(new byte[0]);
+  }
+
+  private final Backend server;
+  private final Repository db;
+  private final RevCommit commit;
+  private final String commitName;
+  private final String patchsetKey;
+  private ByteString.Output compressedFilenames;
+  private Writer filenameOut;
+
+  PatchSetUploader(final Backend be, final Repository sourceRepo,
+      final RevCommit sourceCommit, final String destPatchsetKey) {
+    server = be;
+    db = sourceRepo;
+    commit = sourceCommit;
+    commitName = commit.getId().name();
+    patchsetKey = destPatchsetKey;
+  }
+
+  private String logkey() {
+    return db.getDirectory().getAbsolutePath() + " " + commitName;
+  }
+
+  public void run() {
+    LOG.debug(logkey() + " begin");
+    try {
+      runImpl();
+    } catch (RuntimeException e) {
+      LOG.fatal(logkey() + " failure", e);
+    } catch (Error e) {
+      LOG.fatal(logkey() + " failure", e);
+    }
+  }
+
+  private void runImpl() {
+    try {
+      compressedFilenames = ByteString.newOutput();
+      filenameOut =
+          new OutputStreamWriter(new DeflaterOutputStream(compressedFilenames,
+              new Deflater(Deflater.DEFAULT_COMPRESSION)), "UTF-8");
+    } catch (IOException e) {
+      LOG.error(logkey() + " cannot initialize filename compression", e);
+      return;
+    }
+
+    try {
+      final DiffReader dr = new DiffReader(db, commit);
+      try {
+        boolean first = true;
+        FileDiff file;
+        while ((file = dr.next()) != null) {
+          storeOneDiff(file);
+
+          if (first) {
+            first = false;
+          } else {
+            filenameOut.write('\0');
+          }
+          filenameOut.write(file.getFilename());
+        }
+      } finally {
+        dr.close();
+      }
+      filenameOut.close();
+    } catch (StopProcessingException halt) {
+      return;
+    } catch (IOException err) {
+      LOG.error(logkey() + " diff failed", err);
+      return;
+    }
+
+    final CompletePatchsetRequest.Builder req;
+    req = CompletePatchsetRequest.newBuilder();
+    req.setPatchsetKey(patchsetKey);
+    req.setCompressedFilenames(compressedFilenames.toByteString());
+    final SimpleController ctrl = new SimpleController();
+    server.getChangeService().completePatchset(ctrl, req.build(),
+        new RpcCallback<CompletePatchsetResponse>() {
+          public void run(final CompletePatchsetResponse rsp) {
+            LOG.debug(logkey() + " complete");
+          }
+        });
+    if (ctrl.failed()) {
+      final String why = ctrl.errorText();
+      LOG.error(logkey() + " completing failed: " + why);
+    }
+  }
+
+  private void storeOneDiff(final FileDiff diff) throws StopProcessingException {
+    final UploadPatchsetFileRequest req = toFileRequest(diff);
+    final SimpleController ctrl = new SimpleController();
+    server.getChangeService().uploadPatchsetFile(ctrl, req,
+        new RpcCallback<UploadPatchsetFileResponse>() {
+          public void run(final UploadPatchsetFileResponse rsp) {
+            final UploadPatchsetFileResponse.CodeType sc = rsp.getStatusCode();
+            final String fn = req.getFileName();
+            final String pk = req.getPatchsetKey();
+
+            if (sc == UploadPatchsetFileResponse.CodeType.CREATED) {
+              LOG.debug(logkey() + " uploaded " + fn);
+            } else if (sc == UploadPatchsetFileResponse.CodeType.CLOSED) {
+              ctrl.setFailed("patchset closed " + pk);
+            } else if (sc == UploadPatchsetFileResponse.CodeType.UNKNOWN_PATCHSET) {
+              ctrl.setFailed("patchset unknown " + pk);
+            } else if (sc == UploadPatchsetFileResponse.CodeType.PATCHING_ERROR) {
+              ctrl.setFailed("server cannot apply patch");
+            } else {
+              ctrl.setFailed("Unknown status " + sc.name() + " " + pk);
+            }
+          }
+        });
+    if (ctrl.failed()) {
+      final String fn = req.getFileName();
+      final String why = ctrl.errorText();
+      LOG.error(logkey() + " uploading " + fn + " failed: " + why);
+      throw new StopProcessingException(why);
+    }
+  }
+
+  private UploadPatchsetFileRequest toFileRequest(final FileDiff diff) {
+    final UploadPatchsetFileRequest.Builder req;
+
+    req = UploadPatchsetFileRequest.newBuilder();
+    req.setPatchsetKey(patchsetKey);
+    req.setFileName(diff.getFilename());
+    req.setStatus(diff.getStatus());
+
+    ByteString patchz = deflate(diff.getPatch());
+
+    if (!diff.isBinary() && !diff.isTruncated()) {
+      final ObjectId baseId = diff.getBaseId();
+
+      if (baseId == null || ObjectId.equals(baseId, ObjectId.zeroId())) {
+        req.setBaseId(EMPTY_BLOB_ID);
+        req.setBaseZ(EMPTY_DEFLATE);
+      } else {
+        try {
+          final ObjectLoader ldr = db.openBlob(baseId);
+          if (ldr == null) {
+            LOG.fatal(logkey() + " missing " + baseId.name());
+            throw new StopProcessingException("No " + baseId.name());
+          }
+
+          final ByteString basez = deflate(ldr.getCachedBytes());
+          if (basez.size() + patchz.size() > MAX_DATA_SIZE) {
+            diff.truncatePatch();
+            patchz = deflate(diff.getPatch());
+          } else {
+            req.setBaseId(baseId.name());
+            req.setBaseZ(basez);
+          }
+        } catch (IOException err) {
+          LOG.fatal(logkey() + " cannot read base " + baseId.name(), err);
+          throw new StopProcessingException("No " + baseId.name());
+        }
+      }
+    }
+
+    if (!diff.isBinary() && !diff.isTruncated()) {
+      final ObjectId finalId = diff.getFinalId();
+      if (finalId == null || ObjectId.equals(finalId, ObjectId.zeroId())) {
+        req.setFinalId(EMPTY_BLOB_ID);
+      } else {
+        req.setFinalId(finalId.name());
+      }
+    }
+
+    req.setPatchZ(patchz);
+    req.setPatchId(hashOfInflated(patchz));
+
+    return req.build();
+  }
+
+  private static ByteString deflate(final byte[] buf) {
+    final ByteString.Output r = ByteString.newOutput();
+    final DeflaterOutputStream out = new DeflaterOutputStream(r);
+    try {
+      out.write(buf);
+      out.close();
+    } catch (IOException err) {
+      // This should not happen.
+      throw new StopProcessingException("Unexpected IO error", err);
+    }
+    return r.toByteString();
+  }
+
+  private static String hashOfInflated(final ByteString in) {
+    final MessageDigest md = Constants.newMessageDigest();
+    final byte[] tmp = new byte[512];
+    final InflaterInputStream iis = new InflaterInputStream(in.newInput());
+    int cnt;
+    try {
+      while ((cnt = iis.read(tmp)) > 0) {
+        md.update(tmp, 0, cnt);
+      }
+    } catch (IOException err) {
+      // This should not happen.
+      throw new StopProcessingException("Unexpected IO error", err);
+    }
+    return ObjectId.fromRaw(md.digest()).name();
+  }
+}
diff --git a/mgrapp/src/com/google/codereview/manager/unpack/ReceivedBundleUnpacker.java b/mgrapp/src/com/google/codereview/manager/unpack/ReceivedBundleUnpacker.java
new file mode 100644
index 0000000..942013d
--- /dev/null
+++ b/mgrapp/src/com/google/codereview/manager/unpack/ReceivedBundleUnpacker.java
@@ -0,0 +1,118 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.codereview.manager.unpack;
+
+import com.google.codereview.internal.NextReceivedBundle.NextReceivedBundleRequest;
+import com.google.codereview.internal.NextReceivedBundle.NextReceivedBundleResponse;
+import com.google.codereview.internal.UpdateReceivedBundle.UpdateReceivedBundleRequest;
+import com.google.codereview.internal.UpdateReceivedBundle.UpdateReceivedBundleResponse;
+import com.google.codereview.manager.Backend;
+import com.google.codereview.manager.StopProcessingException;
+import com.google.codereview.rpc.SimpleController;
+import com.google.codereview.util.MutableBoolean;
+import com.google.protobuf.RpcCallback;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/** Obtains newly received bundles and unpacks them into Git. */
+public class ReceivedBundleUnpacker implements Runnable {
+  private static final Log LOG =
+      LogFactory.getLog(ReceivedBundleUnpacker.class);
+
+  private static final NextReceivedBundleRequest NEXT_REQ =
+      NextReceivedBundleRequest.getDefaultInstance();
+
+  private final Backend server;
+
+  public ReceivedBundleUnpacker(final Backend be) {
+    server = be;
+  }
+
+  public void run() {
+    try {
+      runImpl();
+    } catch (RuntimeException err) {
+      LOG.fatal("Unexpected runtime failure", err);
+      throw err;
+    } catch (Error err) {
+      LOG.fatal("Unexpected runtime failure", err);
+      throw err;
+    }
+  }
+
+  private void runImpl() {
+    boolean tryAnother;
+    do {
+      tryAnother = next();
+    } while (tryAnother);
+  }
+
+  private boolean next() {
+    final MutableBoolean tryAnother = new MutableBoolean();
+    final SimpleController ctrl = new SimpleController();
+    server.getBundleStoreService().nextReceivedBundle(ctrl, NEXT_REQ,
+        new RpcCallback<NextReceivedBundleResponse>() {
+          public void run(final NextReceivedBundleResponse rsp) {
+            tryAnother.value = unpack(rsp);
+          }
+        });
+    if (ctrl.failed()) {
+      LOG.warn("nextReceivedBundle failed: " + ctrl.errorText());
+      tryAnother.value = false;
+    }
+    return tryAnother.value;
+  }
+
+  private boolean unpack(final NextReceivedBundleResponse rsp) {
+    final NextReceivedBundleResponse.CodeType sc = rsp.getStatusCode();
+    if (sc == NextReceivedBundleResponse.CodeType.QUEUE_EMPTY) {
+      return false;
+    }
+
+    if (sc == NextReceivedBundleResponse.CodeType.BUNDLE_AVAILABLE) {
+      send(unpackImpl(rsp));
+      return true;
+    }
+
+    throw new StopProcessingException("unknown status " + sc.name());
+  }
+
+  protected UpdateReceivedBundleRequest unpackImpl(
+      final NextReceivedBundleResponse rsp) {
+    return new UnpackBundleOp(server, rsp).unpack();
+  }
+
+  private void send(final UpdateReceivedBundleRequest req) {
+    final String key = req.getBundleKey();
+    final String sc = req.getStatusCode().name();
+    LOG.debug("Bundle " + key + ", status " + sc);
+
+    final SimpleController ctrl = new SimpleController();
+    server.getBundleStoreService().updateReceivedBundle(ctrl, req,
+        new RpcCallback<UpdateReceivedBundleResponse>() {
+          public void run(final UpdateReceivedBundleResponse rsp) {
+            final UpdateReceivedBundleResponse.CodeType sc =
+                rsp.getStatusCode();
+            if (sc != UpdateReceivedBundleResponse.CodeType.UPDATED) {
+              ctrl.setFailed(sc.name());
+            }
+          }
+        });
+    if (ctrl.failed()) {
+      LOG.error("Updating bundle " + key + " failed: " + ctrl.errorText());
+    }
+  }
+}
diff --git a/mgrapp/src/com/google/codereview/manager/unpack/RecordInputStream.java b/mgrapp/src/com/google/codereview/manager/unpack/RecordInputStream.java
new file mode 100644
index 0000000..3fe0974
--- /dev/null
+++ b/mgrapp/src/com/google/codereview/manager/unpack/RecordInputStream.java
@@ -0,0 +1,144 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.codereview.manager.unpack;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+/** Buffering input stream which can read entire lines. */
+class RecordInputStream extends InputStream {
+  private InputStream in;
+  private byte[] buf;
+  private int pos;
+  private int end;
+
+  RecordInputStream(final InputStream in) {
+    this.in = in;
+    buf = new byte[4096];
+  }
+
+  @Override
+  public void close() throws IOException {
+    try {
+      in.close();
+    } finally {
+      in = null;
+      buf = null;
+    }
+  }
+
+  private boolean fill() throws IOException {
+    pos = 0;
+    end = in.read(buf, pos, buf.length);
+    if (end < 0) {
+      end = 0;
+      return false;
+    }
+    return true;
+  }
+
+  @Override
+  public int read() throws IOException {
+    if (pos == end && !fill()) {
+      return -1;
+    }
+    return buf[pos++];
+  }
+
+  @Override
+  public int read(final byte[] b, final int off, final int len)
+      throws IOException {
+    if (pos == end && !fill()) {
+      return -1;
+    }
+    final int cnt = Math.min(len, end - pos);
+    System.arraycopy(buf, pos, b, off, cnt);
+    pos += cnt;
+    return cnt;
+  }
+
+  /**
+   * Read a record terminated by the separator byte.
+   * 
+   * @param sep byte which delimits the end of a record.
+   * @return record content, with the separator removed from the end. The empty
+   *         array indicates an empty record; null indicates stream EOF.
+   * @throws IOException the stream could not be read from.
+   */
+  byte[] readRecord(final int sep) throws IOException {
+    if (pos == end && !fill()) {
+      return null;
+    }
+
+    byte[] line = fastReadRecord(sep);
+    if (line != null) {
+      return line;
+    }
+
+    if (end - pos <= buf.length / 2) {
+      int cnt = end - pos;
+      System.arraycopy(buf, pos, buf, 0, cnt);
+      pos = 0;
+      end = cnt;
+
+      cnt = in.read(buf, end, buf.length - end);
+      if (cnt < 0) {
+        final byte[] r = new byte[end];
+        System.arraycopy(buf, 0, r, 0, end);
+        pos = end = 0;
+        return r;
+      }
+      end += cnt;
+
+      line = fastReadRecord(sep);
+      if (line != null) {
+        return line;
+      }
+    }
+
+    final ByteArrayOutputStream out = new ByteArrayOutputStream();
+    out.write(buf, pos, end - pos);
+    for (;;) {
+      if (!fill()) {
+        return out.toByteArray();
+      }
+
+      for (int lf = pos; lf < end; lf++) {
+        if (buf[lf] == sep) {
+          out.write(buf, pos, lf - pos);
+          pos = lf + 1;
+          return out.toByteArray();
+        }
+      }
+
+      out.write(buf, pos, end - pos);
+      pos = end;
+    }
+  }
+
+  private byte[] fastReadRecord(final int sep) {
+    for (int lf = pos; lf < end; lf++) {
+      if (buf[lf] == sep) {
+        final int cnt = lf - pos;
+        final byte[] r = new byte[cnt];
+        System.arraycopy(buf, pos, r, 0, cnt);
+        pos = lf + 1;
+        return r;
+      }
+    }
+    return null;
+  }
+}
diff --git a/mgrapp/src/com/google/codereview/manager/unpack/UnpackBundleOp.java b/mgrapp/src/com/google/codereview/manager/unpack/UnpackBundleOp.java
new file mode 100644
index 0000000..0b57269
--- /dev/null
+++ b/mgrapp/src/com/google/codereview/manager/unpack/UnpackBundleOp.java
@@ -0,0 +1,331 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.codereview.manager.unpack;
+
+import com.google.codereview.internal.NextReceivedBundle.BundleSegmentRequest;
+import com.google.codereview.internal.NextReceivedBundle.BundleSegmentResponse;
+import com.google.codereview.internal.NextReceivedBundle.NextReceivedBundleResponse;
+import com.google.codereview.internal.SubmitChange.SubmitChangeRequest;
+import com.google.codereview.internal.SubmitChange.SubmitChangeResponse;
+import com.google.codereview.internal.UpdateReceivedBundle.UpdateReceivedBundleRequest;
+import com.google.codereview.internal.UpdateReceivedBundle.UpdateReceivedBundleRequest.CodeType;
+import com.google.codereview.manager.Backend;
+import com.google.codereview.manager.InvalidRepositoryException;
+import com.google.codereview.rpc.SimpleController;
+import com.google.codereview.util.GitMetaUtil;
+import com.google.codereview.util.MutableBoolean;
+import com.google.protobuf.RpcCallback;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.spearce.jgit.errors.MissingBundlePrerequisiteException;
+import org.spearce.jgit.lib.NullProgressMonitor;
+import org.spearce.jgit.lib.ObjectId;
+import org.spearce.jgit.lib.Ref;
+import org.spearce.jgit.lib.RefUpdate;
+import org.spearce.jgit.lib.Repository;
+import org.spearce.jgit.revwalk.RevCommit;
+import org.spearce.jgit.revwalk.RevSort;
+import org.spearce.jgit.revwalk.RevWalk;
+import org.spearce.jgit.transport.FetchConnection;
+import org.spearce.jgit.transport.Transport;
+import org.spearce.jgit.transport.TransportBundleStream;
+import org.spearce.jgit.transport.URIish;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+/** Unpacks a bundle and imports the commits into the code review system. */
+class UnpackBundleOp {
+  private static final Log LOG = LogFactory.getLog(UnpackBundleOp.class);
+
+  private static String refOf(final int changeId, final int patchsetId) {
+    final StringBuilder b = new StringBuilder();
+    final int dh = changeId % 100;
+    b.append("refs/changes/");
+    if (dh < 10) {
+      b.append('0');
+    }
+    b.append(dh);
+    b.append('/');
+    b.append(changeId);
+    b.append('/');
+    b.append(patchsetId);
+    return b.toString();
+  }
+
+  private final Backend server;
+  private final NextReceivedBundleResponse in;
+  private Repository db;
+  private ObjectId tip;
+  private int changeId;
+  private int patchsetId;
+  private String patchsetKey;
+
+  UnpackBundleOp(final Backend be, final NextReceivedBundleResponse bundleInfo) {
+    server = be;
+    in = bundleInfo;
+  }
+
+  UpdateReceivedBundleRequest unpack() {
+    final UpdateReceivedBundleRequest.Builder update;
+    update = UpdateReceivedBundleRequest.newBuilder();
+    update.setBundleKey(in.getBundleKey());
+    try {
+      unpackImpl();
+      update.setStatusCode(CodeType.UNPACKED_OK);
+    } catch (UnpackException ue) {
+      update.setStatusCode(ue.status);
+      update.setErrorDetails(ue.details);
+      LOG.error("Unpacking bundle " + in.getBundleKey() + " failed.", ue);
+    }
+    return update.build();
+  }
+
+  private void unpackImpl() throws UnpackException {
+    LOG.debug("Unpacking bundle " + in.getBundleKey());
+    openRepository();
+    unpackTip();
+    createChanges(newCommits());
+  }
+
+  private void openRepository() throws UnpackException {
+    try {
+      db = server.getRepositoryCache().get(in.getDestProject());
+    } catch (InvalidRepositoryException notGit) {
+      final String m = "Repository \"" + in.getDestProject() + "\" unknown.";
+      throw new UnpackException(CodeType.UNKNOWN_PROJECT, m, notGit);
+    }
+  }
+
+  private void unpackTip() throws UnpackException {
+    final Transport bundleTransport = openBundle();
+    try {
+      final FetchConnection fc = bundleTransport.openFetch();
+      if (fc.getRefs().size() > 1) {
+        final String m = "Bundle contains more than one head";
+        throw new UnpackException(CodeType.INVALID_BUNDLE, m);
+      } else if (fc.getRefs().size() == 0) {
+        final String m = "Bundle contains no heads";
+        throw new UnpackException(CodeType.INVALID_BUNDLE, m);
+      }
+
+      fc.fetch(NullProgressMonitor.INSTANCE, fc.getRefs());
+      tip = fc.getRefs().iterator().next().getObjectId();
+      LOG.debug("Unpacked " + tip.name() + " from " + in.getBundleKey());
+    } catch (MissingBundlePrerequisiteException e) {
+      throw new UnpackException(CodeType.MISSING_BASE, e.getMessage(), e);
+    } catch (IOException readError) {
+      final String m = "Processing the bundle stream failed";
+      throw new UnpackException(CodeType.INVALID_BUNDLE, m, readError);
+    } finally {
+      bundleTransport.close();
+    }
+  }
+
+  private List<RevCommit> newCommits() throws UnpackException {
+    final RevWalk rw = new RevWalk(db);
+    rw.sort(RevSort.REVERSE, true);
+    rw.sort(RevSort.TOPO, true);
+
+    try {
+      rw.markStart(rw.parseCommit(tip));
+    } catch (IOException e) {
+      final String m = "Chain " + tip.name() + " is corrupt";
+      throw new UnpackException(CodeType.INVALID_BUNDLE, m, e);
+    }
+
+    for (final Ref r : db.getAllRefs().values()) {
+      try {
+        rw.markUninteresting(rw.parseCommit(r.getObjectId()));
+      } catch (IOException err) {
+        final String m = "Local ref is invalid";
+        throw new UnpackException(CodeType.SUSPEND_BUNDLE, m, err);
+      }
+    }
+
+    try {
+      final List<RevCommit> newList = new ArrayList<RevCommit>();
+      RevCommit c;
+      while ((c = rw.next()) != null) {
+        // Ensure the parents are parsed so we know the parent's tree.
+        // We need that later to compute a difference.
+        //
+        for (final RevCommit p : c.getParents()) {
+          rw.parse(p);
+        }
+        newList.add(c);
+      }
+      return newList;
+    } catch (IOException e) {
+      final String m = "Chain " + tip.name() + " is corrupt";
+      throw new UnpackException(CodeType.INVALID_BUNDLE, m, e);
+    }
+  }
+
+  private void createChanges(final List<RevCommit> newCommits)
+      throws UnpackException {
+    for (final RevCommit c : newCommits) {
+      if (submitChange(c)) {
+        createChangeRef(c);
+        server.asyncExec(new PatchSetUploader(server, db, c, patchsetKey));
+      }
+    }
+  }
+
+  private boolean submitChange(final RevCommit c) throws UnpackException {
+    final SubmitChangeRequest.Builder req = SubmitChangeRequest.newBuilder();
+
+    req.setOwner(in.getOwner());
+    req.setDestBranchKey(in.getDestBranchKey());
+    req.setCommit(GitMetaUtil.toGitCommit(c));
+
+    final MutableBoolean continueCreation = new MutableBoolean();
+    final SimpleController ctrl = new SimpleController();
+    server.getChangeService().submitChange(ctrl, req.build(),
+        new RpcCallback<SubmitChangeResponse>() {
+          public void run(final SubmitChangeResponse rsp) {
+            final SubmitChangeResponse.CodeType sc = rsp.getStatusCode();
+
+            if (sc == SubmitChangeResponse.CodeType.CREATED) {
+              changeId = rsp.getChangeId();
+              patchsetId = rsp.getPatchsetId();
+              patchsetKey = rsp.getPatchsetKey();
+              continueCreation.value = true;
+              LOG.debug("Commit " + c.getId().name() + " is change " + changeId
+                  + " patchset " + patchsetId);
+
+            } else if (sc == SubmitChangeResponse.CodeType.PATCHSET_EXISTS) {
+              LOG.debug("Commit " + c.getId().name() + " exists in data store");
+
+            } else {
+              ctrl.setFailed("Unknown status " + sc.name());
+            }
+          }
+        });
+    if (ctrl.failed()) {
+      throw new UnpackException(CodeType.SUSPEND_BUNDLE, ctrl.errorText());
+    }
+    return continueCreation.value;
+  }
+
+  private void createChangeRef(final RevCommit c) throws UnpackException {
+    final String name = refOf(changeId, patchsetId);
+    final RefUpdate.Result r;
+    try {
+      final RefUpdate u = db.updateRef(name);
+      u.setNewObjectId(c.getId());
+      u.setForceUpdate(true);
+      u.setRefLogMessage("Change submitted", false);
+      r = u.update();
+    } catch (IOException err) {
+      final String m = "Failure creating " + name;
+      throw new UnpackException(CodeType.SUSPEND_BUNDLE, m, err);
+    }
+
+    if (r == RefUpdate.Result.NEW) {
+    } else if (r == RefUpdate.Result.FAST_FORWARD) {
+    } else if (r == RefUpdate.Result.FORCED) {
+    } else if (r == RefUpdate.Result.NO_CHANGE) {
+    } else {
+      final String m = "Failure creating " + name + ": " + r.name();
+      throw new UnpackException(CodeType.SUSPEND_BUNDLE, m);
+    }
+  }
+
+  private TransportBundleStream openBundle() {
+    final URIish uri = makeURI(in);
+    return new TransportBundleStream(db, uri, new BundleStream());
+  }
+
+  private static URIish makeURI(final NextReceivedBundleResponse in) {
+    URIish u = new URIish();
+    u = u.setScheme("codereview-bundle");
+    u = u.setPath(in.getBundleKey());
+    return u;
+  }
+
+  private class BundleStream extends InputStream {
+    private int segmentId = 1;
+    private final int totalSegments = in.getNSegments();
+    private InputStream stream = in.getBundleData().newInput();
+
+    @Override
+    public int read() throws IOException {
+      for (;;) {
+        if (stream == null) {
+          return -1;
+        }
+
+        final int r = stream.read();
+        if (r < 0) {
+          openNextStream();
+        } else {
+          return r;
+        }
+      }
+    }
+
+    @Override
+    public int read(final byte[] b, final int off, final int len)
+        throws IOException {
+      for (;;) {
+        if (stream == null) {
+          return -1;
+        }
+
+        final int r = stream.read(b, off, len);
+        if (r < 0) {
+          openNextStream();
+        } else {
+          return r;
+        }
+      }
+    }
+
+    private void openNextStream() throws IOException {
+      if (segmentId >= totalSegments) {
+        stream = null;
+        return;
+      }
+
+      segmentId++;
+      final BundleSegmentRequest.Builder req;
+
+      req = BundleSegmentRequest.newBuilder();
+      req.setBundleKey(in.getBundleKey());
+      req.setSegmentId(segmentId);
+
+      final SimpleController ctrl = new SimpleController();
+      server.getBundleStoreService().bundleSegment(ctrl, req.build(),
+          new RpcCallback<BundleSegmentResponse>() {
+            public void run(final BundleSegmentResponse rsp) {
+              final BundleSegmentResponse.CodeType sc = rsp.getStatusCode();
+              if (sc == BundleSegmentResponse.CodeType.DATA) {
+                stream = rsp.getBundleData().newInput();
+              } else {
+                ctrl.setFailed(sc.name());
+              }
+            }
+          });
+      if (ctrl.failed()) {
+        throw new IOException("Bundle" + in.getBundleKey() + " segment "
+            + segmentId + " unavailable: " + ctrl.errorText());
+      }
+    }
+  }
+}
diff --git a/mgrapp/src/com/google/codereview/manager/unpack/UnpackException.java b/mgrapp/src/com/google/codereview/manager/unpack/UnpackException.java
new file mode 100644
index 0000000..d1af4a0
--- /dev/null
+++ b/mgrapp/src/com/google/codereview/manager/unpack/UnpackException.java
@@ -0,0 +1,35 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.codereview.manager.unpack;
+
+import com.google.codereview.internal.UpdateReceivedBundle.UpdateReceivedBundleRequest.CodeType;
+
+/** Indicates unpacking failed and the bundle cannot be processed. */
+class UnpackException extends Exception {
+  final CodeType status;
+  final String details;
+
+  UnpackException(final CodeType s, final String msg) {
+    super(msg, null);
+    status = s;
+    details = msg;
+  }
+
+  UnpackException(final CodeType s, final String msg, final Throwable why) {
+    super(msg, why);
+    status = s;
+    details = msg;
+  }
+}
diff --git a/mgrapp/src/com/google/codereview/rpc/HttpRpc.java b/mgrapp/src/com/google/codereview/rpc/HttpRpc.java
new file mode 100644
index 0000000..4d22c2e
--- /dev/null
+++ b/mgrapp/src/com/google/codereview/rpc/HttpRpc.java
@@ -0,0 +1,441 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.codereview.rpc;
+
+import com.google.codereview.NeedRetry.RetryRequestLaterResponse;
+import com.google.protobuf.Message;
+import com.google.protobuf.RpcCallback;
+import com.google.protobuf.RpcChannel;
+import com.google.protobuf.RpcController;
+import com.google.protobuf.Descriptors.MethodDescriptor;
+import com.google.protobuf.Message.Builder;
+
+import org.apache.commons.httpclient.Cookie;
+import org.apache.commons.httpclient.Header;
+import org.apache.commons.httpclient.HostConfiguration;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
+import org.apache.commons.httpclient.NameValuePair;
+import org.apache.commons.httpclient.URI;
+import org.apache.commons.httpclient.URIException;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.commons.httpclient.methods.PostMethod;
+import org.apache.commons.httpclient.params.HttpConnectionManagerParams;
+import org.spearce.jgit.util.Base64;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.ConnectException;
+import java.net.URL;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.zip.InflaterInputStream;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+
+/**
+ * Simple protocol buffer RPC embedded inside HTTP POST.
+ * <p>
+ * Request messages are POSTed to "/proto/$serviceName/$methodName".
+ * Authentication for the user is always obtained via the user's Google Account,
+ * with session cookies automatically renewing themselves if expired.
+ * <p>
+ * This implementation is thread safe. Callers may use a single HttpRpc over
+ * multiple threads in order to pool and reuse connections across threads.
+ * <p>
+ * All remote calls are performed synchronously. This is a simplification within
+ * the implementation, as it is unlikely the remote side can support parallel
+ * requests over the same top level entities.
+ * <p>
+ * Authentication is tied to Google accounts.
+ */
+public class HttpRpc implements RpcChannel {
+  private static final String ENC = "UTF-8";
+
+  private static final Message RETRY_LATER =
+      RetryRequestLaterResponse.getDefaultInstance();
+
+  /** URL required to authenticate the user into their Google account. */
+  private static final URI LOGIN;
+
+  /**
+   * Maximum number of connections we should make to 'production' servers.
+   * <p>
+   * If the servers are running on Google owned infrastructure such as the
+   * www.google.com or Google App Engine we can generally push at least one or
+   * two connections per thread without causing any trouble.
+   */
+  private static final int MAX_PROD_CONNS = 10;
+
+  /** Special token used in authentication to verify we were successful. */
+  private static final String AUTH_CONTINUE_TOKEN = "http://localhost/";
+
+  static {
+    try {
+      LOGIN = new URI("https://www.google.com/accounts/ClientLogin", true);
+    } catch (URIException err) {
+      final ExceptionInInitializerError le;
+      le = new ExceptionInInitializerError("Bad LOGIN URL");
+      le.initCause(err);
+      throw le;
+    }
+  }
+
+  private final HttpClient http;
+  private final URI server;
+  private final String userEmail;
+  private final String userPassword;
+  private final byte[] apiKey;
+  private boolean authenticated;
+
+  /**
+   * Create a new RPC implementation.
+   * 
+   * @param host protocol, server host, and port number. The path component is
+   *        ignored as requests are made absolute ('/proto/$service/$method').
+   * @param user name to authenticate to Google with. This is very likely the
+   *        user's email address.
+   * @param pass password for the user's Google account.
+   * @param apiKeyStr (optional) the internal API key. If supplied all requests
+   *        will be signed with the key, in case the request requires the
+   *        internal API authentication.
+   */
+  public HttpRpc(final URL host, final String user, final String pass,
+      final String apiKeyStr) {
+    http = new HttpClient(new MultiThreadedHttpConnectionManager());
+    userEmail = user;
+    userPassword = pass;
+    apiKey = apiKeyStr != null ? Base64.decode(apiKeyStr) : null;
+
+    final HttpConnectionManagerParams params =
+        http.getHttpConnectionManager().getParams();
+    try {
+      server = new URI(host.toExternalForm(), true);
+
+      final HostConfiguration serverConfig = new HostConfiguration();
+      serverConfig.setHost(server);
+
+      // The development server cannot do normal authentication so we must
+      // fake it here by injecting a development server specific cookie.
+      //
+      if ("localhost".equals(server.getHost())) {
+        if (userEmail != null) {
+          final Cookie c = new Cookie();
+          c.setDomain(server.getHost());
+          c.setPath("/");
+          c.setName("dev_appserver_login");
+          c.setValue(userEmail + ":False");
+          http.getState().addCookie(c);
+        }
+        authenticated = true;
+        params.setMaxConnectionsPerHost(serverConfig, 1);
+      } else {
+        params.setMaxConnectionsPerHost(serverConfig, MAX_PROD_CONNS);
+      }
+
+      final HostConfiguration clientLoginConfig = new HostConfiguration();
+      clientLoginConfig.setHost(LOGIN);
+      params.setMaxConnectionsPerHost(clientLoginConfig, MAX_PROD_CONNS);
+    } catch (URIException e) {
+      throw new IllegalArgumentException("Bad URL: " + host.toExternalForm(), e);
+    }
+  }
+
+  public void callMethod(final MethodDescriptor method,
+      final RpcController controller, final Message request,
+      final Message responsePrototype, final RpcCallback<Message> done) {
+    final URI uri;
+    final String svcName = method.getService().getName();
+    final String methodName = method.getName();
+    try {
+      uri = new URI(server, "/proto/" + svcName + "/" + methodName, true);
+    } catch (URIException urlError) {
+      controller.setFailed(urlError.toString());
+      return;
+    }
+
+    final MessageRequestEntity entity;
+    try {
+      entity = new MessageRequestEntity(request);
+    } catch (IOException err) {
+      controller.setFailed("cannot encode request: " + err);
+      return;
+    }
+
+    if (controller instanceof SimpleController) {
+      ((SimpleController) controller).markFirstRequest();
+    }
+
+    for (;;) {
+      final PostMethod conn = new PostMethod();
+      Message responseMessage = null;
+      try {
+        conn.setDoAuthentication(false);
+        conn.setURI(uri);
+        conn.setRequestEntity(entity);
+
+        ensureAuthenticated();
+        for (int attempts = 1; responseMessage == null; attempts++) {
+          if (apiKey != null) {
+            sign(conn);
+          }
+
+          final int status = http.executeMethod(conn);
+          if (HttpStatus.SC_OK == status) {
+            responseMessage = parseResponse(conn, responsePrototype);
+          } else if (HttpStatus.SC_UNAUTHORIZED == status) {
+            if (attempts == 2) {
+              responseMessage = null;
+              controller.setFailed("Authentication required");
+              break;
+            }
+            synchronized (this) {
+              authenticated = false;
+              ensureAuthenticated();
+            }
+          } else if (HttpStatus.SC_FORBIDDEN == status
+              || HttpStatus.SC_NOT_FOUND == status
+              || HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE == status) {
+            String body = conn.getResponseBodyAsString(60);
+            if (body.indexOf('\n') > 0)
+              body = body.substring(0, body.indexOf('\n'));
+            responseMessage = null;
+            controller.setFailed(svcName + ": " + body);
+            break;
+          } else {
+            responseMessage = null;
+            controller.setFailed("HTTP failure: " + status);
+            break;
+          }
+        }
+      } catch (ConnectException ce) {
+        final String why = ce.getMessage() + " " + server;
+        if (controller instanceof SimpleController) {
+          final SimpleController sc = (SimpleController) controller;
+          if (sc.retry()) {
+            continue;
+          } else {
+            controller.setFailed(controller.errorText() + ": " + why);
+            break;
+          }
+        } else {
+          controller.setFailed(why);
+          break;
+        }
+      } catch (IOException err) {
+        controller.setFailed("HTTP failure: " + err.getMessage());
+        break;
+      } finally {
+        conn.releaseConnection();
+      }
+
+      if (responseMessage instanceof RetryRequestLaterResponse) {
+        if (controller instanceof SimpleController) {
+          final SimpleController sc = (SimpleController) controller;
+          if (sc.retry()) {
+            continue;
+          }
+        }
+
+        controller.setFailed("remote requested retry");
+        break;
+      }
+
+      if (responseMessage != null) {
+        done.run(responseMessage);
+      }
+
+      break;
+    }
+
+    entity.destroy();
+  }
+
+  private Message parseResponse(final PostMethod conn,
+      final Message responsePrototype) throws IOException {
+    final Header typeHeader = conn.getResponseHeader("Content-Type");
+    if (typeHeader == null) {
+      throw new IOException("No Content-Type in response");
+    }
+    final String[] typeTokens = typeHeader.getValue().split("; ");
+    if (!MessageRequestEntity.TYPE.equals(typeTokens[0])) {
+      throw new IOException("Invalid Content-Type " + typeHeader.getValue());
+    }
+
+    String rspName = null;
+    String rspCompress = null;
+    for (int i = 1; i < typeTokens.length; i++) {
+      final String tok = typeTokens[i];
+      if (tok.startsWith("name=")) {
+        rspName = tok.substring("name=".length());
+      } else if (tok.startsWith("compress=")) {
+        rspCompress = tok.substring("compress=".length());
+      }
+    }
+
+    String expName = responsePrototype.getDescriptorForType().getFullName();
+    final Builder builder;
+    if (expName.equals(rspName)) {
+      builder = responsePrototype.newBuilderForType();
+    } else if (rspName.equals(RETRY_LATER.getDescriptorForType().getFullName())) {
+      builder = RETRY_LATER.newBuilderForType();
+    } else {
+      throw new IOException("Expected a " + expName + " got " + rspName);
+    }
+
+    InputStream in = conn.getResponseBodyAsStream();
+    if ("deflate".equals(rspCompress)) {
+      in = new InflaterInputStream(in);
+    } else if (rspCompress != null) {
+      throw new IOException("Unsupported compression " + rspCompress);
+    }
+
+    try {
+      builder.mergeFrom(in);
+    } finally {
+      in.close();
+    }
+    return builder.build();
+  }
+
+  private synchronized void ensureAuthenticated() throws IOException {
+    if (!authenticated) {
+      if (userEmail != null && userPassword != null) {
+        computeAuthCookie(computeAuthToken());
+      }
+      authenticated = true;
+    }
+  }
+
+  private String computeAuthToken() throws IOException {
+    final PostMethod conn = new PostMethod();
+    try {
+      conn.setDoAuthentication(false);
+      conn.setURI(LOGIN);
+      conn.setRequestBody(new NameValuePair[] {
+          new NameValuePair("Email", userEmail),
+          new NameValuePair("Passwd", userPassword),
+          new NameValuePair("service", "ah"),
+          new NameValuePair("source", "gerrit-codereview-manager"),
+          new NameValuePair("accountType", "HOSTED_OR_GOOGLE")});
+
+      final int status = http.executeMethod(conn);
+      final Map<String, String> rsp =
+          splitPairs(conn.getResponseBodyAsStream());
+      if (status != HttpStatus.SC_OK) {
+        throw new IOException("Authentication failed: " + rsp.get("Error"));
+      }
+      return rsp.get("Auth");
+    } finally {
+      conn.releaseConnection();
+    }
+  }
+
+  private void computeAuthCookie(final String authToken) throws IOException {
+    final GetMethod conn = new GetMethod();
+    try {
+      conn.setFollowRedirects(false);
+      conn.setDoAuthentication(false);
+      conn.setURI(new URI(server, "/_ah/login", true));
+      conn.setQueryString(new NameValuePair[] {
+          new NameValuePair("continue", AUTH_CONTINUE_TOKEN),
+          new NameValuePair("auth", authToken),});
+
+      final int status = http.executeMethod(conn);
+      final Header location = conn.getResponseHeader("Location");
+      if (status != HttpStatus.SC_MOVED_TEMPORARILY || location == null
+          || !AUTH_CONTINUE_TOKEN.equals(location.getValue())) {
+        throw new IOException("Obtaining authentication cookie failed: "
+            + status);
+      }
+    } finally {
+      conn.releaseConnection();
+    }
+  }
+
+  private Map<String, String> splitPairs(final InputStream cin)
+      throws IOException {
+    final HashMap<String, String> rsp = new HashMap<String, String>();
+    final BufferedReader in =
+        new BufferedReader(new InputStreamReader(cin, ENC));
+    try {
+      String line;
+      while ((line = in.readLine()) != null) {
+        final int eq = line.indexOf('=');
+        if (eq >= 0) {
+          rsp.put(line.substring(0, eq), line.substring(eq + 1));
+        }
+      }
+    } finally {
+      in.close();
+    }
+    return rsp;
+  }
+
+  private void sign(final PostMethod conn) throws IOException {
+    conn.setRequestHeader("X-Date-UTC", xDateUTC());
+
+    final StringBuilder b = new StringBuilder();
+
+    b.append("POST ");
+    b.append(conn.getPath());
+    b.append('\n');
+
+    b.append("X-Date-UTC: ");
+    b.append(conn.getRequestHeader("X-Date-UTC").getValue());
+    b.append('\n');
+
+    b.append("Content-Type: ");
+    b.append(conn.getRequestEntity().getContentType());
+    b.append('\n');
+
+    b.append('\n');
+
+    final String sec;
+    try {
+      final Mac m = Mac.getInstance("HmacSHA1");
+      m.init(new SecretKeySpec(apiKey, "HmacSHA1"));
+      m.update(b.toString().getBytes("UTF-8"));
+      conn.getRequestEntity().writeRequest(new OutputStream() {
+        @Override
+        public void write(byte[] b, int off, int len) {
+          m.update(b, off, len);
+        }
+
+        @Override
+        public void write(int b) {
+          m.update((byte) b);
+        }
+      });
+      sec = Base64.encodeBytes(m.doFinal());
+    } catch (NoSuchAlgorithmException e) {
+      throw new IOException("No HmacSHA1 support:" + e.getMessage());
+    } catch (InvalidKeyException e) {
+      throw new IOException("Invalid key: " + e.getMessage());
+    }
+    conn.setRequestHeader("Authorization", "proto :" + sec);
+  }
+
+  private String xDateUTC() {
+    return String.valueOf(System.currentTimeMillis() / 1000L);
+  }
+}
diff --git a/mgrapp/src/com/google/codereview/rpc/MessageRequestEntity.java b/mgrapp/src/com/google/codereview/rpc/MessageRequestEntity.java
new file mode 100644
index 0000000..ba9afd3
--- /dev/null
+++ b/mgrapp/src/com/google/codereview/rpc/MessageRequestEntity.java
@@ -0,0 +1,88 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.codereview.rpc;
+
+import com.google.protobuf.Message;
+
+import org.apache.commons.httpclient.methods.RequestEntity;
+import org.spearce.jgit.lib.NullProgressMonitor;
+import org.spearce.jgit.util.TemporaryBuffer;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.zip.DeflaterOutputStream;
+
+/**
+ * Formats a protocol buffer Message into an HTTP request body.
+ * <p>
+ * The compressed binary serialized form is always used.
+ */
+public class MessageRequestEntity implements RequestEntity {
+  /** Content-Type for a protocol buffer. */
+  public static final String TYPE = "application/x-google-protobuf";
+
+  private final Message msg;
+  private final String name;
+  private final TemporaryBuffer temp;
+
+  /**
+   * Create a new request for a single message.
+   * 
+   * @param m the message to serialize and transmit.
+   * @throws IOException the message could not be compressed into temporary
+   *         storage. The local file system may be full, or the message is
+   *         unable to compress itself.
+   */
+  public MessageRequestEntity(final Message m) throws IOException {
+    msg = m;
+    name = msg.getDescriptorForType().getFullName();
+    temp = new TemporaryBuffer();
+    final DeflaterOutputStream dos = new DeflaterOutputStream(temp);
+    try {
+      msg.writeTo(dos);
+    } finally {
+      dos.close();
+    }
+  }
+
+  public long getContentLength() {
+    return (int) temp.length();
+  }
+
+  public String getContentType() {
+    return TYPE + "; name=" + name + "; compress=deflate";
+  }
+
+  public boolean isRepeatable() {
+    return true;
+  }
+
+  public void writeRequest(final OutputStream out) throws IOException {
+    temp.writeTo(out, NullProgressMonitor.INSTANCE);
+  }
+
+  public void destroy() {
+    temp.destroy();
+  }
+
+  @Override
+  public String toString() {
+    final StringBuilder r = new StringBuilder();
+    r.append(name);
+    r.append('\n');
+    r.append(msg.toString());
+    return r.toString();
+  }
+}
diff --git a/mgrapp/src/com/google/codereview/rpc/SimpleController.java b/mgrapp/src/com/google/codereview/rpc/SimpleController.java
new file mode 100644
index 0000000..6f0736c
--- /dev/null
+++ b/mgrapp/src/com/google/codereview/rpc/SimpleController.java
@@ -0,0 +1,97 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.codereview.rpc;
+
+import com.google.protobuf.RpcCallback;
+import com.google.protobuf.RpcController;
+
+import java.util.Random;
+
+/**
+ * A simple controller which does not support cancellation.
+ * <p>
+ * Users should check {@link #failed()} to determine if a call failed.
+ */
+public class SimpleController implements RpcController {
+  private static final int SLEEP_MIN = 100; // milliseconds
+  private static final int SLEEP_MAX = 2 * 60 * 1000; // milliseconds
+  private static final int MAX_ATTEMPT_PERIOD = 30 * 60 * 1000; // milliseconds
+  private static final ThreadLocal<Random> SLEEP_RNG =
+      new ThreadLocal<Random>() {
+        @Override
+        protected Random initialValue() {
+          return new Random();
+        }
+      };
+
+  private static int waitTime() {
+    return SLEEP_MIN + SLEEP_RNG.get().nextInt(SLEEP_MAX - SLEEP_MIN);
+  }
+
+  private String errorText;
+  private long start;
+
+  public String errorText() {
+    return errorText;
+  }
+
+  public boolean failed() {
+    return errorText != null;
+  }
+
+  public void reset() {
+    errorText = null;
+  }
+
+  public void setFailed(final String reason) {
+    errorText = reason;
+  }
+
+  public void startCancel() {
+    throw new UnsupportedOperationException();
+  }
+
+  public boolean isCanceled() {
+    return false;
+  }
+
+  public void notifyOnCancel(final RpcCallback<Object> callback) {
+    throw new UnsupportedOperationException();
+  }
+
+  boolean retry() {
+    if (System.currentTimeMillis() - start < MAX_ATTEMPT_PERIOD) {
+      try {
+        Thread.sleep(waitTime());
+      } catch (InterruptedException ie) {
+        // Just let the thread continue anyway.
+      }
+      return true;
+    }
+
+    if (start == 0) {
+      setFailed("retry not supported by the RpcChannel");
+      return false;
+    }
+
+    final int s = MAX_ATTEMPT_PERIOD / 1000;
+    setFailed("cannot complete in <" + s + " seconds");
+    return false;
+  }
+
+  void markFirstRequest() {
+    start = System.currentTimeMillis();
+  }
+}
diff --git a/mgrapp/src/com/google/codereview/util/GitMetaUtil.java b/mgrapp/src/com/google/codereview/util/GitMetaUtil.java
new file mode 100644
index 0000000..0625a6f
--- /dev/null
+++ b/mgrapp/src/com/google/codereview/util/GitMetaUtil.java
@@ -0,0 +1,73 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.codereview.util;
+
+import com.google.codereview.internal.GitMeta.GitCommit;
+import com.google.codereview.internal.GitMeta.GitPerson;
+
+import org.spearce.jgit.lib.PersonIdent;
+import org.spearce.jgit.lib.Repository;
+import org.spearce.jgit.revwalk.RevCommit;
+
+import java.io.File;
+import java.io.IOException;
+
+public class GitMetaUtil {
+  public static GitCommit toGitCommit(final RevCommit c) {
+    final GitCommit.Builder b = GitCommit.newBuilder();
+    b.setId(c.getId().name());
+    for (final RevCommit p : c.getParents())
+      b.addParentId(p.getId().name());
+    b.setAuthor(toGitPerson(c.getAuthorIdent()));
+    b.setCommitter(toGitPerson(c.getCommitterIdent()));
+    b.setMessage(c.getFullMessage());
+    b.setSubject(c.getShortMessage());
+    return b.build();
+  }
+
+  public static GitPerson toGitPerson(final PersonIdent who) {
+    final GitPerson.Builder b = GitPerson.newBuilder();
+    b.setName(who.getName());
+    b.setEmail(who.getEmailAddress());
+    b.setWhen((int) (who.getWhen().getTime() / 1000L));
+    b.setTz(who.getTimeZoneOffset());
+    return b.build();
+  }
+
+  public static boolean isGitRepository(final File gitdir) {
+    return new File(gitdir, "config").isFile()
+        && new File(gitdir, "HEAD").isFile()
+        && new File(gitdir, "objects").isDirectory()
+        && new File(gitdir, "refs/heads").isDirectory();
+  }
+
+  public static Repository open(final File gitdir) throws IOException {
+    if (isGitRepository(gitdir)) {
+      return new Repository(gitdir);
+    }
+
+    if (isGitRepository(new File(gitdir, ".git"))) {
+      return new Repository(new File(gitdir, ".git"));
+    }
+
+    final String name = gitdir.getName();
+    final File parent = gitdir.getParentFile();
+    if (isGitRepository(new File(parent, name + ".git"))) {
+      return new Repository(new File(parent, name + ".git"));
+    }
+
+    return null;
+  }
+}
diff --git a/mgrapp/src/com/google/codereview/util/MutableBoolean.java b/mgrapp/src/com/google/codereview/util/MutableBoolean.java
new file mode 100644
index 0000000..1329d4a
--- /dev/null
+++ b/mgrapp/src/com/google/codereview/util/MutableBoolean.java
@@ -0,0 +1,33 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.codereview.util;
+
+import com.google.protobuf.RpcCallback;
+
+/**
+ * A simple boolean which can be modified.
+ * <p>
+ * This can be useful in a {@link RpcCallback}.
+ */
+public class MutableBoolean {
+  public boolean value;
+
+  public MutableBoolean() {
+  }
+
+  public MutableBoolean(final boolean initial) {
+    value = initial;
+  }
+}
diff --git a/mgrapp/src/com/google/githacks/BrokenShallowRepositoryCreator.java b/mgrapp/src/com/google/githacks/BrokenShallowRepositoryCreator.java
new file mode 100644
index 0000000..1682dd6
--- /dev/null
+++ b/mgrapp/src/com/google/githacks/BrokenShallowRepositoryCreator.java
@@ -0,0 +1,270 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.githacks;
+
+import com.google.codereview.util.GitMetaUtil;
+
+import org.spearce.jgit.lib.Constants;
+import org.spearce.jgit.lib.LockFile;
+import org.spearce.jgit.lib.ObjectId;
+import org.spearce.jgit.lib.PackWriter;
+import org.spearce.jgit.lib.Ref;
+import org.spearce.jgit.lib.RefUpdate;
+import org.spearce.jgit.lib.Repository;
+import org.spearce.jgit.lib.TextProgressMonitor;
+import org.spearce.jgit.revwalk.RevCommit;
+import org.spearce.jgit.revwalk.RevObject;
+import org.spearce.jgit.revwalk.RevWalk;
+import org.spearce.jgit.treewalk.TreeWalk;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Creates a broken shallow repository with a populated assumed base.
+ * <p>
+ * Broken shallow repositories contain a handful of commits (the assumed base)
+ * and the trees referenced by those commits, but not the blobs or the commit
+ * ancestors. These repositories are meant to only be used as a source to fetch
+ * an overlay from, where the native Git protocol negotiated the assumed base as
+ * the common ancestor.
+ * <p>
+ * The created repository is not marked as shallow and does not have any grafts
+ * in it. Clients (or applications) which attempt to walk back through history
+ * beyond the assumed base will encounter missing objects and crash. Not
+ * configuring the shallow or grafts file is a "data integrity" feature to
+ * ensure that clients fetching or cloning from this shallow repository will not
+ * be able to succeed, as they do not (and would not receive) the needed but
+ * missing objects.
+ */
+public class BrokenShallowRepositoryCreator {
+  /**
+   * Create (or update) broken shallow repositories, recursively.
+   * 
+   * @param srcTop the root of the source tree.
+   * @param dstTop the root of the destination tree.
+   * @throws IOException a repository failed to be converted.
+   */
+  public static void createRecursive(final File srcTop, final File dstTop)
+      throws IOException {
+    final File[] srcEntries = srcTop.listFiles();
+    if (srcEntries == null) {
+      return;
+    }
+
+    for (final File srcEnt : srcEntries) {
+      final String srcName = srcEnt.getName();
+      if (srcName.equals(".") || srcName.equals("..")) {
+        continue;
+      } else if (!srcEnt.isDirectory()) {
+        continue;
+      } else if (GitMetaUtil.isGitRepository(srcEnt)) {
+        create(srcEnt, new File(dstTop, srcEnt.getName()));
+      } else {
+        createRecursive(srcEnt, new File(dstTop, srcEnt.getName()));
+      }
+    }
+  }
+
+  /**
+   * Create (or update) a broken shallow repository.
+   * 
+   * @param srcGitDir the source repository, where commits and trees can be
+   *        copied from.
+   * @param dstGitDir the destination repository, where the tree data (but not
+   *        blob data) will be packed into. If this directory does not exist it
+   *        will be automatically created.
+   * @throws IOException there was an error reading from the source or writing
+   *         to the destination repository.
+   */
+  public static void create(final File srcGitDir, final File dstGitDir)
+      throws IOException {
+    final Repository srcdb = new Repository(srcGitDir);
+
+    final RevWalk srcwalk = new RevWalk(srcdb);
+    final List<ObjectId> assumed = readAssumedBase(srcdb);
+    final List<RevObject> toCopy = new ArrayList<RevObject>(assumed.size() * 2);
+    final TreeWalk tw = new TreeWalk(srcdb);
+    for (final ObjectId id : assumed) {
+      final RevCommit c = srcwalk.parseCommit(id);
+      toCopy.add(c);
+      toCopy.add(c.getTree());
+
+      tw.reset();
+      tw.addTree(c.getTree());
+
+      while (tw.next()) {
+        switch (tw.getFileMode(0).getObjectType()) {
+          case Constants.OBJ_TREE:
+            toCopy.add(srcwalk.lookupTree(tw.getObjectId(0)));
+            tw.enterSubtree();
+            break;
+          case Constants.OBJ_BLOB:
+            break;
+          default:
+            break;
+        }
+      }
+    }
+
+    final Repository destdb = new Repository(dstGitDir);
+    if (!destdb.getDirectory().exists()) {
+      destdb.create();
+    }
+
+    final List<ObjectId> destAssumed = readAssumedBase(destdb);
+    destAssumed.addAll(assumed);
+    writeAssumedBase(destdb, destAssumed);
+
+    if (destAssumed.isEmpty()) {
+      // Nothing assumed, it doesn't need special processing from us.
+      //
+      return;
+    }
+
+    System.out.println("Packing " + destdb.getDirectory());
+
+    // Prepare pack of the assumed base. Clients wouldn't need to
+    // fetch this pack, as they already have its contents.
+    //
+    PackWriter packer = new PackWriter(srcdb, new TextProgressMonitor());
+    packer.preparePack(toCopy.iterator());
+    storePack(destdb, packer);
+
+    // Prepare a pack of everything else not in the assumed base. This
+    // would need to be fetched. We build it second so it has a newer
+    // timestamp when it goes into the list of packs, and will therefore
+    // be searched first by clients.
+    //
+    final Map<String, Ref> srcrefs = srcdb.getAllRefs();
+    final List<ObjectId> need = new ArrayList<ObjectId>();
+    for (final Ref r : srcrefs.values()) {
+      need.add(r.getObjectId());
+    }
+    packer = new PackWriter(srcdb, new TextProgressMonitor());
+    packer.preparePack(need, destAssumed, false, false);
+    storePack(destdb, packer);
+
+    // Force all of the refs in destdb to match srcdb. We want full
+    // mirroring style semantics now that the objects are in place.
+    //
+    final RevWalk dstwalk = new RevWalk(destdb);
+    destdb.writeSymref(Constants.HEAD, srcdb.getFullBranch());
+    for (final Ref r : destdb.getAllRefs().values()) {
+      if (!srcrefs.containsKey(r.getName())) {
+        final RefUpdate u = destdb.updateRef(r.getName());
+        u.setForceUpdate(true);
+        u.delete(dstwalk);
+      }
+    }
+
+    for (final Ref r : srcrefs.values()) {
+      final RefUpdate u = destdb.updateRef(r.getName());
+      if (u.getOldObjectId() == null
+          || !u.getOldObjectId().equals(r.getObjectId())) {
+        u.setNewObjectId(r.getObjectId());
+        u.setForceUpdate(true);
+        u.update(dstwalk);
+      }
+    }
+
+    srcdb.close();
+    destdb.close();
+  }
+
+  private static void storePack(final Repository destdb, PackWriter packer)
+      throws FileNotFoundException, IOException {
+    final String packName = "pack-" + packer.computeName().name();
+    final File packDir = new File(destdb.getObjectsDirectory(), "pack");
+    final File packPath = new File(packDir, packName + ".pack");
+    final File idxPath = new File(packDir, packName + ".idx");
+
+    if (!packPath.exists() && !idxPath.exists()) {
+      {
+        final OutputStream os = new FileOutputStream(packPath);
+        try {
+          packer.writePack(os);
+        } finally {
+          os.close();
+        }
+        packPath.setReadOnly();
+      }
+      {
+        final OutputStream os = new FileOutputStream(idxPath);
+        try {
+          packer.writeIndex(os);
+        } finally {
+          os.close();
+        }
+        idxPath.setReadOnly();
+      }
+    }
+  }
+
+  private static List<ObjectId> readAssumedBase(final Repository db)
+      throws IOException {
+    final List<ObjectId> list = new ArrayList<ObjectId>();
+    try {
+      final BufferedReader br;
+
+      br = new BufferedReader(new FileReader(infoAssumedBase(db)));
+      try {
+        String line;
+        while ((line = br.readLine()) != null) {
+          list.add(ObjectId.fromString(line));
+        }
+      } finally {
+        br.close();
+      }
+    } catch (FileNotFoundException noList) {
+      // Ignore it. We'll return an empty list to the caller.
+    }
+    return list;
+  }
+
+  private static void writeAssumedBase(final Repository db,
+      final List<ObjectId> newList) throws IOException {
+    if (newList == null || newList.isEmpty()) {
+      infoAssumedBase(db).delete();
+      return;
+    }
+
+    final LockFile lf = new LockFile(infoAssumedBase(db));
+    if (!lf.lock()) {
+      throw new IOException("Cannot lock " + infoAssumedBase(db));
+    }
+
+    final OutputStream ow = lf.getOutputStream();
+    for (final ObjectId id : newList) {
+      id.copyTo(ow);
+    }
+    ow.close();
+    if (!lf.commit()) {
+      throw new IOException("Cannot commit " + infoAssumedBase(db));
+    }
+  }
+
+  private static File infoAssumedBase(final Repository db) {
+    return new File(db.getDirectory(), "info/assumed-base");
+  }
+}
diff --git a/proto/internal/admin.proto b/proto/internal/admin.proto
new file mode 100644
index 0000000..b7f156e
--- /dev/null
+++ b/proto/internal/admin.proto
@@ -0,0 +1,23 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package codereview.internal;
+option java_package = "com.google.codereview.internal";
+
+import "sync_project.proto";
+
+service AdminService {
+  rpc SyncProject(SyncProjectRequest)
+  returns (SyncProjectResponse);
+}
diff --git a/proto/internal/build.proto b/proto/internal/build.proto
new file mode 100644
index 0000000..ebe0bea
--- /dev/null
+++ b/proto/internal/build.proto
@@ -0,0 +1,37 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package codereview.internal;
+option java_package = "com.google.codereview.internal";
+
+import "submit_build.proto";
+import "post_build_result.proto";
+import "prune_builds.proto";
+
+service BuildService {
+  // Denote that a project build is starting.
+  //
+  rpc SubmitBuild(SubmitBuildRequest)
+  returns (SubmitBuildResponse);
+
+  // Update an open build attempt with its status.
+  //
+  rpc PostBuildResult(PostBuildResultRequest)
+  returns (PostBuildResultResponse);
+
+  // Clear out any build logs we don't need any more.
+  //
+  rpc PruneBuilds(PruneBuildsRequest)
+  returns (PruneBuildsResponse);
+}
diff --git a/proto/internal/bundle_store.proto b/proto/internal/bundle_store.proto
new file mode 100644
index 0000000..bbdbd5d
--- /dev/null
+++ b/proto/internal/bundle_store.proto
@@ -0,0 +1,43 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package codereview.internal;
+option java_package = "com.google.codereview.internal";
+
+import "next_received_bundle.proto";
+import "prune_bundles.proto";
+import "update_received_bundle.proto";
+
+service BundleStoreService {
+  // Grab the next available bundle.  The bundle is deferred from
+  // processing for a short period of time to avoid duplicate work.
+  //
+  rpc NextReceivedBundle(NextReceivedBundleRequest)
+  returns (NextReceivedBundleResponse);
+
+  // Get a single, specific segment of a bundle.
+  //
+  rpc BundleSegment(BundleSegmentRequest)
+  returns (BundleSegmentResponse);
+
+  // Acknowledge a bundle as received into Git.
+  //
+  rpc UpdateReceivedBundle(UpdateReceivedBundleRequest)
+  returns (UpdateReceivedBundleResponse);
+
+  // Clear out any bundles we don't need any longer.
+  //
+  rpc PruneBundles(PruneBundlesRequest)
+  returns (PruneBundlesResponse);
+}
diff --git a/proto/internal/change.proto b/proto/internal/change.proto
new file mode 100644
index 0000000..d4a8e6c
--- /dev/null
+++ b/proto/internal/change.proto
@@ -0,0 +1,37 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package codereview.internal;
+option java_package = "com.google.codereview.internal";
+
+import "complete_patchset.proto";
+import "submit_change.proto";
+import "upload_patchset_file.proto";
+
+service ChangeService {
+  // Create a change and (empty) patchset for a Git commit.
+  //
+  rpc SubmitChange(SubmitChangeRequest)
+  returns (SubmitChangeResponse);
+
+  // Attaches a file to an existing patchset
+  //
+  rpc UploadPatchsetFile(UploadPatchsetFileRequest)
+  returns (UploadPatchsetFileResponse);
+
+  // Mark a patchset as complete (fully uploaded)
+  //
+  rpc CompletePatchset(CompletePatchsetRequest)
+  returns (CompletePatchsetResponse);
+}
diff --git a/proto/internal/complete_patchset.proto b/proto/internal/complete_patchset.proto
new file mode 100644
index 0000000..e016f78
--- /dev/null
+++ b/proto/internal/complete_patchset.proto
@@ -0,0 +1,31 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package codereview.internal;
+option java_package = "com.google.codereview.internal";
+
+message CompletePatchsetRequest {
+  // Unique key for the patchset.
+  //
+  required string patchset_key = 10;
+
+  // Complete list of paths in this patch.  Paths are
+  // encoded in UTF-8, null delimited and the list is
+  // compressed with deflate to reduce storage space.
+  //
+  optional bytes compressed_filenames = 11;
+}
+
+message CompletePatchsetResponse {
+}
diff --git a/proto/internal/git_meta.proto b/proto/internal/git_meta.proto
new file mode 100644
index 0000000..8c6e3b2
--- /dev/null
+++ b/proto/internal/git_meta.proto
@@ -0,0 +1,63 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package codereview.internal;
+option java_package = "com.google.codereview.internal";
+
+message GitPerson {
+  // "Givenname Surname" of the person this identifies.
+  //
+  required string name = 1;
+
+  // "who@example.com"; email address of the person.
+  //
+  required string email = 2;
+
+  // UTC seconds since epoch of the time event
+  //
+  required int32 when = 3;
+
+  // Person's preferred timezone offset, minutes east of UTC.
+  //
+  required int32 tz = 4;
+}
+
+message GitCommit {
+  // Commit hash as a hex string.
+  //
+  required string id = 1;
+
+  // Parent commit(s) this commit depends upon in ancestry.
+  // Formatted as hex strings.
+  //
+  repeated string parent_id = 2;
+
+  // Identity of the author of the commit.
+  //
+  required GitPerson author = 3;
+
+  // Identity of the committer (creator) of the commit.
+  // If not present use author instead (as committer is
+  // identical to author, a very common case).
+  //
+  optional GitPerson committer = 4;
+
+  // Message body of the commit.
+  //
+  optional string message = 5;
+
+  // First line (no LF) of the message.
+  //
+  optional string subject = 6;
+}
diff --git a/proto/internal/merge.proto b/proto/internal/merge.proto
new file mode 100644
index 0000000..40024dc
--- /dev/null
+++ b/proto/internal/merge.proto
@@ -0,0 +1,38 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package codereview.internal;
+option java_package = "com.google.codereview.internal";
+
+import "pending_merge.proto";
+import "post_branch_update.proto";
+import "post_merge_result.proto";
+
+service MergeService {
+  // Grab the next available pending merge.
+  //
+  rpc NextPendingMerge(PendingMergeRequest)
+  returns (PendingMergeResponse);
+
+  // Updates the status of a pending merge.
+  //
+  rpc PostMergeResult(PostMergeResultRequest)
+  returns (PostMergeResultResponse);
+
+  // Notify the data store that a branch has
+  // updated to a new revision.
+  //
+  rpc PostBranchUpdate(PostBranchUpdateRequest)
+  returns (PostBranchUpdateResponse);
+}
diff --git a/proto/internal/next_received_bundle.proto b/proto/internal/next_received_bundle.proto
new file mode 100644
index 0000000..d556eee
--- /dev/null
+++ b/proto/internal/next_received_bundle.proto
@@ -0,0 +1,73 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package codereview.internal;
+option java_package = "com.google.codereview.internal";
+
+message NextReceivedBundleRequest {
+}
+
+message NextReceivedBundleResponse {
+  enum CodeType {
+    BUNDLE_AVAILABLE = 1;
+    QUEUE_EMPTY = 2;
+  }
+  required CodeType status_code = 1;
+
+  // Unique identification of this bundle record.
+  //
+  optional string bundle_key = 2;
+
+  // Name of the project this bundle is applied to.
+  //
+  optional string dest_project = 3;
+
+  // Key of the project this bundle is applied to.
+  //
+  optional string dest_project_key = 4;
+
+  // Key of the branch the uploader thought the bundle
+  // should be applied to.
+  //
+  optional string dest_branch_key = 5;
+
+  // The unmodified bundle file, including its header.
+  //
+  optional bytes bundle_data = 6;
+
+  // Total number of segments in the bundle.
+  //
+  optional int32 n_segments = 8;
+
+  // Identification key for the owner of the bundle.
+  // Issues created will be tied back to them.
+  //
+  optional string owner = 7;
+}
+
+message BundleSegmentRequest {
+  required string bundle_key = 10;
+  required int32 segment_id = 11;
+}
+
+message BundleSegmentResponse {
+  enum CodeType {
+    DATA = 1;
+
+    UNKNOWN_BUNDLE = 2;
+    UNKNOWN_SEGMENT = 3;
+  }
+  required CodeType status_code = 10;
+  optional bytes bundle_data = 11;
+}
diff --git a/proto/internal/pending_merge.proto b/proto/internal/pending_merge.proto
new file mode 100644
index 0000000..b7ed3d5
--- /dev/null
+++ b/proto/internal/pending_merge.proto
@@ -0,0 +1,64 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package codereview.internal;
+option java_package = "com.google.codereview.internal";
+
+// Request for the next available pending merge
+//
+message PendingMergeRequest {
+}
+
+// A single revision needing to be merged
+//
+message PendingMergeItem {
+  // Unique key of the PatchSet to merge
+  //
+  required string patchset_key = 1;
+
+  // Revision in the VCS
+  //
+  required string revision_id = 2;
+}
+
+// A repository+branch pair, and the commits to merge into it
+//
+message PendingMergeResponse {
+  enum CodeType {
+    QUEUE_EMPTY = 1;
+    MERGE_READY = 2;
+  }
+  required CodeType status_code = 10;
+
+  // The repository the merge should take place in
+  //
+  optional string dest_project_name = 11;
+
+  // Unique key for the repository
+  //
+  optional string dest_project_key = 12;
+
+  // The branch the result of the merge goes into
+  //
+  optional string dest_branch_name = 13;
+
+  // Unique key for the branch (and repository).
+  //
+  optional string dest_branch_key = 14;
+
+  // One or more commits to merge into dest_branch
+  // (all commits must be in dest_repository already)
+  //
+  repeated PendingMergeItem change = 1;
+}
diff --git a/proto/internal/post_branch_update.proto b/proto/internal/post_branch_update.proto
new file mode 100644
index 0000000..5d99b2b
--- /dev/null
+++ b/proto/internal/post_branch_update.proto
@@ -0,0 +1,30 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package codereview.internal;
+option java_package = "com.google.codereview.internal";
+
+message PostBranchUpdateRequest {
+  // Unique key for the branch (and repository).
+  //
+  required string branch_key = 10;
+
+  // Unique keys of the PatchSets which were added
+  // into the branch.
+  //
+  repeated string new_change = 1;
+}
+
+message PostBranchUpdateResponse {
+}
diff --git a/proto/internal/post_build_result.proto b/proto/internal/post_build_result.proto
new file mode 100644
index 0000000..c0be468
--- /dev/null
+++ b/proto/internal/post_build_result.proto
@@ -0,0 +1,68 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package codereview.internal;
+option java_package = "com.google.codereview.internal";
+
+// Update a build entity with the results of the build
+// (status of build, log file)
+//
+message PostBuildResultRequest {
+  // Unique number assigned by a previous SubmitBuildResponse
+  //
+  required int32 build_id = 10;
+
+  enum ResultType {
+    SUCCESS = 1;   // the build (and/or tests) completed normally
+    FAILURE = 2;   // the build (and/or tests) did not pass
+  }
+  required ResultType build_status = 11;
+
+  // Complete output (log file and/or captured stdout/stderr)
+  // This message usually contains embedded newlines and is
+  // the direct output of 'make' or some other process.
+  //
+  optional string build_log = 12;
+}
+
+// Information about a branch that needs to finish merging
+//
+message PostBuildResultResponse {
+  // The repository the merge should take place in
+  //
+  optional string dest_project_name = 10;
+
+  // Unique key for the repository
+  //
+  optional string dest_project_key = 11;
+
+  // The branch the result of the merge goes into
+  //
+  optional string dest_branch_name = 12;
+
+  // Unique key for the branch (and repository).
+  //
+  optional string dest_branch_key = 13;
+
+  // Revision the branch should advance to if the branch
+  // wants to advance based on the build result.
+  //
+  optional string revision_id = 14;
+
+  // Unique keys of the PatchSets which would be added
+  // to the branch if the branch is updated to match
+  // revision_id
+  //
+  repeated string new_change = 1;
+}
diff --git a/proto/internal/post_merge_result.proto b/proto/internal/post_merge_result.proto
new file mode 100644
index 0000000..cea6371
--- /dev/null
+++ b/proto/internal/post_merge_result.proto
@@ -0,0 +1,43 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package codereview.internal;
+option java_package = "com.google.codereview.internal";
+
+message MergeResultItem {
+  enum CodeType {
+    CLEAN_MERGE = 1;        // change merged clean
+    ALREADY_MERGED = 2;     // previously merged into the branch
+    MISSING_DEPENDENCY = 3; // another issue is still required
+    PATH_CONFLICT = 4;      // path level conflict; not trivial
+  }
+  required CodeType status_code = 1;
+
+  // Unique key of the PatchSet to merge
+  //
+  required string patchset_key = 2;
+}
+
+message PostMergeResultRequest {
+  // Unique key of the branch this merge submits into.
+  //
+  required string dest_branch_key = 10;
+
+  // Individual patch set update responses
+  //
+  repeated MergeResultItem change = 1;
+}
+
+message PostMergeResultResponse {
+}
diff --git a/proto/internal/prune_builds.proto b/proto/internal/prune_builds.proto
new file mode 100644
index 0000000..326de5c
--- /dev/null
+++ b/proto/internal/prune_builds.proto
@@ -0,0 +1,27 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package codereview.internal;
+option java_package = "com.google.codereview.internal";
+
+message PruneBuildsRequest {
+}
+
+message PruneBuildsResponse {
+  enum CodeType {
+    BUILDS_PRUNED = 1;
+    QUEUE_EMPTY = 2;
+  }
+  required CodeType status_code = 10;
+}
diff --git a/proto/internal/prune_bundles.proto b/proto/internal/prune_bundles.proto
new file mode 100644
index 0000000..baa0c0e
--- /dev/null
+++ b/proto/internal/prune_bundles.proto
@@ -0,0 +1,27 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package codereview.internal;
+option java_package = "com.google.codereview.internal";
+
+message PruneBundlesRequest {
+}
+
+message PruneBundlesResponse {
+  enum CodeType {
+    BUNDLES_PRUNED = 1;
+    QUEUE_EMPTY = 2;
+  }
+  required CodeType status_code = 10;
+}
diff --git a/proto/internal/submit_build.proto b/proto/internal/submit_build.proto
new file mode 100644
index 0000000..e369184
--- /dev/null
+++ b/proto/internal/submit_build.proto
@@ -0,0 +1,26 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package codereview.internal;
+option java_package = "com.google.codereview.internal";
+
+message SubmitBuildRequest {
+  required string branch_key = 10;
+  required string revision_id = 11;
+  repeated string new_change = 1;
+}
+
+message SubmitBuildResponse {
+  optional int32 build_id = 10;
+}
diff --git a/proto/internal/submit_change.proto b/proto/internal/submit_change.proto
new file mode 100644
index 0000000..3ff4371
--- /dev/null
+++ b/proto/internal/submit_change.proto
@@ -0,0 +1,55 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package codereview.internal;
+option java_package = "com.google.codereview.internal";
+
+import "git_meta.proto";
+
+message SubmitChangeRequest {
+  // Key of the branch the owner wants the change on.
+  //
+  required string dest_branch_key = 10;
+
+  // Parsed description of the commit at the tip of topic_branch.
+  // Identity of the change owner (usually this is the
+  // bundle owner).
+  //
+  required string owner = 11;
+
+  // Dependencies are inferred by commit.parent_id.
+  //
+  required GitCommit commit = 12;
+}
+
+message SubmitChangeResponse {
+  enum CodeType {
+    CREATED = 1;
+    PATCHSET_EXISTS = 2;
+    UNKNOWN_BRANCH = 3;
+  }
+  required CodeType status_code = 10;
+
+  // The identifier for the change.
+  //
+  optional int32 change_id = 11;
+
+  // Identifier for the patchset within the change.
+  //
+  optional int32 patchset_id = 12;
+
+  // Unique key for the patchset.
+  //
+  optional string patchset_key = 13;
+}
diff --git a/proto/internal/sync_project.proto b/proto/internal/sync_project.proto
new file mode 100644
index 0000000..f661da7
--- /dev/null
+++ b/proto/internal/sync_project.proto
@@ -0,0 +1,31 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package codereview.internal;
+option java_package = "com.google.codereview.internal";
+
+import "git_meta.proto";
+
+message BranchSync {
+  required string branch_name = 1;
+  required GitCommit commit = 2;
+}
+
+message SyncProjectRequest {
+  required string project_name = 10;
+  repeated BranchSync branch = 1;
+}
+
+message SyncProjectResponse {
+}
diff --git a/proto/internal/update_received_bundle.proto b/proto/internal/update_received_bundle.proto
new file mode 100644
index 0000000..13f2e06
--- /dev/null
+++ b/proto/internal/update_received_bundle.proto
@@ -0,0 +1,44 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package codereview.internal;
+option java_package = "com.google.codereview.internal";
+
+message UpdateReceivedBundleRequest {
+  enum CodeType {
+    UNPACKED_OK = 1;
+    UNKNOWN_PROJECT = 2;
+    INVALID_BUNDLE = 3;
+    MISSING_BASE = 4;
+    SUSPEND_BUNDLE = 5;
+  }
+  required CodeType status_code = 1;
+
+  // Unique identification of the bundle record.
+  //
+  required string bundle_key = 2;
+
+  // Exception details related to why the bundle is bad.
+  //
+  optional string error_details = 3;
+}
+
+message UpdateReceivedBundleResponse {
+  enum CodeType {
+    UPDATED = 1;
+    UNKNOWN_BUNDLE = 2;
+    INVALID_STATE = 3;
+  }
+  required CodeType status_code = 1;
+}
diff --git a/proto/internal/upload_patchset_file.proto b/proto/internal/upload_patchset_file.proto
new file mode 100644
index 0000000..3c1748b
--- /dev/null
+++ b/proto/internal/upload_patchset_file.proto
@@ -0,0 +1,61 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package codereview.internal;
+option java_package = "com.google.codereview.internal";
+
+import "git_meta.proto";
+
+message UploadPatchsetFileRequest {
+  // Unique key for the patchset.
+  //
+  required string patchset_key = 10;
+
+  // Path of the file once the patch is applied
+  //
+  required string file_name = 11;
+
+  // Type of change made to the file
+  //
+  enum StatusType {
+    ADD = 1;
+    MODIFY = 2;
+    DELETE = 3;
+  }
+  required StatusType status = 13;
+
+  // Deflated base content for the file (pre-image), encoding
+  // is not specified, but should be UTF-8.  base_id is the
+  // Git style blob SHA-1 hash of the inflated base_data.
+  //
+  optional bytes base_z = 14;
+  optional string base_id = 15;
+
+  // Deflated gerrit friendly patch format for the file
+  //
+  optional bytes patch_z = 16;
+  optional string patch_id = 17;
+  optional string final_id = 18;
+}
+
+message UploadPatchsetFileResponse {
+  enum CodeType {
+    CREATED = 1;
+
+    CLOSED = 2;           // the patchset is not accepting files
+    UNKNOWN_PATCHSET = 3; // the patchset key is invalid
+    PATCHING_ERROR = 4;   // the patch could not be applied
+  }
+  required CodeType status_code = 10;
+}
diff --git a/proto/need_retry.proto b/proto/need_retry.proto
new file mode 100644
index 0000000..d1b02fe
--- /dev/null
+++ b/proto/need_retry.proto
@@ -0,0 +1,29 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package codereview;
+option java_package = "com.google.codereview";
+
+// Message sent in reply to any "atomic" RPC asking
+// the client to sleep a bit, then resubmit the same
+// request message to the server.
+//
+// If any work was performed before the retry was
+// returned, the server assures the client that
+// duplicate records won't be created as a result
+// of the resubmission.
+//
+
+message RetryRequestLaterResponse {
+}
diff --git a/proto/review.proto b/proto/review.proto
new file mode 100644
index 0000000..ffc5934
--- /dev/null
+++ b/proto/review.proto
@@ -0,0 +1,32 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package codereview;
+option java_package = "com.google.codereview";
+
+import "upload_bundle.proto";
+
+// Review service operations available to users.
+//
+service ReviewService {
+  // Upload a Git bundle file for review and merging.
+  //
+  rpc UploadBundle (UploadBundleRequest)
+  returns (UploadBundleResponse);
+
+  // Continue uploading a partial bundle.
+  //
+  rpc ContinueBundle (UploadBundleContinue)
+  returns (UploadBundleResponse);
+}
diff --git a/proto/upload_bundle.proto b/proto/upload_bundle.proto
new file mode 100644
index 0000000..47fc968
--- /dev/null
+++ b/proto/upload_bundle.proto
@@ -0,0 +1,98 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package codereview;
+option java_package = "com.google.codereview";
+
+// Uploads a bundle to start a review process.
+//
+
+message UploadBundleRequest {
+  // Name of the project this bundle is applied to.
+  //
+  required string dest_project = 10;
+
+  // Name of the branch the uploader thinks it should
+  // have its tip commit merged into.
+  //
+  required string dest_branch = 11;
+
+  // Set if this is a partial bundle upload.  Remaining
+  // segments can be supplied with UploadBundleContinue.
+  //
+  required bool partial_upload = 12;
+
+  // The unmodified bundle file, including its text based header.
+  //
+  // The bundle must have exactly 1 ref available, but the
+  // name of the ref does not matter.  It only needs to be
+  // a valid ref name ("refs/..." or "HEAD").
+  //
+  // This may be a partial fragment of the bundle, in which
+  // case the partial_upload flag must be set.
+  //
+  required bytes bundle_data = 13;
+
+  // An object id known to be in this bundle.  Typically only
+  // commits and/or annotated tags would be enumerated here.
+  //
+  repeated string contained_object = 1;
+}
+
+message UploadBundleResponse {
+  enum CodeType {
+    RECEIVED = 1;         // the bundle is fully uploaded
+    CONTINUE = 4;         // client should use UploadBundleContinue
+
+    UNAUTHORIZED_USER = 7;  // the user account is not allowed to upload
+
+    UNKNOWN_PROJECT = 2;  // the project is invalid
+    UNKNOWN_BRANCH = 3;   // the branch is invalid
+    UNKNOWN_BUNDLE = 5;   // the bundle id is invalid
+    NOT_BUNDLE_OWNER = 6; // the bundle is not your bundle
+    BUNDLE_CLOSED = 8;    // the bundle is already uploaded
+  }
+  required CodeType status_code = 10;
+
+  // Unique identification of this bundle record.
+  // (RECEIVED, CONTINUE)
+  //
+  optional string bundle_id = 11;
+}
+
+message UploadBundleContinue {
+  // The bundle identifier supplied by UploadBundleResponse
+  //
+  required string bundle_id = 10;
+
+  // The segment number of this segment in the bundle.
+  //
+  // The first segment (created by UploadBundleRequest)
+  // is always 1.  The first UploadBundleContinue should
+  // use a segment_id of 2.
+  //
+  required int32 segment_id = 11;
+
+  // Set if this is a partial bundle upload.  Remaining
+  // segments can be supplied with UploadBundleContinue.
+  //
+  required bool partial_upload = 12;
+
+  // The next data segment for the bundle.
+  //
+  // This may be a partial fragment of the bundle, in which
+  // case the partial_upload flag must be set.
+  //
+  optional bytes bundle_data = 13;
+}
diff --git a/test-utils.sh b/test-utils.sh
new file mode 100644
index 0000000..5f82930
--- /dev/null
+++ b/test-utils.sh
@@ -0,0 +1,165 @@
+#
+# Copyright 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+## 
+## Source this script into your shell:
+##
+##   . test-utils.sh
+##
+## so that you can run:
+##
+##   gerrit clean
+##   gerrit reset
+##   gerrit gae
+##   gerrit crm
+##
+## to setup a local testing environment using the Google App Engine
+## SDK and a local Java installation.
+##
+
+TEST_DIR=test
+TEST_CRM_DATA_DIR=$TEST_DIR/crm-data
+TEST_GERRIT_DATASTORE_DIR=$TEST_DIR/gerrit-datastore
+
+TEST_CLIENT0=$TEST_DIR/client0
+TEST_CLIENT1=$TEST_DIR/client1
+TEST_LOCAL_CONFIG=$TEST_DIR/localhost.config
+
+TEST_CRM_PASSWORD_FILE=$TEST_DIR/.crm-password
+
+function gerrit-clean()
+{
+  rm -rf $TEST_DIR
+}
+
+function gerrit-reset()
+{
+  FULL_GIT_BASE=`pwd`/$TEST_CRM_DATA_DIR
+
+  # delete the old data
+  gerrit-clean
+
+  # make the crm data
+  FULL_CRM_DATA_FILE=`pwd`/crm-data.tar.gz
+  mkdir -p $TEST_DIR/crm-data
+  ( cd $TEST_CRM_DATA_DIR ; tar zxf $FULL_CRM_DATA_FILE )
+
+  # make two git clients (should use repo)
+  mkdir -p $TEST_CLIENT0
+  ( cd $TEST_CLIENT0 ; git clone $FULL_GIT_BASE/test.git > /dev/null)
+  mkdir -p $TEST_CLIENT1
+  ( cd $TEST_CLIENT1 ; git clone $FULL_GIT_BASE/test.git > /dev/null)
+
+  make all
+
+  # make localhost.config
+  echo "[user]" > $TEST_LOCAL_CONFIG
+  echo "  name = Gerrit Code Review" >> $TEST_LOCAL_CONFIG
+  echo "  email = gerrit@localhost" >> $TEST_LOCAL_CONFIG
+  echo "" >> $TEST_LOCAL_CONFIG
+  echo "[codereview]" >> $TEST_LOCAL_CONFIG
+  echo "  server = http://localhost:8080/" >> $TEST_LOCAL_CONFIG
+  echo "  basedir = $(pwd)/$TEST_CRM_DATA_DIR"  >> $TEST_LOCAL_CONFIG
+  echo "  username = android-git@google.com" >> $TEST_LOCAL_CONFIG
+  echo "  secureconfig = .crm-password" \
+      >> $TEST_LOCAL_CONFIG
+  echo "  sleep = 10" >> $TEST_LOCAL_CONFIG
+  echo "  threads = 1" >> $TEST_LOCAL_CONFIG
+
+  echo
+  echo "Finished.  Now you can run:"
+  echo "   gerrit gae   to run the app engine server"
+  echo "   gerrit crm   to run the crm server"
+  echo
+}
+
+
+# pack the git repository into a new crm-data.tar.gz
+function gerrit-pack-crm-data()
+{
+  FULL_CRM_DATA_FILE=`pwd`/crm-data.tar.gz
+  rm -f crm-data.tar.gz
+  ( cd $TEST_CRM_DATA_DIR ; tar czf $FULL_CRM_DATA_FILE * )
+}
+
+# run the google app engine dev server
+function gerrit-gae()
+{
+  FULL_GERRIT_DATASTORE_DIR=`pwd`/$TEST_GERRIT_DATASTORE_DIR
+  make serve DATASTORE=$FULL_GERRIT_DATASTORE_DIR
+}
+
+# run the crm server
+function gerrit-crm()
+{
+  if [ ! -f $TEST_CRM_PASSWORD_FILE ] ; then
+    ( curl http://localhost:8080/dev_init > $TEST_CRM_PASSWORD_FILE )
+    ( ./mgrapp/bin/mgr $TEST_LOCAL_CONFIG sync)
+  fi
+  ( ./mgrapp/bin/mgr $TEST_LOCAL_CONFIG )
+}
+
+function gerrit-help()
+{
+  echo "commands:"
+  echo "  clean"
+  echo "  reset"
+  echo "  pack-crm-data"
+  echo "  gae"
+  echo "  crm"
+  echo "  upload"
+}
+
+function gerrit-upload()
+{
+  python2.5 ../../../webapp/git_upload.py -s localhost:8080 \
+    -e author@example.com -p test -b refs/heads/master -B HEAD^
+}
+
+# main gerrit command
+function gerrit()
+{
+  if [ ! -f test-utils.sh ] ; then
+    echo Run gerrit from the directory that contains test-utils.sh
+    return
+  fi
+
+  case $1 in
+    clean)
+      gerrit-clean
+      ;;
+    reset)
+      gerrit-reset
+      ;;
+    pack-crm-data)
+      gerrit-pack-crm-data
+      ;;
+    gae)
+      gerrit-gae
+      ;;
+    crm)
+      gerrit-crm
+      ;;
+    help)
+      gerrit-help
+      ;;
+    *)
+      echo invalid gerrit command $1
+      ;;
+  esac
+}
+
+
+# vi: sts=2 ts=2 sw=2 nocindent
diff --git a/tests_mgrapp/.classpath b/tests_mgrapp/.classpath
new file mode 100644
index 0000000..7ce87a6
--- /dev/null
+++ b/tests_mgrapp/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/mgrapp"/>
+	<classpathentry kind="output" path="out_classes"/>
+</classpath>
diff --git a/tests_mgrapp/.gitignore b/tests_mgrapp/.gitignore
new file mode 100644
index 0000000..7b04794
--- /dev/null
+++ b/tests_mgrapp/.gitignore
@@ -0,0 +1 @@
+/out_classes
diff --git a/tests_mgrapp/.project b/tests_mgrapp/.project
new file mode 100644
index 0000000..e4c1e9b
--- /dev/null
+++ b/tests_mgrapp/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>tests_mgrapp</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/tests_mgrapp/.settings/org.eclipse.core.resources.prefs b/tests_mgrapp/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..82eb859
--- /dev/null
+++ b/tests_mgrapp/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,3 @@
+#Tue Sep 02 16:59:24 PDT 2008
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/tests_mgrapp/.settings/org.eclipse.core.runtime.prefs b/tests_mgrapp/.settings/org.eclipse.core.runtime.prefs
new file mode 100644
index 0000000..8667cfd
--- /dev/null
+++ b/tests_mgrapp/.settings/org.eclipse.core.runtime.prefs
@@ -0,0 +1,3 @@
+#Tue Sep 02 16:59:24 PDT 2008
+eclipse.preferences.version=1
+line.separator=\n
diff --git a/tests_mgrapp/.settings/org.eclipse.jdt.core.prefs b/tests_mgrapp/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..fa64d21
--- /dev/null
+++ b/tests_mgrapp/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,268 @@
+#Thu Sep 04 11:18:51 PDT 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=16
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=0
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=0
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=2
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=true
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
+org.eclipse.jdt.core.formatter.comment.line_length=80
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=true
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=80
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=3
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=false
+org.eclipse.jdt.core.formatter.tabulation.char=space
+org.eclipse.jdt.core.formatter.tabulation.size=2
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/tests_mgrapp/.settings/org.eclipse.jdt.ui.prefs b/tests_mgrapp/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..f37f6f0
--- /dev/null
+++ b/tests_mgrapp/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,9 @@
+#Tue Sep 02 17:00:18 PDT 2008
+eclipse.preferences.version=1
+formatter_profile=_Google Format
+formatter_settings_version=11
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=com.google;com;junit;net;org;java;javax;
+org.eclipse.jdt.ui.ondemandthreshold=99
+org.eclipse.jdt.ui.staticondemandthreshold=99
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates/>
diff --git a/tests_mgrapp/src/com/google/codereview/TrashTestCase.java b/tests_mgrapp/src/com/google/codereview/TrashTestCase.java
new file mode 100644
index 0000000..c374b1a
--- /dev/null
+++ b/tests_mgrapp/src/com/google/codereview/TrashTestCase.java
@@ -0,0 +1,59 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.codereview;
+
+import junit.framework.TestCase;
+
+import java.io.File;
+
+/**
+ * JUnit TestCase with support for creating a temporary directory.
+ */
+public abstract class TrashTestCase extends TestCase {
+  protected File tempRoot;
+
+  @Override
+  protected void setUp() throws Exception {
+    super.setUp();
+
+    tempRoot = File.createTempFile("codereview", "test");
+    tempRoot.delete();
+    tempRoot.mkdir();
+  }
+
+  @Override
+  protected void tearDown() throws Exception {
+    if (tempRoot != null) {
+      rm(tempRoot);
+    }
+    super.tearDown();
+  }
+
+  protected static void rm(final File dir) {
+    final File[] list = dir.listFiles();
+    for (int i = 0; list != null && i < list.length; i++) {
+      final File f = list[i];
+      if (f.getName().equals(".") || f.getName().equals("..")) {
+        continue;
+      }
+      if (f.isDirectory()) {
+        rm(f);
+      } else {
+        f.delete();
+      }
+    }
+    dir.delete();
+  }
+}
diff --git a/tests_mgrapp/src/com/google/codereview/manager/RepositoryCacheTest.java b/tests_mgrapp/src/com/google/codereview/manager/RepositoryCacheTest.java
new file mode 100644
index 0000000..8bf541a
--- /dev/null
+++ b/tests_mgrapp/src/com/google/codereview/manager/RepositoryCacheTest.java
@@ -0,0 +1,84 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.codereview.manager;
+
+import com.google.codereview.TrashTestCase;
+
+import org.spearce.jgit.lib.Repository;
+
+import java.io.File;
+
+public class RepositoryCacheTest extends TrashTestCase {
+  public void testCreateCache() {
+    final RepositoryCache rc = new RepositoryCache(tempRoot);
+  }
+
+  public void testLookupInvalidNames() {
+    final RepositoryCache rc = new RepositoryCache(tempRoot);
+    assertInvalidRepository(rc, "");
+    assertInvalidRepository(rc, "^");
+    assertInvalidRepository(rc, ".");
+    assertInvalidRepository(rc, "..");
+    assertInvalidRepository(rc, "../foo");
+    assertInvalidRepository(rc, "/foo");
+    assertInvalidRepository(rc, "/foo/bar");
+    assertInvalidRepository(rc, "bar/../foo");
+    assertInvalidRepository(rc, "bar\\..\\foo");
+  }
+
+  private void assertInvalidRepository(final RepositoryCache rc, final String n) {
+    try {
+      rc.get(n);
+      fail("Cache accepted name " + n);
+    } catch (InvalidRepositoryException err) {
+      assertEquals(n, err.getMessage());
+    }
+  }
+
+  public void testLookupNotCreatedRepository() {
+    final String name = "test.git";
+    final RepositoryCache rc = new RepositoryCache(tempRoot);
+    try {
+      rc.get(name);
+    } catch (InvalidRepositoryException err) {
+      assertEquals(name, err.getMessage());
+    }
+  }
+
+  public void testLookupExistingEmptyRepository() throws Exception {
+    final RepositoryCache rc = new RepositoryCache(tempRoot);
+
+    // Create after the cache is built, to test creation-on-the-fly.
+    //
+    final String[] names = {"test.git", "foo/bar/test.git"};
+    final File[] gitdir = new File[names.length];
+    for (int i = 0; i < names.length; i++) {
+      gitdir[i] = new File(tempRoot, names[i]);
+      final Repository r = new Repository(gitdir[i]);
+      r.create();
+      assertTrue(gitdir[i].isDirectory());
+    }
+
+    final Repository[] cached = new Repository[names.length];
+    for (int i = 0; i < names.length; i++) {
+      cached[i] = rc.get(names[i]);
+      assertNotNull(cached[i]);
+      assertEquals(gitdir[i], cached[i].getDirectory());
+    }
+    for (int i = 0; i < names.length; i++) {
+      assertSame(cached[i], rc.get(names[i]));
+    }
+  }
+}
diff --git a/tests_mgrapp/src/com/google/codereview/manager/unpack/DiffReaderTest.java b/tests_mgrapp/src/com/google/codereview/manager/unpack/DiffReaderTest.java
new file mode 100644
index 0000000..43f9141
--- /dev/null
+++ b/tests_mgrapp/src/com/google/codereview/manager/unpack/DiffReaderTest.java
@@ -0,0 +1,193 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.codereview.manager.unpack;
+
+import com.google.codereview.TrashTestCase;
+import com.google.codereview.internal.UploadPatchsetFile.UploadPatchsetFileRequest.StatusType;
+
+import org.spearce.jgit.lib.Commit;
+import org.spearce.jgit.lib.ObjectId;
+import org.spearce.jgit.lib.ObjectWriter;
+import org.spearce.jgit.lib.PersonIdent;
+import org.spearce.jgit.lib.Repository;
+import org.spearce.jgit.lib.Tree;
+import org.spearce.jgit.revwalk.RevCommit;
+import org.spearce.jgit.revwalk.RevWalk;
+
+import java.io.File;
+import java.io.IOException;
+
+public class DiffReaderTest extends TrashTestCase {
+  private Repository db;
+  private ObjectWriter writer;
+
+  @Override
+  protected void setUp() throws Exception {
+    super.setUp();
+
+    db = new Repository(new File(tempRoot, ".git"));
+    db.create();
+    writer = new ObjectWriter(db);
+  }
+
+  public void testAddOneTextFile_RootCommit() throws Exception {
+    final Tree top = new Tree(db);
+    final ObjectId blobId = blob("a\nb\n");
+    top.addFile("foo").setId(blobId);
+    final RevCommit c = commit(top);
+    final DiffReader dr = new DiffReader(db, c);
+
+    final FileDiff foo = dr.next();
+    assertNotNull(foo);
+    assertEquals("foo", foo.getFilename());
+    assertSame(StatusType.ADD, foo.getStatus());
+    assertEquals(ObjectId.zeroId(), foo.getBaseId());
+    assertEquals("diff --git a/foo b/foo\n" + "new file mode 100644\n"
+        + "index " + ObjectId.zeroId().name() + ".." + blobId.name() + "\n"
+        + "--- /dev/null\n" + "+++ b/foo\n" + "@@ -0,0 +1,2 @@\n" + "+a\n"
+        + "+b\n", foo.getPatch());
+
+    assertNull(dr.next());
+    dr.close();
+  }
+
+  public void testAddOneTextFile_ExistingTree() throws Exception {
+    final Tree top = new Tree(db);
+    final RevCommit parent = commit(top);
+    final ObjectId blobId = blob("a\nb\n");
+    top.addFile("foo").setId(blobId);
+    final RevCommit c = commit(top, parent);
+    final DiffReader dr = new DiffReader(db, c);
+
+    final FileDiff foo = dr.next();
+    assertNotNull(foo);
+    assertEquals("foo", foo.getFilename());
+    assertSame(StatusType.ADD, foo.getStatus());
+    assertEquals(ObjectId.zeroId(), foo.getBaseId());
+    assertEquals("diff --git a/foo b/foo\n" + "new file mode 100644\n"
+        + "index " + ObjectId.zeroId().name() + ".." + blobId.name() + "\n"
+        + "--- /dev/null\n" + "+++ b/foo\n" + "@@ -0,0 +1,2 @@\n" + "+a\n"
+        + "+b\n", foo.getPatch());
+
+    assertNull(dr.next());
+    dr.close();
+  }
+
+  public void testDeleteOneTextFile() throws Exception {
+    final Tree top = new Tree(db);
+    final ObjectId blobId = blob("a\nb\n");
+    top.addFile("foo").setId(blobId);
+    final RevCommit parent = commit(top);
+    top.findBlobMember("foo").delete();
+    final RevCommit c = commit(top, parent);
+    final DiffReader dr = new DiffReader(db, c);
+
+    final FileDiff foo = dr.next();
+    assertNotNull(foo);
+    assertEquals("foo", foo.getFilename());
+    assertSame(StatusType.DELETE, foo.getStatus());
+    assertEquals(blobId, foo.getBaseId());
+    assertEquals("diff --git a/foo b/foo\n" + "deleted file mode 100644\n"
+        + "index " + blobId.name() + ".." + ObjectId.zeroId().name() + "\n"
+        + "--- a/foo\n" + "+++ /dev/null\n" + "@@ -1,2 +0,0 @@\n" + "-a\n"
+        + "-b\n", foo.getPatch());
+
+    assertNull(dr.next());
+    dr.close();
+  }
+
+  public void testModifyTwoTextFiles() throws Exception {
+    final Tree top = new Tree(db);
+    final ObjectId barBaseId = blob("a\nc\n");
+    top.addFile("bar").setId(barBaseId);
+    final ObjectId fooBaseId = blob("a\nb\n");
+    top.addFile("foo").setId(fooBaseId);
+
+    final RevCommit parent = commit(top);
+    final ObjectId barNewId = blob("a\nd\nc\n");
+    top.findBlobMember("bar").setId(barNewId);
+    final ObjectId fooNewId = blob("a\nc\nb\n");
+    top.findBlobMember("foo").setId(fooNewId);
+
+    final RevCommit c = commit(top, parent);
+    final DiffReader dr = new DiffReader(db, c);
+
+    final FileDiff bar = dr.next();
+    assertNotNull(bar);
+    assertEquals("bar", bar.getFilename());
+    assertSame(StatusType.MODIFY, bar.getStatus());
+    assertEquals(barBaseId, bar.getBaseId());
+    assertEquals("diff --git a/bar b/bar\n" + "index " + barBaseId.name()
+        + ".." + barNewId.name() + " 100644\n" + "--- a/bar\n" + "+++ b/bar\n"
+        + "@@ -1,2 +1,3 @@\n" + " a\n" + "+d\n" + " c\n", bar.getPatch());
+
+    final FileDiff foo = dr.next();
+    assertNotNull(foo);
+    assertEquals("foo", foo.getFilename());
+    assertSame(StatusType.MODIFY, foo.getStatus());
+    assertEquals(fooBaseId, foo.getBaseId());
+    assertEquals("diff --git a/foo b/foo\n" + "index " + fooBaseId.name()
+        + ".." + fooNewId.name() + " 100644\n" + "--- a/foo\n" + "+++ b/foo\n"
+        + "@@ -1,2 +1,3 @@\n" + " a\n" + "+c\n" + " b\n", foo.getPatch());
+
+    assertNull(dr.next());
+    dr.close();
+  }
+
+  public void testAddBinaryFile() throws Exception {
+    final Tree top = new Tree(db);
+    final ObjectId blobId = blob("\0\1\2\0\1\2\0\1\2");
+    top.addFile("foo").setId(blobId);
+    final RevCommit c = commit(top);
+    final DiffReader dr = new DiffReader(db, c);
+
+    final FileDiff foo = dr.next();
+    assertNotNull(foo);
+    assertEquals("foo", foo.getFilename());
+    assertSame(StatusType.ADD, foo.getStatus());
+    assertEquals(ObjectId.zeroId(), foo.getBaseId());
+    assertEquals("diff --git a/foo b/foo\n" + "new file mode 100644\n"
+        + "index " + ObjectId.zeroId().name() + ".." + blobId.name() + "\n"
+        + "Binary files /dev/null and b/foo differ\n", foo.getPatch());
+
+    assertNull(dr.next());
+    dr.close();
+  }
+
+  private ObjectId blob(final String content) throws IOException {
+    return writer.writeBlob(content.getBytes("UTF-8"));
+  }
+
+  private RevCommit commit(final Tree top, final RevCommit... parents)
+      throws IOException {
+    final Commit c = new Commit(db);
+    c.setTreeId(writer.writeTree(top));
+    final ObjectId parentIds[] = new ObjectId[parents.length];
+    for (int i = 0; i < parents.length; i++) {
+      parentIds[i] = parents[i].getId();
+    }
+    c.setParentIds(parentIds);
+    c.setAuthor(new PersonIdent("A U Thor <a@example.com> 1 +0000"));
+    c.setCommitter(c.getAuthor());
+    c.setMessage("");
+    c.setCommitId(writer.writeCommit(c));
+    final RevWalk rw = new RevWalk(db);
+    final RevCommit r = rw.parseCommit(c.getCommitId());
+    for (final RevCommit p : r.getParents()) {
+      rw.parse(p);
+    }
+    return r;
+  }
+}
diff --git a/tests_mgrapp/src/com/google/codereview/manager/unpack/FileDiffTest.java b/tests_mgrapp/src/com/google/codereview/manager/unpack/FileDiffTest.java
new file mode 100644
index 0000000..6e866ea
--- /dev/null
+++ b/tests_mgrapp/src/com/google/codereview/manager/unpack/FileDiffTest.java
@@ -0,0 +1,88 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.codereview.manager.unpack;
+
+import com.google.codereview.internal.UploadPatchsetFile.UploadPatchsetFileRequest.StatusType;
+
+import junit.framework.TestCase;
+
+import org.spearce.jgit.lib.ObjectId;
+
+import java.io.UnsupportedEncodingException;
+
+public class FileDiffTest extends TestCase {
+  public void testConstructor() {
+    final FileDiff fd = new FileDiff();
+    assertNull(fd.getBaseId());
+    assertNull(fd.getFilename());
+    assertSame(StatusType.MODIFY, fd.getStatus());
+    assertEquals("", fd.getPatch());
+  }
+
+  public void testBaseId() {
+    final ObjectId id1 =
+        ObjectId.fromString("fc5ac44497e0548c32506b9c584248fc49bb9f97");
+    final ObjectId id2 =
+        ObjectId.fromString("8abf2492d8c5228192a3cba5528e47b3a4bb87e0");
+    final FileDiff fd = new FileDiff();
+    fd.setBaseId(id1);
+    assertSame(id1, fd.getBaseId());
+    fd.setBaseId(id2);
+    assertSame(id2, fd.getBaseId());
+  }
+
+  public void testFilename() {
+    final FileDiff fd = new FileDiff();
+    final String name1 = "foo";
+    final String name2 = "foo/bar/baz";
+    fd.setFilename(name1);
+    assertSame(name1, fd.getFilename());
+    fd.setFilename(name2);
+    assertSame(name2, fd.getFilename());
+  }
+
+  public void testStatus() {
+    final FileDiff fd = new FileDiff();
+    fd.setStatus(StatusType.ADD);
+    assertSame(StatusType.ADD, fd.getStatus());
+    fd.setStatus(StatusType.MODIFY);
+    assertSame(StatusType.MODIFY, fd.getStatus());
+    fd.setStatus(StatusType.DELETE);
+    assertSame(StatusType.DELETE, fd.getStatus());
+  }
+
+  public void testPatchBody() {
+    final FileDiff fd = new FileDiff();
+    final String n1 = "diff --git a/foo b/foo";
+    final String n2 = "--- a/foo";
+    final String n3 = "+++ b/foo";
+    final String n4 = "@@ -20,7 + 20,7 @@";
+
+    fd.appendLine(toBytes(n1));
+    fd.appendLine(toBytes(n2));
+    fd.appendLine(toBytes(n3));
+    fd.appendLine(toBytes(n4));
+    assertEquals(n1 + "\n" + n2 + "\n" + n3 + "\n" + n4 + "\n", fd.getPatch());
+  }
+
+  private static byte[] toBytes(final String s) {
+    final String enc = "UTF-8";
+    try {
+      return s.getBytes(enc);
+    } catch (UnsupportedEncodingException uee) {
+      throw new RuntimeException("No " + enc + " support?", uee);
+    }
+  }
+}
diff --git a/tests_mgrapp/src/com/google/codereview/manager/unpack/ReceivedBundleUnpackerTest.java b/tests_mgrapp/src/com/google/codereview/manager/unpack/ReceivedBundleUnpackerTest.java
new file mode 100644
index 0000000..cad463e
--- /dev/null
+++ b/tests_mgrapp/src/com/google/codereview/manager/unpack/ReceivedBundleUnpackerTest.java
@@ -0,0 +1,205 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.codereview.manager.unpack;
+
+import com.google.codereview.TrashTestCase;
+import com.google.codereview.internal.NextReceivedBundle.NextReceivedBundleRequest;
+import com.google.codereview.internal.NextReceivedBundle.NextReceivedBundleResponse;
+import com.google.codereview.internal.UpdateReceivedBundle.UpdateReceivedBundleRequest;
+import com.google.codereview.internal.UpdateReceivedBundle.UpdateReceivedBundleResponse;
+import com.google.codereview.manager.Backend;
+import com.google.codereview.manager.RepositoryCache;
+import com.google.codereview.rpc.MockRpcChannel;
+import com.google.protobuf.ByteString;
+import com.google.protobuf.Message;
+import com.google.protobuf.RpcCallback;
+import com.google.protobuf.RpcChannel;
+import com.google.protobuf.RpcController;
+import com.google.protobuf.Descriptors.MethodDescriptor;
+
+import org.spearce.jgit.lib.Repository;
+
+import java.io.File;
+
+public class ReceivedBundleUnpackerTest extends TrashTestCase {
+  private MockRpcChannel rpc;
+  private RepositoryCache repoCache;
+  private Backend server;
+
+  @Override
+  protected void setUp() throws Exception {
+    super.setUp();
+
+    rpc = new MockRpcChannel();
+    repoCache = new RepositoryCache(tempRoot);
+    server = new Backend(repoCache, rpc, null, null);
+    new Repository(new File(tempRoot, "foo.git")).create();
+  }
+
+  public void testNextReceivedBundle_EmptyQueue() throws Exception {
+    final ReceivedBundleUnpacker rbu = newRBU();
+    rpc.add(new RpcChannel() {
+      public void callMethod(final MethodDescriptor method,
+          final RpcController controller, final Message request,
+          final Message responsePrototype, final RpcCallback<Message> done) {
+        assertEquals("NextReceivedBundle", method.getName());
+        assertSame(NextReceivedBundleRequest.getDefaultInstance(), request);
+
+        final NextReceivedBundleResponse.Builder r =
+            NextReceivedBundleResponse.newBuilder();
+        r.setStatusCode(NextReceivedBundleResponse.CodeType.QUEUE_EMPTY);
+        done.run(r.build());
+      }
+    });
+    rbu.run();
+    rpc.assertAllCallsMade();
+  }
+
+  public void testNextReceivedBundle_GetBundle() throws Exception {
+    final String bundleKey = "bundle-key-abcd123efg";
+    final NextReceivedBundleResponse nrb[] = new NextReceivedBundleResponse[1];
+    final UpdateReceivedBundleRequest urbr[] =
+        new UpdateReceivedBundleRequest[1];
+
+    final ReceivedBundleUnpacker rbu =
+        new ReceivedBundleUnpacker(server) {
+          @Override
+          protected UpdateReceivedBundleRequest unpackImpl(
+              final NextReceivedBundleResponse rsp) {
+            assertNotNull("unpackImpl only after bundle available", nrb[0]);
+            assertSame(nrb[0], rsp);
+
+            final UpdateReceivedBundleRequest.Builder r =
+                UpdateReceivedBundleRequest.newBuilder();
+            r.setBundleKey(bundleKey);
+            r.setStatusCode(UpdateReceivedBundleRequest.CodeType.UNPACKED_OK);
+            urbr[0] = r.build();
+            return urbr[0];
+          }
+        };
+
+    rpc.add(new RpcChannel() {
+      public void callMethod(final MethodDescriptor method,
+          final RpcController controller, final Message request,
+          final Message responsePrototype, final RpcCallback<Message> done) {
+        assertEquals("NextReceivedBundle", method.getName());
+        assertSame(NextReceivedBundleRequest.getDefaultInstance(), request);
+
+        final NextReceivedBundleResponse.Builder r =
+            NextReceivedBundleResponse.newBuilder();
+        r.setStatusCode(NextReceivedBundleResponse.CodeType.BUNDLE_AVAILABLE);
+        r.setBundleKey(bundleKey);
+        r.setBundleData(ByteString.EMPTY);
+        r.setDestProject("foo.git");
+        r.setDestProjectKey("project:foo.git");
+        r.setDestBranchKey("branch:refs/heads/master");
+        r.setOwner("author@example.com");
+        nrb[0] = r.build();
+        done.run(nrb[0]);
+      }
+    });
+
+    rpc.add(new RpcChannel() {
+      public void callMethod(final MethodDescriptor method,
+          final RpcController controller, final Message request,
+          final Message responsePrototype, final RpcCallback<Message> done) {
+        assertEquals("UpdateReceivedBundle", method.getName());
+        assertSame(urbr[0], request);
+
+        final UpdateReceivedBundleResponse.Builder r =
+            UpdateReceivedBundleResponse.newBuilder();
+        r.setStatusCode(UpdateReceivedBundleResponse.CodeType.UPDATED);
+        done.run(r.build());
+      }
+    });
+
+    rpc.add(new RpcChannel() {
+      public void callMethod(final MethodDescriptor method,
+          final RpcController controller, final Message request,
+          final Message responsePrototype, final RpcCallback<Message> done) {
+        assertEquals("NextReceivedBundle", method.getName());
+        assertSame(NextReceivedBundleRequest.getDefaultInstance(), request);
+
+        final NextReceivedBundleResponse.Builder r =
+            NextReceivedBundleResponse.newBuilder();
+        r.setStatusCode(NextReceivedBundleResponse.CodeType.QUEUE_EMPTY);
+        done.run(r.build());
+      }
+    });
+
+    rbu.run();
+    assertNotNull(nrb[0]);
+    assertNotNull(urbr[0]);
+    rpc.assertAllCallsMade();
+  }
+
+  public void testNextReceivedBundle_RpcFailure() throws Exception {
+    final ReceivedBundleUnpacker rbu = newRBU();
+    rpc.add(new RpcChannel() {
+      public void callMethod(final MethodDescriptor method,
+          final RpcController controller, final Message request,
+          final Message responsePrototype, final RpcCallback<Message> done) {
+        assertEquals("NextReceivedBundle", method.getName());
+        controller.setFailed("mock failure");
+      }
+    });
+    rbu.run();
+    rpc.assertAllCallsMade();
+  }
+
+  public void testNextReceivedBundle_RuntimeException() throws Exception {
+    final String msg = "test-a-message-win-a-prize";
+    final ReceivedBundleUnpacker rbu = newRBU();
+    rpc.add(new RpcChannel() {
+      public void callMethod(final MethodDescriptor method,
+          final RpcController controller, final Message request,
+          final Message responsePrototype, final RpcCallback<Message> done) {
+        assertEquals("NextReceivedBundle", method.getName());
+        throw new RuntimeException(msg);
+      }
+    });
+    try {
+      rbu.run();
+      fail("Unpacker did not rethrow an unexpected runtime exception");
+    } catch (RuntimeException re) {
+      assertEquals(msg, re.getMessage());
+    }
+    rpc.assertAllCallsMade();
+  }
+
+  public void testNextReceivedBundle_RuntimeError() throws Exception {
+    final String msg = "test-a-message-win-a-prize";
+    final ReceivedBundleUnpacker rbu = newRBU();
+    rpc.add(new RpcChannel() {
+      public void callMethod(final MethodDescriptor method,
+          final RpcController controller, final Message request,
+          final Message responsePrototype, final RpcCallback<Message> done) {
+        assertEquals("NextReceivedBundle", method.getName());
+        throw new OutOfMemoryError(msg);
+      }
+    });
+    try {
+      rbu.run();
+      fail("Unpacker did not rethrow an unexpected OutOfMemoryError");
+    } catch (OutOfMemoryError re) {
+      assertEquals(msg, re.getMessage());
+    }
+    rpc.assertAllCallsMade();
+  }
+
+  private ReceivedBundleUnpacker newRBU() {
+    return new ReceivedBundleUnpacker(server);
+  }
+}
diff --git a/tests_mgrapp/src/com/google/codereview/manager/unpack/RecordInputStreamTest.java b/tests_mgrapp/src/com/google/codereview/manager/unpack/RecordInputStreamTest.java
new file mode 100644
index 0000000..c848af2
--- /dev/null
+++ b/tests_mgrapp/src/com/google/codereview/manager/unpack/RecordInputStreamTest.java
@@ -0,0 +1,135 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.codereview.manager.unpack;
+
+import junit.framework.TestCase;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.util.Arrays;
+
+public class RecordInputStreamTest extends TestCase {
+  public void testEmptyStream() throws IOException {
+    final RecordInputStream in = b("");
+    assertEquals(-1, in.read());
+    assertEquals(-1, in.read());
+    assertEquals(-1, in.read(new byte[8], 0, 8));
+    assertNull(in.readRecord('\n'));
+    in.close();
+  }
+
+  public void testReadOneByte() throws IOException {
+    final String exp = "abc";
+    final RecordInputStream in = b(exp);
+    assertEquals(exp.charAt(0), in.read());
+    assertEquals(exp.charAt(1), in.read());
+    assertEquals(exp.charAt(2), in.read());
+    assertEquals(-1, in.read());
+    in.close();
+  }
+
+  public void testReadBlockOffset0() throws IOException {
+    final String exp = "abc";
+    final RecordInputStream in = b(exp);
+    final byte[] act = new byte[exp.length()];
+    assertEquals(act.length, in.read(act, 0, act.length));
+    assertEquals(exp.charAt(0), act[0]);
+    assertEquals(exp.charAt(1), act[1]);
+    assertEquals(exp.charAt(2), act[2]);
+    assertEquals(-1, in.read(act, 0, act.length));
+    in.close();
+  }
+
+  public void testReadBlockOffset1() throws IOException {
+    final String exp = "abc";
+    final RecordInputStream in = b(exp);
+    assertEquals(exp.charAt(0), in.read());
+    final byte[] act = new byte[exp.length() - 1];
+    assertEquals(act.length, in.read(act, 0, act.length));
+    assertEquals(exp.charAt(1), act[0]);
+    assertEquals(exp.charAt(2), act[1]);
+    assertEquals(-1, in.read(act, 0, act.length));
+    in.close();
+  }
+
+  public void testReadRecord_SeparatorOnly() throws IOException {
+    final String rec1 = "foo";
+    final String rec2 = "bar";
+    final char sep = '\0';
+    final RecordInputStream in = b(rec1 + sep + rec2);
+    assertTrue(Arrays.equals(toBytes(rec1), in.readRecord(sep)));
+    assertTrue(Arrays.equals(toBytes(rec2), in.readRecord(sep)));
+    assertNull(in.readRecord(sep));
+    in.close();
+  }
+
+  public void testReadRecord_Terminated() throws IOException {
+    final String rec1 = "foo";
+    final String rec2 = "bar";
+    final char sep = '\0';
+    final RecordInputStream in = b(rec1 + sep + rec2 + sep);
+    assertTrue(Arrays.equals(toBytes(rec1), in.readRecord(sep)));
+    assertTrue(Arrays.equals(toBytes(rec2), in.readRecord(sep)));
+    assertNull(in.readRecord(sep));
+    in.close();
+  }
+
+  public void testReadRecord_EmptyRecords() throws IOException {
+    final char sep = '\0';
+    final RecordInputStream in = b("" + sep + "" + sep);
+    assertTrue(Arrays.equals(new byte[0], in.readRecord(sep)));
+    assertTrue(Arrays.equals(new byte[0], in.readRecord(sep)));
+    assertNull(in.readRecord(sep));
+    in.close();
+  }
+
+  public void testReadRecord_PartialRecordInBuffer() throws IOException {
+    final int huge = 16 * 1024;
+    final StringBuilder temp = new StringBuilder(huge);
+    for (int i = 0; i < huge; i++) {
+      temp.append('x');
+    }
+    final char sep = '\n';
+    final String ts = temp.toString();
+    final RecordInputStream in = b(ts + "1" + sep + ts + "2");
+    assertEquals(ts + "1", toString(in.readRecord(sep)));
+    assertEquals(ts + "2", toString(in.readRecord(sep)));
+    assertNull(in.readRecord(sep));
+    in.close();
+  }
+
+  private static RecordInputStream b(final String s) {
+    return new RecordInputStream(new ByteArrayInputStream(toBytes(s)));
+  }
+
+  private static byte[] toBytes(final String s) {
+    final String enc = "UTF-8";
+    try {
+      return s.getBytes(enc);
+    } catch (UnsupportedEncodingException uee) {
+      throw new RuntimeException("No " + enc + " support?", uee);
+    }
+  }
+
+  private static String toString(final byte[] b) {
+    final String enc = "UTF-8";
+    try {
+      return new String(b, 0, b.length, enc);
+    } catch (UnsupportedEncodingException uee) {
+      throw new RuntimeException("No " + enc + " support?", uee);
+    }
+  }
+}
diff --git a/tests_mgrapp/src/com/google/codereview/rpc/MessageRequestEntityTest.java b/tests_mgrapp/src/com/google/codereview/rpc/MessageRequestEntityTest.java
new file mode 100644
index 0000000..adf5995
--- /dev/null
+++ b/tests_mgrapp/src/com/google/codereview/rpc/MessageRequestEntityTest.java
@@ -0,0 +1,61 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.codereview.rpc;
+
+import com.google.codereview.internal.SubmitChange.SubmitChangeResponse;
+import com.google.protobuf.Message;
+
+import junit.framework.TestCase;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.zip.DeflaterOutputStream;
+
+public class MessageRequestEntityTest extends TestCase {
+  public void testCompressedEntity() throws Exception {
+    final Message msg = buildMessage();
+    final byte[] bin = compress(msg);
+    final String contentType =
+        "application/x-google-protobuf"
+            + "; name=codereview.internal.SubmitChangeResponse"
+            + "; compress=deflate";
+
+    final MessageRequestEntity mre = new MessageRequestEntity(msg);
+    assertTrue(mre.isRepeatable());
+    assertEquals(bin.length, mre.getContentLength());
+    assertEquals(contentType, mre.getContentType());
+
+    for (int i = 0; i < 5; i++) {
+      final ByteArrayOutputStream compressed = new ByteArrayOutputStream();
+      mre.writeRequest(compressed);
+      assertTrue(Arrays.equals(bin, compressed.toByteArray()));
+    }
+  }
+
+  private static Message buildMessage() {
+    final SubmitChangeResponse.Builder r = SubmitChangeResponse.newBuilder();
+    r.setStatusCode(SubmitChangeResponse.CodeType.PATCHSET_EXISTS);
+    return r.build();
+  }
+
+  private static byte[] compress(final Message m) throws IOException {
+    final ByteArrayOutputStream out = new ByteArrayOutputStream();
+    final DeflaterOutputStream dos = new DeflaterOutputStream(out);
+    m.writeTo(dos);
+    dos.close();
+    return out.toByteArray();
+  }
+}
diff --git a/tests_mgrapp/src/com/google/codereview/rpc/MockRpcChannel.java b/tests_mgrapp/src/com/google/codereview/rpc/MockRpcChannel.java
new file mode 100644
index 0000000..4a1f1a4
--- /dev/null
+++ b/tests_mgrapp/src/com/google/codereview/rpc/MockRpcChannel.java
@@ -0,0 +1,48 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.codereview.rpc;
+
+import com.google.protobuf.Message;
+import com.google.protobuf.RpcCallback;
+import com.google.protobuf.RpcChannel;
+import com.google.protobuf.RpcController;
+import com.google.protobuf.Descriptors.MethodDescriptor;
+
+import junit.framework.TestCase;
+
+import java.util.LinkedList;
+
+public class MockRpcChannel implements RpcChannel {
+  private LinkedList<RpcChannel> calls = new LinkedList<RpcChannel>();
+
+  public void add(final RpcChannel c) {
+    calls.add(c);
+  }
+
+  public void callMethod(final MethodDescriptor method,
+      final RpcController controller, final Message request,
+      final Message responsePrototype, final RpcCallback<Message> done) {
+    if (calls.isEmpty()) {
+      TestCase.fail("Incorrect call for " + method.getFullName());
+    }
+
+    final RpcChannel c = calls.removeFirst();
+    c.callMethod(method, controller, request, responsePrototype, done);
+  }
+
+  public void assertAllCallsMade() {
+    TestCase.assertTrue(calls.isEmpty());
+  }
+}
diff --git a/tests_mgrapp/src/com/google/codereview/rpc/SimpleControllerTest.java b/tests_mgrapp/src/com/google/codereview/rpc/SimpleControllerTest.java
new file mode 100644
index 0000000..9496f45
--- /dev/null
+++ b/tests_mgrapp/src/com/google/codereview/rpc/SimpleControllerTest.java
@@ -0,0 +1,68 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.codereview.rpc;
+
+import com.google.protobuf.RpcCallback;
+
+import junit.framework.TestCase;
+
+public class SimpleControllerTest extends TestCase {
+  public void testDefaultConstructor() {
+    final SimpleController sc = new SimpleController();
+    assertNull(sc.errorText());
+    assertFalse(sc.failed());
+    assertFalse(sc.isCanceled());
+  }
+
+  public void testNotifyCancelUnsupported() {
+    try {
+      new SimpleController().notifyOnCancel(new RpcCallback<Object>() {
+        public void run(Object parameter) {
+          fail("Callback invoked during notifyOnCancel setup");
+        }
+      });
+      fail("notifyOnCancel accepted a callback");
+    } catch (UnsupportedOperationException e) {
+      // Pass
+    }
+  }
+
+  public void testStartCancelUnsupported() {
+    try {
+      new SimpleController().startCancel();
+      fail("startCancel did not fail");
+    } catch (UnsupportedOperationException e) {
+      // Pass
+    }
+  }
+
+  public void testSetFailed() {
+    final String reason = "we failed, yes we did";
+    final SimpleController sc = new SimpleController();
+    sc.setFailed(reason);
+    assertTrue(sc.failed());
+    assertSame(reason, sc.errorText());
+  }
+
+  public void testResetClearedFailure() {
+    final String reason = "we failed, yes we did";
+    final SimpleController sc = new SimpleController();
+    sc.setFailed(reason);
+    sc.reset();
+    assertNull(sc.errorText());
+    assertFalse(sc.failed());
+    assertFalse(sc.isCanceled());
+  }
+}
diff --git a/tests_mgrapp/src/com/google/codereview/util/MutableBooleanTest.java b/tests_mgrapp/src/com/google/codereview/util/MutableBooleanTest.java
new file mode 100644
index 0000000..7d4d646
--- /dev/null
+++ b/tests_mgrapp/src/com/google/codereview/util/MutableBooleanTest.java
@@ -0,0 +1,44 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.codereview.util;
+
+import junit.framework.TestCase;
+
+
+public class MutableBooleanTest extends TestCase {
+  public void testCreateDefault() {
+    final MutableBoolean b = new MutableBoolean();
+    assertFalse(b.value);
+  }
+
+  public void testCreateTrue() {
+    final MutableBoolean b = new MutableBoolean(true);
+    assertTrue(b.value);
+  }
+
+  public void testCreateFalse() {
+    final MutableBoolean b = new MutableBoolean(false);
+    assertFalse(b.value);
+  }
+
+  public void testMutable() {
+    final MutableBoolean b = new MutableBoolean();
+    assertFalse(b.value);
+    b.value = true;
+    assertTrue(b.value);
+    b.value = false;
+    assertFalse(b.value);
+  }
+}
diff --git a/webapp/.gitignore b/webapp/.gitignore
new file mode 100644
index 0000000..88e22b4
--- /dev/null
+++ b/webapp/.gitignore
@@ -0,0 +1,4 @@
+*.pyc
+/froofle
+/codereview/*_pb2.py
+/codereview/internal/*_pb2.py
diff --git a/webapp/TODO b/webapp/TODO
new file mode 100644
index 0000000..5e6493f
--- /dev/null
+++ b/webapp/TODO
@@ -0,0 +1,64 @@
+Bugs
+----
+
+If a user never logs in, someone else can grab their nickname
+See the issue tracker at code.google.com/p/gerrit for more bugs
+
+Data Cleaning
+-------------
+
+Email addresses should be lowercased before comparing
+Nicknames too???
+Nicknames should not be allowed to contain multiple internal spaces
+    nor internal whitespace other than space
+
+Sending Mail
+------------
+
+Should allow registered nicknames in Reviewers and CC fields
+Normalize emails to nicknames in these fields even when editing, if known
+
+Issues
+------
+
+Archive issues (that's per user rather than per issue)
+
+Patch Sets
+----------
+
+Edit patch set message
+Delete patch sets
+
+Searching, Organizing
+---------------------
+
+View all open issues by base, or by repository
+View all closed issues (issue 15 in the tracker)
+
+Commenting
+----------
+
+Add stars
+Add non-inline comments per file, per patchset, per issue
+Keyboard shortcut for entering a comment at the blue line
+    (isn't this already in the JS code?)
+
+Diffs and Patches
+-----------------
+
+Improve UI for selecting patch set deltas; handle missing files better
+Syntax colorization
+Record revision and show in UI; indicate action (add/edit/delete)
+Add line length option
+Need a more powerful way to specify the URL for finding a revision (?)
+
+User Experience
+---------------
+
+Make Edit Issue show the form inline instead of opening a new page?
+Right-justify the "Id" and "Drafts (mine)" headings in the Issues list table
+
+Software Engineering
+--------------------
+
+Unittests
diff --git a/webapp/__init__.py b/webapp/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/__init__.py
diff --git a/webapp/app.yaml b/webapp/app.yaml
new file mode 100644
index 0000000..fea66ed
--- /dev/null
+++ b/webapp/app.yaml
@@ -0,0 +1,28 @@
+application: gerrit-code-review-tool-demo
+version: 1
+runtime: python
+api_version: 1
+
+default_expiration: 7d  # This is good for images, which never change
+
+handlers:
+
+- url: /(robots.txt|favicon.ico)
+  static_files: static/\1
+  upload: static/(robots.txt|favicon.ico)
+
+- url: /google7db36eb2cc527940.html
+  static_files: static/robots.txt
+  upload: static/robots.txt
+
+- url: /(application_version)
+  static_files: static/\1
+  mime_type: text/plain
+  expiration: 1s
+  upload: static/application_version
+
+- url: /static
+  static_dir: static
+
+- url: .*
+  script: main.py
diff --git a/webapp/codereview/__init__.py b/webapp/codereview/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/codereview/__init__.py
diff --git a/webapp/codereview/dev_init.py b/webapp/codereview/dev_init.py
new file mode 100644
index 0000000..175f68b
--- /dev/null
+++ b/webapp/codereview/dev_init.py
@@ -0,0 +1,31 @@
+# Copyright 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Init the dev instance."""
+
+from django.http import HttpResponse
+
+import models
+from view_util import devenv_required
+
+@devenv_required
+def dev_init(request):
+  settings = models.Settings.get_settings()
+  key = settings.internal_api_key
+
+  return HttpResponse(
+    "[codereview]\n"
+    "    internalapikey = %s\n"
+    "\n"
+    % (key))
diff --git a/webapp/codereview/email.py b/webapp/codereview/email.py
new file mode 100644
index 0000000..61881c4
--- /dev/null
+++ b/webapp/codereview/email.py
@@ -0,0 +1,92 @@
+# Copyright 2008 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import logging
+
+from google.appengine.ext import db
+from google.appengine.api import mail
+from google.appengine.api import users
+
+import django.template
+
+import models
+import email
+
+def get_default_sender():
+  return models.Settings.get_settings().from_email
+
+def _encode_safely(s):
+  """Helper to turn a unicode string into 8-bit bytes."""
+  if isinstance(s, unicode):
+    s = s.encode('utf-8')
+  return s
+
+def _to_email_string(obj):
+  if isinstance(obj, str):
+    return obj
+  elif isinstance(obj, unicode):
+    return obj.encode('utf-8')
+  elif isinstance(obj, db.Email):
+    account = models.Account.get_account_for_email(obj)
+  elif isinstance(obj, users.User):
+    account = models.Account.get_account_for_user(obj)
+  elif isinstance(obj, models.Account):
+    account = obj
+  if account:
+    result = account.get_email_formatted()
+  else:
+    result = str(email)
+  return _encode_safely(result)
+
+def send(sender, to, subject, template, template_args):
+  """Sends an email based on a template.
+
+  All email address parameters can be: strings, unicode, db.Email users.User
+  or models.Account objects.
+
+  Args:
+    sender:   The From address.  Null if it should be sent from the role acct.
+    to:       An email address or a list of email address to be in the To field.
+    subject:  The subject line.
+    template: The name of the template file to use from the mail dir.
+    template_args:  A map of args to be pasaed to the template
+  """
+  if not sender:
+    sender_string = get_default_sender()
+    if not sender_string:
+      logging.warn('not sending email because there is no from address')
+      return 'not sending email because there is no from address'
+  else:
+    sender_string = _to_email_string(sender)
+  to_string = [_to_email_string(e) for e in to]
+  body = django.template.loader.render_to_string(template, template_args)
+  mail.send_mail(sender=sender_string, to=to_string, subject=subject, body=body)
+
+def make_change_subject(change):
+  subject = "(%s) %s" % (change.dest_project.name, change.subject)
+  if change.message_set.count(1) > 0:
+    subject = 'Re: ' + subject
+  return subject
+
+def send_change_message(request, change, template, template_args):
+  to_users = set([change.owner] + change.reviewers + change.cc)
+  subject = make_change_subject(change)
+  args = {
+      'url': request.build_absolute_uri('/%s' % change.key().id()),
+    }
+  if template_args:
+    args.update(template_args)
+  email.send(request.user, to_users, subject, template, args)
+
+
diff --git a/webapp/codereview/engine.py b/webapp/codereview/engine.py
new file mode 100644
index 0000000..a1f0777
--- /dev/null
+++ b/webapp/codereview/engine.py
@@ -0,0 +1,709 @@
+# Copyright 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Diff rendering in HTML for Gerrit."""
+
+# Python imports
+import re
+import cgi
+import difflib
+import logging
+import urlparse
+
+# AppEngine imports
+from google.appengine.api import urlfetch
+from google.appengine.api import users
+from google.appengine.ext import db
+
+# Django imports
+from django.template import loader
+
+# Local imports
+import library
+import models
+import patching
+import intra_region_diff
+
+
+# NOTE: this function is duplicated in upload.py, keep them in sync.
+def SplitPatch(data):
+  """Splits a patch into separate pieces for each file.
+
+  Args:
+    data: A string containing the output of svn diff.
+
+  Returns:
+    A list of 2-tuple (filename, text) where text is the svn diff output
+      pertaining to filename.
+  """
+  patches = []
+  filename = None
+  diff = []
+  for line in data.splitlines(True):
+    new_filename = None
+    if line.startswith('Index:'):
+      unused, new_filename = line.split(':', 1)
+      new_filename = new_filename.strip()
+    elif line.startswith('Property changes on:'):
+      unused, temp_filename = line.split(':', 1)
+      # When a file is modified, paths use '/' between directories, however
+      # when a property is modified '\' is used on Windows.  Make them the same
+      # otherwise the file shows up twice.
+      temp_filename = temp_filename.strip().replace('\\', '/')
+      if temp_filename != filename:
+        # File has property changes but no modifications, create a new diff.
+        new_filename = temp_filename
+    if new_filename:
+      if filename and diff:
+        patches.append((filename, ''.join(diff)))
+      filename = new_filename
+      diff = [line]
+      continue
+    if diff is not None:
+      diff.append(line)
+  if filename and diff:
+    patches.append((filename, ''.join(diff)))
+  return patches
+
+
+
+def RenderDiffTableRows(request, old_lines, chunks, patch,
+                        colwidth=80,
+                        debug=False,
+                        context=models.DEFAULT_CONTEXT):
+  """Render the HTML table rows for a side-by-side diff for a patch.
+
+  Args:
+    request: Django Request object.
+    old_lines: List of lines representing the original file.
+    chunks: List of chunks as returned by patching.ParsePatchToChunks().
+    patch: A models.Patch instance.
+    colwidth: Optional column width (default 80).
+    debug: Optional debugging flag (default False).
+    context: Maximum number of rows surrounding a change (default CONTEXT).
+
+  Yields:
+    Strings, each of which represents the text rendering one complete
+    pair of lines of the side-by-side diff, possibly including comments.
+    Each yielded string may consist of several <tr> elements.
+  """
+  rows =  _RenderDiffTableRows(request, old_lines, chunks, patch,
+                               colwidth, debug)
+  return _CleanupTableRowsGenerator(rows, context)
+
+
+def RenderDiff2TableRows(request, old_lines, old_patch, new_lines, new_patch,
+                         colwidth=80,
+                         debug=False,
+                         context=models.DEFAULT_CONTEXT):
+  """Render the HTML table rows for a side-by-side diff between two patches.
+
+  Args:
+    request: Django Request object.
+    old_lines: List of lines representing the patched file on the left.
+    old_patch: The models.Patch instance corresponding to old_lines.
+    new_lines: List of lines representing the patched file on the right.
+    new_patch: The models.Patch instance corresponding to new_lines.
+    colwidth: Optional column width (default 80).
+    debug: Optional debugging flag (default False).
+    context: Maximum number of visible context lines (default models.DEFAULT_CONTEXT).
+
+  Yields:
+    Strings, each of which represents the text rendering one complete
+    pair of lines of the side-by-side diff, possibly including comments.
+    Each yielded string may consist of several <tr> elements.
+  """
+  rows = _RenderDiff2TableRows(request, old_lines, old_patch,
+                               new_lines, new_patch, colwidth, debug)
+  return _CleanupTableRowsGenerator(rows, context)
+
+
+def _CleanupTableRowsGenerator(rows, context):
+  """Cleanup rows returned by _TableRowGenerator for output.
+
+  Args:
+    rows: List of tuples (tag, text)
+    context: Maximum number of visible context lines.
+
+  Yields:
+    Rows marked as 'equal' are possibly contracted using _ShortenBuffer().
+    Stops on rows marked as 'error'.
+  """
+  buffer = []
+  for tag, text in rows:
+    if tag == 'equal':
+      buffer.append(text)
+      continue
+    else:
+      for t in _ShortenBuffer(buffer, context):
+        yield t
+      buffer = []
+    yield text
+    if tag == 'error':
+      yield None
+      break
+  if buffer:
+    for t in _ShortenBuffer(buffer, context):
+      yield t
+
+
+def _ShortenBuffer(buffer, context):
+  """Render a possibly contracted series of HTML table rows.
+
+  Args:
+    buffer: a list of strings representing HTML table rows.
+    context: Maximum number of visible context lines.
+
+  Yields:
+    If the buffer has fewer than 3 times context items, yield all
+    the items.  Otherwise, yield the first context items, a single
+    table row representing the contraction, and the last context
+    items.
+  """
+  if len(buffer) < 3*context:
+    for t in buffer:
+      yield t
+  else:
+    last_id = None
+    for t in buffer[:context]:
+      m = re.match('^<tr( name="hook")? id="pair-(?P<rowcount>\d+)">', t)
+      if m:
+        last_id = int(m.groupdict().get("rowcount"))
+      yield t
+    skip = len(buffer) - 2*context
+    if skip <= 10:
+      expand_link = ('<a href="javascript:M_expandSkipped(%(before)d, '
+                     '%(after)d, \'b\', %(skip)d)">Show</a>')
+    else:
+      expand_link = ('<a href="javascript:M_expandSkipped(%(before)d, '
+                     '%(after)d, \'t\', %(skip)d)">Show 10 above</a> '
+                     '<a href="javascript:M_expandSkipped(%(before)d, '
+                     '%(after)d, \'b\', %(skip)d)">Show 10 below</a> ')
+    expand_link = expand_link % {'before': last_id+1,
+                                 'after': last_id+skip,
+                                 'skip': last_id}
+    yield ('<tr id="skip-%d"><td colspan="2" align="center" '
+           'style="background:lightblue">'
+           '(...skipping <span id="skipcount-%d">%d</span> matching lines...) '
+           '<span id="skiplinks-%d">%s</span>'
+           '</td></tr>\n' % (last_id, last_id, skip,
+                             last_id, expand_link))
+    for t in buffer[-context:]:
+      yield t
+
+
+def _RenderDiff2TableRows(request, old_lines, old_patch, new_lines, new_patch,
+                         colwidth=80, debug=False):
+  """Internal version of RenderDiff2TableRows().
+
+  Args:
+    The same as for RenderDiff2TableRows.
+
+  Yields:
+    Tuples (tag, row) where tag is an indication of the row type.
+  """
+  old_dict = {}
+  new_dict = {}
+  for patch, dct in [(old_patch, old_dict), (new_patch, new_dict)]:
+    # XXX GQL doesn't support OR yet...  Otherwise we'd be using that.
+    for comment in models.Comment.gql(
+        'WHERE patch = :1 AND left = FALSE ORDER BY date', patch):
+      if comment.draft and comment.author != request.user:
+        continue  # Only show your own drafts
+      comment.complete(patch)
+      lst = dct.setdefault(comment.lineno, [])
+      lst.append(comment)
+      library.prefetch_names([comment.author])
+  return _TableRowGenerator(old_patch, old_dict, len(old_lines)+1, 'new',
+                            new_patch, new_dict, len(new_lines)+1, 'new',
+                            _GenerateTriples(old_lines, new_lines),
+                            colwidth, debug)
+
+
+def _GenerateTriples(old_lines, new_lines):
+  """Helper for _RenderDiff2TableRows yielding input for _TableRowGenerator.
+
+  Args:
+    old_lines: List of lines representing the patched file on the left.
+    new_lines: List of lines representing the patched file on the right.
+
+  Yields:
+    Tuples (tag, old_slice, new_slice) where tag is a tag as returned by
+    difflib.SequenceMatchser.get_opcodes(), and old_slice and new_slice
+    are lists of lines taken from old_lines and new_lines.
+  """
+  sm = difflib.SequenceMatcher(None, old_lines, new_lines)
+  for tag, i1, i2, j1, j2 in sm.get_opcodes():
+    yield tag, old_lines[i1:i2], new_lines[j1:j2]
+
+
+def _GetComments(request):
+  """Helper that returns comments for a patch.
+
+  Args:
+    request: Django Request object.
+
+  Returns:
+    A 2-tuple of (old, new) where old/new are dictionaries that holds comments
+      for that file, mapping from line number to a Comment entity.
+  """
+  old_dict = {}
+  new_dict = {}
+  # XXX GQL doesn't support OR yet...  Otherwise we'd be using
+  # .gql('WHERE patch = :1 AND (draft = FALSE OR author = :2) ORDER BY data',
+  #      patch, request.user)
+  for comment in models.Comment.gql('WHERE patch = :1 ORDER BY date',
+                                    request.patch):
+    if comment.draft and comment.author != request.user:
+      continue  # Only show your own drafts
+    comment.complete(request.patch)
+    if comment.left:
+      dct = old_dict
+    else:
+      dct = new_dict
+    dct.setdefault(comment.lineno, []).append(comment)
+    library.prefetch_names([comment.author])
+  return old_dict, new_dict
+
+
+def _RenderDiffTableRows(request, old_lines, chunks, patch,
+                         colwidth=80, debug=False):
+  """Internal version of RenderDiffTableRows().
+
+  Args:
+    The same as for RenderDiffTableRows.
+
+  Yields:
+    Tuples (tag, row) where tag is an indication of the row type.
+  """
+  old_dict = {}
+  new_dict = {}
+  if patch:
+    old_dict, new_dict = _GetComments(request)
+  old_max, new_max = _ComputeLineCounts(old_lines, chunks)
+  return _TableRowGenerator(patch, old_dict, old_max, 'old',
+                            patch, new_dict, new_max, 'new',
+                            patching.PatchChunks(old_lines, chunks),
+                            colwidth, debug)
+
+
+def _TableRowGenerator(old_patch, old_dict, old_max, old_snapshot,
+                       new_patch, new_dict, new_max, new_snapshot,
+                       triple_iterator, colwidth=80, debug=False):
+  """Helper function to render side-by-side table rows.
+
+  Args:
+    old_patch: First models.Patch instance.
+    old_dict: Dictionary with line numbers as keys and comments as values (left)
+    old_max: Line count of the patch on the left.
+    old_snapshot: A tag used in the comments form.
+    new_patch: Second models.Patch instance.
+    new_dict: Same as old_dict, but for the right side.
+    new_max: Line count of the patch on the right.
+    new_snapshot: A tag used in the comments form.
+    triple_iterator: Iterator that yields (tag, old, new) triples.
+    colwidth: Optional column width (default 80).
+    debug: Optional debugging flag (default False).
+
+  Yields:
+    Tuples (tag, row) where tag is an indication of the row type and
+    row is an HTML fragment representing one or more <td> elements.
+  """
+  diff_params = intra_region_diff.GetDiffParams(dbg=debug)
+  ndigits = 1 + max(len(str(old_max)), len(str(new_max)))
+  indent = 1 + ndigits
+  old_offset = new_offset = 0
+  row_count = 0
+
+  # Render a row with a message if a side is empty or both sides are equal.
+  if old_patch == new_patch and (old_max == 0 or new_max == 0):
+    if old_max == 0:
+      msg_old = '(Empty)'
+    else:
+      msg_old = ''
+    if new_max == 0:
+      msg_new = '(Empty)'
+    else:
+      msg_new = ''
+    yield '', ('<tr><td class="info">%s</td>'
+               '<td class="info">%s</td></tr>' % (msg_old, msg_new))
+  # TODO(sop)
+  #elif old_patch == new_patch:
+  #  old_patch.patch_hash == new_patch.patch_hash
+  #  yield '', ('<tr><td class="info" colspan="2">'
+  #             '(Both sides are equal)</td></tr>')
+
+  for tag, old, new in triple_iterator:
+    if tag.startswith('error'):
+      yield 'error', '<tr><td><h3>%s</h3></td></tr>\n' % cgi.escape(tag)
+      return
+    old1 = old_offset
+    old_offset = old2 = old1 + len(old)
+    new1 = new_offset
+    new_offset = new2 = new1 + len(new)
+    old_buff = []
+    new_buff = []
+    frag_list = []
+    do_ir_diff = tag == 'replace' and intra_region_diff.CanDoIRDiff(old, new)
+
+    for i in xrange(max(len(old), len(new))):
+      row_count += 1
+      old_lineno = old1 + i + 1
+      new_lineno = new1 + i + 1
+      old_valid = old1+i < old2
+      new_valid = new1+i < new2
+
+      # Start rendering the first row
+      frags = []
+      if i == 0 and tag != 'equal':
+        # Mark the first row of each non-equal chunk as a 'hook'.
+        frags.append('<tr name="hook"')
+      else:
+        frags.append('<tr')
+      frags.append(' id="pair-%d">' % row_count)
+
+      old_intra_diff = ''
+      new_intra_diff = ''
+      if old_valid:
+        old_intra_diff = old[i]
+      if new_valid:
+        new_intra_diff = new[i]
+
+      frag_list.append(frags)
+      if do_ir_diff:
+        # Don't render yet. Keep saving state necessary to render the whole
+        # region until we have encountered all the lines in the region.
+        old_buff.append([old_valid, old_lineno, old_intra_diff])
+        new_buff.append([new_valid, new_lineno, new_intra_diff])
+      else:
+        # We render line by line as usual if do_ir_diff is false
+        old_intra_diff = intra_region_diff.Fold(
+          old_intra_diff, colwidth + indent, indent, indent)
+        new_intra_diff = intra_region_diff.Fold(
+          new_intra_diff, colwidth + indent, indent, indent)
+        old_buff_out = [[old_valid, old_lineno,
+                         (old_intra_diff, True, None)]]
+        new_buff_out = [[new_valid, new_lineno,
+                         (new_intra_diff, True, None)]]
+        for tg, frag in _RenderDiffInternal(old_buff_out, new_buff_out,
+                                            ndigits, tag, frag_list,
+                                            do_ir_diff,
+                                            old_dict, new_dict,
+                                            old_patch, new_patch,
+                                            old_snapshot, new_snapshot,
+                                            colwidth, debug):
+          yield tg, frag
+        frag_list = []
+
+    if do_ir_diff:
+      # So this was a replace block which means that the whole region still
+      # needs to be rendered.
+      old_lines = [b[2] for b in old_buff]
+      new_lines = [b[2] for b in new_buff]
+      ret = intra_region_diff.IntraRegionDiff(old_lines, new_lines,
+                                              diff_params)
+      old_chunks, new_chunks, ratio = ret
+      old_tag = 'old'
+      new_tag = 'new'
+
+      old_diff_out = intra_region_diff.RenderIntraRegionDiff(
+        old_lines, old_chunks, old_tag, ratio,
+        limit=colwidth, indent=indent,
+        dbg=debug)
+      new_diff_out = intra_region_diff.RenderIntraRegionDiff(
+        new_lines, new_chunks, new_tag, ratio,
+        limit=colwidth, indent=indent,
+        dbg=debug)
+      for (i, b) in enumerate(old_buff):
+        b[2] = old_diff_out[i]
+      for (i, b) in enumerate(new_buff):
+        b[2] = new_diff_out[i]
+
+      for tg, frag in _RenderDiffInternal(old_buff, new_buff,
+                                          ndigits, tag, frag_list,
+                                          do_ir_diff,
+                                          old_dict, new_dict,
+                                          old_patch, new_patch,
+                                          old_snapshot, new_snapshot,
+                                          colwidth, debug):
+        yield tg, frag
+      old_buff = []
+      new_buff = []
+
+
+def _CleanupTableRows(rows):
+  """Cleanup rows returned by _TableRowGenerator.
+
+  Args:
+    rows: Sequence of (tag, text) tuples.
+
+  Yields:
+    Rows marked as 'equal' are possibly contracted using _ShortenBuffer().
+    Stops on rows marked as 'error'.
+  """
+  buffer = []
+  for tag, text in rows:
+    if tag == 'equal':
+      buffer.append(text)
+      continue
+    else:
+      for t in _ShortenBuffer(buffer):
+        yield t
+      buffer = []
+    yield text
+    if tag == 'error':
+      yield None
+      break
+  if buffer:
+    for t in _ShortenBuffer(buffer):
+      yield t
+
+
+def _RenderDiffInternal(old_buff, new_buff, ndigits, tag, frag_list,
+                        do_ir_diff, old_dict, new_dict,
+                        old_patch, new_patch,
+                        old_snapshot, new_snapshot,
+                        colwidth, debug):
+  """Helper for _TableRowGenerator()."""
+  obegin = (intra_region_diff.BEGIN_TAG %
+            intra_region_diff.COLOR_SCHEME['old']['match'])
+  nbegin = (intra_region_diff.BEGIN_TAG %
+            intra_region_diff.COLOR_SCHEME['new']['match'])
+  oend = intra_region_diff.END_TAG
+  nend = oend
+  user = users.get_current_user()
+
+  for i in xrange(len(old_buff)):
+    tg = tag
+    old_valid, old_lineno, old_out = old_buff[i]
+    new_valid, new_lineno, new_out = new_buff[i]
+    old_intra_diff, old_has_newline, old_debug_info = old_out
+    new_intra_diff, new_has_newline, new_debug_info = new_out
+
+    frags = frag_list[i]
+    # Render left text column
+    frags.append(_RenderDiffColumn(old_patch, old_valid, tag, ndigits,
+                                   old_lineno, obegin, oend, old_intra_diff,
+                                   do_ir_diff, old_has_newline, 'old'))
+
+    # Render right text column
+    frags.append(_RenderDiffColumn(new_patch, new_valid, tag, ndigits,
+                                   new_lineno, nbegin, nend, new_intra_diff,
+                                   do_ir_diff, new_has_newline, 'new'))
+
+    # End rendering the first row
+    frags.append('</tr>\n')
+
+    if debug:
+      frags.append('<tr>')
+      if old_debug_info:
+        frags.append('<td class="debug-info">%s</td>' %
+                     old_debug_info.replace('\n', '<br>'))
+      else:
+        frags.append('<td></td>')
+      if new_debug_info:
+        frags.append('<td class="debug-info">%s</td>' %
+                     new_debug_info.replace('\n', '<br>'))
+      else:
+        frags.append('<td></td>')
+      frags.append('</tr>\n')
+
+    if old_patch or new_patch:
+      # Start rendering the second row
+      if ((old_valid and old_lineno in old_dict) or
+          (new_valid and new_lineno in new_dict)):
+        tg += '_comment'
+        frags.append('<tr class="inline-comments" name="hook">')
+      else:
+        frags.append('<tr class="inline-comments">')
+
+      # Render left inline comments
+      frags.append(_RenderInlineComments(old_valid, old_lineno, old_dict,
+                                         user, old_patch, old_snapshot, 'old'))
+
+      # Render right inline comments
+      frags.append(_RenderInlineComments(new_valid, new_lineno, new_dict,
+                                         user, new_patch, new_snapshot, 'new'))
+
+      # End rendering the second row
+      frags.append('</tr>\n')
+
+    # Yield the combined fragments
+    yield tg, ''.join(frags)
+
+
+def _RenderDiffColumn(patch, line_valid, tag, ndigits, lineno, begin, end,
+                      intra_diff, do_ir_diff, has_newline, prefix):
+  """Helper function for _RenderDiffInternal().
+
+  Returns:
+    A rendered column.
+  """
+  if line_valid:
+    cls_attr = '%s%s' % (prefix, tag)
+    if tag == 'equal':
+      lno = '%*d' % (ndigits, lineno)
+    else:
+      lno = _MarkupNumber(ndigits, lineno, 'u')
+    if tag == 'replace':
+      col_content = ('%s%s %s%s' % (begin, lno, end, intra_diff))
+      # If IR diff has been turned off or there is no matching new line at
+      # the end then switch to dark background CSS style.
+      if not do_ir_diff or not has_newline:
+        cls_attr = cls_attr + '1'
+    else:
+      col_content = '%s %s' % (lno, intra_diff)
+    return '<td class="%s" id="%scode%d">%s</td>' % (cls_attr, prefix,
+                                                     lineno, col_content)
+  else:
+    return '<td class="%sblank"></td>' % prefix
+
+
+def _RenderInlineComments(line_valid, lineno, data, user,
+                          patch, snapshot, prefix):
+  """Helper function for _RenderDiffInternal().
+
+  Returns:
+    Rendered comments.
+  """
+  comments = []
+  if line_valid:
+    comments.append('<td id="%s-line-%s">' % (prefix, lineno))
+    if lineno in data:
+      comments.append(
+        _ExpandTemplate('inline_comment.html',
+                        inline_draft_url='/inline_draft',
+                        user=user,
+                        patch=patch,
+                        patchset=patch.patchset,
+                        change=patch.patchset.change,
+                        snapshot=snapshot,
+                        side='a' if prefix == 'old' else 'b',
+                        comments=data[lineno],
+                        lineno=lineno,
+                        ))
+    comments.append('</td>')
+  else:
+    comments.append('<td></td>')
+  return ''.join(comments)
+
+
+def RenderUnifiedTableRows(request, parsed_lines):
+  """Render the HTML table rows for a unified diff for a patch.
+
+  Args:
+    request: Django Request object.
+    parsed_lines: List of tuples for each line that contain the line number,
+      if they exist, for the old and new file.
+
+  Returns:
+    A list of html table rows.
+  """
+  old_dict, new_dict = _GetComments(request)
+
+  rows = []
+  for old_line_no, new_line_no, line_text in parsed_lines:
+    row1_id = row2_id = ''
+    # When a line is unchanged (i.e. both old_line_no and new_line_no aren't 0)
+    # pick the old column line numbers when adding a comment.
+    if old_line_no:
+      row1_id = 'id="oldcode%d"' % old_line_no
+      row2_id = 'id="old-line-%d"' % old_line_no
+    elif new_line_no:
+      row1_id = 'id="newcode%d"' % new_line_no
+      row2_id = 'id="new-line-%d"' % new_line_no
+    rows.append('<tr><td class="udiff" %s>%s</td></tr>' %
+                (row1_id, cgi.escape(line_text)))
+
+    frags = []
+    if old_line_no in old_dict or new_line_no in new_dict:
+      frags.append('<tr class="inline-comments" name="hook">')
+      if old_line_no in old_dict:
+        dct = old_dict
+        line_no = old_line_no
+        snapshot = 'old'
+      else:
+        dct = new_dict
+        line_no = new_line_no
+        snapshot = 'new'
+      frags.append(_RenderInlineComments(True, line_no, dct, request.user,
+                   request.patch, snapshot, snapshot))
+    else:
+      frags.append('<tr class="inline-comments">')
+      frags.append('<td ' + row2_id +'></td>')
+    frags.append('</tr>')
+    rows.append(''.join(frags))
+  return rows
+
+
+def _ComputeLineCounts(old_lines, chunks):
+  """Compute the length of the old and new sides of a diff.
+
+  Args:
+    old_lines: List of lines representing the original file.
+    chunks: List of chunks as returned by patching.ParsePatchToChunks().
+
+  Returns:
+    A tuple (old_len, new_len) representing len(old_lines) and
+    len(new_lines), where new_lines is the list representing the
+    result of applying the patch chunks to old_lines, however, without
+    actually computing new_lines.
+  """
+  old_len = len(old_lines)
+  new_len = old_len
+  if chunks:
+    (old_a, old_b), (new_a, new_b), old_lines, new_lines = chunks[-1]
+    new_len += new_b - old_b
+  return old_len, new_len
+
+
+def _MarkupNumber(ndigits, number, tag):
+  """Format a number in HTML in a given width with extra markup.
+
+  Args:
+    ndigits: the total width available for formatting
+    number: the number to be formatted
+    tag: HTML tag name, e.g. 'u'
+
+  Returns:
+    An HTML string that displays as ndigits wide, with the
+    number right-aligned and surrounded by an HTML tag; for example,
+    _MarkupNumber(42, 4, 'u') returns '  <u>42</u>'.
+  """
+  formatted_number = str(number)
+  space_prefix = ' ' * (ndigits - len(formatted_number))
+  return '%s<%s>%s</%s>' % (space_prefix, tag, formatted_number, tag)
+
+
+def _ExpandTemplate(name, **params):
+  """Wrapper around django.template.loader.render_to_string().
+
+  For convenience, this takes keyword arguments instead of a dict.
+  """
+  return loader.render_to_string(name, params)
+
+
+def ToText(text):
+  """Helper to turn a string into a db.Text instance.
+
+  Args:
+    text: a string.
+
+  Returns:
+    A db.Text instance.
+  """
+  try:
+    return db.Text(text, encoding='utf-8')
+  except UnicodeDecodeError:
+    return db.Text(text, encoding='latin-1')
diff --git a/webapp/codereview/fields.py b/webapp/codereview/fields.py
new file mode 100644
index 0000000..1236ff1
--- /dev/null
+++ b/webapp/codereview/fields.py
@@ -0,0 +1,337 @@
+# Copyright 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Custom fields and widgets for Gerrit.
+
+This requires Django 0.97.pre.
+"""
+
+
+### Imports ###
+
+import string
+import logging
+
+import django.forms.widgets
+import django.forms.fields
+from django import forms
+from django.utils import encoding
+from django.utils import safestring
+from django.forms import util
+from django.utils import html
+from django.utils import simplejson
+from google.appengine.ext import db
+
+import models
+
+def person_to_dict(v):
+  entry = {}
+  if isinstance(v, models.Account):
+    entry["type"] = "user"
+    entry["key"] = "user/" + v.email
+    entry["email"] = v.email
+    entry["real_name"] = v.real_name
+    entry["sort_key"] = "2/" + unicode(v.user)
+  elif isinstance(v, models.AccountGroup):
+    entry["type"] = "group"
+    entry["key"] = "group/" + str(v.key())
+    entry["name"] = v.name
+    entry["sort_key"] = "1/" + unicode(v.name)
+  else:
+    raise AssertionError("bad value: " + str(v))
+  return entry
+
+def people_to_dicts(value):
+  data = []
+  for v in value:
+    if isinstance(v, list):
+      data.extend(people_to_dicts(v))
+    elif v:
+      data.append(person_to_dict(v))
+  data.sort(lambda a,b: cmp(a["sort_key"], b["sort_key"]))
+  return data
+
+
+### User/Group Field ###
+
+class UserGroupWidget(django.forms.widgets.Widget):
+  """The widget that is used with UserGroupField."""
+  def __init__(self, allow_users=True, allow_groups=True, attrs=None):
+    self.attrs = {'cols': '40', 'rows': '10'}
+    self.allow_users = allow_users
+    self.allow_groups = allow_groups
+    if attrs:
+      self.attrs.update(attrs)
+
+  def render(self, name, value, attrs=None):
+    if value is None:
+      value = []
+    return safestring.mark_safe(
+        u"""
+        <div id="%(name)s_mom"></div>
+        <script>
+          UserGroupField_insertField(document.getElementById('%(name)s_mom'),
+              '%(name)s', %(allow_users)s, %(allow_groups)s, %(initial)s);
+        </script>
+        """ % { "name":name,
+                "initial":self._render_initial_js(value),
+                "allow_users": ("true" if self.allow_users else "false"),
+                "allow_groups": ("true" if self.allow_groups else "false"),
+              })
+
+  def _render_initial_js(self, value):
+    data = people_to_dicts(value)
+    return "[%s]" % ','.join(map(simplejson.dumps, data))
+
+  def value_from_datadict(self, data, files, name):
+    return data.getlist(name + "_keys")
+
+
+class UserGroupField(django.forms.fields.Field):
+  """A Field that picks a list of users and groups."""
+
+  def __init__(self, *args, **kwargs):
+    self.allow_users = kwargs.pop("allow_users", True)
+    self.allow_groups = kwargs.pop("allow_groups", True)
+    self.widget = UserGroupWidget(self.allow_users, self.allow_groups)
+    super(UserGroupField, self).__init__(*args, **kwargs)
+
+  def clean(self, data, initial=None):
+    def get_correct_model(key):
+      (type,id) = key.split("/", 1)
+      if id:
+        try:
+          if type == "user":
+            return models.Account.get_account_for_email(id)
+          elif type == "group":
+            return models.AccountGroup.get(id)
+        except db.BadKeyError, v:
+          pass
+      raise forms.ValidationError("invalid key")
+    keys = data
+    result = [get_correct_model(key) for key in keys]
+    super(UserGroupField, self).clean(initial or result)
+    return result
+
+  @classmethod
+  def get_users(cls, cleaned):
+    """Returns the users, given the cleaned data from the form.
+
+    e.g.
+    model_obj.usrs = fields.UserGroupField.get_users(form.cleaned_data['field'])
+    """
+    return [x.user for x in cleaned if isinstance(x, models.Account)]
+
+  @classmethod
+  def get_groups(cls, cleaned):
+    """Returns the groups, given the cleaned data from the form.
+
+    e.g.
+    groups = fields.UserGroupField.get_users(form.cleaned_data['field'])
+    """
+    return [x for x in cleaned if isinstance(x, models.AccountGroup)]
+
+  @classmethod
+  def get_group_keys(cls, cleaned):
+    """Returns keys for the groups, given the cleaned data from the form.
+
+    e.g.
+    groups = fields.UserGroupField.get_users(form.cleaned_data['field'])
+    """
+    return [x.key() for x in cleaned if isinstance(x, models.AccountGroup)]
+
+  @classmethod
+  def get_user_and_group_keys(cls, cleaned):
+    """Returns the users and the groups for the cleaned data from the form.
+
+    e.g.
+    (model_obj.users,model_obj.groups
+        ) = fields.UserGroupField.get_user_and_group_keys(
+        form.cleaned_data['field'])
+    """
+    return (UserGroupField.get_users(cleaned),
+            UserGroupField.get_group_keys(cleaned))
+
+  @classmethod
+  def field_value_for_keys(cls, users=[], groups=[]):
+    """Return the value suitable for this field from a list keys.
+
+    e.g.
+    form_initial_values['field'] = fields.UserGroupField.field_value_for_keys(
+              users, group_keys)
+    """
+    return ([models.AccountGroup.get(k) for k in groups]
+          + [models.Account.get_account_for_user(u) for u in users])
+  
+
+### Approvers Field ###
+
+class ApproversWidget(django.forms.widgets.Widget):
+  """The widget for ApproversField"""
+
+  def __init__(self, allow_users=True, allow_groups=True, attrs=None,
+        approvers=None, verifiers=None):
+    self.attrs = {'cols': '40', 'rows': '10'}
+    if attrs:
+      self.attrs.update(attrs)
+    self.approvers = approvers or UserGroupWidget();
+    self.verifiers = verifiers or UserGroupWidget();
+
+  def render(self, name, value, attrs=None):
+    if value is None:
+      value = []
+    styles = self.attrs.get("styles", {})
+    return safestring.mark_safe(
+        u"""
+        <div id="%(name)s_mom"></div>
+        <script>
+          ApproversField_insertField('%(name)s_mom', '%(name)s', %(initial)s,
+              %(styles)s);
+        </script>
+        """ % {
+          "name": name,
+          "initial": self._render_initial_js(name, value),
+          "styles": simplejson.dumps(styles),
+        })
+
+
+  def _render_initial_js(self, name, value):
+    data = []
+    index = 0
+    for v in value:
+      # BEGIN DEBUGGING
+      key = "initial_%d" % index
+      files = v["files"]
+      bad_files = v.get("bad_files", [])
+      approvers = v["approvers"]
+      verifiers = v["verifiers"]
+      # END DEBUGGING
+      entry = {}
+      entry["key"] = "initial_%d" % index
+      entry["files"] = encoding.force_unicode("\n".join(files))
+      entry["bad_files"] = map(encoding.force_unicode, bad_files)
+      entry["approvers"] = people_to_dicts(approvers)
+      entry["verifiers"] = people_to_dicts(verifiers)
+      data.append(entry)
+      index = index + 1
+    rows = []
+    for entry in data:
+      rows.append(simplejson.dumps(entry))
+    return "[%s]" % ','.join(rows)
+    
+
+  def value_from_datadict(self, data, files, name):
+    result = []
+    keys = data.getlist(name + "_keys")
+    for key in keys:
+      field_key = "%s_%s" % (name, key)
+      files = filter(string.strip, data.get(field_key + "_files").splitlines())
+      bad_files = []
+      for f in files:
+        if not models.ApprovalRight.validate_file(f):
+          err = True
+          bad_files.append(f)
+      approvers = self.approvers.value_from_datadict(data, files,
+          field_key + "_approvers")
+      verifiers = self.verifiers.value_from_datadict(data, files,
+          field_key + "_verifiers")
+      result.append({
+              "key": key,
+              "files": files,
+              "bad_files": bad_files,
+              "approvers": approvers,
+              "verifiers": verifiers,
+          })
+    return result
+
+
+class ApproversField(django.forms.fields.Field):
+  """A Field to pick which users/groups can edit which field"""
+  approvers = UserGroupField();
+  verifiers = UserGroupField();
+  widget = ApproversWidget(approvers=approvers.widget,
+      verifiers=verifiers.widget, attrs={"styles": {
+        "approval": "approval"
+      }})
+
+  def __init__(self, *args, **kwargs):
+    super(ApproversField, self).__init__(*args, **kwargs)
+
+  def clean(self, data, initial=None):
+    result = []
+    err = False
+    for d in data:
+      files = d["files"]
+      if len(d["bad_files"]) > 0:
+        err = True
+      approvers = self.approvers.clean(d["approvers"])
+      verifiers = self.verifiers.clean(d["verifiers"])
+      result.append({"files": files, "approvers": approvers,
+          "verifiers": verifiers})
+    if False:
+      for r in result:
+        logging.info("clean: files=" + str(r["files"]))
+        logging.info("   approvers=" + str(r["approvers"]))
+        logging.info("   verifiers=" + str(r["verifiers"]))
+    super(ApproversField, self).clean(initial or result)
+    if err:
+        raise forms.ValidationError("invalid files")
+    return result
+
+### Project field ###
+
+class ProjectSelectWidget(django.forms.widgets.Widget):
+  """A widget that lets a user pick a set of projects."""
+  def __init__(self, attrs=None):
+    super(ProjectSelectWidget, self).__init__(attrs)
+    if attrs:
+      self.attrs.update(attrs)
+
+  def render(self, name, value, attrs=None):
+    if value is None:
+      value = []
+    project_list = [{'name': p.name, 'key': str(p.key())}
+                    for p in models.Project.get_all_projects()]
+    return safestring.mark_safe(
+        u"""
+        <div id="%(name)s_mom"></div>
+        <script>
+          ProjectField_insertField(document.getElementById('%(name)s_mom'),
+              '%(name)s', %(project_list)s, %(initial)s);
+        </script>
+        """ % { "name": name,
+                "project_list": self._render_js_list(project_list),
+                "initial": self._render_js_list([str(v) for v in value]),
+              })
+
+  def _render_js_list(self, value):
+    return "[%s]" % ','.join(map(simplejson.dumps, value))
+
+  def value_from_datadict(self, data, files, name):
+    return set([v.strip() for v in data.getlist(name) if len(v.strip()) > 0])
+
+class ProjectSelectField(django.forms.fields.Field):
+  """A Field that lets a user pick a set of projects."""
+
+  def __init__(self, *args, **kwargs):
+    self.widget = ProjectSelectWidget()
+    super(ProjectSelectField, self).__init__(*args, **kwargs)
+
+  def clean(self, data, initial=None):
+    objects = models.Project.get(data)
+    result = [o.key() for o in objects if o]
+    super(ProjectSelectField, self).clean(initial or result)
+    return result
+
+
diff --git a/webapp/codereview/git_models.py b/webapp/codereview/git_models.py
new file mode 100644
index 0000000..ff9e81d
--- /dev/null
+++ b/webapp/codereview/git_models.py
@@ -0,0 +1,148 @@
+# Copyright 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Git specific data model (schema) for Gerrit."""
+
+# Python imports
+import hashlib
+import logging
+import re
+
+# AppEngine imports
+from google.appengine.ext import db
+from google.appengine.api import users
+
+# Gerrit imports
+from models import gql
+import models
+import memcache
+
+### Exceptions ###
+
+class InvalidBundleId(Exception):
+  """Bundle does not exist in data store."""
+
+class InvalidBundleState(Exception):
+  """Bundle has different state than expected."""
+
+
+### Bundles ###
+
+class ReceivedBundleSegment(models.BackedUpModel):
+  """Binary segment of a submitted bundle."""
+
+  # parent == ReceivedBundle
+  segment_id = db.IntegerProperty(required=True)  # == key
+  bundle_data = db.BlobProperty()
+
+
+class ReceivedBundle(models.BackedUpModel):
+  """A Git bundle submitted for review."""
+
+  _NewIsEmpty = memcache.Key("ReceivedBundle.NewIsEmpty")
+
+  STATE_UPLOADING = "UPLOADING"
+  STATE_NEW = "NEW"
+  STATE_UNPACKING = "UNPACKING"
+  STATE_UNPACKED = "UNPACKED"
+  STATE_INVALID = "INVALID"
+  STATE_SUSPENDED = "SUSPENDED"
+
+  state = db.StringProperty(required=True, default=STATE_UPLOADING,
+                            choices=(STATE_UPLOADING,
+                                     STATE_NEW,
+                                     STATE_UNPACKING,
+                                     STATE_UNPACKED,
+                                     STATE_INVALID,
+                                     STATE_SUSPENDED))
+  invalid_details = db.TextProperty()
+
+  # Where does this bundle merge to?
+  dest_project = db.ReferenceProperty(models.Project, required=True)
+  dest_branch = db.ReferenceProperty(models.Branch, required=True)
+
+  # Who submitted this bundle, and when.
+  owner = db.UserProperty(required=True)
+  created = db.DateTimeProperty(required=True, auto_now_add=True)
+  modified = db.DateTimeProperty(required=True, auto_now=True)
+
+  # How much bundle is there?
+  n_segments = db.IntegerProperty(required=True, default=0)
+  contained_objects = db.StringListProperty()
+
+  @classmethod
+  def lock_next_new(cls):
+    if ReceivedBundle._NewIsEmpty.get() == 1:
+      return None
+
+    try:
+      rb = cls._lock_next_new_imp()
+    except Timeout:
+      return None
+    except TransactionFailedError:
+      return None
+
+    if rb is None:
+      ReceivedBundle._NewIsEmpty.set(1)
+    return rb
+
+  def ready(self):
+      ReceivedBundle._NewIsEmpty.clear()
+
+  @classmethod
+  def _lock_next_new_imp(cls):
+    for attempt in xrange(5):
+      ro_rb = gql(cls, "WHERE state = :1 ORDER BY created",
+                  ReceivedBundle.STATE_NEW).get()
+      if ro_rb is None:
+        return None
+
+      def trans(key):
+        rb = db.get(key)
+        if rb.state == ReceivedBundle.STATE_NEW:
+          rb.state = ReceivedBundle.STATE_UNPACKING
+          rb.put()
+          return True
+        return False
+      if db.run_in_transaction(trans, ro_rb.key()):
+        return ro_rb
+    return None
+
+  @classmethod
+  def update_state(cls, keystr, old_state, new_state, err_msg):
+    key = db.Key(keystr)
+    if key.kind() != cls.__name__:
+        raise InvalidBundleId, keystr
+    def trans():
+      rb = db.get(key)
+      if rb is None:
+        raise InvalidBundleId, keystr
+      if rb.state != old_state:
+        raise InvalidBundleState, "%s != %s" % (rb.state, old_state)
+      rb.state = new_state
+      rb.invalid_details = err_msg
+      rb.put()
+    db.run_in_transaction(trans)
+
+  def set_segment(self, segment_id, data):
+    key = 's%d' % segment_id
+    ReceivedBundleSegment.get_or_insert(
+      key,
+      segment_id = segment_id,
+      bundle_data = db.Blob(data),
+      parent = self)
+
+  def get_segment(self, segment_id):
+    key = 's%d' % segment_id
+    return ReceivedBundleSegment.get_by_key_name(key, parent = self)
diff --git a/webapp/codereview/internal/__init__.py b/webapp/codereview/internal/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/codereview/internal/__init__.py
diff --git a/webapp/codereview/internal/admin_service.py b/webapp/codereview/internal/admin_service.py
new file mode 100644
index 0000000..a331663
--- /dev/null
+++ b/webapp/codereview/internal/admin_service.py
@@ -0,0 +1,49 @@
+# Copyright 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import datetime
+import logging
+
+from google.appengine.ext import db
+
+from codereview import models
+from codereview.models import gql
+
+from admin_pb2 import AdminService
+from sync_project_pb2 import *
+from util import u, InternalAPI
+
+class AdminServiceImp(AdminService, InternalAPI):
+  def SyncProject(self, rpc_controller, req, done):
+    rsp = SyncProjectResponse()
+
+    proj = models.Project.get_project_for_name(req.project_name)
+    if proj is None:
+      proj = models.Project(name = req.project_name)
+      proj.put()
+
+    really_exists = set()
+    for bs in req.branch:
+      branch = models.Branch.get_or_insert_branch(proj, bs.branch_name)
+      really_exists.add(branch.name)
+
+    to_delete = []
+    for b in list(gql(models.Branch, 'WHERE project = :1', proj)):
+      if b.name not in really_exists:
+        to_delete += gql(models.BuildAttempt, 'WHERE branch = :1', b)
+
+    if to_delete:
+      db.delete(to_delete)
+
+    done(rsp)
diff --git a/webapp/codereview/internal/build_service.py b/webapp/codereview/internal/build_service.py
new file mode 100644
index 0000000..9f8bb0c
--- /dev/null
+++ b/webapp/codereview/internal/build_service.py
@@ -0,0 +1,110 @@
+# Copyright 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import datetime
+import logging
+
+from google.appengine.ext import db
+
+from codereview import models
+from codereview.models import gql
+
+from build_pb2 import BuildService
+from submit_build_pb2 import *
+from post_build_result_pb2 import *
+from prune_builds_pb2 import *
+from util import InternalAPI, automatic_retry
+
+MAX_PRUNE = 100
+
+class BuildServiceImp(BuildService, InternalAPI):
+  @automatic_retry
+  def SubmitBuild(self, rpc_controller, req, done):
+    rsp = SubmitBuildResponse()
+
+    branch = db.get(db.Key(req.branch_key))
+    new_changes = [db.Key(c) for c in req.new_change]
+
+    build = models.BuildAttempt(
+              branch = branch,
+              revision_id = req.revision_id,
+              new_changes = new_changes)
+    build.put()
+
+    rsp.build_id = build.key().id()
+    done(rsp)
+
+  @automatic_retry
+  def PostBuildResult(self, rpc_controller, req, done):
+    rsp = PostBuildResultResponse()
+
+    if req.build_status == PostBuildResultRequest.SUCCESS:
+      ok = True
+    elif req.build_status == PostBuildResultRequest.BUILD_FAILED:
+      ok = False
+    else:
+      raise InvalidValueError, req.build_status
+
+    build = models.BuildAttempt.get_by_id(req.build_id)
+    if not build.finished:
+      build.finished = True
+      build.success = ok
+      build.put()
+
+    branch = build.branch
+    project = branch.project
+
+    rsp.dest_project_name = str(project.name)
+    rsp.dest_project_key = str(project.key())
+
+    rsp.dest_branch_name = str(branch.name)
+    rsp.dest_branch_key = str(branch.key())
+
+    rsp.revision_id = str(build.revision_id)
+    for patchset_key in build.new_changes:
+      rsp.new_change.append(str(patchset_key))
+
+    done(rsp)
+
+  @automatic_retry
+  def PruneBuilds(self, rpc_controller, req, done):
+    rsp = PruneBuildsResponse()
+
+    build_list = []
+
+    for m in [_AgedSuccess,
+              _AgedFailed,
+              ]:
+      build_list.extend(m())
+      if len(build_list) >= MAX_PRUNE:
+        break
+
+    if build_list:
+      db.delete(build_list)
+      rsp.status_code = PruneBuildsResponse.BUILDS_PRUNED
+    else:
+      rsp.status_code = PruneBuildsResponse.QUEUE_EMPTY
+    done(rsp)
+
+def _AgedSuccess():
+  aged = datetime.datetime.now() - datetime.timedelta(days=2)
+  return gql(models.BuildAttempt,
+             'WHERE success = :1 AND started <= :2',
+             True, aged).fetch(MAX_PRUNE)
+
+def _AgedFailed():
+  aged = datetime.datetime.now() - datetime.timedelta(days=7)
+  return gql(models.BuildAttempt,
+             'WHERE success = :1 AND started <= :2',
+             False, aged).fetch(MAX_PRUNE)
diff --git a/webapp/codereview/internal/bundle_store_service.py b/webapp/codereview/internal/bundle_store_service.py
new file mode 100644
index 0000000..7cd26cb
--- /dev/null
+++ b/webapp/codereview/internal/bundle_store_service.py
@@ -0,0 +1,158 @@
+# Copyright 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import datetime
+import logging
+
+from google.appengine.ext import db
+
+from codereview.models import gql
+from codereview.git_models import *
+
+from bundle_store_pb2 import BundleStoreService
+from next_received_bundle_pb2 import *
+from update_received_bundle_pb2 import *
+from prune_bundles_pb2 import *
+from util import InternalAPI, u, commit_to_revision, automatic_retry
+
+MAX_PRUNE = 10
+MAX_SEGS_PER_PRUNE = 10
+
+class BundleStoreServiceImp(BundleStoreService, InternalAPI):
+  @automatic_retry
+  def NextReceivedBundle(self, rpc_controller, req, done):
+    rsp = NextReceivedBundleResponse()
+
+    rb = ReceivedBundle.lock_next_new()
+    if rb:
+      rsp.status_code = NextReceivedBundleResponse.BUNDLE_AVAILABLE
+      rsp.bundle_key = str(rb.key())
+      rsp.dest_project = str(rb.dest_project.name)
+      rsp.dest_project_key = str(rb.dest_project.key())
+      rsp.dest_branch_key = str(rb.dest_branch.key())
+      rsp.owner = str(rb.owner.email())
+      rsp.n_segments = rb.n_segments
+      seg = rb.get_segment(1)
+      if seg:
+        rsp.bundle_data = seg.bundle_data
+    else:
+      rsp.status_code = NextReceivedBundleResponse.QUEUE_EMPTY
+    done(rsp)
+
+  @automatic_retry
+  def BundleSegment(self, rpc_controller, req, done):
+    rsp = BundleSegmentResponse()
+
+    rb = db.get(db.Key(req.bundle_key))
+    if not rb:
+      rsp.status_code = BundleSegmentResponse.UNKNOWN_BUNDLE
+      done(rsp)
+      return
+
+    seg = rb.get_segment(req.segment_id)
+    if seg:
+      rsp.status_code = BundleSegmentResponse.DATA
+      rsp.bundle_data = seg.bundle_data
+    else:
+      rsp.status_code = BundleSegmentResponse.UNKNOWN_SEGMENT
+    done(rsp)
+
+  @automatic_retry
+  def UpdateReceivedBundle(self, rpc_controller, req, done):
+    rsp = UpdateReceivedBundleResponse()
+
+    old_state = ReceivedBundle.STATE_UNPACKING
+    sc = req.status_code
+    if UpdateReceivedBundleRequest.UNPACKED_OK == sc:
+      new_state = ReceivedBundle.STATE_UNPACKED
+      err_msg = None
+    elif UpdateReceivedBundleRequest.SUSPEND_BUNDLE == sc:
+      new_state = ReceivedBundle.STATE_SUSPENDED
+      err_msg = req.error_details
+    else:
+      new_state = ReceivedBundle.STATE_INVALID
+      err_msg = req.error_details
+
+    try:
+      ReceivedBundle.update_state(req.bundle_key, old_state, new_state, err_msg)
+      rsp.status_code = UpdateReceivedBundleResponse.UPDATED
+    except InvalidBundleId, err:
+      logging.warn("Invalid bundle id %s: %s" % (req.bundle_key, err))
+      rsp.status_code = UpdateReceivedBundleResponse.INVALID_BUNDLE
+    except InvalidBundleState, err:
+      logging.warn("Invalid bundle state %s: %s" % (req.bundle_key, err))
+      rsp.status_code = UpdateReceivedBundleResponse.INVALID_STATE
+    done(rsp)
+
+  @automatic_retry
+  def PruneBundles(self, rpc_controller, req, done):
+    rsp = PruneBundlesResponse()
+
+    rb_list = []
+    to_rm = []
+
+    for m in [_AgedUploading,
+              _AgedInvalid,
+              _AgedSuspended,
+              _AgedUnpacking,
+              _AgedUnpacked,
+              ]:
+      rb_list.extend(m())
+      if len(rb_list) >= MAX_PRUNE:
+        break
+
+    for rb in rb_list:
+      segs = gql(ReceivedBundleSegment,
+                'WHERE ANCESTOR IS :1',
+                rb).fetch(MAX_SEGS_PER_PRUNE)
+      if len(segs) < MAX_SEGS_PER_PRUNE:
+        to_rm.append(rb)
+      to_rm.extend(segs)
+
+    if to_rm:
+      db.delete(to_rm)
+      rsp.status_code = PruneBundlesResponse.BUNDLES_PRUNED
+    else:
+      rsp.status_code = PruneBundlesResponse.QUEUE_EMPTY
+    done(rsp)
+
+def _AgedUploading():
+  aged = datetime.datetime.now() - datetime.timedelta(days=7)
+  return gql(ReceivedBundle,
+             'WHERE state = :1 AND created <= :2',
+             ReceivedBundle.STATE_UPLOADING, aged).fetch(MAX_PRUNE)
+
+def _AgedInvalid():
+  aged = datetime.datetime.now() - datetime.timedelta(days=2)
+  return gql(ReceivedBundle,
+             'WHERE state = :1 AND created <= :2',
+             ReceivedBundle.STATE_INVALID, aged).fetch(MAX_PRUNE)
+
+def _AgedSuspended():
+  aged = datetime.datetime.now() - datetime.timedelta(days=7)
+  return gql(ReceivedBundle,
+             'WHERE state = :1 AND created <= :2',
+             ReceivedBundle.STATE_SUSPENDED, aged).fetch(MAX_PRUNE)
+
+def _AgedUnpacking():
+  aged = datetime.datetime.now() - datetime.timedelta(days=7)
+  return gql(ReceivedBundle,
+             'WHERE state = :1 AND created <= :2',
+             ReceivedBundle.STATE_UNPACKING, aged).fetch(MAX_PRUNE)
+
+def _AgedUnpacked():
+  aged = datetime.datetime.now() - datetime.timedelta(hours=1)
+  return gql(ReceivedBundle,
+             'WHERE state = :1 AND created <= :2',
+             ReceivedBundle.STATE_UNPACKED, aged).fetch(MAX_PRUNE)
diff --git a/webapp/codereview/internal/change_service.py b/webapp/codereview/internal/change_service.py
new file mode 100644
index 0000000..1ce26dc
--- /dev/null
+++ b/webapp/codereview/internal/change_service.py
@@ -0,0 +1,165 @@
+# Copyright 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import logging
+
+from google.appengine.api import users
+from google.appengine.ext import db
+
+from codereview import models
+
+from change_pb2 import ChangeService
+from complete_patchset_pb2 import *
+from upload_patchset_file_pb2 import *
+from submit_change_pb2 import *
+from util import *
+
+class ChangeServiceImp(ChangeService, InternalAPI):
+
+  @automatic_retry
+  def SubmitChange(self, rpc_controller, req, done):
+    rsp = SubmitChangeResponse()
+
+    user = users.User(req.owner)
+    branch = db.get(db.Key(req.dest_branch_key))
+    if not branch:
+      rsp.status_code = SubmitChangeResponse.UNKNOWN_BRANCH
+      done(rsp)
+
+    rev = commit_to_revision(branch.project, req.commit)
+    if rev.patchset:
+      rsp.status_code = SubmitChangeResponse.PATCHSET_EXISTS
+      done(rsp)
+
+    subject = u(req.commit.subject)[0:100]
+
+    def trans():
+      change = models.Change(
+                 subject = subject,
+                 description = u(req.commit.message),
+                 owner = user,
+                 dest_project = branch.project,
+                 dest_branch = branch,
+                 n_patchsets = 1)
+      change.put()
+
+      patchset = models.PatchSet(
+                   change = change,
+                   owner = user,
+                   parent = change,
+                   revision = rev,
+                   id = 1)
+      patchset.put()
+      return (change, patchset)
+    change, patchset = db.run_in_transaction(trans)
+
+    if rev.link_patchset(patchset):
+      rsp.status_code = SubmitChangeResponse.CREATED
+      rsp.change_id = change.key().id()
+      rsp.patchset_id = patchset.id
+      rsp.patchset_key = str(patchset.key())
+    else:
+      db.delete([change, patchset])
+      rsp.status_code = SubmitChangeResponse.PATCHSET_EXISTS
+    done(rsp)
+
+  @automatic_retry
+  def UploadPatchsetFile(self, rpc_controller, req, done):
+    rsp = UploadPatchsetFileResponse()
+
+    patchset = db.get(db.Key(req.patchset_key))
+    if not patchset:
+      rsp.status_code = UploadPatchsetFileResponse.UNKNOWN_PATCHSET
+      done(rsp)
+      return
+
+    if patchset.complete or patchset.change.closed:
+      rsp.status_code = UploadPatchsetFileResponse.CLOSED
+      done(rsp)
+      return
+
+    if UploadPatchsetFileRequest.ADD == req.status:
+      status = 'A'
+    elif UploadPatchsetFileRequest.MODIFY == req.status:
+      status = 'M'
+    elif UploadPatchsetFileRequest.DELETE == req.status:
+      status = 'D'
+    else:
+      status = '?'
+
+    try:
+      if req.base_id:
+        old_data = models.DeltaContent.create_content(
+                     id = req.base_id,
+                     text_z = req.base_z)
+        new_data = models.DeltaContent.create_content(
+                     id = req.final_id,
+                     text_z = req.patch_z,
+                     base = old_data)
+        if new_data.text_z == req.patch_z:
+          diff_data = new_data
+        else:
+          diff_data = models.DeltaContent.create_patch(
+                        id = req.patch_id,
+                        text_z = req.patch_z)
+      else:
+        old_data = None
+        new_data = None
+        diff_data = models.DeltaContent.create_patch(
+                      id = req.patch_id,
+                      text_z = req.patch_z)
+    except models.DeltaPatchingException:
+      logging.error("Patch error on change %s, patch set %s, file %s"
+        % (patchset.change.key().id(),
+           str(patchset.id),
+           u(req.file_name))
+      )
+      rsp.status_code = UploadPatchsetFileResponse.PATCHING_ERROR
+      done(rsp)
+      return
+
+    patch = models.Patch.get_or_insert_patch(
+              patchset = patchset,
+              filename = u(req.file_name),
+              status = status,
+              n_comments = 0,
+              old_data = old_data,
+              new_data = new_data,
+              diff_data = diff_data)
+
+    if old_data:
+      models.CachedDeltaContent.get(old_data.key())
+      models.CachedDeltaContent.get(new_data.key())
+      if diff_data != new_data:
+        models.CachedDeltaContent.get(diff_data.key())
+    else:
+      models.CachedDeltaContent.get(diff_data.key())
+
+    rsp.status_code = UploadPatchsetFileResponse.CREATED
+    done(rsp)
+
+  @automatic_retry
+  def CompletePatchset(serlf, rpc_controller, req, done):
+    rsp = CompletePatchsetResponse()
+
+    patchset = db.get(db.Key(req.patchset_key))
+    if not patchset.complete:
+      patchset.complete = True
+      patchset.put()
+
+      if len(req.compressed_filenames) > 0:
+        models.PatchSetFilenames.store_compressed(
+          patchset,
+          req.compressed_filenames)
+    done(rsp)
diff --git a/webapp/codereview/internal/merge_service.py b/webapp/codereview/internal/merge_service.py
new file mode 100644
index 0000000..bf9c721
--- /dev/null
+++ b/webapp/codereview/internal/merge_service.py
@@ -0,0 +1,161 @@
+# Copyright 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import logging
+
+from google.appengine.ext import db
+
+from codereview import models
+from codereview.models import gql
+
+from merge_pb2 import MergeService
+from pending_merge_pb2 import *
+from post_merge_result_pb2 import *
+from post_branch_update_pb2 import *
+from util import InternalAPI, automatic_retry
+
+from codereview import email
+
+def _send_clean_merge_email(http_request, change):
+  if not change.emailed_clean_merge:
+    email.send_change_message(http_request, change,
+                              "mails/clean_merge.txt", None)
+    change.emailed_clean_merge = True
+  
+def _send_missing_dependency_merge_email(http_request, change):
+  if not change.emailed_clean_merge:
+    email.send_change_message(http_request, change,
+                              "mails/missing_dependency.txt", None)
+    change.emailed_missing_dependency = True
+
+def _send_path_conflict_email(http_request, change):
+  if not change.emailed_clean_merge:
+    email.send_change_message(http_request, change,
+                              "mails/path_conflict.txt", None)
+    change.emailed_path_conflict = True
+
+
+class InvalidBranchStatusError(Exception):
+  """The branch cannot be updated in this way at this time."""
+
+class MergeServiceImp(MergeService, InternalAPI):
+  @automatic_retry
+  def NextPendingMerge(self, rpc_controller, req, done):
+
+    patchsets = []
+    while not patchsets:
+      branch = gql(models.Branch,
+                  "WHERE status = 'NEEDS_MERGE'"
+                  " ORDER BY merge_submitted").get()
+      if branch is None:
+        break
+      patchsets = branch.begin_merge()
+
+    rsp = PendingMergeResponse()
+    if patchsets:
+      first = patchsets[0].change
+      rsp.status_code = PendingMergeResponse.MERGE_READY
+      rsp.dest_project_name = str(first.dest_project.name)
+      rsp.dest_project_key = str(first.dest_project.key())
+      rsp.dest_branch_name = str(first.dest_branch.name)
+      rsp.dest_branch_key = str(first.dest_branch.key())
+      for ps in patchsets:
+        pmi = rsp.change.add()
+        pmi.patchset_key = str(ps.key())
+        pmi.revision_id = str(ps.revision.id)
+    else:
+      rsp.status_code = PendingMergeResponse.QUEUE_EMPTY
+    done(rsp)
+
+  @automatic_retry
+  def PostMergeResult(self, rpc_controller, req, done):
+    rsp = PostMergeResultResponse()
+
+    success = []
+    fail = []
+    defer = []
+
+    for ri in req.change:
+      sc = ri.status_code
+      ps = db.get(db.Key(ri.patchset_key))
+
+      if ps.change.merged:
+        success.append(ps)
+        continue
+
+      def chg_trans(key):
+        change = db.get(key)
+        if change.merge_patchset.key() != ps.key():
+          return False
+
+        if sc == MergeResultItem.CLEAN_MERGE:
+          pass
+
+        elif sc == MergeResultItem.ALREADY_MERGED:
+          change.merged = True
+          change.closed = True
+          change.put()
+
+        elif sc == MergeResultItem.MISSING_DEPENDENCY:
+          pass
+
+        elif sc == MergeResultItem.PATH_CONFLICT:
+          change.unsubmit_merge()
+          change.put()
+
+        return True
+      if db.run_in_transaction(chg_trans, ps.change.key()):
+        if sc == MergeResultItem.CLEAN_MERGE:
+          _send_clean_merge_email(self.http_request, ps.change)
+          ps.change.put()
+
+        elif sc == MergeResultItem.ALREADY_MERGED:
+          success.append(ps)
+
+        elif sc == MergeResultItem.MISSING_DEPENDENCY:
+          _send_missing_dependency_merge_email(self.http_request, ps.change)
+          ps.change.put()
+          defer.append(ps)
+
+        elif sc == MergeResultItem.PATH_CONFLICT:
+          _send_path_conflict_email(self.http_request, ps.change)
+          ps.change.put()
+          fail.append(ps)
+      else:
+        fail.append(ps)
+
+    branch = db.get(db.Key(req.dest_branch_key))
+    branch.finish_merge(success, fail, defer)
+
+    done(rsp)
+
+  @automatic_retry
+  def PostBranchUpdate(self, rpc_controller, req, done):
+    rsp = PostBranchUpdateResponse()
+
+    branch = db.get(db.Key(req.branch_key))
+    merged = [db.get(db.Key(c_key)) for c_key in req.new_change]
+
+    branch.merged(merged)
+
+    for ps in merged:
+      def trans(key):
+        change = db.get(key)
+        if change.merge_patchset.key() == ps.key():
+          change.merged = True
+          change.closed = True
+          change.put()
+      db.run_in_transaction(trans, ps.change.key())
+
+    done(rsp)
diff --git a/webapp/codereview/internal/util.py b/webapp/codereview/internal/util.py
new file mode 100644
index 0000000..267fe29
--- /dev/null
+++ b/webapp/codereview/internal/util.py
@@ -0,0 +1,75 @@
+# Copyright 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import datetime
+
+from google.appengine.ext import db
+from codereview import models
+from codereview.need_retry_pb2 import RetryRequestLaterResponse
+
+class InternalAPI(object):
+  """
+    Marker superclass for service implementations which should be
+    restricted to only role accounts executing batch processing.
+  """
+  def __init__(self):
+    pass
+
+def u(str):
+  """Decode the UTF-8 byte sequence into a unicode object."""
+  return str.decode('utf_8')
+
+def commit_to_revision(proj, commit):
+  """Converts a GitCommit into a RevisionId data store object.
+  """
+  p_a = commit.author
+  p_c = commit.committer
+
+  return models.RevisionId.get_or_insert_revision(
+          project = proj,
+          id = commit.id,
+          ancestors = [p for p in commit.parent_id],
+          message = db.Text(u(commit.message)),
+
+          author_name = u(p_a.name),
+          author_email = db.Email(u(p_a.email)),
+          author_when = datetime.datetime.utcfromtimestamp(p_a.when),
+          author_tz = p_a.tz,
+
+          committer_name = u(p_c.name),
+          committer_email = db.Email(u(p_c.email)),
+          committer_when = datetime.datetime.utcfromtimestamp(p_c.when),
+          committer_tz = p_a.tz,
+          )
+
+def automatic_retry(func):
+  """Decorator that catches data store errors and sends a retry response."""
+  def retry_wrapper(self, rpc_controller, req, done):
+    try:
+      func(self, rpc_controller, req, done)
+
+    except db.InternalError:
+      rsp = RetryRequestLaterResponse()
+      done(rsp)
+
+    except db.Timeout:
+      rsp = RetryRequestLaterResponse()
+      done(rsp)
+
+    except db.TransactionFailedError:
+      rsp = RetryRequestLaterResponse()
+      done(rsp)
+
+  return retry_wrapper
+
diff --git a/webapp/codereview/intra_region_diff.py b/webapp/codereview/intra_region_diff.py
new file mode 100644
index 0000000..3383c70
--- /dev/null
+++ b/webapp/codereview/intra_region_diff.py
@@ -0,0 +1,699 @@
+# Copyright 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Intra-region diff utilities.
+
+Intra-region diff highlights the blocks of code which have been changed or
+deleted within a region. So instead of highlighting the whole region marked as
+changed, the user can see what exactly was changed within that region.
+
+Terminology:
+  'region' is a list of consecutive code lines.
+  'word' is the unit of intra-region diff. Its definition is arbitrary based on
+   what we think as to be a good unit of difference between two regions.
+  'block' is a small section of code within a region. It can span multiple
+  lines. There can be multiple non overlapping blocks within a region. A block
+  can potentially span the whole region.
+
+The blocks have two representations. One is of the format (offset1, offset2,
+size) which is returned by the SequenceMatcher to indicate a match of
+length 'size' starting at offset1 in the first/old line and starting at offset2
+in the second/new line. We convert this representation to a pair of tuples i.e.
+(offset1, size) and (offset2, size) for rendering each side of the diff
+separately. This latter representation is also more efficient for doing
+compaction of adjacent blocks which reduces the size of the HTML markup. See
+CompactBlocks for more details.
+
+SequenceMatcher always returns one special matching block at the end with
+contents (len(line1), len(line2), 0). We retain this special block as it
+simplifies for loops in rendering the last non-matching block. All functions
+which deal with the sequence of blocks assume presence of the special block at
+the end of the sequence and retain it.
+"""
+
+import cgi
+import difflib
+import re
+
+# Tag to begin a diff chunk.
+BEGIN_TAG = "<span class=\"%s\">"
+# Tag to end a diff block.
+END_TAG = "</span>"
+# Tag used for visual tab indication
+TAB_TAG = ("<span class=\"visualtab\" title=\"Visual tab indicator. "
+           "Change settings above to hide.\">&raquo;</span>")
+# Color scheme to govern the display properties of diff blocks and matching
+# blocks. Each value e.g. 'oldlight' corresponds to a CSS style.
+COLOR_SCHEME = {
+  'old': {
+          'match':      'oldlight',
+          'diff':       'olddark',
+          'bckgrnd':    'oldlight',
+         },
+  'new': {
+          'match':      'newlight',
+          'diff':       'newdark',
+          'bckgrnd':    'newlight',
+         },
+  'oldmove': {
+          'match':      'movelight',
+          'diff':       'oldmovedark',
+          'bckgrnd':    'movelight'
+  },
+  'newmove': {
+          'match':      'newlight',
+          'diff':       'newdark',
+          'bckgrnd':    'newlight'
+  },
+}
+# Regular expressions to tokenize lines. Default is 'b'.
+EXPRS = {
+         'a': r'(\w+|[^\w\s]+|\s+)',
+         'b': r'([A-Za-z0-9]+|[^A-Za-z0-9])',
+         'c': r'([A-Za-z0-9_]+|[^A-Za-z0-9_])',
+        }
+# Maximum total characters in old and new lines for doing intra-region diffs.
+# Intra-region diff for larger regions is hard to comprehend and wastes CPU
+# time.
+MAX_TOTAL_LEN = 10000
+
+
+def ExpandTabs(text, tabsize=8, tab_marker=None):
+  """Expand tab characters in a string into spaces with an optional marker.
+
+  Args:
+    text: a string containing tab characters.
+    tabsize: the number of spaces that a tab represents
+    tab_marker: a character; if not None, we replace the first character
+                of each tab expansion with this.
+  """
+  tabpos = text.find("\t")
+  while tabpos >= 0:
+    fillwidth = tabsize - (tabpos % tabsize)
+    if fillwidth == 0:
+      fillwidth = tabsize
+    if tab_marker:
+      fill = tab_marker + " " * (fillwidth - 1)
+    else:
+      fill = " " * fillwidth
+    # We avoid str.replace in case tab_marker is \t
+    text = text[:tabpos] + fill + text[tabpos+1:]
+    tabpos = text.find("\t", tabpos + 1)
+  return text
+
+
+def Fold(text, limit=85, indent=5, offset=0, tabsize=8, mark_tabs=False):
+  """Break a long string into multiple lines.
+
+  Lines longer than 'limit' are broken up into pieces of at most
+  'limit' characters; continuation lines start with 'indent' spaces.
+
+  'offset' is used to indicate if 'text' itself doesn't align with
+  the beginning of line e.g. we are trying to Fold a line when we have
+  already printed 'offset' number of characters to the output.
+
+  This also translates tabs into 'tabsize' spaces. If 'mark_tabs' is true,
+  then we indicate the first character of each expanded tab visually.
+
+  Input and output are assumed to be in UTF-8; the computation is done
+  in Unicode.  (Still not good enough if zero-width characters are
+  present.) If the input is not valid UTF-8, then the encoding is
+  passed through, potentially breaking up multi-byte characters.
+  We pass the line through cgi.escape before returning it.
+
+  A trailing newline is always stripped from the input first.
+  """
+  assert tabsize > 0, tabsize
+  if text.endswith("\n"):
+    text = text[:-1]
+  try:
+    text = unicode(text, "utf-8")
+  except:
+    pass
+  if "\t" in text:
+    # If mark_tabs is true, we retain one \t character as a marker during
+    # expansion so that we later replace it with an HTML snippet.
+    tab_marker = mark_tabs and "\t" or None
+    rest = text[indent-offset:]
+    text = text[:indent-offset] + ExpandTabs(rest, tabsize, tab_marker)
+  # Perform wrapping.
+  if len(text) > limit - offset:
+    parts = []
+    prefix = ""
+    i = 0
+    j = limit - offset
+    while i < len(text):
+      parts.append(prefix + text[i:j])
+      i = j
+      j += limit - indent
+      prefix = " " * indent
+    text = "\n".join(parts)
+  # Colorize tab markers (after calling escape)
+  text = cgi.escape(text)
+  text = text.replace("\t", TAB_TAG)
+  if isinstance(text, unicode):
+    return text.encode("utf-8", "replace")
+  return text
+
+
+def CompactBlocks(blocks):
+  """Compacts adjacent code blocks.
+
+  In many cases 2 adjacent blocks can be merged into one. This allows
+  to do some further processing on those blocks.
+
+  Args:
+    blocks: [(offset1, size), ...]
+
+  Returns:
+    A list with the same structure as the input with adjacent blocks
+    merged.  However, the last block (which is always assumed to have
+    a zero size) is never merged.  For example, the input
+    [(0, 2), (2, 8), (10, 5), (15, 0)]
+    will produce the output [(0, 15), (15, 0)].
+  """
+  if len(blocks) == 1:
+    return blocks
+  result = [blocks[0]]
+  for block in blocks[1:-1]:
+    last_start, last_len = result[-1]
+    curr_start, curr_len = block
+    if last_start + last_len == curr_start:
+      result[-1] = last_start, last_len + curr_len
+    else:
+      result.append(block)
+  result.append(blocks[-1])
+  return result
+
+
+def FilterBlocks(blocks, filter_func):
+  """Gets rid of any blocks if filter_func evaluates false for them.
+
+  Args:
+    blocks: [(offset1, offset2, size), ...]; must have at least 1 entry
+    filter_func: a boolean function taking a single argument of the form
+                 (offset1, offset2, size)
+
+  Returns:
+    A list with the same structure with entries for which filter_func()
+    returns false removed.  However, the last block is always included.
+  """
+  # We retain the 'special' block at the end.
+  res = [b for b in blocks[:-1] if filter_func(b)]
+  res.append(blocks[-1])
+  return res
+
+
+def GetDiffParams(expr='b', min_match_ratio=0.6, min_match_size=2, dbg=False):
+  """Returns a tuple of various parameters which affect intra region diffs.
+
+  Args:
+    expr: regular expression id to use to identify 'words' in the intra region
+          diff
+    min_match_ratio: minimum similarity between regions to qualify for intra
+                     region diff
+    min_match_size: the smallest matching block size to use. Blocks smaller
+                    than this are ignored.
+    dbg: to turn on generation of debugging information for the diff
+
+  Returns:
+    4 tuple (expr, min_match_ratio, min_match_size, dbg) that can be used to
+    customize diff. It can be passed to functions like WordDiff and
+    IntraLineDiff.
+  """
+  assert expr in EXPRS
+  assert min_match_size in xrange(1,5)
+  assert min_match_ratio > 0.0 and min_match_ratio < 1.0
+  return (expr, min_match_ratio, min_match_size, dbg)
+
+
+def CanDoIRDiff(old_lines, new_lines):
+  """Tells if it would be worth computing the intra region diff.
+
+  Calculating IR diff is costly and is usually helpful only for small regions.
+  We use a heuristic that if the total number of characters is more than a
+  certain threshold then we assume it is not worth computing the IR diff.
+
+  Args:
+    old_lines: an array of strings containing old text
+    new_lines: an array of strings containing new text
+
+  Returns:
+    True if we think it is worth computing IR diff for the region defined
+    by old_lines and new_lines, False otherwise.
+
+  TODO: Let GetDiffParams handle MAX_TOTAL_LEN param also.
+  """
+  total_chars = (sum(len(line) for line in old_lines) +
+                 sum(len(line) for line in new_lines))
+  return total_chars <= MAX_TOTAL_LEN
+
+
+def WordDiff(line1, line2, diff_params):
+  """Returns blocks with positions indiciating word level diffs.
+
+  Args:
+    line1: string representing the left part of the diff
+    line2: string representing the right part of the diff
+    diff_params: return value of GetDiffParams
+
+  Returns:
+    A tuple (blocks, ratio) where:
+      blocks: [(offset1, offset2, size), ...] such that
+              line1[offset1:offset1+size] == line2[offset2:offset2+size]
+              and the last block is always (len(line1), len(line2), 0)
+      ratio: a float giving the diff ratio computed by SequenceMatcher.
+  """
+  match_expr, min_match_ratio, min_match_size, dbg = diff_params
+  exp = EXPRS[match_expr]
+  # We want to split at proper character boundaries in UTF8 text.
+  try:
+    line1_u = unicode(line1, "utf8")
+  except:
+    line1_u = line1
+  try:
+    line2_u = unicode(line2, "utf8")
+  except:
+    line2_u = line2
+  def _ToUTF8(s):
+    if isinstance(s, unicode):
+      return s.encode("utf8")
+    return s
+  a = map(_ToUTF8, re.findall(exp, line1_u, re.U))
+  b = map(_ToUTF8, re.findall(exp, line2_u, re.U))
+  s = difflib.SequenceMatcher(None, a, b)
+  matching_blocks = s.get_matching_blocks()
+  ratio = s.ratio()
+  # Don't show intra region diffs if both lines are too different and there is
+  # more than one block of difference. If there is only one change then we
+  # still show the intra region diff regardless of how different the blocks
+  # are.
+  # Note: We compare len(matching_blocks) with 3 because one block of change
+  # results in 2 matching blocks. We add the one special block and we get 3
+  # matching blocks per one block of change.
+  if ratio < min_match_ratio and len(matching_blocks) > 3:
+    return ([(0, 0, 0)], ratio)
+  # For now convert to character level blocks because we already have
+  # the code to deal with folding across lines for character blocks.
+  # Create arrays lena an lenb which have cumulative word lengths
+  # corresponding to word positions in a and b
+  lena = []
+  last = 0
+  for w in a:
+    lena.append(last)
+    last += len(w)
+  lenb = []
+  last = 0
+  for w in b:
+    lenb.append(last)
+    last += len(w)
+  lena.append(len(line1))
+  lenb.append(len(line2))
+  # Convert to character blocks
+  blocks = []
+  for s1, s2, blen in matching_blocks[:-1]:
+    apos = lena[s1]
+    bpos = lenb[s2]
+    block_len = lena[s1+blen] - apos
+    blocks.append((apos, bpos, block_len))
+  # Recreate the special block.
+  blocks.append((len(line1), len(line2), 0))
+  # Filter any matching blocks which are smaller than the desired threshold.
+  # We don't remove matching blocks with only a newline character as doing so
+  # results in showing the matching newline character as non matching which
+  # doesn't look good.
+  blocks = FilterBlocks(blocks, lambda b: (b[2] >= min_match_size or
+                                           line1[b[0]:b[0]+b[2]] == '\n'))
+  return (blocks, ratio)
+
+
+def IntraLineDiff(line1, line2, diff_params, diff_func=WordDiff):
+  """Computes intraline diff blocks.
+
+  Args:
+    line1: string representing the left part of the diff
+    line2: string representing the right part of the diff
+    diff_params: return value of GetDiffParams
+    diff_func: a function whose signature matches that of WordDiff() above
+
+  Returns:
+    A tuple of (blocks1, blocks2) corresponding to line1 and line2.
+    Each element of the tuple is an array of (start_pos, length)
+    tuples denoting a diff block.
+  """
+  blocks, ratio = diff_func(line1, line2, diff_params)
+  blocks1 = [(start1, length) for (start1, start2, length) in blocks]
+  blocks2 = [(start2, length) for (start1, start2, length) in blocks]
+
+  return (blocks1, blocks2, ratio)
+
+
+def DumpDiff(blocks, line1, line2):
+  """Helper function to debug diff related problems.
+
+  Args:
+    blocks: [(offset1, offset2, size), ...]
+    line1: string representing the left part of the diff
+    line2: string representing the right part of the diff
+  """
+  for offset1, offset2, size in blocks:
+    print offset1, offset2, size
+    print offset1, size, ":  ", line1[offset1:offset1+size]
+    print offset2, size, ":  ", line2[offset2:offset2+size]
+
+
+def RenderIntraLineDiff(blocks, line, tag, dbg_info=None, limit=80, indent=5,
+                        tabsize=8, mark_tabs=False):
+  """Renders the diff blocks returned by IntraLineDiff function.
+
+  Args:
+    blocks: [(start_pos,  size), ...]
+    line: line of code on which the blocks are to be rendered.
+    tag: 'new' or 'old' to control the color scheme.
+    dbg_info: a string that holds debugging informaion header. Debug
+              information is rendered only if dbg_info is not None.
+    limit: folding limit to be passed to the Fold function.
+    indent: indentation size to be passed to the Fold function.
+    tabsize: the number of spaces that a tab represents
+    mark_tabs: if True, mark the first character of each expanded tab visually
+
+  Returns:
+    A tuple of two elements. First element is the rendered version of
+    the input 'line'. Second element tells if the line has a matching
+    newline character.
+  """
+  res = ""
+  prev_start, prev_len = 0, 0
+  has_newline = False
+  debug_info = dbg_info
+  if dbg_info:
+    debug_info += "\nBlock Count: %d\nBlocks: " % (len(blocks) - 1)
+  for curr_start, curr_len in blocks:
+    if dbg_info and curr_len > 0:
+      debug_info += Fold("\n(%d, %d):|%s|" %
+                         (curr_start, curr_len,
+                          line[curr_start:curr_start+curr_len]),
+                         limit, indent, tabsize, mark_tabs)
+    res += FoldBlock(line, prev_start + prev_len, curr_start, limit, indent,
+                     tag, 'diff', tabsize, mark_tabs)
+    res += FoldBlock(line, curr_start, curr_start + curr_len, limit, indent,
+                     tag, 'match', tabsize, mark_tabs)
+    # TODO: This test should be out of loop rather than inside. Once we
+    # filter out some junk from blocks (e.g. some empty blocks) we should do
+    # this test only on the last matching block.
+    if line[curr_start:curr_start+curr_len].endswith('\n'):
+      has_newline = True
+    prev_start, prev_len = curr_start, curr_len
+  return (res, has_newline, debug_info)
+
+
+def FoldBlock(src, start, end, limit, indent, tag, btype, tabsize=8,
+              mark_tabs=False):
+  """Folds and renders a block.
+
+  Args:
+    src: line of code
+    start: starting position of the block within 'src'.
+    end: ending position of the block within 'src'.
+    limit: folding limit
+    indent: indentation to use for folding.
+    tag: 'new' or 'old' to control the color scheme.
+    btype: block type i.e. 'match' or 'diff' to control the color schme.
+    tabsize: the number of spaces that a tab represents
+    mark_tabs: if True, mark the first character of each expanded tab visually
+
+  Returns:
+    A string represeting the rendered block.
+  """
+  text = src[start:end]
+  # We ignore newlines because we do newline management ourselves.
+  # Any other new lines with at the end will be stripped off by the Fold
+  # method.
+  if start >= end or text == '\n':
+    return ""
+  fbegin, lend, nl_plus_indent = GetTags(tag, btype, indent)
+  # 'bol' is beginning of line
+  offset_from_bol = start % limit
+  res = ""
+  # If this is the first block of the line and this is not the first line then
+  # insert newline + indent. This special case is not dealt with in the for
+  # loop below.
+  if offset_from_bol == 0 and not start == 0:
+    res = nl_plus_indent
+  text = Fold(text, limit, 0, offset_from_bol, tabsize, mark_tabs)
+  folded_lines = text.split("\n")
+  for (j, l) in enumerate(folded_lines):
+    if l:
+      res += (fbegin + l + lend)
+    # Add new line plus indent except for the last line.
+    if j < len(folded_lines) - 1:
+      res += nl_plus_indent
+  return res
+
+
+def GetTags(tag, btype, indent):
+  """Returns various tags for rendering diff blocks.
+
+  Args:
+    tag: a key from COLOR_SCHEME
+    btype: 'match' or 'diff'
+    indent: indentation to use
+  Returns
+    A 3 tuple (begin_tag, end_tag, formatted_indent_block)
+  """
+  assert tag in COLOR_SCHEME
+  assert btype in ['match', 'diff']
+  fbegin = BEGIN_TAG % COLOR_SCHEME[tag][btype]
+  bbegin = BEGIN_TAG % COLOR_SCHEME[tag]['bckgrnd']
+  lend = END_TAG
+  nl_plus_indent = '\n'
+  if indent > 0:
+    nl_plus_indent += bbegin + cgi.escape(" "*indent) + lend
+  return fbegin, lend, nl_plus_indent
+
+
+def ConvertToSingleLine(lines):
+  """Transforms a sequence of strings into a single line.
+
+  Returns the state that can be used to reconstruct the original lines with
+  the newline separators placed at the original place.
+
+  Args:
+    lines: sequence of strings
+
+  Returns:
+    Returns (single_line, state) tuple. 'state' shouldn't be modified by the
+    caller. It is only used to pass to other functions which will do certain
+    operations on this state.
+
+    'state' is an array containing a dictionary for each item in lines. Each
+    dictionary has two elements 'pos' and 'blocks'. 'pos' is the end position
+    of each line in the final converted string. 'blocks' is an array of blocks
+    for each line of code. These blocks are added using MarkBlock function.
+  """
+  state = []
+  total_length = 0
+  for l in lines:
+    total_length += len(l)
+    # TODO: Use a tuple instead.
+    state.append({     'pos': total_length, # the line split point
+                    'blocks': []            # blocks which belong to this line
+                 })
+  result = "".join(lines)
+  assert len(state) == len(lines)
+  return (result, state)
+
+
+def MarkBlock(state, begin, end):
+  """Marks a block on a region such that it doesn't cross line boundaries.
+
+  It is an operation that can be performed on the single line which was
+  returned by the ConvertToSingleLine function. This operation marks arbitrary
+  block [begin,end) on the text. It also ensures that if [begin,end) crosses
+  line boundaries in the original region then it splits the section up in 2 or
+  more blocks such that no block crosses the boundaries.
+
+  Args:
+    state: the state returned by ConvertToSingleLine function. The state
+           contained is modified by this function.
+    begin: Beginning of the block.
+    end: End of the block (exclusive).
+
+  Returns:
+    None.
+  """
+  # TODO: Make sure already existing blocks don't overlap
+  if begin == end:
+    return
+  last_pos = 0
+  for entry in state:
+    pos = entry['pos']
+    if begin >= last_pos and begin < pos:
+      if end < pos:
+        # block doesn't cross any line boundary
+        entry['blocks'].append((begin, end))
+      else:
+        # block crosses the line boundary
+        entry['blocks'].append((begin, pos))
+        MarkBlock(state, pos, end)
+      break
+    last_pos = pos
+
+
+def GetBlocks(state):
+  """Returns all the blocks corresponding to the lines in the region.
+
+  Args:
+    state: the state returned by ConvertToSingleLine().
+
+  Returns:
+    An array of [(start_pos, length), ..] with an entry for each line in the
+    region.
+  """
+  result = []
+  last_pos = 0
+  for entry in state:
+    pos = entry['pos']
+    # Calculate block start points from the beginning of individual lines.
+    blocks = [(s[0]-last_pos, s[1]-s[0]) for s in entry['blocks']]
+    # Add one end marker block.
+    blocks.append((pos-last_pos, 0))
+    result.append(blocks)
+    last_pos = pos
+  return result
+
+
+def IntraRegionDiff(old_lines, new_lines, diff_params):
+  """Computes intra region diff.
+
+  Args:
+    old_lines: array of strings
+    new_lines: array of strings
+    diff_params: return value of GetDiffParams
+
+  Returns:
+    A tuple (old_blocks, new_blocks) containing matching blocks for old and new
+    lines.
+  """
+  old_line, old_state = ConvertToSingleLine(old_lines)
+  new_line, new_state = ConvertToSingleLine(new_lines)
+  old_blocks, new_blocks, ratio = IntraLineDiff(old_line, new_line, diff_params)
+  for begin, length in old_blocks:
+    MarkBlock(old_state, begin, begin+length)
+  old_blocks = GetBlocks(old_state)
+
+  for begin, length in new_blocks:
+    MarkBlock(new_state, begin, begin+length)
+  new_blocks = GetBlocks(new_state)
+
+  return (old_blocks, new_blocks, ratio)
+
+
+def NormalizeBlocks(blocks, line):
+  """Normalizes block representation of an intra line diff.
+
+  One diff can have multiple representations. Some times the diff returned by
+  the difflib for similar text sections is different even within same region.
+  For example if 2 already indented lines were indented with one additional
+  space character, the difflib may return the non matching space character to
+  be any of the already existing spaces. So one line may show non matching
+  space character as the first space character and the second line may show it
+  to be the last space character. This is sometimes confusing. This is the
+  side effect of the new regular expression we are using in WordDiff for
+  identifying indvidual words. This regular expression ('b') treats a sequence
+  of punctuation and whitespace characters as individual characters. It has
+  some visual advantages for showing a character level punctuation change as
+  one character change rather than a group of character change.
+
+  Making the normalization too generic can have performance implications. So
+  this implementation of normalize blocks intends to handle only one case.
+  Let's say S represents the space character and () marks a matching block.
+  Then the normalize operation will do following:
+
+     SSSS(SS)(ABCD) => SSSS(SS)(ABCD)
+     (SS)SSSS(ABCD) => SSSS(SS)(ABCD)
+     (SSSS)SS(ABCD) => SS(SSSS)(ABCD)
+
+     and so on..
+
+  Args:
+    blocks: An array of (offset, len) tuples defined on 'line'. These blocks
+            mark the matching areas. Anything between these matching blocks is
+            considered non-matching.
+    line: The text string on which the blocks are defined.
+
+  Returns:
+    An array of (offset, len) tuples representing the same diff but in
+    normalized form.
+  """
+  result = []
+  prev_start, prev_len = blocks[0]
+  for curr_start, curr_len in blocks[1:]:
+    # Note: nm_ is a prefix for non matching and m_ is a prefix for matching.
+    m_len, nm_len  = prev_len, curr_start - (prev_start+prev_len)
+    # This if condition checks if matching and non matching parts are greater
+    # than zero length and are comprised of spaces ONLY. The last condition
+    # deals with most of the observed cases of strange diffs.
+    # Note: curr_start - prev_start == m_l + nm_l
+    #       So line[prev_start:curr_start] == matching_part + non_matching_part.
+    text = line[prev_start:curr_start]
+    if m_len > 0 and nm_len > 0 and text == ' ' * len(text):
+      # Move the matching block towards the end i.e. normalize.
+      result.append((prev_start + nm_len, m_len))
+    else:
+      # Keep the existing matching block.
+      result.append((prev_start, prev_len))
+    prev_start, prev_len = curr_start, curr_len
+  result.append(blocks[-1])
+  assert len(result) == len(blocks)
+  return result
+
+
+def RenderIntraRegionDiff(lines, diff_blocks, tag, ratio, limit=80, indent=5,
+                          tabsize=8, mark_tabs=False, dbg=False):
+  """Renders intra region diff for one side.
+
+  Args:
+    lines: list of strings representing source code in the region
+    diff_blocks: blocks that were returned for this region by IntraRegionDiff()
+    tag: 'new' or 'old'
+    ratio: similarity ratio returned by the diff computing function
+    limit: folding limit
+    indent: indentation size
+    tabsize: the number of spaces that a tab represents
+    mark_tabs: if True, mark the first character of each expanded tab visually
+    dbg: indicates if debug information should be rendered
+
+  Returns:
+    A list of strings representing the rendered version of each item in input
+    'lines'.
+  """
+  result = []
+  dbg_info = None
+  if dbg:
+    dbg_info = 'Ratio: %.1f' % ratio
+  for line, blocks in zip(lines, diff_blocks):
+    blocks = NormalizeBlocks(blocks, line)
+    blocks = CompactBlocks(blocks)
+    diff = RenderIntraLineDiff(blocks,
+                               line,
+                               tag,
+                               dbg_info=dbg_info,
+                               limit=limit,
+                               indent=indent,
+                               tabsize=tabsize,
+                               mark_tabs=mark_tabs)
+    result.append(diff)
+  assert len(result) == len(lines)
+  return result
diff --git a/webapp/codereview/library.py b/webapp/codereview/library.py
new file mode 100644
index 0000000..82d6b29
--- /dev/null
+++ b/webapp/codereview/library.py
@@ -0,0 +1,207 @@
+# Copyright 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Django template library for Gerrit."""
+
+import cgi
+import logging
+
+from google.appengine.api import memcache
+from google.appengine.api import users
+
+import django.template
+import django.utils.safestring
+from django.utils.safestring import mark_safe
+from django.utils.timesince import timesince
+
+from memcache import CachedDict
+import models
+import view_util
+
+register = django.template.Library()
+
+class _CachedUser(object):
+  """Important data about an Account, pickled into memcache for
+     faster access when rendering pages to clients.
+  """
+  email = None
+  real_name = None
+  exists = False
+
+def _store_users(emails):
+  def _cache(pair):
+    email, account = pair
+    r = _CachedUser()
+    if account:
+      r.email = account.email
+      r.real_name = account.real_name
+      r.exists = account.real_name_entered
+    else:
+      r.email = email
+      r.real_name = email
+      if '@' in r.real_name:
+        r.real_name = r.real_name.split('@', 1)[0]
+    if r.real_name is None:
+      r.real_name = 'Unknown Person (%s)' % r.email
+    return r
+  all = zip(emails, models.Account.get_accounts_for_emails(emails))
+  return map(_cache, all)
+_user_cache = CachedDict(prefix = 'CachedUser:',
+                         compute_multi = _store_users,
+                         timeout = 300)
+
+def _to_email(u):
+  if isinstance(u, users.User):
+    return u.email()
+  return u
+
+def prefetch_names(emails):
+  _user_cache.prefetch(map(_to_email, emails))
+
+
+@register.filter
+def real_name(email, arg=None):
+  """Render an email address or a User object as a real_name.
+
+  If the input is a user object that equals the current user,
+  'me' is returned, unless the filter argument is non-empty.
+  Example:
+    {{foo|real_name}} may render 'me';
+    {{foo|real_name:"x"}} will never render 'me'.
+  """
+  return real_names([email], arg)
+
+@register.filter
+def real_names(email_list, arg=None):
+  """Render a list of email addresses or User objects as real_names.
+
+  Each list item is first formatter via the real_name() filter above,
+  and then the resulting strings are separated by commas.
+  The filter argument is the same as for real_name() above.
+  """
+  if arg:
+    user = None
+  else:
+    user = users.get_current_user()
+
+  email_list = map(_to_email, email_list)
+  all = _user_cache.get_multi(email_list)
+
+  names = []
+  for email in email_list:
+    if user and user.email() == email:
+      names.append('me')
+    else:
+      names.append(all[email].real_name)
+  return ', '.join(names)
+
+
+@register.filter
+def show_user(email, arg=None):
+  """Render a link to the user's dashboard, with text being
+     the real_name.
+  """
+  return show_users([email], arg)
+
+@register.filter
+def show_users(email_list, arg=None):
+  """Render list of links to each user's dashboard, with text
+     being the real_name.
+  """
+  if arg:
+    user = None
+  else:
+    user = users.get_current_user()
+
+  email_list = map(_to_email, email_list)
+  all = _user_cache.get_multi(email_list)
+
+  names = []
+  for email in email_list:
+    if user and user.email() == email:
+      names.append('me')
+    else:
+      u = all[email]
+      if u.exists:
+        names.append(
+          '<a href="/user/%(link)s"'
+          ' onMouseOver="M_showUserInfoPopup(this)">'
+          '%(name)s</a>'
+          % {'link': cgi.escape(u.email.replace('@',',,')),
+             'name': cgi.escape(u.real_name)}
+        )
+      else:
+        names.append(cgi.escape(u.real_name))
+  return mark_safe(', '.join(names))
+
+
+def _init_lgtm_text():
+  r = {}
+  for key, value in models.LGTM_CHOICES:
+    r[key] = value
+  return r
+_lgtm_text = _init_lgtm_text()
+
+@register.filter
+def review_status_text(status, arg=None):
+  try:
+    return _lgtm_text[status]
+  except KeyError:
+    return ''
+
+
+_lgtm_icon = {
+  'lgtm':    mark_safe('<img src="/static/check.png" />'),
+  'yes':     mark_safe('<font color="#08a400">+1</font>'),
+  'abstain': '',
+  'no':      mark_safe('<font color="#d10000"><b>-1</b></font>'),
+  'reject':  mark_safe('<img src="/static/x.png" />'),
+}
+
+@register.filter
+def review_status_icons(status, arg=None):
+  try:
+    return _lgtm_icon[status]
+  except KeyError:
+    return ''
+
+
+@register.filter
+def form_xsrf(url, arg=None):
+  x = view_util.xsrf_for(url)
+  return mark_safe('<input type="hidden" name="xsrf" value="%s" />' % x)
+
+@register.filter
+def bare_xsrf(url, arg=None):
+  return mark_safe(view_util.xsrf_for(url))
+
+_abbrev_units = {
+  'year': 'y',     'years': 'y',
+  'month': 'mo',   'months': 'm',
+  'week': 'w',     'weeks': 'w',
+  'day': 'd',      'days': 'd',
+  'hour': 'h',     'hours': 'h',
+  'minute': 'min', 'minutes': 'mins',
+}
+
+@register.filter
+def abbrevtimesince(d, arg=None):
+  r = []
+  for p in timesince(d).split(', '):
+    cnt, unit = p.split(' ', 2)
+    try:
+      r.append('%s %s' % (cnt, _abbrev_units[unit]))
+    except KeyError:
+      r.append(p)
+  return ', '.join(r)
diff --git a/webapp/codereview/memcache.py b/webapp/codereview/memcache.py
new file mode 100644
index 0000000..72bdfa2
--- /dev/null
+++ b/webapp/codereview/memcache.py
@@ -0,0 +1,156 @@
+# Copyright 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Utility support for dealing with memcache."""
+
+from google.appengine.api import memcache
+from google.appengine.runtime import DeadlineExceededError
+
+import cStringIO
+import pickle
+import zlib
+
+
+class Key(object):
+  def __init__(self, key, timeout=None, compress=False):
+    if compress:
+      key += '(z)'
+    self._key = key
+    self._timeout = timeout
+    self._compress = compress
+
+  def get(self, compute=None):
+    try:
+      r = memcache.get(self._key)
+      if r and self._compress:
+        r = pickle.load(cStringIO.StringIO(zlib.decompress(r)))
+    except DeadlineExceededError:
+      r = None
+
+    if r is not None:
+      return r
+
+    if compute is not None:
+      r = compute()
+      if r is not None:
+        self.set(r)
+    return r
+
+  def clear(self):
+    try:
+      memcache.delete(self._key)
+    except DeadlineExceededError:
+      pass
+
+  def set(self, value):
+    try:
+      if self._compress:
+        buf = cStringIO.StringIO()
+        pickle.dump(value, buf, -1)
+        value = zlib.compress(buf.getvalue())
+
+      if self._timeout is None:
+        memcache.set(self._key, value)
+      else:
+        memcache.set(self._key, value, self._timeout)
+    except DeadlineExceededError:
+      pass
+
+
+class CachedDict(object):
+  """A cache of zero or more memcache keys.  The dictionary of
+     acquired keys is also cached locally in this process, but
+     can be forcibly cleared by clear_local.
+  """
+  def __init__(self,
+               prefix,
+               timeout,
+               compute_one = None,
+               compute_multi = None):
+    self._prefix = prefix
+    self._timeout = timeout
+    self._cache = {}
+    self._prefetch = set()
+
+    if compute_multi:
+      self._compute = compute_multi
+    elif compute_one:
+      self._compute = lambda x: map(compute_one, x)
+    else:
+      raise ValueError, 'compute_one or compute_multi required'
+
+  def prefetch(self, keys):
+    for item_key in keys:
+      if item_key not in self._cache:
+        self._prefetch.add(item_key)
+
+  def get_multi(self, keys):
+    result = {}
+
+    not_local = []
+    for item_key in keys:
+      try:
+        result[item_key] = self._cache[item_key]
+      except KeyError:
+        not_local.append(item_key)
+
+    if not_local:
+      to_get = []
+      to_get.extend(not_local)
+      to_get.extend(self._prefetch)
+      self._prefetch = set()
+
+      try:
+        cached = memcache.get_multi(to_get, self._prefix)
+      except DeadlineExceededError:
+        cached = {}
+
+      to_compute = []
+      for item_key in to_get:
+        try:
+          r = cached[item_key]
+        except KeyError:
+          to_compute.append(item_key)
+          continue
+        self._cache[item_key] = r
+        result[item_key] = r
+
+      if to_compute:
+        to_cache = {}
+        for item_key, r in zip(to_compute, self._compute(to_compute)):
+          if r is not None:
+            to_cache[item_key] = r
+          self._cache[item_key] = r
+          result[item_key] = r
+
+        if to_cache:
+          try:
+            memcache.set_multi(to_cache, self._timeout, self._prefix)
+          except DeadlineExceededError:
+            pass
+    return result
+
+  def get(self, key):
+    return get_multi([key])[key]
+
+  def clear_local(self):
+    self._cache = {}
+    self._prefetch = set()
+
+  def clear(self):
+    try:
+      memcache.delete_multi(self._prefix)
+    except DeadlineExceededError:
+      pass
+    self.clear_local()
diff --git a/webapp/codereview/middleware.py b/webapp/codereview/middleware.py
new file mode 100644
index 0000000..165f5cd
--- /dev/null
+++ b/webapp/codereview/middleware.py
@@ -0,0 +1,71 @@
+# Copyright 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Custom middleware.  Some of this may be generally useful."""
+
+import logging
+import time
+
+from google.appengine.api import users
+from django.utils.http import http_date
+
+import models
+import view_util
+import library
+
+class NoCacheMiddleware(object):
+  """Set the cache-control and expires headers."""
+
+  def process_response(self, request, response):
+    response['Cache-Control'] = 'no-cache'
+    response['Expires'] = http_date(time.time() - 1)
+    return response
+
+
+class ClearXsrfKeyMiddleware(object):
+  """Sets the xsrf_key to None so it can later be read."""
+
+  def process_request(self, request):
+    view_util._xsrf_key = None
+    view_util._xsrf_now = None
+    view_util._xsrf_cache = {}
+    library._user_cache.clear_local()
+
+
+class AddUserToRequestMiddleware(object):
+  """Add a user object and a user_is_admin flag to each request."""
+
+  def process_request(self, request):
+    request.user = users.get_current_user()
+    if request.user:
+      request.is_gae_admin = users.is_current_user_admin()
+      request.user_is_admin = models.AccountGroup.is_user_admin(request.user)
+      request.projects_owned_by_user = models.Project.projects_owned_by_user(
+          request.user)
+      request.show_admin_tab = (request.user_is_admin
+          or len(request.projects_owned_by_user) > 0)
+    else:
+      request.is_gae_admin = False
+      request.user_is_admin = False
+      request.projects_owend_by_user = set()
+      request.show_admin_tab = False
+
+    # Update the cached value of the current user's Account
+    account = None
+    if request.user is not None:
+      account = models.Account.get_account_for_user(request.user)
+      request.account = account
+    else:
+      request.account = None
+    models.Account.current_user_account = account
diff --git a/webapp/codereview/models.py b/webapp/codereview/models.py
new file mode 100644
index 0000000..60a0515
--- /dev/null
+++ b/webapp/codereview/models.py
@@ -0,0 +1,1480 @@
+# Copyright 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""App Engine data model (schema) definition for Gerrit."""
+
+# Python imports
+import base64
+import datetime
+import hashlib
+import logging
+import random
+import re
+import zlib
+
+# AppEngine imports
+from google.appengine.ext import db
+from google.appengine.api import memcache
+from google.appengine.api import users
+
+# Local imports
+from memcache import Key as MemCacheKey
+import patching
+
+
+DEFAULT_CONTEXT = 10
+CONTEXT_CHOICES = (3, 10, 25, 50, 75, 100)
+FETCH_MAX = 1000
+MAX_DELTA_DEPTH = 10
+
+LGTM_CHOICES = (
+    ('lgtm', 'Looks good to me, approved.'),
+    ('yes', 'Looks good to me, but someone else must approve.'),
+    ('abstain', 'No score.'),
+    ('no', 'I would prefer that you didn\'t submit this.'),
+    ('reject', 'Do not submit.'),
+  )
+LIMITED_LGTM_CHOICES = [choice for choice in LGTM_CHOICES
+        if choice[0] != 'lgtm' and choice[0] != 'reject']
+
+### GQL query cache ###
+
+
+_query_cache = {}
+
+class BackedUpModel(db.Model):
+  """Base class for our models that keeps a property used for backup."""
+
+  last_backed_up = db.IntegerProperty(default=0)
+
+  def __init__(self, *args, **kwargs):
+    db.Model.__init__(self, *args, **kwargs)
+
+def gql(cls, clause, *args, **kwds):
+  """Return a query object, from the cache if possible.
+
+  Args:
+    cls: a BackedUpModel subclass.
+    clause: a query clause, e.g. 'WHERE draft = TRUE'.
+    *args, **kwds: positional and keyword arguments to be bound to the query.
+
+  Returns:
+    A db.GqlQuery instance corresponding to the query with *args and
+    **kwds bound to the query.
+  """
+  query_string = 'SELECT * FROM %s %s' % (cls.kind(), clause)
+  query = _query_cache.get(query_string)
+  if query is None:
+    _query_cache[query_string] = query = db.GqlQuery(query_string)
+  query.bind(*args, **kwds)
+  return query
+
+
+### Exceptions ###
+
+class InvalidLgtmException(Exception):
+  """User is not alloewd to LGTM this change."""
+
+class InvalidVerifierException(Exception):
+  """User is not alloewd to verify this change."""
+
+class InvalidSubmitMergeException(Exception):
+  """The change cannot me scheduled for merge."""
+
+class DeltaPatchingException(Exception):
+  """Applying a patch yield the wrong hash."""
+
+
+### Settings ###
+
+def _genkey(n=26):
+  k = ''.join(map(chr, (random.randrange(256) for i in xrange(n))))
+  return base64.b64encode(k)
+
+class Settings(BackedUpModel):
+  """Global settings for the application instance."""
+
+  analytics = db.StringProperty()
+  internal_api_key = db.StringProperty()
+  xsrf_key = db.StringProperty()
+  from_email = db.StringProperty()
+
+  _Key = MemCacheKey('Settings_Singleton')
+
+  @classmethod
+  def get_settings(cls):
+    """Get the Settings singleton.
+
+    If possible, get it from memcache.  If it's not there, it tries to do a 
+    normal get().  Only if that fails does it call get_or_insert, because of
+    possible contention errors due to get_or_insert's transaction.
+    """
+    def read():
+      result = cls.get_by_key_name('settings')
+      if result:
+        return result
+      else:
+        return cls.get_or_insert('settings',
+                                  internal_api_key=_genkey(26),
+                                  xsrf_key=_genkey(26))
+    return Settings._Key.get(read)
+
+  def put(self):
+    BackedUpModel.put(self)
+    self._Key.clear()
+
+
+### Approval rights ###
+
+def _flatten_users_and_groups(users, groups):
+  """Returns a set of the users and the groups provided"""
+  result = set()
+  for user in users:
+    result.add(user)
+  if groups:
+    for group in db.get(groups):
+      for user in group.members:
+        result.add(user)
+  return result
+
+
+class ApprovalRight(BackedUpModel):
+  """The tuple of a set of path patterns and a set of users who can approve
+  changes for those paths."""
+  files = db.StringListProperty()
+  approvers_users = db.ListProperty(users.User)
+  approvers_groups = db.ListProperty(db.Key)
+  verifiers_users = db.ListProperty(users.User)
+  verifiers_groups = db.ListProperty(db.Key)
+  required = db.BooleanProperty()
+
+  def approvers(self):
+    """Returns a set of the users who are approvers."""
+    return _flatten_users_and_groups(self.approvers_users,
+        self.approvers_groups)
+
+  def verifiers(self):
+    """Returns a set of the users who are verifiers."""
+    return _flatten_users_and_groups(self.verifiers_users,
+        self.verifiers_groups)
+
+  @classmethod
+  def validate_file(cls, file):
+    """Returns whether this is a valid file path.
+    
+    The rules:
+      - The length must be > 0
+      - The file path must start with a '/'
+      - The file path must contain either 0 or 1 '...'
+      - If it contains one '...', it must either be last or directly
+        after the first '/'
+        
+        These last two limitations could be removed someday but are
+        good enough for now.
+    """
+    if len(file) == 0:
+      return False
+    if file[0] != '/':
+      return False
+    (before, during, after) = file.partition("...")
+    if during == "" and after == "":
+      return True
+    if before != "/":
+      return False
+    if after.find("...") != -1:
+      return False
+    return True
+
+### Projects ###
+
+class Project(BackedUpModel):
+  """An open source project.
+
+  Projects have owners who can set approvers and stuff.
+  """
+
+  name = db.StringProperty(required=True)
+  comment = db.StringProperty(required=False)
+  owners_users = db.ListProperty(users.User)
+  owners_groups = db.ListProperty(db.Key)
+  code_reviews = db.ListProperty(db.Key)
+
+  @classmethod
+  def get_all_projects(cls):
+    """Return all projects"""
+    all = cls.all()
+    all.order('name')
+    return list(all)
+
+  @classmethod
+  def get_project_for_name(cls, name):
+    return cls.gql('WHERE name=:name', name=name).get()
+
+  def remove(self):
+    """delete this project"""
+    db.delete(ApprovalRight.get(self.code_reviews))
+    self.delete()
+
+  def set_code_reviews(self, approval_right_keys):
+    for key in self.code_reviews:
+      val = ApprovalRight.get(key)
+      if val:
+        db.delete(val)
+    self.code_reviews = approval_right_keys
+
+  def get_code_reviews(self):
+    return [ApprovalRight.get(key) for key in self.code_reviews]
+
+  def is_code_reviewed(self):
+    return True
+
+  def put(self):
+    memcache.flush_all()
+    BackedUpModel.put(self)
+
+  @classmethod
+  def projects_owned_by_user(cls, user):
+    memcache.flush_all()
+    key = "projects_owned_by_user_%s" % user.email()
+    result = memcache.get(key)
+    if result is None:
+      result = set(
+          Project.gql("WHERE owner_users=:user", user=user).fetch(1000))
+      groups = AccountGroup.gql("WHERE members=:user", user=user).fetch(1000)
+      if groups:
+        pr = Project.gql(
+            "WHERE owners_groups IN :groups",
+            groups=[g.key() for g in groups]).fetch(1000)
+        result.update(pr)
+      memcache.set(key, [p.key() for p in result])
+    return result
+
+
+class Branch(BackedUpModel):
+  """A branch in a specific Project."""
+
+  project = db.ReferenceProperty(Project, required=True)
+  name = db.StringProperty(required=True) # == key
+
+  status = db.StringProperty(choices=('NEEDS_MERGE',
+                                      'MERGING',
+                                      'BUILDING'))
+  merge_submitted = db.DateTimeProperty()
+  to_merge = db.ListProperty(db.Key) # PatchSets
+  merging = db.ListProperty(db.Key) # PatchSets
+  waiting = db.ListProperty(db.Key) # PatchSets
+
+  @classmethod
+  def get_or_insert_branch(cls, project, name):
+    key = 'p.%s %s' % (project.key().id(), name)
+    return cls.get_or_insert(key, project=project, name=name)
+
+  @classmethod
+  def get_branch_for_name(cls, project, name):
+    key = 'p.%s %s' % (project.key().id(), name)
+    return cls.get_by_key_name(key)
+
+  @property
+  def short_name(self):
+    if self.name.startswith("refs/heads/"):
+      return self.name[len("refs/heads/"):]
+    return self.name
+
+  def is_code_reviewed(self):
+    return True
+
+  def merge_patchset(self, patchset):
+    """Add a patchset to the end of the branch's merge queue
+
+    This method runs in an independent transaction.
+    """
+    ps_key = patchset.key()
+    def trans(key):
+      b = db.get(key)
+      if not ps_key in b.to_merge:
+        b.to_merge.append(ps_key)
+        if b.status is None:
+          b.status = 'NEEDS_MERGE'
+          b.merge_submitted = datetime.datetime.now()
+        b.put()
+    db.run_in_transaction(trans, self.key())
+
+  def begin_merge(self):
+    """Lock this branch and start merging patchsets.
+
+    This method runs in an independent transaction.
+    """
+    def trans(key):
+      b = db.get(key)
+      if b.status == 'NEEDS_MERGE':
+        b.status = 'MERGING'
+        b.merging.extend(b.waiting)
+        b.merging.extend(b.to_merge)
+        b.waiting = []
+        b.to_merge = []
+        b.put()
+        return b.merging
+      return []
+    keys = db.run_in_transaction(trans, self.key())
+    objs = db.get(keys)
+
+    good = []
+    torm = []
+    for k, o in zip(keys, objs):
+      if o:
+        good.append(o)
+      else:
+        torm.append(k)
+
+    if torm:
+      def clear_branch(key):
+        b = db.get(key)
+
+        for ps_key in torm:
+          if ps_key in b.merging:
+            b.merging.remove(ps_key)
+
+        if not good and b.status in ('MERGING', 'BUILDING'):
+          if b.to_merge:
+            b.status = 'NEEDS_MERGE'
+          else:
+            b.status = None
+
+        b.put()
+      db.run_in_transaction(clear_branch, self.key())
+    return good
+
+  def finish_merge(self, success, fail, defer):
+    """Update our patchset lists with the results of a merge.
+
+    This method runs in an independent transaction.
+    """
+    def trans(key):
+      b = db.get(key)
+
+      rm = []
+      rm.extend(success)
+      rm.extend(fail)
+      for ps in rm:
+        ps_key = ps.key()
+
+        if ps_key in b.to_merge:
+          b.to_merge.remove(ps_key)
+        if ps_key in b.merging:
+          b.merging.remove(ps_key)
+        if ps_key in b.waiting:
+          b.waiting.remove(ps_key)
+
+      for ps in defer:
+        ps_key = ps.key()
+
+        if ps_key in b.to_merge:
+          b.to_merge.remove(ps_key)
+        if ps_key in b.merging:
+          b.merging.remove(ps_key)
+        if ps_key not in b.waiting:
+          b.waiting.append(ps_key)
+
+      b.put()
+    db.run_in_transaction(trans, self.key())
+
+  def merged(self, merged):
+    """Updates the branch to include pending PatchSets.
+
+    This method runs in an independent transaction.
+    """
+    def trans(key):
+      b = db.get(key)
+
+      for ps in merged:
+        ps_key = ps.key()
+
+        if ps_key in b.to_merge:
+          b.to_merge.remove(ps_key)
+        if ps_key in b.merging:
+          b.merging.remove(ps_key)
+        if ps_key in b.waiting:
+          b.waiting.remove(ps_key)
+
+      if b.status in ('MERGING', 'BUILDING'):
+        if b.to_merge:
+          b.status = 'NEEDS_MERGE'
+        else:
+          b.status = None
+      b.put()
+    db.run_in_transaction(trans, self.key())
+
+
+### Revisions ###
+
+class RevisionId(BackedUpModel):
+  """A specific revision of a project."""
+
+  project = db.ReferenceProperty(Project, required=True)
+  id = db.StringProperty(required=True) # == key
+
+  author_name = db.StringProperty()
+  author_email = db.EmailProperty()
+  author_when = db.DateTimeProperty()
+  author_tz = db.IntegerProperty()
+
+  committer_name = db.StringProperty()
+  committer_email = db.EmailProperty()
+  committer_when = db.DateTimeProperty()
+  committer_tz = db.IntegerProperty()
+
+  ancestors = db.StringListProperty() # other RevisionId.id
+  message = db.TextProperty()
+
+  patchset_key = db.StringProperty()
+  def _get_patchset(self):
+    try:
+      return self._patchset_obj
+    except AttributeError:
+      k_str = self._patchset_key
+      if k_str:
+        self._patchset_obj = db.get(db.Key(k_str))
+      else:
+        self._patchset_obj = None
+    return self._patchset_obj
+
+  def _set_patchset(self, p):
+    if p is None:
+      self._patchset_key = None
+      self._patchset_obj = None
+    else:
+      self._patchset_key = str(p.key())
+      self._patchset_obj = p
+  patchset = property(_get_patchset, _set_patchset)
+
+  @classmethod
+  def get_or_insert_revision(cls, project, id, **kw):
+    key = 'p.%s %s' % (project.key().id(), id)
+    return cls.get_or_insert(key, project=project, id=id, **kw)
+
+  @classmethod
+  def get_revision(cls, project, id):
+    key = 'p.%s %s' % (project.key().id(), id)
+    return cls.get_by_key_name(key)
+
+  @classmethod
+  def get_for_patchset(cls, patchset):
+    """Get all revisions linked to a patchset.
+    """
+    return gql(cls, 'WHERE patchset_key = :1', str(patchset.key()))
+
+  def add_ancestor(self, other_id):
+    """Adds the other revision as an ancestor for this one.
+
+    If the other rev is already in the list, does nothing.
+    """
+    if not other_id in self.ancestors:
+      self.ancestors.append(other_id)
+
+  def remove_ancestor(self, other_id):
+    """Removes an ancestor previously stored.
+
+    If the other rev is not already in the list, does nothing.
+    """
+    if other_id in self.ancestors:
+      self.ancestors.remove(other_id)
+
+  def get_ancestors(self):
+    """Fully fetches all ancestors from the data store.
+    """
+    p_id = self.project.key().id()
+    names = ['p.%s %s' % (p_id, i) for i in self.ancestors]
+    return [r for r in RevisionId.get_by_key_name(names) if r]
+
+  def get_children(self):
+    """Obtain the revisions that depend upon this one.
+    """
+    return gql(RevisionId,
+               'WHERE project = :1 AND ancestors = :2',
+               self.project, self.id)
+
+  def link_patchset(self, new_patchset):
+    """Uniquely connect one patchset to this revision.
+
+    Returns True if the passed patchset is the single patchset;
+    False if another patchset has already been linked onto it.
+    """
+    def trans(self_key):
+      c = db.get(self_key)
+      if c.patchset is None:
+        c.patchset = new_patchset
+        c.put()
+        return True
+      return False
+    return db.run_in_transaction(trans, self.key())
+
+
+class BuildAttempt(BackedUpModel):
+  """A specific build attempt."""
+
+  branch = db.ReferenceProperty(Branch, required=True)
+  revision_id = db.StringProperty(required=True)
+  new_changes = db.ListProperty(db.Key) # PatchSet
+
+  started = db.DateTimeProperty(auto_now_add=True)
+  finished = db.BooleanProperty(default=False)
+  success = db.BooleanProperty()
+
+
+### Changes, PatchSets, Patches, DeltaContents, Comments, Messages ###
+
+class Change(BackedUpModel):
+  """The major top-level entity.
+
+  It has one or more PatchSets as its descendants.
+  """
+
+  subject = db.StringProperty(required=True)
+  description = db.TextProperty()
+  owner = db.UserProperty(required=True)
+  created = db.DateTimeProperty(auto_now_add=True)
+  modified = db.DateTimeProperty(auto_now=True)
+  reviewers = db.ListProperty(db.Email)
+  claimed = db.BooleanProperty(default=False)
+  cc = db.ListProperty(db.Email)
+  closed = db.BooleanProperty(default=False)
+  n_comments = db.IntegerProperty(default=0)
+  n_patchsets = db.IntegerProperty(default=0)
+
+  dest_project = db.ReferenceProperty(Project, required=True)
+  dest_branch = db.ReferenceProperty(Branch, required=True)
+
+  merge_submitted = db.DateTimeProperty()
+  merged = db.BooleanProperty(default=False)
+
+  emailed_clean_merge = db.BooleanProperty(default=False)
+  emailed_missing_dependency = db.BooleanProperty(default=False)
+  emailed_path_conflict = db.BooleanProperty(default=False)
+
+  merge_patchset_key = db.StringProperty()
+  def _get_merge_patchset(self):
+    try:
+      return self._merge_patchset_obj
+    except AttributeError:
+      k_str = self._merge_patchset_key
+      if k_str:
+        self._merge_patchset_obj = db.get(db.Key(k_str))
+      else:
+        self._merge_patchset_obj = None
+    return self._merge_patchset_obj
+
+  def _set_merge_patchset(self, p):
+    if p is None:
+      self._merge_patchset_key = None
+      self._merge_patchset_obj = None
+    else:
+      self._merge_patchset_key = str(p.key())
+      self._merge_patchset_obj = p
+  merge_patchset = property(_get_merge_patchset, _set_merge_patchset)
+
+  _is_starred = None
+
+  @property
+  def is_starred(self):
+    """Whether the current user has this change starred."""
+    if self._is_starred is not None:
+      return self._is_starred
+    account = Account.current_user_account
+    self._is_starred = account is not None and self.key().id() in account.stars
+    return self._is_starred
+
+  def update_comment_count(self, n):
+    """Increment the n_comments property by n.
+    """
+    self.n_comments += n
+
+  @property
+  def num_comments(self):
+    """The number of non-draft comments for this change.
+
+    This is almost an alias for self.n_comments, except that if
+    n_comments is None, it is computed through a query, and stored,
+    using n_comments as a cache.
+    """
+    return self.n_comments
+
+  _num_drafts = None
+
+  @property
+  def num_drafts(self):
+    """The number of draft comments on this change for the current user.
+
+    The value is expensive to compute, so it is cached.
+    """
+    if self._num_drafts is None:
+      account = Account.current_user_account
+      if account is None:
+        self._num_drafts = 0
+      else:
+        query = gql(Comment,
+            'WHERE ANCESTOR IS :1 AND author = :2 AND draft = TRUE',
+            self, account.user)
+        self._num_drafts = query.count()
+    return self._num_drafts
+
+  def new_patchset(self, **kw):
+    """Construct a new patchset for this change.
+    """
+    def trans(change_key):
+      change = db.get(change_key)
+      change.n_patchsets += 1
+      id = change.n_patchsets
+      change.put()
+
+      patchset = PatchSet(change=change, parent=change, id=id, **kw)
+      patchset.put()
+      return patchset
+    return db.run_in_transaction(trans, self.key())
+
+  def set_review_status(self, user):
+    """Gets or inserts the ReviewStatus object for the suppiled user."""
+    return ReviewStatus.get_or_insert_status(self, user)
+
+  def get_review_status(self, user=None):
+    """Return the lgtm status for the given user if supplied.  All for this 
+    change otherwise."""
+    if user:
+      # The owner must be checked separately because she automatically
+      # approves / verifies her own change and there is no ReviewStatus
+      # for that one.
+      if user == self.owner:
+        return []
+      return ReviewStatus.get_status_for_user(self, user)
+    else:
+      return ReviewStatus.all_for_change(self)
+
+  @classmethod
+  def get_reviewer_status(cls, reviews):
+    """Return a tuple of who has commented on the changes.
+
+    The owner of the change is automatically added to the list
+
+    Args:
+      reviews  a list of ReviewStatus objects are returned from
+               get_review_status().
+
+    Returns:
+      A map of the LGTM_CHOICES keys to users, plus the mapping
+          verified_by --> the uesrs who verified it
+    """
+    result = {}
+    for (k,v) in LGTM_CHOICES:
+      result[k] = [r.user for r in reviews if r.lgtm == k]
+    result["verified_by"] = [r.user for r in reviews if r.verified]
+    return result
+
+  @property
+  def is_submitted(self):
+    """Return true if the change has been submitted for merge.
+    """
+    return self.merge_submitted is not None
+
+  def submit_merge(self, patchset):
+    """Schedule a specific patchset of the change to be merged.
+    """
+    branch = self.dest_branch
+    if not branch:
+      raise InvalidSubmitMergeException, 'No branch defined'
+
+    if self.merged:
+      raise InvalidSubmitMergeException, 'Already merged'
+
+    if self.is_submitted:
+      raise InvalidSubmitMergeException, \
+        "Already merging patch set %s" % self.merge_patchset.id
+
+    branch.merge_patchset(patchset)
+    self.merge_submitted = datetime.datetime.now()
+    self.merge_patchset = patchset
+    self.emailed_clean_merge = False
+    self.emailed_missing_dependency = False
+    self.emailed_path_conflict = False
+
+  def unsubmit_merge(self):
+    """Unschedule a merge of this change.
+    """
+    if self.merged:
+      raise InvalidSubmitMergeException, 'Already merged'
+
+    self.merge_submitted = None
+    self.merge_patchset = None
+
+  def set_reviewers(self, reviewers):
+    self.reviewers = reviewers
+    self.claimed = len(reviewers) != 0
+
+
+class PatchSetFilenames(BackedUpModel):
+  """A list of the file names in a PatchSet.
+
+  This is a descendant of a PatchSet.
+  """
+
+  compressed_filenames = db.BlobProperty()
+
+  @classmethod
+  def _mc(cls, patchset):
+    return MemCacheKey("PatchSet %s filenames" % patchset.key())
+
+  @classmethod
+  def store_compressed(cls, patchset, bin):
+    cls(key_name = 'filenames',
+        compressed_filenames = db.Blob(bin),
+        parent = patchset).put()
+    cls._mc(patchset).set(cls._split(bin))
+
+  @classmethod
+  def get_list(cls, patchset):
+    def read():
+      c = cls.get_by_key_name('filenames', parent = patchset)
+      if c:
+        return cls._split(c.compressed_filenames)
+      names = patchset._all_filenames()
+      bin = zlib.compress("\0".join(names).encode('utf_8'), 9)
+      cls(key_name = 'filenames',
+          compressed_filenames = db.Blob(bin),
+          parent = patchset).put()
+      return names
+    return cls._mc(patchset).get(read)
+
+  @classmethod
+  def _split(cls, bin):
+    tmp = zlib.decompress(bin).split("\0")
+    return [s.decode('utf_8') for s in tmp]
+
+
+class PatchSet(BackedUpModel):
+  """A set of patchset uploaded together.
+
+  This is a descendant of an Change and has Patches as descendants.
+  """
+
+  id = db.IntegerProperty(required=True)
+  change = db.ReferenceProperty(Change, required=True) # == parent
+  message = db.StringProperty()
+  owner = db.UserProperty(required=True)
+  created = db.DateTimeProperty(auto_now_add=True)
+  modified = db.DateTimeProperty(auto_now=True)
+  revision = db.ReferenceProperty(RevisionId, required=True)
+  complete = db.BooleanProperty(default=False)
+
+  _filenames = None
+
+  @property
+  def filenames(self):
+    if self._filenames is None:
+      self._filenames = PatchSetFilenames.get_list(self)
+    return self._filenames
+
+  def _all_filenames(self):
+    last = ''
+    names = []
+    while True:
+      list = gql(Patch,
+                 'WHERE patchset = :1 AND filename > :2'
+                 ' ORDER BY filename',
+                 self, last).fetch(500)
+      if not list:
+        break
+      for p in list:
+        names.append(p.filename)
+      last = list[-1].filename
+    return names
+
+
+class Message(BackedUpModel):
+  """A copy of a message sent out in email.
+
+  This is a descendant of an Change.
+  """
+
+  change = db.ReferenceProperty(Change, required=True)  # == parent
+  subject = db.StringProperty()
+  sender = db.EmailProperty()
+  recipients = db.ListProperty(db.Email)
+  date = db.DateTimeProperty(auto_now_add=True)
+  text = db.TextProperty()
+
+
+class CachedDeltaContent(object):
+  """A fully inflated DeltaContent stored in memcache.
+  """
+  def __init__(self, dc):
+    self.data_lines = dc.data_lines
+    self.patch_lines = dc.patch_lines
+    self.is_patch = dc.is_patch
+    self.is_data = dc.is_data
+
+  @property
+  def data_text(self):
+    if self.data_lines is None:
+      return None
+    return ''.join(self.data_lines)
+
+  @property
+  def patch_text(self):
+    if self.patch_lines is None:
+      return None
+    return ''.join(self.patch_lines)
+
+  @classmethod
+  def get(cls, key):
+    def load():
+      dc = db.get(key)
+      if dc:
+        return cls(dc)
+      return None
+    return MemCacheKey('DeltaContent:%s' % key.name(),
+                       compress = True).get(load)
+
+
+def _apply_patch(old_lines, patch_name, dif_lines):
+  new_lines = []
+  chunks = patching.ParsePatchToChunks(dif_lines, patch_name)
+  for tag, old, new in patching.PatchChunks(old_lines, chunks):
+    new_lines.extend(new)
+  return ''.join(new_lines)
+
+def _blob_hash(data):
+  m = hashlib.sha1()
+  m.update("blob %d\0" % len(data))
+  m.update(data)
+  return m.hexdigest()
+
+
+class DeltaContent(BackedUpModel):
+  """Any content, such as for the old or new image of a Patch,
+     or the patch data itself.
+
+     These are stored as top-level entities.
+
+     Key:
+        Git blob SHA-1 of inflate(text)
+      -or-
+        Randomly generated name if this is a patch
+  """
+
+  text_z = db.BlobProperty(required=True)
+  depth = db.IntegerProperty(default=0, required=True)
+  base = db.SelfReferenceProperty()
+
+  _data_lines = None
+  _data_text = None
+  _patch_text = None
+  _patch_lines = None
+
+  @classmethod
+  def create_patch(cls, id, text_z):
+    key_name = 'patch:%s' % id
+    return cls.get_or_insert(key_name,
+                             text_z = db.Blob(text_z),
+                             depth = 0,
+                             base = None)
+
+  @classmethod
+  def create_content(cls, id, text_z, base = None):
+    """Create (or lookup and return an existing) content instance.
+
+       Arguments:
+        id:
+          Git blob SHA-1 hash of the fully inflated content.
+        text_z:
+          If base is None this is the deflated content whose hash
+          is id.
+
+          If base is supplied this is a patch which when applied to
+          base yields the content whose hash is id.
+        base:
+          The base content if text_z is a patch.
+    """
+    key_name = 'content:%s' % id
+    r = cls.get_by_key_name(key_name)
+    if r:
+      return r
+
+    if base is None:
+      return cls.get_or_insert(key_name,
+                               text_z = db.Blob(text_z),
+                               depth = 0,
+                               base = None)
+
+    my_text = _apply_patch(base.data_lines,
+                           id,
+                           zlib.decompress(text_z).splitlines(True))
+    cmp_id = _blob_hash(my_text)
+    if id != cmp_id:
+      raise DeltaPatchingException()
+
+    if base.depth < MAX_DELTA_DEPTH:
+      return cls.get_or_insert(key_name,
+                               text_z = db.Blob(text_z),
+                               depth = base.depth + 1,
+                               base = base)
+    return cls.get_or_insert(key_name,
+                             text_z = db.Blob(zlib.compress(my_text)),
+                             depth = 0,
+                             base = None)
+
+  @property
+  def is_patch(self):
+    return self._base or self.key().name().startswith('patch:')
+
+  @property
+  def is_data(self):
+    return self.key().name().startswith('content:')
+
+  @property
+  def data_text(self):
+    if self._data_text is None:
+      if self._base:
+        base = CachedDeltaContent.get(self._base)
+        raw = _apply_patch(base.data_lines,
+                           self.key().name(),
+                           self.patch_lines)
+      else:
+        raw = zlib.decompress(self.text_z)
+      self._data_text = raw
+    return self._data_text
+
+  @property
+  def data_lines(self):
+    if self._data_lines is None:
+      self._data_lines = self.data_text.splitlines(True)
+    return self._data_lines
+
+  @property
+  def patch_text(self):
+    if not self.is_patch:
+      return None
+    if self._patch_text is None:
+      self._patch_text = zlib.decompress(self.text_z)
+    return self._patch_text
+
+  @property
+  def patch_lines(self):
+    if not self.is_patch:
+      return None
+    if self._patch_lines is None:
+      self._patch_lines = self.patch_text.splitlines(True)
+    return self._patch_lines
+
+
+class Patch(BackedUpModel):
+  """A single patch, i.e. a set of changes to a single file.
+
+  This is a descendant of a PatchSet.
+  """
+
+  patchset = db.ReferenceProperty(PatchSet, required=True)  # == parent
+  filename = db.StringProperty(required=True)
+  status = db.StringProperty(required=True)  # 'A', 'M', 'D'
+  n_comments = db.IntegerProperty()
+
+  old_data = db.ReferenceProperty(DeltaContent, collection_name='olddata_set')
+  new_data = db.ReferenceProperty(DeltaContent, collection_name='newdata_set')
+  diff_data = db.ReferenceProperty(DeltaContent, collection_name='diffdata_set')
+
+  @classmethod
+  def get_or_insert_patch(cls, patchset, filename, **kw):
+    """Get or insert the patch for a specific file path.
+
+    This method runs in an independent transaction.
+    """
+    m = hashlib.sha1()
+    m.update(filename)
+    key = 'z%s' % m.hexdigest()
+    return cls.get_or_insert(key,
+                             parent = patchset,
+                             patchset = patchset,
+                             filename = filename,
+                             **kw)
+
+  @classmethod
+  def get_patch(cls, parent, id_str):
+    if id_str.startswith('z'):
+      return cls.get_by_key_name(id_str, parent=parent);
+    else:
+      return cls.get_by_id(int(id_str), parent=parent);
+
+  @property
+  def id(self):
+    return str(self.key().id_or_name())
+
+  @property
+  def num_comments(self):
+    """The number of non-draft comments for this patch.
+    """
+    return self.n_comments
+
+  def update_comment_count(self, n):
+    """Increment the n_comments property by n.
+    """
+    self.n_comments += n
+
+  _num_drafts = None
+
+  @property
+  def num_drafts(self):
+    """The number of draft comments on this patch for the current user.
+
+    The value is expensive to compute, so it is cached.
+    """
+    if self._num_drafts is None:
+      user = Account.current_user_account
+      if user is None:
+        self._num_drafts = 0
+      else:
+        query = gql(Comment,
+                    'WHERE patch = :1 AND draft = TRUE AND author = :2',
+                    self, user.user)
+        self._num_drafts = query.count()
+    return self._num_drafts
+
+  def _data(self, name):
+    prop = '_%s_CachedDeltaContent' % name
+    try:
+      c = getattr(self, prop)
+    except AttributeError:
+      # XXX Using internal knowledge about db package:
+      # Key for ReferenceProperty 'foo' is '_foo'.
+
+      data_key = getattr(self, '_%s_data' % name, None)
+      if data_key:
+        c = CachedDeltaContent.get(data_key)
+        if data_key in ('diff', 'new') \
+           and self._diff_data == self._new_data:
+          self._diff_CachedDeltaContent = c
+          self._new_CachedDeltaContent = c
+        else:
+          setattr(self, prop, c)
+      else:
+        c = None
+        setattr(self, prop, c)
+    return c
+
+  @property
+  def patch_text(self):
+    """Get the patch converting old_text to new_text.
+    """
+    return self._data('diff').patch_text
+
+  @property
+  def patch_lines(self):
+    """The patch_text split into lines, retaining line endings.
+    """
+    return self._data('diff').patch_lines
+
+  @property
+  def old_text(self):
+    """Original version of the file text.
+    """
+    d = self._data('old')
+    if d:
+      return d.data_text
+    return ''
+
+  @property
+  def old_lines(self):
+    """The old_text split into lines, retaining line endings.
+    """
+    d = self._data('old')
+    if d:
+      return d.data_lines
+    return []
+
+  @property
+  def new_text(self):
+    """Get self.new_content
+    """
+    d = self._data('new')
+    if d:
+      return d.data_text
+    return ''
+
+  @property
+  def new_lines(self):
+    """The new_text split into lines, retaining line endings.
+    """
+    d = self._data('new')
+    if d:
+      return d.data_lines
+    return []
+
+
+class Comment(BackedUpModel):
+  """A Comment for a specific line of a specific file.
+
+  This is a descendant of a Patch.
+  """
+
+  patch = db.ReferenceProperty(Patch)  # == parent
+  message_id = db.StringProperty()  # == key_name
+  author = db.UserProperty()
+  date = db.DateTimeProperty(auto_now=True)
+  lineno = db.IntegerProperty()
+  text = db.TextProperty()
+  left = db.BooleanProperty()
+  draft = db.BooleanProperty(required=True, default=True)
+
+  def complete(self, patch):
+    """Set the shorttext and buckets attributes."""
+    # TODO(guido): Turn these into caching proprties instead.
+    # TODO(guido): Properly parse the text into quoted and unquoted buckets.
+    self.shorttext = self.text.lstrip()[:50].rstrip()
+    self.buckets = [Bucket(text=self.text)]
+
+
+class Bucket(BackedUpModel):
+  """A 'Bucket' of text.
+
+  A comment may consist of multiple text buckets, some of which may be
+  collapsed by default (when they represent quoted text).
+
+  NOTE: This entity is never written to the database.  See Comment.complete().
+  """
+  # TODO(guido): Flesh this out.
+
+  text = db.TextProperty()
+
+
+class ReviewStatus(BackedUpModel):
+  """The information for whether a user has LGTMed or verified a change."""
+  change = db.ReferenceProperty(Change, required=True)  # == parent
+  user = db.UserProperty(required=True)
+  lgtm = db.StringProperty()
+  verified = db.BooleanProperty()
+
+  @classmethod
+  def get_or_insert_status(cls, change, user):
+    key = '<%s>' % user.email
+    return cls.get_or_insert(key,
+                             change=change,
+                             user=user,
+                             parent=change)
+
+  @classmethod
+  def get_status_for_user(cls, change, user):
+    key = '<%s>' % user.email
+    return cls.get_by_key_name(key, parent=change)
+
+  @classmethod
+  def all_for_change(cls, change):
+    return gql(ReviewStatus,
+               'WHERE ANCESTOR IS :1',
+               change).fetch(FETCH_MAX)
+
+
+### Contributor License Agreements ###
+
+class IndividualCLA:
+  NONE = 0
+
+
+### Accounts ###
+
+
+class Account(BackedUpModel):
+  """Maps a user or email address to a user-selected real_name, and more.
+
+  Nicknames do not have to be unique.
+
+  The default real_name is generated from the email address by
+  stripping the first '@' sign and everything after it.  The email
+  should not be empty nor should it start with '@' (AssertionError
+  error is raised if either of these happens).
+
+  Holds a list of ids of starred changes.  The expectation
+  that you won't have more than a dozen or so starred changes (a few
+  hundred in extreme cases) and the memory used up by a list of
+  integers of that size is very modest, so this is an efficient
+  solution.  (If someone found a use case for having thousands of
+  starred changes we'd have to think of a different approach.)
+
+  Returns whether a user is authorized to do lgtm or verify.
+  For now, these authorization check methods do not test which repository
+  the change is in.  This will change.
+  """
+
+  user = db.UserProperty(required=True)
+  email = db.EmailProperty(required=True)  # key == <email>
+  preferred_email = db.EmailProperty()
+
+  created = db.DateTimeProperty(auto_now_add=True)
+  modified = db.DateTimeProperty(auto_now=True)
+
+  welcomed = db.BooleanProperty(default=False)
+  real_name_entered = db.BooleanProperty(default=False)
+  real_name = db.StringProperty()
+  mailing_address = db.TextProperty()
+  mailing_address_country = db.StringProperty()
+  phone_number = db.StringProperty()
+  fax_number = db.StringProperty()
+
+  cla_verified = db.BooleanProperty(default=False)
+  cla_verified_by = db.UserProperty()
+  cla_verified_timestamp = db.DateTimeProperty() # the first time it's set
+  individual_cla_version = db.IntegerProperty(default=IndividualCLA.NONE)
+  individual_cla_timestamp = db.DateTimeProperty()
+  cla_comments = db.TextProperty()
+
+  default_context = db.IntegerProperty(default=DEFAULT_CONTEXT,
+                                       choices=CONTEXT_CHOICES)
+  stars = db.ListProperty(int)  # Change ids of all starred changes
+  unclaimed_changes_projects = db.ListProperty(db.Key)
+
+  # Current user's Account.  Updated by middleware.AddUserToRequestMiddleware.
+  current_user_account = None
+
+  def get_email(self):
+    "Gets the email that this person wants us to use -- separate from login."
+    if self.preferred_email:
+      return self.preferred_email
+    else:
+      return self.email
+
+  def get_email_formatted(self):
+    return '"%s" <%s>' % (self.real_name, self.get_email())
+
+  @classmethod
+  def get_account_for_user(cls, user):
+    """Get the Account for a user, creating a default one if needed."""
+    email = user.email()
+    assert email
+    key = '<%s>' % email
+    # Since usually the account already exists, first try getting it
+    # without the transaction implied by get_or_insert().
+    account = cls.get_by_key_name(key)
+    if account is not None:
+      return account
+    real_name = user.nickname()
+    if '@' in real_name:
+      real_name = real_name.split('@', 1)[0]
+    assert real_name
+    return cls.get_or_insert(key, user=user, email=email, real_name=real_name)
+
+  @classmethod
+  def get_account_for_email(cls, email):
+    """Get the Account for an email address, or return None."""
+    assert email
+    key = '<%s>' % email
+    return cls.get_by_key_name(key)
+
+  @classmethod
+  def get_accounts_for_emails(cls, emails):
+    """Get the Accounts for all email address.
+    """
+    return cls.get_by_key_name(map(lambda x: '<%s>' % x, emails))
+
+  @classmethod
+  def get_real_name_for_email(cls, email):
+    """Get the real_name for an email address, possibly a default."""
+    account = cls.get_account_for_email(email)
+    if account is not None and account.real_name:
+      return account.real_name
+    real_name = email
+    if '@' in real_name:
+      real_name = real_name.split('@', 1)[0]
+    assert real_name
+    return real_name
+
+  @classmethod
+  def get_accounts_for_real_name(cls, real_name):
+    """Get the list of Accounts that have this real_name."""
+    assert real_name
+    assert '@' not in real_name
+    return list(gql(cls, 'WHERE real_name = :1', real_name))
+
+  @classmethod
+  def get_email_for_real_name(cls, real_name):
+    """Turn a real_name into an email address.
+
+    If the real_name is not unique or does not exist, this returns None.
+    """
+    accounts = cls.get_accounts_for_real_name(real_name)
+    if len(accounts) != 1:
+      return None
+    return accounts[0].email
+
+  _drafts = None
+
+  @property
+  def drafts(self):
+    """A list of change ids that have drafts by this user.
+
+    This is cached in memcache.
+    """
+    if self._drafts is None:
+      if self._initialize_drafts():
+        self._save_drafts()
+    return self._drafts
+
+  def update_drafts(self, change, have_drafts=None):
+    """Update the user's draft status for this change.
+
+    Args:
+      change: an Change instance.
+      have_drafts: optional bool forcing the draft status.  By default,
+          change.num_drafts is inspected (which may query the datastore).
+
+    The Account is written to the datastore if necessary.
+    """
+    dirty = False
+    if self._drafts is None:
+      dirty = self._initialize_drafts()
+    id = change.key().id()
+    if have_drafts is None:
+      have_drafts = bool(change.num_drafts)  # Beware, this may do a query.
+    if have_drafts:
+      if id not in self._drafts:
+        self._drafts.append(id)
+        dirty = True
+    else:
+      if id in self._drafts:
+        self._drafts.remove(id)
+        dirty = True
+    if dirty:
+      self._save_drafts()
+
+  def _initialize_drafts(self):
+    """Initialize self._drafts from scratch.
+
+    This mostly exists as a schema conversion utility.
+
+    Returns:
+      True if the user should call self._save_drafts(), False if not.
+    """
+    drafts = memcache.get('user_drafts:' + self.email)
+    if drafts is not None:
+      self._drafts = drafts
+      return False
+    # We're looking for the Change key id.  The ancestry of comments goes:
+    # Change -> PatchSet -> Patch -> Comment.
+    change_ids = set(comment.key().parent().parent().parent().id()
+                    for comment in gql(Comment,
+                                       'WHERE author = :1 AND draft = TRUE',
+                                       self.user))
+    self._drafts = list(change_ids)
+    return True
+
+  def _save_drafts(self):
+    """Save self._drafts to memcache."""
+    memcache.set('user_drafts:' + self.email, self._drafts, 3600)
+
+  def can_lgtm(self):
+    """Returns whether the user can lgtm a given change.
+    
+    For now returns true and doesn't take the change to check.
+    """
+    return True
+
+  def can_verify(self):
+    """Returns whether the user can verify a given change.
+
+    For now returns true and doesn't take the change to check.
+    """
+    return True
+
+  @classmethod
+  def get_all_accounts(cls):
+    """Return all accounts"""
+    all = cls.all()
+    all.order('real_name')
+    return list(all)
+
+
+### Group ###
+
+AUTO_GROUPS = ['admin', 'submitters']
+
+class AccountGroup(BackedUpModel):
+  """A set of users.  Permissions are assigned to groups.
+  
+  There are some groups that can't be deleted -- like admin and all
+  """
+  
+  name = db.StringProperty(required=True)
+  comment = db.TextProperty(required=False)
+  members = db.ListProperty(users.User)
+
+  @classmethod
+  def get_all_groups(cls):
+    """Return all groups"""
+    all = cls.all()
+    all.order('name')
+    return list(all)
+
+  @property
+  def is_auto_group(self):
+    """These groups can't be deleted."""
+    return self.name in AUTO_GROUPS
+
+  @classmethod
+  def create_groups(cls):
+    for group_name in AUTO_GROUPS:
+      def trans():
+        g = cls(name=group_name, comment=(
+            'Auto created %s group' % group_name))
+        g.put()
+      q = cls.gql('WHERE name=:name', name=group_name)
+      if q.get() is None:
+        db.run_in_transaction(trans)
+
+  @classmethod
+  def get_group_for_name(cls, name):
+    return cls.gql('WHERE name=:name', name=name).get()
+
+  def remove(self):
+    """delete this group"""
+    def trans(group):
+      group.delete()
+      # this will do the ON DELETE CASCADE once the users are in there
+    db.run_in_transaction(trans, self)
+
+  def put(self):
+    if self.name in ['admin', 'submitters']:
+      memcache.delete('group_members:%s' % self.name)
+    BackedUpModel.put(self)
+
+  @classmethod
+  def _is_in_cached_group(cls, user, group):
+    if not user:
+      return False
+    cache_key = 'group_members:%s' % group
+    users = memcache.get(cache_key)
+    if not users:
+      g = AccountGroup.get_group_for_name(group)
+      if not g:
+        AccountGroup.create_groups()
+        g = AccountGroup.get_group_for_name(group)
+      if len(g.members) == 0:
+        # if there are no users in this group, everyone is in this group
+        # (helps with testing, upgrading and bootstrapping)
+        # In prod this never really happens, so don't bother caching it
+        return True
+      users = [u.email() for u in g.members]
+      memcache.set(cache_key, users)
+    return user.email() in users
+
+  @classmethod
+  def is_user_admin(cls, user):
+    return AccountGroup._is_in_cached_group(user, 'admin')
+
+  @classmethod
+  def is_user_submitter(cls, user):
+    return AccountGroup._is_in_cached_group(user, 'submitters')
diff --git a/webapp/codereview/patching.py b/webapp/codereview/patching.py
new file mode 100644
index 0000000..7175cd8
--- /dev/null
+++ b/webapp/codereview/patching.py
@@ -0,0 +1,245 @@
+# Copyright 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Utility to read and apply a unified diff without forking patch(1).
+
+For a discussion of the unified diff format, see my blog on Artima:
+http://www.artima.com/weblogs/viewpost.jsp?thread=164293
+"""
+
+import difflib
+import logging
+import re
+import sys
+
+
+_CHUNK_RE = re.compile(r"""
+  @@
+  \s+
+  -
+  (?: (\d+) (?: , (\d+) )?)
+  \s+
+  \+
+  (?: (\d+) (?: , (\d+) )?)
+  \s+
+  @@
+""", re.VERBOSE)
+
+
+def PatchLines(old_lines, patch_lines, name="<patch>"):
+  """Patches the old_lines with patches read from patch_lines.
+
+  This only reads unified diffs.  The header lines are ignored.
+  Yields (tag, old, new) tuples where old and new are lists of lines.
+  The tag can either start with "error" or be a tag from difflib: "equal",
+  "insert", "delete", "replace".  After "error" is yielded, no more
+  tuples are yielded.  It is possible that consecutive "equal" tuples
+  are yielded.
+  """
+  chunks = ParsePatchToChunks(patch_lines, name)
+  if chunks is None:
+    return iter([("error: ParsePatchToChunks failed", [], [])])
+  return PatchChunks(old_lines, chunks)
+
+
+def PatchChunks(old_lines, chunks):
+  """Patche old_lines with chunks.
+
+  Yields (tag, old, new) tuples where old and new are lists of lines.
+  The tag can either start with "error" or be a tag from difflib: "equal",
+  "insert", "delete", "replace".  After "error" is yielded, no more
+  tuples are yielded.  It is possible that consecutive "equal" tuples
+  are yielded.
+  """
+  if not chunks:
+    # The patch is a no-op
+    yield ("equal", old_lines, old_lines)
+    return
+
+  old_pos = 0
+  for (old_i, old_j), (new_i, new_j), old_chunk, new_chunk in chunks:
+    eq = old_lines[old_pos:old_i]
+    if eq:
+      yield "equal", eq, eq
+    old_pos = old_i
+    # Check that the patch matches the target file
+    if old_lines[old_i:old_j] != old_chunk:
+      logging.error("mismatch:%s.%s.", old_lines[old_i:old_j], old_chunk)
+      yield ("error: old chunk mismatch", old_lines[old_i:old_j], old_chunk)
+      return
+    # TODO(guido): ParsePatch knows the diff details, but throws the info away
+    sm = difflib.SequenceMatcher(None, old_chunk, new_chunk)
+    for tag, i1, i2, j1, j2 in sm.get_opcodes():
+      yield tag, old_chunk[i1:i2], new_chunk[j1:j2]
+    old_pos = old_j
+
+  # Copy the final matching chunk if any.
+  eq = old_lines[old_pos:]
+  if eq:
+    yield ("equal", eq, eq)
+
+
+_NO_NEWLINE_MESSAGE = "\\ No newline at end of file"
+
+
+def ParsePatchToChunks(lines, name="<patch>"):
+  """Parses a patch from a list of lines.
+
+  Return a list of chunks, where each chunk is a tuple:
+
+    old_range, new_range, old_lines, new_lines
+
+  Returns a list of chunks (possibly empty); or None if there's a problem.
+  """
+  lineno = 0
+  raw_chunk = []
+  chunks = []
+  old_range = new_range = None
+  old_last = new_last = 0
+  in_prelude = True
+  for line in lines:
+    lineno += 1
+    if in_prelude:
+      # Skip leading lines until after we've seen one starting with '+++'
+      if line.startswith("+++"):
+        in_prelude = False
+      continue
+    match = _CHUNK_RE.match(line)
+    if match:
+      if raw_chunk:
+        # Process the lines in the previous chunk
+        old_chunk = []
+        new_chunk = []
+        for tag, rest in raw_chunk:
+          if tag in (" ", "-"):
+            old_chunk.append(rest)
+          if tag in (" ", "+"):
+            new_chunk.append(rest)
+        # Check consistency
+        old_i, old_j = old_range
+        new_i, new_j = new_range
+        if len(old_chunk) != old_j - old_i or len(new_chunk) != new_j - new_i:
+          logging.warn("%s:%s: previous chunk has incorrect length",
+                       name, lineno)
+          return None
+        chunks.append((old_range, new_range, old_chunk, new_chunk))
+        raw_chunk = []
+      # Parse the @@ header
+      old_ln, old_n, new_ln, new_n = match.groups()
+      old_ln, old_n, new_ln, new_n = map(long,
+                                         (old_ln, old_n or 1,
+                                          new_ln, new_n or 1))
+      # Convert the numbers to list indices we can use
+      if old_n == 0:
+        old_i = old_ln
+      else:
+        old_i = old_ln - 1
+      old_j = old_i + old_n
+      old_range = old_i, old_j
+      if new_n == 0:
+        new_i = new_ln
+      else:
+        new_i = new_ln - 1
+      new_j =new_i + new_n
+      new_range = new_i, new_j
+      # Check header consistency with previous header
+      if old_i < old_last or new_i < new_last:
+        logging.warn("%s:%s: chunk header out of order: %r",
+                     name, lineno, line)
+        return None
+      if old_i - old_last != new_i - new_last:
+        logging.warn("%s:%s: inconsistent chunk header: %r",
+                     name, lineno, line)
+        return None
+      old_last = old_j
+      new_last = new_j
+    else:
+      tag, rest = line[0], line[1:]
+      if tag in (" ", "-", "+"):
+        raw_chunk.append((tag, rest))
+      elif line.startswith(_NO_NEWLINE_MESSAGE):
+        # TODO(guido): need to check that no more lines follow for this file
+        if raw_chunk:
+          last_tag, last_rest = raw_chunk[-1]
+          if last_rest.endswith("\n"):
+            raw_chunk[-1] = (last_tag, last_rest[:-1])
+      else:
+        # Only log if it's a non-blank line.  Blank lines we see a lot.
+        if line and line.strip():
+          logging.warn("%s:%d: indecypherable input: %r", name, lineno, line)
+        if chunks or raw_chunk:
+          break  # Trailing garbage isn't so bad
+        return None
+  if raw_chunk:
+    # Process the lines in the last chunk
+    old_chunk = []
+    new_chunk = []
+    for tag, rest in raw_chunk:
+      if tag in (" ", "-"):
+        old_chunk.append(rest)
+      if tag in (" ", "+"):
+        new_chunk.append(rest)
+    # Check consistency
+    old_i, old_j = old_range
+    new_i, new_j = new_range
+    if len(old_chunk) != old_j - old_i or len(new_chunk) != new_j - new_i:
+      print >>sys.stderr, ("%s:%s: last chunk has incorrect length" %
+                           (name, lineno))
+      return None
+    chunks.append((old_range, new_range, old_chunk, new_chunk))
+    raw_chunk = []
+  return chunks
+
+
+# TODO: can we share some of this code with ParsePatchToChunks?
+def ParsePatchToLines(lines):
+  """Parses a patch from a list of lines.
+
+  Returns None on error, otherwise a list of 3-tuples:
+    (old_line_no, new_line_no, line)
+
+    A line number can be 0 if it doesn't exist in the old/new file.
+  """
+  result = []
+  in_prelude = True
+  for line in lines:
+    if in_prelude:
+      result.append((0, 0, line))
+      # Skip leading lines until after we've seen one starting with '+++'
+      if line.startswith("+++"):
+        in_prelude = False
+    elif line.startswith("@"):
+      result.append((0, 0, line))
+      match = _CHUNK_RE.match(line)
+      if not match:
+        logging.warn("ParsePatchToLines match failed on %s", line)
+        return None
+      old_ln = int(match.groups()[0])
+      new_ln = int(match.groups()[2])
+    else:
+      if line[0] == "-":
+        result.append((old_ln, 0, line))
+        old_ln += 1
+      elif line[0] == "+":
+        result.append((0, new_ln, line))
+        new_ln += 1
+      elif line[0] == " ":
+        result.append((old_ln, new_ln, line))
+        old_ln += 1
+        new_ln += 1
+      elif line.startswith(_NO_NEWLINE_MESSAGE):
+        continue
+      else:  # Something else, could be property changes etc.
+        result.append((0, 0, line))
+  return result
diff --git a/webapp/codereview/people.py b/webapp/codereview/people.py
new file mode 100644
index 0000000..0621796
--- /dev/null
+++ b/webapp/codereview/people.py
@@ -0,0 +1,302 @@
+# Copyright 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Info about the users
+
+This requires Django 0.97.pre.
+"""
+
+import datetime
+import logging
+
+from django import forms
+from django import http
+from django.utils import simplejson
+
+import models
+import views
+import fields
+from view_util import *
+
+def respond_json(obj):
+  data = simplejson.dumps(obj)
+  return http.HttpResponse(data,
+      mimetype="text/javascript; charset=utf-8")
+
+def get_user_info(request):
+  """check if the requested user exists
+  
+  Parameters:
+    id: the user's email address or the group name
+    allow_users: whether users are allowed, true by default
+    allow_groups: whether groups are allowed, true by default
+
+  Result:
+  If user/group not found:
+    null
+  If user found: map of
+    type: "user"
+    key: a unique key for this user
+    email: their email address
+    real_name: the user's real name
+  If group found: map of
+    type: "group"
+    key: a unique key for this group
+    name: the name of the group
+
+  If users or groups are not allowed, then null will be returned
+  even if there does happen to be a user or group with that name
+  """
+  id = request.REQUEST.get("id", None)
+  if not id:
+    return http.HttpResponseServerError("id not provided")
+  allow_users = request.REQUEST.get("allow_users", "true")
+  allow_groups = request.REQUEST.get("allow_groups", "true")
+  if allow_users != "false":
+    account = models.Account.get_account_for_email(id)
+    if account:
+      return respond_json({
+          'allow_users': allow_users,
+          'allow_groups': allow_groups,
+          'type': 'user',
+          'key': "user/" + account.email,
+          'email': account.email,
+          'real_name': account.real_name,
+          })
+  if allow_groups != "false":
+    group = models.AccountGroup.get_group_for_name(id)
+    if group:
+      return respond_json({
+          'allow_users': allow_users,
+          'allow_groups': allow_groups,
+          'type': 'group',
+          'key': "group/" + str(group.key()),
+          'name': group.name,
+          })
+  return respond_json(None)
+
+@admin_required
+def admin_people_info(request):
+  """/admin/people_info"""
+  op = request.REQUEST.get("op", None)
+  if op == "get_user_info":
+    return get_user_info(request);
+  return http.HttpResponseServerError("op=" + str(op))
+
+@admin_required
+def admin_users(request):
+  """/admin/users - list of all users"""
+  accounts = models.Account.get_all_accounts()
+  return respond(request, 'admin_users.html', {'users': accounts})
+
+@admin_required
+def admin_users_verify_cla(request):
+  """/admin/users - list of all users"""
+  accounts = models.Account.gql('WHERE welcomed=True '
+                              + 'AND individual_cla_version != 0'
+                              + 'AND cla_verified=False').fetch(1000)
+  return respond(request, 'admin_users.html', {'users': accounts})
+
+
+def _get_groups_for_account(account):
+  return models.gql(models.AccountGroup,
+                    'WHERE members = :1',
+                    account.user).fetch(models.FETCH_MAX)
+
+def _set_groups_for_account(account, groups):
+  u = account.user
+  existing = _get_groups_for_account(account)
+  # remove from the ones that don't have it any more
+  group_keys = [g.key() for g in groups]
+  for g in existing:
+    if g.key() not in group_keys:
+      g.members.remove(u)
+      g.put()
+  # add to the ones that didn't have it before
+  existing_keys = [g.key() for g in existing]
+  for g in groups:
+    if g.key() not in existing_keys:
+      g.members.append(u)
+      g.put()
+  
+class AdminUserForm(BaseForm):
+  _template = 'admin_user.html'
+
+  dest = forms.fields.CharField(widget=forms.widgets.HiddenInput)
+
+  # user info
+  real_name = forms.CharField(max_length=60)
+  preferred_email = forms.EmailField(required=False)
+  mailing_address = forms.CharField(required=False,
+                          max_length=150,
+                          widget=forms.Textarea(attrs={'rows': 4, 'cols': 60}))
+  mailing_address_country = forms.CharField(max_length=30, required=False)
+  phone_number = forms.CharField(max_length=30, required=False)
+  fax_number = forms.CharField(max_length=30, required=False)
+
+  # groups
+  groups = fields.UserGroupField(allow_users=False, allow_groups=True)
+
+  # cla
+  cla_verified = forms.fields.BooleanField(required=False)
+  cla_comments = forms.CharField(required=False,
+                          max_length=300,
+                          widget=forms.Textarea(attrs={'rows': 6, 'cols': 60}))
+
+  @classmethod
+  def _init(cls, state):
+    account = state['account']
+    dest = state['dest']
+    return {
+        'initial': {
+            'dest': dest,
+            'real_name': account.real_name,
+            'preferred_email': account.preferred_email,
+            'mailing_address': account.mailing_address,
+            'mailing_address_country': account.mailing_address_country,
+            'phone_number': account.phone_number,
+            'fax_number': account.fax_number,
+            'groups': _get_groups_for_account(account),
+            'cla_verified': account.cla_verified,
+            'cla_verified_by': account.cla_verified_by,
+            'cla_verified_timestamp': account.cla_verified_timestamp,
+            'individual_cla_version': account.individual_cla_version,
+            'individual_cla_timestamp': account.individual_cla_timestamp,
+            'cla_comments': account.cla_comments,
+          },
+        }
+
+  def _save(self, cd, state):
+    account = state['account']
+    account.real_name = cd['real_name'].strip()
+    if cd['preferred_email']:
+      account.preferred_email = cd['preferred_email']
+    account.mailing_address = cd['mailing_address']
+    account.mailing_address_country = cd['mailing_address_country']
+    account.phone_number = cd['phone_number']
+    account.fax_number = cd['fax_number']
+    if account.cla_verified != cd['cla_verified']:
+      account.cla_verified = cd['cla_verified']
+      account.cla_verified_by = models.Account.current_user_account.user
+    if cd['cla_verified'] and account.cla_verified_timestamp is None:
+      account.cla_verified_timestamp = datetime.datetime.utcnow()
+    account.cla_comments = cd['cla_comments']
+    account.put()
+    _set_groups_for_account(account, 
+                            fields.UserGroupField.get_groups(cd['groups']))
+    if self.is_valid():
+      return HttpResponseRedirect(cd['dest'])
+
+
+@admin_required
+def admin_user(request, email):
+  """/admin/user/email@address.com - edit this user"""
+  account = models.Account.get_account_for_email(email)
+  referrer = request.META.get('HTTP_REFERER', '/admin/users')
+  state = {
+      'account': account,
+      'dest': referrer,
+    }
+  return process_form(request, AdminUserForm, state, None, {'email':email})
+  
+@admin_required
+def admin_groups(request):
+  """/admin/groups - list of all groups"""
+  models.AccountGroup.create_groups()
+  groups = models.AccountGroup.get_all_groups()
+  return respond(request, 'admin_groups.html', {'groups': groups})
+
+class AdminGroupForm(BaseForm):
+  _template = 'admin_group.html'
+
+  name = forms.CharField(max_length=30)
+  comment = forms.CharField(required=False,
+                            max_length=10000,
+                            widget=forms.Textarea(attrs={'cols': 60}))
+  members = fields.UserGroupField(allow_users=True, allow_groups=False)
+
+  @classmethod
+  def _init(cls, group):
+     who = group.members
+     who = fields.UserGroupField.field_value_for_keys(users = who)
+     return {'initial': {'name': group.name,
+             'comment': group.comment,
+             'members': who
+            }}
+
+  def _save(self, cd, group):
+    new_name = cd['name'].strip()
+    if group.is_auto_group and group.name != new_name:
+      self.errors['name'] = ['Name can not be changed']
+
+    # TODO(joeo): Big race condition here.
+    #
+    in_use = models.AccountGroup.get_group_for_name(new_name)
+    if in_use and group.key() != in_use.key():
+      self.errors['name'] = ['Name is already in use']
+
+    if self.is_valid():
+      group.name = new_name
+      group.comment = cd['comment']
+      group.members = fields.UserGroupField.get_users(cd['members'])
+      group.put()
+
+@admin_required
+def admin_group(request, name):
+  """/admin/group/group - edit this group"""
+  group = models.AccountGroup.get_group_for_name(name)
+  def done():
+    return HttpResponseRedirect('/admin/groups')
+  return process_form(request, AdminGroupForm, group, done,
+                      {'group': group,
+                       'del_url': '/admin/group_delete/%s' % group.name,
+                      })
+  
+class AdminNewGroupForm(AdminGroupForm):
+  @classmethod
+  def _init(cls, group):
+     return {'initial': {'name': '', 'comment': ''}}
+
+  def _save(self, cd, group):
+    new_name = cd['name'].strip()
+
+    # TODO(joeo): Big race condition here.
+    #
+    if models.AccountGroup.get_group_for_name(new_name):
+      self.errors['name'] = ['Name is already in use']
+
+    if self.is_valid():
+      who = fields.UserGroupField.get_users(cd['members'])
+      group = models.AccountGroup(name = new_name,
+                                  comment = cd['comment'],
+                                  members = who)
+      group.put()
+
+@admin_required
+def admin_group_new(request):
+  """/admin/group/GROUP - add a new group"""
+  def done():
+    return HttpResponseRedirect('/admin/groups')
+  return process_form(request, AdminNewGroupForm, [], done)
+
+@gae_admin_required
+@xsrf_required
+def admin_group_delete(request, name):
+  """/admin/group_delete/GROUP - add a new group"""
+  group = models.AccountGroup.get_group_for_name(name)
+  assert group
+  group.remove()
+  return HttpResponseRedirect('/admin/groups')
+
+
diff --git a/webapp/codereview/project.py b/webapp/codereview/project.py
new file mode 100644
index 0000000..d69dbdf
--- /dev/null
+++ b/webapp/codereview/project.py
@@ -0,0 +1,472 @@
+# Copyright 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Project related views and functions.
+
+This requires Django 0.97.pre.
+"""
+
+
+# Python imports
+import os
+import cgi
+import random
+import re
+import logging
+import binascii
+import datetime
+import urllib
+import md5
+from xml.etree import ElementTree
+from cStringIO import StringIO
+
+# AppEngine imports
+from google.appengine.api import mail
+from google.appengine.api import memcache
+from google.appengine.api import users
+from google.appengine.api import urlfetch
+from google.appengine.ext import db
+from google.appengine.ext.db import djangoforms
+
+# Django imports
+# TODO(guido): Don't import classes/functions directly.
+from django import http
+from django import forms
+from django.http import HttpResponse, HttpResponseRedirect
+from django.http import HttpResponseForbidden, HttpResponseNotFound
+from django.shortcuts import render_to_response
+from django.utils import simplejson
+from django.forms import formsets
+
+# Local imports
+import models
+import engine
+import library
+import patching
+import fields
+import views
+from view_util import *
+
+## Project CRUD ##
+
+def _assert_project_and_owner(request, project):
+  "If the current user is not an owner of this project or an admin, give a 404."
+  if not project:
+    raise http.Http404()
+  if not request.user or not ((project.key() in [
+          p.key() for p in request.projects_owned_by_user])
+      or request.user_is_admin):
+    raise http.Http404()
+
+@project_owner_or_admin_required
+def project_list(request):
+  """/admin/projects - list of all projects"""
+  if request.user_is_admin:
+    projects = models.Project.get_all_projects()
+  else:
+    projects = models.Project.projects_owned_by_user(request.user)
+    logging.info("project_list projects=" + str(projects))
+    if not projects:
+      raise http.Http404()
+  return respond(request, 'admin_projects.html', {'projects': projects})
+
+def _keys_for(values):
+  return [x.key() for x in values]
+
+def _users_to_accounts(users):
+  return map(models.Account.get_account_for_user, users)
+
+def _combine_users_and_groups(users, groupKeys):
+  return models.AccountGroup.get(groupKeys) + _users_to_accounts(users)
+
+def _field_to_approval_right(cleaned):
+  result = models.ApprovalRight()
+  result.files = cleaned["files"]
+  (result.approvers_users,result.approvers_groups
+      ) = fields.UserGroupField.get_user_and_group_keys(cleaned["approvers"])
+  (result.verifiers_users,result.verifiers_groups
+      ) = fields.UserGroupField.get_user_and_group_keys(cleaned["verifiers"])
+  result.put()
+  return result
+
+def _approval_right_to_field(key):
+  val = models.ApprovalRight.get(key)
+  if not val:
+    raise KeyError("no ApprovalRight for key: " + str(key))
+  return {
+      'files': val.files,
+      'approvers': _combine_users_and_groups(val.approvers_users,
+                      val.approvers_groups),
+      'verifiers': _combine_users_and_groups(val.verifiers_users,
+                      val.verifiers_groups),
+    }
+
+class AdminProjectForm(BaseForm):
+  _template = 'admin_project.html'
+
+  name = forms.CharField(max_length=30)
+  comment = forms.CharField(required=False,
+                            max_length=10000,
+                            widget=forms.Textarea(attrs={'cols': 60}))
+  owners = fields.UserGroupField()
+  code_reviews = fields.ApproversField()
+
+  @classmethod
+  def _init(cls, project):
+     owners = fields.UserGroupField.field_value_for_keys(
+                project.owners_users,
+                project.owners_groups),
+     return {'initial': {'name': project.name,
+             'comment': project.comment,
+             'owners': owners,
+             'code_reviews': map(_approval_right_to_field,
+                                 project.code_reviews),
+            }}
+
+  def _save(self, cd, project):
+    new_name = cd['name'].strip()
+
+    # TODO(joeo): Big race condition here.
+    #
+    in_use = models.Project.get_project_for_name(new_name)
+    if in_use and project.key() != in_use.key():
+      self.errors['name'] = ['Name is already in use']
+
+    if self.is_valid():
+      project.name = new_name
+      project.comment = cd['comment']
+      project.owners_users, project.owners_groups = \
+        fields.UserGroupField.get_user_and_group_keys(cd['owners'])
+      project.set_code_reviews(_keys_for(map(_field_to_approval_right,
+                                         cd['code_reviews'])))
+      project.put()
+
+def project_edit(request, name):
+  """/admin/project/project - edit this project"""
+  project = models.Project.get_project_for_name(name)
+  _assert_project_and_owner(request, project)
+  def done():
+    return HttpResponseRedirect('/admin/projects')
+  return process_form(request, AdminProjectForm, project, done,
+                      {'project':project,
+                       'del_url': '/admin/project_delete/%s' % project.name,
+                      })
+
+class AdminNewProjectForm(AdminProjectForm):
+  @classmethod
+  def _init(cls, state):
+    return {'initial': {'name': '', 'comment': ''}}
+
+  def _save(self, cd, state):
+    name = cd['name'].strip()
+
+    # TODO(joeo): Big race condition here.
+    #
+    if models.Project.get_project_for_name(name):
+      self.errors['name'] = ['Name is already in use']
+
+    if self.is_valid():
+      owners_users = fields.UserGroupField.get_users(cd['owners'])
+      owners_groups = fields.UserGroupField.get_group_keys(cd['owners'])
+
+      project = models.Project(name = name,
+                               comment = cd['comment'],
+                               owners_users = owners_users,
+                               owners_groups = owners_groups)
+      project.set_code_reviews(_keys_for(map(_field_to_approval_right,
+                               cd['code_reviews'])))
+      project.put()
+
+@admin_required
+def project_new(request):
+  """/admin/project/GROUP - add a new project"""
+  def done():
+    return HttpResponseRedirect('/admin/projects')
+  return process_form(request, AdminNewProjectForm, [], done)
+
+@gae_admin_required
+@xsrf_required
+def project_delete(request, name):
+  """/admin/project_delete/GROUP - add a new project"""
+  project = models.Project.get_project_for_name(name)
+  assert project
+  project.remove()
+  return HttpResponseRedirect('/admin/projects')
+
+
+def _matches_file_pattern(pattern, files):
+  """Returns whether the list of files matches the pattern"""
+  for filename in files:
+    if regex.match(filename):
+      return True
+  return False
+
+def _is_leaf_pattern(pattern):
+  """Returns whether the pattern ends with ..."""
+  return not pattern.endswith("...")
+
+def _split_rules_for_review(project):
+  """Gets the approval file pattern rules for a project
+
+  Returns:
+    A tuple of:
+      0 - A list of tuples of:
+        0 - leaf pattern rules (rules of the form /.../xxx)
+        1 - the ApprovalRight object
+      1 - A list of tuples of:
+        0 - directory pattern rules (rules of the form /xxx/...)
+        1 - the ApprovalRight object
+  """
+  leaf_rules = []
+  dir_rules = []
+
+  for approval_right in project.get_code_reviews():
+    for pattern in approval_right.files:
+      if _is_leaf_pattern(pattern):
+        leaf_rules.append((pattern, approval_right))
+      else:
+        dir_rules.append((pattern, approval_right))
+
+  return (leaf_rules, dir_rules)
+
+def _file_pattern_to_regex(pattern):
+  if pattern.startswith('/'):
+    pattern = pattern[1:]
+  return re.compile('^%s$' % pattern.replace("...", ".*?"))
+
+def _convert_pattern_to_regex(rules):
+  return [(_file_pattern_to_regex(pattern),pattern,approval_right)
+      for (pattern,approval_right) in rules]
+
+def _flatten_rule_users(rules):
+  flattened = {}
+  def _flatten_approval_right(approval_right):
+    if not flattened.has_key(approval_right):
+      flattened[approval_right] = {
+          'required': approval_right.required,
+          'approvers': set([u.email() for u in approval_right.approvers()]),
+          'verifiers': set([u.email() for u in approval_right.verifiers()]),
+        }
+    return flattened[approval_right]
+  return [(regex,pattern,_flatten_approval_right(approval_right))
+      for (regex,pattern,approval_right) in rules]
+
+def _split_files_for_review(project, files):
+  """Return a mapping of files to the set of users that can approve or verify
+  that file.
+
+  Returns:
+    A tuple of booleans, corresponding to (can_approve, can_verify).
+  """
+  result = {}
+
+  (leaf_rules, dir_rules) = _split_rules_for_review(project)
+
+  leaf_rules = _convert_pattern_to_regex(leaf_rules)
+  dir_rules = _convert_pattern_to_regex(dir_rules)
+
+  leaf_rules = _flatten_rule_users(leaf_rules)
+  dir_rules = _flatten_rule_users(dir_rules)
+
+  for file in files:
+    approvers = []
+    verifiers = []
+    # check leaf rules -- we want all of those that match
+    for (regex,pattern,flat_approval_right) in leaf_rules:
+      if _is_leaf_pattern(pattern):
+        if regex.match(file):
+          user_set = flat_approval_right['approvers']
+          if not user_set in approvers:
+            approvers.append(user_set)
+          user_set = flat_approval_right['verifiers']
+          if not user_set in verifiers:
+            verifiers.append(user_set)
+    # check dir rules -- we want all of those that match
+    dir_rule_approvers = set()
+    dir_rule_verifiers = set()
+    for (regex,pattern,flat_approval_right) in reversed(dir_rules):
+      if not _is_leaf_pattern(pattern):
+        if regex.match(file):
+          dir_rule_approvers |= flat_approval_right['approvers']
+          dir_rule_verifiers |= flat_approval_right['verifiers']
+          if flat_approval_right['required']:
+            break
+    if not dir_rule_approvers in approvers:
+      approvers.append(dir_rule_approvers)
+    if not dir_rule_verifiers in verifiers:
+      verifiers.append(dir_rule_verifiers)
+    # save the result
+    result[file] = {
+          'approvers': approvers,
+          'verifiers': verifiers,
+        }
+
+  return result
+
+def _check_users(possible, actual):
+  """Return whether for each set in possible there is one entry from actual """
+  for user_set in possible:
+    inter = user_set.intersection(actual)
+    if len(user_set.intersection(actual)) == 0:
+      return False
+  return True
+
+def _match_users(possible, actual):
+  """Return the users who have actually approved/verified a change"""
+  matched = set()
+  for user_set in possible:
+    inter = user_set.intersection(actual)
+    matched |= inter
+  return matched
+
+def ready_to_submit(branch, owner, reviewer_status, files):
+  """Returns whether the supplied change is ready to submit.
+
+  These are the rules for whether a change is considered ready to submit:
+
+  1. If the project, repository or branch has code reviews turned off, then
+     the change is ok.
+  2. If all of the following are true, the change is ok:
+    a. Either:
+        i. Someone who is authorized to lgtm each file has done so.
+        ii. For each file where the owner is the only approver in the list,
+            there is at least one other person that has given a positive 
+            score.
+    b. No one who is authorized to say no has done so.
+
+  If 'owner' can lgtm or verify a change, she is added to the respective list.
+
+  Args:
+    branch:           The branch that this change is in (a Branch object).
+    owner:            The user that owns the change. (a User object).
+    reviewer_status:  A map as returned by Change.get_reviewer_status()
+    files:            A list of the files that are affected.
+
+  Returns:
+    A tuple containing:
+      0 - whether the change is ready to submit over all,
+      1 - whether it has been approved,
+      2 - whether it has been denied
+      3 - whether it has been verified.
+      4 - A tuple of
+            0 - whether the owner has lgtm rights
+            1 - whether the owner has verification rights
+  """
+
+  if branch is None:
+    return (False, False, False, False, (False, False))
+  project = branch.project
+  if not project.is_code_reviewed():
+    return (True, True, False, True, (False, False))
+  if not branch.is_code_reviewed():
+    return (True, True, False, True, (False, False))
+
+  approved_cnt = 0
+  verified_cnt = 0
+  denied_cnt = 0
+  owner_auto_lgtm = False
+  owner_auto_verify = False
+
+  lgtm_emails = set([u.email() for u in reviewer_status['lgtm']])
+  reject_emails = set([u.email() for u in reviewer_status['reject']])
+  verified_by_emails = set([u.email() for u in reviewer_status['verified_by']])
+  owner_email = owner.email()
+
+  files_to_approve = _split_files_for_review(project, files)
+  if files_to_approve:
+    for (file,user_sets) in files_to_approve.iteritems():
+      # check the real approvals - the owner is checked in this list
+      if _check_users(user_sets['approvers'], lgtm_emails):
+        approved_cnt += 1
+      if _check_users(user_sets['approvers'], reject_emails):
+        denied_cnt += 1
+      if _check_users(user_sets['verifiers'], verified_by_emails):
+        verified_cnt += 1
+      # check the owner auto-approve
+      if _check_users(user_sets['approvers'], [owner_email]):
+        owner_auto_lgtm = True
+      if _check_users(user_sets['verifiers'], [owner_email]):
+        owner_auto_verify = True
+
+    require_review = False
+    approved = ((approved_cnt == len(files_to_approve))
+                or (owner_auto_lgtm
+                    and ((not require_review)
+                          or (len(reviewer_status['yes']) > 0
+                               or len(reviewer_status['lgtm']) > 0))))
+    verified = verified_cnt == len(files_to_approve) or owner_auto_verify
+    denied = denied_cnt > 0
+  else:
+    approved = False
+    verified = False
+    denied = False
+
+  real_approvers = _match_users(user_sets['approvers'], lgtm_emails) 
+  real_deniers = _match_users(user_sets['approvers'], reject_emails) 
+  real_verifiers = _match_users(user_sets['verifiers'], verified_by_emails) 
+
+  return {
+      'can_submit': approved and verified and (not denied),
+      'approved': approved,
+      'denied': denied,
+      'verified': verified,
+      'owner_auto_lgtm': owner_auto_lgtm,
+      'owner_auto_verify': owner_auto_verify,
+      'real_approvers': real_approvers,
+      'real_deniers': real_deniers,
+      'real_verifiers': real_verifiers,
+    }
+
+def user_can_approve(user, change):
+  """Returns whether the user can approve or verify this change.
+
+  Args:
+    user:   The user to test (a User object)
+    branch: The branch that this change is in (a Branch object)
+    files:  A list of files in question
+
+  Returns:
+    A map of 'approve' and 'verify' to booleans of whether the user
+    can approve or verify at least one of these files.
+  """
+  # pick the files
+  patchsets = list(change.patchset_set.order('id'))
+  if not patchsets:
+    return (False, False)
+  files = patchsets[-1].filenames
+
+  branch = change.dest_branch
+  project = branch.project
+
+  if not project.is_code_reviewed():
+    return (True, True)
+  files_to_approve = _split_files_for_review(project, files)
+  if not files_to_approve:
+    return (False, False)
+
+  email = user.email()
+  can_approve = False
+  can_verify = False
+  for (file,user_sets) in files_to_approve.iteritems(): 
+    for user_set in user_sets["approvers"]:
+      if email in user_set:
+        can_approve = True
+    for user_set in user_sets["verifiers"]:
+      if email in user_set:
+        can_verify = True
+    if can_approve and can_verify:
+      # short circuit
+      return (True, True)
+
+  return (can_approve, can_verify)
diff --git a/webapp/codereview/proto_client.py b/webapp/codereview/proto_client.py
new file mode 100755
index 0000000..e11beff
--- /dev/null
+++ b/webapp/codereview/proto_client.py
@@ -0,0 +1,349 @@
+# Copyright 2007, 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import base64
+import cookielib
+import getpass
+import logging
+import md5
+import os
+import random
+import socket
+import time
+import urllib
+import urllib2
+import urlparse
+
+from froofle.protobuf.service import RpcChannel
+from froofle.protobuf.service import RpcController
+from need_retry_pb2 import RetryRequestLaterResponse;
+
+class ClientLoginError(urllib2.HTTPError):
+  """Raised to indicate an error authenticating with ClientLogin."""
+
+  def __init__(self, url, code, msg, headers, args):
+    urllib2.HTTPError.__init__(self, url, code, msg, headers, None)
+    self.args = args
+    self.reason = args["Error"]
+
+
+class Proxy(object):
+  class _ResultHolder(object):
+    def __call__(self, result):
+      self._result = result
+
+  class _RemoteController(RpcController):
+    def Reset(self):
+      pass
+  
+    def Failed(self):
+      pass
+  
+    def ErrorText(self):
+      pass
+  
+    def StartCancel(self):
+      pass
+  
+    def SetFailed(self, reason):
+      raise RuntimeError, reason
+  
+    def IsCancelled(self):
+      pass
+  
+    def NotifyOnCancel(self, callback):
+      pass
+  
+  def __init__(self, stub):
+    self._stub = stub
+
+  def __getattr__(self, key):
+    method = getattr(self._stub, key)
+
+    def call(request):
+      done = self._ResultHolder()
+      method(self._RemoteController(), request, done)
+      return done._result
+
+    return call
+
+
+class HttpRpc(RpcChannel):
+  """Simple protobuf over HTTP POST implementation."""
+
+  def __init__(self, host, auth_function,
+               host_override=None,
+               extra_headers={},
+               cookie_file=None):
+    """Creates a new HttpRpc.
+
+    Args:
+      host: The host to send requests to.
+      auth_function: A function that takes no arguments and returns an
+        (email, password) tuple when called. Will be called if authentication
+        is required.
+      host_override: The host header to send to the server (defaults to host).
+      extra_headers: A dict of extra headers to append to every request.
+      cookie_file: If not None, name of the file in ~/ to save the
+        cookie jar into.  Applications are encouraged to set this to
+        '.$appname_cookies' or some otherwise unique name.
+    """
+    self.host = host.lower()
+    self.host_override = host_override
+    self.auth_function = auth_function
+    self.authenticated = False
+    self.extra_headers = extra_headers
+    self.xsrf_token = None
+    if cookie_file is None:
+      self.cookie_file = None
+    else:
+      self.cookie_file = os.path.expanduser("~/%s" % cookie_file)
+    self.opener = self._GetOpener()
+    if self.host_override:
+      logging.info("Server: %s; Host: %s", self.host, self.host_override)
+    else:
+      logging.info("Server: %s", self.host)
+
+  def CallMethod(self, method, controller, request, response_type, done):
+    pat = "application/x-google-protobuf; name=%s"
+
+    url = "/proto/%s/%s" % (method.containing_service.name, method.name)
+    reqbin = request.SerializeToString()
+    reqtyp = pat % request.DESCRIPTOR.full_name
+    reqmd5 = base64.b64encode(md5.new(reqbin).digest())
+
+    start = time.time()
+    while True:
+      t, b = self._Send(url, reqbin, reqtyp, reqmd5)
+      if t == (pat % RetryRequestLaterResponse.DESCRIPTOR.full_name):
+        if time.time() >= (start + 1800):
+          controller.SetFailed("timeout")
+          return
+        s = random.uniform(0.250, 2.000)
+        print "Busy, retrying in %.3f seconds ..." % s
+        time.sleep(s)
+        continue
+
+      if t == (pat % response_type.DESCRIPTOR.full_name):
+        response = response_type()
+        response.ParseFromString(b)
+        done(response)
+      else:
+        controller.SetFailed("Unexpected %s response" % t)
+      break
+
+  def _CreateRequest(self, url, data=None):
+    """Creates a new urllib request."""
+    logging.debug("Creating request for: '%s' with payload:\n%s", url, data)
+    req = urllib2.Request(url, data=data)
+    if self.host_override:
+      req.add_header("Host", self.host_override)
+    for key, value in self.extra_headers.iteritems():
+      req.add_header(key, value)
+    return req
+
+  def _GetAuthToken(self, email, password):
+    """Uses ClientLogin to authenticate the user, returning an auth token.
+
+    Args:
+      email:    The user's email address
+      password: The user's password
+
+    Raises:
+      ClientLoginError: If there was an error authenticating with ClientLogin.
+      HTTPError: If there was some other form of HTTP error.
+
+    Returns:
+      The authentication token returned by ClientLogin.
+    """
+    req = self._CreateRequest(
+        url="https://www.google.com/accounts/ClientLogin",
+        data=urllib.urlencode({
+            "Email": email,
+            "Passwd": password,
+            "service": "ah",
+            "source": "gerrit-codereview-client",
+            "accountType": "HOSTED_OR_GOOGLE",
+        })
+    )
+    try:
+      response = self.opener.open(req)
+      response_body = response.read()
+      response_dict = dict(x.split("=")
+                           for x in response_body.split("\n") if x)
+      return response_dict["Auth"]
+    except urllib2.HTTPError, e:
+      if e.code == 403:
+        body = e.read()
+        response_dict = dict(x.split("=", 1) for x in body.split("\n") if x)
+        raise ClientLoginError(req.get_full_url(), e.code, e.msg,
+                               e.headers, response_dict)
+      else:
+        raise
+
+  def _GetAuthCookie(self, auth_token):
+    """Fetches authentication cookies for an authentication token.
+
+    Args:
+      auth_token: The authentication token returned by ClientLogin.
+
+    Raises:
+      HTTPError: If there was an error fetching the authentication cookies.
+    """
+    # This is a dummy value to allow us to identify when we're successful.
+    continue_location = "http://localhost/"
+    args = {"continue": continue_location, "auth": auth_token}
+    req = self._CreateRequest("http://%s/_ah/login?%s" %
+                              (self.host, urllib.urlencode(args)))
+    try:
+      response = self.opener.open(req)
+    except urllib2.HTTPError, e:
+      response = e
+    if (response.code != 302 or
+        response.info()["location"] != continue_location):
+      raise urllib2.HTTPError(req.get_full_url(), response.code, response.msg,
+                              response.headers, response.fp)
+    self.authenticated = True
+
+  def _GetXsrfToken(self):
+    """Fetches /proto/_token for use in X-XSRF-Token HTTP header.
+
+    Raises:
+      HTTPError: If there was an error fetching a new token.
+    """
+    tries = 0
+    while True:
+      url = "http://%s/proto/_token" % self.host
+      req = self._CreateRequest(url)
+      try:
+        response = self.opener.open(req)
+        self.xsrf_token = response.read()
+        return
+      except urllib2.HTTPError, e:
+        if tries > 3:
+          raise
+        elif e.code == 401:
+          self._Authenticate()
+        else:
+          raise
+
+  def _Authenticate(self):
+    """Authenticates the user.
+
+    The authentication process works as follows:
+     1) We get a username and password from the user
+     2) We use ClientLogin to obtain an AUTH token for the user
+        (see http://code.google.com/apis/accounts/AuthForInstalledApps.html).
+     3) We pass the auth token to /_ah/login on the server to obtain an
+        authentication cookie. If login was successful, it tries to redirect
+        us to the URL we provided.
+
+    If we attempt to access the upload API without first obtaining an
+    authentication cookie, it returns a 401 response and directs us to
+    authenticate ourselves with ClientLogin.
+    """
+    for i in range(3):
+      credentials = self.auth_function()
+      auth_token = self._GetAuthToken(credentials[0], credentials[1])
+      self._GetAuthCookie(auth_token)
+      if self.cookie_file is not None:
+        self.cookie_jar.save()
+      return
+
+  def _Send(self, request_path, payload, content_type, content_md5):
+    """Sends an RPC and returns the response.
+
+    Args:
+      request_path: The path to send the request to, eg /api/appversion/create.
+      payload: The body of the request, or None to send an empty request.
+      content_type: The Content-Type header to use.
+      content_md5: The Content-MD5 header to use.
+
+    Returns:
+      The content type, as a string.
+      The response body, as a string.
+    """
+    if not self.authenticated:
+      self._Authenticate()
+    if not self.xsrf_token:
+      self._GetXsrfToken()
+
+    old_timeout = socket.getdefaulttimeout()
+    socket.setdefaulttimeout(None)
+    try:
+      tries = 0
+      while True:
+        tries += 1
+        url = "http://%s%s" % (self.host, request_path)
+        req = self._CreateRequest(url=url, data=payload)
+        req.add_header("Content-Type", content_type)
+        req.add_header("Content-MD5", content_md5)
+        req.add_header("X-XSRF-Token", self.xsrf_token)
+        try:
+          f = self.opener.open(req)
+          hdr = f.info()
+          type = hdr.getheader('Content-Type',
+                               'application/octet-stream')
+          response = f.read()
+          f.close()
+          return type, response
+        except urllib2.HTTPError, e:
+          if tries > 3:
+            raise
+          elif e.code == 401:
+            self._Authenticate()
+          elif e.code == 403:
+            if not hasattr(e, 'read'):
+              e.read = lambda self: ''
+            raise RuntimeError, '403\nxsrf: %s\n%s' \
+                  % (self.xsrf_token, e.read())
+          else:
+            raise
+    finally:
+      socket.setdefaulttimeout(old_timeout)
+
+  def _GetOpener(self):
+    """Returns an OpenerDirector that supports cookies and ignores redirects.
+
+    Returns:
+      A urllib2.OpenerDirector object.
+    """
+    opener = urllib2.OpenerDirector()
+    opener.add_handler(urllib2.ProxyHandler())
+    opener.add_handler(urllib2.UnknownHandler())
+    opener.add_handler(urllib2.HTTPHandler())
+    opener.add_handler(urllib2.HTTPDefaultErrorHandler())
+    opener.add_handler(urllib2.HTTPSHandler())
+    opener.add_handler(urllib2.HTTPErrorProcessor())
+    if self.cookie_file is not None:
+      self.cookie_jar = cookielib.MozillaCookieJar(self.cookie_file)
+      if os.path.exists(self.cookie_file):
+        try:
+          self.cookie_jar.load()
+          self.authenticated = True
+        except (cookielib.LoadError, IOError):
+          # Failed to load cookies - just ignore them.
+          pass
+      else:
+        # Create an empty cookie file with mode 600
+        fd = os.open(self.cookie_file, os.O_CREAT, 0600)
+        os.close(fd)
+      # Always chmod the cookie file
+      os.chmod(self.cookie_file, 0600)
+    else:
+      # Don't save cookies across runs of update.py.
+      self.cookie_jar = cookielib.CookieJar()
+    opener.add_handler(urllib2.HTTPCookieProcessor(self.cookie_jar))
+    return opener
+
diff --git a/webapp/codereview/proto_server.py b/webapp/codereview/proto_server.py
new file mode 100644
index 0000000..fe9784a
--- /dev/null
+++ b/webapp/codereview/proto_server.py
@@ -0,0 +1,211 @@
+# Copyright 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import base64
+import hashlib
+import hmac
+import logging
+import time
+import zlib
+
+from google.appengine.api import users
+from google.appengine.ext import webapp
+from google.appengine.ext.webapp import util
+
+from django.http import HttpResponse
+from froofle.protobuf.service import RpcController
+
+from codereview.models import Account, Settings
+from codereview.internal.util import InternalAPI
+from codereview.view_util import xsrf_for, is_xsrf_ok
+
+from codereview.review_service import ReviewServiceImp
+from codereview.internal.admin_service import AdminServiceImp
+from codereview.internal.build_service import BuildServiceImp
+from codereview.internal.bundle_store_service import BundleStoreServiceImp
+from codereview.internal.change_service import ChangeServiceImp
+from codereview.internal.merge_service import MergeServiceImp
+
+MAX_TIME_WINDOW = 5 * 60 # seconds
+XSRF_PATH = '/proto/'
+services = {}
+
+def register_service(s_impl):
+  services[s_impl.GetDescriptor().name] = s_impl
+
+register_service(ReviewServiceImp())
+register_service(AdminServiceImp())
+register_service(BuildServiceImp())
+register_service(BundleStoreServiceImp())
+register_service(ChangeServiceImp())
+register_service(MergeServiceImp())
+
+class _LocalController(RpcController):
+  def __init__(self, s_impl):
+    self._failed = None
+    self._service = s_impl
+
+  def Reset(self):
+    pass
+
+  def Failed(self):
+    pass
+
+  def ErrorText(self):
+    pass
+
+  def StartCancel(self):
+    pass
+
+  def SetFailed(self, reason):
+    logging.error("Failed on %s: %s" % (
+      self._service.__class__.__name__,
+      reason))
+    self._failed = reason
+
+  def IsCancelled(self):
+    pass
+
+  def NotifyOnCancel(self, callback):
+    pass
+
+  def HasFailed(self):
+    return self._failed is not None
+
+def token(req):
+  user = users.get_current_user()
+  if not user:
+    return HttpResponse(status=401, content="User must be logged in.")
+  return HttpResponse(content = xsrf_for(XSRF_PATH),
+                      content_type = 'application/octet-stream')
+
+def serve(req, service_name, action_name):
+  try:
+    type_str = req.META['CONTENT_TYPE']
+  except KeyError:
+    return HttpResponse(status=415, content="Invalid request body type")
+
+  type = type_str.split('; ')
+  type_dict = {}
+  type_dict['name'] = None
+  type_dict['compress'] = None
+  for t in type[1:]:
+    name, val = t.split('=', 1)
+    type_dict[name] = val
+  if type[0] != "application/x-google-protobuf":
+    return HttpResponse(status=415, content="Invalid request body type")
+
+  try: s_impl = services[service_name]
+  except KeyError:
+    return HttpResponse(status=404, content="Service not recognized.")
+
+  method = s_impl.GetDescriptor().FindMethodByName(action_name)
+  if not method:
+    return HttpResponse(status=404, content="Method not recognized.")
+
+  request = s_impl.GetRequestClass(method)()
+  request_name = request.DESCRIPTOR.full_name
+  if type_dict['name'] != request_name:
+    return HttpResponse(status=415,
+                        content="Expected a %s" % request_name)
+
+  raw_body = req.raw_post_data
+  msg_bin = raw_body
+
+  if 'HTTP_CONTENT_MD5' in req.META:
+    expmd5 = req.META['HTTP_CONTENT_MD5']
+
+    actmd5 = hashlib.md5()
+    actmd5.update(raw_body)
+    actmd5 = base64.b64encode(actmd5.digest())
+
+    if actmd5 != expmd5:
+      return HttpResponse(status=412,
+                          content="Content-MD5 incorrect")
+
+  compression = type_dict['compress']
+  if compression == 'deflate':
+    msg_bin = zlib.decompress(msg_bin)
+  elif compression:
+    return HttpResponse(status=415,
+                        content="Unsupported compression %s" % compression)
+
+  if isinstance(s_impl, InternalAPI):
+    key = Settings.get_settings().internal_api_key
+    key = base64.b64decode(key)
+
+    try:
+      date = int(req.META['HTTP_X_DATE_UTC'])
+    except KeyError:
+      return HttpResponse(status=403,
+                          content="X-Date-UTC header is required.")
+
+    try:
+      exp_sig = req.META['HTTP_AUTHORIZATION']
+    except KeyError:
+      return HttpResponse(status=403,
+                          content="Authorization header is required.")
+
+    if not exp_sig.startswith("proto :"):
+      return HttpResponse(status=403,
+                          content="Malformed authorization header.")
+    exp_sig = exp_sig[len("proto :"):]
+
+    now = time.time()
+    if abs(date - now) > MAX_TIME_WINDOW:
+      return HttpResponse(status=403,
+                          content="Request is too early or too late.")
+
+    m = hmac.new(key, digestmod=hashlib.sha1)
+    m.update('POST %s\n' % req.path)
+    m.update('X-Date-UTC: %s\n' % date)
+    m.update('Content-Type: %s\n' % type_str)
+    m.update('\n')
+    m.update(raw_body)
+    if base64.b64encode(m.digest()) != exp_sig:
+      return HttpResponse(status=403,
+                          content="Invalid request signature.")
+  else:
+    user = users.get_current_user()
+    if not user:
+      return HttpResponse(status=401, content="User must be logged in.")
+
+    try:
+      xsrf = req.META['HTTP_X_XSRF_TOKEN']
+    except KeyError:
+      return HttpResponse(status=403,
+                          content="X-XSRF-Token header required.")
+    if not is_xsrf_ok(req, path=XSRF_PATH, xsrf=xsrf):
+      return HttpResponse(status=403,
+                          content="X-XSRF-Token invalid.")
+
+  request.ParseFromString(msg_bin)
+  controller = _LocalController(s_impl)
+
+  class result_caddy:
+    _r = HttpResponse(status=500)
+    def __call__(self, r):
+      if r is not None:
+        r_bin = r.SerializeToString()
+        r_name = r.DESCRIPTOR.full_name
+        r_type = "application/x-google-protobuf; name=%s" % r_name
+        self._r = HttpResponse(content_type = r_type, content = r_bin)
+  done = result_caddy()
+
+  s_impl.http_request = req
+
+  s_impl.CallMethod(method, controller, request, done)
+  if controller.HasFailed():
+    return HttpResponse(status=500)
+  return done._r
diff --git a/webapp/codereview/review_service.py b/webapp/codereview/review_service.py
new file mode 100644
index 0000000..58dca73
--- /dev/null
+++ b/webapp/codereview/review_service.py
@@ -0,0 +1,125 @@
+# Copyright 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import logging
+
+from google.appengine.api import users
+from google.appengine.ext import db
+
+from models import gql, Project, Branch, Account
+import git_models
+
+from review_pb2 import *
+from upload_bundle_pb2 import *
+from internal.util import automatic_retry
+
+class ReviewServiceImp(ReviewService):
+  """
+    Implements the review_service API for developer clients.
+  """
+
+  @automatic_retry
+  def UploadBundle(self, rpc_controller, req, done):
+    """
+      Receives an uploaded Git style bundle and queues it for processing.
+    """
+    rsp = UploadBundleResponse()
+
+    # can't get here if there isn't a current user
+    current_user = users.get_current_user()
+    
+    if not Account.get_account_for_user(current_user).cla_verified:
+      rsp.status_code = UploadBundleResponse.UNAUTHORIZED_USER
+      done(rsp)
+      return
+
+    if not req.dest_project:
+      rsp.status_code = UploadBundleResponse.UNKNOWN_PROJECT
+      done(rsp)
+      return
+
+    proj = req.dest_project
+    if proj.endswith(".git"):
+      proj = proj[0 : len(proj) - 4]
+
+    proj = Project.get_project_for_name(proj)
+    if not proj:
+      rsp.status_code = UploadBundleResponse.UNKNOWN_PROJECT
+      done(rsp)
+      return
+
+    if not req.dest_branch:
+      rsp.status_code = UploadBundleResponse.UNKNOWN_BRANCH
+      done(rsp)
+
+    brch = Branch.get_branch_for_name(proj, req.dest_branch)
+    if not brch:
+      rsp.status_code = UploadBundleResponse.UNKNOWN_BRANCH
+      done(rsp)
+      return
+
+    rb = git_models.ReceivedBundle(
+      dest_project = proj,
+      dest_branch = brch,
+      owner = current_user,
+      state = git_models.ReceivedBundle.STATE_UPLOADING,
+      contained_objects = list(req.contained_object))
+    rb.put()
+
+    rsp.bundle_id = str(rb.key().id())
+    self._store_segment(req, rsp, rb, 1)
+    done(rsp)
+
+  @automatic_retry
+  def ContinueBundle(self, rpc_controller, req, done):
+    rsp = UploadBundleResponse()
+    rsp.bundle_id = req.bundle_id
+
+    rb = git_models.ReceivedBundle.get_by_id(int(req.bundle_id))
+    if rb is None:
+      rsp.status_code = UploadBundleResponse.UNKNOWN_BUNDLE
+      done(rsp)
+      return
+
+    if rb.owner != users.get_current_user():
+      rsp.status_code = UploadBundleResponse.NOT_BUNDLE_OWNER
+      done(rsp)
+      return
+
+    self._store_segment(req, rsp, rb, req.segment_id)
+    done(rsp)
+
+  def _store_segment(self, req, rsp, rb, segment_id):
+    rb.set_segment(segment_id, req.bundle_data)
+    def trans():
+      b = db.get(rb.key())
+      if b.state != git_models.ReceivedBundle.STATE_UPLOADING:
+        return False
+
+      if b.n_segments < segment_id:
+        b.n_segments = segment_id
+      if not req.partial_upload:
+        b.state = git_models.ReceivedBundle.STATE_NEW
+      b.put()
+      return True
+
+    if db.run_in_transaction(trans):
+      if req.partial_upload:
+        rsp.status_code = UploadBundleResponse.CONTINUE
+      else:
+        rb.ready()
+        rsp.status_code = UploadBundleResponse.RECEIVED
+    else:
+      rsp.status_code = UploadBundleResponse.BUNDLE_CLOSED
+
diff --git a/webapp/codereview/settings.py b/webapp/codereview/settings.py
new file mode 100644
index 0000000..c2c34cd
--- /dev/null
+++ b/webapp/codereview/settings.py
@@ -0,0 +1,266 @@
+# Copyright 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Views for the settings section of Gerrit.
+
+This requires Django 0.97.pre.
+"""
+
+import datetime
+import logging
+import urllib
+
+from google.appengine.api import memcache
+
+from django import forms
+from django import http
+
+import fields
+import models
+import views
+from view_util import *
+
+
+### Users settings page -- /settings ###
+
+def validate_real_name(real_name):
+  """Returns None if real_name is fine and an error message otherwise."""
+  if not real_name:
+    return 'Name cannot be empty.'
+  elif real_name == 'me':
+    return 'Of course, you are what you are.  But \'me\' is for everyone.'
+  elif '"' in real_name:
+    return 'Name cannot contain the quotation mark (") character'
+  else:
+    return None
+
+
+class SettingsForm(BaseForm):
+  _template = 'settings.html'
+
+  context = forms.IntegerField(widget = forms.Select(
+                               choices = [(x, "%d lines" % x) \
+                                          for x \
+                                          in models.CONTEXT_CHOICES]
+                               ),
+                               label = 'Context')
+  unclaimed_changes_projects = fields.ProjectSelectField()
+
+  @classmethod
+  def _init(cls, account):
+    return {'initial': {
+              'context': account.default_context,
+              'unclaimed_changes_projects': account.unclaimed_changes_projects,
+              }
+            }
+
+  def _save(self, cd, account):
+    account.default_context = cd.get("context")
+    account.unclaimed_changes_projects = cd.get("unclaimed_changes_projects")
+    memcache.delete(views.unclaimed_project_memcache_key(account.user))
+    account.put()
+
+@login_required
+def settings(request):
+  account = models.Account.current_user_account
+  def done():
+    return http.HttpResponseRedirect('/mine')
+  return process_form(request, SettingsForm, account, done)
+
+
+### Welcome page -- /settings/welcome ###
+
+class WelcomeForm1(BaseForm):
+  _template = 'settings_welcome_1.html'
+
+  dest = forms.fields.CharField(widget=forms.widgets.HiddenInput)
+  real_name = forms.fields.CharField()
+
+  @classmethod
+  def _init(cls, state):
+    account = state['account']
+    if account.real_name_entered:
+      real_name = account.real_name
+    else:
+      real_name = ""
+    return {'initial': {
+              'real_name': real_name,
+              'dest': state['dest'],
+            }
+          }
+
+  def _save(self, cd, state):
+    account = state['account']
+    account.real_name = cd['real_name']
+    account.real_name_entered = True
+    account.put()
+
+    return _init_form(WelcomeForm2, cd)
+
+class WelcomeForm2(BaseForm):
+  _template = 'settings_welcome_2.html'
+
+  cla = forms.fields.CharField(widget=forms.widgets.RadioSelect(choices=(
+                            'none', 'individual', 'corporate')))
+  dest = forms.fields.CharField(widget=forms.widgets.HiddenInput)
+
+  @classmethod
+  def _init(cls, state):
+    return {'initial': {
+              'dest': state['dest'],
+              'cla': 'none',
+            }
+          }
+
+  def _pre_verify(self, get, post):
+    if not post.get('continue'):
+      return _init_form(WelcomeForm1, post)
+
+  def _save(self, cd, state):
+    cla = cd['cla']
+    if cla == 'none':
+      account = state['account']
+      account.welcomed = True
+      account.put()
+      return _init_form(WelcomeForm4, cd)
+    elif cla == 'individual':
+      return _init_form(WelcomeForm3Individual, cd)
+    elif cla == 'corporate':
+      return _init_form(WelcomeForm3Corporate, cd)
+
+
+class WelcomeForm3Individual(BaseForm):
+  _template = 'settings_welcome_3_individual.html'
+
+  dest = forms.fields.CharField(widget=forms.widgets.HiddenInput)
+
+  i_agree = forms.fields.CharField()
+
+  mailing_address = forms.CharField(required=True,
+                          max_length=150,
+                          widget=forms.Textarea(attrs={'rows': 4, 'cols': 60}))
+  mailing_address_country = forms.CharField(max_length=30, required=True)
+  phone_number = forms.CharField(max_length=30, required=True)
+  fax_number = forms.CharField(max_length=30, required=False)
+
+  @classmethod
+  def _init(cls, state):
+    return {'initial': {
+              'dest': state['dest'],
+            }
+          }
+
+  def _pre_verify(self, get, post):
+    if not post.get('continue'):
+      return _init_form(WelcomeForm2, post)
+
+  def _save(self, cd, state):
+    if cd['i_agree'].lower() != 'i agree':
+      self.errors['i_agree'] = 'You must agree to this license.'
+      return
+    account = state['account']
+    # NOTE: just using 1 for now, future versions can come later
+    account.individual_cla_version = 1
+    account.mailing_address = cd['mailing_address']
+    account.mailing_address_country = cd['mailing_address_country']
+    account.phone_number = cd['phone_number']
+    account.fax_number = cd['fax_number']
+    account.individual_cla_timestamp = datetime.datetime.utcnow()
+    account.welcomed = True
+    account.put()
+
+    return _init_form(WelcomeForm4, cd)
+
+class WelcomeForm3Corporate(BaseForm):
+  _template = 'settings_welcome_3_corporate.html'
+
+  dest = forms.fields.CharField(widget=forms.widgets.HiddenInput)
+
+  @classmethod
+  def _init(cls, state):
+    return {'initial': {
+              'dest': state['dest'],
+            }
+          }
+
+  def _pre_verify(self, get, post):
+    if not post.get('continue'):
+      return _init_form(WelcomeForm2, post)
+
+  def _save(self, cd, state):
+    account = state['account']
+    account.welcomed = True
+    account.put()
+  
+    return _init_form(WelcomeForm4, cd)
+
+class WelcomeForm4(BaseForm):
+  _template = 'settings_welcome_4.html'
+
+  dest = forms.fields.CharField(widget=forms.widgets.HiddenInput)
+
+  @classmethod
+  def _init(cls, state):
+    return {'initial': {
+              'dest': state['dest'],
+            }
+          }
+
+  def _save(self, cd, state):
+    return http.HttpResponseRedirect(cd['dest'])
+
+
+
+_SETTINGS_STEPS = {
+  '1':      WelcomeForm1,
+  '2':      WelcomeForm2,
+  '3ind':   WelcomeForm3Individual,
+  '3corp':  WelcomeForm3Corporate,
+  '4':      WelcomeForm4,
+}
+
+def _init_form(cls, post):
+  state = {
+      'dest': post['dest'],
+      'account': models.Account.current_user_account,
+    }
+  kwargs = cls._init(state)
+  # ok to pull this from post b/c it'll be
+  # validated later when they submit
+  kwargs['initial']['xsrf'] = post['xsrf']
+  return cls(**kwargs)
+
+@login_required
+def settings_welcome(request):
+  if request.method == 'GET':
+    state = {
+      'dest': request.GET['dest'],
+      'account': models.Account.current_user_account,
+    }
+    return process_form(request, WelcomeForm1, state, None)
+  else:
+    try:
+      step = str(request.POST['step'])
+      form_cls = _SETTINGS_STEPS[step]
+    except KeyError:
+      raise http.Http404 
+    state = {
+      'dest': request.POST['dest'],
+      'account': models.Account.current_user_account,
+    }
+    params = {
+      'post_url': '/settings/welcome?dest=%s' % urllib.quote(state['dest']),
+    }
+    return process_form(request, form_cls, state, None)
+
diff --git a/webapp/codereview/urls.py b/webapp/codereview/urls.py
new file mode 100644
index 0000000..3e5e15f
--- /dev/null
+++ b/webapp/codereview/urls.py
@@ -0,0 +1,76 @@
+# Copyright 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""URL mappings for Gerrit."""
+
+# NOTE: Must import *, since Django looks for things here, e.g. handler500.
+from django.conf.urls.defaults import *
+
+urlpatterns = patterns(
+    'codereview',
+    (r'^dev_init$', 'dev_init.dev_init'),
+    (r'^proto/_token$', 'proto_server.token'),
+    (r'^proto/([^/]*)/([^/]*)$', 'proto_server.serve'),
+    (r'^$', 'views.index'),
+    (r'^all$', 'views.all'),
+    (r'^mine$', 'views.mine'),
+    (r'^unclaimed$', 'views.unclaimed'),
+    (r'^starred$', 'views.starred'),
+    (r'^r/([0-9a-f]{4,40})$', 'views.revision_redirect'),
+    (r'^(\d+)$', 'views.show'),
+    (r'^(\d+)/show$', 'views.show'),
+    (r'^(\d+)/edit$', 'views.edit'),
+    (r'^(\d+)/delete$', 'views.delete'),
+    (r'^(\d+)/publish$', 'views.publish'),
+    (r'^(\d+)/merge/(\d+)$', 'views.merge'),
+    (r'^(\d+)/ajax_patchset/(\d+)$', 'views.ajax_patchset'),
+    (r'^download/change(\d+)_(\d+)_(\d+|z[0-9a-f]{40})\.diff', 'views.download_patch'),
+    (r'^download/bundle(\d+)_(\d+)$', 'views.download_bundle'),
+    (r'^(\d+)/patch/(\d+)/(\d+|z[0-9a-f]{40})$', 'views.patch'),
+    (r'^(\d+)/diff/(\d+)/(\d+|z[0-9a-f]{40})$', 'views.diff'),
+    (r'^(\d+)/diff2/(\d+):(\d+)/(\d+|z[0-9a-f]{40})$', 'views.diff2'),
+    (r'^(\d+)/diff_skipped_lines/(\d+)/(\d+|z[0-9a-f]{40})/(\d+)/(\d+)/([tb])$',
+     'views.diff_skipped_lines'),
+    (r'^(\d+)/diff2_skipped_lines/(\d+):(\d+)/(\d+|z[0-9a-f]{40})/(\d+)/(\d+)/([tb])$',
+     'views.diff2_skipped_lines'),
+    (r'^star$', 'views.star'),
+    (r'^unstar$', 'views.unstar'),
+    (r'^user/(.+)$', 'views.show_user'),
+    (r'^ajax_user_mine/(.+)/(\d+)$', 'views.ajax_user_mine'),
+    (r'^ajax_user_review/(.+)/(\d+)$', 'views.ajax_user_review'),
+    (r'^ajax_user_closed/(.+)/(\d+)$', 'views.ajax_user_closed'),
+    (r'^inline_draft$', 'views.inline_draft'),
+    (r'^settings$', 'settings.settings'),
+    (r'^settings/welcome$', 'settings.settings_welcome'),
+    (r'^user_popup/(.+)$', 'views.user_popup'),
+    (r'^admin$', 'views.admin'),
+    (r'^admin/settings$', 'views.admin_settings'),
+    (r'^admin/settings/analytics$', 'views.admin_settings_analytics'),
+    (r'^admin/settings/from_email$', 'views.admin_settings_from_email'),
+    (r'^admin/settings/from_email_test$', 'views.admin_settings_from_email_test'),
+    (r'^admin/users$', 'people.admin_users'),
+    (r'^admin/users/verify_cla$', 'people.admin_users_verify_cla'),
+    (r'^admin/people_info$', 'people.admin_people_info'),
+    (r'^admin/user/(.+)$', 'people.admin_user'),
+    (r'^admin/groups$', 'people.admin_groups'),
+    (r'^admin/group_new$', 'people.admin_group_new'),
+    (r'^admin/group/(.+)$', 'people.admin_group'),
+    (r'^admin/group_delete/(.+)$', 'people.admin_group_delete'),
+    (r'^admin/projects$', 'project.project_list'),
+    (r'^admin/project_new$', 'project.project_new'),
+    (r'^admin/project/(.+)$', 'project.project_edit'),
+    (r'^admin/project_delete/(.+)$', 'project.project_delete'),
+    (r'^admin/datastore_delete$', 'views.admin_datastore_delete'),
+    (r'^admin/datastore_upgrade$', 'views.admin_datastore_upgrade'),
+    )
diff --git a/webapp/codereview/view_util.py b/webapp/codereview/view_util.py
new file mode 100644
index 0000000..3d3ba36
--- /dev/null
+++ b/webapp/codereview/view_util.py
@@ -0,0 +1,446 @@
+# Copyright 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import base64
+import hashlib
+import hmac
+import logging
+import os
+import time
+import urllib
+
+from google.appengine.api import users
+from google.appengine.runtime import DeadlineExceededError
+
+import django
+from django.template import loader as template_loader
+from django.http import HttpResponse, \
+                        HttpResponseRedirect, \
+                        HttpResponseForbidden, \
+                        HttpResponseNotFound
+from django.forms import ValidationError
+
+# Add our own template library.
+_library_name = __name__.rsplit('.', 1)[0] + '.library'
+if not django.template.libraries.get(_library_name, None):
+  django.template.add_to_builtins(_library_name)
+del _library_name
+
+import models
+
+IS_DEV = os.environ['SERVER_SOFTWARE'].startswith('Dev')
+MAX_XSRF_WINDOW = 4 * 60 * 60  # seconds
+
+### Decorators for request handlers ###
+
+def login_required(func):
+  """Decorator that redirects to the login page if you're not logged in."""
+  def login_wrapper(request, *args, **kwds):
+    if request.user is None:
+      return HttpResponseRedirect(
+          users.create_login_url(request.get_full_path()))
+    if not request.account.welcomed and request.path != '/settings/welcome':
+      return HttpResponseRedirect(
+          '/settings/welcome?dest=%s' % urllib.quote(request.get_full_path()))
+    return func(request, *args, **kwds)
+  return login_wrapper
+
+
+def gae_admin_required(func):
+  def admin_wrapper(request, *args, **kwds):
+    """Decorator that insists that you are a GAE admin/developer.
+    """
+    if request.user is None:
+      path = request.get_full_path()
+      return HttpResponseRedirect(users.create_login_url(path))
+    if not request.is_gae_admin:
+      return HttpResponseNotFound('Page not found')
+    return func(request, *args, **kwds)
+  return admin_wrapper
+
+
+def admin_required(func):
+  def admin_wrapper(request, *args, **kwds):
+    """Decorator that insists that you're logged in as administratior."""
+    if request.user is None:
+      return HttpResponseRedirect(
+          users.create_login_url(request.get_full_path()))
+    if not request.user_is_admin:
+      return HttpResponseNotFound('Page not found')
+    return func(request, *args, **kwds)
+  return admin_wrapper
+
+
+def project_owner_or_admin_required(func):
+  def admin_wrapper(request, *args, **kwds):
+    """Decorator that insists that you're logged in as administratior."""
+    if request.user is None:
+      return HttpResponseRedirect(
+          users.create_login_url(request.get_full_path()))
+    if not (request.user_is_admin or request.projects_owned_by_user):
+      return HttpResponseNotFound('Page not found')
+    return func(request, *args, **kwds)
+  return admin_wrapper
+
+
+def devenv_required(func):
+  def devenv_wrapper(request, *args, **kwds):
+    """Decorator that insists that you're on the development server."""
+    if not IS_DEV:
+      return HttpResponseNotFound('Page not found')
+    return func(request, *args, **kwds)
+  return devenv_wrapper
+
+
+def change_required(func):
+  """Decorator that processes the change_id handler argument."""
+  def change_wrapper(request, change_id, *args, **kwds):
+    change = models.Change.get_by_id(int(change_id))
+    if change is None:
+      return HttpResponseNotFound('No change exists with that id (%s)' %
+                                  change_id)
+    request.change = change
+    return func(request, *args, **kwds)
+  return change_wrapper
+
+
+def posted_change_required(func):
+  """Decorator that processes POST['change_id']
+  """
+  def change_wrapper(request, *args, **kwds):
+    try:
+      change_id = request.POST['change_id']
+    except KeyError:
+      return HttpResponseNotFound('No change supplied.')
+    change = models.Change.get_by_id(int(change_id))
+    if change is None:
+      return HttpResponseNotFound('No change exists with that id (%s)' %
+                                  change_id)
+    request.change = change
+    return func(request, *args, **kwds)
+  return change_wrapper
+
+
+def user_key_required(func):
+  """Decorator that processes the user handler argument."""
+  def user_key_wrapper(request, user_key, *args, **kwds):
+    user_key = urllib.unquote(user_key)
+    if '@' in user_key:
+      request.user_to_show = users.User(user_key)
+    elif ',,' in user_key:
+      request.user_to_show = users.User(user_key.replace(',,','@'))
+    else:
+      accounts = models.Account.get_accounts_for_real_name(user_key)
+      if not accounts:
+        logging.info("account not found for real_name %s" % user_key)
+        return HttpResponseNotFound('No user found with that key (%s)' %
+                                    user_key)
+      request.user_to_show = accounts[0].user
+    return func(request, *args, **kwds)
+  return user_key_wrapper
+
+
+def change_owner_required(func):
+  """Decorator that processes the change_id argument and insists you own it."""
+  @change_required
+  @login_required
+  def change_owner_wrapper(request, *args, **kwds):
+    if request.change.owner != request.user:
+      return HttpResponseForbidden('You do not own this change')
+    return func(request, *args, **kwds)
+  return change_owner_wrapper
+
+
+def patchset_required(func):
+  """Decorator that processes the patchset_id argument."""
+  @change_required
+  def patchset_wrapper(request, patchset_id, *args, **kwds):
+    patchset = models.PatchSet.get_by_id(int(patchset_id), parent=request.change)
+    if patchset is None:
+      return HttpResponseNotFound('No patch set exists with that id (%s)' %
+                                  patchset_id)
+    patchset.change = request.change
+    request.patchset = patchset
+    return func(request, *args, **kwds)
+  return patchset_wrapper
+
+
+def patch_required(func):
+  """Decorator that processes the patch_id argument."""
+  @patchset_required
+  def patch_wrapper(request, patch_id, *args, **kwds):
+    patch = models.Patch.get_patch(request.patchset, patch_id)
+    if patch is None:
+      return HttpResponseNotFound('No patch exists with that id (%s %s)' %
+                                  (request.patchset.key().id(), patch_id))
+    patch.patchset = request.patchset
+    request.patch = patch
+    return func(request, *args, **kwds)
+  return patch_wrapper
+
+
+### Render Django template ###
+
+def _parse_template(name):
+  return template_loader.get_template(name)
+
+def _lookup_template(name):
+  try:
+    t = _template_cache[name]
+  except KeyError:
+    t = _parse_template(name)
+    _template_cache[name] = t
+  return t
+_template_cache = {}
+
+if IS_DEV:
+  _get_template = _parse_template
+else:
+  _get_template = _lookup_template
+
+def respond(request, template, params=None, status=200):
+  """Render a response, passing standard stuff to the response.
+
+  Args:
+    request: The request object.
+    template: The template name; '.html' is appended automatically.
+    params: A dict giving the template parameters; modified in-place.
+
+  Returns:
+    A Django HttpResponse
+  """
+  try:
+    if params is None:
+      params = {}
+
+    params['request'] = request
+    params['user'] = request.user
+    params['is_gae_admin'] = request.is_gae_admin
+    params['is_dev'] = IS_DEV
+    params['analytics'] = models.Settings.get_settings().analytics
+    my_path = request.get_full_path()
+
+    if request.user is None:
+      params['sign_in'] = users.create_login_url(my_path)
+    else:
+      params['sign_out'] = users.create_logout_url(my_path)
+      params['star_url'] = '/star'
+      params['unstar_url'] = '/unstar'
+      params['inline_draft_url'] = '/inline_draft'
+
+    if not template.endswith('.html'):
+      template += '.html'
+    type = 'text/html; charset=UTF-8'
+
+    ctx = django.template.Context(params)
+    body = _get_template(template).render(ctx)
+    return HttpResponse(content = body,
+                        status = status,
+                        content_type= type)
+  except DeadlineExceededError:
+    logging.exception('DeadlineExceededError')
+    return HttpResponse(status=500, content='DeadlineExceededError')
+  except MemoryError:
+    logging.exception('MemoryError')
+    return HttpResponse(status=500, content='MemoryError')
+  except AssertionError:
+    logging.exception('AssertionError')
+    return HttpResponse(status=500, content='AssertionError')
+
+
+### Form Handling ###
+
+_xsrf_key = None
+_xsrf_now = None
+_xsrf_cache = {}
+
+def _now():
+  global _xsrf_now
+
+  if _xsrf_now is None:
+    _xsrf_now = time.time()
+  return _xsrf_now
+
+def _xsrf_sign(path, when):
+  global _xsrf_key
+
+  if _xsrf_key is None:
+    _xsrf_key = models.Settings.get_settings().xsrf_key
+    _xsrf_key = base64.b64decode(_xsrf_key)
+
+  user = users.get_current_user()
+  if user:
+    user_name = user.email()
+  else:
+    user_name = '-'
+
+  tok = [user_name, path, str(when)]
+  xsrf = hmac.new(_xsrf_key, digestmod=hashlib.sha1)
+  xsrf.update(':'.join(tok))
+  return base64.b64encode(str(when) + ':' + xsrf.digest())
+
+def _xsrf_check(path, xsrf):
+  if not xsrf:
+    return False
+  try:
+    when = int(base64.b64decode(xsrf).split(':', 2)[0])
+  except TypeError:
+    return False
+  except ValueError:
+    return False
+  except UnicodeEncodeError:
+    return False
+  if abs(_now() - when) > MAX_XSRF_WINDOW:
+    return False
+  return xsrf == _xsrf_sign(path, when)
+
+
+class BaseForm(django.forms.Form):
+  """A Django form which provides automatic XSRF protection,
+     assuming it is parsed/displayed by process_form()
+  """
+
+  # Name of the template the form renders itself as.
+  #
+  # Must be replaced by the subclass.
+  #
+  _template = None
+
+  xsrf = django.forms.CharField(required = False,
+                                widget = django.forms.HiddenInput)
+
+  @classmethod
+  def _init(cls, state):
+    """Obtain the initial values for the fields of the form.
+
+       Args:
+         state:  state object supplied by the caller of process_form
+       Returns:
+         dict of form constructor keywords; at minimum the key
+         'initial' must be a dict
+    """
+    return {'initial': {}}
+
+  def _pre_verify(self, get, post):
+    """Gives the form a crack at the raw post data before verification.
+
+       If this method returns an HttpResponse object, that will be
+       returned, and _save will not be called.
+    """
+    return None
+
+  def _save(self, cd, state):
+    """Processes the form data, typically saving it to the db.
+
+       Adding an error to self.errors['fieldname'] will cause
+       the form to be redisplayed, in case the save routine finds
+       problems with the submitted data and wants the user to try
+       and correct them.
+
+       Args:
+         cd:  dict of cleaned field values (same as self.cleaned_data)
+         state:  state object supplied by the caller of process_form
+    """
+    raise NotImplementedError()
+
+
+def process_form(request, form_cls, state, done, params=None):
+  """Display (or parse and process) an HTML form.
+
+     Args:
+       request:   Django request object
+       form_cls:  class object for a subclass of BaseForm
+
+       state:     any application state object, to be passed into
+                  the _init and _save methods of BaseForm
+
+       done:      a callable invoked after _save is successful;
+                  its return value is the result of this function
+
+       params:    dictional of additional parameters to pass into
+                  the Django template
+     Returns:
+       an HttpResponse (or the result of done() if _save was called)
+  """
+  if params is None:
+    params = {}
+
+  def _handle_result(result):
+    if isinstance(result, HttpResponse):
+      return result
+    elif isinstance(result, BaseForm):
+      params['form'] = result
+      return respond(request, result._template, params)
+    
+  if request.method == 'POST':
+    form = form_cls(request.POST)
+
+    if _xsrf_check(request.get_full_path(), request.POST.get('xsrf')):
+      result = form._pre_verify(request.GET, request.POST)
+      if result:
+        return _handle_result(result)
+      if form.is_valid():
+        # for form.cleaned_data to exist
+        result = form._save(form.cleaned_data, state)
+        if result:
+          return _handle_result(result)
+        if form.is_valid():
+          return done()
+    else:
+      if form.is_valid():  # this check forces cleaned_data
+        i = dict(form.cleaned_data)
+        i['xsrf'] = xsrf_for(request.get_full_path())
+        form = form_cls(initial=i)
+        form._errors = {}
+        form._errors['xsrf'] = ['Form token timed out.  Try again.']
+  else:
+    kwargs = form_cls._init(state)
+    kwargs['initial']['xsrf'] = xsrf_for(request.get_full_path())
+    form = form_cls(**kwargs)
+
+  params['form'] = form
+  return respond(request, form._template, params)
+
+
+def xsrf_for(path):
+  try:
+    return _xsrf_cache[path]
+  except KeyError:
+    pass
+  r = _xsrf_sign(path, int(_now()))
+  _xsrf_cache[path] = r
+  return r
+
+def is_xsrf_ok(request, path=None, xsrf=None):
+  if path is None:
+    path = request.get_full_path()
+  if xsrf is None:
+    xsrf = request.POST.get('xsrf')
+  return _xsrf_check(path, xsrf)
+
+def xsrf_required(func):
+  """Decorator that requires invocation by HTTP POST only,
+     and the form must have an 'xsrf' field with a valid
+     xsrf key (see xsrf_for() to make such keys).
+
+     Implies @login_required
+  """
+  def post_wrapper(request, *args, **kwds):
+    if request.method != 'POST':
+      return HttpResponse("POST request required.", status=405)
+    if not is_xsrf_ok(request):
+      return HttpResponse("Invalid xsrf signature."
+                          " Reload the prior page.", status=405)
+    return func(request, *args, **kwds)
+  return login_required(post_wrapper)
diff --git a/webapp/codereview/views.py b/webapp/codereview/views.py
new file mode 100644
index 0000000..c4eba3f
--- /dev/null
+++ b/webapp/codereview/views.py
@@ -0,0 +1,1541 @@
+# Copyright 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Views for Gerrit.
+
+This requires Django 0.97.pre.
+"""
+
+
+### Imports ###
+
+
+# Python imports
+import os
+import cgi
+import random
+import re
+import logging
+import binascii
+import datetime
+import hashlib
+import zlib
+from xml.etree import ElementTree
+from cStringIO import StringIO
+
+# AppEngine imports
+from google.appengine.api import mail
+from google.appengine.api import memcache
+from google.appengine.api import users
+from google.appengine.ext import db
+from google.appengine.ext.db import djangoforms
+
+# Django imports
+# TODO(guido): Don't import classes/functions directly.
+from django import forms
+from django import http
+from django.http import HttpResponse, HttpResponseRedirect
+from django.http import HttpResponseForbidden, HttpResponseNotFound
+from django.shortcuts import render_to_response
+import django.template
+from django.utils import simplejson
+from django.forms import formsets
+
+# Local imports
+from memcache import Key as MemCacheKey
+import models
+import email
+import engine
+import library
+import patching
+import fields
+import project
+import git_models
+from view_util import *
+
+
+### Constants ###
+
+MAX_ROWS = 1000
+
+
+### Helper functions ###
+
+
+def _random_bytes(n):
+  """Helper returning a string of random bytes of given length."""
+  return ''.join(map(chr, (random.randrange(256) for i in xrange(n))))
+
+
+### Request handlers ###
+
+
+def index(request):
+  """/ - Show a list of patches."""
+  if request.user is None:
+    return all(request)
+  else:
+    return mine(request)
+
+
+DEFAULT_LIMIT = 10
+
+def all(request):
+  """/all - Show a list of up to DEFAULT_LIMIT recent change."""
+  offset = request.GET.get('offset')
+  if offset:
+    try:
+      offset = int(offset)
+    except:
+      offset = 0
+    else:
+      offset = max(0, offset)
+  else:
+    offset = 0
+  limit = request.GET.get('limit')
+  if limit:
+    try:
+      limit = int(limit)
+    except:
+      limit = DEFAULT_LIMIT
+    else:
+      limit = max(1, min(limit, 100))
+  else:
+    limit = DEFAULT_LIMIT
+  query = db.GqlQuery('SELECT * FROM Change '
+                      'WHERE closed = FALSE ORDER BY modified DESC')
+  # Fetch one more to see if there should be a 'next' link
+  changes = query.fetch(limit+1, offset)
+  more = bool(changes[limit:])
+  if more:
+    del changes[limit:]
+  if more:
+    next = '/all?offset=%d&limit=%d' % (offset+limit, limit)
+  else:
+    next = ''
+  if offset > 0:
+    prev = '/all?offset=%d&limit=%d' % (max(0, offset-limit), limit)
+  else:
+    prev = ''
+  newest = ''
+  if offset > limit:
+    newest = '/all?limit=%d' % limit
+
+  _optimize_draft_counts(changes)
+  _prefetch_names(changes)
+  return respond(request, 'all.html',
+                 {'changes': changes, 'limit': limit,
+                  'newest': newest, 'prev': prev, 'next': next,
+                  'first': offset+1,
+                  'last': len(changes) > 1 and offset+len(changes) or None})
+
+
+def _optimize_draft_counts(changes):
+  """Force _num_drafts to zero for changes that are known to have no drafts.
+
+  Args:
+    changes: list of model.Change instances.
+
+  This inspects the drafts attribute of the current user's Account
+  instance, and forces the draft count to zero of those changes in the
+  list that aren't mentioned there.
+
+  If there is no current user, all draft counts are forced to 0.
+  """
+  account = models.Account.current_user_account
+  if account is None:
+    change_ids = None
+  else:
+    change_ids = account.drafts
+  for change in changes:
+    if change_ids is None or change.key().id() not in change_ids:
+      change._num_drafts = 0
+
+def _prefetch_names(changes):
+  for c in changes:
+    library.prefetch_names([c.owner])
+    library.prefetch_names(c.reviewers)
+    library.prefetch_names(c.cc)
+
+
+@login_required
+def mine(request):
+  """/mine - Show a list of changes created by the current user."""
+  request.user_to_show = request.user
+  return _show_user(request)
+
+def unclaimed_project_memcache_key(user):
+  return "user_unclaimed_projects:%s" % user.email()
+
+@login_required
+def unclaimed(request):
+  """/unclaimed - Show changes with no reviewer listed for user's selected
+  projects."""
+  def _get_unclaimed_projects(user):
+    memcache_key = unclaimed_project_memcache_key(user)
+    keys = memcache.get(memcache_key)
+    if keys is None:
+      account = models.Account.get_account_for_user(user)
+      keys = account.unclaimed_changes_projects
+      err = memcache.set(memcache_key, keys)
+    result = models.Project.get(keys)
+    if not result:
+      result = []
+    return result
+
+  user = request.user
+  changes = []
+
+  projects = _get_unclaimed_projects(request.user)
+  for project in projects:
+    c = models.gql(models.Change,
+                          ' WHERE closed = FALSE'
+                          '   AND claimed = FALSE'
+                          '   AND dest_project = :dest_project'
+                          ' ORDER BY modified DESC',
+                          dest_project=project.key()).fetch(1000)
+    if c:
+      _optimize_draft_counts(c)
+      _prefetch_names(c)
+      changes.append({
+          'name': project.name,
+          'changes': c,
+        })
+
+  vars = {
+      'projects': changes,
+    }
+
+  return respond(request, 'unclaimed.html', vars)
+
+
+@login_required
+def starred(request):
+  """/starred - Show a list of changes starred by the current user."""
+  stars = models.Account.current_user_account.stars
+  if not stars:
+    changes = []
+  else:
+    changes = [change for change in models.Change.get_by_id(stars)
+                    if change is not None]
+    _optimize_draft_counts(changes)
+    _prefetch_names(changes)
+  return respond(request, 'starred.html', {'changes': changes})
+
+
+@user_key_required
+def show_user(request):
+  """/user - Show the user's dashboard"""
+  return _show_user(request)
+
+@user_key_required
+def ajax_user_mine(request, offset_str):
+  m = _user_mine(request, request.user_to_show, int(offset_str))
+  return _respond_paged(request,'change_pagedrow.html',
+                        'change', 'mine', m)
+
+@user_key_required
+def ajax_user_review(request, offset_str):
+  m = _user_review(request, request.user_to_show, int(offset_str))
+  return _respond_paged(request,'change_pagedrow.html',
+                        'change', 'review', m)
+
+@user_key_required
+def ajax_user_closed(request, offset_str):
+  m = _user_closed(request, request.user_to_show, int(offset_str))
+  return _respond_paged(request,'change_pagedrow.html',
+                        'change', 'closed', m)
+
+def _respond_paged(request, template, new_pfx, old_pfx, vars):
+  return respond(request, template, {
+                 new_pfx + '_list': vars[old_pfx + '_list'],
+                 new_pfx + '_opos': vars[old_pfx + '_opos'],
+                 new_pfx + '_oend': vars[old_pfx + '_oend'],
+                 new_pfx + '_prev': vars[old_pfx + '_prev'],
+                 new_pfx + '_next': vars[old_pfx + '_next']
+                 })
+
+def _paginate(prefix, n, offset, q):
+  list = q.fetch(n + 1, offset - 1)
+  have = len(list)
+
+  if have == n + 1:
+    list = list[0:-1]
+    have = n
+    next = offset + n
+    if next >= 1000:
+      next = None
+  else:
+    next = None
+
+  if offset == 0:
+    prev = None
+  else:
+    prev = offset - n
+    if prev < 0:
+      prev = 0
+
+  if next:
+    last = next - 1
+  else:
+    last = offset + have - 1
+
+  for i in list:
+    i.paginate_row_type = prefix
+
+  return {prefix + '_list': list,
+          prefix + '_opos': offset,
+          prefix + '_oend': last,
+          prefix + '_prev': prev,
+          prefix + '_next': next}
+
+
+def _user_mine(request, user, offset):
+  r = _paginate('mine', 10, offset,
+    models.gql(models.Change,
+      'WHERE closed = FALSE AND owner = :1'
+      ' ORDER BY modified DESC',
+      user))
+  _optimize_draft_counts(r['mine_list'])
+  _prefetch_names(r['mine_list'])
+  return r
+
+def _user_review(request, user, offset):
+  r = _paginate('review', 10, offset,
+    models.gql(models.Change,
+      'WHERE closed = FALSE AND reviewers = :1'
+      ' ORDER BY modified DESC',
+      user.email()))
+  _optimize_draft_counts(r['review_list'])
+  _prefetch_names(r['review_list'])
+  return r
+
+def _user_closed(request, user, offset):
+  r =  _paginate('closed', 10, offset,
+    models.gql(models.Change,
+      'WHERE closed = TRUE AND owner = :1 AND modified > :2'
+      ' ORDER BY modified DESC',
+      user,
+      datetime.datetime.now() - datetime.timedelta(days=7)
+      ))
+  _optimize_draft_counts(r['closed_list'])
+  _prefetch_names(r['closed_list'])
+  return r
+
+def _show_user(request):
+  user = request.user_to_show
+
+  mine = _user_mine(request, user, 1)
+  review = _user_review(request, user, 1)
+  closed = _user_closed(request, user, 1)
+
+  vars = {'email': user.email()}
+  vars.update(mine)
+  vars.update(review)
+  vars.update(closed)
+
+  return respond(request, 'user.html', vars)
+
+
+def _get_emails(form, label):
+  """Helper to return the list of reviewers, or None for error."""
+  emails = []
+  raw_emails = form.cleaned_data.get(label)
+  if raw_emails:
+    for email in raw_emails.split(','):
+      email = email.strip().lower()
+      if email and email not in emails:
+        try:
+          email = db.Email(email)
+          if email.count('@') != 1:
+            raise db.BadValueError('Invalid email address: %s' % email)
+          head, tail = email.split('@')
+          if '.' not in tail:
+            raise db.BadValueError('Invalid email address: %s' % email)
+        except db.BadValueError, err:
+          form.errors[label] = [unicode(err)]
+          continue
+        emails.append(email)
+  return emails
+
+def _prepare_show_patchset(user, patchset):
+  if user:
+    drafts = list(models.gql(models.Comment,
+             'WHERE ANCESTOR IS :1'
+             ' AND draft = TRUE'
+             ' AND author = :2',
+             patchset, user))
+  else:
+    drafts = []
+
+  max_rows = 100
+  if len(patchset.filenames) < max_rows:
+    files = models.gql(models.Patch,
+                       'WHERE patchset = :1 ORDER BY filename',
+                        patchset).fetch(max_rows)
+    patchset.n_comments = 0
+    patchset.n_drafts = len(drafts)
+    patchset.patches = files
+
+    if drafts:
+      p_bykey = dict()
+      for p in patchset.patches:
+        p_bykey[p.key()] = p
+        p._num_drafts = 0
+        patchset.n_comments += p.num_comments
+
+      for d in drafts:
+        if d.parent_key() in p_bykey:
+          p = p_bykey[d.parent_key()]
+          p._num_drafts += 1
+    else:
+      for p in patchset.patches:
+          p._num_drafts = 0
+  else:
+    patchset.freaking_huge = True
+    patchset.patches = []
+
+
+def _restrict_lgtm(lgtm, can_approve):
+  if not can_approve:
+    if lgtm == 'lgtm':
+      return 'yes'
+    elif lgtm == 'reject':
+      return 'no'
+  return lgtm
+    
+
+def _restrict_verified(verified, can_verify):
+  if can_verify:
+    return verified
+  else:
+    return False
+
+def _map_status(rs, real_approvers, real_deniers, real_verifiers):
+  email = rs.user.email()
+  lgtm = _restrict_lgtm(rs.lgtm,
+      (email in real_approvers) or (email in real_deniers))
+  verified = _restrict_verified(rs.verified, email in real_verifiers)
+  return {
+      'user': rs.user,
+      'lgtm': lgtm,
+      'verified': verified,
+    }
+
+@change_required
+def show(request, form=None):
+  """/<change> - Show a change."""
+  change = request.change
+
+  messages = list(change.message_set.order('date'))
+  patchsets = list(change.patchset_set.order('id'))
+  if not patchsets:
+    return HttpResponse('No patchset available.')
+
+  last_patchset = patchsets[-1]
+  _prepare_show_patchset(request.user, last_patchset)
+
+  if last_patchset.patches:
+    first_patch = last_patchset.patches[0]
+  else:
+    first_patch = None
+
+  depends_on = [ r.patchset.change
+                 for r in last_patchset.revision.get_ancestors()
+                 if r.patchset ]
+  needed_by  = [ r.patchset.change
+                 for r in last_patchset.revision.get_children()
+                 if r.patchset ]
+
+  # approvals
+  review_status = change.get_review_status()
+  reviewer_status = models.Change.get_reviewer_status(review_status)
+  ready_to_submit = project.ready_to_submit(
+      change.dest_branch,
+      change.owner,
+      reviewer_status,
+      last_patchset.filenames)
+
+  # if the owner can lgtm or verify, show her too
+  author_status = {
+      'lgtm': 'lgtm' if ready_to_submit['owner_auto_lgtm'] else 'abstain',
+      'verified': ready_to_submit['owner_auto_verify']
+    }
+
+  show_dependencies = len(needed_by) > 0
+  for c in depends_on:
+    if not c.closed:
+      show_dependencies = True
+  if change.closed:
+    show_dependencies = False
+
+  can_submit = ready_to_submit['can_submit']
+  if not last_patchset.complete:
+    can_submit = False
+
+  real_approvers = ready_to_submit['real_approvers']
+  real_deniers = ready_to_submit['real_deniers']
+  real_verifiers = ready_to_submit['real_verifiers']
+
+  real_review_status = [
+      _map_status(rs, real_approvers, real_deniers, real_verifiers)
+      for rs in review_status]
+
+  # If the change isn't ready to submit, don't bother with this because
+  # they can't submit it anyway.
+  if can_submit:
+    user_can_submit = models.AccountGroup.is_user_submitter(request.user)
+  else:
+    user_can_submit = False
+
+  show_submit_button = ((not change.is_submitted)
+                        and ready_to_submit
+                        and user_can_submit)
+
+  _prefetch_names([change])
+  _prefetch_names(depends_on)
+  _prefetch_names(needed_by)
+  library.prefetch_names(map(lambda s: s.user, review_status))
+  return respond(request, 'change.html', {
+                  'change': change,
+                  'ready_to_submit': can_submit,
+                  'user_can_submit': user_can_submit,
+                  'show_submit_button': show_submit_button,
+                  'is_approved': ready_to_submit['approved'],
+                  'is_rejected': ready_to_submit['denied'],
+                  'is_verified': ready_to_submit['verified'],
+                  'author_status': author_status,
+                  'review_status': real_review_status,
+                  'depends_on': depends_on,
+                  'needed_by': needed_by,
+                  'show_dependencies': show_dependencies,
+                  'patchsets': patchsets,
+                  'messages': messages,
+                  'last_patchset': last_patchset,
+                  'first_patch': first_patch,
+                  'reply_url': '/%s/publish' % change.key().id(),
+                  'merge_url': '/%s/merge/%s' % (change.key().id(),
+                                                 last_patchset.key().id()),
+                })
+
+
+@patchset_required
+def ajax_patchset(request):
+  """/<change>/ajax_patchset/<ps> - Format one patchset."""
+  change = request.change
+  patchset = request.patchset
+
+  _prepare_show_patchset(request.user, patchset)
+  return respond(request, 'patchset.html',
+                 {'change' : request.change,
+                  'patchset' : request.patchset
+                 })
+
+
+def revision_redirect(request, hash):
+  """/r/<hash> - Redirect to a Change for this git revision, if we can."""
+  hash = hash.lower()
+  if len(hash) < 40:
+    q = models.gql(models.RevisionId,
+                   "WHERE id > :1 AND id < :2",
+                   hash, hash.ljust(40, 'z'))
+  else:
+    q = models.gql(models.RevisionId, "WHERE id=:1", hash)
+  revs = q.fetch(2)
+  count = len(revs)
+
+  if count == 1:
+    rev_id = revs[0]
+    if rev_id.patchset:
+      return HttpResponseRedirect('/%s' % rev_id.patchset.change.key().id())
+    else:
+      return respond(request, 'change_revision_unknown.html', { 'hash': hash })
+
+  if count > 0:
+    return http.HttpResponseServerError("error 500: multiple matches for hash")
+
+  if len(hash) < 40:
+    q = models.gql(git_models.ReceivedBundle,
+                   "WHERE contained_objects > :1"
+                   "  AND contained_objects < :2",
+                   hash, hash.ljust(40, 'z'))
+  else:
+    q = models.gql(git_models.ReceivedBundle,
+                   "WHERE contained_objects=:1",
+                   hash)
+  rb = q.get()
+  if rb:
+    return respond(request, 'change_revision_uploading.html',
+                   { 'hash': hash })
+  else:
+    return respond(request, 'change_revision_unknown.html',
+                   { 'hash': hash },
+                   status = 404)
+
+
+class EditChangeForm(BaseForm):
+  _template = 'edit.html'
+
+  reviewers = forms.CharField(required=False,
+                              max_length=1000,
+                              widget=forms.TextInput(attrs={'size': 60}))
+  cc = forms.CharField(required=False,
+                       max_length=1000,
+                       label = 'CC',
+                       widget=forms.TextInput(attrs={'size': 60}))
+  closed = forms.BooleanField(required=False)
+
+  @classmethod
+  def _init(cls, change):
+    return {'initial': {'reviewers': ', '.join(change.reviewers),
+            'cc': ', '.join(change.cc),
+            'closed': change.closed}}
+
+  def _save(self, cd, change):
+    change.closed = cd['closed']
+    change.set_reviewers(_get_emails(self, 'reviewers'))
+    change.cc = _get_emails(self, 'cc')
+    change.put()
+
+@change_owner_required
+def edit(request):
+  """/<change>/edit - Edit a change."""
+  change = request.change
+  id = change.key().id()
+  def done():
+    return HttpResponseRedirect('/%s' % id)
+  return process_form(request, EditChangeForm, change, done,
+                      {'change': change,
+                       'del_url': '/%s/delete' % id})
+
+
+@change_owner_required
+@xsrf_required
+def delete(request):
+  """/<change>/delete - Delete a change.  There is no way back."""
+  change = request.change
+
+  for ps in models.PatchSet.gql('WHERE ANCESTOR IS :1', change):
+    for rev in models.RevisionId.get_for_patchset(ps):
+      rev.patchset = None
+      rev.put()
+
+  tbd = []
+  for cls in [models.Patch,
+              models.PatchSet,
+              models.PatchSetFilenames,
+              models.Comment,
+              models.Message,
+              models.ReviewStatus]:
+    tbd += cls.gql('WHERE ANCESTOR IS :1', change).fetch(50)
+    if len(tbd) > 100:
+      db.delete(tbd)
+      return respond(request, 'delete_loop.html',
+                     {'change': change,
+                      'del_url': '/%s/delete' % id})
+
+  tbd += [change]
+  db.delete(tbd)
+  return HttpResponseRedirect('/mine')
+
+
+@xsrf_required
+@patchset_required
+def merge(request):
+  """/<change>/merge/<patchset> - Submit a change for merge."""
+  change = request.change
+  patchset = request.patchset
+  patchset.patches = list(patchset.patch_set.order('filename'))
+
+  if not models.AccountGroup.is_user_submitter(request.user):
+    # The button shouldn't exist if they can't do it, if they somehow
+    # managed to get here, just send them back to the change
+    # (which ought to have the button gone this time).
+    return HttpResponseRedirect('/%d' % change.key().id())
+
+  # approvals
+  reviewer_status = models.Change.get_reviewer_status(
+      change.get_review_status())
+  ready_to_submit = project.ready_to_submit(
+      change.dest_branch,
+      change.owner,
+      reviewer_status,
+      patchset.filenames)
+
+  if not ready_to_submit['can_submit']:
+    # Again, the button shouldn't have been there in this case.
+    # Just send 'em back to the change page.
+    return HttpResponseRedirect('/%d' % change.key().id())
+
+  try:
+    change.submit_merge(patchset)
+    change.put()
+  except models.InvalidSubmitMergeException, why:
+    return HttpResponseForbidden(str(why))
+  return HttpResponseRedirect('/mine')
+
+
+@patch_required
+def patch(request):
+  """/<change>/patch/<patchset>/<patch> - View a raw patch."""
+  return patch_helper(request)
+
+
+def patch_helper(request, nav_type='patch'):
+  """Returns a unified diff.
+
+  Args:
+    request: Django Request object.
+    nav_type: the navigation used in the url (i.e. patch/diff/diff2).  Normally
+      the user looks at either unified or side-by-side diffs at one time, going
+      through all the files in the same mode.  However, if side-by-side is not
+      available for some files, we temporarly switch them to unified view, then
+      switch them back when we can.  This way they don't miss any files.
+
+  Returns:
+    Whatever respond() returns.
+  """
+  _add_next_prev(request.patchset, request.patch)
+  request.patch.nav_type = nav_type
+  parsed_lines = patching.ParsePatchToLines(request.patch.patch_lines)
+  if parsed_lines is None:
+    return HttpResponseNotFound('Can\'t parse the patch')
+  rows = engine.RenderUnifiedTableRows(request, parsed_lines)
+  return respond(request, 'patch.html',
+                 {'patch': request.patch,
+                  'patchset': request.patchset,
+                  'rows': rows,
+                  'change': request.change})
+
+
+@patch_required
+def download_patch(request):
+  """/download/change<change>_<patchset>_<patch>.diff - Download patch."""
+  return HttpResponse(request.patch.patch_text, content_type='text/plain')
+
+
+def _get_context_for_user(request):
+  """Returns the context setting for a user.
+
+  The value is validated against models.CONTEXT_CHOICES.
+  If an invalid value is found, the value is overwritten with
+  models.DEFAULT_CONTEXT.
+  """
+  if request.user:
+    account = models.Account.current_user_account
+    default_context = account.default_context
+  else:
+    default_context = models.DEFAULT_CONTEXT
+  try:
+    context = int(request.GET.get("context", default_context))
+  except ValueError:
+    context = default_context
+  if context not in models.CONTEXT_CHOICES:
+    context = models.DEFAULT_CONTEXT
+  return context
+
+
+@patch_required
+def diff(request):
+  """/<change>/diff/<patchset>/<patch> - View a patch as a side-by-side diff"""
+  patchset = request.patchset
+  patch = request.patch
+
+  context = _get_context_for_user(request)
+  rows = _get_diff_table_rows(request, patch, context)
+  if isinstance(rows, HttpResponseNotFound):
+    return rows
+
+  _add_next_prev(patchset, patch)
+  return respond(request, 'diff.html',
+                 {'change': request.change, 'patchset': patchset,
+                  'patch': patch, 'rows': rows,
+                  'context': context, 'context_values': models.CONTEXT_CHOICES})
+
+
+def _get_diff_table_rows(request, patch, context):
+  """Helper function that returns rendered rows for a patch"""
+  chunks = patching.ParsePatchToChunks(patch.patch_lines,
+                                       patch.filename)
+  if chunks is None:
+    return HttpResponseNotFound('Can\'t parse the patch')
+
+  return list(engine.RenderDiffTableRows(request, patch.old_lines,
+                                         chunks, patch,
+                                         context=context))
+
+
+@patch_required
+def diff_skipped_lines(request, id_before, id_after, where):
+  """/<change>/diff/<patchset>/<patch> - Returns a fragment of skipped lines"""
+  patchset = request.patchset
+  patch = request.patch
+
+  # TODO: allow context = None?
+  rows = _get_diff_table_rows(request, patch, 10000)
+  if isinstance(rows, HttpResponseNotFound):
+    return rows
+  return _get_skipped_lines_response(rows, id_before, id_after, where)
+
+
+def _get_skipped_lines_response(rows, id_before, id_after, where):
+  """Helper function that creates a Response object for skipped lines"""
+  response_rows = []
+  id_before = int(id_before)
+  id_after = int(id_after)
+
+  if where == "b":
+    rows.reverse()
+
+  for row in rows:
+    m = re.match('^<tr( name="hook")? id="pair-(?P<rowcount>\d+)">', row)
+    if m:
+      curr_id = int(m.groupdict().get("rowcount"))
+      if curr_id < id_before or curr_id > id_after:
+        continue
+      if where  == "b" and curr_id <= id_after:
+        response_rows.append(row)
+      elif where == "t" and curr_id >= id_before:
+        response_rows.append(row)
+      if len(response_rows) >= 10:
+        break
+
+  # Create a usable structure for the JS part
+  response = []
+  dom = ElementTree.parse(StringIO('<div>%s</div>' % "".join(response_rows)))
+  for node in dom.getroot().getchildren():
+    content = "\n".join([ElementTree.tostring(x) for x in node.getchildren()])
+    response.append([node.items(), content])
+  return HttpResponse(simplejson.dumps(response))
+
+
+def _get_diff2_data(request, ps_left_id, ps_right_id, patch_id, context):
+  """Helper function that returns objects for diff2 views"""
+  ps_left = models.PatchSet.get_by_id(int(ps_left_id), parent=request.change)
+  if ps_left is None:
+    return HttpResponseNotFound('No patch set exists with that id (%s)' %
+                                ps_left_id)
+  ps_left.change = request.change
+  ps_right = models.PatchSet.get_by_id(int(ps_right_id), parent=request.change)
+  if ps_right is None:
+    return HttpResponseNotFound('No patch set exists with that id (%s)' %
+                                ps_right_id)
+  ps_right.change = request.change
+  patch_right = models.Patch.get_patch(ps_right, patch_id)
+  if patch_right is None:
+    return HttpResponseNotFound('No patch exists with that id (%s/%s)' %
+                                (ps_right_id, patch_id))
+  patch_right.patchset = ps_right
+  # Now find the corresponding patch in ps_left
+  patch_left = models.Patch.gql('WHERE patchset = :1 AND filename = :2',
+                                ps_left, patch_right.filename).get()
+  if patch_left is None:
+    return HttpResponseNotFound(
+        "Patch set %s doesn't have a patch with filename %s" %
+        (ps_left_id, patch_right.filename))
+
+  rows = engine.RenderDiff2TableRows(request,
+                                     patch_left.new_lines, patch_left,
+                                     patch_right.new_lines, patch_right,
+                                     context=context)
+  rows = list(rows)
+  if rows and rows[-1] is None:
+    del rows[-1]
+
+  return dict(patch_left=patch_left, ps_left=ps_left,
+              patch_right=patch_right, ps_right=ps_right,
+              rows=rows)
+
+
+@change_required
+def diff2(request, ps_left_id, ps_right_id, patch_id):
+  """/<change>/diff2/... - View the delta between two different patch sets."""
+  context = _get_context_for_user(request)
+  data = _get_diff2_data(request, ps_left_id, ps_right_id, patch_id, context)
+  if isinstance(data, HttpResponseNotFound):
+    return data
+
+  _add_next_prev(data["ps_right"], data["patch_right"])
+  return respond(request, 'diff2.html',
+                 {'change': request.change,
+                  'ps_left': data["ps_left"],
+                  'patch_left': data["patch_left"],
+                  'ps_right': data["ps_right"],
+                  'patch_right': data["patch_right"],
+                  'rows': data["rows"],
+                  'patch_id': patch_id,
+                  'context': context,
+                  'context_values': models.CONTEXT_CHOICES,
+                  })
+
+
+@change_required
+def diff2_skipped_lines(request, ps_left_id, ps_right_id, patch_id,
+                        id_before, id_after, where):
+  """/<change>/diff2/... - Returns a fragment of skipped lines"""
+  data = _get_diff2_data(request, ps_left_id, ps_right_id, patch_id, 10000)
+  if isinstance(data, HttpResponseNotFound):
+    return data
+  return _get_skipped_lines_response(data["rows"], id_before, id_after, where)
+
+
+def _add_next_prev(patchset, patch):
+  """Helper to add .next and .prev attributes to a patch object."""
+  patch.prev = patch.next = None
+  patches = list(models.Patch.gql("WHERE patchset = :1 ORDER BY filename",
+                                  patchset))
+  patchset.patches = patches  # Required to render the jump to select.
+  last = None
+  for p in patches:
+    if last is not None:
+      if p.filename == patch.filename:
+        patch.prev = last
+      elif last.filename == patch.filename:
+        patch.next = p
+        break
+    last = p
+
+
+def inline_draft(request):
+  """/inline_draft - Ajax handler to submit an in-line draft comment.
+
+  This wraps _inline_draft(); all exceptions are logged and cause an
+  abbreviated response indicating something went wrong.
+  """
+  if request.method != 'POST':
+    return HttpResponse("POST request required.", status=405)
+  try:
+    return _inline_draft(request)
+  except Exception, err:
+    s = ''
+    for k,v in request.POST.iteritems():
+      s += '\n%s=%s' % (k, v)
+    logging.exception('Exception in inline_draft processing:%s' % s)
+    return HttpResponse('<font color="red">'
+                        'Please report error "%s".'
+                        '</font>'
+                        % err.__class__.__name__)
+
+
+def _inline_draft(request):
+  """Helper to submit an in-line draft comment.
+  """
+  # Don't use @login_required; JS doesn't understand redirects.
+  if not request.user:
+    return HttpResponse('<font color="red">Not logged in</font>')
+
+  if not is_xsrf_ok(request):
+    return HttpResponse('<font color="red">'
+                        'Stale xsrf signature.<br />'
+                        'Please reload the page and try again.'
+                        '</font>')
+
+  snapshot = request.POST.get('snapshot')
+  assert snapshot in ('old', 'new'), repr(snapshot)
+  left = (snapshot == 'old')
+  side = request.POST.get('side')
+  assert side in ('a', 'b'), repr(side)  # Display left (a) or right (b)
+  change_id = int(request.POST['change'])
+  change = models.Change.get_by_id(change_id)
+  assert change  # XXX
+  patchset_id = request.POST.get('patchset') or request.POST[side == 'a' and 'ps_left' or 'ps_right']
+  patchset = models.PatchSet.get_by_id(int(patchset_id), parent=change)
+  assert patchset  # XXX
+  patch_id = request.POST.get('patch') or request.POST[side == 'a' and 'patch_left' or 'patch_right']
+  patch = models.Patch.get_patch(patchset, patch_id)
+  assert patch  # XXX
+  text = request.POST.get('text')
+  lineno = int(request.POST['lineno'])
+  message_id = request.POST.get('message_id')
+  comment = None
+  if message_id:
+    comment = models.Comment.get_by_key_name(message_id, parent=patch)
+    if comment is None or not comment.draft or comment.author != request.user:
+      comment = None
+      message_id = None
+  if not message_id:
+    # Prefix with 'z' to avoid key names starting with digits.
+    message_id = 'z' + binascii.hexlify(_random_bytes(16))
+
+  if not text.rstrip():
+    if comment is not None:
+      assert comment.draft and comment.author == request.user
+      comment.delete()  # Deletion
+      comment = None
+      # Re-query the comment count.
+      models.Account.current_user_account.update_drafts(change)
+  else:
+    if comment is None:
+      comment = models.Comment(
+                  patch=patch,
+                  key_name=message_id,
+                  parent=patch)
+    comment.lineno = lineno
+    comment.left = left
+    comment.author = request.user
+    comment.text = db.Text(text)
+    comment.message_id = message_id
+    comment.put()
+    # The actual count doesn't matter, just that there's at least one.
+    models.Account.current_user_account.update_drafts(change, 1)
+
+  query = models.Comment.gql(
+      'WHERE patch = :patch AND lineno = :lineno AND left = :left '
+      'ORDER BY date',
+      patch=patch, lineno=lineno, left=left)
+  comments = list(c for c in query if not c.draft or c.author == request.user)
+  if comment is not None and comment.author is None:
+    # Show anonymous draft even though we don't save it
+    comments.append(comment)
+  if not comments:
+    return HttpResponse(' ')
+  for c in comments:
+    c.complete(patch)
+  return render_to_response('inline_comment.html',
+                            {'inline_draft_url': '/inline_draft',
+                             'user': request.user,
+                             'patch': patch,
+                             'patchset': patchset,
+                             'change': change,
+                             'comments': comments,
+                             'lineno': lineno,
+                             'snapshot': snapshot,
+                             'side': side})
+
+
+class PublishCommentsForm(BaseForm):
+  _template = 'publish.html'
+
+  reviewers = forms.CharField(required=False,
+                              max_length=1000,
+                              widget=forms.TextInput(attrs={'size': 60}))
+  cc = forms.CharField(required=False,
+                       max_length=1000,
+                       label = 'CC',
+                       widget=forms.TextInput(attrs={'size': 60}))
+  send_mail = forms.BooleanField(required=False)
+  message = forms.CharField(required=False,
+                            max_length=10000,
+                            widget=forms.Textarea(attrs={'cols': 60}))
+
+  lgtm = forms.CharField(label='Code review')
+  verified = forms.BooleanField(required=False,
+                                label='Verified')
+
+
+
+  def __init__(self, *args, **kwargs):
+    is_initial = kwargs.pop('is_initial', False)
+    self.user_can_approve = kwargs.pop('user_can_approve', False)
+    self.user_can_verify = kwargs.pop('user_can_verify', False)
+    self.user_is_owner = kwargs.pop('user_is_owner', False)
+
+    BaseForm.__init__(self, *args, **kwargs)
+
+    if is_initial:
+      # only show the available lgtm options
+      lgtm_field = self.fields.get("lgtm")
+      if self.user_can_approve and not self.user_is_owner:
+        lgtm_field.widget = forms.RadioSelect(choices=models.LGTM_CHOICES)
+      else:
+        lgtm_field.widget = forms.RadioSelect(
+               choices=models.LIMITED_LGTM_CHOICES)
+      
+      # only show verified if the user can do it
+      if not self.user_can_verify or self.user_is_owner:
+        del self.fields['verified']
+
+  @classmethod
+  def _init(cls, state):
+    request, change = state
+    user = request.user
+
+    reviewers = list(change.reviewers)
+    cc = list(change.cc)
+
+    if user != change.owner and user.email() not in reviewers:
+      reviewers.append(user.email())
+      if user.email() in cc:
+        cc.remove(user.email())
+
+    (user_can_approve,user_can_verify) = project.user_can_approve(
+          request.user, change)
+
+    # Pick the proper review / verify status
+    review = change.get_review_status(user)
+    if review:
+      lgtm = _restrict_lgtm(review.lgtm, user_can_approve)
+      verified = review.verified
+    else:
+      lgtm = 'abstain'
+      verified = False
+
+    return {'initial': {
+              'reviewers': ', '.join(reviewers),
+              'cc': ', '.join(cc),
+              'send_mail': True,
+              'lgtm': lgtm,
+              'verified': verified
+              },
+            'user_can_approve': user_can_approve,
+            'user_can_verify': user_can_verify,
+            'user_is_owner': user == change.owner,
+            'is_initial': True,
+          }
+
+  def _save(self, cd, state):
+    request, change = state
+    user = request.user
+
+    tbd, comments = _get_draft_comments(request, change)
+    reviewers = _get_emails(self, 'reviewers')
+    cc = _get_emails(self, 'cc')
+    (self.user_can_approve,self.user_can_verify) = project.user_can_approve(
+          request.user, change)
+    lgtm = _restrict_lgtm(cd.get('lgtm', ''), self.user_can_approve)
+    verified = _restrict_verified(cd.get('verified', False),
+          self.user_can_verify)
+
+    if user != change.owner:
+      # Owners shouldn't have their own review status as it
+      # is implied that 'lgtm' and verified by them.
+      #
+      review_status = _update_review_status(change,
+                                            user,
+                                            lgtm,
+                                            verified)
+      tbd.append(review_status)
+
+    change.set_reviewers(reviewers)
+    change.cc = cc
+    change.update_comment_count(len(comments))
+
+    msg = _make_comment_message(request, change, lgtm, verified,
+                        cd['message'],
+                        comments,
+                        cd['send_mail'])
+    tbd.append(msg)
+    tbd.append(change)
+
+    while tbd:
+      db.put(tbd[:50])
+      tbd = tbd[50:]
+    models.Account.current_user_account.update_drafts(change, 0)
+
+@change_required
+@login_required
+def publish(request):
+  """ /<change>/publish - Publish draft comments and send mail."""
+  change = request.change
+
+  tbd, comments = _get_draft_comments(request, change, True)
+  preview = _get_draft_details(request, comments)
+
+  def done():
+    return HttpResponseRedirect('/%s' % change.key().id())
+  return process_form(request, PublishCommentsForm, (request, change), done,
+                      {'change': change,
+                       'preview' : preview})
+
+
+def _update_review_status(change, user, lgtm, verified):
+  """Creates / updates the ReviewStatus for a user, returns that object."""
+  review = change.set_review_status(user)
+  review.lgtm = lgtm
+  review.verified = verified
+  return review
+
+
+
+def _encode_safely(s):
+  """Helper to turn a unicode string into 8-bit bytes."""
+  if isinstance(s, unicode):
+    s = s.encode('utf-8')
+  return s
+
+
+def _get_draft_comments(request, change, preview=False):
+  """Helper to return objects to put() and a list of draft comments.
+
+  If preview is True, the list of objects to put() is empty to avoid changes
+  to the datastore.
+
+  Args:
+    request: Django Request object.
+    change: Change instance.
+    preview: Preview flag (default: False).
+
+  Returns:
+    2-tuple (put_objects, comments).
+  """
+  comments = []
+  tbd = []
+  dps = dict()
+
+  # XXX Should request all drafts for this change once, now we can.
+  for patchset in change.patchset_set.order('id'):
+    ps_comments = list(models.Comment.gql(
+        'WHERE ANCESTOR IS :1 AND author = :2 AND draft = TRUE',
+        patchset, request.user))
+    if ps_comments:
+      patches = dict((p.key(), p) for p in patchset.patch_set)
+      for p in patches.itervalues():
+        p.patchset = patchset
+      for c in ps_comments:
+        c.draft = False
+        # XXX Using internal knowledge about db package: the key for
+        # reference property foo is stored as _foo.
+        pkey = getattr(c, '_patch', None)
+        if pkey in patches:
+          patch = patches[pkey]
+          c.patch = patch
+        if pkey not in dps:
+          dps[pkey] = c.patch
+        c.patch.update_comment_count(1)
+      if not preview:
+        tbd += ps_comments
+      ps_comments.sort(key=lambda c: (c.patch.filename, not c.left,
+                                      c.lineno, c.date))
+      comments += ps_comments
+  if not preview:
+    tbd += dps.values()
+  return tbd, comments
+
+FILE_LINE = '======================================================================'
+COMMENT_LINE = '------------------------------'
+
+def _get_draft_details(request, comments):
+  """Helper to display comments with context in the email message."""
+  last_key = None
+  output = []
+  linecache = {}  # Maps (c.patch.filename, c.left) to list of lines
+  for c in comments:
+    if (c.patch.filename, c.left) != last_key:
+      if not last_key is None:
+        output.append('%s\n' % FILE_LINE)
+      url = request.build_absolute_uri('/%d/diff/%d/%s' %
+                                       (request.change.key().id(),
+                                        c.patch.patchset.key().id(),
+                                        c.patch.id))
+      output.append('\n%s\n%s\nFile %s:' % (FILE_LINE, url, c.patch.filename))
+      last_key = (c.patch.filename, c.left)
+      patch = c.patch
+      if c.left:
+        linecache[last_key] = patch.old_lines
+      else:
+        linecache[last_key] = patch.new_lines
+    file_lines = linecache.get(last_key, ())
+    context = ''
+    if 1 <= c.lineno <= len(file_lines):
+      context = file_lines[c.lineno - 1].strip()
+    url = request.build_absolute_uri('/%d/diff/%d/%s#%scode%d' %
+                                     (request.change.key().id(),
+                                      c.patch.patchset.key().id(),
+                                      c.patch.id,
+                                      c.left and "old" or "new",
+                                      c.lineno))
+    output.append('%s\nLine %d: %s\n%s'  % (COMMENT_LINE, c.lineno,
+                                                context, c.text.rstrip()))
+  if not last_key is None:
+    output.append('%s\n' % FILE_LINE)
+  return '\n'.join(output)
+
+def _make_comment_message(request, change, lgtm, verified, message,
+                  comments=None, send_mail=False):
+  """Helper to create a Message instance and optionally send an email."""
+  # Decide who should receive mail
+  my_email = db.Email(request.user.email())
+  to = [db.Email(change.owner.email())] + change.reviewers
+  cc = change.cc[:]
+  reply_to = to + cc
+  if my_email in to and len(to) > 1:  # send_mail() wants a non-empty to list
+    to.remove(my_email)
+  if my_email in cc:
+    cc.remove(my_email)
+  subject = email.make_change_subject(change)
+  if comments:
+    details = _get_draft_details(request, comments)
+  else:
+    details = ''
+  prefix = ''
+  if lgtm:
+    prefix = prefix + [y for (x,y) in models.LGTM_CHOICES
+                       if x == lgtm][0] + '\n'
+  if verified:
+    prefix = prefix + 'Verified.\n'
+  if prefix:
+    prefix = prefix + '\n'
+  message = message.replace('\r\n', '\n')
+  message = prefix + message
+  text = ((message.strip() + '\n\n' + details.strip())).strip()
+  msg = models.Message(change=change,
+                       subject=subject,
+                       sender=my_email,
+                       recipients=reply_to,
+                       text=db.Text(text),
+                       parent=change)
+
+  if send_mail:
+    to_users = set([change.owner] + change.reviewers + cc)
+    template_args = {
+        'message': message,
+        'details': details,
+      }
+    email.send_change_message(request, change,
+                              'mails/comment.txt', template_args)
+
+  return msg
+
+
+@xsrf_required
+@posted_change_required
+def star(request):
+  account = models.Account.current_user_account
+  if account.stars is None:
+    account.stars = []
+  id = request.change.key().id()
+  if id not in account.stars:
+    account.stars.append(id)
+    account.put()
+  return respond(request, 'change_star.html', {'change': request.change})
+
+
+@xsrf_required
+@posted_change_required
+def unstar(request):
+  account = models.Account.current_user_account
+  if account.stars is None:
+    account.stars = []
+  id = request.change.key().id()
+  if id in account.stars:
+    account.stars[:] = [i for i in account.stars if i != id]
+    account.put()
+  return respond(request, 'change_star.html', {'change': request.change})
+
+
+@gae_admin_required
+def download_bundle(request, bundle_id, segment_id):
+  """/download/bundle(\d+)_(\d+) - get a bundle segment"""
+  rb = git_models.ReceivedBundle.get_by_id(int(bundle_id))
+  if not rb:
+    return HttpResponseNotFound('No bundle exists with that id (%s)' % bundle_id)
+  seg = rb.get_segment(int(segment_id))
+  if not seg:
+    return HttpResponseNotFound('No segment %s in bundle %s' % (segment_id,bundle_id))
+  return HttpResponse(seg.bundle_data,
+                      content_type='application/x-git-bundle-segment')
+
+
+### Administration ###
+
+@project_owner_or_admin_required
+def admin(request):
+  """/admin - user & other settings"""
+  return respond(request, 'admin.html', {})
+
+@gae_admin_required
+def admin_settings(request):
+  settings = models.Settings.get_settings()
+  return respond(request, 'admin_settings.html', {
+            'settings': settings,
+            'from_email_test_xsrf': xsrf_for('/admin/settings/from_email_test')
+          })
+
+class AdminSettingsAnalyticsForm(BaseForm):
+  _template = 'admin_settings_analytics.html'
+
+  analytics = forms.CharField(required=False, max_length=20,
+                              widget=forms.TextInput(attrs={'size': 20}))
+
+  @classmethod
+  def _init(cls, state):
+    settings = models.Settings.get_settings()
+    return {'initial': {
+                'analytics': settings.analytics,
+              }
+            }
+
+  def _save(self, cd, change):
+    settings = models.Settings.get_settings()
+    settings.analytics = cd['analytics']
+    settings.put()
+
+@gae_admin_required
+def admin_settings_analytics(request):
+  def done():
+    return HttpResponseRedirect('/admin/settings')
+  return process_form(request, AdminSettingsAnalyticsForm, None, done)
+
+class AdminSettingsFromEmailForm(BaseForm):
+  _template = 'admin_settings_from_email.html'
+
+  from_email = forms.CharField(required=False,
+                              max_length=60,
+                              widget=forms.TextInput(attrs={'size': 60}))
+
+  @classmethod
+  def _init(cls, state):
+    settings = models.Settings.get_settings()
+    return {'initial': {
+                'from_email': settings.from_email,
+              }
+            }
+
+  def _save(self, cd, change):
+    settings = models.Settings.get_settings()
+    settings.from_email = cd['from_email']
+    settings.put()
+
+@gae_admin_required
+def admin_settings_from_email(request):
+  def done():
+    return HttpResponseRedirect('/admin/settings')
+  return process_form(request, AdminSettingsFromEmailForm, None, done)
+
+@gae_admin_required
+def admin_settings_from_email_test(request):
+  if request.method == 'POST':
+    if is_xsrf_ok(request, xsrf=request.POST.get('xsrf')):
+      address = email.get_default_sender()
+      try:
+        mail.check_email_valid(address, 'blah')
+        email.send(None, [models.Account.current_user_account], 'test',
+                              'mails/from_email_test.txt', None)
+        status = 'email sent'
+      except mail.InvalidEmailError:
+        status = 'invalid email address'
+      return respond(request, 'admin_settings_from_email_test.html', {
+                  'status': status,
+                  'address': address
+                })
+  return HttpResponse('<font color="red">Ich don\'t think so!</font>')
+
+
+
+### User Profiles ###
+
+def validate_real_name(real_name):
+  """Returns None if real_name is fine and an error message otherwise."""
+  if not real_name:
+    return 'Name cannot be empty.'
+  elif real_name == 'me':
+    return 'Of course, you are what you are.  But \'me\' is for everyone.'
+  else:
+    return None
+
+
+@user_key_required
+def user_popup(request):
+  """/user_popup - Pop up to show the user info."""
+  try:
+    user = request.user_to_show
+    def gen():
+      account = models.Account.get_account_for_user(user)
+      return render_to_response('user_popup.html', {'account': account})
+    return MemCacheKey('user_popup:' + user.email(), 300).get(gen)
+  except Exception, err:
+    logging.exception('Exception in user_popup processing:')
+    return HttpResponse(
+      '<font color="red">Error: %s; please report!</font>'
+      % err.__class__.__name__)
+
+
+class AdminDataStoreDeleteForm(BaseForm):
+  _template = 'admin_datastore_delete.html'
+
+  really = forms.CharField(required=True)
+
+  def _save(self, cd, request):
+    if cd['really'] != 'DELETE EVERYTHING':
+      return self
+
+    max_cnt = 50
+    rm = []
+    specials = []
+    for cls in [models.ApprovalRight,
+                models.Project,
+                models.Branch,
+                models.RevisionId,
+                models.BuildAttempt,
+                models.Change,
+                models.PatchSetFilenames,
+                models.PatchSet,
+                models.Message,
+                models.DeltaContent,
+                models.Patch,
+                models.Comment,
+                models.Bucket,
+                models.ReviewStatus,
+                models.Account,
+                models.AccountGroup,
+                git_models.ReceivedBundleSegment,
+                git_models.ReceivedBundle,
+               ]:
+      all = cls.all().fetch(max_cnt)
+      if cls == models.Account:
+        for a in all:
+          if a.key() == request.account.key():
+            specials.append(a)
+          else:
+            rm.append(a)
+      elif cls == models.AccountGroup:
+        for a in all:
+          if a.is_auto_group:
+            specials.append(a)
+          else:
+            rm.append(a)
+      else:
+        rm.extend(all)
+      if len(rm) >= max_cnt:
+        break
+
+    if rm:
+      # Delete this block of data and continue via
+      # a JavaScript reload in the browser.
+      #
+      db.delete(rm)
+      return self
+
+    # We are done with the bulk of the content, but we need
+    # to clean up a few special objects.
+    #
+    library._user_cache.clear()
+    models.Settings._Key.clear()
+
+    specials.extend(models.Settings.all().fetch(100))
+    db.delete(specials)
+    return None
+
+@gae_admin_required
+def admin_datastore_delete(request):
+  def done():
+    return HttpResponseRedirect('/')
+  return process_form(request, AdminDataStoreDeleteForm, request, done)
+
+
+class AdminDataStoreUpgradeForm(BaseForm):
+  _template = 'admin_datastore_upgrade.html'
+
+  really = forms.CharField(required=True)
+
+  def _save(self, cd, request):
+    if cd['really'] != 'UPGRADE':
+      return self
+    return None
+
+@gae_admin_required
+def admin_datastore_upgrade(request):
+  def done():
+    return HttpResponseRedirect('/')
+  return process_form(request, AdminDataStoreUpgradeForm, request, done)
diff --git a/webapp/django/__init__.py b/webapp/django/__init__.py
new file mode 100644
index 0000000..d0f42e5
--- /dev/null
+++ b/webapp/django/__init__.py
@@ -0,0 +1,9 @@
+VERSION = (1, 0, 'beta_1')
+
+def get_version():
+    "Returns the version as a human-format string."
+    v = '.'.join([str(i) for i in VERSION[:-1]])
+    if VERSION[-1]:
+        from django.utils.version import get_svn_revision
+        v = '%s-%s-%s' % (v, VERSION[-1], get_svn_revision())
+    return v
diff --git a/webapp/django/bin/__init__.py b/webapp/django/bin/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/bin/__init__.py
diff --git a/webapp/django/bin/compile-messages.py b/webapp/django/bin/compile-messages.py
new file mode 100755
index 0000000..0deaf6a
--- /dev/null
+++ b/webapp/django/bin/compile-messages.py
@@ -0,0 +1,11 @@
+#!/usr/bin/env python
+
+if __name__ == "__main__":
+    import sys
+    name = sys.argv[0]
+    args = ' '.join(sys.argv[1:])
+    print >> sys.stderr, "%s has been moved into django-admin.py" % name
+    print >> sys.stderr, 'Please run "django-admin.py compilemessages %s" instead.'% args
+    print >> sys.stderr
+    sys.exit(1)
+
diff --git a/webapp/django/bin/daily_cleanup.py b/webapp/django/bin/daily_cleanup.py
new file mode 100644
index 0000000..c9f4cb9
--- /dev/null
+++ b/webapp/django/bin/daily_cleanup.py
@@ -0,0 +1,13 @@
+#!/usr/bin/env python
+
+"""
+Daily cleanup job.
+
+Can be run as a cronjob to clean out old data from the database (only expired
+sessions at the moment).
+"""
+
+from django.core import management
+
+if __name__ == "__main__":
+    management.call_command('cleanup')
diff --git a/webapp/django/bin/django-admin.py b/webapp/django/bin/django-admin.py
new file mode 100755
index 0000000..f518cdc
--- /dev/null
+++ b/webapp/django/bin/django-admin.py
@@ -0,0 +1,5 @@
+#!/usr/bin/env python
+from django.core import management
+
+if __name__ == "__main__":
+    management.execute_from_command_line()
diff --git a/webapp/django/bin/make-messages.py b/webapp/django/bin/make-messages.py
new file mode 100755
index 0000000..1c84416
--- /dev/null
+++ b/webapp/django/bin/make-messages.py
@@ -0,0 +1,11 @@
+#!/usr/bin/env python
+
+if __name__ == "__main__":
+    import sys
+    name = sys.argv[0]
+    args = ' '.join(sys.argv[1:])
+    print >> sys.stderr, "%s has been moved into django-admin.py" % name
+    print >> sys.stderr, 'Please run "django-admin.py makemessages %s" instead.'% args
+    print >> sys.stderr
+    sys.exit(1)
+
diff --git a/webapp/django/bin/profiling/__init__.py b/webapp/django/bin/profiling/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/bin/profiling/__init__.py
diff --git a/webapp/django/bin/profiling/gather_profile_stats.py b/webapp/django/bin/profiling/gather_profile_stats.py
new file mode 100644
index 0000000..0fd2b7f
--- /dev/null
+++ b/webapp/django/bin/profiling/gather_profile_stats.py
@@ -0,0 +1,36 @@
+#!/usr/bin/env python
+
+"""
+gather_profile_stats.py /path/to/dir/of/profiles
+
+Note that the aggregated profiles must be read with pstats.Stats, not
+hotshot.stats (the formats are incompatible)
+"""
+
+from hotshot import stats
+import pstats
+import sys, os
+
+def gather_stats(p):
+    profiles = {}
+    for f in os.listdir(p):
+        if f.endswith('.agg.prof'):
+            path = f[:-9]
+            prof = pstats.Stats(os.path.join(p, f))
+        elif f.endswith('.prof'):
+            bits = f.split('.')
+            path = ".".join(bits[:-3])
+            prof = stats.load(os.path.join(p, f))
+        else:
+            continue
+        print "Processing %s" % f
+        if path in profiles:
+            profiles[path].add(prof)
+        else:
+            profiles[path] = prof
+        os.unlink(os.path.join(p, f))
+    for (path, prof) in profiles.items():
+        prof.dump_stats(os.path.join(p, "%s.agg.prof" % path))
+    
+if __name__ == '__main__':
+    gather_stats(sys.argv[1])
diff --git a/webapp/django/bin/unique-messages.py b/webapp/django/bin/unique-messages.py
new file mode 100755
index 0000000..c601a9e
--- /dev/null
+++ b/webapp/django/bin/unique-messages.py
@@ -0,0 +1,28 @@
+#!/usr/bin/env python
+
+import os
+import sys
+
+def unique_messages():
+    basedir = None
+
+    if os.path.isdir(os.path.join('conf', 'locale')):
+        basedir = os.path.abspath(os.path.join('conf', 'locale'))
+    elif os.path.isdir('locale'):
+        basedir = os.path.abspath('locale')
+    else:
+        print "this script should be run from the django svn tree or your project or app tree"
+        sys.exit(1)
+
+    for (dirpath, dirnames, filenames) in os.walk(basedir):
+        for f in filenames:
+            if f.endswith('.po'):
+                sys.stderr.write('processing file %s in %s\n' % (f, dirpath))
+                pf = os.path.splitext(os.path.join(dirpath, f))[0]
+                cmd = 'msguniq "%s.po"' % pf
+                stdout = os.popen(cmd)
+                msg = stdout.read()
+                open('%s.po' % pf, 'w').write(msg)
+
+if __name__ == "__main__":
+    unique_messages()
diff --git a/webapp/django/conf/__init__.py b/webapp/django/conf/__init__.py
new file mode 100644
index 0000000..fc69bed
--- /dev/null
+++ b/webapp/django/conf/__init__.py
@@ -0,0 +1,153 @@
+"""
+Settings and configuration for Django.
+
+Values will be read from the module specified by the DJANGO_SETTINGS_MODULE environment
+variable, and then from django.conf.global_settings; see the global settings file for
+a list of all possible variables.
+"""
+
+import os
+import time     # Needed for Windows
+from django.conf import global_settings
+
+ENVIRONMENT_VARIABLE = "DJANGO_SETTINGS_MODULE"
+
+class LazySettings(object):
+    """
+    A lazy proxy for either global Django settings or a custom settings object.
+    The user can manually configure settings prior to using them. Otherwise,
+    Django uses the settings module pointed to by DJANGO_SETTINGS_MODULE.
+    """
+    def __init__(self):
+        # _target must be either None or something that supports attribute
+        # access (getattr, hasattr, etc).
+        self._target = None
+
+    def __getattr__(self, name):
+        if self._target is None:
+            self._import_settings()
+        if name == '__members__':
+            # Used to implement dir(obj), for example.
+            return self._target.get_all_members()
+        return getattr(self._target, name)
+
+    def __setattr__(self, name, value):
+        if name == '_target':
+            # Assign directly to self.__dict__, because otherwise we'd call
+            # __setattr__(), which would be an infinite loop.
+            self.__dict__['_target'] = value
+        else:
+            if self._target is None:
+                self._import_settings()
+            setattr(self._target, name, value)
+
+    def _import_settings(self):
+        """
+        Load the settings module pointed to by the environment variable. This
+        is used the first time we need any settings at all, if the user has not
+        previously configured the settings manually.
+        """
+        try:
+            settings_module = os.environ[ENVIRONMENT_VARIABLE]
+            if not settings_module: # If it's set but is an empty string.
+                raise KeyError
+        except KeyError:
+            # NOTE: This is arguably an EnvironmentError, but that causes
+            # problems with Python's interactive help.
+            raise ImportError("Settings cannot be imported, because environment variable %s is undefined." % ENVIRONMENT_VARIABLE)
+
+        self._target = Settings(settings_module)
+
+    def configure(self, default_settings=global_settings, **options):
+        """
+        Called to manually configure the settings. The 'default_settings'
+        parameter sets where to retrieve any unspecified values from (its
+        argument must support attribute access (__getattr__)).
+        """
+        if self._target != None:
+            raise RuntimeError, 'Settings already configured.'
+        holder = UserSettingsHolder(default_settings)
+        for name, value in options.items():
+            setattr(holder, name, value)
+        self._target = holder
+
+    def configured(self):
+        """
+        Returns True if the settings have already been configured.
+        """
+        return bool(self._target)
+    configured = property(configured)
+
+class Settings(object):
+    def __init__(self, settings_module):
+        # update this dict from global settings (but only for ALL_CAPS settings)
+        for setting in dir(global_settings):
+            if setting == setting.upper():
+                setattr(self, setting, getattr(global_settings, setting))
+
+        # store the settings module in case someone later cares
+        self.SETTINGS_MODULE = settings_module
+
+        try:
+            mod = __import__(self.SETTINGS_MODULE, {}, {}, [''])
+        except ImportError, e:
+            raise ImportError, "Could not import settings '%s' (Is it on sys.path? Does it have syntax errors?): %s" % (self.SETTINGS_MODULE, e)
+
+        # Settings that should be converted into tuples if they're mistakenly entered
+        # as strings.
+        tuple_settings = ("INSTALLED_APPS", "TEMPLATE_DIRS")
+
+        for setting in dir(mod):
+            if setting == setting.upper():
+                setting_value = getattr(mod, setting)
+                if setting in tuple_settings and type(setting_value) == str:
+                    setting_value = (setting_value,) # In case the user forgot the comma.
+                setattr(self, setting, setting_value)
+
+        # Expand entries in INSTALLED_APPS like "django.contrib.*" to a list
+        # of all those apps.
+        new_installed_apps = []
+        for app in self.INSTALLED_APPS:
+            if app.endswith('.*'):
+                appdir = os.path.dirname(__import__(app[:-2], {}, {}, ['']).__file__)
+                app_subdirs = os.listdir(appdir)
+                app_subdirs.sort()
+                for d in app_subdirs:
+                    if d.isalpha() and os.path.isdir(os.path.join(appdir, d)):
+                        new_installed_apps.append('%s.%s' % (app[:-2], d))
+            else:
+                new_installed_apps.append(app)
+        self.INSTALLED_APPS = new_installed_apps
+
+        if hasattr(time, 'tzset'):
+            # Move the time zone info into os.environ. See ticket #2315 for why
+            # we don't do this unconditionally (breaks Windows).
+            os.environ['TZ'] = self.TIME_ZONE
+            time.tzset()
+
+    def get_all_members(self):
+        return dir(self)
+
+class UserSettingsHolder(object):
+    """
+    Holder for user configured settings.
+    """
+    # SETTINGS_MODULE doesn't make much sense in the manually configured
+    # (standalone) case.
+    SETTINGS_MODULE = None
+
+    def __init__(self, default_settings):
+        """
+        Requests for configuration variables not in this class are satisfied
+        from the module specified in default_settings (if possible).
+        """
+        self.default_settings = default_settings
+
+    def __getattr__(self, name):
+        return getattr(self.default_settings, name)
+
+    def get_all_members(self):
+        return dir(self) + dir(self.default_settings)
+
+settings = LazySettings()
+
diff --git a/webapp/django/conf/app_template/__init__.py b/webapp/django/conf/app_template/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/conf/app_template/__init__.py
diff --git a/webapp/django/conf/app_template/models.py b/webapp/django/conf/app_template/models.py
new file mode 100644
index 0000000..71a8362
--- /dev/null
+++ b/webapp/django/conf/app_template/models.py
@@ -0,0 +1,3 @@
+from django.db import models
+
+# Create your models here.
diff --git a/webapp/django/conf/app_template/views.py b/webapp/django/conf/app_template/views.py
new file mode 100644
index 0000000..60f00ef
--- /dev/null
+++ b/webapp/django/conf/app_template/views.py
@@ -0,0 +1 @@
+# Create your views here.
diff --git a/webapp/django/conf/global_settings.py b/webapp/django/conf/global_settings.py
new file mode 100644
index 0000000..2c48571
--- /dev/null
+++ b/webapp/django/conf/global_settings.py
@@ -0,0 +1,397 @@
+# Default Django settings. Override these with settings in the module
+# pointed-to by the DJANGO_SETTINGS_MODULE environment variable.
+
+# This is defined here as a do-nothing function because we can't import
+# django.utils.translation -- that module depends on the settings.
+gettext_noop = lambda s: s
+
+####################
+# CORE             #
+####################
+
+DEBUG = False
+TEMPLATE_DEBUG = False
+
+# Whether the framework should propagate raw exceptions rather than catching
+# them. This is useful under some testing siutations and should never be used
+# on a live site.
+DEBUG_PROPAGATE_EXCEPTIONS = False
+
+# Whether to use the "Etag" header. This saves bandwidth but slows down performance.
+USE_ETAGS = False
+
+# People who get code error notifications.
+# In the format (('Full Name', 'email@domain.com'), ('Full Name', 'anotheremail@domain.com'))
+ADMINS = ()
+
+# Tuple of IP addresses, as strings, that:
+#   * See debug comments, when DEBUG is true
+#   * Receive x-headers
+INTERNAL_IPS = ()
+
+# Local time zone for this installation. All choices can be found here:
+# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name (although not all
+# systems may support all possibilities).
+TIME_ZONE = 'America/Chicago'
+
+# Language code for this installation. All choices can be found here:
+# http://www.i18nguy.com/unicode/language-identifiers.html
+LANGUAGE_CODE = 'en-us'
+
+# Languages we provide translations for, out of the box. The language name
+# should be the utf-8 encoded local name for the language.
+LANGUAGES = (
+    ('ar', gettext_noop('Arabic')),
+    ('bn', gettext_noop('Bengali')),
+    ('bg', gettext_noop('Bulgarian')),
+    ('ca', gettext_noop('Catalan')),
+    ('cs', gettext_noop('Czech')),
+    ('cy', gettext_noop('Welsh')),
+    ('da', gettext_noop('Danish')),
+    ('de', gettext_noop('German')),
+    ('el', gettext_noop('Greek')),
+    ('en', gettext_noop('English')),
+    ('es', gettext_noop('Spanish')),
+    ('et', gettext_noop('Estonian')), 
+    ('es-ar', gettext_noop('Argentinean Spanish')),
+    ('eu', gettext_noop('Basque')),
+    ('fa', gettext_noop('Persian')),
+    ('fi', gettext_noop('Finnish')),
+    ('fr', gettext_noop('French')),
+    ('ga', gettext_noop('Irish')),
+    ('gl', gettext_noop('Galician')),
+    ('hu', gettext_noop('Hungarian')),
+    ('he', gettext_noop('Hebrew')),
+    ('hr', gettext_noop('Croatian')),
+    ('is', gettext_noop('Icelandic')),
+    ('it', gettext_noop('Italian')),
+    ('ja', gettext_noop('Japanese')),
+    ('ka', gettext_noop('Georgian')),
+    ('ko', gettext_noop('Korean')),
+    ('km', gettext_noop('Khmer')),
+    ('kn', gettext_noop('Kannada')),
+    ('lv', gettext_noop('Latvian')),
+    ('lt', gettext_noop('Lithuanian')),
+    ('mk', gettext_noop('Macedonian')),
+    ('nl', gettext_noop('Dutch')),
+    ('no', gettext_noop('Norwegian')),
+    ('pl', gettext_noop('Polish')),
+    ('pt', gettext_noop('Portugese')),
+    ('pt-br', gettext_noop('Brazilian Portuguese')),
+    ('ro', gettext_noop('Romanian')),
+    ('ru', gettext_noop('Russian')),
+    ('sk', gettext_noop('Slovak')),
+    ('sl', gettext_noop('Slovenian')),
+    ('sr', gettext_noop('Serbian')),
+    ('sv', gettext_noop('Swedish')),
+    ('ta', gettext_noop('Tamil')),
+    ('te', gettext_noop('Telugu')),
+    ('tr', gettext_noop('Turkish')),
+    ('uk', gettext_noop('Ukrainian')),
+    ('zh-cn', gettext_noop('Simplified Chinese')),
+    ('zh-tw', gettext_noop('Traditional Chinese')),
+)
+
+# Languages using BiDi (right-to-left) layout
+LANGUAGES_BIDI = ("he", "ar", "fa")
+
+# If you set this to False, Django will make some optimizations so as not
+# to load the internationalization machinery.
+USE_I18N = True
+LOCALE_PATHS = ()
+LANGUAGE_COOKIE_NAME = 'django_language'
+
+# Not-necessarily-technical managers of the site. They get broken link
+# notifications and other various e-mails.
+MANAGERS = ADMINS
+
+# Default content type and charset to use for all HttpResponse objects, if a
+# MIME type isn't manually specified. These are used to construct the
+# Content-Type header.
+DEFAULT_CONTENT_TYPE = 'text/html'
+DEFAULT_CHARSET = 'utf-8'
+
+# Encoding of files read from disk (template and initial SQL files).
+FILE_CHARSET = 'utf-8'
+
+# E-mail address that error messages come from.
+SERVER_EMAIL = 'root@localhost'
+
+# Whether to send broken-link e-mails.
+SEND_BROKEN_LINK_EMAILS = False
+
+# Database connection info.
+DATABASE_ENGINE = ''           # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
+DATABASE_NAME = ''             # Or path to database file if using sqlite3.
+DATABASE_USER = ''             # Not used with sqlite3.
+DATABASE_PASSWORD = ''         # Not used with sqlite3.
+DATABASE_HOST = ''             # Set to empty string for localhost. Not used with sqlite3.
+DATABASE_PORT = ''             # Set to empty string for default. Not used with sqlite3.
+DATABASE_OPTIONS = {}          # Set to empty dictionary for default.
+
+# Host for sending e-mail.
+EMAIL_HOST = 'localhost'
+
+# Port for sending e-mail.
+EMAIL_PORT = 25
+
+# Optional SMTP authentication information for EMAIL_HOST.
+EMAIL_HOST_USER = ''
+EMAIL_HOST_PASSWORD = ''
+EMAIL_USE_TLS = False
+
+# List of strings representing installed apps.
+INSTALLED_APPS = ()
+
+# List of locations of the template source files, in search order.
+TEMPLATE_DIRS = ()
+
+# List of callables that know how to import templates from various sources.
+# See the comments in django/core/template/loader.py for interface
+# documentation.
+TEMPLATE_LOADERS = (
+    'django.template.loaders.filesystem.load_template_source',
+    'django.template.loaders.app_directories.load_template_source',
+#     'django.template.loaders.eggs.load_template_source',
+)
+
+# List of processors used by RequestContext to populate the context.
+# Each one should be a callable that takes the request object as its
+# only parameter and returns a dictionary to add to the context.
+TEMPLATE_CONTEXT_PROCESSORS = (
+    'django.core.context_processors.auth',
+    'django.core.context_processors.debug',
+    'django.core.context_processors.i18n',
+    'django.core.context_processors.media',
+#    'django.core.context_processors.request',
+)
+
+# Output to use in template system for invalid (e.g. misspelled) variables.
+TEMPLATE_STRING_IF_INVALID = ''
+
+# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
+# trailing slash.
+# Examples: "http://foo.com/media/", "/media/".
+ADMIN_MEDIA_PREFIX = '/media/'
+
+# Default e-mail address to use for various automated correspondence from
+# the site managers.
+DEFAULT_FROM_EMAIL = 'webmaster@localhost'
+
+# Subject-line prefix for email messages send with django.core.mail.mail_admins
+# or ...mail_managers.  Make sure to include the trailing space.
+EMAIL_SUBJECT_PREFIX = '[Django] '
+
+# Whether to append trailing slashes to URLs.
+APPEND_SLASH = True
+
+# Whether to prepend the "www." subdomain to URLs that don't have it.
+PREPEND_WWW = False
+
+# Override the server-derived value of SCRIPT_NAME
+FORCE_SCRIPT_NAME = None
+
+# List of compiled regular expression objects representing User-Agent strings
+# that are not allowed to visit any page, systemwide. Use this for bad
+# robots/crawlers. Here are a few examples:
+#     import re
+#     DISALLOWED_USER_AGENTS = (
+#         re.compile(r'^NaverBot.*'),
+#         re.compile(r'^EmailSiphon.*'),
+#         re.compile(r'^SiteSucker.*'),
+#         re.compile(r'^sohu-search')
+#     )
+DISALLOWED_USER_AGENTS = ()
+
+ABSOLUTE_URL_OVERRIDES = {}
+
+# Tuple of strings representing allowed prefixes for the {% ssi %} tag.
+# Example: ('/home/html', '/var/www')
+ALLOWED_INCLUDE_ROOTS = ()
+
+# If this is a admin settings module, this should be a list of
+# settings modules (in the format 'foo.bar.baz') for which this admin
+# is an admin.
+ADMIN_FOR = ()
+
+# 404s that may be ignored.
+IGNORABLE_404_STARTS = ('/cgi-bin/', '/_vti_bin', '/_vti_inf')
+IGNORABLE_404_ENDS = ('mail.pl', 'mailform.pl', 'mail.cgi', 'mailform.cgi', 'favicon.ico', '.php')
+
+# A secret key for this particular Django installation. Used in secret-key
+# hashing algorithms. Set this in your settings, or Django will complain
+# loudly.
+SECRET_KEY = ''
+
+# Path to the "jing" executable -- needed to validate XMLFields
+JING_PATH = "/usr/bin/jing"
+
+# Default file storage mechanism that holds media.
+DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage'
+
+# Absolute path to the directory that holds media.
+# Example: "/home/media/media.lawrence.com/"
+MEDIA_ROOT = ''
+
+# URL that handles the media served from MEDIA_ROOT.
+# Example: "http://media.lawrence.com"
+MEDIA_URL = ''
+
+# List of upload handler classes to be applied in order.
+FILE_UPLOAD_HANDLERS = (
+    'django.core.files.uploadhandler.MemoryFileUploadHandler',
+    'django.core.files.uploadhandler.TemporaryFileUploadHandler',
+)
+
+# Maximum size, in bytes, of a request before it will be streamed to the
+# file system instead of into memory.
+FILE_UPLOAD_MAX_MEMORY_SIZE = 2621440 # i.e. 2.5 MB
+
+# Directory in which upload streamed files will be temporarily saved. A value of
+# `None` will make Django use the operating system's default temporary directory
+# (i.e. "/tmp" on *nix systems).
+FILE_UPLOAD_TEMP_DIR = None
+
+# Default formatting for date objects. See all available format strings here:
+# http://www.djangoproject.com/documentation/templates/#now
+DATE_FORMAT = 'N j, Y'
+
+# Default formatting for datetime objects. See all available format strings here:
+# http://www.djangoproject.com/documentation/templates/#now
+DATETIME_FORMAT = 'N j, Y, P'
+
+# Default formatting for time objects. See all available format strings here:
+# http://www.djangoproject.com/documentation/templates/#now
+TIME_FORMAT = 'P'
+
+# Default formatting for date objects when only the year and month are relevant.
+# See all available format strings here:
+# http://www.djangoproject.com/documentation/templates/#now
+YEAR_MONTH_FORMAT = 'F Y'
+
+# Default formatting for date objects when only the month and day are relevant.
+# See all available format strings here:
+# http://www.djangoproject.com/documentation/templates/#now
+MONTH_DAY_FORMAT = 'F j'
+
+# Do you want to manage transactions manually?
+# Hint: you really don't!
+TRANSACTIONS_MANAGED = False
+
+# The User-Agent string to use when checking for URL validity through the
+# isExistingURL validator.
+from django import get_version
+URL_VALIDATOR_USER_AGENT = "Django/%s (http://www.djangoproject.com)" % get_version()
+
+# The tablespaces to use for each model when not specified otherwise.
+DEFAULT_TABLESPACE = ''
+DEFAULT_INDEX_TABLESPACE = ''
+
+##############
+# MIDDLEWARE #
+##############
+
+# List of middleware classes to use.  Order is important; in the request phase,
+# this middleware classes will be applied in the order given, and in the
+# response phase the middleware will be applied in reverse order.
+MIDDLEWARE_CLASSES = (
+    'django.contrib.sessions.middleware.SessionMiddleware',
+    'django.contrib.auth.middleware.AuthenticationMiddleware',
+#     'django.middleware.http.ConditionalGetMiddleware',
+#     'django.middleware.gzip.GZipMiddleware',
+    'django.middleware.common.CommonMiddleware',
+)
+
+############
+# SESSIONS #
+############
+
+SESSION_COOKIE_NAME = 'sessionid'                       # Cookie name. This can be whatever you want.
+SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2               # Age of cookie, in seconds (default: 2 weeks).
+SESSION_COOKIE_DOMAIN = None                            # A string like ".lawrence.com", or None for standard domain cookie.
+SESSION_COOKIE_SECURE = False                           # Whether the session cookie should be secure (https:// only).
+SESSION_COOKIE_PATH = '/'                               # The path of the session cookie.
+SESSION_SAVE_EVERY_REQUEST = False                      # Whether to save the session data on every request.
+SESSION_EXPIRE_AT_BROWSER_CLOSE = False                 # Whether a user's session cookie expires when the Web browser is closed.
+SESSION_ENGINE = 'django.contrib.sessions.backends.db'  # The module to store session data
+SESSION_FILE_PATH = None                                # Directory to store session files if using the file session module. If None, the backend will use a sensible default.
+
+#########
+# CACHE #
+#########
+
+# The cache backend to use.  See the docstring in django.core.cache for the
+# possible values.
+CACHE_BACKEND = 'locmem://'
+CACHE_MIDDLEWARE_KEY_PREFIX = ''
+CACHE_MIDDLEWARE_SECONDS = 600
+
+####################
+# COMMENTS         #
+####################
+
+COMMENTS_ALLOW_PROFANITIES = False
+
+# The profanities that will trigger a validation error in the
+# 'hasNoProfanities' validator. All of these should be in lowercase.
+PROFANITIES_LIST = ('asshat', 'asshead', 'asshole', 'cunt', 'fuck', 'gook', 'nigger', 'shit')
+
+# The group ID that designates which users are banned.
+# Set to None if you're not using it.
+COMMENTS_BANNED_USERS_GROUP = None
+
+# The group ID that designates which users can moderate comments.
+# Set to None if you're not using it.
+COMMENTS_MODERATORS_GROUP = None
+
+# The group ID that designates the users whose comments should be e-mailed to MANAGERS.
+# Set to None if you're not using it.
+COMMENTS_SKETCHY_USERS_GROUP = None
+
+# The system will e-mail MANAGERS the first COMMENTS_FIRST_FEW comments by each
+# user. Set this to 0 if you want to disable it.
+COMMENTS_FIRST_FEW = 0
+
+# A tuple of IP addresses that have been banned from participating in various
+# Django-powered features.
+BANNED_IPS = ()
+
+##################
+# AUTHENTICATION #
+##################
+
+AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.ModelBackend',)
+
+LOGIN_URL = '/accounts/login/'
+
+LOGOUT_URL = '/accounts/logout/'
+
+LOGIN_REDIRECT_URL = '/accounts/profile/'
+
+# The number of days a password reset link is valid for
+PASSWORD_RESET_TIMEOUT_DAYS = 3
+
+###########
+# TESTING #
+###########
+
+# The name of the method to use to invoke the test suite
+TEST_RUNNER = 'django.test.simple.run_tests'
+
+# The name of the database to use for testing purposes.
+# If None, a name of 'test_' + DATABASE_NAME will be assumed
+TEST_DATABASE_NAME = None
+
+# Strings used to set the character set and collation order for the test
+# database. These values are passed literally to the server, so they are
+# backend-dependent. If None, no special settings are sent (system defaults are
+# used).
+TEST_DATABASE_CHARSET = None
+TEST_DATABASE_COLLATION = None
+
+############
+# FIXTURES #
+############
+
+# The list of directories to search for fixtures
+FIXTURE_DIRS = ()
diff --git a/webapp/django/conf/locale/ar/LC_MESSAGES/django.mo b/webapp/django/conf/locale/ar/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..c52a2ab
--- /dev/null
+++ b/webapp/django/conf/locale/ar/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/ar/LC_MESSAGES/django.po b/webapp/django/conf/locale/ar/LC_MESSAGES/django.po
new file mode 100644
index 0000000..5bbe749
--- /dev/null
+++ b/webapp/django/conf/locale/ar/LC_MESSAGES/django.po
@@ -0,0 +1,1989 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the django package.
+# Ahmad Alhashemi <trans@ahmadh.com>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-07-03 19:22+0300\n"
+"PO-Revision-Date: 2006-07-06 23:46+0300\n"
+"Last-Translator: Ahmad Alhashemi <ahmad@ahmadh.com>\n"
+"Language-Team: Ahmad Alhashemi <trans@ahmadh.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=(n == 1? 0 : (n == 2? 1 : (n <= 10? 2 : 3)));\n"
+"X-Poedit-Language: Arabic\n"
+"X-Poedit-Country: KUWAIT\n"
+"X-Poedit-SourceCharset: utf-8\n"
+
+#: .\conf\global_settings.py:37
+msgid "Bengali"
+msgstr "بنغالي"
+
+#: .\conf\global_settings.py:38
+msgid "Czech"
+msgstr "تشيكي"
+
+#: .\conf\global_settings.py:39
+msgid "Welsh"
+msgstr "ويلزي"
+
+#: .\conf\global_settings.py:40
+msgid "Danish"
+msgstr "دنماركي"
+
+#: .\conf\global_settings.py:41
+msgid "German"
+msgstr "ألماني"
+
+#: .\conf\global_settings.py:42
+msgid "Greek"
+msgstr "اغريقي"
+
+#: .\conf\global_settings.py:43
+msgid "English"
+msgstr "انجليزي"
+
+#: .\conf\global_settings.py:44
+msgid "Spanish"
+msgstr "اسباني"
+
+#: .\conf\global_settings.py:45
+msgid "Argentinean Spanish"
+msgstr "اسباني أرجنتيني"
+
+#: .\conf\global_settings.py:46
+msgid "French"
+msgstr "فرنسي"
+
+#: .\conf\global_settings.py:47
+msgid "Galician"
+msgstr "جاليسي"
+
+#: .\conf\global_settings.py:48
+msgid "Hungarian"
+msgstr "هنغاري"
+
+#: .\conf\global_settings.py:49
+msgid "Hebrew"
+msgstr "عبري"
+
+#: .\conf\global_settings.py:50
+msgid "Icelandic"
+msgstr "آيسلندي"
+
+#: .\conf\global_settings.py:51
+msgid "Italian"
+msgstr "ايطالي"
+
+#: .\conf\global_settings.py:52
+msgid "Japanese"
+msgstr "ياباني"
+
+#: .\conf\global_settings.py:53
+msgid "Dutch"
+msgstr "هولندي"
+
+#: .\conf\global_settings.py:54
+msgid "Norwegian"
+msgstr "نرويجي"
+
+#: .\conf\global_settings.py:55
+msgid "Brazilian"
+msgstr "برازيلي"
+
+#: .\conf\global_settings.py:56
+msgid "Romanian"
+msgstr "روماني"
+
+#: .\conf\global_settings.py:57
+msgid "Russian"
+msgstr "روسي"
+
+#: .\conf\global_settings.py:58
+msgid "Slovak"
+msgstr "سلوفاك"
+
+#: .\conf\global_settings.py:59
+msgid "Slovenian"
+msgstr "سلوفاتي"
+
+#: .\conf\global_settings.py:60
+msgid "Serbian"
+msgstr "صربي"
+
+#: .\conf\global_settings.py:61
+msgid "Swedish"
+msgstr "سويدي"
+
+#: .\conf\global_settings.py:62
+msgid "Ukrainian"
+msgstr "أكراني"
+
+#: .\conf\global_settings.py:63
+msgid "Simplified Chinese"
+msgstr "صيني مبسط"
+
+#: .\conf\global_settings.py:64
+msgid "Traditional Chinese"
+msgstr "صيني تقليدي"
+
+#: .\contrib\admin\filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>بواسطة %s:</h3>\n"
+"<ul>\n"
+
+#: .\contrib\admin\filterspecs.py:70
+#: .\contrib\admin\filterspecs.py:88
+#: .\contrib\admin\filterspecs.py:143
+#: .\contrib\admin\filterspecs.py:169
+msgid "All"
+msgstr "كافة"
+
+#: .\contrib\admin\filterspecs.py:109
+msgid "Any date"
+msgstr "أي تاريخ"
+
+#: .\contrib\admin\filterspecs.py:110
+msgid "Today"
+msgstr "اليوم"
+
+#: .\contrib\admin\filterspecs.py:113
+msgid "Past 7 days"
+msgstr "الأيام 7 الماضية"
+
+#: .\contrib\admin\filterspecs.py:115
+msgid "This month"
+msgstr "هذا الشهر"
+
+#: .\contrib\admin\filterspecs.py:117
+msgid "This year"
+msgstr "هذه السنة"
+
+#: .\contrib\admin\filterspecs.py:143
+msgid "Yes"
+msgstr "نعم"
+
+#: .\contrib\admin\filterspecs.py:143
+msgid "No"
+msgstr "لا"
+
+#: .\contrib\admin\filterspecs.py:150
+msgid "Unknown"
+msgstr "غير معروف"
+
+#: .\contrib\admin\models.py:16
+msgid "action time"
+msgstr "وقت العملية"
+
+#: .\contrib\admin\models.py:19
+msgid "object id"
+msgstr "معرف العنصر"
+
+#: .\contrib\admin\models.py:20
+msgid "object repr"
+msgstr "ممثل العنصر"
+
+#: .\contrib\admin\models.py:21
+msgid "action flag"
+msgstr "علامة العملية"
+
+#: .\contrib\admin\models.py:22
+msgid "change message"
+msgstr "تغيير الرسالة"
+
+#: .\contrib\admin\models.py:25
+msgid "log entry"
+msgstr "مدخل السجل"
+
+#: .\contrib\admin\models.py:26
+msgid "log entries"
+msgstr "مدخلات السجل"
+
+#: .\contrib\admin\templates\admin\404.html.py:4
+#: .\contrib\admin\templates\admin\404.html.py:8
+msgid "Page not found"
+msgstr "تعذر العثور على الصفحة"
+
+#: .\contrib\admin\templates\admin\404.html.py:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "نحن آسفون، لكننا لم نعثر على الصفحة المطلوبة."
+
+#: .\contrib\admin\templates\admin\500.html.py:4
+#: .\contrib\admin\templates\admin\base.html.py:29
+#: .\contrib\admin\templates\admin\change_form.html.py:13
+#: .\contrib\admin\templates\admin\change_list.html.py:6
+#: .\contrib\admin\templates\admin\delete_confirmation.html.py:6
+#: .\contrib\admin\templates\admin\invalid_setup.html.py:4
+#: .\contrib\admin\templates\admin\object_history.html.py:5
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:3
+#: .\contrib\admin\templates\registration\logged_out.html.py:4
+#: .\contrib\admin\templates\registration\password_change_done.html.py:4
+#: .\contrib\admin\templates\registration\password_change_form.html.py:4
+#: .\contrib\admin\templates\registration\password_reset_done.html.py:4
+#: .\contrib\admin\templates\registration\password_reset_form.html.py:4
+msgid "Home"
+msgstr "الرئيسية"
+
+#: .\contrib\admin\templates\admin\500.html.py:4
+msgid "Server error"
+msgstr "خطأ في المزود"
+
+#: .\contrib\admin\templates\admin\500.html.py:6
+msgid "Server error (500)"
+msgstr "خطأ في المزود (500)"
+
+#: .\contrib\admin\templates\admin\500.html.py:9
+msgid "Server Error <em>(500)</em>"
+msgstr "خطأ في المزود <em>(500)</em>"
+
+#: .\contrib\admin\templates\admin\500.html.py:10
+msgid "There's been an error. It's been reported to the site administrators via e-mail and should be fixed shortly. Thanks for your patience."
+msgstr "حدث خطأ، وقم تم الابلاغ عنه إلى مدراء الموقع عبر البريد الإلكترونيوسيتم حل المشكلة قريبا إن شاء الله، شكرا لك على صبرك."
+
+#: .\contrib\admin\templates\admin\base.html.py:24
+msgid "Welcome,"
+msgstr "أهلا، "
+
+#: .\contrib\admin\templates\admin\base.html.py:24
+#: .\contrib\admin\templates\admin\change_form.html.py:10
+#: .\contrib\admin\templates\admin\change_list.html.py:5
+#: .\contrib\admin\templates\admin\delete_confirmation.html.py:3
+#: .\contrib\admin\templates\admin\object_history.html.py:3
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:3
+#: .\contrib\admin\templates\registration\password_change_done.html.py:3
+#: .\contrib\admin\templates\registration\password_change_form.html.py:3
+msgid "Documentation"
+msgstr "التعليمات"
+
+#: .\contrib\admin\templates\admin\base.html.py:24
+#: .\contrib\admin\templates\admin\change_form.html.py:10
+#: .\contrib\admin\templates\admin\change_list.html.py:5
+#: .\contrib\admin\templates\admin\delete_confirmation.html.py:3
+#: .\contrib\admin\templates\admin\object_history.html.py:3
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:4
+#: .\contrib\admin\templates\admin_doc\index.html.py:4
+#: .\contrib\admin\templates\admin_doc\missing_docutils.html.py:4
+#: .\contrib\admin\templates\admin_doc\model_detail.html.py:3
+#: .\contrib\admin\templates\admin_doc\model_index.html.py:5
+#: .\contrib\admin\templates\admin_doc\template_detail.html.py:4
+#: .\contrib\admin\templates\admin_doc\template_filter_index.html.py:5
+#: .\contrib\admin\templates\admin_doc\template_tag_index.html.py:5
+#: .\contrib\admin\templates\admin_doc\view_detail.html.py:4
+#: .\contrib\admin\templates\admin_doc\view_index.html.py:5
+#: .\contrib\admin\templates\registration\password_change_done.html.py:3
+#: .\contrib\admin\templates\registration\password_change_form.html.py:3
+msgid "Change password"
+msgstr "تغيير كلمة المرور"
+
+#: .\contrib\admin\templates\admin\base.html.py:24
+#: .\contrib\admin\templates\admin\change_form.html.py:10
+#: .\contrib\admin\templates\admin\change_list.html.py:5
+#: .\contrib\admin\templates\admin\delete_confirmation.html.py:3
+#: .\contrib\admin\templates\admin\object_history.html.py:3
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:4
+#: .\contrib\admin\templates\admin_doc\index.html.py:4
+#: .\contrib\admin\templates\admin_doc\missing_docutils.html.py:4
+#: .\contrib\admin\templates\admin_doc\model_detail.html.py:3
+#: .\contrib\admin\templates\admin_doc\model_index.html.py:5
+#: .\contrib\admin\templates\admin_doc\template_detail.html.py:4
+#: .\contrib\admin\templates\admin_doc\template_filter_index.html.py:5
+#: .\contrib\admin\templates\admin_doc\template_tag_index.html.py:5
+#: .\contrib\admin\templates\admin_doc\view_detail.html.py:4
+#: .\contrib\admin\templates\admin_doc\view_index.html.py:5
+#: .\contrib\admin\templates\registration\password_change_done.html.py:3
+#: .\contrib\admin\templates\registration\password_change_form.html.py:3
+#: .\contrib\comments\templates\comments\form.html.py:8
+msgid "Log out"
+msgstr "خروج"
+
+#: .\contrib\admin\templates\admin\base_site.html.py:4
+msgid "Django site admin"
+msgstr "إدارة موقع جاننغو"
+
+#: .\contrib\admin\templates\admin\base_site.html.py:7
+msgid "Django administration"
+msgstr "إدارة جانغو"
+
+#: .\contrib\admin\templates\admin\change_form.html.py:15
+#: .\contrib\admin\templates\admin\index.html.py:28
+msgid "Add"
+msgstr "إضافة"
+
+#: .\contrib\admin\templates\admin\change_form.html.py:20
+#: .\contrib\admin\templates\admin\object_history.html.py:5
+msgid "History"
+msgstr "تاريخ"
+
+#: .\contrib\admin\templates\admin\change_form.html.py:21
+msgid "View on site"
+msgstr "عرض على الموقع"
+
+#: .\contrib\admin\templates\admin\change_form.html.py:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "الرجاء اصلاح الخطأ التالي."
+msgstr[1] "الرجاء اصلاح الخطئين التاليين."
+msgstr[2] "الرجاء اصلاح الأخطاء التالية."
+msgstr[3] "الرجاء اصلاح الأخطاء التالية."
+
+#: .\contrib\admin\templates\admin\change_form.html.py:48
+msgid "Ordering"
+msgstr "الترتيب"
+
+#: .\contrib\admin\templates\admin\change_form.html.py:51
+msgid "Order:"
+msgstr "الترتيب"
+
+#: .\contrib\admin\templates\admin\change_list.html.py:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "اضافة %(name)s"
+
+#: .\contrib\admin\templates\admin\delete_confirmation.html.py:9
+#: .\contrib\admin\templates\admin\submit_line.html.py:3
+msgid "Delete"
+msgstr "حذف"
+
+#: .\contrib\admin\templates\admin\delete_confirmation.html.py:14
+#, python-format
+msgid "Deleting the %(object_name)s '%(object)s' would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:"
+msgstr "حذف %(object_name)s '%(object)s' سيؤدي إلى حذف العناصر المتعلقة به، لكن هذا الحساب لا يملك الصلاحية لحذف أنواع العناصر التالية:"
+
+#: .\contrib\admin\templates\admin\delete_confirmation.html.py:21
+#, python-format
+msgid "Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of the following related items will be deleted:"
+msgstr "هل أنت متأكد من أنك تريد حذف %(object_name)s \"%(object)s\"? كافة العناصر التالية المتعلقة به سيتم حذفها:"
+
+#: .\contrib\admin\templates\admin\delete_confirmation.html.py:26
+msgid "Yes, I'm sure"
+msgstr "نعم، أنا متأكد"
+
+#: .\contrib\admin\templates\admin\filter.html.py:2
+#, python-format
+msgid " By %(title)s "
+msgstr " بواسطة %(title)s "
+
+#: .\contrib\admin\templates\admin\filters.html.py:4
+msgid "Filter"
+msgstr "مرشح"
+
+#: .\contrib\admin\templates\admin\index.html.py:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "النماذج المتوفرة في برنامج %(name)s."
+
+#: .\contrib\admin\templates\admin\index.html.py:34
+msgid "Change"
+msgstr "تغيير"
+
+#: .\contrib\admin\templates\admin\index.html.py:44
+msgid "You don't have permission to edit anything."
+msgstr "ليست لديك الصلاحية لتعديل أي شيء."
+
+#: .\contrib\admin\templates\admin\index.html.py:52
+msgid "Recent Actions"
+msgstr "العمليات الأخيرة"
+
+#: .\contrib\admin\templates\admin\index.html.py:53
+msgid "My Actions"
+msgstr "عملياتي"
+
+#: .\contrib\admin\templates\admin\index.html.py:57
+msgid "None available"
+msgstr "لا يوجد"
+
+#: .\contrib\admin\templates\admin\invalid_setup.html.py:8
+msgid "Something's wrong with your database installation. Make sure the appropriate database tables have been created, and make sure the database is readable by the appropriate user."
+msgstr "هنالك أمر خاطئ في تركيب قاعدة بياناتك، تأكد من أنه تم انشاء جداول قاعدة البيانات الملائمة، وتأكد من أن قاعدة البيانات قابلة للقراءة من قبل المستخدم الملائم."
+
+#: .\contrib\admin\templates\admin\login.html.py:17
+#: .\contrib\comments\templates\comments\form.html.py:6
+#: .\contrib\comments\templates\comments\form.html.py:8
+msgid "Username:"
+msgstr "اسم المستخدم:"
+
+#: .\contrib\admin\templates\admin\login.html.py:20
+#: .\contrib\comments\templates\comments\form.html.py:6
+msgid "Password:"
+msgstr "كلمة المرور:"
+
+#: .\contrib\admin\templates\admin\login.html.py:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+
+#: .\contrib\admin\templates\admin\login.html.py:25
+#: .\contrib\admin\views\decorators.py:24
+msgid "Log in"
+msgstr "دخول"
+
+#: .\contrib\admin\templates\admin\object_history.html.py:18
+msgid "Date/time"
+msgstr "التاريخ/الوقت"
+
+#: .\contrib\admin\templates\admin\object_history.html.py:19
+msgid "User"
+msgstr "المستخدم"
+
+#: .\contrib\admin\templates\admin\object_history.html.py:20
+msgid "Action"
+msgstr "العملية"
+
+#: .\contrib\admin\templates\admin\object_history.html.py:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr ""
+
+#: .\contrib\admin\templates\admin\object_history.html.py:36
+msgid "This object doesn't have a change history. It probably wasn't added via this admin site."
+msgstr "هذا العنصر لا يملك تاريخ تغييرات، على الأغلب أن هذا العنصر لم يتم انشاءه عبر نظام الإدارة هذا."
+
+#: .\contrib\admin\templates\admin\pagination.html.py:10
+msgid "Show all"
+msgstr "عرض الكل"
+
+#: .\contrib\admin\templates\admin\search_form.html.py:8
+msgid "Go"
+msgstr "انطلق"
+
+#: .\contrib\admin\templates\admin\search_form.html.py:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "نتيحة واحدة"
+msgstr[1] "نتيجتان"
+msgstr[2] "%(counter)s نتائج"
+msgstr[3] "%(counter)s نتيحة"
+
+#: .\contrib\admin\templates\admin\search_form.html.py:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "المجموع %(full_result_count)s"
+
+#: .\contrib\admin\templates\admin\submit_line.html.py:4
+msgid "Save as new"
+msgstr "حفظ كجديد"
+
+#: .\contrib\admin\templates\admin\submit_line.html.py:5
+msgid "Save and add another"
+msgstr "حفظ وإضافة آخر"
+
+#: .\contrib\admin\templates\admin\submit_line.html.py:6
+msgid "Save and continue editing"
+msgstr "حفظ واستمرار التعديل"
+
+#: .\contrib\admin\templates\admin\submit_line.html.py:7
+msgid "Save"
+msgstr "حفظ"
+
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:3
+msgid "Bookmarklets"
+msgstr "أوامر المفضلة"
+
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:5
+msgid "Documentation bookmarklets"
+msgstr "أوامر مفضلة التعليمات"
+
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">لتركيب أوامر المفضلة، قم بسحب الوصلة إلى\n"
+"شريط أدات المفضلات في متصفحك، أو قم بالضغط عليها بالزر الأيمن وأضفها إلى مفضلاتك.\n"
+"سيمكنك الآن أن اختيار أوامر المفضلة من أي صفحة في الموقع، لاحظ بأن بعض\n"
+"أوامر المفضلة هذه معدة لتعمل على أجهزة كمبيوتر تعتبر على أنها \"داخلية\"\n"
+"(تحدث إلى مسؤول النظم إذا لم تكن متأكدا ما إذا كان كمبيوتر يعتبر \"داخليا\").</p>\n"
+
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:19
+msgid "Documentation for this page"
+msgstr "التعليمات لهذه الصفحة"
+
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:20
+msgid "Jumps you from any page to the documentation for the view that generates that page."
+msgstr "ينتقل بك من أي صفحة إلى تعليمات العرض الذي أنشأ هذه الصفحة."
+
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:22
+msgid "Show object ID"
+msgstr "عرض معرف الكائن"
+
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:23
+msgid "Shows the content-type and unique ID for pages that represent a single object."
+msgstr "عرض نوع البيانات والمعرف الفريد للصفحات التي تمثل كائنا واحدا."
+
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:25
+msgid "Edit this object (current window)"
+msgstr "تعديل هذا الكائن (النافذة الحالية)"
+
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "ينتقل بك إلى صفحة الإدارة للصفحات التي تمثل كائنا واحدا."
+
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:28
+msgid "Edit this object (new window)"
+msgstr "تعديل هذا العنصر (نافذة جديدة)"
+
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "كما سبق، لكن يفتح صفحة الإدارة في نافذة جديدة."
+
+#: .\contrib\admin\templates\registration\logged_out.html.py:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "شكرا لك على قضائك بعض الوقت مع الموقع اليوم."
+
+#: .\contrib\admin\templates\registration\logged_out.html.py:10
+msgid "Log in again"
+msgstr "دخول مرة أخرى"
+
+#: .\contrib\admin\templates\registration\password_change_done.html.py:4
+#: .\contrib\admin\templates\registration\password_change_form.html.py:4
+#: .\contrib\admin\templates\registration\password_change_form.html.py:6
+#: .\contrib\admin\templates\registration\password_change_form.html.py:10
+msgid "Password change"
+msgstr "تغيير كلمة المرور"
+
+#: .\contrib\admin\templates\registration\password_change_done.html.py:6
+#: .\contrib\admin\templates\registration\password_change_done.html.py:10
+msgid "Password change successful"
+msgstr "تم تغيير كلمة المرور بنجاح"
+
+#: .\contrib\admin\templates\registration\password_change_done.html.py:12
+msgid "Your password was changed."
+msgstr "لقد تغيرت كلمة مرورك."
+
+#: .\contrib\admin\templates\registration\password_change_form.html.py:12
+msgid "Please enter your old password, for security's sake, and then enter your new password twice so we can verify you typed it in correctly."
+msgstr "الرجاء ادخال كلمة مرورك القديمة، زيادة في الأمان، ثم ادخل كلمة مرورك الجديدة مرتين لنكون متأكدين من أنك كتبتها بصورة صحيحة."
+
+#: .\contrib\admin\templates\registration\password_change_form.html.py:17
+msgid "Old password:"
+msgstr "كلمة المرور القديمة:"
+
+#: .\contrib\admin\templates\registration\password_change_form.html.py:19
+msgid "New password:"
+msgstr "كلمة المرور الجديدة:"
+
+#: .\contrib\admin\templates\registration\password_change_form.html.py:21
+msgid "Confirm password:"
+msgstr "تأكيد كلمة المرور:"
+
+#: .\contrib\admin\templates\registration\password_change_form.html.py:23
+msgid "Change my password"
+msgstr "تغيير كلمة المرور الخاصة بي"
+
+#: .\contrib\admin\templates\registration\password_reset_done.html.py:4
+#: .\contrib\admin\templates\registration\password_reset_form.html.py:4
+#: .\contrib\admin\templates\registration\password_reset_form.html.py:6
+#: .\contrib\admin\templates\registration\password_reset_form.html.py:10
+msgid "Password reset"
+msgstr "اعادة ضبط كلمة المرور"
+
+#: .\contrib\admin\templates\registration\password_reset_done.html.py:6
+#: .\contrib\admin\templates\registration\password_reset_done.html.py:10
+msgid "Password reset successful"
+msgstr "تمت عملية اعادة ضبط كلمة المرور بنجاح"
+
+#: .\contrib\admin\templates\registration\password_reset_done.html.py:12
+msgid "We've e-mailed a new password to the e-mail address you submitted. You should be receiving it shortly."
+msgstr "لقد قمنا بارسال كلمة مرور جديدة إلى عنوان البريد الإلكتروني الذي أدخلتها، ستصلك قريبا إن شاء الله."
+
+#: .\contrib\admin\templates\registration\password_reset_email.html.py:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "لقد وصلتك رسالة البريد الإلكتروني هذه لأنك طلبت إعادة ضبط كلمة المرور."
+
+#: .\contrib\admin\templates\registration\password_reset_email.html.py:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "لحسابك المستخدم الخاص بك في %(site_name)s"
+
+#: .\contrib\admin\templates\registration\password_reset_email.html.py:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "كلمة مرورك الجديدة هي: %(new_password)s"
+
+#: .\contrib\admin\templates\registration\password_reset_email.html.py:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "يمكنك تغيير كلمة المرور هذه بالذهاب إلى هذه الصفحة:"
+
+#: .\contrib\admin\templates\registration\password_reset_email.html.py:11
+msgid "Your username, in case you've forgotten:"
+msgstr "اسم المستخدم الخاص بك، في حال كنت قد نسيته:"
+
+#: .\contrib\admin\templates\registration\password_reset_email.html.py:13
+msgid "Thanks for using our site!"
+msgstr "شكرا لاستخدامك لموقعنا!"
+
+#: .\contrib\admin\templates\registration\password_reset_email.html.py:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "فريق %(site_name)s"
+
+#: .\contrib\admin\templates\registration\password_reset_form.html.py:12
+msgid "Forgotten your password? Enter your e-mail address below, and we'll reset your password and e-mail the new one to you."
+msgstr "نسيت كلمة المرور الخاصة بك؟ قم بادخال عنوان بريدك الإلكتروني بالأسفل وسنقوم باعادة ضبط كلمة المرور الخاصة بك وارسال كلمة المرور الجديدة إليك عبر البريد الإلكتروني."
+
+#: .\contrib\admin\templates\registration\password_reset_form.html.py:16
+msgid "E-mail address:"
+msgstr "عنوان البريد الإلكتروني:"
+
+#: .\contrib\admin\templates\registration\password_reset_form.html.py:16
+msgid "Reset my password"
+msgstr "اعادة ضبط كلمة المرور"
+
+#: .\contrib\admin\templates\widget\date_time.html.py:3
+msgid "Date:"
+msgstr "التاريخ:"
+
+#: .\contrib\admin\templates\widget\date_time.html.py:4
+msgid "Time:"
+msgstr "الوقت:"
+
+#: .\contrib\admin\templates\widget\file.html.py:2
+msgid "Currently:"
+msgstr "حاليا:"
+
+#: .\contrib\admin\templates\widget\file.html.py:3
+msgid "Change:"
+msgstr "تغيير:"
+
+#: .\contrib\admin\templatetags\admin_list.py:230
+msgid "All dates"
+msgstr "كافة التواريخ"
+
+#: .\contrib\admin\views\decorators.py:10
+#: .\contrib\auth\forms.py:37
+msgid "Please enter a correct username and password. Note that both fields are case-sensitive."
+msgstr "الرجاء ادخال اسم مستخدم وكلمة مرور صحيحين، الرجاء الانتباه إلى أن كلا الحقلين حساس لحالة الأحرف من حيث كونها كبيرة أو صغيرة."
+
+#: .\contrib\admin\views\decorators.py:62
+msgid "Please log in again, because your session has expired. Don't worry: Your submission has been saved."
+msgstr "الرجاء الدخول مرة أخرى لأن جلستك انتهت، لا تقلق: البيانات التي قمت بارسالها حفظت."
+
+#: .\contrib\admin\views\decorators.py:69
+msgid "Looks like your browser isn't configured to accept cookies. Please enable cookies, reload this page, and try again."
+msgstr "يبدو بأن متصفحك غير معد لقبول الكوكيز، قم بتفعيل الكوكيز من فضلك ثم تحديث هذه الصفحة والمحاولة مرة أخرى."
+
+#: .\contrib\admin\views\decorators.py:83
+msgid "Usernames cannot contain the '@' character."
+msgstr "اسم المستخدم يجب أن لا يحتوي على علامة '@'."
+
+#: .\contrib\admin\views\decorators.py:85
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "بريدك الإلكتروني ليس اسم المستخدم الخاص بك، جرب استخدام '%s' بدلا من ذلك."
+
+#: .\contrib\admin\views\doc.py:291
+#: .\contrib\admin\views\doc.py:301
+#: .\contrib\admin\views\doc.py:303
+#: .\contrib\admin\views\doc.py:309
+#: .\contrib\admin\views\doc.py:310
+#: .\contrib\admin\views\doc.py:312
+msgid "Integer"
+msgstr "عدد صحيح"
+
+#: .\contrib\admin\views\doc.py:292
+msgid "Boolean (Either True or False)"
+msgstr "ثنائي (إما صح أو خطأ)"
+
+#: .\contrib\admin\views\doc.py:293
+#: .\contrib\admin\views\doc.py:311
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "سلسلة نصية (تصل إلى %(maxlength)s)"
+
+#: .\contrib\admin\views\doc.py:294
+msgid "Comma-separated integers"
+msgstr "أرقام صحيحة مفصولة بفواصل comma"
+
+#: .\contrib\admin\views\doc.py:295
+msgid "Date (without time)"
+msgstr "التاريخ (بدون الوقت)"
+
+#: .\contrib\admin\views\doc.py:296
+msgid "Date (with time)"
+msgstr "التاريخ (مع الوقت)"
+
+#: .\contrib\admin\views\doc.py:297
+msgid "E-mail address"
+msgstr "عنوان البريد الإلكتروني"
+
+#: .\contrib\admin\views\doc.py:298
+#: .\contrib\admin\views\doc.py:299
+#: .\contrib\admin\views\doc.py:302
+msgid "File path"
+msgstr "مسار الملف"
+
+#: .\contrib\admin\views\doc.py:300
+msgid "Decimal number"
+msgstr "رقم عشري"
+
+#: .\contrib\admin\views\doc.py:304
+#: .\contrib\comments\models.py:85
+msgid "IP address"
+msgstr "عنوان IP"
+
+#: .\contrib\admin\views\doc.py:306
+msgid "Boolean (Either True, False or None)"
+msgstr "ثنائي (إما صح أو خطأ أو لاشيء)"
+
+#: .\contrib\admin\views\doc.py:307
+msgid "Relation to parent model"
+msgstr "العلاقة بالنموذج الأب"
+
+#: .\contrib\admin\views\doc.py:308
+msgid "Phone number"
+msgstr "رقم هاتف"
+
+#: .\contrib\admin\views\doc.py:313
+msgid "Text"
+msgstr "نص"
+
+#: .\contrib\admin\views\doc.py:314
+msgid "Time"
+msgstr "وقت"
+
+#: .\contrib\admin\views\doc.py:315
+#: .\contrib\flatpages\models.py:7
+msgid "URL"
+msgstr "وصلة"
+
+#: .\contrib\admin\views\doc.py:316
+msgid "U.S. state (two uppercase letters)"
+msgstr "ولاية أمريكية (حرفان كبيران)"
+
+#: .\contrib\admin\views\doc.py:317
+msgid "XML text"
+msgstr "نص XML"
+
+#: .\contrib\admin\views\main.py:226
+msgid "Site administration"
+msgstr "إدارة الموقع"
+
+#: .\contrib\admin\views\main.py:260
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "تم اضافة %(name)s \"%(obj)s\" بنجاح."
+
+#: .\contrib\admin\views\main.py:264
+#: .\contrib\admin\views\main.py:348
+msgid "You may edit it again below."
+msgstr "يمكنك تعديله مجددا في الأسفل."
+
+#: .\contrib\admin\views\main.py:272
+#: .\contrib\admin\views\main.py:357
+#, python-format
+msgid "You may add another %s below."
+msgstr "يمكنك إضافة %s آخر بالأسفل."
+
+#: .\contrib\admin\views\main.py:290
+#, python-format
+msgid "Add %s"
+msgstr "اضافة %s"
+
+#: .\contrib\admin\views\main.py:336
+#, python-format
+msgid "Added %s."
+msgstr "اضاف %s."
+
+#: .\contrib\admin\views\main.py:336
+#: .\contrib\admin\views\main.py:338
+#: .\contrib\admin\views\main.py:340
+msgid "and"
+msgstr "و"
+
+#: .\contrib\admin\views\main.py:338
+#, python-format
+msgid "Changed %s."
+msgstr "غير %s."
+
+#: .\contrib\admin\views\main.py:340
+#, python-format
+msgid "Deleted %s."
+msgstr "حذف %s."
+
+#: .\contrib\admin\views\main.py:343
+msgid "No fields changed."
+msgstr "لم يتم تغيير أية حقول."
+
+#: .\contrib\admin\views\main.py:346
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "تم تغيير %(name)s \"%(obj)s\" بنجاح."
+
+#: .\contrib\admin\views\main.py:354
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "تم اضافة %(name)s \"%(obj)s\" بنجاح، يمكنك تعديله مرة أخرى بالأسفل."
+
+#: .\contrib\admin\views\main.py:392
+#, python-format
+msgid "Change %s"
+msgstr "تغيير %s"
+
+#: .\contrib\admin\views\main.py:474
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "%(fieldname)s واحد أو أكثر في %(name)s: %(obj)s"
+
+#: .\contrib\admin\views\main.py:479
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "%(fieldname)s واحد أو أكثر في %(name)s:"
+
+#: .\contrib\admin\views\main.py:512
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "تم حذف %(name)s \"%(obj)s\" بنجاح."
+
+#: .\contrib\admin\views\main.py:515
+msgid "Are you sure?"
+msgstr "هل أنت متأكد؟"
+
+#: .\contrib\admin\views\main.py:537
+#, python-format
+msgid "Change history: %s"
+msgstr "تاريخ التغيير: %s"
+
+#: .\contrib\admin\views\main.py:571
+#, python-format
+msgid "Select %s"
+msgstr "اختر %s"
+
+#: .\contrib\admin\views\main.py:571
+#, python-format
+msgid "Select %s to change"
+msgstr "اختر %s لتغييره"
+
+#: .\contrib\admin\views\main.py:747
+msgid "Database error"
+msgstr "خطـأ في قاعدة البيانات"
+
+#: .\contrib\auth\forms.py:30
+msgid "Your Web browser doesn't appear to have cookies enabled. Cookies are required for logging in."
+msgstr "يبدو بأن الكوكيز غير مفعله في متصفحك، الكوكيز مطلوبة للتمكن من الدخول."
+
+#: .\contrib\auth\forms.py:39
+msgid "This account is inactive."
+msgstr "هذا الحساب غير فعال."
+
+#: .\contrib\auth\models.py:37
+#: .\contrib\auth\models.py:56
+msgid "name"
+msgstr "الاسم"
+
+#: .\contrib\auth\models.py:39
+msgid "codename"
+msgstr "الاسم الرمزي"
+
+#: .\contrib\auth\models.py:41
+msgid "permission"
+msgstr "الصلاحية"
+
+#: .\contrib\auth\models.py:42
+#: .\contrib\auth\models.py:57
+msgid "permissions"
+msgstr "الصلاحيات"
+
+#: .\contrib\auth\models.py:59
+msgid "group"
+msgstr "المجموعة"
+
+#: .\contrib\auth\models.py:60
+#: .\contrib\auth\models.py:99
+msgid "groups"
+msgstr "المجموعات"
+
+#: .\contrib\auth\models.py:89
+msgid "username"
+msgstr "اسم المستخدم"
+
+#: .\contrib\auth\models.py:89
+msgid "Required. 30 characters or fewer. Alphanumeric characters only (letters, digits and underscores)."
+msgstr "مطلوب. 30 خانة أو أقل. خانات حرف رقمية فقط (أحرف، أرقام والشرطة السفلية)."
+
+#: .\contrib\auth\models.py:90
+msgid "first name"
+msgstr "الاسم الأول"
+
+#: .\contrib\auth\models.py:91
+msgid "last name"
+msgstr "الاسم الأخير"
+
+#: .\contrib\auth\models.py:92
+msgid "e-mail address"
+msgstr "عنوان البريد الإلكتروني"
+
+#: .\contrib\auth\models.py:93
+msgid "password"
+msgstr "كلمة المرور"
+
+#: .\contrib\auth\models.py:93
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr "استخدم '[algo]$[salt]$[hexdigest]'"
+
+#: .\contrib\auth\models.py:94
+msgid "staff status"
+msgstr "حالة الطاقم"
+
+#: .\contrib\auth\models.py:94
+msgid "Designates whether the user can log into this admin site."
+msgstr "يحدد ما إذا كان المستخدم يستطيع الدخول إلى موقع الإدارة هذا."
+
+#: .\contrib\auth\models.py:95
+msgid "active"
+msgstr "فعال"
+
+#: .\contrib\auth\models.py:95
+msgid "Designates whether this user can log into the Django admin. Unselect this instead of deleting accounts."
+msgstr "يحدد ما إذا كان المستخدم يستطيع الدخول إلى لوحة تحكم جانغو، قم بتحديد هذا الخيار بدلا من حذف حسابات المستخدمين."
+
+#: .\contrib\auth\models.py:96
+msgid "superuser status"
+msgstr "حالة المستخدم بالقوى الخارقة"
+
+#: .\contrib\auth\models.py:96
+msgid "Designates that this user has all permissions without explicitly assigning them."
+msgstr "حدد بأن هذا المستخدم يمتلك كافة الصلاحيات دون الحاجة لتحديدها له تصريحا."
+
+#: .\contrib\auth\models.py:97
+msgid "last login"
+msgstr "آخر عملية دخول"
+
+#: .\contrib\auth\models.py:98
+msgid "date joined"
+msgstr "تاريخ الانضمام"
+
+#: .\contrib\auth\models.py:100
+msgid "In addition to the permissions manually assigned, this user will also get all permissions granted to each group he/she is in."
+msgstr "بالإضافة إلى الصلاحيات المحددة للمستخدم يدويا، فإن المستخدم يحصل أيضا على كافة صلاحيات المجموعة التي ينتمي إليها."
+
+#: .\contrib\auth\models.py:101
+msgid "user permissions"
+msgstr "صلاحيات المستخدم"
+
+#: .\contrib\auth\models.py:104
+msgid "user"
+msgstr "المستخدم"
+
+#: .\contrib\auth\models.py:105
+msgid "users"
+msgstr "المستخدمين"
+
+#: .\contrib\auth\models.py:110
+msgid "Personal info"
+msgstr "المعلومات الشخصية"
+
+#: .\contrib\auth\models.py:111
+msgid "Permissions"
+msgstr "الصلاحيات"
+
+#: .\contrib\auth\models.py:112
+msgid "Important dates"
+msgstr "تواريخ مهمة"
+
+#: .\contrib\auth\models.py:113
+msgid "Groups"
+msgstr "المجموعات"
+
+#: .\contrib\auth\models.py:250
+msgid "message"
+msgstr "رسالة"
+
+#: .\contrib\auth\views.py:40
+msgid "Logged out"
+msgstr "خروج"
+
+#: .\contrib\comments\models.py:67
+#: .\contrib\comments\models.py:166
+msgid "object ID"
+msgstr "معرف العنصر"
+
+#: .\contrib\comments\models.py:68
+msgid "headline"
+msgstr "عنوان"
+
+#: .\contrib\comments\models.py:69
+#: .\contrib\comments\models.py:90
+#: .\contrib\comments\models.py:167
+msgid "comment"
+msgstr "تعليق"
+
+#: .\contrib\comments\models.py:70
+msgid "rating #1"
+msgstr "تقييم #1"
+
+#: .\contrib\comments\models.py:71
+msgid "rating #2"
+msgstr "تقييم #2"
+
+#: .\contrib\comments\models.py:72
+msgid "rating #3"
+msgstr "تقييم #3"
+
+#: .\contrib\comments\models.py:73
+msgid "rating #4"
+msgstr "تقييم #4"
+
+#: .\contrib\comments\models.py:74
+msgid "rating #5"
+msgstr "تقييم #5"
+
+#: .\contrib\comments\models.py:75
+msgid "rating #6"
+msgstr "تقييم #8"
+
+#: .\contrib\comments\models.py:76
+msgid "rating #7"
+msgstr "تقييم #7"
+
+#: .\contrib\comments\models.py:77
+msgid "rating #8"
+msgstr "تقييم #8"
+
+#: .\contrib\comments\models.py:82
+msgid "is valid rating"
+msgstr "تقييم صالح"
+
+#: .\contrib\comments\models.py:83
+#: .\contrib\comments\models.py:169
+msgid "date/time submitted"
+msgstr "تم ارسال التاريخ/الوقت"
+
+#: .\contrib\comments\models.py:84
+#: .\contrib\comments\models.py:170
+msgid "is public"
+msgstr "عام"
+
+#: .\contrib\comments\models.py:86
+msgid "is removed"
+msgstr "محذوف"
+
+#: .\contrib\comments\models.py:86
+msgid "Check this box if the comment is inappropriate. A \"This comment has been removed\" message will be displayed instead."
+msgstr "قم بتحديد هذا المربع إذا كان التعليق غير لائق، سيتم عرض الرسالة \"تم حذف هذا التعليق\" بدلا منه."
+
+#: .\contrib\comments\models.py:91
+msgid "comments"
+msgstr "تعليقات"
+
+#: .\contrib\comments\models.py:131
+#: .\contrib\comments\models.py:207
+msgid "Content object"
+msgstr "عنصر محتوى"
+
+#: .\contrib\comments\models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"أرسلت بواسطة %(user)s في %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: .\contrib\comments\models.py:168
+msgid "person's name"
+msgstr "اسم الشخص"
+
+#: .\contrib\comments\models.py:171
+msgid "ip address"
+msgstr "عنوان ip"
+
+#: .\contrib\comments\models.py:173
+msgid "approved by staff"
+msgstr "موافق عليه من قبل الطاقم"
+
+#: .\contrib\comments\models.py:176
+msgid "free comment"
+msgstr "تعليق حر"
+
+#: .\contrib\comments\models.py:177
+msgid "free comments"
+msgstr "تعليقات حرة"
+
+#: .\contrib\comments\models.py:233
+msgid "score"
+msgstr "الدرجة"
+
+#: .\contrib\comments\models.py:234
+msgid "score date"
+msgstr "تاريخ الدرجة"
+
+#: .\contrib\comments\models.py:237
+msgid "karma score"
+msgstr "درجة الكارما"
+
+#: .\contrib\comments\models.py:238
+msgid "karma scores"
+msgstr "درجات الكارما"
+
+#: .\contrib\comments\models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "تقييم %(score)d بواسطة %(user)s"
+
+#: .\contrib\comments\models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"هذا التعليق تم تعليمه بواسطة %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: .\contrib\comments\models.py:265
+msgid "flag date"
+msgstr "تاريخ التعليم"
+
+#: .\contrib\comments\models.py:268
+msgid "user flag"
+msgstr "علامة مستخدم"
+
+#: .\contrib\comments\models.py:269
+msgid "user flags"
+msgstr "علامات المستخدم"
+
+#: .\contrib\comments\models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "علامة بواسطة %r"
+
+#: .\contrib\comments\models.py:278
+msgid "deletion date"
+msgstr "تاريخ الحذف"
+
+#: .\contrib\comments\models.py:280
+msgid "moderator deletion"
+msgstr "حذف المراقب"
+
+#: .\contrib\comments\models.py:281
+msgid "moderator deletions"
+msgstr "حذوفات المراقب"
+
+#: .\contrib\comments\models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "حذف المراقب بواسطة %r"
+
+#: .\contrib\comments\templates\comments\form.html.py:6
+msgid "Forgotten your password?"
+msgstr "نسيت كلمة المرور؟"
+
+#: .\contrib\comments\templates\comments\form.html.py:12
+msgid "Ratings"
+msgstr "التقييمات"
+
+#: .\contrib\comments\templates\comments\form.html.py:12
+#: .\contrib\comments\templates\comments\form.html.py:23
+msgid "Required"
+msgstr "مطلوب"
+
+#: .\contrib\comments\templates\comments\form.html.py:12
+#: .\contrib\comments\templates\comments\form.html.py:23
+msgid "Optional"
+msgstr "اختياري"
+
+#: .\contrib\comments\templates\comments\form.html.py:23
+msgid "Post a photo"
+msgstr "ارسال صورة"
+
+#: .\contrib\comments\templates\comments\form.html.py:28
+#: .\contrib\comments\templates\comments\freeform.html.py:5
+msgid "Comment:"
+msgstr "تعليق:"
+
+#: .\contrib\comments\templates\comments\form.html.py:34
+#: .\contrib\comments\templates\comments\freeform.html.py:9
+msgid "Preview comment"
+msgstr "استعراض التعليق"
+
+#: .\contrib\comments\templates\comments\freeform.html.py:4
+msgid "Your name:"
+msgstr "اسمك:"
+
+#: .\contrib\comments\views\comments.py:27
+msgid "This rating is required because you've entered at least one other rating."
+msgstr "هذا التقييم مطلوب لأنك قمت بادخال تقييم واحد على الأقل."
+
+#: .\contrib\comments\views\comments.py:111
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"هذا التعليق كتب بواسطة شخص لديه أقل من تعليق واحد:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"هذا التعليق كتب بواسطة شخص لديه أقل من تعليقان:\n"
+"\n"
+"%(text)s"
+msgstr[2] ""
+"هذا التعليق كتب بواسطة شخص لديه أقل من %(count)s تعليقات:\n"
+"\n"
+"%(text)s"
+msgstr[3] ""
+"هذا التعليق كتب بواسطة شخص لديه أقل من %(count)s تعليق:\n"
+"\n"
+"%(text)s"
+
+#: .\contrib\comments\views\comments.py:116
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"هذا التعليق كتب بواسطة عضو سطحي:\n"
+"\n"
+"%(text)s"
+
+#: .\contrib\comments\views\comments.py:188
+#: .\contrib\comments\views\comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "يسمح باستخدام POST فقط"
+
+#: .\contrib\comments\views\comments.py:192
+#: .\contrib\comments\views\comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "لم يتم ارسال واحد أو أكثر من الحقول المطلوبة."
+
+#: .\contrib\comments\views\comments.py:196
+#: .\contrib\comments\views\comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "شخص ما قام بالتلاعب بنموذج التعليق (انتهاك أمني)"
+
+#: .\contrib\comments\views\comments.py:206
+#: .\contrib\comments\views\comments.py:292
+msgid "The comment form had an invalid 'target' parameter -- the object ID was invalid"
+msgstr "نموذج التعليق احتوى 'هدف' غير صحيح -- معرف الكائن كان غير صحيحا"
+
+#: .\contrib\comments\views\comments.py:257
+#: .\contrib\comments\views\comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "نموذج التعليق لم يحدد أيا من 'استعراض' أو 'ارسال'"
+
+#: .\contrib\comments\views\karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "لا يمكن للمستخدمين المجهولين التصويت"
+
+#: .\contrib\comments\views\karma.py:23
+msgid "Invalid comment ID"
+msgstr "معرف التعليق غير صحيح"
+
+#: .\contrib\comments\views\karma.py:25
+msgid "No voting for yourself"
+msgstr "لا يمكنك التصويت لنفسك"
+
+#: .\contrib\contenttypes\models.py:20
+msgid "python model class name"
+msgstr "اسم صنف النموذج في python"
+
+#: .\contrib\contenttypes\models.py:23
+msgid "content type"
+msgstr "نوع البيانات"
+
+#: .\contrib\contenttypes\models.py:24
+msgid "content types"
+msgstr "أنواع البيانات"
+
+#: .\contrib\flatpages\models.py:8
+msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr "مثال: '/about/contact/'. تأكد من وضع شرطات في البداية والنهاية."
+
+#: .\contrib\flatpages\models.py:9
+msgid "title"
+msgstr "العنوان"
+
+#: .\contrib\flatpages\models.py:10
+msgid "content"
+msgstr "المحتوى"
+
+#: .\contrib\flatpages\models.py:11
+msgid "enable comments"
+msgstr "السماح بالتعليقات"
+
+#: .\contrib\flatpages\models.py:12
+msgid "template name"
+msgstr "اسم القالب"
+
+#: .\contrib\flatpages\models.py:13
+msgid "Example: 'flatpages/contact_page'. If this isn't provided, the system will use 'flatpages/default'."
+msgstr "مثال: 'flatpages/contact_page'. إذا لم يتم تحديده فإن النظام سيقوم باستخدام 'flatpages/default'."
+
+#: .\contrib\flatpages\models.py:14
+msgid "registration required"
+msgstr "التسجيل مطلوب"
+
+#: .\contrib\flatpages\models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "إذا كان هذا الخيار محددا، فإن المستخدمين الداخلين فقط سيتمكنون من مشاهدة الصفحة."
+
+#: .\contrib\flatpages\models.py:18
+msgid "flat page"
+msgstr "صفحة مسطحة"
+
+#: .\contrib\flatpages\models.py:19
+msgid "flat pages"
+msgstr "صفحات مسطحة"
+
+#: .\contrib\redirects\models.py:7
+msgid "redirect from"
+msgstr "نموذج إعادة توجيه"
+
+#: .\contrib\redirects\models.py:8
+msgid "This should be an absolute path, excluding the domain name. Example: '/events/search/'."
+msgstr "يجب أن يكون هذا مسارا مطلقا وبدون اسم النطاق. مثال: '/events/search/'."
+
+#: .\contrib\redirects\models.py:9
+msgid "redirect to"
+msgstr "إعادة توجيه إلى"
+
+#: .\contrib\redirects\models.py:10
+msgid "This can be either an absolute path (as above) or a full URL starting with 'http://'."
+msgstr "يجب أن يكون هذا مسارا مطلقا (كما في الذي فوقه) عنوانا كاملا يبدأ بالمقطع 'http://'."
+
+#: .\contrib\redirects\models.py:13
+msgid "redirect"
+msgstr "إعادة توجيه"
+
+#: .\contrib\redirects\models.py:14
+msgid "redirects"
+msgstr "إعادات توجيه"
+
+#: .\contrib\sessions\models.py:41
+msgid "session key"
+msgstr "مفتاح الجلسة"
+
+#: .\contrib\sessions\models.py:42
+msgid "session data"
+msgstr "بيانات الجلسة"
+
+#: .\contrib\sessions\models.py:43
+msgid "expire date"
+msgstr "تاريخ الانتهاء"
+
+#: .\contrib\sessions\models.py:47
+msgid "session"
+msgstr "جلسة"
+
+#: .\contrib\sessions\models.py:48
+msgid "sessions"
+msgstr "جلسات"
+
+#: .\contrib\sites\models.py:10
+msgid "domain name"
+msgstr "اسم النطاق"
+
+#: .\contrib\sites\models.py:11
+msgid "display name"
+msgstr "اسم العرض"
+
+#: .\contrib\sites\models.py:15
+msgid "site"
+msgstr "موقع"
+
+#: .\contrib\sites\models.py:16
+msgid "sites"
+msgstr "مواقع"
+
+#: .\core\validators.py:63
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "هذه القيمة يجب أن تحتوي فقط على الأحرف والأرقام والشرطة السفلية."
+
+#: .\core\validators.py:67
+msgid "This value must contain only letters, numbers, underscores, dashes or slashes."
+msgstr "هذه القيمة يجب أن تحتوي فقط على الأحرف والأرقام والشرطات السفلية والشرطة العادية والشرطات المائلة."
+
+#: .\core\validators.py:75
+msgid "Uppercase letters are not allowed here."
+msgstr "الحروف الكبيرة غير مسموح بها هنا."
+
+#: .\core\validators.py:79
+msgid "Lowercase letters are not allowed here."
+msgstr "الحروف الصغيرة غير مسموح بها هنا."
+
+#: .\core\validators.py:86
+msgid "Enter only digits separated by commas."
+msgstr "أدخل أرقاما فقط مفصول بينها بفواصل comma."
+
+#: .\core\validators.py:98
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "أدخل عناوين بريد إلكتروني صالحة مفصول بينها بفواصل comma."
+
+#: .\core\validators.py:102
+msgid "Please enter a valid IP address."
+msgstr "أدخل عنوان IP صالح من فضلك."
+
+#: .\core\validators.py:106
+msgid "Empty values are not allowed here."
+msgstr "القيم الفارغة غير مسموح بها هنا."
+
+#: .\core\validators.py:110
+msgid "Non-numeric characters aren't allowed here."
+msgstr "الخانات غير الرقمية غير مسموح بها هنا."
+
+#: .\core\validators.py:114
+msgid "This value can't be comprised solely of digits."
+msgstr "لا يمكن أن تكون القيمة مكونة من الأرقام فقط."
+
+#: .\core\validators.py:119
+msgid "Enter a whole number."
+msgstr "أدخل رقما صحيحا."
+
+#: .\core\validators.py:123
+msgid "Only alphabetical characters are allowed here."
+msgstr "فقط الخانات الحرفية مسموح بها هنا."
+
+#: .\core\validators.py:127
+#: .\db\models\fields\__init__.py:412
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "أدخل تاريخا صحيحا بتنسيق YYYY-MM-DD."
+
+#: .\core\validators.py:131
+msgid "Enter a valid time in HH:MM format."
+msgstr "أدخل وقتا صحيحا بتنسيق HH:MM."
+
+#: .\core\validators.py:135
+#: .\db\models\fields\__init__.py:474
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "أدخل تاريخ/وقت صحيحين بتنسيق YYYY-MM-DD HH:MM."
+
+#: .\core\validators.py:139
+msgid "Enter a valid e-mail address."
+msgstr "أدخل عنوان بريد إلكتروني صحيح."
+
+#: .\core\validators.py:151
+#: .\core\validators.py:379
+#: .\forms\__init__.py:659
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "لم يتم ارسال ملف، الرجاء التأكد من نوع ترميز (encoding type) النموذج."
+
+#: .\core\validators.py:155
+msgid "Upload a valid image. The file you uploaded was either not an image or a corrupted image."
+msgstr "قم برفع صورة صالحة، الملف الذي قمت برفعه إما أنه ليس ملفا لصورة أو أنه ملف معطوب."
+
+#: .\core\validators.py:162
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "العنوان %s لا يحتوي على صورة صالحة."
+
+#: .\core\validators.py:166
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "رقم الهاتف يجب أن يكون بتنسيق XXX-XXX-XXXX. \"%s\" غير صالح."
+
+#: .\core\validators.py:174
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "هذا العنوان %s لا يشير إلى مقطع فيديو QuickTime صالح."
+
+#: .\core\validators.py:178
+msgid "A valid URL is required."
+msgstr "يجب ادخال عنوان صالح."
+
+#: .\core\validators.py:192
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"مطلوب شفرة HTML صالحة، الأخطاء على وجه التحديد هي:\n"
+"%s"
+
+#: .\core\validators.py:199
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "XML مهيئة بصورة سيئة: %s"
+
+#: .\core\validators.py:209
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "وصلة غير صالحة: %s"
+
+#: .\core\validators.py:213
+#: .\core\validators.py:215
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "الوصلة %s غير صحيحة."
+
+#: .\core\validators.py:221
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "أدخل اختصار ولاية أمريكية صحيحا."
+
+#: .\core\validators.py:236
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "انته إلى ما تقول! الكلمة %s غير مسموح بها هنا."
+msgstr[1] "انتبه إلى ما تقول! الكلمتان %s غير مسموح بهما هنا."
+msgstr[2] "انتبه إلى ما تقول! الكلمات %s غير مسموح بها هنا."
+msgstr[3] "انتبه إلى ما تقول! الكلمات %s غير مسموح بها هنا."
+
+#: .\core\validators.py:243
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "هذا الحقل يجب أن يطابق الحقل '%s'."
+
+#: .\core\validators.py:262
+msgid "Please enter something for at least one field."
+msgstr "الرجاء ادخال شيء ما في حقل واحد على الأقل."
+
+#: .\core\validators.py:271
+#: .\core\validators.py:282
+msgid "Please enter both fields or leave them both empty."
+msgstr "الرجاء ادخال كلا الحقلين أن ترك كلاهما فارغا."
+
+#: .\core\validators.py:289
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "هذا الحقل يجب أن يعطي إذا كان %(field)s %(value)s"
+
+#: .\core\validators.py:301
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "هذا الحقل يجب أن يعطى إذا لم يكن %(field)s %(value)s"
+
+#: .\core\validators.py:320
+msgid "Duplicate values are not allowed."
+msgstr "القيم المكررة غير مسموح بها."
+
+#: .\core\validators.py:343
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "يجب أن تكون القيام من مضاعفات %s."
+
+#: .\core\validators.py:354
+msgid "Please enter a valid decimal number."
+msgstr "الرجاء ادخال رقم عشري صالح."
+
+#: .\core\validators.py:356
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural "Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "رجاء أدخل رقم عشري صالح مكون من خانة واحدة على الأكثر."
+msgstr[1] "رجاء أدخل رقم عشري صالح مكون من خانتين على الأكثر."
+msgstr[2] "رجاء أدخل رقم عشري صالح مكون من %s خانات على الأكثر."
+msgstr[3] "رجاء أدخل رقم عشري صالح مكون من %s خانة على الأكثر."
+
+#: .\core\validators.py:359
+#, python-format
+msgid "Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural "Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] "رجاء أدخل رقم عشري صالح يكون الجزء الصحيح منه مكونا من خانة واحدة على الأكثر."
+msgstr[1] "رجاء أدخل رقم عشري صالح يكون الجزء الصحيح منه مكونا من خانتين على الأكثر."
+msgstr[2] "رجاء أدخل رقم عشري صالح يكون الجزء الصحيح منه مكونا من %s خانات على الأكثر."
+msgstr[3] "رجاء أدخل رقم عشري صالح يكون الجزء الصحيح منه مكونا من %s خانة على الأكثر."
+
+#: .\core\validators.py:362
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural "Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "الرجاء ادخال رقم عشري صالح تكون فيه خانة عشرية واحدة على الأكثر."
+msgstr[1] "الرجاء ادخال رقم عشري صالح تكون فيه خانتان عشريتان على الأكثر."
+msgstr[2] "الرجاء ادخال رقم عشري صالح تكون فيه %s خانات عشرية على الأكثر."
+msgstr[3] "الرجاء ادخال رقم عشري صالح تكون فيه %s خانة عشرية على الأكثر."
+
+#: .\core\validators.py:372
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "تأكد من أن حجم الملف الذي قمت برفعه لا يقل عن  %s بايت."
+
+#: .\core\validators.py:373
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "تأكد من أن الملف الذي قمت برفعه لا يزيد عن %s بايت."
+
+#: .\core\validators.py:390
+msgid "The format for this field is wrong."
+msgstr "تنسيق هذا الحقل خاطئ."
+
+#: .\core\validators.py:405
+msgid "This field is invalid."
+msgstr "هذا الحقل غير صحيح."
+
+#: .\core\validators.py:441
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "تعذر جلب أي شيء من %s."
+
+#: .\core\validators.py:444
+#, python-format
+msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "الوصلة %(url)s أعادت ترويسة Content-Type الخاطئة '%(contenttype)s'."
+
+#: .\core\validators.py:477
+#, python-format
+msgid "Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with \"%(start)s\".)"
+msgstr "الرجاء اغلاق الوسم %(tag)s في سطر %(line)s. (يبدأ السطر هكذا \"%(start)s\".)"
+
+#: .\core\validators.py:481
+#, python-format
+msgid "Some text starting on line %(line)s is not allowed in that context. (Line starts with \"%(start)s\".)"
+msgstr "بعض النص الذي يبدأ في سطر %(line)s غير مسموح به في هذا السياق. (يبدأ السطر هكذا \"%(start)s\".)"
+
+#: .\core\validators.py:486
+#, python-format
+msgid "\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%(start)s\".)"
+msgstr "\"%(attr)s\" في السطر %(line)s هي سمة غير صالحة. (يبدأ السطر هكذا \"%(start)s\".)"
+
+#: .\core\validators.py:491
+#, python-format
+msgid "\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%(start)s\".)"
+msgstr "\"<%(tag)s>\" في السطر %(line)s وسم غير صالح. (يبدأ السطر هكذا \"%(start)s\".)"
+
+#: .\core\validators.py:495
+#, python-format
+msgid "A tag on line %(line)s is missing one or more required attributes. (Line starts with \"%(start)s\".)"
+msgstr "هنالك وسم في السطر %(line)s تنقصه سمة واحدة أو أكثر. (يبدأ السطر هكذا \"%(start)s\".)"
+
+#: .\core\validators.py:500
+#, python-format
+msgid "The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line starts with \"%(start)s\".)"
+msgstr "السمة \"%(attr)s\" في السطر %(line)s تمتلك قيمة غير صالحة. (يبدأ السطر هكذا \"%(start)s\".)"
+
+#: .\db\models\manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(object)s مع هذا %(type)s موجودة بالفعل لأجل %(field)s."
+
+#: .\db\models\fields\related.py:51
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "الرجاء ادخال %s صالح."
+
+#: .\db\models\fields\related.py:618
+msgid "Separate multiple IDs with commas."
+msgstr "افصل بين المعرفات بفواصل comma."
+
+#: .\db\models\fields\related.py:620
+msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "اضغط زر التحكم \"Control\", أو \"Command\" على أجهزة Mac لاختيار أكثر من واحد."
+
+#: .\db\models\fields\related.py:664
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural "Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "الرجاء ادخال معرفات %(self)s صالحة، القيمة %(value)r غير صالحة."
+msgstr[1] "الرجاء ادخال معرفات %(self)s صالحة، القيمتان %(value)r غير صالحة."
+msgstr[2] "الرجاء ادخال معرفات %(self)s صالحة، القيم %(value)r غير صالحة."
+msgstr[3] "الرجاء ادخال معرفات %(self)s صالحة، القيم %(value)r غير صالحة."
+
+#: .\db\models\fields\__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s بالحقل %(fieldname)s موجود بالفعل."
+
+#: .\db\models\fields\__init__.py:114
+#: .\db\models\fields\__init__.py:265
+#: .\db\models\fields\__init__.py:548
+#: .\db\models\fields\__init__.py:559
+#: .\forms\__init__.py:346
+msgid "This field is required."
+msgstr "هذا الحقل مطلوب."
+
+#: .\db\models\fields\__init__.py:337
+msgid "This value must be an integer."
+msgstr "هذه القيمة يجب أن تكون رقما صحيحا."
+
+#: .\db\models\fields\__init__.py:369
+msgid "This value must be either True or False."
+msgstr "هذه القيمة يجب أن تكون إما صح أو خطأ."
+
+#: .\db\models\fields\__init__.py:385
+msgid "This field cannot be null."
+msgstr "لا يمكن أن تكون قيمة هذا الحقل لا شيء."
+
+#: .\db\models\fields\__init__.py:568
+msgid "Enter a valid filename."
+msgstr "أدخل اسم ملف صالح."
+
+#: .\forms\__init__.py:381
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "تأكد من أن النص الذي أدخلته أقل من خانة واحدة."
+msgstr[1] "تأكد من أن النص الذي أدخلته أقل من خانتين."
+msgstr[2] "تأكد من أن النص الذي أدخلته أقل من %s خانات."
+msgstr[3] "تأكد من أن النص الذي أدخلته أقل من %s خانة."
+
+#: .\forms\__init__.py:386
+msgid "Line breaks are not allowed here."
+msgstr "الأسطر الجديدة غير مسموح هتا."
+
+#: .\forms\__init__.py:485
+#: .\forms\__init__.py:558
+#: .\forms\__init__.py:597
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "حدد خيارا صحيحا; '%(data)s' ليست ضمن %(choices)s."
+
+#: .\forms\__init__.py:661
+msgid "The submitted file is empty."
+msgstr "الملف الذي قمت بارساله فارغ."
+
+#: .\forms\__init__.py:717
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "أدخل رقما صحيحا بين -32,768 و 32,767."
+
+#: .\forms\__init__.py:727
+msgid "Enter a positive number."
+msgstr "أدخل رقما موجبا."
+
+#: .\forms\__init__.py:737
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "أدخل رقما صحيحا بين 0 و 32,767."
+
+#: .\template\defaultfilters.py:401
+msgid "yes,no,maybe"
+msgstr "نعم،لا،ربما"
+
+#: .\utils\dates.py:6
+msgid "Monday"
+msgstr "الاثنين"
+
+#: .\utils\dates.py:6
+msgid "Tuesday"
+msgstr "الثلاثاء"
+
+#: .\utils\dates.py:6
+msgid "Wednesday"
+msgstr "الأربعاء"
+
+#: .\utils\dates.py:6
+msgid "Thursday"
+msgstr "الخميس"
+
+#: .\utils\dates.py:6
+msgid "Friday"
+msgstr "الجمعة"
+
+#: .\utils\dates.py:7
+msgid "Saturday"
+msgstr "السبت"
+
+#: .\utils\dates.py:7
+msgid "Sunday"
+msgstr "الأحد"
+
+#: .\utils\dates.py:14
+msgid "January"
+msgstr "يناير"
+
+#: .\utils\dates.py:14
+msgid "February"
+msgstr "فبراير"
+
+#: .\utils\dates.py:14
+#: .\utils\dates.py:27
+msgid "March"
+msgstr "مارس"
+
+#: .\utils\dates.py:14
+#: .\utils\dates.py:27
+msgid "April"
+msgstr "ابريل"
+
+#: .\utils\dates.py:14
+#: .\utils\dates.py:27
+msgid "May"
+msgstr "مايو"
+
+#: .\utils\dates.py:14
+#: .\utils\dates.py:27
+msgid "June"
+msgstr "يونيو"
+
+#: .\utils\dates.py:15
+#: .\utils\dates.py:27
+msgid "July"
+msgstr "يوليو"
+
+#: .\utils\dates.py:15
+msgid "August"
+msgstr "أغسطس"
+
+#: .\utils\dates.py:15
+msgid "September"
+msgstr "سبتمبر"
+
+#: .\utils\dates.py:15
+msgid "October"
+msgstr "أكتوبر"
+
+#: .\utils\dates.py:15
+msgid "November"
+msgstr "نوفمبر"
+
+#: .\utils\dates.py:16
+msgid "December"
+msgstr "ديسمبر"
+
+#: .\utils\dates.py:19
+msgid "jan"
+msgstr ""
+
+#: .\utils\dates.py:19
+msgid "feb"
+msgstr ""
+
+#: .\utils\dates.py:19
+msgid "mar"
+msgstr ""
+
+#: .\utils\dates.py:19
+msgid "apr"
+msgstr ""
+
+#: .\utils\dates.py:19
+msgid "may"
+msgstr ""
+
+#: .\utils\dates.py:19
+msgid "jun"
+msgstr ""
+
+#: .\utils\dates.py:20
+msgid "jul"
+msgstr ""
+
+#: .\utils\dates.py:20
+msgid "aug"
+msgstr ""
+
+#: .\utils\dates.py:20
+msgid "sep"
+msgstr ""
+
+#: .\utils\dates.py:20
+msgid "oct"
+msgstr ""
+
+#: .\utils\dates.py:20
+msgid "nov"
+msgstr ""
+
+#: .\utils\dates.py:20
+msgid "dec"
+msgstr ""
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "يناير"
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "فبراير"
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "أغسطس"
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "سبتمبر"
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "أكتوبر"
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "نوفمبر"
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "ديسمبر"
+
+#: .\utils\timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "سنة"
+msgstr[1] "سنتان"
+msgstr[2] "سنوات"
+msgstr[3] "سنة"
+
+#: .\utils\timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "شهر"
+msgstr[1] "شهران"
+msgstr[2] "شهور"
+msgstr[3] "شهر"
+
+#: .\utils\timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "أسبوع"
+msgstr[1] "أسبوعان"
+msgstr[2] "أسابيع"
+msgstr[3] "أسبوع"
+
+#: .\utils\timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "يوم"
+msgstr[1] "يومان"
+msgstr[2] "أيام"
+msgstr[3] "يوم"
+
+#: .\utils\timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "ساعة"
+msgstr[1] "ساعتان"
+msgstr[2] "ساعات"
+msgstr[3] "ساعة"
+
+#: .\utils\timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "دقيقة"
+msgstr[1] "دقيقتان"
+msgstr[2] "دقائق"
+msgstr[3] "دقيقة"
+
+#: .\utils\translation.py:363
+msgid "DATE_FORMAT"
+msgstr ""
+
+#: .\utils\translation.py:364
+msgid "DATETIME_FORMAT"
+msgstr ""
+
+#: .\utils\translation.py:365
+msgid "TIME_FORMAT"
+msgstr ""
+
+#: .\utils\translation.py:381
+msgid "YEAR_MONTH_FORMAT"
+msgstr ""
+
+#: .\utils\translation.py:382
+msgid "MONTH_DAY_FORMAT"
+msgstr ""
+
diff --git a/webapp/django/conf/locale/ar/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/ar/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..9e50b91
--- /dev/null
+++ b/webapp/django/conf/locale/ar/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/ar/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/ar/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..d08ffcf
--- /dev/null
+++ b/webapp/django/conf/locale/ar/LC_MESSAGES/djangojs.po
@@ -0,0 +1,110 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-12-09 11:51+0100\n"
+"PO-Revision-Date: 2006-07-06 23:50+0300\n"
+"Last-Translator: Ahmad Alhashemi <ahmad@ahmadh.com>\n"
+"Language-Team: Ahmad Alhashemi <trans@ahmadh.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Arabic\n"
+"X-Poedit-Country: Kuwait\n"
+"X-Poedit-SourceCharset: utf-8\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "%s متوفرة"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "اختيار الكل"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "إضافة"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "حذف"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "%s اختيرت"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "حدد خيارك أو خياراتك واضغط"
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "مسح الكل"
+
+#: contrib/admin/media/js/dateparse.js:26
+#: contrib/admin/media/js/calendar.js:24
+msgid "January February March April May June July August September October November December"
+msgstr "يناير فبراير مارس إبريل مايو يونيو يوليو أغسطس سبتمبر أكتوبر نوفمبر ديسمبر"
+
+#: contrib/admin/media/js/dateparse.js:27
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "الأحد الأثنين الثلاثاء الأربعاء الخميس الجمعة السبت"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "أ أ ث أ خ ج س"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "الآن"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "الساعة"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "اختر وقتا ما"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "منتصف الليل"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "6 ص."
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "الظهر"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "الغاء"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "اليوم"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "التقويم"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "يوم أمس"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "الغد"
+
diff --git a/webapp/django/conf/locale/bg/LC_MESSAGES/django.mo b/webapp/django/conf/locale/bg/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..c1993c6
--- /dev/null
+++ b/webapp/django/conf/locale/bg/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/bg/LC_MESSAGES/django.po b/webapp/django/conf/locale/bg/LC_MESSAGES/django.po
new file mode 100644
index 0000000..eae6c2b
--- /dev/null
+++ b/webapp/django/conf/locale/bg/LC_MESSAGES/django.po
@@ -0,0 +1,5326 @@
+# translation of django.po to Bulgarian
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-25 12:38+0200\n"
+"PO-Revision-Date: 2008-03-12 13:01+0200\n"
+"Last-Translator: Vladislav <vladislav.mitov@gmail.com>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: conf/global_settings.py:39
+#: django/conf/global_settings.py:39
+msgid "Arabic"
+msgstr "арабски"
+
+#: conf/global_settings.py:40
+#: django/conf/global_settings.py:40
+msgid "Bengali"
+msgstr "бенгалски"
+
+#: conf/global_settings.py:41
+#: django/conf/global_settings.py:41
+msgid "Bulgarian"
+msgstr "български"
+
+#: conf/global_settings.py:42
+#: django/conf/global_settings.py:42
+msgid "Catalan"
+msgstr "каталонски"
+
+#: conf/global_settings.py:43
+#: django/conf/global_settings.py:43
+msgid "Czech"
+msgstr "чешки"
+
+#: conf/global_settings.py:44
+#: django/conf/global_settings.py:44
+msgid "Welsh"
+msgstr "уелски"
+
+#: conf/global_settings.py:45
+#: django/conf/global_settings.py:45
+msgid "Danish"
+msgstr "датски"
+
+#: conf/global_settings.py:46
+#: django/conf/global_settings.py:46
+msgid "German"
+msgstr "немски"
+
+#: conf/global_settings.py:47
+#: django/conf/global_settings.py:47
+msgid "Greek"
+msgstr "гръцки"
+
+#: conf/global_settings.py:48
+#: django/conf/global_settings.py:48
+msgid "English"
+msgstr "английски"
+
+#: conf/global_settings.py:49
+#: django/conf/global_settings.py:49
+msgid "Spanish"
+msgstr "испански"
+
+#: conf/global_settings.py:50
+#: django/conf/global_settings.py:50
+msgid "Argentinean Spanish"
+msgstr "аржентински испански"
+
+#: conf/global_settings.py:51
+#: django/conf/global_settings.py:51
+msgid "Basque"
+msgstr "Баски"
+
+#: conf/global_settings.py:52
+#: django/conf/global_settings.py:52
+msgid "Persian"
+msgstr "персийски"
+
+#: conf/global_settings.py:53
+#: django/conf/global_settings.py:53
+msgid "Finnish"
+msgstr "финландски"
+
+#: conf/global_settings.py:54
+#: django/conf/global_settings.py:54
+msgid "French"
+msgstr "френски"
+
+#: conf/global_settings.py:55
+#: django/conf/global_settings.py:55
+msgid "Irish"
+msgstr "ирландски"
+
+#: conf/global_settings.py:56
+#: django/conf/global_settings.py:56
+msgid "Galician"
+msgstr "галицейски"
+
+#: conf/global_settings.py:57
+#: django/conf/global_settings.py:57
+msgid "Hungarian"
+msgstr "унгарски"
+
+#: conf/global_settings.py:58
+#: django/conf/global_settings.py:58
+msgid "Hebrew"
+msgstr "еврит"
+
+#: conf/global_settings.py:59
+#: django/conf/global_settings.py:59
+msgid "Croatian"
+msgstr "хърватски"
+
+#: conf/global_settings.py:60
+#: django/conf/global_settings.py:60
+msgid "Icelandic"
+msgstr "исландски"
+
+#: conf/global_settings.py:61
+#: django/conf/global_settings.py:61
+msgid "Italian"
+msgstr "италиански"
+
+#: conf/global_settings.py:62
+#: django/conf/global_settings.py:62
+msgid "Japanese"
+msgstr "японски"
+
+#: conf/global_settings.py:63
+#: django/conf/global_settings.py:63
+msgid "Georgian"
+msgstr "грузински"
+
+#: conf/global_settings.py:64
+#: django/conf/global_settings.py:64
+msgid "Korean"
+msgstr "корейски"
+
+#: conf/global_settings.py:65
+#: django/conf/global_settings.py:65
+msgid "Khmer"
+msgstr "Кхмерски"
+
+#: conf/global_settings.py:66
+#: django/conf/global_settings.py:66
+msgid "Kannada"
+msgstr "каннада (индийски)"
+
+#: conf/global_settings.py:67
+#: django/conf/global_settings.py:67
+msgid "Latvian"
+msgstr "латвийски"
+
+#: conf/global_settings.py:68
+#: django/conf/global_settings.py:68
+msgid "Macedonian"
+msgstr "македонски"
+
+#: conf/global_settings.py:69
+#: django/conf/global_settings.py:69
+msgid "Dutch"
+msgstr "холандски"
+
+#: conf/global_settings.py:70
+#: django/conf/global_settings.py:70
+msgid "Norwegian"
+msgstr "норвежки"
+
+#: conf/global_settings.py:71
+#: django/conf/global_settings.py:71
+msgid "Polish"
+msgstr "полски"
+
+#: conf/global_settings.py:72
+#: django/conf/global_settings.py:72
+msgid "Portugese"
+msgstr "португалски"
+
+#: conf/global_settings.py:73
+#: django/conf/global_settings.py:73
+msgid "Brazilian"
+msgstr "бразилски"
+
+#: conf/global_settings.py:74
+#: django/conf/global_settings.py:74
+msgid "Romanian"
+msgstr "ромънски"
+
+#: conf/global_settings.py:75
+#: django/conf/global_settings.py:75
+msgid "Russian"
+msgstr "руски"
+
+#: conf/global_settings.py:76
+#: django/conf/global_settings.py:76
+msgid "Slovak"
+msgstr "словашки"
+
+#: conf/global_settings.py:77
+#: django/conf/global_settings.py:77
+msgid "Slovenian"
+msgstr "словенски"
+
+#: conf/global_settings.py:78
+#: django/conf/global_settings.py:78
+msgid "Serbian"
+msgstr "сръбски"
+
+#: conf/global_settings.py:79
+#: django/conf/global_settings.py:79
+msgid "Swedish"
+msgstr "шведски"
+
+#: conf/global_settings.py:80
+#: django/conf/global_settings.py:80
+msgid "Tamil"
+msgstr "тамил (индийски)"
+
+#: conf/global_settings.py:81
+#: django/conf/global_settings.py:81
+msgid "Telugu"
+msgstr "телугу (индийски)"
+
+#: conf/global_settings.py:82
+#: django/conf/global_settings.py:82
+msgid "Turkish"
+msgstr "турски"
+
+#: conf/global_settings.py:83
+#: django/conf/global_settings.py:83
+msgid "Ukrainian"
+msgstr "украински"
+
+#: conf/global_settings.py:84
+#: django/conf/global_settings.py:84
+msgid "Simplified Chinese"
+msgstr "китайски"
+
+#: conf/global_settings.py:85
+#: django/conf/global_settings.py:85
+msgid "Traditional Chinese"
+msgstr "традиционен китайски"
+
+#: contrib/admin/filterspecs.py:44
+#: django/contrib/admin/filterspecs.py:44
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>По %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:74
+#: contrib/admin/filterspecs.py:92
+#: contrib/admin/filterspecs.py:147
+#: contrib/admin/filterspecs.py:173
+#: django/contrib/admin/filterspecs.py:74
+#: django/contrib/admin/filterspecs.py:92
+#: django/contrib/admin/filterspecs.py:147
+#: django/contrib/admin/filterspecs.py:173
+msgid "All"
+msgstr "Всички"
+
+#: contrib/admin/filterspecs.py:113
+#: django/contrib/admin/filterspecs.py:113
+msgid "Any date"
+msgstr "Коя-да-е дата"
+
+#: contrib/admin/filterspecs.py:114
+#: django/contrib/admin/filterspecs.py:114
+msgid "Today"
+msgstr "Днес"
+
+#: contrib/admin/filterspecs.py:117
+#: django/contrib/admin/filterspecs.py:117
+msgid "Past 7 days"
+msgstr "Последните 7 дни"
+
+#: contrib/admin/filterspecs.py:119
+#: django/contrib/admin/filterspecs.py:119
+msgid "This month"
+msgstr "Този месец"
+
+#: contrib/admin/filterspecs.py:121
+#: django/contrib/admin/filterspecs.py:121
+msgid "This year"
+msgstr "Тази година"
+
+#: contrib/admin/filterspecs.py:147
+#: django/contrib/admin/filterspecs.py:147
+#: django/newforms/widgets.py:231
+#: django/oldforms/__init__.py:592
+#: newforms/widgets.py:231
+#: oldforms/__init__.py:592
+msgid "Yes"
+msgstr "Да"
+
+#: contrib/admin/filterspecs.py:147
+#: django/contrib/admin/filterspecs.py:147
+#: django/newforms/widgets.py:231
+#: django/oldforms/__init__.py:592
+#: newforms/widgets.py:231
+#: oldforms/__init__.py:592
+msgid "No"
+msgstr "Не"
+
+#: contrib/admin/filterspecs.py:154
+#: django/contrib/admin/filterspecs.py:154
+#: django/newforms/widgets.py:231
+#: django/oldforms/__init__.py:592
+#: newforms/widgets.py:231
+#: oldforms/__init__.py:592
+msgid "Unknown"
+msgstr "Неизвестно"
+
+#: contrib/admin/models.py:18
+#: django/contrib/admin/models.py:18
+msgid "action time"
+msgstr "време на действие"
+
+#: contrib/admin/models.py:21
+#: django/contrib/admin/models.py:21
+msgid "object id"
+msgstr "id на обекта"
+
+#: contrib/admin/models.py:22
+#: django/contrib/admin/models.py:22
+msgid "object repr"
+msgstr "repr на обекта"
+
+#: contrib/admin/models.py:23
+#: django/contrib/admin/models.py:23
+msgid "action flag"
+msgstr "флаг за действие"
+
+#: contrib/admin/models.py:24
+#: django/contrib/admin/models.py:24
+msgid "change message"
+msgstr "смени съобщение"
+
+#: contrib/admin/models.py:27
+#: django/contrib/admin/models.py:27
+msgid "log entry"
+msgstr "записка"
+
+#: contrib/admin/models.py:28
+#: django/contrib/admin/models.py:28
+msgid "log entries"
+msgstr "записки"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+#: django/contrib/admin/templates/admin/404.html:4
+#: django/contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Няма такава страница"
+
+#: contrib/admin/templates/admin/404.html:10
+#: django/contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Сори, ама тая страничка липсва.  "
+
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:37
+#: contrib/admin/templates/admin/change_form.html:12
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/delete_confirmation.html:5
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:4
+#: contrib/admin/templates/admin/auth/user/change_password.html:11
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: django/contrib/admin/templates/admin/500.html:4
+#: django/contrib/admin/templates/admin/base.html:37
+#: django/contrib/admin/templates/admin/change_form.html:12
+#: django/contrib/admin/templates/admin/change_list.html:5
+#: django/contrib/admin/templates/admin/delete_confirmation.html:5
+#: django/contrib/admin/templates/admin/invalid_setup.html:4
+#: django/contrib/admin/templates/admin/object_history.html:4
+#: django/contrib/admin/templates/admin/auth/user/change_password.html:11
+#: django/contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: django/contrib/admin/templates/registration/logged_out.html:4
+#: django/contrib/admin/templates/registration/password_change_done.html:3
+#: django/contrib/admin/templates/registration/password_change_form.html:3
+#: django/contrib/admin/templates/registration/password_reset_done.html:4
+#: django/contrib/admin/templates/registration/password_reset_form.html:4
+msgid "Home"
+msgstr "Начало"
+
+#: contrib/admin/templates/admin/500.html:4
+#: django/contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Сървърна грешка"
+
+#: contrib/admin/templates/admin/500.html:6
+#: django/contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Сървърна грешка (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+#: django/contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Server Error <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+#: django/contrib/admin/templates/admin/500.html:10
+msgid "There's been an error. It's been reported to the site administrators via e-mail and should be fixed shortly. Thanks for your patience."
+msgstr "Малък проблем.  Администраторът на сайта е уведомен за случилото се.  Благодарим за проявеното разбиране.  "
+
+#: contrib/admin/templates/admin/base.html:26
+#: django/contrib/admin/templates/admin/base.html:26
+msgid "Welcome,"
+msgstr "Добре дошли,"
+
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: django/contrib/admin/templates/admin/base.html:28
+#: django/contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Документация"
+
+#: contrib/admin/templates/admin/base.html:29
+#: contrib/admin/templates/admin/auth/user/change_password.html:14
+#: contrib/admin/templates/admin/auth/user/change_password.html:45
+#: django/contrib/admin/templates/admin/base.html:29
+#: django/contrib/admin/templates/admin/auth/user/change_password.html:14
+#: django/contrib/admin/templates/admin/auth/user/change_password.html:45
+msgid "Change password"
+msgstr "Промени парола"
+
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/comments/templates/comments/form.html:6
+#: django/contrib/admin/templates/admin/base.html:30
+#: django/contrib/comments/templates/comments/form.html:6
+msgid "Log out"
+msgstr "Изход"
+
+#: contrib/admin/templates/admin/base_site.html:4
+#: django/contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Административен панел"
+
+#: contrib/admin/templates/admin/base_site.html:7
+#: django/contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Административен панел"
+
+#: contrib/admin/templates/admin/change_form.html:14
+#: contrib/admin/templates/admin/index.html:28
+#: django/contrib/admin/templates/admin/change_form.html:14
+#: django/contrib/admin/templates/admin/index.html:28
+msgid "Add"
+msgstr "Добави"
+
+#: contrib/admin/templates/admin/change_form.html:20
+#: contrib/admin/templates/admin/object_history.html:4
+#: django/contrib/admin/templates/admin/change_form.html:20
+#: django/contrib/admin/templates/admin/object_history.html:4
+msgid "History"
+msgstr "История"
+
+#: contrib/admin/templates/admin/change_form.html:21
+#: django/contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "Разгледай в сайта"
+
+#: contrib/admin/templates/admin/change_form.html:31
+#: contrib/admin/templates/admin/auth/user/change_password.html:23
+#: django/contrib/admin/templates/admin/change_form.html:31
+#: django/contrib/admin/templates/admin/auth/user/change_password.html:23
+msgid "Please correct the error below."
+msgstr "Коригирайте долу допуснатата грешка.  "
+
+#: contrib/admin/templates/admin/change_form.html:49
+#: django/contrib/admin/templates/admin/change_form.html:49
+msgid "Ordering"
+msgstr "Подреждане"
+
+#: contrib/admin/templates/admin/change_form.html:52
+#: django/contrib/admin/templates/admin/change_form.html:52
+msgid "Order:"
+msgstr "Подредба:"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#: django/contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "Добави %(name)s"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:8
+#: contrib/admin/templates/admin/submit_line.html:3
+#: django/contrib/admin/templates/admin/delete_confirmation.html:8
+#: django/contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Изтрий"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:13
+#: django/contrib/admin/templates/admin/delete_confirmation.html:13
+#, python-format
+msgid "Deleting the %(object_name)s '%(escaped_object)s' would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:"
+msgstr "Изтриването на обекта %(object_name)s '%(escaped_object)s' не може да бъде извършено без да се изтрият и някой свързани обекти, върху които обаче нямате права: "
+
+#: contrib/admin/templates/admin/delete_confirmation.html:20
+#: django/contrib/admin/templates/admin/delete_confirmation.html:20
+#, python-format
+msgid "Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? All of the following related items will be deleted:"
+msgstr "Наистина ли искате да затрием обектите %(object_name)s \"%(escaped_object)s\"? Следните свързани елементи също ще бъдат изтрити:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:25
+#: django/contrib/admin/templates/admin/delete_confirmation.html:25
+msgid "Yes, I'm sure"
+msgstr "Абсолютно"
+
+#: contrib/admin/templates/admin/filter.html:2
+#: django/contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " По %(filter_title)s "
+
+#: contrib/admin/templates/admin/filters.html:4
+#: django/contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "Филтър"
+
+#: contrib/admin/templates/admin/index.html:17
+#: django/contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Модели в приложението %(name)s "
+
+#: contrib/admin/templates/admin/index.html:18
+#: django/contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:34
+#: django/contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Промени"
+
+#: contrib/admin/templates/admin/index.html:44
+#: django/contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Нямате права да редактирате каквото и да е."
+
+#: contrib/admin/templates/admin/index.html:52
+#: django/contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Пресни действия"
+
+#: contrib/admin/templates/admin/index.html:53
+#: django/contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Моите действия"
+
+#: contrib/admin/templates/admin/index.html:57
+#: django/contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Няма налични"
+
+#: contrib/admin/templates/admin/invalid_setup.html:8
+#: django/contrib/admin/templates/admin/invalid_setup.html:8
+msgid "Something's wrong with your database installation. Make sure the appropriate database tables have been created, and make sure the database is readable by the appropriate user."
+msgstr "Има някакъв проблем с базата данни.  Проверете дали необходимите таблици са създадени и дали съответния потребител има необходимите права за достъп.  "
+
+#: contrib/admin/templates/admin/login.html:17
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: django/contrib/admin/templates/admin/login.html:17
+#: django/contrib/comments/templates/comments/form.html:6
+#: django/contrib/comments/templates/comments/form.html:8
+msgid "Username:"
+msgstr "Потребител:"
+
+#: contrib/admin/templates/admin/login.html:20
+#: contrib/comments/templates/comments/form.html:8
+#: django/contrib/admin/templates/admin/login.html:20
+#: django/contrib/comments/templates/comments/form.html:8
+msgid "Password:"
+msgstr "Парола:"
+
+#: contrib/admin/templates/admin/login.html:25
+#: contrib/admin/views/decorators.py:25
+#: django/contrib/admin/templates/admin/login.html:25
+#: django/contrib/admin/views/decorators.py:31
+msgid "Log in"
+msgstr "Вход"
+
+#: contrib/admin/templates/admin/object_history.html:17
+#: django/contrib/admin/templates/admin/object_history.html:17
+msgid "Date/time"
+msgstr "Дата/час"
+
+#: contrib/admin/templates/admin/object_history.html:18
+#: django/contrib/admin/templates/admin/object_history.html:18
+msgid "User"
+msgstr "Потребител"
+
+#: contrib/admin/templates/admin/object_history.html:19
+#: django/contrib/admin/templates/admin/object_history.html:19
+msgid "Action"
+msgstr "Действие"
+
+#: contrib/admin/templates/admin/object_history.html:25
+#: django/contrib/admin/templates/admin/object_history.html:25
+msgid "DATE_WITH_TIME_FULL"
+msgstr "j N, Y, P"
+
+#: contrib/admin/templates/admin/object_history.html:35
+#: django/contrib/admin/templates/admin/object_history.html:35
+msgid "This object doesn't have a change history. It probably wasn't added via this admin site."
+msgstr "Този обект няма исторя на промените.  Вероятно не е добавен чрез административния панел.  "
+
+#: contrib/admin/templates/admin/pagination.html:10
+#: django/contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Покажи всички"
+
+#: contrib/admin/templates/admin/search_form.html:8
+#: django/contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Давай"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#: django/contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgstr "1 резултат"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#: django/contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s общо"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+#: django/contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Запис като нов"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+#: django/contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Запис и нов"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+#: django/contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Запис и продължение"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+#: django/contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Запис"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+#: django/contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid "First, enter a username and password. Then, you'll be able to edit more user options."
+msgstr "Първо, въведете потребител и парола.  След това ще можете да редактирате повече детайли.  "
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+#: django/contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "Потребител"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+#: contrib/admin/templates/admin/auth/user/change_password.html:33
+#: django/contrib/admin/templates/admin/auth/user/add_form.html:18
+#: django/contrib/admin/templates/admin/auth/user/change_password.html:33
+msgid "Password"
+msgstr "Парола"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+#: contrib/admin/templates/admin/auth/user/change_password.html:38
+#: django/contrib/admin/templates/admin/auth/user/add_form.html:23
+#: django/contrib/admin/templates/admin/auth/user/change_password.html:38
+msgid "Password (again)"
+msgstr "Парола (пак)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+#: django/contrib/admin/templates/admin/auth/user/add_form.html:24
+#: django/contrib/admin/templates/admin/auth/user/change_password.html:39
+msgid "Enter the same password as above, for verification."
+msgstr "Въведете същата парола още веднъж за проверка.  "
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:27
+#: django/contrib/admin/templates/admin/auth/user/change_password.html:27
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Въведете нова парола за потребител <strong>%(username)s</strong>."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: django/contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Bookmarklet-и"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: django/contrib/admin/templates/admin_doc/bookmarklets.html:4
+msgid "Documentation bookmarklets"
+msgstr "Bookmarklet-и за документация"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:8
+#: django/contrib/admin/templates/admin_doc/bookmarklets.html:8
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">За да инсталирате bookmarklet-и, задърпайте линка в bookmarks\n"
+"toolbar-а, или щракнете с десния бутон и добавете линка в отметките. Сега можете да\n"
+"изберете bookmarklet-а от която и да е страница.  Някой от тези\n"
+"bookmarklet-и могат да се разглеждат само от компютър, който е маркиран \n"
+"като \"вътрешен\" (приказвайте с администратора ако не сте сигурни дали\n"
+"компютърът ви е \"вътрешен\").</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:18
+#: django/contrib/admin/templates/admin_doc/bookmarklets.html:18
+msgid "Documentation for this page"
+msgstr "Документация за тази страница"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+#: django/contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Jumps you from any page to the documentation for the view that generates that page."
+msgstr "Препраща от която и да е страница към документацията за изгледа, който я е генерирал.  "
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:21
+#: django/contrib/admin/templates/admin_doc/bookmarklets.html:21
+msgid "Show object ID"
+msgstr "ID на обекта"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+#: django/contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Shows the content-type and unique ID for pages that represent a single object."
+msgstr "Показва типът на съдържанието и ID-то на страници, които представляват единичен обект.  "
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:24
+#: django/contrib/admin/templates/admin_doc/bookmarklets.html:24
+msgid "Edit this object (current window)"
+msgstr "Редактирай този обект (в този прозорец)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+#: django/contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "Отива в админската страница за страници, които представляват единичен обект.  "
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:27
+#: django/contrib/admin/templates/admin_doc/bookmarklets.html:27
+msgid "Edit this object (new window)"
+msgstr "Редактирай този обект (в нов прозорец)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+#: django/contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "As above, but opens the admin page in a new window."
+msgstr "Като горното, но отваря администраторската страница в нов прозорец."
+
+#: contrib/admin/templates/registration/logged_out.html:8
+#: django/contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Благодарим Ви, че използвахте този сайт днес.  "
+
+#: contrib/admin/templates/registration/logged_out.html:10
+#: django/contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Влез пак"
+
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_form.html:5
+#: contrib/admin/templates/registration/password_change_form.html:9
+#: django/contrib/admin/templates/registration/password_change_done.html:3
+#: django/contrib/admin/templates/registration/password_change_form.html:3
+#: django/contrib/admin/templates/registration/password_change_form.html:5
+#: django/contrib/admin/templates/registration/password_change_form.html:9
+msgid "Password change"
+msgstr "Промяна на парола"
+
+#: contrib/admin/templates/registration/password_change_done.html:5
+#: contrib/admin/templates/registration/password_change_done.html:9
+#: django/contrib/admin/templates/registration/password_change_done.html:5
+#: django/contrib/admin/templates/registration/password_change_done.html:9
+msgid "Password change successful"
+msgstr "Паролата е сменена успешно"
+
+#: contrib/admin/templates/registration/password_change_done.html:11
+#: django/contrib/admin/templates/registration/password_change_done.html:11
+msgid "Your password was changed."
+msgstr "Паролата ви е сменена."
+
+#: contrib/admin/templates/registration/password_change_form.html:11
+#: django/contrib/admin/templates/registration/password_change_form.html:11
+msgid "Please enter your old password, for security's sake, and then enter your new password twice so we can verify you typed it in correctly."
+msgstr "Въведете си старата парола (за сигурност), след което въведете желаната нова парола два пъти за да не стават грешки.  "
+
+#: contrib/admin/templates/registration/password_change_form.html:16
+#: django/contrib/admin/templates/registration/password_change_form.html:16
+msgid "Old password:"
+msgstr "Стара парола:"
+
+#: contrib/admin/templates/registration/password_change_form.html:18
+#: django/contrib/admin/templates/registration/password_change_form.html:18
+msgid "New password:"
+msgstr "Нова парола:"
+
+#: contrib/admin/templates/registration/password_change_form.html:20
+#: django/contrib/admin/templates/registration/password_change_form.html:20
+msgid "Confirm password:"
+msgstr "Потвърдете паролата:"
+
+#: contrib/admin/templates/registration/password_change_form.html:22
+#: django/contrib/admin/templates/registration/password_change_form.html:22
+msgid "Change my password"
+msgstr "Промяна на парола"
+
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: django/contrib/admin/templates/registration/password_reset_done.html:4
+#: django/contrib/admin/templates/registration/password_reset_form.html:4
+#: django/contrib/admin/templates/registration/password_reset_form.html:6
+#: django/contrib/admin/templates/registration/password_reset_form.html:10
+msgid "Password reset"
+msgstr "Нова парола"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+#: django/contrib/admin/templates/registration/password_reset_done.html:6
+#: django/contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Паролата е успешно обновена"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+#: django/contrib/admin/templates/registration/password_reset_done.html:12
+msgid "We've e-mailed a new password to the e-mail address you submitted. You should be receiving it shortly."
+msgstr "Пратихме ви нова парола на адреса, който указахте.  Скоро трябва да пристигне.  "
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+#: django/contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Получавате този e-mail, защото сте поръчали да Ви бъде издадена нова парола "
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#: django/contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "за Вашия потребителски акаунт в %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#: django/contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Новата Ви парола е: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+#: django/contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Тази парола може да си я смените като щракнете тук:  "
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+#: django/contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Вашето потребителско име (ако не го помните): "
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+#: django/contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Много се радваме, че използвате сайта ни!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#: django/contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Готините хора от %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+#: django/contrib/admin/templates/registration/password_reset_form.html:12
+msgid "Forgotten your password? Enter your e-mail address below, and we'll reset your password and e-mail the new one to you."
+msgstr "Забравена парола?  Няма проблеми.  Въведете си e-mail адреса по-долу и ще ви изпратим нова!"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+#: django/contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "E-mail адрес:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+#: django/contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Нова парола"
+
+#: contrib/admin/templates/widget/date_time.html:3
+#: django/contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Дата:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+#: django/contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Час:"
+
+#: contrib/admin/templates/widget/file.html:2
+#: django/contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Сега:"
+
+#: contrib/admin/templates/widget/file.html:3
+#: django/contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Промяна:"
+
+#: contrib/admin/templatetags/admin_list.py:257
+#: django/contrib/admin/templatetags/admin_list.py:257
+msgid "All dates"
+msgstr "Всички дати"
+
+#: contrib/admin/views/auth.py:20
+#: contrib/admin/views/main.py:267
+#: django/contrib/admin/views/auth.py:20
+#: django/contrib/admin/views/main.py:267
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Обектът %(name)s \"%(obj)s\" бе успешно добавен.  "
+
+#: contrib/admin/views/auth.py:25
+#: contrib/admin/views/main.py:271
+#: contrib/admin/views/main.py:356
+#: django/contrib/admin/views/auth.py:25
+#: django/contrib/admin/views/main.py:271
+#: django/contrib/admin/views/main.py:356
+msgid "You may edit it again below."
+msgstr "Може да го редактирате пак по-долу.  "
+
+#: contrib/admin/views/auth.py:31
+#: django/contrib/admin/views/auth.py:31
+msgid "Add user"
+msgstr "Добави потребител"
+
+#: contrib/admin/views/auth.py:58
+#: django/contrib/admin/views/auth.py:58
+msgid "Password changed successfully."
+msgstr "Паролата бе успешно сменена.  "
+
+#: contrib/admin/views/auth.py:65
+#: django/contrib/admin/views/auth.py:65
+#, python-format
+msgid "Change password: %s"
+msgstr "Смени парола: %s"
+
+#: contrib/admin/views/decorators.py:11
+#: contrib/auth/forms.py:60
+#: django/contrib/admin/views/decorators.py:17
+#: django/contrib/auth/forms.py:60
+msgid "Please enter a correct username and password. Note that both fields are case-sensitive."
+msgstr "Въведете правилно потребителско име и парола.  И двете полета правят разлика между малки и големи букви!"
+
+#: contrib/admin/views/decorators.py:63
+#: django/contrib/admin/views/decorators.py:69
+msgid "Please log in again, because your session has expired. Don't worry: Your submission has been saved."
+msgstr "Влезте пак, понеже сесията ви изтече.  Не се притеснявайте -- данните ви са записани.  "
+
+#: contrib/admin/views/decorators.py:70
+#: django/contrib/admin/views/decorators.py:76
+msgid "Looks like your browser isn't configured to accept cookies. Please enable cookies, reload this page, and try again."
+msgstr "Браузерът ви май не е настроен да приема cookies.  Пуснете ги и заредете страницата на ново.  "
+
+#: contrib/admin/views/decorators.py:84
+#: django/contrib/admin/views/decorators.py:90
+msgid "Usernames cannot contain the '@' character."
+msgstr "Потребителските имена не могат да съдържат символа '@'."
+
+#: contrib/admin/views/decorators.py:86
+#: django/contrib/admin/views/decorators.py:92
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "E-mail адресът ти не ти е потребителско име.  Пробвай '%s'."
+
+#: contrib/admin/views/doc.py:48
+#: contrib/admin/views/doc.py:50
+#: contrib/admin/views/doc.py:52
+#: django/contrib/admin/views/doc.py:48
+#: django/contrib/admin/views/doc.py:50
+#: django/contrib/admin/views/doc.py:52
+msgid "tag:"
+msgstr "таг:"
+
+#: contrib/admin/views/doc.py:79
+#: contrib/admin/views/doc.py:81
+#: contrib/admin/views/doc.py:83
+#: django/contrib/admin/views/doc.py:79
+#: django/contrib/admin/views/doc.py:81
+#: django/contrib/admin/views/doc.py:83
+msgid "filter:"
+msgstr "филтър:"
+
+#: contrib/admin/views/doc.py:137
+#: contrib/admin/views/doc.py:139
+#: contrib/admin/views/doc.py:141
+#: django/contrib/admin/views/doc.py:137
+#: django/contrib/admin/views/doc.py:139
+#: django/contrib/admin/views/doc.py:141
+msgid "view:"
+msgstr "изглед:"
+
+#: contrib/admin/views/doc.py:166
+#: django/contrib/admin/views/doc.py:166
+#, python-format
+msgid "App %r not found"
+msgstr "Приложението %r липсва"
+
+#: contrib/admin/views/doc.py:173
+#: django/contrib/admin/views/doc.py:173
+#, python-format
+msgid "Model %(name)r not found in app %(label)r"
+msgstr "Моделът %(name)r го няма в приложение %(label)r"
+
+#: contrib/admin/views/doc.py:185
+#: django/contrib/admin/views/doc.py:185
+#, python-format
+msgid "the related `%(label)s.%(type)s` object"
+msgstr "свързаният обект `%(label)s.%(type)s` "
+
+#: contrib/admin/views/doc.py:185
+#: contrib/admin/views/doc.py:207
+#: contrib/admin/views/doc.py:221
+#: contrib/admin/views/doc.py:226
+#: django/contrib/admin/views/doc.py:185
+#: django/contrib/admin/views/doc.py:207
+#: django/contrib/admin/views/doc.py:221
+#: django/contrib/admin/views/doc.py:226
+msgid "model:"
+msgstr "модел:"
+
+#: contrib/admin/views/doc.py:216
+#: django/contrib/admin/views/doc.py:216
+#, python-format
+msgid "related `%(label)s.%(name)s` objects"
+msgstr "свързани `%(label)s.%(name)s` обекти"
+
+#: contrib/admin/views/doc.py:221
+#: django/contrib/admin/views/doc.py:221
+#, python-format
+msgid "all %s"
+msgstr "всички %s"
+
+#: contrib/admin/views/doc.py:226
+#: django/contrib/admin/views/doc.py:226
+#, python-format
+msgid "number of %s"
+msgstr "брой %s"
+
+#: contrib/admin/views/doc.py:231
+#: django/contrib/admin/views/doc.py:231
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Полета на %s обекти"
+
+#: contrib/admin/views/doc.py:293
+#: contrib/admin/views/doc.py:304
+#: contrib/admin/views/doc.py:306
+#: contrib/admin/views/doc.py:312
+#: contrib/admin/views/doc.py:313
+#: contrib/admin/views/doc.py:315
+#: django/contrib/admin/views/doc.py:293
+#: django/contrib/admin/views/doc.py:304
+#: django/contrib/admin/views/doc.py:306
+#: django/contrib/admin/views/doc.py:312
+#: django/contrib/admin/views/doc.py:313
+#: django/contrib/admin/views/doc.py:315
+msgid "Integer"
+msgstr "Цяло число"
+
+#: contrib/admin/views/doc.py:294
+#: django/contrib/admin/views/doc.py:294
+msgid "Boolean (Either True or False)"
+msgstr "Boolean (True или False)"
+
+#: contrib/admin/views/doc.py:295
+#: contrib/admin/views/doc.py:314
+#: django/contrib/admin/views/doc.py:295
+#: django/contrib/admin/views/doc.py:314
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Символен низ (до %(max_length)s символа)"
+
+#: contrib/admin/views/doc.py:296
+#: django/contrib/admin/views/doc.py:296
+msgid "Comma-separated integers"
+msgstr "Цели числа, разделени с запетая"
+
+#: contrib/admin/views/doc.py:297
+#: django/contrib/admin/views/doc.py:297
+msgid "Date (without time)"
+msgstr "Дата (без час)"
+
+#: contrib/admin/views/doc.py:298
+#: django/contrib/admin/views/doc.py:298
+msgid "Date (with time)"
+msgstr "Дата (и час)"
+
+#: contrib/admin/views/doc.py:299
+#: django/contrib/admin/views/doc.py:299
+msgid "Decimal number"
+msgstr "Десетична дроб"
+
+#: contrib/admin/views/doc.py:300
+#: django/contrib/admin/views/doc.py:300
+msgid "E-mail address"
+msgstr "E-mail адрес"
+
+#: contrib/admin/views/doc.py:301
+#: contrib/admin/views/doc.py:302
+#: contrib/admin/views/doc.py:305
+#: django/contrib/admin/views/doc.py:301
+#: django/contrib/admin/views/doc.py:302
+#: django/contrib/admin/views/doc.py:305
+msgid "File path"
+msgstr "Път към файл"
+
+#: contrib/admin/views/doc.py:303
+#: django/contrib/admin/views/doc.py:303
+msgid "Floating point number"
+msgstr "Число с плаваща запетая"
+
+#: contrib/admin/views/doc.py:307
+#: contrib/comments/models.py:89
+#: django/contrib/admin/views/doc.py:307
+#: django/contrib/comments/models.py:89
+msgid "IP address"
+msgstr "IP адрес"
+
+#: contrib/admin/views/doc.py:309
+#: django/contrib/admin/views/doc.py:309
+msgid "Boolean (Either True, False or None)"
+msgstr "Boolean (Възможните стойности са True, False или None)"
+
+#: contrib/admin/views/doc.py:310
+#: django/contrib/admin/views/doc.py:310
+msgid "Relation to parent model"
+msgstr "Връзка с родителския обект"
+
+#: contrib/admin/views/doc.py:311
+#: django/contrib/admin/views/doc.py:311
+msgid "Phone number"
+msgstr "Телефонен номер"
+
+#: contrib/admin/views/doc.py:316
+#: django/contrib/admin/views/doc.py:316
+msgid "Text"
+msgstr "Текст"
+
+#: contrib/admin/views/doc.py:317
+#: django/contrib/admin/views/doc.py:317
+msgid "Time"
+msgstr "Час"
+
+#: contrib/admin/views/doc.py:318
+#: contrib/flatpages/models.py:7
+#: django/contrib/admin/views/doc.py:318
+#: django/contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:319
+#: django/contrib/admin/views/doc.py:319
+msgid "U.S. state (two uppercase letters)"
+msgstr "американски щат (две главни букви)"
+
+#: contrib/admin/views/doc.py:320
+#: django/contrib/admin/views/doc.py:320
+msgid "XML text"
+msgstr "XML текст"
+
+#: contrib/admin/views/doc.py:346
+#: django/contrib/admin/views/doc.py:346
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s не прилича на обект от тип urlpattern"
+
+#: contrib/admin/views/main.py:233
+#: django/contrib/admin/views/main.py:233
+msgid "Site administration"
+msgstr "Администрация на сайта"
+
+#: contrib/admin/views/main.py:280
+#: contrib/admin/views/main.py:365
+#: django/contrib/admin/views/main.py:280
+#: django/contrib/admin/views/main.py:365
+#, python-format
+msgid "You may add another %s below."
+msgstr "Може да добавите още един обект %s по-долу.  "
+
+#: contrib/admin/views/main.py:298
+#: django/contrib/admin/views/main.py:298
+#, python-format
+msgid "Add %s"
+msgstr "Добави %s"
+
+#: contrib/admin/views/main.py:344
+#: django/contrib/admin/views/main.py:344
+#, python-format
+msgid "Added %s."
+msgstr "Добавен %s."
+
+#: contrib/admin/views/main.py:344
+#: contrib/admin/views/main.py:346
+#: contrib/admin/views/main.py:348
+#: core/validators.py:283
+#: db/models/manipulators.py:309
+#: django/contrib/admin/views/main.py:344
+#: django/contrib/admin/views/main.py:346
+#: django/contrib/admin/views/main.py:348
+#: django/core/validators.py:283
+#: django/db/models/manipulators.py:309
+msgid "and"
+msgstr "и"
+
+#: contrib/admin/views/main.py:346
+#: django/contrib/admin/views/main.py:346
+#, python-format
+msgid "Changed %s."
+msgstr "Променен %s."
+
+#: contrib/admin/views/main.py:348
+#: django/contrib/admin/views/main.py:348
+#, python-format
+msgid "Deleted %s."
+msgstr "Изтрит %s."
+
+#: contrib/admin/views/main.py:351
+#: django/contrib/admin/views/main.py:351
+msgid "No fields changed."
+msgstr "Няма променени полета."
+
+#: contrib/admin/views/main.py:354
+#: django/contrib/admin/views/main.py:354
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Обектът %(name)s \"%(obj)s\" бе успешно актуализиран.  "
+
+#: contrib/admin/views/main.py:362
+#: django/contrib/admin/views/main.py:362
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "Обектът %(name)s \"%(obj)s\" бе успешно добавен.  Може да го редактирате по-долу.  "
+
+#: contrib/admin/views/main.py:400
+#: django/contrib/admin/views/main.py:400
+#, python-format
+msgid "Change %s"
+msgstr "Промени %s"
+
+#: contrib/admin/views/main.py:487
+#: django/contrib/admin/views/main.py:487
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Едно или повече %(fieldname)s в %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:492
+#: django/contrib/admin/views/main.py:492
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Едно или повече %(fieldname)s в %(name)s:"
+
+#: contrib/admin/views/main.py:524
+#: django/contrib/admin/views/main.py:524
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Обектът %(name)s \"%(obj)s\" бе успешно изтрит.  "
+
+#: contrib/admin/views/main.py:527
+#: django/contrib/admin/views/main.py:527
+msgid "Are you sure?"
+msgstr "Сериозно?"
+
+#: contrib/admin/views/main.py:549
+#: django/contrib/admin/views/main.py:549
+#, python-format
+msgid "Change history: %s"
+msgstr "История на промените: %s"
+
+#: contrib/admin/views/main.py:583
+#: django/contrib/admin/views/main.py:583
+#, python-format
+msgid "Select %s"
+msgstr "Изберете %s"
+
+#: contrib/admin/views/main.py:583
+#: django/contrib/admin/views/main.py:583
+#, python-format
+msgid "Select %s to change"
+msgstr "Изберете %s за промяна"
+
+#: contrib/admin/views/main.py:784
+#: django/contrib/admin/views/main.py:784
+msgid "Database error"
+msgstr "Грешка с базата данни"
+
+#: contrib/auth/forms.py:17
+#: contrib/auth/forms.py:138
+#: django/contrib/auth/forms.py:17
+#: django/contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr "Двете полета за паролата не съвпадат.  "
+
+#: contrib/auth/forms.py:25
+#: django/contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr "Потребител с това потребителско име вече съществува.  "
+
+#: contrib/auth/forms.py:53
+#: django/contrib/auth/forms.py:53
+msgid "Your Web browser doesn't appear to have cookies enabled. Cookies are required for logging in."
+msgstr "Браузерът, който използвате не поддържа cookies, а те са необходими за да можете да се логнете.  "
+
+#: contrib/auth/forms.py:62
+#: django/contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "Този акаунт е деактивиран."
+
+#: contrib/auth/forms.py:84
+#: django/contrib/auth/forms.py:84
+msgid "That e-mail address doesn't have an associated user account. Are you sure you've registered?"
+msgstr "С този email адрес няма обвързан потребителски акаунт.  Сигурни ли сте, че сте се регистрирали?"
+
+#: contrib/auth/forms.py:107
+#: django/contrib/auth/forms.py:107
+#, python-format
+msgid "Password reset on %s"
+msgstr "Паролата се сменя на %s"
+
+#: contrib/auth/forms.py:117
+#: django/contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "Двете полета за нова парола не съвпадат.  "
+
+#: contrib/auth/forms.py:124
+#: django/contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Въвели сте погрешна стара парола.  Въведете я пак.  "
+
+#: contrib/auth/models.py:73
+#: contrib/auth/models.py:93
+#: django/contrib/auth/models.py:73
+#: django/contrib/auth/models.py:93
+msgid "name"
+msgstr "име"
+
+#: contrib/auth/models.py:75
+#: django/contrib/auth/models.py:75
+msgid "codename"
+msgstr "код"
+
+#: contrib/auth/models.py:78
+#: django/contrib/auth/models.py:78
+msgid "permission"
+msgstr "право"
+
+#: contrib/auth/models.py:79
+#: contrib/auth/models.py:94
+#: django/contrib/auth/models.py:79
+#: django/contrib/auth/models.py:94
+msgid "permissions"
+msgstr "права"
+
+#: contrib/auth/models.py:97
+#: django/contrib/auth/models.py:97
+msgid "group"
+msgstr "група"
+
+#: contrib/auth/models.py:98
+#: contrib/auth/models.py:141
+#: django/contrib/auth/models.py:98
+#: django/contrib/auth/models.py:141
+msgid "groups"
+msgstr "групи"
+
+#: contrib/auth/models.py:131
+#: django/contrib/auth/models.py:131
+msgid "username"
+msgstr "потребител"
+
+#: contrib/auth/models.py:131
+#: django/contrib/auth/models.py:131
+msgid "Required. 30 characters or fewer. Alphanumeric characters only (letters, digits and underscores)."
+msgstr "Въведете не-повече от 30 символа (само букви, цифри, и подчертавка)"
+
+#: contrib/auth/models.py:132
+#: django/contrib/auth/models.py:132
+msgid "first name"
+msgstr "собствено име"
+
+#: contrib/auth/models.py:133
+#: django/contrib/auth/models.py:133
+msgid "last name"
+msgstr "фамилно име"
+
+#: contrib/auth/models.py:134
+#: django/contrib/auth/models.py:134
+msgid "e-mail address"
+msgstr "e-mail адрес"
+
+#: contrib/auth/models.py:135
+#: django/contrib/auth/models.py:135
+msgid "password"
+msgstr "парола"
+
+#: contrib/auth/models.py:135
+#: django/contrib/auth/models.py:135
+msgid "Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change password form</a>."
+msgstr "Въведете '[algo]$[salt]$[hexdigest]' или използвайте <a href=\"password/\">формата за смяна на парола</a>."
+
+#: contrib/auth/models.py:136
+#: django/contrib/auth/models.py:136
+msgid "staff status"
+msgstr "персонал"
+
+#: contrib/auth/models.py:136
+#: django/contrib/auth/models.py:136
+msgid "Designates whether the user can log into this admin site."
+msgstr "Указва дали този потребител има достъп до административния панел."
+
+#: contrib/auth/models.py:137
+#: django/contrib/auth/models.py:137
+msgid "active"
+msgstr "активен"
+
+#: contrib/auth/models.py:137
+#: django/contrib/auth/models.py:137
+msgid "Designates whether this user can log into the Django admin. Unselect this instead of deleting accounts."
+msgstr "Указва дали този потребител може да влезе в административния панел .  Премахнете тази маркировка вместо да изтривате акаунти.  "
+
+#: contrib/auth/models.py:138
+#: django/contrib/auth/models.py:138
+msgid "superuser status"
+msgstr "статут на супер-потребител"
+
+#: contrib/auth/models.py:138
+#: django/contrib/auth/models.py:138
+msgid "Designates that this user has all permissions without explicitly assigning them."
+msgstr "Указва, че този потребител има всички права (без да има нужда да се указват изрично)."
+
+#: contrib/auth/models.py:139
+#: django/contrib/auth/models.py:139
+msgid "last login"
+msgstr "последен логин"
+
+#: contrib/auth/models.py:140
+#: django/contrib/auth/models.py:140
+msgid "date joined"
+msgstr "дата на регистриране"
+
+#: contrib/auth/models.py:142
+#: django/contrib/auth/models.py:142
+msgid "In addition to the permissions manually assigned, this user will also get all permissions granted to each group he/she is in."
+msgstr "Освен ръчно указаните права, този потребител също ще получи правата на всяка група, към която принадлежи.  "
+
+#: contrib/auth/models.py:143
+#: django/contrib/auth/models.py:143
+msgid "user permissions"
+msgstr "потребителски права"
+
+#: contrib/auth/models.py:147
+#: django/contrib/auth/models.py:147
+msgid "user"
+msgstr "потребител"
+
+#: contrib/auth/models.py:148
+#: django/contrib/auth/models.py:148
+msgid "users"
+msgstr "потребители"
+
+#: contrib/auth/models.py:154
+#: django/contrib/auth/models.py:154
+msgid "Personal info"
+msgstr "Лична информация"
+
+#: contrib/auth/models.py:155
+#: django/contrib/auth/models.py:155
+msgid "Permissions"
+msgstr "Права"
+
+#: contrib/auth/models.py:156
+#: django/contrib/auth/models.py:156
+msgid "Important dates"
+msgstr "Важни дати"
+
+#: contrib/auth/models.py:157
+#: django/contrib/auth/models.py:157
+msgid "Groups"
+msgstr "Групи"
+
+#: contrib/auth/models.py:316
+#: django/contrib/auth/models.py:316
+msgid "message"
+msgstr "съобщение"
+
+#: contrib/auth/views.py:47
+#: django/contrib/auth/views.py:47
+msgid "Logged out"
+msgstr "Извън системата"
+
+#: contrib/comments/models.py:71
+#: contrib/comments/models.py:176
+#: django/contrib/comments/models.py:71
+#: django/contrib/comments/models.py:176
+msgid "object ID"
+msgstr "ID на обекта"
+
+#: contrib/comments/models.py:72
+#: django/contrib/comments/models.py:72
+msgid "headline"
+msgstr "заглавие"
+
+#: contrib/comments/models.py:73
+#: contrib/comments/models.py:95
+#: contrib/comments/models.py:177
+#: django/contrib/comments/models.py:73
+#: django/contrib/comments/models.py:95
+#: django/contrib/comments/models.py:177
+msgid "comment"
+msgstr "коментар"
+
+#: contrib/comments/models.py:74
+#: django/contrib/comments/models.py:74
+msgid "rating #1"
+msgstr "рейтинг #1"
+
+#: contrib/comments/models.py:75
+#: django/contrib/comments/models.py:75
+msgid "rating #2"
+msgstr "рейтинг #2"
+
+#: contrib/comments/models.py:76
+#: django/contrib/comments/models.py:76
+msgid "rating #3"
+msgstr "рейтинг #3"
+
+#: contrib/comments/models.py:77
+#: django/contrib/comments/models.py:77
+msgid "rating #4"
+msgstr "рейтинг #4"
+
+#: contrib/comments/models.py:78
+#: django/contrib/comments/models.py:78
+msgid "rating #5"
+msgstr "рейтинг #5"
+
+#: contrib/comments/models.py:79
+#: django/contrib/comments/models.py:79
+msgid "rating #6"
+msgstr "рейтинг #6"
+
+#: contrib/comments/models.py:80
+#: django/contrib/comments/models.py:80
+msgid "rating #7"
+msgstr "рейтинг #7"
+
+#: contrib/comments/models.py:81
+#: django/contrib/comments/models.py:81
+msgid "rating #8"
+msgstr "рейтинг #8"
+
+#: contrib/comments/models.py:86
+#: django/contrib/comments/models.py:86
+msgid "is valid rating"
+msgstr "е валиден рейтинг"
+
+#: contrib/comments/models.py:87
+#: contrib/comments/models.py:179
+#: django/contrib/comments/models.py:87
+#: django/contrib/comments/models.py:179
+msgid "date/time submitted"
+msgstr "дата и час на подаване"
+
+#: contrib/comments/models.py:88
+#: contrib/comments/models.py:180
+#: django/contrib/comments/models.py:88
+#: django/contrib/comments/models.py:180
+msgid "is public"
+msgstr "е публичен"
+
+#: contrib/comments/models.py:90
+#: django/contrib/comments/models.py:90
+msgid "is removed"
+msgstr "е премахнат"
+
+#: contrib/comments/models.py:90
+#: django/contrib/comments/models.py:90
+msgid "Check this box if the comment is inappropriate. A \"This comment has been removed\" message will be displayed instead."
+msgstr "Щтракнете тази кутийка ако коментарът е неподходящ.  Вместо съдържанието на коментара, ще се покаже надписът \"Този коментар бе премахнат.\""
+
+#: contrib/comments/models.py:96
+#: django/contrib/comments/models.py:96
+msgid "comments"
+msgstr "коментари"
+
+#: contrib/comments/models.py:140
+#: contrib/comments/models.py:222
+#: django/contrib/comments/models.py:140
+#: django/contrib/comments/models.py:222
+msgid "Content object"
+msgstr "Content обект"
+
+#: contrib/comments/models.py:168
+#: django/contrib/comments/models.py:168
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Пуснат от %(user)s на %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:178
+#: django/contrib/comments/models.py:178
+msgid "person's name"
+msgstr "име на човека"
+
+#: contrib/comments/models.py:181
+#: django/contrib/comments/models.py:181
+msgid "ip address"
+msgstr "ip адрес"
+
+#: contrib/comments/models.py:183
+#: django/contrib/comments/models.py:183
+msgid "approved by staff"
+msgstr "одобрен от персонала"
+
+#: contrib/comments/models.py:187
+#: django/contrib/comments/models.py:187
+msgid "free comment"
+msgstr "свободен коментар"
+
+#: contrib/comments/models.py:188
+#: django/contrib/comments/models.py:188
+msgid "free comments"
+msgstr "свободни коментари"
+
+#: contrib/comments/models.py:250
+#: django/contrib/comments/models.py:250
+msgid "score"
+msgstr "точки"
+
+#: contrib/comments/models.py:251
+#: django/contrib/comments/models.py:251
+msgid "score date"
+msgstr "дата на точкуване"
+
+#: contrib/comments/models.py:255
+#: django/contrib/comments/models.py:255
+msgid "karma score"
+msgstr "кармична точка"
+
+#: contrib/comments/models.py:256
+#: django/contrib/comments/models.py:256
+msgid "karma scores"
+msgstr "кармични точки"
+
+#: contrib/comments/models.py:260
+#: django/contrib/comments/models.py:260
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d рейтинг от %(user)s"
+
+#: contrib/comments/models.py:277
+#: django/contrib/comments/models.py:277
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Този коментар бе флагнат от %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:285
+#: django/contrib/comments/models.py:285
+msgid "flag date"
+msgstr "дата на флагване"
+
+#: contrib/comments/models.py:289
+#: django/contrib/comments/models.py:289
+msgid "user flag"
+msgstr "потребителски флаг"
+
+#: contrib/comments/models.py:290
+#: django/contrib/comments/models.py:290
+msgid "user flags"
+msgstr "потребителски флагове"
+
+#: contrib/comments/models.py:294
+#: django/contrib/comments/models.py:294
+#, python-format
+msgid "Flag by %r"
+msgstr "Флаг от %r"
+
+#: contrib/comments/models.py:300
+#: django/contrib/comments/models.py:300
+msgid "deletion date"
+msgstr "дата на изтриване"
+
+#: contrib/comments/models.py:303
+#: django/contrib/comments/models.py:303
+msgid "moderator deletion"
+msgstr "изтриване от модератор"
+
+#: contrib/comments/models.py:304
+#: django/contrib/comments/models.py:304
+msgid "moderator deletions"
+msgstr "изтривания от модератор"
+
+#: contrib/comments/models.py:308
+#: django/contrib/comments/models.py:308
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Изтриване от модератор %r"
+
+#: contrib/comments/templates/comments/form.html:8
+#: django/contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Забравена парола?"
+
+#: contrib/comments/templates/comments/form.html:12
+#: django/contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Рейтинги"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+#: django/contrib/comments/templates/comments/form.html:12
+#: django/contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Задължително"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+#: django/contrib/comments/templates/comments/form.html:12
+#: django/contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Не-задължително"
+
+#: contrib/comments/templates/comments/form.html:23
+#: django/contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Качете снимка"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+#: django/contrib/comments/templates/comments/form.html:28
+#: django/contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Коментар:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+#: django/contrib/comments/templates/comments/form.html:35
+#: django/contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Преглед на коментара"
+
+#: contrib/comments/templates/comments/freeform.html:4
+#: django/contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Вашето име:"
+
+#: contrib/comments/views/comments.py:28
+#: django/contrib/comments/views/comments.py:28
+msgid "This rating is required because you've entered at least one other rating."
+msgstr "Този рейтинг е задължителен, понеже сте въвели поне един друг рейтинг.  "
+
+#: contrib/comments/views/comments.py:112
+#: django/contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s comment:\n"
+"\n"
+"%(text)sThis comment was posted by a user who has posted fewer than %(count)s comments:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Този коментар е от потребител, който има по-малко от %(count)s коментар:\n"
+"\n"
+"%(text)sТози коментар е от потребител, който има по-малко от %(count)s коментара:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:117
+#: django/contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Този коментар е от съмнителен потребител:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:190
+#: contrib/comments/views/comments.py:283
+#: django/contrib/comments/views/comments.py:190
+#: django/contrib/comments/views/comments.py:283
+msgid "Only POSTs are allowed"
+msgstr "Само POST заявките са позволени"
+
+#: contrib/comments/views/comments.py:194
+#: contrib/comments/views/comments.py:287
+#: django/contrib/comments/views/comments.py:194
+#: django/contrib/comments/views/comments.py:287
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Едно или повече от задължителните полета липсва"
+
+#: contrib/comments/views/comments.py:198
+#: contrib/comments/views/comments.py:289
+#: django/contrib/comments/views/comments.py:198
+#: django/contrib/comments/views/comments.py:289
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Някой е променял формата за коментари (нарушение на сигурността)"
+
+#: contrib/comments/views/comments.py:208
+#: contrib/comments/views/comments.py:295
+#: django/contrib/comments/views/comments.py:208
+#: django/contrib/comments/views/comments.py:295
+msgid "The comment form had an invalid 'target' parameter -- the object ID was invalid"
+msgstr "Формата за коментарите има невалиден параметър 'target'  -- ID-то на обекта е невалидно"
+
+#: contrib/comments/views/comments.py:259
+#: contrib/comments/views/comments.py:324
+#: django/contrib/comments/views/comments.py:259
+#: django/contrib/comments/views/comments.py:324
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "Формата за коментарите не предоставя нито преглед нито постване.  "
+
+#: contrib/comments/views/karma.py:21
+#: django/contrib/comments/views/karma.py:21
+msgid "Anonymous users cannot vote"
+msgstr "Анонимните потребители не могат да гласуват"
+
+#: contrib/comments/views/karma.py:25
+#: django/contrib/comments/views/karma.py:25
+msgid "Invalid comment ID"
+msgstr "Невалидно ID на коментар"
+
+#: contrib/comments/views/karma.py:27
+#: django/contrib/comments/views/karma.py:27
+msgid "No voting for yourself"
+msgstr "Не можете да гласувате за себе си"
+
+#: contrib/contenttypes/models.py:37
+#: django/contrib/contenttypes/models.py:37
+msgid "python model class name"
+msgstr "има на класа на модела в Python"
+
+#: contrib/contenttypes/models.py:40
+#: django/contrib/contenttypes/models.py:40
+msgid "content type"
+msgstr "тип на съдържанието"
+
+#: contrib/contenttypes/models.py:41
+#: django/contrib/contenttypes/models.py:41
+msgid "content types"
+msgstr "типове съдържание"
+
+#: contrib/flatpages/models.py:8
+#: django/contrib/flatpages/models.py:8
+msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr "Пример: '/about/contact/'.  Началната и крайната наклонена чертичка са задължителни.  "
+
+#: contrib/flatpages/models.py:9
+#: django/contrib/flatpages/models.py:9
+msgid "title"
+msgstr "заглавие"
+
+#: contrib/flatpages/models.py:10
+#: django/contrib/flatpages/models.py:10
+msgid "content"
+msgstr "съдържание"
+
+#: contrib/flatpages/models.py:11
+#: django/contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "позволяване на коментари"
+
+#: contrib/flatpages/models.py:12
+#: django/contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "име на шаблон"
+
+#: contrib/flatpages/models.py:13
+#: django/contrib/flatpages/models.py:13
+msgid "Example: 'flatpages/contact_page.html'. If this isn't provided, the system will use 'flatpages/default.html'."
+msgstr "Пример: 'flatpages/contact_page.html'.  Ако това не е указано, системата ще използва 'flatpages/default.html'.  "
+
+#: contrib/flatpages/models.py:14
+#: django/contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "изисква се регистрация"
+
+#: contrib/flatpages/models.py:14
+#: django/contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Ако това е чекнато, само логнати потребители ще могат да виждат страницата.  "
+
+#: contrib/flatpages/models.py:18
+#: django/contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "информативна страница"
+
+#: contrib/flatpages/models.py:19
+#: django/contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "информативни страници"
+
+#: contrib/humanize/templatetags/humanize.py:19
+#: django/contrib/humanize/templatetags/humanize.py:19
+msgid "th"
+msgstr "и"
+
+#: contrib/humanize/templatetags/humanize.py:19
+#: django/contrib/humanize/templatetags/humanize.py:19
+msgid "st"
+msgstr "ви"
+
+#: contrib/humanize/templatetags/humanize.py:19
+#: django/contrib/humanize/templatetags/humanize.py:19
+msgid "nd"
+msgstr "ри"
+
+#: contrib/humanize/templatetags/humanize.py:19
+#: django/contrib/humanize/templatetags/humanize.py:19
+msgid "rd"
+msgstr "ти"
+
+#: contrib/humanize/templatetags/humanize.py:51
+#: django/contrib/humanize/templatetags/humanize.py:51
+#, python-format
+msgid "%(value).1f million"
+msgstr "%(value).1f милион"
+
+#: contrib/humanize/templatetags/humanize.py:54
+#: django/contrib/humanize/templatetags/humanize.py:54
+#, python-format
+msgid "%(value).1f billion"
+msgstr "%(value).1f милиард"
+
+#: contrib/humanize/templatetags/humanize.py:57
+#: django/contrib/humanize/templatetags/humanize.py:57
+#, python-format
+msgid "%(value).1f trillion"
+msgstr "%(value).1f трилион"
+
+#: contrib/humanize/templatetags/humanize.py:73
+#: django/contrib/humanize/templatetags/humanize.py:73
+msgid "one"
+msgstr "един"
+
+#: contrib/humanize/templatetags/humanize.py:73
+#: django/contrib/humanize/templatetags/humanize.py:73
+msgid "two"
+msgstr "два"
+
+#: contrib/humanize/templatetags/humanize.py:73
+#: django/contrib/humanize/templatetags/humanize.py:73
+msgid "three"
+msgstr "три"
+
+#: contrib/humanize/templatetags/humanize.py:73
+#: django/contrib/humanize/templatetags/humanize.py:73
+msgid "four"
+msgstr "четири"
+
+#: contrib/humanize/templatetags/humanize.py:73
+#: django/contrib/humanize/templatetags/humanize.py:73
+msgid "five"
+msgstr "пет"
+
+#: contrib/humanize/templatetags/humanize.py:73
+#: django/contrib/humanize/templatetags/humanize.py:73
+msgid "six"
+msgstr "шест"
+
+#: contrib/humanize/templatetags/humanize.py:73
+#: django/contrib/humanize/templatetags/humanize.py:73
+msgid "seven"
+msgstr "седем"
+
+#: contrib/humanize/templatetags/humanize.py:73
+#: django/contrib/humanize/templatetags/humanize.py:73
+msgid "eight"
+msgstr "осем"
+
+#: contrib/humanize/templatetags/humanize.py:73
+#: django/contrib/humanize/templatetags/humanize.py:73
+msgid "nine"
+msgstr "девет"
+
+#: contrib/humanize/templatetags/humanize.py:93
+#: django/contrib/humanize/templatetags/humanize.py:93
+#: tests/regressiontests/humanize/tests.py:65
+msgid "today"
+msgstr "днес"
+
+#: contrib/humanize/templatetags/humanize.py:95
+#: django/contrib/humanize/templatetags/humanize.py:95
+#: tests/regressiontests/humanize/tests.py:65
+msgid "tomorrow"
+msgstr "Утре"
+
+#: contrib/humanize/templatetags/humanize.py:97
+#: django/contrib/humanize/templatetags/humanize.py:97
+#: tests/regressiontests/humanize/tests.py:65
+msgid "yesterday"
+msgstr "вчера"
+
+#: contrib/localflavor/ar/forms.py:27
+#: django/contrib/localflavor/ar/forms.py:27
+msgid "Enter a postal code in the format NNNN or ANNNNAAA."
+msgstr "Въведете пощенския код във формат NNNN или ANNNNAAA."
+
+#: contrib/localflavor/ar/forms.py:49
+#: contrib/localflavor/br/forms.py:96
+#: contrib/localflavor/br/forms.py:135
+#: contrib/localflavor/pe/forms.py:23
+#: contrib/localflavor/pe/forms.py:51
+#: django/contrib/localflavor/ar/forms.py:49
+#: django/contrib/localflavor/br/forms.py:96
+#: django/contrib/localflavor/br/forms.py:135
+#: django/contrib/localflavor/pe/forms.py:23
+#: django/contrib/localflavor/pe/forms.py:51
+msgid "This field requires only numbers."
+msgstr "Това поле изисква число."
+
+#: contrib/localflavor/ar/forms.py:50
+#: django/contrib/localflavor/ar/forms.py:50
+msgid "This field requires 7 or 8 digits."
+msgstr "Това поле изисква 7 или 8 цифри."
+
+#: contrib/localflavor/ar/forms.py:79
+#: django/contrib/localflavor/ar/forms.py:79
+msgid "Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format."
+msgstr "Въведете валиден номер на германска лична карта в формат XX-XXXXXXXX-X или XXXXXXXXXXXX."
+
+#: contrib/localflavor/ar/forms.py:80
+#: django/contrib/localflavor/ar/forms.py:80
+msgid "Invalid CUIT."
+msgstr "Невалиден CUIT."
+
+#: contrib/localflavor/au/forms.py:16
+#: django/contrib/localflavor/au/forms.py:16
+msgid "Enter a 4 digit post code."
+msgstr "Въведете 4 цифрен пощенски код"
+
+#: contrib/localflavor/br/forms.py:21
+#: django/contrib/localflavor/br/forms.py:21
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Въведете пощенски код в формат XXXXX-XXX."
+
+#: contrib/localflavor/br/forms.py:30
+#: django/contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "Телефонните номера трябва да бъдат в формат XX-XXXX-XXXX.  "
+
+#: contrib/localflavor/br/forms.py:58
+#: django/contrib/localflavor/br/forms.py:58
+msgid "Select a valid brazilian state. That state is not one of the available states."
+msgstr "Изберете валиден бразилски щат.  Този, не е един отвалидните щати."
+
+#: contrib/localflavor/br/forms.py:94
+#: django/contrib/localflavor/br/forms.py:94
+msgid "Invalid CPF number."
+msgstr "Невалиден CPF номер"
+
+#: contrib/localflavor/br/forms.py:95
+#: django/contrib/localflavor/br/forms.py:95
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr "Това поле изисква поне 11 цифри или 14 символа."
+
+#: contrib/localflavor/br/forms.py:134
+#: django/contrib/localflavor/br/forms.py:134
+msgid "Invalid CNPJ number."
+msgstr "Невалиден CNPJ номер"
+
+#: contrib/localflavor/br/forms.py:136
+#: django/contrib/localflavor/br/forms.py:136
+msgid "This field requires at least 14 digits"
+msgstr "Това поле изисква поне 14 цифри."
+
+#: contrib/localflavor/ca/forms.py:17
+#: django/contrib/localflavor/ca/forms.py:17
+msgid "Enter a postal code in the format XXX XXX."
+msgstr "Въведете пощенски код в формат XXX XXХ."
+
+#: contrib/localflavor/ca/forms.py:88
+#: django/contrib/localflavor/ca/forms.py:88
+msgid "Enter a valid Canadian Social Insurance number in XXX-XXX-XXX format."
+msgstr "Въведете валиден номер на канадската социална осигуровка в формата XXX-XX-XXXX."
+
+#: contrib/localflavor/ch/ch_states.py:5
+#: django/contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr "Ааргау"
+
+#: contrib/localflavor/ch/ch_states.py:6
+#: django/contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:7
+#: django/contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:8
+#: django/contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:9
+#: django/contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:10
+#: django/contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:11
+#: django/contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:12
+#: django/contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr "Женева"
+
+#: contrib/localflavor/ch/ch_states.py:13
+#: django/contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:14
+#: django/contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:15
+#: django/contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:16
+#: django/contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:17
+#: django/contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:18
+#: django/contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:19
+#: django/contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:20
+#: django/contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:21
+#: django/contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:22
+#: django/contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:23
+#: django/contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:24
+#: django/contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:25
+#: django/contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:26
+#: django/contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:27
+#: django/contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:28
+#: django/contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:29
+#: django/contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:30
+#: django/contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr ""
+
+#: contrib/localflavor/ch/forms.py:16
+#: contrib/localflavor/no/forms.py:12
+#: django/contrib/localflavor/ch/forms.py:16
+#: django/contrib/localflavor/no/forms.py:12
+msgid "Enter a zip code in the format XXXX."
+msgstr "Въведете пощенски код в формат XXXX."
+
+#: contrib/localflavor/ch/forms.py:64
+#: django/contrib/localflavor/ch/forms.py:64
+msgid "Enter a valid Swiss identity or passport card number in X1234567<0 or 1234567890 format."
+msgstr "Въведете валиден швейцарски индентификационен номер в X1234567<0 или 1234567890 формат"
+
+#: contrib/localflavor/cl/forms.py:29
+#: django/contrib/localflavor/cl/forms.py:29
+msgid "Enter a valid Chilean RUT."
+msgstr "Въведете валиден чилийски RUT."
+
+#: contrib/localflavor/cl/forms.py:30
+#: django/contrib/localflavor/cl/forms.py:30
+msgid "Enter a valid Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr "Въведете валиден чилийски RUT. Форпатът представлява ХХ ХХХ ХХХ-Х."
+
+#: contrib/localflavor/cl/forms.py:31
+#: django/contrib/localflavor/cl/forms.py:31
+msgid "The Chilean RUT is not valid."
+msgstr "Чилийският RUT не е валиден."
+
+#: contrib/localflavor/de/de_states.py:5
+#: django/contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:6
+#: django/contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr "Бавария"
+
+#: contrib/localflavor/de/de_states.py:7
+#: django/contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr "Берлин"
+
+#: contrib/localflavor/de/de_states.py:8
+#: django/contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr "Бранденбург"
+
+#: contrib/localflavor/de/de_states.py:9
+#: django/contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr "Бремен"
+
+#: contrib/localflavor/de/de_states.py:10
+#: django/contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr "Хамбург"
+
+#: contrib/localflavor/de/de_states.py:11
+#: django/contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr "Хесен "
+
+#: contrib/localflavor/de/de_states.py:12
+#: django/contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:13
+#: django/contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr "Долна Саксония "
+
+#: contrib/localflavor/de/de_states.py:14
+#: django/contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr "North Rhine-Westphalia"
+
+#: contrib/localflavor/de/de_states.py:15
+#: django/contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:16
+#: django/contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:17
+#: django/contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr "Саксония"
+
+#: contrib/localflavor/de/de_states.py:18
+#: django/contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr "Саксония-Анхалт"
+
+#: contrib/localflavor/de/de_states.py:19
+#: django/contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:20
+#: django/contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr ""
+
+#: contrib/localflavor/de/forms.py:14
+#: contrib/localflavor/fi/forms.py:12
+#: contrib/localflavor/fr/forms.py:15
+#: django/contrib/localflavor/de/forms.py:14
+#: django/contrib/localflavor/fi/forms.py:12
+#: django/contrib/localflavor/fr/forms.py:15
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Въведете пощенски код в формат XXXXX."
+
+#: contrib/localflavor/de/forms.py:41
+#: django/contrib/localflavor/de/forms.py:41
+msgid "Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X format."
+msgstr "Въведете валиден номер на германска лична карта в формат  XXXXXXXXXXX-XXXXXXX-XXXXXXX-X."
+
+#: contrib/localflavor/es/es_provinces.py:5
+#: django/contrib/localflavor/es/es_provinces.py:5
+msgid "Arava"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:6
+#: django/contrib/localflavor/es/es_provinces.py:6
+msgid "Albacete"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:7
+#: django/contrib/localflavor/es/es_provinces.py:7
+msgid "Alacant"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:8
+#: django/contrib/localflavor/es/es_provinces.py:8
+msgid "Almeria"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:9
+#: django/contrib/localflavor/es/es_provinces.py:9
+msgid "Avila"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:10
+#: django/contrib/localflavor/es/es_provinces.py:10
+msgid "Badajoz"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:11
+#: django/contrib/localflavor/es/es_provinces.py:11
+msgid "Illes Balears"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:12
+#: django/contrib/localflavor/es/es_provinces.py:12
+msgid "Barcelona"
+msgstr "Барселона"
+
+#: contrib/localflavor/es/es_provinces.py:13
+#: django/contrib/localflavor/es/es_provinces.py:13
+msgid "Burgos"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:14
+#: django/contrib/localflavor/es/es_provinces.py:14
+msgid "Caceres"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:15
+#: django/contrib/localflavor/es/es_provinces.py:15
+msgid "Cadiz"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:16
+#: django/contrib/localflavor/es/es_provinces.py:16
+msgid "Castello"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:17
+#: django/contrib/localflavor/es/es_provinces.py:17
+msgid "Ciudad Real"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:18
+#: django/contrib/localflavor/es/es_provinces.py:18
+msgid "Cordoba"
+msgstr "Кордоба"
+
+#: contrib/localflavor/es/es_provinces.py:19
+#: django/contrib/localflavor/es/es_provinces.py:19
+msgid "A Coruna"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:20
+#: django/contrib/localflavor/es/es_provinces.py:20
+msgid "Cuenca"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:21
+#: django/contrib/localflavor/es/es_provinces.py:21
+msgid "Girona"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:22
+#: django/contrib/localflavor/es/es_provinces.py:22
+msgid "Granada"
+msgstr "Гранада"
+
+#: contrib/localflavor/es/es_provinces.py:23
+#: django/contrib/localflavor/es/es_provinces.py:23
+msgid "Guadalajara"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:24
+#: django/contrib/localflavor/es/es_provinces.py:24
+msgid "Guipuzkoa"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:25
+#: django/contrib/localflavor/es/es_provinces.py:25
+msgid "Huelva"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:26
+#: django/contrib/localflavor/es/es_provinces.py:26
+msgid "Huesca"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:27
+#: django/contrib/localflavor/es/es_provinces.py:27
+msgid "Jaen"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:28
+#: django/contrib/localflavor/es/es_provinces.py:28
+msgid "Leon"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:29
+#: django/contrib/localflavor/es/es_provinces.py:29
+msgid "Lleida"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:30
+#: contrib/localflavor/es/es_regions.py:17
+#: django/contrib/localflavor/es/es_provinces.py:30
+#: django/contrib/localflavor/es/es_regions.py:17
+msgid "La Rioja"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:31
+#: django/contrib/localflavor/es/es_provinces.py:31
+msgid "Lugo"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:32
+#: contrib/localflavor/es/es_regions.py:18
+#: django/contrib/localflavor/es/es_provinces.py:32
+#: django/contrib/localflavor/es/es_regions.py:18
+msgid "Madrid"
+msgstr "Мадрид"
+
+#: contrib/localflavor/es/es_provinces.py:33
+#: django/contrib/localflavor/es/es_provinces.py:33
+msgid "Malaga"
+msgstr "Малага"
+
+#: contrib/localflavor/es/es_provinces.py:34
+#: django/contrib/localflavor/es/es_provinces.py:34
+msgid "Murcia"
+msgstr "Мурсия "
+
+#: contrib/localflavor/es/es_provinces.py:35
+#: django/contrib/localflavor/es/es_provinces.py:35
+msgid "Navarre"
+msgstr "Навара"
+
+#: contrib/localflavor/es/es_provinces.py:36
+#: django/contrib/localflavor/es/es_provinces.py:36
+msgid "Ourense"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:37
+#: django/contrib/localflavor/es/es_provinces.py:37
+msgid "Asturias"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:38
+#: django/contrib/localflavor/es/es_provinces.py:38
+msgid "Palencia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:39
+#: django/contrib/localflavor/es/es_provinces.py:39
+msgid "Las Palmas"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:40
+#: django/contrib/localflavor/es/es_provinces.py:40
+msgid "Pontevedra"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:41
+#: django/contrib/localflavor/es/es_provinces.py:41
+msgid "Salamanca"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:42
+#: django/contrib/localflavor/es/es_provinces.py:42
+msgid "Santa Cruz de Tenerife"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:43
+#: contrib/localflavor/es/es_regions.py:11
+#: django/contrib/localflavor/es/es_provinces.py:43
+#: django/contrib/localflavor/es/es_regions.py:11
+msgid "Cantabria"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:44
+#: django/contrib/localflavor/es/es_provinces.py:44
+msgid "Segovia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:45
+#: django/contrib/localflavor/es/es_provinces.py:45
+msgid "Seville"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:46
+#: django/contrib/localflavor/es/es_provinces.py:46
+msgid "Soria"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:47
+#: django/contrib/localflavor/es/es_provinces.py:47
+msgid "Tarragona"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:48
+#: django/contrib/localflavor/es/es_provinces.py:48
+msgid "Teruel"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:49
+#: django/contrib/localflavor/es/es_provinces.py:49
+msgid "Toledo"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:50
+#: django/contrib/localflavor/es/es_provinces.py:50
+msgid "Valencia"
+msgstr "Валенсия"
+
+#: contrib/localflavor/es/es_provinces.py:51
+#: django/contrib/localflavor/es/es_provinces.py:51
+msgid "Valladolid"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:52
+#: django/contrib/localflavor/es/es_provinces.py:52
+msgid "Bizkaia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:53
+#: django/contrib/localflavor/es/es_provinces.py:53
+msgid "Zamora"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:54
+#: django/contrib/localflavor/es/es_provinces.py:54
+msgid "Zaragoza"
+msgstr "Сарагоса"
+
+#: contrib/localflavor/es/es_provinces.py:55
+#: django/contrib/localflavor/es/es_provinces.py:55
+msgid "Ceuta"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:56
+#: django/contrib/localflavor/es/es_provinces.py:56
+msgid "Melilla"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:5
+#: django/contrib/localflavor/es/es_regions.py:5
+msgid "Andalusia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:6
+#: django/contrib/localflavor/es/es_regions.py:6
+msgid "Aragon"
+msgstr "Арагон"
+
+#: contrib/localflavor/es/es_regions.py:7
+#: django/contrib/localflavor/es/es_regions.py:7
+msgid "Principality of Asturias"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:8
+#: django/contrib/localflavor/es/es_regions.py:8
+msgid "Balearic Islands"
+msgstr "Балеарските острови"
+
+#: contrib/localflavor/es/es_regions.py:9
+#: django/contrib/localflavor/es/es_regions.py:9
+msgid "Basque Country"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:10
+#: django/contrib/localflavor/es/es_regions.py:10
+msgid "Canary Islands"
+msgstr "Канарските острови"
+
+#: contrib/localflavor/es/es_regions.py:12
+#: django/contrib/localflavor/es/es_regions.py:12
+msgid "Castile-La Mancha"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:13
+#: django/contrib/localflavor/es/es_regions.py:13
+msgid "Castile and Leon"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:14
+#: django/contrib/localflavor/es/es_regions.py:14
+msgid "Catalonia"
+msgstr "Каталония"
+
+#: contrib/localflavor/es/es_regions.py:15
+#: django/contrib/localflavor/es/es_regions.py:15
+msgid "Extremadura"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:16
+#: django/contrib/localflavor/es/es_regions.py:16
+msgid "Galicia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:19
+#: django/contrib/localflavor/es/es_regions.py:19
+msgid "Region of Murcia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:20
+#: django/contrib/localflavor/es/es_regions.py:20
+msgid "Foral Community of Navarre"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:21
+#: django/contrib/localflavor/es/es_regions.py:21
+msgid "Valencian Community"
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:19
+#: django/contrib/localflavor/es/forms.py:19
+msgid "Enter a valid postal code in the range and format 01XXX - 52XXX."
+msgstr "Въведете валиден пощенски код в интервала 01XXX - 52XXX."
+
+#: contrib/localflavor/es/forms.py:39
+#: django/contrib/localflavor/es/forms.py:39
+msgid "Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or 9XXXXXXXX."
+msgstr "Въведевалиден телефонен номер в един от форматите 6XXXXXXXX, 8XXXXXXXX или 9XXXXXXXX."
+
+#: contrib/localflavor/es/forms.py:66
+#: django/contrib/localflavor/es/forms.py:66
+msgid "Please enter a valid NIF, NIE, or CIF."
+msgstr "Въведете валиден НИФ, НИЕ, или ЦИФ."
+
+#: contrib/localflavor/es/forms.py:67
+#: django/contrib/localflavor/es/forms.py:67
+msgid "Please enter a valid NIF or NIE."
+msgstr "Въведете валиден НИГ или НИЕ."
+
+#: contrib/localflavor/es/forms.py:68
+#: django/contrib/localflavor/es/forms.py:68
+msgid "Invalid checksum for NIF."
+msgstr "Невалидна чексума за НИФ"
+
+#: contrib/localflavor/es/forms.py:69
+#: django/contrib/localflavor/es/forms.py:69
+msgid "Invalid checksum for NIE."
+msgstr "Невалидна чексума за НИЕ"
+
+#: contrib/localflavor/es/forms.py:70
+#: django/contrib/localflavor/es/forms.py:70
+msgid "Invalid checksum for CIF."
+msgstr "Невалидна чексума за ЦИФ"
+
+#: contrib/localflavor/es/forms.py:142
+#: django/contrib/localflavor/es/forms.py:142
+msgid "Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX."
+msgstr "Въведете валиден номер на банковата ви сметка във формат XXXX-XXXX-XX-XXXXXXXXXX."
+
+#: contrib/localflavor/es/forms.py:143
+#: django/contrib/localflavor/es/forms.py:143
+msgid "Invalid checksum for bank account number."
+msgstr "Невалидна чексума за номер на банковата сметка"
+
+#: contrib/localflavor/fi/forms.py:28
+#: django/contrib/localflavor/fi/forms.py:28
+msgid "Enter a valid Finnish social security number."
+msgstr "Въведете валиден финландски номер на социалната осигуровка."
+
+#: contrib/localflavor/in_/forms.py:14
+#: django/contrib/localflavor/in_/forms.py:14
+msgid "Enter a zip code in the format XXXXXXX."
+msgstr "Въведете пощенски код в формат XXXXXXX."
+
+#: contrib/localflavor/is_/forms.py:17
+#: django/contrib/localflavor/is_/forms.py:17
+msgid "Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr "Въведете валиден исландски номер. Форматът представлява XXXXXX-XXXX."
+
+#: contrib/localflavor/is_/forms.py:18
+#: django/contrib/localflavor/is_/forms.py:18
+msgid "The Icelandic identification number is not valid."
+msgstr "Исландския номер за индентификация е невлиден"
+
+#: contrib/localflavor/it/forms.py:14
+#: django/contrib/localflavor/it/forms.py:14
+msgid "Enter a valid zip code."
+msgstr "Въведете валиден пощенски код."
+
+#: contrib/localflavor/it/forms.py:43
+#: django/contrib/localflavor/it/forms.py:43
+msgid "Enter a valid Social Security number."
+msgstr "Въведете валиден номер на социалната ви осигуровка."
+
+#: contrib/localflavor/it/forms.py:68
+#: django/contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr "Въведете валиден VAT номер."
+
+#: contrib/localflavor/jp/forms.py:17
+#: django/contrib/localflavor/jp/forms.py:17
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "Въведете пощенски код в формат XXXXXXX или XXX-XXXX."
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+#: django/contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr "Хокайдо"
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+#: django/contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr "Амори"
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+#: django/contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+#: django/contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+#: django/contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr "Акита"
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+#: django/contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr "Ямагата"
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+#: django/contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr "Фукушима"
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+#: django/contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr "Ибараки"
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+#: django/contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+#: django/contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+#: django/contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr "Сайтама"
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+#: django/contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr "Чиба"
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+#: django/contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr "Токио"
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+#: django/contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr "Канагава"
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+#: django/contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr "Яманаши"
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+#: django/contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr "Нагано"
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+#: django/contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+#: django/contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+#: django/contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr "Ишикава"
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+#: django/contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+#: django/contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+#: django/contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+#: django/contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+#: django/contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+#: django/contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr "Шига"
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+#: django/contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr "Киато"
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+#: django/contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr "Осака"
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+#: django/contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+#: django/contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr "Нара"
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+#: django/contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+#: django/contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+#: django/contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+#: django/contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr "Окаяма"
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+#: django/contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr "Хирошима"
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+#: django/contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr "Ямагучи"
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+#: django/contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr "Токушима"
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+#: django/contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+#: django/contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+#: django/contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr "Кочи"
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+#: django/contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr "Фукуока"
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+#: django/contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr "Сага"
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+#: django/contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr "Нагазаки"
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+#: django/contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr "Кумамото"
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+#: django/contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+#: django/contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr "Миазаки"
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+#: django/contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+#: django/contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr "Окинава"
+
+#: contrib/localflavor/mx/mx_states.py:12
+#: django/contrib/localflavor/mx/mx_states.py:12
+msgid "Aguascalientes"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:13
+#: django/contrib/localflavor/mx/mx_states.py:13
+msgid "Baja California"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:14
+#: django/contrib/localflavor/mx/mx_states.py:14
+msgid "Baja California Sur"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:15
+#: django/contrib/localflavor/mx/mx_states.py:15
+msgid "Campeche"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:16
+#: django/contrib/localflavor/mx/mx_states.py:16
+msgid "Chihuahua"
+msgstr "Чихуахуа"
+
+#: contrib/localflavor/mx/mx_states.py:17
+#: django/contrib/localflavor/mx/mx_states.py:17
+msgid "Chiapas"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:18
+#: django/contrib/localflavor/mx/mx_states.py:18
+msgid "Coahuila"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:19
+#: django/contrib/localflavor/mx/mx_states.py:19
+msgid "Colima"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:20
+#: django/contrib/localflavor/mx/mx_states.py:20
+msgid "Distrito Federal"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:21
+#: django/contrib/localflavor/mx/mx_states.py:21
+msgid "Durango"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:22
+#: django/contrib/localflavor/mx/mx_states.py:22
+msgid "Guerrero"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:23
+#: django/contrib/localflavor/mx/mx_states.py:23
+msgid "Guanajuato"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:24
+#: django/contrib/localflavor/mx/mx_states.py:24
+msgid "Hidalgo"
+msgstr "Хидалго"
+
+#: contrib/localflavor/mx/mx_states.py:25
+#: django/contrib/localflavor/mx/mx_states.py:25
+msgid "Jalisco"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:26
+#: django/contrib/localflavor/mx/mx_states.py:26
+msgid "Estado de México"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:27
+#: django/contrib/localflavor/mx/mx_states.py:27
+msgid "Michoacán"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:28
+#: django/contrib/localflavor/mx/mx_states.py:28
+msgid "Morelos"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:29
+#: django/contrib/localflavor/mx/mx_states.py:29
+msgid "Nayarit"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:30
+#: django/contrib/localflavor/mx/mx_states.py:30
+msgid "Nuevo León"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:31
+#: django/contrib/localflavor/mx/mx_states.py:31
+msgid "Oaxaca"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:32
+#: django/contrib/localflavor/mx/mx_states.py:32
+msgid "Puebla"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:33
+#: django/contrib/localflavor/mx/mx_states.py:33
+msgid "Querétaro"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:34
+#: django/contrib/localflavor/mx/mx_states.py:34
+msgid "Quintana Roo"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:35
+#: django/contrib/localflavor/mx/mx_states.py:35
+msgid "Sinaloa"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:36
+#: django/contrib/localflavor/mx/mx_states.py:36
+msgid "San Luis Potosí"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:37
+#: django/contrib/localflavor/mx/mx_states.py:37
+msgid "Sonora"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:38
+#: django/contrib/localflavor/mx/mx_states.py:38
+msgid "Tabasco"
+msgstr "Табаско"
+
+#: contrib/localflavor/mx/mx_states.py:39
+#: django/contrib/localflavor/mx/mx_states.py:39
+msgid "Tamaulipas"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:40
+#: django/contrib/localflavor/mx/mx_states.py:40
+msgid "Tlaxcala"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:41
+#: django/contrib/localflavor/mx/mx_states.py:41
+msgid "Veracruz"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:42
+#: django/contrib/localflavor/mx/mx_states.py:42
+msgid "Yucatán"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:43
+#: django/contrib/localflavor/mx/mx_states.py:43
+msgid "Zacatecas"
+msgstr ""
+
+#: contrib/localflavor/nl/forms.py:21
+#: django/contrib/localflavor/nl/forms.py:21
+msgid "Enter a valid postal code"
+msgstr "Въведете валиден пощенски код."
+
+#: contrib/localflavor/nl/forms.py:52
+#: django/contrib/localflavor/nl/forms.py:52
+msgid "Enter a valid phone number"
+msgstr "Въведете валиден телефонен номер"
+
+#: contrib/localflavor/nl/forms.py:78
+#: django/contrib/localflavor/nl/forms.py:78
+msgid "Enter a valid SoFi number"
+msgstr "Въведете валиден SoFi номер"
+
+#: contrib/localflavor/nl/nl_provinces.py:4
+#: django/contrib/localflavor/nl/nl_provinces.py:4
+msgid "Drente"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:5
+#: django/contrib/localflavor/nl/nl_provinces.py:5
+msgid "Flevoland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:6
+#: django/contrib/localflavor/nl/nl_provinces.py:6
+msgid "Friesland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:7
+#: django/contrib/localflavor/nl/nl_provinces.py:7
+msgid "Gelderland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:8
+#: django/contrib/localflavor/nl/nl_provinces.py:8
+msgid "Groningen"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:9
+#: django/contrib/localflavor/nl/nl_provinces.py:9
+msgid "Limburg"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:10
+#: django/contrib/localflavor/nl/nl_provinces.py:10
+msgid "Noord-Brabant"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:11
+#: django/contrib/localflavor/nl/nl_provinces.py:11
+msgid "Noord-Holland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:12
+#: django/contrib/localflavor/nl/nl_provinces.py:12
+msgid "Overijssel"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:13
+#: django/contrib/localflavor/nl/nl_provinces.py:13
+msgid "Utrecht"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:14
+#: django/contrib/localflavor/nl/nl_provinces.py:14
+msgid "Zeeland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:15
+#: django/contrib/localflavor/nl/nl_provinces.py:15
+msgid "Zuid-Holland"
+msgstr ""
+
+#: contrib/localflavor/no/forms.py:33
+#: django/contrib/localflavor/no/forms.py:33
+msgid "Enter a valid Norwegian social security number."
+msgstr "Въведете валиден норвежки номер на социалната осигуровка."
+
+#: contrib/localflavor/pe/forms.py:24
+#: django/contrib/localflavor/pe/forms.py:24
+msgid "This field requires 8 digits."
+msgstr "Това поле изисква 8 цифри."
+
+#: contrib/localflavor/pe/forms.py:52
+#: django/contrib/localflavor/pe/forms.py:52
+msgid "This field requires 11 digits."
+msgstr "Това поле изисква 11 цифри."
+
+#: contrib/localflavor/pl/forms.py:39
+#: django/contrib/localflavor/pl/forms.py:39
+msgid "National Identification Number consists of 11 digits."
+msgstr "Националният индентификационен номер се състои от 11 цифри"
+
+#: contrib/localflavor/pl/forms.py:40
+#: django/contrib/localflavor/pl/forms.py:40
+msgid "Wrong checksum for the National Identification Number."
+msgstr "Грешна чексума за Националния индентификационен номер"
+
+#: contrib/localflavor/pl/forms.py:72
+#: django/contrib/localflavor/pl/forms.py:72
+msgid "Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX."
+msgstr "Въведете данъчен номер (НИП) във формат XXX-XXX-XX-XX или XX-XX-XXX-XXX."
+
+#: contrib/localflavor/pl/forms.py:73
+#: django/contrib/localflavor/pl/forms.py:73
+msgid "Wrong checksum for the Tax Number (NIP)."
+msgstr "Грешна чексума за данъчен номер (НИП)"
+
+#: contrib/localflavor/pl/forms.py:112
+#: django/contrib/localflavor/pl/forms.py:112
+msgid "National Business Register Number (REGON) consists of 7 or 9 digits."
+msgstr "Националният Бизнес Регистрационен номер (REGON) се състои от 7 или 9 цифри."
+
+#: contrib/localflavor/pl/forms.py:113
+#: django/contrib/localflavor/pl/forms.py:113
+msgid "Wrong checksum for the National Business Register Number (REGON)."
+msgstr "Грешна чексума за Националния Бизнес Регистрационен Номер (REGON)"
+
+#: contrib/localflavor/pl/forms.py:156
+#: django/contrib/localflavor/pl/forms.py:156
+msgid "Enter a postal code in the format XX-XXX."
+msgstr "Въведете пощенски код в формат XX-ХXXX."
+
+#: contrib/localflavor/pl/pl_voivodeships.py:8
+#: django/contrib/localflavor/pl/pl_voivodeships.py:8
+msgid "Lower Silesia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:9
+#: django/contrib/localflavor/pl/pl_voivodeships.py:9
+msgid "Kuyavia-Pomerania"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:10
+#: django/contrib/localflavor/pl/pl_voivodeships.py:10
+msgid "Lublin"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:11
+#: django/contrib/localflavor/pl/pl_voivodeships.py:11
+msgid "Lubusz"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:12
+#: django/contrib/localflavor/pl/pl_voivodeships.py:12
+msgid "Lodz"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:13
+#: django/contrib/localflavor/pl/pl_voivodeships.py:13
+msgid "Lesser Poland"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:14
+#: django/contrib/localflavor/pl/pl_voivodeships.py:14
+msgid "Masovia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:15
+#: django/contrib/localflavor/pl/pl_voivodeships.py:15
+msgid "Opole"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:16
+#: django/contrib/localflavor/pl/pl_voivodeships.py:16
+msgid "Subcarpatia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:17
+#: django/contrib/localflavor/pl/pl_voivodeships.py:17
+msgid "Podlasie"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:18
+#: django/contrib/localflavor/pl/pl_voivodeships.py:18
+msgid "Pomerania"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:19
+#: django/contrib/localflavor/pl/pl_voivodeships.py:19
+msgid "Silesia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:20
+#: django/contrib/localflavor/pl/pl_voivodeships.py:20
+msgid "Swietokrzyskie"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:21
+#: django/contrib/localflavor/pl/pl_voivodeships.py:21
+msgid "Warmia-Masuria"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:22
+#: django/contrib/localflavor/pl/pl_voivodeships.py:22
+msgid "Greater Poland"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:23
+#: django/contrib/localflavor/pl/pl_voivodeships.py:23
+msgid "West Pomerania"
+msgstr ""
+
+#: contrib/localflavor/sk/forms.py:30
+#: django/contrib/localflavor/sk/forms.py:30
+msgid "Enter a postal code in the format XXXXX or XXX XX."
+msgstr "Въведете пощенски код в формат XXXXX или XXX XX."
+
+#: contrib/localflavor/sk/sk_districts.py:8
+#: django/contrib/localflavor/sk/sk_districts.py:8
+msgid "Banska Bystrica"
+msgstr "Банска Бистрица"
+
+#: contrib/localflavor/sk/sk_districts.py:9
+#: django/contrib/localflavor/sk/sk_districts.py:9
+msgid "Banska Stiavnica"
+msgstr "Банска Стиавница"
+
+#: contrib/localflavor/sk/sk_districts.py:10
+#: django/contrib/localflavor/sk/sk_districts.py:10
+msgid "Bardejov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:11
+#: django/contrib/localflavor/sk/sk_districts.py:11
+msgid "Banovce nad Bebravou"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:12
+#: django/contrib/localflavor/sk/sk_districts.py:12
+msgid "Brezno"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:13
+#: django/contrib/localflavor/sk/sk_districts.py:13
+msgid "Bratislava I"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:14
+#: django/contrib/localflavor/sk/sk_districts.py:14
+msgid "Bratislava II"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:15
+#: django/contrib/localflavor/sk/sk_districts.py:15
+msgid "Bratislava III"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:16
+#: django/contrib/localflavor/sk/sk_districts.py:16
+msgid "Bratislava IV"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:17
+#: django/contrib/localflavor/sk/sk_districts.py:17
+msgid "Bratislava V"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:18
+#: django/contrib/localflavor/sk/sk_districts.py:18
+msgid "Bytca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:19
+#: django/contrib/localflavor/sk/sk_districts.py:19
+msgid "Cadca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:20
+#: django/contrib/localflavor/sk/sk_districts.py:20
+msgid "Detva"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:21
+#: django/contrib/localflavor/sk/sk_districts.py:21
+msgid "Dolny Kubin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:22
+#: django/contrib/localflavor/sk/sk_districts.py:22
+msgid "Dunajska Streda"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:23
+#: django/contrib/localflavor/sk/sk_districts.py:23
+msgid "Galanta"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:24
+#: django/contrib/localflavor/sk/sk_districts.py:24
+msgid "Gelnica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:25
+#: django/contrib/localflavor/sk/sk_districts.py:25
+msgid "Hlohovec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:26
+#: django/contrib/localflavor/sk/sk_districts.py:26
+msgid "Humenne"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:27
+#: django/contrib/localflavor/sk/sk_districts.py:27
+msgid "Ilava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:28
+#: django/contrib/localflavor/sk/sk_districts.py:28
+msgid "Kezmarok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:29
+#: django/contrib/localflavor/sk/sk_districts.py:29
+msgid "Komarno"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:30
+#: django/contrib/localflavor/sk/sk_districts.py:30
+msgid "Kosice I"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:31
+#: django/contrib/localflavor/sk/sk_districts.py:31
+msgid "Kosice II"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:32
+#: django/contrib/localflavor/sk/sk_districts.py:32
+msgid "Kosice III"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:33
+#: django/contrib/localflavor/sk/sk_districts.py:33
+msgid "Kosice IV"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:34
+#: django/contrib/localflavor/sk/sk_districts.py:34
+msgid "Kosice - okolie"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:35
+#: django/contrib/localflavor/sk/sk_districts.py:35
+msgid "Krupina"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:36
+#: django/contrib/localflavor/sk/sk_districts.py:36
+msgid "Kysucke Nove Mesto"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:37
+#: django/contrib/localflavor/sk/sk_districts.py:37
+msgid "Levice"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:38
+#: django/contrib/localflavor/sk/sk_districts.py:38
+msgid "Levoca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:39
+#: django/contrib/localflavor/sk/sk_districts.py:39
+msgid "Liptovsky Mikulas"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:40
+#: django/contrib/localflavor/sk/sk_districts.py:40
+msgid "Lucenec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:41
+#: django/contrib/localflavor/sk/sk_districts.py:41
+msgid "Malacky"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:42
+#: django/contrib/localflavor/sk/sk_districts.py:42
+msgid "Martin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:43
+#: django/contrib/localflavor/sk/sk_districts.py:43
+msgid "Medzilaborce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:44
+#: django/contrib/localflavor/sk/sk_districts.py:44
+msgid "Michalovce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:45
+#: django/contrib/localflavor/sk/sk_districts.py:45
+msgid "Myjava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:46
+#: django/contrib/localflavor/sk/sk_districts.py:46
+msgid "Namestovo"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:47
+#: django/contrib/localflavor/sk/sk_districts.py:47
+msgid "Nitra"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:48
+#: django/contrib/localflavor/sk/sk_districts.py:48
+msgid "Nove Mesto nad Vahom"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:49
+#: django/contrib/localflavor/sk/sk_districts.py:49
+msgid "Nove Zamky"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:50
+#: django/contrib/localflavor/sk/sk_districts.py:50
+msgid "Partizanske"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:51
+#: django/contrib/localflavor/sk/sk_districts.py:51
+msgid "Pezinok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:52
+#: django/contrib/localflavor/sk/sk_districts.py:52
+msgid "Piestany"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:53
+#: django/contrib/localflavor/sk/sk_districts.py:53
+msgid "Poltar"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:54
+#: django/contrib/localflavor/sk/sk_districts.py:54
+msgid "Poprad"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:55
+#: django/contrib/localflavor/sk/sk_districts.py:55
+msgid "Povazska Bystrica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:56
+#: django/contrib/localflavor/sk/sk_districts.py:56
+msgid "Presov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:57
+#: django/contrib/localflavor/sk/sk_districts.py:57
+msgid "Prievidza"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:58
+#: django/contrib/localflavor/sk/sk_districts.py:58
+msgid "Puchov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:59
+#: django/contrib/localflavor/sk/sk_districts.py:59
+msgid "Revuca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:60
+#: django/contrib/localflavor/sk/sk_districts.py:60
+msgid "Rimavska Sobota"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:61
+#: django/contrib/localflavor/sk/sk_districts.py:61
+msgid "Roznava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:62
+#: django/contrib/localflavor/sk/sk_districts.py:62
+msgid "Ruzomberok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:63
+#: django/contrib/localflavor/sk/sk_districts.py:63
+msgid "Sabinov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:64
+#: django/contrib/localflavor/sk/sk_districts.py:64
+msgid "Senec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:65
+#: django/contrib/localflavor/sk/sk_districts.py:65
+msgid "Senica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:66
+#: django/contrib/localflavor/sk/sk_districts.py:66
+msgid "Skalica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:67
+#: django/contrib/localflavor/sk/sk_districts.py:67
+msgid "Snina"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:68
+#: django/contrib/localflavor/sk/sk_districts.py:68
+msgid "Sobrance"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:69
+#: django/contrib/localflavor/sk/sk_districts.py:69
+msgid "Spisska Nova Ves"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:70
+#: django/contrib/localflavor/sk/sk_districts.py:70
+msgid "Stara Lubovna"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:71
+#: django/contrib/localflavor/sk/sk_districts.py:71
+msgid "Stropkov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:72
+#: django/contrib/localflavor/sk/sk_districts.py:72
+msgid "Svidnik"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:73
+#: django/contrib/localflavor/sk/sk_districts.py:73
+msgid "Sala"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:74
+#: django/contrib/localflavor/sk/sk_districts.py:74
+msgid "Topolcany"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:75
+#: django/contrib/localflavor/sk/sk_districts.py:75
+msgid "Trebisov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:76
+#: django/contrib/localflavor/sk/sk_districts.py:76
+msgid "Trencin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:77
+#: django/contrib/localflavor/sk/sk_districts.py:77
+msgid "Trnava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:78
+#: django/contrib/localflavor/sk/sk_districts.py:78
+msgid "Turcianske Teplice"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:79
+#: django/contrib/localflavor/sk/sk_districts.py:79
+msgid "Tvrdosin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:80
+#: django/contrib/localflavor/sk/sk_districts.py:80
+msgid "Velky Krtis"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:81
+#: django/contrib/localflavor/sk/sk_districts.py:81
+msgid "Vranov nad Toplou"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:82
+#: django/contrib/localflavor/sk/sk_districts.py:82
+msgid "Zlate Moravce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:83
+#: django/contrib/localflavor/sk/sk_districts.py:83
+msgid "Zvolen"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:84
+#: django/contrib/localflavor/sk/sk_districts.py:84
+msgid "Zarnovica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:85
+#: django/contrib/localflavor/sk/sk_districts.py:85
+msgid "Ziar nad Hronom"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:86
+#: django/contrib/localflavor/sk/sk_districts.py:86
+msgid "Zilina"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:8
+#: django/contrib/localflavor/sk/sk_regions.py:8
+msgid "Banska Bystrica region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:9
+#: django/contrib/localflavor/sk/sk_regions.py:9
+msgid "Bratislava region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:10
+#: django/contrib/localflavor/sk/sk_regions.py:10
+msgid "Kosice region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:11
+#: django/contrib/localflavor/sk/sk_regions.py:11
+msgid "Nitra region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:12
+#: django/contrib/localflavor/sk/sk_regions.py:12
+msgid "Presov region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:13
+#: django/contrib/localflavor/sk/sk_regions.py:13
+msgid "Trencin region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:14
+#: django/contrib/localflavor/sk/sk_regions.py:14
+msgid "Trnava region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:15
+#: django/contrib/localflavor/sk/sk_regions.py:15
+msgid "Zilina region"
+msgstr ""
+
+#: contrib/localflavor/uk/forms.py:21
+#: django/contrib/localflavor/uk/forms.py:21
+msgid "Enter a valid postcode."
+msgstr "Въведете валиден пощенски код."
+
+#: contrib/localflavor/uk/uk_regions.py:11
+#: django/contrib/localflavor/uk/uk_regions.py:11
+msgid "Bedfordshire"
+msgstr "Бедфордшър"
+
+#: contrib/localflavor/uk/uk_regions.py:12
+#: django/contrib/localflavor/uk/uk_regions.py:12
+msgid "Buckinghamshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:14
+#: django/contrib/localflavor/uk/uk_regions.py:14
+msgid "Cheshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:15
+#: django/contrib/localflavor/uk/uk_regions.py:15
+msgid "Cornwall and Isles of Scilly"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:16
+#: django/contrib/localflavor/uk/uk_regions.py:16
+msgid "Cumbria"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:17
+#: django/contrib/localflavor/uk/uk_regions.py:17
+msgid "Derbyshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:18
+#: django/contrib/localflavor/uk/uk_regions.py:18
+msgid "Devon"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:19
+#: django/contrib/localflavor/uk/uk_regions.py:19
+msgid "Dorset"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:20
+#: django/contrib/localflavor/uk/uk_regions.py:20
+msgid "Durham"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:21
+#: django/contrib/localflavor/uk/uk_regions.py:21
+msgid "East Sussex"
+msgstr "Источен Съсек "
+
+#: contrib/localflavor/uk/uk_regions.py:22
+#: django/contrib/localflavor/uk/uk_regions.py:22
+msgid "Essex"
+msgstr "Есекс"
+
+#: contrib/localflavor/uk/uk_regions.py:23
+#: django/contrib/localflavor/uk/uk_regions.py:23
+msgid "Gloucestershire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:24
+#: django/contrib/localflavor/uk/uk_regions.py:24
+msgid "Greater London"
+msgstr "Велик Лондон"
+
+#: contrib/localflavor/uk/uk_regions.py:25
+#: django/contrib/localflavor/uk/uk_regions.py:25
+msgid "Greater Manchester"
+msgstr "Велик Манчестер "
+
+#: contrib/localflavor/uk/uk_regions.py:26
+#: django/contrib/localflavor/uk/uk_regions.py:26
+msgid "Hampshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:27
+#: django/contrib/localflavor/uk/uk_regions.py:27
+msgid "Hertfordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:28
+#: django/contrib/localflavor/uk/uk_regions.py:28
+msgid "Kent"
+msgstr "Кент"
+
+#: contrib/localflavor/uk/uk_regions.py:29
+#: django/contrib/localflavor/uk/uk_regions.py:29
+msgid "Lancashire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:30
+#: django/contrib/localflavor/uk/uk_regions.py:30
+msgid "Leicestershire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:31
+#: django/contrib/localflavor/uk/uk_regions.py:31
+msgid "Lincolnshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:32
+#: django/contrib/localflavor/uk/uk_regions.py:32
+msgid "Merseyside"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:33
+#: django/contrib/localflavor/uk/uk_regions.py:33
+msgid "Norfolk"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:34
+#: django/contrib/localflavor/uk/uk_regions.py:34
+msgid "North Yorkshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:35
+#: django/contrib/localflavor/uk/uk_regions.py:35
+msgid "Northamptonshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:36
+#: django/contrib/localflavor/uk/uk_regions.py:36
+msgid "Northumberland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:37
+#: django/contrib/localflavor/uk/uk_regions.py:37
+msgid "Nottinghamshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:38
+#: django/contrib/localflavor/uk/uk_regions.py:38
+msgid "Oxfordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:39
+#: django/contrib/localflavor/uk/uk_regions.py:39
+msgid "Shropshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:40
+#: django/contrib/localflavor/uk/uk_regions.py:40
+msgid "Somerset"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:41
+#: django/contrib/localflavor/uk/uk_regions.py:41
+msgid "South Yorkshire"
+msgstr "Южен Йорксър"
+
+#: contrib/localflavor/uk/uk_regions.py:42
+#: django/contrib/localflavor/uk/uk_regions.py:42
+msgid "Staffordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:43
+#: django/contrib/localflavor/uk/uk_regions.py:43
+msgid "Suffolk"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:44
+#: django/contrib/localflavor/uk/uk_regions.py:44
+msgid "Surrey"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:45
+#: django/contrib/localflavor/uk/uk_regions.py:45
+msgid "Tyne and Wear"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:46
+#: django/contrib/localflavor/uk/uk_regions.py:46
+msgid "Warwickshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:47
+#: django/contrib/localflavor/uk/uk_regions.py:47
+msgid "West Midlands"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:48
+#: django/contrib/localflavor/uk/uk_regions.py:48
+msgid "West Sussex"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:49
+#: django/contrib/localflavor/uk/uk_regions.py:49
+msgid "West Yorkshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:50
+#: django/contrib/localflavor/uk/uk_regions.py:50
+msgid "Wiltshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:51
+#: django/contrib/localflavor/uk/uk_regions.py:51
+msgid "Worcestershire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:55
+#: django/contrib/localflavor/uk/uk_regions.py:55
+msgid "County Antrim"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:56
+#: django/contrib/localflavor/uk/uk_regions.py:56
+msgid "County Armagh"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:57
+#: django/contrib/localflavor/uk/uk_regions.py:57
+msgid "County Down"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:58
+#: django/contrib/localflavor/uk/uk_regions.py:58
+msgid "County Fermanagh"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:59
+#: django/contrib/localflavor/uk/uk_regions.py:59
+msgid "County Londonderry"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:60
+#: django/contrib/localflavor/uk/uk_regions.py:60
+msgid "County Tyrone"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:64
+#: django/contrib/localflavor/uk/uk_regions.py:64
+msgid "Clwyd"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:65
+#: django/contrib/localflavor/uk/uk_regions.py:65
+msgid "Dyfed"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:66
+#: django/contrib/localflavor/uk/uk_regions.py:66
+msgid "Gwent"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:67
+#: django/contrib/localflavor/uk/uk_regions.py:67
+msgid "Gwynedd"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:68
+#: django/contrib/localflavor/uk/uk_regions.py:68
+msgid "Mid Glamorgan"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:69
+#: django/contrib/localflavor/uk/uk_regions.py:69
+msgid "Powys"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:70
+#: django/contrib/localflavor/uk/uk_regions.py:70
+msgid "South Glamorgan"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:71
+#: django/contrib/localflavor/uk/uk_regions.py:71
+msgid "West Glamorgan"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:75
+#: django/contrib/localflavor/uk/uk_regions.py:75
+msgid "Borders"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:76
+#: django/contrib/localflavor/uk/uk_regions.py:76
+msgid "Central Scotland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:77
+#: django/contrib/localflavor/uk/uk_regions.py:77
+msgid "Dumfries and Galloway"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:78
+#: django/contrib/localflavor/uk/uk_regions.py:78
+msgid "Fife"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:79
+#: django/contrib/localflavor/uk/uk_regions.py:79
+msgid "Grampian"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:80
+#: django/contrib/localflavor/uk/uk_regions.py:80
+msgid "Highland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:81
+#: django/contrib/localflavor/uk/uk_regions.py:81
+msgid "Lothian"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:82
+#: django/contrib/localflavor/uk/uk_regions.py:82
+msgid "Orkney Islands"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:83
+#: django/contrib/localflavor/uk/uk_regions.py:83
+msgid "Shetland Islands"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:84
+#: django/contrib/localflavor/uk/uk_regions.py:84
+msgid "Strathclyde"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:85
+#: django/contrib/localflavor/uk/uk_regions.py:85
+msgid "Tayside"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:86
+#: django/contrib/localflavor/uk/uk_regions.py:86
+msgid "Western Isles"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:90
+#: django/contrib/localflavor/uk/uk_regions.py:90
+msgid "England"
+msgstr "Англия"
+
+#: contrib/localflavor/uk/uk_regions.py:91
+#: django/contrib/localflavor/uk/uk_regions.py:91
+msgid "Northern Ireland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:92
+#: django/contrib/localflavor/uk/uk_regions.py:92
+msgid "Scotland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:93
+#: django/contrib/localflavor/uk/uk_regions.py:93
+msgid "Wales"
+msgstr "Уелс"
+
+#: contrib/localflavor/us/forms.py:16
+#: django/contrib/localflavor/us/forms.py:16
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "Въведете zip код в формат XXXXX или XXXXX-XXXX."
+
+#: contrib/localflavor/us/forms.py:54
+#: django/contrib/localflavor/us/forms.py:54
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr "Въведете валиден номер на социалната осигуровка в формат XXX-XX-XXXX."
+
+#: contrib/localflavor/za/forms.py:20
+#: django/contrib/localflavor/za/forms.py:20
+msgid "Enter a valid South African ID number"
+msgstr "Въведете валиден южно-африкански номер за индентификация"
+
+#: contrib/localflavor/za/forms.py:54
+#: django/contrib/localflavor/za/forms.py:54
+msgid "Enter a valid South African postal code"
+msgstr "Въведете валиден пощенски код за Южна Африка"
+
+#: contrib/localflavor/za/za_provinces.py:4
+#: django/contrib/localflavor/za/za_provinces.py:4
+msgid "Eastern Cape"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:5
+#: django/contrib/localflavor/za/za_provinces.py:5
+msgid "Free State"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:6
+#: django/contrib/localflavor/za/za_provinces.py:6
+msgid "Gauteng"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:7
+#: django/contrib/localflavor/za/za_provinces.py:7
+msgid "KwaZulu-Natal"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:8
+#: django/contrib/localflavor/za/za_provinces.py:8
+msgid "Limpopo"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:9
+#: django/contrib/localflavor/za/za_provinces.py:9
+msgid "Mpumalanga"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:10
+#: django/contrib/localflavor/za/za_provinces.py:10
+msgid "Northern Cape"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:11
+#: django/contrib/localflavor/za/za_provinces.py:11
+msgid "North West"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:12
+#: django/contrib/localflavor/za/za_provinces.py:12
+msgid "Western Cape"
+msgstr ""
+
+#: contrib/redirects/models.py:7
+#: django/contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "препратка от"
+
+#: contrib/redirects/models.py:8
+#: django/contrib/redirects/models.py:8
+msgid "This should be an absolute path, excluding the domain name. Example: '/events/search/'."
+msgstr "Това трябва да бъде абсолютен път, без името на домейна.  Пример: '/events/search/'."
+
+#: contrib/redirects/models.py:9
+#: django/contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "препратка към"
+
+#: contrib/redirects/models.py:10
+#: django/contrib/redirects/models.py:10
+msgid "This can be either an absolute path (as above) or a full URL starting with 'http://'."
+msgstr "Това може да бъде или абсолютен път (като горното) или пълен URL, започващ с 'http://'."
+
+#: contrib/redirects/models.py:13
+#: django/contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "препратка"
+
+#: contrib/redirects/models.py:14
+#: django/contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "препратки"
+
+#: contrib/sessions/models.py:41
+#: django/contrib/sessions/models.py:41
+msgid "session key"
+msgstr "ключ на сесията"
+
+#: contrib/sessions/models.py:42
+#: django/contrib/sessions/models.py:42
+msgid "session data"
+msgstr "данни от сесията"
+
+#: contrib/sessions/models.py:43
+#: django/contrib/sessions/models.py:43
+msgid "expire date"
+msgstr "дата на валидност"
+
+#: contrib/sessions/models.py:48
+#: django/contrib/sessions/models.py:48
+msgid "session"
+msgstr "сесия"
+
+#: contrib/sessions/models.py:49
+#: django/contrib/sessions/models.py:49
+msgid "sessions"
+msgstr "сесии"
+
+#: contrib/sites/models.py:32
+#: django/contrib/sites/models.py:32
+msgid "domain name"
+msgstr "име на домейна"
+
+#: contrib/sites/models.py:33
+#: django/contrib/sites/models.py:33
+msgid "display name"
+msgstr "наименование"
+
+#: contrib/sites/models.py:37
+#: django/contrib/sites/models.py:37
+msgid "site"
+msgstr "сайт"
+
+#: contrib/sites/models.py:38
+#: django/contrib/sites/models.py:38
+msgid "sites"
+msgstr "сайтове"
+
+#: core/validators.py:72
+#: django/core/validators.py:72
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Тази стойност може да съдържа само букви, цифри и подчертавки.  "
+
+#: core/validators.py:76
+#: django/core/validators.py:76
+msgid "This value must contain only letters, numbers, underscores, dashes or slashes."
+msgstr "Тази стойност може да съдържа само букви, цифри, подчертавки, тиренца и наклонени чертички.  "
+
+#: core/validators.py:80
+#: django/core/validators.py:80
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "Тази стойност трябва да съдържа само букви, цифри, подчертавки или тиренца.  "
+
+#: core/validators.py:84
+#: django/core/validators.py:84
+msgid "Uppercase letters are not allowed here."
+msgstr "Тук не се допускат главни букви.  "
+
+#: core/validators.py:88
+#: django/core/validators.py:88
+msgid "Lowercase letters are not allowed here."
+msgstr "Тук не се допускат малки букви.  "
+
+#: core/validators.py:95
+#: django/core/validators.py:95
+msgid "Enter only digits separated by commas."
+msgstr "Въведете само цифри, разделени със запетая.  "
+
+#: core/validators.py:107
+#: django/core/validators.py:107
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Въведете валидни e-mail адреси разделени със запетая.  "
+
+#: core/validators.py:111
+#: django/core/validators.py:111
+msgid "Please enter a valid IP address."
+msgstr "Въведете валиден IP адрес.  "
+
+#: core/validators.py:115
+#: django/core/validators.py:115
+msgid "Empty values are not allowed here."
+msgstr "Тук не се допускат празни стойности.  "
+
+#: core/validators.py:119
+#: django/core/validators.py:119
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Тук не се допускат символи, които не са цифри.  "
+
+#: core/validators.py:123
+#: django/core/validators.py:123
+msgid "This value can't be comprised solely of digits."
+msgstr "Тази стойност не може да бъде само цифри.  "
+
+#: core/validators.py:128
+#: django/core/validators.py:128
+#: django/newforms/fields.py:151
+#: newforms/fields.py:151
+msgid "Enter a whole number."
+msgstr "Въведете цяло число.  "
+
+#: core/validators.py:132
+#: django/core/validators.py:132
+msgid "Only alphabetical characters are allowed here."
+msgstr "Само букви и цифри се допускат тук.  "
+
+#: core/validators.py:147
+#: django/core/validators.py:147
+msgid "Year must be 1900 or later."
+msgstr "Годината трябва да бъде от 1900 нагоре."
+
+#: core/validators.py:151
+#: django/core/validators.py:151
+#, python-format
+msgid "Invalid date: %s"
+msgstr "Невалидна дата: %s"
+
+#: core/validators.py:156
+#: db/models/fields/__init__.py:522
+#: django/core/validators.py:156
+#: django/db/models/fields/__init__.py:522
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Въведете валидна дата в формат ГГГГ-ММ-ДД."
+
+#: core/validators.py:161
+#: django/core/validators.py:161
+msgid "Enter a valid time in HH:MM format."
+msgstr "Въведете валиден час във формат ЧЧ:ММ.  "
+
+#: core/validators.py:165
+#: db/models/fields/__init__.py:599
+#: django/core/validators.py:165
+#: django/db/models/fields/__init__.py:599
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Въведете валидна дата и час в формат ГГГГ-ММ-ДД ЧЧ:ММ."
+
+#: core/validators.py:170
+#: django/core/validators.py:170
+#: django/newforms/fields.py:402
+#: newforms/fields.py:402
+msgid "Enter a valid e-mail address."
+msgstr "Въведете валиден e-mail адрес.  "
+
+#: core/validators.py:182
+#: core/validators.py:474
+#: django/core/validators.py:182
+#: django/core/validators.py:474
+#: django/newforms/fields.py:432
+#: django/oldforms/__init__.py:687
+#: newforms/fields.py:432
+#: oldforms/__init__.py:687
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Не е получен файл.  Проверете типът кодиране на формата.  "
+
+#: core/validators.py:193
+#: django/core/validators.py:193
+#: django/newforms/fields.py:458
+#: newforms/fields.py:458
+msgid "Upload a valid image. The file you uploaded was either not an image or a corrupted image."
+msgstr "Качете валидна картинка.  Файлът, който сте качили или не е картинка или е развалена.  "
+
+#: core/validators.py:200
+#: django/core/validators.py:200
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "URL %s не сочи към валидна картинка.  "
+
+#: core/validators.py:204
+#: django/core/validators.py:204
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "Телефонните номера трябва да бъдат във формат XXX-XXX-XXXX. \"%s\" не е валиден.  "
+
+#: core/validators.py:212
+#: django/core/validators.py:212
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "URL %s не сочи към валиден QuickTime видео клип."
+
+#: core/validators.py:216
+#: django/core/validators.py:216
+msgid "A valid URL is required."
+msgstr "Изисква се валиден URL."
+
+#: core/validators.py:230
+#: django/core/validators.py:230
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Изисква се валиден HTML. Конкретните грешки са:\n"
+"%s"
+
+#: core/validators.py:237
+#: django/core/validators.py:237
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Неправилно форматиран XML: %s"
+
+#: core/validators.py:254
+#: django/core/validators.py:254
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Невалиден URL: %s"
+
+#: core/validators.py:259
+#: core/validators.py:261
+#: django/core/validators.py:259
+#: django/core/validators.py:261
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "Този URL %s е счупен линк.  "
+
+#: core/validators.py:267
+#: django/core/validators.py:267
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Въведете валидно съкращение на американски щат.  "
+
+#: core/validators.py:281
+#: django/core/validators.py:281
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgstr "Ей-шш! Думичката %s не е позволена тук.  "
+
+#: core/validators.py:288
+#: django/core/validators.py:288
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Това поле трябва да съвпада с полето '%s' ."
+
+#: core/validators.py:307
+#: django/core/validators.py:307
+msgid "Please enter something for at least one field."
+msgstr "Въведете нещичко поне за едното поле.  "
+
+#: core/validators.py:316
+#: core/validators.py:327
+#: django/core/validators.py:316
+#: django/core/validators.py:327
+msgid "Please enter both fields or leave them both empty."
+msgstr "Или въведете и двете полета или ги оставете празни."
+
+#: core/validators.py:335
+#: django/core/validators.py:335
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Това поле трябва да е зададено ако %(field)s е %(value)s"
+
+#: core/validators.py:348
+#: django/core/validators.py:348
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Това поле трябва да е зададено ако %(field)s не е %(value)s"
+
+#: core/validators.py:367
+#: django/core/validators.py:367
+msgid "Duplicate values are not allowed."
+msgstr "Не са позволени стойности, които се повтарят.  "
+
+#: core/validators.py:382
+#: django/core/validators.py:382
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Тази стойност трябва да бъде между %(lower)s и %(upper)s."
+
+#: core/validators.py:384
+#: django/core/validators.py:384
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Тази стойност трябва да бъде поне %s.  "
+
+#: core/validators.py:386
+#: django/core/validators.py:386
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Тази стойност не трябва да надвишава %s."
+
+#: core/validators.py:427
+#: django/core/validators.py:427
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Тази стойност трябва да е точна степен на %s."
+
+#: core/validators.py:437
+#: django/core/validators.py:437
+msgid "Please enter a valid decimal number."
+msgstr "Въведете валидна десетична дроб.  "
+
+#: core/validators.py:444
+#: django/core/validators.py:444
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit.Please enter a valid decimal number with at most %s total digits."
+msgstr "Въведете валидна десетична дроб с не-повече от %s цифра. Въведете валидна десетична дроб с не-повече от %s цифра."
+
+#: core/validators.py:447
+#: django/core/validators.py:447
+#, python-format
+msgid "Please enter a valid decimal number with a whole part of at most %s digit.Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr "Въведете валидна десетична дроб, цялата част на която да не надхвърля %s цифра.Въведете валидна десетична дроб, цялата част на която да не надхвърля %s цифри.  "
+
+#: core/validators.py:450
+#: django/core/validators.py:450
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place.Please enter a valid decimal number with at most %s decimal places."
+msgstr "Въведете валидна десетична дроб с не-повече от %s цифра след десетичната точка.Въведете валидна десетична дроб с не-повече от %s цифри след десетичната точка.  "
+
+#: core/validators.py:458
+#: django/core/validators.py:458
+msgid "Please enter a valid floating point number."
+msgstr "Въведете валидно число с плаваща зашетая."
+
+#: core/validators.py:467
+#: django/core/validators.py:467
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Файлът, който сте качили трябва да бъде поне %s байта."
+
+#: core/validators.py:468
+#: django/core/validators.py:468
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Размерът на файла, който сте качили не трябва да надхвърля %s байта.  "
+
+#: core/validators.py:485
+#: django/core/validators.py:485
+msgid "The format for this field is wrong."
+msgstr "Форматът на това поле е грешен."
+
+#: core/validators.py:500
+#: django/core/validators.py:500
+msgid "This field is invalid."
+msgstr "Това поле не е валидно"
+
+#: core/validators.py:536
+#: django/core/validators.py:536
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Не получихме нищо от %s."
+
+#: core/validators.py:539
+#: django/core/validators.py:539
+#, python-format
+msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "URL %(url)s върна невалиден Content-Type хедър '%(contenttype)s'."
+
+#: core/validators.py:572
+#: django/core/validators.py:572
+#, python-format
+msgid "Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with \"%(start)s\".)"
+msgstr "Затворете тага %(tag)s , който е отворен на ред %(line)s. (Редът започва с \"%(start)s\".)"
+
+#: core/validators.py:576
+#: django/core/validators.py:576
+#, python-format
+msgid "Some text starting on line %(line)s is not allowed in that context. (Line starts with \"%(start)s\".)"
+msgstr "Некъв текст на ред %(line)s не е позволен в този контекст. (Редът започва с \"%(start)s\".)"
+
+#: core/validators.py:581
+#: django/core/validators.py:581
+#, python-format
+msgid "\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%(start)s\".)"
+msgstr "\"%(attr)s\" на ред %(line)s е невалиден атрибут. (Редът започва с \"%(start)s\".)"
+
+#: core/validators.py:586
+#: django/core/validators.py:586
+#, python-format
+msgid "\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%(start)s\".)"
+msgstr "\"<%(tag)s>\" на ред %(line)s е невалиден таг. (Редът започва с \"%(start)s\".)"
+
+#: core/validators.py:590
+#: django/core/validators.py:590
+#, python-format
+msgid "A tag on line %(line)s is missing one or more required attributes. (Line starts with \"%(start)s\".)"
+msgstr "На някой от таговете на ред %(line)s му липсват един или повече задължителни атрибута. (Редът започва с \"%(start)s\".)"
+
+#: core/validators.py:595
+#: django/core/validators.py:595
+#, python-format
+msgid "The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line starts with \"%(start)s\".)"
+msgstr "Атрибутът \"%(attr)s\" на ред %(line)s има невалидна стойност. (Редът започва с \"%(start)s\".)"
+
+#: db/models/manipulators.py:308
+#: django/db/models/manipulators.py:308
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(object)s с този %(type)s вече съществува за зададеното %(field)s.s"
+
+#: db/models/fields/__init__.py:52
+#: django/db/models/fields/__init__.py:52
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s с този %(fieldname)s вече съществува."
+
+#: db/models/fields/__init__.py:161
+#: db/models/fields/__init__.py:322
+#: db/models/fields/__init__.py:754
+#: db/models/fields/__init__.py:765
+#: django/db/models/fields/__init__.py:161
+#: django/db/models/fields/__init__.py:322
+#: django/db/models/fields/__init__.py:754
+#: django/db/models/fields/__init__.py:765
+#: django/newforms/fields.py:45
+#: django/oldforms/__init__.py:374
+#: newforms/fields.py:45
+#: oldforms/__init__.py:374
+msgid "This field is required."
+msgstr "Това поле е задължително."
+
+#: db/models/fields/__init__.py:422
+#: django/db/models/fields/__init__.py:422
+msgid "This value must be an integer."
+msgstr "Тази стойност трябва да бъде цяло число"
+
+#: db/models/fields/__init__.py:461
+#: django/db/models/fields/__init__.py:461
+msgid "This value must be either True or False."
+msgstr "Тази стойност трябва да бъде True или False."
+
+#: db/models/fields/__init__.py:485
+#: django/db/models/fields/__init__.py:485
+msgid "This field cannot be null."
+msgstr "Това поле не може да има празна стойност."
+
+#: db/models/fields/__init__.py:663
+#: django/db/models/fields/__init__.py:663
+msgid "This value must be a decimal number."
+msgstr "Тази стойност трябва да бъде число с плаваща запетая."
+
+#: db/models/fields/__init__.py:774
+#: django/db/models/fields/__init__.py:774
+msgid "Enter a valid filename."
+msgstr "Въведете валидно име на файл."
+
+#: db/models/fields/__init__.py:945
+#: django/db/models/fields/__init__.py:945
+msgid "This value must be either None, True or False."
+msgstr "Тази стойност трябва да бъде None, True, или False."
+
+#: db/models/fields/related.py:55
+#: django/db/models/fields/related.py:55
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Въведете валиден %s."
+
+#: db/models/fields/related.py:658
+#: django/db/models/fields/related.py:658
+msgid "Separate multiple IDs with commas."
+msgstr "Множество ID-та се разделят с запетайки"
+
+#: db/models/fields/related.py:660
+#: django/db/models/fields/related.py:660
+msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "Задръжте натиснат клавиша \"Control\" (или \"Command\" на Mac-а) за да направите повече от един избор.  "
+
+#: db/models/fields/related.py:707
+#: django/db/models/fields/related.py:707
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid.Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr "Въведете валидни %(self)s ID-та. Стойността %(value)r не е валидна."
+
+#: django/newforms/fields.py:46
+#: newforms/fields.py:46
+msgid "Enter a valid value."
+msgstr "Въведете валидна стойност.  "
+
+#: django/newforms/fields.py:123
+#: newforms/fields.py:123
+#, python-format
+msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+msgstr "Уверете се, че стойността съдържа максимално %(max)d символа (в момента %(length)d)."
+
+#: django/newforms/fields.py:124
+#: newforms/fields.py:124
+#, python-format
+msgid "Ensure this value has at least %(min)d characters (it has %(length)d)."
+msgstr "Уверете се, че тази стойност съдържа поне %(min)d символа (в момента %(length)d)."
+
+#: django/newforms/fields.py:152
+#: django/newforms/fields.py:181
+#: django/newforms/fields.py:210
+#: newforms/fields.py:152
+#: newforms/fields.py:181
+#: newforms/fields.py:210
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Тази стойност трябва да е по-малка или равна на %s.  "
+
+#: django/newforms/fields.py:153
+#: django/newforms/fields.py:182
+#: django/newforms/fields.py:211
+#: newforms/fields.py:153
+#: newforms/fields.py:182
+#: newforms/fields.py:211
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Тази стойност трябва да е по-голяма или равна на %s."
+
+#: django/newforms/fields.py:180
+#: django/newforms/fields.py:209
+#: newforms/fields.py:180
+#: newforms/fields.py:209
+msgid "Enter a number."
+msgstr "Въведечисло."
+
+#: django/newforms/fields.py:212
+#: newforms/fields.py:212
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr "Уверете си че не сте въвели повече от %s цифри."
+
+#: django/newforms/fields.py:213
+#: newforms/fields.py:213
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr "Уверете се, че няма повече от %s знака след запетаята."
+
+#: django/newforms/fields.py:214
+#: newforms/fields.py:214
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr "Уверете се, че няма повече от %s цифри преди десетичната запетая."
+
+#: django/newforms/fields.py:262
+#: django/newforms/fields.py:723
+#: newforms/fields.py:262
+#: newforms/fields.py:723
+msgid "Enter a valid date."
+msgstr "Въведете валидна дата.  "
+
+#: django/newforms/fields.py:295
+#: django/newforms/fields.py:724
+#: newforms/fields.py:295
+#: newforms/fields.py:724
+msgid "Enter a valid time."
+msgstr "Въведете валиден час."
+
+#: django/newforms/fields.py:334
+#: newforms/fields.py:334
+msgid "Enter a valid date/time."
+msgstr "Въведете валидна дата / час.  "
+
+#: django/newforms/fields.py:433
+#: newforms/fields.py:433
+msgid "No file was submitted."
+msgstr "Няма изпратен фаил."
+
+#: django/newforms/fields.py:434
+#: django/oldforms/__init__.py:689
+#: newforms/fields.py:434
+#: oldforms/__init__.py:689
+msgid "The submitted file is empty."
+msgstr "Каченият файл е празен.  "
+
+#: django/newforms/fields.py:496
+#: newforms/fields.py:496
+msgid "Enter a valid URL."
+msgstr "Въведете валиден URL.  "
+
+#: django/newforms/fields.py:497
+#: newforms/fields.py:497
+msgid "This URL appears to be a broken link."
+msgstr "Този URL май е счупен линк.  "
+
+#: django/newforms/fields.py:559
+#: django/newforms/models.py:300
+#: newforms/fields.py:559
+#: newforms/models.py:300
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Направете валиден избор.  Този не е един от възможните избори.  "
+
+#: django/newforms/fields.py:598
+#: newforms/fields.py:598
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "Направете валиден избор. %(value)s не е един от възможните избори."
+
+#: django/newforms/fields.py:599
+#: django/newforms/fields.py:661
+#: django/newforms/models.py:360
+#: newforms/fields.py:599
+#: newforms/fields.py:661
+#: newforms/models.py:360
+msgid "Enter a list of values."
+msgstr "Въведете списък от стойности"
+
+#: django/newforms/fields.py:752
+#: newforms/fields.py:752
+msgid "Enter a valid IPv4 address."
+msgstr "Въведете валиден IPv4 адрес."
+
+#: django/newforms/models.py:361
+#: newforms/models.py:361
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Направете валиден избор.  %s не е един от възможните избори.  "
+
+#: django/oldforms/__init__.py:409
+#: oldforms/__init__.py:409
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgstr "Въведеният текст не трябва да надвишава %s символа."
+
+#: django/oldforms/__init__.py:414
+#: oldforms/__init__.py:414
+msgid "Line breaks are not allowed here."
+msgstr "Тук не се допускат нови редове."
+
+#: django/oldforms/__init__.py:512
+#: django/oldforms/__init__.py:586
+#: django/oldforms/__init__.py:625
+#: oldforms/__init__.py:512
+#: oldforms/__init__.py:586
+#: oldforms/__init__.py:625
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Направете валиден избор; '%(data)s' не е сред %(choices)s."
+
+#: django/oldforms/__init__.py:745
+#: oldforms/__init__.py:745
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Въведете цяло число между -32768 и 32767."
+
+#: django/oldforms/__init__.py:755
+#: oldforms/__init__.py:755
+msgid "Enter a positive number."
+msgstr "Въведете положително число.  "
+
+#: django/oldforms/__init__.py:765
+#: oldforms/__init__.py:765
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Въведете цяло число между 0 и 32767."
+
+#: django/template/defaultfilters.py:695
+#: template/defaultfilters.py:691
+msgid "yes,no,maybe"
+msgstr "да,не,може-би"
+
+#: django/template/defaultfilters.py:726
+#: template/defaultfilters.py:722
+#, python-format
+msgid "%(size)d byte"
+msgstr "%(size)d байт"
+
+#: django/template/defaultfilters.py:728
+#: template/defaultfilters.py:724
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f КБ"
+
+#: django/template/defaultfilters.py:730
+#: template/defaultfilters.py:726
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f МБ"
+
+#: django/template/defaultfilters.py:731
+#: template/defaultfilters.py:727
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f ГБ"
+
+#: django/utils/dateformat.py:41
+#: utils/dateformat.py:41
+msgid "p.m."
+msgstr "p.m."
+
+#: django/utils/dateformat.py:42
+#: utils/dateformat.py:42
+msgid "a.m."
+msgstr "a.m."
+
+#: django/utils/dateformat.py:47
+#: utils/dateformat.py:47
+msgid "PM"
+msgstr "PM"
+
+#: django/utils/dateformat.py:48
+#: utils/dateformat.py:48
+msgid "AM"
+msgstr "AM"
+
+#: django/utils/dateformat.py:97
+#: utils/dateformat.py:97
+msgid "midnight"
+msgstr "полунощ"
+
+#: django/utils/dateformat.py:99
+#: utils/dateformat.py:99
+msgid "noon"
+msgstr "обяд"
+
+#: django/utils/dates.py:6
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "понеделник"
+
+#: django/utils/dates.py:6
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "вторник"
+
+#: django/utils/dates.py:6
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "сряда"
+
+#: django/utils/dates.py:6
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "четвъртък"
+
+#: django/utils/dates.py:6
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "петък"
+
+#: django/utils/dates.py:7
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "събота"
+
+#: django/utils/dates.py:7
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "неделя"
+
+#: django/utils/dates.py:10
+#: utils/dates.py:10
+msgid "Mon"
+msgstr "Пон"
+
+#: django/utils/dates.py:10
+#: utils/dates.py:10
+msgid "Tue"
+msgstr "Вто"
+
+#: django/utils/dates.py:10
+#: utils/dates.py:10
+msgid "Wed"
+msgstr "Сря"
+
+#: django/utils/dates.py:10
+#: utils/dates.py:10
+msgid "Thu"
+msgstr "Чет"
+
+#: django/utils/dates.py:10
+#: utils/dates.py:10
+msgid "Fri"
+msgstr "Пет"
+
+#: django/utils/dates.py:11
+#: utils/dates.py:11
+msgid "Sat"
+msgstr "Съб"
+
+#: django/utils/dates.py:11
+#: utils/dates.py:11
+msgid "Sun"
+msgstr "Нед"
+
+#: django/utils/dates.py:18
+#: utils/dates.py:18
+msgid "January"
+msgstr "Януари"
+
+#: django/utils/dates.py:18
+#: utils/dates.py:18
+msgid "February"
+msgstr "Февруари"
+
+#: django/utils/dates.py:18
+#: django/utils/dates.py:31
+#: utils/dates.py:18
+#: utils/dates.py:31
+msgid "March"
+msgstr "Март"
+
+#: django/utils/dates.py:18
+#: django/utils/dates.py:31
+#: utils/dates.py:18
+#: utils/dates.py:31
+msgid "April"
+msgstr "Април"
+
+#: django/utils/dates.py:18
+#: django/utils/dates.py:31
+#: utils/dates.py:18
+#: utils/dates.py:31
+msgid "May"
+msgstr "Май"
+
+#: django/utils/dates.py:18
+#: django/utils/dates.py:31
+#: utils/dates.py:18
+#: utils/dates.py:31
+msgid "June"
+msgstr "Юни"
+
+#: django/utils/dates.py:19
+#: django/utils/dates.py:31
+#: utils/dates.py:19
+#: utils/dates.py:31
+msgid "July"
+msgstr "Юли"
+
+#: django/utils/dates.py:19
+#: utils/dates.py:19
+msgid "August"
+msgstr "Август"
+
+#: django/utils/dates.py:19
+#: utils/dates.py:19
+msgid "September"
+msgstr "Септември"
+
+#: django/utils/dates.py:19
+#: utils/dates.py:19
+msgid "October"
+msgstr "Октомври"
+
+#: django/utils/dates.py:19
+#: utils/dates.py:19
+msgid "November"
+msgstr "Ноември"
+
+#: django/utils/dates.py:20
+#: utils/dates.py:20
+msgid "December"
+msgstr "Декември"
+
+#: django/utils/dates.py:23
+#: utils/dates.py:23
+msgid "jan"
+msgstr "яну"
+
+#: django/utils/dates.py:23
+#: utils/dates.py:23
+msgid "feb"
+msgstr "фев"
+
+#: django/utils/dates.py:23
+#: utils/dates.py:23
+msgid "mar"
+msgstr "мар"
+
+#: django/utils/dates.py:23
+#: utils/dates.py:23
+msgid "apr"
+msgstr "апр"
+
+#: django/utils/dates.py:23
+#: utils/dates.py:23
+msgid "may"
+msgstr "май"
+
+#: django/utils/dates.py:23
+#: utils/dates.py:23
+msgid "jun"
+msgstr "юни"
+
+#: django/utils/dates.py:24
+#: utils/dates.py:24
+msgid "jul"
+msgstr "юли"
+
+#: django/utils/dates.py:24
+#: utils/dates.py:24
+msgid "aug"
+msgstr "авг"
+
+#: django/utils/dates.py:24
+#: utils/dates.py:24
+msgid "sep"
+msgstr "сеп"
+
+#: django/utils/dates.py:24
+#: utils/dates.py:24
+msgid "oct"
+msgstr "окт"
+
+#: django/utils/dates.py:24
+#: utils/dates.py:24
+msgid "nov"
+msgstr "ное"
+
+#: django/utils/dates.py:24
+#: utils/dates.py:24
+msgid "dec"
+msgstr "дек"
+
+#: django/utils/dates.py:31
+#: utils/dates.py:31
+msgid "Jan."
+msgstr "Яну."
+
+#: django/utils/dates.py:31
+#: utils/dates.py:31
+msgid "Feb."
+msgstr "Фев."
+
+#: django/utils/dates.py:32
+#: utils/dates.py:32
+msgid "Aug."
+msgstr "Авг."
+
+#: django/utils/dates.py:32
+#: utils/dates.py:32
+msgid "Sept."
+msgstr "Септ."
+
+#: django/utils/dates.py:32
+#: utils/dates.py:32
+msgid "Oct."
+msgstr "Окт."
+
+#: django/utils/dates.py:32
+#: utils/dates.py:32
+msgid "Nov."
+msgstr "Ное."
+
+#: django/utils/dates.py:32
+#: utils/dates.py:32
+msgid "Dec."
+msgstr "Дек."
+
+#: django/utils/text.py:127
+#: utils/text.py:127
+msgid "or"
+msgstr "или"
+
+#: django/utils/timesince.py:21
+#: utils/timesince.py:21
+msgid "year"
+msgstr "година"
+
+#: django/utils/timesince.py:22
+#: utils/timesince.py:22
+msgid "month"
+msgstr "месец"
+
+#: django/utils/timesince.py:23
+#: utils/timesince.py:23
+msgid "week"
+msgstr "седмица"
+
+#: django/utils/timesince.py:24
+#: utils/timesince.py:24
+msgid "day"
+msgstr "ден"
+
+#: django/utils/timesince.py:25
+#: utils/timesince.py:25
+msgid "hour"
+msgstr "час"
+
+#: django/utils/timesince.py:26
+#: utils/timesince.py:26
+msgid "minute"
+msgstr "минута"
+
+#: django/utils/timesince.py:46
+#: utils/timesince.py:46
+msgid "minutes"
+msgstr "минути"
+
+#: django/utils/timesince.py:51
+#: utils/timesince.py:51
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr "%(number)d %(type)s"
+
+#: django/utils/timesince.py:57
+#: utils/timesince.py:57
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ", %(number)d %(type)s"
+
+#: django/utils/translation/trans_real.py:404
+#: utils/translation/trans_real.py:404
+msgid "DATE_FORMAT"
+msgstr "j N, Y"
+
+#: django/utils/translation/trans_real.py:405
+#: utils/translation/trans_real.py:405
+msgid "DATETIME_FORMAT"
+msgstr "j N, Y, P"
+
+#: django/utils/translation/trans_real.py:406
+#: utils/translation/trans_real.py:406
+msgid "TIME_FORMAT"
+msgstr "P"
+
+#: django/utils/translation/trans_real.py:422
+#: utils/translation/trans_real.py:422
+msgid "YEAR_MONTH_FORMAT"
+msgstr "F Y"
+
+#: django/utils/translation/trans_real.py:423
+#: utils/translation/trans_real.py:423
+msgid "MONTH_DAY_FORMAT"
+msgstr "j F"
+
+#: django/views/generic/create_update.py:43
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "Обектът %(verbose_name)s бе успешно създаден.  "
+
+#: django/views/generic/create_update.py:117
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "Обектът %(verbose_name)s бе успешно актуализиран."
+
+#: django/views/generic/create_update.py:184
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "Обектът %(verbose_name)s бе затрит."
+
+#: tests/regressiontests/i18n/models.py:5
+msgid "Anything"
+msgstr "Нещо"
+
+#: tests/regressiontests/views/tests/i18n.py:26
+msgid "this is to be translated"
+msgstr "това трябва да се преведе"
+
+#~ msgid ""
+#~ "Enter a postcode. A space is required between the two postcode parts."
+#~ msgstr ""
+#~ "Въведете пощенски код.  Между двете части на пощенския код трябва да има "
+#~ "разстояние.  "
+
diff --git a/webapp/django/conf/locale/bg/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/bg/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..dba4555
--- /dev/null
+++ b/webapp/django/conf/locale/bg/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/bg/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/bg/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..9f5f197
--- /dev/null
+++ b/webapp/django/conf/locale/bg/LC_MESSAGES/djangojs.po
@@ -0,0 +1,106 @@
+# translation of djangojs.po to Bulgarian
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-12-09 11:51+0100\n"
+"PO-Revision-Date: 2007-05-12 17:51+0300\n"
+"Last-Translator: Jordan Dimov <s3x3y1@gmail.com>\n"
+"Language-Team: Bulgarian\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "Налични %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Избери всички"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Добави"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Премахни"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Избрахме %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Направете своя избор и щракнете "
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Изчисти всички"
+
+#: contrib/admin/media/js/dateparse.js:26
+#: contrib/admin/media/js/calendar.js:24
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr "Януари Февруари Март Април Май Юни Юли Август Септември Октомври Ноември Декември"
+
+#: contrib/admin/media/js/dateparse.js:27
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Неделя Понеделник Вторник Сряда Четвъртък Петък Събота"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "Н П В С Ч П С"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "Сега"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "Часовник"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "Избери време"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "Полунощ"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "6 a.m."
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "По обяд"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "Отказ"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "Днес"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "Календар"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "Вчера"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "Утре"
+
diff --git a/webapp/django/conf/locale/bn/LC_MESSAGES/django.mo b/webapp/django/conf/locale/bn/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..b4fdb8e
--- /dev/null
+++ b/webapp/django/conf/locale/bn/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/bn/LC_MESSAGES/django.po b/webapp/django/conf/locale/bn/LC_MESSAGES/django.po
new file mode 100644
index 0000000..0a23ba7
--- /dev/null
+++ b/webapp/django/conf/locale/bn/LC_MESSAGES/django.po
@@ -0,0 +1,1993 @@
+# django.po -- Bengali (bn) translation of Django core
+# Copyright (C) 2005 Django Authors
+# This file is distributed under the same license as the Django package.
+# Baishampayan Ghose <b.ghose@gnu.org.in>, 2005.
+# 
+# 
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-05-16 10:12+0200\n"
+"PO-Revision-Date: 2005-11-12 20:05+0530\n"
+"Last-Translator: Baishampayan Ghose <b.ghose@gnu.org.in>\n"
+"Language-Team: Ankur Bangla <core@bengalinux.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+#, fuzzy
+msgid "object ID"
+msgstr "বস্তু আই.ডি."
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr ""
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+#, fuzzy
+msgid "comment"
+msgstr "অভ্যন্তরস্থ বস্তু"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr ""
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr ""
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr ""
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr ""
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr ""
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr ""
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr ""
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr ""
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr ""
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr ""
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr ""
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289
+#, fuzzy
+msgid "IP address"
+msgstr "ই-মেল ঠিকানা"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr ""
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+
+#: contrib/comments/models.py:91
+#, fuzzy
+msgid "comments"
+msgstr "অভ্যন্তরস্থ বস্তু"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+#, fuzzy
+msgid "Content object"
+msgstr "অভ্যন্তরস্থ বস্তু ধরন"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+
+#: contrib/comments/models.py:168
+#, fuzzy
+msgid "person's name"
+msgstr "প্রথম নাম"
+
+#: contrib/comments/models.py:171
+#, fuzzy
+msgid "ip address"
+msgstr "ই-মেল ঠিকানা"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr ""
+
+#: contrib/comments/models.py:176
+#, fuzzy
+msgid "free comment"
+msgstr "মন্তব্য সক্রিয় করুন"
+
+#: contrib/comments/models.py:177
+#, fuzzy
+msgid "free comments"
+msgstr "মন্তব্য সক্রিয় করুন"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr ""
+
+#: contrib/comments/models.py:234
+#, fuzzy
+msgid "score date"
+msgstr "শেষ তারিখ"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr ""
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr ""
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr ""
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+
+#: contrib/comments/models.py:265
+#, fuzzy
+msgid "flag date"
+msgstr "চ্যাপ্টা পাতা"
+
+#: contrib/comments/models.py:268
+#, fuzzy
+msgid "user flag"
+msgstr "ব্যবহারকারী"
+
+#: contrib/comments/models.py:269
+#, fuzzy
+msgid "user flags"
+msgstr "ব্যবহারকারী"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr ""
+
+#: contrib/comments/models.py:278
+#, fuzzy
+msgid "deletion date"
+msgstr "অধিবেশন তথ্য"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr ""
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr ""
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr ""
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr ""
+
+#: contrib/comments/views/karma.py:23
+#, fuzzy
+msgid "Invalid comment ID"
+msgstr "মন্তব্য সক্রিয় করুন"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr ""
+
+#: contrib/comments/views/comments.py:28
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr ""
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr ""
+
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr ""
+
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr ""
+
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "ব্যবহারকারীর নাম:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "পাসওয়ার্ড:"
+
+#: contrib/comments/templates/comments/form.html:6
+#, fuzzy
+msgid "Forgotten your password?"
+msgstr "আমার পাসওয়ার্ড পরিবর্তন করুন"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr "বাইরে যান"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:27
+#: contrib/comments/templates/comments/freeform.html:5
+#, fuzzy
+msgid "Comment:"
+msgstr "মন্তব্য সক্রিয় করুন"
+
+#: contrib/comments/templates/comments/form.html:32
+#: contrib/comments/templates/comments/freeform.html:9
+#, fuzzy
+msgid "Preview comment"
+msgstr "মন্তব্য সক্রিয় করুন"
+
+#: contrib/comments/templates/comments/freeform.html:4
+#, fuzzy
+msgid "Your name:"
+msgstr "ব্যবহারকারীর নাম"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143
+msgid "All"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:110
+#, fuzzy
+msgid "Today"
+msgstr "সোমবার"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:143
+#, fuzzy
+msgid "No"
+msgstr "নভে."
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr ""
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "কাজের সময়"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "বস্তু আই.ডি."
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "বস্তু repr"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "কাজের ফ্ল্যাগ"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "বার্তা পরিবর্তন"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "কার্যবিবরণী এন্ট্রি"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "কার্যবিবরণী এন্ট্রি সমুহ"
+
+#: contrib/admin/templatetags/admin_list.py:228
+msgid "All dates"
+msgstr ""
+
+#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36
+#: contrib/auth/forms.py:41
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+
+#: contrib/admin/views/decorators.py:23
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "প্রবেশ করুন"
+
+#: contrib/admin/views/decorators.py:61
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+
+#: contrib/admin/views/decorators.py:68
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+
+#: contrib/admin/views/decorators.py:82
+msgid "Usernames cannot contain the '@' character."
+msgstr ""
+
+#: contrib/admin/views/decorators.py:84
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr ""
+
+#: contrib/admin/views/main.py:226
+#, fuzzy
+msgid "Site administration"
+msgstr "জ্যাঙ্গো পরিচালনা"
+
+#: contrib/admin/views/main.py:260
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr ""
+
+#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
+msgid "You may edit it again below."
+msgstr ""
+
+#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#, python-format
+msgid "You may add another %s below."
+msgstr ""
+
+#: contrib/admin/views/main.py:290
+#, fuzzy, python-format
+msgid "Add %s"
+msgstr "যোগ করুন"
+
+#: contrib/admin/views/main.py:336
+#, python-format
+msgid "Added %s."
+msgstr ""
+
+#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:340
+msgid "and"
+msgstr ""
+
+#: contrib/admin/views/main.py:338
+#, fuzzy, python-format
+msgid "Changed %s."
+msgstr "পরিবর্তন"
+
+#: contrib/admin/views/main.py:340
+#, python-format
+msgid "Deleted %s."
+msgstr ""
+
+#: contrib/admin/views/main.py:343
+msgid "No fields changed."
+msgstr ""
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr ""
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+
+#: contrib/admin/views/main.py:392
+#, fuzzy, python-format
+msgid "Change %s"
+msgstr "পরিবর্তন"
+
+#: contrib/admin/views/main.py:470
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr ""
+
+#: contrib/admin/views/main.py:475
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr ""
+
+#: contrib/admin/views/main.py:508
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr ""
+
+#: contrib/admin/views/main.py:511
+msgid "Are you sure?"
+msgstr ""
+
+#: contrib/admin/views/main.py:533
+#, fuzzy, python-format
+msgid "Change history: %s"
+msgstr "পাসওয়ার্ড পরিবর্তন করুন"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s"
+msgstr ""
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s to change"
+msgstr ""
+
+#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286
+#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297
+msgid "Integer"
+msgstr ""
+
+#: contrib/admin/views/doc.py:278
+msgid "Boolean (Either True or False)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:280
+msgid "Comma-separated integers"
+msgstr ""
+
+#: contrib/admin/views/doc.py:281
+#, fuzzy
+msgid "Date (without time)"
+msgstr "কাজের সময়"
+
+#: contrib/admin/views/doc.py:282
+#, fuzzy
+msgid "Date (with time)"
+msgstr "তারিখ/সময়"
+
+#: contrib/admin/views/doc.py:283
+#, fuzzy
+msgid "E-mail address"
+msgstr "ই-মেল ঠিকানা:"
+
+#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
+msgid "File path"
+msgstr ""
+
+#: contrib/admin/views/doc.py:285
+#, fuzzy
+msgid "Decimal number"
+msgstr "ডিসেম্বর"
+
+#: contrib/admin/views/doc.py:291
+msgid "Boolean (Either True, False or None)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:292
+msgid "Relation to parent model"
+msgstr ""
+
+#: contrib/admin/views/doc.py:293
+#, fuzzy
+msgid "Phone number"
+msgstr "একটি গোটা সংখ্যা ঢোকান।"
+
+#: contrib/admin/views/doc.py:298
+msgid "Text"
+msgstr ""
+
+#: contrib/admin/views/doc.py:299
+msgid "Time"
+msgstr ""
+
+#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "ইউ.আর.এল"
+
+#: contrib/admin/views/doc.py:301
+msgid "U.S. state (two uppercase letters)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:302
+msgid "XML text"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "পাসওয়ার্ড পরিবর্তন করুন"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "বাড়ি"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+msgid "History"
+msgstr "ইতিহাস"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "তারিখ/সময়"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "ব্যবহারকারী"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "কাজ"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "N j, Y, P"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"এই বস্তুটি একটি পরিবর্তন ইতিহাস নেই। এইটি এই অ্যাডমিন স্থান দ্বারা সম্ভবত যোগ করা "
+"হয় নি।"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "জ্যাঙ্গো স্থান অ্যাডমিন"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "জ্যাঙ্গো পরিচালনা"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "সার্ভার ত্রুটি"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "সার্ভার ত্রুটি (৫০০)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "সার্ভার ত্রুটি<em>(৫০০)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"একটি ত্রুটি আছে। এইটি স্থান পরিচালককে ই-মেল দ্বারা প্রতিবেদন করা হয়েছে এবং খুব "
+"তাড়াতাড়ি মেরামত করা হবে। আপনার ধৈর্য্যের জন্য ধন্যবাদ।"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "পাতা খুঁজে পাওয়া গেল না"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "আমরা দুঃখিত, কিন্তু আবেদনকৃত পাতা খুঁজে পাওয়া গেল না।"
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "যোগ করুন"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "পরিবর্তন"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "আপনার কোন কিছু সম্পাদনা করতে অনুমতি নেই।"
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "সাম্প্রতিক কাজ"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "আমার কাজ"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "কিছুই পাওয়া যাচ্ছে না"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, fuzzy, python-format
+msgid "Add %(name)s"
+msgstr "যোগ করুন"
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "আপনি কি <a href=\"/password_reset/\">আপনার পাসওয়ার্ড ভুলে গেছেন</a>?"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "স্বাগত,"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr ""
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(object)s' would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"%(object_name)s '%(object)s' মুছে ফেললে তা সম্পর্কিত বস্তুও মুছে ফেলা হবে কিন্তু "
+"আপনার অ্যাকাউন্টে বস্তুর নিম্নলিখিত ধরন মুছে ফেলার অনুমতি নেই:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
+"the following related items will be deleted:"
+msgstr ""
+"%(object_name)s\" %(object)s\" মুছে ফেলতে আপনি কি নিশ্চিত? নিম্নলিখিত সম্পর্কিত "
+"বস্তুর সব মুছে ফেলা হবে:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "হ্যাঁ, আমি নিশ্চিত"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(title)s "
+msgstr ""
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr ""
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr ""
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr ""
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr ""
+
+#: contrib/admin/templates/admin/submit_line.html:7
+#, fuzzy
+msgid "Save"
+msgstr "সক্রিয়"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "পাসওয়ার্ড পরিবর্তন"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "পাসওয়ার্ড পরিবর্তন সফল"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "আপনার পাসওয়ার্ড পরিবর্তন করা হয়েছিল।"
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "পাসওয়ার্ড রিসেট"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"আপনি কি আপনার পাসওয়ার্ড ভুলে গেছেন? আপনার ই-মেল ঠিকানা নিচে দিন এবং আমরা আপনার "
+"পাসওয়ার্ড রিসেট করে এবং আপনাকে নতুন এক পাসওয়ার্ড ই-মেল করে দেব।"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "ই-মেল ঠিকানা:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "আমার পাসওয়ার্ড রিসেট করুন"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "এই ওয়েব স্থানে আপনার কিছু সময় খরচ করার জন্য ধন্যবাদ।"
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "আবার প্রবেশ করুন"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "পাসওয়ার্ড রিসেট সফল"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"আমরা আপনাকে একটি নতুন পাসওয়ার্ড আপনার দেওয়া ই-মেল ঠিকানায় পাঠিয়ে দিয়েছি। আপনার "
+"তা খুব তাড়াতাড়ি পাওয়া উচিত।"
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"দয়া করে আপনার পুরনো পাসওয়ার্ড ঢোকান, নিরাপত্তার জন্য, এবংএর জন্য তারপর আপনার নতুন "
+"পাসওয়ার্ড দুবার ঢোকান যাতে আমরা সঠিকভাবেতে তার বৈধতা পরীক্ষণ করতে পারি।"
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "পুরনো পাসওয়ার্ড:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "নতুন পাসওয়ার্ড:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "পাসওয়ার্ড দৃঢ়তরভাবে প্রতিপন্ন করুন:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "আমার পাসওয়ার্ড পরিবর্তন করুন"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "আপনি এই ই-মেলটি পাচ্ছেন কারণ আপনি একটি পাসওয়ার্ড রিসেট অনুরোধ করেছেন"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "%(site_name)s আপনার ব্যবহারকারী অ্যাকাউন্টের জন্য"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "আপনার নতুন পাসওয়ার্ড: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "এই পাতাটিতে গিয়ে এই পাসওয়ার্ডটি পরিবর্তন করতে মুক্ত অনুভব করুন:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "আপনার ব্যবহারকারীর নাম, যদি আপনি ভুলে গিয়ে থাকেন:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "আমাদের স্থান ব্যবহার করার জন্য ধন্যবাদ!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s দল"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+#, fuzzy
+msgid "Show object ID"
+msgstr "বস্তু আই.ডি."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr ""
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr ""
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr ""
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr ""
+
+#: contrib/admin/templates/widget/file.html:3
+#, fuzzy
+msgid "Change:"
+msgstr "পরিবর্তন"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "রিডাইরেক্ট করা"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"এইটি একটি পরম পাথ হওয়া উচিত, ক্ষেত্র নাম বাদ দিয়ে। উদাহরণ: '/events/search / '।"
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "রিডাইরেক্ট কর"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"এইটি হয় একটি পরম পাথ হতে পারে  (যেমন উপরে) অথবা 'http:// এর সঙ্গে শুরু হওয়া "
+"একটি পূর্ণ ইউ.আর.এল ।"
+
+#: contrib/redirects/models.py:12
+msgid "redirect"
+msgstr "রিডাইরেক্ট"
+
+#: contrib/redirects/models.py:13
+msgid "redirects"
+msgstr "রিডাইরেক্ট করে"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"উদাহরণ: '/about/contact / '। প্রধান এবং অনুসরণ করা স্ল্যাশ যেন নিশ্চিত ভাবে থাকে।"
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "শিরোনাম"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "অভ্যন্তরস্থ বস্তু"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "মন্তব্য সক্রিয় করুন"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "ছাঁদ নাম"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
+"use 'flatpages/default'."
+msgstr ""
+"উদাহরণ: 'flatfiles/contact_page '। যদি এইটি দেওয়া না থাকে তাহলে সিস্টেম "
+"'flatfiles/default ব্যবহার করবে।"
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "নিবন্ধন প্রয়োজনীয়"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+"যদি এইটি টিক্ করা থাকে তাহলে শুধুমাত্র প্রবেশ করা ব্যবহারকারী পাতা দেখতে সক্ষম হবে।"
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "চ্যাপ্টা পাতা"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "চ্যাপ্টা পাতাগুলো"
+
+#: contrib/auth/models.py:13 contrib/auth/models.py:26
+msgid "name"
+msgstr "নাম"
+
+#: contrib/auth/models.py:15
+msgid "codename"
+msgstr "ছদ্বনাম"
+
+#: contrib/auth/models.py:17
+#, fuzzy
+msgid "permission"
+msgstr "অনুমতি"
+
+#: contrib/auth/models.py:18 contrib/auth/models.py:27
+#, fuzzy
+msgid "permissions"
+msgstr "অনুমতি"
+
+#: contrib/auth/models.py:29
+#, fuzzy
+msgid "group"
+msgstr "গ্রুপ"
+
+#: contrib/auth/models.py:30 contrib/auth/models.py:65
+#, fuzzy
+msgid "groups"
+msgstr "দল"
+
+#: contrib/auth/models.py:55
+msgid "username"
+msgstr "ব্যবহারকারীর নাম"
+
+#: contrib/auth/models.py:56
+msgid "first name"
+msgstr "প্রথম নাম"
+
+#: contrib/auth/models.py:57
+msgid "last name"
+msgstr "শেষ নাম"
+
+#: contrib/auth/models.py:58
+msgid "e-mail address"
+msgstr "ই-মেল ঠিকানা"
+
+#: contrib/auth/models.py:59
+msgid "password"
+msgstr "পাসওয়ার্ড"
+
+#: contrib/auth/models.py:59
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr ""
+
+#: contrib/auth/models.py:60
+msgid "staff status"
+msgstr " অবস্থা"
+
+#: contrib/auth/models.py:60
+msgid "Designates whether the user can log into this admin site."
+msgstr "নিশ্চয় করে যে ব্যবহারকারী এই অ্যাডমিন স্থানে প্রবেশ করতে পারে কিনা।"
+
+#: contrib/auth/models.py:61
+msgid "active"
+msgstr "সক্রিয়"
+
+#: contrib/auth/models.py:62
+msgid "superuser status"
+msgstr "সুপারইউজার অবস্থা"
+
+#: contrib/auth/models.py:63
+msgid "last login"
+msgstr "শেষ প্রবেশ"
+
+#: contrib/auth/models.py:64
+msgid "date joined"
+msgstr "যোগাদান করার তারিখ "
+
+#: contrib/auth/models.py:66
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"নিজ হাতে বরাদ্দকৃতে অনুমতি ছাড়া এই ব্যবহারকারীটি যে সব গ্রুপে আছে তার অনুমতিও পাবে।"
+
+#: contrib/auth/models.py:67
+#, fuzzy
+msgid "user permissions"
+msgstr "অনুমতি"
+
+#: contrib/auth/models.py:70
+#, fuzzy
+msgid "user"
+msgstr "ব্যবহারকারী"
+
+#: contrib/auth/models.py:71
+#, fuzzy
+msgid "users"
+msgstr "ব্যবহারকারী"
+
+#: contrib/auth/models.py:76
+msgid "Personal info"
+msgstr "ব্যক্তিগত তথ্য"
+
+#: contrib/auth/models.py:77
+msgid "Permissions"
+msgstr "অনুমতি"
+
+#: contrib/auth/models.py:78
+msgid "Important dates"
+msgstr "গুরুত্বপূর্ণ তারিখ"
+
+#: contrib/auth/models.py:79
+msgid "Groups"
+msgstr "দল"
+
+#: contrib/auth/models.py:219
+#, fuzzy
+msgid "message"
+msgstr "বার্তা"
+
+#: contrib/auth/forms.py:30
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+
+#: contrib/contenttypes/models.py:25
+#, fuzzy
+msgid "python model class name"
+msgstr "পাইথন মডিউলের নাম"
+
+#: contrib/contenttypes/models.py:28
+msgid "content type"
+msgstr "অভ্যন্তরস্থ বস্তু ধরন"
+
+#: contrib/contenttypes/models.py:29
+msgid "content types"
+msgstr "অভ্যন্তরস্থ বস্তু ধরন"
+
+#: contrib/sessions/models.py:35
+msgid "session key"
+msgstr "অধিবেশন চাবি"
+
+#: contrib/sessions/models.py:36
+msgid "session data"
+msgstr "অধিবেশন তথ্য"
+
+#: contrib/sessions/models.py:37
+msgid "expire date"
+msgstr "শেষ তারিখ"
+
+#: contrib/sessions/models.py:41
+msgid "session"
+msgstr "অধিবেশন"
+
+#: contrib/sessions/models.py:42
+msgid "sessions"
+msgstr "সেশন"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "ক্ষেত্র নাম"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "প্রদর্শিত নাম"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "স্থান"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "স্থান"
+
+#: utils/translation.py:360
+msgid "DATE_FORMAT"
+msgstr ""
+
+#: utils/translation.py:361
+msgid "DATETIME_FORMAT"
+msgstr ""
+
+#: utils/translation.py:362
+msgid "TIME_FORMAT"
+msgstr ""
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "সোমবার"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "মঙ্গলবার"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "বুধবার"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "বৃহস্পতিবার"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "শুক্রবার"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "শনিবার"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "রবিবার"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "জানুয়ারী"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "ফেব্রুয়ারী"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "মার্চ"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "এপ্রিল"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "মে"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "জুন"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "জুলাই"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "অগাস্ট"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "সেপ্টেম্বর"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "অক্টোবর"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "নভেম্বর"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "ডিসেম্বর"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr ""
+
+#: utils/dates.py:19
+#, fuzzy
+msgid "may"
+msgstr "মে"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr ""
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "জানু."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "ফেব্রু"
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "অগা."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "সেপ্টে."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "অক্টো."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "নভে."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "ডিসে."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:15
+#, fuzzy
+msgid "day"
+msgid_plural "days"
+msgstr[0] "মে"
+msgstr[1] "মে"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:17
+#, fuzzy
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "স্থান"
+msgstr[1] "স্থান"
+
+#: conf/global_settings.py:37
+msgid "Bengali"
+msgstr "বাংলা"
+
+#: conf/global_settings.py:38
+msgid "Czech"
+msgstr "চেক"
+
+#: conf/global_settings.py:39
+msgid "Welsh"
+msgstr "ওয়েল্শ"
+
+#: conf/global_settings.py:40
+#, fuzzy
+msgid "Danish"
+msgstr "স্প্যানিশ"
+
+#: conf/global_settings.py:41
+msgid "German"
+msgstr "জার্মান"
+
+#: conf/global_settings.py:42
+msgid "Greek"
+msgstr ""
+
+#: conf/global_settings.py:43
+msgid "English"
+msgstr "ইংরেজী"
+
+#: conf/global_settings.py:44
+msgid "Spanish"
+msgstr "স্প্যানিশ"
+
+#: conf/global_settings.py:45
+msgid "French"
+msgstr "ফরাসী"
+
+#: conf/global_settings.py:46
+msgid "Galician"
+msgstr "গ্যালিসিয়"
+
+#: conf/global_settings.py:47
+msgid "Hungarian"
+msgstr ""
+
+#: conf/global_settings.py:48
+msgid "Hebrew"
+msgstr ""
+
+#: conf/global_settings.py:49
+msgid "Icelandic"
+msgstr ""
+
+#: conf/global_settings.py:50
+msgid "Italian"
+msgstr "ইতালিয়"
+
+#: conf/global_settings.py:51
+msgid "Japanese"
+msgstr ""
+
+#: conf/global_settings.py:52
+msgid "Dutch"
+msgstr ""
+
+#: conf/global_settings.py:53
+msgid "Norwegian"
+msgstr "নরওয়েজিয়"
+
+#: conf/global_settings.py:54
+msgid "Brazilian"
+msgstr "ব্রাজিলীয়"
+
+#: conf/global_settings.py:55
+msgid "Romanian"
+msgstr "রোমানীয়"
+
+#: conf/global_settings.py:56
+msgid "Russian"
+msgstr "রুশ"
+
+#: conf/global_settings.py:57
+msgid "Slovak"
+msgstr "স্লোভাক"
+
+#: conf/global_settings.py:58
+#, fuzzy
+msgid "Slovenian"
+msgstr "স্লোভাক"
+
+#: conf/global_settings.py:59
+msgid "Serbian"
+msgstr "সার্বিয়ান"
+
+#: conf/global_settings.py:60
+msgid "Swedish"
+msgstr ""
+
+#: conf/global_settings.py:61
+#, fuzzy
+msgid "Ukrainian"
+msgstr "ব্রাজিলীয়"
+
+#: conf/global_settings.py:62
+msgid "Simplified Chinese"
+msgstr "সরলীকৃত চীনা"
+
+#: conf/global_settings.py:63
+msgid "Traditional Chinese"
+msgstr ""
+
+#: core/validators.py:60
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "এই মানটি শুধু মাত্র অক্ষর, অংক, এবং আন্ডারস্কোর (_) হতে পারবে।"
+
+#: core/validators.py:64
+#, fuzzy
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr "এই মানটি শুধু মাত্র অক্ষর, অংক, আন্ডারস্কোর (_) এবং স্ল্যাশ হতে পারবে।"
+
+#: core/validators.py:72
+msgid "Uppercase letters are not allowed here."
+msgstr "বড় হাতের অক্ষর এখানে ঢোকাতে পারবেন না।"
+
+#: core/validators.py:76
+msgid "Lowercase letters are not allowed here."
+msgstr "ছোটহাতের অক্ষর এখানে ঢোকাতে পারবেন না।"
+
+#: core/validators.py:83
+msgid "Enter only digits separated by commas."
+msgstr "কমা দ্বারা আলাদা করে শুধু মাত্র অংক ঢোকান।"
+
+#: core/validators.py:95
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "কমা দ্বারা আলাদা করে বৈধ ই-মেল ঠিকানা ঢোকান।"
+
+#: core/validators.py:99
+msgid "Please enter a valid IP address."
+msgstr "দয়া করে একটি বৈধ IP ঠিকানা ঢোকান।"
+
+#: core/validators.py:103
+msgid "Empty values are not allowed here."
+msgstr "ফাঁকা মান এখানে ঢোকাতে পারবেন না।"
+
+#: core/validators.py:107
+msgid "Non-numeric characters aren't allowed here."
+msgstr "অংক বিহীন অক্ষর এখানে ঢোকাতে পারবেন না।"
+
+#: core/validators.py:111
+msgid "This value can't be comprised solely of digits."
+msgstr "এই মানটি শুধু মাত্র অংকের দ্বারা গঠিত  হতে পারে না।"
+
+#: core/validators.py:116
+msgid "Enter a whole number."
+msgstr "একটি গোটা সংখ্যা ঢোকান।"
+
+#: core/validators.py:120
+msgid "Only alphabetical characters are allowed here."
+msgstr "এখানে শুধু মাত্র অক্ষর ঢোকাতে পারবেন ।"
+
+#: core/validators.py:124
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "YYYY-MM-DD ফরম্যাটে একটি বৈধ তারিখ ঢোকান।"
+
+#: core/validators.py:128
+msgid "Enter a valid time in HH:MM format."
+msgstr "HH:MM ফরম্যাটে একটি বৈধ সময় ঢোকান।"
+
+#: core/validators.py:132 db/models/fields/__init__.py:468
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "YYYY-MM-DD.HH:MM ফরম্যাটে একটি বৈধ তারিখ/সময় ঢোকান।"
+
+#: core/validators.py:136
+msgid "Enter a valid e-mail address."
+msgstr "একটি বৈধ ই-মেল ঠিকানা ঢোকান।"
+
+#: core/validators.py:148
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"একটি বৈধ চিত্র আপলোড করুন। যে ফাইল আপনি আপলোড করলেন তা হয় একটি চিত্র নয় অথবা "
+"একটি খারাপ চিত্র।"
+
+#: core/validators.py:155
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "%s ইউ.আর.এল-এ একটি বৈধ চিত্র নেই।"
+
+#: core/validators.py:159
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "ফোন নম্বর XXX-XXX-XXXX ফরম্যাটে অবশ্যই হতে হবে। \"%s\" অবৈধ।"
+
+#: core/validators.py:167
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "%s ইউ.আর.এল-এ একটি বৈধ QuickTime ভিডিও পাওয়া গেল না।"
+
+#: core/validators.py:171
+msgid "A valid URL is required."
+msgstr "একটি বৈধ ইউ.আর.এল জরুরি।"
+
+#: core/validators.py:185
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"বৈধ এইচটিএমএল প্রয়োজনীয়। ত্রুটিগুল হল:\n"
+"%s"
+
+#: core/validators.py:192
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "খারাপভাবে গঠিত এক্সএমএল: %s"
+
+#: core/validators.py:202
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "অবৈধ ইউ.আর.এল: %s"
+
+#: core/validators.py:206 core/validators.py:208
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "ইউ.আর.এল %s একটি ভাঙা সংযোগ।"
+
+#: core/validators.py:214
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "একটি বৈধ U S. রাজ্য abbreviation ঢোকান।"
+
+#: core/validators.py:229
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "মুখ সামলে! %s এখানে ব্যাবহার করতে পারবেন না।"
+msgstr[1] "মুখ সামলে! %s এখানে ব্যাবহার করতে পারবেন না।"
+
+#: core/validators.py:236
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "এই ক্ষেত্রটি '%s' ক্ষেত্রের সঙ্গে অবশ্যই মিলতে হবে।"
+
+#: core/validators.py:255
+msgid "Please enter something for at least one field."
+msgstr "দয়া করে অন্তত এক ক্ষেত্রেতে কিছু জিনিষ ঢোকান।"
+
+#: core/validators.py:264 core/validators.py:275
+msgid "Please enter both fields or leave them both empty."
+msgstr "দয়া করে উভয় ক্ষেত্রে ঢোকান অথবা তাদেরকে উভয় ফাঁকা ছেড়ে চলে যান।"
+
+#: core/validators.py:282
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "এই ক্ষেত্রেটি অবশ্যই দেওয়া হবে যদি %(field)s %(value)s হয়"
+
+#: core/validators.py:294
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "এই ক্ষেত্রেটি অবশ্যই দেওয়া হবে যদি %(field)s %(value)s না হয়"
+
+#: core/validators.py:313
+msgid "Duplicate values are not allowed."
+msgstr "নকল মান অনুমতি দেওয়া হল না।"
+
+#: core/validators.py:336
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "এই মানটি %sএর একটি গুন অবশ্যই হতে হবে।"
+
+#: core/validators.py:347
+msgid "Please enter a valid decimal number."
+msgstr "দয়া করে একটি বৈধ দশমিক সংখ্যা ঢোকান।"
+
+#: core/validators.py:349
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "দয়া করে একটি বৈধ দশমিক সংখ্যা ঢোকান যার অক্ষরের সংখ্যা %s থেকে কম হবে।"
+msgstr[1] "দয়া করে একটি বৈধ দশমিক সংখ্যা ঢোকান যার অক্ষরের সংখ্যা %s থেকে কম হবে।"
+
+#: core/validators.py:352
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "দয়া করে একটি বৈধ দশমিক সংখ্যা ঢোকান যার দশমিক স্থান %s থেকে কম হবে।"
+msgstr[1] "দয়া করে একটি বৈধ দশমিক সংখ্যা ঢোকান যার দশমিক স্থান %s থেকে কম হবে।"
+
+#: core/validators.py:362
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "আাপনার আপলোড করা ফাইল যেন অন্তত %s বাইট বড় হয় তা নিশ্চিত করুন।"
+
+#: core/validators.py:363
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "আাপনার আপলোড করা ফাইল যেন %s বাইটের থেকে বড় না হয় তা নিশ্চিত করুন।"
+
+#: core/validators.py:376
+msgid "The format for this field is wrong."
+msgstr "এই ক্ষেত্রের জন্য ফরম্যাটটি ভূল।"
+
+#: core/validators.py:391
+msgid "This field is invalid."
+msgstr "এই ক্ষেত্রেটি অবৈধ।"
+
+#: core/validators.py:426
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "%s থেকে কোন কিছু গ্রহন করতে পারলাম না।"
+
+#: core/validators.py:429
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"ইউ.আর.এল %(url)s অবৈধ Content-Type শিরোনাম নিয়ে '%(contenttype)s ফিরে আসল।"
+
+#: core/validators.py:462
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"দয়া করে লাইন %(line)s থেকে খোলা %(tag)s বন্ধ করুন। (\"%(start)s\"এর সঙ্গে লাইন "
+"আরম্ভ।)"
+
+#: core/validators.py:466
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"লাইন %(line)s এই প্রসঙ্গে কিছু শব্দ লেখার অনুমতি দেওয়া গেল না। (\"%(start)s\"এর "
+"সঙ্গে লাইন আরম্ভ।)"
+
+#: core/validators.py:471
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"লাইন %(line)s\"%(attr)s\"একটি অবৈধ বৈশিষ্ট্য। (\"%(start)s\"এর সঙ্গে লাইন আরম্ভ।)"
+
+#: core/validators.py:476
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+" %(line)s লাইনে \"<%(tag)s>\" একটি অবৈধ ট্যাগ। (\"%(start)s\"এর সঙ্গে লাইন "
+"আরম্ভ।)"
+
+#: core/validators.py:480
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"লাইন %(line)s একটি ট্যাগে এক অথবা আরও বেশি প্রয়োজনীয় বিশিষ্ট্যাবলী নেই। (\"%"
+"(start)s\"এর সঙ্গে লাইন আরম্ভ।)"
+
+#: core/validators.py:485
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"\"%(attr)s\"বৈশিষ্ট্যয় লাইন %(line)s একটি অবৈধ মান আছে । (\"%(start)s\"এর সঙ্গে "
+"লাইন আরম্ভ।)"
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr ""
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr ""
+
+#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
+#: forms/__init__.py:346
+#, fuzzy
+msgid "This field is required."
+msgstr "এই ক্ষেত্রেটি অবৈধ।"
+
+#: db/models/fields/__init__.py:337
+#, fuzzy
+msgid "This value must be an integer."
+msgstr "এই মানটি %sএর একটি গুন অবশ্যই হতে হবে।"
+
+#: db/models/fields/__init__.py:369
+#, fuzzy
+msgid "This value must be either True or False."
+msgstr "এই মানটি %sএর একটি গুন অবশ্যই হতে হবে।"
+
+#: db/models/fields/__init__.py:385
+#, fuzzy
+msgid "This field cannot be null."
+msgstr "এই ক্ষেত্রেটি অবৈধ।"
+
+#: db/models/fields/__init__.py:562
+#, fuzzy
+msgid "Enter a valid filename."
+msgstr "একটি বৈধ ই-মেল ঠিকানা ঢোকান।"
+
+#: db/models/fields/related.py:43
+#, fuzzy, python-format
+msgid "Please enter a valid %s."
+msgstr "দয়া করে একটি বৈধ IP ঠিকানা ঢোকান।"
+
+#: db/models/fields/related.py:579
+#, fuzzy
+msgid "Separate multiple IDs with commas."
+msgstr "একাধিক আই.ডি.কমার দ্বারা আলাদা করুন।"
+
+#: db/models/fields/related.py:581
+#, fuzzy
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"একের চেয়ে বেশি নির্বাচন করতে \"Control\" অথবা ম্যাক-এ \"Command\" চেপে ধরে "
+"রাখুন।"
+
+#: db/models/fields/related.py:625
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+msgstr[1] ""
+
+#: forms/__init__.py:380
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] ""
+msgstr[1] ""
+
+#: forms/__init__.py:385
+#, fuzzy
+msgid "Line breaks are not allowed here."
+msgstr "ছোটহাতের অক্ষর এখানে ঢোকাতে পারবেন না।"
+
+#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr ""
+
+#: forms/__init__.py:645
+msgid "The submitted file is empty."
+msgstr ""
+
+#: forms/__init__.py:699
+#, fuzzy
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "একটি গোটা সংখ্যা ঢোকান।"
+
+#: forms/__init__.py:708
+#, fuzzy
+msgid "Enter a positive number."
+msgstr "একটি গোটা সংখ্যা ঢোকান।"
+
+#: forms/__init__.py:717
+#, fuzzy
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "একটি গোটা সংখ্যা ঢোকান।"
+
+#: template/defaultfilters.py:379
+msgid "yes,no,maybe"
+msgstr ""
+
+#, fuzzy
+#~ msgid "Comments"
+#~ msgstr "মন্তব্য সক্রিয় করুন"
+
+#~ msgid "label"
+#~ msgstr "লেবেল"
+
+#~ msgid "package"
+#~ msgstr "প্যাকেজ"
+
+#~ msgid "packages"
+#~ msgstr "প্যাকেজ"
+
+#, fuzzy
+#~ msgid "count"
+#~ msgstr "অভ্যন্তরস্থ বস্তু"
diff --git a/webapp/django/conf/locale/bn/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/bn/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..fae1fdc
--- /dev/null
+++ b/webapp/django/conf/locale/bn/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/bn/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/bn/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..120d08d
--- /dev/null
+++ b/webapp/django/conf/locale/bn/LC_MESSAGES/djangojs.po
@@ -0,0 +1,118 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-28 17:36+1000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr ""
+
+#: contrib/admin/media/js/dateparse.js:32
+#: contrib/admin/media/js/calendar.js:24
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr ""
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Now"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
+msgid "Clock"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
+msgid "Choose a time"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "Midnight"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "6 a.m."
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
+msgid "Noon"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
+msgid "Cancel"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
+msgid "Today"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
+msgid "Calendar"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
+msgid "Yesterday"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
+msgid "Tomorrow"
+msgstr ""
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr ""
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr ""
diff --git a/webapp/django/conf/locale/ca/LC_MESSAGES/django.mo b/webapp/django/conf/locale/ca/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..1775e0a
--- /dev/null
+++ b/webapp/django/conf/locale/ca/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/ca/LC_MESSAGES/django.po b/webapp/django/conf/locale/ca/LC_MESSAGES/django.po
new file mode 100644
index 0000000..783fd99
--- /dev/null
+++ b/webapp/django/conf/locale/ca/LC_MESSAGES/django.po
@@ -0,0 +1,4426 @@
+# translation of django.po to
+# This file is distributed under the same license as the Django package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-06-20 12:36+0200\n"
+"PO-Revision-Date: 2008-06-20 12:48+0200\n"
+"Last-Translator: Django Catalan Group <django-cat@googlegroups.com>\n"
+"Language-Team: Catalan <ca@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: conf/global_settings.py:44
+msgid "Arabic"
+msgstr "aràbic"
+
+#: conf/global_settings.py:45
+msgid "Bengali"
+msgstr "bengalí"
+
+#: conf/global_settings.py:46
+msgid "Bulgarian"
+msgstr "búlgar"
+
+#: conf/global_settings.py:47
+msgid "Catalan"
+msgstr "català"
+
+#: conf/global_settings.py:48
+msgid "Czech"
+msgstr "txec"
+
+#: conf/global_settings.py:49
+msgid "Welsh"
+msgstr "galès"
+
+#: conf/global_settings.py:50
+msgid "Danish"
+msgstr "danès"
+
+#: conf/global_settings.py:51
+msgid "German"
+msgstr "alemany"
+
+#: conf/global_settings.py:52
+msgid "Greek"
+msgstr "grec"
+
+#: conf/global_settings.py:53
+msgid "English"
+msgstr "anglès"
+
+#: conf/global_settings.py:54
+msgid "Spanish"
+msgstr "espanyol"
+
+#: conf/global_settings.py:55
+msgid "Estonian"
+msgstr "estonià"
+
+#: conf/global_settings.py:56
+msgid "Argentinean Spanish"
+msgstr "castellà argentí"
+
+#: conf/global_settings.py:57
+msgid "Basque"
+msgstr "euskera"
+
+#: conf/global_settings.py:58
+msgid "Persian"
+msgstr "persa"
+
+#: conf/global_settings.py:59
+msgid "Finnish"
+msgstr "finlandès"
+
+#: conf/global_settings.py:60
+msgid "French"
+msgstr "francès"
+
+#: conf/global_settings.py:61
+msgid "Irish"
+msgstr "irlandès"
+
+#: conf/global_settings.py:62
+msgid "Galician"
+msgstr "gallec"
+
+#: conf/global_settings.py:63
+msgid "Hungarian"
+msgstr "húngar"
+
+#: conf/global_settings.py:64
+msgid "Hebrew"
+msgstr "hebreu"
+
+#: conf/global_settings.py:65
+msgid "Croatian"
+msgstr "croat"
+
+#: conf/global_settings.py:66
+msgid "Icelandic"
+msgstr "islandès"
+
+#: conf/global_settings.py:67
+msgid "Italian"
+msgstr "italià"
+
+#: conf/global_settings.py:68
+msgid "Japanese"
+msgstr "japonès"
+
+#: conf/global_settings.py:69
+msgid "Georgian"
+msgstr "georgià"
+
+#: conf/global_settings.py:70
+msgid "Korean"
+msgstr "coreà"
+
+#: conf/global_settings.py:71
+msgid "khmer"
+msgstr "khmer"
+
+#: conf/global_settings.py:72
+msgid "Kannada"
+msgstr "canès"
+
+#: conf/global_settings.py:73
+msgid "Latvian"
+msgstr "letó"
+
+#: conf/global_settings.py:74
+msgid "Lithuanian"
+msgstr "lituà"
+
+#: conf/global_settings.py:75
+msgid "Macedonian"
+msgstr "macedoni"
+
+#: conf/global_settings.py:76
+msgid "Dutch"
+msgstr "holandès"
+
+#: conf/global_settings.py:77
+msgid "Norwegian"
+msgstr "norueg"
+
+#: conf/global_settings.py:78
+msgid "Polish"
+msgstr "polac"
+
+#: conf/global_settings.py:79
+msgid "Portugese"
+msgstr "portuguès"
+
+#: conf/global_settings.py:80
+msgid "Brazilian Portuguese"
+msgstr "portuguès de brasil"
+
+#: conf/global_settings.py:81
+msgid "Romanian"
+msgstr "rumanès"
+
+#: conf/global_settings.py:82
+msgid "Russian"
+msgstr "rús"
+
+#: conf/global_settings.py:83
+msgid "Slovak"
+msgstr "eslovac"
+
+#: conf/global_settings.py:84
+msgid "Slovenian"
+msgstr "esloveni"
+
+#: conf/global_settings.py:85
+msgid "Serbian"
+msgstr "serbi"
+
+#: conf/global_settings.py:86
+msgid "Swedish"
+msgstr "suec"
+
+#: conf/global_settings.py:87
+msgid "Tamil"
+msgstr "tàmil"
+
+#: conf/global_settings.py:88
+msgid "Telugu"
+msgstr "telugu"
+
+#: conf/global_settings.py:89
+msgid "Turkish"
+msgstr "turc"
+
+#: conf/global_settings.py:90
+msgid "Ukrainian"
+msgstr "ucranià"
+
+#: conf/global_settings.py:91
+msgid "Simplified Chinese"
+msgstr "xinès simplificat"
+
+#: conf/global_settings.py:92
+msgid "Traditional Chinese"
+msgstr "xinès tradicional"
+
+#: contrib/admin/filterspecs.py:44
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Per %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:74 contrib/admin/filterspecs.py:92
+#: contrib/admin/filterspecs.py:147 contrib/admin/filterspecs.py:173
+msgid "All"
+msgstr "Tots"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Any date"
+msgstr "Qualsevol data"
+
+#: contrib/admin/filterspecs.py:114
+msgid "Today"
+msgstr "Avui"
+
+#: contrib/admin/filterspecs.py:117
+msgid "Past 7 days"
+msgstr "Últims 7 dies"
+
+#: contrib/admin/filterspecs.py:119
+msgid "This month"
+msgstr "Aquest mes"
+
+#: contrib/admin/filterspecs.py:121
+msgid "This year"
+msgstr "Aquest any"
+
+#: contrib/admin/filterspecs.py:147 newforms/widgets.py:231
+#: oldforms/__init__.py:592
+msgid "Yes"
+msgstr "Si"
+
+#: contrib/admin/filterspecs.py:147 newforms/widgets.py:231
+#: oldforms/__init__.py:592
+msgid "No"
+msgstr "No"
+
+#: contrib/admin/filterspecs.py:154 newforms/widgets.py:231
+#: oldforms/__init__.py:592
+msgid "Unknown"
+msgstr "Desconegut"
+
+#: contrib/admin/models.py:18
+msgid "action time"
+msgstr "moment de l'acció"
+
+#: contrib/admin/models.py:21
+msgid "object id"
+msgstr "id del objecte"
+
+#: contrib/admin/models.py:22
+msgid "object repr"
+msgstr "'repr' de l'objecte"
+
+#: contrib/admin/models.py:23
+msgid "action flag"
+msgstr "marca de l'acció"
+
+#: contrib/admin/models.py:24
+msgid "change message"
+msgstr "missatge del canvi"
+
+#: contrib/admin/models.py:27
+msgid "log entry"
+msgstr "entrada del registre"
+
+#: contrib/admin/models.py:28
+msgid "log entries"
+msgstr "entrades del registre"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "No s'ha pogut trobar la pàgina"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Ho sentim, però no s'ha pogut trobar la pàgina sol·licitada"
+
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:37
+#: contrib/admin/templates/admin/change_form.html:12
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/delete_confirmation.html:5
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:4
+#: contrib/admin/templates/admin/auth/user/change_password.html:11
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+msgid "Home"
+msgstr "Inici"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Error del servidor"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Error del servidor (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Error del servidor <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Ha ocorregut un error. S'ha informat als administradors del lloc per correu "
+"electrònic y hauria d'arreglar-se en breu. Gràcies per la vostra paciència."
+
+#: contrib/admin/templates/admin/base.html:26
+msgid "Welcome,"
+msgstr "Benvingut/da,"
+
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Documentació"
+
+#: contrib/admin/templates/admin/base.html:29
+#: contrib/admin/templates/admin/auth/user/change_password.html:14
+#: contrib/admin/templates/admin/auth/user/change_password.html:45
+msgid "Change password"
+msgstr "Canviar contrasenya"
+
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/comments/templates/comments/form.html:6
+msgid "Log out"
+msgstr "Finalitzar sessió"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Lloc administratiu de Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Administració de Django"
+
+#: contrib/admin/templates/admin/change_form.html:14
+#: contrib/admin/templates/admin/index.html:28
+msgid "Add"
+msgstr "Afegir"
+
+#: contrib/admin/templates/admin/change_form.html:20
+#: contrib/admin/templates/admin/object_history.html:4
+msgid "History"
+msgstr "Històric"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "Veure al lloc"
+
+#: contrib/admin/templates/admin/change_form.html:31
+#: contrib/admin/templates/admin/auth/user/change_password.html:23
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Si us plau, corregiu l'error mostrat a baix."
+msgstr[1] "Si us plau, corregiu els errors mostrats a baix."
+
+#: contrib/admin/templates/admin/change_form.html:49
+msgid "Ordering"
+msgstr "Ordre"
+
+#: contrib/admin/templates/admin/change_form.html:52
+msgid "Order:"
+msgstr "Ordre:"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "Afegir %(name)s"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:8
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Eliminar"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:13
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Eliminar el/la %(object_name)s '%(escaped_object)s' provocaria l'eliminació "
+"d'objectes relacionats, però el vostre compte no te permissos per a esborrar "
+"els tipus d'objecte següents:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:20
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Esteu segurs de voler esborrar els/les %(object_name)s \"%(escaped_object)s"
+"\"? S'esborraran els següents elements relacionats:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:25
+msgid "Yes, I'm sure"
+msgstr "Si, estic segur"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "Per %(filter_title)s "
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "Filtre"
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Models disponibles a l'aplicació %(name)s."
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Modificar"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "No teniu permís per editar res."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Accions recents"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Les meves accions"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Cap disponible"
+
+#: contrib/admin/templates/admin/invalid_setup.html:8
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Alguna cosa està malament en la instal·lació de la vostra base de dades. "
+"Assegureu-vos de que s'han creat les taules, i de que la base de dades és "
+"llegible per l'usuari apropiat."
+
+#: contrib/admin/templates/admin/login.html:17
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+msgid "Username:"
+msgstr "Usuari:"
+
+#: contrib/admin/templates/admin/login.html:20
+#: contrib/comments/templates/comments/form.html:8
+msgid "Password:"
+msgstr "Contrasenya:"
+
+#: contrib/admin/templates/admin/login.html:25
+#: contrib/admin/views/decorators.py:31
+msgid "Log in"
+msgstr "Iniciar sessió"
+
+#: contrib/admin/templates/admin/object_history.html:17
+msgid "Date/time"
+msgstr "Data/hora"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "User"
+msgstr "Usuari"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "Action"
+msgstr "Acció"
+
+#: contrib/admin/templates/admin/object_history.html:25
+msgid "DATE_WITH_TIME_FULL"
+msgstr "F j, Y, H:i "
+
+#: contrib/admin/templates/admin/object_history.html:35
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Aquest objecte no té historial de canvis. Probablement no va ser afegit "
+"utilitzant aquest lloc administratiu."
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Mostrar tots"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Cercar"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 resultat"
+msgstr[1] "%(counter)s resultats"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s en total"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Desar com a nou"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Desar i afegir-ne un de nou"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Desar i continuar editant"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Desar"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Primer, entreu un usuari i una contrasenya. Després podreu editar més "
+"opcions de l'usuari."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "Usuari"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+#: contrib/admin/templates/admin/auth/user/change_password.html:33
+msgid "Password"
+msgstr "Contrasenya"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+#: contrib/admin/templates/admin/auth/user/change_password.html:38
+msgid "Password (again)"
+msgstr "Contrasenya (de nou)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+msgid "Enter the same password as above, for verification."
+msgstr "Introduïu la mateixa contrasenya de dalt, per fer-ne la verificació."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:27
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Introduïu una contrasenya per l'usuari <strong>%(username)s</strong>"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "'Bookmarklets'"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+msgid "Documentation bookmarklets"
+msgstr "'Bookmarklets' de documentació"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:8
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">Per a instal·lar 'bookmarklets', arrosegueu l'enllaç a la "
+"seva barra de\n"
+"marcadors, o feu click amb el botó dret en l'enllaç i afegeixi'l als "
+"marcadors.\n"
+"Ara podeu escollir el 'bookmarklet' des de qualsevol pàgina del lloc.\n"
+"Observeu que alguns d'aquests 'bookmarklets' precisen que estigui veient\n"
+"el lloc des de un ordinador senyalat com a \"intern\" (parleu\n"
+"amb el vostre administrador de sistemes si no esteu segurs de la condició "
+"del vostre).</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:18
+msgid "Documentation for this page"
+msgstr "Documentació d'aquesta pàgina"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+"Us porta des de qualsevol pàgina de la documentació a la vista que la genera."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:21
+msgid "Show object ID"
+msgstr "Mostra el ID de l'objecte"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Mostra el 'content-type' (tipus de contingut) i el ID inequívoc de les "
+"pàgines que representen un únic objecte."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:24
+msgid "Edit this object (current window)"
+msgstr "Editar aquest objecte (finestra actual)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+"El porta a la pàgina d'administració de pàgines que representen un únic "
+"objecte."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:27
+msgid "Edit this object (new window)"
+msgstr "Editar aquest objecte (nova finestra)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "As above, but opens the admin page in a new window."
+msgstr "Com abans, però obre la pàgina d'administració en una nova finestra."
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Gràcies per destinar el vostre temps en el web durant el dia d'avui."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Iniciar sessió de nou"
+
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_form.html:5
+#: contrib/admin/templates/registration/password_change_form.html:9
+msgid "Password change"
+msgstr "Canvi de contrasenya"
+
+#: contrib/admin/templates/registration/password_change_done.html:5
+#: contrib/admin/templates/registration/password_change_done.html:9
+msgid "Password change successful"
+msgstr "Contrasenya canviada amb èxit"
+
+#: contrib/admin/templates/registration/password_change_done.html:11
+msgid "Your password was changed."
+msgstr "La seva contrasenya ha estat canviada."
+
+#: contrib/admin/templates/registration/password_change_form.html:11
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Si us plau, introduïu la vostra contrasenya antiga, per seguretat, i tot "
+"seguit introduïu la vostra contrasenya nova dues vegades per verificar que "
+"l'heu escrit correctament."
+
+#: contrib/admin/templates/registration/password_change_form.html:16
+msgid "Old password:"
+msgstr "Contrasenya antiga:"
+
+#: contrib/admin/templates/registration/password_change_form.html:18
+msgid "New password:"
+msgstr "Contrasenya nova:"
+
+#: contrib/admin/templates/registration/password_change_form.html:20
+msgid "Confirm password:"
+msgstr "Confirmar contrasenya:"
+
+#: contrib/admin/templates/registration/password_change_form.html:22
+msgid "Change my password"
+msgstr "Canviar la meva clau:"
+
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+msgid "Password reset"
+msgstr "Restablir contrasenya"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Restabliment de contrasenya exitós"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"Us hem enviat una contrasenya nova a l'adreça de correu electrònic que ens "
+"heu indicat. L'haurieu de rebre en breu."
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr ""
+"Esteu rebent aquest missatge degut a que veu solicitar un restabliment de "
+"contrasenya."
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "del vostre compte d'usuari a %(site_name)s."
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "La vostra nova contrasenya és: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Sentiu-vos lliures de canviar-la en aquesta pàgina:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "El vostre nom d'usuari, en cas d'haver-lo oblidat:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Gràcies per fer us del nostre lloc!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "L'equip de %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"Heu oblidat la vostra contrasenya? Introduïu la vostra adreça de correu "
+"electrònic i en crearem una de nova que us enviarem per correu."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Adreça de correu electrònic:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Restablir la meva contrasenya"
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Data:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Hora:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Actualment:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Modificar:"
+
+#: contrib/admin/templatetags/admin_list.py:257
+msgid "All dates"
+msgstr "Totes les dates"
+
+#: contrib/admin/views/auth.py:20 contrib/admin/views/main.py:267
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "El/la %(name)s \"%(obj)s\".ha estat afegit/da amb èxit."
+
+#: contrib/admin/views/auth.py:25 contrib/admin/views/main.py:271
+#: contrib/admin/views/main.py:356
+msgid "You may edit it again below."
+msgstr "Podeu editar-lo de nou a baix."
+
+#: contrib/admin/views/auth.py:31
+msgid "Add user"
+msgstr "Afegir usuari"
+
+#: contrib/admin/views/auth.py:58
+msgid "Password changed successfully."
+msgstr "Contrasenya cambiada amb èxit"
+
+#: contrib/admin/views/auth.py:65
+#, python-format
+msgid "Change password: %s"
+msgstr "Canviar contrasenya: %s"
+
+#: contrib/admin/views/decorators.py:17 contrib/auth/forms.py:60
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Si us plau, introduïu un nom d'usuari i contrasenya vàlids. Tingueu en "
+"compte que tots dos camps son sensibles a majúscules i minúscules."
+
+#: contrib/admin/views/decorators.py:69
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Si us plau, identifiqueu-vos de nou doncs la vostra sessió ha expirat. No us "
+"preocupeu, el seu enviament està emmagatzemat."
+
+#: contrib/admin/views/decorators.py:76
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Sembla ser que el vostre navegador no està configurat per acceptar "
+"'cookies' (galetes). Si us plau, habiliteu les 'cookies', recarregueu "
+"aquesta pàgina i proveu-ho de nou. "
+
+#: contrib/admin/views/decorators.py:89
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr ""
+"La vostra adreça de correu no és el vostre nom d'usuari. Provi '%s' en tot "
+"cas."
+
+#: contrib/admin/views/decorators.py:93
+msgid "Usernames cannot contain the '@' character."
+msgstr "Els noms d'usuari no poden contenir el caracter '@'."
+
+#: contrib/admin/views/doc.py:48 contrib/admin/views/doc.py:50
+#: contrib/admin/views/doc.py:52
+msgid "tag:"
+msgstr "etiqueta:"
+
+#: contrib/admin/views/doc.py:79 contrib/admin/views/doc.py:81
+#: contrib/admin/views/doc.py:83
+msgid "filter:"
+msgstr "filtre:"
+
+#: contrib/admin/views/doc.py:137 contrib/admin/views/doc.py:139
+#: contrib/admin/views/doc.py:141
+msgid "view:"
+msgstr "vista:"
+
+#: contrib/admin/views/doc.py:166
+#, python-format
+msgid "App %r not found"
+msgstr "No s'ha pogut trobar l'aplicació %r"
+
+#: contrib/admin/views/doc.py:173
+#, python-format
+msgid "Model %(name)r not found in app %(label)r"
+msgstr "El model %(name)r no s'ha trobat en l'aplicació %(label)r"
+
+#: contrib/admin/views/doc.py:185
+#, python-format
+msgid "the related `%(label)s.%(type)s` object"
+msgstr "l'objecte relacionat `%(label)s.%(type)s`"
+
+#: contrib/admin/views/doc.py:185 contrib/admin/views/doc.py:207
+#: contrib/admin/views/doc.py:221 contrib/admin/views/doc.py:226
+msgid "model:"
+msgstr "model:"
+
+#: contrib/admin/views/doc.py:216
+#, python-format
+msgid "related `%(label)s.%(name)s` objects"
+msgstr "objectes relacionats `%(label)s.%(name)s`"
+
+#: contrib/admin/views/doc.py:221
+#, python-format
+msgid "all %s"
+msgstr "tots %s"
+
+#: contrib/admin/views/doc.py:226
+#, python-format
+msgid "number of %s"
+msgstr "nombre de %s"
+
+#: contrib/admin/views/doc.py:231
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Camps en objectes %s"
+
+#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:304
+#: contrib/admin/views/doc.py:306 contrib/admin/views/doc.py:312
+#: contrib/admin/views/doc.py:313 contrib/admin/views/doc.py:315
+msgid "Integer"
+msgstr "Enter"
+
+#: contrib/admin/views/doc.py:294
+msgid "Boolean (Either True or False)"
+msgstr "Booleà (Verdader o Fals)"
+
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:314
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Cadena (de fins a %(max_length)s)"
+
+#: contrib/admin/views/doc.py:296
+msgid "Comma-separated integers"
+msgstr "Enters separats per comes"
+
+#: contrib/admin/views/doc.py:297
+msgid "Date (without time)"
+msgstr "Data (sense hora)"
+
+#: contrib/admin/views/doc.py:298
+msgid "Date (with time)"
+msgstr "Data (amb hora)"
+
+#: contrib/admin/views/doc.py:299
+msgid "Decimal number"
+msgstr "Número decimal"
+
+#: contrib/admin/views/doc.py:300
+msgid "E-mail address"
+msgstr "Adreça de correu electrònic"
+
+#: contrib/admin/views/doc.py:301 contrib/admin/views/doc.py:302
+#: contrib/admin/views/doc.py:305
+msgid "File path"
+msgstr "Ruta del fitxer"
+
+#: contrib/admin/views/doc.py:303
+msgid "Floating point number"
+msgstr "Número amb punt de coma flotant"
+
+#: contrib/admin/views/doc.py:307 contrib/comments/models.py:89
+msgid "IP address"
+msgstr "Adreça IP"
+
+#: contrib/admin/views/doc.py:309
+msgid "Boolean (Either True, False or None)"
+msgstr "Booleà (Verdader, Fals o 'None' (cap))"
+
+#: contrib/admin/views/doc.py:310
+msgid "Relation to parent model"
+msgstr "Relació amb el model pare"
+
+#: contrib/admin/views/doc.py:311
+msgid "Phone number"
+msgstr "Número de telèfon"
+
+#: contrib/admin/views/doc.py:316
+msgid "Text"
+msgstr "Text"
+
+#: contrib/admin/views/doc.py:317
+msgid "Time"
+msgstr "Hora"
+
+#: contrib/admin/views/doc.py:318 contrib/flatpages/models.py:8
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:319
+msgid "U.S. state (two uppercase letters)"
+msgstr "Estat dels E.U.A. (dues lletres majúscules)"
+
+#: contrib/admin/views/doc.py:320
+msgid "XML text"
+msgstr "Text XML"
+
+#: contrib/admin/views/doc.py:346
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s no sembla ser un objecte 'urlpattern'"
+
+#: contrib/admin/views/main.py:233
+msgid "Site administration"
+msgstr "Lloc administratiu"
+
+#: contrib/admin/views/main.py:280 contrib/admin/views/main.py:365
+#, python-format
+msgid "You may add another %s below."
+msgstr "Podeu afegir un altre %s a baix."
+
+#: contrib/admin/views/main.py:298
+#, python-format
+msgid "Add %s"
+msgstr "Afegir %s"
+
+#: contrib/admin/views/main.py:344
+#, python-format
+msgid "Added %s."
+msgstr "Afegit %s."
+
+#: contrib/admin/views/main.py:344 contrib/admin/views/main.py:346
+#: contrib/admin/views/main.py:348 core/validators.py:283
+#: db/models/manipulators.py:309
+msgid "and"
+msgstr "i"
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "Changed %s."
+msgstr "Modificat %s."
+
+#: contrib/admin/views/main.py:348
+#, python-format
+msgid "Deleted %s."
+msgstr "Eliminat %s."
+
+#: contrib/admin/views/main.py:351
+msgid "No fields changed."
+msgstr "Cap camp canviat."
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "S'ha modificat amb èxit el/la %(name)s \"%(obj)s."
+
+#: contrib/admin/views/main.py:362
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"S'ha afegit exitosament el/la %(name)s \"%(obj)s\". Pot editar-lo de nou "
+"abaix."
+
+#: contrib/admin/views/main.py:400
+#, python-format
+msgid "Change %s"
+msgstr "Modificar %s"
+
+#: contrib/admin/views/main.py:487
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Un o més %(fieldname)s en %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:492
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Un o més %(fieldname)s en %(name)s:"
+
+#: contrib/admin/views/main.py:524
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "El/la %(name)s \"%(obj)s\" ha estat eliminat amb èxit."
+
+#: contrib/admin/views/main.py:527
+msgid "Are you sure?"
+msgstr "Esteu segurs?"
+
+#: contrib/admin/views/main.py:549
+#, python-format
+msgid "Change history: %s"
+msgstr "Modificar històric: %s"
+
+#: contrib/admin/views/main.py:583
+#, python-format
+msgid "Select %s"
+msgstr "Seleccioneu %s"
+
+#: contrib/admin/views/main.py:583
+#, python-format
+msgid "Select %s to change"
+msgstr "Seleccioneu %s per modificar"
+
+#: contrib/admin/views/main.py:765
+msgid "Database error"
+msgstr "Error de base de dades"
+
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr "Els dos camps de contrasenya no coincideixen."
+
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr "Ja existeix un usuari amb aquest nom."
+
+#: contrib/auth/forms.py:53
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"El seu navegador no sembla tenir les 'cookies' (galetes) activades. Aquestes "
+"són necessàries per iniciar la sessió."
+
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "Aquest compte està inactiu"
+
+#: contrib/auth/forms.py:84
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr ""
+"Aquesta adreça de correu no té associada cap compte d'usuari. Esteu segurs "
+"de que s'ha registrat?"
+
+#: contrib/auth/forms.py:107
+#, python-format
+msgid "Password reset on %s"
+msgstr "Restablir contrasenya en %s"
+
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "Els dos camps de nova contrasenya no coincideixen."
+
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr ""
+"La seva antiga contrasenya no és correcte. Si el plau, introduïu-la de nou."
+
+#: contrib/auth/models.py:73 contrib/auth/models.py:93
+msgid "name"
+msgstr "nom"
+
+#: contrib/auth/models.py:75
+msgid "codename"
+msgstr "nom en clau"
+
+#: contrib/auth/models.py:78
+msgid "permission"
+msgstr "permís"
+
+#: contrib/auth/models.py:79 contrib/auth/models.py:94
+msgid "permissions"
+msgstr "permisos"
+
+#: contrib/auth/models.py:97
+msgid "group"
+msgstr "grup"
+
+#: contrib/auth/models.py:98 contrib/auth/models.py:148
+msgid "groups"
+msgstr "grups"
+
+#: contrib/auth/models.py:138
+msgid "username"
+msgstr "nom d'usuari"
+
+#: contrib/auth/models.py:138
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr ""
+"Obligatori. 30 o menys caràcters. Només caràcters alfanumèrics (lletres, "
+"dígits i el guió baix)."
+
+#: contrib/auth/models.py:139
+msgid "first name"
+msgstr "nom propi"
+
+#: contrib/auth/models.py:140
+msgid "last name"
+msgstr "cognoms"
+
+#: contrib/auth/models.py:141
+msgid "e-mail address"
+msgstr "adreça de correu electrònic"
+
+#: contrib/auth/models.py:142
+msgid "password"
+msgstr "contrasenya"
+
+#: contrib/auth/models.py:142
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"Utilitzeu '[algo]$[salt]$[hexdigest]' o el <a href=\"password/\">formulari "
+"de canvi de contrasenya</a>."
+
+#: contrib/auth/models.py:143
+msgid "staff status"
+msgstr "membre del personal"
+
+#: contrib/auth/models.py:143
+msgid "Designates whether the user can log into this admin site."
+msgstr "Indica si l'usuari pot entrar en el lloc administratiu."
+
+#: contrib/auth/models.py:144
+msgid "active"
+msgstr "actiu"
+
+#: contrib/auth/models.py:144
+msgid ""
+"Designates whether this user should be treated as active. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"Designa si aquest usuari ha de ser tractat com a actiu. Deseleccioneu-ho "
+"enlloc d'esborrar comptes d'usuari."
+
+#: contrib/auth/models.py:145
+msgid "superuser status"
+msgstr "estat de superusuari"
+
+#: contrib/auth/models.py:145
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr ""
+"Designa que aquest usuari té tots els permissos sense assignar-los "
+"explícitament."
+
+#: contrib/auth/models.py:146
+msgid "last login"
+msgstr "últim inici de sessió"
+
+#: contrib/auth/models.py:147
+msgid "date joined"
+msgstr "data de creació"
+
+#: contrib/auth/models.py:149
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"Junt amb els permissos asignats manualment, aquest usuari tindrà, també, els "
+"permissos dels grups dels que sigui membre."
+
+#: contrib/auth/models.py:150
+msgid "user permissions"
+msgstr "permissos de l'usuari"
+
+#: contrib/auth/models.py:154
+msgid "user"
+msgstr "usuari"
+
+#: contrib/auth/models.py:155
+msgid "users"
+msgstr "usuaris"
+
+#: contrib/auth/models.py:161
+msgid "Personal info"
+msgstr "Informació personal"
+
+#: contrib/auth/models.py:162
+msgid "Permissions"
+msgstr "permisos"
+
+#: contrib/auth/models.py:163
+msgid "Important dates"
+msgstr "Dates importants"
+
+#: contrib/auth/models.py:164
+msgid "Groups"
+msgstr "Grups"
+
+#: contrib/auth/models.py:323
+msgid "message"
+msgstr "missatge"
+
+#: contrib/auth/views.py:48
+msgid "Logged out"
+msgstr "Sessió finalitzada"
+
+#: contrib/comments/models.py:71 contrib/comments/models.py:176
+msgid "object ID"
+msgstr "ID de l'objecte"
+
+#: contrib/comments/models.py:72
+msgid "headline"
+msgstr "encapçalament"
+
+#: contrib/comments/models.py:73 contrib/comments/models.py:95
+#: contrib/comments/models.py:177
+msgid "comment"
+msgstr "comentari"
+
+#: contrib/comments/models.py:74
+msgid "rating #1"
+msgstr "qualificació #1"
+
+#: contrib/comments/models.py:75
+msgid "rating #2"
+msgstr "qualificació #2"
+
+#: contrib/comments/models.py:76
+msgid "rating #3"
+msgstr "qualificació #3"
+
+#: contrib/comments/models.py:77
+msgid "rating #4"
+msgstr "qualificació #4"
+
+#: contrib/comments/models.py:78
+msgid "rating #5"
+msgstr "qualificació #5"
+
+#: contrib/comments/models.py:79
+msgid "rating #6"
+msgstr "qualificació #6"
+
+#: contrib/comments/models.py:80
+msgid "rating #7"
+msgstr "qualificació #7"
+
+#: contrib/comments/models.py:81
+msgid "rating #8"
+msgstr "qualificació #8"
+
+#: contrib/comments/models.py:86
+msgid "is valid rating"
+msgstr "és qualificació vàlida"
+
+#: contrib/comments/models.py:87 contrib/comments/models.py:179
+msgid "date/time submitted"
+msgstr "data/hora d'enviament"
+
+#: contrib/comments/models.py:88 contrib/comments/models.py:180
+msgid "is public"
+msgstr "és públic"
+
+#: contrib/comments/models.py:90
+msgid "is removed"
+msgstr "està eliminat"
+
+#: contrib/comments/models.py:90
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Marqueu aquesta caixa si el comentari no és apropiat. En lloc seu es "
+"mostrarà \"Aquest comentari ha estat eliminat\" "
+
+#: contrib/comments/models.py:96
+msgid "comments"
+msgstr "comentaris"
+
+#: contrib/comments/models.py:140 contrib/comments/models.py:222
+msgid "Content object"
+msgstr "Objecte Contingut"
+
+#: contrib/comments/models.py:168
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Enviat per %(user)s el %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:178
+msgid "person's name"
+msgstr "nom de la persona"
+
+#: contrib/comments/models.py:181
+msgid "ip address"
+msgstr "adreça ip"
+
+#: contrib/comments/models.py:183
+msgid "approved by staff"
+msgstr "aprovat pels membres del personal"
+
+#: contrib/comments/models.py:187
+msgid "free comment"
+msgstr "comentari lliure"
+
+#: contrib/comments/models.py:188
+msgid "free comments"
+msgstr "comentaris lliures"
+
+#: contrib/comments/models.py:250
+msgid "score"
+msgstr "puntuació"
+
+#: contrib/comments/models.py:251
+msgid "score date"
+msgstr "data de la puntuació"
+
+#: contrib/comments/models.py:255
+msgid "karma score"
+msgstr "puntuació de karma"
+
+#: contrib/comments/models.py:256
+msgid "karma scores"
+msgstr "punts de karma"
+
+#: contrib/comments/models.py:260
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d punt/s per %(user)s"
+
+#: contrib/comments/models.py:277
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Aquest comentari va ser marcat per %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:285
+msgid "flag date"
+msgstr "data de la marca"
+
+#: contrib/comments/models.py:289
+msgid "user flag"
+msgstr "marca d'usuari"
+
+#: contrib/comments/models.py:290
+msgid "user flags"
+msgstr "marques d'usuari"
+
+#: contrib/comments/models.py:294
+#, python-format
+msgid "Flag by %r"
+msgstr "Marca de %r"
+
+#: contrib/comments/models.py:300
+msgid "deletion date"
+msgstr "data d'eliminació"
+
+#: contrib/comments/models.py:303
+msgid "moderator deletion"
+msgstr "eliminació del moderador"
+
+#: contrib/comments/models.py:304
+msgid "moderator deletions"
+msgstr "eliminacions del moderador"
+
+#: contrib/comments/models.py:308
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "eliminació del moderador per %r"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Contrasenya oblidada?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Qualificacions"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Obligatori"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Opcional"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Enviar una fotografia"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Comentari:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Previsualitzar comentari"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "El seu nom:"
+
+#: contrib/comments/views/comments.py:28
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr "Es precisa aquesta puntuació perquè n'heu introduït almenys una altra."
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Aquest comentari va ser enviat per un usuari que ha enviat menys de %(count)"
+"s comentari:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Aquest comentari va ser enviat per un usuari que ha enviat menys de %(count)"
+"s comentaris:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Aquest comentari va ser publicat per un usuari incomplet\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:190
+#: contrib/comments/views/comments.py:283
+msgid "Only POSTs are allowed"
+msgstr "Només s'admet POST"
+
+#: contrib/comments/views/comments.py:194
+#: contrib/comments/views/comments.py:287
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Un o més dels camps obligatoris no ha estat enviat"
+
+#: contrib/comments/views/comments.py:198
+#: contrib/comments/views/comments.py:289
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Algú ha manipulat el formulari de comentaris (violació de seguretat)"
+
+#: contrib/comments/views/comments.py:208
+#: contrib/comments/views/comments.py:295
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"El formulari de comentaris tenia un paràmetre 'target' invàlid -- el ID del "
+"objecte era invàlid"
+
+#: contrib/comments/views/comments.py:259
+#: contrib/comments/views/comments.py:324
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr ""
+"El formulari del comentari no ha proveït ni 'previsualitzar' ni 'enviar'"
+
+#: contrib/comments/views/karma.py:21
+msgid "Anonymous users cannot vote"
+msgstr "Els usuaris anònims no poden votar"
+
+#: contrib/comments/views/karma.py:25
+msgid "Invalid comment ID"
+msgstr "ID del comentari invàlid"
+
+#: contrib/comments/views/karma.py:27
+msgid "No voting for yourself"
+msgstr "No podeu votar-vos a vosaltres mateixos"
+
+#: contrib/contenttypes/models.py:67
+msgid "python model class name"
+msgstr "nom de la classe del model en python"
+
+#: contrib/contenttypes/models.py:71
+msgid "content type"
+msgstr "tipus de contingut"
+
+#: contrib/contenttypes/models.py:72
+msgid "content types"
+msgstr "tipus de continguts"
+
+#: contrib/flatpages/models.py:9
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Exemple: '/about/contact/'. Assegureu-vos de posar les barres al principi i "
+"al final."
+
+#: contrib/flatpages/models.py:10
+msgid "title"
+msgstr "títol"
+
+#: contrib/flatpages/models.py:11
+msgid "content"
+msgstr "contingut"
+
+#: contrib/flatpages/models.py:12
+msgid "enable comments"
+msgstr "habilitar comentaris"
+
+#: contrib/flatpages/models.py:13
+msgid "template name"
+msgstr "nom de la plantilla"
+
+#: contrib/flatpages/models.py:14
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"Exemple: 'flatpages/contact_page.html'. Si no es proporciona, el sistema "
+"utilitzarà 'flatpages/default.htmlt'."
+
+#: contrib/flatpages/models.py:15
+msgid "registration required"
+msgstr "cal estar registrat"
+
+#: contrib/flatpages/models.py:15
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Si està marcat, només els usuaris registrats podran veure la pàgina."
+
+#: contrib/flatpages/models.py:20
+msgid "flat page"
+msgstr "pàgina estàtica"
+
+#: contrib/flatpages/models.py:21
+msgid "flat pages"
+msgstr "pàgines estàtiques"
+
+#: contrib/flatpages/models.py:27
+msgid "Advanced options"
+msgstr "Opcions avançades"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "th"
+msgstr "rt"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "st"
+msgstr "r"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "nd"
+msgstr "n"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "rd"
+msgstr "r"
+
+#: contrib/humanize/templatetags/humanize.py:51
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f milió"
+msgstr[1] "%(value).1f  milions"
+
+#: contrib/humanize/templatetags/humanize.py:54
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f bilió"
+msgstr[1] "%(value).1f bilions"
+
+#: contrib/humanize/templatetags/humanize.py:57
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f trilió"
+msgstr[1] "%(value).1f trilions"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "one"
+msgstr "un"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "two"
+msgstr "dos"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "three"
+msgstr "tres"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "four"
+msgstr "quatre"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "five"
+msgstr "cinc"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "six"
+msgstr "sis"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "seven"
+msgstr "set"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "eight"
+msgstr "vuit"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "nine"
+msgstr "nou"
+
+#: contrib/humanize/templatetags/humanize.py:93
+msgid "today"
+msgstr "avui"
+
+#: contrib/humanize/templatetags/humanize.py:95
+msgid "tomorrow"
+msgstr "demà"
+
+#: contrib/humanize/templatetags/humanize.py:97
+msgid "yesterday"
+msgstr "ahir"
+
+#: contrib/localflavor/ar/forms.py:27
+msgid "Enter a postal code in the format NNNN or ANNNNAAA."
+msgstr "Introduïu un codi postal en el format NNNN o ANNNNAAA."
+
+#: contrib/localflavor/ar/forms.py:49 contrib/localflavor/br/forms.py:96
+#: contrib/localflavor/br/forms.py:135 contrib/localflavor/pe/forms.py:23
+#: contrib/localflavor/pe/forms.py:51
+msgid "This field requires only numbers."
+msgstr "Aquest camp precisa només números."
+
+#: contrib/localflavor/ar/forms.py:50
+msgid "This field requires 7 or 8 digits."
+msgstr "Aquest camp precisa 7 o 8 dígits."
+
+#: contrib/localflavor/ar/forms.py:79
+msgid "Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format."
+msgstr ""
+"Introduïu un número CUIT vàlid en el format XX-XXXXXXXX-X o XXXXXXXXXXXX."
+
+#: contrib/localflavor/ar/forms.py:80
+msgid "Invalid CUIT."
+msgstr "Invàlid CUIT."
+
+#: contrib/localflavor/au/forms.py:16
+msgid "Enter a 4 digit post code."
+msgstr "Introduïu un codi postal de 4 dígits."
+
+#: contrib/localflavor/br/forms.py:21
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Introduïu un codi zip en el format XXXXX-XXX."
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "El número de telèfon ha de estar en el format XX-XXXX-XXXX."
+
+#: contrib/localflavor/br/forms.py:58
+msgid ""
+"Select a valid brazilian state. That state is not one of the available "
+"states."
+msgstr ""
+"Seleccioneu un estat brasiler vàlid. Aquest estat no és un dels estats "
+"disponibles."
+
+#: contrib/localflavor/br/forms.py:94
+msgid "Invalid CPF number."
+msgstr "Número CPF invàlid."
+
+#: contrib/localflavor/br/forms.py:95
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr "Aquest camp precisa com a màxim 11 dígits o 14 caracters."
+
+#: contrib/localflavor/br/forms.py:134
+msgid "Invalid CNPJ number."
+msgstr "Número CNPJ invàlid."
+
+#: contrib/localflavor/br/forms.py:136
+msgid "This field requires at least 14 digits"
+msgstr "Aquest camp precisa almenys 14 dígits."
+
+#: contrib/localflavor/ca/forms.py:17
+msgid "Enter a postal code in the format XXX XXX."
+msgstr "Introduïu un codi postal en el format XXX XXX."
+
+#: contrib/localflavor/ca/forms.py:88
+msgid "Enter a valid Canadian Social Insurance number in XXX-XXX-XXX format."
+msgstr ""
+"Introduïu un número vàlid de la Assegurança Social de Canadà en el format "
+"XXX-XXX-XXX."
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr "Argau"
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr "Appenzell Inner-Rhoden"
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr "Appenzell Ausser-Rhoden"
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr "Basel-Ciutat"
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr "Basel-Camp"
+
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr "Berna"
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr "Friburg"
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr "Ginebra"
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr "Glarus"
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr "Graubuenden"
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr "Jura"
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr "Lucerna"
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr "Neuchatel"
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr "Nidwalden"
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr "Obwalden"
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr "Schaffhausen"
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr "Schwyz"
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr "Solothurn"
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr "St. Gallen"
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr "Thurgau"
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr "Ticino"
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr "Uri"
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr "Valais"
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr "Vaud"
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr "Zug"
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr "Zuric"
+
+#: contrib/localflavor/ch/forms.py:16 contrib/localflavor/no/forms.py:12
+msgid "Enter a zip code in the format XXXX."
+msgstr "Introduïu un codi zip en el format XXXX."
+
+#: contrib/localflavor/ch/forms.py:64
+msgid ""
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
+msgstr ""
+"Introduïu un número d'identificació o de passaport Suïssos en els formats "
+"1234567890 o X1234567<0."
+
+#: contrib/localflavor/cl/forms.py:29
+msgid "Enter a valid Chilean RUT."
+msgstr "Introduïu un RUT Xilè vàlid."
+
+#: contrib/localflavor/cl/forms.py:30
+msgid "Enter a valid Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr "Introduïu un RUT Xilè vàlid. El format és XX.XXX.XXX-X"
+
+#: contrib/localflavor/cl/forms.py:31
+msgid "The Chilean RUT is not valid."
+msgstr "El RUT Xilè no és vàlid."
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr "Baden-Württemberg"
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr "Baviera"
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr "Berlín"
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr "Brandenburg"
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr "Bremen"
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr "Hamburg"
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr "Hessen"
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr "Mecklenburg-Pomerània Occidental"
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr "Baixa Saxònia"
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr "Renània del Nord-Westfàlia"
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr "Renània-Palatinat"
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr "Saarland"
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr "Saxònia"
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr "Saxònia-Anhalt"
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr "Slesvig-Holstein"
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr "Turíngia"
+
+#: contrib/localflavor/de/forms.py:14 contrib/localflavor/fi/forms.py:12
+#: contrib/localflavor/fr/forms.py:15
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Introduïu un codi zip en el format XXXXX."
+
+#: contrib/localflavor/de/forms.py:41
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr ""
+"Introduïu un número de tarjeta d'identificació alemany vàlid en el format "
+"XXXXXXXXXXX-XXXXXXX-XXXXXXX-X."
+
+#: contrib/localflavor/es/es_provinces.py:5
+msgid "Arava"
+msgstr "Àlaba"
+
+#: contrib/localflavor/es/es_provinces.py:6
+msgid "Albacete"
+msgstr "Albacete"
+
+#: contrib/localflavor/es/es_provinces.py:7
+msgid "Alacant"
+msgstr "Alacant"
+
+#: contrib/localflavor/es/es_provinces.py:8
+msgid "Almeria"
+msgstr "Almeria"
+
+#: contrib/localflavor/es/es_provinces.py:9
+msgid "Avila"
+msgstr "Àvila"
+
+#: contrib/localflavor/es/es_provinces.py:10
+msgid "Badajoz"
+msgstr "Badajoz"
+
+#: contrib/localflavor/es/es_provinces.py:11
+msgid "Illes Balears"
+msgstr "Illes Balears"
+
+#: contrib/localflavor/es/es_provinces.py:12
+msgid "Barcelona"
+msgstr "Barcelona"
+
+#: contrib/localflavor/es/es_provinces.py:13
+msgid "Burgos"
+msgstr "Burgos"
+
+#: contrib/localflavor/es/es_provinces.py:14
+msgid "Caceres"
+msgstr "Càceres"
+
+#: contrib/localflavor/es/es_provinces.py:15
+msgid "Cadiz"
+msgstr "Cadis"
+
+#: contrib/localflavor/es/es_provinces.py:16
+msgid "Castello"
+msgstr "Castelló"
+
+#: contrib/localflavor/es/es_provinces.py:17
+msgid "Ciudad Real"
+msgstr "Ciudad Real"
+
+#: contrib/localflavor/es/es_provinces.py:18
+msgid "Cordoba"
+msgstr "Còrdova"
+
+#: contrib/localflavor/es/es_provinces.py:19
+msgid "A Coruna"
+msgstr "La Corunya"
+
+#: contrib/localflavor/es/es_provinces.py:20
+msgid "Cuenca"
+msgstr "Conca"
+
+#: contrib/localflavor/es/es_provinces.py:21
+msgid "Girona"
+msgstr "Girona"
+
+#: contrib/localflavor/es/es_provinces.py:22
+msgid "Granada"
+msgstr "Granada"
+
+#: contrib/localflavor/es/es_provinces.py:23
+msgid "Guadalajara"
+msgstr "Guadalajara"
+
+#: contrib/localflavor/es/es_provinces.py:24
+msgid "Guipuzkoa"
+msgstr "Guipúscoa"
+
+#: contrib/localflavor/es/es_provinces.py:25
+msgid "Huelva"
+msgstr "Huelva"
+
+#: contrib/localflavor/es/es_provinces.py:26
+msgid "Huesca"
+msgstr "Osca"
+
+#: contrib/localflavor/es/es_provinces.py:27
+msgid "Jaen"
+msgstr "Jaén"
+
+#: contrib/localflavor/es/es_provinces.py:28
+msgid "Leon"
+msgstr "Lleó"
+
+#: contrib/localflavor/es/es_provinces.py:29
+msgid "Lleida"
+msgstr "Lleida"
+
+#: contrib/localflavor/es/es_provinces.py:30
+#: contrib/localflavor/es/es_regions.py:17
+msgid "La Rioja"
+msgstr "La Rioja"
+
+#: contrib/localflavor/es/es_provinces.py:31
+msgid "Lugo"
+msgstr "Lugo"
+
+#: contrib/localflavor/es/es_provinces.py:32
+#: contrib/localflavor/es/es_regions.py:18
+msgid "Madrid"
+msgstr "Madrid"
+
+#: contrib/localflavor/es/es_provinces.py:33
+msgid "Malaga"
+msgstr "Màlaga"
+
+#: contrib/localflavor/es/es_provinces.py:34
+msgid "Murcia"
+msgstr "Múrcia"
+
+#: contrib/localflavor/es/es_provinces.py:35
+msgid "Navarre"
+msgstr "Navarra"
+
+#: contrib/localflavor/es/es_provinces.py:36
+msgid "Ourense"
+msgstr "Ourense"
+
+#: contrib/localflavor/es/es_provinces.py:37
+msgid "Asturias"
+msgstr "Astúries"
+
+#: contrib/localflavor/es/es_provinces.py:38
+msgid "Palencia"
+msgstr "Palència"
+
+#: contrib/localflavor/es/es_provinces.py:39
+msgid "Las Palmas"
+msgstr "Las Palmas"
+
+#: contrib/localflavor/es/es_provinces.py:40
+msgid "Pontevedra"
+msgstr "Pontevedra"
+
+#: contrib/localflavor/es/es_provinces.py:41
+msgid "Salamanca"
+msgstr "Salamanca"
+
+#: contrib/localflavor/es/es_provinces.py:42
+msgid "Santa Cruz de Tenerife"
+msgstr "Santa Cruz de Tenerife"
+
+#: contrib/localflavor/es/es_provinces.py:43
+#: contrib/localflavor/es/es_regions.py:11
+msgid "Cantabria"
+msgstr "Cantàbria"
+
+#: contrib/localflavor/es/es_provinces.py:44
+msgid "Segovia"
+msgstr "Segòvia"
+
+#: contrib/localflavor/es/es_provinces.py:45
+msgid "Seville"
+msgstr "Sevilla"
+
+#: contrib/localflavor/es/es_provinces.py:46
+msgid "Soria"
+msgstr "Sòria"
+
+#: contrib/localflavor/es/es_provinces.py:47
+msgid "Tarragona"
+msgstr "Tarragona"
+
+#: contrib/localflavor/es/es_provinces.py:48
+msgid "Teruel"
+msgstr "Terol"
+
+#: contrib/localflavor/es/es_provinces.py:49
+msgid "Toledo"
+msgstr "Toledo"
+
+#: contrib/localflavor/es/es_provinces.py:50
+msgid "Valencia"
+msgstr "València"
+
+#: contrib/localflavor/es/es_provinces.py:51
+msgid "Valladolid"
+msgstr "Valladolid"
+
+#: contrib/localflavor/es/es_provinces.py:52
+msgid "Bizkaia"
+msgstr "Biscaia"
+
+#: contrib/localflavor/es/es_provinces.py:53
+msgid "Zamora"
+msgstr "Zamora"
+
+#: contrib/localflavor/es/es_provinces.py:54
+msgid "Zaragoza"
+msgstr "Saragossa"
+
+#: contrib/localflavor/es/es_provinces.py:55
+msgid "Ceuta"
+msgstr "Ceuta"
+
+#: contrib/localflavor/es/es_provinces.py:56
+msgid "Melilla"
+msgstr "Melilla"
+
+#: contrib/localflavor/es/es_regions.py:5
+msgid "Andalusia"
+msgstr "Andalusia"
+
+#: contrib/localflavor/es/es_regions.py:6
+msgid "Aragon"
+msgstr "Aragó"
+
+#: contrib/localflavor/es/es_regions.py:7
+msgid "Principality of Asturias"
+msgstr "Principat d'Astúries"
+
+#: contrib/localflavor/es/es_regions.py:8
+msgid "Balearic Islands"
+msgstr "Illes Balears"
+
+#: contrib/localflavor/es/es_regions.py:9
+msgid "Basque Country"
+msgstr "Euskadi"
+
+#: contrib/localflavor/es/es_regions.py:10
+msgid "Canary Islands"
+msgstr "Canàries"
+
+#: contrib/localflavor/es/es_regions.py:12
+msgid "Castile-La Mancha"
+msgstr "Castella-La Mancha"
+
+#: contrib/localflavor/es/es_regions.py:13
+msgid "Castile and Leon"
+msgstr "Castella i Lleó"
+
+#: contrib/localflavor/es/es_regions.py:14
+msgid "Catalonia"
+msgstr "Catalunya"
+
+#: contrib/localflavor/es/es_regions.py:15
+msgid "Extremadura"
+msgstr "Extremadura"
+
+#: contrib/localflavor/es/es_regions.py:16
+msgid "Galicia"
+msgstr "Galícia"
+
+#: contrib/localflavor/es/es_regions.py:19
+msgid "Region of Murcia"
+msgstr "Regió de Múrcia"
+
+#: contrib/localflavor/es/es_regions.py:20
+msgid "Foral Community of Navarre"
+msgstr "Comunitat Foral de Navarra"
+
+#: contrib/localflavor/es/es_regions.py:21
+msgid "Valencian Community"
+msgstr "Comunitat Valenciana"
+
+#: contrib/localflavor/es/forms.py:19
+msgid "Enter a valid postal code in the range and format 01XXX - 52XXX."
+msgstr "Introduïu un codi postal en rang i format 01XXX - 52XXX."
+
+#: contrib/localflavor/es/forms.py:39
+msgid ""
+"Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or "
+"9XXXXXXXX."
+msgstr ""
+"Introduïu un número de telèfon vàlid en un dels formats 6XXXXXXXX, 8XXXXXXXX "
+"o 9XXXXXXXX."
+
+#: contrib/localflavor/es/forms.py:66
+msgid "Please enter a valid NIF, NIE, or CIF."
+msgstr "Si us plau, introduïu un NIF, NIE o CIF vàlid."
+
+#: contrib/localflavor/es/forms.py:67
+msgid "Please enter a valid NIF or NIE."
+msgstr "Si us plau, introduïu un NIF o NIE vàlid."
+
+#: contrib/localflavor/es/forms.py:68
+msgid "Invalid checksum for NIF."
+msgstr "Validació invàlida del NIF."
+
+#: contrib/localflavor/es/forms.py:69
+msgid "Invalid checksum for NIE."
+msgstr "Validació invàlida del NIE."
+
+#: contrib/localflavor/es/forms.py:70
+msgid "Invalid checksum for CIF."
+msgstr "Validació invàlida del CIF."
+
+#: contrib/localflavor/es/forms.py:142
+msgid ""
+"Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX."
+msgstr ""
+"Introduïu un número de compte bancari vàlid en el format XXXX-XXXX-XX-"
+"XXXXXXXXXX."
+
+#: contrib/localflavor/es/forms.py:143
+msgid "Invalid checksum for bank account number."
+msgstr "Validació invàlida del número de compte bancari."
+
+#: contrib/localflavor/fi/forms.py:28
+msgid "Enter a valid Finnish social security number."
+msgstr "Introduïu un número vàlid de la seguretat social finlandesa."
+
+#: contrib/localflavor/in_/forms.py:14
+msgid "Enter a zip code in the format XXXXXXX."
+msgstr "Introduïu un codi zip en el format XXXXXXX."
+
+#: contrib/localflavor/is_/forms.py:17
+msgid ""
+"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr ""
+"Introduïu un número de identificació d'Islàndia. El format és XXXXXX-XXXX."
+
+#: contrib/localflavor/is_/forms.py:18
+msgid "The Icelandic identification number is not valid."
+msgstr "El número de identificació d'Islàndia no és vàlid."
+
+#: contrib/localflavor/it/forms.py:14
+msgid "Enter a valid zip code."
+msgstr "Introduïu un codi zip vàlid."
+
+#: contrib/localflavor/it/forms.py:43
+msgid "Enter a valid Social Security number."
+msgstr "Introduïu un número valid de la Seguretat Social."
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr "Introduïu un número de IVA (VAT) vàlid."
+
+#: contrib/localflavor/jp/forms.py:17
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "Introduïu un codi postal en el format XXXXXXX o XX-XXXX."
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr "Hokkaido"
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr "Aomori"
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr "Iwate"
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr "Miyagi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr "Akita"
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr "Yamagata"
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr "Fukushima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr "Ibaraki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr "Tochigi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr "Gunma"
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr "Saitama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr "Chiba"
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr "Tokyo"
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr "Kanagawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr "Yamanashi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr "Nagano"
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr "Niigata"
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr "Toyama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr "Ishikawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr "Fukui"
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr "Gifu"
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr "Shizuoka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr "Aichi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr "Mie"
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr "Shiga"
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr "Kyoto"
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr "Osaka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr "Hyogo"
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr "Nara"
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr "Wakayama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr "Tottori"
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr "Shimane"
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr "Okayama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr "Hiroshima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr "Yamaguchi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr "Tokushima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr "Kagawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr "Ehime"
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr "Kochi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr "Fukuoka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr "Saga"
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr "Nagasaki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr "Kumamoto"
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr "Oita"
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr "Miyazaki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr "Kagoshima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr "Okinawa"
+
+#: contrib/localflavor/mx/mx_states.py:12
+msgid "Aguascalientes"
+msgstr "Aguascalientes"
+
+#: contrib/localflavor/mx/mx_states.py:13
+msgid "Baja California"
+msgstr "Baixa California"
+
+#: contrib/localflavor/mx/mx_states.py:14
+msgid "Baja California Sur"
+msgstr "Baixa California Sud"
+
+#: contrib/localflavor/mx/mx_states.py:15
+msgid "Campeche"
+msgstr "Campeche"
+
+#: contrib/localflavor/mx/mx_states.py:16
+msgid "Chihuahua"
+msgstr "Chihuahua"
+
+#: contrib/localflavor/mx/mx_states.py:17
+msgid "Chiapas"
+msgstr "Chiapas"
+
+#: contrib/localflavor/mx/mx_states.py:18
+msgid "Coahuila"
+msgstr "Coahuila"
+
+#: contrib/localflavor/mx/mx_states.py:19
+msgid "Colima"
+msgstr "Colima"
+
+#: contrib/localflavor/mx/mx_states.py:20
+msgid "Distrito Federal"
+msgstr "Districte Federal"
+
+#: contrib/localflavor/mx/mx_states.py:21
+msgid "Durango"
+msgstr "Durango"
+
+#: contrib/localflavor/mx/mx_states.py:22
+msgid "Guerrero"
+msgstr "Guerrero"
+
+#: contrib/localflavor/mx/mx_states.py:23
+msgid "Guanajuato"
+msgstr "Guanajuato"
+
+#: contrib/localflavor/mx/mx_states.py:24
+msgid "Hidalgo"
+msgstr "Hidalgo"
+
+#: contrib/localflavor/mx/mx_states.py:25
+msgid "Jalisco"
+msgstr "Jalisco"
+
+#: contrib/localflavor/mx/mx_states.py:26
+msgid "Estado de México"
+msgstr "Estat de Mèxic"
+
+#: contrib/localflavor/mx/mx_states.py:27
+msgid "Michoacán"
+msgstr "Michoacán"
+
+#: contrib/localflavor/mx/mx_states.py:28
+msgid "Morelos"
+msgstr "Morelos"
+
+#: contrib/localflavor/mx/mx_states.py:29
+msgid "Nayarit"
+msgstr "Nayarit"
+
+#: contrib/localflavor/mx/mx_states.py:30
+msgid "Nuevo León"
+msgstr "Nuevo León"
+
+#: contrib/localflavor/mx/mx_states.py:31
+msgid "Oaxaca"
+msgstr "Oaxaca"
+
+#: contrib/localflavor/mx/mx_states.py:32
+msgid "Puebla"
+msgstr "Puebla"
+
+#: contrib/localflavor/mx/mx_states.py:33
+msgid "Querétaro"
+msgstr "Querétaro"
+
+#: contrib/localflavor/mx/mx_states.py:34
+msgid "Quintana Roo"
+msgstr "Quintana Roo"
+
+#: contrib/localflavor/mx/mx_states.py:35
+msgid "Sinaloa"
+msgstr "Sinaloa"
+
+#: contrib/localflavor/mx/mx_states.py:36
+msgid "San Luis Potosí"
+msgstr "San Luis Potosí"
+
+#: contrib/localflavor/mx/mx_states.py:37
+msgid "Sonora"
+msgstr "Sonora"
+
+#: contrib/localflavor/mx/mx_states.py:38
+msgid "Tabasco"
+msgstr "Tabasco"
+
+#: contrib/localflavor/mx/mx_states.py:39
+msgid "Tamaulipas"
+msgstr "Tamaulipas"
+
+#: contrib/localflavor/mx/mx_states.py:40
+msgid "Tlaxcala"
+msgstr "Tlaxcala"
+
+#: contrib/localflavor/mx/mx_states.py:41
+msgid "Veracruz"
+msgstr "Veracruz"
+
+#: contrib/localflavor/mx/mx_states.py:42
+msgid "Yucatán"
+msgstr "Yucatán"
+
+#: contrib/localflavor/mx/mx_states.py:43
+msgid "Zacatecas"
+msgstr "Zacatecas"
+
+#: contrib/localflavor/nl/forms.py:21
+msgid "Enter a valid postal code"
+msgstr "Introduïu un codi postal vàlid."
+
+#: contrib/localflavor/nl/forms.py:52
+msgid "Enter a valid phone number"
+msgstr "Introduïu un número de telèfon vàlid."
+
+#: contrib/localflavor/nl/forms.py:78
+msgid "Enter a valid SoFi number"
+msgstr "Introduïu un número SoFi vàlid."
+
+#: contrib/localflavor/nl/nl_provinces.py:4
+msgid "Drente"
+msgstr "Drente"
+
+#: contrib/localflavor/nl/nl_provinces.py:5
+msgid "Flevoland"
+msgstr "Flevoland"
+
+#: contrib/localflavor/nl/nl_provinces.py:6
+msgid "Friesland"
+msgstr "Friesland"
+
+#: contrib/localflavor/nl/nl_provinces.py:7
+msgid "Gelderland"
+msgstr "Gelderland"
+
+#: contrib/localflavor/nl/nl_provinces.py:8
+msgid "Groningen"
+msgstr "Groningen"
+
+#: contrib/localflavor/nl/nl_provinces.py:9
+msgid "Limburg"
+msgstr "Limburg"
+
+#: contrib/localflavor/nl/nl_provinces.py:10
+msgid "Noord-Brabant"
+msgstr "Noord-Brabant"
+
+#: contrib/localflavor/nl/nl_provinces.py:11
+msgid "Noord-Holland"
+msgstr "Noord-Holland"
+
+#: contrib/localflavor/nl/nl_provinces.py:12
+msgid "Overijssel"
+msgstr "Overijssel"
+
+#: contrib/localflavor/nl/nl_provinces.py:13
+msgid "Utrecht"
+msgstr "Utrecht"
+
+#: contrib/localflavor/nl/nl_provinces.py:14
+msgid "Zeeland"
+msgstr "Zeeland"
+
+#: contrib/localflavor/nl/nl_provinces.py:15
+msgid "Zuid-Holland"
+msgstr "Zuid-Holland"
+
+#: contrib/localflavor/no/forms.py:33
+msgid "Enter a valid Norwegian social security number."
+msgstr "Introduïu un número de la seguretat social Noruega vàlid."
+
+#: contrib/localflavor/pe/forms.py:24
+msgid "This field requires 8 digits."
+msgstr "Aquest camp precisa 8 dígits."
+
+#: contrib/localflavor/pe/forms.py:52
+msgid "This field requires 11 digits."
+msgstr "Aquest camp precisa 11 dígits."
+
+#: contrib/localflavor/pl/forms.py:39
+msgid "National Identification Number consists of 11 digits."
+msgstr "El número d'identidicació nacional està compost de 11 digits."
+
+#: contrib/localflavor/pl/forms.py:40
+msgid "Wrong checksum for the National Identification Number."
+msgstr "Validació invàlida del número d'identificació nacional."
+
+#: contrib/localflavor/pl/forms.py:72
+msgid ""
+"Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX."
+msgstr "Introduïu un número NIP en el format XXX-XXX-XX-XX o XX-XX-XXX-XXX."
+
+#: contrib/localflavor/pl/forms.py:73
+msgid "Wrong checksum for the Tax Number (NIP)."
+msgstr "Validació invàlida del número tributari (NIP)."
+
+#: contrib/localflavor/pl/forms.py:112
+msgid "National Business Register Number (REGON) consists of 7 or 9 digits."
+msgstr ""
+"El número nacional de registre de negocis (REGON) consisteix en 7 o 9 dígits."
+
+#: contrib/localflavor/pl/forms.py:113
+msgid "Wrong checksum for the National Business Register Number (REGON)."
+msgstr "Validació invàlida del número nacional de registre de negocis."
+
+#: contrib/localflavor/pl/forms.py:156
+msgid "Enter a postal code in the format XX-XXX."
+msgstr "Introduïu un codi postal en el format XX-XXX."
+
+#: contrib/localflavor/pl/pl_voivodeships.py:8
+msgid "Lower Silesia"
+msgstr "Lower Silesia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:9
+msgid "Kuyavia-Pomerania"
+msgstr "Kuyavia-Pomerania"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:10
+msgid "Lublin"
+msgstr "Lublin"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:11
+msgid "Lubusz"
+msgstr "Lubusz"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:12
+msgid "Lodz"
+msgstr "Lodz"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:13
+msgid "Lesser Poland"
+msgstr "Lesser Poland"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:14
+msgid "Masovia"
+msgstr "Masovia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:15
+msgid "Opole"
+msgstr "Opole"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:16
+msgid "Subcarpatia"
+msgstr "Subcarpatia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:17
+msgid "Podlasie"
+msgstr "Podlasie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:18
+msgid "Pomerania"
+msgstr "Pomerania"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:19
+msgid "Silesia"
+msgstr "Silesia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:20
+msgid "Swietokrzyskie"
+msgstr "Swietokrzyskie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:21
+msgid "Warmia-Masuria"
+msgstr "Warmia-Masuria"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:22
+msgid "Greater Poland"
+msgstr "Greater Poland"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:23
+msgid "West Pomerania"
+msgstr "West Pomerania"
+
+#: contrib/localflavor/sk/forms.py:30
+msgid "Enter a postal code in the format XXXXX or XXX XX."
+msgstr "Introduïu un codi postal en el format XXXXX or XXX XX."
+
+#: contrib/localflavor/sk/sk_districts.py:8
+msgid "Banska Bystrica"
+msgstr "Banska Bystrica"
+
+#: contrib/localflavor/sk/sk_districts.py:9
+msgid "Banska Stiavnica"
+msgstr "Banska Stiavnica"
+
+#: contrib/localflavor/sk/sk_districts.py:10
+msgid "Bardejov"
+msgstr "Bardejov"
+
+#: contrib/localflavor/sk/sk_districts.py:11
+msgid "Banovce nad Bebravou"
+msgstr "Banovce nad Bebravou"
+
+#: contrib/localflavor/sk/sk_districts.py:12
+msgid "Brezno"
+msgstr "Brezno"
+
+#: contrib/localflavor/sk/sk_districts.py:13
+msgid "Bratislava I"
+msgstr "Bratislava I"
+
+#: contrib/localflavor/sk/sk_districts.py:14
+msgid "Bratislava II"
+msgstr "Bratislava II"
+
+#: contrib/localflavor/sk/sk_districts.py:15
+msgid "Bratislava III"
+msgstr "Bratislava III"
+
+#: contrib/localflavor/sk/sk_districts.py:16
+msgid "Bratislava IV"
+msgstr "Bratislava IV"
+
+#: contrib/localflavor/sk/sk_districts.py:17
+msgid "Bratislava V"
+msgstr "Bratislava V"
+
+#: contrib/localflavor/sk/sk_districts.py:18
+msgid "Bytca"
+msgstr "Bytca"
+
+#: contrib/localflavor/sk/sk_districts.py:19
+msgid "Cadca"
+msgstr "Cadca"
+
+#: contrib/localflavor/sk/sk_districts.py:20
+msgid "Detva"
+msgstr "Detva"
+
+#: contrib/localflavor/sk/sk_districts.py:21
+msgid "Dolny Kubin"
+msgstr "Dolny Kubin"
+
+#: contrib/localflavor/sk/sk_districts.py:22
+msgid "Dunajska Streda"
+msgstr "Dunajska Streda"
+
+#: contrib/localflavor/sk/sk_districts.py:23
+msgid "Galanta"
+msgstr "Galanta"
+
+#: contrib/localflavor/sk/sk_districts.py:24
+msgid "Gelnica"
+msgstr "Gelnica"
+
+#: contrib/localflavor/sk/sk_districts.py:25
+msgid "Hlohovec"
+msgstr "Hlohovec"
+
+#: contrib/localflavor/sk/sk_districts.py:26
+msgid "Humenne"
+msgstr "Humenne"
+
+#: contrib/localflavor/sk/sk_districts.py:27
+msgid "Ilava"
+msgstr "Ilava"
+
+#: contrib/localflavor/sk/sk_districts.py:28
+msgid "Kezmarok"
+msgstr "Kezmarok"
+
+#: contrib/localflavor/sk/sk_districts.py:29
+msgid "Komarno"
+msgstr "Komarno"
+
+#: contrib/localflavor/sk/sk_districts.py:30
+msgid "Kosice I"
+msgstr "Kosice I"
+
+#: contrib/localflavor/sk/sk_districts.py:31
+msgid "Kosice II"
+msgstr "Kosice II"
+
+#: contrib/localflavor/sk/sk_districts.py:32
+msgid "Kosice III"
+msgstr "Kosice III"
+
+#: contrib/localflavor/sk/sk_districts.py:33
+msgid "Kosice IV"
+msgstr "Kosice IV"
+
+#: contrib/localflavor/sk/sk_districts.py:34
+msgid "Kosice - okolie"
+msgstr "Kosice - okolie"
+
+#: contrib/localflavor/sk/sk_districts.py:35
+msgid "Krupina"
+msgstr "Krupina"
+
+#: contrib/localflavor/sk/sk_districts.py:36
+msgid "Kysucke Nove Mesto"
+msgstr "Kysucke Nove Mesto"
+
+#: contrib/localflavor/sk/sk_districts.py:37
+msgid "Levice"
+msgstr "Levice"
+
+#: contrib/localflavor/sk/sk_districts.py:38
+msgid "Levoca"
+msgstr "Levoca"
+
+#: contrib/localflavor/sk/sk_districts.py:39
+msgid "Liptovsky Mikulas"
+msgstr "Liptovsky Mikulas"
+
+#: contrib/localflavor/sk/sk_districts.py:40
+msgid "Lucenec"
+msgstr "Lucenec"
+
+#: contrib/localflavor/sk/sk_districts.py:41
+msgid "Malacky"
+msgstr "Malacky"
+
+#: contrib/localflavor/sk/sk_districts.py:42
+msgid "Martin"
+msgstr "Martin"
+
+#: contrib/localflavor/sk/sk_districts.py:43
+msgid "Medzilaborce"
+msgstr "Medzilaborce"
+
+#: contrib/localflavor/sk/sk_districts.py:44
+msgid "Michalovce"
+msgstr "Michalovce"
+
+#: contrib/localflavor/sk/sk_districts.py:45
+msgid "Myjava"
+msgstr "Myjava"
+
+#: contrib/localflavor/sk/sk_districts.py:46
+msgid "Namestovo"
+msgstr "Namestovo"
+
+#: contrib/localflavor/sk/sk_districts.py:47
+msgid "Nitra"
+msgstr "Nitra"
+
+#: contrib/localflavor/sk/sk_districts.py:48
+msgid "Nove Mesto nad Vahom"
+msgstr "Nove Mesto nad Vahom"
+
+#: contrib/localflavor/sk/sk_districts.py:49
+msgid "Nove Zamky"
+msgstr "Nove Zamky"
+
+#: contrib/localflavor/sk/sk_districts.py:50
+msgid "Partizanske"
+msgstr "Partizanske"
+
+#: contrib/localflavor/sk/sk_districts.py:51
+msgid "Pezinok"
+msgstr "Pezinok"
+
+#: contrib/localflavor/sk/sk_districts.py:52
+msgid "Piestany"
+msgstr "Piestany"
+
+#: contrib/localflavor/sk/sk_districts.py:53
+msgid "Poltar"
+msgstr "Poltar"
+
+#: contrib/localflavor/sk/sk_districts.py:54
+msgid "Poprad"
+msgstr "Poprad"
+
+#: contrib/localflavor/sk/sk_districts.py:55
+msgid "Povazska Bystrica"
+msgstr "Povazska Bystrica"
+
+#: contrib/localflavor/sk/sk_districts.py:56
+msgid "Presov"
+msgstr "Presov"
+
+#: contrib/localflavor/sk/sk_districts.py:57
+msgid "Prievidza"
+msgstr "Prievidza"
+
+#: contrib/localflavor/sk/sk_districts.py:58
+msgid "Puchov"
+msgstr "Puchov"
+
+#: contrib/localflavor/sk/sk_districts.py:59
+msgid "Revuca"
+msgstr "Revuca"
+
+#: contrib/localflavor/sk/sk_districts.py:60
+msgid "Rimavska Sobota"
+msgstr "Rimavska Sobota"
+
+#: contrib/localflavor/sk/sk_districts.py:61
+msgid "Roznava"
+msgstr "Roznava"
+
+#: contrib/localflavor/sk/sk_districts.py:62
+msgid "Ruzomberok"
+msgstr "Ruzomberok"
+
+#: contrib/localflavor/sk/sk_districts.py:63
+msgid "Sabinov"
+msgstr "Sabinov"
+
+#: contrib/localflavor/sk/sk_districts.py:64
+msgid "Senec"
+msgstr "Senec"
+
+#: contrib/localflavor/sk/sk_districts.py:65
+msgid "Senica"
+msgstr "Senica"
+
+#: contrib/localflavor/sk/sk_districts.py:66
+msgid "Skalica"
+msgstr "Skalica"
+
+#: contrib/localflavor/sk/sk_districts.py:67
+msgid "Snina"
+msgstr "Snina"
+
+#: contrib/localflavor/sk/sk_districts.py:68
+msgid "Sobrance"
+msgstr "Sobrance"
+
+#: contrib/localflavor/sk/sk_districts.py:69
+msgid "Spisska Nova Ves"
+msgstr "Spisska Nova Ves"
+
+#: contrib/localflavor/sk/sk_districts.py:70
+msgid "Stara Lubovna"
+msgstr "Stara Lubovna"
+
+#: contrib/localflavor/sk/sk_districts.py:71
+msgid "Stropkov"
+msgstr "Stropkov"
+
+#: contrib/localflavor/sk/sk_districts.py:72
+msgid "Svidnik"
+msgstr "Svidnik"
+
+#: contrib/localflavor/sk/sk_districts.py:73
+msgid "Sala"
+msgstr "Sala"
+
+#: contrib/localflavor/sk/sk_districts.py:74
+msgid "Topolcany"
+msgstr "Topolcany"
+
+#: contrib/localflavor/sk/sk_districts.py:75
+msgid "Trebisov"
+msgstr "Trebisov"
+
+#: contrib/localflavor/sk/sk_districts.py:76
+msgid "Trencin"
+msgstr "Trencin"
+
+#: contrib/localflavor/sk/sk_districts.py:77
+msgid "Trnava"
+msgstr "Trnava"
+
+#: contrib/localflavor/sk/sk_districts.py:78
+msgid "Turcianske Teplice"
+msgstr "Turcianske Teplice"
+
+#: contrib/localflavor/sk/sk_districts.py:79
+msgid "Tvrdosin"
+msgstr "Tvrdosin"
+
+#: contrib/localflavor/sk/sk_districts.py:80
+msgid "Velky Krtis"
+msgstr "Velky Krtis"
+
+#: contrib/localflavor/sk/sk_districts.py:81
+msgid "Vranov nad Toplou"
+msgstr "Vranov nad Toplou"
+
+#: contrib/localflavor/sk/sk_districts.py:82
+msgid "Zlate Moravce"
+msgstr "Zlate Moravce"
+
+#: contrib/localflavor/sk/sk_districts.py:83
+msgid "Zvolen"
+msgstr "Zvolen"
+
+#: contrib/localflavor/sk/sk_districts.py:84
+msgid "Zarnovica"
+msgstr "Zarnovica"
+
+#: contrib/localflavor/sk/sk_districts.py:85
+msgid "Ziar nad Hronom"
+msgstr "Ziar nad Hronom"
+
+#: contrib/localflavor/sk/sk_districts.py:86
+msgid "Zilina"
+msgstr "Zilina"
+
+#: contrib/localflavor/sk/sk_regions.py:8
+msgid "Banska Bystrica region"
+msgstr "Regió de Banska Bystrica"
+
+#: contrib/localflavor/sk/sk_regions.py:9
+msgid "Bratislava region"
+msgstr "Regió de Bratislava"
+
+#: contrib/localflavor/sk/sk_regions.py:10
+msgid "Kosice region"
+msgstr "Regió de Kosice"
+
+#: contrib/localflavor/sk/sk_regions.py:11
+msgid "Nitra region"
+msgstr "Regió de Nitra"
+
+#: contrib/localflavor/sk/sk_regions.py:12
+msgid "Presov region"
+msgstr "Regió de Presov"
+
+#: contrib/localflavor/sk/sk_regions.py:13
+msgid "Trencin region"
+msgstr "Regió de Trencin"
+
+#: contrib/localflavor/sk/sk_regions.py:14
+msgid "Trnava region"
+msgstr "Regió de Trnava"
+
+#: contrib/localflavor/sk/sk_regions.py:15
+msgid "Zilina region"
+msgstr "Regió de Zilina"
+
+#: contrib/localflavor/uk/forms.py:21
+msgid "Enter a valid postcode."
+msgstr "Introdueix un codi postal vàlid."
+
+#: contrib/localflavor/uk/uk_regions.py:11
+msgid "Bedfordshire"
+msgstr "Bedfordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:12
+msgid "Buckinghamshire"
+msgstr "Buckinghamshire"
+
+#: contrib/localflavor/uk/uk_regions.py:14
+msgid "Cheshire"
+msgstr "Cheshire"
+
+#: contrib/localflavor/uk/uk_regions.py:15
+msgid "Cornwall and Isles of Scilly"
+msgstr "Cornwall and Isles of Scilly"
+
+#: contrib/localflavor/uk/uk_regions.py:16
+msgid "Cumbria"
+msgstr "Cumbria"
+
+#: contrib/localflavor/uk/uk_regions.py:17
+msgid "Derbyshire"
+msgstr "Derbyshire"
+
+#: contrib/localflavor/uk/uk_regions.py:18
+msgid "Devon"
+msgstr "Devon"
+
+#: contrib/localflavor/uk/uk_regions.py:19
+msgid "Dorset"
+msgstr "Dorset"
+
+#: contrib/localflavor/uk/uk_regions.py:20
+msgid "Durham"
+msgstr "Durham"
+
+#: contrib/localflavor/uk/uk_regions.py:21
+msgid "East Sussex"
+msgstr "East Sussex"
+
+#: contrib/localflavor/uk/uk_regions.py:22
+msgid "Essex"
+msgstr "Essex"
+
+#: contrib/localflavor/uk/uk_regions.py:23
+msgid "Gloucestershire"
+msgstr "Gloucestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:24
+msgid "Greater London"
+msgstr "Greater London"
+
+#: contrib/localflavor/uk/uk_regions.py:25
+msgid "Greater Manchester"
+msgstr "Greater Manchester"
+
+#: contrib/localflavor/uk/uk_regions.py:26
+msgid "Hampshire"
+msgstr "Hampshire"
+
+#: contrib/localflavor/uk/uk_regions.py:27
+msgid "Hertfordshire"
+msgstr "Hertfordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:28
+msgid "Kent"
+msgstr "Kent"
+
+#: contrib/localflavor/uk/uk_regions.py:29
+msgid "Lancashire"
+msgstr "Lancashire"
+
+#: contrib/localflavor/uk/uk_regions.py:30
+msgid "Leicestershire"
+msgstr "Leicestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:31
+msgid "Lincolnshire"
+msgstr "Lincolnshire"
+
+#: contrib/localflavor/uk/uk_regions.py:32
+msgid "Merseyside"
+msgstr "Merseyside"
+
+#: contrib/localflavor/uk/uk_regions.py:33
+msgid "Norfolk"
+msgstr "Norfolk"
+
+#: contrib/localflavor/uk/uk_regions.py:34
+msgid "North Yorkshire"
+msgstr "North Yorkshire"
+
+#: contrib/localflavor/uk/uk_regions.py:35
+msgid "Northamptonshire"
+msgstr "Northamptonshire"
+
+#: contrib/localflavor/uk/uk_regions.py:36
+msgid "Northumberland"
+msgstr "Northumberland"
+
+#: contrib/localflavor/uk/uk_regions.py:37
+msgid "Nottinghamshire"
+msgstr "Nottinghamshire"
+
+#: contrib/localflavor/uk/uk_regions.py:38
+msgid "Oxfordshire"
+msgstr "Oxfordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:39
+msgid "Shropshire"
+msgstr "Shropshire"
+
+#: contrib/localflavor/uk/uk_regions.py:40
+msgid "Somerset"
+msgstr "Somerset"
+
+#: contrib/localflavor/uk/uk_regions.py:41
+msgid "South Yorkshire"
+msgstr "South Yorkshire"
+
+#: contrib/localflavor/uk/uk_regions.py:42
+msgid "Staffordshire"
+msgstr "Staffordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:43
+msgid "Suffolk"
+msgstr "Suffolk"
+
+#: contrib/localflavor/uk/uk_regions.py:44
+msgid "Surrey"
+msgstr "Surrey"
+
+#: contrib/localflavor/uk/uk_regions.py:45
+msgid "Tyne and Wear"
+msgstr "Tyne and Wear"
+
+#: contrib/localflavor/uk/uk_regions.py:46
+msgid "Warwickshire"
+msgstr "Warwickshire"
+
+#: contrib/localflavor/uk/uk_regions.py:47
+msgid "West Midlands"
+msgstr "West Midlands"
+
+#: contrib/localflavor/uk/uk_regions.py:48
+msgid "West Sussex"
+msgstr "West Sussex"
+
+#: contrib/localflavor/uk/uk_regions.py:49
+msgid "West Yorkshire"
+msgstr "West Yorkshire"
+
+#: contrib/localflavor/uk/uk_regions.py:50
+msgid "Wiltshire"
+msgstr "Wiltshire"
+
+#: contrib/localflavor/uk/uk_regions.py:51
+msgid "Worcestershire"
+msgstr "Worcestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:55
+msgid "County Antrim"
+msgstr "County Antrim"
+
+#: contrib/localflavor/uk/uk_regions.py:56
+msgid "County Armagh"
+msgstr "County Armagh"
+
+#: contrib/localflavor/uk/uk_regions.py:57
+msgid "County Down"
+msgstr "County Down"
+
+#: contrib/localflavor/uk/uk_regions.py:58
+msgid "County Fermanagh"
+msgstr "Comptat de Fermanagh"
+
+#: contrib/localflavor/uk/uk_regions.py:59
+msgid "County Londonderry"
+msgstr "County Londonderry"
+
+#: contrib/localflavor/uk/uk_regions.py:60
+msgid "County Tyrone"
+msgstr "County Tyrone"
+
+#: contrib/localflavor/uk/uk_regions.py:64
+msgid "Clwyd"
+msgstr "Clwyd"
+
+#: contrib/localflavor/uk/uk_regions.py:65
+msgid "Dyfed"
+msgstr "Dyfed"
+
+#: contrib/localflavor/uk/uk_regions.py:66
+msgid "Gwent"
+msgstr "Gwent"
+
+#: contrib/localflavor/uk/uk_regions.py:67
+msgid "Gwynedd"
+msgstr "Gwynedd"
+
+#: contrib/localflavor/uk/uk_regions.py:68
+msgid "Mid Glamorgan"
+msgstr "Mid Glamorgan"
+
+#: contrib/localflavor/uk/uk_regions.py:69
+msgid "Powys"
+msgstr "Powys"
+
+#: contrib/localflavor/uk/uk_regions.py:70
+msgid "South Glamorgan"
+msgstr "Glamorgan Sud"
+
+#: contrib/localflavor/uk/uk_regions.py:71
+msgid "West Glamorgan"
+msgstr "Glamorgan Oest"
+
+#: contrib/localflavor/uk/uk_regions.py:75
+msgid "Borders"
+msgstr "Borders"
+
+#: contrib/localflavor/uk/uk_regions.py:76
+msgid "Central Scotland"
+msgstr "Escòcia central"
+
+#: contrib/localflavor/uk/uk_regions.py:77
+msgid "Dumfries and Galloway"
+msgstr "Dumfries and Galloway"
+
+#: contrib/localflavor/uk/uk_regions.py:78
+msgid "Fife"
+msgstr "Fife"
+
+#: contrib/localflavor/uk/uk_regions.py:79
+msgid "Grampian"
+msgstr "Grampian"
+
+#: contrib/localflavor/uk/uk_regions.py:80
+msgid "Highland"
+msgstr "Highland"
+
+#: contrib/localflavor/uk/uk_regions.py:81
+msgid "Lothian"
+msgstr "Lothian"
+
+#: contrib/localflavor/uk/uk_regions.py:82
+msgid "Orkney Islands"
+msgstr "Orkney Islands"
+
+#: contrib/localflavor/uk/uk_regions.py:83
+msgid "Shetland Islands"
+msgstr "Shetland Islands"
+
+#: contrib/localflavor/uk/uk_regions.py:84
+msgid "Strathclyde"
+msgstr "Strathclyde"
+
+#: contrib/localflavor/uk/uk_regions.py:85
+msgid "Tayside"
+msgstr "Tayside"
+
+#: contrib/localflavor/uk/uk_regions.py:86
+msgid "Western Isles"
+msgstr "Western Isles"
+
+#: contrib/localflavor/uk/uk_regions.py:90
+msgid "England"
+msgstr "Anglaterra"
+
+#: contrib/localflavor/uk/uk_regions.py:91
+msgid "Northern Ireland"
+msgstr "Irlanda del Nord"
+
+#: contrib/localflavor/uk/uk_regions.py:92
+msgid "Scotland"
+msgstr "Escòcia"
+
+#: contrib/localflavor/uk/uk_regions.py:93
+msgid "Wales"
+msgstr "Gal·les"
+
+#: contrib/localflavor/us/forms.py:16
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "Introduïu un codi zip en el format XXXXX o XXXXX-XXXX."
+
+#: contrib/localflavor/us/forms.py:54
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr ""
+"Introduïu un número vàlid de la Seguretat Social dels E.U.A. en el format "
+"XXX-XX-XXXX."
+
+#: contrib/localflavor/za/forms.py:20
+msgid "Enter a valid South African ID number"
+msgstr "Introduïu un número d'Identitat Sud Africà valid"
+
+#: contrib/localflavor/za/forms.py:54
+msgid "Enter a valid South African postal code"
+msgstr "Introduïu un codi postal Sud Africà vàlid."
+
+#: contrib/localflavor/za/za_provinces.py:4
+msgid "Eastern Cape"
+msgstr "Cap Oriental"
+
+#: contrib/localflavor/za/za_provinces.py:5
+msgid "Free State"
+msgstr "Estat lliure"
+
+#: contrib/localflavor/za/za_provinces.py:6
+msgid "Gauteng"
+msgstr "Gauteng"
+
+#: contrib/localflavor/za/za_provinces.py:7
+msgid "KwaZulu-Natal"
+msgstr "KwaZulu-Natal"
+
+#: contrib/localflavor/za/za_provinces.py:8
+msgid "Limpopo"
+msgstr "Limpopo"
+
+#: contrib/localflavor/za/za_provinces.py:9
+msgid "Mpumalanga"
+msgstr "Mpumalanga"
+
+#: contrib/localflavor/za/za_provinces.py:10
+msgid "Northern Cape"
+msgstr "Cap Nord"
+
+#: contrib/localflavor/za/za_provinces.py:11
+msgid "North West"
+msgstr "Cap Oest"
+
+#: contrib/localflavor/za/za_provinces.py:12
+msgid "Western Cape"
+msgstr "Cap Occidental"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "redreçar des de"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Aquesta ruta hauria de ser el camí absolut, excloent-ne el nom del domini. "
+"Exemple '/events/search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "redreçar a"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Això pot ser bé una ruta absoluta (com a dalt) o una URL completa que "
+"comenci per http:// ."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "redreçament"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "redreçaments"
+
+#: contrib/sessions/models.py:41
+msgid "session key"
+msgstr "clau de la sessió"
+
+#: contrib/sessions/models.py:42
+msgid "session data"
+msgstr "dades de la sessió"
+
+#: contrib/sessions/models.py:43
+msgid "expire date"
+msgstr "data de caducitat"
+
+#: contrib/sessions/models.py:48
+msgid "session"
+msgstr "sessió"
+
+#: contrib/sessions/models.py:49
+msgid "sessions"
+msgstr "sessions"
+
+#: contrib/sites/models.py:32
+msgid "domain name"
+msgstr "nom del domini"
+
+#: contrib/sites/models.py:33
+msgid "display name"
+msgstr "nom per mostrar"
+
+#: contrib/sites/models.py:37
+msgid "site"
+msgstr "lloc"
+
+#: contrib/sites/models.py:38
+msgid "sites"
+msgstr "llocs"
+
+#: core/validators.py:72
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Aquest valor ha de contenir només lletres, números i guions baixos."
+
+#: core/validators.py:76
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Aquest valor ha de contenir només lletres, números, guions baixos, guions i "
+"barres (/)."
+
+#: core/validators.py:80
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr ""
+"Aquest valor ha de contenir només lletres, números, guions o guions baixos"
+
+#: core/validators.py:84
+msgid "Uppercase letters are not allowed here."
+msgstr "No es permeten majúscules aquí."
+
+#: core/validators.py:88
+msgid "Lowercase letters are not allowed here."
+msgstr "No es permeten minúscules aquí."
+
+#: core/validators.py:95
+msgid "Enter only digits separated by commas."
+msgstr "Introduïu només dígits separats per comes."
+
+#: core/validators.py:107
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Introduïu adreces de correu electrònic vàlides separades per comes."
+
+#: core/validators.py:111
+msgid "Please enter a valid IP address."
+msgstr "Si el plau, introduïu una adreça IP vàlida."
+
+#: core/validators.py:115
+msgid "Empty values are not allowed here."
+msgstr "No s'admeten valor buits."
+
+#: core/validators.py:119
+msgid "Non-numeric characters aren't allowed here."
+msgstr "No s'admeten caràcters no numèrics."
+
+#: core/validators.py:123
+msgid "This value can't be comprised solely of digits."
+msgstr "Aquest valor no pot contenir només dígits."
+
+#: core/validators.py:128 newforms/fields.py:152
+msgid "Enter a whole number."
+msgstr "Introduïu un número sencer."
+
+#: core/validators.py:132
+msgid "Only alphabetical characters are allowed here."
+msgstr "Només s'admeten caracters alfabètics aquí."
+
+#: core/validators.py:147
+msgid "Year must be 1900 or later."
+msgstr "L'any ha de ser posterior al 1900"
+
+#: core/validators.py:151
+#, python-format
+msgid "Invalid date: %s"
+msgstr "Data invàlida: %s"
+
+#: core/validators.py:156 db/models/fields/__init__.py:548
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Introduïu una data vàlida en el forma AAAA-MM-DD."
+
+#: core/validators.py:161
+msgid "Enter a valid time in HH:MM format."
+msgstr "Introduïu una hora vàlida en el format HH:MM."
+
+#: core/validators.py:165 db/models/fields/__init__.py:625
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Introduïu un data/hora vàlida en format YYYY-MM-DD HH:MM."
+
+#: core/validators.py:170 newforms/fields.py:403
+msgid "Enter a valid e-mail address."
+msgstr "Introduïu una adreça de correu vàlida."
+
+#: core/validators.py:182 core/validators.py:474 newforms/fields.py:433
+#: oldforms/__init__.py:687
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+"No s'ha enviat cap fitxer. Comprovi el tipus de codificació del formulari."
+
+#: core/validators.py:193 newforms/fields.py:459
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Envieu una imatge vàlida. El fitxer que heu enviat no era una imatge o "
+"estava corrupte."
+
+#: core/validators.py:200
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "La URL %s no apunta a una imatge vàlida."
+
+#: core/validators.py:204
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Els números de telèfon han de guardar-se en el format XXX-XXX-XXXX. \"%s\" "
+"no és vàlid."
+
+#: core/validators.py:212
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "La URL %s no apunta a un video QuickTime vàlid."
+
+#: core/validators.py:216
+msgid "A valid URL is required."
+msgstr "Es precisa una URL vàlida."
+
+#: core/validators.py:230
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Es precisa HTML vàlid. Els errors específics són:\n"
+"%s"
+
+#: core/validators.py:237
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "XML incorrectament format: %s"
+
+#: core/validators.py:254
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "URL invàlida: %s"
+
+#: core/validators.py:259 core/validators.py:261
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "La URL %s és un enllaç trencat."
+
+#: core/validators.py:267
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Introdueixi una abreviatura vàlida d'estat dels E.U.A.."
+
+#: core/validators.py:281
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Vigileu amb el vostre llenguatge! Aquí no s'admet la paraula: %s."
+msgstr[1] ""
+"Vigileu amb el vostre llenguatge! Aquí no s'admeten les paraules: %s."
+
+#: core/validators.py:288
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Aquest camp ha de concordar amb el camp '%s'."
+
+#: core/validators.py:307
+msgid "Please enter something for at least one field."
+msgstr "Si us plau, introduïu alguna cosa almenys en un camp."
+
+#: core/validators.py:316 core/validators.py:327
+msgid "Please enter both fields or leave them both empty."
+msgstr "Si us plau, ompliu els dos camps o deixeu-los tots dos en blanc."
+
+#: core/validators.py:335
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "S'ha de proporcionar aquest camp si %(field)s és %(value)s"
+
+#: core/validators.py:348
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "S'ha de proporcionar aquest camp si %(field)s no és %(value)s"
+
+#: core/validators.py:367
+msgid "Duplicate values are not allowed."
+msgstr "No s'admeten valors duplicats."
+
+#: core/validators.py:382
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Aquest valor ha d'estar comprès entre %(lower)s i %(upper)s."
+
+#: core/validators.py:384
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Aquest valor ha de ser com a mínim %s."
+
+#: core/validators.py:386
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Aquest valor ha de ser com a màxim %s."
+
+#: core/validators.py:427
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Aquest valor ha de ser una potència de %s."
+
+#: core/validators.py:437
+msgid "Please enter a valid decimal number."
+msgstr "Si us plau, introduïu un número decimal vàlid."
+
+#: core/validators.py:444
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] ""
+"Si us plau, introduïu un número decimal vàlid de com a màxim %s digit."
+msgstr[1] ""
+"Si us plau, introduïu un número decimal vàlid de com a màxim %s digits."
+
+#: core/validators.py:447
+#, python-format
+msgid ""
+"Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural ""
+"Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] ""
+"Si us plau, introduïu un número decimal vàlid que la seva part sencera sigui "
+"de com a màxim %s digit."
+msgstr[1] ""
+"Si us plau, introduïu un número decimal vàlid que la seva part sencera sigui "
+"de com a màxim %s digits."
+
+#: core/validators.py:450
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] ""
+"Si us plau, introduïu un número decimal vàlid de com a màxim %s posició "
+"decimal."
+msgstr[1] ""
+"Si us plau, introduïu un número decimal vàlid de com a màxim %s posicions "
+"decimals."
+
+#: core/validators.py:458
+msgid "Please enter a valid floating point number."
+msgstr "Si us plau, introduïu un número amb punt de coma flotant vàlid."
+
+#: core/validators.py:467
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr ""
+"Assegureu-vos de que el fitxer que heu enviat té, com a mínim, %s bytes."
+
+#: core/validators.py:468
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr ""
+"Assegureu-vos de que el fitxer que heu enviat té, com a màxim %s bytes."
+
+#: core/validators.py:485
+msgid "The format for this field is wrong."
+msgstr "El format per aquest camp és incorrecte."
+
+#: core/validators.py:500
+msgid "This field is invalid."
+msgstr "El camp no és vàlid."
+
+#: core/validators.py:536
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "No s'ha pogut obtenir res de %s."
+
+#: core/validators.py:539
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"La URL %(url)s ha va tornar la capcelera Content-Type '%(contenttype)s', que "
+"no és vàlida."
+
+#: core/validators.py:572
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Si us plau, tanqueu l'etiqueta %(tag)s des de la línia %(line)s. (La línia "
+"comença amb \"%(start)s\".)"
+
+#: core/validators.py:576
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Part del text que comença en la línia %(line)s no està permès en aquest "
+"context. (La línia comença per \"%(start)s\".)"
+
+#: core/validators.py:581
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"El \"%(attr)s\" de la línia %(line)s no és un atribut vàlid. (La línia "
+"comença per \"%(start)s\".)"
+
+#: core/validators.py:586
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"La \"<%(tag)s>\" de la línia %(line)s no és una etiqueta vàlida. (La línia "
+"comença per \"%(start)s\".)"
+
+#: core/validators.py:590
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Una etiqueta de la línia %(line)s li falta un o més atributs requerits.(La "
+"línia comença per \"%(start)s\".)"
+
+#: core/validators.py:595
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"L'atribut \"%(attr)s\" de la línia %(line)s té un valor que no és vàlid. (La "
+"línia comença per \"%(start)s\".)"
+
+#: db/models/manipulators.py:308
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "Ja existeix un %(object)s del tipus %(type)s amb aquest %(field)s."
+
+#: db/models/fields/__init__.py:51
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "Ja existeix %(optname)s amb aquest %(fieldname)s."
+
+#: db/models/fields/__init__.py:176 db/models/fields/__init__.py:348
+#: db/models/fields/__init__.py:780 db/models/fields/__init__.py:791
+#: newforms/fields.py:46 oldforms/__init__.py:374
+msgid "This field is required."
+msgstr "Aquest camp és obligatori."
+
+#: db/models/fields/__init__.py:448
+msgid "This value must be an integer."
+msgstr "Aquest valor ha de ser un enter."
+
+#: db/models/fields/__init__.py:487
+msgid "This value must be either True or False."
+msgstr "Aquest valor ha de ser True (Veritat) o False (Fals)"
+
+#: db/models/fields/__init__.py:511
+msgid "This field cannot be null."
+msgstr "Aquest camp no pot ser nul."
+
+#: db/models/fields/__init__.py:689
+msgid "This value must be a decimal number."
+msgstr "Aquest valor ha de ser un número decimal."
+
+#: db/models/fields/__init__.py:800
+msgid "Enter a valid filename."
+msgstr "Introduïu un nom de fitxer vàlid."
+
+#: db/models/fields/__init__.py:981
+msgid "This value must be either None, True or False."
+msgstr "Aquest valor ha de ser None (Cap), True (Veritat) o False (Fals)"
+
+#: db/models/fields/related.py:94
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Si us plau, introduïu un %s vàlid."
+
+#: db/models/fields/related.py:746
+msgid "Separate multiple IDs with commas."
+msgstr "Separi múltiples IDs amb comes."
+
+#: db/models/fields/related.py:748
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Premeu la tecla \"Control\" -o \"Command\" en un Mac- per seleccionar més "
+"d'un valor."
+
+#: db/models/fields/related.py:795
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+"Si us plau, introduïu els IDs de %(self)s vàlids. El valor %(value)r és "
+"invàlid."
+msgstr[1] ""
+"Si us plau, introduïu IDs de %(self)s vàlids. Els valors %(value)r són "
+"invàlids."
+
+#: newforms/fields.py:47
+msgid "Enter a valid value."
+msgstr "Introduïu un valor vàlid."
+
+#: newforms/fields.py:124
+#, python-format
+msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+msgstr ""
+"Assegureu-vos de que el valor té com a màxim %(max)d caràcters (en té %"
+"(length)d)."
+
+#: newforms/fields.py:125
+#, python-format
+msgid "Ensure this value has at least %(min)d characters (it has %(length)d)."
+msgstr ""
+"Assegureu-vos de que el valor té com a mínim %(min)d caràcters (en té %"
+"(length)d)."
+
+#: newforms/fields.py:153 newforms/fields.py:182 newforms/fields.py:211
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Aquest valor ha de ser menor o igual a %s."
+
+#: newforms/fields.py:154 newforms/fields.py:183 newforms/fields.py:212
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Assegureu-vos de que aquest valor sigui superior o igual a %s."
+
+#: newforms/fields.py:181 newforms/fields.py:210
+msgid "Enter a number."
+msgstr "Introduïu un número."
+
+#: newforms/fields.py:213
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr "Assegureu-vos de que no hi ha més de %s dígits en total."
+
+#: newforms/fields.py:214
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr "Assegureu-vos de que no hi ha més de %s decimals."
+
+#: newforms/fields.py:215
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr "Assegureu-vos de que no hi ha més de %s dígits decimals."
+
+#: newforms/fields.py:263 newforms/fields.py:750
+msgid "Enter a valid date."
+msgstr "Introduïu una data vàlida."
+
+#: newforms/fields.py:296 newforms/fields.py:751
+msgid "Enter a valid time."
+msgstr "Introduïu una hora vàlida."
+
+#: newforms/fields.py:335
+msgid "Enter a valid date/time."
+msgstr "Introduïu una data/hora vàlides."
+
+#: newforms/fields.py:434
+msgid "No file was submitted."
+msgstr "No s'ha enviat cap fitxer."
+
+#: newforms/fields.py:435 oldforms/__init__.py:689
+msgid "The submitted file is empty."
+msgstr "El fitxer enviat està buit."
+
+#: newforms/fields.py:497
+msgid "Enter a valid URL."
+msgstr "Introduïu una URL vàlida."
+
+#: newforms/fields.py:498
+msgid "This URL appears to be a broken link."
+msgstr "Aquesta URL sembla ser un enllaç trencat."
+
+#: newforms/fields.py:559 newforms/models.py:305
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr ""
+"Escolli una opció vàlida; Aquesta opció no és una de les opcions disponibles."
+
+#: newforms/fields.py:598
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "Esculliu una opció vàlida. %(value)s no és una de les opcions vàlides."
+
+#: newforms/fields.py:599 newforms/fields.py:661 newforms/models.py:372
+msgid "Enter a list of values."
+msgstr "Introduïu una llista de valors."
+
+#: newforms/fields.py:779
+msgid "Enter a valid IPv4 address."
+msgstr "Introduïu una adreça IPv4 vàlida."
+
+#: newforms/models.py:373
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Escolliu una opció vàlida; %s' no és una de les opcions vàlides."
+
+#: oldforms/__init__.py:409
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Assegureu-vos de que el seu text té menys de %s caràcter."
+msgstr[1] "Assegureu-vos de que el seu text té menys de %s caràcters."
+
+#: oldforms/__init__.py:414
+msgid "Line breaks are not allowed here."
+msgstr "No es permeten salts de línia."
+
+#: oldforms/__init__.py:512 oldforms/__init__.py:586 oldforms/__init__.py:625
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Escolliu una opció vàlida; %(data)s' no està dintre de %(choices)s."
+
+#: oldforms/__init__.py:745
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Introduïu un enter entre -32,768 i 32,767."
+
+#: oldforms/__init__.py:755
+msgid "Enter a positive number."
+msgstr "Introduïu un número positiu."
+
+#: oldforms/__init__.py:765
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Introduïu un número entre 0 i 32,767."
+
+#: template/defaultfilters.py:698
+msgid "yes,no,maybe"
+msgstr "si,no,potser"
+
+#: template/defaultfilters.py:729
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d byte"
+msgstr[1] "%(size)d bytes"
+
+#: template/defaultfilters.py:731
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f KB"
+
+#: template/defaultfilters.py:733
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: template/defaultfilters.py:734
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#: utils/dateformat.py:41
+msgid "p.m."
+msgstr "p.m."
+
+#: utils/dateformat.py:42
+msgid "a.m."
+msgstr "a.m."
+
+#: utils/dateformat.py:47
+msgid "PM"
+msgstr "PM"
+
+#: utils/dateformat.py:48
+msgid "AM"
+msgstr "AM"
+
+#: utils/dateformat.py:97
+msgid "midnight"
+msgstr "mitja nit"
+
+#: utils/dateformat.py:99
+msgid "noon"
+msgstr "mig dia"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Dilluns"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Dimarts"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Dimecres"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Dijous"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Divendres"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Dissabte"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Diumenge"
+
+#: utils/dates.py:10
+msgid "Mon"
+msgstr "Dl"
+
+#: utils/dates.py:10
+msgid "Tue"
+msgstr "Dm"
+
+#: utils/dates.py:10
+msgid "Wed"
+msgstr "Dmx"
+
+#: utils/dates.py:10
+msgid "Thu"
+msgstr "Dj"
+
+#: utils/dates.py:10
+msgid "Fri"
+msgstr "Dv"
+
+#: utils/dates.py:11
+msgid "Sat"
+msgstr "Ds"
+
+#: utils/dates.py:11
+msgid "Sun"
+msgstr "Dg"
+
+#: utils/dates.py:18
+msgid "January"
+msgstr "gener"
+
+#: utils/dates.py:18
+msgid "February"
+msgstr "febrer"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "March"
+msgstr "març"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "April"
+msgstr "abril"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "May"
+msgstr "maig"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "June"
+msgstr "juny"
+
+#: utils/dates.py:19 utils/dates.py:31
+msgid "July"
+msgstr "juliol"
+
+#: utils/dates.py:19
+msgid "August"
+msgstr "agost"
+
+#: utils/dates.py:19
+msgid "September"
+msgstr "setembre"
+
+#: utils/dates.py:19
+msgid "October"
+msgstr "octubre"
+
+#: utils/dates.py:19
+msgid "November"
+msgstr "novembre"
+
+#: utils/dates.py:20
+msgid "December"
+msgstr "desembre"
+
+#: utils/dates.py:23
+msgid "jan"
+msgstr "gen"
+
+#: utils/dates.py:23
+msgid "feb"
+msgstr "feb"
+
+#: utils/dates.py:23
+msgid "mar"
+msgstr "mar"
+
+#: utils/dates.py:23
+msgid "apr"
+msgstr "abr"
+
+#: utils/dates.py:23
+msgid "may"
+msgstr "mai"
+
+#: utils/dates.py:23
+msgid "jun"
+msgstr "jun"
+
+#: utils/dates.py:24
+msgid "jul"
+msgstr "jul"
+
+#: utils/dates.py:24
+msgid "aug"
+msgstr "ago"
+
+#: utils/dates.py:24
+msgid "sep"
+msgstr "set"
+
+#: utils/dates.py:24
+msgid "oct"
+msgstr "oct"
+
+#: utils/dates.py:24
+msgid "nov"
+msgstr "nov"
+
+#: utils/dates.py:24
+msgid "dec"
+msgstr "des"
+
+#: utils/dates.py:31
+msgid "Jan."
+msgstr "gen."
+
+#: utils/dates.py:31
+msgid "Feb."
+msgstr "feb."
+
+#: utils/dates.py:32
+msgid "Aug."
+msgstr "ago."
+
+#: utils/dates.py:32
+msgid "Sept."
+msgstr "set."
+
+#: utils/dates.py:32
+msgid "Oct."
+msgstr "oct."
+
+#: utils/dates.py:32
+msgid "Nov."
+msgstr "nov."
+
+#: utils/dates.py:32
+msgid "Dec."
+msgstr "des."
+
+#: utils/text.py:127
+msgid "or"
+msgstr "o"
+
+#: utils/timesince.py:21
+msgid "year"
+msgid_plural "years"
+msgstr[0] "any"
+msgstr[1] "anys"
+
+#: utils/timesince.py:22
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mes"
+msgstr[1] "mesos"
+
+#: utils/timesince.py:23
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "setmana"
+msgstr[1] "setmanes"
+
+#: utils/timesince.py:24
+msgid "day"
+msgid_plural "days"
+msgstr[0] "dia"
+msgstr[1] "dies"
+
+#: utils/timesince.py:25
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "hora"
+msgstr[1] "hores"
+
+#: utils/timesince.py:26
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minut"
+msgstr[1] "minuts"
+
+#: utils/timesince.py:46
+msgid "minutes"
+msgstr "minuts"
+
+#: utils/timesince.py:51
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr "%(number)d %(type)s"
+
+#: utils/timesince.py:57
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ", %(number)d %(type)s"
+
+#: utils/translation/trans_real.py:403
+msgid "DATE_FORMAT"
+msgstr "F j, Y"
+
+#: utils/translation/trans_real.py:404
+msgid "DATETIME_FORMAT"
+msgstr "F j, Y, H:i"
+
+#: utils/translation/trans_real.py:405
+msgid "TIME_FORMAT"
+msgstr "H:i"
+
+#: utils/translation/trans_real.py:421
+msgid "YEAR_MONTH_FORMAT"
+msgstr "j de/d' F del Y"
+
+#: utils/translation/trans_real.py:422
+msgid "MONTH_DAY_FORMAT"
+msgstr "j de/d' F del Y"
+
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "El/la %(verbose_name)s s'ha creat amb èxit."
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "El/la %(verbose_name)s s'ha actualtzat amb èxit."
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "El %(verbose_name)s s'ha eliminat."
+
+#~ msgid "Brazilian"
+#~ msgstr "Brasileny"
+
+#~ msgid "Gaeilge"
+#~ msgstr "Gaeilge"
+
+#~ msgid ""
+#~ "Enter a postcode. A space is required between the two postcode parts."
+#~ msgstr ""
+#~ "Introdueixi un codi postal. És necessari un espai entre les dues parts "
+#~ "del codi postal."
diff --git a/webapp/django/conf/locale/ca/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/ca/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..0df69ae
--- /dev/null
+++ b/webapp/django/conf/locale/ca/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/ca/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/ca/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..67c50c6
--- /dev/null
+++ b/webapp/django/conf/locale/ca/LC_MESSAGES/djangojs.po
@@ -0,0 +1,115 @@
+# translation of djangojs.po to catalan
+# This file is distributed under the same license as the Django package.
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-02-15 01:00+0200\n"
+"PO-Revision-Date: 2008-03-25 18:54+0100\n"
+"Last-Translator: Django Catalan Group <django-cat@googlegroups.com>\n"
+"Language-Team: Catalan <ca@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: VIM 7.1\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "%s Disponibles"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Seleccionar tots"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Afegir"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Eliminar"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "%s Escollits"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Faci les seves seleccions i faci click a"
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Deseleccionar tots"
+
+#: contrib/admin/media/js/dateparse.js:32
+#: contrib/admin/media/js/calendar.js:24
+msgid "January February March April May June July August September October November December"
+msgstr "Gener Febrer Març Abril Maig Juny Juliol Agost Setembre Octubre Novembre Desembre"
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Diumenge Dilluns Dimarts Dimecres Dijous Divendres Dissabte"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "Dg Dl Dt Dc Dj Dv Ds"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Now"
+msgstr "Ara"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
+msgid "Clock"
+msgstr "Rellotje"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
+msgid "Choose a time"
+msgstr "Esculli una hora"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "Midnight"
+msgstr "Mitja nit"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "6 a.m."
+msgstr "6 a.m."
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
+msgid "Noon"
+msgstr "Migdia"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
+msgid "Cancel"
+msgstr "Cancel·lar"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
+msgid "Today"
+msgstr "Avui"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
+msgid "Calendar"
+msgstr "Calendari"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
+msgid "Yesterday"
+msgstr "Ahir"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
+msgid "Tomorrow"
+msgstr "Demà"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr "Mostrar"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr "Ocultar"
+
diff --git a/webapp/django/conf/locale/cs/LC_MESSAGES/django.mo b/webapp/django/conf/locale/cs/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..733ed04
--- /dev/null
+++ b/webapp/django/conf/locale/cs/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/cs/LC_MESSAGES/django.po b/webapp/django/conf/locale/cs/LC_MESSAGES/django.po
new file mode 100644
index 0000000..56ad1fc
--- /dev/null
+++ b/webapp/django/conf/locale/cs/LC_MESSAGES/django.po
@@ -0,0 +1,4541 @@
+# Translation of django.po to Czech
+# Copyright (C) 2005 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the DJANGO package.
+# Radek Svarz <translate@svarz.cz>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-08-20 12:51+0200\n"
+"Language-Team: Czech\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n>1 && n<5 ? 1 : 2;\n"
+
+#: conf/global_settings.py:44
+msgid "Arabic"
+msgstr "arabsky"
+
+#: conf/global_settings.py:45
+msgid "Bengali"
+msgstr "bengálsky"
+
+#: conf/global_settings.py:46
+msgid "Bulgarian"
+msgstr "bulharsky"
+
+#: conf/global_settings.py:47
+msgid "Catalan"
+msgstr "katalánsky"
+
+#: conf/global_settings.py:48
+msgid "Czech"
+msgstr "česky"
+
+#: conf/global_settings.py:49
+msgid "Welsh"
+msgstr "welšsky"
+
+#: conf/global_settings.py:50
+msgid "Danish"
+msgstr "dánsky"
+
+#: conf/global_settings.py:51
+msgid "German"
+msgstr "německy"
+
+#: conf/global_settings.py:52
+msgid "Greek"
+msgstr "řecky"
+
+#: conf/global_settings.py:53
+msgid "English"
+msgstr "anglicky"
+
+#: conf/global_settings.py:54
+msgid "Spanish"
+msgstr "španělsky"
+
+#: conf/global_settings.py:55
+msgid "Estonian"
+msgstr "estonsky"
+
+#: conf/global_settings.py:56
+msgid "Argentinean Spanish"
+msgstr "argentinskou španělštinou"
+
+#: conf/global_settings.py:57
+msgid "Basque"
+msgstr "baskicky"
+
+#: conf/global_settings.py:58
+msgid "Persian"
+msgstr "persky"
+
+#: conf/global_settings.py:59
+msgid "Finnish"
+msgstr "finsky"
+
+#: conf/global_settings.py:60
+msgid "French"
+msgstr "francouzsky"
+
+#: conf/global_settings.py:61
+msgid "Irish"
+msgstr "irsky"
+
+#: conf/global_settings.py:62
+msgid "Galician"
+msgstr "galicijsky"
+
+#: conf/global_settings.py:63
+msgid "Hungarian"
+msgstr "maďarsky"
+
+#: conf/global_settings.py:64
+msgid "Hebrew"
+msgstr "hebrejsky"
+
+#: conf/global_settings.py:65
+msgid "Croatian"
+msgstr "chorvatsky"
+
+#: conf/global_settings.py:66
+msgid "Icelandic"
+msgstr "islandsky"
+
+#: conf/global_settings.py:67
+msgid "Italian"
+msgstr "italsky"
+
+#: conf/global_settings.py:68
+msgid "Japanese"
+msgstr "japonsky"
+
+#: conf/global_settings.py:69
+msgid "Georgian"
+msgstr "gruzijsky"
+
+#: conf/global_settings.py:70
+msgid "Korean"
+msgstr "korejsky"
+
+#: conf/global_settings.py:71
+msgid "Khmer"
+msgstr "khmersky"
+
+#: conf/global_settings.py:72
+msgid "Kannada"
+msgstr "kannadsky"
+
+#: conf/global_settings.py:73
+msgid "Latvian"
+msgstr "litevsky"
+
+#: conf/global_settings.py:74
+msgid "Lithuanian"
+msgstr "lotyšsky"
+
+#: conf/global_settings.py:75
+msgid "Macedonian"
+msgstr "makedonsky"
+
+#: conf/global_settings.py:76
+msgid "Dutch"
+msgstr "holandsky"
+
+#: conf/global_settings.py:77
+msgid "Norwegian"
+msgstr "norsky"
+
+#: conf/global_settings.py:78
+msgid "Polish"
+msgstr "polsky"
+
+#: conf/global_settings.py:79
+msgid "Portugese"
+msgstr "portugalsky"
+
+#: conf/global_settings.py:80
+msgid "Brazilian Portuguese"
+msgstr "brazilskou portugalštinou"
+
+#: conf/global_settings.py:81
+msgid "Romanian"
+msgstr "rumunsky"
+
+#: conf/global_settings.py:82
+msgid "Russian"
+msgstr "rusky"
+
+#: conf/global_settings.py:83
+msgid "Slovak"
+msgstr "slovensky"
+
+#: conf/global_settings.py:84
+msgid "Slovenian"
+msgstr "slovinsky"
+
+#: conf/global_settings.py:85
+msgid "Serbian"
+msgstr "srbsky"
+
+#: conf/global_settings.py:86
+msgid "Swedish"
+msgstr "švédsky"
+
+#: conf/global_settings.py:87
+msgid "Tamil"
+msgstr "tamilsky"
+
+#: conf/global_settings.py:88
+msgid "Telugu"
+msgstr "telužsky"
+
+#: conf/global_settings.py:89
+msgid "Turkish"
+msgstr "turecky"
+
+#: conf/global_settings.py:90
+msgid "Ukrainian"
+msgstr "ukrajinsky"
+
+#: conf/global_settings.py:91
+msgid "Simplified Chinese"
+msgstr "jednoduchou čínštinou"
+
+#: conf/global_settings.py:92
+msgid "Traditional Chinese"
+msgstr "tradiční čínštinou"
+
+#: contrib/admin/filterspecs.py:44
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>%s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:74 contrib/admin/filterspecs.py:92
+#: contrib/admin/filterspecs.py:147 contrib/admin/filterspecs.py:173
+msgid "All"
+msgstr "Vše"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Any date"
+msgstr "Libovolné datum"
+
+#: contrib/admin/filterspecs.py:114
+msgid "Today"
+msgstr "Dnes"
+
+#: contrib/admin/filterspecs.py:117
+msgid "Past 7 days"
+msgstr "Posledních 7 dní"
+
+#: contrib/admin/filterspecs.py:119
+msgid "This month"
+msgstr "Tento měsíc"
+
+#: contrib/admin/filterspecs.py:121
+msgid "This year"
+msgstr "Tento rok"
+
+#: contrib/admin/filterspecs.py:147 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "Yes"
+msgstr "Ano"
+
+#: contrib/admin/filterspecs.py:147 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "No"
+msgstr "Ne"
+
+#: contrib/admin/filterspecs.py:154 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "Unknown"
+msgstr "Neznámé"
+
+#: contrib/admin/models.py:19
+msgid "action time"
+msgstr "čas akce"
+
+#: contrib/admin/models.py:22
+msgid "object id"
+msgstr "object id"
+
+#: contrib/admin/models.py:23
+msgid "object repr"
+msgstr "object repr"
+
+#: contrib/admin/models.py:24
+msgid "action flag"
+msgstr "příznak akce"
+
+#: contrib/admin/models.py:25
+msgid "change message"
+msgstr "zpráva změny"
+
+#: contrib/admin/models.py:28
+msgid "log entry"
+msgstr "log záznam"
+
+#: contrib/admin/models.py:29
+msgid "log entries"
+msgstr "log záznamy"
+
+#: contrib/admin/options.py:56 contrib/admin/options.py:115
+msgid "None"
+msgstr "Žádný"
+
+#: contrib/admin/options.py:326
+#, python-format
+msgid "Changed %s."
+msgstr "Záznam %s změněn."
+
+#: contrib/admin/options.py:326 contrib/admin/options.py:336
+#: core/validators.py:279 db/models/manipulators.py:305
+msgid "and"
+msgstr "a"
+
+#: contrib/admin/options.py:331
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Přidán záznam \"%(object)s\" typu \"%(name)s\"."
+
+#: contrib/admin/options.py:335
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Změněn \"%(list)s\" pro záznam \"%(object)s\" typu \"%(name)s\"."
+
+#: contrib/admin/options.py:340
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Smazán záznam \"%(object)s\" typu \"%(name)s\"."
+
+#: contrib/admin/options.py:344
+msgid "No fields changed."
+msgstr "Nebyly změněny žádná pole."
+
+#: contrib/admin/options.py:405 contrib/auth/admin.py:50
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Záznam \"%(obj)s\" typu \"%(name)s\" byl úspěšně přidán."
+
+#: contrib/admin/options.py:409 contrib/admin/options.py:442
+#: contrib/auth/admin.py:55
+msgid "You may edit it again below."
+msgstr "V úpravách můžete pokračovat níže."
+
+#: contrib/admin/options.py:419 contrib/admin/options.py:452
+#, python-format
+msgid "You may add another %s below."
+msgstr "Další záznam typu \"%s\" můžete přidat níže."
+
+#: contrib/admin/options.py:440
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Záznam \"%(obj)s\" typu \"%(name)s\" byl úspěšně změněn."
+
+#: contrib/admin/options.py:448
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"Záznam \"%(obj)s\" typu \"%(name)s\" byl úspěšně přidán. Níže můžete v "
+"úpravách pokračovat."
+
+#: contrib/admin/options.py:514
+#, python-format
+msgid "Add %s"
+msgstr "%s: přidat"
+
+#: contrib/admin/options.py:591
+#, python-format
+msgid "Change %s"
+msgstr "%s: změnit"
+
+#: contrib/admin/options.py:622
+msgid "Database error"
+msgstr "Databázová chyba"
+
+#: contrib/admin/options.py:671
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Záznam \"%(obj)s\" typu \"%(name)s\" byl úspěšně smazán."
+
+#: contrib/admin/options.py:678
+msgid "Are you sure?"
+msgstr "Jste si jist(á)?"
+
+#: contrib/admin/options.py:705
+#, python-format
+msgid "Change history: %s"
+msgstr "Historie změn: %s"
+
+#: contrib/admin/sites.py:18 contrib/admin/views/decorators.py:16
+#: contrib/auth/forms.py:72 contrib/comments/views/comments.py:56
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Prosíme, vložte správné uživatelské jméno a heslo. Poznámka - u obou položek "
+"se rozlišuje velikost písmen."
+
+#: contrib/admin/sites.py:238 contrib/admin/views/decorators.py:68
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Prosíme, znovu se přihlašte, Vaše sezení vypršelo. Nemusíte se obávat, Vaše "
+"podání je uloženo."
+
+#: contrib/admin/sites.py:245 contrib/admin/views/decorators.py:75
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Vypadá to, že Váš prohlížeč není nastaven, aby akceptoval cookies. Prosíme, "
+"zapněte cookies, obnovte tuto stránku a zkuste znovu."
+
+#: contrib/admin/sites.py:259 contrib/admin/sites.py:265
+#: contrib/admin/views/decorators.py:92
+msgid "Usernames cannot contain the '@' character."
+msgstr "Uživatelská jména nemohou obsahovat znak \"@\"."
+
+#: contrib/admin/sites.py:262 contrib/admin/views/decorators.py:88
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr ""
+"Vaše e-mailová adresa není Vaše uživatelské jméno. Zkuste místo toho \"%s\"."
+
+#: contrib/admin/sites.py:330
+msgid "Site administration"
+msgstr "Django správa"
+
+#: contrib/admin/sites.py:352 contrib/admin/templates/admin/login.html:27
+#: contrib/admin/templates/registration/password_reset_complete.html:14
+#: contrib/admin/views/decorators.py:30
+msgid "Log in"
+msgstr "Přihlášení"
+
+#: contrib/admin/util.py:138
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr ""
+"Položka \"%(fieldname)s\" pro tento záznam typu \"%(name)s\": \"%(obj)s\""
+
+#: contrib/admin/util.py:143
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Položka \"%(fieldname)s\" pro tento záznam typu \"%(name)s\":"
+
+#: contrib/admin/widgets.py:65
+msgid "Date:"
+msgstr "Datum:"
+
+#: contrib/admin/widgets.py:65
+msgid "Time:"
+msgstr "Čas:"
+
+#: contrib/admin/widgets.py:89
+msgid "Currently:"
+msgstr "Momentálně:"
+
+#: contrib/admin/widgets.py:89
+msgid "Change:"
+msgstr "Změna:"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Stránka nenalezena"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Je nám líto, ale vyžádaná stránka nebyla nalezena."
+
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/change_form.html:17
+#: contrib/admin/templates/admin/change_list.html:8
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/auth/user/change_password.html:10
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_reset_complete.html:4
+#: contrib/admin/templates/registration/password_reset_confirm.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Domů"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Chyba serveru"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Chyba serveru (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Chyba serveru <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Nastala chyba. Byla oznámena administrátorovi serveru pomocí e-mailu a měla "
+"by být brzy odstraněna. Děkujeme za trpělivost."
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "Vítejte, uživateli"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Dokumentace"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:13
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+msgid "Change password"
+msgstr "Změnit heslo"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/comments/templates/comments/form.html:6
+msgid "Log out"
+msgstr "Odhlásit se"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django správa webu"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django správa"
+
+#: contrib/admin/templates/admin/change_form.html:19
+#: contrib/admin/templates/admin/index.html:29
+msgid "Add"
+msgstr "Přidat"
+
+#: contrib/admin/templates/admin/change_form.html:26
+#: contrib/admin/templates/admin/object_history.html:5
+msgid "History"
+msgstr "Historie"
+
+#: contrib/admin/templates/admin/change_form.html:27
+msgid "View on site"
+msgstr "Pohled na stránku"
+
+#: contrib/admin/templates/admin/change_form.html:37
+#: contrib/admin/templates/admin/auth/user/change_password.html:22
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Prosíme, odstraňte chybu uvedenou níže."
+msgstr[1] "Prosíme, odstraňte chyby uvedené níže."
+msgstr[2] "Prosíme, odstraňte chyby uvedené níže."
+
+#: contrib/admin/templates/admin/change_list.html:16
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s: přidat"
+
+#: contrib/admin/templates/admin/change_list.html:26
+msgid "Filter"
+msgstr "Filtr"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+#: contrib/admin/templates/admin/edit_inline/tabular.html:15
+msgid "Delete"
+msgstr "Smazat"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:15
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Smazání záznamu \"%(escaped_object)s\" typu \"%(object_name)s\" by vyústilo "
+"ve vymazání souvisejících objektů, ale Váš účet nemá oprávnění pro mazání "
+"následujících typů objektů:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:22
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Jste si jist(á), že chcete smazat záznam \"%(escaped_object)s\" typu \"%"
+"(object_name)s\"? Všechny následující související položky budou smazány:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:27
+msgid "Yes, I'm sure"
+msgstr "Ano, jsem si jist(á)"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Dle: %(filter_title)s "
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Dostupné modely v aplikaci %(name)s."
+
+#: contrib/admin/templates/admin/index.html:19
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:35
+msgid "Change"
+msgstr "Změnit"
+
+#: contrib/admin/templates/admin/index.html:45
+msgid "You don't have permission to edit anything."
+msgstr "Nemáte oprávnění nic měnit."
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "Recent Actions"
+msgstr "Poslední akce"
+
+#: contrib/admin/templates/admin/index.html:54
+msgid "My Actions"
+msgstr "Mé akce"
+
+#: contrib/admin/templates/admin/index.html:58
+msgid "None available"
+msgstr "Nic"
+
+#: contrib/admin/templates/admin/invalid_setup.html:7
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Něco není v pořádku s Vaší instalací databáze. Ujistěte se, že byly "
+"vytvořeny odpovídající tabulky databáze a že databáze je přístupná pro čtení "
+"daným databázovým uživatelem."
+
+#: contrib/admin/templates/admin/login.html:19
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+msgid "Username:"
+msgstr "Uživatelské jméno:"
+
+#: contrib/admin/templates/admin/login.html:22
+#: contrib/comments/templates/comments/form.html:8
+msgid "Password:"
+msgstr "Heslo:"
+
+#: contrib/admin/templates/admin/object_history.html:16
+msgid "Date/time"
+msgstr "Datum/čas"
+
+#: contrib/admin/templates/admin/object_history.html:17
+msgid "User"
+msgstr "Uživatel"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Action"
+msgstr "Akce"
+
+#: contrib/admin/templates/admin/object_history.html:24
+msgid "DATE_WITH_TIME_FULL"
+msgstr "j. N Y, H:i"
+
+#: contrib/admin/templates/admin/object_history.html:32
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Tento objekt nemá historii změn. Pravděpodobně nebyl přidán přes "
+"administrátorské rozhraní."
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Zobrazit všechny"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Provést"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 výsledek"
+msgstr[1] "%(counter)s výsledky"
+msgstr[2] "%(counter)s výsledků"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s celkem"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Uložit jako nový záznam"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Uložit a přidat další záznam"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Uložit a pokračovat v úpravách"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Uložit"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Nejdříve vložte uživatelské jméno a heslo. Poté budete moci upravovat více "
+"uživatelských nastavení."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:13
+#: contrib/auth/forms.py:14 contrib/auth/forms.py:51
+msgid "Username"
+msgstr "Uživatelské jméno"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:20
+#: contrib/admin/templates/admin/auth/user/change_password.html:33
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:52 contrib/auth/forms.py:176
+msgid "Password"
+msgstr "Heslo"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:26
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+#: contrib/auth/forms.py:177
+msgid "Password (again)"
+msgstr "Heslo (znovu)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:27
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+msgid "Enter the same password as above, for verification."
+msgstr "Pro ověření vložte stejné heslo znovu."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:26
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Vložte nové heslo pro uživatele <strong>%(username)s</strong>."
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Děkujeme Vám za Váš strávený čas na našich webových stránkách."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Přihlašte se znovu"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Změna hesla"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Změna hesla byla úspěšná"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Vaše heslo bylo změněno."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Prosíme, vložte svoje staré heslo a poté vložte dvakrát nové heslo. Tak "
+"můžeme ověřit, že jste ho napsal(a) správně."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Staré heslo:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+#: contrib/admin/templates/registration/password_reset_confirm.html:18
+msgid "New password:"
+msgstr "Nové heslo:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+#: contrib/admin/templates/registration/password_reset_confirm.html:20
+msgid "Confirm password:"
+msgstr "Potvrdit heslo:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+#: contrib/admin/templates/registration/password_reset_confirm.html:21
+msgid "Change my password"
+msgstr "Změnit heslo"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:4
+#: contrib/admin/templates/registration/password_reset_confirm.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+msgid "Password reset"
+msgstr "Obnovení hesla"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:6
+#: contrib/admin/templates/registration/password_reset_complete.html:10
+msgid "Password reset complete"
+msgstr "Heslo obnoveno"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:12
+msgid "Your password has been set.  You may go ahead and log in now."
+msgstr "Vaše heslo bylo nastaveno. Nyní se můžete přihlásit."
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:4
+msgid "Password reset confirmation"
+msgstr "Obnovení hesla potvrzeno"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:12
+msgid "Enter new password"
+msgstr "Vložte nové heslo"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:14
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Vložte dvakrát nové heslo. Tak můžeme ověřit, že jste ho napsal(a) správně."
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:26
+msgid "Password reset unsuccessful"
+msgstr "Obnovení hesla nebylo úspěšné"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:28
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used.  Please request a new password reset."
+msgstr ""
+"Odkaz pro obnovení hesla nebyl platný, možná již byl použit. Prosíme, "
+"požádejte o obnovení hesla znovu."
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Obnovení hesla bylo úspěšné"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed you instructions for setting your password to the e-mail "
+"address you submitted. You should be receiving it shortly."
+msgstr ""
+"Poslali jsme Vám e-mailem pokyny pro nastavení vašeho hesla na adresu, "
+"kterou jste zadal(a). Měl(a) byste je dostat během okamžiku."
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Dostal(a) jste tento e-mail, protože jste požádal(a) o obnovení hesla"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "pro Váš uživatelský účet na %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+msgid "Please go to the following page and choose a new password:"
+msgstr "Prosíme, jděte na následující stránku a vyberte nové heslo:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:9
+msgid "Your username, in case you've forgotten:"
+msgstr "Vaše uživatelské jméno, pro případ, že jste zapomněl(a):"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Thanks for using our site!"
+msgstr "Děkujeme za používání našeho webu!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Tým %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll e-mail "
+"instructions for setting a new one."
+msgstr ""
+"Zapomněl(a) jste heslo? Vložte níže Vaši e-mailovou adresu a my Vám e-mailem "
+"zašleme pokyny pro nastavení nového."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "E-mailová adresa:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Obnovit heslo"
+
+#: contrib/admin/templatetags/admin_list.py:284
+msgid "All dates"
+msgstr "Všechna data"
+
+#: contrib/admin/views/main.py:65
+#, python-format
+msgid "Select %s"
+msgstr "%s: vybrat"
+
+#: contrib/admin/views/main.py:65
+#, python-format
+msgid "Select %s to change"
+msgstr "%s: vybrat pro změnu"
+
+#: contrib/admin/views/template.py:36 contrib/sites/models.py:38
+msgid "site"
+msgstr "web"
+
+#: contrib/admin/views/template.py:38
+msgid "template"
+msgstr "šablona"
+
+#: contrib/admindocs/views.py:53 contrib/admindocs/views.py:55
+#: contrib/admindocs/views.py:57
+msgid "tag:"
+msgstr "tag:"
+
+#: contrib/admindocs/views.py:87 contrib/admindocs/views.py:89
+#: contrib/admindocs/views.py:91
+msgid "filter:"
+msgstr "filtr:"
+
+#: contrib/admindocs/views.py:153 contrib/admindocs/views.py:155
+#: contrib/admindocs/views.py:157
+msgid "view:"
+msgstr "pohled (view):"
+
+#: contrib/admindocs/views.py:187
+#, python-format
+msgid "App %r not found"
+msgstr "Aplikace %r nenalezena"
+
+#: contrib/admindocs/views.py:194
+#, python-format
+msgid "Model %(model_name)r not found in app %(app_label)r"
+msgstr "Model %(model_name)r v aplikaci %(app_label)r nenalezen"
+
+#: contrib/admindocs/views.py:206
+#, python-format
+msgid "the related `%(app_label)s.%(data_type)s` object"
+msgstr "související objekt `%(app_label)s.%(data_type)s`"
+
+#: contrib/admindocs/views.py:206 contrib/admindocs/views.py:228
+#: contrib/admindocs/views.py:242 contrib/admindocs/views.py:247
+msgid "model:"
+msgstr "model:"
+
+#: contrib/admindocs/views.py:237
+#, python-format
+msgid "related `%(app_label)s.%(object_name)s` objects"
+msgstr "související objekty `%(app_label)s.%(object_name)s`"
+
+#: contrib/admindocs/views.py:242
+#, python-format
+msgid "all %s"
+msgstr "Vše: %s"
+
+#: contrib/admindocs/views.py:247
+#, python-format
+msgid "number of %s"
+msgstr "Počet: %s"
+
+#: contrib/admindocs/views.py:253
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Pole na objektech  %s"
+
+#: contrib/admindocs/views.py:317 contrib/admindocs/views.py:328
+#: contrib/admindocs/views.py:330 contrib/admindocs/views.py:336
+#: contrib/admindocs/views.py:337 contrib/admindocs/views.py:339
+msgid "Integer"
+msgstr "Celé číslo"
+
+#: contrib/admindocs/views.py:318
+msgid "Boolean (Either True or False)"
+msgstr "Boolean (buď Ano (True), nebo Ne (False))"
+
+#: contrib/admindocs/views.py:319 contrib/admindocs/views.py:338
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Text (maximálně %(max_length)s znaků)"
+
+#: contrib/admindocs/views.py:320
+msgid "Comma-separated integers"
+msgstr "Celá čísla oddělená čárkou"
+
+#: contrib/admindocs/views.py:321
+msgid "Date (without time)"
+msgstr "Datum (bez času)"
+
+#: contrib/admindocs/views.py:322
+msgid "Date (with time)"
+msgstr "Datum (s časem)"
+
+#: contrib/admindocs/views.py:323
+msgid "Decimal number"
+msgstr "Desetinné číslo"
+
+#: contrib/admindocs/views.py:324
+msgid "E-mail address"
+msgstr "E-mailová adresa"
+
+#: contrib/admindocs/views.py:325 contrib/admindocs/views.py:326
+#: contrib/admindocs/views.py:329
+msgid "File path"
+msgstr "Cesta k souboru"
+
+#: contrib/admindocs/views.py:327
+msgid "Floating point number"
+msgstr "Desetinné číslo"
+
+#: contrib/admindocs/views.py:331 contrib/comments/models.py:89
+msgid "IP address"
+msgstr "IP adresa"
+
+#: contrib/admindocs/views.py:333
+msgid "Boolean (Either True, False or None)"
+msgstr "Boolean (buď Ano (True), Ne (False), nebo Nic (None))"
+
+#: contrib/admindocs/views.py:334
+msgid "Relation to parent model"
+msgstr "V relaci k rodičovskému modelu"
+
+#: contrib/admindocs/views.py:335
+msgid "Phone number"
+msgstr "Telefonní číslo"
+
+#: contrib/admindocs/views.py:340
+msgid "Text"
+msgstr "Text"
+
+#: contrib/admindocs/views.py:341
+msgid "Time"
+msgstr "Čas"
+
+#: contrib/admindocs/views.py:342 contrib/flatpages/admin.py:8
+#: contrib/flatpages/models.py:8
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admindocs/views.py:343
+msgid "U.S. state (two uppercase letters)"
+msgstr "Stát US (2 velké znaky)"
+
+#: contrib/admindocs/views.py:344
+msgid "XML text"
+msgstr "XML text"
+
+#: contrib/admindocs/views.py:370
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s pravděpodobně není objekt urlpattern"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Bookmarklety"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:4
+msgid "Documentation bookmarklets"
+msgstr "Dokumentační bookmarklety"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:8
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">Pro nainstalování bookmarkletů, přetáhněte odkaz na Vaše "
+"záložky (oblíbené),\n"
+"nebo klikněte pravým tlačítkem na odkaz a přidejte ho k Vašim záložkám "
+"(oblíbeným). Nyní můžete\n"
+"zvolit bookmarklet z libovolné stránky. Poznámka: Některé tyto\n"
+"bookmarklety vyžadují, abyste prohlížel(a) stránky z počítače, který je "
+"nastaven jako\n"
+"\"\"interní\" (promluvte si s Vaším administrátorem, jestli si nejste "
+"jisti,\n"
+"zda je Váš počítač \"interní\").</p>\n"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:18
+msgid "Documentation for this page"
+msgstr "Dokumentace pro tuto stránku"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:19
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+"Z libovolné stránky otevře dokumentaci pro pohled, který vygeneroval tuto "
+"stránku."
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:21
+msgid "Show object ID"
+msgstr "Ukázat id objektu"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:22
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Ukáže content-type a unikátní ID pro stránky, které reprezentují jeden "
+"objekt."
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:24
+msgid "Edit this object (current window)"
+msgstr "Upravit tento objekt (ve stávajícím okně)"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:25
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "Přepne do admin stránky pro stránky, které reprezentují jeden objekt."
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:27
+msgid "Edit this object (new window)"
+msgstr "Upravit tento objekt (ve novém okně)"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:28
+msgid "As above, but opens the admin page in a new window."
+msgstr "Jako výše, ale otevře admin stránky v novém okně."
+
+#: contrib/auth/admin.py:21
+msgid "Personal info"
+msgstr "Osobní informace"
+
+#: contrib/auth/admin.py:22
+msgid "Permissions"
+msgstr "Oprávnění"
+
+#: contrib/auth/admin.py:23
+msgid "Important dates"
+msgstr "Důležitá data"
+
+#: contrib/auth/admin.py:24
+msgid "Groups"
+msgstr "Skupiny"
+
+#: contrib/auth/admin.py:60
+msgid "Add user"
+msgstr "Uživatel: přidat"
+
+#: contrib/auth/admin.py:85
+msgid "Password changed successfully."
+msgstr "Změna hesla byla úspěšná"
+
+#: contrib/auth/admin.py:91
+#, python-format
+msgid "Change password: %s"
+msgstr "Heslo pro uživatele %s: změnit"
+
+#: contrib/auth/forms.py:15 contrib/auth/models.py:137
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr ""
+"Požadováno. 30 znaků nebo méně. Pouze alfanumerické znaky (znaky, čísla a "
+"podtržítka)."
+
+#: contrib/auth/forms.py:16 core/validators.py:72
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Tato hodnota musí obsahovat pouze znaky, čísla nebo podtržítka."
+
+#: contrib/auth/forms.py:18
+msgid "Password confirmation"
+msgstr "Potvrzení hesla"
+
+#: contrib/auth/forms.py:30
+msgid "A user with that username already exists."
+msgstr "Uživatel s tímto jménem již existuje."
+
+#: contrib/auth/forms.py:36 contrib/auth/forms.py:146
+#: contrib/auth/forms.py:188
+msgid "The two password fields didn't match."
+msgstr "Hesla se neshodují."
+
+#: contrib/auth/forms.py:74 contrib/comments/views/comments.py:58
+msgid "This account is inactive."
+msgstr "Tento účet není aktivní."
+
+#: contrib/auth/forms.py:79 contrib/comments/views/comments.py:49
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"Váš prohlížeč pravděpodobně nemá zapnuté cookies. Cookies jsou potřeba pro "
+"zalogování."
+
+#: contrib/auth/forms.py:92
+msgid "E-mail"
+msgstr "E-mail"
+
+#: contrib/auth/forms.py:101
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr ""
+"K této e-mailové adrese není přiřazen žádný uživatelský účet. Jste si jist"
+"(a), že jste se zaregistroval(a)?"
+
+#: contrib/auth/forms.py:126
+#, python-format
+msgid "Password reset on %s"
+msgstr "Obnovení hesla na %s"
+
+#: contrib/auth/forms.py:134
+msgid "New password"
+msgstr "Nové heslo"
+
+#: contrib/auth/forms.py:135
+msgid "New password confirmation"
+msgstr "Potvrzení nového hesla"
+
+#: contrib/auth/forms.py:160
+msgid "Old password"
+msgstr "Staré heslo"
+
+#: contrib/auth/forms.py:168
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Vaše staré heslo nebylo vloženo správně. Prosíme, zkuste to znovu."
+
+#: contrib/auth/models.py:73 contrib/auth/models.py:96
+msgid "name"
+msgstr "jméno"
+
+#: contrib/auth/models.py:75
+msgid "codename"
+msgstr "codename"
+
+#: contrib/auth/models.py:78
+msgid "permission"
+msgstr "oprávnění"
+
+#: contrib/auth/models.py:79 contrib/auth/models.py:97
+msgid "permissions"
+msgstr "oprávnění"
+
+#: contrib/auth/models.py:100
+msgid "group"
+msgstr "skupina"
+
+#: contrib/auth/models.py:101 contrib/auth/models.py:147
+msgid "groups"
+msgstr "skupiny"
+
+#: contrib/auth/models.py:137
+msgid "username"
+msgstr "uživatelské jméno"
+
+#: contrib/auth/models.py:138
+msgid "first name"
+msgstr "křestní jméno"
+
+#: contrib/auth/models.py:139
+msgid "last name"
+msgstr "příjmení"
+
+#: contrib/auth/models.py:140
+msgid "e-mail address"
+msgstr "e-mailová adresa"
+
+#: contrib/auth/models.py:141
+msgid "password"
+msgstr "heslo"
+
+#: contrib/auth/models.py:141
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"Použijte formát \"[algo]$[salt]$[hexdigest]\" nebo <a href=\"password/"
+"\">formulář pro změnu hesla</a>."
+
+#: contrib/auth/models.py:142
+msgid "staff status"
+msgstr "administrativní přístup "
+
+#: contrib/auth/models.py:142
+msgid "Designates whether the user can log into this admin site."
+msgstr "Rozhodne, zda se uživatel může přihlásit do správy webu."
+
+#: contrib/auth/models.py:143
+msgid "active"
+msgstr "aktivní"
+
+#: contrib/auth/models.py:143
+msgid ""
+"Designates whether this user should be treated as active. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"Rozhodne, zda může být uživatel považován za aktivního. Nastavte toto místo "
+"mazání účtů."
+
+#: contrib/auth/models.py:144
+msgid "superuser status"
+msgstr "stav superuživatel"
+
+#: contrib/auth/models.py:144
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr ""
+"Stanoví, že uživatel má veškerá oprávnění bez jejich explicitního přiřazení."
+
+#: contrib/auth/models.py:145
+msgid "last login"
+msgstr "poslední přihlášení"
+
+#: contrib/auth/models.py:146
+msgid "date joined"
+msgstr "datum registrace"
+
+#: contrib/auth/models.py:148
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"Kromě manuálně přidělených oprávnění uživatel dostane všechna oprávnění pro "
+"každou skupinu, ve které je."
+
+#: contrib/auth/models.py:149
+msgid "user permissions"
+msgstr "uživatelská oprávnění"
+
+#: contrib/auth/models.py:153
+msgid "user"
+msgstr "uživatel"
+
+#: contrib/auth/models.py:154
+msgid "users"
+msgstr "uživatelé"
+
+#: contrib/auth/models.py:309
+msgid "message"
+msgstr "zpráva"
+
+#: contrib/auth/views.py:50
+msgid "Logged out"
+msgstr "Odhlášeno"
+
+#: contrib/comments/models.py:71 contrib/comments/models.py:164
+msgid "object ID"
+msgstr "ID objektu"
+
+#: contrib/comments/models.py:72
+msgid "headline"
+msgstr "titulek"
+
+#: contrib/comments/models.py:73 contrib/comments/models.py:95
+#: contrib/comments/models.py:165
+msgid "comment"
+msgstr "komentář"
+
+#: contrib/comments/models.py:74
+msgid "rating #1"
+msgstr "hodnocení #1"
+
+#: contrib/comments/models.py:75
+msgid "rating #2"
+msgstr "hodnocení #2"
+
+#: contrib/comments/models.py:76
+msgid "rating #3"
+msgstr "hodnocení #3"
+
+#: contrib/comments/models.py:77
+msgid "rating #4"
+msgstr "hodnocení #4"
+
+#: contrib/comments/models.py:78
+msgid "rating #5"
+msgstr "hodnocení #5"
+
+#: contrib/comments/models.py:79
+msgid "rating #6"
+msgstr "hodnocení #6"
+
+#: contrib/comments/models.py:80
+msgid "rating #7"
+msgstr "hodnocení #7"
+
+#: contrib/comments/models.py:81
+msgid "rating #8"
+msgstr "hodnocení #8"
+
+#: contrib/comments/models.py:86
+msgid "is valid rating"
+msgstr "je platné hodnocení"
+
+#: contrib/comments/models.py:87 contrib/comments/models.py:167
+msgid "date/time submitted"
+msgstr "datum/čas byl zaslán"
+
+#: contrib/comments/models.py:88 contrib/comments/models.py:168
+msgid "is public"
+msgstr "je veřejné"
+
+#: contrib/comments/models.py:90
+msgid "is removed"
+msgstr "je odstraněno"
+
+#: contrib/comments/models.py:90
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Zaškrtněte tento box, pokud komentář není vhodný. Místo něj bude zobrazena "
+"zpráva \"Tento komentář byl smazán\"."
+
+#: contrib/comments/models.py:96
+msgid "comments"
+msgstr "komentáře"
+
+#: contrib/comments/models.py:128 contrib/comments/models.py:199
+msgid "Content object"
+msgstr "objekt obsahu"
+
+#: contrib/comments/models.py:156
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Zadané %(user)s dne %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:166
+msgid "person's name"
+msgstr "jméno osoby"
+
+#: contrib/comments/models.py:169
+msgid "ip address"
+msgstr "IP adresa"
+
+#: contrib/comments/models.py:171
+msgid "approved by staff"
+msgstr "scháleno správci"
+
+#: contrib/comments/models.py:175
+msgid "free comment"
+msgstr "volný komentář"
+
+#: contrib/comments/models.py:176
+msgid "free comments"
+msgstr "volné komentáře"
+
+#: contrib/comments/models.py:227
+msgid "score"
+msgstr "hodnocení"
+
+#: contrib/comments/models.py:228
+msgid "score date"
+msgstr "expirace hodnocení"
+
+#: contrib/comments/models.py:232
+msgid "karma score"
+msgstr "karma bod"
+
+#: contrib/comments/models.py:233
+msgid "karma scores"
+msgstr "karma body"
+
+#: contrib/comments/models.py:237
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d hodnoceno od %(user)s"
+
+#: contrib/comments/models.py:254
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Tento komentář byl označkován uživatelem %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:262
+msgid "flag date"
+msgstr "datum označení"
+
+#: contrib/comments/models.py:266
+msgid "user flag"
+msgstr "uživatelské označení"
+
+#: contrib/comments/models.py:267
+msgid "user flags"
+msgstr "uživatelská označení"
+
+#: contrib/comments/models.py:271
+#, python-format
+msgid "Flag by %r"
+msgstr "Označeno %r"
+
+#: contrib/comments/models.py:277
+msgid "deletion date"
+msgstr "datum smazání"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "vymazáno moderátorem"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "vymazané moderátorem"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Vymazáno moderátorem od %r"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Zapomenuté heslo?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Hodnocení"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Povinné"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Volitelné"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Zařadit fotografii"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Komentář:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Náhled komentáře"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Vaše jméno:"
+
+#: contrib/comments/views/comments.py:76
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr ""
+"Toto hodnocení je povinné, protože jste zadal(a) alespoň jedno jiné "
+"hodnocení."
+
+#: contrib/comments/views/comments.py:160
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Tento komentář byl odevzdán uživatelem, který(á) odevzdal(a) méně než %"
+"(count)s komentář:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Tento komentář byl odevzdán uživatelem, který(á) odevzdal(a) méně než %"
+"(count)s komentáře:\n"
+"\n"
+"%(text)s"
+msgstr[2] ""
+"Tento komentář byl odevzdán uživatelem, který(á) odevzdal(a) méně než %"
+"(count)s komentářů:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:165
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Tento komentář byl odevzdán povrchním uživatelem:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:238
+#: contrib/comments/views/comments.py:331
+msgid "Only POSTs are allowed"
+msgstr "Je povolená pouze metoda POST"
+
+#: contrib/comments/views/comments.py:242
+#: contrib/comments/views/comments.py:335
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Jedno nebo více povinných polí nebylo vyplněné"
+
+#: contrib/comments/views/comments.py:246
+#: contrib/comments/views/comments.py:337
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Někdo falšoval formulář komentáře (bezpečnostní narušení)"
+
+#: contrib/comments/views/comments.py:256
+#: contrib/comments/views/comments.py:343
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"Formulář komentáře měl neplatný parametr \"target\" -- ID objektu nebylo "
+"platné"
+
+#: contrib/comments/views/comments.py:307
+#: contrib/comments/views/comments.py:372
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "Formulář komentáře neobsahoval buď \"preview\" nebo \"post\""
+
+#: contrib/comments/views/karma.py:21
+msgid "Anonymous users cannot vote"
+msgstr "Anonymní uživatelé nemohou hlasovat"
+
+#: contrib/comments/views/karma.py:25
+msgid "Invalid comment ID"
+msgstr "Neplatné ID komentáře"
+
+#: contrib/comments/views/karma.py:27
+msgid "No voting for yourself"
+msgstr "Nelze hlasovat pro sebe"
+
+#: contrib/contenttypes/models.py:67
+msgid "python model class name"
+msgstr "jméno modelu v Pythonu"
+
+#: contrib/contenttypes/models.py:71
+msgid "content type"
+msgstr "typ obsahu"
+
+#: contrib/contenttypes/models.py:72
+msgid "content types"
+msgstr "typy obsahu"
+
+#: contrib/flatpages/admin.py:9
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Příklad: \"/o/kontakt/\". Ujistěte se, že máte počáteční a konečná lomítka."
+
+#: contrib/flatpages/admin.py:11 core/validators.py:76
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Tato hodnota musí obsahovat pouze znaky, čísla, podtržítka, pomlčky nebo "
+"lomítka."
+
+#: contrib/flatpages/admin.py:22
+msgid "Advanced options"
+msgstr "Pokročilá nastavení"
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "titulek"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "obsah"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "povolit komentáře"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "jméno šablony"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"Příklad: \"flatpages/kontaktni_stranka.html\". Pokud toto není zadáno, "
+"systém použije \"flatpages/default.html\"."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "nutná registrace"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+"Pokud je zaškrtnuto, pouze přihlášení uživatelé budou moci prohlížet tuto "
+"stránku."
+
+#: contrib/flatpages/models.py:19
+msgid "flat page"
+msgstr "statická stránka"
+
+#: contrib/flatpages/models.py:20
+msgid "flat pages"
+msgstr "statické stránky"
+
+#: contrib/gis/forms/fields.py:10
+msgid "No geometry value provided."
+msgstr "Hodnota geometrie nedodána."
+
+#: contrib/gis/forms/fields.py:11
+msgid "Invalid Geometry value."
+msgstr "Neplatná hodnota geometrie."
+
+#: contrib/gis/forms/fields.py:12
+msgid "Invalid Geometry type."
+msgstr "Neplatný typ geometrie."
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "th"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "st"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "nd"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "rd"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:51
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: contrib/humanize/templatetags/humanize.py:54
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: contrib/humanize/templatetags/humanize.py:57
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "one"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "two"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "three"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "four"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "five"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "six"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "seven"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "eight"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "nine"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:93
+msgid "today"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:95
+msgid "tomorrow"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:97
+msgid "yesterday"
+msgstr ""
+
+#: contrib/localflavor/ar/forms.py:27
+msgid "Enter a postal code in the format NNNN or ANNNNAAA."
+msgstr ""
+
+#: contrib/localflavor/ar/forms.py:49 contrib/localflavor/br/forms.py:96
+#: contrib/localflavor/br/forms.py:135 contrib/localflavor/pe/forms.py:23
+#: contrib/localflavor/pe/forms.py:51
+msgid "This field requires only numbers."
+msgstr ""
+
+#: contrib/localflavor/ar/forms.py:50
+msgid "This field requires 7 or 8 digits."
+msgstr ""
+
+#: contrib/localflavor/ar/forms.py:79
+msgid "Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format."
+msgstr ""
+
+#: contrib/localflavor/ar/forms.py:80
+msgid "Invalid CUIT."
+msgstr ""
+
+#: contrib/localflavor/at/at_states.py:5
+msgid "Burgenland"
+msgstr ""
+
+#: contrib/localflavor/at/at_states.py:6
+msgid "Carinthia"
+msgstr ""
+
+#: contrib/localflavor/at/at_states.py:7
+msgid "Lower Austria"
+msgstr ""
+
+#: contrib/localflavor/at/at_states.py:8
+msgid "Upper Austria"
+msgstr ""
+
+#: contrib/localflavor/at/at_states.py:9
+msgid "Salzburg"
+msgstr ""
+
+#: contrib/localflavor/at/at_states.py:10
+msgid "Styria"
+msgstr ""
+
+#: contrib/localflavor/at/at_states.py:11
+msgid "Tyrol"
+msgstr ""
+
+#: contrib/localflavor/at/at_states.py:12
+msgid "Vorarlberg"
+msgstr ""
+
+#: contrib/localflavor/at/at_states.py:13
+msgid "Vienna"
+msgstr ""
+
+#: contrib/localflavor/at/forms.py:20 contrib/localflavor/ch/forms.py:16
+#: contrib/localflavor/no/forms.py:12
+msgid "Enter a zip code in the format XXXX."
+msgstr ""
+
+#: contrib/localflavor/at/forms.py:48
+msgid "Enter a valid Austrian Social Security Number in XXXX XXXXXX format."
+msgstr ""
+
+#: contrib/localflavor/au/forms.py:16
+msgid "Enter a 4 digit post code."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:21
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:58
+msgid ""
+"Select a valid brazilian state. That state is not one of the available "
+"states."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:94
+msgid "Invalid CPF number."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:95
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:134
+msgid "Invalid CNPJ number."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:136
+msgid "This field requires at least 14 digits"
+msgstr ""
+
+#: contrib/localflavor/ca/forms.py:17
+msgid "Enter a postal code in the format XXX XXX."
+msgstr ""
+
+#: contrib/localflavor/ca/forms.py:88
+msgid "Enter a valid Canadian Social Insurance number in XXX-XXX-XXX format."
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr ""
+
+#: contrib/localflavor/ch/forms.py:64
+msgid ""
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
+msgstr ""
+
+#: contrib/localflavor/cl/forms.py:29
+msgid "Enter a valid Chilean RUT."
+msgstr ""
+
+#: contrib/localflavor/cl/forms.py:30
+msgid "Enter a valid Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr ""
+
+#: contrib/localflavor/cl/forms.py:31
+msgid "The Chilean RUT is not valid."
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr ""
+
+#: contrib/localflavor/de/forms.py:14 contrib/localflavor/fi/forms.py:12
+#: contrib/localflavor/fr/forms.py:15
+msgid "Enter a zip code in the format XXXXX."
+msgstr ""
+
+#: contrib/localflavor/de/forms.py:41
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:5
+msgid "Arava"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:6
+msgid "Albacete"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:7
+msgid "Alacant"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:8
+msgid "Almeria"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:9
+msgid "Avila"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:10
+msgid "Badajoz"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:11
+msgid "Illes Balears"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:12
+msgid "Barcelona"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:13
+msgid "Burgos"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:14
+msgid "Caceres"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:15
+msgid "Cadiz"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:16
+msgid "Castello"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:17
+msgid "Ciudad Real"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:18
+msgid "Cordoba"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:19
+msgid "A Coruna"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:20
+msgid "Cuenca"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:21
+msgid "Girona"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:22
+msgid "Granada"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:23
+msgid "Guadalajara"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:24
+msgid "Guipuzkoa"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:25
+msgid "Huelva"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:26
+msgid "Huesca"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:27
+msgid "Jaen"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:28
+msgid "Leon"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:29
+msgid "Lleida"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:30
+#: contrib/localflavor/es/es_regions.py:17
+msgid "La Rioja"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:31
+msgid "Lugo"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:32
+#: contrib/localflavor/es/es_regions.py:18
+msgid "Madrid"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:33
+msgid "Malaga"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:34
+msgid "Murcia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:35
+msgid "Navarre"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:36
+msgid "Ourense"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:37
+msgid "Asturias"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:38
+msgid "Palencia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:39
+msgid "Las Palmas"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:40
+msgid "Pontevedra"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:41
+msgid "Salamanca"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:42
+msgid "Santa Cruz de Tenerife"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:43
+#: contrib/localflavor/es/es_regions.py:11
+msgid "Cantabria"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:44
+msgid "Segovia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:45
+msgid "Seville"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:46
+msgid "Soria"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:47
+msgid "Tarragona"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:48
+msgid "Teruel"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:49
+msgid "Toledo"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:50
+msgid "Valencia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:51
+msgid "Valladolid"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:52
+msgid "Bizkaia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:53
+msgid "Zamora"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:54
+msgid "Zaragoza"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:55
+msgid "Ceuta"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:56
+msgid "Melilla"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:5
+msgid "Andalusia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:6
+msgid "Aragon"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:7
+msgid "Principality of Asturias"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:8
+msgid "Balearic Islands"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:9
+msgid "Basque Country"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:10
+msgid "Canary Islands"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:12
+msgid "Castile-La Mancha"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:13
+msgid "Castile and Leon"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:14
+msgid "Catalonia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:15
+msgid "Extremadura"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:16
+msgid "Galicia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:19
+msgid "Region of Murcia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:20
+msgid "Foral Community of Navarre"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:21
+msgid "Valencian Community"
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:19
+msgid "Enter a valid postal code in the range and format 01XXX - 52XXX."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:39
+msgid ""
+"Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or "
+"9XXXXXXXX."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:66
+msgid "Please enter a valid NIF, NIE, or CIF."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:67
+msgid "Please enter a valid NIF or NIE."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:68
+msgid "Invalid checksum for NIF."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:69
+msgid "Invalid checksum for NIE."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:70
+msgid "Invalid checksum for CIF."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:142
+msgid ""
+"Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:143
+msgid "Invalid checksum for bank account number."
+msgstr ""
+
+#: contrib/localflavor/fi/forms.py:28
+msgid "Enter a valid Finnish social security number."
+msgstr ""
+
+#: contrib/localflavor/in_/forms.py:14
+msgid "Enter a zip code in the format XXXXXXX."
+msgstr ""
+
+#: contrib/localflavor/is_/forms.py:17
+msgid ""
+"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr ""
+
+#: contrib/localflavor/is_/forms.py:18
+msgid "The Icelandic identification number is not valid."
+msgstr ""
+
+#: contrib/localflavor/it/forms.py:14
+msgid "Enter a valid zip code."
+msgstr ""
+
+#: contrib/localflavor/it/forms.py:43
+msgid "Enter a valid Social Security number."
+msgstr ""
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr ""
+
+#: contrib/localflavor/jp/forms.py:17
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:12
+msgid "Aguascalientes"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:13
+msgid "Baja California"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:14
+msgid "Baja California Sur"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:15
+msgid "Campeche"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:16
+msgid "Chihuahua"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:17
+msgid "Chiapas"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:18
+msgid "Coahuila"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:19
+msgid "Colima"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:20
+msgid "Distrito Federal"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:21
+msgid "Durango"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:22
+msgid "Guerrero"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:23
+msgid "Guanajuato"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:24
+msgid "Hidalgo"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:25
+msgid "Jalisco"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:26
+msgid "Estado de México"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:27
+msgid "Michoacán"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:28
+msgid "Morelos"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:29
+msgid "Nayarit"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:30
+msgid "Nuevo León"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:31
+msgid "Oaxaca"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:32
+msgid "Puebla"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:33
+msgid "Querétaro"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:34
+msgid "Quintana Roo"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:35
+msgid "Sinaloa"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:36
+msgid "San Luis Potosí"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:37
+msgid "Sonora"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:38
+msgid "Tabasco"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:39
+msgid "Tamaulipas"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:40
+msgid "Tlaxcala"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:41
+msgid "Veracruz"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:42
+msgid "Yucatán"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:43
+msgid "Zacatecas"
+msgstr ""
+
+#: contrib/localflavor/nl/forms.py:21
+msgid "Enter a valid postal code"
+msgstr ""
+
+#: contrib/localflavor/nl/forms.py:52
+msgid "Enter a valid phone number"
+msgstr ""
+
+#: contrib/localflavor/nl/forms.py:78
+msgid "Enter a valid SoFi number"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:4
+msgid "Drenthe"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:5
+msgid "Flevoland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:6
+msgid "Friesland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:7
+msgid "Gelderland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:8
+msgid "Groningen"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:9
+msgid "Limburg"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:10
+msgid "Noord-Brabant"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:11
+msgid "Noord-Holland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:12
+msgid "Overijssel"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:13
+msgid "Utrecht"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:14
+msgid "Zeeland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:15
+msgid "Zuid-Holland"
+msgstr ""
+
+#: contrib/localflavor/no/forms.py:33
+msgid "Enter a valid Norwegian social security number."
+msgstr ""
+
+#: contrib/localflavor/pe/forms.py:24
+msgid "This field requires 8 digits."
+msgstr ""
+
+#: contrib/localflavor/pe/forms.py:52
+msgid "This field requires 11 digits."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:38
+msgid "National Identification Number consists of 11 digits."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:39
+msgid "Wrong checksum for the National Identification Number."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:71
+msgid ""
+"Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:72
+msgid "Wrong checksum for the Tax Number (NIP)."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:111
+msgid "National Business Register Number (REGON) consists of 7 or 9 digits."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:112
+msgid "Wrong checksum for the National Business Register Number (REGON)."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:155
+msgid "Enter a postal code in the format XX-XXX."
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:8
+msgid "Lower Silesia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:9
+msgid "Kuyavia-Pomerania"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:10
+msgid "Lublin"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:11
+msgid "Lubusz"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:12
+msgid "Lodz"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:13
+msgid "Lesser Poland"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:14
+msgid "Masovia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:15
+msgid "Opole"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:16
+msgid "Subcarpatia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:17
+msgid "Podlasie"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:18
+msgid "Pomerania"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:19
+msgid "Silesia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:20
+msgid "Swietokrzyskie"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:21
+msgid "Warmia-Masuria"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:22
+msgid "Greater Poland"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:23
+msgid "West Pomerania"
+msgstr ""
+
+#: contrib/localflavor/ro/forms.py:19
+msgid "Enter a valid CIF."
+msgstr ""
+
+#: contrib/localflavor/ro/forms.py:56
+msgid "Enter a valid CNP."
+msgstr ""
+
+#: contrib/localflavor/ro/forms.py:141
+msgid "Enter a valid IBAN in ROXX-XXXX-XXXX-XXXX-XXXX-XXXX format"
+msgstr ""
+
+#: contrib/localflavor/ro/forms.py:171
+msgid "Phone numbers must be in XXXX-XXXXXX format."
+msgstr ""
+
+#: contrib/localflavor/ro/forms.py:194
+msgid "Enter a valid postal code in the format XXXXXX"
+msgstr ""
+
+#: contrib/localflavor/sk/forms.py:30
+msgid "Enter a postal code in the format XXXXX or XXX XX."
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:8
+msgid "Banska Bystrica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:9
+msgid "Banska Stiavnica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:10
+msgid "Bardejov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:11
+msgid "Banovce nad Bebravou"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:12
+msgid "Brezno"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:13
+msgid "Bratislava I"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:14
+msgid "Bratislava II"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:15
+msgid "Bratislava III"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:16
+msgid "Bratislava IV"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:17
+msgid "Bratislava V"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:18
+msgid "Bytca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:19
+msgid "Cadca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:20
+msgid "Detva"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:21
+msgid "Dolny Kubin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:22
+msgid "Dunajska Streda"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:23
+msgid "Galanta"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:24
+msgid "Gelnica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:25
+msgid "Hlohovec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:26
+msgid "Humenne"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:27
+msgid "Ilava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:28
+msgid "Kezmarok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:29
+msgid "Komarno"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:30
+msgid "Kosice I"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:31
+msgid "Kosice II"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:32
+msgid "Kosice III"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:33
+msgid "Kosice IV"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:34
+msgid "Kosice - okolie"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:35
+msgid "Krupina"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:36
+msgid "Kysucke Nove Mesto"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:37
+msgid "Levice"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:38
+msgid "Levoca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:39
+msgid "Liptovsky Mikulas"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:40
+msgid "Lucenec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:41
+msgid "Malacky"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:42
+msgid "Martin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:43
+msgid "Medzilaborce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:44
+msgid "Michalovce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:45
+msgid "Myjava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:46
+msgid "Namestovo"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:47
+msgid "Nitra"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:48
+msgid "Nove Mesto nad Vahom"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:49
+msgid "Nove Zamky"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:50
+msgid "Partizanske"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:51
+msgid "Pezinok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:52
+msgid "Piestany"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:53
+msgid "Poltar"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:54
+msgid "Poprad"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:55
+msgid "Povazska Bystrica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:56
+msgid "Presov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:57
+msgid "Prievidza"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:58
+msgid "Puchov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:59
+msgid "Revuca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:60
+msgid "Rimavska Sobota"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:61
+msgid "Roznava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:62
+msgid "Ruzomberok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:63
+msgid "Sabinov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:64
+msgid "Senec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:65
+msgid "Senica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:66
+msgid "Skalica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:67
+msgid "Snina"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:68
+msgid "Sobrance"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:69
+msgid "Spisska Nova Ves"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:70
+msgid "Stara Lubovna"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:71
+msgid "Stropkov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:72
+msgid "Svidnik"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:73
+msgid "Sala"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:74
+msgid "Topolcany"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:75
+msgid "Trebisov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:76
+msgid "Trencin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:77
+msgid "Trnava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:78
+msgid "Turcianske Teplice"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:79
+msgid "Tvrdosin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:80
+msgid "Velky Krtis"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:81
+msgid "Vranov nad Toplou"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:82
+msgid "Zlate Moravce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:83
+msgid "Zvolen"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:84
+msgid "Zarnovica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:85
+msgid "Ziar nad Hronom"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:86
+msgid "Zilina"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:8
+msgid "Banska Bystrica region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:9
+msgid "Bratislava region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:10
+msgid "Kosice region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:11
+msgid "Nitra region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:12
+msgid "Presov region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:13
+msgid "Trencin region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:14
+msgid "Trnava region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:15
+msgid "Zilina region"
+msgstr ""
+
+#: contrib/localflavor/uk/forms.py:21
+msgid "Enter a valid postcode."
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:11
+msgid "Bedfordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:12
+msgid "Buckinghamshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:14
+msgid "Cheshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:15
+msgid "Cornwall and Isles of Scilly"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:16
+msgid "Cumbria"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:17
+msgid "Derbyshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:18
+msgid "Devon"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:19
+msgid "Dorset"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:20
+msgid "Durham"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:21
+msgid "East Sussex"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:22
+msgid "Essex"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:23
+msgid "Gloucestershire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:24
+msgid "Greater London"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:25
+msgid "Greater Manchester"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:26
+msgid "Hampshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:27
+msgid "Hertfordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:28
+msgid "Kent"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:29
+msgid "Lancashire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:30
+msgid "Leicestershire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:31
+msgid "Lincolnshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:32
+msgid "Merseyside"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:33
+msgid "Norfolk"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:34
+msgid "North Yorkshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:35
+msgid "Northamptonshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:36
+msgid "Northumberland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:37
+msgid "Nottinghamshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:38
+msgid "Oxfordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:39
+msgid "Shropshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:40
+msgid "Somerset"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:41
+msgid "South Yorkshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:42
+msgid "Staffordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:43
+msgid "Suffolk"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:44
+msgid "Surrey"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:45
+msgid "Tyne and Wear"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:46
+msgid "Warwickshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:47
+msgid "West Midlands"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:48
+msgid "West Sussex"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:49
+msgid "West Yorkshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:50
+msgid "Wiltshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:51
+msgid "Worcestershire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:55
+msgid "County Antrim"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:56
+msgid "County Armagh"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:57
+msgid "County Down"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:58
+msgid "County Fermanagh"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:59
+msgid "County Londonderry"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:60
+msgid "County Tyrone"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:64
+msgid "Clwyd"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:65
+msgid "Dyfed"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:66
+msgid "Gwent"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:67
+msgid "Gwynedd"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:68
+msgid "Mid Glamorgan"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:69
+msgid "Powys"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:70
+msgid "South Glamorgan"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:71
+msgid "West Glamorgan"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:75
+msgid "Borders"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:76
+msgid "Central Scotland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:77
+msgid "Dumfries and Galloway"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:78
+msgid "Fife"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:79
+msgid "Grampian"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:80
+msgid "Highland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:81
+msgid "Lothian"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:82
+msgid "Orkney Islands"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:83
+msgid "Shetland Islands"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:84
+msgid "Strathclyde"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:85
+msgid "Tayside"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:86
+msgid "Western Isles"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:90
+msgid "England"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:91
+msgid "Northern Ireland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:92
+msgid "Scotland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:93
+msgid "Wales"
+msgstr ""
+
+#: contrib/localflavor/us/forms.py:16
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr ""
+
+#: contrib/localflavor/us/forms.py:54
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr ""
+
+#: contrib/localflavor/za/forms.py:20
+msgid "Enter a valid South African ID number"
+msgstr ""
+
+#: contrib/localflavor/za/forms.py:54
+msgid "Enter a valid South African postal code"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:4
+msgid "Eastern Cape"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:5
+msgid "Free State"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:6
+msgid "Gauteng"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:7
+msgid "KwaZulu-Natal"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:8
+msgid "Limpopo"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:9
+msgid "Mpumalanga"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:10
+msgid "Northern Cape"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:11
+msgid "North West"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:12
+msgid "Western Cape"
+msgstr ""
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "přesměrovat z"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Toto by měla být absolutní cesta, bez domény. Příklad: \"/udalosti/hledat/\"."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "přesměrovat na"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Toto může být buď absolutní cesta (jako nahoře) nebo plné URL začínající na "
+"\"http://\"."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "přesměrování"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "přesměrování"
+
+#: contrib/sessions/models.py:45
+msgid "session key"
+msgstr "klíč sezení"
+
+#: contrib/sessions/models.py:47
+msgid "session data"
+msgstr "data sezení"
+
+#: contrib/sessions/models.py:48
+msgid "expire date"
+msgstr "datum expirace"
+
+#: contrib/sessions/models.py:53
+msgid "session"
+msgstr "sezení"
+
+#: contrib/sessions/models.py:54
+msgid "sessions"
+msgstr "sezení"
+
+#: contrib/sites/models.py:32
+msgid "domain name"
+msgstr "jméno domény"
+
+#: contrib/sites/models.py:33
+msgid "display name"
+msgstr "zobrazené jméno"
+
+#: contrib/sites/models.py:39
+msgid "sites"
+msgstr "weby"
+
+#: core/validators.py:80
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "Tato hodnota musí obsahovat pouze znaky, čísla, podtržítka nebo čárky."
+
+#: core/validators.py:84
+msgid "Uppercase letters are not allowed here."
+msgstr "Velká písmena zde nejsou povolená."
+
+#: core/validators.py:88
+msgid "Lowercase letters are not allowed here."
+msgstr "Malá písmena zde nejsou povolená."
+
+#: core/validators.py:95
+msgid "Enter only digits separated by commas."
+msgstr "Vložte pouze cifry oddělené čárkami."
+
+#: core/validators.py:107
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Vložte platné e-mailové adresy oddělené čárkami."
+
+#: core/validators.py:111
+msgid "Please enter a valid IP address."
+msgstr "Prosíme, zadejte platnou IP adresu."
+
+#: core/validators.py:115
+msgid "Empty values are not allowed here."
+msgstr "Zde nejsou povolené prázdné hodnoty."
+
+#: core/validators.py:119
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Znaky, které nejsou čísla, zde nejsou povoleny."
+
+#: core/validators.py:123
+msgid "This value can't be comprised solely of digits."
+msgstr "Tato hodnota nemůže být složená pouze z cifer."
+
+#: core/validators.py:128 forms/fields.py:161
+msgid "Enter a whole number."
+msgstr "Vložte celé číslo."
+
+#: core/validators.py:132
+msgid "Only alphabetical characters are allowed here."
+msgstr "Zde jsou povoleny pouze alfanumerické znaky."
+
+#: core/validators.py:147
+#, python-format
+msgid "Invalid date: %s"
+msgstr "Neplatné datum: %s"
+
+#: core/validators.py:152 db/models/fields/__init__.py:546
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Vložte platné datum ve formátu RRRR-MM-DD."
+
+#: core/validators.py:157
+msgid "Enter a valid time in HH:MM format."
+msgstr "Vložte platný čas ve formátu HH:MM."
+
+#: core/validators.py:161
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Vložte platné datum a čas ve formátu RRRR-MM-DD HH:MM."
+
+#: core/validators.py:166 forms/fields.py:422
+msgid "Enter a valid e-mail address."
+msgstr "Vložte platnou e-mailovou adresu."
+
+#: core/validators.py:178 core/validators.py:470 forms/fields.py:440
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Soubor nebyl odeslán. Zkontrolujte \"encoding type\" formuláře."
+
+#: core/validators.py:189 forms/fields.py:471
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Nahrajte na server platný obrázek. Poslaný soubor nebyl obrázkem nebo byl "
+"poškozen."
+
+#: core/validators.py:196
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "URL %s neodkazuje na platný obrázek."
+
+#: core/validators.py:200
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "Telefonní čísla musí být ve formátu XXX-XXX-XXXX. \"%s\" není platné."
+
+#: core/validators.py:208
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "URL %s neodkazuje na platné video ve formátu QuickTime."
+
+#: core/validators.py:212
+msgid "A valid URL is required."
+msgstr "Je vyžadováno platné URL."
+
+#: core/validators.py:226
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Je vyžadováno platné HTML. Konkrétní chyby jsou:\n"
+"%s"
+
+#: core/validators.py:233
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Špatně formované XML: %s"
+
+#: core/validators.py:250
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Neplatné URL: %s"
+
+#: core/validators.py:255 core/validators.py:257
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "Odkaz na URL %s nefunguje."
+
+#: core/validators.py:263
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Vložte platnou zkratku U.S. státu."
+
+#: core/validators.py:277
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Mluvte slušně! Slovo %s zde není přípustné."
+msgstr[1] "Mluvte slušně! Slova %s zde nejsou přípustná."
+msgstr[2] "Mluvte slušně! Slova %s zde nejsou přípustná."
+
+#: core/validators.py:284
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Toto pole se musí shodovat s polem \"%s\"."
+
+#: core/validators.py:303
+msgid "Please enter something for at least one field."
+msgstr "Prosíme, vložte něco alespoň pro jedno pole."
+
+#: core/validators.py:312 core/validators.py:323
+msgid "Please enter both fields or leave them both empty."
+msgstr "Prosíme, vložte obě pole, nebo je nechte obě prázdná."
+
+#: core/validators.py:331
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Toto pole musí být vyplněno, když %(field)s má %(value)s"
+
+#: core/validators.py:344
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Toto pole musí být vyplněno, když %(field)s nemá %(value)s"
+
+#: core/validators.py:363
+msgid "Duplicate values are not allowed."
+msgstr "Duplikátní hodnoty nejsou povolené."
+
+#: core/validators.py:378
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Tato hodnota musí být mezi %(lower)s and %(upper)s."
+
+#: core/validators.py:380
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Tato hodnota musí alespoň %s."
+
+#: core/validators.py:382
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Tato hodnota nesmí být více než %s."
+
+#: core/validators.py:423
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Tato hodnota musí být mocninou %s."
+
+#: core/validators.py:433
+msgid "Please enter a valid decimal number."
+msgstr "Prosíme, vložte platné číslo."
+
+#: core/validators.py:440
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Prosíme, vložte platné číslo s nejvíce %s cifrou celkem."
+msgstr[1] "Prosíme, vložte platné číslo s nejvíce %s ciframi celkem."
+msgstr[2] "Prosíme, vložte platné číslo s nejvíce %s ciframi celkem."
+
+#: core/validators.py:443
+#, python-format
+msgid ""
+"Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural ""
+"Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] "Prosíme, vložte platné číslo s nejvíce %s cifrou."
+msgstr[1] "Prosíme, vložte platné číslo s nejvíce %s ciframi."
+msgstr[2] "Prosíme, vložte platné číslo s nejvíce %s ciframi."
+
+#: core/validators.py:446
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] ""
+"Prosíme, vložte platné číslo s nejvíce %s cifrou za desetinnou čárkou celkem."
+msgstr[1] ""
+"Prosíme, vložte platné číslo s nejvíce %s ciframi za desetinnou čárkou "
+"celkem."
+msgstr[2] ""
+"Prosíme, vložte platné číslo s nejvíce %s ciframi za desetinnou čárkou "
+"celkem."
+
+#: core/validators.py:454
+msgid "Please enter a valid floating point number."
+msgstr "Prosíme, vložte platné reálné číslo."
+
+#: core/validators.py:463
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Ujistěte se, že poslaný soubor má nejméně %s bytů."
+
+#: core/validators.py:464
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Ujistěte se, že  soubor má nejvíce %s bytů."
+
+#: core/validators.py:481
+msgid "The format for this field is wrong."
+msgstr "Formát pro toto pole je špatný."
+
+#: core/validators.py:496
+msgid "This field is invalid."
+msgstr "Toto pole není platné."
+
+#: core/validators.py:532
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Nelze získat nic z %s."
+
+#: core/validators.py:535
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"URL %(url)s vrátilo neplatnou hlavičku Content-Type \"%(contenttype)s\"."
+
+#: core/validators.py:568
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Prosíme, zavřete nezavřenou značku %(tag)s z řádky %(line)s. (Řádka začíná s "
+"\"%(start)s\".)"
+
+#: core/validators.py:572
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Nějaký text začínající na řádce %(line)s není povolen v tomto kontextu. "
+"(Řádka začíná s \"%(start)s\".)"
+
+#: core/validators.py:577
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"%(attr)s\" na řádce %(line)s je neplatný atribut. (Řádka začíná s \"%"
+"(start)s\".)"
+
+#: core/validators.py:582
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\" na řádce %(line)s je neplatná značka. (Řádka začíná s \"%"
+"(start)s\".)"
+
+#: core/validators.py:586
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Značce na řádce %(line)s schází jeden nebo více požadovaných atributů. "
+"(Řádka začíná s \"%(start)s\".)"
+
+#: core/validators.py:591
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Atribut \"%(attr)s\" na řádce %(line)s má neplatnou hodnotu. (Řádka začína s "
+"\"%(start)s\".)"
+
+#: db/models/manipulators.py:304
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr ""
+"%(object)s s takto vyplněným polem \"%(type)s\" již existuje pro dané pole "
+"\"%(field)s\"."
+
+#: db/models/fields/__init__.py:46
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s s takto vyplněným polem \"%(fieldname)s\" již existuje."
+
+#: db/models/fields/__init__.py:320 db/models/fields/files.py:168
+#: db/models/fields/files.py:179 forms/fields.py:52 oldforms/__init__.py:370
+msgid "This field is required."
+msgstr "Toto pole je povinné."
+
+#: db/models/fields/__init__.py:434
+msgid "This value must be an integer."
+msgstr "Tato hodnota musí být celé číslo."
+
+#: db/models/fields/__init__.py:480
+msgid "This value must be either True or False."
+msgstr "Tato hodnota musí být buď Ano (True), nebo Ne (False)."
+
+#: db/models/fields/__init__.py:509
+msgid "This field cannot be null."
+msgstr "Toto pole nemůže být prázdné (null)."
+
+#: db/models/fields/__init__.py:611 db/models/fields/__init__.py:628
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format."
+msgstr "Vložte platné datum a čas ve formátu RRRR-MM-DD HH:MM[:ss[.uuuuuu]]."
+
+#: db/models/fields/__init__.py:684
+msgid "This value must be a decimal number."
+msgstr "Tato hodnota musí být celé číslo."
+
+#: db/models/fields/__init__.py:825
+msgid "This value must be either None, True or False."
+msgstr "Tato hodnota musí být buď Nic (None), Ano (True) nebo Ne (False)."
+
+#: db/models/fields/__init__.py:937 db/models/fields/__init__.py:950
+msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format."
+msgstr "Vložte platný čas ve formátu HH:MM[:ss[.uuuuuu]]"
+
+#: db/models/fields/files.py:188
+msgid "Enter a valid filename."
+msgstr "Vložte platný název souboru."
+
+#: db/models/fields/related.py:92
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Prosíme, zadejte %s správně."
+
+#: db/models/fields/related.py:782
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Podržte  \"Control\" (nebo \"Command\" na Macu) pro vybrání více jak jedné "
+"položky."
+
+#: db/models/fields/related.py:862
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "Prosíme, vložte platná %(self)s ID. Hodnota %(value)r není platná."
+msgstr[1] ""
+"Prosíme, vložte platná %(self)s ID. Hodnoty %(value)r nejsou platné."
+msgstr[2] ""
+"Prosíme, vložte platná %(self)s ID. Hodnoty %(value)r nejsou platné."
+
+#: forms/fields.py:53
+msgid "Enter a valid value."
+msgstr "Vložte platnou hodnotu."
+
+#: forms/fields.py:133
+#, python-format
+msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+msgstr "Tato hodnota musí mít nejvíce %(max)d znaků (nyní jich má %(length)d)."
+
+#: forms/fields.py:134
+#, python-format
+msgid "Ensure this value has at least %(min)d characters (it has %(length)d)."
+msgstr "Tato hodnota musí mít nejméně %(min)d znaků (nyní jich má %(length)d)."
+
+#: forms/fields.py:162 forms/fields.py:191 forms/fields.py:220
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Tato hodnota musí být menší nebo rovná %s."
+
+#: forms/fields.py:163 forms/fields.py:192 forms/fields.py:221
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Tato hodnota musí být větší nebo rovná %s."
+
+#: forms/fields.py:190 forms/fields.py:219
+msgid "Enter a number."
+msgstr "Vložte číslo."
+
+#: forms/fields.py:222
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr "Tato hodnota nesmí mít celkem více než %s cifer."
+
+#: forms/fields.py:223
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr "Tato hodnota nesmí mít za desetinou čárkou více než %s cifer."
+
+#: forms/fields.py:224
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr "Tato hodnota nesmí mít před desetinnou čárkou více než %s cifer."
+
+#: forms/fields.py:282 forms/fields.py:803
+msgid "Enter a valid date."
+msgstr "Vložte platné datum."
+
+#: forms/fields.py:315 forms/fields.py:804
+msgid "Enter a valid time."
+msgstr "Vložte platný čas."
+
+#: forms/fields.py:354
+msgid "Enter a valid date/time."
+msgstr "Vložte platný datum a čas."
+
+#: forms/fields.py:441
+msgid "No file was submitted."
+msgstr "Žádný soubor nebyl poslán."
+
+#: forms/fields.py:442 oldforms/__init__.py:689
+msgid "The submitted file is empty."
+msgstr "Poslaný soubor je prázdný."
+
+#: forms/fields.py:532
+msgid "Enter a valid URL."
+msgstr "Vložte platnou URL."
+
+#: forms/fields.py:533
+msgid "This URL appears to be a broken link."
+msgstr "Tento odkaz nefunguje."
+
+#: forms/fields.py:601 forms/fields.py:652
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "Vyberte platnou možnost. Volba %(value)s není dostupná."
+
+#: forms/fields.py:653 forms/fields.py:714 forms/models.py:528
+msgid "Enter a list of values."
+msgstr "Vložte seznam hodnot."
+
+#: forms/fields.py:832
+msgid "Enter a valid IPv4 address."
+msgstr "Vložte platnou IPv4 adresu."
+
+#: forms/models.py:461
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Vyberte platnou možnost. Tato není dostupná."
+
+#: forms/models.py:529
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Vyberte platnou možnost. Volba %s není dostupná."
+
+#: oldforms/__init__.py:405
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Ujistěte se, že Váš text má méně než %s znak."
+msgstr[1] "Ujistěte se, že Váš text má méně než %s znaky."
+msgstr[2] "Ujistěte se, že Váš text má méně než %s znaků."
+
+#: oldforms/__init__.py:410
+msgid "Line breaks are not allowed here."
+msgstr "Zalomení řádky zde není povoleno."
+
+#: oldforms/__init__.py:508 oldforms/__init__.py:582 oldforms/__init__.py:621
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Vyberte platnou volbu. \"%(data)s\" není mezi %(choices)s."
+
+#: oldforms/__init__.py:750
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Vložte celé číslo mezi -32768 a 32767."
+
+#: oldforms/__init__.py:760
+msgid "Enter a positive number."
+msgstr "Vložte celé kladné číslo."
+
+#: oldforms/__init__.py:770
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Vložte celé číslo mezi 0 a 32767."
+
+#: template/defaultfilters.py:698
+msgid "yes,no,maybe"
+msgstr "ano, ne, možná"
+
+#: template/defaultfilters.py:729
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d byte"
+msgstr[1] "%(size)d byty"
+msgstr[2] "%(size)d bytů"
+
+#: template/defaultfilters.py:731
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f KB"
+
+#: template/defaultfilters.py:733
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: template/defaultfilters.py:734
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#: utils/dateformat.py:41
+msgid "p.m."
+msgstr "odp."
+
+#: utils/dateformat.py:42
+msgid "a.m."
+msgstr "dop."
+
+#: utils/dateformat.py:47
+msgid "PM"
+msgstr "odp."
+
+#: utils/dateformat.py:48
+msgid "AM"
+msgstr "dop."
+
+#: utils/dateformat.py:97
+msgid "midnight"
+msgstr "půlnoc"
+
+#: utils/dateformat.py:99
+msgid "noon"
+msgstr "poledne"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "pondělí"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "úterý"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "středa"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "čtvrtek"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "pátek"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "sobota"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "neděle"
+
+#: utils/dates.py:10
+msgid "Mon"
+msgstr "po"
+
+#: utils/dates.py:10
+msgid "Tue"
+msgstr "út"
+
+#: utils/dates.py:10
+msgid "Wed"
+msgstr "st"
+
+#: utils/dates.py:10
+msgid "Thu"
+msgstr "čt"
+
+#: utils/dates.py:10
+msgid "Fri"
+msgstr "pá"
+
+#: utils/dates.py:11
+msgid "Sat"
+msgstr "so"
+
+#: utils/dates.py:11
+msgid "Sun"
+msgstr "ne"
+
+#: utils/dates.py:18
+msgid "January"
+msgstr "leden"
+
+#: utils/dates.py:18
+msgid "February"
+msgstr "únor"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "March"
+msgstr "březen"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "April"
+msgstr "duben"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "May"
+msgstr "květen"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "June"
+msgstr "červen"
+
+#: utils/dates.py:19 utils/dates.py:31
+msgid "July"
+msgstr "červenec"
+
+#: utils/dates.py:19
+msgid "August"
+msgstr "srpen"
+
+#: utils/dates.py:19
+msgid "September"
+msgstr "září"
+
+#: utils/dates.py:19
+msgid "October"
+msgstr "říjen"
+
+#: utils/dates.py:19
+msgid "November"
+msgstr "listopad"
+
+#: utils/dates.py:20
+msgid "December"
+msgstr "prosinec"
+
+#: utils/dates.py:23
+msgid "jan"
+msgstr "led"
+
+#: utils/dates.py:23
+msgid "feb"
+msgstr "úno"
+
+#: utils/dates.py:23
+msgid "mar"
+msgstr "bře"
+
+#: utils/dates.py:23
+msgid "apr"
+msgstr "dub"
+
+#: utils/dates.py:23
+msgid "may"
+msgstr "kvě"
+
+#: utils/dates.py:23
+msgid "jun"
+msgstr "čen"
+
+#: utils/dates.py:24
+msgid "jul"
+msgstr "čec"
+
+#: utils/dates.py:24
+msgid "aug"
+msgstr "srp"
+
+#: utils/dates.py:24
+msgid "sep"
+msgstr "zář"
+
+#: utils/dates.py:24
+msgid "oct"
+msgstr "říj"
+
+#: utils/dates.py:24
+msgid "nov"
+msgstr "lis"
+
+#: utils/dates.py:24
+msgid "dec"
+msgstr "pro"
+
+#: utils/dates.py:31
+msgid "Jan."
+msgstr "led."
+
+#: utils/dates.py:31
+msgid "Feb."
+msgstr "ún."
+
+#: utils/dates.py:32
+msgid "Aug."
+msgstr "srp."
+
+#: utils/dates.py:32
+msgid "Sept."
+msgstr "zář."
+
+#: utils/dates.py:32
+msgid "Oct."
+msgstr "říj."
+
+#: utils/dates.py:32
+msgid "Nov."
+msgstr "list."
+
+#: utils/dates.py:32
+msgid "Dec."
+msgstr "pros."
+
+#: utils/text.py:128
+msgid "or"
+msgstr "nebo"
+
+#: utils/timesince.py:21
+msgid "year"
+msgid_plural "years"
+msgstr[0] "rok"
+msgstr[1] "roky"
+msgstr[2] "let"
+
+#: utils/timesince.py:22
+msgid "month"
+msgid_plural "months"
+msgstr[0] "měsíc"
+msgstr[1] "měsíce"
+msgstr[2] "měsíců"
+
+#: utils/timesince.py:23
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "týden"
+msgstr[1] "týdny"
+msgstr[2] "týdnů"
+
+#: utils/timesince.py:24
+msgid "day"
+msgid_plural "days"
+msgstr[0] "den"
+msgstr[1] "dny"
+msgstr[2] "dnů"
+
+#: utils/timesince.py:25
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "hodina"
+msgstr[1] "hodiny"
+msgstr[2] "hodin"
+
+#: utils/timesince.py:26
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuta"
+msgstr[1] "minuty"
+msgstr[2] "minut"
+
+#: utils/timesince.py:46
+msgid "minutes"
+msgstr "minuty"
+
+#: utils/timesince.py:51
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr "%(number)d %(type)s"
+
+#: utils/timesince.py:57
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ", %(number)d %(type)s"
+
+#: utils/translation/trans_real.py:401
+msgid "DATE_FORMAT"
+msgstr "j. n. Y"
+
+#: utils/translation/trans_real.py:402
+msgid "DATETIME_FORMAT"
+msgstr "j. n. Y, H:i"
+
+#: utils/translation/trans_real.py:403
+msgid "TIME_FORMAT"
+msgstr "H:i"
+
+#: utils/translation/trans_real.py:419
+msgid "YEAR_MONTH_FORMAT"
+msgstr "F Y"
+
+#: utils/translation/trans_real.py:420
+msgid "MONTH_DAY_FORMAT"
+msgstr "j. F"
+
+#: views/generic/create_update.py:114
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "Záznam typu \"%(verbose_name)s\" byl úspěšně vytvořen."
+
+#: views/generic/create_update.py:156
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "Záznam typu \"%(verbose_name)s\" byl úspěšně změněn."
+
+#: views/generic/create_update.py:198
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "Záznam typu \"%(verbose_name)s\" byl smazán."
diff --git a/webapp/django/conf/locale/cs/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/cs/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..1a72a92
--- /dev/null
+++ b/webapp/django/conf/locale/cs/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/cs/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/cs/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..adcc0a0
--- /dev/null
+++ b/webapp/django/conf/locale/cs/LC_MESSAGES/djangojs.po
@@ -0,0 +1,118 @@
+# Translation of djangojs.po to Czech
+# Copyright (C) 2005 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the DJANGO package.
+# Radek Svarz <translate@svarz.cz>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-08-20 12:52+0200\n"
+"Language-Team: Czech\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n>1 && n<5 ? 1 : 2;\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "Dostupná %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Vybrat vše"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Přidat"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Odebrat"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Vybraná %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Vyberte si a klikněte "
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Vymazat vše"
+
+#: contrib/admin/media/js/calendar.js:24
+#: contrib/admin/media/js/dateparse.js:32
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Leden Únor Březen Duben Květen Červen Červenec Srpen Září Říjen Listopad "
+"Prosinec"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "N P U S C P S"
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Neděle Pondělí Úterý Středa Čtvrtek Pátek Sobota"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr "Ukázat"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr "Skrýt"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Now"
+msgstr "Nyní"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
+msgid "Clock"
+msgstr "Hodiny"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
+msgid "Choose a time"
+msgstr "Vyberte čas"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "Midnight"
+msgstr "Půlnoc"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "6 a.m."
+msgstr "6 ráno"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
+msgid "Noon"
+msgstr "Poledne"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
+msgid "Cancel"
+msgstr "Storno"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
+msgid "Today"
+msgstr "Dnes"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
+msgid "Calendar"
+msgstr "Kalendář"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
+msgid "Yesterday"
+msgstr "Včera"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
+msgid "Tomorrow"
+msgstr "Zítra"
diff --git a/webapp/django/conf/locale/cy/LC_MESSAGES/django.mo b/webapp/django/conf/locale/cy/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..6c92b2b
--- /dev/null
+++ b/webapp/django/conf/locale/cy/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/cy/LC_MESSAGES/django.po b/webapp/django/conf/locale/cy/LC_MESSAGES/django.po
new file mode 100644
index 0000000..ab07be6
--- /dev/null
+++ b/webapp/django/conf/locale/cy/LC_MESSAGES/django.po
@@ -0,0 +1,1990 @@
+# Translation of Django to Welsh.
+# Copyright (C) 2005 Django.
+# This file is distributed under the same license as the Django package.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-05-16 10:12+0200\n"
+"PO-Revision-Date: 2005-11-05 HO:MI+ZONE\n"
+"Last-Translator: Jason Davies <jason@jasondavies.com>\n"
+"Language-Team: Cymraeg <cy@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "ID gwrthrych"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "pennawd"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "sylw"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "cyfraddiad #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "cyfraddiad #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "cyfraddiad #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "cyfraddiad #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "cyfraddiad #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "cyfraddiad #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "cyfraddiad #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "cyfraddiad #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "yn gyfraddiad dilys"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "dyddiad/amser wedi ymostwng"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "yn gyhoeddus"
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289
+msgid "IP address"
+msgstr "cyfeiriad IP"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "wedi diddymu"
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+
+#: contrib/comments/models.py:91
+#, fuzzy
+msgid "comments"
+msgstr "sylw"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "Gwrthrych cynnwys"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Postiwyd gan %(user)s ar %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "enw'r person"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "cyfeiriad ip"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr ""
+
+#: contrib/comments/models.py:176
+#, fuzzy
+msgid "free comment"
+msgstr "Sylw rhydd"
+
+#: contrib/comments/models.py:177
+#, fuzzy
+msgid "free comments"
+msgstr "Sylwadau rhydd"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "sgôr"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "dyddiad sgôr"
+
+#: contrib/comments/models.py:237
+#, fuzzy
+msgid "karma score"
+msgstr "Sgôr Carma"
+
+#: contrib/comments/models.py:238
+#, fuzzy
+msgid "karma scores"
+msgstr "Sgorau Carma"
+
+#: contrib/comments/models.py:242
+#, python-format
+#, fuzzy
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "fflagio dyddiad"
+
+#: contrib/comments/models.py:268
+#, fuzzy
+msgid "user flag"
+msgstr "Fflag defnyddiwr"
+
+#: contrib/comments/models.py:269
+#, fuzzy
+msgid "user flags"
+msgstr "Fflagiau defnyddwyr"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "Fflagio hefo %r"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "dyddiad dilead"
+
+#: contrib/comments/models.py:280
+#, fuzzy
+msgid "moderator deletion"
+msgstr "Dilead cymedrolwr"
+
+#: contrib/comments/models.py:281
+#, fuzzy
+msgid "moderator deletions"
+msgstr "Dileadau cymedrolwr"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Dilead cymedrolwr gan %r"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Ni gellir defnyddwyr dienw pleidleisio"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "ID sylw annilys"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "Dim pleidleisio ar gyfer eich hun"
+
+#: contrib/comments/views/comments.py:28
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr ""
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Caniateir POSTiau yn unig"
+
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr ""
+
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr ""
+
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "Enw defnyddiwr:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Cyfrinair:"
+
+#: contrib/comments/templates/comments/form.html:6
+#, fuzzy
+msgid "Forgotten your password?"
+msgstr "Newidio fy nghyfrinair"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr "Allgofnodi"
+
+#: contrib/comments/templates/comments/form.html:12
+#, fuzzy
+msgid "Ratings"
+msgstr "cyfraddiad #1"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:27
+#: contrib/comments/templates/comments/freeform.html:5
+#, fuzzy
+msgid "Comment:"
+msgstr "Sylw"
+
+#: contrib/comments/templates/comments/form.html:32
+#: contrib/comments/templates/comments/freeform.html:9
+#, fuzzy
+msgid "Preview comment"
+msgstr "Sylw rhydd"
+
+#: contrib/comments/templates/comments/freeform.html:4
+#, fuzzy
+msgid "Your name:"
+msgstr "enw defnyddiwr"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143
+msgid "All"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "Unrhyw dyddiad"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "Heddiw"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "7 diwrnod gorffennol"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "Mis yma"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "Blwyddyn yma"
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Ie"
+
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "Na"
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr ""
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "amser gweithred"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "id gwrthrych"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "repr gwrthrych"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "fflag gweithred"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "neges newid"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "cofnod"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "cofnodion"
+
+#: contrib/admin/templatetags/admin_list.py:228
+msgid "All dates"
+msgstr "Dyddiadau i gyd"
+
+#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36
+#: contrib/auth/forms.py:41
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+
+#: contrib/admin/views/decorators.py:23
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Mewngofnodi"
+
+#: contrib/admin/views/decorators.py:61
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+
+#: contrib/admin/views/decorators.py:68
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+
+#: contrib/admin/views/decorators.py:82
+msgid "Usernames cannot contain the '@' character."
+msgstr ""
+
+#: contrib/admin/views/decorators.py:84
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr ""
+
+#: contrib/admin/views/main.py:226
+msgid "Site administration"
+msgstr "Gweinyddiad safle"
+
+#: contrib/admin/views/main.py:260
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr ""
+
+#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
+msgid "You may edit it again below."
+msgstr ""
+
+#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#, python-format
+msgid "You may add another %s below."
+msgstr ""
+
+#: contrib/admin/views/main.py:290
+#, python-format
+msgid "Add %s"
+msgstr "Ychwanegu %s"
+
+#: contrib/admin/views/main.py:336
+#, python-format
+msgid "Added %s."
+msgstr "Ychwanegwyd %s."
+
+#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:340
+msgid "and"
+msgstr "ac"
+
+#: contrib/admin/views/main.py:338
+#, python-format
+msgid "Changed %s."
+msgstr "Newidiwyd %s."
+
+#: contrib/admin/views/main.py:340
+#, python-format
+msgid "Deleted %s."
+msgstr "Dileuwyd %s."
+
+#: contrib/admin/views/main.py:343
+msgid "No fields changed."
+msgstr ""
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr ""
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+
+#: contrib/admin/views/main.py:392
+#, python-format
+msgid "Change %s"
+msgstr "Newidio %s"
+
+#: contrib/admin/views/main.py:470
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr ""
+
+#: contrib/admin/views/main.py:475
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr ""
+
+#: contrib/admin/views/main.py:508
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr ""
+
+#: contrib/admin/views/main.py:511
+msgid "Are you sure?"
+msgstr "Ydych yn sicr?"
+
+#: contrib/admin/views/main.py:533
+#, python-format
+msgid "Change history: %s"
+msgstr "Hanes newid: %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s"
+msgstr "Dewis %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s to change"
+msgstr "Dewis %s i newid"
+
+#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286
+#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297
+msgid "Integer"
+msgstr ""
+
+#: contrib/admin/views/doc.py:278
+msgid "Boolean (Either True or False)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:280
+msgid "Comma-separated integers"
+msgstr ""
+
+#: contrib/admin/views/doc.py:281
+msgid "Date (without time)"
+msgstr "Dyddiad (heb amser)"
+
+#: contrib/admin/views/doc.py:282
+msgid "Date (with time)"
+msgstr "Dyddiad (gyda amser)"
+
+#: contrib/admin/views/doc.py:283
+msgid "E-mail address"
+msgstr "Cyfeiriad e-bost"
+
+#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
+msgid "File path"
+msgstr "Llwybr ffeil"
+
+#: contrib/admin/views/doc.py:285
+msgid "Decimal number"
+msgstr "Rhif degol"
+
+#: contrib/admin/views/doc.py:291
+msgid "Boolean (Either True, False or None)"
+msgstr "Boole (Naill ai True, False neu None)"
+
+#: contrib/admin/views/doc.py:292
+msgid "Relation to parent model"
+msgstr "Perthynas i model rhiant"
+
+#: contrib/admin/views/doc.py:293
+msgid "Phone number"
+msgstr "Rhif ffôn"
+
+#: contrib/admin/views/doc.py:298
+msgid "Text"
+msgstr "Testun"
+
+#: contrib/admin/views/doc.py:299
+msgid "Time"
+msgstr "Amser"
+
+#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:301
+msgid "U.S. state (two uppercase letters)"
+msgstr "Talaith U.D. (dwy briflythyren)"
+
+#: contrib/admin/views/doc.py:302
+msgid "XML text"
+msgstr "Testun XML"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Dogfennaeth"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "Newid cyfrinair"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Adref"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+msgid "History"
+msgstr "Hanes"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Dyddiad/amser"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Defnyddiwr"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Gweithred"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "N j, Y, P"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Does dim hanes newid gan y gwrthrych yma. Mae'n debyg ni ychwanegwyd drwy'r "
+"safle gweinydd yma."
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Gweinyddiad safle Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Gweinyddiad Django"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Gwall gweinyddwr"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Gwall gweinyddwr (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Gwall Gweinyddwr <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Mae gwall wedi digwydd. Adroddwyd i weinyddwyr y safle drwy e-bost ac ddylai "
+"cael ei drwsio cyn bo hir."
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Tudalen heb ei ddarganfod"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Mae'n ddrwg gennym, ond nid darganfwyd y dudalen a dymunwyd"
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "Ychwanegu"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Newidio"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Does genych ddim hawl i olygu unrhywbeth."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Gweithredau Diweddar"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Fy Ngweithredau"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Dim ar gael"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "Ychwanegu %(name)s"
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "Ydych wedi <a href=\"/password_reset/\">anghofio eich cyfrinair</a>?"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "Croeso,"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Dileu"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(object)s' would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Bydda dileu'r %(object_name)s '%(object)s' yn ddilyn i dileu'r wrthrychau "
+"perthynol, ond ni chaniateir eich cyfrif ddileu'r mathau o wrthrych canlynol:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
+"the following related items will be deleted:"
+msgstr ""
+"Ydych yn sicr chi eiso ddileu'r %(object_name)s \"%(object)s\"? Bydd y cwbl "
+"o'r eitemau perthynol canlynol yn cae eu ddileu:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Yndw, rwy'n sicr"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(title)s "
+msgstr " Gan %(title)s"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Ewch"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "Gweld ar safle"
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr "Trefnu"
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr "Trefn:"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Cadw fel newydd"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Cadw ac ychwanegu un arall"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Cadw ac parhau i olygu"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Cadw"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Newid cyfrinair"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Newid cyfrinair yn lwyddianus"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Newidwyd eich cyfrinair."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Ailosod cyfrinair"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"Wedi anghofio eich cyfrinair? Rhowch eich cyfeiriad e-bost isod, ac "
+"ailosodan eich cyfrinair ac e-bostio'r un newydd i chi."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Cyfeiriad e-bost:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Ailosodi fy nghyfrinair"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Diolch am dreulio amser ansawdd gyda'r safle we heddiw 'ma."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Ailmewngofnodi"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Ailosod cyfrinair yn lwyddianus"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr "Wedi e-bostio cyfrinair newydd i'r gyfeiriad e-bost "
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Rhowch eich cyfrinair hen, er mwyn gwarchodaeth, yna rhowch eich cyfrinair "
+"newydd dwywaith er mwyn i ni wirio y teipiwyd yn gywir."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Cyfrinair hen:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Cyfrinair newydd:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Cadarnhewch cyfrinair:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Newidio fy nghyfrinair"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Chi'n derbyn yr e-bost yma achos ddymunwyd ailosod cyfrinair"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "er mwyn eich cyfrif defnyddiwr ar %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Eich cyfrinair newydd yw: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Mae croeso i chi newid y gyfrinair hon wrth fynd i'r dudalen yma:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Eich enw defnyddiwr, rhag ofn chi wedi anghofio:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Diolch am ddefnyddio ein safle!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Y tîm %(site_name)s"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Dalennau gofnod"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "Dogfennaeth dalennau gofnod"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Dogfennaeth er mwyn y dudalen yma"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Dangos ID gwrthrych"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Yn dangos y fath-cynnwys a'r ID unigryw ar gyfer tudalennau sy'n "
+"cynrychioligwrthrych sengl."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Golygu'r gwrthrych yma (ffenestr cyfoes)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+"Yn neidio i'r dudalen weinyddiad ar gyfer tudalennau sy'n cynrychioli "
+"gwrthrych sengl."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Golygu'r gwrthrych yma (ffenestr newydd)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "Fel uwchben, ond yn agor y dudalen weinyddiad mewn ffenestr newydd."
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Dyddiad:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Amser:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr ""
+
+#: contrib/admin/templates/widget/file.html:3
+#, fuzzy
+msgid "Change:"
+msgstr "Newidio"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "ailgyfeirio o"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Ddylai hon bod yn lwybr hollol, heb y parth-enw. Er enghraifft: '/"
+"digwyddiadau/chwilio/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "ailgyfeirio i"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Gellir fod naill ai llwybr hollol (fel uwch) neu URL hollol yn ddechrau â "
+"'http://'."
+
+#: contrib/redirects/models.py:12
+msgid "redirect"
+msgstr "ailgyfeiriad"
+
+#: contrib/redirects/models.py:13
+msgid "redirects"
+msgstr "ailgyfeiriadau"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Er enghraifft: '/amdan/cyswllt/'. Sicrhewch gennych slaesau arweiniol ac "
+"trywyddiol."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "teitl"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "cynnwys"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "galluogi sylwadau"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "enw'r templed"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
+"use 'flatpages/default'."
+msgstr ""
+"Er enghraifft: 'flatpages/tudalen_cyswllt'. Os nid darparwyd, ddefnyddia'r "
+"system 'flatpages/default'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "cofrestriad gofynnol"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+"Os wedi dewis, dim ond defnyddwyr a mewngofnodwyd bydd yn gallu gweld y "
+"tudalen."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "tudalen fflat"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "tudalennau fflat"
+
+#: contrib/auth/models.py:13 contrib/auth/models.py:26
+msgid "name"
+msgstr "enw"
+
+#: contrib/auth/models.py:15
+msgid "codename"
+msgstr "enw arwyddol"
+
+#: contrib/auth/models.py:17
+#, fuzzy
+msgid "permission"
+msgstr "Hawl"
+
+#: contrib/auth/models.py:18 contrib/auth/models.py:27
+#, fuzzy
+msgid "permissions"
+msgstr "Hawliau"
+
+#: contrib/auth/models.py:29
+#, fuzzy
+msgid "group"
+msgstr "Grŵp"
+
+#: contrib/auth/models.py:30 contrib/auth/models.py:65
+#, fuzzy
+msgid "groups"
+msgstr "Grwpiau"
+
+#: contrib/auth/models.py:55
+msgid "username"
+msgstr "enw defnyddiwr"
+
+#: contrib/auth/models.py:56
+msgid "first name"
+msgstr "enw cyntaf"
+
+#: contrib/auth/models.py:57
+msgid "last name"
+msgstr "enw olaf"
+
+#: contrib/auth/models.py:58
+msgid "e-mail address"
+msgstr "cyfeiriad e-bost"
+
+#: contrib/auth/models.py:59
+msgid "password"
+msgstr "cyfrinair"
+
+#: contrib/auth/models.py:59
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr "Defnyddiwch '[algo]$[salt]$[hexdigest]'"
+
+#: contrib/auth/models.py:60
+msgid "staff status"
+msgstr "statws staff"
+
+#: contrib/auth/models.py:60
+msgid "Designates whether the user can log into this admin site."
+msgstr "Dylunio ai'r defnyddiwr yn gally mewngofnodi i'r safle weinyddiad yma."
+
+#: contrib/auth/models.py:61
+msgid "active"
+msgstr "gweithredol"
+
+#: contrib/auth/models.py:62
+msgid "superuser status"
+msgstr "statws defnyddiwr swper"
+
+#: contrib/auth/models.py:63
+msgid "last login"
+msgstr "mewngofnod olaf"
+
+#: contrib/auth/models.py:64
+msgid "date joined"
+msgstr "Dyddiad"
+
+#: contrib/auth/models.py:66
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"Yn ogystal â'r hawliau trosglwyddwyd dros law, byddai'r defnyddiwr yma hefyd "
+"yn cael y cwbl hawliau a addefwyd i pob grŵp mae o/hi mewn."
+
+#: contrib/auth/models.py:67
+#, fuzzy
+msgid "user permissions"
+msgstr "Hawliau"
+
+#: contrib/auth/models.py:70
+#, fuzzy
+msgid "user"
+msgstr "Defnyddiwr"
+
+#: contrib/auth/models.py:71
+#, fuzzy
+msgid "users"
+msgstr "Defnyddwyr"
+
+#: contrib/auth/models.py:76
+msgid "Personal info"
+msgstr "Gwybodaeth personol"
+
+#: contrib/auth/models.py:77
+msgid "Permissions"
+msgstr "Hawliau"
+
+#: contrib/auth/models.py:78
+msgid "Important dates"
+msgstr "Dyddiadau pwysig"
+
+#: contrib/auth/models.py:79
+msgid "Groups"
+msgstr "Grwpiau"
+
+#: contrib/auth/models.py:219
+#, fuzzy
+msgid "message"
+msgstr "Neges"
+
+#: contrib/auth/forms.py:30
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+
+#: contrib/contenttypes/models.py:25
+#, fuzzy
+msgid "python model class name"
+msgstr "enw modwl python"
+
+#: contrib/contenttypes/models.py:28
+msgid "content type"
+msgstr "math cynnwys"
+
+#: contrib/contenttypes/models.py:29
+msgid "content types"
+msgstr "mathau cynnwys"
+
+#: contrib/sessions/models.py:35
+msgid "session key"
+msgstr "goriad sesiwn"
+
+#: contrib/sessions/models.py:36
+msgid "session data"
+msgstr "data sesiwn"
+
+#: contrib/sessions/models.py:37
+msgid "expire date"
+msgstr "dyddiad darfod"
+
+#: contrib/sessions/models.py:41
+msgid "session"
+msgstr "sesiwn"
+
+#: contrib/sessions/models.py:42
+msgid "sessions"
+msgstr "sesiynau"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "parth-enw"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "enw arddangos"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "safle"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "safleoedd"
+
+#: utils/translation.py:360
+msgid "DATE_FORMAT"
+msgstr ""
+
+#: utils/translation.py:361
+msgid "DATETIME_FORMAT"
+msgstr ""
+
+#: utils/translation.py:362
+msgid "TIME_FORMAT"
+msgstr ""
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Dydd Llun"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Dydd Mawrth"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Dydd Mercher"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Dydd Iau"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Dydd Gwener"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Dydd Sadwrn"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Dydd Sul"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Ionawr"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Chwefror"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "Mawrth"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "Ebrill"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "Mai"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "Mehefin"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "Gorffenaf"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "Awst"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "Medi"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Hydref"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "Tachwedd"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "Rhagfyr"
+
+#: utils/dates.py:19
+#, fuzzy
+msgid "jan"
+msgstr "ac"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr ""
+
+#: utils/dates.py:19
+#, fuzzy
+msgid "may"
+msgstr "diwrnod"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr ""
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Ion."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Chwe."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Awst"
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Medi"
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Hyd."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "Tach."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Rhag."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "blwyddyn"
+msgstr[1] "blynyddoedd"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mis"
+msgstr[1] "misoedd"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "diwrnod"
+msgstr[1] "diwrnodau"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "awr"
+msgstr[1] "oriau"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "munud"
+msgstr[1] "munudau"
+
+#: conf/global_settings.py:37
+msgid "Bengali"
+msgstr "Bengaleg"
+
+#: conf/global_settings.py:38
+msgid "Czech"
+msgstr "Tsieceg"
+
+#: conf/global_settings.py:39
+msgid "Welsh"
+msgstr "Cymraeg"
+
+#: conf/global_settings.py:40
+msgid "Danish"
+msgstr "Daneg"
+
+#: conf/global_settings.py:41
+msgid "German"
+msgstr "Almaeneg"
+
+#: conf/global_settings.py:42
+msgid "Greek"
+msgstr ""
+
+#: conf/global_settings.py:43
+msgid "English"
+msgstr "Saesneg"
+
+#: conf/global_settings.py:44
+msgid "Spanish"
+msgstr "Spaeneg"
+
+#: conf/global_settings.py:45
+msgid "French"
+msgstr "Ffrangeg"
+
+#: conf/global_settings.py:46
+msgid "Galician"
+msgstr "Galisieg"
+
+#: conf/global_settings.py:47
+msgid "Hungarian"
+msgstr ""
+
+#: conf/global_settings.py:48
+msgid "Hebrew"
+msgstr ""
+
+#: conf/global_settings.py:49
+msgid "Icelandic"
+msgstr "Islandeg"
+
+#: conf/global_settings.py:50
+msgid "Italian"
+msgstr "Eidaleg"
+
+#: conf/global_settings.py:51
+msgid "Japanese"
+msgstr ""
+
+#: conf/global_settings.py:52
+msgid "Dutch"
+msgstr ""
+
+#: conf/global_settings.py:53
+msgid "Norwegian"
+msgstr "Norwyeg"
+
+#: conf/global_settings.py:54
+msgid "Brazilian"
+msgstr "Brasileg"
+
+#: conf/global_settings.py:55
+msgid "Romanian"
+msgstr "Romaneg"
+
+#: conf/global_settings.py:56
+msgid "Russian"
+msgstr "Rwsieg"
+
+#: conf/global_settings.py:57
+msgid "Slovak"
+msgstr "Slofaceg"
+
+#: conf/global_settings.py:58
+#, fuzzy
+msgid "Slovenian"
+msgstr "Slofaceg"
+
+#: conf/global_settings.py:59
+msgid "Serbian"
+msgstr "Serbeg"
+
+#: conf/global_settings.py:60
+msgid "Swedish"
+msgstr "Swedeg"
+
+#: conf/global_settings.py:61
+#, fuzzy
+msgid "Ukrainian"
+msgstr "Brasileg"
+
+#: conf/global_settings.py:62
+msgid "Simplified Chinese"
+msgstr "Tsieinëeg Symledig"
+
+#: conf/global_settings.py:63
+msgid "Traditional Chinese"
+msgstr ""
+
+#: core/validators.py:60
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Rhaid i'r werth yma cynnwys lythrennau, rhifau ac tanlinellau yn unig."
+
+#: core/validators.py:64
+#, fuzzy
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Rhaid i'r werth yma cynnwys lythrennau, rhifau, tanlinellau ac slaesau yn "
+"unig."
+
+#: core/validators.py:72
+msgid "Uppercase letters are not allowed here."
+msgstr "Ni chaniateir priflythrennau yma."
+
+#: core/validators.py:76
+msgid "Lowercase letters are not allowed here."
+msgstr "Ni chaniateir lythrennau bach yma."
+
+#: core/validators.py:83
+msgid "Enter only digits separated by commas."
+msgstr "Rhowch digidau gwahanu gyda atalnodau yn unig."
+
+#: core/validators.py:95
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Rhowch cyfeiriad e-bost dilys gwahanu gyda atalnodau."
+
+#: core/validators.py:99
+msgid "Please enter a valid IP address."
+msgstr "Rhowch cyfeiriad IP dilys, os gwelwch yn dda."
+
+#: core/validators.py:103
+msgid "Empty values are not allowed here."
+msgstr "Ni chaniateir gwerthau gwag yma."
+
+#: core/validators.py:107
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Ni chaniateir nodau anrhifol yma."
+
+#: core/validators.py:111
+msgid "This value can't be comprised solely of digits."
+msgstr "Ni gellir y werth yma"
+
+#: core/validators.py:116
+msgid "Enter a whole number."
+msgstr "Rhowch rhif cyfan."
+
+#: core/validators.py:120
+msgid "Only alphabetical characters are allowed here."
+msgstr "Caniateir nodau gwyddorol un unig yma."
+
+#: core/validators.py:124
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Rhowch dyddiad dilys mewn fformat YYYY-MM-DD."
+
+#: core/validators.py:128
+msgid "Enter a valid time in HH:MM format."
+msgstr "Rhowch amser ddilys mewn fformat HH:MM."
+
+#: core/validators.py:132 db/models/fields/__init__.py:468
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Rhowch dyddiad/amser ddilys mewn fformat YYYY-MM-DD HH:MM."
+
+#: core/validators.py:136
+msgid "Enter a valid e-mail address."
+msgstr "Rhowch cyfeiriad e-bost ddilys."
+
+#: core/validators.py:148
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Llwythwch delwedd dilys. Doedd y delwedd a llwythwyd dim yn ddelwedd dilys, "
+"neu roedd o'n ddelwedd llwgr."
+
+#: core/validators.py:155
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "Dydy'r URL %s dim yn pwyntio at delwedd dilys."
+
+#: core/validators.py:159
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "Rhaid rifau ffon bod mewn fformat XXX-XXX-XXXX. Mae \"%s\" yn annilys."
+
+#: core/validators.py:167
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "Dydy'r URL %s dim yn pwyntio at fideo Quicktime dilys."
+
+#: core/validators.py:171
+msgid "A valid URL is required."
+msgstr "Mae URL dilys yn ofynnol."
+
+#: core/validators.py:185
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Mae HTML dilys yn ofynnol. Gwallau penodol yw:\n"
+"%s"
+
+#: core/validators.py:192
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "XML wedi ffurfio'n wael: %s"
+
+#: core/validators.py:202
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "URL annilys: %s"
+
+#: core/validators.py:206 core/validators.py:208
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "Mae'r URL %s yn gyswllt toredig."
+
+#: core/validators.py:214
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Rhowch talfyriad dalaith U.S. dilys."
+
+#: core/validators.py:229
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Gwyliwch eich ceg! Ni chaniateir y gair %s yma."
+msgstr[1] "Gwyliwch eich ceg! Ni chaniateir y geiriau %s yma."
+
+#: core/validators.py:236
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Rhaid i'r faes yma cydweddu'r faes '%s'."
+
+#: core/validators.py:255
+msgid "Please enter something for at least one field."
+msgstr "Rhowch rhywbeth am un maes o leiaf, os gwelwch yn dda."
+
+#: core/validators.py:264 core/validators.py:275
+msgid "Please enter both fields or leave them both empty."
+msgstr "Llenwch y ddwy faes, neu gadewch nhw'n wag, os gwelwch yn dda."
+
+#: core/validators.py:282
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Rhaid roi'r faes yma os mae %(field)s yn %(value)s"
+
+#: core/validators.py:294
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Rhaid roi'r faes yma os mae %(field)s dim yn %(value)s"
+
+#: core/validators.py:313
+msgid "Duplicate values are not allowed."
+msgstr "Ni chaniateir gwerthau ddyblyg."
+
+#: core/validators.py:336
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Rhaid i'r gwerth yma fod yn bŵer o %s."
+
+#: core/validators.py:347
+msgid "Please enter a valid decimal number."
+msgstr "Rhowch rhif degol dilys, os gwelwch yn dda."
+
+#: core/validators.py:349
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Rhowch rhif degol dilys gyda cyfanswm %s digidau o fwyaf."
+msgstr[1] "Rhowch rhif degol dilys gyda cyfanswm %s digid o fwyaf."
+
+#: core/validators.py:352
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] ""
+"Rhowch rif degol dilydd gyda o fwyaf %s lle degol, os gwelwch yn dda."
+msgstr[1] ""
+"Rhowch rif degol dilydd gyda o fwyaf %s lleoedd degol, os gwelwch yn dda."
+
+#: core/validators.py:362
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Sicrhewch bod yr ffeil a llwythwyd yn o leiaf %s beit."
+
+#: core/validators.py:363
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Sicrhewch bod yr ffeil a llwythwyd yn %s beit o fwyaf."
+
+#: core/validators.py:376
+msgid "The format for this field is wrong."
+msgstr "Mae'r fformat i'r faes yma yn anghywir."
+
+#: core/validators.py:391
+msgid "This field is invalid."
+msgstr "Mae'r faes yma yn annilydd."
+
+#: core/validators.py:426
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Ni gellir adalw unrhywbeth o %s."
+
+#: core/validators.py:429
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"Dychwelodd yr URL %(url)s y pennawd Content-Type annilys '%(contenttype)s'."
+
+#: core/validators.py:462
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Caewch y tag anghaedig %(tag)s o linell %(line)s. (Linell yn ddechrau â \"%"
+"(start)s\".)"
+
+#: core/validators.py:466
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Ni chaniateir rhai o'r destun ar linell %(line)s yn y gyd-destun yna. "
+"(Linell yn ddechrau â \"%(start)s\".)"
+
+#: core/validators.py:471
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"Mae \"%(attr)s\" ar lein %(line)s yn priodoledd annilydd. (Linell yn "
+"ddechrau â \"%(start)s\".)"
+
+#: core/validators.py:476
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"Mae \"<%(tag)s>\" ar lein %(line)s yn tag annilydd. (Linell yn ddechrau â \"%"
+"(start)s\".)"
+
+#: core/validators.py:480
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Mae tag ar lein %(line)s yn eisiau un new fwy priodoleddau gofynnol. (Linell "
+"yn ddechrau â \"%(start)s\".)"
+
+#: core/validators.py:485
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Mae gan y priodoledd \"%(attr)s\" ar lein %(line)s gwerth annilydd. (Linell "
+"yn ddechrau â \"%(start)s\".)"
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr ""
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr ""
+
+#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
+#: forms/__init__.py:346
+msgid "This field is required."
+msgstr "Mae angen y faes yma."
+
+#: db/models/fields/__init__.py:337
+#, fuzzy
+msgid "This value must be an integer."
+msgstr "Rhaid i'r gwerth yma fod yn bŵer o %s."
+
+#: db/models/fields/__init__.py:369
+#, fuzzy
+msgid "This value must be either True or False."
+msgstr "Rhaid i'r gwerth yma fod yn bŵer o %s."
+
+#: db/models/fields/__init__.py:385
+#, fuzzy
+msgid "This field cannot be null."
+msgstr "Mae'r faes yma yn annilydd."
+
+#: db/models/fields/__init__.py:562
+msgid "Enter a valid filename."
+msgstr "Rhowch enw ffeil dilys."
+
+#: db/models/fields/related.py:43
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Rhowch %s dilys, os gwelwch yn dda."
+
+#: db/models/fields/related.py:579
+#, fuzzy
+msgid "Separate multiple IDs with commas."
+msgstr " Gwahanwch mwy nag un ID gyda atalnodau."
+
+#: db/models/fields/related.py:581
+#, fuzzy
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Gafaelwch lawr \"Control\", neu \"Command\" ar Fac, i ddewis mwy nag un."
+
+#: db/models/fields/related.py:625
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+msgstr[1] ""
+
+#: forms/__init__.py:380
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] ""
+msgstr[1] ""
+
+#: forms/__init__.py:385
+msgid "Line breaks are not allowed here."
+msgstr "Ni chaniateir toriadau llinell yma."
+
+#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Dewisiwch dewis dilys; dydy '%(data)s' dim mewn %(choices)s."
+
+#: forms/__init__.py:645
+msgid "The submitted file is empty."
+msgstr "Mae'r ffeil yn wag."
+
+#: forms/__init__.py:699
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Rhowch rhif cyfan rhwng -32,768 a 32,767."
+
+#: forms/__init__.py:708
+msgid "Enter a positive number."
+msgstr "Rhowch rhif positif."
+
+#: forms/__init__.py:717
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Rhowch rhif cyfan rhwng 0 a 32,767."
+
+#: template/defaultfilters.py:379
+msgid "yes,no,maybe"
+msgstr "ie,na,efallai"
+
+#~ msgid "Comment"
+#~ msgstr "Sylw"
+
+#~ msgid "Comments"
+#~ msgstr "Sylwadau"
+
+#~ msgid "String (up to 50)"
+#~ msgstr "Llinyn (i fyny at 50)"
+
+#~ msgid "label"
+#~ msgstr "label"
+
+#~ msgid "package"
+#~ msgstr "pecyn"
+
+#~ msgid "packages"
+#~ msgstr "pecynau"
+
+#, fuzzy
+#~ msgid "count"
+#~ msgstr "cynnwys"
diff --git a/webapp/django/conf/locale/cy/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/cy/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..c35e11b
--- /dev/null
+++ b/webapp/django/conf/locale/cy/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/cy/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/cy/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..1da646b
--- /dev/null
+++ b/webapp/django/conf/locale/cy/LC_MESSAGES/djangojs.po
@@ -0,0 +1,111 @@
+# Translation of Django admin JS to Welsh.
+# Copyright (C) 2005 Django project
+# This file is distributed under the same license as the Django package.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-12-09 11:51+0100\n"
+"PO-Revision-Date: 2005-12-04 16:53+0000\n"
+"Last-Translator: Jason Davies <jason@jasondavies.com>\n"
+"Language-Team: Cymraeg <cy@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+#, fuzzy
+msgid "Choose all"
+msgstr "Dewis amser"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr ""
+
+#: contrib/admin/media/js/dateparse.js:26
+#: contrib/admin/media/js/calendar.js:24
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Ionawr Chwefror Mawrth Ebrill Mai Mehefin Gorffennaf Medi Hydref Tachwedd "
+"Rhagfyr"
+
+#: contrib/admin/media/js/dateparse.js:27
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr ""
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "S Ll M M I G S"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "Nawr"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "Cloc"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "Dewis amser"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "Hanner nos"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "6 y.b."
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "Hanner dydd"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "Diddymu"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "Heddiw"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "Calendr"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "Ddoe"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "Yfory"
diff --git a/webapp/django/conf/locale/da/LC_MESSAGES/django.mo b/webapp/django/conf/locale/da/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..bc3469d
--- /dev/null
+++ b/webapp/django/conf/locale/da/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/da/LC_MESSAGES/django.po b/webapp/django/conf/locale/da/LC_MESSAGES/django.po
new file mode 100644
index 0000000..2faa419
--- /dev/null
+++ b/webapp/django/conf/locale/da/LC_MESSAGES/django.po
@@ -0,0 +1,4498 @@
+# Translation of django.po to Danish
+# This file is distributed under the same license as the Django package.
+# 
+# 
+msgid ""
+msgstr ""
+"Project-Id-Version: Django 1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-08-11 20:13+0200\n"
+"PO-Revision-Date: 2008-08-11 20:41+0200\n"
+"Last-Translator: Finn Gruwier Larsen<finn@gruwier.dk>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: conf/global_settings.py:44
+msgid "Arabic"
+msgstr "Arabisk"
+
+#: conf/global_settings.py:45
+msgid "Bengali"
+msgstr "Bengalsk"
+
+#: conf/global_settings.py:46
+msgid "Bulgarian"
+msgstr "Bulgarsk"
+
+#: conf/global_settings.py:47
+msgid "Catalan"
+msgstr "Catalansk"
+
+#: conf/global_settings.py:48
+msgid "Czech"
+msgstr "Tjekkisk"
+
+#: conf/global_settings.py:49
+msgid "Welsh"
+msgstr "Walisisk"
+
+#: conf/global_settings.py:50
+msgid "Danish"
+msgstr "Dansk"
+
+#: conf/global_settings.py:51
+msgid "German"
+msgstr "Tysk"
+
+#: conf/global_settings.py:52
+msgid "Greek"
+msgstr "Græsk"
+
+#: conf/global_settings.py:53
+msgid "English"
+msgstr "Engelsk"
+
+#: conf/global_settings.py:54
+msgid "Spanish"
+msgstr "Spansk"
+
+#: conf/global_settings.py:55
+msgid "Estonian"
+msgstr "Estisk"
+
+#: conf/global_settings.py:56
+msgid "Argentinean Spanish"
+msgstr "Argentisk spansk"
+
+#: conf/global_settings.py:57
+msgid "Basque"
+msgstr "Baskisk"
+
+#: conf/global_settings.py:58
+msgid "Persian"
+msgstr "Persisk"
+
+#: conf/global_settings.py:59
+msgid "Finnish"
+msgstr "Finsk"
+
+#: conf/global_settings.py:60
+msgid "French"
+msgstr "Fransk"
+
+#: conf/global_settings.py:61
+msgid "Irish"
+msgstr "Irsk"
+
+#: conf/global_settings.py:62
+msgid "Galician"
+msgstr "Galicisk"
+
+#: conf/global_settings.py:63
+msgid "Hungarian"
+msgstr "Ungarsk"
+
+#: conf/global_settings.py:64
+msgid "Hebrew"
+msgstr "Hebræisk"
+
+#: conf/global_settings.py:65
+msgid "Croatian"
+msgstr "Kroatisk"
+
+#: conf/global_settings.py:66
+msgid "Icelandic"
+msgstr "Islandsk"
+
+#: conf/global_settings.py:67
+msgid "Italian"
+msgstr "Italiensk"
+
+#: conf/global_settings.py:68
+msgid "Japanese"
+msgstr "Japansk"
+
+#: conf/global_settings.py:69
+msgid "Georgian"
+msgstr "Georgisk"
+
+#: conf/global_settings.py:70
+msgid "Korean"
+msgstr "Koreansk"
+
+#: conf/global_settings.py:71
+msgid "Khmer"
+msgstr "Khmer"
+
+#: conf/global_settings.py:72
+msgid "Kannada"
+msgstr "Kannada"
+
+#: conf/global_settings.py:73
+msgid "Latvian"
+msgstr "Lettisk"
+
+#: conf/global_settings.py:74
+msgid "Lithuanian"
+msgstr "Litauisk"
+
+#: conf/global_settings.py:75
+msgid "Macedonian"
+msgstr "Makedonsk"
+
+#: conf/global_settings.py:76
+msgid "Dutch"
+msgstr "Hollandsk"
+
+#: conf/global_settings.py:77
+msgid "Norwegian"
+msgstr "Norsk"
+
+#: conf/global_settings.py:78
+msgid "Polish"
+msgstr "Polsk"
+
+#: conf/global_settings.py:79
+msgid "Portugese"
+msgstr "Portugisisk"
+
+#: conf/global_settings.py:80
+msgid "Brazilian Portuguese"
+msgstr "Brasiliansk portugisisk"
+
+#: conf/global_settings.py:81
+msgid "Romanian"
+msgstr "Rumænsk"
+
+#: conf/global_settings.py:82
+msgid "Russian"
+msgstr "Russisk"
+
+#: conf/global_settings.py:83
+msgid "Slovak"
+msgstr "Slovakisk"
+
+#: conf/global_settings.py:84
+msgid "Slovenian"
+msgstr "Slovensk"
+
+#: conf/global_settings.py:85
+msgid "Serbian"
+msgstr "Serbisk"
+
+#: conf/global_settings.py:86
+msgid "Swedish"
+msgstr "Svensk"
+
+#: conf/global_settings.py:87
+msgid "Tamil"
+msgstr "Tamil"
+
+#: conf/global_settings.py:88
+msgid "Telugu"
+msgstr "Telugu"
+
+#: conf/global_settings.py:89
+msgid "Turkish"
+msgstr "Tyrkisk"
+
+#: conf/global_settings.py:90
+msgid "Ukrainian"
+msgstr "Ukrainsk"
+
+#: conf/global_settings.py:91
+msgid "Simplified Chinese"
+msgstr "Forenklet kinesisk"
+
+#: conf/global_settings.py:92
+msgid "Traditional Chinese"
+msgstr "Traditionelt kinesisk"
+
+#: contrib/admin/filterspecs.py:44
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Efter %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:74 contrib/admin/filterspecs.py:92
+#: contrib/admin/filterspecs.py:147 contrib/admin/filterspecs.py:173
+msgid "All"
+msgstr "Alle"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Any date"
+msgstr "Når som helst"
+
+#: contrib/admin/filterspecs.py:114
+msgid "Today"
+msgstr "Idag"
+
+#: contrib/admin/filterspecs.py:117
+msgid "Past 7 days"
+msgstr "De sidste 7 dage"
+
+#: contrib/admin/filterspecs.py:119
+msgid "This month"
+msgstr "Denne måned"
+
+#: contrib/admin/filterspecs.py:121
+msgid "This year"
+msgstr "Dette år"
+
+#: contrib/admin/filterspecs.py:147 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "Yes"
+msgstr "Ja"
+
+#: contrib/admin/filterspecs.py:147 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "No"
+msgstr "Nej"
+
+#: contrib/admin/filterspecs.py:154 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "Unknown"
+msgstr "Ukendt"
+
+#: contrib/admin/models.py:19
+msgid "action time"
+msgstr "handlingstid"
+
+#: contrib/admin/models.py:22
+msgid "object id"
+msgstr "objekt-ID"
+
+#: contrib/admin/models.py:23
+msgid "object repr"
+msgstr "objekt repr"
+
+#: contrib/admin/models.py:24
+msgid "action flag"
+msgstr "handlingsflag"
+
+#: contrib/admin/models.py:25
+msgid "change message"
+msgstr "ændringsmeddelelse"
+
+#: contrib/admin/models.py:28
+msgid "log entry"
+msgstr "logmeddelelse"
+
+#: contrib/admin/models.py:29
+msgid "log entries"
+msgstr "logmeddelelser"
+
+#: contrib/admin/options.py:143 contrib/admin/options.py:202
+msgid "None"
+msgstr "Ingen"
+
+#: contrib/admin/options.py:407
+#, python-format
+msgid "Changed %s."
+msgstr "Ændrede %s."
+
+#: contrib/admin/options.py:407 contrib/admin/options.py:417
+#: core/validators.py:279 db/models/manipulators.py:305
+msgid "and"
+msgstr "og"
+
+#: contrib/admin/options.py:412
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Tilføjede %(name)s \"%(object)s\"."
+
+#: contrib/admin/options.py:416
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Ændrede %(list)s for %(name)s \"%(object)s\"."
+
+#: contrib/admin/options.py:421
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Slettede %(name)s \"%(object)s\"."
+
+#: contrib/admin/options.py:425
+msgid "No fields changed."
+msgstr "Ingen felter ændret."
+
+#: contrib/admin/options.py:486 contrib/auth/admin.py:50
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" blev tilføjet i databasen."
+
+#: contrib/admin/options.py:490 contrib/admin/options.py:523
+#: contrib/auth/admin.py:55
+msgid "You may edit it again below."
+msgstr "Du kan redigere det igen herunder."
+
+#: contrib/admin/options.py:500 contrib/admin/options.py:533
+#, python-format
+msgid "You may add another %s below."
+msgstr "Du kan tilføje endnu en %s herunder."
+
+#: contrib/admin/options.py:521
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" blev ændret."
+
+#: contrib/admin/options.py:529
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" blev tilføjet. Du kan redigere det igen herunder."
+
+#: contrib/admin/options.py:596
+#, python-format
+msgid "Add %s"
+msgstr "Tilføj %s"
+
+#: contrib/admin/options.py:673
+#, python-format
+msgid "Change %s"
+msgstr "Ret %s"
+
+#: contrib/admin/options.py:704
+msgid "Database error"
+msgstr "databasefejl"
+
+#: contrib/admin/options.py:753
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" blev slettet."
+
+#: contrib/admin/options.py:760
+msgid "Are you sure?"
+msgstr "Er du sikker?"
+
+#: contrib/admin/options.py:787
+#, python-format
+msgid "Change history: %s"
+msgstr "Ændringshistorik: %s"
+
+#: contrib/admin/sites.py:18 contrib/admin/views/decorators.py:16
+#: contrib/auth/forms.py:72 contrib/comments/views/comments.py:56
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Indtast venligst et korrekt brugernavn og adgangskode. Bemærk, at begge "
+"felter er versalfølsomme."
+
+#: contrib/admin/sites.py:238 contrib/admin/views/decorators.py:68
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Log venligst ind igen, da din session er udløbet. Der er ingen grund til "
+"bekymring - informationen du indsendte er blevet gemt."
+
+#: contrib/admin/sites.py:245 contrib/admin/views/decorators.py:75
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Det ser ud til din browser ikke er indstillet til at acceptere cookies. Slå "
+"venligst cookies til, genindlæs denne side og prøv igen."
+
+#: contrib/admin/sites.py:259 contrib/admin/sites.py:265
+#: contrib/admin/views/decorators.py:92
+msgid "Usernames cannot contain the '@' character."
+msgstr "Brugernavne kan ikke indeholde tegnet '@'."
+
+#: contrib/admin/sites.py:262 contrib/admin/views/decorators.py:88
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "Din e-mail-adresse er ikke dit brugernavn. Prøv '%s' i stedet."
+
+#: contrib/admin/sites.py:330
+msgid "Site administration"
+msgstr "Website-administration"
+
+#: contrib/admin/sites.py:352 contrib/admin/templates/admin/login.html:27
+#: contrib/admin/templates/registration/password_reset_complete.html:14
+#: contrib/admin/views/decorators.py:30
+msgid "Log in"
+msgstr "Log ind"
+
+#: contrib/admin/util.py:126
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Et eller flere %(fieldname)s i %(name)s: %(obj)s"
+
+#: contrib/admin/util.py:131
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Et eller flere %(fieldname)s i %(name)s:"
+
+#: contrib/admin/widgets.py:65
+msgid "Date:"
+msgstr "Dato:"
+
+#: contrib/admin/widgets.py:65
+msgid "Time:"
+msgstr "Tid:"
+
+#: contrib/admin/widgets.py:89
+msgid "Currently:"
+msgstr "Nuværende:"
+
+#: contrib/admin/widgets.py:89
+msgid "Change:"
+msgstr "Ret:"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Siden blev ikke fundet"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Vi beklager, men den ønskede side kunne ikke findes"
+
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/change_form.html:17
+#: contrib/admin/templates/admin/change_list.html:8
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/auth/user/change_password.html:10
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_reset_complete.html:4
+#: contrib/admin/templates/registration/password_reset_confirm.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Hjem"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Serverfejl"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Serverfejl (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Serverfejl <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Der opstod en fejl. Fejlen er rapporteret til website-administratoren via e-"
+"mail, og vil blive rettet hurtigst muligt. Tak for din tålmodighed."
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "Velkommen,"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Dokumentation"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:13
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+msgid "Change password"
+msgstr "Skift adgangskode"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/comments/templates/comments/form.html:6
+msgid "Log out"
+msgstr "Log ud"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django website-administration"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django administration"
+
+#: contrib/admin/templates/admin/change_form.html:19
+#: contrib/admin/templates/admin/index.html:29
+msgid "Add"
+msgstr "Tilføj"
+
+#: contrib/admin/templates/admin/change_form.html:26
+#: contrib/admin/templates/admin/object_history.html:5
+msgid "History"
+msgstr "Historik"
+
+#: contrib/admin/templates/admin/change_form.html:27
+msgid "View on site"
+msgstr "Se på website"
+
+#: contrib/admin/templates/admin/change_form.html:37
+#: contrib/admin/templates/admin/auth/user/change_password.html:22
+msgid "Please correct the error below."
+msgstr "Ret venligst fejlen herunder."
+
+#: contrib/admin/templates/admin/change_list.html:16
+#, python-format
+msgid "Add %(name)s"
+msgstr "Tilføj %(name)s"
+
+#: contrib/admin/templates/admin/change_list.html:26
+msgid "Filter"
+msgstr "Filtrer"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+#: contrib/admin/templates/admin/edit_inline/tabular.html:15
+msgid "Delete"
+msgstr "Slet"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:15
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Hvis du sletter %(object_name)s '%(escaped_object)s', vil du også slette "
+" relaterede objekter, men din konto har ikke rettigheder til at slette "
+"følgende objekttyper:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:22
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Er du sikker på du vil slette %(object_name)s \"%(escaped_object)s\"? "
+"Alle de følgende relaterede objekter vil blive slettet:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:27
+msgid "Yes, I'm sure"
+msgstr "Ja, jeg er sikker"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Efter %(filter_title)s "
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Modeller til rådighed i %(name)s-applikationen."
+
+#: contrib/admin/templates/admin/index.html:19
+#, fuzzy, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:35
+msgid "Change"
+msgstr "Ret"
+
+#: contrib/admin/templates/admin/index.html:45
+msgid "You don't have permission to edit anything."
+msgstr "Du har ikke rettigheder til at foretage ændringer."
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "Recent Actions"
+msgstr "Seneste handlinger"
+
+#: contrib/admin/templates/admin/index.html:54
+msgid "My Actions"
+msgstr "Mine handlinger"
+
+#: contrib/admin/templates/admin/index.html:58
+msgid "None available"
+msgstr "Ingen tilgængelige"
+
+#: contrib/admin/templates/admin/invalid_setup.html:7
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Der er noget galt med databaseinstallationen. Kontroller om "
+"databasetabellerne er blevet oprettet og at databasen er læsbar for den"
+"pågældende bruger."
+
+#: contrib/admin/templates/admin/login.html:19
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+msgid "Username:"
+msgstr "Brugernavn:"
+
+#: contrib/admin/templates/admin/login.html:22
+#: contrib/comments/templates/comments/form.html:8
+msgid "Password:"
+msgstr "Adgangskode:"
+
+#: contrib/admin/templates/admin/object_history.html:16
+msgid "Date/time"
+msgstr "Dato/tid"
+
+#: contrib/admin/templates/admin/object_history.html:17
+msgid "User"
+msgstr "Bruger"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Action"
+msgstr "Funktion"
+
+#: contrib/admin/templates/admin/object_history.html:24
+#, fuzzy
+msgid "DATE_WITH_TIME_FULL"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:32
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Dette objekt har ingen ændringshistorik. Det blev formentlig ikke tilføjet "
+"via dette administrations-site"
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Vis alle"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Kør"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgstr "1 resultat"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s i alt"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Gem som ny"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Gem og tilføj endnu en"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Gem og fortsæt med at redigere"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Gem"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr "Indtast først et brugernavn og en adgangskode. Derefter får du yderligere "
+"redigeringsmuligheder."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:13
+#: contrib/auth/forms.py:14 contrib/auth/forms.py:51
+msgid "Username"
+msgstr "Brugernavn"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:20
+#: contrib/admin/templates/admin/auth/user/change_password.html:33
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:52 contrib/auth/forms.py:176
+msgid "Password"
+msgstr "Adgangskode:"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:26
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+#: contrib/auth/forms.py:177
+msgid "Password (again)"
+msgstr "Adgangskode (igen)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:27
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+msgid "Enter the same password as above, for verification."
+msgstr "Indtast den samme adgangskode som ovenfor for verifikation."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:26
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Indtast en ny adgangskode for brugeren <strong>%(username)s</strong>."
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Tak for den kvalitetstid du brugte på websitet idag."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Log ind igen"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Skift adgangskode"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Adgangskoden blev ændret"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Din adgangskode blev ændret."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Indtast venligst din gamle adgangskode for en sikkerheds skyld og indtast "
+"så din nye adgangskode to gange, så vi kan være sikre på, at den er "
+"indtastet korrekt."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Gammel adgangskode:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+#: contrib/admin/templates/registration/password_reset_confirm.html:18
+msgid "New password:"
+msgstr "Ny adgangskode:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+#: contrib/admin/templates/registration/password_reset_confirm.html:20
+msgid "Confirm password:"
+msgstr "Bekræft ny adgangskode:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+#: contrib/admin/templates/registration/password_reset_confirm.html:21
+msgid "Change my password"
+msgstr "Skift min adgangskode"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:4
+#: contrib/admin/templates/registration/password_reset_confirm.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+msgid "Password reset"
+msgstr "Nulstil adgangskode"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:6
+#: contrib/admin/templates/registration/password_reset_complete.html:10
+msgid "Password reset complete"
+msgstr "Adgangskoden blev nulstillet"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:12
+msgid "Your password has been set.  You may go ahead and log in now."
+msgstr "Din adgangskode er blevet sat. Du kan logge ind med den nu."
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:4
+msgid "Password reset confirmation"
+msgstr "Bekræftelse for nulstilling af adgangskode"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:12
+msgid "Enter new password"
+msgstr "Indtast ny adgangskode"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:14
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Indtast venligst din nye adgangskode to gange, så vi kan være sikre på, "
+"at den er indtastet korrekt."
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:26
+msgid "Password reset unsuccessful"
+msgstr "Adgangskoden blev ikke nulstillet"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:28
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used.  Please request a new password reset."
+msgstr "Linket for nulstilling af adgangskoden er ugyldigt, måske fordi det "
+"allerede har været brugt. Anmod venligst påny om nulstilling af adgangskoden."
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Adgangskoden blev nulstillet"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed you instructions for setting your password to the e-mail "
+"address you submitted. You should be receiving it shortly."
+msgstr ""
+"Vi har sendt en instruktion til din e-mail-adresse. Du skulle modtage den "
+"om ganske kort tid."
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Du modtager denne e-mail, fordi du har bedt om at få nulstillet din "
+"adgangskode"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "til din brugerkonto ved %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+msgid "Please go to the following page and choose a new password:"
+msgstr "Gå venligst til denne side og vælg en ny adgangskode:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:9
+msgid "Your username, in case you've forgotten:"
+msgstr "For det tilfælde at du skulle have glemt dit brugernavn er det:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Thanks for using our site!"
+msgstr "Tak fordi du brugte vores website!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Med venlig hilsen %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll e-mail "
+"instructions for setting a new one."
+msgstr ""
+"Har du glemt din adgangskode? Indtast din e-mail-adresse herunder, så sender "
+"vi dig en instruktion vedrørende ny adgangskode."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "E-mail-adresse:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Nulstil min adgangskode"
+
+#: contrib/admin/templatetags/admin_list.py:257
+msgid "All dates"
+msgstr "Alle datoer"
+
+#: contrib/admin/views/main.py:65
+#, python-format
+msgid "Select %s"
+msgstr "Vælg %s"
+
+#: contrib/admin/views/main.py:65
+#, python-format
+msgid "Select %s to change"
+msgstr "Vælg %s, der skal ændres"
+
+#: contrib/admin/views/template.py:36 contrib/sites/models.py:38
+msgid "site"
+msgstr "website"
+
+#: contrib/admin/views/template.py:38
+msgid "template"
+msgstr "skabelon"
+
+#: contrib/admindocs/views.py:53 contrib/admindocs/views.py:55
+#: contrib/admindocs/views.py:57
+msgid "tag:"
+msgstr "tag:"
+
+#: contrib/admindocs/views.py:87 contrib/admindocs/views.py:89
+#: contrib/admindocs/views.py:91
+msgid "filter:"
+msgstr "filter:"
+
+#: contrib/admindocs/views.py:153 contrib/admindocs/views.py:155
+#: contrib/admindocs/views.py:157
+msgid "view:"
+msgstr "view:"
+
+#: contrib/admindocs/views.py:187
+#, python-format
+msgid "App %r not found"
+msgstr "Applikationen %r blev ikke fundet"
+
+#: contrib/admindocs/views.py:194
+#, python-format
+msgid "Model %(model_name)r not found in app %(app_label)r"
+msgstr "Modellen %(model_name)r ikke fundet i applikationen %(app_label)r"
+
+#: contrib/admindocs/views.py:206
+#, python-format
+msgid "the related `%(app_label)s.%(data_type)s` object"
+msgstr "det relaterede `%(app_label)s.%(data_type)s`-objekt"
+
+#: contrib/admindocs/views.py:206 contrib/admindocs/views.py:228
+#: contrib/admindocs/views.py:242 contrib/admindocs/views.py:247
+msgid "model:"
+msgstr "model:"
+
+#: contrib/admindocs/views.py:237
+#, python-format
+msgid "related `%(app_label)s.%(object_name)s` objects"
+msgstr "relaterede `%(app_label)s.%(object_name)s`-objekter"
+
+#: contrib/admindocs/views.py:242
+#, python-format
+msgid "all %s"
+msgstr "alle %s"
+
+#: contrib/admindocs/views.py:247
+#, python-format
+msgid "number of %s"
+msgstr "antal af %s"
+
+#: contrib/admindocs/views.py:253
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Felter på %s-objekter"
+
+#: contrib/admindocs/views.py:317 contrib/admindocs/views.py:328
+#: contrib/admindocs/views.py:330 contrib/admindocs/views.py:336
+#: contrib/admindocs/views.py:337 contrib/admindocs/views.py:339
+msgid "Integer"
+msgstr "Heltal"
+
+#: contrib/admindocs/views.py:318
+msgid "Boolean (Either True or False)"
+msgstr "Boolsk (enten True eller False)"
+
+#: contrib/admindocs/views.py:319 contrib/admindocs/views.py:338
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Streng (op til %(max_length)s)"
+
+#: contrib/admindocs/views.py:320
+msgid "Comma-separated integers"
+msgstr "Kommaadskilte heltal"
+
+#: contrib/admindocs/views.py:321
+msgid "Date (without time)"
+msgstr "Dato (uden tid)"
+
+#: contrib/admindocs/views.py:322
+msgid "Date (with time)"
+msgstr "Dato (med tid)"
+
+#: contrib/admindocs/views.py:323
+msgid "Decimal number"
+msgstr "Decimaltal"
+
+#: contrib/admindocs/views.py:324
+msgid "E-mail address"
+msgstr "E-mail-adresse"
+
+#: contrib/admindocs/views.py:325 contrib/admindocs/views.py:326
+#: contrib/admindocs/views.py:329
+msgid "File path"
+msgstr "Sti"
+
+#: contrib/admindocs/views.py:327
+msgid "Floating point number"
+msgstr "Flydende-komma-tal"
+
+#: contrib/admindocs/views.py:331 contrib/comments/models.py:89
+msgid "IP address"
+msgstr "IP-adresse"
+
+#: contrib/admindocs/views.py:333
+msgid "Boolean (Either True, False or None)"
+msgstr "Boolsk (True, False eller None)"
+
+#: contrib/admindocs/views.py:334
+msgid "Relation to parent model"
+msgstr "Relation til forældermodel"
+
+#: contrib/admindocs/views.py:335
+msgid "Phone number"
+msgstr "Telefonnummer"
+
+#: contrib/admindocs/views.py:340
+msgid "Text"
+msgstr "Tekst"
+
+#: contrib/admindocs/views.py:341
+msgid "Time"
+msgstr "Tid"
+
+#: contrib/admindocs/views.py:342 contrib/flatpages/admin.py:8
+#: contrib/flatpages/models.py:8
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admindocs/views.py:343
+msgid "U.S. state (two uppercase letters)"
+msgstr "Stat (i USA, to store bogstaver)"
+
+#: contrib/admindocs/views.py:344
+msgid "XML text"
+msgstr "XML-tekst"
+
+#: contrib/admindocs/views.py:370
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s ser ikke ud til at være et urlpattern-objekt"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Bookmarklets"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:4
+msgid "Documentation bookmarklets"
+msgstr "Dokumentations-bookmarklets"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:8
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">For at installere bookmarklets, træk linket til din "
+"bogmærkelinje\n"
+" eller højreklik på linket og tilføj det til dine bogmærker. Du kan nu\n"
+"markere bookmarkletten fra enhver side på websitet. Bemærk, at nogle af "
+"disse \n"
+"bookmarkletter kræver, at du ser på websitet fra en computer der opfattes \n"
+"som \"intern\" (tal med din systemadministrator, hvis du ikke er sikker på "
+"om\n"
+"din computer er \"intern\").</p>\n"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:18
+msgid "Documentation for this page"
+msgstr "Dokumentation for denne side"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:19
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+"Bringer dig fra en hvilken som helst side til dokumentationen for det view, "
+"der genererer den pågældende side."
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:21
+msgid "Show object ID"
+msgstr "Vis objekt-ID"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:22
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Viser indholdstypen og det unikke ID for sider, der repræsenterer et enkelt objekt."
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:24
+msgid "Edit this object (current window)"
+msgstr "Rediger dette objekt (i det aktuelle vindue)"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:25
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+"Springer til administrationssiden for sider, der repræsenterer et enkelt "
+"objekt."
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:27
+msgid "Edit this object (new window)"
+msgstr "Rediger dette objekt (i nyt vindue)"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:28
+msgid "As above, but opens the admin page in a new window."
+msgstr "Som ovenfor, men åbner administrationssiden i et nyt vindue."
+
+#: contrib/auth/admin.py:21
+msgid "Personal info"
+msgstr "Personlig information"
+
+#: contrib/auth/admin.py:22
+msgid "Permissions"
+msgstr "Rettigheder"
+
+#: contrib/auth/admin.py:23
+msgid "Important dates"
+msgstr "Vigtige datoer"
+
+#: contrib/auth/admin.py:24
+msgid "Groups"
+msgstr "Grupper"
+
+#: contrib/auth/admin.py:60
+msgid "Add user"
+msgstr "Tilføj bruger"
+
+#: contrib/auth/admin.py:85
+msgid "Password changed successfully."
+msgstr "Adgangskoden blev ændret."
+
+#: contrib/auth/admin.py:91
+#, python-format
+msgid "Change password: %s"
+msgstr "Skift adgangskode: %s"
+
+#: contrib/auth/forms.py:15 contrib/auth/models.py:137
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr "Påkrævet. Højst 30 tegn, kun alfanumeriske tegn "
+"(bogstaver og tal samt understreg)."
+
+#: contrib/auth/forms.py:16 core/validators.py:72
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Dette felt må kun indeholde bogstaver og cifre samt understreg."
+
+#: contrib/auth/forms.py:18
+msgid "Password confirmation"
+msgstr "Bekræftelse af adgangskode"
+
+#: contrib/auth/forms.py:30
+msgid "A user with that username already exists."
+msgstr "En bruger med dette brugernavn findes allerede."
+
+#: contrib/auth/forms.py:36 contrib/auth/forms.py:146
+#: contrib/auth/forms.py:188
+msgid "The two password fields didn't match."
+msgstr "De to adgangskoder var ikke identiske."
+
+#: contrib/auth/forms.py:74 contrib/comments/views/comments.py:58
+msgid "This account is inactive."
+msgstr "Denne konto er inaktiv."
+
+#: contrib/auth/forms.py:79 contrib/comments/views/comments.py:49
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"Din browser ser ud til ikke at have cookies aktiveret. Cookies er påkrævet "
+"for at kunne logge ind."
+
+#: contrib/auth/forms.py:92
+msgid "E-mail"
+msgstr "E-mail"
+
+#: contrib/auth/forms.py:101
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr "Den e-mail-adresse er ikke tilknyttet en konto. Er du sikker på at "
+"du har registreret dig?"
+
+#: contrib/auth/forms.py:126
+#, python-format
+msgid "Password reset on %s"
+msgstr "Adgangskode nulstillet på %s"
+
+#: contrib/auth/forms.py:134
+msgid "New password"
+msgstr "Ny adgangskode"
+
+#: contrib/auth/forms.py:135
+msgid "New password confirmation"
+msgstr "Bekræftelse af ny adgangskode"
+
+#: contrib/auth/forms.py:160
+msgid "Old password"
+msgstr "Gammel adgangskode"
+
+#: contrib/auth/forms.py:168
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Din gamle adgangskode blev ikke indtastet korrekt. Indtast den venligst igen."
+
+#: contrib/auth/models.py:73 contrib/auth/models.py:96
+msgid "name"
+msgstr "navn"
+
+#: contrib/auth/models.py:75
+msgid "codename"
+msgstr "kodenavn"
+
+#: contrib/auth/models.py:78
+msgid "permission"
+msgstr "rettighed"
+
+#: contrib/auth/models.py:79 contrib/auth/models.py:97
+msgid "permissions"
+msgstr "rettigheder"
+
+#: contrib/auth/models.py:100
+msgid "group"
+msgstr "gruppe"
+
+#: contrib/auth/models.py:101 contrib/auth/models.py:147
+msgid "groups"
+msgstr "grupper"
+
+#: contrib/auth/models.py:137
+msgid "username"
+msgstr "brugernavn"
+
+#: contrib/auth/models.py:138
+msgid "first name"
+msgstr "fornavn"
+
+#: contrib/auth/models.py:139
+msgid "last name"
+msgstr "efternavn"
+
+#: contrib/auth/models.py:140
+msgid "e-mail address"
+msgstr "e-mail-adresse"
+
+#: contrib/auth/models.py:141
+msgid "password"
+msgstr "adgangskode"
+
+#: contrib/auth/models.py:141
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"Brug '[algo]$[salt]$[hexdigest]' eller brug <a href=\"password/\">formularen "
+"til skift af adgangskode</a>."
+
+#: contrib/auth/models.py:142
+msgid "staff status"
+msgstr "admin-status"
+
+#: contrib/auth/models.py:142
+msgid "Designates whether the user can log into this admin site."
+msgstr "Bestemmer om brugeren kan logge ind på dette administrationswebsite."
+
+#: contrib/auth/models.py:143
+msgid "active"
+msgstr "aktiv"
+
+#: contrib/auth/models.py:143
+msgid ""
+"Designates whether this user should be treated as active. Unselect this "
+"instead of deleting accounts."
+msgstr "Bestemmer om brugeren skal behandles som aktiv. Fravælg dette "
+"frem for at slette en konto."
+
+#: contrib/auth/models.py:144
+msgid "superuser status"
+msgstr "superbrugerstatus"
+
+#: contrib/auth/models.py:144
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr ""
+"Bestemmer at denne bruger har alle rettigheder uden at tildele dem "
+"eksplicit."
+
+#: contrib/auth/models.py:145
+msgid "last login"
+msgstr "sidst logget ind"
+
+#: contrib/auth/models.py:146
+msgid "date joined"
+msgstr "dato for registrering"
+
+#: contrib/auth/models.py:148
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"Udover de rettigheder, der manuelt er tildelt brugeren, vil denne også få "
+"alle rettigheder, der er tildelt hver gruppe, brugeren er medlem af."
+
+#: contrib/auth/models.py:149
+msgid "user permissions"
+msgstr "Rettigheder"
+
+#: contrib/auth/models.py:153
+msgid "user"
+msgstr "bruger"
+
+#: contrib/auth/models.py:154
+msgid "users"
+msgstr "brugere"
+
+#: contrib/auth/models.py:309
+msgid "message"
+msgstr "meddelelse"
+
+#: contrib/auth/views.py:51
+msgid "Logged out"
+msgstr "Logget ud"
+
+#: contrib/comments/models.py:71 contrib/comments/models.py:164
+msgid "object ID"
+msgstr "objekt-ID"
+
+#: contrib/comments/models.py:72
+msgid "headline"
+msgstr "overskrift"
+
+#: contrib/comments/models.py:73 contrib/comments/models.py:95
+#: contrib/comments/models.py:165
+msgid "comment"
+msgstr "kommentar"
+
+#: contrib/comments/models.py:74
+msgid "rating #1"
+msgstr "bedømmelse: 1"
+
+#: contrib/comments/models.py:75
+msgid "rating #2"
+msgstr "bedømmelse: 2"
+
+#: contrib/comments/models.py:76
+msgid "rating #3"
+msgstr "bedømmelse: 3"
+
+#: contrib/comments/models.py:77
+msgid "rating #4"
+msgstr "bedømmelse: 4"
+
+#: contrib/comments/models.py:78
+msgid "rating #5"
+msgstr "bedømmelse: 5"
+
+#: contrib/comments/models.py:79
+msgid "rating #6"
+msgstr "bedømmelse: 6"
+
+#: contrib/comments/models.py:80
+msgid "rating #7"
+msgstr "bedømmelse: 7"
+
+#: contrib/comments/models.py:81
+msgid "rating #8"
+msgstr "bedømmelse: 8"
+
+#: contrib/comments/models.py:86
+msgid "is valid rating"
+msgstr "er en gyldig bedømmelse"
+
+#: contrib/comments/models.py:87 contrib/comments/models.py:167
+msgid "date/time submitted"
+msgstr "dato/tidspunkt for oprettelse"
+
+#: contrib/comments/models.py:88 contrib/comments/models.py:168
+msgid "is public"
+msgstr "er offentlig"
+
+#: contrib/comments/models.py:90
+msgid "is removed"
+msgstr "er fjernet"
+
+#: contrib/comments/models.py:90
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Afkryds denne boks, hvis kommentaren er upassende. Beskeden \"Denne kommentar "
+"er blevet fjernet\" vil blive vist i stedet."
+
+#: contrib/comments/models.py:96
+msgid "comments"
+msgstr "kommentarer"
+
+#: contrib/comments/models.py:128 contrib/comments/models.py:199
+msgid "Content object"
+msgstr "Indholdsobjekt"
+
+#: contrib/comments/models.py:156
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Indsendt af %(user)s den %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:166
+msgid "person's name"
+msgstr "personens navn"
+
+#: contrib/comments/models.py:169
+msgid "ip address"
+msgstr "IP-adresse"
+
+#: contrib/comments/models.py:171
+msgid "approved by staff"
+msgstr "godkendt af personale"
+
+#: contrib/comments/models.py:175
+msgid "free comment"
+msgstr "fri kommentar"
+
+#: contrib/comments/models.py:176
+msgid "free comments"
+msgstr "frie kommentarer"
+
+#: contrib/comments/models.py:227
+msgid "score"
+msgstr "score"
+
+#: contrib/comments/models.py:228
+msgid "score date"
+msgstr "scoringsdato"
+
+#: contrib/comments/models.py:232
+msgid "karma score"
+msgstr "karma score"
+
+#: contrib/comments/models.py:233
+msgid "karma scores"
+msgstr "karma score"
+
+#: contrib/comments/models.py:237
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d bedømmelse efter %(user)s"
+
+#: contrib/comments/models.py:254
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Denne kommentar blev mærket af %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:262
+msgid "flag date"
+msgstr "mærkningsdato"
+
+#: contrib/comments/models.py:266
+msgid "user flag"
+msgstr "brugermærke"
+
+#: contrib/comments/models.py:267
+msgid "user flags"
+msgstr "brugermærker"
+
+#: contrib/comments/models.py:271
+#, python-format
+msgid "Flag by %r"
+msgstr "Mærket af %r"
+
+#: contrib/comments/models.py:277
+msgid "deletion date"
+msgstr "sletningsdato"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "moderatorsletning"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "moderatorsletninger"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Moderatorsletning af %r"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Har du glemt din adgangskode?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Bedømmelser"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Påkrævet"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Valgfri"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Indsend et foto"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Kommentar:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Forhåndsvis kommentar"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Dit navn:"
+
+#: contrib/comments/views/comments.py:76
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr ""
+"Denne bedømmelse er påkrævet fordi du har indtastet mindst en anden bedømmelse."
+
+#: contrib/comments/views/comments.py:160
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Denne kommentar blev indsendt af en bruger, som har indsendt færre end %"
+"(count)s kommentar:\n"
+"\n"
+"%(text)s"
+"Denne kommentar blev indsendt af en bruger som har indsendt færre end %"
+"(count)s kommentarer:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:165
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Denne kommentar blev indsendt af en overfladisk bruger:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:238
+#: contrib/comments/views/comments.py:331
+msgid "Only POSTs are allowed"
+msgstr "Kun POST er tilladt"
+
+#: contrib/comments/views/comments.py:242
+#: contrib/comments/views/comments.py:335
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Et eller flere af de påkrævede felter blev ikke indsendt"
+
+#: contrib/comments/views/comments.py:246
+#: contrib/comments/views/comments.py:337
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Nogen har misbrugt kommentarformularen (sikkerhedsovertrædelse)"
+
+#: contrib/comments/views/comments.py:256
+#: contrib/comments/views/comments.py:343
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"Kommentarformularen havde en ugyldigt 'target'-parameter - objekt-ID'et "
+"var ugyldigt"
+
+#: contrib/comments/views/comments.py:307
+#: contrib/comments/views/comments.py:372
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "Kommentarformularen tilbød ikke hverken 'forhåndsvis' eller 'indsend'"
+
+#: contrib/comments/views/karma.py:21
+msgid "Anonymous users cannot vote"
+msgstr "Anonyme brugere kan ikke stemme"
+
+#: contrib/comments/views/karma.py:25
+msgid "Invalid comment ID"
+msgstr "Ugyldigt kommentar-ID"
+
+#: contrib/comments/views/karma.py:27
+msgid "No voting for yourself"
+msgstr "Du kan ikke selv stemme"
+
+#: contrib/contenttypes/models.py:67
+msgid "python model class name"
+msgstr "klassenavn i Python-model"
+
+#: contrib/contenttypes/models.py:71
+msgid "content type"
+msgstr "indholdstype"
+
+#: contrib/contenttypes/models.py:72
+msgid "content types"
+msgstr "indholdstyper"
+
+#: contrib/flatpages/admin.py:9
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Eksempel: '/om/kontakt/'. Vær opmærksom på, at der skal være skråstreg både "
+"først og sidst."
+
+#: contrib/flatpages/admin.py:11 core/validators.py:76
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Dette felt må kun indeholde bogstaver, cifre, understreger, bindestreger og "
+"skråstreger."
+
+#: contrib/flatpages/admin.py:22
+msgid "Advanced options"
+msgstr "Avancerede muligheder"
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "titel"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "indhold"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "tillad kommentarer"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "skabelonnavn"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"Eksempel: 'flatpages/kontaktside'. Hvis dette ikke tilbydes, bruger "
+"systemet 'flatpages/default'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "registrering påkrævet"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Hvis denne boks er markeret, vil kun brugere der er logget ind, kunne "
+"se siden."
+
+#: contrib/flatpages/models.py:19
+msgid "flat page"
+msgstr "flad side"
+
+#: contrib/flatpages/models.py:20
+msgid "flat pages"
+msgstr "flade sider"
+
+#: contrib/gis/forms/fields.py:10
+msgid "No geometry value provided."
+msgstr "Ingen værdi givet for geometri."
+
+#: contrib/gis/forms/fields.py:11
+msgid "Invalid Geometry value."
+msgstr "Ugyldig geometriværdi."
+
+#: contrib/gis/forms/fields.py:12
+msgid "Invalid Geometry type."
+msgstr "Ugyldig gemometritype."
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "th"
+msgstr "."
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "st"
+msgstr "."
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "nd"
+msgstr "."
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "rd"
+msgstr "."
+
+#: contrib/humanize/templatetags/humanize.py:51
+#, python-format
+msgid "%(value).1f million"
+msgstr "%(value).1f million"
+
+#: contrib/humanize/templatetags/humanize.py:54
+#, python-format
+msgid "%(value).1f billion"
+msgstr "%(value).1f milliard"
+
+#: contrib/humanize/templatetags/humanize.py:57
+#, python-format
+msgid "%(value).1f trillion"
+msgstr "%(value).1f billion"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "one"
+msgstr "en"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "two"
+msgstr "to"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "three"
+msgstr "tre"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "four"
+msgstr "fire"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "five"
+msgstr "fem"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "six"
+msgstr "seks"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "seven"
+msgstr "syv"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "eight"
+msgstr "otte"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "nine"
+msgstr "ni"
+
+#: contrib/humanize/templatetags/humanize.py:93
+msgid "today"
+msgstr "i dag"
+
+#: contrib/humanize/templatetags/humanize.py:95
+msgid "tomorrow"
+msgstr "i morgen"
+
+#: contrib/humanize/templatetags/humanize.py:97
+msgid "yesterday"
+msgstr "i går"
+
+#: contrib/localflavor/ar/forms.py:27
+msgid "Enter a postal code in the format NNNN or ANNNNAAA."
+msgstr "Indtast et postnummer i formatet NNNN eller ANNNNAAA."
+
+#: contrib/localflavor/ar/forms.py:49 contrib/localflavor/br/forms.py:96
+#: contrib/localflavor/br/forms.py:135 contrib/localflavor/pe/forms.py:23
+#: contrib/localflavor/pe/forms.py:51
+msgid "This field requires only numbers."
+msgstr ""
+
+#: contrib/localflavor/ar/forms.py:50
+msgid "This field requires 7 or 8 digits."
+msgstr ""
+
+#: contrib/localflavor/ar/forms.py:79
+msgid "Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format."
+msgstr ""
+
+#: contrib/localflavor/ar/forms.py:80
+msgid "Invalid CUIT."
+msgstr ""
+
+#: contrib/localflavor/at/at_states.py:5
+msgid "Burgenland"
+msgstr ""
+
+#: contrib/localflavor/at/at_states.py:6
+msgid "Carinthia"
+msgstr ""
+
+#: contrib/localflavor/at/at_states.py:7
+msgid "Lower Austria"
+msgstr ""
+
+#: contrib/localflavor/at/at_states.py:8
+msgid "Upper Austria"
+msgstr ""
+
+#: contrib/localflavor/at/at_states.py:9
+msgid "Salzburg"
+msgstr ""
+
+#: contrib/localflavor/at/at_states.py:10
+msgid "Styria"
+msgstr ""
+
+#: contrib/localflavor/at/at_states.py:11
+msgid "Tyrol"
+msgstr ""
+
+#: contrib/localflavor/at/at_states.py:12
+msgid "Vorarlberg"
+msgstr ""
+
+#: contrib/localflavor/at/at_states.py:13
+msgid "Vienna"
+msgstr ""
+
+#: contrib/localflavor/at/forms.py:20 contrib/localflavor/ch/forms.py:16
+#: contrib/localflavor/no/forms.py:12
+msgid "Enter a zip code in the format XXXX."
+msgstr ""
+
+#: contrib/localflavor/at/forms.py:48
+msgid "Enter a valid Austrian Social Security Number in XXXX XXXXXX format."
+msgstr ""
+
+#: contrib/localflavor/au/forms.py:16
+msgid "Enter a 4 digit post code."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:21
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:58
+msgid ""
+"Select a valid brazilian state. That state is not one of the available "
+"states."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:94
+msgid "Invalid CPF number."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:95
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:134
+msgid "Invalid CNPJ number."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:136
+msgid "This field requires at least 14 digits"
+msgstr ""
+
+#: contrib/localflavor/ca/forms.py:17
+msgid "Enter a postal code in the format XXX XXX."
+msgstr ""
+
+#: contrib/localflavor/ca/forms.py:88
+msgid "Enter a valid Canadian Social Insurance number in XXX-XXX-XXX format."
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr ""
+
+#: contrib/localflavor/ch/forms.py:64
+msgid ""
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
+msgstr ""
+
+#: contrib/localflavor/cl/forms.py:29
+msgid "Enter a valid Chilean RUT."
+msgstr ""
+
+#: contrib/localflavor/cl/forms.py:30
+msgid "Enter a valid Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr ""
+
+#: contrib/localflavor/cl/forms.py:31
+msgid "The Chilean RUT is not valid."
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr ""
+
+#: contrib/localflavor/de/forms.py:14 contrib/localflavor/fi/forms.py:12
+#: contrib/localflavor/fr/forms.py:15
+msgid "Enter a zip code in the format XXXXX."
+msgstr ""
+
+#: contrib/localflavor/de/forms.py:41
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:5
+msgid "Arava"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:6
+msgid "Albacete"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:7
+msgid "Alacant"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:8
+msgid "Almeria"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:9
+msgid "Avila"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:10
+msgid "Badajoz"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:11
+msgid "Illes Balears"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:12
+msgid "Barcelona"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:13
+msgid "Burgos"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:14
+msgid "Caceres"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:15
+msgid "Cadiz"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:16
+msgid "Castello"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:17
+msgid "Ciudad Real"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:18
+msgid "Cordoba"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:19
+msgid "A Coruna"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:20
+msgid "Cuenca"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:21
+msgid "Girona"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:22
+msgid "Granada"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:23
+msgid "Guadalajara"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:24
+msgid "Guipuzkoa"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:25
+msgid "Huelva"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:26
+msgid "Huesca"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:27
+msgid "Jaen"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:28
+msgid "Leon"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:29
+msgid "Lleida"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:30
+#: contrib/localflavor/es/es_regions.py:17
+msgid "La Rioja"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:31
+msgid "Lugo"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:32
+#: contrib/localflavor/es/es_regions.py:18
+msgid "Madrid"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:33
+msgid "Malaga"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:34
+msgid "Murcia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:35
+msgid "Navarre"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:36
+msgid "Ourense"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:37
+msgid "Asturias"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:38
+msgid "Palencia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:39
+msgid "Las Palmas"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:40
+msgid "Pontevedra"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:41
+msgid "Salamanca"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:42
+msgid "Santa Cruz de Tenerife"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:43
+#: contrib/localflavor/es/es_regions.py:11
+msgid "Cantabria"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:44
+msgid "Segovia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:45
+msgid "Seville"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:46
+msgid "Soria"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:47
+msgid "Tarragona"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:48
+msgid "Teruel"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:49
+msgid "Toledo"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:50
+msgid "Valencia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:51
+msgid "Valladolid"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:52
+msgid "Bizkaia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:53
+msgid "Zamora"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:54
+msgid "Zaragoza"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:55
+msgid "Ceuta"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:56
+msgid "Melilla"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:5
+msgid "Andalusia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:6
+msgid "Aragon"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:7
+msgid "Principality of Asturias"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:8
+msgid "Balearic Islands"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:9
+msgid "Basque Country"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:10
+msgid "Canary Islands"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:12
+msgid "Castile-La Mancha"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:13
+msgid "Castile and Leon"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:14
+msgid "Catalonia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:15
+msgid "Extremadura"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:16
+msgid "Galicia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:19
+msgid "Region of Murcia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:20
+msgid "Foral Community of Navarre"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:21
+msgid "Valencian Community"
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:19
+msgid "Enter a valid postal code in the range and format 01XXX - 52XXX."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:39
+msgid ""
+"Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or "
+"9XXXXXXXX."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:66
+msgid "Please enter a valid NIF, NIE, or CIF."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:67
+msgid "Please enter a valid NIF or NIE."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:68
+msgid "Invalid checksum for NIF."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:69
+msgid "Invalid checksum for NIE."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:70
+msgid "Invalid checksum for CIF."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:142
+msgid ""
+"Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:143
+msgid "Invalid checksum for bank account number."
+msgstr ""
+
+#: contrib/localflavor/fi/forms.py:28
+msgid "Enter a valid Finnish social security number."
+msgstr ""
+
+#: contrib/localflavor/in_/forms.py:14
+msgid "Enter a zip code in the format XXXXXXX."
+msgstr ""
+
+#: contrib/localflavor/is_/forms.py:17
+msgid ""
+"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr ""
+
+#: contrib/localflavor/is_/forms.py:18
+msgid "The Icelandic identification number is not valid."
+msgstr ""
+
+#: contrib/localflavor/it/forms.py:14
+msgid "Enter a valid zip code."
+msgstr ""
+
+#: contrib/localflavor/it/forms.py:43
+msgid "Enter a valid Social Security number."
+msgstr ""
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr ""
+
+#: contrib/localflavor/jp/forms.py:17
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:12
+msgid "Aguascalientes"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:13
+msgid "Baja California"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:14
+msgid "Baja California Sur"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:15
+msgid "Campeche"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:16
+msgid "Chihuahua"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:17
+msgid "Chiapas"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:18
+msgid "Coahuila"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:19
+msgid "Colima"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:20
+msgid "Distrito Federal"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:21
+msgid "Durango"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:22
+msgid "Guerrero"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:23
+msgid "Guanajuato"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:24
+msgid "Hidalgo"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:25
+msgid "Jalisco"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:26
+msgid "Estado de México"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:27
+msgid "Michoacán"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:28
+msgid "Morelos"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:29
+msgid "Nayarit"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:30
+msgid "Nuevo León"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:31
+msgid "Oaxaca"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:32
+msgid "Puebla"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:33
+msgid "Querétaro"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:34
+msgid "Quintana Roo"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:35
+msgid "Sinaloa"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:36
+msgid "San Luis Potosí"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:37
+msgid "Sonora"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:38
+msgid "Tabasco"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:39
+msgid "Tamaulipas"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:40
+msgid "Tlaxcala"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:41
+msgid "Veracruz"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:42
+msgid "Yucatán"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:43
+msgid "Zacatecas"
+msgstr ""
+
+#: contrib/localflavor/nl/forms.py:21
+msgid "Enter a valid postal code"
+msgstr ""
+
+#: contrib/localflavor/nl/forms.py:52
+msgid "Enter a valid phone number"
+msgstr ""
+
+#: contrib/localflavor/nl/forms.py:78
+msgid "Enter a valid SoFi number"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:4
+msgid "Drente"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:5
+msgid "Flevoland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:6
+msgid "Friesland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:7
+msgid "Gelderland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:8
+msgid "Groningen"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:9
+msgid "Limburg"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:10
+msgid "Noord-Brabant"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:11
+msgid "Noord-Holland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:12
+msgid "Overijssel"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:13
+msgid "Utrecht"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:14
+msgid "Zeeland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:15
+msgid "Zuid-Holland"
+msgstr ""
+
+#: contrib/localflavor/no/forms.py:33
+msgid "Enter a valid Norwegian social security number."
+msgstr ""
+
+#: contrib/localflavor/pe/forms.py:24
+msgid "This field requires 8 digits."
+msgstr ""
+
+#: contrib/localflavor/pe/forms.py:52
+msgid "This field requires 11 digits."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:39
+msgid "National Identification Number consists of 11 digits."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:40
+msgid "Wrong checksum for the National Identification Number."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:72
+msgid ""
+"Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:73
+msgid "Wrong checksum for the Tax Number (NIP)."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:112
+msgid "National Business Register Number (REGON) consists of 7 or 9 digits."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:113
+msgid "Wrong checksum for the National Business Register Number (REGON)."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:156
+msgid "Enter a postal code in the format XX-XXX."
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:8
+msgid "Lower Silesia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:9
+msgid "Kuyavia-Pomerania"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:10
+msgid "Lublin"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:11
+msgid "Lubusz"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:12
+msgid "Lodz"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:13
+msgid "Lesser Poland"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:14
+msgid "Masovia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:15
+msgid "Opole"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:16
+msgid "Subcarpatia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:17
+msgid "Podlasie"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:18
+msgid "Pomerania"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:19
+msgid "Silesia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:20
+msgid "Swietokrzyskie"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:21
+msgid "Warmia-Masuria"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:22
+msgid "Greater Poland"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:23
+msgid "West Pomerania"
+msgstr ""
+
+#: contrib/localflavor/ro/forms.py:19
+msgid "Enter a valid CIF."
+msgstr ""
+
+#: contrib/localflavor/ro/forms.py:56
+msgid "Enter a valid CNP."
+msgstr "Indtast et gyldigt filnavn."
+
+#: contrib/localflavor/ro/forms.py:141
+msgid "Enter a valid IBAN in ROXX-XXXX-XXXX-XXXX-XXXX-XXXX format"
+msgstr ""
+
+#: contrib/localflavor/ro/forms.py:171
+msgid "Phone numbers must be in XXXX-XXXXXX format."
+msgstr ""
+
+#: contrib/localflavor/ro/forms.py:194
+msgid "Enter a valid postal code in the format XXXXXX"
+msgstr ""
+
+#: contrib/localflavor/sk/forms.py:30
+msgid "Enter a postal code in the format XXXXX or XXX XX."
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:8
+msgid "Banska Bystrica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:9
+msgid "Banska Stiavnica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:10
+msgid "Bardejov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:11
+msgid "Banovce nad Bebravou"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:12
+msgid "Brezno"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:13
+msgid "Bratislava I"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:14
+msgid "Bratislava II"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:15
+msgid "Bratislava III"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:16
+msgid "Bratislava IV"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:17
+msgid "Bratislava V"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:18
+msgid "Bytca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:19
+msgid "Cadca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:20
+msgid "Detva"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:21
+msgid "Dolny Kubin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:22
+msgid "Dunajska Streda"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:23
+msgid "Galanta"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:24
+msgid "Gelnica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:25
+msgid "Hlohovec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:26
+msgid "Humenne"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:27
+msgid "Ilava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:28
+msgid "Kezmarok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:29
+msgid "Komarno"
+msgstr "mar"
+
+#: contrib/localflavor/sk/sk_districts.py:30
+msgid "Kosice I"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:31
+msgid "Kosice II"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:32
+msgid "Kosice III"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:33
+msgid "Kosice IV"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:34
+msgid "Kosice - okolie"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:35
+msgid "Krupina"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:36
+msgid "Kysucke Nove Mesto"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:37
+msgid "Levice"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:38
+msgid "Levoca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:39
+msgid "Liptovsky Mikulas"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:40
+msgid "Lucenec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:41
+msgid "Malacky"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:42
+msgid "Martin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:43
+msgid "Medzilaborce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:44
+msgid "Michalovce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:45
+msgid "Myjava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:46
+msgid "Namestovo"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:47
+msgid "Nitra"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:48
+msgid "Nove Mesto nad Vahom"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:49
+msgid "Nove Zamky"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:50
+msgid "Partizanske"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:51
+msgid "Pezinok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:52
+msgid "Piestany"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:53
+msgid "Poltar"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:54
+msgid "Poprad"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:55
+msgid "Povazska Bystrica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:56
+msgid "Presov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:57
+msgid "Prievidza"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:58
+msgid "Puchov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:59
+msgid "Revuca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:60
+msgid "Rimavska Sobota"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:61
+msgid "Roznava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:62
+msgid "Ruzomberok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:63
+msgid "Sabinov"
+msgstr "nov"
+
+#: contrib/localflavor/sk/sk_districts.py:64
+msgid "Senec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:65
+msgid "Senica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:66
+msgid "Skalica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:67
+msgid "Snina"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:68
+msgid "Sobrance"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:69
+msgid "Spisska Nova Ves"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:70
+msgid "Stara Lubovna"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:71
+msgid "Stropkov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:72
+msgid "Svidnik"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:73
+msgid "Sala"
+msgstr "Slovakisk"
+
+#: contrib/localflavor/sk/sk_districts.py:74
+msgid "Topolcany"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:75
+msgid "Trebisov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:76
+msgid "Trencin"
+msgstr "Fransk"
+
+#: contrib/localflavor/sk/sk_districts.py:77
+msgid "Trnava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:78
+msgid "Turcianske Teplice"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:79
+msgid "Tvrdosin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:80
+msgid "Velky Krtis"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:81
+msgid "Vranov nad Toplou"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:82
+msgid "Zlate Moravce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:83
+msgid "Zvolen"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:84
+msgid "Zarnovica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:85
+msgid "Ziar nad Hronom"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:86
+msgid "Zilina"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:8
+msgid "Banska Bystrica region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:9
+msgid "Bratislava region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:10
+msgid "Kosice region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:11
+msgid "Nitra region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:12
+msgid "Presov region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:13
+msgid "Trencin region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:14
+msgid "Trnava region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:15
+msgid "Zilina region"
+msgstr ""
+
+#: contrib/localflavor/uk/forms.py:21
+msgid "Enter a valid postcode."
+msgstr "Indtast et gyldigt filnavn."
+
+#: contrib/localflavor/uk/uk_regions.py:11
+msgid "Bedfordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:12
+msgid "Buckinghamshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:14
+msgid "Cheshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:15
+msgid "Cornwall and Isles of Scilly"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:16
+msgid "Cumbria"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:17
+msgid "Derbyshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:18
+msgid "Devon"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:19
+msgid "Dorset"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:20
+msgid "Durham"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:21
+msgid "East Sussex"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:22
+msgid "Essex"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:23
+msgid "Gloucestershire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:24
+msgid "Greater London"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:25
+msgid "Greater Manchester"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:26
+msgid "Hampshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:27
+msgid "Hertfordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:28
+msgid "Kent"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:29
+msgid "Lancashire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:30
+msgid "Leicestershire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:31
+msgid "Lincolnshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:32
+msgid "Merseyside"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:33
+msgid "Norfolk"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:34
+msgid "North Yorkshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:35
+msgid "Northamptonshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:36
+msgid "Northumberland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:37
+msgid "Nottinghamshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:38
+msgid "Oxfordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:39
+msgid "Shropshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:40
+msgid "Somerset"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:41
+msgid "South Yorkshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:42
+msgid "Staffordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:43
+msgid "Suffolk"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:44
+msgid "Surrey"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:45
+msgid "Tyne and Wear"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:46
+msgid "Warwickshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:47
+msgid "West Midlands"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:48
+msgid "West Sussex"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:49
+msgid "West Yorkshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:50
+msgid "Wiltshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:51
+msgid "Worcestershire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:55
+msgid "County Antrim"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:56
+msgid "County Armagh"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:57
+msgid "County Down"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:58
+msgid "County Fermanagh"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:59
+msgid "County Londonderry"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:60
+msgid "County Tyrone"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:64
+msgid "Clwyd"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:65
+msgid "Dyfed"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:66
+msgid "Gwent"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:67
+msgid "Gwynedd"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:68
+msgid "Mid Glamorgan"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:69
+msgid "Powys"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:70
+msgid "South Glamorgan"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:71
+msgid "West Glamorgan"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:75
+msgid "Borders"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:76
+msgid "Central Scotland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:77
+msgid "Dumfries and Galloway"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:78
+msgid "Fife"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:79
+msgid "Grampian"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:80
+msgid "Highland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:81
+msgid "Lothian"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:82
+msgid "Orkney Islands"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:83
+msgid "Shetland Islands"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:84
+msgid "Strathclyde"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:85
+msgid "Tayside"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:86
+msgid "Western Isles"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:90
+msgid "England"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:91
+msgid "Northern Ireland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:92
+msgid "Scotland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:93
+msgid "Wales"
+msgstr "Walisisk"
+
+#: contrib/localflavor/us/forms.py:16
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr ""
+
+#: contrib/localflavor/us/forms.py:54
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr ""
+
+#: contrib/localflavor/za/forms.py:20
+msgid "Enter a valid South African ID number"
+msgstr ""
+
+#: contrib/localflavor/za/forms.py:54
+msgid "Enter a valid South African postal code"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:4
+msgid "Eastern Cape"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:5
+msgid "Free State"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:6
+msgid "Gauteng"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:7
+msgid "KwaZulu-Natal"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:8
+msgid "Limpopo"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:9
+msgid "Mpumalanga"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:10
+msgid "Northern Cape"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:11
+msgid "North West"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:12
+msgid "Western Cape"
+msgstr ""
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr ""
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Dette skal være en absolut sti uden domænenavnet. For eksempel: "
+"'/nyheder/soeg/'"
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "omadresser til"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Dette kan enten være en absolut sti (som ovenfor), eller en komplet URL "
+"startende med 'http://'"
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "omadressering"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "omaddresseringer"
+
+#: contrib/sessions/models.py:45
+msgid "session key"
+msgstr "sessionsnøgle"
+
+#: contrib/sessions/models.py:47
+msgid "session data"
+msgstr "sessionsdata"
+
+#: contrib/sessions/models.py:48
+msgid "expire date"
+msgstr "udløbsdato"
+
+#: contrib/sessions/models.py:53
+msgid "session"
+msgstr "session"
+
+#: contrib/sessions/models.py:54
+msgid "sessions"
+msgstr "sessioner"
+
+#: contrib/sites/models.py:32
+msgid "domain name"
+msgstr "domænenavn"
+
+#: contrib/sites/models.py:33
+msgid "display name"
+msgstr "vist navn"
+
+#: contrib/sites/models.py:39
+msgid "sites"
+msgstr "websites"
+
+#: core/validators.py:80
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "Dette felt må kun indeholde bogstaver, cifre, understreger, streger eller "
+"skråstreger."
+
+#: core/validators.py:84
+msgid "Uppercase letters are not allowed here."
+msgstr "Store bogstaver er ikke tilladt her."
+
+#: core/validators.py:88
+msgid "Lowercase letters are not allowed here."
+msgstr "Små bogstaver er ikke tilladt her."
+
+#: core/validators.py:95
+msgid "Enter only digits separated by commas."
+msgstr "Indtast kun cifre adskilt af kommaer."
+
+#: core/validators.py:107
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Indtast gyldige e-mail-adresser adskilt af kommaer."
+
+#: core/validators.py:111
+msgid "Please enter a valid IP address."
+msgstr "Indtast venligst en gyldig IP-adresse."
+
+#: core/validators.py:115
+msgid "Empty values are not allowed here."
+msgstr "Dette felt må ikke være tomt."
+
+#: core/validators.py:119
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Ikke-numeriske tegn er ikke tilladt her."
+
+#: core/validators.py:123
+msgid "This value can't be comprised solely of digits."
+msgstr "Denne værdi kan ikke udelukkende bestå af cifre."
+
+#: core/validators.py:128 forms/fields.py:161
+msgid "Enter a whole number."
+msgstr "Indtast et heltal."
+
+#: core/validators.py:132
+msgid "Only alphabetical characters are allowed here."
+msgstr "Her er kun bogstaver tilladt."
+
+#: core/validators.py:147
+#, python-format
+msgid "Invalid date: %s"
+msgstr "Ugyldig dato: %s"
+
+#: core/validators.py:152 db/models/fields/__init__.py:569
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Indtast en gyldig dato i formatet ÅÅÅÅ-MM-DD."
+
+#: core/validators.py:157
+msgid "Enter a valid time in HH:MM format."
+msgstr "Indtast en gyldig tid i formatet TT:MM."
+
+#: core/validators.py:161
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Indtast dato og tidspunkt i formatet ÅÅÅÅ-MM-DD TT:MM."
+
+#: core/validators.py:166 forms/fields.py:412
+msgid "Enter a valid e-mail address."
+msgstr "Indtast en gyldig e-mail-adresse."
+
+#: core/validators.py:178 core/validators.py:470 forms/fields.py:430
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Ingen fil blev indsendt. Kontroller kodningstypen i formularen."
+
+#: core/validators.py:189 forms/fields.py:461
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Indsend en billedfil. Filen, du indsendte, var enten ikke et billede eller en "
+"defekt billedfil."
+
+#: core/validators.py:196
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "URL'en %s henviser ikke til en gyldig billedfil."
+
+#: core/validators.py:200
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "Telefonnumre skal være i formatet XXX-XXX-XXXX. \"%s\" er ugyldigt."
+
+#: core/validators.py:208
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "URL'en %s henviser ikke til en gyldig QuickTime-video."
+
+#: core/validators.py:212
+msgid "A valid URL is required."
+msgstr "En gyldig URL er påkrævet."
+
+#: core/validators.py:226
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Gyldig HTML er påkrævet. Specifikke fejl:\n"
+"%s"
+
+#: core/validators.py:233
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Ugyldig XML: %s"
+
+#: core/validators.py:250
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Ugyldig URL: %s"
+
+#: core/validators.py:255 core/validators.py:257
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "Denne URL %s henviser ikke til en gyldig side eller fil."
+
+#: core/validators.py:263
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Indtast en gyldig amerikansk statsforkortelse."
+
+#: core/validators.py:277
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgstr "Var din mund! Ordet %s er ikke tilladt her."
+
+#: core/validators.py:284
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Dette felt skal matche feltet '%s'."
+
+#: core/validators.py:303
+msgid "Please enter something for at least one field."
+msgstr "Indtast venligst noget i mindst ét felt"
+
+#: core/validators.py:312 core/validators.py:323
+msgid "Please enter both fields or leave them both empty."
+msgstr "Udfyld venligst begge felter eller lad dem begge være tomme."
+
+#: core/validators.py:331
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Dette felt skal udfyldes, hvis %(field)s er lig %(value)s."
+
+#: core/validators.py:344
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Dette felt skal udfyldes, hvis %(field)s er forskellig fra %(value)s."
+
+#: core/validators.py:363
+msgid "Duplicate values are not allowed."
+msgstr "Identiske værdier er ikke tilladt."
+
+#: core/validators.py:378
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Denne værdi skal være mellem %(lower)s og %(upper)s."
+
+#: core/validators.py:380
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Denne værdi skal være en mindst %s."
+
+#: core/validators.py:382
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Denne værdi må højst være %s."
+
+#: core/validators.py:423
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Denne værdi skal være en potens af %s."
+
+#: core/validators.py:433
+msgid "Please enter a valid decimal number."
+msgstr "Indtast venligst et gyldigt decimaltal."
+
+#: core/validators.py:440
+#, fuzzy, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+"Please enter a valid decimal number with at most %s total digits."
+msgstr "Indtast venligst et gyldigt decimaltal med %s ciffer."
+"Indtast venligst et gyldigt decimaltal med maksimalt %s cifre i alt."
+
+#: core/validators.py:443
+#, fuzzy, python-format
+msgid ""
+"Please enter a valid decimal number with a whole part of at most %s digit."
+"Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr "Indtast venligst et gyldigt decimaltal med en heltalsdel på %s ciffer."
+"Indtast venligst et gyldigt decimaltal med en heltalsdel på maksimalt %s cifre."
+#: core/validators.py:446
+#, fuzzy, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr "Indtast venligst et gyldigt decimaltal med %s cifre efter kommaet."
+"Indtast venligst et gyldigt decimaltal med maksimalt %s cifre efter kommaet."
+
+#: core/validators.py:454
+msgid "Please enter a valid floating point number."
+msgstr "Indtast venligst et gyldigt flydende-komma-tal."
+
+#: core/validators.py:463
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Kontroller, at den fil, du uploader, er på mindst %s bytes."
+
+#: core/validators.py:464
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Kontroller, at den fil, du uploader, er på maksimalt %s bytes."
+
+#: core/validators.py:481
+msgid "The format for this field is wrong."
+msgstr "Formatet i dette felt er forkert."
+
+#: core/validators.py:496
+msgid "This field is invalid."
+msgstr "Dette felt er ugyldigt."
+
+#: core/validators.py:532
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Kunne ikke finde noget i %s."
+
+#: core/validators.py:535
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"URL'en %(url)s returnerede det ugyldige indholdstypehoved '%(contenttype)s'."
+
+#: core/validators.py:568
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Luk venligst det uafsluttede tag %(tag)s fra linje %(line)s. "
+"(Linjen starter med \"%(start)s\".)"
+
+#: core/validators.py:572
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Noget tekst, som starter på linje %(line)s, er ikke tilladt i den givne "
+"sammenhæng. (Linjen starter med \"%(start)s\".)"
+
+#: core/validators.py:577
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"%(attr)s\" på linje %(line)s er ikke en gyldig attribut. (Linjen starter "
+"med \"%(start)s\".)"
+
+#: core/validators.py:582
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\" på linje %(line)s er et ugyldigt tag. (Linjen starter med \"%"
+"(start)s\".)"
+
+#: core/validators.py:586
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Et tag på linje %(line)s mangler en eller flere påkrævede attributter. "
+"(Linjen starter med \"%(start)s\".)"
+
+#: core/validators.py:591
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Attributten \"%(attr)s\" på linje %(line)s har en ugyldig værdi. (Linjen "
+"starter med \"%(start)s\".)"
+
+#: db/models/manipulators.py:304
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr ""
+"%(object)s med denne %(type)s eksisterer allerede for den givne %(field)s."
+
+#: db/models/fields/__init__.py:46
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s med dette %(fieldname)s eksisterer allerede."
+
+#: db/models/fields/__init__.py:170 db/models/fields/__init__.py:343
+#: db/models/fields/files.py:168 db/models/fields/files.py:179
+#: forms/fields.py:52 oldforms/__init__.py:370
+msgid "This field is required."
+msgstr "Dette felt er påkrævet."
+
+#: db/models/fields/__init__.py:457
+msgid "This value must be an integer."
+msgstr "Denne værdi skal et heltal."
+
+#: db/models/fields/__init__.py:503
+msgid "This value must be either True or False."
+msgstr "Denne værdi skal være enten True eller False."
+
+#: db/models/fields/__init__.py:532
+msgid "This field cannot be null."
+msgstr "Dette felt kan ikke være null."
+
+#: db/models/fields/__init__.py:634 db/models/fields/__init__.py:651
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format."
+msgstr "Indtast gyldig dato og tid i formatet ÅÅÅÅ-MM-DD TT:MM[:ss[.uuuuuu]]."
+
+#: db/models/fields/__init__.py:707
+msgid "This value must be a decimal number."
+msgstr "Denne værdi skal et decimaltal."
+
+#: db/models/fields/__init__.py:854
+msgid "This value must be either None, True or False."
+msgstr "Denne værdi skal være None, True eller False."
+
+#: db/models/fields/__init__.py:969 db/models/fields/__init__.py:982
+msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format."
+msgstr "Indtast en gyldig tid i formatet TT:MM[:ss[.uuuuuu]]."
+
+#: db/models/fields/files.py:188
+msgid "Enter a valid filename."
+msgstr "Indtast et gyldigt filnavn."
+
+#: db/models/fields/related.py:92
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Indtast venligst en gyldig %s."
+
+#: db/models/fields/related.py:759
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Hold \"Ctrl\" (eller \"Æbletasten\" på Mac) nede for at vælge mere end en."
+
+#: db/models/fields/related.py:839
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr "Indtast venligst gyldige %(self)s-ID'er. Værdien %(value)r er ugyldig."
+"Indtast venligst gyldige %(self)s-ID'er. Værdierne %(value)r er ugyldige."
+
+#: forms/fields.py:53
+msgid "Enter a valid value."
+msgstr "Indtast en gyldig værdi."
+
+#: forms/fields.py:133
+#, python-format
+msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+msgstr "Denne værdi må maksimalt indeholde %(max)d tegn (den har %(length)d)."
+
+#: forms/fields.py:134
+#, python-format
+msgid "Ensure this value has at least %(min)d characters (it has %(length)d)."
+msgstr "Denne værdi skal mindst indeholde %(min)d tegn (den indeholder %(length)d)."
+
+#: forms/fields.py:162 forms/fields.py:191 forms/fields.py:220
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Denne værdi skal være mindre end eller lig %s."
+
+#: forms/fields.py:163 forms/fields.py:192 forms/fields.py:221
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Denne værdi skal være større end eller lig %s."
+
+#: forms/fields.py:190 forms/fields.py:219
+msgid "Enter a number."
+msgstr "Indtast et tal."
+
+#: forms/fields.py:222
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr "Der må maksimalt være %s cifre i alt."
+
+#: forms/fields.py:223
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr "Der må højst være %s decimalpladser."
+
+#: forms/fields.py:224
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr "Der må maksimalt være %s cifre før decimaltegnet."
+
+#: forms/fields.py:272 forms/fields.py:793
+msgid "Enter a valid date."
+msgstr "Indtast en gyldig dato."
+
+#: forms/fields.py:305 forms/fields.py:794
+msgid "Enter a valid time."
+msgstr "Indtast en gyldig tid."
+
+#: forms/fields.py:344
+msgid "Enter a valid date/time."
+msgstr "Indtast gyldig dato/tid."
+
+#: forms/fields.py:431
+msgid "No file was submitted."
+msgstr "Ingen fil blev indsendt."
+
+#: forms/fields.py:432 oldforms/__init__.py:689
+msgid "The submitted file is empty."
+msgstr "Den indsendte fil er tom."
+
+#: forms/fields.py:522
+msgid "Enter a valid URL."
+msgstr "Indtast en gyldig URL."
+
+#: forms/fields.py:523
+msgid "This URL appears to be a broken link."
+msgstr "Denne URL henviser ikke til en gyldig side eller fil."
+
+#: forms/fields.py:591 forms/fields.py:642
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "Marker en gyldigt valgnulighed; '%(value)s' er ikke en af de "
+"tilgængelige valgmuligheder."
+
+#: forms/fields.py:643 forms/fields.py:704 forms/models.py:528
+msgid "Enter a list of values."
+msgstr "Indtast en liste af værdier."
+
+#: forms/fields.py:822
+msgid "Enter a valid IPv4 address."
+msgstr "Indtast en gyldig IPv4-adresse."
+
+#: forms/models.py:461
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Marker en gyldig valgmulighed. Det valg, du har foretaget, er ikke "
+"blandt de tilgængelige valgmuligheder."
+
+#: forms/models.py:529
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Marker et gyldigt valg. %s er ikke en af de tilgængelige "
+"valgmuligheder."
+
+#: oldforms/__init__.py:405
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgstr "Sørg for din tekst er kortere end %s tegn."
+
+#: oldforms/__init__.py:410
+msgid "Line breaks are not allowed here."
+msgstr "Linjeskift er ikke tilladt her."
+
+#: oldforms/__init__.py:508 oldforms/__init__.py:582 oldforms/__init__.py:621
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Markér et gyldigt valg; '%(data)s' er ikke i %(choices)s."
+
+#: oldforms/__init__.py:750
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Indtast et heltal mellem -32,768 og 32,767."
+
+#: oldforms/__init__.py:760
+msgid "Enter a positive number."
+msgstr "Indtast et positivt tal."
+
+#: oldforms/__init__.py:770
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Indtast et heltal mellem 0 og 32,767."
+
+#: template/defaultfilters.py:698
+msgid "yes,no,maybe"
+msgstr "ja,nej,måske"
+
+#: template/defaultfilters.py:729
+#, python-format
+msgid "%(size)d byte"
+msgstr "%(size)d byte"
+
+#: template/defaultfilters.py:731
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f KB"
+
+#: template/defaultfilters.py:733
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: template/defaultfilters.py:734
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#: utils/dateformat.py:41
+msgid "p.m."
+msgstr "p.m."
+
+#: utils/dateformat.py:42
+msgid "a.m."
+msgstr "a.m."
+
+#: utils/dateformat.py:47
+msgid "PM"
+msgstr "PM"
+
+#: utils/dateformat.py:48
+msgid "AM"
+msgstr "AM"
+
+#: utils/dateformat.py:97
+msgid "midnight"
+msgstr "midnat"
+
+#: utils/dateformat.py:99
+msgid "noon"
+msgstr "middag"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Mandag"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Tirsdag"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Onsdag"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Torsdag"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Fredag"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Lørdag"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Søndag"
+
+#: utils/dates.py:10
+msgid "Mon"
+msgstr "Man"
+
+#: utils/dates.py:10
+msgid "Tue"
+msgstr "Tir"
+
+#: utils/dates.py:10
+msgid "Wed"
+msgstr "Ons"
+
+#: utils/dates.py:10
+msgid "Thu"
+msgstr "Tor"
+
+#: utils/dates.py:10
+msgid "Fri"
+msgstr "Fre"
+
+#: utils/dates.py:11
+msgid "Sat"
+msgstr "Lør"
+
+#: utils/dates.py:11
+msgid "Sun"
+msgstr "Søn"
+
+#: utils/dates.py:18
+msgid "January"
+msgstr "Januar"
+
+#: utils/dates.py:18
+msgid "February"
+msgstr "Februar"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "March"
+msgstr "Marts"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "April"
+msgstr "April"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "May"
+msgstr "Maj"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "June"
+msgstr "Juni"
+
+#: utils/dates.py:19 utils/dates.py:31
+msgid "July"
+msgstr "Juli"
+
+#: utils/dates.py:19
+msgid "August"
+msgstr "August"
+
+#: utils/dates.py:19
+msgid "September"
+msgstr "September"
+
+#: utils/dates.py:19
+msgid "October"
+msgstr "Oktober"
+
+#: utils/dates.py:19
+msgid "November"
+msgstr "November"
+
+#: utils/dates.py:20
+msgid "December"
+msgstr "December"
+
+#: utils/dates.py:23
+msgid "jan"
+msgstr "jan"
+
+#: utils/dates.py:23
+msgid "feb"
+msgstr "feb"
+
+#: utils/dates.py:23
+msgid "mar"
+msgstr "mar"
+
+#: utils/dates.py:23
+msgid "apr"
+msgstr "apr"
+
+#: utils/dates.py:23
+msgid "may"
+msgstr "maj"
+
+#: utils/dates.py:23
+msgid "jun"
+msgstr "jun"
+
+#: utils/dates.py:24
+msgid "jul"
+msgstr "jul"
+
+#: utils/dates.py:24
+msgid "aug"
+msgstr "aug"
+
+#: utils/dates.py:24
+msgid "sep"
+msgstr "sept"
+
+#: utils/dates.py:24
+msgid "oct"
+msgstr "okt"
+
+#: utils/dates.py:24
+msgid "nov"
+msgstr "nov"
+
+#: utils/dates.py:24
+msgid "dec"
+msgstr "dec"
+
+#: utils/dates.py:31
+msgid "Jan."
+msgstr "Jan."
+
+#: utils/dates.py:31
+msgid "Feb."
+msgstr "Feb."
+
+#: utils/dates.py:32
+msgid "Aug."
+msgstr "Aug."
+
+#: utils/dates.py:32
+msgid "Sept."
+msgstr "Sept."
+
+#: utils/dates.py:32
+msgid "Oct."
+msgstr "Okt."
+
+#: utils/dates.py:32
+msgid "Nov."
+msgstr "Nov."
+
+#: utils/dates.py:32
+msgid "Dec."
+msgstr "Dec."
+
+#: utils/text.py:128
+msgid "or"
+msgstr "eller"
+
+#: utils/timesince.py:21
+msgid "year"
+msgstr "år"
+
+#: utils/timesince.py:22
+msgid "month"
+msgstr "måned"
+
+#: utils/timesince.py:23
+msgid "week"
+msgstr "uge"
+
+#: utils/timesince.py:24
+msgid "day"
+msgstr "dag"
+
+#: utils/timesince.py:25
+msgid "hour"
+msgstr "time"
+
+#: utils/timesince.py:26
+msgid "minute"
+msgstr "minut"
+
+#: utils/timesince.py:46
+msgid "minutes"
+msgstr "minutter"
+
+#: utils/timesince.py:51
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr ""
+
+#: utils/timesince.py:57
+#, fuzzy, python-format
+msgid ", %(number)d %(type)s"
+msgstr ""
+
+#: utils/translation/trans_real.py:401
+msgid "DATE_FORMAT"
+msgstr ""
+
+#: utils/translation/trans_real.py:402
+msgid "DATETIME_FORMAT"
+msgstr ""
+
+#: utils/translation/trans_real.py:403
+msgid "TIME_FORMAT"
+msgstr ""
+
+#: utils/translation/trans_real.py:419
+msgid "YEAR_MONTH_FORMAT"
+msgstr ""
+
+#: utils/translation/trans_real.py:420
+msgid "MONTH_DAY_FORMAT"
+msgstr ""
+
+#: views/generic/create_update.py:114
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "%(verbose_name)s blev ændret."
+
+#: views/generic/create_update.py:156
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "%(verbose_name)s blev opdateret."
+
+#: views/generic/create_update.py:198
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "%(verbose_name)s blev slettet."
+
+#~ msgid "Added %s."
+#~ msgstr "Tilføjede %s."
+
+#~ msgid "Deleted %s."
+#~ msgstr "Slettede %s."
+
+#~ msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+#~ msgstr "Har du <a href=\"/password_reset/\">glemt din adgangskode</a>?"
+
+#~ msgid "Ordering"
+#~ msgstr "Rækkefølge"
+
+#~ msgid "Your new password is: %(new_password)s"
+#~ msgstr "Din nye adgangskode er: %(new_password)s"
+
+#~ msgid "Feel free to change this password by going to this page:"
+#~ msgstr "Du kan ændre din adgangskode ved at gå til denne side:"
+
+#~ msgid "Use '[algo]$[salt]$[hexdigest]'"
+#~ msgstr "Brug '[algo]$[salt]$[hexdigest]'"
+
+#~ msgid "Separate multiple IDs with commas."
+#~ msgstr "Adskil flere ID'er med kommaer."
diff --git a/webapp/django/conf/locale/da/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/da/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..389588a
--- /dev/null
+++ b/webapp/django/conf/locale/da/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/da/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/da/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..9e33a07
--- /dev/null
+++ b/webapp/django/conf/locale/da/LC_MESSAGES/djangojs.po
@@ -0,0 +1,118 @@
+# Translation of djangojs.po to Danish
+# This file is distributed under the same license as the Django package.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-08-11 20:17+0200\n"
+"PO-Revision-Date: 2008-08-13 22:00+0200\n"
+"Last-Translator: Finn Gruwier Larsen<finn@gruwier.dk>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "Tilgængelige %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Vælg alle"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Tilføj"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Fjern"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Valgte %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Foretag dit/dine valg og klik "
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Fravælg alle"
+
+#: contrib/admin/media/js/calendar.js:24
+#: contrib/admin/media/js/dateparse.js:32
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Januar Februar Marts April Maj Juni Juli August September Oktober November "
+"December"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "S M T O T F L"
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Søndag Mandag Tirsdag Onsdag Torsdag Fredag Lørdag"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr "Vis"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr "Skjul"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Now"
+msgstr "Nu"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
+msgid "Clock"
+msgstr "Ur"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
+msgid "Choose a time"
+msgstr "Vælg et tidspunkt"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "Midnight"
+msgstr "Midnat"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "6 a.m."
+msgstr "6 morgen"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
+msgid "Noon"
+msgstr "Middag"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
+msgid "Cancel"
+msgstr "Annuller"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
+msgid "Today"
+msgstr "I dag"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
+msgid "Calendar"
+msgstr "Kalender"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
+msgid "Yesterday"
+msgstr "I går"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
+msgid "Tomorrow"
+msgstr "I morgen"
diff --git a/webapp/django/conf/locale/de/LC_MESSAGES/django.mo b/webapp/django/conf/locale/de/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..410154d
--- /dev/null
+++ b/webapp/django/conf/locale/de/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/de/LC_MESSAGES/django.po b/webapp/django/conf/locale/de/LC_MESSAGES/django.po
new file mode 100644
index 0000000..c420c24
--- /dev/null
+++ b/webapp/django/conf/locale/de/LC_MESSAGES/django.po
@@ -0,0 +1,4590 @@
+# Translation of django.po to German
+#
+# Copyright (C) 2005-2008,
+# This file is distributed under the same license as the django package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-08-23 20:19+0200\n"
+"PO-Revision-Date: 2008-08-17 23:58+0100\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: German\n"
+"X-Poedit-Country: GERMANY\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: conf/global_settings.py:44
+msgid "Arabic"
+msgstr "Arabisch"
+
+#: conf/global_settings.py:45
+msgid "Bengali"
+msgstr "Bengali"
+
+#: conf/global_settings.py:46
+msgid "Bulgarian"
+msgstr "Bulgarisch"
+
+#: conf/global_settings.py:47
+msgid "Catalan"
+msgstr "Katalanisch"
+
+#: conf/global_settings.py:48
+msgid "Czech"
+msgstr "Tschechisch"
+
+#: conf/global_settings.py:49
+msgid "Welsh"
+msgstr "Walisisch"
+
+#: conf/global_settings.py:50
+msgid "Danish"
+msgstr "Dänisch"
+
+#: conf/global_settings.py:51
+msgid "German"
+msgstr "Deutsch"
+
+#: conf/global_settings.py:52
+msgid "Greek"
+msgstr "Griechisch"
+
+#: conf/global_settings.py:53
+msgid "English"
+msgstr "Englisch"
+
+#: conf/global_settings.py:54
+msgid "Spanish"
+msgstr "Spanisch"
+
+#: conf/global_settings.py:55
+msgid "Estonian"
+msgstr "Estnisch"
+
+#: conf/global_settings.py:56
+msgid "Argentinean Spanish"
+msgstr "Argentinisches Spanisch"
+
+#: conf/global_settings.py:57
+msgid "Basque"
+msgstr "Baskisch"
+
+#: conf/global_settings.py:58
+msgid "Persian"
+msgstr "Persisch"
+
+#: conf/global_settings.py:59
+msgid "Finnish"
+msgstr "Finnisch"
+
+#: conf/global_settings.py:60
+msgid "French"
+msgstr "Französisch"
+
+#: conf/global_settings.py:61
+msgid "Irish"
+msgstr "Irisch"
+
+#: conf/global_settings.py:62
+msgid "Galician"
+msgstr "Galicisch"
+
+#: conf/global_settings.py:63
+msgid "Hungarian"
+msgstr "Ungarisch"
+
+#: conf/global_settings.py:64
+msgid "Hebrew"
+msgstr "Hebräisch"
+
+#: conf/global_settings.py:65
+msgid "Croatian"
+msgstr "Kroatisch"
+
+#: conf/global_settings.py:66
+msgid "Icelandic"
+msgstr "Isländisch"
+
+#: conf/global_settings.py:67
+msgid "Italian"
+msgstr "Italienisch"
+
+#: conf/global_settings.py:68
+msgid "Japanese"
+msgstr "Japanisch"
+
+#: conf/global_settings.py:69
+msgid "Georgian"
+msgstr "Georgisch"
+
+#: conf/global_settings.py:70
+msgid "Korean"
+msgstr "Koreanisch"
+
+#: conf/global_settings.py:71
+msgid "Khmer"
+msgstr "Khmer"
+
+#: conf/global_settings.py:72
+msgid "Kannada"
+msgstr "Kannada"
+
+#: conf/global_settings.py:73
+msgid "Latvian"
+msgstr "Lettisch"
+
+#: conf/global_settings.py:74
+msgid "Lithuanian"
+msgstr "Litauisch"
+
+#: conf/global_settings.py:75
+msgid "Macedonian"
+msgstr "Mazedonisch"
+
+#: conf/global_settings.py:76
+msgid "Dutch"
+msgstr "Holländisch"
+
+#: conf/global_settings.py:77
+msgid "Norwegian"
+msgstr "Norwegisch"
+
+#: conf/global_settings.py:78
+msgid "Polish"
+msgstr "Polnisch"
+
+#: conf/global_settings.py:79
+msgid "Portugese"
+msgstr "Portugiesisch"
+
+#: conf/global_settings.py:80
+msgid "Brazilian Portuguese"
+msgstr "Brasilianisches Portugiesisch"
+
+#: conf/global_settings.py:81
+msgid "Romanian"
+msgstr "Rumänisch"
+
+#: conf/global_settings.py:82
+msgid "Russian"
+msgstr "Russisch"
+
+#: conf/global_settings.py:83
+msgid "Slovak"
+msgstr "Slowakisch"
+
+#: conf/global_settings.py:84
+msgid "Slovenian"
+msgstr "Slowenisch"
+
+#: conf/global_settings.py:85
+msgid "Serbian"
+msgstr "Serbisch"
+
+#: conf/global_settings.py:86
+msgid "Swedish"
+msgstr "Schwedisch"
+
+#: conf/global_settings.py:87
+msgid "Tamil"
+msgstr "Tamilisch"
+
+#: conf/global_settings.py:88
+msgid "Telugu"
+msgstr "Telugisch"
+
+#: conf/global_settings.py:89
+msgid "Turkish"
+msgstr "Türkisch"
+
+#: conf/global_settings.py:90
+msgid "Ukrainian"
+msgstr "Ukrainisch"
+
+#: conf/global_settings.py:91
+msgid "Simplified Chinese"
+msgstr "Vereinfachtes Chinesisch"
+
+#: conf/global_settings.py:92
+msgid "Traditional Chinese"
+msgstr "Traditionelles Chinesisch"
+
+#: contrib/admin/filterspecs.py:44
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Nach %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:74 contrib/admin/filterspecs.py:92
+#: contrib/admin/filterspecs.py:147 contrib/admin/filterspecs.py:173
+msgid "All"
+msgstr "Alle"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Any date"
+msgstr "Alle Daten"
+
+#: contrib/admin/filterspecs.py:114
+msgid "Today"
+msgstr "Heute"
+
+#: contrib/admin/filterspecs.py:117
+msgid "Past 7 days"
+msgstr "Letzte 7 Tage"
+
+#: contrib/admin/filterspecs.py:119
+msgid "This month"
+msgstr "Diesen Monat"
+
+#: contrib/admin/filterspecs.py:121
+msgid "This year"
+msgstr "Dieses Jahr"
+
+#: contrib/admin/filterspecs.py:147 forms/widgets.py:389
+#: oldforms/__init__.py:588
+msgid "Yes"
+msgstr "Ja"
+
+#: contrib/admin/filterspecs.py:147 forms/widgets.py:389
+#: oldforms/__init__.py:588
+msgid "No"
+msgstr "Nein"
+
+#: contrib/admin/filterspecs.py:154 forms/widgets.py:389
+#: oldforms/__init__.py:588
+msgid "Unknown"
+msgstr "Unbekannt"
+
+#: contrib/admin/models.py:19
+msgid "action time"
+msgstr "Zeitpunkt der Aktion"
+
+#: contrib/admin/models.py:22
+msgid "object id"
+msgstr "Objekt-ID"
+
+#: contrib/admin/models.py:23
+msgid "object repr"
+msgstr "Objekt Darst."
+
+#: contrib/admin/models.py:24
+msgid "action flag"
+msgstr "Aktionskennzeichen"
+
+#: contrib/admin/models.py:25
+msgid "change message"
+msgstr "Änderungsmeldung"
+
+#: contrib/admin/models.py:28
+msgid "log entry"
+msgstr "Logeintrag"
+
+#: contrib/admin/models.py:29
+msgid "log entries"
+msgstr "Logeinträge"
+
+#: contrib/admin/options.py:56 contrib/admin/options.py:115
+msgid "None"
+msgstr "-"
+
+#: contrib/admin/options.py:329
+#, python-format
+msgid "Changed %s."
+msgstr "%s geändert."
+
+#: contrib/admin/options.py:329 contrib/admin/options.py:339
+#: core/validators.py:279 db/models/manipulators.py:305
+msgid "and"
+msgstr "und"
+
+#: contrib/admin/options.py:334
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" hinzugefügt."
+
+#: contrib/admin/options.py:338
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "%(list)s von %(name)s \"%(object)s\" geändert."
+
+#: contrib/admin/options.py:343
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" gelöscht."
+
+#: contrib/admin/options.py:347
+msgid "No fields changed."
+msgstr "Keine Felder geändert."
+
+#: contrib/admin/options.py:408 contrib/auth/admin.py:50
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" wurde erfolgreich hinzugefügt."
+
+#: contrib/admin/options.py:412 contrib/admin/options.py:445
+#: contrib/auth/admin.py:55
+msgid "You may edit it again below."
+msgstr "Das Element kann jetzt weiter bearbeitet werden."
+
+#: contrib/admin/options.py:422 contrib/admin/options.py:455
+#, python-format
+msgid "You may add another %s below."
+msgstr "Jetzt kann ein weiteres Element des Typs %s angelegt werden."
+
+#: contrib/admin/options.py:443
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" wurde erfolgreich geändert."
+
+#: contrib/admin/options.py:451
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s\" wurde erfolgreich hinzugefügt. Das Element kann jetzt "
+"geändert werden."
+
+#: contrib/admin/options.py:517
+#, python-format
+msgid "Add %s"
+msgstr "%s hinzufügen"
+
+#: contrib/admin/options.py:595
+#, python-format
+msgid "Change %s"
+msgstr "%s ändern"
+
+#: contrib/admin/options.py:627
+msgid "Database error"
+msgstr "Datenbankfehler"
+
+#: contrib/admin/options.py:677
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" wurde erfolgreich gelöscht."
+
+#: contrib/admin/options.py:684
+msgid "Are you sure?"
+msgstr "Sind Sie ganz sicher?"
+
+#: contrib/admin/options.py:712
+#, python-format
+msgid "Change history: %s"
+msgstr "Änderungsgeschichte: %s"
+
+#: contrib/admin/sites.py:18 contrib/admin/views/decorators.py:16
+#: contrib/auth/forms.py:72 contrib/comments/views/comments.py:56
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Bitte einen gültigen Benutzernamen und ein Passwort eingeben. Beide Felder "
+"berücksichtigen die Groß-/Kleinschreibung."
+
+#: contrib/admin/sites.py:242 contrib/admin/views/decorators.py:68
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Bitte neu anmelden, da die Session ausgelaufen ist. Keine Angst, die "
+"Beiträge wurden gesichert."
+
+#: contrib/admin/sites.py:249 contrib/admin/views/decorators.py:75
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Ihr Browser scheint keine Cookies zu akzeptieren. Bitte aktivieren Sie diese "
+"und laden Sie die Seite neu."
+
+#: contrib/admin/sites.py:263 contrib/admin/sites.py:269
+#: contrib/admin/views/decorators.py:92
+msgid "Usernames cannot contain the '@' character."
+msgstr "Benutzernamen dürfen das Zeichen '@' nicht enthalten."
+
+#: contrib/admin/sites.py:266 contrib/admin/views/decorators.py:88
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr ""
+"Die E-Mail-Adresse entspricht nicht Ihrem Benutzernamen. Bitte stattdessen '%"
+"s' versuchen."
+
+#: contrib/admin/sites.py:335
+msgid "Site administration"
+msgstr "Seitenverwaltung"
+
+#: contrib/admin/sites.py:357 contrib/admin/templates/admin/login.html:27
+#: contrib/admin/templates/registration/password_reset_complete.html:14
+#: contrib/admin/views/decorators.py:30
+msgid "Log in"
+msgstr "Anmelden"
+
+#: contrib/admin/sites.py:402
+#, python-format
+msgid "%s administration"
+msgstr "%s-Verwaltung"
+
+#: contrib/admin/util.py:138
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Ein oder mehrere %(fieldname)s in %(name)s: %(obj)s"
+
+#: contrib/admin/util.py:143
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Ein oder mehrere %(fieldname)s in %(name)s:"
+
+#: contrib/admin/widgets.py:65
+msgid "Date:"
+msgstr "Datum:"
+
+#: contrib/admin/widgets.py:65
+msgid "Time:"
+msgstr "Zeit:"
+
+#: contrib/admin/widgets.py:89
+msgid "Currently:"
+msgstr "Derzeit:"
+
+#: contrib/admin/widgets.py:89
+msgid "Change:"
+msgstr "Ändern:"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Seite nicht gefunden"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr ""
+"Es tut uns leid, aber die angeforderte Seite konnte nicht gefunden werden."
+
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/app_index.html:8
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/change_form.html:17
+#: contrib/admin/templates/admin/change_list.html:8
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/auth/user/change_password.html:10
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_reset_complete.html:4
+#: contrib/admin/templates/registration/password_reset_confirm.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Start"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Serverfehler"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Serverfehler (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Serverfehler <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Ein Fehler ist aufgetreten. Dieser Fehler wurde an die Serververwalter per E-"
+"Mail gemeldet und sollte in Kürze behoben sein. Vielen Dank für Ihr "
+"Verständnis."
+
+#: contrib/admin/templates/admin/app_index.html:10
+#: contrib/admin/templates/admin/index.html:19
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "Willkommen,"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Dokumentation"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:13
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+msgid "Change password"
+msgstr "Passwort ändern"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/comments/templates/comments/form.html:6
+msgid "Log out"
+msgstr "Abmelden"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django-Systemverwaltung"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django-Verwaltung"
+
+#: contrib/admin/templates/admin/change_form.html:20
+#: contrib/admin/templates/admin/index.html:29
+msgid "Add"
+msgstr "Hinzufügen"
+
+#: contrib/admin/templates/admin/change_form.html:27
+#: contrib/admin/templates/admin/object_history.html:5
+msgid "History"
+msgstr "Geschichte"
+
+#: contrib/admin/templates/admin/change_form.html:28
+msgid "View on site"
+msgstr "Auf der Seite anzeigen"
+
+#: contrib/admin/templates/admin/change_form.html:38
+#: contrib/admin/templates/admin/auth/user/change_password.html:22
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Bitte den aufgeführten Fehler korrigieren."
+msgstr[1] "Bitte die aufgeführten Fehler korrigieren."
+
+#: contrib/admin/templates/admin/change_list.html:16
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s hinzufügen"
+
+#: contrib/admin/templates/admin/change_list.html:26
+msgid "Filter"
+msgstr "Filter"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:10
+#: contrib/admin/templates/admin/submit_line.html:3
+#: contrib/admin/templates/admin/edit_inline/tabular.html:15
+msgid "Delete"
+msgstr "Löschen"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:16
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Die Löschung des %(object_name)s '%(escaped_object)s' hätte die Löschung von "
+"abhängigen Daten zur Folge, aber Sie haben nicht die nötigen Rechte um die "
+"folgenden abhängigen Daten zu löschen:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:23
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Sind Sie sicher, dass Sie %(object_name)s \"%(escaped_object)s\" löschen "
+"wollen? Es werden zusätzlich die folgenden abhängigen Daten gelöscht:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:28
+msgid "Yes, I'm sure"
+msgstr "Ja, ich bin sicher"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Nach %(filter_title)s "
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Modelle, die in der Anwendung %(name)s vorhanden sind."
+
+#: contrib/admin/templates/admin/index.html:35
+msgid "Change"
+msgstr "Ändern"
+
+#: contrib/admin/templates/admin/index.html:45
+msgid "You don't have permission to edit anything."
+msgstr "Sie haben keine Berechtigung, irgendetwas zu ändern."
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "Recent Actions"
+msgstr "Kürzliche Aktionen"
+
+#: contrib/admin/templates/admin/index.html:54
+msgid "My Actions"
+msgstr "Meine Aktionen"
+
+#: contrib/admin/templates/admin/index.html:58
+msgid "None available"
+msgstr "Keine vorhanden"
+
+#: contrib/admin/templates/admin/invalid_setup.html:7
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Etwas stimmt nicht mit der Datenbankkonfiguration. Bitte sicherstellen, dass "
+"die richtigen Datenbanktabellen angelegt wurden und die Datenbank vom "
+"verwendeten Datenbankbenutzer auch lesbar ist."
+
+#: contrib/admin/templates/admin/login.html:19
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+msgid "Username:"
+msgstr "Benutzername:"
+
+#: contrib/admin/templates/admin/login.html:22
+#: contrib/comments/templates/comments/form.html:8
+msgid "Password:"
+msgstr "Passwort:"
+
+#: contrib/admin/templates/admin/object_history.html:16
+msgid "Date/time"
+msgstr "Datum/Zeit"
+
+#: contrib/admin/templates/admin/object_history.html:17
+msgid "User"
+msgstr "Benutzer"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Action"
+msgstr "Aktion"
+
+#: contrib/admin/templates/admin/object_history.html:24
+#: utils/translation/trans_real.py:402
+msgid "DATETIME_FORMAT"
+msgstr "j. N Y, H:i"
+
+#: contrib/admin/templates/admin/object_history.html:32
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Dieses Objekt hat keine Änderungsgeschichte. Es wurde möglicherweise nicht "
+"über diese Verwaltungsseiten angelegt."
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Zeige alle"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Los"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "Ein Ergebnis"
+msgstr[1] "%(counter)s Ergebnisse"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s gesamt"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Als neu sichern"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Sichern und neu hinzufügen"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Sichern und weiter bearbeiten"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Sichern"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Zuerst einen Benutzer und ein Passwort eingeben. Danach können weitere "
+"Optionen für den Benutzer geändert werden."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:13
+#: contrib/auth/forms.py:14 contrib/auth/forms.py:51
+msgid "Username"
+msgstr "Benutzername"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:20
+#: contrib/admin/templates/admin/auth/user/change_password.html:33
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:52 contrib/auth/forms.py:176
+msgid "Password"
+msgstr "Passwort"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:26
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+#: contrib/auth/forms.py:177
+msgid "Password (again)"
+msgstr "Passwort (wiederholen)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:27
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+msgid "Enter the same password as above, for verification."
+msgstr "Bitte das gleiche Passwort zur Überprüfung nochmal eingeben."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:26
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+"Bitte geben Sie ein neues Passwort für den Benutzer <strong>%(username)s</"
+"strong> ein."
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Vielen Dank, dass Sie hier ein paar nette Minuten verbracht haben."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Erneut anmelden"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Passwort ändern"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Passwort erfolgreich geändert"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Ihr Passwort wurde geändert."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Bitte geben Sie aus Sicherheitsgründen erst Ihr altes Passwort und darunter "
+"dann zweimal (um sicherzustellen, dass Sie es korrekt eingegeben haben) das "
+"neue Kennwort ein."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Altes Passwort:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+#: contrib/admin/templates/registration/password_reset_confirm.html:18
+msgid "New password:"
+msgstr "Neues Passwort:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+#: contrib/admin/templates/registration/password_reset_confirm.html:20
+msgid "Confirm password:"
+msgstr "Passwort wiederholen:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+#: contrib/admin/templates/registration/password_reset_confirm.html:21
+msgid "Change my password"
+msgstr "Mein Passwort ändern"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:4
+#: contrib/admin/templates/registration/password_reset_confirm.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+msgid "Password reset"
+msgstr "Passwort zurücksetzen"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:6
+#: contrib/admin/templates/registration/password_reset_complete.html:10
+msgid "Password reset complete"
+msgstr "Passwort zurücksetzen beendet"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:12
+msgid "Your password has been set.  You may go ahead and log in now."
+msgstr "Ihr Passwort wurde zurückgesetzt. Sie können sich nun anmelden."
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:4
+msgid "Password reset confirmation"
+msgstr "Zurücksetzen des Passworts bestätigen"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:12
+msgid "Enter new password"
+msgstr "Neues Passwort eingeben"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:14
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Bitte geben Sie Ihr neues Passwort zweimal ein, damit wir überprüfen können, "
+"ob es richtig eingetippt wurde."
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:26
+msgid "Password reset unsuccessful"
+msgstr "Passwort wurde nicht erfolgreich zurückgesetzt"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:28
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used.  Please request a new password reset."
+msgstr ""
+"Der Link zum Zurücksetzen Ihres Passworts ist ungültig, wahrscheinlich weil "
+"er schon einmal benutzt wurde. Bitte setzen Sie Ihr Passwort erneut zurück."
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Passwort wurde erfolgreich zurückgesetzt"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed you instructions for setting your password to the e-mail "
+"address you submitted. You should be receiving it shortly."
+msgstr ""
+"Wir haben Ihnen eine E-Mail mit Anweisungen zum Zurücksetzen Ihres Passwort "
+"an die von Ihnen angegebene E-Mail-Adresse geschickt. Sie sollten diese in "
+"Kürze erhalten."
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Sie erhalten diese E-Mail, weil Sie ein neues Passwort"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "für Ihren Benutzer bei %(site_name)s angefordert haben."
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+msgid "Please go to the following page and choose a new password:"
+msgstr "Bitte öffnen Sie folgende Seite, um Ihr neues Passwort einzugeben:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:9
+msgid "Your username, in case you've forgotten:"
+msgstr "Ihr Benutzername, falls Sie ihn vergessen haben:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Thanks for using our site!"
+msgstr "Vielen Dank, dass Sie unsere Seiten benutzen!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Das Team von %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll e-mail "
+"instructions for setting a new one."
+msgstr ""
+"Passwort vergessen? Einfach Ihre E-Mail-Adresse eingeben und wir senden "
+"Ihnen Anweisungen zum Zurücksetzen Ihres Passworts."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "E-Mail-Adresse:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Mein Passwort zurücksetzen"
+
+#: contrib/admin/templatetags/admin_list.py:284
+msgid "All dates"
+msgstr "Alle Tage"
+
+#: contrib/admin/views/main.py:65
+#, python-format
+msgid "Select %s"
+msgstr "%s auswählen"
+
+#: contrib/admin/views/main.py:65
+#, python-format
+msgid "Select %s to change"
+msgstr "%s zur Änderung auswählen"
+
+#: contrib/admin/views/template.py:36 contrib/sites/models.py:38
+msgid "site"
+msgstr "Website"
+
+#: contrib/admin/views/template.py:38
+msgid "template"
+msgstr "Template"
+
+#: contrib/admindocs/views.py:53 contrib/admindocs/views.py:55
+#: contrib/admindocs/views.py:57
+msgid "tag:"
+msgstr "Schlagwort:"
+
+#: contrib/admindocs/views.py:87 contrib/admindocs/views.py:89
+#: contrib/admindocs/views.py:91
+msgid "filter:"
+msgstr "Filter:"
+
+#: contrib/admindocs/views.py:153 contrib/admindocs/views.py:155
+#: contrib/admindocs/views.py:157
+msgid "view:"
+msgstr "Ansicht:"
+
+#: contrib/admindocs/views.py:187
+#, python-format
+msgid "App %r not found"
+msgstr "Anwendung %r nicht gefunden"
+
+#: contrib/admindocs/views.py:194
+#, python-format
+msgid "Model %(model_name)r not found in app %(app_label)r"
+msgstr "Modell %(model_name)r wurde nicht in Anwendung %(app_label)r gefunden"
+
+#: contrib/admindocs/views.py:206
+#, python-format
+msgid "the related `%(app_label)s.%(data_type)s` object"
+msgstr "Das verknüpfte `%(app_label)s.%(data_type)s` Objekt"
+
+#: contrib/admindocs/views.py:206 contrib/admindocs/views.py:228
+#: contrib/admindocs/views.py:242 contrib/admindocs/views.py:247
+msgid "model:"
+msgstr "Modell:"
+
+#: contrib/admindocs/views.py:237
+#, python-format
+msgid "related `%(app_label)s.%(object_name)s` objects"
+msgstr "verknüpftes `%(app_label)s.%(object_name)s` Objekt"
+
+#: contrib/admindocs/views.py:242
+#, python-format
+msgid "all %s"
+msgstr "Alle %s"
+
+#: contrib/admindocs/views.py:247
+#, python-format
+msgid "number of %s"
+msgstr "Anzahl von %s"
+
+#: contrib/admindocs/views.py:253
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Felder am %s Objekt"
+
+#: contrib/admindocs/views.py:317 contrib/admindocs/views.py:328
+#: contrib/admindocs/views.py:330 contrib/admindocs/views.py:336
+#: contrib/admindocs/views.py:337 contrib/admindocs/views.py:339
+msgid "Integer"
+msgstr "Ganzzahl"
+
+#: contrib/admindocs/views.py:318
+msgid "Boolean (Either True or False)"
+msgstr "Boolscher Wert (True oder False)"
+
+#: contrib/admindocs/views.py:319 contrib/admindocs/views.py:338
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Zeichenkette (bis zu %(max_length)s Zeichen)"
+
+#: contrib/admindocs/views.py:320
+msgid "Comma-separated integers"
+msgstr "Kommaseparierte Liste von Ganzzahlen"
+
+#: contrib/admindocs/views.py:321
+msgid "Date (without time)"
+msgstr "Datum (ohne Uhrzeit)"
+
+#: contrib/admindocs/views.py:322
+msgid "Date (with time)"
+msgstr "Datum (mit Uhrzeit)"
+
+#: contrib/admindocs/views.py:323
+msgid "Decimal number"
+msgstr "Dezimalzahl"
+
+#: contrib/admindocs/views.py:324
+msgid "E-mail address"
+msgstr "E-Mail-Adresse"
+
+#: contrib/admindocs/views.py:325 contrib/admindocs/views.py:326
+#: contrib/admindocs/views.py:329
+msgid "File path"
+msgstr "Dateipfad"
+
+#: contrib/admindocs/views.py:327
+msgid "Floating point number"
+msgstr "Gleitkommazahl"
+
+#: contrib/admindocs/views.py:331 contrib/comments/models.py:89
+msgid "IP address"
+msgstr "IP-Adresse"
+
+#: contrib/admindocs/views.py:333
+msgid "Boolean (Either True, False or None)"
+msgstr "Boolscher Wert (True, False oder None)"
+
+#: contrib/admindocs/views.py:334
+msgid "Relation to parent model"
+msgstr "Beziehung zum Eltern-Modell"
+
+#: contrib/admindocs/views.py:335
+msgid "Phone number"
+msgstr "Telefonnummer"
+
+#: contrib/admindocs/views.py:340
+msgid "Text"
+msgstr "Text"
+
+#: contrib/admindocs/views.py:341
+msgid "Time"
+msgstr "Zeit"
+
+#: contrib/admindocs/views.py:342 contrib/flatpages/admin.py:8
+#: contrib/flatpages/models.py:8
+msgid "URL"
+msgstr "Adresse (URL)"
+
+#: contrib/admindocs/views.py:343
+msgid "U.S. state (two uppercase letters)"
+msgstr "U.S. Bundesstaat (zwei Großbuchstaben)"
+
+#: contrib/admindocs/views.py:344
+msgid "XML text"
+msgstr "XML-Text"
+
+#: contrib/admindocs/views.py:370
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s ist scheinbar kein urlpattern-Objekt"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Bookmarklets"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:4
+msgid "Documentation bookmarklets"
+msgstr "Dokumentations-Bookmarklets"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:8
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">Um Bookmarklets zu installieren, müssen diese Links in "
+"die\n"
+"Browser-Werkzeugleiste gezogen werden, oder mittels rechter Maustaste in "
+"die\n"
+"Bookmarks gespeichert werden. Danach können die Bookmarklets von jeder "
+"Seite\n"
+"aufgerufen werden. Einige Bookmarklets sind auf den Zugriff von 'internen'\n"
+"Rechnern beschränkt. Falls nicht klar ist, ob ein Rechner als 'intern'\n"
+"bewertet wird, bitte den Administrator fragen.</p>\n"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:18
+msgid "Documentation for this page"
+msgstr "Dokumentation für diese Seite"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:19
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+"Springt von jeder Seite zu der Dokumentation für den View, der diese Seite "
+"erzeugt."
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:21
+msgid "Show object ID"
+msgstr "Objekt-ID anzeigen"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:22
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Zeigt den Content-Type und die eindeutige ID für Seiten, die ein einzelnes "
+"Objekt repräsentieren."
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:24
+msgid "Edit this object (current window)"
+msgstr "Dieses Objekt ändern (Aktives Fenster)"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:25
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+"Springt zu der Administrationsseite für dieses Objekt, wenn diese Seite ein "
+"Objekt repräsentiert."
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:27
+msgid "Edit this object (new window)"
+msgstr "Dieses Objekt ändern (Neues Fenster)"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:28
+msgid "As above, but opens the admin page in a new window."
+msgstr ""
+"Wie zuvor, aber öffnet die Administrationsseite in einem neuen Fenster."
+
+#: contrib/auth/admin.py:21
+msgid "Personal info"
+msgstr "Persönliche Infos"
+
+#: contrib/auth/admin.py:22
+msgid "Permissions"
+msgstr "Berechtigungen"
+
+#: contrib/auth/admin.py:23
+msgid "Important dates"
+msgstr "Wichtige Daten"
+
+#: contrib/auth/admin.py:24
+msgid "Groups"
+msgstr "Gruppen"
+
+#: contrib/auth/admin.py:60
+msgid "Add user"
+msgstr "Benutzer hinzufügen"
+
+#: contrib/auth/admin.py:85
+msgid "Password changed successfully."
+msgstr "Passwort erfolgreich geändert."
+
+#: contrib/auth/admin.py:91
+#, python-format
+msgid "Change password: %s"
+msgstr "Passwort ändern: %s"
+
+#: contrib/auth/forms.py:15 contrib/auth/models.py:137
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr ""
+"Erforderlich. 30 Zeichen oder weniger. Nur alphanumerische Zeichen "
+"(Buchstaben, Ziffern und Unterstriche) sind erlaubt."
+
+#: contrib/auth/forms.py:16 core/validators.py:72
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Dieser Wert darf nur Buchstaben, Ziffern und Unterstriche enthalten."
+
+#: contrib/auth/forms.py:18
+msgid "Password confirmation"
+msgstr "Passwort bestätigen"
+
+#: contrib/auth/forms.py:30
+msgid "A user with that username already exists."
+msgstr "Dieser Benutzername ist bereits vergeben."
+
+#: contrib/auth/forms.py:36 contrib/auth/forms.py:146
+#: contrib/auth/forms.py:188
+msgid "The two password fields didn't match."
+msgstr "Die beiden Passwörter sind nicht identisch."
+
+#: contrib/auth/forms.py:74 contrib/comments/views/comments.py:58
+msgid "This account is inactive."
+msgstr "Dieser Benutzer ist inaktiv."
+
+#: contrib/auth/forms.py:79 contrib/comments/views/comments.py:49
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"Der Webbrowser scheint keine Cookies aktiviert zu haben. Cookies sind für "
+"die Anmeldung zwingend erforderlich."
+
+#: contrib/auth/forms.py:92
+msgid "E-mail"
+msgstr "E-Mail-Adresse"
+
+#: contrib/auth/forms.py:101
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr ""
+"Zu dieser E-Mail-Adresse existiert kein Benutzer. Sicher, dass Sie sich mit "
+"dieser Adresse registriert haben?"
+
+#: contrib/auth/forms.py:126
+#, python-format
+msgid "Password reset on %s"
+msgstr "Passwort auf %s zurücksetzen"
+
+#: contrib/auth/forms.py:134
+msgid "New password"
+msgstr "Neues Passwort"
+
+#: contrib/auth/forms.py:135
+msgid "New password confirmation"
+msgstr "Neues Passwort bestätigen"
+
+#: contrib/auth/forms.py:160
+msgid "Old password"
+msgstr "Altes Passwort"
+
+#: contrib/auth/forms.py:168
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Das alte Passwort war falsch. Bitte neu eingeben."
+
+#: contrib/auth/models.py:73 contrib/auth/models.py:96
+msgid "name"
+msgstr "Name"
+
+#: contrib/auth/models.py:75
+msgid "codename"
+msgstr "Codename"
+
+#: contrib/auth/models.py:78
+msgid "permission"
+msgstr "Berechtigung"
+
+#: contrib/auth/models.py:79 contrib/auth/models.py:97
+msgid "permissions"
+msgstr "Berechtigungen"
+
+#: contrib/auth/models.py:100
+msgid "group"
+msgstr "Gruppe"
+
+#: contrib/auth/models.py:101 contrib/auth/models.py:147
+msgid "groups"
+msgstr "Gruppen"
+
+#: contrib/auth/models.py:137
+msgid "username"
+msgstr "Benutzername"
+
+#: contrib/auth/models.py:138
+msgid "first name"
+msgstr "Vorname"
+
+#: contrib/auth/models.py:139
+msgid "last name"
+msgstr "Nachname"
+
+#: contrib/auth/models.py:140
+msgid "e-mail address"
+msgstr "E-Mail-Adresse"
+
+#: contrib/auth/models.py:141
+msgid "password"
+msgstr "Passwort"
+
+#: contrib/auth/models.py:141
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"Die Form '[algo]$[salt]$[hexdigest]' verwenden, oder das <a href=\"password/"
+"\">Passwort ändern Formular</a> benutzen."
+
+#: contrib/auth/models.py:142
+msgid "staff status"
+msgstr "Redakteur-Status"
+
+#: contrib/auth/models.py:142
+msgid "Designates whether the user can log into this admin site."
+msgstr ""
+"Legt fest, ob sich der Benutzer an der Administrationsseite anmelden kann."
+
+#: contrib/auth/models.py:143
+msgid "active"
+msgstr "Aktiv"
+
+#: contrib/auth/models.py:143
+msgid ""
+"Designates whether this user should be treated as active. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"Legt fest, ob dieser Benutzer aktiv ist. Kann deaktiviert werden, anstatt "
+"Benutzer zu löschen."
+
+#: contrib/auth/models.py:144
+msgid "superuser status"
+msgstr "Administrator-Status"
+
+#: contrib/auth/models.py:144
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr ""
+"Legt fest, dass der Benutzer alle Berechtigungen hat, ohne diese einzeln "
+"zuweisen zu müssen."
+
+#: contrib/auth/models.py:145
+msgid "last login"
+msgstr "Letzte Anmeldung"
+
+#: contrib/auth/models.py:146
+msgid "date joined"
+msgstr "Mitglied seit"
+
+#: contrib/auth/models.py:148
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"Zusätzlich zu den manuell angelegten Rechten erhält dieser Benutzer auch "
+"alle Rechte, die seine zugewiesenen Gruppen haben."
+
+#: contrib/auth/models.py:149
+msgid "user permissions"
+msgstr "Berechtigungen"
+
+#: contrib/auth/models.py:153
+msgid "user"
+msgstr "Benutzer"
+
+#: contrib/auth/models.py:154
+msgid "users"
+msgstr "Benutzer"
+
+#: contrib/auth/models.py:309
+msgid "message"
+msgstr "Mitteilung"
+
+#: contrib/auth/views.py:50
+msgid "Logged out"
+msgstr "Abgemeldet"
+
+#: contrib/comments/models.py:71 contrib/comments/models.py:164
+msgid "object ID"
+msgstr "Objekt-ID"
+
+#: contrib/comments/models.py:72
+msgid "headline"
+msgstr "Überschrift"
+
+#: contrib/comments/models.py:73 contrib/comments/models.py:95
+#: contrib/comments/models.py:165
+msgid "comment"
+msgstr "Kommentar"
+
+#: contrib/comments/models.py:74
+msgid "rating #1"
+msgstr "Bewertung #1"
+
+#: contrib/comments/models.py:75
+msgid "rating #2"
+msgstr "Bewertung #2"
+
+#: contrib/comments/models.py:76
+msgid "rating #3"
+msgstr "Bewertung #3"
+
+#: contrib/comments/models.py:77
+msgid "rating #4"
+msgstr "Bewertung #4"
+
+#: contrib/comments/models.py:78
+msgid "rating #5"
+msgstr "Bewertung #5"
+
+#: contrib/comments/models.py:79
+msgid "rating #6"
+msgstr "Bewertung #6"
+
+#: contrib/comments/models.py:80
+msgid "rating #7"
+msgstr "Bewertung #7"
+
+#: contrib/comments/models.py:81
+msgid "rating #8"
+msgstr "Bewertung #8"
+
+#: contrib/comments/models.py:86
+msgid "is valid rating"
+msgstr "ist eine Bewertung"
+
+#: contrib/comments/models.py:87 contrib/comments/models.py:167
+msgid "date/time submitted"
+msgstr "Datum/Zeit Erstellung"
+
+#: contrib/comments/models.py:88 contrib/comments/models.py:168
+msgid "is public"
+msgstr "ist öffentlich"
+
+#: contrib/comments/models.py:90
+msgid "is removed"
+msgstr "ist gelöscht"
+
+#: contrib/comments/models.py:90
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Hier einen Haken setzen, wenn der Kommentar unpassend ist. Stattdessen wird "
+"dann \"Dieser Kommentar wurde entfernt\" Meldung angezeigt."
+
+#: contrib/comments/models.py:96
+msgid "comments"
+msgstr "Kommentare"
+
+#: contrib/comments/models.py:128 contrib/comments/models.py:199
+msgid "Content object"
+msgstr "Inhaltsobjekt"
+
+#: contrib/comments/models.py:156
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Geschrieben von %(user)s am %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:166
+msgid "person's name"
+msgstr "Autorname"
+
+#: contrib/comments/models.py:169
+msgid "ip address"
+msgstr "IP-Adresse"
+
+#: contrib/comments/models.py:171
+msgid "approved by staff"
+msgstr "Bestätigt vom Betreiber"
+
+#: contrib/comments/models.py:175
+msgid "free comment"
+msgstr "Freier Kommentar"
+
+#: contrib/comments/models.py:176
+msgid "free comments"
+msgstr "Freie Kommentare"
+
+#: contrib/comments/models.py:227
+msgid "score"
+msgstr "Bewertung"
+
+#: contrib/comments/models.py:228
+msgid "score date"
+msgstr "Bewertungsdatum"
+
+#: contrib/comments/models.py:232
+msgid "karma score"
+msgstr "Karma Bewertung"
+
+#: contrib/comments/models.py:233
+msgid "karma scores"
+msgstr "Karma Bewertungen"
+
+#: contrib/comments/models.py:237
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d Bewertung von %(user)s"
+
+#: contrib/comments/models.py:254
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Dieser Kommentar ist von %(user)s markiert:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:262
+msgid "flag date"
+msgstr "Kennzeichnungsdatum"
+
+#: contrib/comments/models.py:266
+msgid "user flag"
+msgstr "Benutzerkennzeichnung"
+
+#: contrib/comments/models.py:267
+msgid "user flags"
+msgstr "Benutzerkennzeichnungen"
+
+#: contrib/comments/models.py:271
+#, python-format
+msgid "Flag by %r"
+msgstr "Gekennzeichnet von %r"
+
+#: contrib/comments/models.py:277
+msgid "deletion date"
+msgstr "Löschdatum"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "Löschung vom Moderator"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "Löschungen vom Moderator"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Vom Moderator %r gelöscht"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Passwort vergessen?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Bewertungen"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Erforderlich"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Optional"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Ein Bild veröffentlichen"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Kommentar:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Kommentarvorschau"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Ihr Name:"
+
+#: contrib/comments/views/comments.py:76
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr ""
+"Diese Abstimmung ist zwingend erforderlich, da Sie an mindestens einer "
+"weiteren Abstimmung teilnehmen."
+
+#: contrib/comments/views/comments.py:160
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Dieser Kommentar ist von einem Benutzer mit weniger als %(count)s "
+"Kommentar:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Dieser Kommentar ist von einem Benutzer mit weniger als %(count)s "
+"Kommentaren:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:165
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Dieser Kommentar ist von einem nicht einschätzbaren Benutzer:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:238
+#: contrib/comments/views/comments.py:331
+msgid "Only POSTs are allowed"
+msgstr "Nur POST ist erlaubt"
+
+#: contrib/comments/views/comments.py:242
+#: contrib/comments/views/comments.py:335
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Eines oder mehrere der erforderlichen Felder fehlen"
+
+#: contrib/comments/views/comments.py:246
+#: contrib/comments/views/comments.py:337
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr ""
+"Jemand hat mit dem Kommentarformular herumgespielt (Sicherheitsverletzung)"
+
+#: contrib/comments/views/comments.py:256
+#: contrib/comments/views/comments.py:343
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"Das Kommentarformular hatte einen falschen 'target' Parameter -- die Objekt-"
+"ID ist ungültig."
+
+#: contrib/comments/views/comments.py:307
+#: contrib/comments/views/comments.py:372
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr ""
+"Das Kommentarformular wurde nicht mit 'preview' oder 'post' abgeschickt"
+
+#: contrib/comments/views/karma.py:21
+msgid "Anonymous users cannot vote"
+msgstr "Anonyme Benutzer dürfen nicht abstimmen"
+
+#: contrib/comments/views/karma.py:25
+msgid "Invalid comment ID"
+msgstr "Ungültige Kommentar-ID"
+
+#: contrib/comments/views/karma.py:27
+msgid "No voting for yourself"
+msgstr "Keine Abstimmung für dich selbst"
+
+#: contrib/contenttypes/models.py:67
+msgid "python model class name"
+msgstr "Python Model-Klassenname"
+
+#: contrib/contenttypes/models.py:71
+msgid "content type"
+msgstr "Inhaltstyp"
+
+#: contrib/contenttypes/models.py:72
+msgid "content types"
+msgstr "Inhaltstypen"
+
+#: contrib/flatpages/admin.py:9
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Beispiel: '/about/contact/'. Wichtig: Am Anfang und Ende muss ein / stehen."
+
+#: contrib/flatpages/admin.py:11 core/validators.py:76
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Dieser Wert darf nur Buchstaben, Ziffern, Unterstriche und Schrägstriche "
+"enthalten."
+
+#: contrib/flatpages/admin.py:22
+msgid "Advanced options"
+msgstr "Erweiterte Optionen"
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "Titel"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "Inhalt"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "Kommentare aktivieren"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "Name der Vorlage"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"Beispiel: 'flatpages/contact_page.html'. Wenn dieses Feld nicht gefüllt ist, "
+"wird 'flatpages/default.html' als Standard gewählt."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "Registrierung erforderlich"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+"Wenn hier ein Haken gesetzt ist, können nur angemeldete Benutzer diese Seite "
+"sehen."
+
+#: contrib/flatpages/models.py:19
+msgid "flat page"
+msgstr "Webseite"
+
+#: contrib/flatpages/models.py:20
+msgid "flat pages"
+msgstr "Webseiten"
+
+#: contrib/gis/forms/fields.py:10
+msgid "No geometry value provided."
+msgstr "Kein geometrischer Wert gegeben."
+
+#: contrib/gis/forms/fields.py:11
+msgid "Invalid Geometry value."
+msgstr "Ungültiger geometrischer Wert."
+
+#: contrib/gis/forms/fields.py:12
+msgid "Invalid Geometry type."
+msgstr "Ungültiger geometrischer Typ."
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "th"
+msgstr "."
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "st"
+msgstr "."
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "nd"
+msgstr "."
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "rd"
+msgstr "."
+
+#: contrib/humanize/templatetags/humanize.py:51
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f Million"
+msgstr[1] "%(value).1f Millionen"
+
+#: contrib/humanize/templatetags/humanize.py:54
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f Milliarde"
+msgstr[1] "%(value).1f Milliarden"
+
+#: contrib/humanize/templatetags/humanize.py:57
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f Billion"
+msgstr[1] "%(value).1f Billionen"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "one"
+msgstr "ein"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "two"
+msgstr "zwei"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "three"
+msgstr "drei"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "four"
+msgstr "vier"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "five"
+msgstr "fünf"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "six"
+msgstr "sechs"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "seven"
+msgstr "sieben"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "eight"
+msgstr "acht"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "nine"
+msgstr "neun"
+
+#: contrib/humanize/templatetags/humanize.py:93
+msgid "today"
+msgstr "heute"
+
+#: contrib/humanize/templatetags/humanize.py:95
+msgid "tomorrow"
+msgstr "morgen"
+
+#: contrib/humanize/templatetags/humanize.py:97
+msgid "yesterday"
+msgstr "gestern"
+
+#: contrib/localflavor/ar/forms.py:27
+msgid "Enter a postal code in the format NNNN or ANNNNAAA."
+msgstr "Bitte eine gültige Postleitzahl im Format NNNN oder ANNNNAAA eingeben."
+
+#: contrib/localflavor/ar/forms.py:49 contrib/localflavor/br/forms.py:96
+#: contrib/localflavor/br/forms.py:135 contrib/localflavor/pe/forms.py:23
+#: contrib/localflavor/pe/forms.py:51
+msgid "This field requires only numbers."
+msgstr "Dieses Feld darf nur Ziffern enthalten."
+
+#: contrib/localflavor/ar/forms.py:50
+msgid "This field requires 7 or 8 digits."
+msgstr "Dieses Feld benötigt 7 oder 8 Ziffern."
+
+#: contrib/localflavor/ar/forms.py:79
+msgid "Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format."
+msgstr ""
+"Bitte eine gültige CUIT im Format XX-XXXXXXXX-X oder XXXXXXXXXXXX eingeben."
+
+#: contrib/localflavor/ar/forms.py:80
+msgid "Invalid CUIT."
+msgstr "Ungültige CUIT."
+
+#: contrib/localflavor/at/at_states.py:5
+msgid "Burgenland"
+msgstr "Burgenland"
+
+#: contrib/localflavor/at/at_states.py:6
+msgid "Carinthia"
+msgstr "Kärnten"
+
+#: contrib/localflavor/at/at_states.py:7
+msgid "Lower Austria"
+msgstr "Niederösterreich"
+
+#: contrib/localflavor/at/at_states.py:8
+msgid "Upper Austria"
+msgstr "Oberösterreich"
+
+#: contrib/localflavor/at/at_states.py:9
+msgid "Salzburg"
+msgstr "Salzburg"
+
+#: contrib/localflavor/at/at_states.py:10
+msgid "Styria"
+msgstr "Steiermark"
+
+#: contrib/localflavor/at/at_states.py:11
+msgid "Tyrol"
+msgstr "Tirol"
+
+#: contrib/localflavor/at/at_states.py:12
+msgid "Vorarlberg"
+msgstr "Vorarlberg"
+
+#: contrib/localflavor/at/at_states.py:13
+msgid "Vienna"
+msgstr "Wien"
+
+#: contrib/localflavor/at/forms.py:20 contrib/localflavor/ch/forms.py:16
+#: contrib/localflavor/no/forms.py:12
+msgid "Enter a zip code in the format XXXX."
+msgstr "Bitte eine gültige Postleitzahl im Format XXXX eingeben."
+
+#: contrib/localflavor/at/forms.py:48
+msgid "Enter a valid Austrian Social Security Number in XXXX XXXXXX format."
+msgstr ""
+"Bitte eine gültige österreichische Sozialversicherungsnummer im Format XXXX "
+"XXXXXX eingeben."
+
+#: contrib/localflavor/au/forms.py:16
+msgid "Enter a 4 digit post code."
+msgstr "Bitte eine gültige vierstellige Postleitzahl eingeben."
+
+#: contrib/localflavor/br/forms.py:21
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Bitte eine gültige Postleitzahl im Format XXXXX-XXX eingeben."
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "Telefonnummern müssen das Format XX-XXXX-XXXX haben."
+
+#: contrib/localflavor/br/forms.py:58
+msgid ""
+"Select a valid brazilian state. That state is not one of the available "
+"states."
+msgstr "Bitte einen gültigen brasilianischen Bundesstaat auswählen."
+
+#: contrib/localflavor/br/forms.py:94
+msgid "Invalid CPF number."
+msgstr "Ungültige CPF-Nummer."
+
+#: contrib/localflavor/br/forms.py:95
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr "Dieses Feld benötigt mindestens 11 Ziffern oder 14 Zeichen."
+
+#: contrib/localflavor/br/forms.py:134
+msgid "Invalid CNPJ number."
+msgstr "Ungültige CNPJ-Nummer."
+
+#: contrib/localflavor/br/forms.py:136
+msgid "This field requires at least 14 digits"
+msgstr "Dieses Feld benötigt mindestens 14 Ziffern."
+
+#: contrib/localflavor/ca/forms.py:17
+msgid "Enter a postal code in the format XXX XXX."
+msgstr "Bitte eine gültige Postleitzahl im Format XXX XXX eingeben."
+
+#: contrib/localflavor/ca/forms.py:88
+msgid "Enter a valid Canadian Social Insurance number in XXX-XXX-XXX format."
+msgstr ""
+"Bitte eine gültige kanadische Sozialversicherungsnummer im Format XXX-XXX-"
+"XXX eingeben."
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr "Aargau"
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr "Appenzell Innerrhoden"
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr "Appenzell Ausserrhoden"
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr "Basel-Stadt"
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr "Basel-Land"
+
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr "Bern"
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr "Freiburg"
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr "Genf"
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr "Glarus"
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr "Graubünden"
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr "Jura"
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr "Luzern"
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr "Neuchatel"
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr "Nidwalden"
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr "Obwalden"
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr "Schaffhausen"
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr "Schwyz"
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr "Solothurn"
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr "St. Gallen"
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr "Thurgau"
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr "Ticino"
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr "Uri"
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr "Valais"
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr "Vaud"
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr "Zug"
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr "Zürich"
+
+#: contrib/localflavor/ch/forms.py:64
+msgid ""
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
+msgstr ""
+"Bitte eine gültige Schweizer Identifikations- oder Reisepassnummer im "
+"FormatX1234567<0 oder 1234567890 eingeben."
+
+#: contrib/localflavor/cl/forms.py:29
+msgid "Enter a valid Chilean RUT."
+msgstr "Bitte eine gültige chilenische RUT eingeben."
+
+#: contrib/localflavor/cl/forms.py:30
+msgid "Enter a valid Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr "Bitte eine chilenische RUT im Format XX.XXX.XXX-X eingeben."
+
+#: contrib/localflavor/cl/forms.py:31
+msgid "The Chilean RUT is not valid."
+msgstr "Diese chilenische RUT ist ungültig."
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr "Baden-Württemberg"
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr "Bayern"
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr "Berlin"
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr "Brandenburg"
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr "Bremen"
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr "Hamburg"
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr "Hessen"
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr "Mecklenburg-Vorpommern"
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr "Niedersachsen"
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr "Nordrhein-Westfalen"
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr "Rheinland-Pfalz"
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr "Saarland"
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr "Sachsen"
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr "Sachsen-Anhalt"
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr "Schleswig-Holstein"
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr "Thüringen"
+
+#: contrib/localflavor/de/forms.py:14 contrib/localflavor/fi/forms.py:12
+#: contrib/localflavor/fr/forms.py:15
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Bitte eine gültige Postleitzahl im Format XXXXX eingeben."
+
+#: contrib/localflavor/de/forms.py:41
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr ""
+"Bitte eine gültige deutsche Personalausweisnummer im Format XXXXXXXXXXX-"
+"XXXXXXX-XXXXXXX-X eingeben."
+
+#: contrib/localflavor/es/es_provinces.py:5
+msgid "Arava"
+msgstr "Arava"
+
+#: contrib/localflavor/es/es_provinces.py:6
+msgid "Albacete"
+msgstr "Albacete"
+
+#: contrib/localflavor/es/es_provinces.py:7
+msgid "Alacant"
+msgstr "Alacant"
+
+#: contrib/localflavor/es/es_provinces.py:8
+msgid "Almeria"
+msgstr "Almería"
+
+#: contrib/localflavor/es/es_provinces.py:9
+msgid "Avila"
+msgstr "Ávila"
+
+#: contrib/localflavor/es/es_provinces.py:10
+msgid "Badajoz"
+msgstr "Badajoz"
+
+#: contrib/localflavor/es/es_provinces.py:11
+msgid "Illes Balears"
+msgstr "Balearische Inseln"
+
+#: contrib/localflavor/es/es_provinces.py:12
+msgid "Barcelona"
+msgstr "Barcelona"
+
+#: contrib/localflavor/es/es_provinces.py:13
+msgid "Burgos"
+msgstr "Burgos"
+
+#: contrib/localflavor/es/es_provinces.py:14
+msgid "Caceres"
+msgstr "Cáceres"
+
+#: contrib/localflavor/es/es_provinces.py:15
+msgid "Cadiz"
+msgstr "Cádiz"
+
+#: contrib/localflavor/es/es_provinces.py:16
+msgid "Castello"
+msgstr "Castello"
+
+#: contrib/localflavor/es/es_provinces.py:17
+msgid "Ciudad Real"
+msgstr "Ciudad Real"
+
+#: contrib/localflavor/es/es_provinces.py:18
+msgid "Cordoba"
+msgstr "Córdoba"
+
+#: contrib/localflavor/es/es_provinces.py:19
+msgid "A Coruna"
+msgstr "A Coruña"
+
+#: contrib/localflavor/es/es_provinces.py:20
+msgid "Cuenca"
+msgstr "Cuenca"
+
+#: contrib/localflavor/es/es_provinces.py:21
+msgid "Girona"
+msgstr "Girona"
+
+#: contrib/localflavor/es/es_provinces.py:22
+msgid "Granada"
+msgstr "Granada"
+
+#: contrib/localflavor/es/es_provinces.py:23
+msgid "Guadalajara"
+msgstr "Guadalajara"
+
+#: contrib/localflavor/es/es_provinces.py:24
+msgid "Guipuzkoa"
+msgstr "Guipuzkoa"
+
+#: contrib/localflavor/es/es_provinces.py:25
+msgid "Huelva"
+msgstr "Huelva"
+
+#: contrib/localflavor/es/es_provinces.py:26
+msgid "Huesca"
+msgstr "Huesca"
+
+#: contrib/localflavor/es/es_provinces.py:27
+msgid "Jaen"
+msgstr "Jaén"
+
+#: contrib/localflavor/es/es_provinces.py:28
+msgid "Leon"
+msgstr "León"
+
+#: contrib/localflavor/es/es_provinces.py:29
+msgid "Lleida"
+msgstr "Lleida"
+
+#: contrib/localflavor/es/es_provinces.py:30
+#: contrib/localflavor/es/es_regions.py:17
+msgid "La Rioja"
+msgstr "La Rioja"
+
+#: contrib/localflavor/es/es_provinces.py:31
+msgid "Lugo"
+msgstr "Lugo"
+
+#: contrib/localflavor/es/es_provinces.py:32
+#: contrib/localflavor/es/es_regions.py:18
+msgid "Madrid"
+msgstr "Madrid"
+
+#: contrib/localflavor/es/es_provinces.py:33
+msgid "Malaga"
+msgstr "Málaga"
+
+#: contrib/localflavor/es/es_provinces.py:34
+msgid "Murcia"
+msgstr "Murcia"
+
+#: contrib/localflavor/es/es_provinces.py:35
+msgid "Navarre"
+msgstr "Navarre"
+
+#: contrib/localflavor/es/es_provinces.py:36
+msgid "Ourense"
+msgstr "Ourense"
+
+#: contrib/localflavor/es/es_provinces.py:37
+msgid "Asturias"
+msgstr "Asturien"
+
+#: contrib/localflavor/es/es_provinces.py:38
+msgid "Palencia"
+msgstr "Palencia"
+
+#: contrib/localflavor/es/es_provinces.py:39
+msgid "Las Palmas"
+msgstr "Las Palmas"
+
+#: contrib/localflavor/es/es_provinces.py:40
+msgid "Pontevedra"
+msgstr "Pontevedra"
+
+#: contrib/localflavor/es/es_provinces.py:41
+msgid "Salamanca"
+msgstr "Salamanca"
+
+#: contrib/localflavor/es/es_provinces.py:42
+msgid "Santa Cruz de Tenerife"
+msgstr "Santa Cruz de Tenerife"
+
+#: contrib/localflavor/es/es_provinces.py:43
+#: contrib/localflavor/es/es_regions.py:11
+msgid "Cantabria"
+msgstr "Kantabrien"
+
+#: contrib/localflavor/es/es_provinces.py:44
+msgid "Segovia"
+msgstr "Segovia"
+
+#: contrib/localflavor/es/es_provinces.py:45
+msgid "Seville"
+msgstr "Sevilla"
+
+#: contrib/localflavor/es/es_provinces.py:46
+msgid "Soria"
+msgstr "Soria"
+
+#: contrib/localflavor/es/es_provinces.py:47
+msgid "Tarragona"
+msgstr "Tarragona"
+
+#: contrib/localflavor/es/es_provinces.py:48
+msgid "Teruel"
+msgstr "Teruel"
+
+#: contrib/localflavor/es/es_provinces.py:49
+msgid "Toledo"
+msgstr "Toledo"
+
+#: contrib/localflavor/es/es_provinces.py:50
+msgid "Valencia"
+msgstr "Valencia"
+
+#: contrib/localflavor/es/es_provinces.py:51
+msgid "Valladolid"
+msgstr "Valladolid"
+
+#: contrib/localflavor/es/es_provinces.py:52
+msgid "Bizkaia"
+msgstr "Bizkaia"
+
+#: contrib/localflavor/es/es_provinces.py:53
+msgid "Zamora"
+msgstr "Zamora"
+
+#: contrib/localflavor/es/es_provinces.py:54
+msgid "Zaragoza"
+msgstr "Zaragoza"
+
+#: contrib/localflavor/es/es_provinces.py:55
+msgid "Ceuta"
+msgstr "Ceuta"
+
+#: contrib/localflavor/es/es_provinces.py:56
+msgid "Melilla"
+msgstr "Melilla"
+
+#: contrib/localflavor/es/es_regions.py:5
+msgid "Andalusia"
+msgstr "Andalusien"
+
+#: contrib/localflavor/es/es_regions.py:6
+msgid "Aragon"
+msgstr "Aragonien"
+
+#: contrib/localflavor/es/es_regions.py:7
+msgid "Principality of Asturias"
+msgstr "Fürstentum Asturien"
+
+#: contrib/localflavor/es/es_regions.py:8
+msgid "Balearic Islands"
+msgstr "Balearische Inseln"
+
+#: contrib/localflavor/es/es_regions.py:9
+msgid "Basque Country"
+msgstr "Baskenland"
+
+#: contrib/localflavor/es/es_regions.py:10
+msgid "Canary Islands"
+msgstr "Kanarische Inseln"
+
+#: contrib/localflavor/es/es_regions.py:12
+msgid "Castile-La Mancha"
+msgstr "Kastilien-La Mancha"
+
+#: contrib/localflavor/es/es_regions.py:13
+msgid "Castile and Leon"
+msgstr "Kastilien-León"
+
+#: contrib/localflavor/es/es_regions.py:14
+msgid "Catalonia"
+msgstr "Katalonien"
+
+#: contrib/localflavor/es/es_regions.py:15
+msgid "Extremadura"
+msgstr "Extremadura"
+
+#: contrib/localflavor/es/es_regions.py:16
+msgid "Galicia"
+msgstr "Galicien"
+
+#: contrib/localflavor/es/es_regions.py:19
+msgid "Region of Murcia"
+msgstr "Murcia"
+
+#: contrib/localflavor/es/es_regions.py:20
+msgid "Foral Community of Navarre"
+msgstr "Foralgemeinschaft Navarra"
+
+#: contrib/localflavor/es/es_regions.py:21
+msgid "Valencian Community"
+msgstr "Valencia"
+
+#: contrib/localflavor/es/forms.py:19
+msgid "Enter a valid postal code in the range and format 01XXX - 52XXX."
+msgstr "Bitte eine gültige Postleitzahl im Format 01XXX bis 52XXX eingeben."
+
+#: contrib/localflavor/es/forms.py:39
+msgid ""
+"Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or "
+"9XXXXXXXX."
+msgstr ""
+"Bitte eine gültige Telefonnummer in einem der folgenden Formate eingeben "
+"6XXXXXXXX, 8XXXXXXXX oder 9XXXXXXXX."
+
+#: contrib/localflavor/es/forms.py:66
+msgid "Please enter a valid NIF, NIE, or CIF."
+msgstr "Bitte eine gültige NIF, NIE oder CIF eingeben."
+
+#: contrib/localflavor/es/forms.py:67
+msgid "Please enter a valid NIF or NIE."
+msgstr "Bitte eine gültige NIF oder NIE eingeben."
+
+#: contrib/localflavor/es/forms.py:68
+msgid "Invalid checksum for NIF."
+msgstr "Ungültige Prüfsumme für NIF."
+
+#: contrib/localflavor/es/forms.py:69
+msgid "Invalid checksum for NIE."
+msgstr "Ungültige Prüfsumme für NIE."
+
+#: contrib/localflavor/es/forms.py:70
+msgid "Invalid checksum for CIF."
+msgstr "Ungültige Prüfsumme für CIF."
+
+#: contrib/localflavor/es/forms.py:142
+msgid ""
+"Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX."
+msgstr ""
+"Bitte eine gültige Kontonummer im Format XXXX-XXXX-XX-XXXXXXXXXX eingeben."
+
+#: contrib/localflavor/es/forms.py:143
+msgid "Invalid checksum for bank account number."
+msgstr "Ungültige Prüfsumme für Kontonummer."
+
+#: contrib/localflavor/fi/forms.py:28
+msgid "Enter a valid Finnish social security number."
+msgstr "Bitte eine gültige finnische Sozialversicherungsnummer eingeben."
+
+#: contrib/localflavor/in_/forms.py:14
+msgid "Enter a zip code in the format XXXXXXX."
+msgstr "Bitte eine gültige Postleitzahl im Format XXXXXXX eingeben."
+
+#: contrib/localflavor/is_/forms.py:17
+msgid ""
+"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr ""
+"Bitte eine gültige isländische Identifikationsnummer im Format XXXXXX-XXXX "
+"eingeben."
+
+#: contrib/localflavor/is_/forms.py:18
+msgid "The Icelandic identification number is not valid."
+msgstr "Die isländische Identifikationsnummer ist nicht gültig."
+
+#: contrib/localflavor/it/forms.py:14
+msgid "Enter a valid zip code."
+msgstr "Bitte eine gültige Postleitzahl eingeben."
+
+#: contrib/localflavor/it/forms.py:43
+msgid "Enter a valid Social Security number."
+msgstr "Bitte eine gültige Sozialversicherungsnummer eingeben."
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr "Bitte eine gültige Umsatzsteuernummer eingeben."
+
+#: contrib/localflavor/jp/forms.py:17
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr ""
+"Bitte eine gültige Postleitzahl im Format XXXXXXX oder XXX-XXXX eingeben."
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr "Hokkaidō"
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr "Aomori"
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr "Iwate"
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr "Miyagi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr "Akita"
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr "Yamagata"
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr "Fukushima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr "Ibaraki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr "Tochigi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr "Gunma"
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr "Saitama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr "Chiba"
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr "Tokio"
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr "Kanagawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr "Yamanashi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr "Nagano"
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr "Niigata"
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr "Toyama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr "Ishikawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr "Fukui"
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr "Gifu"
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr "Shizuoka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr "Aichi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr "Mie"
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr "Shiga"
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr "Kyōto"
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr "Ōsaka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr "Hyōgo"
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr "Nara"
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr "Wakayama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr "Tottori"
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr "Shimane"
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr "Okayama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr "Hiroshima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr "Yamaguchi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr "Tokushima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr "Kagawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr "Ehime"
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr "Kochi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr "Fukuoka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr "Saga"
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr "Nagasaki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr "Kumamoto"
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr "Ōita"
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr "Miyazaki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr "Kagoshima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr "Okinawa"
+
+#: contrib/localflavor/mx/mx_states.py:12
+msgid "Aguascalientes"
+msgstr "Aguascalientes"
+
+#: contrib/localflavor/mx/mx_states.py:13
+msgid "Baja California"
+msgstr "Baja California"
+
+#: contrib/localflavor/mx/mx_states.py:14
+msgid "Baja California Sur"
+msgstr "Baja California Sur"
+
+#: contrib/localflavor/mx/mx_states.py:15
+msgid "Campeche"
+msgstr "Campeche"
+
+#: contrib/localflavor/mx/mx_states.py:16
+msgid "Chihuahua"
+msgstr "Chihuahua"
+
+#: contrib/localflavor/mx/mx_states.py:17
+msgid "Chiapas"
+msgstr "Chiapas"
+
+#: contrib/localflavor/mx/mx_states.py:18
+msgid "Coahuila"
+msgstr "Coahuila"
+
+#: contrib/localflavor/mx/mx_states.py:19
+msgid "Colima"
+msgstr "Colima"
+
+#: contrib/localflavor/mx/mx_states.py:20
+msgid "Distrito Federal"
+msgstr "Distrito Federal"
+
+#: contrib/localflavor/mx/mx_states.py:21
+msgid "Durango"
+msgstr "Durango"
+
+#: contrib/localflavor/mx/mx_states.py:22
+msgid "Guerrero"
+msgstr "Guerrero"
+
+#: contrib/localflavor/mx/mx_states.py:23
+msgid "Guanajuato"
+msgstr "Guanajuato"
+
+#: contrib/localflavor/mx/mx_states.py:24
+msgid "Hidalgo"
+msgstr "Hidalgo"
+
+#: contrib/localflavor/mx/mx_states.py:25
+msgid "Jalisco"
+msgstr "Jalisco"
+
+#: contrib/localflavor/mx/mx_states.py:26
+msgid "Estado de México"
+msgstr "Estado de México"
+
+#: contrib/localflavor/mx/mx_states.py:27
+msgid "Michoacán"
+msgstr "Michoacán"
+
+#: contrib/localflavor/mx/mx_states.py:28
+msgid "Morelos"
+msgstr "Morelos"
+
+#: contrib/localflavor/mx/mx_states.py:29
+msgid "Nayarit"
+msgstr "Nayarit"
+
+#: contrib/localflavor/mx/mx_states.py:30
+msgid "Nuevo León"
+msgstr "Nuevo León"
+
+#: contrib/localflavor/mx/mx_states.py:31
+msgid "Oaxaca"
+msgstr "Oaxaca"
+
+#: contrib/localflavor/mx/mx_states.py:32
+msgid "Puebla"
+msgstr "Puebla"
+
+#: contrib/localflavor/mx/mx_states.py:33
+msgid "Querétaro"
+msgstr "Querétaro"
+
+#: contrib/localflavor/mx/mx_states.py:34
+msgid "Quintana Roo"
+msgstr "Quintana Roo"
+
+#: contrib/localflavor/mx/mx_states.py:35
+msgid "Sinaloa"
+msgstr "Sinaloa"
+
+#: contrib/localflavor/mx/mx_states.py:36
+msgid "San Luis Potosí"
+msgstr "San Luis Potosí"
+
+#: contrib/localflavor/mx/mx_states.py:37
+msgid "Sonora"
+msgstr "Sonora"
+
+#: contrib/localflavor/mx/mx_states.py:38
+msgid "Tabasco"
+msgstr "Tabasco"
+
+#: contrib/localflavor/mx/mx_states.py:39
+msgid "Tamaulipas"
+msgstr "Tamaulipas"
+
+#: contrib/localflavor/mx/mx_states.py:40
+msgid "Tlaxcala"
+msgstr "Tlaxcala"
+
+#: contrib/localflavor/mx/mx_states.py:41
+msgid "Veracruz"
+msgstr "Veracruz"
+
+#: contrib/localflavor/mx/mx_states.py:42
+msgid "Yucatán"
+msgstr "Yucatán"
+
+#: contrib/localflavor/mx/mx_states.py:43
+msgid "Zacatecas"
+msgstr "Zacatecas"
+
+#: contrib/localflavor/nl/forms.py:21
+msgid "Enter a valid postal code"
+msgstr "Bitte eine gültige Postleitzahl eingeben."
+
+#: contrib/localflavor/nl/forms.py:52
+msgid "Enter a valid phone number"
+msgstr "Bitte eine gültige Telefonnummer eingeben."
+
+#: contrib/localflavor/nl/forms.py:78
+msgid "Enter a valid SoFi number"
+msgstr "Bitte eine gültige SoFi-Nummer eingeben."
+
+#: contrib/localflavor/nl/nl_provinces.py:4
+msgid "Drenthe"
+msgstr "Drente"
+
+#: contrib/localflavor/nl/nl_provinces.py:5
+msgid "Flevoland"
+msgstr "Flevoland"
+
+#: contrib/localflavor/nl/nl_provinces.py:6
+msgid "Friesland"
+msgstr "Friesland"
+
+#: contrib/localflavor/nl/nl_provinces.py:7
+msgid "Gelderland"
+msgstr "Gelderland"
+
+#: contrib/localflavor/nl/nl_provinces.py:8
+msgid "Groningen"
+msgstr "Groningen"
+
+#: contrib/localflavor/nl/nl_provinces.py:9
+msgid "Limburg"
+msgstr "Limburg"
+
+#: contrib/localflavor/nl/nl_provinces.py:10
+msgid "Noord-Brabant"
+msgstr "Nordbrabant"
+
+#: contrib/localflavor/nl/nl_provinces.py:11
+msgid "Noord-Holland"
+msgstr "Nordholland"
+
+#: contrib/localflavor/nl/nl_provinces.py:12
+msgid "Overijssel"
+msgstr "Overijssel"
+
+#: contrib/localflavor/nl/nl_provinces.py:13
+msgid "Utrecht"
+msgstr "Utrecht"
+
+#: contrib/localflavor/nl/nl_provinces.py:14
+msgid "Zeeland"
+msgstr "Zeeland"
+
+#: contrib/localflavor/nl/nl_provinces.py:15
+msgid "Zuid-Holland"
+msgstr "Südholland"
+
+#: contrib/localflavor/no/forms.py:33
+msgid "Enter a valid Norwegian social security number."
+msgstr "Bitte eine gültige norwegische Sozialversicherungsnummer eingeben."
+
+#: contrib/localflavor/pe/forms.py:24
+msgid "This field requires 8 digits."
+msgstr "Dieses Feld benötigt 8 Zeichen."
+
+#: contrib/localflavor/pe/forms.py:52
+msgid "This field requires 11 digits."
+msgstr "Dieses Feld benötigt 11 Zeichen."
+
+#: contrib/localflavor/pl/forms.py:38
+msgid "National Identification Number consists of 11 digits."
+msgstr "Nationale Identifikationsnummer besteht aus 11 Ziffern."
+
+#: contrib/localflavor/pl/forms.py:39
+msgid "Wrong checksum for the National Identification Number."
+msgstr "Falsche Prüfsumme für die nationale Identifikationsnummer."
+
+#: contrib/localflavor/pl/forms.py:71
+msgid ""
+"Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX."
+msgstr ""
+"Bitte eine Steuernummer (NIP) im Format XXX-XXX-XX-XX oder XX-XX-XXX-XXX "
+"eingeben."
+
+#: contrib/localflavor/pl/forms.py:72
+msgid "Wrong checksum for the Tax Number (NIP)."
+msgstr "Falsche Prüfsumme für die Steuernummer (NIP)."
+
+#: contrib/localflavor/pl/forms.py:111
+msgid "National Business Register Number (REGON) consists of 7 or 9 digits."
+msgstr ""
+"Nationale Geschäftsregistrierungsnummer (REGON) besteht aus 7 oder 9 Zeichen."
+
+#: contrib/localflavor/pl/forms.py:112
+msgid "Wrong checksum for the National Business Register Number (REGON)."
+msgstr ""
+"Falsche Prüfsumme für die nationale Geschäftsregistrierungsnummer (REGON)."
+
+#: contrib/localflavor/pl/forms.py:155
+msgid "Enter a postal code in the format XX-XXX."
+msgstr "Bitte eine gültige Postleitzahl im Format XX-XXX eingeben."
+
+#: contrib/localflavor/pl/pl_voivodeships.py:8
+msgid "Lower Silesia"
+msgstr "Niederschlesien"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:9
+msgid "Kuyavia-Pomerania"
+msgstr "Kujawien-Pommern"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:10
+msgid "Lublin"
+msgstr "Lublin"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:11
+msgid "Lubusz"
+msgstr "Land Lebus"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:12
+msgid "Lodz"
+msgstr "Łódź"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:13
+msgid "Lesser Poland"
+msgstr "Kleinpolen"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:14
+msgid "Masovia"
+msgstr "Masowien"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:15
+msgid "Opole"
+msgstr "Oppeln"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:16
+msgid "Subcarpatia"
+msgstr "Karpatenvorland"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:17
+msgid "Podlasie"
+msgstr "Podlasie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:18
+msgid "Pomerania"
+msgstr "Pommern"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:19
+msgid "Silesia"
+msgstr "Schlesien"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:20
+msgid "Swietokrzyskie"
+msgstr "Heiligkreuz"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:21
+msgid "Warmia-Masuria"
+msgstr "Ermland-Masuren"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:22
+msgid "Greater Poland"
+msgstr "Großpolen"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:23
+msgid "West Pomerania"
+msgstr "Vorpommern"
+
+#: contrib/localflavor/ro/forms.py:19
+msgid "Enter a valid CIF."
+msgstr "Bitte eine gültige CIF eingeben."
+
+#: contrib/localflavor/ro/forms.py:56
+msgid "Enter a valid CNP."
+msgstr "Bitte eine gültige CNP eingeben."
+
+#: contrib/localflavor/ro/forms.py:141
+msgid "Enter a valid IBAN in ROXX-XXXX-XXXX-XXXX-XXXX-XXXX format"
+msgstr ""
+"Bitte eine gültige IBAN im Format ROXX-XXXX-XXXX-XXXX-XXXX-XXXX eingeben."
+
+#: contrib/localflavor/ro/forms.py:171
+msgid "Phone numbers must be in XXXX-XXXXXX format."
+msgstr "Telefonnummern müssen das Format XXXX-XXXXXX haben."
+
+#: contrib/localflavor/ro/forms.py:194
+msgid "Enter a valid postal code in the format XXXXXX"
+msgstr "Bitte eine gültige Postleitzahl im Format XXXXXX eingeben"
+
+#: contrib/localflavor/sk/forms.py:30
+msgid "Enter a postal code in the format XXXXX or XXX XX."
+msgstr "Bitte eine gültige Postleitzahl im Format XXXXX oder XXX XX eingeben."
+
+#: contrib/localflavor/sk/sk_districts.py:8
+msgid "Banska Bystrica"
+msgstr "Banská Bystrica"
+
+#: contrib/localflavor/sk/sk_districts.py:9
+msgid "Banska Stiavnica"
+msgstr "Banská Štiavnica"
+
+#: contrib/localflavor/sk/sk_districts.py:10
+msgid "Bardejov"
+msgstr "Bardejov"
+
+#: contrib/localflavor/sk/sk_districts.py:11
+msgid "Banovce nad Bebravou"
+msgstr "Bánovce nad Bebravou"
+
+#: contrib/localflavor/sk/sk_districts.py:12
+msgid "Brezno"
+msgstr "Brezno"
+
+#: contrib/localflavor/sk/sk_districts.py:13
+msgid "Bratislava I"
+msgstr "Bratislava I"
+
+#: contrib/localflavor/sk/sk_districts.py:14
+msgid "Bratislava II"
+msgstr "Bratislava II"
+
+#: contrib/localflavor/sk/sk_districts.py:15
+msgid "Bratislava III"
+msgstr "Bratislava III"
+
+#: contrib/localflavor/sk/sk_districts.py:16
+msgid "Bratislava IV"
+msgstr "Bratislava IV"
+
+#: contrib/localflavor/sk/sk_districts.py:17
+msgid "Bratislava V"
+msgstr "Bratislava V"
+
+#: contrib/localflavor/sk/sk_districts.py:18
+msgid "Bytca"
+msgstr "Bytča"
+
+#: contrib/localflavor/sk/sk_districts.py:19
+msgid "Cadca"
+msgstr "Čadca"
+
+#: contrib/localflavor/sk/sk_districts.py:20
+msgid "Detva"
+msgstr "Detva"
+
+#: contrib/localflavor/sk/sk_districts.py:21
+msgid "Dolny Kubin"
+msgstr "Dolný Kubín"
+
+#: contrib/localflavor/sk/sk_districts.py:22
+msgid "Dunajska Streda"
+msgstr "Dunajská Streda"
+
+#: contrib/localflavor/sk/sk_districts.py:23
+msgid "Galanta"
+msgstr "Galanta"
+
+#: contrib/localflavor/sk/sk_districts.py:24
+msgid "Gelnica"
+msgstr "Gelnica"
+
+#: contrib/localflavor/sk/sk_districts.py:25
+msgid "Hlohovec"
+msgstr "Hlohovec"
+
+#: contrib/localflavor/sk/sk_districts.py:26
+msgid "Humenne"
+msgstr "Humenné"
+
+#: contrib/localflavor/sk/sk_districts.py:27
+msgid "Ilava"
+msgstr "Ilava"
+
+#: contrib/localflavor/sk/sk_districts.py:28
+msgid "Kezmarok"
+msgstr "Kežmarok"
+
+#: contrib/localflavor/sk/sk_districts.py:29
+msgid "Komarno"
+msgstr "Komarno"
+
+#: contrib/localflavor/sk/sk_districts.py:30
+msgid "Kosice I"
+msgstr "Kosice I"
+
+#: contrib/localflavor/sk/sk_districts.py:31
+msgid "Kosice II"
+msgstr "Kosice II"
+
+#: contrib/localflavor/sk/sk_districts.py:32
+msgid "Kosice III"
+msgstr "Kosice III"
+
+#: contrib/localflavor/sk/sk_districts.py:33
+msgid "Kosice IV"
+msgstr "Kosice IV"
+
+#: contrib/localflavor/sk/sk_districts.py:34
+msgid "Kosice - okolie"
+msgstr "Kosice - okolie"
+
+#: contrib/localflavor/sk/sk_districts.py:35
+msgid "Krupina"
+msgstr "Krupina"
+
+#: contrib/localflavor/sk/sk_districts.py:36
+msgid "Kysucke Nove Mesto"
+msgstr "Kysucké Nové Mesto"
+
+#: contrib/localflavor/sk/sk_districts.py:37
+msgid "Levice"
+msgstr "Levice"
+
+#: contrib/localflavor/sk/sk_districts.py:38
+msgid "Levoca"
+msgstr "Levoča"
+
+#: contrib/localflavor/sk/sk_districts.py:39
+msgid "Liptovsky Mikulas"
+msgstr "Liptovský Mikuláš"
+
+#: contrib/localflavor/sk/sk_districts.py:40
+msgid "Lucenec"
+msgstr "Lučenec"
+
+#: contrib/localflavor/sk/sk_districts.py:41
+msgid "Malacky"
+msgstr "Malacky"
+
+#: contrib/localflavor/sk/sk_districts.py:42
+msgid "Martin"
+msgstr "Martin"
+
+#: contrib/localflavor/sk/sk_districts.py:43
+msgid "Medzilaborce"
+msgstr "Medzilaborce"
+
+#: contrib/localflavor/sk/sk_districts.py:44
+msgid "Michalovce"
+msgstr "Michalovce"
+
+#: contrib/localflavor/sk/sk_districts.py:45
+msgid "Myjava"
+msgstr "Myjava"
+
+#: contrib/localflavor/sk/sk_districts.py:46
+msgid "Namestovo"
+msgstr "Námestovo"
+
+#: contrib/localflavor/sk/sk_districts.py:47
+msgid "Nitra"
+msgstr "Nitra"
+
+#: contrib/localflavor/sk/sk_districts.py:48
+msgid "Nove Mesto nad Vahom"
+msgstr "Nové Mesto nad Váhom"
+
+#: contrib/localflavor/sk/sk_districts.py:49
+msgid "Nove Zamky"
+msgstr "Nové Zámky"
+
+#: contrib/localflavor/sk/sk_districts.py:50
+msgid "Partizanske"
+msgstr "Partizánske"
+
+#: contrib/localflavor/sk/sk_districts.py:51
+msgid "Pezinok"
+msgstr "Pezinok"
+
+#: contrib/localflavor/sk/sk_districts.py:52
+msgid "Piestany"
+msgstr "Piešťany"
+
+#: contrib/localflavor/sk/sk_districts.py:53
+msgid "Poltar"
+msgstr "Poltár"
+
+#: contrib/localflavor/sk/sk_districts.py:54
+msgid "Poprad"
+msgstr "Poprad"
+
+#: contrib/localflavor/sk/sk_districts.py:55
+msgid "Povazska Bystrica"
+msgstr "Považská Bystrica"
+
+#: contrib/localflavor/sk/sk_districts.py:56
+msgid "Presov"
+msgstr "Prešov"
+
+#: contrib/localflavor/sk/sk_districts.py:57
+msgid "Prievidza"
+msgstr "Prievidza"
+
+#: contrib/localflavor/sk/sk_districts.py:58
+msgid "Puchov"
+msgstr "Púchov"
+
+#: contrib/localflavor/sk/sk_districts.py:59
+msgid "Revuca"
+msgstr "Revúca"
+
+#: contrib/localflavor/sk/sk_districts.py:60
+msgid "Rimavska Sobota"
+msgstr "Rimavska Sobota"
+
+#: contrib/localflavor/sk/sk_districts.py:61
+msgid "Roznava"
+msgstr "Rožňava"
+
+#: contrib/localflavor/sk/sk_districts.py:62
+msgid "Ruzomberok"
+msgstr "Ružomberok"
+
+#: contrib/localflavor/sk/sk_districts.py:63
+msgid "Sabinov"
+msgstr "Sabinov"
+
+#: contrib/localflavor/sk/sk_districts.py:64
+msgid "Senec"
+msgstr "Senec"
+
+#: contrib/localflavor/sk/sk_districts.py:65
+msgid "Senica"
+msgstr "Senica"
+
+#: contrib/localflavor/sk/sk_districts.py:66
+msgid "Skalica"
+msgstr "Skalica"
+
+#: contrib/localflavor/sk/sk_districts.py:67
+msgid "Snina"
+msgstr "Snina"
+
+#: contrib/localflavor/sk/sk_districts.py:68
+msgid "Sobrance"
+msgstr "Sobrance"
+
+#: contrib/localflavor/sk/sk_districts.py:69
+msgid "Spisska Nova Ves"
+msgstr "Spišská Nová Ves"
+
+#: contrib/localflavor/sk/sk_districts.py:70
+msgid "Stara Lubovna"
+msgstr "Stará Ľubovňa"
+
+#: contrib/localflavor/sk/sk_districts.py:71
+msgid "Stropkov"
+msgstr "Stropkov"
+
+#: contrib/localflavor/sk/sk_districts.py:72
+msgid "Svidnik"
+msgstr "Svidník"
+
+#: contrib/localflavor/sk/sk_districts.py:73
+msgid "Sala"
+msgstr "Sala"
+
+#: contrib/localflavor/sk/sk_districts.py:74
+msgid "Topolcany"
+msgstr "Topoľčany"
+
+#: contrib/localflavor/sk/sk_districts.py:75
+msgid "Trebisov"
+msgstr "Trebišov"
+
+#: contrib/localflavor/sk/sk_districts.py:76
+msgid "Trencin"
+msgstr "Trenčín"
+
+#: contrib/localflavor/sk/sk_districts.py:77
+msgid "Trnava"
+msgstr "Trnava"
+
+#: contrib/localflavor/sk/sk_districts.py:78
+msgid "Turcianske Teplice"
+msgstr "Turčianske Teplice"
+
+#: contrib/localflavor/sk/sk_districts.py:79
+msgid "Tvrdosin"
+msgstr "Tvrdošín"
+
+#: contrib/localflavor/sk/sk_districts.py:80
+msgid "Velky Krtis"
+msgstr "Veľký Krtíš"
+
+#: contrib/localflavor/sk/sk_districts.py:81
+msgid "Vranov nad Toplou"
+msgstr "Vranov nad Topľou"
+
+#: contrib/localflavor/sk/sk_districts.py:82
+msgid "Zlate Moravce"
+msgstr "Zlate Moravce"
+
+#: contrib/localflavor/sk/sk_districts.py:83
+msgid "Zvolen"
+msgstr "Zvolen"
+
+#: contrib/localflavor/sk/sk_districts.py:84
+msgid "Zarnovica"
+msgstr "Žarnovica"
+
+#: contrib/localflavor/sk/sk_districts.py:85
+msgid "Ziar nad Hronom"
+msgstr "Žiar nad Hronom"
+
+#: contrib/localflavor/sk/sk_districts.py:86
+msgid "Zilina"
+msgstr "Žilina"
+
+#: contrib/localflavor/sk/sk_regions.py:8
+msgid "Banska Bystrica region"
+msgstr "Banská Bystrica Region"
+
+#: contrib/localflavor/sk/sk_regions.py:9
+msgid "Bratislava region"
+msgstr "Bratislavský kraj"
+
+#: contrib/localflavor/sk/sk_regions.py:10
+msgid "Kosice region"
+msgstr "Kosice"
+
+#: contrib/localflavor/sk/sk_regions.py:11
+msgid "Nitra region"
+msgstr "Nitra"
+
+#: contrib/localflavor/sk/sk_regions.py:12
+msgid "Presov region"
+msgstr "Prešov"
+
+#: contrib/localflavor/sk/sk_regions.py:13
+msgid "Trencin region"
+msgstr "Trenčín"
+
+#: contrib/localflavor/sk/sk_regions.py:14
+msgid "Trnava region"
+msgstr "Trnava"
+
+#: contrib/localflavor/sk/sk_regions.py:15
+msgid "Zilina region"
+msgstr "Žilina"
+
+#: contrib/localflavor/uk/forms.py:21
+msgid "Enter a valid postcode."
+msgstr "Bitte eine gültige Postleitzahl eingeben."
+
+#: contrib/localflavor/uk/uk_regions.py:11
+msgid "Bedfordshire"
+msgstr "Bedfordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:12
+msgid "Buckinghamshire"
+msgstr "Buckinghamshire"
+
+#: contrib/localflavor/uk/uk_regions.py:14
+msgid "Cheshire"
+msgstr "Cheshire"
+
+#: contrib/localflavor/uk/uk_regions.py:15
+msgid "Cornwall and Isles of Scilly"
+msgstr "Cornwall and Isles of Scilly"
+
+#: contrib/localflavor/uk/uk_regions.py:16
+msgid "Cumbria"
+msgstr "Cumbria"
+
+#: contrib/localflavor/uk/uk_regions.py:17
+msgid "Derbyshire"
+msgstr "Derbyshire"
+
+#: contrib/localflavor/uk/uk_regions.py:18
+msgid "Devon"
+msgstr "Devon"
+
+#: contrib/localflavor/uk/uk_regions.py:19
+msgid "Dorset"
+msgstr "Dorset"
+
+#: contrib/localflavor/uk/uk_regions.py:20
+msgid "Durham"
+msgstr "Durham"
+
+#: contrib/localflavor/uk/uk_regions.py:21
+msgid "East Sussex"
+msgstr "East Sussex"
+
+#: contrib/localflavor/uk/uk_regions.py:22
+msgid "Essex"
+msgstr "Essex"
+
+#: contrib/localflavor/uk/uk_regions.py:23
+msgid "Gloucestershire"
+msgstr "Gloucestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:24
+msgid "Greater London"
+msgstr "Greater London"
+
+#: contrib/localflavor/uk/uk_regions.py:25
+msgid "Greater Manchester"
+msgstr "Greater Manchester"
+
+#: contrib/localflavor/uk/uk_regions.py:26
+msgid "Hampshire"
+msgstr "Hampshire"
+
+#: contrib/localflavor/uk/uk_regions.py:27
+msgid "Hertfordshire"
+msgstr "Hertfordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:28
+msgid "Kent"
+msgstr "Kent"
+
+#: contrib/localflavor/uk/uk_regions.py:29
+msgid "Lancashire"
+msgstr "Lancashire"
+
+#: contrib/localflavor/uk/uk_regions.py:30
+msgid "Leicestershire"
+msgstr "Leicestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:31
+msgid "Lincolnshire"
+msgstr "Lincolnshire"
+
+#: contrib/localflavor/uk/uk_regions.py:32
+msgid "Merseyside"
+msgstr "Merseyside"
+
+#: contrib/localflavor/uk/uk_regions.py:33
+msgid "Norfolk"
+msgstr "Norfolk"
+
+#: contrib/localflavor/uk/uk_regions.py:34
+msgid "North Yorkshire"
+msgstr "North Yorkshire"
+
+#: contrib/localflavor/uk/uk_regions.py:35
+msgid "Northamptonshire"
+msgstr "Northamptonshire"
+
+#: contrib/localflavor/uk/uk_regions.py:36
+msgid "Northumberland"
+msgstr "Northumberland"
+
+#: contrib/localflavor/uk/uk_regions.py:37
+msgid "Nottinghamshire"
+msgstr "Nottinghamshire"
+
+#: contrib/localflavor/uk/uk_regions.py:38
+msgid "Oxfordshire"
+msgstr "Oxfordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:39
+msgid "Shropshire"
+msgstr "Shropshire"
+
+#: contrib/localflavor/uk/uk_regions.py:40
+msgid "Somerset"
+msgstr "Somerset"
+
+#: contrib/localflavor/uk/uk_regions.py:41
+msgid "South Yorkshire"
+msgstr "South Yorkshire"
+
+#: contrib/localflavor/uk/uk_regions.py:42
+msgid "Staffordshire"
+msgstr "Staffordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:43
+msgid "Suffolk"
+msgstr "Suffolk"
+
+#: contrib/localflavor/uk/uk_regions.py:44
+msgid "Surrey"
+msgstr "Surrey"
+
+#: contrib/localflavor/uk/uk_regions.py:45
+msgid "Tyne and Wear"
+msgstr "Tyne and Wear"
+
+#: contrib/localflavor/uk/uk_regions.py:46
+msgid "Warwickshire"
+msgstr "Warwickshire"
+
+#: contrib/localflavor/uk/uk_regions.py:47
+msgid "West Midlands"
+msgstr "West Midlands"
+
+#: contrib/localflavor/uk/uk_regions.py:48
+msgid "West Sussex"
+msgstr "West Sussex"
+
+#: contrib/localflavor/uk/uk_regions.py:49
+msgid "West Yorkshire"
+msgstr "West Yorkshire"
+
+#: contrib/localflavor/uk/uk_regions.py:50
+msgid "Wiltshire"
+msgstr "Wiltshire"
+
+#: contrib/localflavor/uk/uk_regions.py:51
+msgid "Worcestershire"
+msgstr "Worcestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:55
+msgid "County Antrim"
+msgstr "County Antrim"
+
+#: contrib/localflavor/uk/uk_regions.py:56
+msgid "County Armagh"
+msgstr "County Armagh"
+
+#: contrib/localflavor/uk/uk_regions.py:57
+msgid "County Down"
+msgstr "County Down"
+
+#: contrib/localflavor/uk/uk_regions.py:58
+msgid "County Fermanagh"
+msgstr "County Fermanagh"
+
+#: contrib/localflavor/uk/uk_regions.py:59
+msgid "County Londonderry"
+msgstr "County Londonderry"
+
+#: contrib/localflavor/uk/uk_regions.py:60
+msgid "County Tyrone"
+msgstr "County Tyrone"
+
+#: contrib/localflavor/uk/uk_regions.py:64
+msgid "Clwyd"
+msgstr "Clwyd"
+
+#: contrib/localflavor/uk/uk_regions.py:65
+msgid "Dyfed"
+msgstr "Dyfed"
+
+#: contrib/localflavor/uk/uk_regions.py:66
+msgid "Gwent"
+msgstr "Gwent"
+
+#: contrib/localflavor/uk/uk_regions.py:67
+msgid "Gwynedd"
+msgstr "Gwynedd"
+
+#: contrib/localflavor/uk/uk_regions.py:68
+msgid "Mid Glamorgan"
+msgstr "Mid Glamorgan"
+
+#: contrib/localflavor/uk/uk_regions.py:69
+msgid "Powys"
+msgstr "Powys"
+
+#: contrib/localflavor/uk/uk_regions.py:70
+msgid "South Glamorgan"
+msgstr "South Glamorgan"
+
+#: contrib/localflavor/uk/uk_regions.py:71
+msgid "West Glamorgan"
+msgstr "West Glamorgan"
+
+#: contrib/localflavor/uk/uk_regions.py:75
+msgid "Borders"
+msgstr "Borders"
+
+#: contrib/localflavor/uk/uk_regions.py:76
+msgid "Central Scotland"
+msgstr "Central Scotland"
+
+#: contrib/localflavor/uk/uk_regions.py:77
+msgid "Dumfries and Galloway"
+msgstr "Dumfries and Galloway"
+
+#: contrib/localflavor/uk/uk_regions.py:78
+msgid "Fife"
+msgstr "Fife"
+
+#: contrib/localflavor/uk/uk_regions.py:79
+msgid "Grampian"
+msgstr "Grampian"
+
+#: contrib/localflavor/uk/uk_regions.py:80
+msgid "Highland"
+msgstr "Highland"
+
+#: contrib/localflavor/uk/uk_regions.py:81
+msgid "Lothian"
+msgstr "Lothian"
+
+#: contrib/localflavor/uk/uk_regions.py:82
+msgid "Orkney Islands"
+msgstr "Orkney Islands"
+
+#: contrib/localflavor/uk/uk_regions.py:83
+msgid "Shetland Islands"
+msgstr "Shetland Islands"
+
+#: contrib/localflavor/uk/uk_regions.py:84
+msgid "Strathclyde"
+msgstr "Strathclyde"
+
+#: contrib/localflavor/uk/uk_regions.py:85
+msgid "Tayside"
+msgstr "Tayside"
+
+#: contrib/localflavor/uk/uk_regions.py:86
+msgid "Western Isles"
+msgstr "Western Isles"
+
+#: contrib/localflavor/uk/uk_regions.py:90
+msgid "England"
+msgstr "England"
+
+#: contrib/localflavor/uk/uk_regions.py:91
+msgid "Northern Ireland"
+msgstr "Nordirland"
+
+#: contrib/localflavor/uk/uk_regions.py:92
+msgid "Scotland"
+msgstr "Schottland"
+
+#: contrib/localflavor/uk/uk_regions.py:93
+msgid "Wales"
+msgstr "Wales"
+
+#: contrib/localflavor/us/forms.py:16
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr ""
+"Bitte eine gültige Postleitzahl im Format XXXXX oder XXXXX-XXXX eingeben."
+
+#: contrib/localflavor/us/forms.py:54
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr ""
+"Bitte eine gültige US-amerikanische Sozialversicherungsnummer im Format XXX-"
+"XX-XXXX eingeben."
+
+#: contrib/localflavor/za/forms.py:20
+msgid "Enter a valid South African ID number"
+msgstr "Bitte eine gültige südafrikanische Identifikationsnummer eingeben."
+
+#: contrib/localflavor/za/forms.py:54
+msgid "Enter a valid South African postal code"
+msgstr "Bitte eine gültige südafrikanische Postleitzahl eingeben."
+
+#: contrib/localflavor/za/za_provinces.py:4
+msgid "Eastern Cape"
+msgstr "Ostkap"
+
+#: contrib/localflavor/za/za_provinces.py:5
+msgid "Free State"
+msgstr "Freistaat"
+
+#: contrib/localflavor/za/za_provinces.py:6
+msgid "Gauteng"
+msgstr "Gauteng"
+
+#: contrib/localflavor/za/za_provinces.py:7
+msgid "KwaZulu-Natal"
+msgstr "KwaZulu-Natal"
+
+#: contrib/localflavor/za/za_provinces.py:8
+msgid "Limpopo"
+msgstr "Limpopo"
+
+#: contrib/localflavor/za/za_provinces.py:9
+msgid "Mpumalanga"
+msgstr "Mpumalanga"
+
+#: contrib/localflavor/za/za_provinces.py:10
+msgid "Northern Cape"
+msgstr "Nordkap"
+
+#: contrib/localflavor/za/za_provinces.py:11
+msgid "North West"
+msgstr "Nordwest"
+
+#: contrib/localflavor/za/za_provinces.py:12
+msgid "Western Cape"
+msgstr "Westkap"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "Umleitung von"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Hier sollte ein absoluter Pfad stehen, ohne den Domainnamen. Beispiel: '/"
+"events/search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "Umleitung nach"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Hier muss entweder ein absoluter Pfad oder eine komplette URL mit http:// am "
+"Anfang stehen."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "Umleitung"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "Umleitungen"
+
+#: contrib/sessions/models.py:45
+msgid "session key"
+msgstr "Sitzungs-ID"
+
+#: contrib/sessions/models.py:47
+msgid "session data"
+msgstr "Sitzungsdaten"
+
+#: contrib/sessions/models.py:48
+msgid "expire date"
+msgstr "Verfallsdatum"
+
+#: contrib/sessions/models.py:53
+msgid "session"
+msgstr "Sitzung"
+
+#: contrib/sessions/models.py:54
+msgid "sessions"
+msgstr "Sitzungen"
+
+#: contrib/sites/models.py:32
+msgid "domain name"
+msgstr "Domainname"
+
+#: contrib/sites/models.py:33
+msgid "display name"
+msgstr "Anzeigename"
+
+#: contrib/sites/models.py:39
+msgid "sites"
+msgstr "Websites"
+
+#: core/validators.py:80
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr ""
+"Dieser Wert darf nur Buchstaben, Ziffern, Unterstriche und Bindestriche "
+"enthalten."
+
+#: core/validators.py:84
+msgid "Uppercase letters are not allowed here."
+msgstr "Großbuchstaben sind hier nicht erlaubt."
+
+#: core/validators.py:88
+msgid "Lowercase letters are not allowed here."
+msgstr "Kleinbuchstaben sind hier nicht erlaubt."
+
+#: core/validators.py:95
+msgid "Enter only digits separated by commas."
+msgstr "Hier sind nur durch Komma getrennte Ziffern erlaubt."
+
+#: core/validators.py:107
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Bitte mit Komma getrennte, gültige E-Mail-Adressen eingeben."
+
+#: core/validators.py:111
+msgid "Please enter a valid IP address."
+msgstr "Bitte eine gültige IP-Adresse eingeben."
+
+#: core/validators.py:115
+msgid "Empty values are not allowed here."
+msgstr "Dieses Feld darf nicht leer sein."
+
+#: core/validators.py:119
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Nichtnumerische Zeichen sind hier nicht erlaubt."
+
+#: core/validators.py:123
+msgid "This value can't be comprised solely of digits."
+msgstr "Dieser Wert darf nicht nur aus Ziffern bestehen."
+
+#: core/validators.py:128 forms/fields.py:161
+msgid "Enter a whole number."
+msgstr "Bitte eine ganze Zahl eingeben."
+
+#: core/validators.py:132
+msgid "Only alphabetical characters are allowed here."
+msgstr "Nur alphabetische Zeichen sind hier erlaubt."
+
+#: core/validators.py:147
+#, python-format
+msgid "Invalid date: %s"
+msgstr "Ungültiges Datum: %s"
+
+#: core/validators.py:152 db/models/fields/__init__.py:546
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Bitte ein gültiges Datum im Format JJJJ-MM-TT eingeben."
+
+#: core/validators.py:157
+msgid "Enter a valid time in HH:MM format."
+msgstr "Bitte eine gültige Zeit im Format SS:MM eingeben."
+
+#: core/validators.py:161
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr ""
+"Bitte eine gültige Datums- und Zeitangabe im Format JJJJ-MM-TT SS:MM "
+"eingeben."
+
+#: core/validators.py:166 forms/fields.py:423
+msgid "Enter a valid e-mail address."
+msgstr "Bitte eine gültige E-Mail-Adresse eingeben."
+
+#: core/validators.py:178 core/validators.py:470 forms/fields.py:441
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+"Es wurde keine Datei übermittelt. Überprüfen Sie das Encoding des Formulars."
+
+#: core/validators.py:189 forms/fields.py:472
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Bitte ein Bild hochladen. Die hochgeladene Datei ist kein Bild, oder ist "
+"defekt."
+
+#: core/validators.py:196
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "Die URL %s zeigt nicht auf ein gültiges Bild."
+
+#: core/validators.py:200
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Telefonnummern müssen das Format XXX-XXX-XXXX haben. \"%s\" ist ungültig."
+
+#: core/validators.py:208
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "Die URL %s zeigt nicht auf ein gültiges QuickTime-Video."
+
+#: core/validators.py:212
+msgid "A valid URL is required."
+msgstr "Eine gültige URL ist erforderlich."
+
+#: core/validators.py:226
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Bitte gültiges HTML eingeben. Fehler sind:\n"
+"%s"
+
+#: core/validators.py:233
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Ungültiges XML: %s"
+
+#: core/validators.py:250
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Ungültige URL: %s"
+
+#: core/validators.py:255 core/validators.py:257
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "Die URL %s funktioniert nicht."
+
+#: core/validators.py:263
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Bitte eine gültige Abkürzung für einen US-Staat eingeben."
+
+#: core/validators.py:277
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Keine Schimpfworte! Das Wort %s ist hier nicht gern gesehen!"
+msgstr[1] "Keine Schimpfworte! Die Wörter %s sind hier nicht gern gesehen!"
+
+#: core/validators.py:284
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Dieses Feld muss zum Feld '%s' passen."
+
+#: core/validators.py:303
+msgid "Please enter something for at least one field."
+msgstr "Bitte mindestens eines der Felder ausfüllen."
+
+#: core/validators.py:312 core/validators.py:323
+msgid "Please enter both fields or leave them both empty."
+msgstr "Bitte entweder beide Felder ausfüllen, oder beide leer lassen."
+
+#: core/validators.py:331
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr ""
+"Dieses Feld muss gefüllt sein, wenn Feld %(field)s den Wert %(value)s hat."
+
+#: core/validators.py:344
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr ""
+"Dieses Feld muss gefüllt sein, wenn Feld %(field)s nicht %(value)s ist."
+
+#: core/validators.py:363
+msgid "Duplicate values are not allowed."
+msgstr "Doppelte Werte sind hier nicht erlaubt."
+
+#: core/validators.py:378
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Dieser Wert muss zwischen %(lower)s und %(upper)s sein."
+
+#: core/validators.py:380
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Dieser Wert muss mindestens %s sein."
+
+#: core/validators.py:382
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Dieser Wert darf maximal %s sein."
+
+#: core/validators.py:423
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Dieser Wert muss eine Potenz von %s sein."
+
+#: core/validators.py:433
+msgid "Please enter a valid decimal number."
+msgstr "Bitte eine gültige Dezimalzahl eingeben."
+
+#: core/validators.py:440
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Bitte eine gültige Dezimalzahl mit maximal %s Ziffer eingeben."
+msgstr[1] "Bitte eine gültige Dezimalzahl mit maximal %s Ziffern eingeben."
+
+#: core/validators.py:443
+#, python-format
+msgid ""
+"Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural ""
+"Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] ""
+"Bitte eine gültige Dezimalzahl mit einer Gesamtzahl von maximal %s Ziffer "
+"eingeben."
+msgstr[1] ""
+"Bitte eine gültige Dezimalzahl mit einer Gesamtzahl von maximal %s Ziffern "
+"eingeben."
+
+#: core/validators.py:446
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] ""
+"Bitte eine gültige Dezimalzahl mit maximal %s Dezimalstelle eingeben."
+msgstr[1] ""
+"Bitte eine gültige Dezimalzahl mit maximal %s Dezimalstellen eingeben."
+
+#: core/validators.py:454
+msgid "Please enter a valid floating point number."
+msgstr "Bitte eine gültige Gleitkommazahl eingeben."
+
+#: core/validators.py:463
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr ""
+"Bitte sicherstellen, dass die hochgeladene Datei mindestens %s Bytes groß "
+"ist."
+
+#: core/validators.py:464
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr ""
+"Bitte sicherstellen, dass die hochgeladene Datei maximal %s Bytes groß ist."
+
+#: core/validators.py:481
+msgid "The format for this field is wrong."
+msgstr "Das Format für dieses Feld ist falsch."
+
+#: core/validators.py:496
+msgid "This field is invalid."
+msgstr "Dieses Feld ist ungültig."
+
+#: core/validators.py:532
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Konnte nichts von %s empfangen."
+
+#: core/validators.py:535
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "Die URL %(url)s lieferte den falschen Content-Type '%(contenttype)s'."
+
+#: core/validators.py:568
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Bitte das ungeschlossene %(tag)s Tag in Zeile %(line)s schließen. Die Zeile "
+"beginnt mit \"%(start)s\"."
+
+#: core/validators.py:572
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"In Zeile %(line)s ist Text, der nicht in dem Kontext erlaubt ist. Die Zeile "
+"beginnt mit \"%(start)s\"."
+
+#: core/validators.py:577
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"Das Attribute %(attr)s in Zeile %(line)s ist ungültig. Die Zeile beginnt mit "
+"\"%(start)s\"."
+
+#: core/validators.py:582
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"<%(tag)s> in Zeile %(line)s ist ungültig. Die Zeile beginnt mit \"%(start)s"
+"\"."
+
+#: core/validators.py:586
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Ein Tag in Zeile %(line)s hat eines oder mehrere Pflichtattribute nicht. Die "
+"Zeile beginnt mit \"%(start)s\"."
+
+#: core/validators.py:591
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Das Attribut %(attr)s in Zeile %(line)s hat einen ungültigen Wert. Die Zeile "
+"beginnt mit \"%(start)s\"."
+
+#: db/models/manipulators.py:304
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr ""
+"Ein '%(object)s' in dieser '%(type)s' existiert bereits für dieses '%(field)"
+"s'."
+
+#: db/models/fields/__init__.py:46
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "Ein '%(optname)s' mit diesem '%(fieldname)s' existiert bereits."
+
+#: db/models/fields/__init__.py:320 db/models/fields/files.py:168
+#: db/models/fields/files.py:179 forms/fields.py:52 oldforms/__init__.py:370
+msgid "This field is required."
+msgstr "Dieses Feld ist zwingend erforderlich."
+
+#: db/models/fields/__init__.py:434
+msgid "This value must be an integer."
+msgstr "Dieser Wert muss eine Ganzzahl sein."
+
+#: db/models/fields/__init__.py:480
+msgid "This value must be either True or False."
+msgstr "Dieser Wert muss wahr oder falsch sein."
+
+#: db/models/fields/__init__.py:509
+msgid "This field cannot be null."
+msgstr "Dieses Feld darf nicht leer sein."
+
+#: db/models/fields/__init__.py:611 db/models/fields/__init__.py:628
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format."
+msgstr ""
+"Bitte eine gültige Datums- und Zeitangabe im Format JJJJ-MM-TT SS:MM[ss[."
+"uuuuuu]] eingeben."
+
+#: db/models/fields/__init__.py:684
+msgid "This value must be a decimal number."
+msgstr "Dieser Wert muss eine Dezimalzahl sein."
+
+#: db/models/fields/__init__.py:825
+msgid "This value must be either None, True or False."
+msgstr "Dieser Wert muss None, True oder False sein."
+
+#: db/models/fields/__init__.py:895
+msgid ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+msgstr ""
+"Bitte ein gültiges Kürzel, bestehend aus Buchstaben, Ziffern, "
+"Unterstrichen und Bindestrichen, eingeben."
+
+#: db/models/fields/__init__.py:944 db/models/fields/__init__.py:957
+msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format."
+msgstr "Bitte eine gültige Zeit im Format HH:MM[:ss[.uuuuuu]] eingeben."
+
+#: db/models/fields/files.py:188
+msgid "Enter a valid filename."
+msgstr "Bitte einen gültigen Dateinamen eingeben."
+
+#: db/models/fields/related.py:92
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Bitte ein gültiges '%s' eingeben."
+
+#: db/models/fields/related.py:786
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Um mehr als eine Selektion zu treffen, \"Strg\", oder auf dem Mac \"Command"
+"\", beim Klicken gedrückt halten."
+
+#: db/models/fields/related.py:866
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+"Bitte gültige IDs für %(self)s eingeben. Der Wert %(value)r ist ungültig."
+msgstr[1] ""
+"Bitte gültige IDs für %(self)s eingeben. Die Werte %(value)r sind ungültig."
+
+#: forms/fields.py:53
+msgid "Enter a valid value."
+msgstr "Bitte einen gültigen Wert eingeben."
+
+#: forms/fields.py:133
+#, python-format
+msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+msgstr ""
+"Bitte sicherstellen, dass der Text maximal %(max)d Zeichen hat. (Er hat %"
+"(length)d)."
+
+#: forms/fields.py:134
+#, python-format
+msgid "Ensure this value has at least %(min)d characters (it has %(length)d)."
+msgstr ""
+"Bitte sicherstellen, dass der Text wenigstens %(min)d Zeichen hat. (Er hat %"
+"(length)d.)"
+
+#: forms/fields.py:162 forms/fields.py:191 forms/fields.py:220
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Dieser Wert darf maximal %s sein."
+
+#: forms/fields.py:163 forms/fields.py:192 forms/fields.py:221
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Dieser Wert muss größer oder gleich %s sein."
+
+#: forms/fields.py:190 forms/fields.py:219
+msgid "Enter a number."
+msgstr "Bitte eine Zahl eingeben."
+
+#: forms/fields.py:222
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr "Bitte geben Sie nicht mehr als insgesamt %s Ziffern ein."
+
+#: forms/fields.py:223
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr "Bitte geben Sie nicht mehr als %s Dezimalstellen ein."
+
+#: forms/fields.py:224
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr "Bitte geben Sie nicht mehr als %s Ziffern vor dem Komma ein."
+
+#: forms/fields.py:282 forms/fields.py:804
+msgid "Enter a valid date."
+msgstr "Bitte ein gültiges Datum eingeben."
+
+#: forms/fields.py:316 forms/fields.py:805
+msgid "Enter a valid time."
+msgstr "Bitte eine gültige Uhrzeit eingeben."
+
+#: forms/fields.py:355
+msgid "Enter a valid date/time."
+msgstr "Bitte ein gültiges Datum und Uhrzeit eingeben."
+
+#: forms/fields.py:442
+msgid "No file was submitted."
+msgstr "Es wurde keine Datei übertragen."
+
+#: forms/fields.py:443 oldforms/__init__.py:689
+msgid "The submitted file is empty."
+msgstr "Die ausgewählte Datei ist leer."
+
+#: forms/fields.py:533
+msgid "Enter a valid URL."
+msgstr "Bitte eine gültige Adresse eingeben."
+
+#: forms/fields.py:534
+msgid "This URL appears to be a broken link."
+msgstr "Diese Adresse scheint nicht gültig zu sein."
+
+#: forms/fields.py:602 forms/fields.py:653
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr ""
+"Bitte eine gültige Auswahl treffen. %(value)s ist keine gültige Auswahl."
+
+#: forms/fields.py:654 forms/fields.py:715 forms/models.py:529
+msgid "Enter a list of values."
+msgstr "Bitte eine Liste mit Werten eingeben."
+
+#: forms/fields.py:833
+msgid "Enter a valid IPv4 address."
+msgstr "Bitte eine gültige IPv4-Adresse eingeben."
+
+#: forms/models.py:461
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Bitte eine gültige Auswahl treffen."
+
+#: forms/models.py:530
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Bitte eine gültige Auswahl treffen. %s ist keine gültige Auswahl."
+
+#: oldforms/__init__.py:405
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Bitte sicherstellen, dass der Text weniger als %s Zeichen hat."
+msgstr[1] "Bitte sicherstellen, dass der Text weniger als %s Zeichen hat."
+
+#: oldforms/__init__.py:410
+msgid "Line breaks are not allowed here."
+msgstr "Zeilenumbrüche sind hier nicht erlaubt."
+
+#: oldforms/__init__.py:508 oldforms/__init__.py:582 oldforms/__init__.py:621
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr ""
+"Bitte eine gültige Auswahl treffen; '%(data)s' ist nicht in %(choices)s."
+
+#: oldforms/__init__.py:750
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Bitte eine ganze Zahl zwischen -32.768 und 32.767 eingeben."
+
+#: oldforms/__init__.py:760
+msgid "Enter a positive number."
+msgstr "Bitte eine ganze, positive Zahl eingeben."
+
+#: oldforms/__init__.py:770
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Bitte eine ganze Zahl zwischen 0 und 32.767 eingeben."
+
+#: template/defaultfilters.py:698
+msgid "yes,no,maybe"
+msgstr "Ja,Nein,Vielleicht"
+
+#: template/defaultfilters.py:729
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d Byte"
+msgstr[1] "%(size)d Bytes"
+
+#: template/defaultfilters.py:731
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f KB"
+
+#: template/defaultfilters.py:733
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: template/defaultfilters.py:734
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#: utils/dateformat.py:41
+msgid "p.m."
+msgstr "nachm."
+
+#: utils/dateformat.py:42
+msgid "a.m."
+msgstr "vorm."
+
+#: utils/dateformat.py:47
+msgid "PM"
+msgstr "nachm."
+
+#: utils/dateformat.py:48
+msgid "AM"
+msgstr "vorm."
+
+#: utils/dateformat.py:97
+msgid "midnight"
+msgstr "Mitternacht"
+
+#: utils/dateformat.py:99
+msgid "noon"
+msgstr "Mittag"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Montag"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Dienstag"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Mittwoch"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Donnerstag"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Freitag"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Samstag"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Sonntag"
+
+#: utils/dates.py:10
+msgid "Mon"
+msgstr "Mo"
+
+#: utils/dates.py:10
+msgid "Tue"
+msgstr "Di"
+
+#: utils/dates.py:10
+msgid "Wed"
+msgstr "Mi"
+
+#: utils/dates.py:10
+msgid "Thu"
+msgstr "Do"
+
+#: utils/dates.py:10
+msgid "Fri"
+msgstr "Fr"
+
+#: utils/dates.py:11
+msgid "Sat"
+msgstr "Sa"
+
+#: utils/dates.py:11
+msgid "Sun"
+msgstr "So"
+
+#: utils/dates.py:18
+msgid "January"
+msgstr "Januar"
+
+#: utils/dates.py:18
+msgid "February"
+msgstr "Februar"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "March"
+msgstr "März"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "April"
+msgstr "April"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "May"
+msgstr "Mai"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "June"
+msgstr "Juni"
+
+#: utils/dates.py:19 utils/dates.py:31
+msgid "July"
+msgstr "Juli"
+
+#: utils/dates.py:19
+msgid "August"
+msgstr "August"
+
+#: utils/dates.py:19
+msgid "September"
+msgstr "September"
+
+#: utils/dates.py:19
+msgid "October"
+msgstr "Oktober"
+
+#: utils/dates.py:19
+msgid "November"
+msgstr "November"
+
+#: utils/dates.py:20
+msgid "December"
+msgstr "Dezember"
+
+#: utils/dates.py:23
+msgid "jan"
+msgstr "Jan"
+
+#: utils/dates.py:23
+msgid "feb"
+msgstr "Feb"
+
+#: utils/dates.py:23
+msgid "mar"
+msgstr "Mär"
+
+#: utils/dates.py:23
+msgid "apr"
+msgstr "Apr"
+
+#: utils/dates.py:23
+msgid "may"
+msgstr "Mai"
+
+#: utils/dates.py:23
+msgid "jun"
+msgstr "Jun"
+
+#: utils/dates.py:24
+msgid "jul"
+msgstr "Jul"
+
+#: utils/dates.py:24
+msgid "aug"
+msgstr "Aug"
+
+#: utils/dates.py:24
+msgid "sep"
+msgstr "Sep"
+
+#: utils/dates.py:24
+msgid "oct"
+msgstr "Okt"
+
+#: utils/dates.py:24
+msgid "nov"
+msgstr "Nov"
+
+#: utils/dates.py:24
+msgid "dec"
+msgstr "Dez"
+
+#: utils/dates.py:31
+msgid "Jan."
+msgstr "Jan."
+
+#: utils/dates.py:31
+msgid "Feb."
+msgstr "Feb."
+
+#: utils/dates.py:32
+msgid "Aug."
+msgstr "Aug."
+
+#: utils/dates.py:32
+msgid "Sept."
+msgstr "Sept."
+
+#: utils/dates.py:32
+msgid "Oct."
+msgstr "Okt."
+
+#: utils/dates.py:32
+msgid "Nov."
+msgstr "Nov."
+
+#: utils/dates.py:32
+msgid "Dec."
+msgstr "Dez."
+
+#: utils/text.py:128
+msgid "or"
+msgstr "oder"
+
+#: utils/timesince.py:21
+msgid "year"
+msgid_plural "years"
+msgstr[0] "Jahr"
+msgstr[1] "Jahre"
+
+#: utils/timesince.py:22
+msgid "month"
+msgid_plural "months"
+msgstr[0] "Monat"
+msgstr[1] "Monate"
+
+#: utils/timesince.py:23
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "Woche"
+msgstr[1] "Wochen"
+
+#: utils/timesince.py:24
+msgid "day"
+msgid_plural "days"
+msgstr[0] "Tag"
+msgstr[1] "Tage"
+
+#: utils/timesince.py:25
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "Stunde"
+msgstr[1] "Stunden"
+
+#: utils/timesince.py:26
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "Minute"
+msgstr[1] "Minuten"
+
+#: utils/timesince.py:46
+msgid "minutes"
+msgstr "Minuten"
+
+#: utils/timesince.py:51
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr "%(number)d %(type)s"
+
+#: utils/timesince.py:57
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ", %(number)d %(type)s"
+
+#: utils/translation/trans_real.py:401
+msgid "DATE_FORMAT"
+msgstr "j. N Y"
+
+#: utils/translation/trans_real.py:403
+msgid "TIME_FORMAT"
+msgstr "H:i"
+
+#: utils/translation/trans_real.py:419
+msgid "YEAR_MONTH_FORMAT"
+msgstr "F Y"
+
+#: utils/translation/trans_real.py:420
+msgid "MONTH_DAY_FORMAT"
+msgstr "j. F"
+
+#: views/generic/create_update.py:114
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "%(verbose_name)s wurde erfolgreich angelegt."
+
+#: views/generic/create_update.py:156
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "%(verbose_name)s wurde erfolgreich aktualisiert."
+
+#: views/generic/create_update.py:198
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "%(verbose_name)s wurde gelöscht."
diff --git a/webapp/django/conf/locale/de/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/de/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..453b5ef
--- /dev/null
+++ b/webapp/django/conf/locale/de/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/de/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/de/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..7502d22
--- /dev/null
+++ b/webapp/django/conf/locale/de/LC_MESSAGES/djangojs.po
@@ -0,0 +1,119 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-08-15 14:38+0200\n"
+"PO-Revision-Date: 2008-06-23 21:02+0100\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "Verfügbare %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Alles auswählen"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Hinzufügen"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Entfernen"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Ausgewählte %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Auswahl treffen und Klick auf"
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Alles abwählen"
+
+#: contrib/admin/media/js/calendar.js:24
+#: contrib/admin/media/js/dateparse.js:32
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Januar Februar März April Mai Juni Juli August September Oktober November "
+"Dezember"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "S M D M D F S"
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr "Einblenden"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr "Ausblenden"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Now"
+msgstr "Jetzt"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
+msgid "Clock"
+msgstr "Uhr"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
+msgid "Choose a time"
+msgstr "Uhrzeit"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "Midnight"
+msgstr "Mitternacht"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "6 a.m."
+msgstr "6 Uhr"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
+msgid "Noon"
+msgstr "Mittag"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
+msgid "Cancel"
+msgstr "Abbrechen"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
+msgid "Today"
+msgstr "Heute"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
+msgid "Calendar"
+msgstr "Kalender"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
+msgid "Yesterday"
+msgstr "Gestern"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
+msgid "Tomorrow"
+msgstr "Morgen"
diff --git a/webapp/django/conf/locale/el/LC_MESSAGES/django.mo b/webapp/django/conf/locale/el/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..cd60509
--- /dev/null
+++ b/webapp/django/conf/locale/el/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/el/LC_MESSAGES/django.po b/webapp/django/conf/locale/el/LC_MESSAGES/django.po
new file mode 100644
index 0000000..d9793c8
--- /dev/null
+++ b/webapp/django/conf/locale/el/LC_MESSAGES/django.po
@@ -0,0 +1,2766 @@
+# translation of django.po to el
+# Copyright (C) 2006 and beyond
+# This file is distributed under the same license as the DJANGO package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-04-05 01:32+1000\n"
+"PO-Revision-Date: 2007-09-03 04:19+0100\n"
+"Last-Translator: Dimitris Glezos <dimitris@glezos.com>\n"
+"Language-Team: el <fedora-trans-el@redhat.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms:  nplurals=2; plural=(n != 1);\n"
+
+#: db/models/manipulators.py:307
+#, fuzzy, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "αντικείμενο με τύπος για πεδίο."
+
+#: db/models/manipulators.py:308 contrib/admin/views/main.py:335
+#: contrib/admin/views/main.py:337 contrib/admin/views/main.py:339
+msgid "and"
+msgstr "και"
+
+#: db/models/fields/related.py:53
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Παρακαλούμε εισάγετε ένα έγκυρο %s."
+
+#: db/models/fields/related.py:642
+msgid "Separate multiple IDs with commas."
+msgstr "Ξεχωρίστε πολλαπλά ΙD με κόμματα."
+
+#: db/models/fields/related.py:644
+#, fuzzy
+msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "Αναμονή Έλεγχος ή Εντολή ενεργό a επιλογή περισσότερα ένα."
+
+#: db/models/fields/related.py:691
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural "Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+"Παρακαλούμε εισάγετε ένα έγκυρο %(self)s IDs. Η τιμή %(value)r δεν είναι "
+"έγκυρη."
+msgstr[1] ""
+"Παρακαλούμε εισάγετε ένα έγκυρο %(self)s IDs. Οι τιμές %(value)r δεν είναι "
+"έγκυρες."
+
+#: db/models/fields/__init__.py:42
+#, fuzzy, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "με."
+
+#: db/models/fields/__init__.py:117 db/models/fields/__init__.py:274
+#: db/models/fields/__init__.py:610 db/models/fields/__init__.py:621
+#: oldforms/__init__.py:357 newforms/fields.py:80 newforms/fields.py:376
+#: newforms/fields.py:452 newforms/fields.py:463 newforms/models.py:178
+msgid "This field is required."
+msgstr "Αυτό το πεδίο είναι απαραίτητο."
+
+#: db/models/fields/__init__.py:367
+msgid "This value must be an integer."
+msgstr "Αυτή η τιμή πρέπει να είναι ένας ακέραιος."
+
+#: db/models/fields/__init__.py:402
+msgid "This value must be either True or False."
+msgstr "Αυτή η τιμή πρέπει να είναι Αληθές ή Ψευδές."
+
+#: db/models/fields/__init__.py:423
+msgid "This field cannot be null."
+msgstr "Αυτό το πεδίο δεν μπορεί να είναι κενό (null)."
+
+#: db/models/fields/__init__.py:457 core/validators.py:148
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Εισάγετε μία έγκυρη ημερομηνία στη μορφή ΧΧΧΧ-MM-ΗΗ."
+
+#: db/models/fields/__init__.py:526 core/validators.py:157
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Εισάγετε μία έγκυρη ημερομηνία/ώρα στη μορφή ΧΧΧΧ-MM-ΗΗ ΩΩ:ΛΛ."
+
+#: db/models/fields/__init__.py:630
+msgid "Enter a valid filename."
+msgstr "Εισάγετε ένα έγκυρο όνομα αρχείου."
+
+#: db/models/fields/__init__.py:751
+#, fuzzy
+msgid "This value must be either None, True or False."
+msgstr "Αυτή η τιμή πρέπει να είναι Αληθές ή Ψευδές."
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "Αραβικά"
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "Μπενγκάλι"
+
+#: conf/global_settings.py:41
+msgid "Catalan"
+msgstr "Καταλανικά"
+
+#: conf/global_settings.py:42
+msgid "Czech"
+msgstr "Τσέχικα"
+
+#: conf/global_settings.py:43
+msgid "Welsh"
+msgstr "Ουαλικά"
+
+#: conf/global_settings.py:44
+msgid "Danish"
+msgstr "Δανέζικα"
+
+#: conf/global_settings.py:45
+msgid "German"
+msgstr "Γερμανικά"
+
+#: conf/global_settings.py:46
+msgid "Greek"
+msgstr "Ελληνικά"
+
+#: conf/global_settings.py:47
+msgid "English"
+msgstr "Αγγλικά"
+
+#: conf/global_settings.py:48
+msgid "Spanish"
+msgstr "Ισπανικά"
+
+#: conf/global_settings.py:49
+msgid "Argentinean Spanish"
+msgstr "Ισπανικά Αργεντινής"
+
+#: conf/global_settings.py:50
+msgid "Finnish"
+msgstr "Φινλανδικά"
+
+#: conf/global_settings.py:51
+msgid "French"
+msgstr "Γαλλικά"
+
+#: conf/global_settings.py:52
+msgid "Galician"
+msgstr ""
+
+#: conf/global_settings.py:53
+msgid "Hungarian"
+msgstr "Ουγγρικά"
+
+#: conf/global_settings.py:54
+msgid "Hebrew"
+msgstr "Εβραϊκά"
+
+#: conf/global_settings.py:55
+msgid "Icelandic"
+msgstr "Ισλανδικά"
+
+#: conf/global_settings.py:56
+msgid "Italian"
+msgstr "Ιταλικά"
+
+#: conf/global_settings.py:57
+msgid "Japanese"
+msgstr "Γιαπωνέζικα"
+
+#: conf/global_settings.py:58
+msgid "Kannada"
+msgstr ""
+
+#: conf/global_settings.py:59
+msgid "Latvian"
+msgstr ""
+
+#: conf/global_settings.py:60
+msgid "Macedonian"
+msgstr "Μακεδονικά"
+
+#: conf/global_settings.py:61
+msgid "Dutch"
+msgstr "Ολλανδικά"
+
+#: conf/global_settings.py:62
+msgid "Norwegian"
+msgstr "Νορβηγικά"
+
+#: conf/global_settings.py:63
+msgid "Polish"
+msgstr "Πολωνικά"
+
+#: conf/global_settings.py:64
+msgid "Portugese"
+msgstr "Πορτογαλικά"
+
+#: conf/global_settings.py:65
+msgid "Brazilian"
+msgstr "Βραζιλιάνικα"
+
+#: conf/global_settings.py:66
+msgid "Romanian"
+msgstr "Ρουμανικά"
+
+#: conf/global_settings.py:67
+msgid "Russian"
+msgstr "Ρωσικά"
+
+#: conf/global_settings.py:68
+msgid "Slovak"
+msgstr "Σλοβακικά"
+
+#: conf/global_settings.py:69
+msgid "Slovenian"
+msgstr "Σλοβενικά"
+
+#: conf/global_settings.py:70
+msgid "Serbian"
+msgstr "Σερβικά"
+
+#: conf/global_settings.py:71
+msgid "Swedish"
+msgstr "Σουηδικά"
+
+#: conf/global_settings.py:72
+msgid "Tamil"
+msgstr "Ταμιλικά"
+
+#: conf/global_settings.py:73
+msgid "Telugu"
+msgstr ""
+
+#: conf/global_settings.py:74
+msgid "Turkish"
+msgstr "Τουρκικά"
+
+#: conf/global_settings.py:75
+msgid "Ukrainian"
+msgstr "Ουκρανικά"
+
+#: conf/global_settings.py:76
+msgid "Simplified Chinese"
+msgstr "Απλοποιημένα Κινέζικα"
+
+#: conf/global_settings.py:77
+msgid "Traditional Chinese"
+msgstr "Παραδοσιακά Κινέζικα"
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "χρόνος"
+msgstr[1] "χρόνια"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "μήνας"
+msgstr[1] "μήνες"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "εβδομάδα"
+msgstr[1] "εβδομάδες"
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "ημέρα"
+msgstr[1] "ημέρες"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "ώρα"
+msgstr[1] "ώρες"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "λεπτό"
+msgstr[1] "λεπτά"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Δευτέρα"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Τρίτη"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Τετάρτη"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Πέμπτη"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Παρασκευή"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Σάββατο"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Κυριακή"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Ιανουάριος"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Φεβρουάριος"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "Μάρτιος"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "Απρίλιος"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "Μάιος"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "Ιούνιος"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "Ιούλιος"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "Αύγουστος"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "Σεπτέμβριος"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Οκτώβριος"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "Νοέμβριος"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "Δεκέμβριος"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr "Ιαν"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "Φεβ"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "Μάρ"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "Απρ"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "Μάι"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "Ιούν"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "Ιούλ"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "Αύγ"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "Σεπ"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "Οκτ"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "Νοέ"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "Δεκ"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Ιάν."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Φεβ."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Αύγ."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Σεπτ."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Οκτ."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "Νοέ."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Δεκ."
+
+#: utils/dateformat.py:40
+msgid "p.m."
+msgstr "μμ."
+
+#: utils/dateformat.py:41
+msgid "a.m."
+msgstr "πμ."
+
+#: utils/dateformat.py:46
+msgid "PM"
+msgstr "ΜΜ"
+
+#: utils/dateformat.py:47
+msgid "AM"
+msgstr "ΠΜ"
+
+#: utils/dateformat.py:95
+msgid "midnight"
+msgstr "μεσάνυχτα"
+
+#: utils/dateformat.py:97
+msgid "noon"
+msgstr "μεσημέρι"
+
+#: utils/translation/trans_real.py:358
+msgid "DATE_FORMAT"
+msgstr "j N Y"
+
+#: utils/translation/trans_real.py:359
+msgid "DATETIME_FORMAT"
+msgstr "j N Y, P"
+
+#: utils/translation/trans_real.py:360
+msgid "TIME_FORMAT"
+msgstr "P"
+
+#: utils/translation/trans_real.py:376
+msgid "YEAR_MONTH_FORMAT"
+msgstr "F Y"
+
+#: utils/translation/trans_real.py:377
+msgid "MONTH_DAY_FORMAT"
+msgstr "j F"
+
+#: oldforms/__init__.py:392
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Βεβαιωθείτε ότι το κείμενο σας έχει μέγεθος μικρότερο από %s χαρακτήρα."
+msgstr[1] "Βεβαιωθείτε ότι το κείμενο σας έχει μέγεθος μικρότερο από %s χαρακτήρες."
+
+#: oldforms/__init__.py:397
+msgid "Line breaks are not allowed here."
+msgstr "Δεν επιτρέπονται αλλαγές γραμμών εδώ."
+
+#: oldforms/__init__.py:498 oldforms/__init__.py:571 oldforms/__init__.py:610
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Επιλέξτε μια έγκυρη επιλογή; Το '%(data)s' δεν είναι στα %(choices)s."
+
+#: oldforms/__init__.py:577 contrib/admin/filterspecs.py:150
+#: newforms/widgets.py:174
+msgid "Unknown"
+msgstr "Άγνωστο"
+
+#: oldforms/__init__.py:577 contrib/admin/filterspecs.py:143
+#: newforms/widgets.py:174
+msgid "Yes"
+msgstr "Ναι"
+
+#: oldforms/__init__.py:577 contrib/admin/filterspecs.py:143
+#: newforms/widgets.py:174
+msgid "No"
+msgstr "Όχι"
+
+#: oldforms/__init__.py:672 core/validators.py:174 core/validators.py:445
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+
+#: oldforms/__init__.py:674
+msgid "The submitted file is empty."
+msgstr "Το αρχείο που υποβλήθηκε είναι κενό."
+
+#: oldforms/__init__.py:730
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Εισάγετε έναν ακέραιο αριθμό μεταξύ -32,768 και 32,767."
+
+#: oldforms/__init__.py:740
+msgid "Enter a positive number."
+msgstr "Εισάγετε ένα θετικό αριθμό."
+
+#: oldforms/__init__.py:750
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Εισάγετε έναν ακέραιο αριθμό μεταξύ 0 και 32,767."
+
+#: contrib/localflavor/no/forms.py:15
+#, fuzzy
+msgid "Enter a zip code in the format XXXX."
+msgstr "Εισάγετε μία έγκυρη ώρα στη μορφή ΩΩ-ΛΛ."
+
+#: contrib/localflavor/no/forms.py:36
+#, fuzzy
+msgid "Enter a valid Norwegian social security number."
+msgstr "Παρακαλούμε εισάγετε έναν έγκυρο δεκαδικό αριθμό."
+
+#: contrib/localflavor/it/forms.py:14 contrib/localflavor/fr/forms.py:17
+#: contrib/localflavor/fi/forms.py:14 contrib/localflavor/de/forms.py:16
+#, fuzzy
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Εισάγετε μία έγκυρη ώρα στη μορφή ΩΩ-ΛΛ."
+
+#: contrib/localflavor/jp/forms.py:21
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+#, fuzzy
+msgid "Iwate"
+msgstr "Ημ/νία:"
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+#, fuzzy
+msgid "Tokyo"
+msgstr "Σήμερα"
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:18
+#, fuzzy
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Εισάγετε μία έγκυρη ώρα στη μορφή ΩΩ-ΛΛ."
+
+#: contrib/localflavor/br/forms.py:30
+#, fuzzy
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "Τηλέφωνο μέσα είναι."
+
+#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:46
+#, fuzzy
+msgid "Enter a valid Finnish social security number."
+msgstr "Εισάγετε ένα έγκυρο όνομα αρχείου."
+
+#: contrib/localflavor/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
+msgstr ""
+
+#: contrib/localflavor/de/forms.py:63
+#, fuzzy
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format"
+msgstr "Γερμανικά"
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:7
+#, fuzzy
+msgid "Berlin"
+msgstr "Βραζιλιάνικα"
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:10
+#, fuzzy
+msgid "Hamburg"
+msgstr "Αύγ"
+
+#: contrib/localflavor/de/de_states.py:11
+#, fuzzy
+msgid "Hessen"
+msgstr "μήνυμα"
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr ""
+
+#: contrib/localflavor/usa/forms.py:18
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr ""
+
+#: contrib/localflavor/usa/forms.py:51
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr ""
+
+#: contrib/sessions/models.py:68
+msgid "session key"
+msgstr "κλειδί συνεδρίας"
+
+#: contrib/sessions/models.py:69
+msgid "session data"
+msgstr "δεδομένα συνεδρίας"
+
+#: contrib/sessions/models.py:70
+msgid "expire date"
+msgstr "ημερομηνία λήξης"
+
+#: contrib/sessions/models.py:74
+msgid "session"
+msgstr "συνεδρία"
+
+#: contrib/sessions/models.py:75
+msgid "sessions"
+msgstr "συνεδρίες"
+
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr "Τα δύο πεδία συνθηματικών δεν ταιριάζουν."
+
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr "Ένας χρήστης με αυτό το όνομα χρήστη υπάρχει ήδη."
+
+#: contrib/auth/forms.py:53
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"Ο πλοηγητής σας δεν φαίνεται να έχει ενεργοποιημένα τα αρχεία cookie. Τα "
+"αρχεία cookie απαιτούνται για να συνδεθείτε."
+
+#: contrib/auth/forms.py:60 contrib/admin/views/decorators.py:10
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Παρακαλούμε εισάγετε ένα σωστό όνομα χρήστη και συνθηματικό. Να σημειωθεί "
+"ότι και τα δύο πεδία κάνουν διάκριση μεταξύ πεζών και κεφαλαίων."
+
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "Αυτός ο λογαριασμός είναι ανενεργός."
+
+#: contrib/auth/forms.py:85
+#, fuzzy
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr "χρήστης?"
+
+#: contrib/auth/forms.py:117
+#, fuzzy
+msgid "The two 'new password' fields didn't match."
+msgstr "συνθηματικό."
+
+#: contrib/auth/forms.py:124
+#, fuzzy
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "συνθηματικό."
+
+#: contrib/auth/views.py:39
+msgid "Logged out"
+msgstr "Έγινε αποσύνδεση"
+
+#: contrib/auth/models.py:38 contrib/auth/models.py:57
+msgid "name"
+msgstr "όνομα"
+
+#: contrib/auth/models.py:40
+msgid "codename"
+msgstr "κωδικό όνομα"
+
+#: contrib/auth/models.py:42
+msgid "permission"
+msgstr "δικαίωμα"
+
+#: contrib/auth/models.py:43 contrib/auth/models.py:58
+msgid "permissions"
+msgstr "διακαιώματα"
+
+#: contrib/auth/models.py:60
+msgid "group"
+msgstr "ομάδα"
+
+#: contrib/auth/models.py:61 contrib/auth/models.py:100
+msgid "groups"
+msgstr "ομάδες"
+
+#: contrib/auth/models.py:90
+msgid "username"
+msgstr "όνομα χρήστη"
+
+#: contrib/auth/models.py:90
+#, fuzzy
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr "Απαραίτητο."
+
+#: contrib/auth/models.py:91
+msgid "first name"
+msgstr "όνομα"
+
+#: contrib/auth/models.py:92
+msgid "last name"
+msgstr "επώνυμο"
+
+#: contrib/auth/models.py:93
+msgid "e-mail address"
+msgstr "ηλεκτρονική διεύθυνση"
+
+#: contrib/auth/models.py:94
+msgid "password"
+msgstr "συνθηματικό"
+
+#: contrib/auth/models.py:94
+#, fuzzy
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr "<a href=\"password/\"> συνθηματικό</a>."
+
+#: contrib/auth/models.py:95
+msgid "staff status"
+msgstr "Κατάσταση προσωπικού"
+
+#: contrib/auth/models.py:95
+msgid "Designates whether the user can log into this admin site."
+msgstr "Ορίζει αν ο χρήστης μπορεί να συνδεθεί στο χώρο διαχείρισης."
+
+#: contrib/auth/models.py:96
+msgid "active"
+msgstr "ενεργό"
+
+#: contrib/auth/models.py:96
+#, fuzzy
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr "Ορίζει αν ο χρήστης μπορεί να συνδεθεί στο χώρο διαχείρισης."
+
+#: contrib/auth/models.py:97
+msgid "superuser status"
+msgstr "κατάσταση υπερχρήστη"
+
+#: contrib/auth/models.py:97
+#, fuzzy
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr "χρήστης διακαιώματα."
+
+#: contrib/auth/models.py:98
+msgid "last login"
+msgstr "τελευταία σύνδεση"
+
+#: contrib/auth/models.py:99
+msgid "date joined"
+msgstr "ημερομηνία σύνδεσης"
+
+#: contrib/auth/models.py:101
+#, fuzzy
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr "Μέσα διακαιώματα χειρωνακτικά χρήστης get όλα διακαιώματα ομάδα είναι μέσα."
+
+#: contrib/auth/models.py:102
+msgid "user permissions"
+msgstr "δικαιώματα χρήστη"
+
+#: contrib/auth/models.py:105
+msgid "user"
+msgstr "χρήστης"
+
+#: contrib/auth/models.py:106
+msgid "users"
+msgstr "χρήστες"
+
+#: contrib/auth/models.py:111
+msgid "Personal info"
+msgstr "Προσωπικές πληροφορίες"
+
+#: contrib/auth/models.py:112
+msgid "Permissions"
+msgstr "Δικαιώματα"
+
+#: contrib/auth/models.py:113
+msgid "Important dates"
+msgstr "Σημαντικές ημερομηνίες"
+
+#: contrib/auth/models.py:114
+msgid "Groups"
+msgstr "Ομάδες"
+
+#: contrib/auth/models.py:258
+msgid "message"
+msgstr "μήνυμα"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "th"
+msgstr "η"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "st"
+msgstr "η"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "nd"
+msgstr "η"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "rd"
+msgstr "η"
+
+#: contrib/humanize/templatetags/humanize.py:47
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f εκατομμύριο"
+msgstr[1] "%(value).1f εκατομμύρια"
+
+#: contrib/humanize/templatetags/humanize.py:50
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f δισεκατομμύριο"
+msgstr[1] "%(value).1f δισεκατομμύρια"
+
+#: contrib/humanize/templatetags/humanize.py:53
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f τρισεκατομμύριο"
+msgstr[1] "%(value).1f τρισεκατομμύρια"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "one"
+msgstr "ένα"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "two"
+msgstr "δύο"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "three"
+msgstr "τρία"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "four"
+msgstr "τέσσερα"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "five"
+msgstr "πέντε"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "six"
+msgstr "έξι"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "seven"
+msgstr "εφτά"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "eight"
+msgstr "οκτώ"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "nine"
+msgstr "εννιά"
+
+#: contrib/contenttypes/models.py:36
+msgid "python model class name"
+msgstr "όνομα python model class"
+
+#: contrib/contenttypes/models.py:39
+msgid "content type"
+msgstr "τύπος περιεχομένου"
+
+#: contrib/contenttypes/models.py:40
+msgid "content types"
+msgstr "τύποι περιεχομένου"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "ανακατεύθυνση από"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Αυτό πρέπει να είναι ένα απόλυτο μονοπάτι, με εξαίρεση το όνομα χώρου. "
+"Παράδειγμα: '/events/search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "ανακατεύθυνση προς"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Αυτό πρέπει να είναι ένα απόλυτο μονοπάτι (όπως παραπάνω), ή ένα πλήρες URL "
+"που αρχίζει με 'http://'."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "ανακατεύθυνση"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "ανακατευθύνσεις"
+
+#: contrib/flatpages/models.py:7 contrib/admin/views/doc.py:315
+msgid "URL"
+msgstr "URL"
+
+#: contrib/flatpages/models.py:8
+msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Παράδειγμα: '/about/contact/'. Βεβαιωθείτε ότι περιέχει καθέτους στην αρχή "
+"και το τέλος."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "τίτλος"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "περιεχόμενο"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "ενεργοποίηση σχολίων"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "όνομα προτύπου"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"Παράδειγμα: 'flatpages/contact_page.html'. Αν δεν εισαχθεί, το σύστημα θα "
+"χρησιμοποιήσει το 'flatpages/default.html'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "απαιτείται εγγραφή"
+
+#: contrib/flatpages/models.py:14
+#, fuzzy
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "είναι μέσα χρήστες σελίδα."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "απλή σελίδα"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "απλές σελίδες"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "ID αντικειμένου"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "Επικεφαλίδα"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "σχόλιο"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "βαθμολογία #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "βαθμολογία #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "βαθμολογία #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "βαθμολογία #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "βαθμολογία #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "βαθμολογία #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "βαθμολογία #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "βαθμολογία #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "είναι έγκυρη βαθμολογία"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "ημερομηνία/ώρα υποβολής"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "είναι δημόσιο"
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:304
+msgid "IP address"
+msgstr "διεύθυνση IP"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "είναι διαγραμμένο"
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Επιλέξτε αυτό το κουτί ελέγχου εάν το σχόλιο είναι ανάρμοστο. Ένα μήνυμα "
+"\"Αυτό το σχόλιο διαγράφηκε\" θα εμφανιστεί στη θέση του."
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "σχόλια"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "Αντικείμενο περιεχομένου"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Σχόλιο από %(user)s στις %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "όνομα ατόμου"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "διεύθυνση ip"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "εγκεκριμένο από το προσωπικό"
+
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "ελεύθερο σχόλιο"
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "ελεύθερα σχόλια"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "βαθμολογία"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "ημερομηνία βαθμολόγησης"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "σκορ κάρμα"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "σκορ κάρμα"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d βαθμολογία από %(user)s"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Αυτό το σχόλιο σημειώθηκε από %(user)s\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "ημερομηνία σημείωσης"
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "σημείωση χρήστη"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "σημειώσεις χρήστη"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "Σημείωση από %r"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "ημερομηνία διαγραφής"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "διαγραφή συντονιστή"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "διαγραφές συντονιστή"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Διαγραφή συντονιστή από %r"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "Όνομα χρήστη:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+msgid "Log out"
+msgstr "Αποσύνδεση"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Συνθηματικό:"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Ξεχάσατε το συνθηματικό σας;"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Βαθμολογίες"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Απαραίτητο"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Προαιρετικό"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Στείλτε μια φωτογραφία"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Σχόλιο:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Προεπισκόπηση σχολίου"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Το όνομα σας:"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Ανώνυμοι χρήστες δεν μπορούν να ψηφίσουν"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "Μη έγκυρο ID σχολίου"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "Δεν επιτρέπεται ψήφος για τον εαυτό σας"
+
+#: contrib/comments/views/comments.py:27
+msgid "This rating is required because you've entered at least one other rating."
+msgstr ""
+"Αυτή η βαθμολογία απαιτείται επειδή έχετε εισάγει τουλάχιστον μία ακόμη "
+"βαθμολογία."
+
+#: contrib/comments/views/comments.py:111
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Αυτό το σχόλιο έχει αναρτηθεί από ένα χρήστη με λιγότερα από %(count)s "
+"σχόλιο:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Αυτό το σχόλιο έχει αναρτηθεί από ένα χρήστη με λιγότερα από %(count)s "
+"σχόλια:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:116
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Αυτό το σχόλιο αναρτήθηκε από έναν sketchy χρήστη:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:188
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Επιτρέπονται μόνο POST υποβολές"
+
+#: contrib/comments/views/comments.py:192
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Ένα ή περισσότερα από τα απαιτούμενα πεδία δεν έχουν υποβληθεί"
+
+#: contrib/comments/views/comments.py:196
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Κάποιος έχει πειράξει τη φόρμα σχολιασμού (παραβίαση ασφάλειας)"
+
+#: contrib/comments/views/comments.py:206
+#: contrib/comments/views/comments.py:292
+#, fuzzy
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr "σχόλιο αντικείμενο ID"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+#, fuzzy
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "σχόλιο t προεπισκόπηση ή"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "όνομα χώρου"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "εμφανιζόμενο όνομα"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "ιστότοπος"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "ιστότοποι"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Από %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169
+msgid "All"
+msgstr "Όλα"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "Οποιαδήποτε ημερομηνία"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "Σήμερα"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "Τελευταίες 7 ημέρες"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "Αυτόν το μήνα"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "Αυτόν το χρόνο"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "ώρα ενέργειας"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "id αντικειμένου"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "repr αντικειμένου"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "σημαία ενέργειας"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "αλλαγή μηνύματος"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "εγγραφή καταγραφής"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "εγγραφές καταγραφής"
+
+#: contrib/admin/templatetags/admin_list.py:247
+msgid "All dates"
+msgstr "Όλες οι ημερομηνίες"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/auth/user/change_password.html:12
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+msgid "Home"
+msgstr "Αρχική"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+msgid "Documentation"
+msgstr "Τεκμηρίωση"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Σελιδοδείκτες"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin/auth/user/change_password.html:15
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+msgid "Change password"
+msgstr "Αλλαγή συνθηματικού"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "Σελιδοδείκτες τεκμηρίωσης"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+#, fuzzy
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\"> δεσμός ή δεξιά δεσμός και αύξηση Τώρα υποφαινόμενο από "
+"κάθε σελίδα μέσα site Σημείωση από υποφαινόμενο site από a σύστημα "
+"υποφαινόμενο t είναι</p> n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Τεκμηρίωση για αυτήν τη σελίδα"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+#, fuzzy
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr "Άλματα υποφαινόμενο από κάθε σελίδα τεκμηρίωση για σελίδα."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Εμφάνιση ID αντικειμένου"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+#, fuzzy
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr "Περιεχόμενο τύπος και μοναδικό ID για σελίδες a single αντικείμενο."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Επεξεργασία αυτού του αντικειμένου (τρέχον παράθυρο)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+#, fuzzy
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "Άλματα σελίδα για σελίδες a single αντικείμενο."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Επεξεργασία αυτού του αντικειμένου (νέο παράθυρο)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+#, fuzzy
+msgid "As above, but opens the admin page in a new window."
+msgstr "σελίδα μέσα a νέο παράθυρο."
+
+#: contrib/admin/templates/admin/submit_line.html:3
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+msgid "Delete"
+msgstr "Διαγραφή"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Αποθήκευση ως νέο"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Αποθήκευση και προσθήκη καινούριου"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Αποθήκευση και συνέχεια επεξεργασίας"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Αποθήκευση"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Σφάλμα εξυπηρετητή"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Σφάλμα εξυπηρετητή (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Σφάλμα εξυπηρετητή <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Υπήρξε ένα σφάλμα. Έχει αναφερθεί στους διαχειριστές του ιστότοπου μέσω ηλ. "
+"ταχυδρομείου και θα πρέπει να επιδιορθωθεί σύντομα. Ευχαριστούμε για την "
+"υπομονή σας."
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Ανά %(filter_title)s "
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "Φίλτρο"
+
+#: contrib/admin/templates/admin/invalid_setup.html:8
+#, fuzzy
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr "χρήστης."
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Μετάβαση"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 αποτέλεσμα"
+msgstr[1] "%(counter)s αποτελέσματα"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s συνολικά"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "History"
+msgstr "Ιστορικό"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Ημερομηνία/ώρα"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Χρήστης"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Ενέργεια"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "N j, Y, P"
+
+#: contrib/admin/templates/admin/object_history.html:36
+#, fuzzy
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr "αντικείμενο t a t site."
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, fuzzy, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr "Διαγραφή αντικείμενο μέσα λογαριασμός t δικαίωμα διαγραφή από:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, fuzzy, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr "υποφαινόμενο υποφαινόμενο διαγραφή αντικείμενο Όλα από διαγράφηκε:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Ναι, είμαι βέβαιος"
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Εμφάνιση όλων"
+
+#: contrib/admin/templates/admin/change_list.html:12
+#, python-format
+msgid "Add %(name)s"
+msgstr "Προσθήκη %(name)s"
+
+#: contrib/admin/templates/admin/change_form.html:15
+#: contrib/admin/templates/admin/index.html:28
+msgid "Add"
+msgstr "Προσθήκη"
+
+#: contrib/admin/templates/admin/change_form.html:22
+msgid "View on site"
+msgstr "Προβολή στην ιστοσελίδα"
+
+#: contrib/admin/templates/admin/change_form.html:32
+#: contrib/admin/templates/admin/auth/user/change_password.html:24
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Παρακαλούμε διορθώστε το παρακάτω λάθος."
+msgstr[1] "Παρακαλούμε διορθώστε τα παρακάτω λάθη."
+
+#: contrib/admin/templates/admin/change_form.html:50
+msgid "Ordering"
+msgstr "Ταξινόμηση"
+
+#: contrib/admin/templates/admin/change_form.html:53
+msgid "Order:"
+msgstr "Ταξινόμηση:"
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "Καλωσήρθατε,"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Η σελίδα δε βρέθηκε"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Λυπόμαστε, αλλά η σελίδα που ζητήθηκε δε μπόρεσε να βρεθεί."
+
+#: contrib/admin/templates/admin/login.html:25
+#: contrib/admin/views/decorators.py:24
+msgid "Log in"
+msgstr "Σύνδεση"
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Διαθέσιμα μοντέλα στην εφαρμογή %(name)s."
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Επεξεργασία"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Δεν έχετε δικαίωμα να επεξεργαστείτε τίποτα."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Πρόσφατες ενέργειες"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Οι ενέργειες μου"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Κανένα διαθέσιμο"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Διαχειριστής ιστότοπου Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Διαχείριση Django"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+#, fuzzy
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr "όνομα χρήστη συνθηματικό χρήστης."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "Όνομα χρήστη"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+#: contrib/admin/templates/admin/auth/user/change_password.html:34
+msgid "Password"
+msgstr "Συνθηματικό"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+msgid "Password (again)"
+msgstr "Συνθηματικό (ξανά)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+msgid "Enter the same password as above, for verification."
+msgstr "Εισάγετε το ίδιο συνθηματικό όπως παραπάνω, για λόγους επιβεβαίωσης."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:28
+#, python-format
+#, fuzzy
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "συνθηματικό χρήστης<strong> όνομα χρήστη</strong>."
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Τρέχουσα:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Αλλαγή:"
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Ημ/νία:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Ώρα:"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Ευχαριστούμε που διαθέσατε κάποιο ποιοτικό χρόνο στον ιστότοπο σήμερα."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Σύνδεση ξανά"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+#, fuzzy
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "συνθηματικό"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, fuzzy, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "για χρήστης λογαριασμός σε"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, fuzzy, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "νέο συνθηματικό είναι"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+#, fuzzy
+msgid "Feel free to change this password by going to this page:"
+msgstr "συνθηματικό από σελίδα:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+#, fuzzy
+msgid "Your username, in case you've forgotten:"
+msgstr "όνομα χρήστη μέσα υποφαινόμενο:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+#, fuzzy
+msgid "Thanks for using our site!"
+msgstr "Ευχαριστώ για site!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+#, fuzzy
+msgid "The %(site_name)s team"
+msgstr "ιστότοπος όνομα"
+
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+msgid "Password reset"
+msgstr "Επαναφορά συνθηματικού"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Επιτυχής επαναφορά συνθηματικού"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"Ένα νέο συνθηματικό έχει αποσταλεί στην ηλεκτρονική διεύθυνση που έχετε "
+"επιλέξει. Θα πρέπει να το παραλάβετε πολύ σύντομα."
+
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:4
+msgid "Password change"
+msgstr "Αλλαγή συνθηματικού"
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Παρακαλούμε εισάγετε το παλιό σας συνθηματικό, για λόγους ασφάλειας, και "
+"κατόπιν εισάγετε το νέο σας συνθηματικό δύο φορές ούτως ώστε να "
+"πιστοποιήσουμε ότι το πληκτρολογήσατε σωστά."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Παλιό συνθηματικό:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Νέο συνθηματικό:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Επιβεβαίωση συνθηματικού:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Αλλαγή του συνθηματικού μου"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Επιτυχής αλλαγή συνθηματικού"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Το συνθηματικό σας έχει αλλαχτεί."
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"Έχετε ξεχάσει το συνθηματικό σας; Εισάγετε παρακάτω την ηλεκτρονική σας "
+"διεύθυνση, και θα επαναφέρουμε το συνθηματικό σας, αποστέλλοντας το "
+"καινούριο στην ηλ. σας διεύθυνση."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Ηλεκτρονική διεύθυνση:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Επαναφορά του συνθηματικού μου"
+
+#: contrib/admin/views/main.py:223
+msgid "Site administration"
+msgstr "Διαχείριση του ιστότοπου"
+
+#: contrib/admin/views/main.py:257 contrib/admin/views/auth.py:19
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Το %(name)s \"%(obj)s\" αποθηκεύτηκε με επιτυχία."
+
+#: contrib/admin/views/main.py:261 contrib/admin/views/main.py:347
+#: contrib/admin/views/auth.py:24
+msgid "You may edit it again below."
+msgstr "Μπορείτε να το επεξεργαστείτε ξανά παρακάτω."
+
+#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356
+#, python-format
+msgid "You may add another %s below."
+msgstr "Μπορείτε να προσθέσετε ακόμα ένα %s παρακάτω."
+
+#: contrib/admin/views/main.py:289
+#, python-format
+msgid "Add %s"
+msgstr "Προσθήκη %s"
+
+#: contrib/admin/views/main.py:335
+#, python-format
+msgid "Added %s."
+msgstr "Το %s προστέθηκε."
+
+#: contrib/admin/views/main.py:337
+#, python-format
+msgid "Changed %s."
+msgstr "Έγινε επεξεργασία του %s."
+
+#: contrib/admin/views/main.py:339
+#, python-format
+msgid "Deleted %s."
+msgstr "Το %s διεγράφη."
+
+#: contrib/admin/views/main.py:342
+msgid "No fields changed."
+msgstr "Κανένα πεδίο δεν άλλαξε."
+
+#: contrib/admin/views/main.py:345
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Το %(name)s \"%(obj)s\" αλλάχτηκε με επιτυχία."
+
+#: contrib/admin/views/main.py:353
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"Το %(name)s \"%(obj)s\" αποθηκεύτηκε με επιτυχία. Μπορείτε να το "
+"επεξεργαστείτε πάλι παρακάτω."
+
+#: contrib/admin/views/main.py:391
+#, python-format
+msgid "Change %s"
+msgstr "Αλλαγή του %s"
+
+#: contrib/admin/views/main.py:476
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Ένα ή περισσότερα %(fieldname)s στο %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:481
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Ένα ή περισσότερα %(fieldname)s στο %(name)s:"
+
+#: contrib/admin/views/main.py:514
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Το %(name)s \"%(obj)s\" διαγράφηκε με επιτυχία."
+
+#: contrib/admin/views/main.py:517
+msgid "Are you sure?"
+msgstr "Είστε σίγουροι;"
+
+#: contrib/admin/views/main.py:539
+#, python-format
+msgid "Change history: %s"
+msgstr "Ιστορικό αλλαγών: %s"
+
+#: contrib/admin/views/main.py:573
+#, python-format
+msgid "Select %s"
+msgstr "Επιλέξτε %s"
+
+#: contrib/admin/views/main.py:573
+#, python-format
+msgid "Select %s to change"
+msgstr "Επιλέξτε %s προς αλλαγή"
+
+#: contrib/admin/views/main.py:768
+msgid "Database error"
+msgstr "Σφάλμα βάσης δεδομένων"
+
+#: contrib/admin/views/decorators.py:62
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Παρακαλούμε συνδεθείτε εκ νέου, γιατί η συνεδρία σας έχει λήξει. Μην "
+"ανησυχείτε: Η υποβολή σας έχει αποθηκευτεί."
+
+#: contrib/admin/views/decorators.py:69
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Από ότι φαίνεται, ο πλοηγητής σας δεν έχει ρυθμιστεί να δέχεται cookies. "
+"Παρακαλούμε ενεργοποιείστε τα cookies, φορτώστε ξανά αυτήν τη σελίδα και "
+"δοκιμάστε ξανά."
+
+#: contrib/admin/views/decorators.py:83
+msgid "Usernames cannot contain the '@' character."
+msgstr "Τα ονόματα χρηστών δεν επιτρέπεται να περιέχουν το χαρακτήρα '@'."
+
+#: contrib/admin/views/decorators.py:85
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr ""
+"Η ηλεκτρονική σας διεύθυνση δεν είναι το όνομα χρήστη σας. Δοκιμάστε '%s' "
+"στη θέση αυτού."
+
+#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48
+#: contrib/admin/views/doc.py:50
+msgid "tag:"
+msgstr "ετικέτα:"
+
+#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79
+#: contrib/admin/views/doc.py:81
+msgid "filter:"
+msgstr "φίλτρο:"
+
+#: contrib/admin/views/doc.py:135 contrib/admin/views/doc.py:137
+#: contrib/admin/views/doc.py:139
+msgid "view:"
+msgstr "προβολή:"
+
+#: contrib/admin/views/doc.py:164
+#, fuzzy, python-format
+msgid "App %r not found"
+msgstr "Η σελίδα δε βρέθηκε"
+
+#: contrib/admin/views/doc.py:171
+#, python-format
+#, fuzzy
+msgid "Model %(name)r not found in app %(label)r"
+msgstr "όνομα"
+
+#: contrib/admin/views/doc.py:183
+#, python-format
+msgid "the related `%(label)s.%(type)s` object"
+msgstr ""
+
+#: contrib/admin/views/doc.py:183 contrib/admin/views/doc.py:205
+#: contrib/admin/views/doc.py:219 contrib/admin/views/doc.py:224
+msgid "model:"
+msgstr "μοντέλο:"
+
+#: contrib/admin/views/doc.py:214
+#, python-format
+#, fuzzy
+msgid "related `%(label)s.%(name)s` objects"
+msgstr "όνομα"
+
+#: contrib/admin/views/doc.py:219
+#, python-format
+msgid "all %s"
+msgstr "όλα %s"
+
+#: contrib/admin/views/doc.py:224
+#, python-format
+msgid "number of %s"
+msgstr ""
+
+#: contrib/admin/views/doc.py:229
+#, python-format
+msgid "Fields on %s objects"
+msgstr ""
+
+#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:301
+#: contrib/admin/views/doc.py:303 contrib/admin/views/doc.py:309
+#: contrib/admin/views/doc.py:310 contrib/admin/views/doc.py:312
+msgid "Integer"
+msgstr "Ακέραιος"
+
+#: contrib/admin/views/doc.py:292
+msgid "Boolean (Either True or False)"
+msgstr "Boolean (Είτε Αληθές ή Ψευδές)"
+
+#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:311
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "Συμβολοσειρά (μέχρι %(maxlength)s χαρακτήρες)"
+
+#: contrib/admin/views/doc.py:294
+msgid "Comma-separated integers"
+msgstr "Ακέραιοι χωρισμένοι με κόμματα"
+
+#: contrib/admin/views/doc.py:295
+msgid "Date (without time)"
+msgstr "Ημερομηνία (χωρίς την ώρα)"
+
+#: contrib/admin/views/doc.py:296
+msgid "Date (with time)"
+msgstr "Ημερομηνία (με την ώρα)"
+
+#: contrib/admin/views/doc.py:297
+msgid "E-mail address"
+msgstr "Ηλεκτρονική διεύθυνση"
+
+#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:299
+#: contrib/admin/views/doc.py:302
+msgid "File path"
+msgstr "Τοποθεσία αρχείου"
+
+#: contrib/admin/views/doc.py:300
+msgid "Decimal number"
+msgstr "Δεκαδικός αριθμός"
+
+#: contrib/admin/views/doc.py:306
+msgid "Boolean (Either True, False or None)"
+msgstr "Boolean (Αληθές, Ψευδές, ή τίποτα)"
+
+#: contrib/admin/views/doc.py:307
+msgid "Relation to parent model"
+msgstr "Σχέση με το γονικό μοντέλο"
+
+#: contrib/admin/views/doc.py:308
+msgid "Phone number"
+msgstr "Αριθμός τηλεφώνου"
+
+#: contrib/admin/views/doc.py:313
+msgid "Text"
+msgstr "Κείμενο"
+
+#: contrib/admin/views/doc.py:314
+msgid "Time"
+msgstr "Ώρα"
+
+#: contrib/admin/views/doc.py:316
+msgid "U.S. state (two uppercase letters)"
+msgstr "Πολιτεία ΗΠΑ. (δύο κεφαλαία γράμματα)"
+
+#: contrib/admin/views/doc.py:317
+msgid "XML text"
+msgstr "Κείμενο XML"
+
+#: contrib/admin/views/doc.py:343
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "Το %s δε φαίνεται να είναι ένα αντικείμενο urlpattern"
+
+#: contrib/admin/views/auth.py:30
+msgid "Add user"
+msgstr "Προσθήκη χρήστη"
+
+#: contrib/admin/views/auth.py:57
+msgid "Password changed successfully."
+msgstr "Το συνθηματικό αλλάχτηκε με επιτυχία."
+
+#: contrib/admin/views/auth.py:64
+#, python-format
+msgid "Change password: %s"
+msgstr "Αλλαγή συνθηματικού: %s"
+
+#: newforms/fields.py:103 newforms/fields.py:256
+#, python-format
+msgid "Ensure this value has at most %d characters."
+msgstr "Βεβαιωθείτε ότι το κείμενο σας έχει μέγεθος το πολύ %d χαρακτήρες."
+
+#: newforms/fields.py:105 newforms/fields.py:258
+#, python-format
+msgid "Ensure this value has at least %d characters."
+msgstr "Βεβαιωθείτε ότι το κείμενο σας έχει μέγεθος τουλάχιστον %d χαρακτήρες."
+
+#: newforms/fields.py:128 core/validators.py:120
+msgid "Enter a whole number."
+msgstr "Εισάγετε έναν ακέραιο αριθμό."
+
+#: newforms/fields.py:130
+#, fuzzy, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "τιμή a από."
+
+#: newforms/fields.py:132
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr ""
+
+#: newforms/fields.py:165
+msgid "Enter a valid date."
+msgstr "Εισάγετε μια έγκυρη ημερομηνία."
+
+#: newforms/fields.py:192
+msgid "Enter a valid time."
+msgstr "Εισάγετε μια έγκυρη ώρα."
+
+#: newforms/fields.py:228
+msgid "Enter a valid date/time."
+msgstr "Εισάγετε μια έγκυρη ημερομηνία/ώρα."
+
+#: newforms/fields.py:242
+msgid "Enter a valid value."
+msgstr "Εισάγετε μια έγκυρη τιμή."
+
+#: newforms/fields.py:271 core/validators.py:162
+msgid "Enter a valid e-mail address."
+msgstr "Εισάγετε μια έγκυρη διεύθυνση ηλ. ταχυδρομείου."
+
+#: newforms/fields.py:289 newforms/fields.py:311
+msgid "Enter a valid URL."
+msgstr "Εισάγετε ένα έγκυρο URL."
+
+#: newforms/fields.py:313
+#, fuzzy
+msgid "This URL appears to be a broken link."
+msgstr "Το URL %s είναι χαλασμένος σύνδεσμος."
+
+#: newforms/fields.py:362 newforms/models.py:165
+#, fuzzy
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Επιλέξτε μια έγκυρη επιλογή; Το '%(data)s' δεν είναι στα %(choices)s."
+
+#: newforms/fields.py:380 newforms/fields.py:456 newforms/models.py:182
+#, fuzzy
+msgid "Enter a list of values."
+msgstr "Εισάγετε ένα έγκυρο όνομα αρχείου."
+
+#: newforms/fields.py:389 newforms/models.py:188
+#, fuzzy, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Επιλέξτε μια έγκυρη επιλογή; Το '%(data)s' δεν είναι στα %(choices)s."
+
+#: template/defaultfilters.py:491
+msgid "yes,no,maybe"
+msgstr "ναι,όχι,ίσως"
+
+#: views/generic/create_update.py:43
+#, fuzzy, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "Το %(name)s \"%(obj)s\" αλλάχτηκε με επιτυχία."
+
+#: views/generic/create_update.py:117
+#, fuzzy, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "Το %(name)s \"%(obj)s\" διαγράφηκε με επιτυχία."
+
+#: views/generic/create_update.py:184
+#, fuzzy, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "Το %(name)s \"%(obj)s\" διαγράφηκε με επιτυχία."
+
+#: core/validators.py:64
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Αυτή η τιμή πρέπει να περιέχει μόνο γράμματα, αριθμούς και υπογεγραμμένες."
+
+#: core/validators.py:68
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Αυτή η τιμή πρέπει να περιέχει μόνο γράμματα, αριθμούς, υπογεγραμμένες, "
+"παύλες ή καθέτους."
+
+#: core/validators.py:72
+#, fuzzy
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr ""
+"Αυτή η τιμή πρέπει να περιέχει μόνο γράμματα, αριθμούς, υπογεγραμμένες, "
+"παύλες ή καθέτους."
+
+#: core/validators.py:76
+msgid "Uppercase letters are not allowed here."
+msgstr "Τα κεφαλαία γράμματα δεν επιτρέπονται εδώ."
+
+#: core/validators.py:80
+msgid "Lowercase letters are not allowed here."
+msgstr "Τα πεζά γράμματα δεν επιτρέπονται εδώ."
+
+#: core/validators.py:87
+msgid "Enter only digits separated by commas."
+msgstr "Εισάγετε μόνο ψηφία χωρισμένα με κόμματα."
+
+#: core/validators.py:99
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Εισάγετε έγκυρες ηλ. διευθύνσεις χωρισμένες με κόμματα."
+
+#: core/validators.py:103
+msgid "Please enter a valid IP address."
+msgstr "Παρακαλούμε εισάγετε μια έγκυρη διεύθυνση IP."
+
+#: core/validators.py:107
+msgid "Empty values are not allowed here."
+msgstr "Δεν επιτρέπονται κενές τιμές εδώ."
+
+#: core/validators.py:111
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Δεν επιτρέπονται μη-αριθμητικοί χαρακτήρες εδώ."
+
+#: core/validators.py:115
+msgid "This value can't be comprised solely of digits."
+msgstr "Αυτή η τιμή δεν μπορεί να αποτελείται μόνο από ψηφία."
+
+#: core/validators.py:124
+msgid "Only alphabetical characters are allowed here."
+msgstr "Μόνο αλφαβητικοί χαρακτήρες επιτρέπονται εδώ."
+
+#: core/validators.py:139
+msgid "Year must be 1900 or later."
+msgstr ""
+
+#: core/validators.py:143
+#, fuzzy, python-format
+msgid "Invalid date: %s"
+msgstr "Μη έγκυρο URL: %s"
+
+#: core/validators.py:153
+msgid "Enter a valid time in HH:MM format."
+msgstr "Εισάγετε μία έγκυρη ώρα στη μορφή ΩΩ-ΛΛ."
+
+#: core/validators.py:178
+#, fuzzy
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr "a εικόνα αρχείο υποφαινόμενο όχι εικόνα ή a εικόνα."
+
+#: core/validators.py:185
+#, fuzzy, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "URL όχι σημείο a εικόνα."
+
+#: core/validators.py:189
+#, fuzzy, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "Τηλέφωνο μέσα είναι."
+
+#: core/validators.py:197
+#, fuzzy, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "URL όχι σημείο a."
+
+#: core/validators.py:201
+msgid "A valid URL is required."
+msgstr "Απαιτείται ένα έγκυρο URL."
+
+#: core/validators.py:215
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Απαιτείται έγκυρη HTML. Συγκεκριμένα σφάλματα είναι τα εξής:\n"
+"%s"
+
+#: core/validators.py:222
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Κακώς δομημένη XML: %s"
+
+#: core/validators.py:239
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Μη έγκυρο URL: %s"
+
+#: core/validators.py:244 core/validators.py:246
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "Το URL %s είναι χαλασμένος σύνδεσμος."
+
+#: core/validators.py:252
+#, fuzzy
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "a U συντομογραφία."
+
+#: core/validators.py:266
+#, fuzzy, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Παρακολούθηση είναι όχι."
+msgstr[1] "Παρακολούθηση είναι όχι."
+
+#: core/validators.py:273
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Αυτό το πεδίο πρέπει να ταιριάζει με το πεδίο '%s'."
+
+#: core/validators.py:292
+#, fuzzy
+msgid "Please enter something for at least one field."
+msgstr "για σε ένα πεδίο."
+
+#: core/validators.py:301 core/validators.py:312
+msgid "Please enter both fields or leave them both empty."
+msgstr "Παρακαλούμε συμπληρώστε και τα δύο πεδία ή αφήστε τα και τα δύο άδεια."
+
+#: core/validators.py:320
+#, fuzzy, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "πεδίο πεδίο είναι τιμή"
+
+#: core/validators.py:333
+#, fuzzy, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "πεδίο πεδίο είναι όχι τιμή"
+
+#: core/validators.py:352
+msgid "Duplicate values are not allowed."
+msgstr "Δεν επιτρέπονται διπλές τιμές."
+
+#: core/validators.py:367
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Αυτή η τιμή πρέπει να είναι μεταξύ %(lower)s και %(upper)s."
+
+#: core/validators.py:369
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Αυτή η τιμή πρέπει να είναι τουλάχιστον %s."
+
+#: core/validators.py:371
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Αυτή η τιμή πρέπει να είναι το πολύ %s."
+
+#: core/validators.py:407
+#, fuzzy, python-format
+msgid "This value must be a power of %s."
+msgstr "τιμή a από."
+
+#: core/validators.py:418
+msgid "Please enter a valid decimal number."
+msgstr "Παρακαλούμε εισάγετε έναν έγκυρο δεκαδικό αριθμό."
+
+#: core/validators.py:422
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural "Please enter a valid decimal number with at most %s total digits."
+msgstr[0] ""
+"Παρακαλούμε εισάγετε έναν έγκυρο δεκαδικό αριθμό με το πολύ %s ψηφίο "
+"συνολικά."
+msgstr[1] ""
+"Παρακαλούμε εισάγετε έναν έγκυρο δεκαδικό αριθμό με το πολύ %s ψηφία "
+"συνολικά."
+
+#: core/validators.py:425
+#, python-format
+msgid "Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural "Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] ""
+"Παρακαλούμε εισάγετε έναν έγκυρο δεκαδικό αριθμό με ακέραιο μέρος το πολύ %s ψηφίο "
+"συνολικά."
+msgstr[1] ""
+"Παρακαλούμε εισάγετε έναν έγκυρο δεκαδικό αριθμό με ακέραιο μέρος το πολύ %s ψηφία "
+"συνολικά."
+
+#: core/validators.py:428
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural "Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "Παρακαλούμε εισάγετε έναν έγκυρο δεκαδικό αριθμό με το πολύ %s δεκαδική θέση."
+msgstr[1] ""
+"Παρακαλούμε εισάγετε έναν έγκυρο δεκαδικό αριθμό με το πολύ %s δεκαδικές "
+"θέσεις."
+
+#: core/validators.py:438
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Βεβαιωθείτε ότι το αρχείο που στέλνετε έχει μέγεθος τουλάχιστον %s ψηφία."
+
+#: core/validators.py:439
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Βεβαιωθείτε ότι το αρχείο που στέλνετε έχει μέγεθος το πολύ μέχρι %s ψηφία."
+
+#: core/validators.py:456
+msgid "The format for this field is wrong."
+msgstr "Η μορφή αυτού του πεδίου είναι λανθασμένη."
+
+#: core/validators.py:471
+msgid "This field is invalid."
+msgstr "Αυτό το πεδίο είναι μη έγκυρο."
+
+#: core/validators.py:507
+#, fuzzy, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "όχι Οτιδήποτε από."
+
+#: core/validators.py:510
+#, fuzzy, python-format
+msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "URL url Περιεχόμενο Τύπος."
+
+#: core/validators.py:543
+#, fuzzy, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr "close από Γραμμή με έναρξη"
+
+#: core/validators.py:547
+#, fuzzy, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr "κείμενο ενεργό είναι όχι μέσα Γραμμή με έναρξη"
+
+#: core/validators.py:552
+#, fuzzy, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr "ενεργό είναι χαρακτηριστικό Γραμμή με έναρξη"
+
+#: core/validators.py:557
+#, fuzzy, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr "ενεργό είναι Γραμμή με έναρξη"
+
+#: core/validators.py:561
+#, fuzzy, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr "ενεργό είναι αγνοείται ένα ή περισσότερα Γραμμή με έναρξη"
+
+#: core/validators.py:566
+#, fuzzy, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr "χαρακτηριστικό ενεργό τιμή Γραμμή με έναρξη"
+
diff --git a/webapp/django/conf/locale/el/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/el/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..b689bf8
--- /dev/null
+++ b/webapp/django/conf/locale/el/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/el/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/el/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..28c06e3
--- /dev/null
+++ b/webapp/django/conf/locale/el/LC_MESSAGES/djangojs.po
@@ -0,0 +1,108 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2006 and beyond.
+# This file is distributed under the same license as the Django package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-12-09 11:51+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Orestis Markou <orestis@orestis.gr>\n"
+"Language-Team: Greek\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "Διαθέσιμο %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Επιλογή Όλων"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Προσθήκη"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Αφαίρεση"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Επιλεχθέντα %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Επιλέξτε και κάντε κλικ."
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Καθαρισμός όλων"
+
+#: contrib/admin/media/js/dateparse.js:26
+#: contrib/admin/media/js/calendar.js:24
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr "Ιανουάριος Φεβρουάριος Μάρτιος Απρίλιος Μάιος Ιούνιος Ιούλιος Αύγουστος Σεπτέμβριος Οκτώβριος Νοέμβριος "
+"Δεκέμβριος"
+
+#: contrib/admin/media/js/dateparse.js:27
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Κυριακή Δευτέρα Τρίτη Τετάρτη Πέμπτη Παρασκευή Σάββατο"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "Κ Δ Τ Τ Π Π Σ"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "Τώρα"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "Ρολόι"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "Διαλέξτε ώρα"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "Μεσάνυχτα"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "6 π.μ."
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "Μεσημέρι"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "Άκυρο"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "Σήμερα"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "Ημερολόγιο"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "Χθες"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "Αύριο"
diff --git a/webapp/django/conf/locale/en/LC_MESSAGES/django.mo b/webapp/django/conf/locale/en/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..1367370
--- /dev/null
+++ b/webapp/django/conf/locale/en/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/en/LC_MESSAGES/django.po b/webapp/django/conf/locale/en/LC_MESSAGES/django.po
new file mode 100644
index 0000000..c080c61
--- /dev/null
+++ b/webapp/django/conf/locale/en/LC_MESSAGES/django.po
@@ -0,0 +1,3768 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-11-29 10:57-0600\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr ""
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr ""
+
+#: conf/global_settings.py:41
+msgid "Bulgarian"
+msgstr ""
+
+#: conf/global_settings.py:42
+msgid "Catalan"
+msgstr ""
+
+#: conf/global_settings.py:43
+msgid "Czech"
+msgstr ""
+
+#: conf/global_settings.py:44
+msgid "Welsh"
+msgstr ""
+
+#: conf/global_settings.py:45
+msgid "Danish"
+msgstr ""
+
+#: conf/global_settings.py:46
+msgid "German"
+msgstr ""
+
+#: conf/global_settings.py:47
+msgid "Greek"
+msgstr ""
+
+#: conf/global_settings.py:48
+msgid "English"
+msgstr ""
+
+#: conf/global_settings.py:49
+msgid "Spanish"
+msgstr ""
+
+#: conf/global_settings.py:50
+msgid "Argentinean Spanish"
+msgstr ""
+
+#: conf/global_settings.py:51
+msgid "Persian"
+msgstr ""
+
+#: conf/global_settings.py:52
+msgid "Finnish"
+msgstr ""
+
+#: conf/global_settings.py:53
+msgid "French"
+msgstr ""
+
+#: conf/global_settings.py:54
+msgid "Gaeilge"
+msgstr ""
+
+#: conf/global_settings.py:55
+msgid "Galician"
+msgstr ""
+
+#: conf/global_settings.py:56
+msgid "Hungarian"
+msgstr ""
+
+#: conf/global_settings.py:57
+msgid "Hebrew"
+msgstr ""
+
+#: conf/global_settings.py:58
+msgid "Croatian"
+msgstr ""
+
+#: conf/global_settings.py:59
+msgid "Icelandic"
+msgstr ""
+
+#: conf/global_settings.py:60
+msgid "Italian"
+msgstr ""
+
+#: conf/global_settings.py:61
+msgid "Japanese"
+msgstr ""
+
+#: conf/global_settings.py:62
+msgid "Korean"
+msgstr ""
+
+#: conf/global_settings.py:63
+msgid "Khmer"
+msgstr ""
+
+#: conf/global_settings.py:64
+msgid "Kannada"
+msgstr ""
+
+#: conf/global_settings.py:65
+msgid "Latvian"
+msgstr ""
+
+#: conf/global_settings.py:66
+msgid "Macedonian"
+msgstr ""
+
+#: conf/global_settings.py:67
+msgid "Dutch"
+msgstr ""
+
+#: conf/global_settings.py:68
+msgid "Norwegian"
+msgstr ""
+
+#: conf/global_settings.py:69
+msgid "Polish"
+msgstr ""
+
+#: conf/global_settings.py:70
+msgid "Portugese"
+msgstr ""
+
+#: conf/global_settings.py:71
+msgid "Brazilian"
+msgstr ""
+
+#: conf/global_settings.py:72
+msgid "Romanian"
+msgstr ""
+
+#: conf/global_settings.py:73
+msgid "Russian"
+msgstr ""
+
+#: conf/global_settings.py:74
+msgid "Slovak"
+msgstr ""
+
+#: conf/global_settings.py:75
+msgid "Slovenian"
+msgstr ""
+
+#: conf/global_settings.py:76
+msgid "Serbian"
+msgstr ""
+
+#: conf/global_settings.py:77
+msgid "Swedish"
+msgstr ""
+
+#: conf/global_settings.py:78
+msgid "Tamil"
+msgstr ""
+
+#: conf/global_settings.py:79
+msgid "Telugu"
+msgstr ""
+
+#: conf/global_settings.py:80
+msgid "Turkish"
+msgstr ""
+
+#: conf/global_settings.py:81
+msgid "Ukrainian"
+msgstr ""
+
+#: conf/global_settings.py:82
+msgid "Simplified Chinese"
+msgstr ""
+
+#: conf/global_settings.py:83
+msgid "Traditional Chinese"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:44
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:74 contrib/admin/filterspecs.py:92
+#: contrib/admin/filterspecs.py:147 contrib/admin/filterspecs.py:173
+msgid "All"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:113
+msgid "Any date"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:114
+msgid "Today"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:117
+msgid "Past 7 days"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:119
+msgid "This month"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:121
+msgid "This year"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:147 newforms/widgets.py:231
+#: oldforms/__init__.py:592
+msgid "Yes"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:147 newforms/widgets.py:231
+#: oldforms/__init__.py:592
+msgid "No"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:154 newforms/widgets.py:231
+#: oldforms/__init__.py:592
+msgid "Unknown"
+msgstr ""
+
+#: contrib/admin/models.py:18
+msgid "action time"
+msgstr ""
+
+#: contrib/admin/models.py:21
+msgid "object id"
+msgstr ""
+
+#: contrib/admin/models.py:22
+msgid "object repr"
+msgstr ""
+
+#: contrib/admin/models.py:23
+msgid "action flag"
+msgstr ""
+
+#: contrib/admin/models.py:24
+msgid "change message"
+msgstr ""
+
+#: contrib/admin/models.py:27
+msgid "log entry"
+msgstr ""
+
+#: contrib/admin/models.py:28
+msgid "log entries"
+msgstr ""
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr ""
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr ""
+
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:37
+#: contrib/admin/templates/admin/change_form.html:12
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/delete_confirmation.html:5
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:4
+#: contrib/admin/templates/admin/auth/user/change_password.html:11
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+msgid "Home"
+msgstr ""
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr ""
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr ""
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr ""
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+#: contrib/admin/templates/admin/base.html:26
+msgid "Welcome,"
+msgstr ""
+
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr ""
+
+#: contrib/admin/templates/admin/base.html:29
+#: contrib/admin/templates/admin/auth/user/change_password.html:14
+#: contrib/admin/templates/admin/auth/user/change_password.html:45
+msgid "Change password"
+msgstr ""
+
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/comments/templates/comments/form.html:6
+msgid "Log out"
+msgstr ""
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr ""
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_form.html:14
+#: contrib/admin/templates/admin/index.html:28
+msgid "Add"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_form.html:20
+#: contrib/admin/templates/admin/object_history.html:4
+msgid "History"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_form.html:31
+#: contrib/admin/templates/admin/auth/user/change_password.html:23
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/admin/templates/admin/change_form.html:49
+msgid "Ordering"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_form.html:52
+msgid "Order:"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr ""
+
+#: contrib/admin/templates/admin/delete_confirmation.html:8
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr ""
+
+#: contrib/admin/templates/admin/delete_confirmation.html:13
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+
+#: contrib/admin/templates/admin/delete_confirmation.html:20
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+
+#: contrib/admin/templates/admin/delete_confirmation.html:25
+msgid "Yes, I'm sure"
+msgstr ""
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr ""
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr ""
+
+#: contrib/admin/templates/admin/invalid_setup.html:8
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+
+#: contrib/admin/templates/admin/login.html:17
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+msgid "Username:"
+msgstr ""
+
+#: contrib/admin/templates/admin/login.html:20
+#: contrib/comments/templates/comments/form.html:8
+msgid "Password:"
+msgstr ""
+
+#: contrib/admin/templates/admin/login.html:25
+#: contrib/admin/views/decorators.py:25
+msgid "Log in"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:17
+msgid "Date/time"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "User"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "Action"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:25
+msgid "DATE_WITH_TIME_FULL"
+msgstr "N j, Y, P"
+
+#: contrib/admin/templates/admin/object_history.html:35
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr ""
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr ""
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr ""
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr ""
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr ""
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr ""
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr ""
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr ""
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+#: contrib/admin/templates/admin/auth/user/change_password.html:33
+msgid "Password"
+msgstr ""
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+#: contrib/admin/templates/admin/auth/user/change_password.html:38
+msgid "Password (again)"
+msgstr ""
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+msgid "Enter the same password as above, for verification."
+msgstr ""
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:27
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+msgid "Documentation bookmarklets"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:8
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:18
+msgid "Documentation for this page"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:21
+msgid "Show object ID"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:24
+msgid "Edit this object (current window)"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:27
+msgid "Edit this object (new window)"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "As above, but opens the admin page in a new window."
+msgstr ""
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr ""
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_form.html:5
+#: contrib/admin/templates/registration/password_change_form.html:9
+msgid "Password change"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_change_done.html:5
+#: contrib/admin/templates/registration/password_change_done.html:9
+msgid "Password change successful"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_change_done.html:11
+msgid "Your password was changed."
+msgstr ""
+
+#: contrib/admin/templates/registration/password_change_form.html:11
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+
+#: contrib/admin/templates/registration/password_change_form.html:16
+msgid "Old password:"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_change_form.html:18
+msgid "New password:"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_change_form.html:20
+msgid "Confirm password:"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_change_form.html:22
+msgid "Change my password"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+msgid "Password reset"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr ""
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr ""
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr ""
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr ""
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr ""
+
+#: contrib/admin/templatetags/admin_list.py:257
+msgid "All dates"
+msgstr ""
+
+#: contrib/admin/views/auth.py:20 contrib/admin/views/main.py:267
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr ""
+
+#: contrib/admin/views/auth.py:25 contrib/admin/views/main.py:271
+#: contrib/admin/views/main.py:356
+msgid "You may edit it again below."
+msgstr ""
+
+#: contrib/admin/views/auth.py:31
+msgid "Add user"
+msgstr ""
+
+#: contrib/admin/views/auth.py:58
+msgid "Password changed successfully."
+msgstr ""
+
+#: contrib/admin/views/auth.py:65
+#, python-format
+msgid "Change password: %s"
+msgstr ""
+
+#: contrib/admin/views/decorators.py:11 contrib/auth/forms.py:60
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+
+#: contrib/admin/views/decorators.py:63
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+
+#: contrib/admin/views/decorators.py:70
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+
+#: contrib/admin/views/decorators.py:84
+msgid "Usernames cannot contain the '@' character."
+msgstr ""
+
+#: contrib/admin/views/decorators.py:86
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr ""
+
+#: contrib/admin/views/doc.py:48 contrib/admin/views/doc.py:50
+#: contrib/admin/views/doc.py:52
+msgid "tag:"
+msgstr ""
+
+#: contrib/admin/views/doc.py:79 contrib/admin/views/doc.py:81
+#: contrib/admin/views/doc.py:83
+msgid "filter:"
+msgstr ""
+
+#: contrib/admin/views/doc.py:137 contrib/admin/views/doc.py:139
+#: contrib/admin/views/doc.py:141
+msgid "view:"
+msgstr ""
+
+#: contrib/admin/views/doc.py:166
+#, python-format
+msgid "App %r not found"
+msgstr ""
+
+#: contrib/admin/views/doc.py:173
+#, python-format
+msgid "Model %(name)r not found in app %(label)r"
+msgstr ""
+
+#: contrib/admin/views/doc.py:185
+#, python-format
+msgid "the related `%(label)s.%(type)s` object"
+msgstr ""
+
+#: contrib/admin/views/doc.py:185 contrib/admin/views/doc.py:207
+#: contrib/admin/views/doc.py:221 contrib/admin/views/doc.py:226
+msgid "model:"
+msgstr ""
+
+#: contrib/admin/views/doc.py:216
+#, python-format
+msgid "related `%(label)s.%(name)s` objects"
+msgstr ""
+
+#: contrib/admin/views/doc.py:221
+#, python-format
+msgid "all %s"
+msgstr ""
+
+#: contrib/admin/views/doc.py:226
+#, python-format
+msgid "number of %s"
+msgstr ""
+
+#: contrib/admin/views/doc.py:231
+#, python-format
+msgid "Fields on %s objects"
+msgstr ""
+
+#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:304
+#: contrib/admin/views/doc.py:306 contrib/admin/views/doc.py:312
+#: contrib/admin/views/doc.py:313 contrib/admin/views/doc.py:315
+msgid "Integer"
+msgstr ""
+
+#: contrib/admin/views/doc.py:294
+msgid "Boolean (Either True or False)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:314
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:296
+msgid "Comma-separated integers"
+msgstr ""
+
+#: contrib/admin/views/doc.py:297
+msgid "Date (without time)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:298
+msgid "Date (with time)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:299
+msgid "Decimal number"
+msgstr ""
+
+#: contrib/admin/views/doc.py:300
+msgid "E-mail address"
+msgstr ""
+
+#: contrib/admin/views/doc.py:301 contrib/admin/views/doc.py:302
+#: contrib/admin/views/doc.py:305
+msgid "File path"
+msgstr ""
+
+#: contrib/admin/views/doc.py:303
+msgid "Floating point number"
+msgstr ""
+
+#: contrib/admin/views/doc.py:307 contrib/comments/models.py:85
+msgid "IP address"
+msgstr ""
+
+#: contrib/admin/views/doc.py:309
+msgid "Boolean (Either True, False or None)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:310
+msgid "Relation to parent model"
+msgstr ""
+
+#: contrib/admin/views/doc.py:311
+msgid "Phone number"
+msgstr ""
+
+#: contrib/admin/views/doc.py:316
+msgid "Text"
+msgstr ""
+
+#: contrib/admin/views/doc.py:317
+msgid "Time"
+msgstr ""
+
+#: contrib/admin/views/doc.py:318 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr ""
+
+#: contrib/admin/views/doc.py:319
+msgid "U.S. state (two uppercase letters)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:320
+msgid "XML text"
+msgstr ""
+
+#: contrib/admin/views/doc.py:346
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr ""
+
+#: contrib/admin/views/main.py:233
+msgid "Site administration"
+msgstr ""
+
+#: contrib/admin/views/main.py:280 contrib/admin/views/main.py:365
+#, python-format
+msgid "You may add another %s below."
+msgstr ""
+
+#: contrib/admin/views/main.py:298
+#, python-format
+msgid "Add %s"
+msgstr ""
+
+#: contrib/admin/views/main.py:344
+#, python-format
+msgid "Added %s."
+msgstr ""
+
+#: contrib/admin/views/main.py:344 contrib/admin/views/main.py:346
+#: contrib/admin/views/main.py:348 core/validators.py:283
+#: db/models/manipulators.py:309
+msgid "and"
+msgstr ""
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "Changed %s."
+msgstr ""
+
+#: contrib/admin/views/main.py:348
+#, python-format
+msgid "Deleted %s."
+msgstr ""
+
+#: contrib/admin/views/main.py:351
+msgid "No fields changed."
+msgstr ""
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr ""
+
+#: contrib/admin/views/main.py:362
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+
+#: contrib/admin/views/main.py:400
+#, python-format
+msgid "Change %s"
+msgstr ""
+
+#: contrib/admin/views/main.py:487
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr ""
+
+#: contrib/admin/views/main.py:492
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr ""
+
+#: contrib/admin/views/main.py:524
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr ""
+
+#: contrib/admin/views/main.py:527
+msgid "Are you sure?"
+msgstr ""
+
+#: contrib/admin/views/main.py:549
+#, python-format
+msgid "Change history: %s"
+msgstr ""
+
+#: contrib/admin/views/main.py:583
+#, python-format
+msgid "Select %s"
+msgstr ""
+
+#: contrib/admin/views/main.py:583
+#, python-format
+msgid "Select %s to change"
+msgstr ""
+
+#: contrib/admin/views/main.py:784
+msgid "Database error"
+msgstr ""
+
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr ""
+
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr ""
+
+#: contrib/auth/forms.py:53
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr ""
+
+#: contrib/auth/forms.py:84
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr ""
+
+#: contrib/auth/forms.py:107
+#, python-format
+msgid "Password reset on %s"
+msgstr ""
+
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr ""
+
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr ""
+
+#: contrib/auth/models.py:73 contrib/auth/models.py:93
+msgid "name"
+msgstr ""
+
+#: contrib/auth/models.py:75
+msgid "codename"
+msgstr ""
+
+#: contrib/auth/models.py:78
+msgid "permission"
+msgstr ""
+
+#: contrib/auth/models.py:79 contrib/auth/models.py:94
+msgid "permissions"
+msgstr ""
+
+#: contrib/auth/models.py:97
+msgid "group"
+msgstr ""
+
+#: contrib/auth/models.py:98 contrib/auth/models.py:141
+msgid "groups"
+msgstr ""
+
+#: contrib/auth/models.py:131
+msgid "username"
+msgstr ""
+
+#: contrib/auth/models.py:131
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr ""
+
+#: contrib/auth/models.py:132
+msgid "first name"
+msgstr ""
+
+#: contrib/auth/models.py:133
+msgid "last name"
+msgstr ""
+
+#: contrib/auth/models.py:134
+msgid "e-mail address"
+msgstr ""
+
+#: contrib/auth/models.py:135
+msgid "password"
+msgstr ""
+
+#: contrib/auth/models.py:135
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+
+#: contrib/auth/models.py:136
+msgid "staff status"
+msgstr ""
+
+#: contrib/auth/models.py:136
+msgid "Designates whether the user can log into this admin site."
+msgstr ""
+
+#: contrib/auth/models.py:137
+msgid "active"
+msgstr ""
+
+#: contrib/auth/models.py:137
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+
+#: contrib/auth/models.py:138
+msgid "superuser status"
+msgstr ""
+
+#: contrib/auth/models.py:138
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr ""
+
+#: contrib/auth/models.py:139
+msgid "last login"
+msgstr ""
+
+#: contrib/auth/models.py:140
+msgid "date joined"
+msgstr ""
+
+#: contrib/auth/models.py:142
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+
+#: contrib/auth/models.py:143
+msgid "user permissions"
+msgstr ""
+
+#: contrib/auth/models.py:147
+msgid "user"
+msgstr ""
+
+#: contrib/auth/models.py:148
+msgid "users"
+msgstr ""
+
+#: contrib/auth/models.py:154
+msgid "Personal info"
+msgstr ""
+
+#: contrib/auth/models.py:155
+msgid "Permissions"
+msgstr ""
+
+#: contrib/auth/models.py:156
+msgid "Important dates"
+msgstr ""
+
+#: contrib/auth/models.py:157
+msgid "Groups"
+msgstr ""
+
+#: contrib/auth/models.py:316
+msgid "message"
+msgstr ""
+
+#: contrib/auth/views.py:47
+msgid "Logged out"
+msgstr ""
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:169
+msgid "object ID"
+msgstr ""
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr ""
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:170
+msgid "comment"
+msgstr ""
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr ""
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr ""
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr ""
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr ""
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr ""
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr ""
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr ""
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr ""
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr ""
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:172
+msgid "date/time submitted"
+msgstr ""
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:173
+msgid "is public"
+msgstr ""
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr ""
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr ""
+
+#: contrib/comments/models.py:134 contrib/comments/models.py:213
+msgid "Content object"
+msgstr ""
+
+#: contrib/comments/models.py:162
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+
+#: contrib/comments/models.py:171
+msgid "person's name"
+msgstr ""
+
+#: contrib/comments/models.py:174
+msgid "ip address"
+msgstr ""
+
+#: contrib/comments/models.py:176
+msgid "approved by staff"
+msgstr ""
+
+#: contrib/comments/models.py:179
+msgid "free comment"
+msgstr ""
+
+#: contrib/comments/models.py:180
+msgid "free comments"
+msgstr ""
+
+#: contrib/comments/models.py:239
+msgid "score"
+msgstr ""
+
+#: contrib/comments/models.py:240
+msgid "score date"
+msgstr ""
+
+#: contrib/comments/models.py:243
+msgid "karma score"
+msgstr ""
+
+#: contrib/comments/models.py:244
+msgid "karma scores"
+msgstr ""
+
+#: contrib/comments/models.py:248
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr ""
+
+#: contrib/comments/models.py:264
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+
+#: contrib/comments/models.py:271
+msgid "flag date"
+msgstr ""
+
+#: contrib/comments/models.py:274
+msgid "user flag"
+msgstr ""
+
+#: contrib/comments/models.py:275
+msgid "user flags"
+msgstr ""
+
+#: contrib/comments/models.py:279
+#, python-format
+msgid "Flag by %r"
+msgstr ""
+
+#: contrib/comments/models.py:284
+msgid "deletion date"
+msgstr ""
+
+#: contrib/comments/models.py:286
+msgid "moderator deletion"
+msgstr ""
+
+#: contrib/comments/models.py:287
+msgid "moderator deletions"
+msgstr ""
+
+#: contrib/comments/models.py:291
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr ""
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr ""
+
+#: contrib/comments/views/comments.py:28
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr ""
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+
+#: contrib/comments/views/comments.py:190
+#: contrib/comments/views/comments.py:283
+msgid "Only POSTs are allowed"
+msgstr ""
+
+#: contrib/comments/views/comments.py:194
+#: contrib/comments/views/comments.py:287
+msgid "One or more of the required fields wasn't submitted"
+msgstr ""
+
+#: contrib/comments/views/comments.py:198
+#: contrib/comments/views/comments.py:289
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr ""
+
+#: contrib/comments/views/comments.py:208
+#: contrib/comments/views/comments.py:295
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+
+#: contrib/comments/views/comments.py:259
+#: contrib/comments/views/comments.py:324
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr ""
+
+#: contrib/comments/views/karma.py:21
+msgid "Anonymous users cannot vote"
+msgstr ""
+
+#: contrib/comments/views/karma.py:25
+msgid "Invalid comment ID"
+msgstr ""
+
+#: contrib/comments/views/karma.py:27
+msgid "No voting for yourself"
+msgstr ""
+
+#: contrib/contenttypes/models.py:37
+msgid "python model class name"
+msgstr ""
+
+#: contrib/contenttypes/models.py:40
+msgid "content type"
+msgstr ""
+
+#: contrib/contenttypes/models.py:41
+msgid "content types"
+msgstr ""
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr ""
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr ""
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr ""
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr ""
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr ""
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr ""
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:20
+msgid "th"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:20
+msgid "st"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:20
+msgid "nd"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:20
+msgid "rd"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:52
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/humanize/templatetags/humanize.py:55
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/humanize/templatetags/humanize.py:58
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "one"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "two"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "three"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "four"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "five"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "six"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "seven"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "eight"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "nine"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:94
+msgid "today"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:96
+msgid "tomorrow"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:98
+msgid "yesterday"
+msgstr ""
+
+#: contrib/localflavor/ar/forms.py:30 contrib/localflavor/ar/forms.py:38
+msgid "Enter a postal code in the format NNNN or ANNNNAAA."
+msgstr ""
+
+#: contrib/localflavor/ar/forms.py:61 contrib/localflavor/br/forms.py:103
+#: contrib/localflavor/pe/forms.py:34 contrib/localflavor/pe/forms.py:57
+msgid "This field requires only numbers."
+msgstr ""
+
+#: contrib/localflavor/ar/forms.py:64
+msgid "This field requires 7 or 8 digits."
+msgstr ""
+
+#: contrib/localflavor/ar/forms.py:75
+msgid "Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format."
+msgstr ""
+
+#: contrib/localflavor/ar/forms.py:88
+msgid "Invalid CUIT."
+msgstr ""
+
+#: contrib/localflavor/au/forms.py:18
+msgid "Enter a 4 digit post code."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:23
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:35
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:68
+msgid ""
+"Select a valid brazilian state. That state is not one of the available "
+"states."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:105
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:115
+msgid "Invalid CPF number."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:137
+msgid "This field requires at least 14 digits"
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:147
+msgid "Invalid CNPJ number."
+msgstr ""
+
+#: contrib/localflavor/ca/forms.py:19
+msgid "Enter a postal code in the format XXX XXX."
+msgstr ""
+
+#: contrib/localflavor/ca/forms.py:81
+msgid "Enter a valid Canadian Social Insurance number in XXX-XXX-XXXX format."
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr ""
+
+#: contrib/localflavor/ch/forms.py:18 contrib/localflavor/no/forms.py:14
+msgid "Enter a zip code in the format XXXX."
+msgstr ""
+
+#: contrib/localflavor/ch/forms.py:90
+msgid ""
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
+msgstr ""
+
+#: contrib/localflavor/cl/forms.py:32
+msgid "Enter valid a Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr ""
+
+#: contrib/localflavor/cl/forms.py:37
+msgid "Enter valid a Chilean RUT"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr ""
+
+#: contrib/localflavor/de/forms.py:16 contrib/localflavor/fi/forms.py:14
+#: contrib/localflavor/fr/forms.py:17
+msgid "Enter a zip code in the format XXXXX."
+msgstr ""
+
+#: contrib/localflavor/de/forms.py:60
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:5
+msgid "Arava"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:6
+msgid "Albacete"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:7
+msgid "Alacant"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:8
+msgid "Almeria"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:9
+msgid "Avila"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:10
+msgid "Badajoz"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:11
+msgid "Illes Balears"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:12
+msgid "Barcelona"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:13
+msgid "Burgos"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:14
+msgid "Caceres"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:15
+msgid "Cadiz"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:16
+msgid "Castello"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:17
+msgid "Ciudad Real"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:18
+msgid "Cordoba"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:19
+msgid "A Coruna"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:20
+msgid "Cuenca"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:21
+msgid "Girona"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:22
+msgid "Granada"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:23
+msgid "Guadalajara"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:24
+msgid "Guipuzkoa"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:25
+msgid "Huelva"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:26
+msgid "Huesca"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:27
+msgid "Jaen"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:28
+msgid "Leon"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:29
+msgid "Lleida"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:30
+#: contrib/localflavor/es/es_regions.py:17
+msgid "La Rioja"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:31
+msgid "Lugo"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:32
+#: contrib/localflavor/es/es_regions.py:18
+msgid "Madrid"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:33
+msgid "Malaga"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:34
+msgid "Murcia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:35
+msgid "Navarre"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:36
+msgid "Ourense"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:37
+msgid "Asturias"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:38
+msgid "Palencia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:39
+msgid "Las Palmas"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:40
+msgid "Pontevedra"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:41
+msgid "Salamanca"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:42
+msgid "Santa Cruz de Tenerife"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:43
+#: contrib/localflavor/es/es_regions.py:11
+msgid "Cantabria"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:44
+msgid "Segovia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:45
+msgid "Seville"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:46
+msgid "Soria"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:47
+msgid "Tarragona"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:48
+msgid "Teruel"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:49
+msgid "Toledo"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:50
+msgid "Valencia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:51
+msgid "Valladolid"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:52
+msgid "Bizkaia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:53
+msgid "Zamora"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:54
+msgid "Zaragoza"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:55
+msgid "Ceuta"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:56
+msgid "Melilla"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:5
+msgid "Andalusia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:6
+msgid "Aragon"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:7
+msgid "Principality of Asturias"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:8
+msgid "Balearic Islands"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:9
+msgid "Basque Country"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:10
+msgid "Canary Islands"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:12
+msgid "Castile-La Mancha"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:13
+msgid "Castile and Leon"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:14
+msgid "Catalonia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:15
+msgid "Extremadura"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:16
+msgid "Galicia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:19
+msgid "Region of Murcia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:20
+msgid "Foral Community of Navarre"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:21
+msgid "Valencian Community"
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:22
+msgid "Enter a valid postal code in the range and format 01XXX - 52XXX."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:39
+msgid ""
+"Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or "
+"9XXXXXXXX."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:73 contrib/localflavor/es/forms.py:108
+#: db/models/fields/related.py:55
+#, python-format
+msgid "Please enter a valid %s."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:91
+msgid "Invalid checksum for NIF."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:97
+msgid "Invalid checksum for NIE."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:106
+msgid "Invalid checksum for CIF."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:136
+msgid ""
+"Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:150
+msgid "Invalid checksum for bank account number."
+msgstr ""
+
+#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:45
+msgid "Enter a valid Finnish social security number."
+msgstr ""
+
+#: contrib/localflavor/in_/forms.py:16
+msgid "Enter a zip code in the format XXXXXXX."
+msgstr ""
+
+#: contrib/localflavor/is_/forms.py:17
+msgid ""
+"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr ""
+
+#: contrib/localflavor/is_/forms.py:31
+msgid "The Icelandic identification number is not valid."
+msgstr ""
+
+#: contrib/localflavor/it/forms.py:16
+msgid "Enter a valid zip code."
+msgstr ""
+
+#: contrib/localflavor/it/forms.py:41
+msgid "Enter a valid Social Security number."
+msgstr ""
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr ""
+
+#: contrib/localflavor/jp/forms.py:21
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr ""
+
+#: contrib/localflavor/nl/forms.py:25
+msgid "Enter a valid postal code"
+msgstr ""
+
+#: contrib/localflavor/nl/forms.py:53
+msgid "Enter a valid phone number"
+msgstr ""
+
+#: contrib/localflavor/nl/forms.py:76
+msgid "Enter a valid SoFi number"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:4
+msgid "Drente"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:5
+msgid "Flevoland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:6
+msgid "Friesland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:7
+msgid "Gelderland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:8
+msgid "Groningen"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:9
+msgid "Limburg"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:10
+msgid "Noord-Brabant"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:11
+msgid "Noord-Holland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:12
+msgid "Overijssel"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:13
+msgid "Utrecht"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:14
+msgid "Zeeland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:15
+msgid "Zuid-Holland"
+msgstr ""
+
+#: contrib/localflavor/no/forms.py:35
+msgid "Enter a valid Norwegian social security number."
+msgstr ""
+
+#: contrib/localflavor/pe/forms.py:36
+msgid "This field requires 8 digits."
+msgstr ""
+
+#: contrib/localflavor/pe/forms.py:59
+msgid "This field requires 11 digits."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:41
+msgid "National Identification Number consists of 11 digits."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:47
+msgid "Wrong checksum for the National Identification Number."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:72
+msgid ""
+"Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:78
+msgid "Wrong checksum for the Tax Number (NIP)."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:107
+msgid "National Business Register Number (REGON) consists of 7 or 9 digits."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:113
+msgid "Wrong checksum for the National Business Register Number (REGON)."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:148
+msgid "Enter a postal code in the format XX-XXX."
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:8
+msgid "Lower Silesia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:9
+msgid "Kuyavia-Pomerania"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:10
+msgid "Lublin"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:11
+msgid "Lubusz"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:12
+msgid "Lodz"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:13
+msgid "Lesser Poland"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:14
+msgid "Masovia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:15
+msgid "Opole"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:16
+msgid "Subcarpatia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:17
+msgid "Podlasie"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:18
+msgid "Pomerania"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:19
+msgid "Silesia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:20
+msgid "Swietokrzyskie"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:21
+msgid "Warmia-Masuria"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:22
+msgid "Greater Poland"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:23
+msgid "West Pomerania"
+msgstr ""
+
+#: contrib/localflavor/sk/forms.py:32
+msgid "Enter a postal code in the format XXXXX or XXX XX."
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:8
+msgid "Banska Bystrica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:9
+msgid "Banska Stiavnica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:10
+msgid "Bardejov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:11
+msgid "Banovce nad Bebravou"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:12
+msgid "Brezno"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:13
+msgid "Bratislava I"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:14
+msgid "Bratislava II"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:15
+msgid "Bratislava III"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:16
+msgid "Bratislava IV"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:17
+msgid "Bratislava V"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:18
+msgid "Bytca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:19
+msgid "Cadca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:20
+msgid "Detva"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:21
+msgid "Dolny Kubin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:22
+msgid "Dunajska Streda"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:23
+msgid "Galanta"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:24
+msgid "Gelnica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:25
+msgid "Hlohovec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:26
+msgid "Humenne"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:27
+msgid "Ilava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:28
+msgid "Kezmarok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:29
+msgid "Komarno"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:30
+msgid "Kosice I"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:31
+msgid "Kosice II"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:32
+msgid "Kosice III"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:33
+msgid "Kosice IV"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:34
+msgid "Kosice - okolie"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:35
+msgid "Krupina"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:36
+msgid "Kysucke Nove Mesto"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:37
+msgid "Levice"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:38
+msgid "Levoca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:39
+msgid "Liptovsky Mikulas"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:40
+msgid "Lucenec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:41
+msgid "Malacky"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:42
+msgid "Martin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:43
+msgid "Medzilaborce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:44
+msgid "Michalovce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:45
+msgid "Myjava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:46
+msgid "Namestovo"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:47
+msgid "Nitra"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:48
+msgid "Nove Mesto nad Vahom"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:49
+msgid "Nove Zamky"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:50
+msgid "Partizanske"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:51
+msgid "Pezinok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:52
+msgid "Piestany"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:53
+msgid "Poltar"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:54
+msgid "Poprad"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:55
+msgid "Povazska Bystrica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:56
+msgid "Presov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:57
+msgid "Prievidza"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:58
+msgid "Puchov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:59
+msgid "Revuca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:60
+msgid "Rimavska Sobota"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:61
+msgid "Roznava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:62
+msgid "Ruzomberok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:63
+msgid "Sabinov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:64
+msgid "Senec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:65
+msgid "Senica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:66
+msgid "Skalica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:67
+msgid "Snina"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:68
+msgid "Sobrance"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:69
+msgid "Spisska Nova Ves"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:70
+msgid "Stara Lubovna"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:71
+msgid "Stropkov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:72
+msgid "Svidnik"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:73
+msgid "Sala"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:74
+msgid "Topolcany"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:75
+msgid "Trebisov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:76
+msgid "Trencin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:77
+msgid "Trnava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:78
+msgid "Turcianske Teplice"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:79
+msgid "Tvrdosin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:80
+msgid "Velky Krtis"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:81
+msgid "Vranov nad Toplou"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:82
+msgid "Zlate Moravce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:83
+msgid "Zvolen"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:84
+msgid "Zarnovica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:85
+msgid "Ziar nad Hronom"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:86
+msgid "Zilina"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:8
+msgid "Banska Bystrica region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:9
+msgid "Bratislava region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:10
+msgid "Kosice region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:11
+msgid "Nitra region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:12
+msgid "Presov region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:13
+msgid "Trencin region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:14
+msgid "Trnava region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:15
+msgid "Zilina region"
+msgstr ""
+
+#: contrib/localflavor/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
+msgstr ""
+
+#: contrib/localflavor/us/forms.py:18
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr ""
+
+#: contrib/localflavor/us/forms.py:51
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr ""
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr ""
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr ""
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr ""
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr ""
+
+#: contrib/sessions/models.py:80
+msgid "session key"
+msgstr ""
+
+#: contrib/sessions/models.py:81
+msgid "session data"
+msgstr ""
+
+#: contrib/sessions/models.py:82
+msgid "expire date"
+msgstr ""
+
+#: contrib/sessions/models.py:87
+msgid "session"
+msgstr ""
+
+#: contrib/sessions/models.py:88
+msgid "sessions"
+msgstr ""
+
+#: contrib/sites/models.py:32
+msgid "domain name"
+msgstr ""
+
+#: contrib/sites/models.py:33
+msgid "display name"
+msgstr ""
+
+#: contrib/sites/models.py:37
+msgid "site"
+msgstr ""
+
+#: contrib/sites/models.py:38
+msgid "sites"
+msgstr ""
+
+#: core/validators.py:72
+msgid "This value must contain only letters, numbers and underscores."
+msgstr ""
+
+#: core/validators.py:76
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+
+#: core/validators.py:80
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr ""
+
+#: core/validators.py:84
+msgid "Uppercase letters are not allowed here."
+msgstr ""
+
+#: core/validators.py:88
+msgid "Lowercase letters are not allowed here."
+msgstr ""
+
+#: core/validators.py:95
+msgid "Enter only digits separated by commas."
+msgstr ""
+
+#: core/validators.py:107
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr ""
+
+#: core/validators.py:111
+msgid "Please enter a valid IP address."
+msgstr ""
+
+#: core/validators.py:115
+msgid "Empty values are not allowed here."
+msgstr ""
+
+#: core/validators.py:119
+msgid "Non-numeric characters aren't allowed here."
+msgstr ""
+
+#: core/validators.py:123
+msgid "This value can't be comprised solely of digits."
+msgstr ""
+
+#: core/validators.py:128 newforms/fields.py:157
+msgid "Enter a whole number."
+msgstr ""
+
+#: core/validators.py:132
+msgid "Only alphabetical characters are allowed here."
+msgstr ""
+
+#: core/validators.py:147
+msgid "Year must be 1900 or later."
+msgstr ""
+
+#: core/validators.py:151
+#, python-format
+msgid "Invalid date: %s"
+msgstr ""
+
+#: core/validators.py:156 db/models/fields/__init__.py:509
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr ""
+
+#: core/validators.py:161
+msgid "Enter a valid time in HH:MM format."
+msgstr ""
+
+#: core/validators.py:165 db/models/fields/__init__.py:583
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr ""
+
+#: core/validators.py:170 newforms/fields.py:408
+msgid "Enter a valid e-mail address."
+msgstr ""
+
+#: core/validators.py:182 core/validators.py:474 newforms/fields.py:438
+#: oldforms/__init__.py:687
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+
+#: core/validators.py:193 newforms/fields.py:462
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+
+#: core/validators.py:200
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr ""
+
+#: core/validators.py:204
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+
+#: core/validators.py:212
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr ""
+
+#: core/validators.py:216
+msgid "A valid URL is required."
+msgstr ""
+
+#: core/validators.py:230
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+
+#: core/validators.py:237
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr ""
+
+#: core/validators.py:254
+#, python-format
+msgid "Invalid URL: %s"
+msgstr ""
+
+#: core/validators.py:259 core/validators.py:261
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr ""
+
+#: core/validators.py:267
+msgid "Enter a valid U.S. state abbreviation."
+msgstr ""
+
+#: core/validators.py:281
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:288
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr ""
+
+#: core/validators.py:307
+msgid "Please enter something for at least one field."
+msgstr ""
+
+#: core/validators.py:316 core/validators.py:327
+msgid "Please enter both fields or leave them both empty."
+msgstr ""
+
+#: core/validators.py:335
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr ""
+
+#: core/validators.py:348
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr ""
+
+#: core/validators.py:367
+msgid "Duplicate values are not allowed."
+msgstr ""
+
+#: core/validators.py:382
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr ""
+
+#: core/validators.py:384
+#, python-format
+msgid "This value must be at least %s."
+msgstr ""
+
+#: core/validators.py:386
+#, python-format
+msgid "This value must be no more than %s."
+msgstr ""
+
+#: core/validators.py:427
+#, python-format
+msgid "This value must be a power of %s."
+msgstr ""
+
+#: core/validators.py:437
+msgid "Please enter a valid decimal number."
+msgstr ""
+
+#: core/validators.py:444
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:447
+#, python-format
+msgid ""
+"Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural ""
+"Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:450
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:458
+msgid "Please enter a valid floating point number."
+msgstr ""
+
+#: core/validators.py:467
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr ""
+
+#: core/validators.py:468
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr ""
+
+#: core/validators.py:485
+msgid "The format for this field is wrong."
+msgstr ""
+
+#: core/validators.py:500
+msgid "This field is invalid."
+msgstr ""
+
+#: core/validators.py:536
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr ""
+
+#: core/validators.py:539
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+
+#: core/validators.py:572
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:576
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:581
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+
+#: core/validators.py:586
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+
+#: core/validators.py:590
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:595
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: db/models/manipulators.py:308
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr ""
+
+#: db/models/fields/__init__.py:52
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr ""
+
+#: db/models/fields/__init__.py:161 db/models/fields/__init__.py:318
+#: db/models/fields/__init__.py:735 db/models/fields/__init__.py:746
+#: newforms/fields.py:45 oldforms/__init__.py:374
+msgid "This field is required."
+msgstr ""
+
+#: db/models/fields/__init__.py:418
+msgid "This value must be an integer."
+msgstr ""
+
+#: db/models/fields/__init__.py:454
+msgid "This value must be either True or False."
+msgstr ""
+
+#: db/models/fields/__init__.py:475
+msgid "This field cannot be null."
+msgstr ""
+
+#: db/models/fields/__init__.py:644
+msgid "This value must be a decimal number."
+msgstr ""
+
+#: db/models/fields/__init__.py:755
+msgid "Enter a valid filename."
+msgstr ""
+
+#: db/models/fields/__init__.py:904
+msgid "This value must be either None, True or False."
+msgstr ""
+
+#: db/models/fields/related.py:658
+msgid "Separate multiple IDs with commas."
+msgstr ""
+
+#: db/models/fields/related.py:660
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+#: db/models/fields/related.py:707
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+msgstr[1] ""
+
+#: newforms/fields.py:46
+msgid "Enter a valid value."
+msgstr ""
+
+#: newforms/fields.py:129
+#, python-format
+msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+msgstr ""
+
+#: newforms/fields.py:130
+#, python-format
+msgid "Ensure this value has at least %(min)d characters (it has %(length)d)."
+msgstr ""
+
+#: newforms/fields.py:158 newforms/fields.py:187 newforms/fields.py:216
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr ""
+
+#: newforms/fields.py:159 newforms/fields.py:188 newforms/fields.py:217
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr ""
+
+#: newforms/fields.py:186 newforms/fields.py:215
+msgid "Enter a number."
+msgstr ""
+
+#: newforms/fields.py:218
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr ""
+
+#: newforms/fields.py:219
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr ""
+
+#: newforms/fields.py:220
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr ""
+
+#: newforms/fields.py:268 newforms/fields.py:724
+msgid "Enter a valid date."
+msgstr ""
+
+#: newforms/fields.py:301 newforms/fields.py:725
+msgid "Enter a valid time."
+msgstr ""
+
+#: newforms/fields.py:340
+msgid "Enter a valid date/time."
+msgstr ""
+
+#: newforms/fields.py:439
+msgid "No file was submitted."
+msgstr ""
+
+#: newforms/fields.py:440 oldforms/__init__.py:689
+msgid "The submitted file is empty."
+msgstr ""
+
+#: newforms/fields.py:498
+msgid "Enter a valid URL."
+msgstr ""
+
+#: newforms/fields.py:499
+msgid "This URL appears to be a broken link."
+msgstr ""
+
+#: newforms/fields.py:560 newforms/models.py:155
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr ""
+
+#: newforms/fields.py:599
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr ""
+
+#: newforms/fields.py:600 newforms/fields.py:662 newforms/models.py:215
+msgid "Enter a list of values."
+msgstr ""
+
+#: newforms/fields.py:753
+msgid "Enter a valid IPv4 address."
+msgstr ""
+
+#: newforms/models.py:216
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr ""
+
+#: oldforms/__init__.py:409
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] ""
+msgstr[1] ""
+
+#: oldforms/__init__.py:414
+msgid "Line breaks are not allowed here."
+msgstr ""
+
+#: oldforms/__init__.py:512 oldforms/__init__.py:586 oldforms/__init__.py:625
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr ""
+
+#: oldforms/__init__.py:745
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr ""
+
+#: oldforms/__init__.py:755
+msgid "Enter a positive number."
+msgstr ""
+
+#: oldforms/__init__.py:765
+msgid "Enter a whole number between 0 and 32,767."
+msgstr ""
+
+#: template/defaultfilters.py:658
+msgid "yes,no,maybe"
+msgstr ""
+
+#: template/defaultfilters.py:689
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: template/defaultfilters.py:691
+#, python-format
+msgid "%.1f KB"
+msgstr ""
+
+#: template/defaultfilters.py:693
+#, python-format
+msgid "%.1f MB"
+msgstr ""
+
+#: template/defaultfilters.py:694
+#, python-format
+msgid "%.1f GB"
+msgstr ""
+
+#: utils/dateformat.py:41
+msgid "p.m."
+msgstr ""
+
+#: utils/dateformat.py:42
+msgid "a.m."
+msgstr ""
+
+#: utils/dateformat.py:47
+msgid "PM"
+msgstr ""
+
+#: utils/dateformat.py:48
+msgid "AM"
+msgstr ""
+
+#: utils/dateformat.py:97
+msgid "midnight"
+msgstr ""
+
+#: utils/dateformat.py:99
+msgid "noon"
+msgstr ""
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr ""
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr ""
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr ""
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr ""
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr ""
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr ""
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr ""
+
+#: utils/dates.py:10
+msgid "Mon"
+msgstr ""
+
+#: utils/dates.py:10
+msgid "Tue"
+msgstr ""
+
+#: utils/dates.py:10
+msgid "Wed"
+msgstr ""
+
+#: utils/dates.py:10
+msgid "Thu"
+msgstr ""
+
+#: utils/dates.py:10
+msgid "Fri"
+msgstr ""
+
+#: utils/dates.py:11
+msgid "Sat"
+msgstr ""
+
+#: utils/dates.py:11
+msgid "Sun"
+msgstr ""
+
+#: utils/dates.py:18
+msgid "January"
+msgstr ""
+
+#: utils/dates.py:18
+msgid "February"
+msgstr ""
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "March"
+msgstr ""
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "April"
+msgstr ""
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "May"
+msgstr ""
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "June"
+msgstr ""
+
+#: utils/dates.py:19 utils/dates.py:31
+msgid "July"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "August"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "September"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "October"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "November"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "December"
+msgstr ""
+
+#: utils/dates.py:23
+msgid "jan"
+msgstr ""
+
+#: utils/dates.py:23
+msgid "feb"
+msgstr ""
+
+#: utils/dates.py:23
+msgid "mar"
+msgstr ""
+
+#: utils/dates.py:23
+msgid "apr"
+msgstr ""
+
+#: utils/dates.py:23
+msgid "may"
+msgstr ""
+
+#: utils/dates.py:23
+msgid "jun"
+msgstr ""
+
+#: utils/dates.py:24
+msgid "jul"
+msgstr ""
+
+#: utils/dates.py:24
+msgid "aug"
+msgstr ""
+
+#: utils/dates.py:24
+msgid "sep"
+msgstr ""
+
+#: utils/dates.py:24
+msgid "oct"
+msgstr ""
+
+#: utils/dates.py:24
+msgid "nov"
+msgstr ""
+
+#: utils/dates.py:24
+msgid "dec"
+msgstr ""
+
+#: utils/dates.py:31
+msgid "Jan."
+msgstr ""
+
+#: utils/dates.py:31
+msgid "Feb."
+msgstr ""
+
+#: utils/dates.py:32
+msgid "Aug."
+msgstr ""
+
+#: utils/dates.py:32
+msgid "Sept."
+msgstr ""
+
+#: utils/dates.py:32
+msgid "Oct."
+msgstr ""
+
+#: utils/dates.py:32
+msgid "Nov."
+msgstr ""
+
+#: utils/dates.py:32
+msgid "Dec."
+msgstr ""
+
+#: utils/text.py:127
+msgid "or"
+msgstr ""
+
+#: utils/timesince.py:21
+msgid "year"
+msgid_plural "years"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:22
+msgid "month"
+msgid_plural "months"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:23
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:24
+msgid "day"
+msgid_plural "days"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:25
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:26
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:46
+msgid "minutes"
+msgstr ""
+
+#: utils/timesince.py:51
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr ""
+
+#: utils/timesince.py:57
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ""
+
+#: utils/translation/trans_real.py:399
+msgid "DATE_FORMAT"
+msgstr "N j, Y"
+
+#: utils/translation/trans_real.py:400
+msgid "DATETIME_FORMAT"
+msgstr "N j, Y, P"
+
+#: utils/translation/trans_real.py:401
+msgid "TIME_FORMAT"
+msgstr "P"
+
+#: utils/translation/trans_real.py:417
+msgid "YEAR_MONTH_FORMAT"
+msgstr "F Y"
+
+#: utils/translation/trans_real.py:418
+msgid "MONTH_DAY_FORMAT"
+msgstr "F j"
+
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr ""
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr ""
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr ""
diff --git a/webapp/django/conf/locale/en/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/en/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..80dd04a
--- /dev/null
+++ b/webapp/django/conf/locale/en/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/en/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/en/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..bf48501
--- /dev/null
+++ b/webapp/django/conf/locale/en/LC_MESSAGES/djangojs.po
@@ -0,0 +1,117 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-11-29 10:58-0600\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr ""
+
+#: contrib/admin/media/js/calendar.js:24
+#: contrib/admin/media/js/dateparse.js:32
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr ""
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr ""
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr ""
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Now"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
+msgid "Clock"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
+msgid "Choose a time"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "Midnight"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "6 a.m."
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
+msgid "Noon"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
+msgid "Cancel"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
+msgid "Today"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
+msgid "Calendar"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
+msgid "Yesterday"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
+msgid "Tomorrow"
+msgstr ""
diff --git a/webapp/django/conf/locale/es/LC_MESSAGES/django.mo b/webapp/django/conf/locale/es/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..49f4fa3
--- /dev/null
+++ b/webapp/django/conf/locale/es/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/es/LC_MESSAGES/django.po b/webapp/django/conf/locale/es/LC_MESSAGES/django.po
new file mode 100644
index 0000000..78e6b75
--- /dev/null
+++ b/webapp/django/conf/locale/es/LC_MESSAGES/django.po
@@ -0,0 +1,4322 @@
+# Spanish translation for the django project
+# Copyright (C) 2008, The Django Project
+# This file is distributed under the same license as the django package.
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-07-24 12:48+0200\n"
+"PO-Revision-Date: 2008-07-24 13:30+0100\n"
+"Last-Translator: Django Spanish Translation Team <django-cat@googlegroups.com>\n"
+"Language-Team: Django Spanish Translation Team <django-cat@googlegroups.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: conf/global_settings.py:44
+msgid "Arabic"
+msgstr "árabe"
+
+#: conf/global_settings.py:45
+msgid "Bengali"
+msgstr "bengalí"
+
+#: conf/global_settings.py:46
+msgid "Bulgarian"
+msgstr "búlgaro"
+
+#: conf/global_settings.py:47
+msgid "Catalan"
+msgstr "catalán"
+
+#: conf/global_settings.py:48
+msgid "Czech"
+msgstr "checo"
+
+#: conf/global_settings.py:49
+msgid "Welsh"
+msgstr "galés"
+
+#: conf/global_settings.py:50
+msgid "Danish"
+msgstr "danés"
+
+#: conf/global_settings.py:51
+msgid "German"
+msgstr "alemán"
+
+#: conf/global_settings.py:52
+msgid "Greek"
+msgstr "griego"
+
+#: conf/global_settings.py:53
+msgid "English"
+msgstr "inglés"
+
+#: conf/global_settings.py:54
+msgid "Spanish"
+msgstr "español"
+
+#: conf/global_settings.py:55
+msgid "Estonian"
+msgstr "estonio"
+
+#: conf/global_settings.py:56
+msgid "Argentinean Spanish"
+msgstr "español de Argentina"
+
+#: conf/global_settings.py:57
+msgid "Basque"
+msgstr "vasco"
+
+#: conf/global_settings.py:58
+msgid "Persian"
+msgstr "persa"
+
+#: conf/global_settings.py:59
+msgid "Finnish"
+msgstr "finés"
+
+#: conf/global_settings.py:60
+msgid "French"
+msgstr "francés"
+
+#: conf/global_settings.py:61
+msgid "Irish"
+msgstr "irlandés"
+
+#: conf/global_settings.py:62
+msgid "Galician"
+msgstr "gallego"
+
+#: conf/global_settings.py:63
+msgid "Hungarian"
+msgstr "húngaro"
+
+#: conf/global_settings.py:64
+msgid "Hebrew"
+msgstr "hebreo"
+
+#: conf/global_settings.py:65
+msgid "Croatian"
+msgstr "croata"
+
+#: conf/global_settings.py:66
+msgid "Icelandic"
+msgstr "islandés"
+
+#: conf/global_settings.py:67
+msgid "Italian"
+msgstr "italiano"
+
+#: conf/global_settings.py:68
+msgid "Japanese"
+msgstr "japonés"
+
+#: conf/global_settings.py:69
+msgid "Georgian"
+msgstr "georgiano"
+
+#: conf/global_settings.py:70
+msgid "Korean"
+msgstr "koreano"
+
+#: conf/global_settings.py:71
+msgid "Khmer"
+msgstr "khmer"
+
+#: conf/global_settings.py:72
+msgid "Kannada"
+msgstr "kannada"
+
+#: conf/global_settings.py:73
+msgid "Latvian"
+msgstr "letón"
+
+#: conf/global_settings.py:74
+msgid "Lithuanian"
+msgstr "lituano"
+
+#: conf/global_settings.py:75
+msgid "Macedonian"
+msgstr "macedonio"
+
+#: conf/global_settings.py:76
+msgid "Dutch"
+msgstr "holandés"
+
+#: conf/global_settings.py:77
+msgid "Norwegian"
+msgstr "noruego"
+
+#: conf/global_settings.py:78
+msgid "Polish"
+msgstr "polaco"
+
+#: conf/global_settings.py:79
+msgid "Portugese"
+msgstr "portugués"
+
+#: conf/global_settings.py:80
+msgid "Brazilian Portuguese"
+msgstr "portugués de Brasil"
+
+#: conf/global_settings.py:81
+msgid "Romanian"
+msgstr "rumano"
+
+#: conf/global_settings.py:82
+msgid "Russian"
+msgstr "ruso"
+
+#: conf/global_settings.py:83
+msgid "Slovak"
+msgstr "eslovaco"
+
+#: conf/global_settings.py:84
+msgid "Slovenian"
+msgstr "esloveno"
+
+#: conf/global_settings.py:85
+msgid "Serbian"
+msgstr "serbio"
+
+#: conf/global_settings.py:86
+msgid "Swedish"
+msgstr "sueco"
+
+#: conf/global_settings.py:87
+msgid "Tamil"
+msgstr "tamil"
+
+#: conf/global_settings.py:88
+msgid "Telugu"
+msgstr "telugu"
+
+#: conf/global_settings.py:89
+msgid "Turkish"
+msgstr "turco"
+
+#: conf/global_settings.py:90
+msgid "Ukrainian"
+msgstr "ucraniano"
+
+#: conf/global_settings.py:91
+msgid "Simplified Chinese"
+msgstr "chino simplificado"
+
+#: conf/global_settings.py:92
+msgid "Traditional Chinese"
+msgstr "chino tradicional"
+
+#: contrib/admin/filterspecs.py:44
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Por %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:74
+#: contrib/admin/filterspecs.py:92
+#: contrib/admin/filterspecs.py:147
+#: contrib/admin/filterspecs.py:173
+msgid "All"
+msgstr "Todo"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Any date"
+msgstr "Cualquier fecha"
+
+#: contrib/admin/filterspecs.py:114
+msgid "Today"
+msgstr "Hoy"
+
+#: contrib/admin/filterspecs.py:117
+msgid "Past 7 days"
+msgstr "Últimos 7 días"
+
+#: contrib/admin/filterspecs.py:119
+msgid "This month"
+msgstr "Este mes"
+
+#: contrib/admin/filterspecs.py:121
+msgid "This year"
+msgstr "Este año"
+
+#: contrib/admin/filterspecs.py:147
+#: forms/widgets.py:379
+#: oldforms/__init__.py:592
+msgid "Yes"
+msgstr "Sí"
+
+#: contrib/admin/filterspecs.py:147
+#: forms/widgets.py:379
+#: oldforms/__init__.py:592
+msgid "No"
+msgstr "No"
+
+#: contrib/admin/filterspecs.py:154
+#: forms/widgets.py:379
+#: oldforms/__init__.py:592
+msgid "Unknown"
+msgstr "Desconocido"
+
+#: contrib/admin/models.py:19
+msgid "action time"
+msgstr "hora de acción"
+
+#: contrib/admin/models.py:22
+msgid "object id"
+msgstr "id de objeto"
+
+#: contrib/admin/models.py:23
+msgid "object repr"
+msgstr "repr de objeto"
+
+#: contrib/admin/models.py:24
+msgid "action flag"
+msgstr "marca de acción"
+
+#: contrib/admin/models.py:25
+msgid "change message"
+msgstr "mensaje de cambio"
+
+#: contrib/admin/models.py:28
+msgid "log entry"
+msgstr "entrada de registro"
+
+#: contrib/admin/models.py:29
+msgid "log entries"
+msgstr "entradas de registro"
+
+#: contrib/admin/options.py:161
+#: contrib/admin/options.py:180
+msgid "None"
+msgstr "Ninguno"
+
+#: contrib/admin/options.py:347
+#: contrib/auth/admin.py:37
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Se añadió con éxito el %(name)s \"%(obj)s\"."
+
+#: contrib/admin/options.py:351
+#: contrib/admin/options.py:419
+#: contrib/auth/admin.py:42
+msgid "You may edit it again below."
+msgstr "Puede editarlo de nuevo abajo."
+
+#: contrib/admin/options.py:361
+#: contrib/admin/options.py:428
+#, python-format
+msgid "You may add another %s below."
+msgstr "Puede añadir otro %s abajo."
+
+#: contrib/admin/options.py:395
+#, python-format
+msgid "Changed %s."
+msgstr "Modificado/a %s."
+
+#: contrib/admin/options.py:395
+#: contrib/admin/options.py:405
+#: core/validators.py:279
+#: db/models/manipulators.py:305
+msgid "and"
+msgstr "y"
+
+#: contrib/admin/options.py:400
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Añadido/a \"%(object)s\" %(name)s."
+
+#: contrib/admin/options.py:404
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Modificados %(list)s para \"%(object)s\" %(name)s."
+
+#: contrib/admin/options.py:409
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Eliminado/a \"%(object)s\" %(name)s."
+
+#: contrib/admin/options.py:414
+msgid "No fields changed."
+msgstr "No ha cambiado ningún campo."
+
+#: contrib/admin/options.py:417
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Se modificó con éxito el %(name)s \"%(obj)s\"."
+
+#: contrib/admin/options.py:425
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "Se añadió con éxito el %(name)s \"%(obj)s. Puede editarlo de nuevo abajo."
+
+#: contrib/admin/options.py:506
+#, python-format
+msgid "Add %s"
+msgstr "Añadir %s"
+
+#: contrib/admin/options.py:568
+#, python-format
+msgid "Change %s"
+msgstr "Modificar %s"
+
+#: contrib/admin/options.py:598
+msgid "Database error"
+msgstr "Error en la base de datos"
+
+#: contrib/admin/options.py:647
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Se eliminó con éxito el %(name)s \"%(obj)s\"."
+
+#: contrib/admin/options.py:653
+msgid "Are you sure?"
+msgstr "¿Está seguro?"
+
+#: contrib/admin/options.py:680
+#, python-format
+msgid "Change history: %s"
+msgstr "Histórico de modificaciones: %s"
+
+#: contrib/admin/sites.py:18
+#: contrib/admin/views/decorators.py:16
+#: contrib/auth/forms.py:70
+#: contrib/comments/views/comments.py:56
+msgid "Please enter a correct username and password. Note that both fields are case-sensitive."
+msgstr "Por favor, introduzca un nombre de usuario y contraseña correctos. Note que ambos campos son sensibles a mayúsculas/minúsculas."
+
+#: contrib/admin/sites.py:233
+#: contrib/admin/views/decorators.py:68
+msgid "Please log in again, because your session has expired. Don't worry: Your submission has been saved."
+msgstr "Por favor, inicie sesión de nuevo, ya que su sesión ha caducado. No se preocupe: se ha guardado su envío."
+
+#: contrib/admin/sites.py:240
+#: contrib/admin/views/decorators.py:75
+msgid "Looks like your browser isn't configured to accept cookies. Please enable cookies, reload this page, and try again."
+msgstr "Parece que su navegador no está configurado para aceptar cookies. Actívelas , recargue esta página, e inténtelo de nuevo."
+
+#: contrib/admin/sites.py:254
+#: contrib/admin/sites.py:260
+#: contrib/admin/views/decorators.py:92
+msgid "Usernames cannot contain the '@' character."
+msgstr "Los nombres de usuario no pueden contener el carácter '@'."
+
+#: contrib/admin/sites.py:257
+#: contrib/admin/views/decorators.py:88
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "Su dirección de correo no es su nombre de usuario. Pruebe con '%s' en su lugar."
+
+#: contrib/admin/sites.py:325
+msgid "Site administration"
+msgstr "Sitio administrativo"
+
+#: contrib/admin/sites.py:347
+#: contrib/admin/templates/admin/login.html:27
+#: contrib/admin/views/decorators.py:30
+msgid "Log in"
+msgstr "Iniciar sesión"
+
+#: contrib/admin/util.py:126
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Uno o más %(fieldname)s en %(name)s: %(obj)s"
+
+#: contrib/admin/util.py:131
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Uno o más %(fieldname)s en %(name)s:"
+
+#: contrib/admin/widgets.py:65
+msgid "Date:"
+msgstr "Fecha:"
+
+#: contrib/admin/widgets.py:65
+msgid "Time:"
+msgstr "Hora:"
+
+#: contrib/admin/widgets.py:89
+msgid "Currently:"
+msgstr "Actualmente:"
+
+#: contrib/admin/widgets.py:89
+msgid "Change:"
+msgstr "Modificar:"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Página no encontrada"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Lo sentimos, pero no se encuentra la página solicitada."
+
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/change_form.html:17
+#: contrib/admin/templates/admin/change_list.html:8
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/auth/user/change_password.html:10
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+msgid "Home"
+msgstr "Inicio"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Error del servidor"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Error del servidor (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Error de servidor <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid "There's been an error. It's been reported to the site administrators via e-mail and should be fixed shortly. Thanks for your patience."
+msgstr "Ha ocurrido un error. Se ha informado a los administradores del sitio mediante correo electrónico y debería arreglarse en breve. Gracias por su paciencia."
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "Bienvenido/a,"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+msgid "Documentation"
+msgstr "Documentación"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:13
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+msgid "Change password"
+msgstr "Cambiar contraseña"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/comments/templates/comments/form.html:6
+msgid "Log out"
+msgstr "Terminar sesión"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Sitio de administración de Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Administración de Django"
+
+#: contrib/admin/templates/admin/change_form.html:19
+#: contrib/admin/templates/admin/index.html:29
+msgid "Add"
+msgstr "Añadir"
+
+#: contrib/admin/templates/admin/change_form.html:26
+#: contrib/admin/templates/admin/object_history.html:5
+msgid "History"
+msgstr "Histórico"
+
+#: contrib/admin/templates/admin/change_form.html:27
+msgid "View on site"
+msgstr "Ver en el sitio"
+
+#: contrib/admin/templates/admin/change_form.html:37
+#: contrib/admin/templates/admin/auth/user/change_password.html:22
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Por favor, corrija el siguiente error."
+msgstr[1] "Por favor, corrija los siguientes errores."
+
+#: contrib/admin/templates/admin/change_list.html:16
+#, python-format
+msgid "Add %(name)s"
+msgstr "Añadir %(name)s"
+
+#: contrib/admin/templates/admin/change_list.html:26
+msgid "Filter"
+msgstr "Filtro"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+#: contrib/admin/templates/admin/edit_inline/tabular.html:15
+msgid "Delete"
+msgstr "Eliminar"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:15
+#, python-format
+msgid "Deleting the %(object_name)s '%(escaped_object)s' would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:"
+msgstr "Eliminar el %(object_name)s '%(escaped_object)s' provocaría la eliminación de objetos relacionados, pero su cuenta no tiene permiso para borrar los siguientes tipos de objetos:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:22
+#, python-format
+msgid "Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? All of the following related items will be deleted:"
+msgstr "¿Está seguro de que quiere borrar los %(object_name)s \"%(escaped_object)s\"? Se borrarán los siguientes objetos relacionados:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:27
+msgid "Yes, I'm sure"
+msgstr "Sí, estoy seguro"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Por %(filter_title)s "
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Modelos disponibles en la aplicación %(name)s."
+
+#: contrib/admin/templates/admin/index.html:19
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:35
+msgid "Change"
+msgstr "Modificar"
+
+#: contrib/admin/templates/admin/index.html:45
+msgid "You don't have permission to edit anything."
+msgstr "No tiene permiso para editar nada."
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "Recent Actions"
+msgstr "Acciones recientes"
+
+#: contrib/admin/templates/admin/index.html:54
+msgid "My Actions"
+msgstr "Mis acciones"
+
+#: contrib/admin/templates/admin/index.html:58
+msgid "None available"
+msgstr "Ninguno disponible"
+
+#: contrib/admin/templates/admin/invalid_setup.html:7
+msgid "Something's wrong with your database installation. Make sure the appropriate database tables have been created, and make sure the database is readable by the appropriate user."
+msgstr "Algo va mal con la instalación de la base de datos. Asegúrese que las tablas necesarias han sido creadas, y que la base de datos puede ser leída por el usuario apropiado."
+
+#: contrib/admin/templates/admin/login.html:19
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+msgid "Username:"
+msgstr "Usuario:"
+
+#: contrib/admin/templates/admin/login.html:22
+#: contrib/comments/templates/comments/form.html:8
+msgid "Password:"
+msgstr "Contraseña:"
+
+#: contrib/admin/templates/admin/object_history.html:16
+msgid "Date/time"
+msgstr "Fecha/hora"
+
+#: contrib/admin/templates/admin/object_history.html:17
+msgid "User"
+msgstr "Usuario"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Action"
+msgstr "Acción"
+
+#: contrib/admin/templates/admin/object_history.html:24
+msgid "DATE_WITH_TIME_FULL"
+msgstr "j M Y P"
+
+#: contrib/admin/templates/admin/object_history.html:32
+msgid "This object doesn't have a change history. It probably wasn't added via this admin site."
+msgstr "Este objeto no tiene histórico de cambios. Probablemente no fue añadido usando este sitio de administración."
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Mostrar todo"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Ir"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 resultado"
+msgstr[1] "%(counter)s resultados"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s total"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Grabar como nuevo"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Grabar y añadir otro"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Grabar y continuar editando"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Grabar"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid "First, enter a username and password. Then, you'll be able to edit more user options."
+msgstr "Primero introduzca un nombre de usuario y una contraseña. Luego podrá editar el resto de opciones del usuario."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:13
+#: contrib/auth/forms.py:12
+#: contrib/auth/forms.py:49
+msgid "Username"
+msgstr "Nombre de usuario"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:20
+#: contrib/admin/templates/admin/auth/user/change_password.html:33
+#: contrib/auth/forms.py:15
+#: contrib/auth/forms.py:50
+#: contrib/auth/forms.py:166
+msgid "Password"
+msgstr "Contraseña"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:26
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+#: contrib/auth/forms.py:167
+msgid "Password (again)"
+msgstr "Contraseña (de nuevo)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:27
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+msgid "Enter the same password as above, for verification."
+msgstr "Introduzca la misma contraseña que arriba, para verificación."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:26
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Introduzca una nueva contraseña para el usuario <strong>%(username)s</strong>."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Bookmarklets"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+msgid "Documentation bookmarklets"
+msgstr "Bookmarklets de documentación"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:8
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">Para instalar bookmarklets, arrastre el enlace a su barra\n"
+"de favoritos, o pulse con el botón derecho el enlace y añádalo a sus favoritos.\n"
+"Ahora puede escoger el bookmarklet desde cualquier página del sitio.\n"
+"Observe que algunos de estos bookmarklets precisan que esté viendo\n"
+"el sitio desde un ordenador señalado como \"interno\" (hable\n"
+"con su administrador de sistemas si no está seguro si el suyo lo es).</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:18
+msgid "Documentation for this page"
+msgstr "Documentación para esta página"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Jumps you from any page to the documentation for the view that generates that page."
+msgstr "Lleva desde cualquier página a la documentación de la vista que la genera."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:21
+msgid "Show object ID"
+msgstr "Mostrar ID de objeto"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Shows the content-type and unique ID for pages that represent a single object."
+msgstr "Muestra el tipo de contenido e ID único de las páginas que representan un simple objeto."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:24
+msgid "Edit this object (current window)"
+msgstr "Editar este objeto (ventana actual)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "Lleva a la página de administración de páginas que representan un único objeto."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:27
+msgid "Edit this object (new window)"
+msgstr "Editar este objeto (nueva ventana)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "As above, but opens the admin page in a new window."
+msgstr "Como antes, pero abre la página de administración en una nueva ventana."
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Gracias por el tiempo que ha dedicado hoy al sitio web."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Iniciar sesión de nuevo"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Cambio de contraseña"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Cambio de contraseña exitoso"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Su contraseña ha sido cambiada."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid "Please enter your old password, for security's sake, and then enter your new password twice so we can verify you typed it in correctly."
+msgstr "Por favor, introduzca su contraseña antigua, por seguridad, y después introduzca la nueva contraseña dos veces para verificar que la ha escrito correctamente."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Contraseña antigua:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Contraseña nueva:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Confirme contraseña:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Cambiar mi contraseña"
+
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+msgid "Password reset"
+msgstr "Restablecer contraseña"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Restablecimiento de contraseña exitoso"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid "We've e-mailed a new password to the e-mail address you submitted. You should be receiving it shortly."
+msgstr "Le hemos enviado una contraseña nueva a la dirección que ha suministrado. Debería recibirla en breve."
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Está recibiendo este mensaje debido a que solicitó restablecer la contraseña"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "para su cuenta de usuario en %(site_name)s."
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Su nueva contraseña es: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Puede cambiarla accediendo a esta página:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Su nombre de usuario, en caso de haberlo olvidado:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "¡Gracias por usar nuestro sitio!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "El equipo de %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid "Forgotten your password? Enter your e-mail address below, and we'll reset your password and e-mail the new one to you."
+msgstr "¿Ha olvidado su contraseña? Introduzca su dirección de correo electrónico, y crearemos una nueva que le enviaremos por correo."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Dirección de correo electrónico:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Restablecer mi contraseña"
+
+#: contrib/admin/templatetags/admin_list.py:257
+msgid "All dates"
+msgstr "Todas las fechas"
+
+#: contrib/admin/views/main.py:65
+#, python-format
+msgid "Select %s"
+msgstr "Escoja %s"
+
+#: contrib/admin/views/main.py:65
+#, python-format
+msgid "Select %s to change"
+msgstr "Escoja %s a modificar"
+
+#: contrib/admindocs/views.py:53
+#: contrib/admindocs/views.py:55
+#: contrib/admindocs/views.py:57
+msgid "tag:"
+msgstr "etiqueta:"
+
+#: contrib/admindocs/views.py:87
+#: contrib/admindocs/views.py:89
+#: contrib/admindocs/views.py:91
+msgid "filter:"
+msgstr "filtro:"
+
+#: contrib/admindocs/views.py:153
+#: contrib/admindocs/views.py:155
+#: contrib/admindocs/views.py:157
+msgid "view:"
+msgstr "vista:"
+
+#: contrib/admindocs/views.py:187
+#, python-format
+msgid "App %r not found"
+msgstr "Aplicación %r no encontrada"
+
+#: contrib/admindocs/views.py:194
+#, python-format
+msgid "Model %(model_name)r not found in app %(app_label)r"
+msgstr "El modelo %(model_name)r no se ha encontrado en la aplicación %(app_label)r"
+
+#: contrib/admindocs/views.py:206
+#, python-format
+msgid "the related `%(app_label)s.%(data_type)s` object"
+msgstr "el objeto relacionado `%(app_label)s.%(data_type)s`"
+
+#: contrib/admindocs/views.py:206
+#: contrib/admindocs/views.py:228
+#: contrib/admindocs/views.py:242
+#: contrib/admindocs/views.py:247
+msgid "model:"
+msgstr "modelo:"
+
+#: contrib/admindocs/views.py:237
+#, python-format
+msgid "related `%(app_label)s.%(object_name)s` objects"
+msgstr "los objetos relacionados `%(app_label)s.%(object_name)s`"
+
+#: contrib/admindocs/views.py:242
+#, python-format
+msgid "all %s"
+msgstr "todo %s"
+
+#: contrib/admindocs/views.py:247
+#, python-format
+msgid "number of %s"
+msgstr "número de %s"
+
+#: contrib/admindocs/views.py:253
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Campos en %s objetos"
+
+#: contrib/admindocs/views.py:317
+#: contrib/admindocs/views.py:328
+#: contrib/admindocs/views.py:330
+#: contrib/admindocs/views.py:336
+#: contrib/admindocs/views.py:337
+#: contrib/admindocs/views.py:339
+msgid "Integer"
+msgstr "Entero"
+
+#: contrib/admindocs/views.py:318
+msgid "Boolean (Either True or False)"
+msgstr "Booleano (Verdadero o Falso)"
+
+#: contrib/admindocs/views.py:319
+#: contrib/admindocs/views.py:338
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Cadena (máximo %(max_length)s)"
+
+#: contrib/admindocs/views.py:320
+msgid "Comma-separated integers"
+msgstr "Enteros separados por comas"
+
+#: contrib/admindocs/views.py:321
+msgid "Date (without time)"
+msgstr "Fecha (sin hora)"
+
+#: contrib/admindocs/views.py:322
+msgid "Date (with time)"
+msgstr "Fecha (con hora)"
+
+#: contrib/admindocs/views.py:323
+msgid "Decimal number"
+msgstr "Número decimal"
+
+#: contrib/admindocs/views.py:324
+msgid "E-mail address"
+msgstr "Dirección de correo electrónico"
+
+#: contrib/admindocs/views.py:325
+#: contrib/admindocs/views.py:326
+#: contrib/admindocs/views.py:329
+msgid "File path"
+msgstr "Ruta de fichero"
+
+#: contrib/admindocs/views.py:327
+msgid "Floating point number"
+msgstr "Número en coma flotante"
+
+#: contrib/admindocs/views.py:331
+#: contrib/comments/models.py:89
+msgid "IP address"
+msgstr "Dirección IP"
+
+#: contrib/admindocs/views.py:333
+msgid "Boolean (Either True, False or None)"
+msgstr "Booleano (Verdadero, Falso o Nulo)"
+
+#: contrib/admindocs/views.py:334
+msgid "Relation to parent model"
+msgstr "Relación con el modelo padre"
+
+#: contrib/admindocs/views.py:335
+msgid "Phone number"
+msgstr "Número de teléfono"
+
+#: contrib/admindocs/views.py:340
+msgid "Text"
+msgstr "Texto"
+
+#: contrib/admindocs/views.py:341
+msgid "Time"
+msgstr "Hora"
+
+#: contrib/admindocs/views.py:342
+#: contrib/flatpages/models.py:8
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admindocs/views.py:343
+msgid "U.S. state (two uppercase letters)"
+msgstr "Estado de los EEUU (dos letras mayúsculas)"
+
+#: contrib/admindocs/views.py:344
+msgid "XML text"
+msgstr "Texto XML"
+
+#: contrib/admindocs/views.py:370
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s no parece ser un objeto urlpattern"
+
+#: contrib/auth/admin.py:17
+msgid "Personal info"
+msgstr "Información personal"
+
+#: contrib/auth/admin.py:18
+msgid "Permissions"
+msgstr "Permisos"
+
+#: contrib/auth/admin.py:19
+msgid "Important dates"
+msgstr "Fechas importantes"
+
+#: contrib/auth/admin.py:20
+msgid "Groups"
+msgstr "Grupos"
+
+#: contrib/auth/admin.py:47
+msgid "Add user"
+msgstr "Añadir usuario"
+
+#: contrib/auth/forms.py:13
+#: contrib/auth/models.py:134
+msgid "Required. 30 characters or fewer. Alphanumeric characters only (letters, digits and underscores)."
+msgstr "Requerido. 30 caracteres o menos. Sólo caracteres alfanuméricos (letras, dígitos y guiones bajos)."
+
+#: contrib/auth/forms.py:14
+#: core/validators.py:72
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Este valor debe contener sólo letras, números y guiones bajos."
+
+#: contrib/auth/forms.py:16
+msgid "Password confirmation"
+msgstr "Contraseña (confirmación)"
+
+#: contrib/auth/forms.py:28
+msgid "A user with that username already exists."
+msgstr "Ya existe un usuario con este nombre."
+
+#: contrib/auth/forms.py:34
+#: contrib/auth/forms.py:153
+#: contrib/auth/forms.py:178
+msgid "The two password fields didn't match."
+msgstr "Las dos contraseñas no coinciden."
+
+#: contrib/auth/forms.py:72
+#: contrib/comments/views/comments.py:58
+msgid "This account is inactive."
+msgstr "Esta cuenta está inactiva."
+
+#: contrib/auth/forms.py:77
+#: contrib/comments/views/comments.py:49
+msgid "Your Web browser doesn't appear to have cookies enabled. Cookies are required for logging in."
+msgstr "Su navegador no parece tener las cookies habilitadas. Las cookies se necesitan para poder ingresar."
+
+#: contrib/auth/forms.py:90
+msgid "E-mail"
+msgstr "Correo electrónico"
+
+#: contrib/auth/forms.py:99
+msgid "That e-mail address doesn't have an associated user account. Are you sure you've registered?"
+msgstr "Esta dirección de correo electrónico no tiene una cuenta de usuario asociada. ¿Está seguro de que se ha registrado?"
+
+#: contrib/auth/forms.py:124
+#, python-format
+msgid "Password reset on %s"
+msgstr "Contraseña restablecida en %s"
+
+#: contrib/auth/forms.py:131
+msgid "Old password"
+msgstr "Contraseña antigua"
+
+#: contrib/auth/forms.py:132
+msgid "New password"
+msgstr "Contraseña nueva"
+
+#: contrib/auth/forms.py:133
+msgid "New password confirmation"
+msgstr "Contraseña nueva (confirmación):"
+
+#: contrib/auth/forms.py:145
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Su contraseña antigua es incorrecta. Por favor, vuelva a introducirla correctamente."
+
+#: contrib/auth/models.py:73
+#: contrib/auth/models.py:93
+msgid "name"
+msgstr "nombre"
+
+#: contrib/auth/models.py:75
+msgid "codename"
+msgstr "nombre en código"
+
+#: contrib/auth/models.py:78
+msgid "permission"
+msgstr "permiso"
+
+#: contrib/auth/models.py:79
+#: contrib/auth/models.py:94
+msgid "permissions"
+msgstr "permisos"
+
+#: contrib/auth/models.py:97
+msgid "group"
+msgstr "grupo"
+
+#: contrib/auth/models.py:98
+#: contrib/auth/models.py:144
+msgid "groups"
+msgstr "grupos"
+
+#: contrib/auth/models.py:134
+msgid "username"
+msgstr "nombre de usuario"
+
+#: contrib/auth/models.py:135
+msgid "first name"
+msgstr "nombre propio"
+
+#: contrib/auth/models.py:136
+msgid "last name"
+msgstr "apellidos"
+
+#: contrib/auth/models.py:137
+msgid "e-mail address"
+msgstr "dirección de correo electrónico"
+
+#: contrib/auth/models.py:138
+msgid "password"
+msgstr "contraseña"
+
+#: contrib/auth/models.py:138
+msgid "Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change password form</a>."
+msgstr "Use'[algo]$[sal]$[hash hexadecimal]' o use <a href=\"password/\">el formulario para cambiar la contraseña</a>."
+
+#: contrib/auth/models.py:139
+msgid "staff status"
+msgstr "es staff"
+
+#: contrib/auth/models.py:139
+msgid "Designates whether the user can log into this admin site."
+msgstr "Indica si el usuario puede entrar en este sitio de administración."
+
+#: contrib/auth/models.py:140
+msgid "active"
+msgstr "activo"
+
+#: contrib/auth/models.py:140
+msgid "Designates whether this user should be treated as active. Unselect this instead of deleting accounts."
+msgstr "Indica si el usuario puede ser tratado como activo. Desmarque esta opción en lugar de borrar la cuenta."
+
+#: contrib/auth/models.py:141
+msgid "superuser status"
+msgstr "es superusuario"
+
+#: contrib/auth/models.py:141
+msgid "Designates that this user has all permissions without explicitly assigning them."
+msgstr "Indica que este usuario tiene todos los permisos sin asignárselos explícitamente."
+
+#: contrib/auth/models.py:142
+msgid "last login"
+msgstr "último inicio de sesión"
+
+#: contrib/auth/models.py:143
+msgid "date joined"
+msgstr "fecha de alta"
+
+#: contrib/auth/models.py:145
+msgid "In addition to the permissions manually assigned, this user will also get all permissions granted to each group he/she is in."
+msgstr "Además de los permisos asignados manualmente, este usuario también tendrá todos los permisos de los grupos en los que esté."
+
+#: contrib/auth/models.py:146
+msgid "user permissions"
+msgstr "permisos de usuario"
+
+#: contrib/auth/models.py:150
+msgid "user"
+msgstr "usuario"
+
+#: contrib/auth/models.py:151
+msgid "users"
+msgstr "usuarios"
+
+#: contrib/auth/models.py:306
+msgid "message"
+msgstr "mensaje"
+
+#: contrib/auth/views.py:49
+msgid "Logged out"
+msgstr "Sesión terminada"
+
+#: contrib/auth/views.py:116
+msgid "Password changed successfully."
+msgstr "La contraseña se ha cambiado con éxito."
+
+#: contrib/auth/views.py:122
+#, python-format
+msgid "Change password: %s"
+msgstr "Cambiar contraseña: %s"
+
+#: contrib/comments/models.py:71
+#: contrib/comments/models.py:164
+msgid "object ID"
+msgstr "ID de objeto"
+
+#: contrib/comments/models.py:72
+msgid "headline"
+msgstr "encabezado"
+
+#: contrib/comments/models.py:73
+#: contrib/comments/models.py:95
+#: contrib/comments/models.py:165
+msgid "comment"
+msgstr "comentario"
+
+#: contrib/comments/models.py:74
+msgid "rating #1"
+msgstr "puntuación 1"
+
+#: contrib/comments/models.py:75
+msgid "rating #2"
+msgstr "puntuación 2"
+
+#: contrib/comments/models.py:76
+msgid "rating #3"
+msgstr "puntuación 3"
+
+#: contrib/comments/models.py:77
+msgid "rating #4"
+msgstr "puntuación 4"
+
+#: contrib/comments/models.py:78
+msgid "rating #5"
+msgstr "puntuación 5"
+
+#: contrib/comments/models.py:79
+msgid "rating #6"
+msgstr "puntuación 6"
+
+#: contrib/comments/models.py:80
+msgid "rating #7"
+msgstr "puntuación 7"
+
+#: contrib/comments/models.py:81
+msgid "rating #8"
+msgstr "puntuación 8"
+
+#: contrib/comments/models.py:86
+msgid "is valid rating"
+msgstr "puntuación válida"
+
+#: contrib/comments/models.py:87
+#: contrib/comments/models.py:167
+msgid "date/time submitted"
+msgstr "fecha/hora de envío"
+
+#: contrib/comments/models.py:88
+#: contrib/comments/models.py:168
+msgid "is public"
+msgstr "es público"
+
+#: contrib/comments/models.py:90
+msgid "is removed"
+msgstr "está eliminado"
+
+#: contrib/comments/models.py:90
+msgid "Check this box if the comment is inappropriate. A \"This comment has been removed\" message will be displayed instead."
+msgstr "Marque esta opción si el comentario es inapropiado. En su lugar se mostrará el mensaje \"Este comentario ha sido eliminado\"."
+
+#: contrib/comments/models.py:96
+msgid "comments"
+msgstr "comentarios"
+
+#: contrib/comments/models.py:128
+#: contrib/comments/models.py:199
+msgid "Content object"
+msgstr "Objeto contenido"
+
+#: contrib/comments/models.py:156
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Enviado por %(user)s en %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:166
+msgid "person's name"
+msgstr "nombre de la persona"
+
+#: contrib/comments/models.py:169
+msgid "ip address"
+msgstr "dirección ip"
+
+#: contrib/comments/models.py:171
+msgid "approved by staff"
+msgstr "aprobado por el staff"
+
+#: contrib/comments/models.py:175
+msgid "free comment"
+msgstr "comentario libre"
+
+#: contrib/comments/models.py:176
+msgid "free comments"
+msgstr "comentarios libres"
+
+#: contrib/comments/models.py:227
+msgid "score"
+msgstr "puntuación"
+
+#: contrib/comments/models.py:228
+msgid "score date"
+msgstr "fecha de la puntuación"
+
+#: contrib/comments/models.py:232
+msgid "karma score"
+msgstr "punto karma"
+
+#: contrib/comments/models.py:233
+msgid "karma scores"
+msgstr "puntos karma"
+
+#: contrib/comments/models.py:237
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "puntuado %(score)d por %(user)s"
+
+#: contrib/comments/models.py:254
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Este comentario fue marcado por %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:262
+msgid "flag date"
+msgstr "fecha de la marca"
+
+#: contrib/comments/models.py:266
+msgid "user flag"
+msgstr "marca de usuario"
+
+#: contrib/comments/models.py:267
+msgid "user flags"
+msgstr "marcas de usuario"
+
+#: contrib/comments/models.py:271
+#, python-format
+msgid "Flag by %r"
+msgstr "Marca de %r"
+
+#: contrib/comments/models.py:277
+msgid "deletion date"
+msgstr "fecha de eliminación"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "eliminación del moderador"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "eliminaciones del moderador"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Eliminación del moderador %r"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "¿Ha olvidado su contraseña?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Puntuaciones"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Requerido"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Opcional"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Publica una fotografía"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Comentario:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Previsualizar comentario"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Su nombre:"
+
+#: contrib/comments/views/comments.py:76
+msgid "This rating is required because you've entered at least one other rating."
+msgstr "Se precisa esta puntuación porque ha introducido al menos otra más."
+
+#: contrib/comments/views/comments.py:160
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Este comentario lo envió un usuario que ha enviado menos de %(count)s comentario:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Este comentario lo envió un usuario que ha enviado menos de %(count)s comentarios:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:165
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Este comentario ha sido colocado por un usuario poco preciso: \n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:238
+#: contrib/comments/views/comments.py:331
+msgid "Only POSTs are allowed"
+msgstr "Sólo se admiten POSTs"
+
+#: contrib/comments/views/comments.py:242
+#: contrib/comments/views/comments.py:335
+msgid "One or more of the required fields wasn't submitted"
+msgstr "No se proporcionó uno o más de los siguientes campos requeridos"
+
+#: contrib/comments/views/comments.py:246
+#: contrib/comments/views/comments.py:337
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Alguien manipuló el formulario de comentarios (violación de seguridad)"
+
+#: contrib/comments/views/comments.py:256
+#: contrib/comments/views/comments.py:343
+msgid "The comment form had an invalid 'target' parameter -- the object ID was invalid"
+msgstr "El formulario de comentarios tiene un parámetro 'target' no válido (el ID de objeto era inválido)"
+
+#: contrib/comments/views/comments.py:307
+#: contrib/comments/views/comments.py:372
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "El formulario de comentario no proporcionó 'previsualizar' ni 'enviar'"
+
+#: contrib/comments/views/karma.py:21
+msgid "Anonymous users cannot vote"
+msgstr "Los usuarios anónimos no pueden votar"
+
+#: contrib/comments/views/karma.py:25
+msgid "Invalid comment ID"
+msgstr "ID de comentario no válido"
+
+#: contrib/comments/views/karma.py:27
+msgid "No voting for yourself"
+msgstr "No puede votarse a sí mismo"
+
+#: contrib/contenttypes/models.py:67
+msgid "python model class name"
+msgstr "nombre de la clase modelo de python"
+
+#: contrib/contenttypes/models.py:71
+msgid "content type"
+msgstr "tipo de contenido"
+
+#: contrib/contenttypes/models.py:72
+msgid "content types"
+msgstr "tipos de contenido"
+
+#: contrib/flatpages/admin.py:9
+msgid "Advanced options"
+msgstr "Opciones avanzadas"
+
+#: contrib/flatpages/models.py:9
+msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr "Ejemplo: '/about/contact/'. Asegúrese de que pone barras al principio y al final."
+
+#: contrib/flatpages/models.py:10
+msgid "title"
+msgstr "título"
+
+#: contrib/flatpages/models.py:11
+msgid "content"
+msgstr "contenido"
+
+#: contrib/flatpages/models.py:12
+msgid "enable comments"
+msgstr "habilitar comentarios"
+
+#: contrib/flatpages/models.py:13
+msgid "template name"
+msgstr "nombre de plantilla"
+
+#: contrib/flatpages/models.py:14
+msgid "Example: 'flatpages/contact_page.html'. If this isn't provided, the system will use 'flatpages/default.html'."
+msgstr "Ejemplo: 'flatpages/contact_page.html'. Si no es proporcionado, el sistema usará 'flatpages/default.html'."
+
+#: contrib/flatpages/models.py:15
+msgid "registration required"
+msgstr "debe estar registrado"
+
+#: contrib/flatpages/models.py:15
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Si está marcado, sólo los usuarios registrados podrán ver la página."
+
+#: contrib/flatpages/models.py:20
+msgid "flat page"
+msgstr "página estática"
+
+#: contrib/flatpages/models.py:21
+msgid "flat pages"
+msgstr "páginas estáticas"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "th"
+msgstr "º"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "st"
+msgstr "º"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "nd"
+msgstr "º"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "rd"
+msgstr "º"
+
+#: contrib/humanize/templatetags/humanize.py:51
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f millón"
+msgstr[1] "%(value).1f millón"
+
+#: contrib/humanize/templatetags/humanize.py:54
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f mil millones"
+msgstr[1] "%(value).1f mil millones"
+
+#: contrib/humanize/templatetags/humanize.py:57
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f billón"
+msgstr[1] "%(value).1f billón"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "one"
+msgstr "uno"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "two"
+msgstr "dos"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "three"
+msgstr "tres"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "four"
+msgstr "cuatro"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "five"
+msgstr "cinco"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "six"
+msgstr "seis"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "seven"
+msgstr "siete"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "eight"
+msgstr "ocho"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "nine"
+msgstr "nueve"
+
+#: contrib/humanize/templatetags/humanize.py:93
+msgid "today"
+msgstr "hoy"
+
+#: contrib/humanize/templatetags/humanize.py:95
+msgid "tomorrow"
+msgstr "mañana"
+
+#: contrib/humanize/templatetags/humanize.py:97
+msgid "yesterday"
+msgstr "ayer"
+
+#: contrib/localflavor/ar/forms.py:27
+msgid "Enter a postal code in the format NNNN or ANNNNAAA."
+msgstr "Introduzca un código postal en el formato NNNN or ANNNNAAA."
+
+#: contrib/localflavor/ar/forms.py:49
+#: contrib/localflavor/br/forms.py:96
+#: contrib/localflavor/br/forms.py:135
+#: contrib/localflavor/pe/forms.py:23
+#: contrib/localflavor/pe/forms.py:51
+msgid "This field requires only numbers."
+msgstr "Este campo sólo acepta números."
+
+#: contrib/localflavor/ar/forms.py:50
+msgid "This field requires 7 or 8 digits."
+msgstr "Este campo necesita 7 u 8 dígitos."
+
+#: contrib/localflavor/ar/forms.py:79
+msgid "Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format."
+msgstr "Introduzca un CUIT válido en el formato XX-XXXXXXXX-X o XXXXXXXXXXXX."
+
+#: contrib/localflavor/ar/forms.py:80
+msgid "Invalid CUIT."
+msgstr "CUIT inválido."
+
+#: contrib/localflavor/au/forms.py:16
+msgid "Enter a 4 digit post code."
+msgstr "Introduzca un código postal de 4 dígitos."
+
+#: contrib/localflavor/br/forms.py:21
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Introduzca un código postal en el formato XXXX-XXXX."
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "Los números de teléfono deben tener el formato XXX-XXX-XXXX."
+
+#: contrib/localflavor/br/forms.py:58
+msgid "Select a valid brazilian state. That state is not one of the available states."
+msgstr "Seleccione un estado brasileño válido. Este estado no es uno de los estados disponibles."
+
+#: contrib/localflavor/br/forms.py:94
+msgid "Invalid CPF number."
+msgstr "Número CPF inválido."
+
+#: contrib/localflavor/br/forms.py:95
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr "Este campo necesita un máximo de 11 dígitos o 14 caracteres."
+
+#: contrib/localflavor/br/forms.py:134
+msgid "Invalid CNPJ number."
+msgstr "Número CNPJ inválido."
+
+#: contrib/localflavor/br/forms.py:136
+msgid "This field requires at least 14 digits"
+msgstr "Este campo necesita 14 dígitos como mínimo"
+
+#: contrib/localflavor/ca/forms.py:17
+msgid "Enter a postal code in the format XXX XXX."
+msgstr "Introduzca un código postal en el formato XXX XXX."
+
+#: contrib/localflavor/ca/forms.py:88
+msgid "Enter a valid Canadian Social Insurance number in XXX-XXX-XXX format."
+msgstr "Introduzca un Número del Seguro Social de Canadá válido en el formato XXX-XXX-XXX."
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr "Aargau"
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr "Appenzell Innerrhoden"
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr "Appenzell Ausserrhoden"
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr "Basel-Stadt"
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr "Basel-Land"
+
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr "Berne"
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr "Fribourg"
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr "Geneva"
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr "Glarus"
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr "Graubuenden"
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr "Jura"
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr "Lucerne"
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr "Neuchatel"
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr "Nidwalden"
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr "Obwalden"
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr "Schaffhausen"
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr "Schwyz"
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr "Solothurn"
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr "St. Gallen"
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr "Thurgau"
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr "Ticino"
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr "Uri"
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr "Valais"
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr "Vaud"
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr "Zug"
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr "Zurich"
+
+#: contrib/localflavor/ch/forms.py:16
+#: contrib/localflavor/no/forms.py:12
+msgid "Enter a zip code in the format XXXX."
+msgstr "Introduzca un código postal en el formato XXXX."
+
+#: contrib/localflavor/ch/forms.py:64
+msgid "Enter a valid Swiss identity or passport card number in X1234567<0 or 1234567890 format."
+msgstr "Introduzca un número de identificación o pasaporte suizos válidos en el formato X1234567<0 o 1234567890."
+
+#: contrib/localflavor/cl/forms.py:29
+msgid "Enter a valid Chilean RUT."
+msgstr "Introduzca un RUT chileno válido."
+
+#: contrib/localflavor/cl/forms.py:30
+msgid "Enter a valid Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr "Introduzca un RUT chileno válido. El formato es XX.XXX.XXX-X."
+
+#: contrib/localflavor/cl/forms.py:31
+msgid "The Chilean RUT is not valid."
+msgstr "El RUT chileno no es válido."
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr "Baden-Wuerttemberg"
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr "Bavaria"
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr "Berlín"
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr "Brandenburg"
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr "Bremen"
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr "Hamburgo"
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr "Hessen"
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr "Mecklenburg-Western Pomerania"
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr "Lower Saxony"
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr "North Rhine-Westphalia"
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr "Rhineland-Palatinate"
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr "Saarland"
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr "Saxony"
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr "Saxony-Anhalt"
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr "Schleswig-Holstein"
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr "Thuringia"
+
+#: contrib/localflavor/de/forms.py:14
+#: contrib/localflavor/fi/forms.py:12
+#: contrib/localflavor/fr/forms.py:15
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Introduzca un código postal en el formato XXXXX."
+
+#: contrib/localflavor/de/forms.py:41
+msgid "Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X format."
+msgstr "Introduzca un número de tarjeta de identidad de Alemania válida en el formato XXXXXXXXXXX-XXXXXXX-XXXXXXX-X."
+
+#: contrib/localflavor/es/es_provinces.py:5
+msgid "Arava"
+msgstr "Álava"
+
+#: contrib/localflavor/es/es_provinces.py:6
+msgid "Albacete"
+msgstr "Albacete"
+
+#: contrib/localflavor/es/es_provinces.py:7
+msgid "Alacant"
+msgstr "Alicante"
+
+#: contrib/localflavor/es/es_provinces.py:8
+msgid "Almeria"
+msgstr "Almería"
+
+#: contrib/localflavor/es/es_provinces.py:9
+msgid "Avila"
+msgstr "Ávila"
+
+#: contrib/localflavor/es/es_provinces.py:10
+msgid "Badajoz"
+msgstr "Badajoz"
+
+#: contrib/localflavor/es/es_provinces.py:11
+msgid "Illes Balears"
+msgstr "Islas Baleares"
+
+#: contrib/localflavor/es/es_provinces.py:12
+msgid "Barcelona"
+msgstr "Barcelona"
+
+#: contrib/localflavor/es/es_provinces.py:13
+msgid "Burgos"
+msgstr "Burgos"
+
+#: contrib/localflavor/es/es_provinces.py:14
+msgid "Caceres"
+msgstr "Cáceres"
+
+#: contrib/localflavor/es/es_provinces.py:15
+msgid "Cadiz"
+msgstr "Cádiz"
+
+#: contrib/localflavor/es/es_provinces.py:16
+msgid "Castello"
+msgstr "Castellón"
+
+#: contrib/localflavor/es/es_provinces.py:17
+msgid "Ciudad Real"
+msgstr "Ciudad Real"
+
+#: contrib/localflavor/es/es_provinces.py:18
+msgid "Cordoba"
+msgstr "Córdoba"
+
+#: contrib/localflavor/es/es_provinces.py:19
+msgid "A Coruna"
+msgstr "La Coruña"
+
+#: contrib/localflavor/es/es_provinces.py:20
+msgid "Cuenca"
+msgstr "Cuenca"
+
+#: contrib/localflavor/es/es_provinces.py:21
+msgid "Girona"
+msgstr "Gerona"
+
+#: contrib/localflavor/es/es_provinces.py:22
+msgid "Granada"
+msgstr "Granada"
+
+#: contrib/localflavor/es/es_provinces.py:23
+msgid "Guadalajara"
+msgstr "Guadalajara"
+
+#: contrib/localflavor/es/es_provinces.py:24
+msgid "Guipuzkoa"
+msgstr "Guipúzcoa"
+
+#: contrib/localflavor/es/es_provinces.py:25
+msgid "Huelva"
+msgstr "Huelva"
+
+#: contrib/localflavor/es/es_provinces.py:26
+msgid "Huesca"
+msgstr "Huesca"
+
+#: contrib/localflavor/es/es_provinces.py:27
+msgid "Jaen"
+msgstr "Jaén"
+
+#: contrib/localflavor/es/es_provinces.py:28
+msgid "Leon"
+msgstr "León"
+
+#: contrib/localflavor/es/es_provinces.py:29
+msgid "Lleida"
+msgstr "Lérida"
+
+#: contrib/localflavor/es/es_provinces.py:30
+#: contrib/localflavor/es/es_regions.py:17
+msgid "La Rioja"
+msgstr "La Rioja"
+
+#: contrib/localflavor/es/es_provinces.py:31
+msgid "Lugo"
+msgstr "Lugo"
+
+#: contrib/localflavor/es/es_provinces.py:32
+#: contrib/localflavor/es/es_regions.py:18
+msgid "Madrid"
+msgstr "Madrid"
+
+#: contrib/localflavor/es/es_provinces.py:33
+msgid "Malaga"
+msgstr "Málaga"
+
+#: contrib/localflavor/es/es_provinces.py:34
+msgid "Murcia"
+msgstr "Murcia"
+
+#: contrib/localflavor/es/es_provinces.py:35
+msgid "Navarre"
+msgstr "Navarra"
+
+#: contrib/localflavor/es/es_provinces.py:36
+msgid "Ourense"
+msgstr "Orense"
+
+#: contrib/localflavor/es/es_provinces.py:37
+msgid "Asturias"
+msgstr "Asturias"
+
+#: contrib/localflavor/es/es_provinces.py:38
+msgid "Palencia"
+msgstr "Palencia"
+
+#: contrib/localflavor/es/es_provinces.py:39
+msgid "Las Palmas"
+msgstr "Las Palmas"
+
+#: contrib/localflavor/es/es_provinces.py:40
+msgid "Pontevedra"
+msgstr "Pontevedra"
+
+#: contrib/localflavor/es/es_provinces.py:41
+msgid "Salamanca"
+msgstr "Salamanca"
+
+#: contrib/localflavor/es/es_provinces.py:42
+msgid "Santa Cruz de Tenerife"
+msgstr "Santa Cruz de Tenerife"
+
+#: contrib/localflavor/es/es_provinces.py:43
+#: contrib/localflavor/es/es_regions.py:11
+msgid "Cantabria"
+msgstr "Cantabria"
+
+#: contrib/localflavor/es/es_provinces.py:44
+msgid "Segovia"
+msgstr "Segovia"
+
+#: contrib/localflavor/es/es_provinces.py:45
+msgid "Seville"
+msgstr "Sevilla"
+
+#: contrib/localflavor/es/es_provinces.py:46
+msgid "Soria"
+msgstr "Soria"
+
+#: contrib/localflavor/es/es_provinces.py:47
+msgid "Tarragona"
+msgstr "Tarragona"
+
+#: contrib/localflavor/es/es_provinces.py:48
+msgid "Teruel"
+msgstr "Teruel"
+
+#: contrib/localflavor/es/es_provinces.py:49
+msgid "Toledo"
+msgstr "Toledo"
+
+#: contrib/localflavor/es/es_provinces.py:50
+msgid "Valencia"
+msgstr "Valencia"
+
+#: contrib/localflavor/es/es_provinces.py:51
+msgid "Valladolid"
+msgstr "Valladolid"
+
+#: contrib/localflavor/es/es_provinces.py:52
+msgid "Bizkaia"
+msgstr "Vizcaya"
+
+#: contrib/localflavor/es/es_provinces.py:53
+msgid "Zamora"
+msgstr "Zamora"
+
+#: contrib/localflavor/es/es_provinces.py:54
+msgid "Zaragoza"
+msgstr "Zaragoza"
+
+#: contrib/localflavor/es/es_provinces.py:55
+msgid "Ceuta"
+msgstr "Ceuta"
+
+#: contrib/localflavor/es/es_provinces.py:56
+msgid "Melilla"
+msgstr "Melilla"
+
+#: contrib/localflavor/es/es_regions.py:5
+msgid "Andalusia"
+msgstr "Andalucía"
+
+#: contrib/localflavor/es/es_regions.py:6
+msgid "Aragon"
+msgstr "Aragón"
+
+#: contrib/localflavor/es/es_regions.py:7
+msgid "Principality of Asturias"
+msgstr "Principado de Asturias"
+
+#: contrib/localflavor/es/es_regions.py:8
+msgid "Balearic Islands"
+msgstr "Islas Baleares"
+
+#: contrib/localflavor/es/es_regions.py:9
+msgid "Basque Country"
+msgstr "País Vasco"
+
+#: contrib/localflavor/es/es_regions.py:10
+msgid "Canary Islands"
+msgstr "Canarias"
+
+#: contrib/localflavor/es/es_regions.py:12
+msgid "Castile-La Mancha"
+msgstr "Castilla-La Mancha"
+
+#: contrib/localflavor/es/es_regions.py:13
+msgid "Castile and Leon"
+msgstr "Castilla y León"
+
+#: contrib/localflavor/es/es_regions.py:14
+msgid "Catalonia"
+msgstr "Cataluña"
+
+#: contrib/localflavor/es/es_regions.py:15
+msgid "Extremadura"
+msgstr "Extremadura"
+
+#: contrib/localflavor/es/es_regions.py:16
+msgid "Galicia"
+msgstr "Galicia"
+
+#: contrib/localflavor/es/es_regions.py:19
+msgid "Region of Murcia"
+msgstr "Región de Murcia"
+
+#: contrib/localflavor/es/es_regions.py:20
+msgid "Foral Community of Navarre"
+msgstr "Comunidad Foral de Navarra"
+
+#: contrib/localflavor/es/es_regions.py:21
+msgid "Valencian Community"
+msgstr "Comunidad Valenciana"
+
+#: contrib/localflavor/es/forms.py:19
+msgid "Enter a valid postal code in the range and format 01XXX - 52XXX."
+msgstr "Introduzca un código postal en el rango y formato 01XXX - 52XXX."
+
+#: contrib/localflavor/es/forms.py:39
+msgid "Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or 9XXXXXXXX."
+msgstr "Introduzca un número de teléfono válido en el formato 6XXXXXXXX, 8XXXXXXXX o 9XXXXXXXX."
+
+#: contrib/localflavor/es/forms.py:66
+msgid "Please enter a valid NIF, NIE, or CIF."
+msgstr "Por favor introduzca un NIF, NIE o CIF válido."
+
+#: contrib/localflavor/es/forms.py:67
+msgid "Please enter a valid NIF or NIE."
+msgstr "Por favor, introduzca un NIF o NIE válido."
+
+#: contrib/localflavor/es/forms.py:68
+msgid "Invalid checksum for NIF."
+msgstr "El NIF es incorrecto."
+
+#: contrib/localflavor/es/forms.py:69
+msgid "Invalid checksum for NIE."
+msgstr "El NIE es incorrecto."
+
+#: contrib/localflavor/es/forms.py:70
+msgid "Invalid checksum for CIF."
+msgstr "El CIF es incorrecto."
+
+#: contrib/localflavor/es/forms.py:142
+msgid "Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX."
+msgstr "Introduzca un número de cuenta bancaria en el formato XXXX-XXXX-XX-XXXXXXXXXX."
+
+#: contrib/localflavor/es/forms.py:143
+msgid "Invalid checksum for bank account number."
+msgstr "El número de cuenta bancaria es incorrecto."
+
+#: contrib/localflavor/fi/forms.py:28
+msgid "Enter a valid Finnish social security number."
+msgstr "Introduzca un número de seguro social finlandés válido."
+
+#: contrib/localflavor/in_/forms.py:14
+msgid "Enter a zip code in the format XXXXXXX."
+msgstr "Introduzca un código postal en el formato XXXXXXX."
+
+#: contrib/localflavor/is_/forms.py:17
+msgid "Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr "Introduzca un número de identificación de Islandia válido. El formato es XXXXXX-XXXX."
+
+#: contrib/localflavor/is_/forms.py:18
+msgid "The Icelandic identification number is not valid."
+msgstr "El número de identificación de Islandia no es válido."
+
+#: contrib/localflavor/it/forms.py:14
+msgid "Enter a valid zip code."
+msgstr "Introduzca un código postal válido."
+
+#: contrib/localflavor/it/forms.py:43
+msgid "Enter a valid Social Security number."
+msgstr "Introduzca un número de Seguro Social válido."
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr "Introduzca un número VAT válido."
+
+#: contrib/localflavor/jp/forms.py:17
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "Introduzca un código postal en el formato XXXXX o XXXX-XXXX."
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr "Hokkaido"
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr "Aomori"
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr "Iwate"
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr "Miyagi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr "Akita"
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr "Yamagata"
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr "Fukushima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr "Ibaraki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr "Tochigi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr "Gunma"
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr "Saitama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr "Chiba"
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr "Tokyo"
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr "Kanagawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr "Yamanashi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr "Nagano"
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr "Niigata"
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr "Toyama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr "Ishikawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr "Fukui"
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr "Gifu"
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr "Shizuoka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr "Aichi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr "Mie"
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr "Shiga"
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr "Kyoto"
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr "Osaka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr "Hyogo"
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr "Nara"
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr "Wakayama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr "Tottori"
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr "Shimane"
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr "Okayama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr "Hiroshima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr "Yamaguchi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr "Tokushima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr "Kagawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr "Ehime"
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr "Kochi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr "Fukuoka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr "Saga"
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr "Nagasaki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr "Kumamoto"
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr "Oita"
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr "Miyazaki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr "Kagoshima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr "Okinawa"
+
+#: contrib/localflavor/mx/mx_states.py:12
+msgid "Aguascalientes"
+msgstr "Aguascalientes"
+
+#: contrib/localflavor/mx/mx_states.py:13
+msgid "Baja California"
+msgstr "Baja California"
+
+#: contrib/localflavor/mx/mx_states.py:14
+msgid "Baja California Sur"
+msgstr "Baja California Sur"
+
+#: contrib/localflavor/mx/mx_states.py:15
+msgid "Campeche"
+msgstr "Campeche"
+
+#: contrib/localflavor/mx/mx_states.py:16
+msgid "Chihuahua"
+msgstr "Chihuahua"
+
+#: contrib/localflavor/mx/mx_states.py:17
+msgid "Chiapas"
+msgstr "Chiapas"
+
+#: contrib/localflavor/mx/mx_states.py:18
+msgid "Coahuila"
+msgstr "Coahuila"
+
+#: contrib/localflavor/mx/mx_states.py:19
+msgid "Colima"
+msgstr "Colima"
+
+#: contrib/localflavor/mx/mx_states.py:20
+msgid "Distrito Federal"
+msgstr "Distrito Federal"
+
+#: contrib/localflavor/mx/mx_states.py:21
+msgid "Durango"
+msgstr "Durango"
+
+#: contrib/localflavor/mx/mx_states.py:22
+msgid "Guerrero"
+msgstr "Guerrero"
+
+#: contrib/localflavor/mx/mx_states.py:23
+msgid "Guanajuato"
+msgstr "Guanajuato"
+
+#: contrib/localflavor/mx/mx_states.py:24
+msgid "Hidalgo"
+msgstr "Hidalgo"
+
+#: contrib/localflavor/mx/mx_states.py:25
+msgid "Jalisco"
+msgstr "Jalisco"
+
+#: contrib/localflavor/mx/mx_states.py:26
+msgid "Estado de México"
+msgstr "Estado de México"
+
+#: contrib/localflavor/mx/mx_states.py:27
+msgid "Michoacán"
+msgstr "Michoacán"
+
+#: contrib/localflavor/mx/mx_states.py:28
+msgid "Morelos"
+msgstr "Morelos"
+
+#: contrib/localflavor/mx/mx_states.py:29
+msgid "Nayarit"
+msgstr "Nayarit"
+
+#: contrib/localflavor/mx/mx_states.py:30
+msgid "Nuevo León"
+msgstr "Nuevo León"
+
+#: contrib/localflavor/mx/mx_states.py:31
+msgid "Oaxaca"
+msgstr "Oaxaca"
+
+#: contrib/localflavor/mx/mx_states.py:32
+msgid "Puebla"
+msgstr "Puebla"
+
+#: contrib/localflavor/mx/mx_states.py:33
+msgid "Querétaro"
+msgstr "Querétaro"
+
+#: contrib/localflavor/mx/mx_states.py:34
+msgid "Quintana Roo"
+msgstr "Quintana Roo"
+
+#: contrib/localflavor/mx/mx_states.py:35
+msgid "Sinaloa"
+msgstr "Sinaloa"
+
+#: contrib/localflavor/mx/mx_states.py:36
+msgid "San Luis Potosí"
+msgstr "San Luis Potosí"
+
+#: contrib/localflavor/mx/mx_states.py:37
+msgid "Sonora"
+msgstr "Sonora"
+
+#: contrib/localflavor/mx/mx_states.py:38
+msgid "Tabasco"
+msgstr "Tabasco"
+
+#: contrib/localflavor/mx/mx_states.py:39
+msgid "Tamaulipas"
+msgstr "Tamaulipas"
+
+#: contrib/localflavor/mx/mx_states.py:40
+msgid "Tlaxcala"
+msgstr "Tlaxcala"
+
+#: contrib/localflavor/mx/mx_states.py:41
+msgid "Veracruz"
+msgstr "Veracruz"
+
+#: contrib/localflavor/mx/mx_states.py:42
+msgid "Yucatán"
+msgstr "Yucatán"
+
+#: contrib/localflavor/mx/mx_states.py:43
+msgid "Zacatecas"
+msgstr "Zacatecas"
+
+#: contrib/localflavor/nl/forms.py:21
+msgid "Enter a valid postal code"
+msgstr "Introduzca un código postal válido"
+
+#: contrib/localflavor/nl/forms.py:52
+msgid "Enter a valid phone number"
+msgstr "Introduzca un número de teléfono válido"
+
+#: contrib/localflavor/nl/forms.py:78
+msgid "Enter a valid SoFi number"
+msgstr "Introduzca un número SoFi válido"
+
+#: contrib/localflavor/nl/nl_provinces.py:4
+msgid "Drente"
+msgstr "Drente"
+
+#: contrib/localflavor/nl/nl_provinces.py:5
+msgid "Flevoland"
+msgstr "Flevoland"
+
+#: contrib/localflavor/nl/nl_provinces.py:6
+msgid "Friesland"
+msgstr "Friesland"
+
+#: contrib/localflavor/nl/nl_provinces.py:7
+msgid "Gelderland"
+msgstr "Gelderland"
+
+#: contrib/localflavor/nl/nl_provinces.py:8
+msgid "Groningen"
+msgstr "Groningen"
+
+#: contrib/localflavor/nl/nl_provinces.py:9
+msgid "Limburg"
+msgstr "Limburg"
+
+#: contrib/localflavor/nl/nl_provinces.py:10
+msgid "Noord-Brabant"
+msgstr "Noord-Brabant"
+
+#: contrib/localflavor/nl/nl_provinces.py:11
+msgid "Noord-Holland"
+msgstr "Noord-Holland"
+
+#: contrib/localflavor/nl/nl_provinces.py:12
+msgid "Overijssel"
+msgstr "Overijssel"
+
+#: contrib/localflavor/nl/nl_provinces.py:13
+msgid "Utrecht"
+msgstr "Utrecht"
+
+#: contrib/localflavor/nl/nl_provinces.py:14
+msgid "Zeeland"
+msgstr "Zeeland"
+
+#: contrib/localflavor/nl/nl_provinces.py:15
+msgid "Zuid-Holland"
+msgstr "Zuid-Holland"
+
+#: contrib/localflavor/no/forms.py:33
+msgid "Enter a valid Norwegian social security number."
+msgstr "Introduzca un número de seguro social de Noruega válido."
+
+#: contrib/localflavor/pe/forms.py:24
+msgid "This field requires 8 digits."
+msgstr "Este campo necesita 8 dígitos."
+
+#: contrib/localflavor/pe/forms.py:52
+msgid "This field requires 11 digits."
+msgstr "Este campo necesita 11 dígitos."
+
+#: contrib/localflavor/pl/forms.py:39
+msgid "National Identification Number consists of 11 digits."
+msgstr "Número de Identificación Nacional consiste en 11 dígitos"
+
+#: contrib/localflavor/pl/forms.py:40
+msgid "Wrong checksum for the National Identification Number."
+msgstr "El Número de Identificación Nacional es incorrecto."
+
+#: contrib/localflavor/pl/forms.py:72
+msgid "Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX."
+msgstr "Introduzca un número de impuesto (NIP) en el formato XXX-XXX-XX-XX o XX-XX-XXX-XXX."
+
+#: contrib/localflavor/pl/forms.py:73
+msgid "Wrong checksum for the Tax Number (NIP)."
+msgstr "El Número de Identificación Tributaria (NIP) es incorrecto."
+
+#: contrib/localflavor/pl/forms.py:112
+msgid "National Business Register Number (REGON) consists of 7 or 9 digits."
+msgstr "El Número Nacional de Registro de Negocios (REGON) consiste en 7 o 9 dígitos."
+
+#: contrib/localflavor/pl/forms.py:113
+msgid "Wrong checksum for the National Business Register Number (REGON)."
+msgstr "El Número Nacional de Registro de Negocios (REGON) es incorrecto."
+
+#: contrib/localflavor/pl/forms.py:156
+msgid "Enter a postal code in the format XX-XXX."
+msgstr "Introduzca un código postal en el formato XX-XXX."
+
+#: contrib/localflavor/pl/pl_voivodeships.py:8
+msgid "Lower Silesia"
+msgstr "Lower Silesia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:9
+msgid "Kuyavia-Pomerania"
+msgstr "Kuyavia-Pomerania"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:10
+msgid "Lublin"
+msgstr "Lublin"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:11
+msgid "Lubusz"
+msgstr "Lubusz"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:12
+msgid "Lodz"
+msgstr "Lodz"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:13
+msgid "Lesser Poland"
+msgstr "Lesser Poland"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:14
+msgid "Masovia"
+msgstr "Masovia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:15
+msgid "Opole"
+msgstr "Opole"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:16
+msgid "Subcarpatia"
+msgstr "Subcarpatia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:17
+msgid "Podlasie"
+msgstr "Podlasie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:18
+msgid "Pomerania"
+msgstr "Pomerania"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:19
+msgid "Silesia"
+msgstr "Silesia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:20
+msgid "Swietokrzyskie"
+msgstr "Swietokrzyskie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:21
+msgid "Warmia-Masuria"
+msgstr "Warmia-Masuria"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:22
+msgid "Greater Poland"
+msgstr "Greater Poland"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:23
+msgid "West Pomerania"
+msgstr "West Pomerania"
+
+#: contrib/localflavor/ro/forms.py:19
+msgid "Enter a valid CIF."
+msgstr "Introduzca un CIF válido."
+
+#: contrib/localflavor/ro/forms.py:56
+msgid "Enter a valid CNP."
+msgstr "Introduzca un CNP válido."
+
+#: contrib/localflavor/ro/forms.py:141
+msgid "Enter a valid IBAN in ROXX-XXXX-XXXX-XXXX-XXXX-XXXX format"
+msgstr "Introduzca un IBAN válido en el formato ROXX-XXXX-XXXX-XXXX-XXXX-XXXX."
+
+#: contrib/localflavor/ro/forms.py:171
+msgid "Phone numbers must be in XXXX-XXXXXX format."
+msgstr "Los números de teléfono deben tener el formato XXXX-XXXXXX."
+
+#: contrib/localflavor/ro/forms.py:194
+msgid "Enter a valid postal code in the format XXXXXX"
+msgstr "Introduzca un código postal válido en el formato XXXXXX"
+
+#: contrib/localflavor/sk/forms.py:30
+msgid "Enter a postal code in the format XXXXX or XXX XX."
+msgstr "Introduzca un código postal en el formato XXXXX o XXX XX."
+
+#: contrib/localflavor/sk/sk_districts.py:8
+msgid "Banska Bystrica"
+msgstr "Región de Bystrica"
+
+#: contrib/localflavor/sk/sk_districts.py:9
+msgid "Banska Stiavnica"
+msgstr "Región de Banska Stiavnica"
+
+#: contrib/localflavor/sk/sk_districts.py:10
+msgid "Bardejov"
+msgstr "Región de Bardejov"
+
+#: contrib/localflavor/sk/sk_districts.py:11
+msgid "Banovce nad Bebravou"
+msgstr "Región de Banovce nad Bebravou"
+
+#: contrib/localflavor/sk/sk_districts.py:12
+msgid "Brezno"
+msgstr "Región de Brezno"
+
+#: contrib/localflavor/sk/sk_districts.py:13
+msgid "Bratislava I"
+msgstr "Región de Bratislava I"
+
+#: contrib/localflavor/sk/sk_districts.py:14
+msgid "Bratislava II"
+msgstr "Región de Bratislava II"
+
+#: contrib/localflavor/sk/sk_districts.py:15
+msgid "Bratislava III"
+msgstr "Región de Bratislava III"
+
+#: contrib/localflavor/sk/sk_districts.py:16
+msgid "Bratislava IV"
+msgstr "Región de Bratislava IV"
+
+#: contrib/localflavor/sk/sk_districts.py:17
+msgid "Bratislava V"
+msgstr "Región de Bratislava V"
+
+#: contrib/localflavor/sk/sk_districts.py:18
+msgid "Bytca"
+msgstr "Región de Bytca"
+
+#: contrib/localflavor/sk/sk_districts.py:19
+msgid "Cadca"
+msgstr "Región de Cadca"
+
+#: contrib/localflavor/sk/sk_districts.py:20
+msgid "Detva"
+msgstr "Región de Detva"
+
+#: contrib/localflavor/sk/sk_districts.py:21
+msgid "Dolny Kubin"
+msgstr "Región de Dolny Kubin"
+
+#: contrib/localflavor/sk/sk_districts.py:22
+msgid "Dunajska Streda"
+msgstr "Región de Dunajska Streda"
+
+#: contrib/localflavor/sk/sk_districts.py:23
+msgid "Galanta"
+msgstr "Galanta"
+
+#: contrib/localflavor/sk/sk_districts.py:24
+msgid "Gelnica"
+msgstr "Gelnica"
+
+#: contrib/localflavor/sk/sk_districts.py:25
+msgid "Hlohovec"
+msgstr "Hlohovec"
+
+#: contrib/localflavor/sk/sk_districts.py:26
+msgid "Humenne"
+msgstr "Humenne"
+
+#: contrib/localflavor/sk/sk_districts.py:27
+msgid "Ilava"
+msgstr "Ilava"
+
+#: contrib/localflavor/sk/sk_districts.py:28
+msgid "Kezmarok"
+msgstr "Kezmarok"
+
+#: contrib/localflavor/sk/sk_districts.py:29
+msgid "Komarno"
+msgstr "Komarno"
+
+#: contrib/localflavor/sk/sk_districts.py:30
+msgid "Kosice I"
+msgstr "Kosice I"
+
+#: contrib/localflavor/sk/sk_districts.py:31
+msgid "Kosice II"
+msgstr "Kosice II"
+
+#: contrib/localflavor/sk/sk_districts.py:32
+msgid "Kosice III"
+msgstr "Kosice III"
+
+#: contrib/localflavor/sk/sk_districts.py:33
+msgid "Kosice IV"
+msgstr "Kosice IV"
+
+#: contrib/localflavor/sk/sk_districts.py:34
+msgid "Kosice - okolie"
+msgstr "Kosice - okolie"
+
+#: contrib/localflavor/sk/sk_districts.py:35
+msgid "Krupina"
+msgstr "Krupina"
+
+#: contrib/localflavor/sk/sk_districts.py:36
+msgid "Kysucke Nove Mesto"
+msgstr "Kysucke Nove Mesto"
+
+#: contrib/localflavor/sk/sk_districts.py:37
+msgid "Levice"
+msgstr "Levice"
+
+#: contrib/localflavor/sk/sk_districts.py:38
+msgid "Levoca"
+msgstr "Levoca"
+
+#: contrib/localflavor/sk/sk_districts.py:39
+msgid "Liptovsky Mikulas"
+msgstr "Liptovsky Mikulas"
+
+#: contrib/localflavor/sk/sk_districts.py:40
+msgid "Lucenec"
+msgstr "Lucenec"
+
+#: contrib/localflavor/sk/sk_districts.py:41
+msgid "Malacky"
+msgstr "Malacky"
+
+#: contrib/localflavor/sk/sk_districts.py:42
+msgid "Martin"
+msgstr "Martin"
+
+#: contrib/localflavor/sk/sk_districts.py:43
+msgid "Medzilaborce"
+msgstr "Medzilaborce"
+
+#: contrib/localflavor/sk/sk_districts.py:44
+msgid "Michalovce"
+msgstr "Michalovce"
+
+#: contrib/localflavor/sk/sk_districts.py:45
+msgid "Myjava"
+msgstr "Myjava"
+
+#: contrib/localflavor/sk/sk_districts.py:46
+msgid "Namestovo"
+msgstr "Namestovo"
+
+#: contrib/localflavor/sk/sk_districts.py:47
+msgid "Nitra"
+msgstr "Nitra"
+
+#: contrib/localflavor/sk/sk_districts.py:48
+msgid "Nove Mesto nad Vahom"
+msgstr "Nove Mesto nad Vahom"
+
+#: contrib/localflavor/sk/sk_districts.py:49
+msgid "Nove Zamky"
+msgstr "Nove Zamky"
+
+#: contrib/localflavor/sk/sk_districts.py:50
+msgid "Partizanske"
+msgstr "Partizanske"
+
+#: contrib/localflavor/sk/sk_districts.py:51
+msgid "Pezinok"
+msgstr "Pezinok"
+
+#: contrib/localflavor/sk/sk_districts.py:52
+msgid "Piestany"
+msgstr "Piestany"
+
+#: contrib/localflavor/sk/sk_districts.py:53
+msgid "Poltar"
+msgstr "Poltar"
+
+#: contrib/localflavor/sk/sk_districts.py:54
+msgid "Poprad"
+msgstr "Poprad"
+
+#: contrib/localflavor/sk/sk_districts.py:55
+msgid "Povazska Bystrica"
+msgstr "Povazska Bystrica"
+
+#: contrib/localflavor/sk/sk_districts.py:56
+msgid "Presov"
+msgstr "Presov"
+
+#: contrib/localflavor/sk/sk_districts.py:57
+msgid "Prievidza"
+msgstr "Prievidza"
+
+#: contrib/localflavor/sk/sk_districts.py:58
+msgid "Puchov"
+msgstr "Puchov"
+
+#: contrib/localflavor/sk/sk_districts.py:59
+msgid "Revuca"
+msgstr "Revuca"
+
+#: contrib/localflavor/sk/sk_districts.py:60
+msgid "Rimavska Sobota"
+msgstr "Rimavska Sobota"
+
+#: contrib/localflavor/sk/sk_districts.py:61
+msgid "Roznava"
+msgstr "Roznava"
+
+#: contrib/localflavor/sk/sk_districts.py:62
+msgid "Ruzomberok"
+msgstr "Ruzomberok"
+
+#: contrib/localflavor/sk/sk_districts.py:63
+msgid "Sabinov"
+msgstr "Sabinov"
+
+#: contrib/localflavor/sk/sk_districts.py:64
+msgid "Senec"
+msgstr "Senec"
+
+#: contrib/localflavor/sk/sk_districts.py:65
+msgid "Senica"
+msgstr "Senica"
+
+#: contrib/localflavor/sk/sk_districts.py:66
+msgid "Skalica"
+msgstr "Skalica"
+
+#: contrib/localflavor/sk/sk_districts.py:67
+msgid "Snina"
+msgstr "Snina"
+
+#: contrib/localflavor/sk/sk_districts.py:68
+msgid "Sobrance"
+msgstr "Sobrance"
+
+#: contrib/localflavor/sk/sk_districts.py:69
+msgid "Spisska Nova Ves"
+msgstr "Spisska Nova Ves"
+
+#: contrib/localflavor/sk/sk_districts.py:70
+msgid "Stara Lubovna"
+msgstr "Stara Lubovna"
+
+#: contrib/localflavor/sk/sk_districts.py:71
+msgid "Stropkov"
+msgstr "Stropkov"
+
+#: contrib/localflavor/sk/sk_districts.py:72
+msgid "Svidnik"
+msgstr "Svidnik"
+
+#: contrib/localflavor/sk/sk_districts.py:73
+msgid "Sala"
+msgstr "Sala"
+
+#: contrib/localflavor/sk/sk_districts.py:74
+msgid "Topolcany"
+msgstr "Topolcany"
+
+#: contrib/localflavor/sk/sk_districts.py:75
+msgid "Trebisov"
+msgstr "Trebisov"
+
+#: contrib/localflavor/sk/sk_districts.py:76
+msgid "Trencin"
+msgstr "Trencin"
+
+#: contrib/localflavor/sk/sk_districts.py:77
+msgid "Trnava"
+msgstr "Trnava"
+
+#: contrib/localflavor/sk/sk_districts.py:78
+msgid "Turcianske Teplice"
+msgstr "Turcianske Teplice"
+
+#: contrib/localflavor/sk/sk_districts.py:79
+msgid "Tvrdosin"
+msgstr "Tvrdosin"
+
+#: contrib/localflavor/sk/sk_districts.py:80
+msgid "Velky Krtis"
+msgstr "Velky Krtis"
+
+#: contrib/localflavor/sk/sk_districts.py:81
+msgid "Vranov nad Toplou"
+msgstr "Vranov nad Toplou"
+
+#: contrib/localflavor/sk/sk_districts.py:82
+msgid "Zlate Moravce"
+msgstr "Zlate Moravce"
+
+#: contrib/localflavor/sk/sk_districts.py:83
+msgid "Zvolen"
+msgstr "Zvolen"
+
+#: contrib/localflavor/sk/sk_districts.py:84
+msgid "Zarnovica"
+msgstr "Zarnovica"
+
+#: contrib/localflavor/sk/sk_districts.py:85
+msgid "Ziar nad Hronom"
+msgstr "Ziar nad Hronom"
+
+#: contrib/localflavor/sk/sk_districts.py:86
+msgid "Zilina"
+msgstr "Zilina"
+
+#: contrib/localflavor/sk/sk_regions.py:8
+msgid "Banska Bystrica region"
+msgstr "Región de Banska Bystrica"
+
+#: contrib/localflavor/sk/sk_regions.py:9
+msgid "Bratislava region"
+msgstr "Región de Bratislava"
+
+#: contrib/localflavor/sk/sk_regions.py:10
+msgid "Kosice region"
+msgstr "Región de Kosice"
+
+#: contrib/localflavor/sk/sk_regions.py:11
+msgid "Nitra region"
+msgstr "Región de Nitra"
+
+#: contrib/localflavor/sk/sk_regions.py:12
+msgid "Presov region"
+msgstr "Región de Presov"
+
+#: contrib/localflavor/sk/sk_regions.py:13
+msgid "Trencin region"
+msgstr "Región de Trencin"
+
+#: contrib/localflavor/sk/sk_regions.py:14
+msgid "Trnava region"
+msgstr "Región de Trnava"
+
+#: contrib/localflavor/sk/sk_regions.py:15
+msgid "Zilina region"
+msgstr "Región de Zilina"
+
+#: contrib/localflavor/uk/forms.py:21
+msgid "Enter a valid postcode."
+msgstr "Introduzca un código postal válido."
+
+#: contrib/localflavor/uk/uk_regions.py:11
+msgid "Bedfordshire"
+msgstr "Bedfordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:12
+msgid "Buckinghamshire"
+msgstr "Buckinghamshire"
+
+#: contrib/localflavor/uk/uk_regions.py:14
+msgid "Cheshire"
+msgstr "Cheshire"
+
+#: contrib/localflavor/uk/uk_regions.py:15
+msgid "Cornwall and Isles of Scilly"
+msgstr "Cornwall and Isles of Scilly"
+
+#: contrib/localflavor/uk/uk_regions.py:16
+msgid "Cumbria"
+msgstr "Cumbria"
+
+#: contrib/localflavor/uk/uk_regions.py:17
+msgid "Derbyshire"
+msgstr "Derbyshire"
+
+#: contrib/localflavor/uk/uk_regions.py:18
+msgid "Devon"
+msgstr "Devon"
+
+#: contrib/localflavor/uk/uk_regions.py:19
+msgid "Dorset"
+msgstr "Dorset"
+
+#: contrib/localflavor/uk/uk_regions.py:20
+msgid "Durham"
+msgstr "Durham"
+
+#: contrib/localflavor/uk/uk_regions.py:21
+msgid "East Sussex"
+msgstr "East Sussex"
+
+#: contrib/localflavor/uk/uk_regions.py:22
+msgid "Essex"
+msgstr "Essex"
+
+#: contrib/localflavor/uk/uk_regions.py:23
+msgid "Gloucestershire"
+msgstr "Gloucestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:24
+msgid "Greater London"
+msgstr "Londres (área metropolitana)"
+
+#: contrib/localflavor/uk/uk_regions.py:25
+msgid "Greater Manchester"
+msgstr "Manchester (área metropolitana)"
+
+#: contrib/localflavor/uk/uk_regions.py:26
+msgid "Hampshire"
+msgstr "Hampshire"
+
+#: contrib/localflavor/uk/uk_regions.py:27
+msgid "Hertfordshire"
+msgstr "Hertfordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:28
+msgid "Kent"
+msgstr "Kent"
+
+#: contrib/localflavor/uk/uk_regions.py:29
+msgid "Lancashire"
+msgstr "Lancashire"
+
+#: contrib/localflavor/uk/uk_regions.py:30
+msgid "Leicestershire"
+msgstr "Leicestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:31
+msgid "Lincolnshire"
+msgstr "Lincolnshire"
+
+#: contrib/localflavor/uk/uk_regions.py:32
+msgid "Merseyside"
+msgstr "Merseyside"
+
+#: contrib/localflavor/uk/uk_regions.py:33
+msgid "Norfolk"
+msgstr "Norfolk"
+
+#: contrib/localflavor/uk/uk_regions.py:34
+msgid "North Yorkshire"
+msgstr "North Yorkshire"
+
+#: contrib/localflavor/uk/uk_regions.py:35
+msgid "Northamptonshire"
+msgstr "Northamptonshire"
+
+#: contrib/localflavor/uk/uk_regions.py:36
+msgid "Northumberland"
+msgstr "Northumberland"
+
+#: contrib/localflavor/uk/uk_regions.py:37
+msgid "Nottinghamshire"
+msgstr "Nottinghamshire"
+
+#: contrib/localflavor/uk/uk_regions.py:38
+msgid "Oxfordshire"
+msgstr "Oxfordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:39
+msgid "Shropshire"
+msgstr "Shropshire"
+
+#: contrib/localflavor/uk/uk_regions.py:40
+msgid "Somerset"
+msgstr "Somerset"
+
+#: contrib/localflavor/uk/uk_regions.py:41
+msgid "South Yorkshire"
+msgstr "South Yorkshire"
+
+#: contrib/localflavor/uk/uk_regions.py:42
+msgid "Staffordshire"
+msgstr "Staffordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:43
+msgid "Suffolk"
+msgstr "Suffolk"
+
+#: contrib/localflavor/uk/uk_regions.py:44
+msgid "Surrey"
+msgstr "Surrey"
+
+#: contrib/localflavor/uk/uk_regions.py:45
+msgid "Tyne and Wear"
+msgstr "Tyne and Wear"
+
+#: contrib/localflavor/uk/uk_regions.py:46
+msgid "Warwickshire"
+msgstr "Warwickshire"
+
+#: contrib/localflavor/uk/uk_regions.py:47
+msgid "West Midlands"
+msgstr "West Midlands"
+
+#: contrib/localflavor/uk/uk_regions.py:48
+msgid "West Sussex"
+msgstr "West Sussex"
+
+#: contrib/localflavor/uk/uk_regions.py:49
+msgid "West Yorkshire"
+msgstr "West Yorkshire"
+
+#: contrib/localflavor/uk/uk_regions.py:50
+msgid "Wiltshire"
+msgstr "Wiltshire"
+
+#: contrib/localflavor/uk/uk_regions.py:51
+msgid "Worcestershire"
+msgstr "Worcestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:55
+msgid "County Antrim"
+msgstr "Condado de Antrim"
+
+#: contrib/localflavor/uk/uk_regions.py:56
+msgid "County Armagh"
+msgstr "Condado de Armagh"
+
+#: contrib/localflavor/uk/uk_regions.py:57
+msgid "County Down"
+msgstr "Condado de Down"
+
+#: contrib/localflavor/uk/uk_regions.py:58
+msgid "County Fermanagh"
+msgstr "Condado de Fermanagh"
+
+#: contrib/localflavor/uk/uk_regions.py:59
+msgid "County Londonderry"
+msgstr "Condado de Londonderry"
+
+#: contrib/localflavor/uk/uk_regions.py:60
+msgid "County Tyrone"
+msgstr "Condado de Tyrone"
+
+#: contrib/localflavor/uk/uk_regions.py:64
+msgid "Clwyd"
+msgstr "Clwyd"
+
+#: contrib/localflavor/uk/uk_regions.py:65
+msgid "Dyfed"
+msgstr "Dyfed"
+
+#: contrib/localflavor/uk/uk_regions.py:66
+msgid "Gwent"
+msgstr "Gwent"
+
+#: contrib/localflavor/uk/uk_regions.py:67
+msgid "Gwynedd"
+msgstr "Gwynedd"
+
+#: contrib/localflavor/uk/uk_regions.py:68
+msgid "Mid Glamorgan"
+msgstr "Mid Glamorgan"
+
+#: contrib/localflavor/uk/uk_regions.py:69
+msgid "Powys"
+msgstr "Powys"
+
+#: contrib/localflavor/uk/uk_regions.py:70
+msgid "South Glamorgan"
+msgstr "South Glamorgan"
+
+#: contrib/localflavor/uk/uk_regions.py:71
+msgid "West Glamorgan"
+msgstr "West Glamorgan"
+
+#: contrib/localflavor/uk/uk_regions.py:75
+msgid "Borders"
+msgstr "Borders"
+
+#: contrib/localflavor/uk/uk_regions.py:76
+msgid "Central Scotland"
+msgstr "Central Scotland"
+
+#: contrib/localflavor/uk/uk_regions.py:77
+msgid "Dumfries and Galloway"
+msgstr "Dumfries and Galloway"
+
+#: contrib/localflavor/uk/uk_regions.py:78
+msgid "Fife"
+msgstr "Fife"
+
+#: contrib/localflavor/uk/uk_regions.py:79
+msgid "Grampian"
+msgstr "Grampian"
+
+#: contrib/localflavor/uk/uk_regions.py:80
+msgid "Highland"
+msgstr "Highland"
+
+#: contrib/localflavor/uk/uk_regions.py:81
+msgid "Lothian"
+msgstr "Lothian"
+
+#: contrib/localflavor/uk/uk_regions.py:82
+msgid "Orkney Islands"
+msgstr "Orkney Islands"
+
+#: contrib/localflavor/uk/uk_regions.py:83
+msgid "Shetland Islands"
+msgstr "Shetland Islands"
+
+#: contrib/localflavor/uk/uk_regions.py:84
+msgid "Strathclyde"
+msgstr "Strathclyde"
+
+#: contrib/localflavor/uk/uk_regions.py:85
+msgid "Tayside"
+msgstr "Tayside"
+
+#: contrib/localflavor/uk/uk_regions.py:86
+msgid "Western Isles"
+msgstr "Western Isles"
+
+#: contrib/localflavor/uk/uk_regions.py:90
+msgid "England"
+msgstr "Inglaterra"
+
+#: contrib/localflavor/uk/uk_regions.py:91
+msgid "Northern Ireland"
+msgstr "Irlanda del Norte"
+
+#: contrib/localflavor/uk/uk_regions.py:92
+msgid "Scotland"
+msgstr "Escocia"
+
+#: contrib/localflavor/uk/uk_regions.py:93
+msgid "Wales"
+msgstr "Gales"
+
+#: contrib/localflavor/us/forms.py:16
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "Introduzca un código postal en el formato XXXXX o XXXX-XXXX."
+
+#: contrib/localflavor/us/forms.py:54
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr "Introduzca un Número Seguro Social de EEUU válido en el formato XXX-XX-XXXX"
+
+#: contrib/localflavor/za/forms.py:20
+msgid "Enter a valid South African ID number"
+msgstr "Introduzca un ID surafricano válido"
+
+#: contrib/localflavor/za/forms.py:54
+msgid "Enter a valid South African postal code"
+msgstr "Introduzca un código postal surafricano válido"
+
+#: contrib/localflavor/za/za_provinces.py:4
+msgid "Eastern Cape"
+msgstr "Eastern Cape"
+
+#: contrib/localflavor/za/za_provinces.py:5
+msgid "Free State"
+msgstr "Free State"
+
+#: contrib/localflavor/za/za_provinces.py:6
+msgid "Gauteng"
+msgstr "Gauteng"
+
+#: contrib/localflavor/za/za_provinces.py:7
+msgid "KwaZulu-Natal"
+msgstr "KwaZulu-Natal"
+
+#: contrib/localflavor/za/za_provinces.py:8
+msgid "Limpopo"
+msgstr "Limpopo"
+
+#: contrib/localflavor/za/za_provinces.py:9
+msgid "Mpumalanga"
+msgstr "Mpumalanga"
+
+#: contrib/localflavor/za/za_provinces.py:10
+msgid "Northern Cape"
+msgstr "Northern Cape"
+
+#: contrib/localflavor/za/za_provinces.py:11
+msgid "North West"
+msgstr "North West"
+
+#: contrib/localflavor/za/za_provinces.py:12
+msgid "Western Cape"
+msgstr "Western Cape"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "redirigir desde"
+
+#: contrib/redirects/models.py:8
+msgid "This should be an absolute path, excluding the domain name. Example: '/events/search/'."
+msgstr "Esta ruta debería ser absoluta, excluyendo el nombre de dominio. Ejemplo: '/events/search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "redirigir a"
+
+#: contrib/redirects/models.py:10
+msgid "This can be either an absolute path (as above) or a full URL starting with 'http://'."
+msgstr "Esto puede ser bien una ruta absoluta (como antes) o una URL completa que empiece con 'http://'."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "redirección"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "redirecciones"
+
+#: contrib/sessions/models.py:45
+msgid "session key"
+msgstr "clave de sesión"
+
+#: contrib/sessions/models.py:47
+msgid "session data"
+msgstr "datos de sesión"
+
+#: contrib/sessions/models.py:48
+msgid "expire date"
+msgstr "fecha de caducidad"
+
+#: contrib/sessions/models.py:53
+msgid "session"
+msgstr "sesión"
+
+#: contrib/sessions/models.py:54
+msgid "sessions"
+msgstr "sesiones"
+
+#: contrib/sites/models.py:32
+msgid "domain name"
+msgstr "nombre de dominio"
+
+#: contrib/sites/models.py:33
+msgid "display name"
+msgstr "nombre para mostrar"
+
+#: contrib/sites/models.py:38
+msgid "site"
+msgstr "sitio"
+
+#: contrib/sites/models.py:39
+msgid "sites"
+msgstr "sitios"
+
+#: core/validators.py:76
+msgid "This value must contain only letters, numbers, underscores, dashes or slashes."
+msgstr "Este valor debe contener sólo letras, números, guiones bajos y barras."
+
+#: core/validators.py:80
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "Este valor debe contener sólo letras, números, guiones bajos o medios."
+
+#: core/validators.py:84
+msgid "Uppercase letters are not allowed here."
+msgstr "No se admiten letras mayúsculas."
+
+#: core/validators.py:88
+msgid "Lowercase letters are not allowed here."
+msgstr "No se admiten letras minúsculas."
+
+#: core/validators.py:95
+msgid "Enter only digits separated by commas."
+msgstr "Introduzca sólo dígitos separados por comas."
+
+#: core/validators.py:107
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Introduzca direcciones de correo válidas separadas por comas."
+
+#: core/validators.py:111
+msgid "Please enter a valid IP address."
+msgstr "Por favor introduzca una dirección IP válida."
+
+#: core/validators.py:115
+msgid "Empty values are not allowed here."
+msgstr "No se admiten valores vacíos."
+
+#: core/validators.py:119
+msgid "Non-numeric characters aren't allowed here."
+msgstr "No se admiten caracteres no numéricos."
+
+#: core/validators.py:123
+msgid "This value can't be comprised solely of digits."
+msgstr "Este valor no puede comprender sólo dígitos."
+
+#: core/validators.py:128
+#: forms/fields.py:157
+msgid "Enter a whole number."
+msgstr "Introduzca un número entero."
+
+#: core/validators.py:132
+msgid "Only alphabetical characters are allowed here."
+msgstr "Sólo se admiten caracteres alfabéticos."
+
+#: core/validators.py:147
+#, python-format
+msgid "Invalid date: %s"
+msgstr "Fecha no válida: %s"
+
+#: core/validators.py:152
+#: db/models/fields/__init__.py:552
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Introduzca una fecha válida en formato AAAA-MM-DD."
+
+#: core/validators.py:157
+msgid "Enter a valid time in HH:MM format."
+msgstr "Introduzca una hora válida en formato HH:MM."
+
+#: core/validators.py:161
+#: db/models/fields/__init__.py:633
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Introduzca una fecha/hora válida en formato AAAA-MM-DD HH:MM."
+
+#: core/validators.py:166
+#: forms/fields.py:408
+msgid "Enter a valid e-mail address."
+msgstr "Introduzca una dirección de correo electrónico válida."
+
+#: core/validators.py:178
+#: core/validators.py:470
+#: forms/fields.py:426
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "No se ha enviado ningún fichero. Compruebe el tipo de codificación en el formulario."
+
+#: core/validators.py:189
+#: forms/fields.py:466
+msgid "Upload a valid image. The file you uploaded was either not an image or a corrupted image."
+msgstr "Envíe una imagen válida. El fichero que ha enviado no era una imagen o se trataba de una imagen corrupta."
+
+#: core/validators.py:196
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "La URL %s no apunta a una imagen válida."
+
+#: core/validators.py:200
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "Los números de teléfono deben guardar el formato XXX-XXX-XXXX. \"%s\" no es válido."
+
+#: core/validators.py:208
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "La URL %s no apunta a un vídeo QuickTime válido."
+
+#: core/validators.py:212
+msgid "A valid URL is required."
+msgstr "Se precisa una URL válida."
+
+#: core/validators.py:226
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Se precisa HTML válido. Los errores específicos son:\n"
+"%s"
+
+#: core/validators.py:233
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "XML mal formado: %s"
+
+#: core/validators.py:250
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "URL no válida: %s"
+
+#: core/validators.py:255
+#: core/validators.py:257
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "La URL %s es un enlace roto."
+
+#: core/validators.py:263
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Introduzca una abreviatura válida de estado de los EEUU."
+
+#: core/validators.py:277
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "¡Cuide su vocabulario! Aquí no admitimos la palabra %s."
+msgstr[1] "¡Cuide su vocabulario! Aquí no admitimos las palabras %s."
+
+#: core/validators.py:284
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Este campo debe concordar con el campo '%s'."
+
+#: core/validators.py:303
+msgid "Please enter something for at least one field."
+msgstr "Por favor, introduzca algo en al menos un campo."
+
+#: core/validators.py:312
+#: core/validators.py:323
+msgid "Please enter both fields or leave them both empty."
+msgstr "Por favor, rellene ambos campos o deje ambos vacíos."
+
+#: core/validators.py:331
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Se debe proporcionar este campo si %(field)s es %(value)s"
+
+#: core/validators.py:344
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Se debe proporcionar este campo si %(field)s no es %(value)s"
+
+#: core/validators.py:363
+msgid "Duplicate values are not allowed."
+msgstr "No se admiten valores duplicados."
+
+#: core/validators.py:378
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Este valor debe estar entre %(lower)s y %(upper)s."
+
+#: core/validators.py:380
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Este valor debe ser como mínimo %s."
+
+#: core/validators.py:382
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Este valor no debe ser mayor que %s."
+
+#: core/validators.py:423
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Este valor debe ser una potencia de %s."
+
+#: core/validators.py:433
+msgid "Please enter a valid decimal number."
+msgstr "Por favor, introduzca un número decimal válido."
+
+#: core/validators.py:440
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural "Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Por favor, introduzca un número decimal válido con a lo más %s dígito en total."
+msgstr[1] "Por favor, introduzca un número decimal válido con a lo más %s dígitos en total."
+
+#: core/validators.py:443
+#, python-format
+msgid "Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural "Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] "Por favor, introduzca un número decimal válido con a lo más %s dígito en su parte entera."
+msgstr[1] "Por favor, introduzca un número decimal válido con a lo más %s dígitos en su parte entera."
+
+#: core/validators.py:446
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural "Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "Por favor, introduzca un número decimal válido con a lo más %s dígito decimal."
+msgstr[1] "Por favor, introduzca un número decimal válido con a lo más %s dígitos decimales."
+
+#: core/validators.py:454
+msgid "Please enter a valid floating point number."
+msgstr "Por favor, introduzca un número de coma flotante válido."
+
+#: core/validators.py:463
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Asegúrese de que el fichero que envía tiene al menos %s bytes."
+
+#: core/validators.py:464
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Asegúrese de que el fichero que envía tiene como máximo %s bytes."
+
+#: core/validators.py:481
+msgid "The format for this field is wrong."
+msgstr "El formato de este campo es incorrecto."
+
+#: core/validators.py:496
+msgid "This field is invalid."
+msgstr "Este campo no es válido."
+
+#: core/validators.py:532
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "No se pudo obtener nada de %s."
+
+#: core/validators.py:535
+#, python-format
+msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "La URL %(url)s devolvió la cabecera Content-Type '%(contenttype)s', que no es válida."
+
+#: core/validators.py:568
+#, python-format
+msgid "Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with \"%(start)s\".)"
+msgstr "Por favor, cierre la etiqueta %(tag)s de la línea %(line)s. (La línea empieza por \"%(start)s\".)"
+
+#: core/validators.py:572
+#, python-format
+msgid "Some text starting on line %(line)s is not allowed in that context. (Line starts with \"%(start)s\".)"
+msgstr "Parte del texto que comienza en la línea %(line)s no está permitido en ese contexto. (La línea empieza por \"%(start)s\".)"
+
+#: core/validators.py:577
+#, python-format
+msgid "\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%(start)s\".)"
+msgstr "El \"%(attr)s\" de la línea %(line)s no es un atributo válido. (La línea empieza por \"%(start)s\".)"
+
+#: core/validators.py:582
+#, python-format
+msgid "\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%(start)s\".)"
+msgstr "La \"<%(tag)s>\" de la línea %(line)s no es una etiqueta válida. (La línea empieza por \"%(start)s\".)"
+
+#: core/validators.py:586
+#, python-format
+msgid "A tag on line %(line)s is missing one or more required attributes. (Line starts with \"%(start)s\".)"
+msgstr "A una etiqueta de la línea %(line)s le faltan uno o más atributos requeridos. (La línea empieza por \"%(start)s\".)"
+
+#: core/validators.py:591
+#, python-format
+msgid "The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line starts with \"%(start)s\".)"
+msgstr "El atributo \"%(attr)s\" de la línea %(line)s tiene un valor que no es válido. (La línea empieza por \"%(start)s\".)"
+
+#: db/models/manipulators.py:304
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(object)s de este %(type)s ya existen en este %(field)s."
+
+#: db/models/fields/__init__.py:47
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "Ya existe %(optname)s con este %(fieldname)s."
+
+#: db/models/fields/__init__.py:175
+#: db/models/fields/__init__.py:343
+#: db/models/fields/__init__.py:795
+#: db/models/fields/__init__.py:806
+#: forms/fields.py:51
+#: oldforms/__init__.py:374
+msgid "This field is required."
+msgstr "Este campo es obligatorio."
+
+#: db/models/fields/__init__.py:450
+msgid "This value must be an integer."
+msgstr "Este valor debe ser un entero."
+
+#: db/models/fields/__init__.py:491
+msgid "This value must be either True or False."
+msgstr "Este valor debe ser Verdadero o Falso."
+
+#: db/models/fields/__init__.py:515
+msgid "This field cannot be null."
+msgstr "Este campo no puede estar vacío."
+
+#: db/models/fields/__init__.py:702
+msgid "This value must be a decimal number."
+msgstr "Este valor debe ser un entero."
+
+#: db/models/fields/__init__.py:815
+msgid "Enter a valid filename."
+msgstr "Introduzca un nombre de fichero válido"
+
+#: db/models/fields/__init__.py:1006
+msgid "This value must be either None, True or False."
+msgstr "Este valor debe ser Verdadero, Falso o Ninguno."
+
+#: db/models/fields/related.py:93
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Por favor, introduzca un %s válido."
+
+#: db/models/fields/related.py:729
+msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "Mantenga presionado \"Control\", o \"Command\" en un Mac, para seleccionar más de una opción."
+
+#: db/models/fields/related.py:773
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural "Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "Por favor, introduzca IDs de %(self)s válidos. El valor %(value)r no es válido."
+msgstr[1] "Por favor, introduzca IDs de %(self)s válidos. Los valores %(value)r no son válidos."
+
+#: forms/fields.py:52
+msgid "Enter a valid value."
+msgstr "Introduzca un valor correcto."
+
+#: forms/fields.py:129
+#, python-format
+msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+msgstr "Asegúrese de que su texto tiene a lo más %(max)d caracteres (actualmente tiene %(length)d)."
+
+#: forms/fields.py:130
+#, python-format
+msgid "Ensure this value has at least %(min)d characters (it has %(length)d)."
+msgstr "Asegúrese de que su texto tiene al menos %(min)d caracteres (actualmente tiene %(length)d)."
+
+#: forms/fields.py:158
+#: forms/fields.py:187
+#: forms/fields.py:216
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Asegúrese de que este valor es menor o igual a %s."
+
+#: forms/fields.py:159
+#: forms/fields.py:188
+#: forms/fields.py:217
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Asegúrese de que este valor es mayor o igual a %s."
+
+#: forms/fields.py:186
+#: forms/fields.py:215
+msgid "Enter a number."
+msgstr "Introduzca un número."
+
+#: forms/fields.py:218
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr "Asegúrese de que no hay más de %s dígitos en total."
+
+#: forms/fields.py:219
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr "Asegúrese de que no hay más de %s decimales."
+
+#: forms/fields.py:220
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr "Asegúrese de que no hay más de %s dígitos antes de la coma decimal."
+
+#: forms/fields.py:268
+#: forms/fields.py:795
+msgid "Enter a valid date."
+msgstr "Introduzca una fecha válida."
+
+#: forms/fields.py:301
+#: forms/fields.py:796
+msgid "Enter a valid time."
+msgstr "Introduzca una hora válida."
+
+#: forms/fields.py:340
+msgid "Enter a valid date/time."
+msgstr "Introduzca una fecha/hora válida."
+
+#: forms/fields.py:427
+msgid "No file was submitted."
+msgstr "No se ha enviado ningún fichero"
+
+#: forms/fields.py:428
+#: oldforms/__init__.py:693
+msgid "The submitted file is empty."
+msgstr "El fichero enviado está vacío."
+
+#: forms/fields.py:527
+msgid "Enter a valid URL."
+msgstr "Introduzca una URL válida."
+
+#: forms/fields.py:528
+msgid "This URL appears to be a broken link."
+msgstr "La URL parece ser un enlace roto."
+
+#: forms/fields.py:593
+#: forms/fields.py:644
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "Escoja una opción válida. %(value)s no es una de las opciones disponibles."
+
+#: forms/fields.py:645
+#: forms/fields.py:706
+#: forms/models.py:581
+msgid "Enter a list of values."
+msgstr "Introduzca una lista de valores."
+
+#: forms/fields.py:824
+msgid "Enter a valid IPv4 address."
+msgstr "Introduzca una dirección IPv4 válida."
+
+#: forms/models.py:514
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Escoja una opción válida. Esa opción no está entre las disponibles."
+
+#: forms/models.py:582
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Escoja una opción válida; '%s' no es una de las opciones disponibles."
+
+#: oldforms/__init__.py:409
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Asegúrese de que su texto tiene menos de %s carácter."
+msgstr[1] "Asegúrese de que su texto tiene menos de %s caracteres."
+
+#: oldforms/__init__.py:414
+msgid "Line breaks are not allowed here."
+msgstr "No se permiten saltos de línea."
+
+#: oldforms/__init__.py:512
+#: oldforms/__init__.py:586
+#: oldforms/__init__.py:625
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Escoja una opción válida; '%(data)s' no está en %(choices)s."
+
+#: oldforms/__init__.py:754
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Introduzca un número entero entre -32.768 y 32.767."
+
+#: oldforms/__init__.py:764
+msgid "Enter a positive number."
+msgstr "Introduzca un número positivo."
+
+#: oldforms/__init__.py:774
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Introduzca un número entero entre 0 y 32.767."
+
+#: template/defaultfilters.py:698
+msgid "yes,no,maybe"
+msgstr "sí,no,tal vez"
+
+#: template/defaultfilters.py:729
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d byte"
+msgstr[1] "%(size)d bytes"
+
+#: template/defaultfilters.py:731
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f KB"
+
+#: template/defaultfilters.py:733
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: template/defaultfilters.py:734
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#: utils/dateformat.py:41
+msgid "p.m."
+msgstr "p.m."
+
+#: utils/dateformat.py:42
+msgid "a.m."
+msgstr "a.m."
+
+#: utils/dateformat.py:47
+msgid "PM"
+msgstr "PM"
+
+#: utils/dateformat.py:48
+msgid "AM"
+msgstr "AM"
+
+#: utils/dateformat.py:97
+msgid "midnight"
+msgstr "media noche"
+
+#: utils/dateformat.py:99
+msgid "noon"
+msgstr "medio día"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "lunes"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "martes"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "miércoles"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "jueves"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "viernes"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "sábado"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "domingo"
+
+#: utils/dates.py:10
+msgid "Mon"
+msgstr "lun"
+
+#: utils/dates.py:10
+msgid "Tue"
+msgstr "mar"
+
+#: utils/dates.py:10
+msgid "Wed"
+msgstr "mié"
+
+#: utils/dates.py:10
+msgid "Thu"
+msgstr "jue"
+
+#: utils/dates.py:10
+msgid "Fri"
+msgstr "vie"
+
+#: utils/dates.py:11
+msgid "Sat"
+msgstr "sáb"
+
+#: utils/dates.py:11
+msgid "Sun"
+msgstr "dom"
+
+#: utils/dates.py:18
+msgid "January"
+msgstr "enero"
+
+#: utils/dates.py:18
+msgid "February"
+msgstr "febrero"
+
+#: utils/dates.py:18
+#: utils/dates.py:31
+msgid "March"
+msgstr "marzo"
+
+#: utils/dates.py:18
+#: utils/dates.py:31
+msgid "April"
+msgstr "abril"
+
+#: utils/dates.py:18
+#: utils/dates.py:31
+msgid "May"
+msgstr "mayo"
+
+#: utils/dates.py:18
+#: utils/dates.py:31
+msgid "June"
+msgstr "junio"
+
+#: utils/dates.py:19
+#: utils/dates.py:31
+msgid "July"
+msgstr "julio"
+
+#: utils/dates.py:19
+msgid "August"
+msgstr "agosto"
+
+#: utils/dates.py:19
+msgid "September"
+msgstr "septiembre"
+
+#: utils/dates.py:19
+msgid "October"
+msgstr "octubre"
+
+#: utils/dates.py:19
+msgid "November"
+msgstr "noviembre"
+
+#: utils/dates.py:20
+msgid "December"
+msgstr "diciembre"
+
+#: utils/dates.py:23
+msgid "jan"
+msgstr "ene"
+
+#: utils/dates.py:23
+msgid "feb"
+msgstr "feb"
+
+#: utils/dates.py:23
+msgid "mar"
+msgstr "mar"
+
+#: utils/dates.py:23
+msgid "apr"
+msgstr "abr"
+
+#: utils/dates.py:23
+msgid "may"
+msgstr "may"
+
+#: utils/dates.py:23
+msgid "jun"
+msgstr "jun"
+
+#: utils/dates.py:24
+msgid "jul"
+msgstr "jul"
+
+#: utils/dates.py:24
+msgid "aug"
+msgstr "ago"
+
+#: utils/dates.py:24
+msgid "sep"
+msgstr "sep"
+
+#: utils/dates.py:24
+msgid "oct"
+msgstr "oct"
+
+#: utils/dates.py:24
+msgid "nov"
+msgstr "nov"
+
+#: utils/dates.py:24
+msgid "dec"
+msgstr "dic"
+
+#: utils/dates.py:31
+msgid "Jan."
+msgstr "ene."
+
+#: utils/dates.py:31
+msgid "Feb."
+msgstr "feb."
+
+#: utils/dates.py:32
+msgid "Aug."
+msgstr "ago."
+
+#: utils/dates.py:32
+msgid "Sept."
+msgstr "sept."
+
+#: utils/dates.py:32
+msgid "Oct."
+msgstr "oct."
+
+#: utils/dates.py:32
+msgid "Nov."
+msgstr "nov."
+
+#: utils/dates.py:32
+msgid "Dec."
+msgstr "dic."
+
+#: utils/text.py:128
+msgid "or"
+msgstr "o"
+
+#: utils/timesince.py:21
+msgid "year"
+msgid_plural "years"
+msgstr[0] "año"
+msgstr[1] "años"
+
+#: utils/timesince.py:22
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mes"
+msgstr[1] "meses"
+
+#: utils/timesince.py:23
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "semana"
+msgstr[1] "semanas"
+
+#: utils/timesince.py:24
+msgid "day"
+msgid_plural "days"
+msgstr[0] "día"
+msgstr[1] "días"
+
+#: utils/timesince.py:25
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "hora"
+msgstr[1] "horas"
+
+#: utils/timesince.py:26
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuto"
+msgstr[1] "minutos"
+
+#: utils/timesince.py:46
+msgid "minutes"
+msgstr "minutos"
+
+#: utils/timesince.py:51
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr "%(number)d %(type)s"
+
+#: utils/timesince.py:57
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ", %(number)d %(type)s"
+
+#: utils/translation/trans_real.py:401
+msgid "DATE_FORMAT"
+msgstr "j N Y"
+
+#: utils/translation/trans_real.py:402
+msgid "DATETIME_FORMAT"
+msgstr "j N Y P"
+
+#: utils/translation/trans_real.py:403
+msgid "TIME_FORMAT"
+msgstr "P"
+
+#: utils/translation/trans_real.py:419
+msgid "YEAR_MONTH_FORMAT"
+msgstr "F Y"
+
+#: utils/translation/trans_real.py:420
+msgid "MONTH_DAY_FORMAT"
+msgstr "j \\de F"
+
+#: views/generic/create_update.py:129
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "El/La %(verbose_name)s se ha creado exitosamente."
+
+#: views/generic/create_update.py:172
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "Se actualizó con éxito el %(verbose_name)s."
+
+#: views/generic/create_update.py:214
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "El/La %(verbose_name)s ha sido borrado."
+
+#~ msgid "Ordering"
+#~ msgstr "Ordenación"
+#~ msgid "Order:"
+#~ msgstr "Orden:"
+#~ msgid "Added %s."
+#~ msgstr "Añadido %s."
+#~ msgid "Deleted %s."
+#~ msgstr "Borrado %s."
+#~ msgid "The two 'new password' fields didn't match."
+#~ msgstr "Los dos campos 'nueva contraseña' no coinciden."
+#~ msgid "Year must be 1900 or later."
+#~ msgstr "El año debe ser 1900 o posterior."
+#~ msgid "Separate multiple IDs with commas."
+#~ msgstr "Separe múltiples IDs con comas."
+
diff --git a/webapp/django/conf/locale/es/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/es/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..b42ebb3
--- /dev/null
+++ b/webapp/django/conf/locale/es/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/es/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/es/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..4ad90fa
--- /dev/null
+++ b/webapp/django/conf/locale/es/LC_MESSAGES/djangojs.po
@@ -0,0 +1,117 @@
+# Spanish translation for the django-admin JS files.
+# Copyright (C) 2008, The Django Project
+# This file is distributed under the same license as the django package.
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-10-04 00:00+0200\n"
+"PO-Revision-Date: 2008-03-30 00:54+0100\n"
+"Last-Translator: Django Spanish Group <django-i18n@googlegroups.com>\n"
+"Language-Team: Spanish <django-i18n@googlegroups.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/calendar.js:24
+#: contrib/admin/media/js/dateparse.js:32
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Enero Febrero Marzo Abril Mayo Junio Julio Agosto Septiembre Octubre "
+"Noviembre Diciembre"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "D L M M J V S"
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Domingo Lunes Martes Miércoles Jueves Viernes Sábado"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "%s Disponibles"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Selecciona todos"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Agregar"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Remover"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "%s Elegidos"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Haz tus elecciones y da click en "
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Elimina todos"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Now"
+msgstr "Ahora"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
+msgid "Clock"
+msgstr "Reloj"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
+msgid "Choose a time"
+msgstr "Elige una hora"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "Midnight"
+msgstr "Medianoche"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "6 a.m."
+msgstr "6 a.m."
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
+msgid "Noon"
+msgstr "Mediodía"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
+msgid "Today"
+msgstr "Hoy"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
+msgid "Calendar"
+msgstr "Calendario"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
+msgid "Yesterday"
+msgstr "Ayer"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
+msgid "Tomorrow"
+msgstr "Mañana"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr "Mostrar"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr "Esconder"
diff --git a/webapp/django/conf/locale/es_AR/LC_MESSAGES/django.mo b/webapp/django/conf/locale/es_AR/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..5d9eca6
--- /dev/null
+++ b/webapp/django/conf/locale/es_AR/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/es_AR/LC_MESSAGES/django.po b/webapp/django/conf/locale/es_AR/LC_MESSAGES/django.po
new file mode 100644
index 0000000..170e6aa
--- /dev/null
+++ b/webapp/django/conf/locale/es_AR/LC_MESSAGES/django.po
@@ -0,0 +1,4653 @@
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-08-15 18:34-0300\n"
+"PO-Revision-Date: 2008-08-16 14:18-0300\n"
+"Last-Translator: Ramiro Morales <rm0@gmx.net>\n"
+"Language-Team: Django-I18N <django-i18n@googlegroups.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms:  nplurals=2; plural=(n != 1);\n"
+
+#: conf/global_settings.py:44
+msgid "Arabic"
+msgstr "árabe"
+
+#: conf/global_settings.py:45
+msgid "Bengali"
+msgstr "bengalí"
+
+#: conf/global_settings.py:46
+msgid "Bulgarian"
+msgstr "búlgaro"
+
+#: conf/global_settings.py:47
+msgid "Catalan"
+msgstr "catalán"
+
+#: conf/global_settings.py:48
+msgid "Czech"
+msgstr "checo"
+
+#: conf/global_settings.py:49
+msgid "Welsh"
+msgstr "galés"
+
+#: conf/global_settings.py:50
+msgid "Danish"
+msgstr "danés"
+
+#: conf/global_settings.py:51
+msgid "German"
+msgstr "alemán"
+
+#: conf/global_settings.py:52
+msgid "Greek"
+msgstr "griego"
+
+#: conf/global_settings.py:53
+msgid "English"
+msgstr "inglés"
+
+#: conf/global_settings.py:54
+msgid "Spanish"
+msgstr "español"
+
+#: conf/global_settings.py:55
+msgid "Estonian"
+msgstr "estonio"
+
+#: conf/global_settings.py:56
+msgid "Argentinean Spanish"
+msgstr "español de Argentina"
+
+#: conf/global_settings.py:57
+msgid "Basque"
+msgstr "vasco"
+
+#: conf/global_settings.py:58
+msgid "Persian"
+msgstr "persa"
+
+#: conf/global_settings.py:59
+msgid "Finnish"
+msgstr "finlandés"
+
+#: conf/global_settings.py:60
+msgid "French"
+msgstr "francés"
+
+#: conf/global_settings.py:61
+msgid "Irish"
+msgstr "irlandés"
+
+#: conf/global_settings.py:62
+msgid "Galician"
+msgstr "gallego"
+
+#: conf/global_settings.py:63
+msgid "Hungarian"
+msgstr "húngaro"
+
+#: conf/global_settings.py:64
+msgid "Hebrew"
+msgstr "hebreo"
+
+#: conf/global_settings.py:65
+msgid "Croatian"
+msgstr "croata"
+
+#: conf/global_settings.py:66
+msgid "Icelandic"
+msgstr "islandés"
+
+#: conf/global_settings.py:67
+msgid "Italian"
+msgstr "italiano"
+
+#: conf/global_settings.py:68
+msgid "Japanese"
+msgstr "japonés"
+
+#: conf/global_settings.py:69
+msgid "Georgian"
+msgstr "georgiano"
+
+#: conf/global_settings.py:70
+msgid "Korean"
+msgstr "koreano"
+
+#: conf/global_settings.py:71
+msgid "Khmer"
+msgstr "jémer"
+
+#: conf/global_settings.py:72
+msgid "Kannada"
+msgstr "canarés"
+
+#: conf/global_settings.py:73
+msgid "Latvian"
+msgstr "letón"
+
+#: conf/global_settings.py:74
+msgid "Lithuanian"
+msgstr "lituano"
+
+#: conf/global_settings.py:75
+msgid "Macedonian"
+msgstr "macedonio"
+
+#: conf/global_settings.py:76
+msgid "Dutch"
+msgstr "holandés"
+
+#: conf/global_settings.py:77
+msgid "Norwegian"
+msgstr "noruego"
+
+#: conf/global_settings.py:78
+msgid "Polish"
+msgstr "polaco"
+
+#: conf/global_settings.py:79
+msgid "Portugese"
+msgstr "portugués"
+
+#: conf/global_settings.py:80
+msgid "Brazilian Portuguese"
+msgstr "portugués de Brasil"
+
+#: conf/global_settings.py:81
+msgid "Romanian"
+msgstr "rumano"
+
+#: conf/global_settings.py:82
+msgid "Russian"
+msgstr "ruso"
+
+#: conf/global_settings.py:83
+msgid "Slovak"
+msgstr "eslovaco"
+
+#: conf/global_settings.py:84
+msgid "Slovenian"
+msgstr "esloveno"
+
+#: conf/global_settings.py:85
+msgid "Serbian"
+msgstr "serbio"
+
+#: conf/global_settings.py:86
+msgid "Swedish"
+msgstr "sueco"
+
+#: conf/global_settings.py:87
+msgid "Tamil"
+msgstr "tamil"
+
+#: conf/global_settings.py:88
+msgid "Telugu"
+msgstr "telugu"
+
+#: conf/global_settings.py:89
+msgid "Turkish"
+msgstr "turco"
+
+#: conf/global_settings.py:90
+msgid "Ukrainian"
+msgstr "ucraniano"
+
+#: conf/global_settings.py:91
+msgid "Simplified Chinese"
+msgstr "chino simplificado"
+
+#: conf/global_settings.py:92
+msgid "Traditional Chinese"
+msgstr "chino tradicional"
+
+#: contrib/admin/filterspecs.py:44
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Por %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:74 contrib/admin/filterspecs.py:92
+#: contrib/admin/filterspecs.py:147 contrib/admin/filterspecs.py:173
+msgid "All"
+msgstr "Todos/as"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Any date"
+msgstr "Cualquier fecha"
+
+#: contrib/admin/filterspecs.py:114
+msgid "Today"
+msgstr "Hoy"
+
+#: contrib/admin/filterspecs.py:117
+msgid "Past 7 days"
+msgstr "Últimos 7 días"
+
+#: contrib/admin/filterspecs.py:119
+msgid "This month"
+msgstr "Este mes"
+
+#: contrib/admin/filterspecs.py:121
+msgid "This year"
+msgstr "Este año"
+
+#: contrib/admin/filterspecs.py:147 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "Yes"
+msgstr "Sí"
+
+#: contrib/admin/filterspecs.py:147 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "No"
+msgstr "No"
+
+#: contrib/admin/filterspecs.py:154 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "Unknown"
+msgstr "Desconocido"
+
+#: contrib/admin/models.py:19
+msgid "action time"
+msgstr "hora de la acción"
+
+#: contrib/admin/models.py:22
+msgid "object id"
+msgstr "id de objeto"
+
+#: contrib/admin/models.py:23
+msgid "object repr"
+msgstr "repr de objeto"
+
+#: contrib/admin/models.py:24
+msgid "action flag"
+msgstr "marca de acción"
+
+#: contrib/admin/models.py:25
+msgid "change message"
+msgstr "mensaje de cambio"
+
+#: contrib/admin/models.py:28
+msgid "log entry"
+msgstr "entrada de registro"
+
+#: contrib/admin/models.py:29
+msgid "log entries"
+msgstr "entradas de registro"
+
+#: contrib/admin/options.py:143 contrib/admin/options.py:202
+msgid "None"
+msgstr "Ninguno"
+
+#: contrib/admin/options.py:407
+#, python-format
+msgid "Changed %s."
+msgstr "Modifica %s."
+
+#: contrib/admin/options.py:407 contrib/admin/options.py:417
+#: core/validators.py:279 db/models/manipulators.py:305
+msgid "and"
+msgstr "y"
+
+#: contrib/admin/options.py:412
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Se agregó %(name)s \"%(object)s\"."
+
+#: contrib/admin/options.py:416
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Se modificaron %(list)s en %(name)s \"%(object)s\"."
+
+#: contrib/admin/options.py:421
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Se eliminó %(name)s \"%(object)s\"."
+
+#: contrib/admin/options.py:425
+msgid "No fields changed."
+msgstr "No ha modificado ningún campo."
+
+#: contrib/admin/options.py:486 contrib/auth/admin.py:50
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Se agregó con éxito %(name)s \"%(obj)s\"."
+
+#: contrib/admin/options.py:490 contrib/admin/options.py:523
+#: contrib/auth/admin.py:55
+msgid "You may edit it again below."
+msgstr "Puede modificarlo nuevamente abajo."
+
+#: contrib/admin/options.py:500 contrib/admin/options.py:533
+#, python-format
+msgid "You may add another %s below."
+msgstr "Puede agregar otro %s abajo."
+
+#: contrib/admin/options.py:521
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Se modificó con éxito %(name)s \"%(obj)s\"."
+
+#: contrib/admin/options.py:529
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"Se agregó con éxito %(name)s \"%(obj)s\". Puede modificarlo nuevamente abajo."
+
+#: contrib/admin/options.py:595
+#, python-format
+msgid "Add %s"
+msgstr "Agregar %s"
+
+#: contrib/admin/options.py:672
+#, python-format
+msgid "Change %s"
+msgstr "Modificar %s"
+
+#: contrib/admin/options.py:703
+msgid "Database error"
+msgstr "Error de base de datos"
+
+#: contrib/admin/options.py:752
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Se eliminó con éxito %(name)s \"%(obj)s\"."
+
+#: contrib/admin/options.py:759
+msgid "Are you sure?"
+msgstr "¿Está seguro?"
+
+#: contrib/admin/options.py:786
+#, python-format
+msgid "Change history: %s"
+msgstr "Historia de modificaciones: %s"
+
+#: contrib/admin/sites.py:18 contrib/admin/views/decorators.py:16
+#: contrib/auth/forms.py:72 contrib/comments/views/comments.py:56
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Por favor introduzca un nombre de usuario y una contraseña correctos. Note "
+"que ambos campos son sensibles a mayúsculas/minúsculas."
+
+#: contrib/admin/sites.py:238 contrib/admin/views/decorators.py:68
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Por favor, identifíquese de nuevo porque su sesión ha caducado. No se "
+"preocupe: se ha guardado su envío."
+
+#: contrib/admin/sites.py:245 contrib/admin/views/decorators.py:75
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Parece que su navegador no está configurado para aceptar cookies. Por favor "
+"actívelas, recargue esta página, e inténtelo de nuevo."
+
+#: contrib/admin/sites.py:259 contrib/admin/sites.py:265
+#: contrib/admin/views/decorators.py:92
+msgid "Usernames cannot contain the '@' character."
+msgstr "Los nombres de usuario no pueden contener el carácter '@'."
+
+#: contrib/admin/sites.py:262 contrib/admin/views/decorators.py:88
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr ""
+"Su dirección de correo electrónico no es su nombre de usuario. Intente "
+"nuevamente usando '%s'."
+
+#: contrib/admin/sites.py:330
+msgid "Site administration"
+msgstr "Administración de sitio"
+
+#: contrib/admin/sites.py:352 contrib/admin/templates/admin/login.html:27
+#: contrib/admin/templates/registration/password_reset_complete.html:14
+#: contrib/admin/views/decorators.py:30
+msgid "Log in"
+msgstr "Identificarse"
+
+#: contrib/admin/util.py:126
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Uno o más %(fieldname)s en %(name)s: %(obj)s"
+
+#: contrib/admin/util.py:131
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Uno o más %(fieldname)s en %(name)s:"
+
+#: contrib/admin/widgets.py:65
+msgid "Date:"
+msgstr "Fecha:"
+
+#: contrib/admin/widgets.py:65
+msgid "Time:"
+msgstr "Hora:"
+
+#: contrib/admin/widgets.py:89
+msgid "Currently:"
+msgstr "Actualmente"
+
+#: contrib/admin/widgets.py:89
+msgid "Change:"
+msgstr "Modificar:"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Página no encontrada"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Lo sentimos, pero no se encuentra la página solicitada."
+
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/change_form.html:17
+#: contrib/admin/templates/admin/change_list.html:8
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/auth/user/change_password.html:10
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_reset_complete.html:4
+#: contrib/admin/templates/registration/password_reset_confirm.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Inicio"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Error del servidor"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Error del servidor (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Error de servidor <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Ha ocurrido un error. Se ha informado a los administradores del sitio "
+"mediante correo electrónico y debería ser solucionado en breve. Gracias por "
+"su paciencia."
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "Bienvenido,"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Documentación"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:13
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+msgid "Change password"
+msgstr "Cambiar contraseña"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/comments/templates/comments/form.html:6
+msgid "Log out"
+msgstr "Cerrar sesión"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Sitio de administración de Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Administración de Django"
+
+#: contrib/admin/templates/admin/change_form.html:19
+#: contrib/admin/templates/admin/index.html:29
+msgid "Add"
+msgstr "Agregar"
+
+#: contrib/admin/templates/admin/change_form.html:26
+#: contrib/admin/templates/admin/object_history.html:5
+msgid "History"
+msgstr "Historia"
+
+#: contrib/admin/templates/admin/change_form.html:27
+msgid "View on site"
+msgstr "Ver en el sitio"
+
+#: contrib/admin/templates/admin/change_form.html:37
+#: contrib/admin/templates/admin/auth/user/change_password.html:22
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Por favor, corrija el siguiente error."
+msgstr[1] "Por favor, corrija los siguientes errores."
+
+#: contrib/admin/templates/admin/change_list.html:16
+#, python-format
+msgid "Add %(name)s"
+msgstr "Agregar %(name)s"
+
+#: contrib/admin/templates/admin/change_list.html:26
+msgid "Filter"
+msgstr "Filtrar"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+#: contrib/admin/templates/admin/edit_inline/tabular.html:15
+msgid "Delete"
+msgstr "Eliminar"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:15
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Eliminar el %(object_name)s '%(escaped_object)s' provocaría la eliminación "
+"de objetos relacionados, pero su cuenta no tiene permiso para eliminar los "
+"siguientes tipos de objetos:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:22
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"¿Está seguro de que quiere eliminar los %(object_name)s \"%(escaped_object)s"
+"\"? Se eliminarán los siguientes objetos relacionados:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:27
+msgid "Yes, I'm sure"
+msgstr "Sí, estoy seguro"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Por %(filter_title)s "
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Modelos disponibles en la aplicación %(name)s."
+
+#: contrib/admin/templates/admin/index.html:19
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:35
+msgid "Change"
+msgstr "Modificar"
+
+#: contrib/admin/templates/admin/index.html:45
+msgid "You don't have permission to edit anything."
+msgstr "No tiene permiso para editar nada."
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "Recent Actions"
+msgstr "Acciones recientes"
+
+#: contrib/admin/templates/admin/index.html:54
+msgid "My Actions"
+msgstr "Mis acciones"
+
+#: contrib/admin/templates/admin/index.html:58
+msgid "None available"
+msgstr "Ninguna disponible"
+
+#: contrib/admin/templates/admin/invalid_setup.html:7
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Hay algún problema con su instalación de base de datos. Asegúrese de que las "
+"tablas de la misma hayan sido creadas, y asegúrese de que el usuario "
+"apropiado tenga permisos de lectura en la base de datos."
+
+#: contrib/admin/templates/admin/login.html:19
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+msgid "Username:"
+msgstr "Usuario:"
+
+#: contrib/admin/templates/admin/login.html:22
+#: contrib/comments/templates/comments/form.html:8
+msgid "Password:"
+msgstr "Contraseña:"
+
+#: contrib/admin/templates/admin/object_history.html:16
+msgid "Date/time"
+msgstr "Fecha/hora"
+
+#: contrib/admin/templates/admin/object_history.html:17
+msgid "User"
+msgstr "Usuario"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Action"
+msgstr "Acción"
+
+#: contrib/admin/templates/admin/object_history.html:24
+msgid "DATE_WITH_TIME_FULL"
+msgstr "j M Y P"
+
+#: contrib/admin/templates/admin/object_history.html:32
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Este objeto no tiene historia de modificaciones. Probablemente no fué "
+"añadido usando este sitio de administración."
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Mostrar todos/as"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Buscar"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "un resultado"
+msgstr[1] "%(counter)s resultados"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "total: %(full_result_count)s"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Grabar como nuevo"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Grabar y añadir otro"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Grabar y continuar editando"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Grabar"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Primero, introduzca un nombre de usuario y una contraseña. Luego podrá "
+"configurar opciones adicionales."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:13
+#: contrib/auth/forms.py:14 contrib/auth/forms.py:51
+msgid "Username"
+msgstr "Nombre de usuario:"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:20
+#: contrib/admin/templates/admin/auth/user/change_password.html:33
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:52 contrib/auth/forms.py:176
+msgid "Password"
+msgstr "Contraseña:"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:26
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+#: contrib/auth/forms.py:177
+msgid "Password (again)"
+msgstr "Contraseña (de nuevo)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:27
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+msgid "Enter the same password as above, for verification."
+msgstr ""
+"Para verificación, introduzca la misma contraseña que introdujo arriba."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:26
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+"Introduzca una nueva contraseña para el usuario <strong>%(username)s</"
+"strong>."
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Gracias por el tiempo que ha dedicado al sitio web hoy."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Identificarse de nuevo"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Cambio de contraseña"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Cambio de contraseña exitoso"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Su contraseña ha sido cambiada."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Por favor, por razones de seguridad, introduzca su contraseña antigua, y "
+"luego introduzca la nueva contraseña dos veces para verificar que la ha "
+"escrito correctamente."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Contraseña antigua:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+#: contrib/admin/templates/registration/password_reset_confirm.html:18
+msgid "New password:"
+msgstr "Contraseña nueva:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+#: contrib/admin/templates/registration/password_reset_confirm.html:20
+msgid "Confirm password:"
+msgstr "Confirme contraseña:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+#: contrib/admin/templates/registration/password_reset_confirm.html:21
+msgid "Change my password"
+msgstr "Cambiar mi contraseña"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:4
+#: contrib/admin/templates/registration/password_reset_confirm.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+msgid "Password reset"
+msgstr "Recuperar contraseña"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:6
+#: contrib/admin/templates/registration/password_reset_complete.html:10
+msgid "Password reset complete"
+msgstr "Reinicialización de contraseña completada"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:12
+msgid "Your password has been set.  You may go ahead and log in now."
+msgstr "Se le ha enviado su contraseña.  Ahora puede continuar e ingresar."
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:4
+msgid "Password reset confirmation"
+msgstr "Confirmación de reincialización de contraseña"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:12
+msgid "Enter new password"
+msgstr "Introduzca la nueva contraseña"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:14
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Por favor introduzca su nueva contraseña dos veces de manera que podamos "
+"verificar que la ha escrito correctamente."
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:26
+msgid "Password reset unsuccessful"
+msgstr "Reinicialización de contraseña exitosa"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:28
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used.  Please request a new password reset."
+msgstr ""
+"El enlace de reinicialización de contraseña es inválido, posiblemente debido "
+"a que ya ha sido usado.  Por favor solicite una nueva reinicialización "
+"de contraseña."
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Recuperación de contraseña exitosa"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed you instructions for setting your password to the e-mail "
+"address you submitted. You should be receiving it shortly."
+msgstr ""
+"Le hemos enviado instrucciones sobre como establecer su contraseña a la "
+"dirección de correo electrónico que ha suministrado. Debería recibir las "
+"mismas en breve."
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr ""
+"Está recibiendo este mensaje debido a que solicitó recuperar la contraseña"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "de su cuenta de usuario en %(site_name)s."
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+msgid "Please go to the following page and choose a new password:"
+msgstr ""
+"Por favor visite la página que se muestra a continuación y elija una nueva "
+"contraseña:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:9
+msgid "Your username, in case you've forgotten:"
+msgstr "Su nombre de usuario, en caso de haberlo olvidado:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Thanks for using our site!"
+msgstr "¡Gracias por usar nuestro sitio!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "El equipo de %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll e-mail "
+"instructions for setting a new one."
+msgstr ""
+"¿Ha olvidado su contraseña?. Introduzca su dirección de correo electrónico "
+"mas abajo y le enviaremos instrucciones para establecer una nueva."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Dirección de correo electrónico:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Recuperar mi contraseña"
+
+#: contrib/admin/templatetags/admin_list.py:284
+msgid "All dates"
+msgstr "Todas las fechas"
+
+#: contrib/admin/views/main.py:65
+#, python-format
+msgid "Select %s"
+msgstr "Seleccione %s"
+
+#: contrib/admin/views/main.py:65
+#, python-format
+msgid "Select %s to change"
+msgstr "Seleccione %s a modificar"
+
+#: contrib/admin/views/template.py:36 contrib/sites/models.py:38
+msgid "site"
+msgstr "sitio"
+
+#: contrib/admin/views/template.py:38
+msgid "template"
+msgstr "plantilla"
+
+#: contrib/admindocs/views.py:53 contrib/admindocs/views.py:55
+#: contrib/admindocs/views.py:57
+msgid "tag:"
+msgstr "etiqueta:"
+
+#: contrib/admindocs/views.py:87 contrib/admindocs/views.py:89
+#: contrib/admindocs/views.py:91
+msgid "filter:"
+msgstr "filtrar:"
+
+#: contrib/admindocs/views.py:153 contrib/admindocs/views.py:155
+#: contrib/admindocs/views.py:157
+msgid "view:"
+msgstr "ver:"
+
+#: contrib/admindocs/views.py:187
+#, python-format
+msgid "App %r not found"
+msgstr "Aplicación %r no encontrada"
+
+#: contrib/admindocs/views.py:194
+#, python-format
+msgid "Model %(model_name)r not found in app %(app_label)r"
+msgstr "Modelo %(model_name)r no encontrado en aplicación %(app_label)r"
+
+#: contrib/admindocs/views.py:206
+#, python-format
+msgid "the related `%(app_label)s.%(data_type)s` object"
+msgstr "el objeto `%(app_label)s.%(data_type)s` relacionado"
+
+#: contrib/admindocs/views.py:206 contrib/admindocs/views.py:228
+#: contrib/admindocs/views.py:242 contrib/admindocs/views.py:247
+msgid "model:"
+msgstr "modelo:"
+
+#: contrib/admindocs/views.py:237
+#, python-format
+msgid "related `%(app_label)s.%(object_name)s` objects"
+msgstr "objetos `%(app_label)s.%(object_name)s` relacionados"
+
+#: contrib/admindocs/views.py:242
+#, python-format
+msgid "all %s"
+msgstr "todos los %s"
+
+#: contrib/admindocs/views.py:247
+#, python-format
+msgid "number of %s"
+msgstr "número de %s"
+
+#: contrib/admindocs/views.py:253
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Campos en objetos %s"
+
+#: contrib/admindocs/views.py:317 contrib/admindocs/views.py:328
+#: contrib/admindocs/views.py:330 contrib/admindocs/views.py:336
+#: contrib/admindocs/views.py:337 contrib/admindocs/views.py:339
+msgid "Integer"
+msgstr "Entero"
+
+#: contrib/admindocs/views.py:318
+msgid "Boolean (Either True or False)"
+msgstr "Booleano (Verdadero o Falso)"
+
+#: contrib/admindocs/views.py:319 contrib/admindocs/views.py:338
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Cadena (máximo %(max_length)s)"
+
+#: contrib/admindocs/views.py:320
+msgid "Comma-separated integers"
+msgstr "Enteros separados por comas"
+
+#: contrib/admindocs/views.py:321
+msgid "Date (without time)"
+msgstr "Fecha (sin hora)"
+
+#: contrib/admindocs/views.py:322
+msgid "Date (with time)"
+msgstr "Fecha (con hora)"
+
+#: contrib/admindocs/views.py:323
+msgid "Decimal number"
+msgstr "Número decimal"
+
+#: contrib/admindocs/views.py:324
+msgid "E-mail address"
+msgstr "Dirección de correo electrónico"
+
+#: contrib/admindocs/views.py:325 contrib/admindocs/views.py:326
+#: contrib/admindocs/views.py:329
+msgid "File path"
+msgstr "Ruta de archivo"
+
+#: contrib/admindocs/views.py:327
+msgid "Floating point number"
+msgstr "Número de punto flotante"
+
+#: contrib/admindocs/views.py:331 contrib/comments/models.py:89
+msgid "IP address"
+msgstr "Dirección IP"
+
+#: contrib/admindocs/views.py:333
+msgid "Boolean (Either True, False or None)"
+msgstr "Booleano (Verdadero, Falso o Nulo)"
+
+#: contrib/admindocs/views.py:334
+msgid "Relation to parent model"
+msgstr "Relación con el modelo padre"
+
+#: contrib/admindocs/views.py:335
+msgid "Phone number"
+msgstr "Número de teléfono"
+
+#: contrib/admindocs/views.py:340
+msgid "Text"
+msgstr "Texto"
+
+#: contrib/admindocs/views.py:341
+msgid "Time"
+msgstr "Hora"
+
+#: contrib/admindocs/views.py:342 contrib/flatpages/admin.py:8
+#: contrib/flatpages/models.py:8
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admindocs/views.py:343
+msgid "U.S. state (two uppercase letters)"
+msgstr "Estado de los EE.UU. (dos letras mayúsculas)"
+
+#: contrib/admindocs/views.py:344
+msgid "XML text"
+msgstr "Texto XML"
+
+#: contrib/admindocs/views.py:370
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s no parece ser un objeto urlpattern"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Bookmarklets"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:4
+msgid "Documentation bookmarklets"
+msgstr "Bookmarklets de documentación"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:8
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">Para instalar bookmarklets, arrastre el enlace a su barra\n"
+"de favoritos, o pulse con el botón derecho el enlace y añádalo a sus "
+"favoritos.\n"
+"Ahora puede seleccionar el bookmarklet desde cualquier página en el sitio.\n"
+"Tenga en cuenta que algunos de estos bookmarklets precisan que esté viendo\n"
+"el sitio desde un equipo señalado como \"interno\" (hable\n"
+"con su administrador de sistemas si no está seguro de si el suyo lo es).</"
+"p>\n"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:18
+msgid "Documentation for this page"
+msgstr "Documentación de esta página"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:19
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+"Le lleva desde cualquier página a la documentación de la vista que la genera."
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:21
+msgid "Show object ID"
+msgstr "Mostrar ID de objeto"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:22
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Muestra el tipo de contenido e ID unívoco de las páginas que representan un "
+"único objeto."
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:24
+msgid "Edit this object (current window)"
+msgstr "Editar este objeto (ventana actual)"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:25
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+"Le lleva a la página de administración de páginas que representan un único "
+"objeto."
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:27
+msgid "Edit this object (new window)"
+msgstr "Editar este objeto (nueva ventana)"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:28
+msgid "As above, but opens the admin page in a new window."
+msgstr "Ídem, pero abre la página de administración en una nueva ventana."
+
+#: contrib/auth/admin.py:21
+msgid "Personal info"
+msgstr "Información personal"
+
+#: contrib/auth/admin.py:22
+msgid "Permissions"
+msgstr "Permisos"
+
+#: contrib/auth/admin.py:23
+msgid "Important dates"
+msgstr "Fechas importantes"
+
+#: contrib/auth/admin.py:24
+msgid "Groups"
+msgstr "Grupos"
+
+#: contrib/auth/admin.py:60
+msgid "Add user"
+msgstr "Agregar usuario"
+
+#: contrib/auth/admin.py:85
+msgid "Password changed successfully."
+msgstr "Cambio de contraseña exitoso"
+
+#: contrib/auth/admin.py:91
+#, python-format
+msgid "Change password: %s"
+msgstr "Cambiar contraseña: %s"
+
+#: contrib/auth/forms.py:15 contrib/auth/models.py:137
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr ""
+"Obligatorio. Longitud máxima 30 caracteres alfanuméricos (letras, dígitos y "
+"guiones bajos)."
+
+#: contrib/auth/forms.py:16 core/validators.py:72
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Este valor debe contener sólo letras, números y guiones bajos."
+
+#: contrib/auth/forms.py:18
+msgid "Password confirmation"
+msgstr "Confirmación de contraseña"
+
+#: contrib/auth/forms.py:30
+msgid "A user with that username already exists."
+msgstr "Ya existe un usuario con ese nombre."
+
+#: contrib/auth/forms.py:36 contrib/auth/forms.py:146
+#: contrib/auth/forms.py:188
+msgid "The two password fields didn't match."
+msgstr "Los dos campos de contraseñas no coinciden entre si."
+
+#: contrib/auth/forms.py:74 contrib/comments/views/comments.py:58
+msgid "This account is inactive."
+msgstr "Esta cuenta está inactiva"
+
+#: contrib/auth/forms.py:79 contrib/comments/views/comments.py:49
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"Su navegador Web aparenta no estar configurado para aceptar cookies. Las "
+"cookies son un requerimiento para poder ingresar."
+
+#: contrib/auth/forms.py:92
+msgid "E-mail"
+msgstr "Correo electrónico"
+
+#: contrib/auth/forms.py:101
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr ""
+"Esa dirección de e-mail no está asociada a ninguna cuenta de usuario. ¿Está "
+"seguro de que ya se ha registrado?"
+
+#: contrib/auth/forms.py:126
+#, python-format
+msgid "Password reset on %s"
+msgstr "Reinicialización de contraseña en %s"
+
+#: contrib/auth/forms.py:134
+msgid "New password"
+msgstr "Contraseña nueva"
+
+#: contrib/auth/forms.py:135
+msgid "New password confirmation"
+msgstr "Confirmación de contraseña nueva"
+
+#: contrib/auth/forms.py:160
+msgid "Old password"
+msgstr "Contraseña antigua"
+
+#: contrib/auth/forms.py:168
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr ""
+"La antigua contraseña introducida es incorrecta. Por favor introdúzcala "
+"nuevamente."
+
+#: contrib/auth/models.py:73 contrib/auth/models.py:96
+msgid "name"
+msgstr "nombre"
+
+#: contrib/auth/models.py:75
+msgid "codename"
+msgstr "nombre en código"
+
+#: contrib/auth/models.py:78
+msgid "permission"
+msgstr "permiso"
+
+#: contrib/auth/models.py:79 contrib/auth/models.py:97
+msgid "permissions"
+msgstr "permisos"
+
+#: contrib/auth/models.py:100
+msgid "group"
+msgstr "grupo"
+
+#: contrib/auth/models.py:101 contrib/auth/models.py:147
+msgid "groups"
+msgstr "grupos"
+
+#: contrib/auth/models.py:137
+msgid "username"
+msgstr "nombre de usuario"
+
+#: contrib/auth/models.py:138
+msgid "first name"
+msgstr "nombre"
+
+#: contrib/auth/models.py:139
+msgid "last name"
+msgstr "apellido"
+
+#: contrib/auth/models.py:140
+msgid "e-mail address"
+msgstr "dirección de correo electrónico"
+
+#: contrib/auth/models.py:141
+msgid "password"
+msgstr "contraseña"
+
+#: contrib/auth/models.py:141
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"Use '[algo]$[salt]$[hexdigest]' o use el <a href=\"password/\">formulario de "
+"cambio de contraseña</a>."
+
+#: contrib/auth/models.py:142
+msgid "staff status"
+msgstr "es staff"
+
+#: contrib/auth/models.py:142
+msgid "Designates whether the user can log into this admin site."
+msgstr "Indica si el usuario puede ingresar a este sitio de administración."
+
+#: contrib/auth/models.py:143
+msgid "active"
+msgstr "activo"
+
+#: contrib/auth/models.py:143
+msgid ""
+"Designates whether this user should be treated as active. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"Indica si el usuario debe ser tratado como un usuario activo. Desactive este "
+"campo en lugar de eliminar usuarios."
+
+#: contrib/auth/models.py:144
+msgid "superuser status"
+msgstr "es superusuario"
+
+#: contrib/auth/models.py:144
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr ""
+"Indica que este usuario posee todos los permisos sin que sea necesario "
+"asignarle los mismos en forma explícita."
+
+#: contrib/auth/models.py:145
+msgid "last login"
+msgstr "último ingreso"
+
+#: contrib/auth/models.py:146
+msgid "date joined"
+msgstr "fecha de creación"
+
+#: contrib/auth/models.py:148
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"Además de los permisos asignados manualmente, este usuario también poseerá "
+"todos los permisos de los grupos a los que pertenezca."
+
+#: contrib/auth/models.py:149
+msgid "user permissions"
+msgstr "permisos de usuario"
+
+#: contrib/auth/models.py:153
+msgid "user"
+msgstr "usuario"
+
+#: contrib/auth/models.py:154
+msgid "users"
+msgstr "usuarios"
+
+#: contrib/auth/models.py:309
+msgid "message"
+msgstr "mensaje"
+
+#: contrib/auth/views.py:50
+msgid "Logged out"
+msgstr "Sesión cerrada"
+
+#: contrib/comments/models.py:71 contrib/comments/models.py:164
+msgid "object ID"
+msgstr "ID de objeto"
+
+#: contrib/comments/models.py:72
+msgid "headline"
+msgstr "encabezado"
+
+#: contrib/comments/models.py:73 contrib/comments/models.py:95
+#: contrib/comments/models.py:165
+msgid "comment"
+msgstr "comentario"
+
+#: contrib/comments/models.py:74
+msgid "rating #1"
+msgstr "calificación 1"
+
+#: contrib/comments/models.py:75
+msgid "rating #2"
+msgstr "calificación 2"
+
+#: contrib/comments/models.py:76
+msgid "rating #3"
+msgstr "calificación 3"
+
+#: contrib/comments/models.py:77
+msgid "rating #4"
+msgstr "calificación 4"
+
+#: contrib/comments/models.py:78
+msgid "rating #5"
+msgstr "calificación 5"
+
+#: contrib/comments/models.py:79
+msgid "rating #6"
+msgstr "calificación 6"
+
+#: contrib/comments/models.py:80
+msgid "rating #7"
+msgstr "calificación 7"
+
+#: contrib/comments/models.py:81
+msgid "rating #8"
+msgstr "calificación 8"
+
+#: contrib/comments/models.py:86
+msgid "is valid rating"
+msgstr "es calificación válida"
+
+#: contrib/comments/models.py:87 contrib/comments/models.py:167
+msgid "date/time submitted"
+msgstr "fecha/hora de envío"
+
+#: contrib/comments/models.py:88 contrib/comments/models.py:168
+msgid "is public"
+msgstr "es público"
+
+#: contrib/comments/models.py:90
+msgid "is removed"
+msgstr "se ha eliminado"
+
+#: contrib/comments/models.py:90
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Marque esta caja si el comentario es inapropiado. En su lugar se mostrará un "
+"mensaje \"Este comentario ha sido eliminado\"."
+
+#: contrib/comments/models.py:96
+msgid "comments"
+msgstr "comentarios"
+
+#: contrib/comments/models.py:128 contrib/comments/models.py:199
+msgid "Content object"
+msgstr "Objeto contenido"
+
+#: contrib/comments/models.py:156
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Enviado por %(user)s el %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:166
+msgid "person's name"
+msgstr "nombre de la persona"
+
+#: contrib/comments/models.py:169
+msgid "ip address"
+msgstr "dirección ip"
+
+#: contrib/comments/models.py:171
+msgid "approved by staff"
+msgstr "aprobado por el staff"
+
+#: contrib/comments/models.py:175
+msgid "free comment"
+msgstr "comentario libre"
+
+#: contrib/comments/models.py:176
+msgid "free comments"
+msgstr "comentarios libres"
+
+#: contrib/comments/models.py:227
+msgid "score"
+msgstr "puntuación"
+
+#: contrib/comments/models.py:228
+msgid "score date"
+msgstr "fecha de la puntuación"
+
+#: contrib/comments/models.py:232
+msgid "karma score"
+msgstr "punto karma"
+
+#: contrib/comments/models.py:233
+msgid "karma scores"
+msgstr "puntos karma"
+
+#: contrib/comments/models.py:237
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "puntuado %(score)d por %(user)s"
+
+#: contrib/comments/models.py:254
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Este comentario fue marcado por %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:262
+msgid "flag date"
+msgstr "fecha de la marca"
+
+#: contrib/comments/models.py:266
+msgid "user flag"
+msgstr "marca de usuario"
+
+#: contrib/comments/models.py:267
+msgid "user flags"
+msgstr "marcas de usuario"
+
+#: contrib/comments/models.py:271
+#, python-format
+msgid "Flag by %r"
+msgstr "Marca de %r"
+
+#: contrib/comments/models.py:277
+msgid "deletion date"
+msgstr "fecha de eliminación"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "eliminación por moderador"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "eliminaciones por moderador"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Eliminación del moderador %r"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Olvidó su contraseña?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Calificaciones"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Obligatorio"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Opcional"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Enviar una foto"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Comentario:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Previsualizar comentario"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Su nombre:"
+
+#: contrib/comments/views/comments.py:76
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr "Se precisa esta puntuación porque ha introducido al menos otra más."
+
+#: contrib/comments/views/comments.py:160
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Este comentario lo envió un usuario que ha enviado menos de %(count)s "
+"comentario:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Este comentario lo envió un usuario que ha enviado menos de %(count)s "
+"comentarios:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:165
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Este comentario ha sido enviado por un usuario 'semi-anónimo':\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:238
+#: contrib/comments/views/comments.py:331
+msgid "Only POSTs are allowed"
+msgstr "Sólo se admiten POSTs"
+
+#: contrib/comments/views/comments.py:242
+#: contrib/comments/views/comments.py:335
+msgid "One or more of the required fields wasn't submitted"
+msgstr "No se proporcionó uno o más de los campos obligatorios"
+
+#: contrib/comments/views/comments.py:246
+#: contrib/comments/views/comments.py:337
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr ""
+"Alguien está jugando con el formulario de comentarios (violación de "
+"seguridad)"
+
+#: contrib/comments/views/comments.py:256
+#: contrib/comments/views/comments.py:343
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"El formulario de comentarios tiene un parámetro 'target' no válido (el ID de "
+"objeto era inválido)"
+
+#: contrib/comments/views/comments.py:307
+#: contrib/comments/views/comments.py:372
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr ""
+"El formulario de comentarios no proporcionó 'previsualizar' ni 'enviar'"
+
+#: contrib/comments/views/karma.py:21
+msgid "Anonymous users cannot vote"
+msgstr "Los usuarios anónimos no pueden votar"
+
+#: contrib/comments/views/karma.py:25
+msgid "Invalid comment ID"
+msgstr "ID de comentario no válido"
+
+#: contrib/comments/views/karma.py:27
+msgid "No voting for yourself"
+msgstr "Ud. no puede votarse a sí mismo"
+
+#: contrib/contenttypes/models.py:67
+msgid "python model class name"
+msgstr "nombre de la clase python del modelo"
+
+#: contrib/contenttypes/models.py:71
+msgid "content type"
+msgstr "tipo de contenido"
+
+#: contrib/contenttypes/models.py:72
+msgid "content types"
+msgstr "tipos de contenido"
+
+#: contrib/flatpages/admin.py:9
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Ejemplo: '/about/contact/'. Asegúrese de usar barras '/' al principio y al "
+"final."
+
+#: contrib/flatpages/admin.py:11 core/validators.py:76
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Este valor debe contener sólo letras, números, guiones bajos, guiones o "
+"barras (/)"
+
+#: contrib/flatpages/admin.py:22
+msgid "Advanced options"
+msgstr "Opciones avanzadas"
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "título"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "contenido"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "activar comentarios"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "nombre de plantilla"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"Ejemplo: 'flatpages/contact_page.html'. Si no lo proporciona, el sistema "
+"usará 'flatpages/default.html'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "debe estar registrado"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Si está marcado, sólo los usuarios registrados podrán ver la página."
+
+#: contrib/flatpages/models.py:19
+msgid "flat page"
+msgstr "página estática"
+
+#: contrib/flatpages/models.py:20
+msgid "flat pages"
+msgstr "páginas estáticas"
+
+#: contrib/gis/forms/fields.py:10
+msgid "No geometry value provided."
+msgstr "No se ha proporcionado un valor de geometría."
+
+#: contrib/gis/forms/fields.py:11
+msgid "Invalid Geometry value."
+msgstr "Valor de geometría no válido."
+
+#: contrib/gis/forms/fields.py:12
+msgid "Invalid Geometry type."
+msgstr "Tipo de geometría no válido"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "th"
+msgstr "th"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "st"
+msgstr "st"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "nd"
+msgstr "nd"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "rd"
+msgstr "rd"
+
+#: contrib/humanize/templatetags/humanize.py:51
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f millón"
+msgstr[1] "%(value).1f millones"
+
+#: contrib/humanize/templatetags/humanize.py:54
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f millardo"
+msgstr[1] "%(value).1f millardos"
+
+#: contrib/humanize/templatetags/humanize.py:57
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f billón"
+msgstr[1] "%(value).1f billones"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "one"
+msgstr "uno"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "two"
+msgstr "dos"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "three"
+msgstr "tres"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "four"
+msgstr "cuatro"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "five"
+msgstr "cinco"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "six"
+msgstr "seis"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "seven"
+msgstr "siete"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "eight"
+msgstr "ocho"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "nine"
+msgstr "nueve"
+
+#: contrib/humanize/templatetags/humanize.py:93
+msgid "today"
+msgstr "hoy"
+
+#: contrib/humanize/templatetags/humanize.py:95
+msgid "tomorrow"
+msgstr "mañana"
+
+#: contrib/humanize/templatetags/humanize.py:97
+msgid "yesterday"
+msgstr "ayer"
+
+#: contrib/localflavor/ar/forms.py:27
+msgid "Enter a postal code in the format NNNN or ANNNNAAA."
+msgstr "Introduzca un código postal en formato NNNN o ANNNNAAA."
+
+#: contrib/localflavor/ar/forms.py:49 contrib/localflavor/br/forms.py:96
+#: contrib/localflavor/br/forms.py:135 contrib/localflavor/pe/forms.py:23
+#: contrib/localflavor/pe/forms.py:51
+msgid "This field requires only numbers."
+msgstr "Este campo permite sólo valores numéricos."
+
+#: contrib/localflavor/ar/forms.py:50
+msgid "This field requires 7 or 8 digits."
+msgstr "Este campo requiere 7 u 8 dígitos."
+
+#: contrib/localflavor/ar/forms.py:79
+msgid "Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format."
+msgstr "Introduzca un CUIT válido en formato XX-XXXXXXXX-X o XXXXXXXXXXX."
+
+#: contrib/localflavor/ar/forms.py:80
+msgid "Invalid CUIT."
+msgstr "CUIT inválido."
+
+#: contrib/localflavor/at/at_states.py:5
+msgid "Burgenland"
+msgstr "Burgenland"
+
+#: contrib/localflavor/at/at_states.py:6
+msgid "Carinthia"
+msgstr "Carintia"
+
+#: contrib/localflavor/at/at_states.py:7
+msgid "Lower Austria"
+msgstr "Baja Austria"
+
+#: contrib/localflavor/at/at_states.py:8
+msgid "Upper Austria"
+msgstr "Alta Austria"
+
+#: contrib/localflavor/at/at_states.py:9
+msgid "Salzburg"
+msgstr "Salzburgo"
+
+#: contrib/localflavor/at/at_states.py:10
+msgid "Styria"
+msgstr "Estiria"
+
+#: contrib/localflavor/at/at_states.py:11
+msgid "Tyrol"
+msgstr "Tirol"
+
+#: contrib/localflavor/at/at_states.py:12
+msgid "Vorarlberg"
+msgstr "Vorarlberg"
+
+#: contrib/localflavor/at/at_states.py:13
+msgid "Vienna"
+msgstr "Viena"
+
+#: contrib/localflavor/at/forms.py:20 contrib/localflavor/ch/forms.py:16
+#: contrib/localflavor/no/forms.py:12
+msgid "Enter a zip code in the format XXXX."
+msgstr "Introduzca un zip code en formato XXXX."
+
+#: contrib/localflavor/at/forms.py:48
+msgid "Enter a valid Austrian Social Security Number in XXXX XXXXXX format."
+msgstr "Introduzca un Número de Seguridad Social austríaco en formato XXXX XXXXXX."
+
+#: contrib/localflavor/au/forms.py:16
+msgid "Enter a 4 digit post code."
+msgstr "Introduzca un post code de 4 dígitos."
+
+#: contrib/localflavor/br/forms.py:21
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Introduzca un zip code en formato XXXXX-XXX."
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "Los números telefónicos deben respetar el formato XX-XXXX-XXXX."
+
+#: contrib/localflavor/br/forms.py:58
+msgid ""
+"Select a valid brazilian state. That state is not one of the available "
+"states."
+msgstr ""
+"Seleccione un estado Brasileño válido. Ese estado no es uno de los estados "
+"disponibles."
+
+#: contrib/localflavor/br/forms.py:94
+msgid "Invalid CPF number."
+msgstr "Número CPF inválido."
+
+#: contrib/localflavor/br/forms.py:95
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr "Este campo requiere como máximo 11 dígitos o 14 caracteres."
+
+#: contrib/localflavor/br/forms.py:134
+msgid "Invalid CNPJ number."
+msgstr "Número CNPJ inválido."
+
+#: contrib/localflavor/br/forms.py:136
+msgid "This field requires at least 14 digits"
+msgstr "Este campo requiere al menos 14 dígitos."
+
+#: contrib/localflavor/ca/forms.py:17
+msgid "Enter a postal code in the format XXX XXX."
+msgstr "Introduzca un código postal en formato XXX XXX."
+
+#: contrib/localflavor/ca/forms.py:88
+msgid "Enter a valid Canadian Social Insurance number in XXX-XXX-XXX format."
+msgstr ""
+"Introduzca un Número de Seguridad Social Canadiense en formato XXX-XXX-XXX."
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr "Aargau"
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr "Appenzell Innerrhoden"
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr "Appenzell Ausserrhoden"
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr "Basel-Stadt"
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr "Basel-Land"
+
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr "Berne"
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr "Fribourg"
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr "Geneva"
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr "Glarus"
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr "Graubuenden"
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr "Jura"
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr "Lucerne"
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr "Neuchatel"
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr "Nidwalden"
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr "Obwalden"
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr "Schaffhausen"
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr "Schwyz"
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr "Solothurn"
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr "St. Gallen"
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr "Thurgau"
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr "Ticino"
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr "Uri"
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr "Valais"
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr "Vaud"
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr "Zug"
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr "Zurich"
+
+#: contrib/localflavor/ch/forms.py:64
+msgid ""
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
+msgstr ""
+"Introduzca un número válido de tarjeta de identidad o pasaporte Suizos en "
+"formato X1234567<0 o 1234567890."
+
+#: contrib/localflavor/cl/forms.py:29
+msgid "Enter a valid Chilean RUT."
+msgstr "Introduzca un RUT chileno válido."
+
+#: contrib/localflavor/cl/forms.py:30
+msgid "Enter a valid Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr "Introduzca un RUT chileno válido. EL formato es XX.XXX.XXX-X."
+
+#: contrib/localflavor/cl/forms.py:31
+msgid "The Chilean RUT is not valid."
+msgstr "El RUT chileno no es válido."
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr "Baden-Wuerttemberg"
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr "Bavaria"
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr "Berlin"
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr "Brandenburg"
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr "Bremen"
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr "Hamburg"
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr "Hessen"
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr "Mecklenburg-Western Pomerania"
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr "Lower Saxony"
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr "North Rhine-Westphalia"
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr "Rhineland-Palatinate"
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr "Saarland"
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr "Saxony"
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr "Saxony-Anhalt"
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr "Schleswig-Holstein"
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr "Thuringia"
+
+#: contrib/localflavor/de/forms.py:14 contrib/localflavor/fi/forms.py:12
+#: contrib/localflavor/fr/forms.py:15
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Introduzca un zip code en formato XXXXX."
+
+#: contrib/localflavor/de/forms.py:41
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr ""
+"Introduzca un número de tarjeta de identidad alemán válido en formato "
+"XXXXXXXXXXX-XXXXXXX-XXXXXXX-X."
+
+#: contrib/localflavor/es/es_provinces.py:5
+msgid "Arava"
+msgstr "Álava"
+
+#: contrib/localflavor/es/es_provinces.py:6
+msgid "Albacete"
+msgstr "Albacete"
+
+#: contrib/localflavor/es/es_provinces.py:7
+msgid "Alacant"
+msgstr "Alicante"
+
+#: contrib/localflavor/es/es_provinces.py:8
+msgid "Almeria"
+msgstr "Almería"
+
+#: contrib/localflavor/es/es_provinces.py:9
+msgid "Avila"
+msgstr "Ávila"
+
+#: contrib/localflavor/es/es_provinces.py:10
+msgid "Badajoz"
+msgstr "Badajoz"
+
+#: contrib/localflavor/es/es_provinces.py:11
+msgid "Illes Balears"
+msgstr "Islas Baleares"
+
+#: contrib/localflavor/es/es_provinces.py:12
+msgid "Barcelona"
+msgstr "Barcelona"
+
+#: contrib/localflavor/es/es_provinces.py:13
+msgid "Burgos"
+msgstr "Burgos"
+
+#: contrib/localflavor/es/es_provinces.py:14
+msgid "Caceres"
+msgstr "Cáceres"
+
+#: contrib/localflavor/es/es_provinces.py:15
+msgid "Cadiz"
+msgstr "Cádiz"
+
+#: contrib/localflavor/es/es_provinces.py:16
+msgid "Castello"
+msgstr "Castellón"
+
+#: contrib/localflavor/es/es_provinces.py:17
+msgid "Ciudad Real"
+msgstr "Ciudad Real"
+
+#: contrib/localflavor/es/es_provinces.py:18
+msgid "Cordoba"
+msgstr "Córdoba"
+
+#: contrib/localflavor/es/es_provinces.py:19
+msgid "A Coruna"
+msgstr "La Coruña"
+
+#: contrib/localflavor/es/es_provinces.py:20
+msgid "Cuenca"
+msgstr "Cuenca"
+
+#: contrib/localflavor/es/es_provinces.py:21
+msgid "Girona"
+msgstr "Gerona"
+
+#: contrib/localflavor/es/es_provinces.py:22
+msgid "Granada"
+msgstr "Granada"
+
+#: contrib/localflavor/es/es_provinces.py:23
+msgid "Guadalajara"
+msgstr "Guadalajara"
+
+#: contrib/localflavor/es/es_provinces.py:24
+msgid "Guipuzkoa"
+msgstr "Guipúzcoa"
+
+#: contrib/localflavor/es/es_provinces.py:25
+msgid "Huelva"
+msgstr "Huelva"
+
+#: contrib/localflavor/es/es_provinces.py:26
+msgid "Huesca"
+msgstr "Huesca"
+
+#: contrib/localflavor/es/es_provinces.py:27
+msgid "Jaen"
+msgstr "Jaén"
+
+#: contrib/localflavor/es/es_provinces.py:28
+msgid "Leon"
+msgstr "León"
+
+#: contrib/localflavor/es/es_provinces.py:29
+msgid "Lleida"
+msgstr "Lérida"
+
+#: contrib/localflavor/es/es_provinces.py:30
+#: contrib/localflavor/es/es_regions.py:17
+msgid "La Rioja"
+msgstr "La Rioja"
+
+#: contrib/localflavor/es/es_provinces.py:31
+msgid "Lugo"
+msgstr "Lugo"
+
+#: contrib/localflavor/es/es_provinces.py:32
+#: contrib/localflavor/es/es_regions.py:18
+msgid "Madrid"
+msgstr "Madrid"
+
+#: contrib/localflavor/es/es_provinces.py:33
+msgid "Malaga"
+msgstr "Málaga"
+
+#: contrib/localflavor/es/es_provinces.py:34
+msgid "Murcia"
+msgstr "Murcia"
+
+#: contrib/localflavor/es/es_provinces.py:35
+msgid "Navarre"
+msgstr "Navarra"
+
+#: contrib/localflavor/es/es_provinces.py:36
+msgid "Ourense"
+msgstr "Orense"
+
+#: contrib/localflavor/es/es_provinces.py:37
+msgid "Asturias"
+msgstr "Asturias"
+
+#: contrib/localflavor/es/es_provinces.py:38
+msgid "Palencia"
+msgstr "Palencia"
+
+#: contrib/localflavor/es/es_provinces.py:39
+msgid "Las Palmas"
+msgstr "Las Palmas"
+
+#: contrib/localflavor/es/es_provinces.py:40
+msgid "Pontevedra"
+msgstr "Pontevedra"
+
+#: contrib/localflavor/es/es_provinces.py:41
+msgid "Salamanca"
+msgstr "Salamanca"
+
+#: contrib/localflavor/es/es_provinces.py:42
+msgid "Santa Cruz de Tenerife"
+msgstr "Santa Cruz de Tenerife"
+
+#: contrib/localflavor/es/es_provinces.py:43
+#: contrib/localflavor/es/es_regions.py:11
+msgid "Cantabria"
+msgstr "Cantabria"
+
+#: contrib/localflavor/es/es_provinces.py:44
+msgid "Segovia"
+msgstr "Segovia"
+
+#: contrib/localflavor/es/es_provinces.py:45
+msgid "Seville"
+msgstr "Sevilla"
+
+#: contrib/localflavor/es/es_provinces.py:46
+msgid "Soria"
+msgstr "Soria"
+
+#: contrib/localflavor/es/es_provinces.py:47
+msgid "Tarragona"
+msgstr "Tarragona"
+
+#: contrib/localflavor/es/es_provinces.py:48
+msgid "Teruel"
+msgstr "Teruel"
+
+#: contrib/localflavor/es/es_provinces.py:49
+msgid "Toledo"
+msgstr "Toledo"
+
+#: contrib/localflavor/es/es_provinces.py:50
+msgid "Valencia"
+msgstr "Valencia"
+
+#: contrib/localflavor/es/es_provinces.py:51
+msgid "Valladolid"
+msgstr "Valladolid"
+
+#: contrib/localflavor/es/es_provinces.py:52
+msgid "Bizkaia"
+msgstr "Vizcaya"
+
+#: contrib/localflavor/es/es_provinces.py:53
+msgid "Zamora"
+msgstr "Zamora"
+
+#: contrib/localflavor/es/es_provinces.py:54
+msgid "Zaragoza"
+msgstr "Zaragoza"
+
+#: contrib/localflavor/es/es_provinces.py:55
+msgid "Ceuta"
+msgstr "Ceuta"
+
+#: contrib/localflavor/es/es_provinces.py:56
+msgid "Melilla"
+msgstr "Melilla"
+
+#: contrib/localflavor/es/es_regions.py:5
+msgid "Andalusia"
+msgstr "Andalucía"
+
+#: contrib/localflavor/es/es_regions.py:6
+msgid "Aragon"
+msgstr "Aragón"
+
+#: contrib/localflavor/es/es_regions.py:7
+msgid "Principality of Asturias"
+msgstr "Principado de Asturias"
+
+#: contrib/localflavor/es/es_regions.py:8
+msgid "Balearic Islands"
+msgstr "Islas Baleares"
+
+#: contrib/localflavor/es/es_regions.py:9
+msgid "Basque Country"
+msgstr "País Vasco"
+
+#: contrib/localflavor/es/es_regions.py:10
+msgid "Canary Islands"
+msgstr "Islas Canarias"
+
+#: contrib/localflavor/es/es_regions.py:12
+msgid "Castile-La Mancha"
+msgstr "Castilla-La Mancha"
+
+#: contrib/localflavor/es/es_regions.py:13
+msgid "Castile and Leon"
+msgstr "Castilla y León"
+
+#: contrib/localflavor/es/es_regions.py:14
+msgid "Catalonia"
+msgstr "Cataluña"
+
+#: contrib/localflavor/es/es_regions.py:15
+msgid "Extremadura"
+msgstr "Extremadura"
+
+#: contrib/localflavor/es/es_regions.py:16
+msgid "Galicia"
+msgstr "Galicia"
+
+#: contrib/localflavor/es/es_regions.py:19
+msgid "Region of Murcia"
+msgstr "Región de Murcia"
+
+#: contrib/localflavor/es/es_regions.py:20
+msgid "Foral Community of Navarre"
+msgstr "Comunidad Foral de Navarra"
+
+#: contrib/localflavor/es/es_regions.py:21
+msgid "Valencian Community"
+msgstr "Comunidad Valenciana"
+
+#: contrib/localflavor/es/forms.py:19
+msgid "Enter a valid postal code in the range and format 01XXX - 52XXX."
+msgstr ""
+"Introduzca un código postal en el siguiente rango y con el siguiente "
+"formato: 01XXX - 52XXX."
+
+#: contrib/localflavor/es/forms.py:39
+msgid ""
+"Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or "
+"9XXXXXXXX."
+msgstr ""
+"Introduzca un número telefónico en uno de los siguientes formatos: "
+"6XXXXXXXX, 8XXXXXXXX o 9XXXXXXXX."
+
+#: contrib/localflavor/es/forms.py:66
+msgid "Please enter a valid NIF, NIE, or CIF."
+msgstr "Por favor introduzca un NIF, NIE o CIF válidos."
+
+#: contrib/localflavor/es/forms.py:67
+msgid "Please enter a valid NIF or NIE."
+msgstr "Por favor, introduzca un NIF o CIE válidos."
+
+#: contrib/localflavor/es/forms.py:68
+msgid "Invalid checksum for NIF."
+msgstr "Código de verificación de NIF inválido."
+
+#: contrib/localflavor/es/forms.py:69
+msgid "Invalid checksum for NIE."
+msgstr "Código de verificación de NIE inválido."
+
+#: contrib/localflavor/es/forms.py:70
+msgid "Invalid checksum for CIF."
+msgstr "Código de verificación de CIF inválido."
+
+#: contrib/localflavor/es/forms.py:142
+msgid ""
+"Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX."
+msgstr ""
+"Por favor introduzca un número de cuenta bancaria válido en formato XXXX-"
+"XXXX-XX-XXXXXXXXXX."
+
+#: contrib/localflavor/es/forms.py:143
+msgid "Invalid checksum for bank account number."
+msgstr "Código de verificación de número de cuenta bancaria inválido."
+
+#: contrib/localflavor/fi/forms.py:28
+msgid "Enter a valid Finnish social security number."
+msgstr "Introduzca un número de seguridad social finlandés válido."
+
+#: contrib/localflavor/in_/forms.py:14
+msgid "Enter a zip code in the format XXXXXXX."
+msgstr "Introduzca un zip code en formato XXXXXXX."
+
+#: contrib/localflavor/is_/forms.py:17
+msgid ""
+"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr ""
+"Introduzca un número de identificación islandés válido. El formato es XXXXXX-"
+"XXXX."
+
+#: contrib/localflavor/is_/forms.py:18
+msgid "The Icelandic identification number is not valid."
+msgstr "El número de identificación islandés no es válido."
+
+#: contrib/localflavor/it/forms.py:14
+msgid "Enter a valid zip code."
+msgstr "Introduzca un zip code válido."
+
+#: contrib/localflavor/it/forms.py:43
+msgid "Enter a valid Social Security number."
+msgstr "Introduzca un número de Seguridad Social válido."
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr "Introduzca un número VAT válido."
+
+#: contrib/localflavor/jp/forms.py:17
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "Introduzca un código postal en formato XXXXXX o XXX-XXXX."
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr "Hokkaido"
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr "Aomori"
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr "Iwate"
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr "Miyagi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr "Akita"
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr "Yamagata"
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr "Fukushima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr "Ibaraki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr "Tochigi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr "Gunma"
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr "Saitama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr "Chiba"
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr "Tokyo"
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr "Kanagawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr "Yamanashi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr "Nagano"
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr "Niigata"
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr "Toyama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr "Ishikawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr "Fukui"
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr "Gifu"
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr "Shizuoka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr "Aichi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr "Mie"
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr "Shiga"
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr "Kyoto"
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr "Osaka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr "Hyogo"
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr "Nara"
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr "Wakayama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr "Tottori"
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr "Shimane"
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr "Okayama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr "Hiroshima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr "Yamaguchi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr "Tokushima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr "Kagawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr "Ehime"
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr "Kochi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr "Fukuoka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr "Saga"
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr "Nagasaki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr "Kumamoto"
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr "Oita"
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr "Miyazaki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr "Kagoshima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr "Okinawa"
+
+#: contrib/localflavor/mx/mx_states.py:12
+msgid "Aguascalientes"
+msgstr "Aguascalientes"
+
+#: contrib/localflavor/mx/mx_states.py:13
+msgid "Baja California"
+msgstr "Baja California"
+
+#: contrib/localflavor/mx/mx_states.py:14
+msgid "Baja California Sur"
+msgstr "Baja California Sur"
+
+#: contrib/localflavor/mx/mx_states.py:15
+msgid "Campeche"
+msgstr "Campeche"
+
+#: contrib/localflavor/mx/mx_states.py:16
+msgid "Chihuahua"
+msgstr "Chihuahua"
+
+#: contrib/localflavor/mx/mx_states.py:17
+msgid "Chiapas"
+msgstr "Chiapas"
+
+#: contrib/localflavor/mx/mx_states.py:18
+msgid "Coahuila"
+msgstr "Coahuila"
+
+#: contrib/localflavor/mx/mx_states.py:19
+msgid "Colima"
+msgstr "Colima"
+
+#: contrib/localflavor/mx/mx_states.py:20
+msgid "Distrito Federal"
+msgstr "Distrito Federal"
+
+#: contrib/localflavor/mx/mx_states.py:21
+msgid "Durango"
+msgstr "Durango"
+
+#: contrib/localflavor/mx/mx_states.py:22
+msgid "Guerrero"
+msgstr "Guerrero"
+
+#: contrib/localflavor/mx/mx_states.py:23
+msgid "Guanajuato"
+msgstr "Guanajuato"
+
+#: contrib/localflavor/mx/mx_states.py:24
+msgid "Hidalgo"
+msgstr "Hidalgo"
+
+#: contrib/localflavor/mx/mx_states.py:25
+msgid "Jalisco"
+msgstr "Jalisco"
+
+#: contrib/localflavor/mx/mx_states.py:26
+msgid "Estado de México"
+msgstr "Estado de México"
+
+#: contrib/localflavor/mx/mx_states.py:27
+msgid "Michoacán"
+msgstr "Michoacán"
+
+#: contrib/localflavor/mx/mx_states.py:28
+msgid "Morelos"
+msgstr "Morelos"
+
+#: contrib/localflavor/mx/mx_states.py:29
+msgid "Nayarit"
+msgstr "Nayarit"
+
+#: contrib/localflavor/mx/mx_states.py:30
+msgid "Nuevo León"
+msgstr "Nuevo León"
+
+#: contrib/localflavor/mx/mx_states.py:31
+msgid "Oaxaca"
+msgstr "Oaxaca"
+
+#: contrib/localflavor/mx/mx_states.py:32
+msgid "Puebla"
+msgstr "Puebla"
+
+#: contrib/localflavor/mx/mx_states.py:33
+msgid "Querétaro"
+msgstr "Querétaro"
+
+#: contrib/localflavor/mx/mx_states.py:34
+msgid "Quintana Roo"
+msgstr "Quintana Roo"
+
+#: contrib/localflavor/mx/mx_states.py:35
+msgid "Sinaloa"
+msgstr "Sinaloa"
+
+#: contrib/localflavor/mx/mx_states.py:36
+msgid "San Luis Potosí"
+msgstr "San Luis Potosí"
+
+#: contrib/localflavor/mx/mx_states.py:37
+msgid "Sonora"
+msgstr "Sonora"
+
+#: contrib/localflavor/mx/mx_states.py:38
+msgid "Tabasco"
+msgstr "Tabasco"
+
+#: contrib/localflavor/mx/mx_states.py:39
+msgid "Tamaulipas"
+msgstr "Tamaulipas"
+
+#: contrib/localflavor/mx/mx_states.py:40
+msgid "Tlaxcala"
+msgstr "Tlaxcala"
+
+#: contrib/localflavor/mx/mx_states.py:41
+msgid "Veracruz"
+msgstr "Veracruz"
+
+#: contrib/localflavor/mx/mx_states.py:42
+msgid "Yucatán"
+msgstr "Yucatán"
+
+#: contrib/localflavor/mx/mx_states.py:43
+msgid "Zacatecas"
+msgstr "Zacatecas"
+
+#: contrib/localflavor/nl/forms.py:21
+msgid "Enter a valid postal code"
+msgstr "Introduzca un código postal válido."
+
+#: contrib/localflavor/nl/forms.py:52
+msgid "Enter a valid phone number"
+msgstr "Introduzca un número telefónico válido."
+
+#: contrib/localflavor/nl/forms.py:78
+msgid "Enter a valid SoFi number"
+msgstr "Introduzca un número SoFi válido."
+
+#: contrib/localflavor/nl/nl_provinces.py:4
+msgid "Drente"
+msgstr "Drente"
+
+#: contrib/localflavor/nl/nl_provinces.py:5
+msgid "Flevoland"
+msgstr "Flevolanda"
+
+#: contrib/localflavor/nl/nl_provinces.py:6
+msgid "Friesland"
+msgstr "Frisia"
+
+#: contrib/localflavor/nl/nl_provinces.py:7
+msgid "Gelderland"
+msgstr "Güeldres"
+
+#: contrib/localflavor/nl/nl_provinces.py:8
+msgid "Groningen"
+msgstr "Groninga"
+
+#: contrib/localflavor/nl/nl_provinces.py:9
+msgid "Limburg"
+msgstr "Limburgo"
+
+#: contrib/localflavor/nl/nl_provinces.py:10
+msgid "Noord-Brabant"
+msgstr "Brabante Septentrional"
+
+#: contrib/localflavor/nl/nl_provinces.py:11
+msgid "Noord-Holland"
+msgstr "Holanda Septentrional"
+
+#: contrib/localflavor/nl/nl_provinces.py:12
+msgid "Overijssel"
+msgstr "Overijssel"
+
+#: contrib/localflavor/nl/nl_provinces.py:13
+msgid "Utrecht"
+msgstr "Utrecht"
+
+#: contrib/localflavor/nl/nl_provinces.py:14
+msgid "Zeeland"
+msgstr "Zelanda"
+
+#: contrib/localflavor/nl/nl_provinces.py:15
+msgid "Zuid-Holland"
+msgstr "Holanda Meridional"
+
+#: contrib/localflavor/no/forms.py:33
+msgid "Enter a valid Norwegian social security number."
+msgstr "Introduzca un número de seguridad social Noruego válido."
+
+#: contrib/localflavor/pe/forms.py:24
+msgid "This field requires 8 digits."
+msgstr "Este campo requiere 8 dígitos."
+
+#: contrib/localflavor/pe/forms.py:52
+msgid "This field requires 11 digits."
+msgstr "Este campo requiere 11 dígitos."
+
+#: contrib/localflavor/pl/forms.py:38
+msgid "National Identification Number consists of 11 digits."
+msgstr "Los Números Nacionales de Identificación constan de 11 dígitos."
+
+#: contrib/localflavor/pl/forms.py:39
+msgid "Wrong checksum for the National Identification Number."
+msgstr "Código de verificación de Número Nacional de Identificación inválido."
+
+#: contrib/localflavor/pl/forms.py:71
+msgid ""
+"Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX."
+msgstr ""
+"Introduzca un campo de número impositivo en formato XXX-XXX-XX-XX o XX-XX-"
+"XXX-XXX."
+
+#: contrib/localflavor/pl/forms.py:72
+msgid "Wrong checksum for the Tax Number (NIP)."
+msgstr "Código de verificación de Número Impostitivo (NIP) inválido."
+
+#: contrib/localflavor/pl/forms.py:111
+msgid "National Business Register Number (REGON) consists of 7 or 9 digits."
+msgstr ""
+"Los Números Nacionales de Registro de Negocios (REGON) constan de 7 o 9 "
+"dígitos."
+
+#: contrib/localflavor/pl/forms.py:112
+msgid "Wrong checksum for the National Business Register Number (REGON)."
+msgstr ""
+"Código de verificación de Número Nacional de Registro de negocios (REGON) "
+"inválido."
+
+#: contrib/localflavor/pl/forms.py:155
+msgid "Enter a postal code in the format XX-XXX."
+msgstr "Introduzca un código postal en formato XX-XXX."
+
+#: contrib/localflavor/pl/pl_voivodeships.py:8
+msgid "Lower Silesia"
+msgstr "Baja Silesia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:9
+msgid "Kuyavia-Pomerania"
+msgstr "Cuyavia y Pomerania"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:10
+msgid "Lublin"
+msgstr "Lublin"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:11
+msgid "Lubusz"
+msgstr "Lubus"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:12
+msgid "Lodz"
+msgstr "Lodz"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:13
+msgid "Lesser Poland"
+msgstr "Pequeña Polonia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:14
+msgid "Masovia"
+msgstr "Masovia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:15
+msgid "Opole"
+msgstr "Opole"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:16
+msgid "Subcarpatia"
+msgstr "Subcarpacia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:17
+msgid "Podlasie"
+msgstr "Podlaquia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:18
+msgid "Pomerania"
+msgstr "Pomerania"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:19
+msgid "Silesia"
+msgstr "Silesia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:20
+msgid "Swietokrzyskie"
+msgstr "Swietokrzyskie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:21
+msgid "Warmia-Masuria"
+msgstr "Varmia y Masuria"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:22
+msgid "Greater Poland"
+msgstr "Gran Polonia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:23
+msgid "West Pomerania"
+msgstr "Pomerania Occidental"
+
+#: contrib/localflavor/ro/forms.py:19
+msgid "Enter a valid CIF."
+msgstr "Introduzca un CIF válido."
+
+#: contrib/localflavor/ro/forms.py:56
+msgid "Enter a valid CNP."
+msgstr "Introduzca un CNP válido."
+
+#: contrib/localflavor/ro/forms.py:141
+msgid "Enter a valid IBAN in ROXX-XXXX-XXXX-XXXX-XXXX-XXXX format"
+msgstr "Introduzca un IBAN válido en formato ROXX-XXXX-XXXX-XXXX-XXXX-XXXX"
+
+#: contrib/localflavor/ro/forms.py:171
+msgid "Phone numbers must be in XXXX-XXXXXX format."
+msgstr "Los números telefónicos deben respetar el formato XXXX-XXXXXX."
+
+#: contrib/localflavor/ro/forms.py:194
+msgid "Enter a valid postal code in the format XXXXXX"
+msgstr "Introduzca un código postal válido en formato XXXXXX"
+
+#: contrib/localflavor/sk/forms.py:30
+msgid "Enter a postal code in the format XXXXX or XXX XX."
+msgstr "Introduzca un código postal en formato XXXXX o XXX XX."
+
+#: contrib/localflavor/sk/sk_districts.py:8
+msgid "Banska Bystrica"
+msgstr "Banska Bystrica"
+
+#: contrib/localflavor/sk/sk_districts.py:9
+msgid "Banska Stiavnica"
+msgstr "Banska Stiavnica"
+
+#: contrib/localflavor/sk/sk_districts.py:10
+msgid "Bardejov"
+msgstr "Bardejov"
+
+#: contrib/localflavor/sk/sk_districts.py:11
+msgid "Banovce nad Bebravou"
+msgstr "Banovce nad Bebravou"
+
+#: contrib/localflavor/sk/sk_districts.py:12
+msgid "Brezno"
+msgstr "Brezno"
+
+#: contrib/localflavor/sk/sk_districts.py:13
+msgid "Bratislava I"
+msgstr "Bratislava I"
+
+#: contrib/localflavor/sk/sk_districts.py:14
+msgid "Bratislava II"
+msgstr "Bratislava II"
+
+#: contrib/localflavor/sk/sk_districts.py:15
+msgid "Bratislava III"
+msgstr "Bratislava III"
+
+#: contrib/localflavor/sk/sk_districts.py:16
+msgid "Bratislava IV"
+msgstr "Bratislava IV"
+
+#: contrib/localflavor/sk/sk_districts.py:17
+msgid "Bratislava V"
+msgstr "Bratislava V"
+
+#: contrib/localflavor/sk/sk_districts.py:18
+msgid "Bytca"
+msgstr "Bytca"
+
+#: contrib/localflavor/sk/sk_districts.py:19
+msgid "Cadca"
+msgstr "Cadca"
+
+#: contrib/localflavor/sk/sk_districts.py:20
+msgid "Detva"
+msgstr "Detva"
+
+#: contrib/localflavor/sk/sk_districts.py:21
+msgid "Dolny Kubin"
+msgstr "Dolny Kubin"
+
+#: contrib/localflavor/sk/sk_districts.py:22
+msgid "Dunajska Streda"
+msgstr "Dunajska Streda"
+
+#: contrib/localflavor/sk/sk_districts.py:23
+msgid "Galanta"
+msgstr "Galanta"
+
+#: contrib/localflavor/sk/sk_districts.py:24
+msgid "Gelnica"
+msgstr "Gelnica"
+
+#: contrib/localflavor/sk/sk_districts.py:25
+msgid "Hlohovec"
+msgstr "Hlohovec"
+
+#: contrib/localflavor/sk/sk_districts.py:26
+msgid "Humenne"
+msgstr "Humenne"
+
+#: contrib/localflavor/sk/sk_districts.py:27
+msgid "Ilava"
+msgstr "Ilava"
+
+#: contrib/localflavor/sk/sk_districts.py:28
+msgid "Kezmarok"
+msgstr "Kezmarok"
+
+#: contrib/localflavor/sk/sk_districts.py:29
+msgid "Komarno"
+msgstr "Komarno"
+
+#: contrib/localflavor/sk/sk_districts.py:30
+msgid "Kosice I"
+msgstr "Kosice I"
+
+#: contrib/localflavor/sk/sk_districts.py:31
+msgid "Kosice II"
+msgstr "Kosice II"
+
+#: contrib/localflavor/sk/sk_districts.py:32
+msgid "Kosice III"
+msgstr "Kosice III"
+
+#: contrib/localflavor/sk/sk_districts.py:33
+msgid "Kosice IV"
+msgstr "Kosice IV"
+
+#: contrib/localflavor/sk/sk_districts.py:34
+msgid "Kosice - okolie"
+msgstr "Kosice - okolie"
+
+#: contrib/localflavor/sk/sk_districts.py:35
+msgid "Krupina"
+msgstr "Krupina"
+
+#: contrib/localflavor/sk/sk_districts.py:36
+msgid "Kysucke Nove Mesto"
+msgstr "Kysucke Nove Mesto"
+
+#: contrib/localflavor/sk/sk_districts.py:37
+msgid "Levice"
+msgstr "Levice"
+
+#: contrib/localflavor/sk/sk_districts.py:38
+msgid "Levoca"
+msgstr "Levoca"
+
+#: contrib/localflavor/sk/sk_districts.py:39
+msgid "Liptovsky Mikulas"
+msgstr "Liptovsky Mikulas"
+
+#: contrib/localflavor/sk/sk_districts.py:40
+msgid "Lucenec"
+msgstr "Lucenec"
+
+#: contrib/localflavor/sk/sk_districts.py:41
+msgid "Malacky"
+msgstr "Malacky"
+
+#: contrib/localflavor/sk/sk_districts.py:42
+msgid "Martin"
+msgstr "Martin"
+
+#: contrib/localflavor/sk/sk_districts.py:43
+msgid "Medzilaborce"
+msgstr "Medzilaborce"
+
+#: contrib/localflavor/sk/sk_districts.py:44
+msgid "Michalovce"
+msgstr "Michalovce"
+
+#: contrib/localflavor/sk/sk_districts.py:45
+msgid "Myjava"
+msgstr "Myjava"
+
+#: contrib/localflavor/sk/sk_districts.py:46
+msgid "Namestovo"
+msgstr "Namestovo"
+
+#: contrib/localflavor/sk/sk_districts.py:47
+msgid "Nitra"
+msgstr "Nitra"
+
+#: contrib/localflavor/sk/sk_districts.py:48
+msgid "Nove Mesto nad Vahom"
+msgstr "Nove Mesto nad Vahom"
+
+#: contrib/localflavor/sk/sk_districts.py:49
+msgid "Nove Zamky"
+msgstr "Nove Zamky"
+
+#: contrib/localflavor/sk/sk_districts.py:50
+msgid "Partizanske"
+msgstr "Partizanske"
+
+#: contrib/localflavor/sk/sk_districts.py:51
+msgid "Pezinok"
+msgstr "Pezinok"
+
+#: contrib/localflavor/sk/sk_districts.py:52
+msgid "Piestany"
+msgstr "Piestany"
+
+#: contrib/localflavor/sk/sk_districts.py:53
+msgid "Poltar"
+msgstr "Poltar"
+
+#: contrib/localflavor/sk/sk_districts.py:54
+msgid "Poprad"
+msgstr "Poprad"
+
+#: contrib/localflavor/sk/sk_districts.py:55
+msgid "Povazska Bystrica"
+msgstr "Povazska Bystrica"
+
+#: contrib/localflavor/sk/sk_districts.py:56
+msgid "Presov"
+msgstr "Presov"
+
+#: contrib/localflavor/sk/sk_districts.py:57
+msgid "Prievidza"
+msgstr "Prievidza"
+
+#: contrib/localflavor/sk/sk_districts.py:58
+msgid "Puchov"
+msgstr "Puchov"
+
+#: contrib/localflavor/sk/sk_districts.py:59
+msgid "Revuca"
+msgstr "Revuca"
+
+#: contrib/localflavor/sk/sk_districts.py:60
+msgid "Rimavska Sobota"
+msgstr "Rimavska Sobota"
+
+#: contrib/localflavor/sk/sk_districts.py:61
+msgid "Roznava"
+msgstr "Roznava"
+
+#: contrib/localflavor/sk/sk_districts.py:62
+msgid "Ruzomberok"
+msgstr "Ruzomberok"
+
+#: contrib/localflavor/sk/sk_districts.py:63
+msgid "Sabinov"
+msgstr "Sabinov"
+
+#: contrib/localflavor/sk/sk_districts.py:64
+msgid "Senec"
+msgstr "Senec"
+
+#: contrib/localflavor/sk/sk_districts.py:65
+msgid "Senica"
+msgstr "Senica"
+
+#: contrib/localflavor/sk/sk_districts.py:66
+msgid "Skalica"
+msgstr "Skalica"
+
+#: contrib/localflavor/sk/sk_districts.py:67
+msgid "Snina"
+msgstr "Snina"
+
+#: contrib/localflavor/sk/sk_districts.py:68
+msgid "Sobrance"
+msgstr "Sobrance"
+
+#: contrib/localflavor/sk/sk_districts.py:69
+msgid "Spisska Nova Ves"
+msgstr "Spisska Nova Ves"
+
+#: contrib/localflavor/sk/sk_districts.py:70
+msgid "Stara Lubovna"
+msgstr "Stara Lubovna"
+
+#: contrib/localflavor/sk/sk_districts.py:71
+msgid "Stropkov"
+msgstr "Stropkov"
+
+#: contrib/localflavor/sk/sk_districts.py:72
+msgid "Svidnik"
+msgstr "Svidnik"
+
+#: contrib/localflavor/sk/sk_districts.py:73
+msgid "Sala"
+msgstr "Sala"
+
+#: contrib/localflavor/sk/sk_districts.py:74
+msgid "Topolcany"
+msgstr "Topolcany"
+
+#: contrib/localflavor/sk/sk_districts.py:75
+msgid "Trebisov"
+msgstr "Trebisov"
+
+#: contrib/localflavor/sk/sk_districts.py:76
+msgid "Trencin"
+msgstr "Trencin"
+
+#: contrib/localflavor/sk/sk_districts.py:77
+msgid "Trnava"
+msgstr "Trnava"
+
+#: contrib/localflavor/sk/sk_districts.py:78
+msgid "Turcianske Teplice"
+msgstr "Turcianske Teplice"
+
+#: contrib/localflavor/sk/sk_districts.py:79
+msgid "Tvrdosin"
+msgstr "Tvrdosin"
+
+#: contrib/localflavor/sk/sk_districts.py:80
+msgid "Velky Krtis"
+msgstr "Velky Krtis"
+
+#: contrib/localflavor/sk/sk_districts.py:81
+msgid "Vranov nad Toplou"
+msgstr "Vranov nad Toplou"
+
+#: contrib/localflavor/sk/sk_districts.py:82
+msgid "Zlate Moravce"
+msgstr "Zlate Moravce"
+
+#: contrib/localflavor/sk/sk_districts.py:83
+msgid "Zvolen"
+msgstr "Zvolen"
+
+#: contrib/localflavor/sk/sk_districts.py:84
+msgid "Zarnovica"
+msgstr "Zarnovica"
+
+#: contrib/localflavor/sk/sk_districts.py:85
+msgid "Ziar nad Hronom"
+msgstr "Ziar nad Hronom"
+
+#: contrib/localflavor/sk/sk_districts.py:86
+msgid "Zilina"
+msgstr "Zilina"
+
+#: contrib/localflavor/sk/sk_regions.py:8
+msgid "Banska Bystrica region"
+msgstr "region Banska Bystrica"
+
+#: contrib/localflavor/sk/sk_regions.py:9
+msgid "Bratislava region"
+msgstr "region Bratislava"
+
+#: contrib/localflavor/sk/sk_regions.py:10
+msgid "Kosice region"
+msgstr "region Kosice"
+
+#: contrib/localflavor/sk/sk_regions.py:11
+msgid "Nitra region"
+msgstr "region Nitra"
+
+#: contrib/localflavor/sk/sk_regions.py:12
+msgid "Presov region"
+msgstr "region Presov"
+
+#: contrib/localflavor/sk/sk_regions.py:13
+msgid "Trencin region"
+msgstr "region Trencin"
+
+#: contrib/localflavor/sk/sk_regions.py:14
+msgid "Trnava region"
+msgstr "region Trnava"
+
+#: contrib/localflavor/sk/sk_regions.py:15
+msgid "Zilina region"
+msgstr "region Zilina"
+
+#: contrib/localflavor/uk/forms.py:21
+msgid "Enter a valid postcode."
+msgstr "Introduzca un postcode válido."
+
+#: contrib/localflavor/uk/uk_regions.py:11
+msgid "Bedfordshire"
+msgstr "Bedfordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:12
+msgid "Buckinghamshire"
+msgstr "Buckinghamshire"
+
+#: contrib/localflavor/uk/uk_regions.py:14
+msgid "Cheshire"
+msgstr "Cheshire"
+
+#: contrib/localflavor/uk/uk_regions.py:15
+msgid "Cornwall and Isles of Scilly"
+msgstr "Cornwall e Islas de Scilly"
+
+#: contrib/localflavor/uk/uk_regions.py:16
+msgid "Cumbria"
+msgstr "Cumbria"
+
+#: contrib/localflavor/uk/uk_regions.py:17
+msgid "Derbyshire"
+msgstr "Derbyshire"
+
+#: contrib/localflavor/uk/uk_regions.py:18
+msgid "Devon"
+msgstr "Devon"
+
+#: contrib/localflavor/uk/uk_regions.py:19
+msgid "Dorset"
+msgstr "Dorset"
+
+#: contrib/localflavor/uk/uk_regions.py:20
+msgid "Durham"
+msgstr "Durham"
+
+#: contrib/localflavor/uk/uk_regions.py:21
+msgid "East Sussex"
+msgstr "East Sussex"
+
+#: contrib/localflavor/uk/uk_regions.py:22
+msgid "Essex"
+msgstr "Essex"
+
+#: contrib/localflavor/uk/uk_regions.py:23
+msgid "Gloucestershire"
+msgstr "Gloucestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:24
+msgid "Greater London"
+msgstr "Greater London"
+
+#: contrib/localflavor/uk/uk_regions.py:25
+msgid "Greater Manchester"
+msgstr "Greater Manchester"
+
+#: contrib/localflavor/uk/uk_regions.py:26
+msgid "Hampshire"
+msgstr "Hampshire"
+
+#: contrib/localflavor/uk/uk_regions.py:27
+msgid "Hertfordshire"
+msgstr "Hertfordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:28
+msgid "Kent"
+msgstr "Kent"
+
+#: contrib/localflavor/uk/uk_regions.py:29
+msgid "Lancashire"
+msgstr "Lancashire"
+
+#: contrib/localflavor/uk/uk_regions.py:30
+msgid "Leicestershire"
+msgstr "Leicestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:31
+msgid "Lincolnshire"
+msgstr "Lincolnshire"
+
+#: contrib/localflavor/uk/uk_regions.py:32
+msgid "Merseyside"
+msgstr "Merseyside"
+
+#: contrib/localflavor/uk/uk_regions.py:33
+msgid "Norfolk"
+msgstr "Norfolk"
+
+#: contrib/localflavor/uk/uk_regions.py:34
+msgid "North Yorkshire"
+msgstr "North Yorkshire"
+
+#: contrib/localflavor/uk/uk_regions.py:35
+msgid "Northamptonshire"
+msgstr "Northamptonshire"
+
+#: contrib/localflavor/uk/uk_regions.py:36
+msgid "Northumberland"
+msgstr "Northumberland"
+
+#: contrib/localflavor/uk/uk_regions.py:37
+msgid "Nottinghamshire"
+msgstr "Nottinghamshire"
+
+#: contrib/localflavor/uk/uk_regions.py:38
+msgid "Oxfordshire"
+msgstr "Oxfordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:39
+msgid "Shropshire"
+msgstr "Shropshire"
+
+#: contrib/localflavor/uk/uk_regions.py:40
+msgid "Somerset"
+msgstr "Somerset"
+
+#: contrib/localflavor/uk/uk_regions.py:41
+msgid "South Yorkshire"
+msgstr "South Yorkshire"
+
+#: contrib/localflavor/uk/uk_regions.py:42
+msgid "Staffordshire"
+msgstr "Staffordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:43
+msgid "Suffolk"
+msgstr "Suffolk"
+
+#: contrib/localflavor/uk/uk_regions.py:44
+msgid "Surrey"
+msgstr "Surrey"
+
+#: contrib/localflavor/uk/uk_regions.py:45
+msgid "Tyne and Wear"
+msgstr "Tyne and Wear"
+
+#: contrib/localflavor/uk/uk_regions.py:46
+msgid "Warwickshire"
+msgstr "Warwickshire"
+
+#: contrib/localflavor/uk/uk_regions.py:47
+msgid "West Midlands"
+msgstr "West Midlands"
+
+#: contrib/localflavor/uk/uk_regions.py:48
+msgid "West Sussex"
+msgstr "West Sussex"
+
+#: contrib/localflavor/uk/uk_regions.py:49
+msgid "West Yorkshire"
+msgstr "West Yorkshire"
+
+#: contrib/localflavor/uk/uk_regions.py:50
+msgid "Wiltshire"
+msgstr "Wiltshire"
+
+#: contrib/localflavor/uk/uk_regions.py:51
+msgid "Worcestershire"
+msgstr "Worcestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:55
+msgid "County Antrim"
+msgstr "County Antrim"
+
+#: contrib/localflavor/uk/uk_regions.py:56
+msgid "County Armagh"
+msgstr "County Armagh"
+
+#: contrib/localflavor/uk/uk_regions.py:57
+msgid "County Down"
+msgstr "County Down"
+
+#: contrib/localflavor/uk/uk_regions.py:58
+msgid "County Fermanagh"
+msgstr "County Fermarmagh"
+
+#: contrib/localflavor/uk/uk_regions.py:59
+msgid "County Londonderry"
+msgstr "County Londonderry"
+
+#: contrib/localflavor/uk/uk_regions.py:60
+msgid "County Tyrone"
+msgstr "County Tyrone"
+
+#: contrib/localflavor/uk/uk_regions.py:64
+msgid "Clwyd"
+msgstr "Clwyd"
+
+#: contrib/localflavor/uk/uk_regions.py:65
+msgid "Dyfed"
+msgstr "Dyfed"
+
+#: contrib/localflavor/uk/uk_regions.py:66
+msgid "Gwent"
+msgstr "Gwent"
+
+#: contrib/localflavor/uk/uk_regions.py:67
+msgid "Gwynedd"
+msgstr "Gwynedd"
+
+#: contrib/localflavor/uk/uk_regions.py:68
+msgid "Mid Glamorgan"
+msgstr "Mid Glamorgan"
+
+#: contrib/localflavor/uk/uk_regions.py:69
+msgid "Powys"
+msgstr "Powys"
+
+#: contrib/localflavor/uk/uk_regions.py:70
+msgid "South Glamorgan"
+msgstr "South Glamorgan"
+
+#: contrib/localflavor/uk/uk_regions.py:71
+msgid "West Glamorgan"
+msgstr "West Glamorgan"
+
+#: contrib/localflavor/uk/uk_regions.py:75
+msgid "Borders"
+msgstr "Borders"
+
+#: contrib/localflavor/uk/uk_regions.py:76
+msgid "Central Scotland"
+msgstr "Escocia Central"
+
+#: contrib/localflavor/uk/uk_regions.py:77
+msgid "Dumfries and Galloway"
+msgstr "Dumfries and Galloway"
+
+#: contrib/localflavor/uk/uk_regions.py:78
+msgid "Fife"
+msgstr "Fife"
+
+#: contrib/localflavor/uk/uk_regions.py:79
+msgid "Grampian"
+msgstr "Grampian"
+
+#: contrib/localflavor/uk/uk_regions.py:80
+msgid "Highland"
+msgstr "Highland"
+
+#: contrib/localflavor/uk/uk_regions.py:81
+msgid "Lothian"
+msgstr "Lothian"
+
+#: contrib/localflavor/uk/uk_regions.py:82
+msgid "Orkney Islands"
+msgstr "Orkney Islands"
+
+#: contrib/localflavor/uk/uk_regions.py:83
+msgid "Shetland Islands"
+msgstr "Shetland Islands"
+
+#: contrib/localflavor/uk/uk_regions.py:84
+msgid "Strathclyde"
+msgstr "Strathclyde"
+
+#: contrib/localflavor/uk/uk_regions.py:85
+msgid "Tayside"
+msgstr "Tayside"
+
+#: contrib/localflavor/uk/uk_regions.py:86
+msgid "Western Isles"
+msgstr "Western Isles"
+
+#: contrib/localflavor/uk/uk_regions.py:90
+msgid "England"
+msgstr "Inglaterra"
+
+#: contrib/localflavor/uk/uk_regions.py:91
+msgid "Northern Ireland"
+msgstr "Irlanda del Norte"
+
+#: contrib/localflavor/uk/uk_regions.py:92
+msgid "Scotland"
+msgstr "Escocia"
+
+#: contrib/localflavor/uk/uk_regions.py:93
+msgid "Wales"
+msgstr "Gales"
+
+#: contrib/localflavor/us/forms.py:16
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "Introduzca un zip code en el formato XXXXX o XXXXX-XXXX."
+
+#: contrib/localflavor/us/forms.py:54
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr "Introduzca un Número de Seguridad Social en formato XXX-XX-XXXX."
+
+#: contrib/localflavor/za/forms.py:20
+msgid "Enter a valid South African ID number"
+msgstr "Introduzca un número ID de Sudáfrica válido."
+
+#: contrib/localflavor/za/forms.py:54
+msgid "Enter a valid South African postal code"
+msgstr "Introduzca un código postal de Sudáfrica válido."
+
+#: contrib/localflavor/za/za_provinces.py:4
+msgid "Eastern Cape"
+msgstr "Eastern Cape"
+
+#: contrib/localflavor/za/za_provinces.py:5
+msgid "Free State"
+msgstr "Free State"
+
+#: contrib/localflavor/za/za_provinces.py:6
+msgid "Gauteng"
+msgstr "Gauteng"
+
+#: contrib/localflavor/za/za_provinces.py:7
+msgid "KwaZulu-Natal"
+msgstr "KwaZulu-Natal"
+
+#: contrib/localflavor/za/za_provinces.py:8
+msgid "Limpopo"
+msgstr "Limpopo"
+
+#: contrib/localflavor/za/za_provinces.py:9
+msgid "Mpumalanga"
+msgstr "Mpumalanga"
+
+#: contrib/localflavor/za/za_provinces.py:10
+msgid "Northern Cape"
+msgstr "Northern Cape"
+
+#: contrib/localflavor/za/za_provinces.py:11
+msgid "North West"
+msgstr "North West"
+
+#: contrib/localflavor/za/za_provinces.py:12
+msgid "Western Cape"
+msgstr "Western Cape"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "redirigir desde"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Esta ruta debe ser absoluta, excluyendo el nombre de dominio. Ejemplo: '/"
+"events/search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "redirigir a"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Esto puede ser bien una ruta absoluta (como arriba) o una URL completa que "
+"empiece con 'http://'."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "redirección"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "redirecciones"
+
+#: contrib/sessions/models.py:45
+msgid "session key"
+msgstr "clave de sesión"
+
+#: contrib/sessions/models.py:47
+msgid "session data"
+msgstr "datos de sesión"
+
+#: contrib/sessions/models.py:48
+msgid "expire date"
+msgstr "fecha de caducidad"
+
+#: contrib/sessions/models.py:53
+msgid "session"
+msgstr "sesión"
+
+#: contrib/sessions/models.py:54
+msgid "sessions"
+msgstr "sesiones"
+
+#: contrib/sites/models.py:32
+msgid "domain name"
+msgstr "nombre de dominio"
+
+#: contrib/sites/models.py:33
+msgid "display name"
+msgstr "nombre para visualizar"
+
+#: contrib/sites/models.py:39
+msgid "sites"
+msgstr "sitios"
+
+#: core/validators.py:80
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr ""
+"Este valor debe contener sólo letras, números, guiones bajos o guiones."
+
+#: core/validators.py:84
+msgid "Uppercase letters are not allowed here."
+msgstr "No se admiten letras mayúsculas."
+
+#: core/validators.py:88
+msgid "Lowercase letters are not allowed here."
+msgstr "No se admiten letras minúsculas."
+
+#: core/validators.py:95
+msgid "Enter only digits separated by commas."
+msgstr "Introduzca sólo dígitos separados por comas."
+
+#: core/validators.py:107
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Introduzca direcciones de correo válidas separadas por comas."
+
+#: core/validators.py:111
+msgid "Please enter a valid IP address."
+msgstr "Por favor introduzca una dirección IP válida."
+
+#: core/validators.py:115
+msgid "Empty values are not allowed here."
+msgstr "No se admiten valores vacíos."
+
+#: core/validators.py:119
+msgid "Non-numeric characters aren't allowed here."
+msgstr "No se admiten caracteres no numéricos."
+
+#: core/validators.py:123
+msgid "This value can't be comprised solely of digits."
+msgstr "Este valor no puede estar formado sólo por dígitos."
+
+#: core/validators.py:128 forms/fields.py:161
+msgid "Enter a whole number."
+msgstr "Introduzca un número entero."
+
+#: core/validators.py:132
+msgid "Only alphabetical characters are allowed here."
+msgstr "Sólo se admiten caracteres alfabéticos."
+
+#: core/validators.py:147
+#, python-format
+msgid "Invalid date: %s"
+msgstr "Fecha no válida: %s"
+
+#: core/validators.py:152 db/models/fields/__init__.py:546
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Introduzca una fecha válida en formato AAAA-MM-DD."
+
+#: core/validators.py:157
+msgid "Enter a valid time in HH:MM format."
+msgstr "Introduzca un valor de hora válido en formato HH:MM."
+
+#: core/validators.py:161
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Introduzca un valor de fecha/hora válido en formato AAAA-MM-DD HH:MM."
+
+#: core/validators.py:166 forms/fields.py:422
+msgid "Enter a valid e-mail address."
+msgstr "Introduzca una dirección de correo electrónico válida"
+
+#: core/validators.py:178 core/validators.py:470 forms/fields.py:440
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+"No se envió un archivo. Verifique el tipo de codificación en el formulario."
+
+#: core/validators.py:189 forms/fields.py:471
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Envíe una imagen válida. El archivo que ha enviado no era una imagen o se "
+"trataba de una imagen corrupta."
+
+#: core/validators.py:196
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "La URL %s no apunta a una imagen válida."
+
+#: core/validators.py:200
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Los números telefónicos deben respetar el formato XXX-XXX-XXXX. \"%s\" no es "
+"válido."
+
+#: core/validators.py:208
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "La URL %s no apunta a un video QuickTime válido."
+
+#: core/validators.py:212
+msgid "A valid URL is required."
+msgstr "Se precisa una URL válida."
+
+#: core/validators.py:226
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Se precisa HTML válido. Los errores específicos son:\n"
+"%s"
+
+#: core/validators.py:233
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "XML mal formado: %s"
+
+#: core/validators.py:250
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "URL no válida: %s"
+
+#: core/validators.py:255 core/validators.py:257
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "La URL %s es un enlace roto."
+
+#: core/validators.py:263
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Introduzca una abreviatura válida de estado de los EE.UU."
+
+#: core/validators.py:277
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "¡Vigila tu boca! Aquí no admitimos la palabra %s."
+msgstr[1] "¡Vigila tu boca! Aquí no admitimos las palabras %s."
+
+#: core/validators.py:284
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Este campo debe concordar con el campo '%s'."
+
+#: core/validators.py:303
+msgid "Please enter something for at least one field."
+msgstr "Por favor, introduzca algo en al menos un campo."
+
+#: core/validators.py:312 core/validators.py:323
+msgid "Please enter both fields or leave them both empty."
+msgstr "Por favor, rellene ambos campos o deje ambos vacíos."
+
+#: core/validators.py:331
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Se debe proporcionar este campo si %(field)s es %(value)s"
+
+#: core/validators.py:344
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Se debe proporcionar este campo si %(field)s no es %(value)s"
+
+#: core/validators.py:363
+msgid "Duplicate values are not allowed."
+msgstr "No se admiten valores duplicados."
+
+#: core/validators.py:378
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Este valor debe estar entre %(lower)s y %(upper)s."
+
+#: core/validators.py:380
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Este valor debe ser al menos %s."
+
+#: core/validators.py:382
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Este valor debe ser no mayor que %s."
+
+#: core/validators.py:423
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Este valor debe ser una potencia de %s."
+
+#: core/validators.py:433
+msgid "Please enter a valid decimal number."
+msgstr "Por favor, introduzca un número decimal válido."
+
+#: core/validators.py:440
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] ""
+"Por favor, introduzca un número decimal válido con un máximo de un dígito en "
+"total."
+msgstr[1] ""
+"Por favor, introduzca un número decimal válido con un maximo de %s dígitos "
+"en total."
+
+#: core/validators.py:443
+#, python-format
+msgid ""
+"Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural ""
+"Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] ""
+"Por favor, introduzca un número decimal válido con un dígito entero como "
+"máximo."
+msgstr[1] ""
+"Por favor, introduzca un número decimal válido con un máximo de %s dígitos "
+"enteros."
+
+#: core/validators.py:446
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] ""
+"Por favor, introduzca un número decimal válido con un máximo de una posición "
+"decimal."
+msgstr[1] ""
+"Por favor, introduzca un número decimal válido con un máximo de %s "
+"posiciones decimales."
+
+#: core/validators.py:454
+msgid "Please enter a valid floating point number."
+msgstr "Por favor introduzca un número de punto flotante válido."
+
+#: core/validators.py:463
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr ""
+"Asegúrese de que el archivo que envía es de un tamaño mínimo de %s bytes."
+
+#: core/validators.py:464
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr ""
+"Asegúrese de que el archivo que envía es de un tamaño máximo de %s bytes."
+
+#: core/validators.py:481
+msgid "The format for this field is wrong."
+msgstr "El formato de este campo es incorrecto."
+
+#: core/validators.py:496
+msgid "This field is invalid."
+msgstr "Este campo no es válido."
+
+#: core/validators.py:532
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "No se pudo obtener nada de %s."
+
+#: core/validators.py:535
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"La URL %(url)s devolvió la cabecera Content-Type '%(contenttype)s', que no "
+"es válida."
+
+#: core/validators.py:568
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Por favor, cierre la etiqueta %(tag)s de la línea %(line)s. (La línea "
+"empieza con \"%(start)s\".)"
+
+#: core/validators.py:572
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Parte del texto que comienza en la línea %(line)s no está permitido en ese "
+"contexto. (La línea empieza con \"%(start)s\".)"
+
+#: core/validators.py:577
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"El \"%(attr)s\" de la línea %(line)s no es un atributo válido. (La línea "
+"empieza con \"%(start)s\".)"
+
+#: core/validators.py:582
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"La \"<%(tag)s>\" de la línea %(line)s no es una etiqueta válida. (La línea "
+"empieza con \"%(start)s\".)"
+
+#: core/validators.py:586
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"A una etiqueta de la línea %(line)s le faltan uno o más atributos "
+"requeridos. (La línea empieza con \"%(start)s\".)"
+
+#: core/validators.py:591
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"El atributo \"%(attr)s\" de la línea %(line)s tiene un valor que no es "
+"válido. (La línea empieza con \"%(start)s\".)"
+
+#: db/models/manipulators.py:304
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "Ya existe un(a) %(object)s con este/a %(type)s para %(field)s."
+
+#: db/models/fields/__init__.py:46
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "Ya existe %(optname)s con este %(fieldname)s."
+
+#: db/models/fields/__init__.py:320 db/models/fields/files.py:168
+#: db/models/fields/files.py:179 forms/fields.py:52 oldforms/__init__.py:370
+msgid "This field is required."
+msgstr "Este campo es obligatorio."
+
+#: db/models/fields/__init__.py:434
+msgid "This value must be an integer."
+msgstr "Este valor debe ser un número entero."
+
+#: db/models/fields/__init__.py:480
+msgid "This value must be either True or False."
+msgstr "Este valor debe ser True o False."
+
+#: db/models/fields/__init__.py:509
+msgid "This field cannot be null."
+msgstr "Este campo no puede ser nulo."
+
+#: db/models/fields/__init__.py:611 db/models/fields/__init__.py:628
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format."
+msgstr "Introduzca un valor de fecha/hora válido en formato AAAA-MM-DD HH:MM[:ss[.uuuuuu]]."
+
+#: db/models/fields/__init__.py:684
+msgid "This value must be a decimal number."
+msgstr "Este valor debe ser un número decimal."
+
+#: db/models/fields/__init__.py:825
+msgid "This value must be either None, True or False."
+msgstr "Este valor debe ser None, True o False."
+
+#: db/models/fields/__init__.py:937 db/models/fields/__init__.py:950
+msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format."
+msgstr "Introduzca un valor de hora válido en formato HH:MM[:ss[.uuuuuu]]."
+
+#: db/models/fields/files.py:188
+msgid "Enter a valid filename."
+msgstr "Introduzca un nombre de archivo válido."
+
+#: db/models/fields/related.py:92
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Por favor, introduzca un %s válido."
+
+#: db/models/fields/related.py:759
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Mantenga presionada \"Control\" (\"Command\" en una Mac) para seleccionar "
+"más de uno."
+
+#: db/models/fields/related.py:839
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+"Por favor, introduzca IDs de %(self)s válidos. El valor %(value)r no es "
+"válido."
+msgstr[1] ""
+"Por favor, introduzca IDs de %(self)s válidos. Los valores %(value)r no son "
+"válidos."
+
+#: forms/fields.py:53
+msgid "Enter a valid value."
+msgstr "Introduzca un valor válido."
+
+#: forms/fields.py:133
+#, python-format
+msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+msgstr ""
+"Asegúrese de que este valor tenga como máximo %(max)d caracteres (tiene %"
+"(length)d)."
+
+#: forms/fields.py:134
+#, python-format
+msgid "Ensure this value has at least %(min)d characters (it has %(length)d)."
+msgstr ""
+"Asegúrese de que este valor tenga al menos %(min)d caracteres (tiene %"
+"(length)d)."
+
+#: forms/fields.py:162 forms/fields.py:191 forms/fields.py:220
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Asegúrese de que este valor sea menor o igual a %s."
+
+#: forms/fields.py:163 forms/fields.py:192 forms/fields.py:221
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Asegúrese de que este valor sea mayor o igual a %s."
+
+#: forms/fields.py:190 forms/fields.py:219
+msgid "Enter a number."
+msgstr "Introduzca un número."
+
+#: forms/fields.py:222
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr "Asegúrese de que no existan en total mas de %s dígitos."
+
+#: forms/fields.py:223
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr "Asegúrese de que no existan mas de %s lugares decimales."
+
+#: forms/fields.py:224
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr "Asegúrese de que no existan mas de %s dígitos antes del punto decimal."
+
+#: forms/fields.py:282 forms/fields.py:803
+msgid "Enter a valid date."
+msgstr "Introduzca una fecha válida."
+
+#: forms/fields.py:315 forms/fields.py:804
+msgid "Enter a valid time."
+msgstr "Introduzca un valor de hora válido."
+
+#: forms/fields.py:354
+msgid "Enter a valid date/time."
+msgstr "Introduzca un valor de fecha/hora válido."
+
+#: forms/fields.py:441
+msgid "No file was submitted."
+msgstr "No se envió ningún archivo."
+
+#: forms/fields.py:442 oldforms/__init__.py:689
+msgid "The submitted file is empty."
+msgstr "El archivo enviado está vacío."
+
+#: forms/fields.py:532
+msgid "Enter a valid URL."
+msgstr "Introduzca una URL válida."
+
+#: forms/fields.py:533
+msgid "This URL appears to be a broken link."
+msgstr "La URL parece ser un enlace roto."
+
+#: forms/fields.py:601 forms/fields.py:652
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr ""
+"Seleccione una opción válida. %(value)s no es una de las opciones "
+"disponibles."
+
+#: forms/fields.py:653 forms/fields.py:714 forms/models.py:528
+msgid "Enter a list of values."
+msgstr "Introduzca una lista de valores."
+
+#: forms/fields.py:832
+msgid "Enter a valid IPv4 address."
+msgstr "Introduzca una dirección IPv4 válida"
+
+#: forms/models.py:461
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr ""
+"Seleccione una opción válida. Esa opción no es una de las opciones "
+"disponibles."
+
+#: forms/models.py:529
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr ""
+"Seleccione una opción válida. %s no es una de las opciones disponibles."
+
+#: oldforms/__init__.py:405
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Asegúrese de que su texto tiene menos de %s caracter."
+msgstr[1] "Asegúrese de que su texto tiene menos de %s caracteres."
+
+#: oldforms/__init__.py:410
+msgid "Line breaks are not allowed here."
+msgstr "No se permiten saltos de línea."
+
+#: oldforms/__init__.py:508 oldforms/__init__.py:582 oldforms/__init__.py:621
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Seleccione una opción válida; '%(data)s' no está en %(choices)s."
+
+#: oldforms/__init__.py:750
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Introduzca un número entero entre -32.768 y 32.767."
+
+#: oldforms/__init__.py:760
+msgid "Enter a positive number."
+msgstr "Introduzca un número positivo."
+
+#: oldforms/__init__.py:770
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Introduzca un número entero entre 0 y 32.767."
+
+#: template/defaultfilters.py:698
+msgid "yes,no,maybe"
+msgstr "si,no,talvez"
+
+#: template/defaultfilters.py:729
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d byte"
+msgstr[1] "%(size)d bytes"
+
+#: template/defaultfilters.py:731
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f KB"
+
+#: template/defaultfilters.py:733
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: template/defaultfilters.py:734
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#: utils/dateformat.py:41
+msgid "p.m."
+msgstr "p.m."
+
+#: utils/dateformat.py:42
+msgid "a.m."
+msgstr "a.m."
+
+#: utils/dateformat.py:47
+msgid "PM"
+msgstr "PM"
+
+#: utils/dateformat.py:48
+msgid "AM"
+msgstr "AM"
+
+#: utils/dateformat.py:97
+msgid "midnight"
+msgstr "medianoche"
+
+#: utils/dateformat.py:99
+msgid "noon"
+msgstr "mediodía"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Lunes"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Martes"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Miércoles"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Jueves"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Viernes"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Sábado"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Domingo"
+
+#: utils/dates.py:10
+msgid "Mon"
+msgstr "Lun"
+
+#: utils/dates.py:10
+msgid "Tue"
+msgstr "Mar"
+
+#: utils/dates.py:10
+msgid "Wed"
+msgstr "Mie"
+
+#: utils/dates.py:10
+msgid "Thu"
+msgstr "Jue"
+
+#: utils/dates.py:10
+msgid "Fri"
+msgstr "Vie"
+
+#: utils/dates.py:11
+msgid "Sat"
+msgstr "Sab"
+
+#: utils/dates.py:11
+msgid "Sun"
+msgstr "Dom"
+
+#: utils/dates.py:18
+msgid "January"
+msgstr "Enero"
+
+#: utils/dates.py:18
+msgid "February"
+msgstr "Febrero"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "March"
+msgstr "Marzo"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "April"
+msgstr "Abril"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "May"
+msgstr "Mayo"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "June"
+msgstr "Junio"
+
+#: utils/dates.py:19 utils/dates.py:31
+msgid "July"
+msgstr "Julio"
+
+#: utils/dates.py:19
+msgid "August"
+msgstr "Agosto"
+
+#: utils/dates.py:19
+msgid "September"
+msgstr "Setiembre"
+
+#: utils/dates.py:19
+msgid "October"
+msgstr "Octubre"
+
+#: utils/dates.py:19
+msgid "November"
+msgstr "Noviembre"
+
+#: utils/dates.py:20
+msgid "December"
+msgstr "Diciembre"
+
+#: utils/dates.py:23
+msgid "jan"
+msgstr "ene"
+
+#: utils/dates.py:23
+msgid "feb"
+msgstr "feb"
+
+#: utils/dates.py:23
+msgid "mar"
+msgstr "mar"
+
+#: utils/dates.py:23
+msgid "apr"
+msgstr "abr"
+
+#: utils/dates.py:23
+msgid "may"
+msgstr "may"
+
+#: utils/dates.py:23
+msgid "jun"
+msgstr "jun"
+
+#: utils/dates.py:24
+msgid "jul"
+msgstr "jul"
+
+#: utils/dates.py:24
+msgid "aug"
+msgstr "ago"
+
+#: utils/dates.py:24
+msgid "sep"
+msgstr "set"
+
+#: utils/dates.py:24
+msgid "oct"
+msgstr "oct"
+
+#: utils/dates.py:24
+msgid "nov"
+msgstr "nov"
+
+#: utils/dates.py:24
+msgid "dec"
+msgstr "dic"
+
+#: utils/dates.py:31
+msgid "Jan."
+msgstr "Enero"
+
+#: utils/dates.py:31
+msgid "Feb."
+msgstr "Feb."
+
+#: utils/dates.py:32
+msgid "Aug."
+msgstr "Ago."
+
+#: utils/dates.py:32
+msgid "Sept."
+msgstr "Set."
+
+#: utils/dates.py:32
+msgid "Oct."
+msgstr "Oct."
+
+#: utils/dates.py:32
+msgid "Nov."
+msgstr "Nov."
+
+#: utils/dates.py:32
+msgid "Dec."
+msgstr "Dic."
+
+#: utils/text.py:128
+msgid "or"
+msgstr "o"
+
+#: utils/timesince.py:21
+msgid "year"
+msgid_plural "years"
+msgstr[0] "año"
+msgstr[1] "años"
+
+#: utils/timesince.py:22
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mes"
+msgstr[1] "meses"
+
+#: utils/timesince.py:23
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "semana"
+msgstr[1] "semanas"
+
+#: utils/timesince.py:24
+msgid "day"
+msgid_plural "days"
+msgstr[0] "día"
+msgstr[1] "días"
+
+#: utils/timesince.py:25
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "hora"
+msgstr[1] "horas"
+
+#: utils/timesince.py:26
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuto"
+msgstr[1] "minutos"
+
+#: utils/timesince.py:46
+msgid "minutes"
+msgstr "minutos"
+
+#: utils/timesince.py:51
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr "%(number)d %(type)s"
+
+#: utils/timesince.py:57
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ", %(number)d %(type)s"
+
+#: utils/translation/trans_real.py:401
+msgid "DATE_FORMAT"
+msgstr "j N Y"
+
+#: utils/translation/trans_real.py:402
+msgid "DATETIME_FORMAT"
+msgstr "j N Y P"
+
+#: utils/translation/trans_real.py:403
+msgid "TIME_FORMAT"
+msgstr "P"
+
+#: utils/translation/trans_real.py:419
+msgid "YEAR_MONTH_FORMAT"
+msgstr "F Y"
+
+#: utils/translation/trans_real.py:420
+msgid "MONTH_DAY_FORMAT"
+msgstr "j \\de F"
+
+#: views/generic/create_update.py:114
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "Se creó con éxito %(verbose_name)s."
+
+#: views/generic/create_update.py:156
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "Se actualizó con éxito %(verbose_name)s."
+
+#: views/generic/create_update.py:198
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "Se eliminó %(verbose_name)s."
+
+#~ msgid "Your new password is: %(new_password)s"
+#~ msgstr "Su nueva contraseña es: %(new_password)s"
+
+#~ msgid "Feel free to change this password by going to this page:"
+#~ msgstr "Puede cambiarla accediendo a esta página:"
+
+#~ msgid "Year must be 1900 or later."
+#~ msgstr "El año debe ser 1900 o posterior."
+
+#~ msgid "Gaeilge"
+#~ msgstr "Irlandés"
+
+#~ msgid "Brazilian"
+#~ msgstr "Brasileño"
+
+#~ msgid "Ordering"
+#~ msgstr "Ordenación"
+
+#~ msgid "Order:"
+#~ msgstr "Orden:"
+
+#~ msgid "Added %s."
+#~ msgstr "Agregado %s."
+
+#~ msgid "Deleted %s."
+#~ msgstr "Eliminó %s."
+
+#~ msgid "The two 'new password' fields didn't match."
+#~ msgstr "Los dos campos 'nueva contraseña' no coinciden entre si."
+
+#~ msgid "Separate multiple IDs with commas."
+#~ msgstr "Separe múltiples identificadores con comas."
+
+#~ msgid ""
+#~ "Enter a postcode. A space is required between the two postcode parts."
+#~ msgstr ""
+#~ "Introduzca un postcode. Se requiere un espacio entre las dos secciones "
+#~ "del mismo."
+
+#~ msgid "%d milliseconds"
+#~ msgstr "%d milisegundos"
+
+#~ msgid "AnonymousUser"
+#~ msgstr "UsuarioAnonimo"
+
+#~ msgid "Use '[algo]$[salt]$[hexdigest]'"
+#~ msgstr "Use '[algoritmo]$[salt]$[hexdigest]'"
+
+#~ msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+#~ msgstr "¿Ha <a href=\"/password_reset/\">olvidado su contraseña</a>?"
+
+#~ msgid "%(content_type_name)s"
+#~ msgstr "tipos de contenido"
+
+#~ msgid "%(result_count)s result"
+#~ msgid_plural "%(counter)s results"
+#~ msgstr[0] "un resultado"
+#~ msgstr[1] "%(counter)s resultados"
+
+#~ msgid "Comment"
+#~ msgstr "Comentario"
+
+#~ msgid "Comments"
+#~ msgstr "Comentarios"
+
+#~ msgid "String (up to 50)"
+#~ msgstr "Cadena (máximo 50)"
+
+#~ msgid "label"
+#~ msgstr "etiqueta"
+
+#~ msgid "package"
+#~ msgstr "paquete"
+
+#~ msgid "packages"
+#~ msgstr "paquetes"
diff --git a/webapp/django/conf/locale/es_AR/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/es_AR/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..b7683ea
--- /dev/null
+++ b/webapp/django/conf/locale/es_AR/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/es_AR/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/es_AR/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..32a37eb
--- /dev/null
+++ b/webapp/django/conf/locale/es_AR/LC_MESSAGES/djangojs.po
@@ -0,0 +1,118 @@
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-10-06 14:18-0300\n"
+"PO-Revision-Date: 2007-07-14 14:36-0300\n"
+"Last-Translator: Ramiro Morales <rm0@gmx.net>\n"
+"Language-Team: Django-I18N <django-i18n@googlegroups.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "%s disponibles"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Seleccionar todos"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Agregar"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Eliminar"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "%s elegidos"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Seleccione los items a agregar y haga click en "
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Eliminar todos"
+
+#: contrib/admin/media/js/calendar.js:24
+#: contrib/admin/media/js/dateparse.js:32
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Enero Febrero Marzo Abril Mayo Junio Julio Agosto Setiembre Octubre "
+"Noviembre Diciembre"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "D L M M J V S"
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Domingo Lunes Martes Miércoles Jueves Viernes Sábado"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr "Mostrar"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr "Ocultar"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Now"
+msgstr "Ahora"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
+msgid "Clock"
+msgstr "Reloj"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
+msgid "Choose a time"
+msgstr "Elija una hora"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "Midnight"
+msgstr "Medianoche"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "6 a.m."
+msgstr "6 a.m."
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
+msgid "Noon"
+msgstr "Mediodía"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
+msgid "Today"
+msgstr "Hoy"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
+msgid "Calendar"
+msgstr "Calendario"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
+msgid "Yesterday"
+msgstr "Ayer"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
+msgid "Tomorrow"
+msgstr "Mañana"
diff --git a/webapp/django/conf/locale/et/LC_MESSAGES/django.mo b/webapp/django/conf/locale/et/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..2915706
--- /dev/null
+++ b/webapp/django/conf/locale/et/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/et/LC_MESSAGES/django.po b/webapp/django/conf/locale/et/LC_MESSAGES/django.po
new file mode 100644
index 0000000..d8d33be
--- /dev/null
+++ b/webapp/django/conf/locale/et/LC_MESSAGES/django.po
@@ -0,0 +1,4496 @@
+# Estonian translation for the Django Project.
+# Copyright (C) 2008, Django Project
+# This file is distributed under the same license as the django package.
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-08-21 01:56+0300\n"
+"PO-Revision-Date: 2008-06-17 12:29+0300\n"
+"Last-Translator: Erik Allik <removethis-eallik_at_gmail-com>\n"
+"Language-Team: Django-i18n <django-i18n@googlegroups.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: conf/global_settings.py:44
+msgid "Arabic"
+msgstr "araabia"
+
+#: conf/global_settings.py:45
+msgid "Bengali"
+msgstr "bengali"
+
+#: conf/global_settings.py:46
+msgid "Bulgarian"
+msgstr "bulgaaria"
+
+#: conf/global_settings.py:47
+msgid "Catalan"
+msgstr "katalaani"
+
+#: conf/global_settings.py:48
+msgid "Czech"
+msgstr "tšehhi"
+
+#: conf/global_settings.py:49
+msgid "Welsh"
+msgstr "uelsi"
+
+#: conf/global_settings.py:50
+msgid "Danish"
+msgstr "taani"
+
+#: conf/global_settings.py:51
+msgid "German"
+msgstr "saksa"
+
+#: conf/global_settings.py:52
+msgid "Greek"
+msgstr "kreeka"
+
+#: conf/global_settings.py:53
+msgid "English"
+msgstr "inglise"
+
+#: conf/global_settings.py:54
+msgid "Spanish"
+msgstr "hispaania"
+
+#: conf/global_settings.py:55
+msgid "Estonian"
+msgstr "eesti"
+
+#: conf/global_settings.py:56
+msgid "Argentinean Spanish"
+msgstr "argentiina hispaania"
+
+#: conf/global_settings.py:57
+msgid "Basque"
+msgstr "baski"
+
+#: conf/global_settings.py:58
+msgid "Persian"
+msgstr "pärsia"
+
+#: conf/global_settings.py:59
+msgid "Finnish"
+msgstr "soome"
+
+#: conf/global_settings.py:60
+msgid "French"
+msgstr "prantsuse"
+
+#: conf/global_settings.py:61
+msgid "Irish"
+msgstr "iiri"
+
+#: conf/global_settings.py:62
+msgid "Galician"
+msgstr "galiitsia"
+
+#: conf/global_settings.py:63
+msgid "Hungarian"
+msgstr "ungari"
+
+#: conf/global_settings.py:64
+msgid "Hebrew"
+msgstr "heebrea"
+
+#: conf/global_settings.py:65
+msgid "Croatian"
+msgstr "horvaatia"
+
+#: conf/global_settings.py:66
+msgid "Icelandic"
+msgstr "islandi"
+
+#: conf/global_settings.py:67
+msgid "Italian"
+msgstr "itaalia"
+
+#: conf/global_settings.py:68
+msgid "Japanese"
+msgstr "jaapani"
+
+#: conf/global_settings.py:69
+msgid "Georgian"
+msgstr "gruusia"
+
+#: conf/global_settings.py:70
+msgid "Korean"
+msgstr "korea"
+
+#: conf/global_settings.py:71
+msgid "Khmer"
+msgstr "khmeri"
+
+#: conf/global_settings.py:72
+msgid "Kannada"
+msgstr "kannada"
+
+#: conf/global_settings.py:73
+msgid "Latvian"
+msgstr "läti"
+
+#: conf/global_settings.py:74
+msgid "Lithuanian"
+msgstr "leedu"
+
+#: conf/global_settings.py:75
+msgid "Macedonian"
+msgstr "makedoonia"
+
+#: conf/global_settings.py:76
+msgid "Dutch"
+msgstr "hollandi"
+
+#: conf/global_settings.py:77
+msgid "Norwegian"
+msgstr "norra"
+
+#: conf/global_settings.py:78
+msgid "Polish"
+msgstr "poola"
+
+#: conf/global_settings.py:79
+msgid "Portugese"
+msgstr "portugali"
+
+#: conf/global_settings.py:80
+msgid "Brazilian Portuguese"
+msgstr "brasiilia portugali"
+
+#: conf/global_settings.py:81
+msgid "Romanian"
+msgstr "rumeenia"
+
+#: conf/global_settings.py:82
+msgid "Russian"
+msgstr "vene"
+
+#: conf/global_settings.py:83
+msgid "Slovak"
+msgstr "slovaki"
+
+#: conf/global_settings.py:84
+msgid "Slovenian"
+msgstr "sloveeni"
+
+#: conf/global_settings.py:85
+msgid "Serbian"
+msgstr "serbia"
+
+#: conf/global_settings.py:86
+msgid "Swedish"
+msgstr "rootsi"
+
+#: conf/global_settings.py:87
+msgid "Tamil"
+msgstr "tamiili"
+
+#: conf/global_settings.py:88
+msgid "Telugu"
+msgstr "telugu"
+
+#: conf/global_settings.py:89
+msgid "Turkish"
+msgstr "türgi"
+
+#: conf/global_settings.py:90
+msgid "Ukrainian"
+msgstr "ukrania"
+
+#: conf/global_settings.py:91
+msgid "Simplified Chinese"
+msgstr "lihtsustatud hiina"
+
+#: conf/global_settings.py:92
+msgid "Traditional Chinese"
+msgstr "traditsiooniline hiina"
+
+#: contrib/admin/filterspecs.py:44
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>%s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:74 contrib/admin/filterspecs.py:92
+#: contrib/admin/filterspecs.py:147 contrib/admin/filterspecs.py:173
+msgid "All"
+msgstr "Kõik"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Any date"
+msgstr "Suvaline kuupäev"
+
+#: contrib/admin/filterspecs.py:114
+msgid "Today"
+msgstr "Täna"
+
+#: contrib/admin/filterspecs.py:117
+msgid "Past 7 days"
+msgstr "Viimased 7 päeva"
+
+#: contrib/admin/filterspecs.py:119
+msgid "This month"
+msgstr "Käesolev kuu"
+
+#: contrib/admin/filterspecs.py:121
+msgid "This year"
+msgstr "Käesolev aasta"
+
+#: contrib/admin/filterspecs.py:147 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "Yes"
+msgstr "Jah"
+
+#: contrib/admin/filterspecs.py:147 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "No"
+msgstr "Ei"
+
+#: contrib/admin/filterspecs.py:154 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "Unknown"
+msgstr "Tundmatu"
+
+#: contrib/admin/models.py:19
+msgid "action time"
+msgstr "toimingu aeg"
+
+#: contrib/admin/models.py:22
+msgid "object id"
+msgstr "objekti id"
+
+#: contrib/admin/models.py:23
+msgid "object repr"
+msgstr "objekti esitus"
+
+#: contrib/admin/models.py:24
+msgid "action flag"
+msgstr "toimingu lipp"
+
+#: contrib/admin/models.py:25
+msgid "change message"
+msgstr "muudatuse tekst"
+
+#: contrib/admin/models.py:28
+msgid "log entry"
+msgstr "logisissekanne"
+
+#: contrib/admin/models.py:29
+msgid "log entries"
+msgstr "logisissekanded"
+
+#: contrib/admin/options.py:56 contrib/admin/options.py:115
+msgid "None"
+msgstr "puudub"
+
+#: contrib/admin/options.py:326
+#, python-format
+msgid "Changed %s."
+msgstr "Muutsin %s."
+
+#: contrib/admin/options.py:326 contrib/admin/options.py:336
+#: core/validators.py:279 db/models/manipulators.py:305
+msgid "and"
+msgstr "ja"
+
+#: contrib/admin/options.py:331
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Lisatud %(name)s \"%(object)s\"."
+
+#: contrib/admin/options.py:335
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Muudetud %(list)s objektil %(name)s \"%(object)s\"."
+
+#: contrib/admin/options.py:340
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Kustutatud %(name)s \"%(object)s\"."
+
+#: contrib/admin/options.py:344
+msgid "No fields changed."
+msgstr "Ühtegi välja ei muudetud."
+
+#: contrib/admin/options.py:405 contrib/auth/admin.py:50
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" lisamine õnnestus."
+
+#: contrib/admin/options.py:409 contrib/admin/options.py:442
+#: contrib/auth/admin.py:55
+msgid "You may edit it again below."
+msgstr "Te võite selle muutmist jätkata."
+
+#: contrib/admin/options.py:419 contrib/admin/options.py:452
+#, python-format
+msgid "You may add another %s below."
+msgstr "Te võite lisada uue objekti %s"
+
+#: contrib/admin/options.py:440
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Objekti %(name)s \"%(obj)s\" muutmine õnnestus."
+
+#: contrib/admin/options.py:448
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "Objekti %(name)s \"%(obj)s\" lisamine õnnestus. Te võite seda muuta."
+
+#: contrib/admin/options.py:514
+#, python-format
+msgid "Add %s"
+msgstr "Lisa %s"
+
+#: contrib/admin/options.py:591
+#, python-format
+msgid "Change %s"
+msgstr "Muuda %s"
+
+#: contrib/admin/options.py:622
+msgid "Database error"
+msgstr "Andmebaasi viga"
+
+#: contrib/admin/options.py:671
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Objekti %(name)s \"%(obj)s\" kustutamine õnnestus."
+
+#: contrib/admin/options.py:678
+msgid "Are you sure?"
+msgstr "Kas olete kindel?"
+
+#: contrib/admin/options.py:705
+#, python-format
+msgid "Change history: %s"
+msgstr "Muudatuste ajalugu: %s"
+
+#: contrib/admin/sites.py:18 contrib/admin/views/decorators.py:16
+#: contrib/auth/forms.py:72 contrib/comments/views/comments.py:56
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Palun sisestage korrektne kasutajatunnus ja salasõna. Mõlemad väljad on "
+"tõstutundlikud."
+
+#: contrib/admin/sites.py:238 contrib/admin/views/decorators.py:68
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Teie sessioon on aegunud. Palun logige uuesti sisse. Olge mureta: sisestatud "
+"andmed on salvestatud."
+
+#: contrib/admin/sites.py:245 contrib/admin/views/decorators.py:75
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Paistab, et Teie brauser ei aktsepteeri küpsiseid. Palun võimaldage küpsised "
+"ning seejärel laadige see leht uuesti."
+
+#: contrib/admin/sites.py:259 contrib/admin/sites.py:265
+#: contrib/admin/views/decorators.py:92
+msgid "Usernames cannot contain the '@' character."
+msgstr "Kasutajatunnused ei tohi sisaldada '@' märki."
+
+#: contrib/admin/sites.py:262 contrib/admin/views/decorators.py:88
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr ""
+"Teie e-posti aadress ei ole sama asi, mis Teie kasutajatunnus. Proovige '%s'."
+
+#: contrib/admin/sites.py:330
+msgid "Site administration"
+msgstr "Saidi administreerimine"
+
+#: contrib/admin/sites.py:352 contrib/admin/templates/admin/login.html:27
+#: contrib/admin/templates/registration/password_reset_complete.html:14
+#: contrib/admin/views/decorators.py:30
+msgid "Log in"
+msgstr "Sisene"
+
+#: contrib/admin/util.py:138
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr ""
+
+#: contrib/admin/util.py:143
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr ""
+
+#: contrib/admin/widgets.py:65
+msgid "Date:"
+msgstr "Kuupäev:"
+
+#: contrib/admin/widgets.py:65
+msgid "Time:"
+msgstr "Aeg:"
+
+#: contrib/admin/widgets.py:89
+msgid "Currently:"
+msgstr "Hetkel:"
+
+#: contrib/admin/widgets.py:89
+msgid "Change:"
+msgstr "Muuda:"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Lehte ei leitud"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Vabandame, kuid soovitud lehte ei leitud."
+
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/change_form.html:17
+#: contrib/admin/templates/admin/change_list.html:8
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/auth/user/change_password.html:10
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_reset_complete.html:4
+#: contrib/admin/templates/registration/password_reset_confirm.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Kodu"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Serveri viga"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Serveri viga (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Serveri Viga <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"On tekkinud viga. Vastavasisuline teavitus on saadetud süsteemi haldajale "
+"ning vea parandamisega tegeletakse esimesel võimalusel. Täname mõistva "
+"suhtumise eest!"
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "Tere tulemast,"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Dokumentatsioon"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:13
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+msgid "Change password"
+msgstr "Muuda salasõna"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/comments/templates/comments/form.html:6
+msgid "Log out"
+msgstr "Logi välja"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django administreerimisliides"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django administreerimisliides"
+
+#: contrib/admin/templates/admin/change_form.html:19
+#: contrib/admin/templates/admin/index.html:29
+msgid "Add"
+msgstr "Lisa"
+
+#: contrib/admin/templates/admin/change_form.html:26
+#: contrib/admin/templates/admin/object_history.html:5
+msgid "History"
+msgstr "Ajalugu"
+
+#: contrib/admin/templates/admin/change_form.html:27
+msgid "View on site"
+msgstr "Näida lehel"
+
+#: contrib/admin/templates/admin/change_form.html:37
+#: contrib/admin/templates/admin/auth/user/change_password.html:22
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Palun parandage allolev viga"
+msgstr[1] "Palun parandage allolevad vead"
+
+#: contrib/admin/templates/admin/change_list.html:16
+#, python-format
+msgid "Add %(name)s"
+msgstr "Lisa %(name)s"
+
+#: contrib/admin/templates/admin/change_list.html:26
+msgid "Filter"
+msgstr "Filtreeri"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+#: contrib/admin/templates/admin/edit_inline/tabular.html:15
+msgid "Delete"
+msgstr "Kustuta"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:15
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Selleks, et kustutada %(object_name)s '%(escaped_object)s', on vaja "
+"kustutada lisaks ka kõik seotud objecktid, aga teil puudub õigus järgnevat "
+"tüüpi objektide kustutamiseks:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:22
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Kas olete kindel, et soovite kustutada objekti %(object_name)s \"%"
+"(escaped_object)s\"? Kõik järgnevad seotud objektid kustutatakse koos "
+"sellega:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:27
+msgid "Yes, I'm sure"
+msgstr "Jah, olen kindel"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " %(filter_title)s "
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Rakenduses %(name)s leitud mudelid"
+
+#: contrib/admin/templates/admin/index.html:19
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:35
+msgid "Change"
+msgstr "Muuda"
+
+#: contrib/admin/templates/admin/index.html:45
+msgid "You don't have permission to edit anything."
+msgstr "Teil ei ole õigust midagi muuta."
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "Recent Actions"
+msgstr "Hiljutised Toimingud"
+
+#: contrib/admin/templates/admin/index.html:54
+msgid "My Actions"
+msgstr "Minu Toimingud"
+
+#: contrib/admin/templates/admin/index.html:58
+msgid "None available"
+msgstr "Ei leitud ühtegi"
+
+#: contrib/admin/templates/admin/invalid_setup.html:7
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"On tekkinud viga seoses andmebaasiga. Veenduge, et kõik vajalikud "
+"andmebaasitabelid on loodud  ning et andmebaas on vastava kasutaja poolt "
+"loetav."
+
+#: contrib/admin/templates/admin/login.html:19
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+msgid "Username:"
+msgstr "Kasutajatunnus:"
+
+#: contrib/admin/templates/admin/login.html:22
+#: contrib/comments/templates/comments/form.html:8
+msgid "Password:"
+msgstr "Salasõna:"
+
+#: contrib/admin/templates/admin/object_history.html:16
+msgid "Date/time"
+msgstr "Kuupäev/kellaaeg"
+
+#: contrib/admin/templates/admin/object_history.html:17
+msgid "User"
+msgstr "Kasutaja"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Action"
+msgstr "Toiming"
+
+#: contrib/admin/templates/admin/object_history.html:24
+msgid "DATE_WITH_TIME_FULL"
+msgstr "N j, Y, P"
+
+#: contrib/admin/templates/admin/object_history.html:32
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Sellel objektil puudub muudatuste ajalugu. Tõenäoliselt ei kasutatud selle "
+"objekti lisamisel käesolevat administreerimislidest."
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Näita kõiki"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Mine"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 tulemus"
+msgstr[1] "%(counter)s tulemust"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "Kokku %(full_result_count)s"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Salvesta uuena"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Salvesta ja lisa uus"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Salvesta ja jätka muutmist"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Salvesta"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Kõige pealt sisestage kasutajatunnus ja salasõna, seejärel on võimalik muuta "
+"täiendavaid kasutajaandmeid."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:13
+#: contrib/auth/forms.py:14 contrib/auth/forms.py:51
+msgid "Username"
+msgstr "Kasutajatunnus"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:20
+#: contrib/admin/templates/admin/auth/user/change_password.html:33
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:52 contrib/auth/forms.py:176
+msgid "Password"
+msgstr "Salasõna"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:26
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+#: contrib/auth/forms.py:177
+msgid "Password (again)"
+msgstr "Salasõna (uuesti)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:27
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+msgid "Enter the same password as above, for verification."
+msgstr ""
+"Sisestage sama salasõna uuesti veendumaks, et sisestamisel ei tekkinud vigu"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:26
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Sisestage uus salasõna kasutajale <strong>%(username)s</strong>"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Tänan, et veetsite aega meie lehel."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Logi uuesti sisse"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Salasõna muutmine"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Salasõna muutmine õnnestus"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Teie salasõna on vahetatud."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Turvalisuse tagamiseks palun sisestage oma praegune salasõna ning seejärel "
+"uus salasõna.Veendumaks, et uue salasõna sisestamisel ei tekkinud vigu, "
+"palun sisestage see kaks korda."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Senine salasõna:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+#: contrib/admin/templates/registration/password_reset_confirm.html:18
+msgid "New password:"
+msgstr "Uus salasõna:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+#: contrib/admin/templates/registration/password_reset_confirm.html:20
+msgid "Confirm password:"
+msgstr "Kinnita salasõna:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+#: contrib/admin/templates/registration/password_reset_confirm.html:21
+msgid "Change my password"
+msgstr "Muuda salasõna"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:4
+#: contrib/admin/templates/registration/password_reset_confirm.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+msgid "Password reset"
+msgstr "Uue parooli loomine"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:6
+#: contrib/admin/templates/registration/password_reset_complete.html:10
+msgid "Password reset complete"
+msgstr "Uue salasõna loomine valmis"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:12
+msgid "Your password has been set.  You may go ahead and log in now."
+msgstr "Teie salasõna on määratud. Võite nüüd sisse logida."
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:4
+msgid "Password reset confirmation"
+msgstr "Uue salasõna loomise kinnitamine"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:12
+msgid "Enter new password"
+msgstr "Sisestage uus salasõna"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:14
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Palun sisestage uus salasõna kaks korda, et saaksime veenduda, et "
+"sisestamisel ei tekkinud vigu."
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:26
+msgid "Password reset unsuccessful"
+msgstr "Uue salasõna loomine ebaõnnestus"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:28
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used.  Please request a new password reset."
+msgstr ""
+"Uue salasõna loomise link ei olnud korrektne. Võimalik, et seda on varem "
+"kasutatud. Esitage uue salasõna taotlus uuesti."
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Uue parooli loomine õnnestus"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed you instructions for setting your password to the e-mail "
+"address you submitted. You should be receiving it shortly."
+msgstr ""
+"Teie poolt sisestatud e-posti aadressile on saadetud juhised uue salasõna "
+"määramiseks. Kiri peaks kohale jõudma varsti."
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "See kiri saadeti teile, sest soovisite uut salasõna"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "teie kasutajakontole lehel %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+msgid "Please go to the following page and choose a new password:"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_email.html:9
+msgid "Your username, in case you've forgotten:"
+msgstr "Teie kasutajatunnus juhul, kui olete unustanud:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Thanks for using our site!"
+msgstr "Täname meie lehte külastamast!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s meeskond"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll e-mail "
+"instructions for setting a new one."
+msgstr ""
+"Unustasid parool? Sisesta oma e-posti aadress ning me saadame sulle juhised "
+"uue parooli määramiseks."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "E-posti aadress:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Reseti parool"
+
+#: contrib/admin/templatetags/admin_list.py:284
+msgid "All dates"
+msgstr "Kõik kuupäevad"
+
+#: contrib/admin/views/main.py:65
+#, python-format
+msgid "Select %s"
+msgstr "Vali %s"
+
+#: contrib/admin/views/main.py:65
+#, python-format
+msgid "Select %s to change"
+msgstr "Vali %s mida muuta"
+
+#: contrib/admin/views/template.py:36 contrib/sites/models.py:38
+msgid "site"
+msgstr "sait"
+
+#: contrib/admin/views/template.py:38
+#, fuzzy
+msgid "template"
+msgstr "mall"
+
+#: contrib/admindocs/views.py:53 contrib/admindocs/views.py:55
+#: contrib/admindocs/views.py:57
+msgid "tag:"
+msgstr "lipik:"
+
+#: contrib/admindocs/views.py:87 contrib/admindocs/views.py:89
+#: contrib/admindocs/views.py:91
+msgid "filter:"
+msgstr "filtreeri:"
+
+#: contrib/admindocs/views.py:153 contrib/admindocs/views.py:155
+#: contrib/admindocs/views.py:157
+msgid "view:"
+msgstr "vaade:"
+
+#: contrib/admindocs/views.py:187
+#, python-format
+msgid "App %r not found"
+msgstr "Rakendust %r ei leitud"
+
+#: contrib/admindocs/views.py:194
+#, python-format
+msgid "Model %(model_name)r not found in app %(app_label)r"
+msgstr "Mudelit %(model_name)r ei leitud rakendusest %(app_label)r"
+
+#: contrib/admindocs/views.py:206
+#, python-format
+msgid "the related `%(app_label)s.%(data_type)s` object"
+msgstr "seotud `%(app_label)s.%(data_type)s` objekt"
+
+#: contrib/admindocs/views.py:206 contrib/admindocs/views.py:228
+#: contrib/admindocs/views.py:242 contrib/admindocs/views.py:247
+msgid "model:"
+msgstr "mudel:"
+
+#: contrib/admindocs/views.py:237
+#, python-format
+msgid "related `%(app_label)s.%(object_name)s` objects"
+msgstr "seotud `%(app_label)s.%(object_name)s` objektid"
+
+#: contrib/admindocs/views.py:242
+#, python-format
+msgid "all %s"
+msgstr "kõik %s"
+
+#: contrib/admindocs/views.py:247
+#, python-format
+msgid "number of %s"
+msgstr "%s arv"
+
+#: contrib/admindocs/views.py:253
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Objekti %s väljad"
+
+#: contrib/admindocs/views.py:317 contrib/admindocs/views.py:328
+#: contrib/admindocs/views.py:330 contrib/admindocs/views.py:336
+#: contrib/admindocs/views.py:337 contrib/admindocs/views.py:339
+msgid "Integer"
+msgstr "Täisarv"
+
+#: contrib/admindocs/views.py:318
+msgid "Boolean (Either True or False)"
+msgstr "Tõeväärtus (Kas tõene või väär)"
+
+#: contrib/admindocs/views.py:319 contrib/admindocs/views.py:338
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "String (kuni %(max_length)s märki)"
+
+#: contrib/admindocs/views.py:320
+msgid "Comma-separated integers"
+msgstr "Komaga eraldatud täisarvud"
+
+#: contrib/admindocs/views.py:321
+msgid "Date (without time)"
+msgstr "Kuupäev (kellaajata)"
+
+#: contrib/admindocs/views.py:322
+msgid "Date (with time)"
+msgstr "Kuupäev (kellaajaga)"
+
+#: contrib/admindocs/views.py:323
+msgid "Decimal number"
+msgstr "Kümnendmurd"
+
+#: contrib/admindocs/views.py:324
+msgid "E-mail address"
+msgstr "E-posti aadress"
+
+#: contrib/admindocs/views.py:325 contrib/admindocs/views.py:326
+#: contrib/admindocs/views.py:329
+msgid "File path"
+msgstr "Faili asukoht"
+
+#: contrib/admindocs/views.py:327
+msgid "Floating point number"
+msgstr "Ujukomaarv"
+
+#: contrib/admindocs/views.py:331 contrib/comments/models.py:89
+msgid "IP address"
+msgstr "IP aadress"
+
+#: contrib/admindocs/views.py:333
+msgid "Boolean (Either True, False or None)"
+msgstr "Tõeväärtus (Kas tõene, väär või tühi)"
+
+#: contrib/admindocs/views.py:334
+msgid "Relation to parent model"
+msgstr "Seos ülem-mudeliga"
+
+#: contrib/admindocs/views.py:335
+msgid "Phone number"
+msgstr "Telefoninumber"
+
+#: contrib/admindocs/views.py:340
+msgid "Text"
+msgstr "Tekst"
+
+#: contrib/admindocs/views.py:341
+msgid "Time"
+msgstr "Aeg"
+
+#: contrib/admindocs/views.py:342 contrib/flatpages/admin.py:8
+#: contrib/flatpages/models.py:8
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admindocs/views.py:343
+msgid "U.S. state (two uppercase letters)"
+msgstr "U.S.A. osariik (kaks suurt tähte)"
+
+#: contrib/admindocs/views.py:344
+msgid "XML text"
+msgstr "XML tekst"
+
+#: contrib/admindocs/views.py:370
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s ei tundu olevat urlpattern objekt"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Järjehoidjad"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:4
+msgid "Documentation bookmarklets"
+msgstr "Dokumentatsiooni järjehoidjad"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:8
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:18
+msgid "Documentation for this page"
+msgstr "Selle lehekülje dokumentatsioon"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:19
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:21
+msgid "Show object ID"
+msgstr "Näita objekti ID-d"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:22
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:24
+msgid "Edit this object (current window)"
+msgstr "Muuda seda objekti (samas aknas)"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:25
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:27
+msgid "Edit this object (new window)"
+msgstr "Muuda seda objekti (uues aknas)"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:28
+msgid "As above, but opens the admin page in a new window."
+msgstr "Sama, mis üleval, kuid avab admin. lehe uues aknas."
+
+#: contrib/auth/admin.py:21
+msgid "Personal info"
+msgstr "Isiklikud andmd"
+
+#: contrib/auth/admin.py:22
+msgid "Permissions"
+msgstr "Õigused"
+
+#: contrib/auth/admin.py:23
+msgid "Important dates"
+msgstr "Tähtsad kuupäevad"
+
+#: contrib/auth/admin.py:24
+msgid "Groups"
+msgstr "Grupid"
+
+#: contrib/auth/admin.py:60
+msgid "Add user"
+msgstr "Lisa kasutaja"
+
+#: contrib/auth/admin.py:85
+msgid "Password changed successfully."
+msgstr "Salasõna edukalt muudetud."
+
+#: contrib/auth/admin.py:91
+#, python-format
+msgid "Change password: %s"
+msgstr "Muuda salasõna: %s"
+
+#: contrib/auth/forms.py:15 contrib/auth/models.py:137
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr "Nõutav. 30 tähemärki või vähem. Ainult tähed, numbrid ja alakriipsud."
+
+#: contrib/auth/forms.py:16 core/validators.py:72
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "See väärtus võib sisaldada ainult tähti, numbreid ja alakriipse."
+
+#: contrib/auth/forms.py:18
+msgid "Password confirmation"
+msgstr "Salasõna kinnitus"
+
+#: contrib/auth/forms.py:30
+msgid "A user with that username already exists."
+msgstr "Sama kasutajatunnusega kasutaja on juba olemas."
+
+#: contrib/auth/forms.py:36 contrib/auth/forms.py:146
+#: contrib/auth/forms.py:188
+msgid "The two password fields didn't match."
+msgstr "Kaks sisestatud parooli ei olnud identsed."
+
+#: contrib/auth/forms.py:74 contrib/comments/views/comments.py:58
+msgid "This account is inactive."
+msgstr "See konto ei ole aktiivne."
+
+#: contrib/auth/forms.py:79 contrib/comments/views/comments.py:49
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"Teie veebibrauser ei aktsepteeri küpsiseid, aga küpsised on sisselogimiseks "
+"vajalikud."
+
+#: contrib/auth/forms.py:92
+msgid "E-mail"
+msgstr "E-posti aadress"
+
+#: contrib/auth/forms.py:101
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr ""
+"Selle e-posti aadressiga ei ole seotud ühtegi kasutajakontot. Veenduge, et "
+"olete registreerunud."
+
+#: contrib/auth/forms.py:126
+#, python-format
+msgid "Password reset on %s"
+msgstr ""
+
+#: contrib/auth/forms.py:134
+msgid "New password"
+msgstr "Uus salasõna"
+
+#: contrib/auth/forms.py:135
+msgid "New password confirmation"
+msgstr "Uue salasõna kinnitus"
+
+#: contrib/auth/forms.py:160
+msgid "Old password"
+msgstr "Vana salasõna"
+
+#: contrib/auth/forms.py:168
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Te sisestasite oma vana parooli vigaselt. Palun sisestage see uuesti."
+
+#: contrib/auth/models.py:73 contrib/auth/models.py:96
+msgid "name"
+msgstr "nimi"
+
+#: contrib/auth/models.py:75
+msgid "codename"
+msgstr "koodnimi"
+
+#: contrib/auth/models.py:78
+msgid "permission"
+msgstr "õigus"
+
+#: contrib/auth/models.py:79 contrib/auth/models.py:97
+msgid "permissions"
+msgstr "õigused"
+
+#: contrib/auth/models.py:100
+msgid "group"
+msgstr "grupp"
+
+#: contrib/auth/models.py:101 contrib/auth/models.py:147
+msgid "groups"
+msgstr "grupid"
+
+#: contrib/auth/models.py:137
+msgid "username"
+msgstr "kasutajatunnus"
+
+#: contrib/auth/models.py:138
+msgid "first name"
+msgstr "eesnimi"
+
+#: contrib/auth/models.py:139
+msgid "last name"
+msgstr "perenimi"
+
+#: contrib/auth/models.py:140
+msgid "e-mail address"
+msgstr "e-posti aadress"
+
+#: contrib/auth/models.py:141
+msgid "password"
+msgstr "salasõna"
+
+#: contrib/auth/models.py:141
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+
+#: contrib/auth/models.py:142
+msgid "staff status"
+msgstr "personalistaatus"
+
+#: contrib/auth/models.py:142
+msgid "Designates whether the user can log into this admin site."
+msgstr ""
+"Määrab, kas kasutaja saab sisse logida sellesse admininistreerimisliidesesse."
+
+#: contrib/auth/models.py:143
+msgid "active"
+msgstr "aktiivne"
+
+#: contrib/auth/models.py:143
+msgid ""
+"Designates whether this user should be treated as active. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"Määrab, kas see konto on aktiivne. Kustutamise asemel lihtsalt deaktiveerige "
+"konto."
+
+#: contrib/auth/models.py:144
+msgid "superuser status"
+msgstr "superkasutaja staatus"
+
+#: contrib/auth/models.py:144
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr "Määrab, kas see kasutaja omab automaatselt ja alati kõiki õigus."
+
+#: contrib/auth/models.py:145
+msgid "last login"
+msgstr "viimane sisenemine"
+
+#: contrib/auth/models.py:146
+msgid "date joined"
+msgstr "liitumise kuupäev"
+
+#: contrib/auth/models.py:148
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"Lisaks neile õigustele, mis kasutajale on määratud, omab kasutaja ka neid "
+"õigusi, mis on nendel gruppidel, millesse ta kuulub."
+
+#: contrib/auth/models.py:149
+msgid "user permissions"
+msgstr "kasutajaõigused"
+
+#: contrib/auth/models.py:153
+msgid "user"
+msgstr "kasutaja"
+
+#: contrib/auth/models.py:154
+msgid "users"
+msgstr "kasutajad"
+
+#: contrib/auth/models.py:309
+msgid "message"
+msgstr "sõnum"
+
+#: contrib/auth/views.py:50
+msgid "Logged out"
+msgstr "Välja logitud"
+
+#: contrib/comments/models.py:71 contrib/comments/models.py:164
+msgid "object ID"
+msgstr "objekti ID"
+
+#: contrib/comments/models.py:72
+msgid "headline"
+msgstr "pealkiri"
+
+#: contrib/comments/models.py:73 contrib/comments/models.py:95
+#: contrib/comments/models.py:165
+msgid "comment"
+msgstr "kommentaar"
+
+#: contrib/comments/models.py:74
+msgid "rating #1"
+msgstr "reiting #1"
+
+#: contrib/comments/models.py:75
+msgid "rating #2"
+msgstr "reiting #2"
+
+#: contrib/comments/models.py:76
+msgid "rating #3"
+msgstr "reiting #3"
+
+#: contrib/comments/models.py:77
+msgid "rating #4"
+msgstr "reiting #4"
+
+#: contrib/comments/models.py:78
+msgid "rating #5"
+msgstr "reiting #5"
+
+#: contrib/comments/models.py:79
+msgid "rating #6"
+msgstr "reiting #6"
+
+#: contrib/comments/models.py:80
+msgid "rating #7"
+msgstr "reiting #7"
+
+#: contrib/comments/models.py:81
+msgid "rating #8"
+msgstr "reiting #8"
+
+#: contrib/comments/models.py:86
+msgid "is valid rating"
+msgstr "on korrektne reiting"
+
+#: contrib/comments/models.py:87 contrib/comments/models.py:167
+msgid "date/time submitted"
+msgstr "loomise kuupäev/kellaaeg"
+
+#: contrib/comments/models.py:88 contrib/comments/models.py:168
+msgid "is public"
+msgstr "on avalik"
+
+#: contrib/comments/models.py:90
+msgid "is removed"
+msgstr "on eemaldatud"
+
+#: contrib/comments/models.py:90
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Märkige siia linnuke, kui see kommentaar on ebasobiv. Kommentaari asemel "
+"kuvatakse kirja \"Kommentaar on kustutatud\"."
+
+#: contrib/comments/models.py:96
+msgid "comments"
+msgstr "kommentaarid"
+
+#: contrib/comments/models.py:128 contrib/comments/models.py:199
+msgid "Content object"
+msgstr "Sisuobjekt"
+
+#: contrib/comments/models.py:156
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Postitatud kasutaja %(user)s poolt %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:166
+msgid "person's name"
+msgstr "isiku nimi"
+
+#: contrib/comments/models.py:169
+msgid "ip address"
+msgstr "ip aadress"
+
+#: contrib/comments/models.py:171
+msgid "approved by staff"
+msgstr "personali poolt heaks kiidetud"
+
+#: contrib/comments/models.py:175
+msgid "free comment"
+msgstr "vaba kommentaar"
+
+#: contrib/comments/models.py:176
+msgid "free comments"
+msgstr "vabad kommentaarid"
+
+#: contrib/comments/models.py:227
+msgid "score"
+msgstr "tulemus"
+
+#: contrib/comments/models.py:228
+msgid "score date"
+msgstr "tulemuse kuupäev"
+
+#: contrib/comments/models.py:232
+msgid "karma score"
+msgstr "karma tulemus"
+
+#: contrib/comments/models.py:233
+msgid "karma scores"
+msgstr "karma tulemused"
+
+#: contrib/comments/models.py:237
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d reiting kasutaja %(user)s poolt"
+
+#: contrib/comments/models.py:254
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"See kommentaar märgiti kasutaja %(user)s poolt:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:262
+msgid "flag date"
+msgstr "märkimise kuupäev"
+
+#: contrib/comments/models.py:266
+msgid "user flag"
+msgstr "kasutajamärge"
+
+#: contrib/comments/models.py:267
+msgid "user flags"
+msgstr "kasutajamärked"
+
+#: contrib/comments/models.py:271
+#, python-format
+msgid "Flag by %r"
+msgstr "Lipu pani %r"
+
+#: contrib/comments/models.py:277
+msgid "deletion date"
+msgstr "kustutamise kuupäev"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "moderaatori kustutus"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "moderaatori kustutused"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "moderaatori kustutus kasutaja %r poolt"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Unustasid salasõna?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Reitingud"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Nõutav"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Valikuline"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Postita foto"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Kommentaar:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Kommentaari eelvaade"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Teie nimi:"
+
+#: contrib/comments/views/comments.py:76
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr ""
+"See reiting on nõutav, sest olete sisestanud vähemalt ühe teise reitingu."
+
+#: contrib/comments/views/comments.py:160
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/comments/views/comments.py:165
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Selle kommentaari postitas pealiskaudne kasutaja:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:238
+#: contrib/comments/views/comments.py:331
+msgid "Only POSTs are allowed"
+msgstr "Ainult POST päringud on lubatud"
+
+#: contrib/comments/views/comments.py:242
+#: contrib/comments/views/comments.py:335
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Üks või enam nõutavatest väljadest on puudu"
+
+#: contrib/comments/views/comments.py:246
+#: contrib/comments/views/comments.py:337
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr ""
+"Keegi on kommentaari ankeeti sisestanud vigaseid andmed (turvarikkumine)"
+
+#: contrib/comments/views/comments.py:256
+#: contrib/comments/views/comments.py:343
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"Kommentaariankeet sisaldas ebakorrektset 'target' parameetrit -- objekti ID "
+"ei olnud korrektne"
+
+#: contrib/comments/views/comments.py:307
+#: contrib/comments/views/comments.py:372
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "Kommentaari ankeedis oli puudu kas 'preview' või 'post'"
+
+#: contrib/comments/views/karma.py:21
+msgid "Anonymous users cannot vote"
+msgstr "Anonüümsed kasutajad ei saa hääletada"
+
+#: contrib/comments/views/karma.py:25
+msgid "Invalid comment ID"
+msgstr "Ebakorrektne kommentaari ID"
+
+#: contrib/comments/views/karma.py:27
+msgid "No voting for yourself"
+msgstr "Iseendale ei saa häält anda"
+
+#: contrib/contenttypes/models.py:67
+msgid "python model class name"
+msgstr "pythoni mudeli klassinimi"
+
+#: contrib/contenttypes/models.py:71
+msgid "content type"
+msgstr "sisutüüp"
+
+#: contrib/contenttypes/models.py:72
+msgid "content types"
+msgstr "sisutüübid"
+
+#: contrib/flatpages/admin.py:9
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Näide: '/about/contact/'. Veenduge, et URL algaks ja lõppeks kaldkriipsuga."
+
+#: contrib/flatpages/admin.py:11 core/validators.py:76
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"See väärtus võib sisaldada ainult tähti, numbreid, alakriipse, mõttekriipse "
+"või kaldkriipse."
+
+#: contrib/flatpages/admin.py:22
+msgid "Advanced options"
+msgstr "Lisavalikud"
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "pealkiri"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "sisu"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "võimalda kommentaarid"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "mall"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"Näide: 'flatpages/contact_page.html'. Kui mall on määramata, kasutatakse "
+"vaikimisi malli 'flatpages/default.html'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "registreerumine nõutav"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Kui see on valitud, näevad lehte ainult sisselogitud kasutajad"
+
+#: contrib/flatpages/models.py:19
+msgid "flat page"
+msgstr "sisuleht"
+
+#: contrib/flatpages/models.py:20
+msgid "flat pages"
+msgstr "sisulehed"
+
+#: contrib/gis/forms/fields.py:10
+msgid "No geometry value provided."
+msgstr ""
+
+#: contrib/gis/forms/fields.py:11
+msgid "Invalid Geometry value."
+msgstr "Vigane geomeetriline väärtus"
+
+#: contrib/gis/forms/fields.py:12
+msgid "Invalid Geometry type."
+msgstr "Vigane geomeetriline tüüp"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "th"
+msgstr "."
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "st"
+msgstr "."
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "nd"
+msgstr "."
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "rd"
+msgstr "."
+
+#: contrib/humanize/templatetags/humanize.py:51
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f miljon"
+msgstr[1] "%(value).11f miljonit"
+
+#: contrib/humanize/templatetags/humanize.py:54
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f miljard"
+msgstr[1] "%(value).1f miljardit"
+
+#: contrib/humanize/templatetags/humanize.py:57
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f triljon"
+msgstr[1] "%(value).1f triljonit"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "one"
+msgstr "üks"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "two"
+msgstr "kaks"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "three"
+msgstr "kolm"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "four"
+msgstr "neli"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "five"
+msgstr "viis"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "six"
+msgstr "kuus"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "seven"
+msgstr "seitse"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "eight"
+msgstr "kaheksa"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "nine"
+msgstr "üheksa"
+
+#: contrib/humanize/templatetags/humanize.py:93
+msgid "today"
+msgstr "täna"
+
+#: contrib/humanize/templatetags/humanize.py:95
+msgid "tomorrow"
+msgstr "homme"
+
+#: contrib/humanize/templatetags/humanize.py:97
+msgid "yesterday"
+msgstr "eile"
+
+#: contrib/localflavor/ar/forms.py:27
+msgid "Enter a postal code in the format NNNN or ANNNNAAA."
+msgstr "Sisesta postiindeks kujul NNNN või ANNNNAAA."
+
+#: contrib/localflavor/ar/forms.py:49 contrib/localflavor/br/forms.py:96
+#: contrib/localflavor/br/forms.py:135 contrib/localflavor/pe/forms.py:23
+#: contrib/localflavor/pe/forms.py:51
+msgid "This field requires only numbers."
+msgstr "See väli peab koosnema ainult numbritest."
+
+#: contrib/localflavor/ar/forms.py:50
+msgid "This field requires 7 or 8 digits."
+msgstr "Siin väljal peab olema kas 7 või 8 numbrit."
+
+#: contrib/localflavor/ar/forms.py:79
+msgid "Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format."
+msgstr "Sisesta korrektne CUIT kujul XX-XXXXXXXX-X or XXXXXXXXXXXX."
+
+#: contrib/localflavor/ar/forms.py:80
+msgid "Invalid CUIT."
+msgstr "Vale CUIT."
+
+#: contrib/localflavor/at/at_states.py:5
+msgid "Burgenland"
+msgstr "Burgenland"
+
+#: contrib/localflavor/at/at_states.py:6
+msgid "Carinthia"
+msgstr "Kärnten"
+
+#: contrib/localflavor/at/at_states.py:7
+msgid "Lower Austria"
+msgstr "Alam-Austria"
+
+#: contrib/localflavor/at/at_states.py:8
+msgid "Upper Austria"
+msgstr "Ülem-Austria"
+
+#: contrib/localflavor/at/at_states.py:9
+msgid "Salzburg"
+msgstr "Salzburg"
+
+#: contrib/localflavor/at/at_states.py:10
+msgid "Styria"
+msgstr "Steiermark"
+
+#: contrib/localflavor/at/at_states.py:11
+msgid "Tyrol"
+msgstr "Tirool"
+
+#: contrib/localflavor/at/at_states.py:12
+msgid "Vorarlberg"
+msgstr "Vorarlberg"
+
+#: contrib/localflavor/at/at_states.py:13
+msgid "Vienna"
+msgstr "Viin"
+
+#: contrib/localflavor/at/forms.py:20 contrib/localflavor/ch/forms.py:16
+#: contrib/localflavor/no/forms.py:12
+msgid "Enter a zip code in the format XXXX."
+msgstr "Sisesta postiindeks kujul XXXX."
+
+#: contrib/localflavor/at/forms.py:48
+msgid "Enter a valid Austrian Social Security Number in XXXX XXXXXX format."
+msgstr "Sisesta kehtiv Austria sotsiaalkindlustusnumber formaadis XXX-XX-XXXX."
+
+#: contrib/localflavor/au/forms.py:16
+msgid "Enter a 4 digit post code."
+msgstr "Sisesta neljakohaline postiindeks."
+
+#: contrib/localflavor/br/forms.py:21
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Sisesta postiindeks kujul XXXXX-XXX."
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "Telefoninumbrid peavad olema kujul XX-XXXX-XXXX."
+
+#: contrib/localflavor/br/forms.py:58
+msgid ""
+"Select a valid brazilian state. That state is not one of the available "
+"states."
+msgstr "Vali korrektne Brasiilia osariik. Valitud osariik ei ole korrektne."
+
+#: contrib/localflavor/br/forms.py:94
+msgid "Invalid CPF number."
+msgstr "Mittekorrektne CPF number."
+
+#: contrib/localflavor/br/forms.py:95
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr "See väli võib olla maksimaalselt 11 või 14 sümbolit."
+
+#: contrib/localflavor/br/forms.py:134
+msgid "Invalid CNPJ number."
+msgstr "Mittekorrektne CNPJ number."
+
+#: contrib/localflavor/br/forms.py:136
+msgid "This field requires at least 14 digits"
+msgstr "See väli peab olema vähemalt 14-kohaline arv."
+
+#: contrib/localflavor/ca/forms.py:17
+msgid "Enter a postal code in the format XXX XXX."
+msgstr "Sisesta postiindeks kujul XXX XXX."
+
+#: contrib/localflavor/ca/forms.py:88
+msgid "Enter a valid Canadian Social Insurance number in XXX-XXX-XXX format."
+msgstr "Sisesta korrektne Kanada sotsiaalturvatunnus formaadis XXX-XXX-XXXX."
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr "Aargau"
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr "Appenzell Innerrhoden"
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr "Appenzell Ausserrhoden"
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr "Basel-Stadt"
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr "Basel-Land"
+
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr "Berne"
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr "Fribourg"
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr "Geneva"
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr "Glarus"
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr "Graubuenden"
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr "Jura"
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr "Lucerne"
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr "Neuchatel"
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr "Nidwalden"
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr "Obwalden"
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr "Schaffhausen"
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr "Schwyz"
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr "Solothurn"
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr "St. Gallen"
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr "Thurgau"
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr "Ticino"
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr "Uri"
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr "Valais"
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr "Vaud"
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr "Zug"
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr "Zurich"
+
+#: contrib/localflavor/ch/forms.py:64
+msgid ""
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
+msgstr ""
+"Sisesta kehtiv Šveitsi isiku- või passinumber kujul X1234567<0 või "
+"1234567890."
+
+#: contrib/localflavor/cl/forms.py:29
+msgid "Enter a valid Chilean RUT."
+msgstr "Sisesta korrektne Tšiili RUT."
+
+#: contrib/localflavor/cl/forms.py:30
+msgid "Enter a valid Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr "Sisesta korrektne Tšiili RUT formaadis XX.XXX.XXX-X."
+
+#: contrib/localflavor/cl/forms.py:31
+msgid "The Chilean RUT is not valid."
+msgstr "Tšiili RUT on ebakorrektne."
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr "Baden-Württemberg"
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr "Baieri"
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr "Berliin"
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr "Brandenburg"
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr "Bremen"
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr "Hamburg"
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr "Hessen"
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr "Mecklenburg-Vorpommern"
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr "Alam-Saksi"
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr "Nordrhein-Westfalen"
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr "Rheinland-Pfalz"
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr "Saarimaa"
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr "Saksimaa"
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr "Saksi-Anhalt"
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr "Schleswig-Holstein"
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr "Tüüringi"
+
+#: contrib/localflavor/de/forms.py:14 contrib/localflavor/fi/forms.py:12
+#: contrib/localflavor/fr/forms.py:15
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Sisesta postiindeks kujul XXXXX."
+
+#: contrib/localflavor/de/forms.py:41
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr ""
+"Sisesta kehtiv Saksamaa ID-kaardi number kujul XXXXXXXXXXX-XXXXXXX-XXXXXXX-X."
+
+#: contrib/localflavor/es/es_provinces.py:5
+msgid "Arava"
+msgstr "Álava"
+
+#: contrib/localflavor/es/es_provinces.py:6
+msgid "Albacete"
+msgstr "Albacete"
+
+#: contrib/localflavor/es/es_provinces.py:7
+msgid "Alacant"
+msgstr "Alicante"
+
+#: contrib/localflavor/es/es_provinces.py:8
+msgid "Almeria"
+msgstr "Almería"
+
+#: contrib/localflavor/es/es_provinces.py:9
+msgid "Avila"
+msgstr "Ávila"
+
+#: contrib/localflavor/es/es_provinces.py:10
+msgid "Badajoz"
+msgstr "Badajoz"
+
+#: contrib/localflavor/es/es_provinces.py:11
+msgid "Illes Balears"
+msgstr "Baleaarid"
+
+#: contrib/localflavor/es/es_provinces.py:12
+msgid "Barcelona"
+msgstr "Barcelona"
+
+#: contrib/localflavor/es/es_provinces.py:13
+msgid "Burgos"
+msgstr "Burgos"
+
+#: contrib/localflavor/es/es_provinces.py:14
+msgid "Caceres"
+msgstr "Cáceres"
+
+#: contrib/localflavor/es/es_provinces.py:15
+msgid "Cadiz"
+msgstr "Cádiz"
+
+#: contrib/localflavor/es/es_provinces.py:16
+msgid "Castello"
+msgstr "Castellón"
+
+#: contrib/localflavor/es/es_provinces.py:17
+msgid "Ciudad Real"
+msgstr "Ciudad Real"
+
+#: contrib/localflavor/es/es_provinces.py:18
+msgid "Cordoba"
+msgstr "Córdoba"
+
+#: contrib/localflavor/es/es_provinces.py:19
+msgid "A Coruna"
+msgstr "A Coruna"
+
+#: contrib/localflavor/es/es_provinces.py:20
+msgid "Cuenca"
+msgstr "Cuenca"
+
+#: contrib/localflavor/es/es_provinces.py:21
+msgid "Girona"
+msgstr "Girona"
+
+#: contrib/localflavor/es/es_provinces.py:22
+msgid "Granada"
+msgstr "Granada"
+
+#: contrib/localflavor/es/es_provinces.py:23
+msgid "Guadalajara"
+msgstr "Guadalajara"
+
+#: contrib/localflavor/es/es_provinces.py:24
+msgid "Guipuzkoa"
+msgstr "Guipúzcoa"
+
+#: contrib/localflavor/es/es_provinces.py:25
+msgid "Huelva"
+msgstr "Huelva"
+
+#: contrib/localflavor/es/es_provinces.py:26
+msgid "Huesca"
+msgstr "Huesca"
+
+#: contrib/localflavor/es/es_provinces.py:27
+msgid "Jaen"
+msgstr "Jaén"
+
+#: contrib/localflavor/es/es_provinces.py:28
+msgid "Leon"
+msgstr "León"
+
+#: contrib/localflavor/es/es_provinces.py:29
+msgid "Lleida"
+msgstr "Lleida"
+
+#: contrib/localflavor/es/es_provinces.py:30
+#: contrib/localflavor/es/es_regions.py:17
+msgid "La Rioja"
+msgstr "La Rioja"
+
+#: contrib/localflavor/es/es_provinces.py:31
+msgid "Lugo"
+msgstr "Lugo"
+
+#: contrib/localflavor/es/es_provinces.py:32
+#: contrib/localflavor/es/es_regions.py:18
+msgid "Madrid"
+msgstr "Madrid"
+
+#: contrib/localflavor/es/es_provinces.py:33
+msgid "Malaga"
+msgstr "Málaga"
+
+#: contrib/localflavor/es/es_provinces.py:34
+msgid "Murcia"
+msgstr "Murcia"
+
+#: contrib/localflavor/es/es_provinces.py:35
+msgid "Navarre"
+msgstr "Navarra"
+
+#: contrib/localflavor/es/es_provinces.py:36
+msgid "Ourense"
+msgstr "Orense"
+
+#: contrib/localflavor/es/es_provinces.py:37
+msgid "Asturias"
+msgstr "Astuuria"
+
+#: contrib/localflavor/es/es_provinces.py:38
+msgid "Palencia"
+msgstr "Palencia"
+
+#: contrib/localflavor/es/es_provinces.py:39
+msgid "Las Palmas"
+msgstr "Las Palmas"
+
+#: contrib/localflavor/es/es_provinces.py:40
+msgid "Pontevedra"
+msgstr "Pontevedra"
+
+#: contrib/localflavor/es/es_provinces.py:41
+msgid "Salamanca"
+msgstr "Salamanca"
+
+#: contrib/localflavor/es/es_provinces.py:42
+msgid "Santa Cruz de Tenerife"
+msgstr "Tenerife"
+
+#: contrib/localflavor/es/es_provinces.py:43
+#: contrib/localflavor/es/es_regions.py:11
+msgid "Cantabria"
+msgstr "Cantabria"
+
+#: contrib/localflavor/es/es_provinces.py:44
+msgid "Segovia"
+msgstr "Segovia"
+
+#: contrib/localflavor/es/es_provinces.py:45
+msgid "Seville"
+msgstr "Sevilla"
+
+#: contrib/localflavor/es/es_provinces.py:46
+msgid "Soria"
+msgstr "Soria"
+
+#: contrib/localflavor/es/es_provinces.py:47
+msgid "Tarragona"
+msgstr "Tarragona"
+
+#: contrib/localflavor/es/es_provinces.py:48
+msgid "Teruel"
+msgstr "Teruel"
+
+#: contrib/localflavor/es/es_provinces.py:49
+msgid "Toledo"
+msgstr "Toledo"
+
+#: contrib/localflavor/es/es_provinces.py:50
+msgid "Valencia"
+msgstr "Valencia"
+
+#: contrib/localflavor/es/es_provinces.py:51
+msgid "Valladolid"
+msgstr "Valladolid"
+
+#: contrib/localflavor/es/es_provinces.py:52
+msgid "Bizkaia"
+msgstr "Vizcaya"
+
+#: contrib/localflavor/es/es_provinces.py:53
+msgid "Zamora"
+msgstr "Zamora"
+
+#: contrib/localflavor/es/es_provinces.py:54
+msgid "Zaragoza"
+msgstr "Zaragoza"
+
+#: contrib/localflavor/es/es_provinces.py:55
+msgid "Ceuta"
+msgstr "Ceuta"
+
+#: contrib/localflavor/es/es_provinces.py:56
+msgid "Melilla"
+msgstr "Melilla"
+
+#: contrib/localflavor/es/es_regions.py:5
+msgid "Andalusia"
+msgstr "Andaluusia"
+
+#: contrib/localflavor/es/es_regions.py:6
+msgid "Aragon"
+msgstr "Aragón"
+
+#: contrib/localflavor/es/es_regions.py:7
+msgid "Principality of Asturias"
+msgstr "Astuuria"
+
+#: contrib/localflavor/es/es_regions.py:8
+msgid "Balearic Islands"
+msgstr "Baleaarid"
+
+#: contrib/localflavor/es/es_regions.py:9
+msgid "Basque Country"
+msgstr "Baskimaa"
+
+#: contrib/localflavor/es/es_regions.py:10
+msgid "Canary Islands"
+msgstr "Kanaari saared"
+
+#: contrib/localflavor/es/es_regions.py:12
+msgid "Castile-La Mancha"
+msgstr "Castilla-La Mancha"
+
+#: contrib/localflavor/es/es_regions.py:13
+msgid "Castile and Leon"
+msgstr "Castilla-León"
+
+#: contrib/localflavor/es/es_regions.py:14
+msgid "Catalonia"
+msgstr "Kataloonia"
+
+#: contrib/localflavor/es/es_regions.py:15
+msgid "Extremadura"
+msgstr "Extremadura"
+
+#: contrib/localflavor/es/es_regions.py:16
+msgid "Galicia"
+msgstr "Galicia"
+
+#: contrib/localflavor/es/es_regions.py:19
+msgid "Region of Murcia"
+msgstr "Murcia"
+
+#: contrib/localflavor/es/es_regions.py:20
+msgid "Foral Community of Navarre"
+msgstr "Navarra"
+
+#: contrib/localflavor/es/es_regions.py:21
+msgid "Valencian Community"
+msgstr "Valencia"
+
+#: contrib/localflavor/es/forms.py:19
+msgid "Enter a valid postal code in the range and format 01XXX - 52XXX."
+msgstr "Sisesta korrektne postiindeks vahemikus 01XXX - 52XXX."
+
+#: contrib/localflavor/es/forms.py:39
+msgid ""
+"Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or "
+"9XXXXXXXX."
+msgstr ""
+"Sisesta korrektne telefoninumber, mis on formaadis 6XXXXXXXX, 8XXXXXXXX või "
+"9XXXXXXXX."
+
+#: contrib/localflavor/es/forms.py:66
+msgid "Please enter a valid NIF, NIE, or CIF."
+msgstr "Palun sisesta korrektne NIF, NIE või CIF."
+
+#: contrib/localflavor/es/forms.py:67
+msgid "Please enter a valid NIF or NIE."
+msgstr "Palun sisesta korrektne NIF või NIE."
+
+#: contrib/localflavor/es/forms.py:68
+msgid "Invalid checksum for NIF."
+msgstr "Vale NIF-i kontrollsumma."
+
+#: contrib/localflavor/es/forms.py:69
+msgid "Invalid checksum for NIE."
+msgstr "Vale NIE kontrollsumma."
+
+#: contrib/localflavor/es/forms.py:70
+msgid "Invalid checksum for CIF."
+msgstr "Vale CIF-i kontrollsumma."
+
+#: contrib/localflavor/es/forms.py:142
+msgid ""
+"Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX."
+msgstr "Palun sisesta korrektne kontonumber formaadis XXXX-XXXX-XX-XXXXXXXXXX."
+
+#: contrib/localflavor/es/forms.py:143
+msgid "Invalid checksum for bank account number."
+msgstr "Pangakonto numbri kontrollsumma on vale."
+
+#: contrib/localflavor/fi/forms.py:28
+msgid "Enter a valid Finnish social security number."
+msgstr "Sisesta korrektne Soome sotsiaalturvatunnus."
+
+#: contrib/localflavor/in_/forms.py:14
+msgid "Enter a zip code in the format XXXXXXX."
+msgstr "Sisesta postiindeks kujul XXXXXXX."
+
+#: contrib/localflavor/is_/forms.py:17
+msgid ""
+"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr "Sisesta kehtiv Islandi isikukood formaadis XXXXXX-XXXX."
+
+#: contrib/localflavor/is_/forms.py:18
+msgid "The Icelandic identification number is not valid."
+msgstr "Islandi isikukood ei ole korrektne."
+
+#: contrib/localflavor/it/forms.py:14
+msgid "Enter a valid zip code."
+msgstr "Sisesta korrektne postiindeks."
+
+#: contrib/localflavor/it/forms.py:43
+msgid "Enter a valid Social Security number."
+msgstr "Sisesta korrektne sotsiaalturvatunnus."
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr "Sisesta korrektne käibemaksukohuslase kood."
+
+#: contrib/localflavor/jp/forms.py:17
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "Sisesta postiindeks kujul XXXXXXX või XXX-XXXX."
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr "Hokkaido"
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr "Aomori"
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr "Iwate"
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr "Miyagi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr "Akita"
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr "Yamagata"
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr "Fukushima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr "Ibaraki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr "Tochigi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr "Gunma"
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr "Saitama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr "Chiba"
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr "Tokyo"
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr "Kanagawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr "Yamanashi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr "Nagano"
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr "Niigata"
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr "Toyama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr "Ishikawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr "Fukui"
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr "Gifu"
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr "Shizuoka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr "Aichi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr "Mie"
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr "Shiga"
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr "Kyoto"
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr "Osaka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr "Hyogo"
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr "Nara"
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr "Wakayama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr "Tottori"
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr "Shimane"
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr "Okayama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr "Hiroshima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr "Yamaguchi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr "Tokushima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr "Kagawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr "Ehime"
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr "Kochi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr "Fukuoka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr "Saga"
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr "Nagasaki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr "Kumamoto"
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr "Oita"
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr "Miyazaki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr "Kagoshima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr "Okinawa"
+
+#: contrib/localflavor/mx/mx_states.py:12
+msgid "Aguascalientes"
+msgstr "Aguascalientes"
+
+#: contrib/localflavor/mx/mx_states.py:13
+msgid "Baja California"
+msgstr "Baja California"
+
+#: contrib/localflavor/mx/mx_states.py:14
+msgid "Baja California Sur"
+msgstr "Baja California Sur"
+
+#: contrib/localflavor/mx/mx_states.py:15
+msgid "Campeche"
+msgstr "Campeche"
+
+#: contrib/localflavor/mx/mx_states.py:16
+msgid "Chihuahua"
+msgstr "Chihuahua"
+
+#: contrib/localflavor/mx/mx_states.py:17
+msgid "Chiapas"
+msgstr "Chiapas"
+
+#: contrib/localflavor/mx/mx_states.py:18
+msgid "Coahuila"
+msgstr "Coahuila"
+
+#: contrib/localflavor/mx/mx_states.py:19
+msgid "Colima"
+msgstr "Colima"
+
+#: contrib/localflavor/mx/mx_states.py:20
+msgid "Distrito Federal"
+msgstr "Distrito Federal"
+
+#: contrib/localflavor/mx/mx_states.py:21
+msgid "Durango"
+msgstr "Durango"
+
+#: contrib/localflavor/mx/mx_states.py:22
+msgid "Guerrero"
+msgstr "Guerrero"
+
+#: contrib/localflavor/mx/mx_states.py:23
+msgid "Guanajuato"
+msgstr "Guanajuato"
+
+#: contrib/localflavor/mx/mx_states.py:24
+msgid "Hidalgo"
+msgstr "Hidalgo"
+
+#: contrib/localflavor/mx/mx_states.py:25
+msgid "Jalisco"
+msgstr "Jalisco"
+
+#: contrib/localflavor/mx/mx_states.py:26
+msgid "Estado de México"
+msgstr "Estado de México"
+
+#: contrib/localflavor/mx/mx_states.py:27
+msgid "Michoacán"
+msgstr "Michoacán"
+
+#: contrib/localflavor/mx/mx_states.py:28
+msgid "Morelos"
+msgstr "Morelos"
+
+#: contrib/localflavor/mx/mx_states.py:29
+msgid "Nayarit"
+msgstr "Nayarit"
+
+#: contrib/localflavor/mx/mx_states.py:30
+msgid "Nuevo León"
+msgstr "Nuevo León"
+
+#: contrib/localflavor/mx/mx_states.py:31
+msgid "Oaxaca"
+msgstr "Oaxaca"
+
+#: contrib/localflavor/mx/mx_states.py:32
+msgid "Puebla"
+msgstr "Puebla"
+
+#: contrib/localflavor/mx/mx_states.py:33
+msgid "Querétaro"
+msgstr "Querétaro"
+
+#: contrib/localflavor/mx/mx_states.py:34
+msgid "Quintana Roo"
+msgstr "Quintana Roo"
+
+#: contrib/localflavor/mx/mx_states.py:35
+msgid "Sinaloa"
+msgstr "Sinaloa"
+
+#: contrib/localflavor/mx/mx_states.py:36
+msgid "San Luis Potosí"
+msgstr "San Luis Potosí"
+
+#: contrib/localflavor/mx/mx_states.py:37
+msgid "Sonora"
+msgstr "Sonora"
+
+#: contrib/localflavor/mx/mx_states.py:38
+msgid "Tabasco"
+msgstr "Tabasco"
+
+#: contrib/localflavor/mx/mx_states.py:39
+msgid "Tamaulipas"
+msgstr "Tamaulipas"
+
+#: contrib/localflavor/mx/mx_states.py:40
+msgid "Tlaxcala"
+msgstr "Tlaxcala"
+
+#: contrib/localflavor/mx/mx_states.py:41
+msgid "Veracruz"
+msgstr "Veracruz"
+
+#: contrib/localflavor/mx/mx_states.py:42
+msgid "Yucatán"
+msgstr "Yucatán"
+
+#: contrib/localflavor/mx/mx_states.py:43
+msgid "Zacatecas"
+msgstr "Zacatecas"
+
+#: contrib/localflavor/nl/forms.py:21
+msgid "Enter a valid postal code"
+msgstr "Sisesta kehtiv postiindeks"
+
+#: contrib/localflavor/nl/forms.py:52
+msgid "Enter a valid phone number"
+msgstr "Sisesta kehtiv telefoninumber"
+
+#: contrib/localflavor/nl/forms.py:78
+msgid "Enter a valid SoFi number"
+msgstr "Sisesta kehtiv SoFi number"
+
+#: contrib/localflavor/nl/nl_provinces.py:4
+#, fuzzy
+msgid "Drenthe"
+msgstr "Drenthe"
+
+#: contrib/localflavor/nl/nl_provinces.py:5
+msgid "Flevoland"
+msgstr "Flevoland"
+
+#: contrib/localflavor/nl/nl_provinces.py:6
+msgid "Friesland"
+msgstr "Friisimaa"
+
+#: contrib/localflavor/nl/nl_provinces.py:7
+msgid "Gelderland"
+msgstr "Gelderland"
+
+#: contrib/localflavor/nl/nl_provinces.py:8
+msgid "Groningen"
+msgstr "Groningeni provints"
+
+#: contrib/localflavor/nl/nl_provinces.py:9
+msgid "Limburg"
+msgstr "Limburgi provints"
+
+#: contrib/localflavor/nl/nl_provinces.py:10
+msgid "Noord-Brabant"
+msgstr "Põhja-Brabant"
+
+#: contrib/localflavor/nl/nl_provinces.py:11
+msgid "Noord-Holland"
+msgstr "Põhja-Holland"
+
+#: contrib/localflavor/nl/nl_provinces.py:12
+msgid "Overijssel"
+msgstr "Overijssel"
+
+#: contrib/localflavor/nl/nl_provinces.py:13
+msgid "Utrecht"
+msgstr "Utrechti provints"
+
+#: contrib/localflavor/nl/nl_provinces.py:14
+msgid "Zeeland"
+msgstr "Zeeland"
+
+#: contrib/localflavor/nl/nl_provinces.py:15
+msgid "Zuid-Holland"
+msgstr "Lõuna-Holland"
+
+#: contrib/localflavor/no/forms.py:33
+msgid "Enter a valid Norwegian social security number."
+msgstr "Sisesta kehtiv Norra sotsiaalturvatunnus."
+
+#: contrib/localflavor/pe/forms.py:24
+msgid "This field requires 8 digits."
+msgstr "Sellel väljal peab olema 8 numbrit."
+
+#: contrib/localflavor/pe/forms.py:52
+msgid "This field requires 11 digits."
+msgstr "Sellel väljal peab olema 11 numbrit."
+
+#: contrib/localflavor/pl/forms.py:38
+msgid "National Identification Number consists of 11 digits."
+msgstr "Riiklik isikukood koosneb 11 numbrist."
+
+#: contrib/localflavor/pl/forms.py:39
+msgid "Wrong checksum for the National Identification Number."
+msgstr "Isikukoodil on vale kontrollsumma."
+
+#: contrib/localflavor/pl/forms.py:71
+msgid ""
+"Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX."
+msgstr ""
+"Sisesta maksumaksja number (NIP) formaadis XXX-XXX-XX-XX või XX-XX-XXX-XXX."
+
+#: contrib/localflavor/pl/forms.py:72
+msgid "Wrong checksum for the Tax Number (NIP)."
+msgstr "Maksukohustusnumbril (NIP) on vale kontrollsumma."
+
+#: contrib/localflavor/pl/forms.py:111
+msgid "National Business Register Number (REGON) consists of 7 or 9 digits."
+msgstr "Riikliku Äriregistri number (REGON) koosneb 7 või 9 numbrist."
+
+#: contrib/localflavor/pl/forms.py:112
+msgid "Wrong checksum for the National Business Register Number (REGON)."
+msgstr "Riiklikul Äriregistri numbril (REGON) on vale kontrollsumma."
+
+#: contrib/localflavor/pl/forms.py:155
+msgid "Enter a postal code in the format XX-XXX."
+msgstr "Sisesta postiindeks kujul XX-XXX."
+
+#: contrib/localflavor/pl/pl_voivodeships.py:8
+msgid "Lower Silesia"
+msgstr "Alam-Sileesia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:9
+msgid "Kuyavia-Pomerania"
+msgstr "Kujawy-Pomorze"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:10
+msgid "Lublin"
+msgstr "Lublin"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:11
+msgid "Lubusz"
+msgstr "Lubusz"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:12
+msgid "Lodz"
+msgstr "Łódź"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:13
+msgid "Lesser Poland"
+msgstr "Väike-Poola"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:14
+msgid "Masovia"
+msgstr "Masoovia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:15
+msgid "Opole"
+msgstr "Opole"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:16
+msgid "Subcarpatia"
+msgstr "Podkarpacie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:17
+msgid "Podlasie"
+msgstr "Podlaasia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:18
+msgid "Pomerania"
+msgstr "Pomorze"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:19
+msgid "Silesia"
+msgstr "Sileesia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:20
+msgid "Swietokrzyskie"
+msgstr "Święty Krzyżi"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:21
+msgid "Warmia-Masuria"
+msgstr "Warmia-Masuuria"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:22
+msgid "Greater Poland"
+msgstr "Suur-Poola"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:23
+msgid "West Pomerania"
+msgstr "Lääne-Pomorze"
+
+#: contrib/localflavor/ro/forms.py:19
+msgid "Enter a valid CIF."
+msgstr "Sisestage korrektne CIF."
+
+#: contrib/localflavor/ro/forms.py:56
+msgid "Enter a valid CNP."
+msgstr "Sisestage korrektne CNP."
+
+#: contrib/localflavor/ro/forms.py:141
+msgid "Enter a valid IBAN in ROXX-XXXX-XXXX-XXXX-XXXX-XXXX format"
+msgstr "Sisesta korrektne IBAN kujul ROXX-XXXX-XXXX-XXXX-XXXX-XXXX"
+
+#: contrib/localflavor/ro/forms.py:171
+msgid "Phone numbers must be in XXXX-XXXXXX format."
+msgstr "Telefoninumbrid peavad olema kujul XXXX-XXXXXX"
+
+#: contrib/localflavor/ro/forms.py:194
+msgid "Enter a valid postal code in the format XXXXXX"
+msgstr "Sisesta postiindeks kujul XXXXXX"
+
+#: contrib/localflavor/sk/forms.py:30
+msgid "Enter a postal code in the format XXXXX or XXX XX."
+msgstr "Sisesta postiindeks kujul XXXXX või XXX XX."
+
+#: contrib/localflavor/sk/sk_districts.py:8
+msgid "Banska Bystrica"
+msgstr "Banska Bystrica"
+
+#: contrib/localflavor/sk/sk_districts.py:9
+msgid "Banska Stiavnica"
+msgstr "Banska Stiavnica"
+
+#: contrib/localflavor/sk/sk_districts.py:10
+msgid "Bardejov"
+msgstr "Bardejov"
+
+#: contrib/localflavor/sk/sk_districts.py:11
+msgid "Banovce nad Bebravou"
+msgstr "Banovce nad Bebravou"
+
+#: contrib/localflavor/sk/sk_districts.py:12
+msgid "Brezno"
+msgstr "Brezno"
+
+#: contrib/localflavor/sk/sk_districts.py:13
+msgid "Bratislava I"
+msgstr "Bratislava I"
+
+#: contrib/localflavor/sk/sk_districts.py:14
+msgid "Bratislava II"
+msgstr "Bratislava II"
+
+#: contrib/localflavor/sk/sk_districts.py:15
+msgid "Bratislava III"
+msgstr "Bratislava III"
+
+#: contrib/localflavor/sk/sk_districts.py:16
+msgid "Bratislava IV"
+msgstr "Bratislava IV"
+
+#: contrib/localflavor/sk/sk_districts.py:17
+msgid "Bratislava V"
+msgstr "Bratislava V"
+
+#: contrib/localflavor/sk/sk_districts.py:18
+msgid "Bytca"
+msgstr "Bytca"
+
+#: contrib/localflavor/sk/sk_districts.py:19
+msgid "Cadca"
+msgstr "Cadca"
+
+#: contrib/localflavor/sk/sk_districts.py:20
+msgid "Detva"
+msgstr "Detva"
+
+#: contrib/localflavor/sk/sk_districts.py:21
+msgid "Dolny Kubin"
+msgstr "Dolny Kubin"
+
+#: contrib/localflavor/sk/sk_districts.py:22
+msgid "Dunajska Streda"
+msgstr "Dunajska Streda"
+
+#: contrib/localflavor/sk/sk_districts.py:23
+msgid "Galanta"
+msgstr "Galanta"
+
+#: contrib/localflavor/sk/sk_districts.py:24
+msgid "Gelnica"
+msgstr "Gelnica"
+
+#: contrib/localflavor/sk/sk_districts.py:25
+msgid "Hlohovec"
+msgstr "Hlohovec"
+
+#: contrib/localflavor/sk/sk_districts.py:26
+msgid "Humenne"
+msgstr "Humenne"
+
+#: contrib/localflavor/sk/sk_districts.py:27
+msgid "Ilava"
+msgstr "Ilava"
+
+#: contrib/localflavor/sk/sk_districts.py:28
+msgid "Kezmarok"
+msgstr "Kezmarok"
+
+#: contrib/localflavor/sk/sk_districts.py:29
+msgid "Komarno"
+msgstr "Komarno"
+
+#: contrib/localflavor/sk/sk_districts.py:30
+msgid "Kosice I"
+msgstr "Kosice I"
+
+#: contrib/localflavor/sk/sk_districts.py:31
+msgid "Kosice II"
+msgstr "Kosice II"
+
+#: contrib/localflavor/sk/sk_districts.py:32
+msgid "Kosice III"
+msgstr "Kosice III"
+
+#: contrib/localflavor/sk/sk_districts.py:33
+msgid "Kosice IV"
+msgstr "Kosice IV"
+
+#: contrib/localflavor/sk/sk_districts.py:34
+msgid "Kosice - okolie"
+msgstr "Kosice - okolie"
+
+#: contrib/localflavor/sk/sk_districts.py:35
+msgid "Krupina"
+msgstr "Krupina"
+
+#: contrib/localflavor/sk/sk_districts.py:36
+msgid "Kysucke Nove Mesto"
+msgstr "Kysucke Nove Mesto"
+
+#: contrib/localflavor/sk/sk_districts.py:37
+msgid "Levice"
+msgstr "Levice"
+
+#: contrib/localflavor/sk/sk_districts.py:38
+msgid "Levoca"
+msgstr "Levoca"
+
+#: contrib/localflavor/sk/sk_districts.py:39
+msgid "Liptovsky Mikulas"
+msgstr "Liptovsky Mikulas"
+
+#: contrib/localflavor/sk/sk_districts.py:40
+msgid "Lucenec"
+msgstr "Lucenec"
+
+#: contrib/localflavor/sk/sk_districts.py:41
+msgid "Malacky"
+msgstr "Malacky"
+
+#: contrib/localflavor/sk/sk_districts.py:42
+msgid "Martin"
+msgstr "Martin"
+
+#: contrib/localflavor/sk/sk_districts.py:43
+msgid "Medzilaborce"
+msgstr "Medzilaborce"
+
+#: contrib/localflavor/sk/sk_districts.py:44
+msgid "Michalovce"
+msgstr "Michalovce"
+
+#: contrib/localflavor/sk/sk_districts.py:45
+msgid "Myjava"
+msgstr "Myjava"
+
+#: contrib/localflavor/sk/sk_districts.py:46
+msgid "Namestovo"
+msgstr "Namestovo"
+
+#: contrib/localflavor/sk/sk_districts.py:47
+msgid "Nitra"
+msgstr "Nitra"
+
+#: contrib/localflavor/sk/sk_districts.py:48
+msgid "Nove Mesto nad Vahom"
+msgstr "Nove Mesto nad Vahom"
+
+#: contrib/localflavor/sk/sk_districts.py:49
+msgid "Nove Zamky"
+msgstr "Nove Zamky"
+
+#: contrib/localflavor/sk/sk_districts.py:50
+msgid "Partizanske"
+msgstr "Partizanske"
+
+#: contrib/localflavor/sk/sk_districts.py:51
+msgid "Pezinok"
+msgstr "Pezinok"
+
+#: contrib/localflavor/sk/sk_districts.py:52
+msgid "Piestany"
+msgstr "Piestany"
+
+#: contrib/localflavor/sk/sk_districts.py:53
+msgid "Poltar"
+msgstr "Poltar"
+
+#: contrib/localflavor/sk/sk_districts.py:54
+msgid "Poprad"
+msgstr "Poprad"
+
+#: contrib/localflavor/sk/sk_districts.py:55
+msgid "Povazska Bystrica"
+msgstr "Povazska Bystrica"
+
+#: contrib/localflavor/sk/sk_districts.py:56
+msgid "Presov"
+msgstr "Presov"
+
+#: contrib/localflavor/sk/sk_districts.py:57
+msgid "Prievidza"
+msgstr "Prievidza"
+
+#: contrib/localflavor/sk/sk_districts.py:58
+msgid "Puchov"
+msgstr "Puchov"
+
+#: contrib/localflavor/sk/sk_districts.py:59
+msgid "Revuca"
+msgstr "Revuca"
+
+#: contrib/localflavor/sk/sk_districts.py:60
+msgid "Rimavska Sobota"
+msgstr "Rimavska Sobota"
+
+#: contrib/localflavor/sk/sk_districts.py:61
+msgid "Roznava"
+msgstr "Roznava"
+
+#: contrib/localflavor/sk/sk_districts.py:62
+msgid "Ruzomberok"
+msgstr "Ruzomberok"
+
+#: contrib/localflavor/sk/sk_districts.py:63
+msgid "Sabinov"
+msgstr "Sabinov"
+
+#: contrib/localflavor/sk/sk_districts.py:64
+msgid "Senec"
+msgstr "Senec"
+
+#: contrib/localflavor/sk/sk_districts.py:65
+msgid "Senica"
+msgstr "Senica"
+
+#: contrib/localflavor/sk/sk_districts.py:66
+msgid "Skalica"
+msgstr "Skalica"
+
+#: contrib/localflavor/sk/sk_districts.py:67
+msgid "Snina"
+msgstr "Snina"
+
+#: contrib/localflavor/sk/sk_districts.py:68
+msgid "Sobrance"
+msgstr "Sobrance"
+
+#: contrib/localflavor/sk/sk_districts.py:69
+msgid "Spisska Nova Ves"
+msgstr "Spisska Nova Ves"
+
+#: contrib/localflavor/sk/sk_districts.py:70
+msgid "Stara Lubovna"
+msgstr "Stara Lubovna"
+
+#: contrib/localflavor/sk/sk_districts.py:71
+msgid "Stropkov"
+msgstr "Stropkov"
+
+#: contrib/localflavor/sk/sk_districts.py:72
+msgid "Svidnik"
+msgstr "Svidnik"
+
+#: contrib/localflavor/sk/sk_districts.py:73
+msgid "Sala"
+msgstr "Sala"
+
+#: contrib/localflavor/sk/sk_districts.py:74
+msgid "Topolcany"
+msgstr "Topolcany"
+
+#: contrib/localflavor/sk/sk_districts.py:75
+msgid "Trebisov"
+msgstr "Trebisov"
+
+#: contrib/localflavor/sk/sk_districts.py:76
+msgid "Trencin"
+msgstr "Trencin"
+
+#: contrib/localflavor/sk/sk_districts.py:77
+msgid "Trnava"
+msgstr "Trnava"
+
+#: contrib/localflavor/sk/sk_districts.py:78
+msgid "Turcianske Teplice"
+msgstr "Turcianske Teplice"
+
+#: contrib/localflavor/sk/sk_districts.py:79
+msgid "Tvrdosin"
+msgstr "Tvrdosin"
+
+#: contrib/localflavor/sk/sk_districts.py:80
+msgid "Velky Krtis"
+msgstr "Velky Krtis"
+
+#: contrib/localflavor/sk/sk_districts.py:81
+msgid "Vranov nad Toplou"
+msgstr "Vranov nad Toplou"
+
+#: contrib/localflavor/sk/sk_districts.py:82
+msgid "Zlate Moravce"
+msgstr "Zlate Moravce"
+
+#: contrib/localflavor/sk/sk_districts.py:83
+msgid "Zvolen"
+msgstr "Zvolen"
+
+#: contrib/localflavor/sk/sk_districts.py:84
+msgid "Zarnovica"
+msgstr "Zarnovica"
+
+#: contrib/localflavor/sk/sk_districts.py:85
+msgid "Ziar nad Hronom"
+msgstr "Ziar nad Hronom"
+
+#: contrib/localflavor/sk/sk_districts.py:86
+msgid "Zilina"
+msgstr "Zilina"
+
+#: contrib/localflavor/sk/sk_regions.py:8
+msgid "Banska Bystrica region"
+msgstr "Banská Bystrica regioon"
+
+#: contrib/localflavor/sk/sk_regions.py:9
+msgid "Bratislava region"
+msgstr "Bratislava regioon"
+
+#: contrib/localflavor/sk/sk_regions.py:10
+msgid "Kosice region"
+msgstr "Košice regioon"
+
+#: contrib/localflavor/sk/sk_regions.py:11
+msgid "Nitra region"
+msgstr "Nitra regioon"
+
+#: contrib/localflavor/sk/sk_regions.py:12
+msgid "Presov region"
+msgstr "Prešovi regioon"
+
+#: contrib/localflavor/sk/sk_regions.py:13
+msgid "Trencin region"
+msgstr "Trenšíni regioon"
+
+#: contrib/localflavor/sk/sk_regions.py:14
+msgid "Trnava region"
+msgstr "Trnava regioon"
+
+#: contrib/localflavor/sk/sk_regions.py:15
+msgid "Zilina region"
+msgstr "Žilina regioon"
+
+#: contrib/localflavor/uk/forms.py:21
+msgid "Enter a valid postcode."
+msgstr "Sisesta kehtiv postiindeks."
+
+#: contrib/localflavor/uk/uk_regions.py:11
+msgid "Bedfordshire"
+msgstr "Bedfordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:12
+msgid "Buckinghamshire"
+msgstr "Buckinghamshire"
+
+#: contrib/localflavor/uk/uk_regions.py:14
+msgid "Cheshire"
+msgstr "Cheshire"
+
+#: contrib/localflavor/uk/uk_regions.py:15
+msgid "Cornwall and Isles of Scilly"
+msgstr "Cornwall and Isles of Scilly"
+
+#: contrib/localflavor/uk/uk_regions.py:16
+msgid "Cumbria"
+msgstr "Cumbria"
+
+#: contrib/localflavor/uk/uk_regions.py:17
+msgid "Derbyshire"
+msgstr "Derbyshire"
+
+#: contrib/localflavor/uk/uk_regions.py:18
+msgid "Devon"
+msgstr "Devon"
+
+#: contrib/localflavor/uk/uk_regions.py:19
+msgid "Dorset"
+msgstr "Dorset"
+
+#: contrib/localflavor/uk/uk_regions.py:20
+msgid "Durham"
+msgstr "Durham"
+
+#: contrib/localflavor/uk/uk_regions.py:21
+msgid "East Sussex"
+msgstr "East Sussex"
+
+#: contrib/localflavor/uk/uk_regions.py:22
+msgid "Essex"
+msgstr "Essex"
+
+#: contrib/localflavor/uk/uk_regions.py:23
+msgid "Gloucestershire"
+msgstr "Gloucestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:24
+msgid "Greater London"
+msgstr "Suur-London"
+
+#: contrib/localflavor/uk/uk_regions.py:25
+msgid "Greater Manchester"
+msgstr "Suur-Manchester"
+
+#: contrib/localflavor/uk/uk_regions.py:26
+msgid "Hampshire"
+msgstr "Hampshire"
+
+#: contrib/localflavor/uk/uk_regions.py:27
+msgid "Hertfordshire"
+msgstr "Hertfordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:28
+msgid "Kent"
+msgstr "Kent"
+
+#: contrib/localflavor/uk/uk_regions.py:29
+msgid "Lancashire"
+msgstr "Lancashire"
+
+#: contrib/localflavor/uk/uk_regions.py:30
+msgid "Leicestershire"
+msgstr "Leicestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:31
+msgid "Lincolnshire"
+msgstr "Lincolnshire"
+
+#: contrib/localflavor/uk/uk_regions.py:32
+msgid "Merseyside"
+msgstr "Merseyside"
+
+#: contrib/localflavor/uk/uk_regions.py:33
+msgid "Norfolk"
+msgstr "Norfolk"
+
+#: contrib/localflavor/uk/uk_regions.py:34
+msgid "North Yorkshire"
+msgstr "North Yorkshire"
+
+#: contrib/localflavor/uk/uk_regions.py:35
+msgid "Northamptonshire"
+msgstr "Northamptonshire"
+
+#: contrib/localflavor/uk/uk_regions.py:36
+msgid "Northumberland"
+msgstr "Northumberland"
+
+#: contrib/localflavor/uk/uk_regions.py:37
+msgid "Nottinghamshire"
+msgstr "Nottinghamshire"
+
+#: contrib/localflavor/uk/uk_regions.py:38
+msgid "Oxfordshire"
+msgstr "Oxfordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:39
+msgid "Shropshire"
+msgstr "Shropshire"
+
+#: contrib/localflavor/uk/uk_regions.py:40
+msgid "Somerset"
+msgstr "Somerset"
+
+#: contrib/localflavor/uk/uk_regions.py:41
+msgid "South Yorkshire"
+msgstr "Lõuna-Yorkshire"
+
+#: contrib/localflavor/uk/uk_regions.py:42
+msgid "Staffordshire"
+msgstr "Staffordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:43
+msgid "Suffolk"
+msgstr "Suffolk"
+
+#: contrib/localflavor/uk/uk_regions.py:44
+msgid "Surrey"
+msgstr "Surrey"
+
+#: contrib/localflavor/uk/uk_regions.py:45
+msgid "Tyne and Wear"
+msgstr "Tyne ja Wear"
+
+#: contrib/localflavor/uk/uk_regions.py:46
+msgid "Warwickshire"
+msgstr "Warwickshire"
+
+#: contrib/localflavor/uk/uk_regions.py:47
+msgid "West Midlands"
+msgstr "West Midlands"
+
+#: contrib/localflavor/uk/uk_regions.py:48
+msgid "West Sussex"
+msgstr "Lääne-Sussex"
+
+#: contrib/localflavor/uk/uk_regions.py:49
+msgid "West Yorkshire"
+msgstr "Lääne-Yorkshire"
+
+#: contrib/localflavor/uk/uk_regions.py:50
+msgid "Wiltshire"
+msgstr "Wiltshire"
+
+#: contrib/localflavor/uk/uk_regions.py:51
+msgid "Worcestershire"
+msgstr "Worcestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:55
+msgid "County Antrim"
+msgstr "County Antrim"
+
+#: contrib/localflavor/uk/uk_regions.py:56
+msgid "County Armagh"
+msgstr "County Armagh"
+
+#: contrib/localflavor/uk/uk_regions.py:57
+msgid "County Down"
+msgstr "County Down"
+
+#: contrib/localflavor/uk/uk_regions.py:58
+msgid "County Fermanagh"
+msgstr "County Fermanagh"
+
+#: contrib/localflavor/uk/uk_regions.py:59
+msgid "County Londonderry"
+msgstr "County Londonderry"
+
+#: contrib/localflavor/uk/uk_regions.py:60
+msgid "County Tyrone"
+msgstr "County Tyrone"
+
+#: contrib/localflavor/uk/uk_regions.py:64
+msgid "Clwyd"
+msgstr "Clwyd"
+
+#: contrib/localflavor/uk/uk_regions.py:65
+msgid "Dyfed"
+msgstr "Dyfed"
+
+#: contrib/localflavor/uk/uk_regions.py:66
+msgid "Gwent"
+msgstr "Gwent"
+
+#: contrib/localflavor/uk/uk_regions.py:67
+msgid "Gwynedd"
+msgstr "Gwynedd"
+
+#: contrib/localflavor/uk/uk_regions.py:68
+msgid "Mid Glamorgan"
+msgstr "Mid Glamorgan"
+
+#: contrib/localflavor/uk/uk_regions.py:69
+msgid "Powys"
+msgstr "Powys"
+
+#: contrib/localflavor/uk/uk_regions.py:70
+msgid "South Glamorgan"
+msgstr "South Glamorgan"
+
+#: contrib/localflavor/uk/uk_regions.py:71
+msgid "West Glamorgan"
+msgstr "Lääne-Glamorgan"
+
+#: contrib/localflavor/uk/uk_regions.py:75
+msgid "Borders"
+msgstr "Piirid"
+
+#: contrib/localflavor/uk/uk_regions.py:76
+msgid "Central Scotland"
+msgstr "Kesk-Šotimaa"
+
+#: contrib/localflavor/uk/uk_regions.py:77
+msgid "Dumfries and Galloway"
+msgstr "Dumfries and Galloway"
+
+#: contrib/localflavor/uk/uk_regions.py:78
+msgid "Fife"
+msgstr "Fife"
+
+#: contrib/localflavor/uk/uk_regions.py:79
+msgid "Grampian"
+msgstr "Grampian"
+
+#: contrib/localflavor/uk/uk_regions.py:80
+msgid "Highland"
+msgstr "Highland"
+
+#: contrib/localflavor/uk/uk_regions.py:81
+msgid "Lothian"
+msgstr "Lothian"
+
+#: contrib/localflavor/uk/uk_regions.py:82
+msgid "Orkney Islands"
+msgstr "Orkney saared"
+
+#: contrib/localflavor/uk/uk_regions.py:83
+msgid "Shetland Islands"
+msgstr "Shetlandi saared"
+
+#: contrib/localflavor/uk/uk_regions.py:84
+msgid "Strathclyde"
+msgstr "Strathclyde"
+
+#: contrib/localflavor/uk/uk_regions.py:85
+msgid "Tayside"
+msgstr "Tayside"
+
+#: contrib/localflavor/uk/uk_regions.py:86
+msgid "Western Isles"
+msgstr "Western Isles"
+
+#: contrib/localflavor/uk/uk_regions.py:90
+msgid "England"
+msgstr "Inglismaa"
+
+#: contrib/localflavor/uk/uk_regions.py:91
+msgid "Northern Ireland"
+msgstr "Põhja-Iirimaa"
+
+#: contrib/localflavor/uk/uk_regions.py:92
+msgid "Scotland"
+msgstr "Šotimaa"
+
+#: contrib/localflavor/uk/uk_regions.py:93
+msgid "Wales"
+msgstr "Wales"
+
+#: contrib/localflavor/us/forms.py:16
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "Sisesta postiindeks kujul XXXXX või XXXXX-XXXX."
+
+#: contrib/localflavor/us/forms.py:54
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr "Sisesta kehtiv U.S. Social Security number formaadis XXX-XX-XXXX."
+
+#: contrib/localflavor/za/forms.py:20
+msgid "Enter a valid South African ID number"
+msgstr "Sisesta kehtiv Lõuna-Aafrika ID-number"
+
+#: contrib/localflavor/za/forms.py:54
+msgid "Enter a valid South African postal code"
+msgstr "Sisesta kehtiv Lõuna-Aafrika postiindeks"
+
+#: contrib/localflavor/za/za_provinces.py:4
+msgid "Eastern Cape"
+msgstr "Eastern Cape"
+
+#: contrib/localflavor/za/za_provinces.py:5
+msgid "Free State"
+msgstr "Free State"
+
+#: contrib/localflavor/za/za_provinces.py:6
+msgid "Gauteng"
+msgstr "Gauteng"
+
+#: contrib/localflavor/za/za_provinces.py:7
+msgid "KwaZulu-Natal"
+msgstr "KwaZulu-Natal"
+
+#: contrib/localflavor/za/za_provinces.py:8
+msgid "Limpopo"
+msgstr "Limpopo"
+
+#: contrib/localflavor/za/za_provinces.py:9
+msgid "Mpumalanga"
+msgstr "Mpumalanga"
+
+#: contrib/localflavor/za/za_provinces.py:10
+msgid "Northern Cape"
+msgstr "Northern Cape"
+
+#: contrib/localflavor/za/za_provinces.py:11
+msgid "North West"
+msgstr "North West"
+
+#: contrib/localflavor/za/za_provinces.py:12
+msgid "Western Cape"
+msgstr "Western Cape"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "ümbersuunatav asukoht"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"See peaks olema absoluutne asukoht, v.a. domeeninimi. Näide: '/events/"
+"search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "suuna aadressile"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"See võib olla kas absoluutne asukoht (nagu ülemine) või täielik URL algusega "
+"'http://'."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "suunamine"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "suunamised"
+
+#: contrib/sessions/models.py:45
+msgid "session key"
+msgstr "sessioonivõti"
+
+#: contrib/sessions/models.py:47
+msgid "session data"
+msgstr "sessiooni andmed"
+
+#: contrib/sessions/models.py:48
+msgid "expire date"
+msgstr "kehtivusaja lõpp"
+
+#: contrib/sessions/models.py:53
+msgid "session"
+msgstr "sessioon"
+
+#: contrib/sessions/models.py:54
+msgid "sessions"
+msgstr "sessioonid"
+
+#: contrib/sites/models.py:32
+msgid "domain name"
+msgstr "domeeninimi"
+
+#: contrib/sites/models.py:33
+msgid "display name"
+msgstr "hüüdnimi"
+
+#: contrib/sites/models.py:39
+msgid "sites"
+msgstr "saidid"
+
+#: core/validators.py:80
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr ""
+"See väärtus võib sisaldada ainult tähti, nubmreid, alakriipse ja sidekriipse."
+
+#: core/validators.py:84
+msgid "Uppercase letters are not allowed here."
+msgstr "Suured tähed ei ole siin lubatud."
+
+#: core/validators.py:88
+msgid "Lowercase letters are not allowed here."
+msgstr "Väiksed tähed ei ole siin lubatud."
+
+#: core/validators.py:95
+msgid "Enter only digits separated by commas."
+msgstr "Sisestage ainult komaga eraldatud numbreid."
+
+#: core/validators.py:107
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Sisestage korrektseid komaga eraldatud e-posti aadresseid."
+
+#: core/validators.py:111
+msgid "Please enter a valid IP address."
+msgstr "Palun sisestage korrektne IP aadress."
+
+#: core/validators.py:115
+msgid "Empty values are not allowed here."
+msgstr "Tühjad väärtused ei ole siin lubatud."
+
+#: core/validators.py:119
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Mittenumbrilised märgid ei ole siin lubatud."
+
+#: core/validators.py:123
+msgid "This value can't be comprised solely of digits."
+msgstr "See väärtus ei tohi sisaldada ainult numbreid."
+
+#: core/validators.py:128 forms/fields.py:161
+msgid "Enter a whole number."
+msgstr "Sisestage täisarv."
+
+#: core/validators.py:132
+msgid "Only alphabetical characters are allowed here."
+msgstr "Siin on lubatud ainult tähestiku tähed."
+
+#: core/validators.py:147
+#, python-format
+msgid "Invalid date: %s"
+msgstr "Ebakorrektne kuupäev: %s"
+
+#: core/validators.py:152 db/models/fields/__init__.py:546
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Sisestage korrektne kuupäev formaadis AAAA-KK-PP."
+
+#: core/validators.py:157
+msgid "Enter a valid time in HH:MM format."
+msgstr "Sisestage korrektne kellaaeg formaadis TT:MM"
+
+#: core/validators.py:161
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Sisestage korrektne kuupäev ja kellaaeg formaadis AAAA-KK-PP TT:MM."
+
+#: core/validators.py:166 forms/fields.py:422
+msgid "Enter a valid e-mail address."
+msgstr "Sisestage korrektne e-posti aadress:"
+
+#: core/validators.py:178 core/validators.py:470 forms/fields.py:440
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Ühtegi faili ei saadetud. Kontrollige vormi kodeeringutüüpi."
+
+#: core/validators.py:189 forms/fields.py:471
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Laadige korrektne pilt. Fail, mille laadisite, ei olnud kas pilt või oli "
+"fail vigane."
+
+#: core/validators.py:196
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "URL %s ei viita korrektsele pildile."
+
+#: core/validators.py:200
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Telefoninumbrid peavad olema formaadis XXX-XXX-XXXX. \"%s\" on ebakorrektne."
+
+#: core/validators.py:208
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "URL %s ei viita korrektsele QuickTime videole."
+
+#: core/validators.py:212
+msgid "A valid URL is required."
+msgstr "Korrektne URL on nõutav."
+
+#: core/validators.py:226
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Korrektne HTML on nõutav. Vead on järgnevad:\n"
+"%s"
+
+#: core/validators.py:233
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Vigane XML: %s"
+
+#: core/validators.py:250
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Vigane URL: %s"
+
+#: core/validators.py:255 core/validators.py:257
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "URL %s on katkine."
+
+#: core/validators.py:263
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Sisestage korrektne USA osariigilühend."
+
+#: core/validators.py:277
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Jälgige oma keelekasutust. Sõna %s ei ole lubatud."
+msgstr[1] "Jälgige oma keelekasutust. Sõnad %s ei ole lubatud."
+
+#: core/validators.py:284
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "See väli peab sobima väljaga '%s'."
+
+#: core/validators.py:303
+msgid "Please enter something for at least one field."
+msgstr "Palun täitke vähemalt üks väli."
+
+#: core/validators.py:312 core/validators.py:323
+msgid "Please enter both fields or leave them both empty."
+msgstr "Palun täitke mõlemad lahtrid või jätke mõlemad tühjaks."
+
+#: core/validators.py:331
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "See lahter on kohustuslik, kui %(field)s on %(value)s"
+
+#: core/validators.py:344
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "See lahter on nõutav, kui %(field)s ei ole %(value)s"
+
+#: core/validators.py:363
+msgid "Duplicate values are not allowed."
+msgstr "Mitte-unikaalsed väärtused ei ole lubatud."
+
+#: core/validators.py:378
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "See väärtus peab olema vahemikus %(lower)s kuni %(upper)s."
+
+#: core/validators.py:380
+#, python-format
+msgid "This value must be at least %s."
+msgstr "See väärtus peab olema vähemalt %s."
+
+#: core/validators.py:382
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "See väärtus ei tohi olla rohkem kui %s."
+
+#: core/validators.py:423
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "See väärtus peab jaguma arvuga %s."
+
+#: core/validators.py:433
+msgid "Please enter a valid decimal number."
+msgstr "Palun sisestage korrektne kümnendarv."
+
+#: core/validators.py:440
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Palun sisestage %s-kohaline kümnendarv."
+msgstr[1] "Palun sisestage %s-kohaline kümnendarv."
+
+#: core/validators.py:443
+#, python-format
+msgid ""
+"Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural ""
+"Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] "Palun sisestage korrektne kümnendarv, mille täisosa on %s-kohaline"
+msgstr[1] "Palun sisestage korrektne kümnendarv, mille täisosa on %s-kohaline"
+
+#: core/validators.py:446
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] ""
+"Palun sisestage korrektne kümnendarv, millel on maksimaalselt %s komakoht."
+msgstr[1] ""
+"Palun sisestage korrektne kümnendarv, millel on maksimaalselt %s komakohta."
+
+#: core/validators.py:454
+msgid "Please enter a valid floating point number."
+msgstr "Palun sisestage korrektne murdarv."
+
+#: core/validators.py:463
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Veenduge, et üleslaetud fail on vähemalt %s baiti suur."
+
+#: core/validators.py:464
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Veenduge, et üleslaetud fail ei ole suurem kui %s baiti."
+
+#: core/validators.py:481
+msgid "The format for this field is wrong."
+msgstr "Selle lahtri formaat on ebakorrektne."
+
+#: core/validators.py:496
+msgid "This field is invalid."
+msgstr "See lahter on ebakorrektne."
+
+#: core/validators.py:532
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Ei õnnestunud leida midagi aadressilt %s."
+
+#: core/validators.py:535
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "URL %(url)s tagastas sobimatu Content-Type päise '%(contenttype)s'."
+
+#: core/validators.py:568
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Palun sulgege sulgemata jäänud %(tag)s lipik real %(line)s. (Rea algus: \"%"
+"(start)s\".)"
+
+#: core/validators.py:572
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Rida %(line)s sisaldab teksti, mis ei ole selles kontekstis lubatud. (Rea "
+"algus: \"%(start)s\".)"
+
+#: core/validators.py:577
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"Real %(line)s on vigane attribute \"%(attr)s\". (Rea algus: \"%(start)s\".)"
+
+#: core/validators.py:582
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"Real %(line)s on vigane lipik \"<%(tag)s>\". (Rea algus: \"%(start)s\".)"
+
+#: core/validators.py:586
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Real %(line)s on lipik, millel on puudu üks või enam nõutavatest "
+"atribuutidest. (Rea algus: \"%(start)s\".)"
+
+#: core/validators.py:591
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Real %(line)s on atribuut \"%(attr)s\", mille väärtus on vigane. (Rea algus: "
+"\"%(start)s\".)"
+
+#: db/models/manipulators.py:304
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr ""
+"%(type)s tüüpi %(object)s on juba olemas etteantud väärtustele %(field)s."
+
+#: db/models/fields/__init__.py:46
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr ""
+
+#: db/models/fields/__init__.py:320 db/models/fields/files.py:168
+#: db/models/fields/files.py:179 forms/fields.py:52 oldforms/__init__.py:370
+msgid "This field is required."
+msgstr "See lahter on nõutav."
+
+#: db/models/fields/__init__.py:434
+msgid "This value must be an integer."
+msgstr "See väärtus peab olema täisarv."
+
+#: db/models/fields/__init__.py:480
+msgid "This value must be either True or False."
+msgstr "See väärtus peab olema kas tõene või väär"
+
+#: db/models/fields/__init__.py:509
+msgid "This field cannot be null."
+msgstr "See lahter ei tohi olla tühi."
+
+#: db/models/fields/__init__.py:611 db/models/fields/__init__.py:628
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format."
+msgstr ""
+"Sisestage korrektne kuupäev ja kellaaeg kujul AAAA-KK-PP TT:MM[:ss[.uuuuuu]]."
+
+#: db/models/fields/__init__.py:684
+msgid "This value must be a decimal number."
+msgstr "See väärtus peab olema kümnendarv."
+
+#: db/models/fields/__init__.py:825
+msgid "This value must be either None, True or False."
+msgstr "See väärtus peab olema kas tühi, tõene või väär."
+
+#: db/models/fields/__init__.py:937 db/models/fields/__init__.py:950
+msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format."
+msgstr "Sisestage korrektne kellaaeg formaadis TT:MM[:ss[.uuuuuu]]"
+
+#: db/models/fields/files.py:188
+msgid "Enter a valid filename."
+msgstr "Sisestage korrektne failinimi."
+
+#: db/models/fields/related.py:92
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Palun sisestage korrektne %s."
+
+#: db/models/fields/related.py:782
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "Et valida mitu, hoidke all \"Control\"-nuppu (Maci puhul \"Command\")."
+
+#: db/models/fields/related.py:862
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "Palun sisestage korrektne %(self)s ID. Väärtus %(value)r on vigane."
+msgstr[1] ""
+"Palun sisestage korrektne %(self)s ID. Väärtused %(value)r on vigased."
+
+#: forms/fields.py:53
+msgid "Enter a valid value."
+msgstr "Sisestage korrektne väärtus."
+
+#: forms/fields.py:133
+#, python-format
+msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+msgstr ""
+"Veenduge, et see väärtus sisaldab kõige rohkem %(max)d tähemärki (hetkel on %"
+"(length)d)."
+
+#: forms/fields.py:134
+#, python-format
+msgid "Ensure this value has at least %(min)d characters (it has %(length)d)."
+msgstr ""
+"Veenduge, et see väärtus sisaldab vähemalt %(min)d märki (hetkel on %(length)"
+"d)."
+
+#: forms/fields.py:162 forms/fields.py:191 forms/fields.py:220
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Veenduge, et see väärtus on väiksem või võrdne kui %s."
+
+#: forms/fields.py:163 forms/fields.py:192 forms/fields.py:221
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Veenduge, et see väärtus on suurem või võrdne kui %s."
+
+#: forms/fields.py:190 forms/fields.py:219
+msgid "Enter a number."
+msgstr "Sisestage arv."
+
+#: forms/fields.py:222
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr "Veenduge, et kogu numbrikohtade arv ei ületaks %s."
+
+#: forms/fields.py:223
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr "Veenduge, et komakohtade arv ei ületaks %s."
+
+#: forms/fields.py:224
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr "Veenduge, et komast vasakul olevaid numbreid ei oleks rohkem kui %s."
+
+#: forms/fields.py:282 forms/fields.py:803
+msgid "Enter a valid date."
+msgstr "Sisestage korrektne kuupäev."
+
+#: forms/fields.py:315 forms/fields.py:804
+msgid "Enter a valid time."
+msgstr "Sisestage korrektne kellaaeg."
+
+#: forms/fields.py:354
+msgid "Enter a valid date/time."
+msgstr "Sisestage korrektne kuupäev ja kellaaeg."
+
+#: forms/fields.py:441
+msgid "No file was submitted."
+msgstr "Ühtegi faili ei saadetud."
+
+#: forms/fields.py:442 oldforms/__init__.py:689
+msgid "The submitted file is empty."
+msgstr "Saadetud fail on tühi."
+
+#: forms/fields.py:532
+msgid "Enter a valid URL."
+msgstr "Sisestage korrektne URL."
+
+#: forms/fields.py:533
+msgid "This URL appears to be a broken link."
+msgstr "See URL näib olevat katkine."
+
+#: forms/fields.py:601 forms/fields.py:652
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "Valige korrektne väärtus. %(value)s ei ole valitav."
+
+#: forms/fields.py:653 forms/fields.py:714 forms/models.py:528
+msgid "Enter a list of values."
+msgstr "Sisestage väärtuste nimekiri."
+
+#: forms/fields.py:832
+msgid "Enter a valid IPv4 address."
+msgstr "Sisestage korrektne IPv4 aadress."
+
+#: forms/models.py:461
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Valige korrektne väärtus. Valitud väärtus ei ole valitav."
+
+#: forms/models.py:529
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Valige korrektne väärtus. %s ei ole valitav."
+
+#: oldforms/__init__.py:405
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Veenduge, et tekst on alla %s tähemärgi."
+msgstr[1] "Veenduge, et tekst on alla %s tähemärgi."
+
+#: oldforms/__init__.py:410
+msgid "Line breaks are not allowed here."
+msgstr "Reavahetused ei ole lubatud."
+
+#: oldforms/__init__.py:508 oldforms/__init__.py:582 oldforms/__init__.py:621
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Valige korrektne väärtus; '%(data)s' ei kuulu valikutesse %(choices)s."
+
+#: oldforms/__init__.py:750
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Sisestage täisarv vahemikus -32 768 kuni 32 767."
+
+#: oldforms/__init__.py:760
+msgid "Enter a positive number."
+msgstr "Sisestage postiivne arv."
+
+#: oldforms/__init__.py:770
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Sisestage täisarv vahemikus 0 kuni 32 767."
+
+#: template/defaultfilters.py:698
+msgid "yes,no,maybe"
+msgstr "jah,ei,võib-olla"
+
+#: template/defaultfilters.py:729
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d bait"
+msgstr[1] "%(size)d baiti"
+
+#: template/defaultfilters.py:731
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f KB"
+
+#: template/defaultfilters.py:733
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: template/defaultfilters.py:734
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#: utils/dateformat.py:41
+msgid "p.m."
+msgstr "p.l."
+
+#: utils/dateformat.py:42
+msgid "a.m."
+msgstr "e.l."
+
+#: utils/dateformat.py:47
+msgid "PM"
+msgstr "PL"
+
+#: utils/dateformat.py:48
+msgid "AM"
+msgstr "EL"
+
+#: utils/dateformat.py:97
+msgid "midnight"
+msgstr "südaöö"
+
+#: utils/dateformat.py:99
+msgid "noon"
+msgstr "keskpäev"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "esmaspäev"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "teisipäev"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "kolmapäev"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "neljapäev"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "reede"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "laupäev"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "pühapäev"
+
+#: utils/dates.py:10
+msgid "Mon"
+msgstr "esmasp."
+
+#: utils/dates.py:10
+msgid "Tue"
+msgstr "teisip."
+
+#: utils/dates.py:10
+msgid "Wed"
+msgstr "kolmap."
+
+#: utils/dates.py:10
+msgid "Thu"
+msgstr "neljap."
+
+#: utils/dates.py:10
+msgid "Fri"
+msgstr "reede"
+
+#: utils/dates.py:11
+msgid "Sat"
+msgstr "laup."
+
+#: utils/dates.py:11
+msgid "Sun"
+msgstr "pühap."
+
+#: utils/dates.py:18
+msgid "January"
+msgstr "jaanuar"
+
+#: utils/dates.py:18
+msgid "February"
+msgstr "veebruar"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "March"
+msgstr "märts"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "April"
+msgstr "aprill"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "May"
+msgstr "mai"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "June"
+msgstr "juuni"
+
+#: utils/dates.py:19 utils/dates.py:31
+msgid "July"
+msgstr "juuli"
+
+#: utils/dates.py:19
+msgid "August"
+msgstr "august"
+
+#: utils/dates.py:19
+msgid "September"
+msgstr "september"
+
+#: utils/dates.py:19
+msgid "October"
+msgstr "oktoober"
+
+#: utils/dates.py:19
+msgid "November"
+msgstr "november"
+
+#: utils/dates.py:20
+msgid "December"
+msgstr "detsember"
+
+#: utils/dates.py:23
+msgid "jan"
+msgstr "jaan"
+
+#: utils/dates.py:23
+msgid "feb"
+msgstr "veeb"
+
+#: utils/dates.py:23
+msgid "mar"
+msgstr "märts"
+
+#: utils/dates.py:23
+msgid "apr"
+msgstr "apr"
+
+#: utils/dates.py:23
+msgid "may"
+msgstr "mai"
+
+#: utils/dates.py:23
+msgid "jun"
+msgstr "jun"
+
+#: utils/dates.py:24
+msgid "jul"
+msgstr "jul"
+
+#: utils/dates.py:24
+msgid "aug"
+msgstr "aug"
+
+#: utils/dates.py:24
+msgid "sep"
+msgstr "sept"
+
+#: utils/dates.py:24
+msgid "oct"
+msgstr "okt"
+
+#: utils/dates.py:24
+msgid "nov"
+msgstr "nov"
+
+#: utils/dates.py:24
+msgid "dec"
+msgstr "dets"
+
+#: utils/dates.py:31
+msgid "Jan."
+msgstr "Jaan."
+
+#: utils/dates.py:31
+msgid "Feb."
+msgstr "Veeb."
+
+#: utils/dates.py:32
+msgid "Aug."
+msgstr "Aug."
+
+#: utils/dates.py:32
+msgid "Sept."
+msgstr "Sept."
+
+#: utils/dates.py:32
+msgid "Oct."
+msgstr "Okt."
+
+#: utils/dates.py:32
+msgid "Nov."
+msgstr "Nov."
+
+#: utils/dates.py:32
+msgid "Dec."
+msgstr "Dets."
+
+#: utils/text.py:128
+msgid "or"
+msgstr "või"
+
+#: utils/timesince.py:21
+msgid "year"
+msgid_plural "years"
+msgstr[0] "aasta"
+msgstr[1] "aastat"
+
+#: utils/timesince.py:22
+msgid "month"
+msgid_plural "months"
+msgstr[0] "kuu"
+msgstr[1] "kuud"
+
+#: utils/timesince.py:23
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "nädal"
+msgstr[1] "nädalat"
+
+#: utils/timesince.py:24
+msgid "day"
+msgid_plural "days"
+msgstr[0] "päev"
+msgstr[1] "päeva"
+
+#: utils/timesince.py:25
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "tund"
+msgstr[1] "tundi"
+
+#: utils/timesince.py:26
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minut"
+msgstr[1] "minutit"
+
+#: utils/timesince.py:46
+msgid "minutes"
+msgstr "minutit"
+
+#: utils/timesince.py:51
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr "%(number)d %(type)s"
+
+#: utils/timesince.py:57
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ", %(number)d %(type)s"
+
+#: utils/translation/trans_real.py:401
+msgid "DATE_FORMAT"
+msgstr "N j, Y"
+
+#: utils/translation/trans_real.py:402
+msgid "DATETIME_FORMAT"
+msgstr "j. N Y, H:i"
+
+#: utils/translation/trans_real.py:403
+msgid "TIME_FORMAT"
+msgstr "H:i"
+
+#: utils/translation/trans_real.py:419
+msgid "YEAR_MONTH_FORMAT"
+msgstr "F Y"
+
+#: utils/translation/trans_real.py:420
+msgid "MONTH_DAY_FORMAT"
+msgstr "j. F"
+
+#: views/generic/create_update.py:114
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "%(verbose_name)s edukalt loodud."
+
+#: views/generic/create_update.py:156
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "%(verbose_name)s edukalt muudetud."
+
+#: views/generic/create_update.py:198
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "%(verbose_name)s kustutatud."
diff --git a/webapp/django/conf/locale/et/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/et/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..2dc026e
--- /dev/null
+++ b/webapp/django/conf/locale/et/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/et/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/et/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..5a62fe3
--- /dev/null
+++ b/webapp/django/conf/locale/et/LC_MESSAGES/djangojs.po
@@ -0,0 +1,117 @@
+# Estonian translation for the Django Project.
+# Copyright (C) 2008, Django Project
+# This file is distributed under the same license as the django package.
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: <removethis-eallik_at_gmail-com>\n"
+"POT-Creation-Date: 2008-06-02 19:42+0300\n"
+"PO-Revision-Date: 2008-06-17 12:29+0300\n"
+"Last-Translator: Erik Allik <removethis-eallik_at_gmail-com>\n"
+"Language-Team: Django-i18n <django-i18n@googlegroups.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "Saadaval %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Vali kõik"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Lisa"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Eemalda"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Valitud %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Tee valik(ud) ja klõpsa"
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Puhasta kõik"
+
+#: contrib/admin/media/js/calendar.js:24
+#: contrib/admin/media/js/dateparse.js:32
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Jaanuar Veebruar Märts Aprill Mai Juuni Juuli August September Oktoober "
+"November Detsember"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "P E T K N R L"
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Pühapäev Esmaspäev Teisipäev Kolmapäev Neljapäev Reede Laupäev"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr "Näita"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr "Varja"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Now"
+msgstr "Praegu"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
+msgid "Clock"
+msgstr "Kell"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
+msgid "Choose a time"
+msgstr "Vali aeg"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "Midnight"
+msgstr "Kesköö"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "6 a.m."
+msgstr "6 hommikul"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
+msgid "Noon"
+msgstr "Keskpäev"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
+msgid "Cancel"
+msgstr "Tühista"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
+msgid "Today"
+msgstr "Täna"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
+msgid "Calendar"
+msgstr "Kalender"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
+msgid "Yesterday"
+msgstr "Eile"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
+msgid "Tomorrow"
+msgstr "Homme"
diff --git a/webapp/django/conf/locale/eu/LC_MESSAGES/django.mo b/webapp/django/conf/locale/eu/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..c19c321
--- /dev/null
+++ b/webapp/django/conf/locale/eu/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/eu/LC_MESSAGES/django.po b/webapp/django/conf/locale/eu/LC_MESSAGES/django.po
new file mode 100644
index 0000000..37a829d
--- /dev/null
+++ b/webapp/django/conf/locale/eu/LC_MESSAGES/django.po
@@ -0,0 +1,4248 @@
+# translation of django.po to
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-08 19:37+0100\n"
+"PO-Revision-Date: 2008-02-14 22:12+0100\n"
+"Last-Translator: Ibon\n"
+"Language-Team:  <es@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "Arabiera"
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "Bengalera"
+
+#: conf/global_settings.py:41
+msgid "Bulgarian"
+msgstr "Bulgariera"
+
+#: conf/global_settings.py:42
+msgid "Catalan"
+msgstr "Katalana"
+
+#: conf/global_settings.py:43
+msgid "Czech"
+msgstr "Txekiera"
+
+#: conf/global_settings.py:44
+msgid "Welsh"
+msgstr "Gales"
+
+#: conf/global_settings.py:45
+msgid "Danish"
+msgstr "Daniera"
+
+#: conf/global_settings.py:46
+msgid "German"
+msgstr "Alemaniera"
+
+#: conf/global_settings.py:47
+msgid "Greek"
+msgstr "Greziera"
+
+#: conf/global_settings.py:48
+msgid "English"
+msgstr "Ingeles"
+
+#: conf/global_settings.py:49
+msgid "Spanish"
+msgstr "Espainola"
+
+#: conf/global_settings.py:50
+msgid "Argentinean Spanish"
+msgstr "Argentinako espainola"
+
+#: conf/global_settings.py:51
+msgid "Persian"
+msgstr "Persiera"
+
+#: conf/global_settings.py:52
+msgid "Finnish"
+msgstr "Finlandesa"
+
+#: conf/global_settings.py:53
+msgid "French"
+msgstr "Frantzesa"
+
+#: conf/global_settings.py:54
+msgid "Gaeilge"
+msgstr "Gaelikoa"
+
+#: conf/global_settings.py:55
+msgid "Galician"
+msgstr "Galiziarra"
+
+#: conf/global_settings.py:56
+msgid "Hungarian"
+msgstr "Hungarierra"
+
+#: conf/global_settings.py:57
+msgid "Hebrew"
+msgstr "Hebreera"
+
+#: conf/global_settings.py:58
+msgid "Croatian"
+msgstr "Kroaziarra"
+
+#: conf/global_settings.py:59
+msgid "Icelandic"
+msgstr "Islandiera"
+
+#: conf/global_settings.py:60
+msgid "Italian"
+msgstr "Italiera"
+
+#: conf/global_settings.py:61
+msgid "Japanese"
+msgstr "Japoniera"
+
+#: conf/global_settings.py:62
+msgid "Korean"
+msgstr "Koreera"
+
+#: conf/global_settings.py:63
+msgid "Khmer"
+msgstr "khemerera"
+
+#: conf/global_settings.py:64
+msgid "Kannada"
+msgstr "Kanadiera"
+
+#: conf/global_settings.py:65
+msgid "Latvian"
+msgstr "Lituaniera"
+
+#: conf/global_settings.py:66
+msgid "Macedonian"
+msgstr "Mazedoniera"
+
+#: conf/global_settings.py:67
+msgid "Dutch"
+msgstr "Holandesa"
+
+#: conf/global_settings.py:68
+msgid "Norwegian"
+msgstr "Norvegiera"
+
+#: conf/global_settings.py:69
+msgid "Polish"
+msgstr "Poloniera"
+
+#: conf/global_settings.py:70
+msgid "Portugese"
+msgstr "Portugalera"
+
+#: conf/global_settings.py:71
+msgid "Brazilian"
+msgstr "Brasilgo portugalera"
+
+#: conf/global_settings.py:72
+msgid "Romanian"
+msgstr "Errumaniera"
+
+#: conf/global_settings.py:73
+msgid "Russian"
+msgstr "Errusiera"
+
+#: conf/global_settings.py:74
+msgid "Slovak"
+msgstr "Eslovakiera"
+
+#: conf/global_settings.py:75
+msgid "Slovenian"
+msgstr "Esloveniera"
+
+#: conf/global_settings.py:76
+msgid "Serbian"
+msgstr "Serbiera"
+
+#: conf/global_settings.py:77
+msgid "Swedish"
+msgstr "Suediera"
+
+#: conf/global_settings.py:78
+msgid "Tamil"
+msgstr "Tamilera"
+
+#: conf/global_settings.py:79
+msgid "Telugu"
+msgstr "Telegu hizkuntza"
+
+#: conf/global_settings.py:80
+msgid "Turkish"
+msgstr "Turkiera"
+
+#: conf/global_settings.py:81
+msgid "Ukrainian"
+msgstr "Ukrainera"
+
+#: conf/global_settings.py:82
+msgid "Simplified Chinese"
+msgstr "Txinera (sinpletua)"
+
+#: conf/global_settings.py:83
+msgid "Traditional Chinese"
+msgstr "Txinera (tradizionala)"
+
+#: contrib/admin/filterspecs.py:44
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3> %s gatik:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:74 contrib/admin/filterspecs.py:92
+#: contrib/admin/filterspecs.py:147 contrib/admin/filterspecs.py:173
+msgid "All"
+msgstr "Dena"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Any date"
+msgstr "Edozein data"
+
+#: contrib/admin/filterspecs.py:114
+msgid "Today"
+msgstr "Gaur"
+
+#: contrib/admin/filterspecs.py:117
+msgid "Past 7 days"
+msgstr "Aurreko 7 egunak"
+
+#: contrib/admin/filterspecs.py:119
+msgid "This month"
+msgstr "Hilabete hau"
+
+#: contrib/admin/filterspecs.py:121
+msgid "This year"
+msgstr "Urte hau"
+
+#: contrib/admin/filterspecs.py:147 newforms/widgets.py:231
+#: oldforms/__init__.py:592
+msgid "Yes"
+msgstr "Bai"
+
+#: contrib/admin/filterspecs.py:147 newforms/widgets.py:231
+#: oldforms/__init__.py:592
+msgid "No"
+msgstr "Ez"
+
+#: contrib/admin/filterspecs.py:154 newforms/widgets.py:231
+#: oldforms/__init__.py:592
+msgid "Unknown"
+msgstr "Ezezaguna"
+
+#: contrib/admin/models.py:18
+msgid "action time"
+msgstr "Ekintz hordua"
+
+#: contrib/admin/models.py:21
+msgid "object id"
+msgstr "Objetuaren id"
+
+#: contrib/admin/models.py:22
+msgid "object repr"
+msgstr "Objeturaren repr"
+
+#: contrib/admin/models.py:23
+msgid "action flag"
+msgstr "Ekintza botoia"
+
+#: contrib/admin/models.py:24
+msgid "change message"
+msgstr "Mezua aldatu"
+
+#: contrib/admin/models.py:27
+msgid "log entry"
+msgstr "Log sarrera"
+
+#: contrib/admin/models.py:28
+msgid "log entries"
+msgstr "log sarrerak"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Ez da lekua aurkitu"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Barkatu, eskatutako lekua ezin daiteke aurkitu"
+
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:37
+#: contrib/admin/templates/admin/change_form.html:12
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/delete_confirmation.html:5
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:4
+#: contrib/admin/templates/admin/auth/user/change_password.html:11
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+msgid "Home"
+msgstr "Hasiera"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Serbidore errorea"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Serbidor errorea (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Serbidore Errorea <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr "Arazo bat izan da. Web guneraren administradorea e-mail bidez ohartuko da eta laister konpondua egon beharko luke. Barkatu arazoak."
+
+#: contrib/admin/templates/admin/base.html:26
+msgid "Welcome,"
+msgstr "Ongi etorri."
+
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Dokumentazioa"
+
+#: contrib/admin/templates/admin/base.html:29
+#: contrib/admin/templates/admin/auth/user/change_password.html:14
+#: contrib/admin/templates/admin/auth/user/change_password.html:45
+msgid "Change password"
+msgstr "Hitz ezkutua aldatu"
+
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/comments/templates/comments/form.html:6
+msgid "Log out"
+msgstr "Atera"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django admin. gunea"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django administradorea"
+
+#: contrib/admin/templates/admin/change_form.html:14
+#: contrib/admin/templates/admin/index.html:28
+msgid "Add"
+msgstr "Gehitu"
+
+#: contrib/admin/templates/admin/change_form.html:20
+#: contrib/admin/templates/admin/object_history.html:4
+msgid "History"
+msgstr "Aurrekoak"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "Lekuaren bista"
+
+#: contrib/admin/templates/admin/change_form.html:31
+#: contrib/admin/templates/admin/auth/user/change_password.html:23
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Arren zuzendu ondoko akatsa"
+msgstr[1] "Arren zuzendu ondoko akatsak"
+
+#: contrib/admin/templates/admin/change_form.html:49
+msgid "Ordering"
+msgstr "Ordenaketa"
+
+#: contrib/admin/templates/admin/change_form.html:52
+msgid "Order:"
+msgstr "Ordena:"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "Gehitu  %(name)s"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:8
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Ezabatu"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:13
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects: "
+"%(object_name)s '%(escaped_object)s' ezabatuz, erlazionatutako objetuak ere ezabatuko ditu, baina zure kontuak ez du baimenik, hurrengo objetuak ezabatzeko:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:20
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Ziur zaude %(object_name)s \"%(escaped_object)s\" ezabatu nai duzula ? "
+"Erlazionaturik dauden hurrengo elementuak ere ezabatuko dira:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:25
+msgid "Yes, I'm sure"
+msgstr "Bai, ziur nago"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " %(filter_title)s gatik"
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "Filtroa"
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "%(name)s aplikazioan Modeloak."
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Aldatu"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Ezer aldatzeko baimenik ez dezu."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Azken ekintzak"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Nere ekintzak"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Ez dago ezer"
+
+#: contrib/admin/templates/admin/invalid_setup.html:8
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr "Zerbait gaizki dago zure data-basearekin. Ziurtatu ezazu data-baseko taulak sortuak izan direla eta usuario egokiarengatik irakurriak izan daitekela"
+
+#: contrib/admin/templates/admin/login.html:17
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+msgid "Username:"
+msgstr "Usuario Izena:"
+
+#: contrib/admin/templates/admin/login.html:20
+#: contrib/comments/templates/comments/form.html:8
+msgid "Password:"
+msgstr "Hitz ezkutua:"
+
+#: contrib/admin/templates/admin/login.html:25
+#: contrib/admin/views/decorators.py:25
+msgid "Log in"
+msgstr "Sartu"
+
+#: contrib/admin/templates/admin/object_history.html:17
+msgid "Date/time"
+msgstr "Data/ordua"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "User"
+msgstr "Usuarioa"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "Action"
+msgstr "Ekintza"
+
+#: contrib/admin/templates/admin/object_history.html:25
+msgid "DATE_WITH_TIME_FULL"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:35
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr "Objetu honek ez du alketa zerrenda bat. Ziur asko, administrazio leku hau erabili gabe gehitua izan da."
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Dena erakutsi"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Aurrera"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s emaitza"
+msgstr[1] "%(counter)s emaitzak"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s guztira"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Berria bezala gorde"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Gorde eta beste bat gehitu"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Gorde eta aldatzen jarraitu"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Gorde"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr "Lehenengo usuario izena eta hitz ezkutua idatzi. Gero usuarioaren aukera gehiago aldatu ditzakezu"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "Usuario izena"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+#: contrib/admin/templates/admin/auth/user/change_password.html:33
+msgid "Password"
+msgstr "Hitz ezkutua"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+#: contrib/admin/templates/admin/auth/user/change_password.html:38
+msgid "Password (again)"
+msgstr "Hitz ezkutua (berriro)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+msgid "Enter the same password as above, for verification."
+msgstr "Idatzi berriro hitz ezkutua."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:27
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Hitz ezkutu berria idatzi <strong>%(username)s</strong> usuarioarentzat."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Markadoreak"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+msgid "Documentation bookmarklets"
+msgstr "Dokumentazio markadoreak"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:8
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">Markadoreak instalatzeko eraman linka zure erreminta panelera (toolbar).\n"
+"Orain markadorea lekuko edozein horritik aukeratu dezakezu. Hauetako \n"
+"markadore batzu, zure ordenadorea 'barnekoa' bezala erregistratua egotea\n"
+"behar dute. Hitzegin web lekuaren administradorearekin azalpen gehiagorako.</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:18
+msgid "Documentation for this page"
+msgstr "Web horri honentzat dokumentazioa"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr "Edozein lekutik, horriaren bista sortzaileara (view) salto egiten du."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:21
+msgid "Show object ID"
+msgstr "Objetuaren ID erakutsi"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr "Objetu bakarra erakusten duten horrietan, eduki mota (content-type) eta horriaren ID bakarra erakutsi, ."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:24
+msgid "Edit this object (current window)"
+msgstr "Objetu hau aldatu ( leiho hau)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "Objetu bakarra erakusten horrietan, adminiztrazio gunera joan."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:27
+msgid "Edit this object (new window)"
+msgstr "Objetu hay aldatu (leiho berria)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "As above, but opens the admin page in a new window."
+msgstr "Goian bezala baina administrzazio gune leio berrian irekitzen."
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Mila esker gaur zure denbora web gunean erabiltzegatik."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Berrio sartu (log in)"
+
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_form.html:5
+#: contrib/admin/templates/registration/password_change_form.html:9
+msgid "Password change"
+msgstr "Hitz ezkutua aldatu"
+
+#: contrib/admin/templates/registration/password_change_done.html:5
+#: contrib/admin/templates/registration/password_change_done.html:9
+msgid "Password change successful"
+msgstr "Hitz ezkutuaren aldaketa arrakastatsua"
+
+#: contrib/admin/templates/registration/password_change_done.html:11
+msgid "Your password was changed."
+msgstr "Hitz ezkutua aldatua izan da"
+
+#: contrib/admin/templates/registration/password_change_form.html:11
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr "Idatzi hitz ezkutu zaharra segurtasun arrazoiengatik eta gero hitz ezkutu berria bi aldiz, akatsik egiten ez duzula ziurtatu dezagun."
+
+#: contrib/admin/templates/registration/password_change_form.html:16
+msgid "Old password:"
+msgstr "Hitz ezkutu zaharra"
+
+#: contrib/admin/templates/registration/password_change_form.html:18
+msgid "New password:"
+msgstr "Hitz ezkutu berria:"
+
+#: contrib/admin/templates/registration/password_change_form.html:20
+msgid "Confirm password:"
+msgstr "Hitz ezkutua baieztatu:"
+
+#: contrib/admin/templates/registration/password_change_form.html:22
+msgid "Change my password"
+msgstr "Nire hitz ezkutua aldatu"
+
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+msgid "Password reset"
+msgstr "Hitz ezkutua ezabatu"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Hitz ezkutuaren ezabaketa zuzena"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr "Hitz ezkutu berria e-mail bidez bidali dizugu. Epe laburrean jasokor duzu."
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Mezu elektroniko hau jaso dezu, hitz ezkutuaren ezabaketa eskatu duzulako"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "%(site_name)s usuario kontuarentzat"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Zure hitz ezkutu berria %(new_password)s da"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Hitz ezkutua aldatu nai baduzu, zoaz web horri honetara joan:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Zure usuario izena (ahaztu badezu):"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Mila esker gure web gunea erabiltzeagatik!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s web gunearen taldea"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr "Hitz ezkutua ahaztu dezu ? Hidatzi zure e-mail helbidea, eta hitz ezkutu berri bat bidaliko dizugu."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "E-mail helbidea:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Hitz ezkutua ezabatu"
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Data:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Ordua:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Orain:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Aldatu:"
+
+#: contrib/admin/templatetags/admin_list.py:257
+msgid "All dates"
+msgstr "Data guztiak"
+
+#: contrib/admin/views/auth.py:20 contrib/admin/views/main.py:267
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s arrakastaz gehitua izan da."
+
+#: contrib/admin/views/auth.py:25 contrib/admin/views/main.py:271
+#: contrib/admin/views/main.py:356
+msgid "You may edit it again below."
+msgstr "Berriro alkatu zenezake beherago."
+
+#: contrib/admin/views/auth.py:31
+msgid "Add user"
+msgstr "Usuario gehitu"
+
+#: contrib/admin/views/auth.py:58
+msgid "Password changed successfully."
+msgstr "Hitz ezkutua aldaketa zuzena."
+
+#: contrib/admin/views/auth.py:65
+#, python-format
+msgid "Change password: %s"
+msgstr "Hitz ezkutua aldatu: %s"
+
+#: contrib/admin/views/decorators.py:11 contrib/auth/forms.py:60
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr "Mesedez idatzi usuario izena eta hitz ezkutu egokiak. Maiskula eta minuskula ondo bereiztu."
+
+#: contrib/admin/views/decorators.py:63
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr "Mesedez berriro sar saitez, sesioa zahartu bai da. Bidalitakoa gorde egin da."
+
+#: contrib/admin/views/decorators.py:70
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr "Zure nabegatzaileak ez ditu cookie-ak onartzen. Aktiba ezazu hauen erabilera eta ekarri ezazu horria hau berriro."
+
+#: contrib/admin/views/decorators.py:84
+msgid "Usernames cannot contain the '@' character."
+msgstr "Usuario izenek ezin dezkete @ karakterea eduki."
+
+#: contrib/admin/views/decorators.py:86
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "Zure e-mail helbidea ez da zure usuario izena. Ahalegindo '%s' rekin."
+
+#: contrib/admin/views/doc.py:48 contrib/admin/views/doc.py:50
+#: contrib/admin/views/doc.py:52
+msgid "tag:"
+msgstr "tag:"
+
+#: contrib/admin/views/doc.py:79 contrib/admin/views/doc.py:81
+#: contrib/admin/views/doc.py:83
+msgid "filter:"
+msgstr "filtroa:"
+
+#: contrib/admin/views/doc.py:137 contrib/admin/views/doc.py:139
+#: contrib/admin/views/doc.py:141
+msgid "view:"
+msgstr "bista:"
+
+#: contrib/admin/views/doc.py:166
+#, python-format
+msgid "App %r not found"
+msgstr "%r aplikazio ez da aurkitu"
+
+#: contrib/admin/views/doc.py:173
+#, python-format
+msgid "Model %(name)r not found in app %(label)r"
+msgstr "%(name)r modeloa ez da %(label)r aplikazioan aurkitu"
+
+#: contrib/admin/views/doc.py:185
+#, python-format
+msgid "the related `%(label)s.%(type)s` object"
+msgstr "erlazionaturik `%(label)s.%(type)s` objetua"
+
+#: contrib/admin/views/doc.py:185 contrib/admin/views/doc.py:207
+#: contrib/admin/views/doc.py:221 contrib/admin/views/doc.py:226
+msgid "model:"
+msgstr "modeloa:"
+
+#: contrib/admin/views/doc.py:216
+#, python-format
+msgid "related `%(label)s.%(name)s` objects"
+msgstr "erlazionaturik `%(label)s.%(name)s` objetua"
+
+#: contrib/admin/views/doc.py:221
+#, python-format
+msgid "all %s"
+msgstr "%s dena"
+
+#: contrib/admin/views/doc.py:226
+#, python-format
+msgid "number of %s"
+msgstr "%s zenbakia"
+
+#: contrib/admin/views/doc.py:231
+#, python-format
+msgid "Fields on %s objects"
+msgstr "%s objetuan zutabeak"
+
+#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:304
+#: contrib/admin/views/doc.py:306 contrib/admin/views/doc.py:312
+#: contrib/admin/views/doc.py:313 contrib/admin/views/doc.py:315
+msgid "Integer"
+msgstr "Zenbaki osoa"
+
+#: contrib/admin/views/doc.py:294
+msgid "Boolean (Either True or False)"
+msgstr "Boolearra (egia ala gezurra)"
+
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:314
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Katea (%(max_length)s gehienez)"
+
+#: contrib/admin/views/doc.py:296
+msgid "Comma-separated integers"
+msgstr "Komaz bereiztutako zenbako osoak"
+
+#: contrib/admin/views/doc.py:297
+msgid "Date (without time)"
+msgstr "Data (ordurik gabe)"
+
+#: contrib/admin/views/doc.py:298
+msgid "Date (with time)"
+msgstr "Data (orduarekin)"
+
+#: contrib/admin/views/doc.py:299
+msgid "Decimal number"
+msgstr "Zenbaki dezimala"
+
+#: contrib/admin/views/doc.py:300
+msgid "E-mail address"
+msgstr "E-mail helbidea"
+
+#: contrib/admin/views/doc.py:301 contrib/admin/views/doc.py:302
+#: contrib/admin/views/doc.py:305
+msgid "File path"
+msgstr "Fitxegi bidea (path)"
+
+#: contrib/admin/views/doc.py:303
+msgid "Floating point number"
+msgstr "Zenbaki erreala (float)"
+
+#: contrib/admin/views/doc.py:307 contrib/comments/models.py:89
+msgid "IP address"
+msgstr "IP helbidea"
+
+#: contrib/admin/views/doc.py:309
+msgid "Boolean (Either True, False or None)"
+msgstr "Boolearra (egia, gezurra edo hutsa[None])"
+
+#: contrib/admin/views/doc.py:310
+msgid "Relation to parent model"
+msgstr "Gurazo modeloarekin erlazioa"
+
+#: contrib/admin/views/doc.py:311
+msgid "Phone number"
+msgstr "Telefono zenbakia"
+
+#: contrib/admin/views/doc.py:316
+msgid "Text"
+msgstr "Textua"
+
+#: contrib/admin/views/doc.py:317
+msgid "Time"
+msgstr "Ordua"
+
+#: contrib/admin/views/doc.py:318 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:319
+msgid "U.S. state (two uppercase letters)"
+msgstr "U.S statua (bi letra maiuskula)"
+
+#: contrib/admin/views/doc.py:320
+msgid "XML text"
+msgstr "XML textua"
+
+#: contrib/admin/views/doc.py:346
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s ez dirudi  url heredu objetua"
+
+#: contrib/admin/views/main.py:233
+msgid "Site administration"
+msgstr "Web gunearen administrazioa"
+
+#: contrib/admin/views/main.py:280 contrib/admin/views/main.py:365
+#, python-format
+msgid "You may add another %s below."
+msgstr "Beste %s gehitu dezakezu jarraian."
+
+#: contrib/admin/views/main.py:298
+#, python-format
+msgid "Add %s"
+msgstr "%s gehitu"
+
+#: contrib/admin/views/main.py:344
+#, python-format
+msgid "Added %s."
+msgstr "%s gehituta."
+
+#: contrib/admin/views/main.py:344 contrib/admin/views/main.py:346
+#: contrib/admin/views/main.py:348 core/validators.py:283
+#: db/models/manipulators.py:309
+msgid "and"
+msgstr "eta"
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "Changed %s."
+msgstr "%s aldatuta."
+
+#: contrib/admin/views/main.py:348
+#, python-format
+msgid "Deleted %s."
+msgstr "%s ezabatuta."
+
+#: contrib/admin/views/main.py:351
+msgid "No fields changed."
+msgstr "Ez da zutaberik aldatu."
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" aldatuta izan da."
+
+#: contrib/admin/views/main.py:362
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" arrakastarekin gehituta izan da. Jarraian aldatu dezakezu berriro."
+
+#: contrib/admin/views/main.py:400
+#, python-format
+msgid "Change %s"
+msgstr "%s aldatu"
+
+#: contrib/admin/views/main.py:487
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "%(fieldname)s bat edo  gehiago %(name)s an: %(obj)s"
+
+#: contrib/admin/views/main.py:492
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "%(fieldname)s bat edo gehiago %(name)s n"
+
+#: contrib/admin/views/main.py:524
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\"  arrakastaz ezabatua izan da."
+
+#: contrib/admin/views/main.py:527
+msgid "Are you sure?"
+msgstr "Ziur al zaude?"
+
+#: contrib/admin/views/main.py:549
+#, python-format
+msgid "Change history: %s"
+msgstr "Aldaketa zerrenda: %s"
+
+#: contrib/admin/views/main.py:583
+#, python-format
+msgid "Select %s"
+msgstr "%s aukeratu"
+
+#: contrib/admin/views/main.py:583
+#, python-format
+msgid "Select %s to change"
+msgstr "aldaketarako %s aukeratu"
+
+#: contrib/admin/views/main.py:784
+msgid "Database error"
+msgstr "Data base errorea"
+
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr "Hitz ezkutuak ez dira berdinak."
+
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr "Usuario izen hori erabiltzen ari da."
+
+#: contrib/auth/forms.py:53
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr "Zure nabegatzaileak ez ditu cookiak onartzen. Cookia-k beharrezkoak dira sistemn sartzeko."
+
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "Kontu hau az dago aktibatuta."
+
+#: contrib/auth/forms.py:84
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr "E-mail helbide horrek ez du usariorik. Ziur al zaude erregistraturik zaudela?"
+
+#: contrib/auth/forms.py:107
+#, python-format
+msgid "Password reset on %s"
+msgstr "Hitz ezkutu ezabatua %s n"
+
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "Bi hitz ezkutu berriak ez dira berdinak."
+
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Zure hitz ezkutu zaharra ez zuzena. Idatzi ezazu berriro."
+
+#: contrib/auth/models.py:73 contrib/auth/models.py:93
+msgid "name"
+msgstr "izena"
+
+#: contrib/auth/models.py:75
+msgid "codename"
+msgstr "code izena (codename)"
+
+#: contrib/auth/models.py:78
+msgid "permission"
+msgstr "baimena"
+
+#: contrib/auth/models.py:79 contrib/auth/models.py:94
+msgid "permissions"
+msgstr "baimenak"
+
+#: contrib/auth/models.py:97
+msgid "group"
+msgstr "taldea"
+
+#: contrib/auth/models.py:98 contrib/auth/models.py:141
+msgid "groups"
+msgstr "taldeak"
+
+#: contrib/auth/models.py:131
+msgid "username"
+msgstr "usuario izena"
+
+#: contrib/auth/models.py:131
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr ""
+"Beharrezkoa. 30 karaktere edo gutxiago. Karaktere alfanumerikoak "
+"bakarrik (letra, zembaki eta '_')"
+
+#: contrib/auth/models.py:132
+msgid "first name"
+msgstr "izena"
+
+#: contrib/auth/models.py:133
+msgid "last name"
+msgstr "abizena"
+
+#: contrib/auth/models.py:134
+msgid "e-mail address"
+msgstr "e-mail helbidea"
+
+#: contrib/auth/models.py:135
+msgid "password"
+msgstr "hitz ezkutua"
+
+#: contrib/auth/models.py:135
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr "Erabili '[algo]$[salt]$[hexdigest]' edo erabili <a href=\"password/\">hitz ezkuta aldatu </a>."
+
+#: contrib/auth/models.py:136
+msgid "staff status"
+msgstr "Arduraduen egoera"
+
+#: contrib/auth/models.py:136
+msgid "Designates whether the user can log into this admin site."
+msgstr "Usuarioak administrazio gune honetan sartu dezkeen ala ez izendatzen du."
+
+#: contrib/auth/models.py:137
+msgid "active"
+msgstr "Aktiboa"
+
+#: contrib/auth/models.py:137
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr "Usuarioak Django adminiztrazio gunean sartu daitekeen ala ez. Desaktiba ezazu aukera hau,kontua ezabatu ordez."
+
+#: contrib/auth/models.py:138
+msgid "superuser status"
+msgstr "Usuario nagusia (superuser)"
+
+#: contrib/auth/models.py:138
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr "Usuario honek baimen guztiak ditu, banan banan denak zehaztu gabe."
+
+#: contrib/auth/models.py:139
+msgid "last login"
+msgstr "azken sarrera"
+
+#: contrib/auth/models.py:140
+msgid "date joined"
+msgstr "erregistro eguna"
+
+#: contrib/auth/models.py:142
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr "Usuario honek, eskuz emandako baimen guztietaz aparte, berari egokitutako talde bakoitzari emandako baimenak ere izango ditu."
+
+#: contrib/auth/models.py:143
+msgid "user permissions"
+msgstr "Usuarioaren baimenak"
+
+#: contrib/auth/models.py:147
+msgid "user"
+msgstr "Usuarioa"
+
+#: contrib/auth/models.py:148
+msgid "users"
+msgstr "Usuarioak"
+
+#: contrib/auth/models.py:154
+msgid "Personal info"
+msgstr "Informazio pertsonala"
+
+#: contrib/auth/models.py:155
+msgid "Permissions"
+msgstr "Baimenak"
+
+#: contrib/auth/models.py:156
+msgid "Important dates"
+msgstr "Data garrantzitsuak"
+
+#: contrib/auth/models.py:157
+msgid "Groups"
+msgstr "Taldeak"
+
+#: contrib/auth/models.py:316
+msgid "message"
+msgstr "mezua"
+
+#: contrib/auth/views.py:47
+msgid "Logged out"
+msgstr "Sesiotik kanpo"
+
+#: contrib/comments/models.py:71 contrib/comments/models.py:176
+msgid "object ID"
+msgstr "objetuaren ID"
+
+#: contrib/comments/models.py:72
+msgid "headline"
+msgstr "izenburua"
+
+#: contrib/comments/models.py:73 contrib/comments/models.py:95
+#: contrib/comments/models.py:177
+msgid "comment"
+msgstr "komentarioa"
+
+#: contrib/comments/models.py:74
+msgid "rating #1"
+msgstr "puntaketa #1"
+
+#: contrib/comments/models.py:75
+msgid "rating #2"
+msgstr "puntaketa #2"
+
+#: contrib/comments/models.py:76
+msgid "rating #3"
+msgstr "puntaketa #3"
+
+#: contrib/comments/models.py:77
+msgid "rating #4"
+msgstr "puntaketa #4"
+
+#: contrib/comments/models.py:78
+msgid "rating #5"
+msgstr "puntaketa #5"
+
+#: contrib/comments/models.py:79
+msgid "rating #6"
+msgstr "puntaketa #6"
+
+#: contrib/comments/models.py:80
+msgid "rating #7"
+msgstr "puntaketa #7"
+
+#: contrib/comments/models.py:81
+msgid "rating #8"
+msgstr "puntaketa #8"
+
+#: contrib/comments/models.py:86
+msgid "is valid rating"
+msgstr "puntuaketa zuzena"
+
+#: contrib/comments/models.py:87 contrib/comments/models.py:179
+msgid "date/time submitted"
+msgstr "data/hordua bidalia"
+
+#: contrib/comments/models.py:88 contrib/comments/models.py:180
+msgid "is public"
+msgstr "publikoa"
+
+#: contrib/comments/models.py:90
+msgid "is removed"
+msgstr "ezabatua"
+
+#: contrib/comments/models.py:90
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr "Markatu kutxa hau komentario ezegokia bada. A \"Komentario hau ezabatua izan da\" mezua erakutsiko da bere ordez."
+
+#: contrib/comments/models.py:96
+msgid "comments"
+msgstr "Komentarioak"
+
+#: contrib/comments/models.py:140 contrib/comments/models.py:222
+msgid "Content object"
+msgstr "Eduki objetua"
+
+#: contrib/comments/models.py:168
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"%(user)s -k bidalia %(date)s -n\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:178
+msgid "person's name"
+msgstr "pertsonaren izena"
+
+#: contrib/comments/models.py:181
+msgid "ip address"
+msgstr "ip zenbakia"
+
+#: contrib/comments/models.py:183
+msgid "approved by staff"
+msgstr "arduradunek onartua"
+
+#: contrib/comments/models.py:187
+msgid "free comment"
+msgstr "komentario librea"
+
+#: contrib/comments/models.py:188
+msgid "free comments"
+msgstr "komentario libreak"
+
+#: contrib/comments/models.py:250
+msgid "score"
+msgstr "puntuaketa"
+
+#: contrib/comments/models.py:251
+msgid "score date"
+msgstr "puntuaketa data"
+
+#: contrib/comments/models.py:255
+msgid "karma score"
+msgstr "karma puntuaketa"
+
+#: contrib/comments/models.py:256
+msgid "karma scores"
+msgstr "karma puntuaketak"
+
+#: contrib/comments/models.py:260
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(user)s -k emandako puntaketa: %(score)d"
+
+#: contrib/comments/models.py:277
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"%(user)s -k komentario hay markatu du:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:285
+msgid "flag date"
+msgstr "markatutako eguna"
+
+#: contrib/comments/models.py:289
+msgid "user flag"
+msgstr "usuarioaren markaketa"
+
+#: contrib/comments/models.py:290
+msgid "user flags"
+msgstr "usuariaren markaketak"
+
+#: contrib/comments/models.py:294
+#, python-format
+msgid "Flag by %r"
+msgstr "%r -k markatuta"
+
+#: contrib/comments/models.py:300
+msgid "deletion date"
+msgstr "ezabatze data"
+
+#: contrib/comments/models.py:303
+msgid "moderator deletion"
+msgstr "moderatzaileak ezabatua"
+
+#: contrib/comments/models.py:304
+msgid "moderator deletions"
+msgstr "moderatzaileak ezabatuak"
+
+#: contrib/comments/models.py:308
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "%r moderatzaileak ezabatua"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Hitz ezkutua ahaztu duzu?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Puntuaketak"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Beharrezkoa"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Aukerakoa"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Argazkia bidali"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Komentarioa:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Komentarioa aurreikusi"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Zure izena:"
+
+#: contrib/comments/views/comments.py:28
+msgid "This rating is required because you've entered at least one other rating."
+msgstr "Puntuaketa hau beharrezkoa da, gutxienez beste puntaketa bat sartu duzulako"
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] "Komentario hau, %(count)s komentario baino gutxiago egindako usuario batek bidalia da:<br><br>%(text)s"
+msgstr[1] ""
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Komentario hau usuario 'arin' batek bidalia da:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:190
+#: contrib/comments/views/comments.py:283
+msgid "Only POSTs are allowed"
+msgstr "POST bakarrik onartzen dira"
+
+#: contrib/comments/views/comments.py:194
+#: contrib/comments/views/comments.py:287
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Beharrezko fitxategi bat edo gehiago ez dira bidali"
+
+#: contrib/comments/views/comments.py:198
+#: contrib/comments/views/comments.py:289
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Norbaitek komentario formularioa maltzurki eraldatu du (segurtasun erasoa)"
+
+#: contrib/comments/views/comments.py:208
+#: contrib/comments/views/comments.py:295
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr "Komentario formularioak 'target' parametroa okerra zuen -- objetuaren ID okerra zen"
+
+#: contrib/comments/views/comments.py:259
+#: contrib/comments/views/comments.py:324
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "Komentario formularioa ez zuen ez 'berikusi'  edo 'bidali'"
+
+#: contrib/comments/views/karma.py:21
+msgid "Anonymous users cannot vote"
+msgstr "Usuario ezezagunak ezin dezakete botoa eman"
+
+#: contrib/comments/views/karma.py:25
+msgid "Invalid comment ID"
+msgstr "Komentario ID okerra"
+
+#: contrib/comments/views/karma.py:27
+msgid "No voting for yourself"
+msgstr "Norberak ezin dezake botoa eman"
+
+#: contrib/contenttypes/models.py:37
+msgid "python model class name"
+msgstr "python model class izena"
+
+#: contrib/contenttypes/models.py:40
+msgid "content type"
+msgstr "edukiera moeta"
+
+#: contrib/contenttypes/models.py:41
+msgid "content types"
+msgstr "edukiera moetak"
+
+#: contrib/flatpages/models.py:8
+msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr "Adibidez: '/about/contact/'. Ziurta zaitez '/' karaktera hasieran eta bukaeran dagoela."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "izenburua"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "edukiera"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "komentarioak onartu"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "plantila izena"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr "Adibidez: 'flatpages/contact_page.html'. Hau ematen ez bada, sistema 'flatpages/default.html' erabiliko du."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "erregistratzea beharrezkoa da"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Hau markatuta badago, erregistratutako usuarioak bakarrik ikusiko dute horria."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "flat page"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "flat pages"
+
+#: contrib/humanize/templatetags/humanize.py:20
+msgid "th"
+msgstr "garren"
+
+#: contrib/humanize/templatetags/humanize.py:20
+msgid "st"
+msgstr "."
+
+#: contrib/humanize/templatetags/humanize.py:20
+msgid "nd"
+msgstr "garren"
+
+#: contrib/humanize/templatetags/humanize.py:20
+msgid "rd"
+msgstr "garren"
+
+#: contrib/humanize/templatetags/humanize.py:52
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f milioi"
+msgstr[1] ""
+
+#: contrib/humanize/templatetags/humanize.py:55
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f bilioi"
+msgstr[1] ""
+
+#: contrib/humanize/templatetags/humanize.py:58
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f trilioi"
+msgstr[1] ""
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "one"
+msgstr "bat"
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "two"
+msgstr "bi"
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "three"
+msgstr "hiru"
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "four"
+msgstr "lau"
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "five"
+msgstr "bost"
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "six"
+msgstr "sei"
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "seven"
+msgstr "zazpi"
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "eight"
+msgstr "zortzi"
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "nine"
+msgstr "bederatzi"
+
+#: contrib/humanize/templatetags/humanize.py:94
+msgid "today"
+msgstr "gaur"
+
+#: contrib/humanize/templatetags/humanize.py:96
+msgid "tomorrow"
+msgstr "bihar"
+
+#: contrib/humanize/templatetags/humanize.py:98
+msgid "yesterday"
+msgstr "atzo"
+
+#: contrib/localflavor/ar/forms.py:28
+msgid "Enter a postal code in the format NNNN or ANNNNAAA."
+msgstr "NNNN edo ANNNNAAA formatoan idatzi posta kode bat."
+
+#: contrib/localflavor/ar/forms.py:50 contrib/localflavor/br/forms.py:96
+#: contrib/localflavor/br/forms.py:135 contrib/localflavor/pe/forms.py:23
+#: contrib/localflavor/pe/forms.py:51
+msgid "This field requires only numbers."
+msgstr "Data honek zenbakiak bakarrik behar ditu."
+
+#: contrib/localflavor/ar/forms.py:51
+msgid "This field requires 7 or 8 digits."
+msgstr "Data honek 7 edo 8 digito behar ditu."
+
+#: contrib/localflavor/ar/forms.py:80
+msgid "Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format."
+msgstr "CUIT zuzena idatzi XX-XXXXXXXX-X edo XXXXXXXXXXXX formatoan."
+
+#: contrib/localflavor/ar/forms.py:81
+msgid "Invalid CUIT."
+msgstr "CUIT okerra."
+
+#: contrib/localflavor/au/forms.py:16
+msgid "Enter a 4 digit post code."
+msgstr "4 zenbaki posta kodean idatzi."
+
+#: contrib/localflavor/br/forms.py:21
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "XXXXX-XXX formatoan zip kodea idatzi."
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "Telefono zenbakiak XX-XXXX-XXXX formatoa behar dute."
+
+#: contrib/localflavor/br/forms.py:58
+msgid ""
+"Select a valid brazilian state. That state is not one of the available "
+"states."
+msgstr "Brasilgo estatu zuzen bat aukeratu. Hori ez dago aukeran."
+
+#: contrib/localflavor/br/forms.py:94
+msgid "Invalid CPF number."
+msgstr "CPF zenbaki okerra."
+
+#: contrib/localflavor/br/forms.py:95
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr "Data honek gehienez 11 digito edo 14 karaktere behar ditu."
+
+#: contrib/localflavor/br/forms.py:134
+msgid "Invalid CNPJ number."
+msgstr "CNPJ zenbaki okerra."
+
+#: contrib/localflavor/br/forms.py:136
+msgid "This field requires at least 14 digits"
+msgstr "Data honek 14 digito behar ditu gutxienez"
+
+#: contrib/localflavor/ca/forms.py:17
+msgid "Enter a postal code in the format XXX XXX."
+msgstr "Posta kodea idatzi XXX XXX formatoan."
+
+#: contrib/localflavor/ca/forms.py:88
+msgid "Enter a valid Canadian Social Insurance number in XXX-XXX-XXX format."
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr ""
+
+#: contrib/localflavor/ch/forms.py:16 contrib/localflavor/no/forms.py:12
+msgid "Enter a zip code in the format XXXX."
+msgstr "zip kodea XXXX formatoan idatzi."
+
+#: contrib/localflavor/ch/forms.py:64
+msgid ""
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
+msgstr ""
+
+#: contrib/localflavor/cl/forms.py:29
+msgid "Enter a valid Chilean RUT."
+msgstr ""
+
+#: contrib/localflavor/cl/forms.py:30
+msgid "Enter a valid Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr ""
+
+#: contrib/localflavor/cl/forms.py:31
+msgid "The Chilean RUT is not valid."
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr ""
+
+#: contrib/localflavor/de/forms.py:14 contrib/localflavor/fi/forms.py:12
+#: contrib/localflavor/fr/forms.py:15
+msgid "Enter a zip code in the format XXXXX."
+msgstr ""
+
+#: contrib/localflavor/de/forms.py:41
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:5
+msgid "Arava"
+msgstr "Araba"
+
+#: contrib/localflavor/es/es_provinces.py:6
+msgid "Albacete"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:7
+msgid "Alacant"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:8
+msgid "Almeria"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:9
+msgid "Avila"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:10
+msgid "Badajoz"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:11
+msgid "Illes Balears"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:12
+msgid "Barcelona"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:13
+msgid "Burgos"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:14
+msgid "Caceres"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:15
+msgid "Cadiz"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:16
+msgid "Castello"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:17
+msgid "Ciudad Real"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:18
+msgid "Cordoba"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:19
+msgid "A Coruna"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:20
+msgid "Cuenca"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:21
+msgid "Girona"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:22
+msgid "Granada"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:23
+msgid "Guadalajara"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:24
+msgid "Guipuzkoa"
+msgstr "Gupuzkoa"
+
+#: contrib/localflavor/es/es_provinces.py:25
+msgid "Huelva"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:26
+msgid "Huesca"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:27
+msgid "Jaen"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:28
+msgid "Leon"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:29
+msgid "Lleida"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:30
+#: contrib/localflavor/es/es_regions.py:17
+msgid "La Rioja"
+msgstr "Errioxa"
+
+#: contrib/localflavor/es/es_provinces.py:31
+msgid "Lugo"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:32
+#: contrib/localflavor/es/es_regions.py:18
+msgid "Madrid"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:33
+msgid "Malaga"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:34
+msgid "Murcia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:35
+msgid "Navarre"
+msgstr "Nafarroa"
+
+#: contrib/localflavor/es/es_provinces.py:36
+msgid "Ourense"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:37
+msgid "Asturias"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:38
+msgid "Palencia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:39
+msgid "Las Palmas"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:40
+msgid "Pontevedra"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:41
+msgid "Salamanca"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:42
+msgid "Santa Cruz de Tenerife"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:43
+#: contrib/localflavor/es/es_regions.py:11
+msgid "Cantabria"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:44
+msgid "Segovia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:45
+msgid "Seville"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:46
+msgid "Soria"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:47
+msgid "Tarragona"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:48
+msgid "Teruel"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:49
+msgid "Toledo"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:50
+msgid "Valencia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:51
+msgid "Valladolid"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:52
+msgid "Bizkaia"
+msgstr "Bizkaia"
+
+#: contrib/localflavor/es/es_provinces.py:53
+msgid "Zamora"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:54
+msgid "Zaragoza"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:55
+msgid "Ceuta"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:56
+msgid "Melilla"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:5
+msgid "Andalusia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:6
+msgid "Aragon"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:7
+msgid "Principality of Asturias"
+msgstr "Asturiaseko printzipadoa"
+
+#: contrib/localflavor/es/es_regions.py:8
+msgid "Balearic Islands"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:9
+msgid "Basque Country"
+msgstr "Euskal Herria"
+
+#: contrib/localflavor/es/es_regions.py:10
+msgid "Canary Islands"
+msgstr "Canaria uharteak"
+
+#: contrib/localflavor/es/es_regions.py:12
+msgid "Castile-La Mancha"
+msgstr "La Mancha-Gaztela"
+
+#: contrib/localflavor/es/es_regions.py:13
+msgid "Castile and Leon"
+msgstr "Gaztela eta Leon"
+
+#: contrib/localflavor/es/es_regions.py:14
+msgid "Catalonia"
+msgstr "Katalunia"
+
+#: contrib/localflavor/es/es_regions.py:15
+msgid "Extremadura"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:16
+msgid "Galicia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:19
+msgid "Region of Murcia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:20
+msgid "Foral Community of Navarre"
+msgstr "Nafarroako komunitate forala"
+
+#: contrib/localflavor/es/es_regions.py:21
+msgid "Valencian Community"
+msgstr "Valeciako komunitatea"
+
+#: contrib/localflavor/es/forms.py:19
+msgid "Enter a valid postal code in the range and format 01XXX - 52XXX."
+msgstr "Kode postal bat idatzi hurrengo formato eta tartearekin: 01XXX - 52XXX"
+
+#: contrib/localflavor/es/forms.py:39
+msgid ""
+"Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or "
+"9XXXXXXXX."
+msgstr "Telefono zenbaki bat idatzi hurrengo formato batekin: 6XXXXXXXX, 8XXXXXXXX edo 9XXXXXXXX"
+
+#: contrib/localflavor/es/forms.py:66
+msgid "Please enter a valid NIF, NIE, or CIF."
+msgstr "Idatzi NIF,NIE edo CIF zuzena."
+
+#: contrib/localflavor/es/forms.py:67
+msgid "Please enter a valid NIF or NIE."
+msgstr "Idatzi NIF edo NIE zuzena."
+
+#: contrib/localflavor/es/forms.py:68
+msgid "Invalid checksum for NIF."
+msgstr "NIF kontrol kode okerra."
+
+#: contrib/localflavor/es/forms.py:69
+msgid "Invalid checksum for NIE."
+msgstr "NIE kontrol kode okerra."
+
+#: contrib/localflavor/es/forms.py:70
+msgid "Invalid checksum for CIF."
+msgstr "CIF kontrl kode okerra."
+
+#: contrib/localflavor/es/forms.py:142
+msgid "Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX."
+msgstr "Mesedez idatzi banku kontu zenbaki zuzena XXXX-XXXX-XX-XXXXXXXXXX formatoarekin."
+
+#: contrib/localflavor/es/forms.py:143
+msgid "Invalid checksum for bank account number."
+msgstr "Banku kontu zenbakian kontrol digito okerra."
+
+#: contrib/localflavor/fi/forms.py:28
+msgid "Enter a valid Finnish social security number."
+msgstr ""
+
+#: contrib/localflavor/in_/forms.py:14
+msgid "Enter a zip code in the format XXXXXXX."
+msgstr ""
+
+#: contrib/localflavor/is_/forms.py:17
+msgid "Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr ""
+
+#: contrib/localflavor/is_/forms.py:18
+msgid "The Icelandic identification number is not valid."
+msgstr ""
+
+#: contrib/localflavor/it/forms.py:14
+msgid "Enter a valid zip code."
+msgstr ""
+
+#: contrib/localflavor/it/forms.py:43
+msgid "Enter a valid Social Security number."
+msgstr ""
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr ""
+
+#: contrib/localflavor/jp/forms.py:19
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:12
+msgid "Aguascalientes"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:13
+msgid "Baja California"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:14
+msgid "Baja California Sur"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:15
+msgid "Campeche"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:16
+msgid "Chihuahua"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:17
+msgid "Chiapas"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:18
+msgid "Coahuila"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:19
+msgid "Colima"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:20
+msgid "Distrito Federal"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:21
+msgid "Durango"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:22
+msgid "Guerrero"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:23
+msgid "Guanajuato"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:24
+msgid "Hidalgo"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:25
+msgid "Jalisco"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:26
+msgid "Estado de México"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:27
+msgid "Michoacán"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:28
+msgid "Morelos"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:29
+msgid "Nayarit"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:30
+msgid "Nuevo León"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:31
+msgid "Oaxaca"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:32
+msgid "Puebla"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:33
+msgid "Querétaro"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:34
+msgid "Quintana Roo"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:35
+msgid "Sinaloa"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:36
+msgid "San Luis Potosí"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:37
+msgid "Sonora"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:38
+msgid "Tabasco"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:39
+msgid "Tamaulipas"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:40
+msgid "Tlaxcala"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:41
+msgid "Veracruz"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:42
+msgid "Yucatán"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:43
+msgid "Zacatecas"
+msgstr ""
+
+#: contrib/localflavor/nl/forms.py:21
+msgid "Enter a valid postal code"
+msgstr ""
+
+#: contrib/localflavor/nl/forms.py:52
+msgid "Enter a valid phone number"
+msgstr ""
+
+#: contrib/localflavor/nl/forms.py:78
+msgid "Enter a valid SoFi number"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:4
+msgid "Drente"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:5
+msgid "Flevoland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:6
+msgid "Friesland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:7
+msgid "Gelderland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:8
+msgid "Groningen"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:9
+msgid "Limburg"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:10
+msgid "Noord-Brabant"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:11
+msgid "Noord-Holland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:12
+msgid "Overijssel"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:13
+msgid "Utrecht"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:14
+msgid "Zeeland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:15
+msgid "Zuid-Holland"
+msgstr ""
+
+#: contrib/localflavor/no/forms.py:33
+msgid "Enter a valid Norwegian social security number."
+msgstr ""
+
+#: contrib/localflavor/pe/forms.py:24
+msgid "This field requires 8 digits."
+msgstr ""
+
+#: contrib/localflavor/pe/forms.py:52
+msgid "This field requires 11 digits."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:39
+msgid "National Identification Number consists of 11 digits."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:40
+msgid "Wrong checksum for the National Identification Number."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:72
+msgid "Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:73
+msgid "Wrong checksum for the Tax Number (NIP)."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:112
+msgid "National Business Register Number (REGON) consists of 7 or 9 digits."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:113
+msgid "Wrong checksum for the National Business Register Number (REGON)."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:156
+msgid "Enter a postal code in the format XX-XXX."
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:8
+msgid "Lower Silesia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:9
+msgid "Kuyavia-Pomerania"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:10
+msgid "Lublin"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:11
+msgid "Lubusz"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:12
+msgid "Lodz"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:13
+msgid "Lesser Poland"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:14
+msgid "Masovia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:15
+msgid "Opole"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:16
+msgid "Subcarpatia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:17
+msgid "Podlasie"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:18
+msgid "Pomerania"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:19
+msgid "Silesia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:20
+msgid "Swietokrzyskie"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:21
+msgid "Warmia-Masuria"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:22
+msgid "Greater Poland"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:23
+msgid "West Pomerania"
+msgstr ""
+
+#: contrib/localflavor/sk/forms.py:30
+msgid "Enter a postal code in the format XXXXX or XXX XX."
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:8
+msgid "Banska Bystrica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:9
+msgid "Banska Stiavnica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:10
+msgid "Bardejov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:11
+msgid "Banovce nad Bebravou"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:12
+msgid "Brezno"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:13
+msgid "Bratislava I"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:14
+msgid "Bratislava II"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:15
+msgid "Bratislava III"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:16
+msgid "Bratislava IV"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:17
+msgid "Bratislava V"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:18
+msgid "Bytca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:19
+msgid "Cadca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:20
+msgid "Detva"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:21
+msgid "Dolny Kubin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:22
+msgid "Dunajska Streda"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:23
+msgid "Galanta"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:24
+msgid "Gelnica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:25
+msgid "Hlohovec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:26
+msgid "Humenne"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:27
+msgid "Ilava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:28
+msgid "Kezmarok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:29
+msgid "Komarno"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:30
+msgid "Kosice I"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:31
+msgid "Kosice II"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:32
+msgid "Kosice III"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:33
+msgid "Kosice IV"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:34
+msgid "Kosice - okolie"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:35
+msgid "Krupina"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:36
+msgid "Kysucke Nove Mesto"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:37
+msgid "Levice"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:38
+msgid "Levoca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:39
+msgid "Liptovsky Mikulas"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:40
+msgid "Lucenec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:41
+msgid "Malacky"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:42
+msgid "Martin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:43
+msgid "Medzilaborce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:44
+msgid "Michalovce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:45
+msgid "Myjava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:46
+msgid "Namestovo"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:47
+msgid "Nitra"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:48
+msgid "Nove Mesto nad Vahom"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:49
+msgid "Nove Zamky"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:50
+msgid "Partizanske"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:51
+msgid "Pezinok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:52
+msgid "Piestany"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:53
+msgid "Poltar"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:54
+msgid "Poprad"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:55
+msgid "Povazska Bystrica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:56
+msgid "Presov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:57
+msgid "Prievidza"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:58
+msgid "Puchov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:59
+msgid "Revuca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:60
+msgid "Rimavska Sobota"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:61
+msgid "Roznava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:62
+msgid "Ruzomberok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:63
+msgid "Sabinov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:64
+msgid "Senec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:65
+msgid "Senica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:66
+msgid "Skalica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:67
+msgid "Snina"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:68
+msgid "Sobrance"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:69
+msgid "Spisska Nova Ves"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:70
+msgid "Stara Lubovna"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:71
+msgid "Stropkov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:72
+msgid "Svidnik"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:73
+msgid "Sala"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:74
+msgid "Topolcany"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:75
+msgid "Trebisov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:76
+msgid "Trencin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:77
+msgid "Trnava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:78
+msgid "Turcianske Teplice"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:79
+msgid "Tvrdosin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:80
+msgid "Velky Krtis"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:81
+msgid "Vranov nad Toplou"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:82
+msgid "Zlate Moravce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:83
+msgid "Zvolen"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:84
+msgid "Zarnovica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:85
+msgid "Ziar nad Hronom"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:86
+msgid "Zilina"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:8
+msgid "Banska Bystrica region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:9
+msgid "Bratislava region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:10
+msgid "Kosice region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:11
+msgid "Nitra region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:12
+msgid "Presov region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:13
+msgid "Trencin region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:14
+msgid "Trnava region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:15
+msgid "Zilina region"
+msgstr ""
+
+#: contrib/localflavor/uk/forms.py:21
+msgid "Enter a valid postcode."
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:11
+msgid "Bedfordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:12
+msgid "Buckinghamshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:14
+msgid "Cheshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:15
+msgid "Cornwall and Isles of Scilly"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:16
+msgid "Cumbria"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:17
+msgid "Derbyshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:18
+msgid "Devon"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:19
+msgid "Dorset"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:20
+msgid "Durham"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:21
+msgid "East Sussex"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:22
+msgid "Essex"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:23
+msgid "Gloucestershire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:24
+msgid "Greater London"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:25
+msgid "Greater Manchester"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:26
+msgid "Hampshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:27
+msgid "Hertfordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:28
+msgid "Kent"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:29
+msgid "Lancashire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:30
+msgid "Leicestershire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:31
+msgid "Lincolnshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:32
+msgid "Merseyside"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:33
+msgid "Norfolk"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:34
+msgid "North Yorkshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:35
+msgid "Northamptonshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:36
+msgid "Northumberland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:37
+msgid "Nottinghamshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:38
+msgid "Oxfordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:39
+msgid "Shropshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:40
+msgid "Somerset"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:41
+msgid "South Yorkshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:42
+msgid "Staffordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:43
+msgid "Suffolk"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:44
+msgid "Surrey"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:45
+msgid "Tyne and Wear"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:46
+msgid "Warwickshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:47
+msgid "West Midlands"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:48
+msgid "West Sussex"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:49
+msgid "West Yorkshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:50
+msgid "Wiltshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:51
+msgid "Worcestershire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:55
+msgid "County Antrim"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:56
+msgid "County Armagh"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:57
+msgid "County Down"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:58
+msgid "County Fermanagh"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:59
+msgid "County Londonderry"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:60
+msgid "County Tyrone"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:64
+msgid "Clwyd"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:65
+msgid "Dyfed"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:66
+msgid "Gwent"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:67
+msgid "Gwynedd"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:68
+msgid "Mid Glamorgan"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:69
+msgid "Powys"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:70
+msgid "South Glamorgan"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:71
+msgid "West Glamorgan"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:75
+msgid "Borders"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:76
+msgid "Central Scotland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:77
+msgid "Dumfries and Galloway"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:78
+msgid "Fife"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:79
+msgid "Grampian"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:80
+msgid "Highland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:81
+msgid "Lothian"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:82
+msgid "Orkney Islands"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:83
+msgid "Shetland Islands"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:84
+msgid "Strathclyde"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:85
+msgid "Tayside"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:86
+msgid "Western Isles"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:90
+msgid "England"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:91
+msgid "Northern Ireland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:92
+msgid "Scotland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:93
+msgid "Wales"
+msgstr ""
+
+#: contrib/localflavor/us/forms.py:16
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr ""
+
+#: contrib/localflavor/us/forms.py:54
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr ""
+
+#: contrib/localflavor/za/forms.py:20
+msgid "Enter a valid South African ID number"
+msgstr ""
+
+#: contrib/localflavor/za/forms.py:54
+msgid "Enter a valid South African postal code"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:4
+msgid "Eastern Cape"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:5
+msgid "Free State"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:6
+msgid "Gauteng"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:7
+msgid "KwaZulu-Natal"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:8
+msgid "Limpopo"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:9
+msgid "Mpumalanga"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:10
+msgid "Northern Cape"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:11
+msgid "North West"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:12
+msgid "Western Cape"
+msgstr ""
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "nondik berbidalia"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr "Hau 'bide' absolutua izan beharko luke, dominio izena kenduta. 'Adibidez: events/search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "Nora berbidali"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr "Hau 'bide' absolutua (goian bezala) edo URL osoa , 'http://'-rekin hasiz, izan daiteke."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "berbidali"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "berbidali"
+
+#: contrib/sessions/models.py:46
+msgid "session key"
+msgstr "sesioaren giltza"
+
+#: contrib/sessions/models.py:47
+msgid "session data"
+msgstr "sesioaren data"
+
+#: contrib/sessions/models.py:48
+msgid "expire date"
+msgstr "amaiera data"
+
+#: contrib/sessions/models.py:53
+msgid "session"
+msgstr "sesioa"
+
+#: contrib/sessions/models.py:54
+msgid "sessions"
+msgstr "sesioak"
+
+#: contrib/sites/models.py:32
+msgid "domain name"
+msgstr "dominio izena"
+
+#: contrib/sites/models.py:33
+msgid "display name"
+msgstr "erakusteko izena"
+
+#: contrib/sites/models.py:37
+msgid "site"
+msgstr "web gunea"
+
+#: contrib/sites/models.py:38
+msgid "sites"
+msgstr "web guneak"
+
+#: core/validators.py:72
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Balore honek, letrak, zenbakia eta '_' karakterak bakarrik eduki ditzazke."
+
+#: core/validators.py:76
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr "Balore honek, letrak, zenbakia eta  '_', '/','-' karakterak bakarrik eduki ditzazke."
+
+#: core/validators.py:80
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "Balore honek letrak, zenbakiak eta '_','-' karatereak bakarrik izan ditzazke."
+
+#: core/validators.py:84
+msgid "Uppercase letters are not allowed here."
+msgstr "Hemen letra maiuskulak ez dira onartzen."
+
+#: core/validators.py:88
+msgid "Lowercase letters are not allowed here."
+msgstr "Hemen letra minukulak ez dira onartzen."
+
+#: core/validators.py:95
+msgid "Enter only digits separated by commas."
+msgstr "Komaz bereiztutako digitoak bakarrik idatzi."
+
+#: core/validators.py:107
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "E-mail norabide zuzenak idatzi, komaz bereizturik."
+
+#: core/validators.py:111
+msgid "Please enter a valid IP address."
+msgstr "Idatzi IP zenbaki zuzena mesedez."
+
+#: core/validators.py:115
+msgid "Empty values are not allowed here."
+msgstr "Balore hutsak ez dira hemen onartzen."
+
+#: core/validators.py:119
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Zenbaki karaktereak bakarrik onartzen dira hemen."
+
+#: core/validators.py:123
+msgid "This value can't be comprised solely of digits."
+msgstr "Balore honek ezin daiteke digitoz bakarrik osatua egon."
+
+#: core/validators.py:128 newforms/fields.py:151
+msgid "Enter a whole number."
+msgstr "Zenbaki bat idatzi."
+
+#: core/validators.py:132
+msgid "Only alphabetical characters are allowed here."
+msgstr "Karaktere alfabetikoak bakarrik onartzen dira hemen."
+
+#: core/validators.py:147
+msgid "Year must be 1900 or later."
+msgstr "Urtea 1900 edo haundiagoa izan behar du."
+
+#: core/validators.py:151
+#, python-format
+msgid "Invalid date: %s"
+msgstr "Data okerra: %s"
+
+#: core/validators.py:156 db/models/fields/__init__.py:509
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Data zuzena idatzi, YYY-MM-DD formatoan."
+
+#: core/validators.py:161
+msgid "Enter a valid time in HH:MM format."
+msgstr "Hordu zuzena idatzi HH:MM formatoan."
+
+#: core/validators.py:165 db/models/fields/__init__.py:583
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Idatzi data/hordua zuzena YYYY-MM-DD HH:MM formatoan."
+
+#: core/validators.py:170 newforms/fields.py:402
+msgid "Enter a valid e-mail address."
+msgstr "e-mail helbide zuzena idatzi."
+
+#: core/validators.py:182 core/validators.py:474 newforms/fields.py:432
+#: oldforms/__init__.py:687
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Ez da fitxategirik bidali. Baiztatu ezazu formularioren kode formatoa."
+
+#: core/validators.py:193 newforms/fields.py:458
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr "Bidali irudi zuzena. Zuk bidalitako fitxategia ez da irudi motako edo akatsa du."
+
+#: core/validators.py:200
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "%s URLa ez da irudi zuzena."
+
+#: core/validators.py:204
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "Telefono zenbakiak XXX-XXX-XXXX formatoa eduki behar dute. \"%s\" okerra."
+
+#: core/validators.py:212
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "%s URLa ez da QuickTime bideo zuzena."
+
+#: core/validators.py:216
+msgid "A valid URL is required."
+msgstr "URL zuzena behar da."
+
+#: core/validators.py:230
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"HTML zuzena behar da. Erroreak daude:\n"
+"%s"
+
+#: core/validators.py:237
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "XML okerra: %s"
+
+#: core/validators.py:254
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "URL okerra: %s"
+
+#: core/validators.py:259 core/validators.py:261
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "%s URLa ez dabil ondo."
+
+#: core/validators.py:267
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "U.S estatu laburpen zuzen idatzi."
+
+#: core/validators.py:281
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Kontuz ibili! %s hitza ez dago hemen onartua."
+msgstr[1] ""
+
+#: core/validators.py:288
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Data hau '%s' data berdindu behar du."
+
+#: core/validators.py:307
+msgid "Please enter something for at least one field."
+msgstr "Idatzi gutxienez data bat."
+
+#: core/validators.py:316 core/validators.py:327
+msgid "Please enter both fields or leave them both empty."
+msgstr "Hidatzi bi datuak edo utzi biak hutsik."
+
+#: core/validators.py:335
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Data hau idatzi behar da, %(field)s %(value)s balorea badu."
+
+#: core/validators.py:348
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Data hau idatzi behar da %(field)s %(value)s balorea ez bada."
+
+#: core/validators.py:367
+msgid "Duplicate values are not allowed."
+msgstr "Errepikatutako datak ez dira onartzen."
+
+#: core/validators.py:382
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Balore hau %(lower)s eta %(upper)s artean egon behar du."
+
+#: core/validators.py:384
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Gutxienez  %s izan behar du."
+
+#: core/validators.py:386
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Balore hau %s baino txikiagoa izan behar du."
+
+#: core/validators.py:427
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Balore hau %s-ren multiploa izan behar du."
+
+#: core/validators.py:437
+msgid "Please enter a valid decimal number."
+msgstr "Idatzi zenbaki dezimal zuzena mesedez."
+
+#: core/validators.py:444
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural "Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Idatzi zenbaki dezimal zuzena gehienez %s digitorekin."
+msgstr[1] ""
+
+#: core/validators.py:447
+#, python-format
+msgid "Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural "Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] "Idatzi zenbaki digital zuzena, %s digitorekin gutxienez alde osoan."
+msgstr[1] ""
+
+#: core/validators.py:450
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural "Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "Idatzi zenbaki dezimal zuzena, %s digitorekin dezimalean."
+msgstr[1] ""
+
+#: core/validators.py:458
+msgid "Please enter a valid floating point number."
+msgstr "Idatzi zenbaki erreal zuzena."
+
+#: core/validators.py:467
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Ziurta zaitez bidalitako fitxategia gutxienex %s byte tamaina duela."
+
+#: core/validators.py:468
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Ziurta zaitez bidalitako fitxategia gehienez %s byte dituela."
+
+#: core/validators.py:485
+msgid "The format for this field is wrong."
+msgstr "Data honen formatoa okerra da."
+
+#: core/validators.py:500
+msgid "This field is invalid."
+msgstr "Data okerra."
+
+#: core/validators.py:536
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Ezin daiteke ezer lortu %s-tik."
+
+#: core/validators.py:539
+#, python-format
+msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "%(url)s URLak content-type okerra itzuli du: '%(contenttype)s'."
+
+#: core/validators.py:572
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr "Mesedez itxi itxigabeko %(tag)s elementoa %(line)s lerroan. Lerroa hasiera: \"%(start)s\"."
+
+#: core/validators.py:576
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr "Texturen bat  %(line)s lerroan ez da onartzen contextu horretan. Lerro hasiera: \"%(start)s\"."
+
+#: core/validators.py:581
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr "\"%(attr)s\" %(line)s lerroan atribitu okerra da. Lerro hasiera: \"%(start)s\"."
+
+#: core/validators.py:586
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr "\"%(tag)s\" %(line)s lerroan elementu okerra da. Lerro hasiera: \"%(start)s\"."
+
+#: core/validators.py:590
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr "%(line)s lerroan elementu atributu bat edo gehiago faltan ditu. Lerro hasiera:\"%(start)s\"."
+
+#: core/validators.py:595
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr "\"%(attr)s\" atributoa %(line)s lerroan balore okerra du. (Lerro hasiera: \"%(start)s\".)"
+
+#: db/models/manipulators.py:308
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(object)s with this %(type)s already exists for the given %(field)s."
+
+#: db/models/fields/__init__.py:52
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "Badago %(optname)s izenarekin %(fieldname)s-n."
+
+#: db/models/fields/__init__.py:161 db/models/fields/__init__.py:318
+#: db/models/fields/__init__.py:735 db/models/fields/__init__.py:746
+#: newforms/fields.py:45 oldforms/__init__.py:374
+msgid "This field is required."
+msgstr "Kanpo hau beharrezkoa da."
+
+#: db/models/fields/__init__.py:418
+msgid "This value must be an integer."
+msgstr "Balore hau zenbaki osoa izan behar du."
+
+#: db/models/fields/__init__.py:454
+msgid "This value must be either True or False."
+msgstr "Balore hau egia ala gezurra izan behar du (True/False)."
+
+#: db/models/fields/__init__.py:475
+msgid "This field cannot be null."
+msgstr "Datu hau ezin daiteke hutsa izan (null)."
+
+#: db/models/fields/__init__.py:644
+msgid "This value must be a decimal number."
+msgstr "Balore hau zenbaki dezimala izan begar du."
+
+#: db/models/fields/__init__.py:755
+msgid "Enter a valid filename."
+msgstr "Idatzi fitxategi izen zuzena"
+
+#: db/models/fields/__init__.py:908
+msgid "This value must be either None, True or False."
+msgstr "Balore hau hutsa, egia edo gezurra izan behar du (None, True,False)"
+
+#: db/models/fields/related.py:55
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Mesades idatzi %s zuzena."
+
+#: db/models/fields/related.py:658
+msgid "Separate multiple IDs with commas."
+msgstr "Bereiztu ID zerrenda koma bidez."
+
+#: db/models/fields/related.py:660
+msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "Zapaldu \"Control\" karakterea edo \"Command\" Mac batean, bat baino gehiago aukeratzeko."
+
+#: db/models/fields/related.py:707
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural "Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "Mesedez idatzi %(self)s ID zuzena. %(value)r okerra da."
+msgstr[1] ""
+
+#: newforms/fields.py:46
+msgid "Enter a valid value."
+msgstr "Idatzi balio zuzena."
+
+#: newforms/fields.py:123
+#, python-format
+msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+msgstr "Ziurta zaitez balore honek gehienez %(max)d karactere dituela, %(length)d ditu orain."
+
+#: newforms/fields.py:124
+#, python-format
+msgid "Ensure this value has at least %(min)d characters (it has %(length)d)."
+msgstr "Ziurta zaitez balore honek gutxienez %(min)d karaktere dituela ,%(length)d ditu orain."
+
+#: newforms/fields.py:152 newforms/fields.py:181 newforms/fields.py:210
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Ziurta zaitez balore hau %s baino txikiagoa edo berdina dela."
+
+#: newforms/fields.py:153 newforms/fields.py:182 newforms/fields.py:211
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Ziurta zaitez balore hau %s baino haundiagoa edo berdina dela."
+
+#: newforms/fields.py:180 newforms/fields.py:209
+msgid "Enter a number."
+msgstr "Idatzi zenbaki bat."
+
+#: newforms/fields.py:212
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr "Ziurta zaitez %s baino digito gehiago ez dagoela."
+
+#: newforms/fields.py:213
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr "Ziurta zaitez %s baino dezimale gehiago ez dagoela."
+
+#: newforms/fields.py:214
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr "Ziurta zaitez %s digitu baino gehiago ez dagoela puntu dezimalaren aurretik."
+
+#: newforms/fields.py:262 newforms/fields.py:723
+msgid "Enter a valid date."
+msgstr "Data zuzen bat idatzi."
+
+#: newforms/fields.py:295 newforms/fields.py:724
+msgid "Enter a valid time."
+msgstr "Ordu zuzen bat idatzi."
+
+#: newforms/fields.py:334
+msgid "Enter a valid date/time."
+msgstr "Data/Ordua zuzen bat idatzi."
+
+#: newforms/fields.py:433
+msgid "No file was submitted."
+msgstr "Ez da fitxategirik bidali."
+
+#: newforms/fields.py:434 oldforms/__init__.py:689
+msgid "The submitted file is empty."
+msgstr "Bidalitako fitxategia hutsik dago."
+
+#: newforms/fields.py:496
+msgid "Enter a valid URL."
+msgstr "URL zuzen bat idatzi."
+
+#: newforms/fields.py:497
+msgid "This URL appears to be a broken link."
+msgstr "URL hau ez dabil ondo."
+
+#: newforms/fields.py:559 newforms/models.py:317
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Aukera zuzen bat aukeratu. Aukeratutakoa ez da zuzena."
+
+#: newforms/fields.py:598
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "Aukeratu aukera zuzen bat. %(value)s ez da zuzena."
+
+#: newforms/fields.py:599 newforms/fields.py:661 newforms/models.py:377
+msgid "Enter a list of values."
+msgstr "Balio zerrenda bat idatzi ezazu."
+
+#: newforms/fields.py:752
+msgid "Enter a valid IPv4 address."
+msgstr "IPv4 zuzen bat idatzi."
+
+#: newforms/models.py:378
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Aukera zuzena aukeratu. %s ez da zuzena."
+
+#: oldforms/__init__.py:409
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Ziurta zaitez textuak %s karaktere baino gutxiago duela."
+msgstr[1] ""
+
+#: oldforms/__init__.py:414
+msgid "Line breaks are not allowed here."
+msgstr "Lerro berriak (line breaks) ez dire onartzen hemen."
+
+#: oldforms/__init__.py:512 oldforms/__init__.py:586 oldforms/__init__.py:625
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Aukera zuzena aukeratu: '%(data)s' ez dago %(choices)s hartean."
+
+#: oldforms/__init__.py:745
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Idatzi -32.768 eta 32.767 arteko zenbaki osoa."
+
+#: oldforms/__init__.py:755
+msgid "Enter a positive number."
+msgstr "Zenbaki positboa idatzi."
+
+#: oldforms/__init__.py:765
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Idatzi 0 eta 32.767 arteko zenbaki osoa."
+
+#: template/defaultfilters.py:691
+msgid "yes,no,maybe"
+msgstr "bai,ez,agian"
+
+#: template/defaultfilters.py:722
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d byte"
+msgstr[1] ""
+
+#: template/defaultfilters.py:724
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f KB"
+
+#: template/defaultfilters.py:726
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: template/defaultfilters.py:727
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#: utils/dateformat.py:41
+msgid "p.m."
+msgstr "p.m."
+
+#: utils/dateformat.py:42
+msgid "a.m."
+msgstr "a.m."
+
+#: utils/dateformat.py:47
+msgid "PM"
+msgstr "PM"
+
+#: utils/dateformat.py:48
+msgid "AM"
+msgstr "AM"
+
+#: utils/dateformat.py:97
+msgid "midnight"
+msgstr "gauerdia"
+
+#: utils/dateformat.py:99
+msgid "noon"
+msgstr "eguerdia"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Astelehena"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Asteartea"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Asteazkena"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Osteguna"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Ostirala"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Larunbata"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Igandea"
+
+#: utils/dates.py:10
+msgid "Mon"
+msgstr "Astelehe"
+
+#: utils/dates.py:10
+msgid "Tue"
+msgstr "Astear"
+
+#: utils/dates.py:10
+msgid "Wed"
+msgstr "Asteaz"
+
+#: utils/dates.py:10
+msgid "Thu"
+msgstr "Oste"
+
+#: utils/dates.py:10
+msgid "Fri"
+msgstr "Osti"
+
+#: utils/dates.py:11
+msgid "Sat"
+msgstr "Lar"
+
+#: utils/dates.py:11
+msgid "Sun"
+msgstr "Iga"
+
+#: utils/dates.py:18
+msgid "January"
+msgstr "Urtarrila"
+
+#: utils/dates.py:18
+msgid "February"
+msgstr "Otsaila"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "March"
+msgstr "Martxoa"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "April"
+msgstr "Apirila"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "May"
+msgstr "Maiatza"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "June"
+msgstr "Ekaina"
+
+#: utils/dates.py:19 utils/dates.py:31
+msgid "July"
+msgstr "Uztaila"
+
+#: utils/dates.py:19
+msgid "August"
+msgstr "Abuztua"
+
+#: utils/dates.py:19
+msgid "September"
+msgstr "Iraila"
+
+#: utils/dates.py:19
+msgid "October"
+msgstr "Urria"
+
+#: utils/dates.py:19
+msgid "November"
+msgstr "Azaroa"
+
+#: utils/dates.py:20
+msgid "December"
+msgstr "Abendua"
+
+#: utils/dates.py:23
+msgid "jan"
+msgstr "urt"
+
+#: utils/dates.py:23
+msgid "feb"
+msgstr "ots"
+
+#: utils/dates.py:23
+msgid "mar"
+msgstr "mar"
+
+#: utils/dates.py:23
+msgid "apr"
+msgstr "api"
+
+#: utils/dates.py:23
+msgid "may"
+msgstr "mai"
+
+#: utils/dates.py:23
+msgid "jun"
+msgstr "eka"
+
+#: utils/dates.py:24
+msgid "jul"
+msgstr "uzt"
+
+#: utils/dates.py:24
+msgid "aug"
+msgstr "abu"
+
+#: utils/dates.py:24
+msgid "sep"
+msgstr "ira"
+
+#: utils/dates.py:24
+msgid "oct"
+msgstr "urr"
+
+#: utils/dates.py:24
+msgid "nov"
+msgstr "aza"
+
+#: utils/dates.py:24
+msgid "dec"
+msgstr "abe"
+
+#: utils/dates.py:31
+msgid "Jan."
+msgstr "Urt."
+
+#: utils/dates.py:31
+msgid "Feb."
+msgstr "Ots."
+
+#: utils/dates.py:32
+msgid "Aug."
+msgstr "Abu."
+
+#: utils/dates.py:32
+msgid "Sept."
+msgstr "Ira."
+
+#: utils/dates.py:32
+msgid "Oct."
+msgstr "Urr."
+
+#: utils/dates.py:32
+msgid "Nov."
+msgstr "Aza."
+
+#: utils/dates.py:32
+msgid "Dec."
+msgstr "Abe."
+
+#: utils/text.py:127
+msgid "or"
+msgstr "edo"
+
+#: utils/timesince.py:21
+msgid "year"
+msgid_plural "years"
+msgstr[0] "urtea"
+msgstr[1] ""
+
+#: utils/timesince.py:22
+msgid "month"
+msgid_plural "months"
+msgstr[0] "hilabetea"
+msgstr[1] ""
+
+#: utils/timesince.py:23
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "astea"
+msgstr[1] ""
+
+#: utils/timesince.py:24
+msgid "day"
+msgid_plural "days"
+msgstr[0] "eguna"
+msgstr[1] ""
+
+#: utils/timesince.py:25
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "hordua"
+msgstr[1] ""
+
+#: utils/timesince.py:26
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minutu"
+msgstr[1] ""
+
+#: utils/timesince.py:46
+msgid "minutes"
+msgstr "minutuak"
+
+#: utils/timesince.py:51
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr "%(number)d %(type)s"
+
+#: utils/timesince.py:57
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ", %(number)d %(type)s"
+
+#: utils/translation/trans_real.py:404
+msgid "DATE_FORMAT"
+msgstr "DATE_FORMAT"
+
+#: utils/translation/trans_real.py:405
+msgid "DATETIME_FORMAT"
+msgstr "DATETIME_FORMAT"
+
+#: utils/translation/trans_real.py:406
+msgid "TIME_FORMAT"
+msgstr "TIME_FORMAT"
+
+#: utils/translation/trans_real.py:422
+msgid "YEAR_MONTH_FORMAT"
+msgstr "YEAR_MONTH_FORMAT"
+
+#: utils/translation/trans_real.py:423
+msgid "MONTH_DAY_FORMAT"
+msgstr "MONTH_DAY_FORMAT"
+
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "%(verbose_name)s arazorik gabe sortu da"
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "%(verbose_name)s arazorik gabe aldatua izan da."
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "%(verbose_name)s ezabatua izan da."
+
diff --git a/webapp/django/conf/locale/eu/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/eu/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..646aa0f
--- /dev/null
+++ b/webapp/django/conf/locale/eu/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/eu/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/eu/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..2df6bd2
--- /dev/null
+++ b/webapp/django/conf/locale/eu/LC_MESSAGES/djangojs.po
@@ -0,0 +1,117 @@
+# Spanish translation for the django-admin JS files.
+# Copyright (C)
+# This file is distributed under the same license as the PACKAGE package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-07-14 13:47-0500\n"
+"PO-Revision-Date: 2007-07-14 13:41-0500\n"
+"Last-Translator: Jorge Gajon <gajon@gajon.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/calendar.js:24
+#: contrib/admin/media/js/dateparse.js:32
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Urtarrila Otsaila Martxoa Apirila Maiatza Ekaina Uztaila Abuztua Iraila Urria "
+"Azaroa Abendua"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "I A A A O O L"
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Igandea Astelehene Asteartea Asteazkena Osteguna Ostirala Larunbata"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "%s Erabilgarri"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Denak aukeratu"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Gehitu"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Ezabatu"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "%s Aukeratuak"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Egin zure aukerak eta click egin "
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Denak garbitu"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Now"
+msgstr "Orain"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
+msgid "Clock"
+msgstr "Erlojua"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
+msgid "Choose a time"
+msgstr "Aukeratu ordu bat"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "Midnight"
+msgstr "Gauerdia"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "6 a.m."
+msgstr "6 a.m."
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
+msgid "Noon"
+msgstr "Eguerdia"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
+msgid "Cancel"
+msgstr "Atzera"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
+msgid "Today"
+msgstr "Gaur"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
+msgid "Calendar"
+msgstr "Egutegia"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
+msgid "Yesterday"
+msgstr "Atzo"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
+msgid "Tomorrow"
+msgstr "Bihar"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr "Erakutsi"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr "Izkutatu"
diff --git a/webapp/django/conf/locale/fa/LC_MESSAGES/django.mo b/webapp/django/conf/locale/fa/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..ac3c31e
--- /dev/null
+++ b/webapp/django/conf/locale/fa/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/fa/LC_MESSAGES/django.po b/webapp/django/conf/locale/fa/LC_MESSAGES/django.po
new file mode 100644
index 0000000..16b0d7c
--- /dev/null
+++ b/webapp/django/conf/locale/fa/LC_MESSAGES/django.po
@@ -0,0 +1,4236 @@
+# Persian translation of Django.
+# Copyright (C) 2007 THE Django'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the Django package.
+# 
+# 
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-01 03:29+0330\n"
+"PO-Revision-Date: 2008-02-01 05:19+0330\n"
+"Last-Translator: starrynight <cmorgh@gmail.com>\n"
+"Language-Team: Persian <farsi@lists.sharif.edu>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit"
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr ""
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr ""
+
+#: conf/global_settings.py:41
+msgid "Bulgarian"
+msgstr ""
+
+#: conf/global_settings.py:42
+msgid "Catalan"
+msgstr ""
+
+#: conf/global_settings.py:43
+msgid "Czech"
+msgstr ""
+
+#: conf/global_settings.py:44
+msgid "Welsh"
+msgstr ""
+
+#: conf/global_settings.py:45
+msgid "Danish"
+msgstr ""
+
+#: conf/global_settings.py:46
+msgid "German"
+msgstr ""
+
+#: conf/global_settings.py:47
+msgid "Greek"
+msgstr ""
+
+#: conf/global_settings.py:48
+msgid "English"
+msgstr "انگلیسی"
+
+#: conf/global_settings.py:49
+msgid "Spanish"
+msgstr ""
+
+#: conf/global_settings.py:50
+msgid "Argentinean Spanish"
+msgstr ""
+
+#: conf/global_settings.py:51
+#, fuzzy
+msgid "Persian"
+msgstr "اجازه‌ها"
+
+#: conf/global_settings.py:52
+msgid "Finnish"
+msgstr ""
+
+#: conf/global_settings.py:53
+msgid "French"
+msgstr ""
+
+#: conf/global_settings.py:54
+msgid "Gaeilge"
+msgstr ""
+
+#: conf/global_settings.py:55
+msgid "Galician"
+msgstr ""
+
+#: conf/global_settings.py:56
+msgid "Hungarian"
+msgstr ""
+
+#: conf/global_settings.py:57
+msgid "Hebrew"
+msgstr ""
+
+#: conf/global_settings.py:58
+msgid "Croatian"
+msgstr ""
+
+#: conf/global_settings.py:59
+msgid "Icelandic"
+msgstr ""
+
+#: conf/global_settings.py:60
+msgid "Italian"
+msgstr "ایتالیایی"
+
+#: conf/global_settings.py:61
+msgid "Japanese"
+msgstr "ژاپنی"
+
+#: conf/global_settings.py:62
+msgid "Korean"
+msgstr "کره ای"
+
+#: conf/global_settings.py:63
+msgid "Khmer"
+msgstr ""
+
+#: conf/global_settings.py:64
+msgid "Kannada"
+msgstr ""
+
+#: conf/global_settings.py:65
+msgid "Latvian"
+msgstr ""
+
+#: conf/global_settings.py:66
+msgid "Macedonian"
+msgstr ""
+
+#: conf/global_settings.py:67
+msgid "Dutch"
+msgstr ""
+
+#: conf/global_settings.py:68
+msgid "Norwegian"
+msgstr "نروژی"
+
+#: conf/global_settings.py:69
+msgid "Polish"
+msgstr ""
+
+#: conf/global_settings.py:70
+msgid "Portugese"
+msgstr "پرتغالی"
+
+#: conf/global_settings.py:71
+msgid "Brazilian"
+msgstr "برزیلی"
+
+#: conf/global_settings.py:72
+msgid "Romanian"
+msgstr "رومانی"
+
+#: conf/global_settings.py:73
+msgid "Russian"
+msgstr "روسی"
+
+#: conf/global_settings.py:74
+msgid "Slovak"
+msgstr "اسلواکی"
+
+#: conf/global_settings.py:75
+msgid "Slovenian"
+msgstr ""
+
+#: conf/global_settings.py:76
+msgid "Serbian"
+msgstr "سرب"
+
+#: conf/global_settings.py:77
+msgid "Swedish"
+msgstr "سوءدی"
+
+#: conf/global_settings.py:78
+msgid "Tamil"
+msgstr "تامیل"
+
+#: conf/global_settings.py:79
+msgid "Telugu"
+msgstr ""
+
+#: conf/global_settings.py:80
+msgid "Turkish"
+msgstr "ترکی"
+
+#: conf/global_settings.py:81
+msgid "Ukrainian"
+msgstr ""
+
+#: conf/global_settings.py:82
+msgid "Simplified Chinese"
+msgstr ""
+
+#: conf/global_settings.py:83
+msgid "Traditional Chinese"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:44
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>بوسیلهٔ %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:74 contrib/admin/filterspecs.py:92
+#: contrib/admin/filterspecs.py:147 contrib/admin/filterspecs.py:173
+msgid "All"
+msgstr "همه"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Any date"
+msgstr "هر تاریخی"
+
+#: contrib/admin/filterspecs.py:114
+msgid "Today"
+msgstr "امروز"
+
+#: contrib/admin/filterspecs.py:117
+msgid "Past 7 days"
+msgstr "۷ روز اخیر"
+
+#: contrib/admin/filterspecs.py:119
+msgid "This month"
+msgstr "این ماه"
+
+#: contrib/admin/filterspecs.py:121
+msgid "This year"
+msgstr "امسال"
+
+#: contrib/admin/filterspecs.py:147 newforms/widgets.py:231
+#: oldforms/__init__.py:592
+msgid "Yes"
+msgstr "بله"
+
+#: contrib/admin/filterspecs.py:147 newforms/widgets.py:231
+#: oldforms/__init__.py:592
+msgid "No"
+msgstr "خیر"
+
+#: contrib/admin/filterspecs.py:154 newforms/widgets.py:231
+#: oldforms/__init__.py:592
+msgid "Unknown"
+msgstr "ناشناخته"
+
+#: contrib/admin/models.py:18
+msgid "action time"
+msgstr "زمان اتفاق"
+
+#: contrib/admin/models.py:21
+msgid "object id"
+msgstr "شناسهٔ شئ"
+
+#: contrib/admin/models.py:22
+msgid "object repr"
+msgstr "صورت شیء"
+
+#: contrib/admin/models.py:23
+msgid "action flag"
+msgstr "نشانه عمل"
+
+#: contrib/admin/models.py:24
+msgid "change message"
+msgstr "پیغام تغییر"
+
+#: contrib/admin/models.py:27
+msgid "log entry"
+msgstr "مورد اتفاقات"
+
+#: contrib/admin/models.py:28
+msgid "log entries"
+msgstr "موارد اتفاقات"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "صفحه یافت نشد"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "ما متاسفیم، اما صفحه مورد تقاضا یافت نشد."
+
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:37
+#: contrib/admin/templates/admin/change_form.html:12
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/delete_confirmation.html:5
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:4
+#: contrib/admin/templates/admin/auth/user/change_password.html:11
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+msgid "Home"
+msgstr "آغازه"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "خطای کارگزار"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "خطای کارگزار (۵۰۰)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "خطای کارگزار <em>(۵۰۰)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr "مشکلی وجود دارد. این مشکل توسط ایمیل به مدیر سایت گزارش داده شد و در اولین فرصت اصلاح خواهد شد. از بردباری شما متشکریم."
+
+#: contrib/admin/templates/admin/base.html:26
+msgid "Welcome,"
+msgstr "خوش آمدید،"
+
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "مستندات"
+
+#: contrib/admin/templates/admin/base.html:29
+#: contrib/admin/templates/admin/auth/user/change_password.html:14
+#: contrib/admin/templates/admin/auth/user/change_password.html:45
+msgid "Change password"
+msgstr "تغییر گذرواژه"
+
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/comments/templates/comments/form.html:6
+msgid "Log out"
+msgstr "خروج"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "وب‌گاه مدیریت Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "مدیریت Django"
+
+#: contrib/admin/templates/admin/change_form.html:14
+#: contrib/admin/templates/admin/index.html:28
+msgid "Add"
+msgstr "ایجاد"
+
+#: contrib/admin/templates/admin/change_form.html:20
+#: contrib/admin/templates/admin/object_history.html:4
+msgid "History"
+msgstr "تاریخچه"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "مشاهده در سایت"
+
+#: contrib/admin/templates/admin/change_form.html:31
+#: contrib/admin/templates/admin/auth/user/change_password.html:23
+msgid "Please correct the error below."
+msgstr "لطفا مشکل زیر را حل نمایید."
+
+#: contrib/admin/templates/admin/change_form.html:49
+msgid "Ordering"
+msgstr "ترتیب"
+
+#: contrib/admin/templates/admin/change_form.html:52
+msgid "Order:"
+msgstr "ترتیب:"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "اضافه‌کردن %(name)s"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:8
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "حذف"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:13
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr "حذف %(object_name)s·'%(escaped_object)s' می تواند باعث حذف اشیاء مرتبط شود. اما اکانت شما دسترسی لازم برای حذف اشیاءی با انواع زیر را ندارد:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:20
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr "آیا مطمءنید که می خواهید %(object_name)s·\"%(escaped_object)s\" را حذف نمایید؟ کلیه اشیاء مرتبط زیر حذف خواهند شد:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:25
+msgid "Yes, I'm sure"
+msgstr "بله، مطمئن هستم."
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " با %(filter_title)s "
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "فیلتر"
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "مدلهای موجود در برنامه %(name)s."
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "تغییر"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "شما اجازهٔ ویرایش چیزی را ندارید."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "اعمال اخیر"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "اعمال من"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "چیزی در دسترس نیست"
+
+#: contrib/admin/templates/admin/invalid_setup.html:8
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr "در نصب بانک اطلاعاتی شما مشکلی وجود دارد. مطمءن شوید که جداول صحیح ایجاد شده اند و اطمینان حاصل کنید که بانک اطلاعاتی توسط کاربر صحیح قابل خواندن می باشد."
+
+#: contrib/admin/templates/admin/login.html:17
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+msgid "Username:"
+msgstr "نام کاربری:"
+
+#: contrib/admin/templates/admin/login.html:20
+#: contrib/comments/templates/comments/form.html:8
+msgid "Password:"
+msgstr "گذرواژه:"
+
+#: contrib/admin/templates/admin/login.html:25
+#: contrib/admin/views/decorators.py:25
+msgid "Log in"
+msgstr "ورود"
+
+#: contrib/admin/templates/admin/object_history.html:17
+msgid "Date/time"
+msgstr "تاریخ/ساعت"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "User"
+msgstr "کاربر"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "Action"
+msgstr "عمل"
+
+#: contrib/admin/templates/admin/object_history.html:25
+msgid "DATE_WITH_TIME_FULL"
+msgstr "DATE_WITH_TIME_FULL"
+
+#: contrib/admin/templates/admin/object_history.html:35
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr "این شیء تاریخچه تغییرات ندارد. احتمالا این شیء توسط سایت مدیریت ایجاد نشده است."
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "نمایش همه"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "برو"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgstr "۱ نتیجه"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "کل %(full_result_count)s"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "ذخیره به عنوان جدید"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "ذخیره و ایجاد یکی دیگر"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "ذخیره و ادامه ویرایش"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "ذخیره"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr "ابتدا یک نام کاربری و گذرواژه وارد کنید. سپس می توانید مشخصات دیگر را تغییر دهید."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "نام کاربری"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+#: contrib/admin/templates/admin/auth/user/change_password.html:33
+msgid "Password"
+msgstr "گذرواژه"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+#: contrib/admin/templates/admin/auth/user/change_password.html:38
+msgid "Password (again)"
+msgstr "گذرواژه (تکرار)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+msgid "Enter the same password as above, for verification."
+msgstr "همان گذرواژهٔ بالایی را برای اطمینان دوباره وارد کنید."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:27
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "برای کابر <strong>%(username)s</strong> یک گذرنامهٔ جدید وارد کنید."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "یادداشت"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+msgid "Documentation bookmarklets"
+msgstr "یادداشت راهنما"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:8
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:18
+msgid "Documentation for this page"
+msgstr "راهنما برای این صفحه"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr "شما را از هر صفحه ای که باشید به نمایی که صفحه را ایجاد کرده می برد"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:21
+msgid "Show object ID"
+msgstr "نمایش مشخصه شیء"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr "نمایش محتوا و مشخصه منحصر به فرد برای صفحاتی که یک شیء را بیان می کنند."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:24
+msgid "Edit this object (current window)"
+msgstr "این شیء را ویرایش کنید (پنجره کنونی)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "رفتن به صفحه مدیر برای صفحاتی که یک شیء را بیان می کنند."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:27
+msgid "Edit this object (new window)"
+msgstr "این شیء را ویرایش کنید (پنجره جدید)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "As above, but opens the admin page in a new window."
+msgstr "مانند بالا، اما صفحه مدیر را در پنجره جدیدی باز می کند."
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "متشکر از اینکه مدتی از وقت خود را به ما اختصاص دادید."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "ورود دوباره"
+
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_form.html:5
+#: contrib/admin/templates/registration/password_change_form.html:9
+msgid "Password change"
+msgstr "تغییر گذرواژه"
+
+#: contrib/admin/templates/registration/password_change_done.html:5
+#: contrib/admin/templates/registration/password_change_done.html:9
+msgid "Password change successful"
+msgstr "گذرواژه تغییر یافت."
+
+#: contrib/admin/templates/registration/password_change_done.html:11
+msgid "Your password was changed."
+msgstr "گذرواژهٔ شما تغییر یافت."
+
+#: contrib/admin/templates/registration/password_change_form.html:11
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"گذرواژهٔ قدیمی خود را، برای امنیت بیشتر، وارد کنید و سپس گذرواژهٔ جدیدتان را "
+"دوبار وارد کنید تا ما بتوانیم چک کنیم که به درستی تایپ کرده‌اید."
+
+#: contrib/admin/templates/registration/password_change_form.html:16
+msgid "Old password:"
+msgstr "گذرواژهٔ قدیمی"
+
+#: contrib/admin/templates/registration/password_change_form.html:18
+msgid "New password:"
+msgstr "گذرواژهٔ جدید"
+
+#: contrib/admin/templates/registration/password_change_form.html:20
+msgid "Confirm password:"
+msgstr "تکرار گذرواژه"
+
+#: contrib/admin/templates/registration/password_change_form.html:22
+msgid "Change my password"
+msgstr "تغییر گذرواژهٔ من"
+
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+msgid "Password reset"
+msgstr "ایجاد گذرواژهٔ جدید"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "گذرواژهٔ جدید ایجاد شد."
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"ما به آدرس پست اکترونیکی‌ای که وارد کردید یک گذرواژهٔ جدید فرستادیم. به زودی "
+"به شما می‌رسد."
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr ""
+"درخواستی برای ایجاد گذرواژهٔ جدید با آدرس شما به ما رسیده است و ما این نامه "
+"را برای شما فرستادیم"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "برای حساب کاربریتان در %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "گذرواژهٔ جدیدتان: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "با رفتن به صفحهٔ زیر می‌توانید گذرواژه‌تان را عوض کنید:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "نام کاربریتان، اگر یادتان رفته است:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "متشکر از استفادهٔ شما از وبگاه ما"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "گروه %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr "گذرواژه خود را فراموش کرده اید؟ ایمیل خود را وارد کنید. ما گذرواژه را تغییر داده، آنرا برای شما ایمیل می کنیم."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "آدرس پست الکترونیکی:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "ایجاد گذرواژهٔ جدید"
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "تاریخ:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "زمان:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "اکنون:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "تغییر:"
+
+#: contrib/admin/templatetags/admin_list.py:257
+msgid "All dates"
+msgstr "همه تاریخ ها"
+
+#: contrib/admin/views/auth.py:20 contrib/admin/views/main.py:267
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(obj)s از %(name)s با موفقیت ایجاد شد."
+
+#: contrib/admin/views/auth.py:25 contrib/admin/views/main.py:271
+#: contrib/admin/views/main.py:356
+msgid "You may edit it again below."
+msgstr "در زیر، می توانید مجددا آنرا ویراش کنید."
+
+#: contrib/admin/views/auth.py:31
+msgid "Add user"
+msgstr "ایجاد کاربر"
+
+#: contrib/admin/views/auth.py:58
+msgid "Password changed successfully."
+msgstr "گذرواژه با موفقیت تغییر یافت."
+
+#: contrib/admin/views/auth.py:65
+#, python-format
+msgid "Change password: %s"
+msgstr "تغییر گذرواژه: %s"
+
+#: contrib/admin/views/decorators.py:11 contrib/auth/forms.py:60
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr "لطفا نام کاربری و گذرواژه صحیح را وارد نمایید. توجه نمایید که هر دو مقدار به حروف کوچک و بزرگ (انگلیسی) حساس می باشند."
+
+#: contrib/admin/views/decorators.py:63
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr "لطفا مجددا وارد شوید. زیرا مدت زیادی در سایت غیر فعال بوده اید. نگران نباشید، کلیه اطلاعات وارد شده شما ذخیره شده اند."
+
+#: contrib/admin/views/decorators.py:70
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr "به نظر می رسد تنظیمات browser شما طوری است که cookie ها را قبول نمی کند. لطفا cookie را در browser خود فعال نموده و مجددا تلاش نمایید."
+
+#: contrib/admin/views/decorators.py:84
+msgid "Usernames cannot contain the '@' character."
+msgstr "نام کاربری نمی تواند حاوی حرف '@' باشد."
+
+#: contrib/admin/views/decorators.py:86
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "آدرس ایمیل شما نام کابریتان نیست. %s را به جای آن امتحان کنید."
+
+#: contrib/admin/views/doc.py:48 contrib/admin/views/doc.py:50
+#: contrib/admin/views/doc.py:52
+msgid "tag:"
+msgstr "نشانه"
+
+#: contrib/admin/views/doc.py:79 contrib/admin/views/doc.py:81
+#: contrib/admin/views/doc.py:83
+msgid "filter:"
+msgstr "فیلتر"
+
+#: contrib/admin/views/doc.py:137 contrib/admin/views/doc.py:139
+#: contrib/admin/views/doc.py:141
+msgid "view:"
+msgstr "نمایش:"
+
+#: contrib/admin/views/doc.py:166
+#, python-format
+msgid "App %r not found"
+msgstr "برنامه %r یافت نشد"
+
+#: contrib/admin/views/doc.py:173
+#, python-format
+msgid "Model %(name)r not found in app %(label)r"
+msgstr "مدل %(name)r در برنامه %(label)r یافت نشد"
+
+#: contrib/admin/views/doc.py:185
+#, python-format
+msgid "the related `%(label)s.%(type)s` object"
+msgstr "شیء `%(label)s %(type)s` مرتبط"
+
+#: contrib/admin/views/doc.py:185 contrib/admin/views/doc.py:207
+#: contrib/admin/views/doc.py:221 contrib/admin/views/doc.py:226
+msgid "model:"
+msgstr "مدل:"
+
+#: contrib/admin/views/doc.py:216
+#, python-format
+msgid "related `%(label)s.%(name)s` objects"
+msgstr "اشیاء `%(label)s.%(name)s` مرتبط"
+
+#: contrib/admin/views/doc.py:221
+#, python-format
+msgid "all %s"
+msgstr "کل %s"
+
+#: contrib/admin/views/doc.py:226
+#, python-format
+msgid "number of %s"
+msgstr "عدد %s"
+
+#: contrib/admin/views/doc.py:231
+#, python-format
+msgid "Fields on %s objects"
+msgstr "فیلدهای شیء %s"
+
+#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:304
+#: contrib/admin/views/doc.py:306 contrib/admin/views/doc.py:312
+#: contrib/admin/views/doc.py:313 contrib/admin/views/doc.py:315
+msgid "Integer"
+msgstr "عدد صحیح"
+
+#: contrib/admin/views/doc.py:294
+msgid "Boolean (Either True or False)"
+msgstr "Boolean (درست یا غلط)"
+
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:314
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "String (تا %(max_length)s)"
+
+#: contrib/admin/views/doc.py:296
+msgid "Comma-separated integers"
+msgstr "اعداد صحیح که با ویلگول جدا شده اند"
+
+#: contrib/admin/views/doc.py:297
+msgid "Date (without time)"
+msgstr "تاریخ (بدون زمان)"
+
+#: contrib/admin/views/doc.py:298
+msgid "Date (with time)"
+msgstr "تاریخ (با زمان)"
+
+#: contrib/admin/views/doc.py:299
+msgid "Decimal number"
+msgstr "عدد دهدهی"
+
+#: contrib/admin/views/doc.py:300
+msgid "E-mail address"
+msgstr "آدرس ایمیل"
+
+#: contrib/admin/views/doc.py:301 contrib/admin/views/doc.py:302
+#: contrib/admin/views/doc.py:305
+msgid "File path"
+msgstr "مسیر فایل"
+
+#: contrib/admin/views/doc.py:303
+msgid "Floating point number"
+msgstr "عدد اعشاری"
+
+#: contrib/admin/views/doc.py:307 contrib/comments/models.py:89
+msgid "IP address"
+msgstr "آدرس IP"
+
+#: contrib/admin/views/doc.py:309
+msgid "Boolean (Either True, False or None)"
+msgstr "‌Boolean (درست، نادرست یا پوچ)"
+
+#: contrib/admin/views/doc.py:310
+msgid "Relation to parent model"
+msgstr ""
+
+#: contrib/admin/views/doc.py:311
+msgid "Phone number"
+msgstr "شماره تلفن"
+
+#: contrib/admin/views/doc.py:316
+msgid "Text"
+msgstr "متن"
+
+#: contrib/admin/views/doc.py:317
+msgid "Time"
+msgstr "زمان"
+
+#: contrib/admin/views/doc.py:318 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "آدرس اینترنت"
+
+#: contrib/admin/views/doc.py:319
+msgid "U.S. state (two uppercase letters)"
+msgstr "ایالت آمریکا(دو حرف بزرگ)"
+
+#: contrib/admin/views/doc.py:320
+msgid "XML text"
+msgstr "متن XML"
+
+#: contrib/admin/views/doc.py:346
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "به نظر نمی رسد %s یک شیء از نوع urlpattern باشد"
+
+#: contrib/admin/views/main.py:233
+msgid "Site administration"
+msgstr "مدیریت سایت"
+
+#: contrib/admin/views/main.py:280 contrib/admin/views/main.py:365
+#, python-format
+msgid "You may add another %s below."
+msgstr "شما می توانید یک %s دیگر در زیر اضافه کنید"
+
+#: contrib/admin/views/main.py:298
+#, python-format
+msgid "Add %s"
+msgstr "اضافه کردن %s"
+
+#: contrib/admin/views/main.py:344
+#, python-format
+msgid "Added %s."
+msgstr "%s اضافه شده"
+
+#: contrib/admin/views/main.py:344 contrib/admin/views/main.py:346
+#: contrib/admin/views/main.py:348 core/validators.py:283
+#: db/models/manipulators.py:309
+msgid "and"
+msgstr "و"
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "Changed %s."
+msgstr "%s تغییر یافته."
+
+#: contrib/admin/views/main.py:348
+#, python-format
+msgid "Deleted %s."
+msgstr "%s حذف شده."
+
+#: contrib/admin/views/main.py:351
+msgid "No fields changed."
+msgstr "فیلدی تغییر نیافته است."
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "مورد %(name)s·\"%(obj)s\" با موفقیت تغییر یافت."
+
+#: contrib/admin/views/main.py:362
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "مورد %(name)s·\"%(obj)s\" با موفقیت اضافه شد. شما می توانید در زیر آنرا ویرایش نمایید."
+
+#: contrib/admin/views/main.py:400
+#, python-format
+msgid "Change %s"
+msgstr "تغییر %s"
+
+#: contrib/admin/views/main.py:487
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr ""
+
+#: contrib/admin/views/main.py:492
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr ""
+
+#: contrib/admin/views/main.py:524
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr ""
+
+#: contrib/admin/views/main.py:527
+msgid "Are you sure?"
+msgstr "آیا مطمئن هستید؟"
+
+#: contrib/admin/views/main.py:549
+#, python-format
+msgid "Change history: %s"
+msgstr "تاریخچه تغییر: %s"
+
+#: contrib/admin/views/main.py:583
+#, python-format
+msgid "Select %s"
+msgstr "انتخاب %s"
+
+#: contrib/admin/views/main.py:583
+#, python-format
+msgid "Select %s to change"
+msgstr "%s را برای تغییر انتخاب کنید"
+
+#: contrib/admin/views/main.py:784
+msgid "Database error"
+msgstr "اشکال در بانک اطلاعاتی"
+
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr "دو فیلد گذرواژه با هم مطابقت ندارند."
+
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr "کاربری با این نام کاربری وجود دارد."
+
+#: contrib/auth/forms.py:53
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr "به نطر می رسد browser شما cookie ها را قبول نمی کند. برای ورود به سایت cookie fhdn فعال شده باشد."
+
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "این حساب غیرفعال است."
+
+#: contrib/auth/forms.py:84
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr "این ایمیل اکانتی در سیستم ندارد. آیا مطمئن هستید که عضو شده اید؟"
+
+#: contrib/auth/forms.py:107
+#, fuzzy, python-format
+msgid "Password reset on %s"
+msgstr "ایجاد گذرواژهٔ جدید"
+
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "دو فیلد «گذرواژهٔ جدید» با هم مطابقت ندارند."
+
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "گذرواژهٔ قدیمی شما اشتباه بود. لطفاً دوباره وارد کنید."
+
+#: contrib/auth/models.py:73 contrib/auth/models.py:93
+msgid "name"
+msgstr "نام"
+
+#: contrib/auth/models.py:75
+msgid "codename"
+msgstr "نام کد"
+
+#: contrib/auth/models.py:78
+msgid "permission"
+msgstr "اجازه"
+
+#: contrib/auth/models.py:79 contrib/auth/models.py:94
+msgid "permissions"
+msgstr "اجازه‌ها"
+
+#: contrib/auth/models.py:97
+msgid "group"
+msgstr "گروه"
+
+#: contrib/auth/models.py:98 contrib/auth/models.py:141
+msgid "groups"
+msgstr "گروه‌ها"
+
+#: contrib/auth/models.py:131
+msgid "username"
+msgstr "نام کاربری"
+
+#: contrib/auth/models.py:131
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr "الزامی. ۳۰ حرف یا کمتر. فقط حروف الفبا (شماره، الفبا و خط زیر)."
+
+#: contrib/auth/models.py:132
+msgid "first name"
+msgstr "نام"
+
+#: contrib/auth/models.py:133
+msgid "last name"
+msgstr "نام خانوادگی"
+
+#: contrib/auth/models.py:134
+msgid "e-mail address"
+msgstr "آدرس پست الکترونیکی"
+
+#: contrib/auth/models.py:135
+msgid "password"
+msgstr "گذرواژه"
+
+#: contrib/auth/models.py:135
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+
+#: contrib/auth/models.py:136
+msgid "staff status"
+msgstr "کارمند"
+
+#: contrib/auth/models.py:136
+msgid "Designates whether the user can log into this admin site."
+msgstr "تعبیه شده برای اینکه در سایت مدیریت، کاربر بتواند یا نتواند وارد شود."
+
+#: contrib/auth/models.py:137
+msgid "active"
+msgstr "فعال"
+
+#: contrib/auth/models.py:137
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr "تعبیه شده برای اینکه کاربر بتواند به سایت مدیریت وارد شود یا خیر. (به جای حذف کاربر آنرا تیک بزنید)."
+
+#: contrib/auth/models.py:138
+msgid "superuser status"
+msgstr "ابرکاربر"
+
+#: contrib/auth/models.py:138
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr "تعبیه شده برای اینکه کاربر دسترسی نامحدود به کلیه بخشهای سایت مدیریت داشته باشد یا خیر."
+
+#: contrib/auth/models.py:139
+msgid "last login"
+msgstr "آخرین ورود"
+
+#: contrib/auth/models.py:140
+msgid "date joined"
+msgstr "تاریخ پیوستن"
+
+#: contrib/auth/models.py:142
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr "علاوه بر دسترسی هایی که به طور دستی تنظیم شده، این کاربر تمامی دسترسی هایی که توسط گروه عضو شده به او می رسد را خواهد داشت."
+
+#: contrib/auth/models.py:143
+msgid "user permissions"
+msgstr "اجازه‌های کاربر"
+
+#: contrib/auth/models.py:147
+msgid "user"
+msgstr "کاربر"
+
+#: contrib/auth/models.py:148
+msgid "users"
+msgstr "کاربرها"
+
+#: contrib/auth/models.py:154
+msgid "Personal info"
+msgstr "اطلاعات شخصی"
+
+#: contrib/auth/models.py:155
+msgid "Permissions"
+msgstr "اجازه‌ها"
+
+#: contrib/auth/models.py:156
+msgid "Important dates"
+msgstr "تاریخ‌های مهم"
+
+#: contrib/auth/models.py:157
+msgid "Groups"
+msgstr "گروه‌ها"
+
+#: contrib/auth/models.py:316
+msgid "message"
+msgstr "پیغام"
+
+#: contrib/auth/views.py:47
+msgid "Logged out"
+msgstr "خارج شد"
+
+#: contrib/comments/models.py:71 contrib/comments/models.py:176
+msgid "object ID"
+msgstr "مشخصه شیء"
+
+#: contrib/comments/models.py:72
+msgid "headline"
+msgstr ""
+
+#: contrib/comments/models.py:73 contrib/comments/models.py:95
+#: contrib/comments/models.py:177
+msgid "comment"
+msgstr "نظر"
+
+#: contrib/comments/models.py:74
+msgid "rating #1"
+msgstr "امتیاز #1"
+
+#: contrib/comments/models.py:75
+msgid "rating #2"
+msgstr "امتیاز #2"
+
+#: contrib/comments/models.py:76
+msgid "rating #3"
+msgstr "امتیاز #3"
+
+#: contrib/comments/models.py:77
+msgid "rating #4"
+msgstr "امتیاز #4"
+
+#: contrib/comments/models.py:78
+msgid "rating #5"
+msgstr "امتیاز $5"
+
+#: contrib/comments/models.py:79
+msgid "rating #6"
+msgstr "امتیاز #6"
+
+#: contrib/comments/models.py:80
+msgid "rating #7"
+msgstr "امتیاز #7"
+
+#: contrib/comments/models.py:81
+msgid "rating #8"
+msgstr "امتیاز #8"
+
+#: contrib/comments/models.py:86
+msgid "is valid rating"
+msgstr "آیا رتبه بندی قابل قبول است"
+
+#: contrib/comments/models.py:87 contrib/comments/models.py:179
+msgid "date/time submitted"
+msgstr "تاریخ/زمان ثبت شد"
+
+#: contrib/comments/models.py:88 contrib/comments/models.py:180
+msgid "is public"
+msgstr "عمومی است"
+
+#: contrib/comments/models.py:90
+msgid "is removed"
+msgstr "پاک شده است"
+
+#: contrib/comments/models.py:90
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+
+#: contrib/comments/models.py:96
+msgid "comments"
+msgstr "نظرها"
+
+#: contrib/comments/models.py:140 contrib/comments/models.py:222
+msgid "Content object"
+msgstr "شئ نظر"
+
+#: contrib/comments/models.py:168
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr "نظر داده شده توسط %(user)s در تاریخ %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:178
+msgid "person's name"
+msgstr "نام شخص"
+
+#: contrib/comments/models.py:181
+msgid "ip address"
+msgstr "آدرس ip"
+
+#: contrib/comments/models.py:183
+msgid "approved by staff"
+msgstr ""
+
+#: contrib/comments/models.py:187
+msgid "free comment"
+msgstr "نظر آزاد"
+
+#: contrib/comments/models.py:188
+msgid "free comments"
+msgstr "نظرهای آزاد"
+
+#: contrib/comments/models.py:250
+msgid "score"
+msgstr "امتیاز"
+
+#: contrib/comments/models.py:251
+msgid "score date"
+msgstr "تاریخ امتیاز"
+
+#: contrib/comments/models.py:255
+msgid "karma score"
+msgstr "امتیاز عملکرد"
+
+#: contrib/comments/models.py:256
+msgid "karma scores"
+msgstr "امتیازهای عملکرد"
+
+#: contrib/comments/models.py:260
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d رتبه توسط %(user)s"
+
+#: contrib/comments/models.py:277
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+
+#: contrib/comments/models.py:285
+msgid "flag date"
+msgstr "تاریخ پرچم"
+
+#: contrib/comments/models.py:289
+msgid "user flag"
+msgstr "پرچم کاربر"
+
+#: contrib/comments/models.py:290
+msgid "user flags"
+msgstr "پرچم‌های کاربر"
+
+#: contrib/comments/models.py:294
+#, python-format
+msgid "Flag by %r"
+msgstr "پرچم توسط %r"
+
+#: contrib/comments/models.py:300
+msgid "deletion date"
+msgstr "تاریخ حذف"
+
+#: contrib/comments/models.py:303
+msgid "moderator deletion"
+msgstr "حذف مدیر"
+
+#: contrib/comments/models.py:304
+msgid "moderator deletions"
+msgstr "حذف های مدیر"
+
+#: contrib/comments/models.py:308
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "گذرواژه‌تان را فراموش کرده‌اید؟"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "لازم"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "اختیاری"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "ارسال عکس"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "نظر:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "پیش‌نمایش نظر"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "نام شما:"
+
+#: contrib/comments/views/comments.py:28
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr ""
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr ""
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+
+#: contrib/comments/views/comments.py:190
+#: contrib/comments/views/comments.py:283
+msgid "Only POSTs are allowed"
+msgstr ""
+
+#: contrib/comments/views/comments.py:194
+#: contrib/comments/views/comments.py:287
+msgid "One or more of the required fields wasn't submitted"
+msgstr ""
+
+#: contrib/comments/views/comments.py:198
+#: contrib/comments/views/comments.py:289
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr ""
+
+#: contrib/comments/views/comments.py:208
+#: contrib/comments/views/comments.py:295
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+
+#: contrib/comments/views/comments.py:259
+#: contrib/comments/views/comments.py:324
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr ""
+
+#: contrib/comments/views/karma.py:21
+msgid "Anonymous users cannot vote"
+msgstr ""
+
+#: contrib/comments/views/karma.py:25
+msgid "Invalid comment ID"
+msgstr ""
+
+#: contrib/comments/views/karma.py:27
+msgid "No voting for yourself"
+msgstr ""
+
+#: contrib/contenttypes/models.py:37
+msgid "python model class name"
+msgstr ""
+
+#: contrib/contenttypes/models.py:40
+msgid "content type"
+msgstr "نوع محتوا"
+
+#: contrib/contenttypes/models.py:41
+msgid "content types"
+msgstr "نوع‌های محتوا"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "تیتر"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "محتوا"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr ""
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "نام قالب"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "عضویت اجباریست"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "اگر این انتخاب شود، فقط کاربران وارد شده می توانند این صفحه را مشاهده نمایند."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "صفحه تخت"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "صفحات تخت"
+
+#: contrib/humanize/templatetags/humanize.py:20
+msgid "th"
+msgstr "اُم"
+
+#: contrib/humanize/templatetags/humanize.py:20
+msgid "st"
+msgstr "اُم"
+
+#: contrib/humanize/templatetags/humanize.py:20
+msgid "nd"
+msgstr "اُم"
+
+#: contrib/humanize/templatetags/humanize.py:20
+msgid "rd"
+msgstr "اُم"
+
+#: contrib/humanize/templatetags/humanize.py:52
+#, python-format
+msgid "%(value).1f million"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:55
+#, python-format
+msgid "%(value).1f billion"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:58
+#, python-format
+msgid "%(value).1f trillion"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "one"
+msgstr "یک"
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "two"
+msgstr "دو"
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "three"
+msgstr "سه"
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "four"
+msgstr "چهار"
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "five"
+msgstr "پنج"
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "six"
+msgstr "شش"
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "seven"
+msgstr "هفت"
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "eight"
+msgstr "هشت"
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "nine"
+msgstr "نُه"
+
+#: contrib/humanize/templatetags/humanize.py:94
+#, fuzzy
+msgid "today"
+msgstr "امروز"
+
+#: contrib/humanize/templatetags/humanize.py:96
+msgid "tomorrow"
+msgstr "فردا"
+
+#: contrib/humanize/templatetags/humanize.py:98
+msgid "yesterday"
+msgstr "دیروز"
+
+#: contrib/localflavor/ar/forms.py:28
+msgid "Enter a postal code in the format NNNN or ANNNNAAA."
+msgstr "کد پستی را به شکل NNNN یا ANNNNAAA وارد نمایید."
+
+#: contrib/localflavor/ar/forms.py:50 contrib/localflavor/br/forms.py:96
+#: contrib/localflavor/br/forms.py:135 contrib/localflavor/pe/forms.py:23
+#: contrib/localflavor/pe/forms.py:51
+msgid "This field requires only numbers."
+msgstr "در این فیلد فقط عدد می توانید وارد کنید."
+
+#: contrib/localflavor/ar/forms.py:51
+msgid "This field requires 7 or 8 digits."
+msgstr "این فیلد ۷ یا ۸ شماره لازم دارد."
+
+#: contrib/localflavor/ar/forms.py:80
+msgid "Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format."
+msgstr ""
+
+#: contrib/localflavor/ar/forms.py:81
+msgid "Invalid CUIT."
+msgstr ""
+
+#: contrib/localflavor/au/forms.py:16
+msgid "Enter a 4 digit post code."
+msgstr "کد پستی ۴ رقمی را وارد کنید."
+
+#: contrib/localflavor/br/forms.py:21
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "کد پستی را به شکل XXXXX-XXX وارد کنید."
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "شماره تلفنها باید به شکل XX-XXXX-XXXX باشند."
+
+#: contrib/localflavor/br/forms.py:58
+msgid ""
+"Select a valid brazilian state. That state is not one of the available "
+"states."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:94
+msgid "Invalid CPF number."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:95
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr "طول این فیلد حداقل ۱۱ شماره و حداکثر ۱۴ حرف می باشد."
+
+#: contrib/localflavor/br/forms.py:134
+msgid "Invalid CNPJ number."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:136
+msgid "This field requires at least 14 digits"
+msgstr "فیلد حداقل باید ۱۴ شماره باشد"
+
+#: contrib/localflavor/ca/forms.py:17
+msgid "Enter a postal code in the format XXX XXX."
+msgstr "کد پستس را به شکل XXX·XXX. وارد کنید."
+
+#: contrib/localflavor/ca/forms.py:88
+msgid "Enter a valid Canadian Social Insurance number in XXX-XXX-XXX format."
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr ""
+
+#: contrib/localflavor/ch/forms.py:16 contrib/localflavor/no/forms.py:12
+msgid "Enter a zip code in the format XXXX."
+msgstr "کد پستی صحیح را به شکل XXXX وارد کنید."
+
+#: contrib/localflavor/ch/forms.py:64
+msgid ""
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
+msgstr ""
+
+#: contrib/localflavor/cl/forms.py:29
+msgid "Enter a valid Chilean RUT."
+msgstr ""
+
+#: contrib/localflavor/cl/forms.py:30
+msgid "Enter a valid Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr ""
+
+#: contrib/localflavor/cl/forms.py:31
+msgid "The Chilean RUT is not valid."
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr ""
+
+#: contrib/localflavor/de/forms.py:14 contrib/localflavor/fi/forms.py:12
+#: contrib/localflavor/fr/forms.py:15
+msgid "Enter a zip code in the format XXXXX."
+msgstr "کد پستی را به شکل XXXXX وارد کنید."
+
+#: contrib/localflavor/de/forms.py:41
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:5
+msgid "Arava"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:6
+msgid "Albacete"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:7
+msgid "Alacant"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:8
+msgid "Almeria"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:9
+#, fuzzy
+msgid "Avila"
+msgstr "آوریل"
+
+#: contrib/localflavor/es/es_provinces.py:10
+msgid "Badajoz"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:11
+msgid "Illes Balears"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:12
+msgid "Barcelona"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:13
+msgid "Burgos"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:14
+msgid "Caceres"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:15
+msgid "Cadiz"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:16
+msgid "Castello"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:17
+msgid "Ciudad Real"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:18
+msgid "Cordoba"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:19
+msgid "A Coruna"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:20
+msgid "Cuenca"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:21
+msgid "Girona"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:22
+msgid "Granada"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:23
+msgid "Guadalajara"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:24
+msgid "Guipuzkoa"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:25
+msgid "Huelva"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:26
+msgid "Huesca"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:27
+#, fuzzy
+msgid "Jaen"
+msgstr "ژانویه"
+
+#: contrib/localflavor/es/es_provinces.py:28
+msgid "Leon"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:29
+msgid "Lleida"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:30
+#: contrib/localflavor/es/es_regions.py:17
+msgid "La Rioja"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:31
+msgid "Lugo"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:32
+#: contrib/localflavor/es/es_regions.py:18
+msgid "Madrid"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:33
+msgid "Malaga"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:34
+msgid "Murcia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:35
+msgid "Navarre"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:36
+msgid "Ourense"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:37
+msgid "Asturias"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:38
+msgid "Palencia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:39
+msgid "Las Palmas"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:40
+msgid "Pontevedra"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:41
+msgid "Salamanca"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:42
+msgid "Santa Cruz de Tenerife"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:43
+#: contrib/localflavor/es/es_regions.py:11
+msgid "Cantabria"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:44
+msgid "Segovia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:45
+msgid "Seville"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:46
+msgid "Soria"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:47
+msgid "Tarragona"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:48
+msgid "Teruel"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:49
+msgid "Toledo"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:50
+msgid "Valencia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:51
+msgid "Valladolid"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:52
+msgid "Bizkaia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:53
+msgid "Zamora"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:54
+msgid "Zaragoza"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:55
+msgid "Ceuta"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:56
+msgid "Melilla"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:5
+msgid "Andalusia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:6
+msgid "Aragon"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:7
+msgid "Principality of Asturias"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:8
+msgid "Balearic Islands"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:9
+msgid "Basque Country"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:10
+msgid "Canary Islands"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:12
+msgid "Castile-La Mancha"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:13
+msgid "Castile and Leon"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:14
+msgid "Catalonia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:15
+msgid "Extremadura"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:16
+msgid "Galicia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:19
+msgid "Region of Murcia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:20
+msgid "Foral Community of Navarre"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:21
+msgid "Valencian Community"
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:19
+msgid "Enter a valid postal code in the range and format 01XXX - 52XXX."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:39
+msgid ""
+"Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or "
+"9XXXXXXXX."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:66
+msgid "Please enter a valid NIF, NIE, or CIF."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:67
+msgid "Please enter a valid NIF or NIE."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:68
+msgid "Invalid checksum for NIF."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:69
+msgid "Invalid checksum for NIE."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:70
+msgid "Invalid checksum for CIF."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:142
+msgid ""
+"Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:143
+msgid "Invalid checksum for bank account number."
+msgstr ""
+
+#: contrib/localflavor/fi/forms.py:28
+msgid "Enter a valid Finnish social security number."
+msgstr ""
+
+#: contrib/localflavor/in_/forms.py:14
+msgid "Enter a zip code in the format XXXXXXX."
+msgstr ""
+
+#: contrib/localflavor/is_/forms.py:17
+msgid ""
+"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr ""
+
+#: contrib/localflavor/is_/forms.py:18
+msgid "The Icelandic identification number is not valid."
+msgstr ""
+
+#: contrib/localflavor/it/forms.py:14
+msgid "Enter a valid zip code."
+msgstr ""
+
+#: contrib/localflavor/it/forms.py:43
+msgid "Enter a valid Social Security number."
+msgstr ""
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr ""
+
+#: contrib/localflavor/jp/forms.py:19
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:12
+msgid "Aguascalientes"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:13
+msgid "Baja California"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:14
+msgid "Baja California Sur"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:15
+msgid "Campeche"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:16
+msgid "Chihuahua"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:17
+msgid "Chiapas"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:18
+msgid "Coahuila"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:19
+msgid "Colima"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:20
+msgid "Distrito Federal"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:21
+msgid "Durango"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:22
+#, fuzzy
+msgid "Guerrero"
+msgstr "خطای کارگزار"
+
+#: contrib/localflavor/mx/mx_states.py:23
+msgid "Guanajuato"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:24
+msgid "Hidalgo"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:25
+msgid "Jalisco"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:26
+msgid "Estado de México"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:27
+msgid "Michoacán"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:28
+msgid "Morelos"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:29
+msgid "Nayarit"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:30
+msgid "Nuevo León"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:31
+msgid "Oaxaca"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:32
+msgid "Puebla"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:33
+msgid "Querétaro"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:34
+msgid "Quintana Roo"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:35
+msgid "Sinaloa"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:36
+msgid "San Luis Potosí"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:37
+msgid "Sonora"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:38
+msgid "Tabasco"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:39
+msgid "Tamaulipas"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:40
+msgid "Tlaxcala"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:41
+msgid "Veracruz"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:42
+msgid "Yucatán"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:43
+msgid "Zacatecas"
+msgstr ""
+
+#: contrib/localflavor/nl/forms.py:21
+msgid "Enter a valid postal code"
+msgstr ""
+
+#: contrib/localflavor/nl/forms.py:52
+msgid "Enter a valid phone number"
+msgstr "شماره تلفن را به طور صحیح وارد نمایید."
+
+#: contrib/localflavor/nl/forms.py:78
+msgid "Enter a valid SoFi number"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:4
+msgid "Drente"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:5
+msgid "Flevoland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:6
+msgid "Friesland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:7
+msgid "Gelderland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:8
+#, fuzzy
+msgid "Groningen"
+msgstr "نُه"
+
+#: contrib/localflavor/nl/nl_provinces.py:9
+msgid "Limburg"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:10
+msgid "Noord-Brabant"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:11
+msgid "Noord-Holland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:12
+msgid "Overijssel"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:13
+msgid "Utrecht"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:14
+msgid "Zeeland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:15
+msgid "Zuid-Holland"
+msgstr ""
+
+#: contrib/localflavor/no/forms.py:33
+msgid "Enter a valid Norwegian social security number."
+msgstr ""
+
+#: contrib/localflavor/pe/forms.py:24
+msgid "This field requires 8 digits."
+msgstr "این فیلد، ۸ رقم لازم دارد."
+
+#: contrib/localflavor/pe/forms.py:52
+msgid "This field requires 11 digits."
+msgstr "این فیلد ۱۱ رقم لازم دارد."
+
+#: contrib/localflavor/pl/forms.py:39
+msgid "National Identification Number consists of 11 digits."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:40
+msgid "Wrong checksum for the National Identification Number."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:72
+msgid ""
+"Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:73
+msgid "Wrong checksum for the Tax Number (NIP)."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:112
+msgid "National Business Register Number (REGON) consists of 7 or 9 digits."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:113
+msgid "Wrong checksum for the National Business Register Number (REGON)."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:156
+msgid "Enter a postal code in the format XX-XXX."
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:8
+msgid "Lower Silesia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:9
+msgid "Kuyavia-Pomerania"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:10
+msgid "Lublin"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:11
+msgid "Lubusz"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:12
+msgid "Lodz"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:13
+msgid "Lesser Poland"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:14
+msgid "Masovia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:15
+#, fuzzy
+msgid "Opole"
+msgstr "اختیاری"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:16
+msgid "Subcarpatia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:17
+msgid "Podlasie"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:18
+msgid "Pomerania"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:19
+msgid "Silesia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:20
+msgid "Swietokrzyskie"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:21
+msgid "Warmia-Masuria"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:22
+msgid "Greater Poland"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:23
+msgid "West Pomerania"
+msgstr ""
+
+#: contrib/localflavor/sk/forms.py:30
+msgid "Enter a postal code in the format XXXXX or XXX XX."
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:8
+msgid "Banska Bystrica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:9
+msgid "Banska Stiavnica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:10
+msgid "Bardejov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:11
+msgid "Banovce nad Bebravou"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:12
+msgid "Brezno"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:13
+msgid "Bratislava I"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:14
+msgid "Bratislava II"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:15
+msgid "Bratislava III"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:16
+msgid "Bratislava IV"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:17
+msgid "Bratislava V"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:18
+msgid "Bytca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:19
+msgid "Cadca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:20
+msgid "Detva"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:21
+msgid "Dolny Kubin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:22
+msgid "Dunajska Streda"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:23
+msgid "Galanta"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:24
+msgid "Gelnica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:25
+msgid "Hlohovec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:26
+msgid "Humenne"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:27
+msgid "Ilava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:28
+msgid "Kezmarok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:29
+#, fuzzy
+msgid "Komarno"
+msgstr "مارس"
+
+#: contrib/localflavor/sk/sk_districts.py:30
+msgid "Kosice I"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:31
+msgid "Kosice II"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:32
+msgid "Kosice III"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:33
+msgid "Kosice IV"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:34
+msgid "Kosice - okolie"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:35
+msgid "Krupina"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:36
+msgid "Kysucke Nove Mesto"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:37
+msgid "Levice"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:38
+msgid "Levoca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:39
+msgid "Liptovsky Mikulas"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:40
+msgid "Lucenec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:41
+#, fuzzy
+msgid "Malacky"
+msgstr "مه"
+
+#: contrib/localflavor/sk/sk_districts.py:42
+msgid "Martin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:43
+msgid "Medzilaborce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:44
+msgid "Michalovce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:45
+msgid "Myjava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:46
+msgid "Namestovo"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:47
+msgid "Nitra"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:48
+msgid "Nove Mesto nad Vahom"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:49
+msgid "Nove Zamky"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:50
+msgid "Partizanske"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:51
+msgid "Pezinok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:52
+msgid "Piestany"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:53
+msgid "Poltar"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:54
+msgid "Poprad"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:55
+msgid "Povazska Bystrica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:56
+msgid "Presov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:57
+msgid "Prievidza"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:58
+msgid "Puchov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:59
+msgid "Revuca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:60
+msgid "Rimavska Sobota"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:61
+msgid "Roznava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:62
+msgid "Ruzomberok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:63
+#, fuzzy
+msgid "Sabinov"
+msgstr "نوامبر"
+
+#: contrib/localflavor/sk/sk_districts.py:64
+msgid "Senec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:65
+msgid "Senica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:66
+msgid "Skalica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:67
+#, fuzzy
+msgid "Snina"
+msgstr "نُه"
+
+#: contrib/localflavor/sk/sk_districts.py:68
+msgid "Sobrance"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:69
+msgid "Spisska Nova Ves"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:70
+msgid "Stara Lubovna"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:71
+msgid "Stropkov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:72
+msgid "Svidnik"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:73
+msgid "Sala"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:74
+msgid "Topolcany"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:75
+msgid "Trebisov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:76
+msgid "Trencin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:77
+msgid "Trnava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:78
+msgid "Turcianske Teplice"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:79
+msgid "Tvrdosin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:80
+msgid "Velky Krtis"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:81
+msgid "Vranov nad Toplou"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:82
+msgid "Zlate Moravce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:83
+msgid "Zvolen"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:84
+msgid "Zarnovica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:85
+msgid "Ziar nad Hronom"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:86
+msgid "Zilina"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:8
+msgid "Banska Bystrica region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:9
+msgid "Bratislava region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:10
+msgid "Kosice region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:11
+msgid "Nitra region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:12
+msgid "Presov region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:13
+msgid "Trencin region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:14
+msgid "Trnava region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:15
+msgid "Zilina region"
+msgstr ""
+
+#: contrib/localflavor/uk/forms.py:21
+msgid "Enter a valid postcode."
+msgstr "کد پستی را به طور صحیح وارد نمایید."
+
+#: contrib/localflavor/uk/uk_regions.py:11
+msgid "Bedfordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:12
+msgid "Buckinghamshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:14
+msgid "Cheshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:15
+msgid "Cornwall and Isles of Scilly"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:16
+msgid "Cumbria"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:17
+msgid "Derbyshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:18
+#, fuzzy
+msgid "Devon"
+msgstr "هفت"
+
+#: contrib/localflavor/uk/uk_regions.py:19
+msgid "Dorset"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:20
+msgid "Durham"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:21
+msgid "East Sussex"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:22
+msgid "Essex"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:23
+msgid "Gloucestershire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:24
+msgid "Greater London"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:25
+msgid "Greater Manchester"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:26
+msgid "Hampshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:27
+msgid "Hertfordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:28
+msgid "Kent"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:29
+msgid "Lancashire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:30
+msgid "Leicestershire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:31
+msgid "Lincolnshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:32
+msgid "Merseyside"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:33
+msgid "Norfolk"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:34
+msgid "North Yorkshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:35
+msgid "Northamptonshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:36
+msgid "Northumberland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:37
+msgid "Nottinghamshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:38
+msgid "Oxfordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:39
+msgid "Shropshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:40
+msgid "Somerset"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:41
+msgid "South Yorkshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:42
+msgid "Staffordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:43
+msgid "Suffolk"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:44
+msgid "Surrey"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:45
+msgid "Tyne and Wear"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:46
+msgid "Warwickshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:47
+msgid "West Midlands"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:48
+msgid "West Sussex"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:49
+msgid "West Yorkshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:50
+msgid "Wiltshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:51
+msgid "Worcestershire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:55
+msgid "County Antrim"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:56
+msgid "County Armagh"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:57
+#: contrib/localflavor/uk/uk_regions.py:58
+msgid "County Down"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:59
+msgid "County Londonderry"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:60
+msgid "County Tyrone"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:64
+msgid "Clwyd"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:65
+msgid "Dyfed"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:66
+msgid "Gwent"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:67
+msgid "Gwynedd"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:68
+msgid "Mid Glamorgan"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:69
+msgid "Powys"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:70
+msgid "South Glamorgan"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:71
+msgid "West Glamorgan"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:75
+msgid "Borders"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:76
+msgid "Central Scotland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:77
+msgid "Dumfries and Galloway"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:78
+#, fuzzy
+msgid "Fife"
+msgstr "فیلتر"
+
+#: contrib/localflavor/uk/uk_regions.py:79
+msgid "Grampian"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:80
+msgid "Highland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:81
+msgid "Lothian"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:82
+msgid "Orkney Islands"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:83
+msgid "Shetland Islands"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:84
+msgid "Strathclyde"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:85
+msgid "Tayside"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:86
+msgid "Western Isles"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:90
+msgid "England"
+msgstr "انگلستان"
+
+#: contrib/localflavor/uk/uk_regions.py:91
+msgid "Northern Ireland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:92
+msgid "Scotland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:93
+msgid "Wales"
+msgstr ""
+
+#: contrib/localflavor/us/forms.py:16
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr ""
+
+#: contrib/localflavor/us/forms.py:54
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr ""
+
+#: contrib/localflavor/za/forms.py:20
+msgid "Enter a valid South African ID number"
+msgstr ""
+
+#: contrib/localflavor/za/forms.py:54
+msgid "Enter a valid South African postal code"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:4
+#, fuzzy
+msgid "Eastern Cape"
+msgstr "نام کاربری"
+
+#: contrib/localflavor/za/za_provinces.py:5
+#, fuzzy
+msgid "Free State"
+msgstr "تاریخ امتیاز"
+
+#: contrib/localflavor/za/za_provinces.py:6
+#, fuzzy
+msgid "Gauteng"
+msgstr "اوت"
+
+#: contrib/localflavor/za/za_provinces.py:7
+msgid "KwaZulu-Natal"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:8
+msgid "Limpopo"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:9
+msgid "Mpumalanga"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:10
+msgid "Northern Cape"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:11
+msgid "North West"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:12
+#, fuzzy
+msgid "Western Cape"
+msgstr "نام کاربری"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr ""
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr ""
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr ""
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr ""
+
+#: contrib/sessions/models.py:46
+msgid "session key"
+msgstr ""
+
+#: contrib/sessions/models.py:47
+msgid "session data"
+msgstr "اطلاعات نشست"
+
+#: contrib/sessions/models.py:48
+msgid "expire date"
+msgstr "تاریخ انقضاء"
+
+#: contrib/sessions/models.py:53
+msgid "session"
+msgstr "نشست"
+
+#: contrib/sessions/models.py:54
+msgid "sessions"
+msgstr "نشست‌ها"
+
+#: contrib/sites/models.py:32
+msgid "domain name"
+msgstr ""
+
+#: contrib/sites/models.py:33
+msgid "display name"
+msgstr "نام نمایش داده شده"
+
+#: contrib/sites/models.py:37
+msgid "site"
+msgstr ""
+
+#: contrib/sites/models.py:38
+msgid "sites"
+msgstr ""
+
+#: core/validators.py:72
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "این مقدار فقط باید حاوی کلمات، شماره ها و یا خط زیر باشد."
+
+#: core/validators.py:76
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+
+#: core/validators.py:80
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr ""
+
+#: core/validators.py:84
+msgid "Uppercase letters are not allowed here."
+msgstr "حروف بزرگ در اینجا مجاز نمی باشند."
+
+#: core/validators.py:88
+msgid "Lowercase letters are not allowed here."
+msgstr ""
+
+#: core/validators.py:95
+msgid "Enter only digits separated by commas."
+msgstr ""
+
+#: core/validators.py:107
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "یک آدرس ایمیل صحیح وارد کنید."
+
+#: core/validators.py:111
+msgid "Please enter a valid IP address."
+msgstr ""
+
+#: core/validators.py:115
+msgid "Empty values are not allowed here."
+msgstr ""
+
+#: core/validators.py:119
+msgid "Non-numeric characters aren't allowed here."
+msgstr ""
+
+#: core/validators.py:123
+msgid "This value can't be comprised solely of digits."
+msgstr "این مقدار عدد یا ترکیبی از آن نیست."
+
+#: core/validators.py:128 newforms/fields.py:151
+msgid "Enter a whole number."
+msgstr ""
+
+#: core/validators.py:132
+msgid "Only alphabetical characters are allowed here."
+msgstr ""
+
+#: core/validators.py:147
+msgid "Year must be 1900 or later."
+msgstr ""
+
+#: core/validators.py:151
+#, python-format
+msgid "Invalid date: %s"
+msgstr ""
+
+#: core/validators.py:156 db/models/fields/__init__.py:509
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr ""
+
+#: core/validators.py:161
+msgid "Enter a valid time in HH:MM format."
+msgstr ""
+
+#: core/validators.py:165 db/models/fields/__init__.py:583
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr ""
+
+#: core/validators.py:170 newforms/fields.py:402
+msgid "Enter a valid e-mail address."
+msgstr "آدرس ایمیل صحیح را وارد نمایید."
+
+#: core/validators.py:182 core/validators.py:474 newforms/fields.py:432
+#: oldforms/__init__.py:687
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+
+#: core/validators.py:193 newforms/fields.py:458
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+
+#: core/validators.py:200
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr ""
+
+#: core/validators.py:204
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+
+#: core/validators.py:212
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr ""
+
+#: core/validators.py:216
+msgid "A valid URL is required."
+msgstr ""
+
+#: core/validators.py:230
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+
+#: core/validators.py:237
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr ""
+
+#: core/validators.py:254
+#, python-format
+msgid "Invalid URL: %s"
+msgstr ""
+
+#: core/validators.py:259 core/validators.py:261
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "آدرس %s لینک شکسته است."
+
+#: core/validators.py:267
+msgid "Enter a valid U.S. state abbreviation."
+msgstr ""
+
+#: core/validators.py:281
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgstr ""
+
+#: core/validators.py:288
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "این فیلد باید با فیلد %s مطابقت داشته باشد."
+
+#: core/validators.py:307
+msgid "Please enter something for at least one field."
+msgstr "لطفا چیزی را وارد کنید حداقل برای یک فیلد."
+
+#: core/validators.py:316 core/validators.py:327
+msgid "Please enter both fields or leave them both empty."
+msgstr "لطفا هر دو فیلد را پر کنید یا هر دو را خالی بگذارید."
+
+#: core/validators.py:335
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr ""
+
+#: core/validators.py:348
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "این فیلد باید پر شود اگر %(field)s با %(value)s برابر نباشد."
+
+#: core/validators.py:367
+msgid "Duplicate values are not allowed."
+msgstr ""
+
+#: core/validators.py:382
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "این مقدار باید بین %(lower)s و %(upper)s باشد."
+
+#: core/validators.py:384
+#, python-format
+msgid "This value must be at least %s."
+msgstr "این مقدار حداقل باید %s باشد."
+
+#: core/validators.py:386
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "این مقدار نباید بیشتر از %s باشد."
+
+#: core/validators.py:427
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "این مقدار باید توانی از %s باشد."
+
+#: core/validators.py:437
+msgid "Please enter a valid decimal number."
+msgstr "لطفا یک عدد صحیح وارد کنید."
+
+#: core/validators.py:444
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+"Please enter a valid decimal number with at most %s total digits."
+msgstr ""
+
+#: core/validators.py:447
+#, python-format
+msgid ""
+"Please enter a valid decimal number with a whole part of at most %s digit."
+"Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr ""
+
+#: core/validators.py:450
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr ""
+
+#: core/validators.py:458
+msgid "Please enter a valid floating point number."
+msgstr "لطفا یک عدد اعشاری صحیح وارد کنید."
+
+#: core/validators.py:467
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr ""
+
+#: core/validators.py:468
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr ""
+
+#: core/validators.py:485
+msgid "The format for this field is wrong."
+msgstr ""
+
+#: core/validators.py:500
+msgid "This field is invalid."
+msgstr "این فیلد صحیح نمی باشد."
+
+#: core/validators.py:536
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr ""
+
+#: core/validators.py:539
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+
+#: core/validators.py:572
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:576
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:581
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+
+#: core/validators.py:586
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+
+#: core/validators.py:590
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:595
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: db/models/manipulators.py:308
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr ""
+
+#: db/models/fields/__init__.py:52
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr ""
+
+#: db/models/fields/__init__.py:161 db/models/fields/__init__.py:318
+#: db/models/fields/__init__.py:735 db/models/fields/__init__.py:746
+#: newforms/fields.py:45 oldforms/__init__.py:374
+msgid "This field is required."
+msgstr "این فیلد لازم است."
+
+#: db/models/fields/__init__.py:418
+msgid "This value must be an integer."
+msgstr "این مقدار باید یک عدد صحیح باشد."
+
+#: db/models/fields/__init__.py:454
+msgid "This value must be either True or False."
+msgstr "این مقدار باید درست یا غلط باشد."
+
+#: db/models/fields/__init__.py:475
+msgid "This field cannot be null."
+msgstr "این فیلد نمی تواند پوچ باشد."
+
+#: db/models/fields/__init__.py:644
+msgid "This value must be a decimal number."
+msgstr "این مقدار باید یک عدد باشد."
+
+#: db/models/fields/__init__.py:755
+msgid "Enter a valid filename."
+msgstr ""
+
+#: db/models/fields/__init__.py:908
+msgid "This value must be either None, True or False."
+msgstr "این مقدار باید یکی از مقادیر None یا True یا False باشد."
+
+#: db/models/fields/related.py:55
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "لطفا %s صحیحی وارد نمایید."
+
+#: db/models/fields/related.py:658
+msgid "Separate multiple IDs with commas."
+msgstr ""
+
+#: db/models/fields/related.py:660
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+#: db/models/fields/related.py:707
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr ""
+
+#: newforms/fields.py:46
+msgid "Enter a valid value."
+msgstr "یک مقدار صحیح وارد کنید."
+
+#: newforms/fields.py:123
+#, python-format
+msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+msgstr ""
+
+#: newforms/fields.py:124
+#, python-format
+msgid "Ensure this value has at least %(min)d characters (it has %(length)d)."
+msgstr ""
+
+#: newforms/fields.py:152 newforms/fields.py:181 newforms/fields.py:210
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr ""
+
+#: newforms/fields.py:153 newforms/fields.py:182 newforms/fields.py:211
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr ""
+
+#: newforms/fields.py:180 newforms/fields.py:209
+msgid "Enter a number."
+msgstr "یک عدد وارد نمایید."
+
+#: newforms/fields.py:212
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr ""
+
+#: newforms/fields.py:213
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr ""
+
+#: newforms/fields.py:214
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr ""
+
+#: newforms/fields.py:262 newforms/fields.py:723
+msgid "Enter a valid date."
+msgstr "تاریخ را به شکل صحیح وارد نمایید."
+
+#: newforms/fields.py:295 newforms/fields.py:724
+msgid "Enter a valid time."
+msgstr "یک زمان صحیح وارد کنید."
+
+#: newforms/fields.py:334
+msgid "Enter a valid date/time."
+msgstr "تاریخ/زمان را به شکل صحیح وارد نمایید."
+
+#: newforms/fields.py:433
+msgid "No file was submitted."
+msgstr "فایلی ارسال نشده است."
+
+#: newforms/fields.py:434 oldforms/__init__.py:689
+msgid "The submitted file is empty."
+msgstr ""
+
+#: newforms/fields.py:496
+msgid "Enter a valid URL."
+msgstr ""
+
+#: newforms/fields.py:497
+msgid "This URL appears to be a broken link."
+msgstr "به نظر می رسد این آدرس یک پیوند شکسته است."
+
+#: newforms/fields.py:559 newforms/models.py:317
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr ""
+
+#: newforms/fields.py:598
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr ""
+
+#: newforms/fields.py:599 newforms/fields.py:661 newforms/models.py:377
+msgid "Enter a list of values."
+msgstr ""
+
+#: newforms/fields.py:752
+msgid "Enter a valid IPv4 address."
+msgstr ""
+
+#: newforms/models.py:378
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr ""
+
+#: oldforms/__init__.py:409
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgstr ""
+
+#: oldforms/__init__.py:414
+msgid "Line breaks are not allowed here."
+msgstr ""
+
+#: oldforms/__init__.py:512 oldforms/__init__.py:586 oldforms/__init__.py:625
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr ""
+
+#: oldforms/__init__.py:745
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr ""
+
+#: oldforms/__init__.py:755
+msgid "Enter a positive number."
+msgstr "یک عدد مثبت وارد نمایید."
+
+#: oldforms/__init__.py:765
+msgid "Enter a whole number between 0 and 32,767."
+msgstr ""
+
+#: template/defaultfilters.py:691
+msgid "yes,no,maybe"
+msgstr "بله،خیر،شاید"
+
+#: template/defaultfilters.py:722
+#, fuzzy, python-format
+msgid "%(size)d byte"
+msgstr "%(size)d یایت"
+
+#: template/defaultfilters.py:724
+#, python-format
+msgid "%.1f KB"
+msgstr ""
+
+#: template/defaultfilters.py:726
+#, python-format
+msgid "%.1f MB"
+msgstr ""
+
+#: template/defaultfilters.py:727
+#, python-format
+msgid "%.1f GB"
+msgstr ""
+
+#: utils/dateformat.py:41
+msgid "p.m."
+msgstr "ب.ظ."
+
+#: utils/dateformat.py:42
+msgid "a.m."
+msgstr "صبح"
+
+#: utils/dateformat.py:47
+msgid "PM"
+msgstr "بعد از ظهر"
+
+#: utils/dateformat.py:48
+msgid "AM"
+msgstr "صبح"
+
+#: utils/dateformat.py:97
+msgid "midnight"
+msgstr "نیمه شب"
+
+#: utils/dateformat.py:99
+msgid "noon"
+msgstr "ظهر"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "دوشنبه"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "سه شنبه"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "چهارشنبه"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "پنجشنبه"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "جمعه"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "شنبه"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "یکشنبه"
+
+#: utils/dates.py:10
+#, fuzzy
+msgid "Mon"
+msgstr "یک"
+
+#: utils/dates.py:10
+msgid "Tue"
+msgstr "سه شنبه"
+
+#: utils/dates.py:10
+msgid "Wed"
+msgstr "چهارشنبه"
+
+#: utils/dates.py:10
+msgid "Thu"
+msgstr "سه شنبه"
+
+#: utils/dates.py:10
+msgid "Fri"
+msgstr "جمعه"
+
+#: utils/dates.py:11
+msgid "Sat"
+msgstr "شنبه"
+
+#: utils/dates.py:11
+#, fuzzy
+msgid "Sun"
+msgstr "ژوئن"
+
+#: utils/dates.py:18
+msgid "January"
+msgstr "ژانویه"
+
+#: utils/dates.py:18
+msgid "February"
+msgstr "فوریه"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "March"
+msgstr "مارس"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "April"
+msgstr "آوریل"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "May"
+msgstr "مه"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "June"
+msgstr "ژوئن"
+
+#: utils/dates.py:19 utils/dates.py:31
+msgid "July"
+msgstr "ژوئیه"
+
+#: utils/dates.py:19
+msgid "August"
+msgstr "اوت"
+
+#: utils/dates.py:19
+msgid "September"
+msgstr "سپتامبر"
+
+#: utils/dates.py:19
+msgid "October"
+msgstr "اکتبر"
+
+#: utils/dates.py:19
+msgid "November"
+msgstr "نوامبر"
+
+#: utils/dates.py:20
+msgid "December"
+msgstr "دسامبر"
+
+#: utils/dates.py:23
+msgid "jan"
+msgstr "ژانویه"
+
+#: utils/dates.py:23
+msgid "feb"
+msgstr "فوریه"
+
+#: utils/dates.py:23
+msgid "mar"
+msgstr "مارس"
+
+#: utils/dates.py:23
+msgid "apr"
+msgstr "آوریل"
+
+#: utils/dates.py:23
+msgid "may"
+msgstr "مه"
+
+#: utils/dates.py:23
+msgid "jun"
+msgstr "ژوئن"
+
+#: utils/dates.py:24
+msgid "jul"
+msgstr "ژوئیه"
+
+#: utils/dates.py:24
+msgid "aug"
+msgstr "اوت"
+
+#: utils/dates.py:24
+msgid "sep"
+msgstr "سپتامبر"
+
+#: utils/dates.py:24
+msgid "oct"
+msgstr "اکتبر"
+
+#: utils/dates.py:24
+msgid "nov"
+msgstr "نوامبر"
+
+#: utils/dates.py:24
+msgid "dec"
+msgstr "دسامبر"
+
+#: utils/dates.py:31
+msgid "Jan."
+msgstr "ژانویه"
+
+#: utils/dates.py:31
+msgid "Feb."
+msgstr "فوریه"
+
+#: utils/dates.py:32
+msgid "Aug."
+msgstr "اوت"
+
+#: utils/dates.py:32
+msgid "Sept."
+msgstr "سپتامبر"
+
+#: utils/dates.py:32
+msgid "Oct."
+msgstr "اکتبر"
+
+#: utils/dates.py:32
+msgid "Nov."
+msgstr "نوامبر"
+
+#: utils/dates.py:32
+msgid "Dec."
+msgstr "دسامبر"
+
+#: utils/text.py:127
+#, fuzzy
+msgid "or"
+msgstr "چهار"
+
+#: utils/timesince.py:21
+#, fuzzy
+msgid "year"
+msgstr "سال"
+
+#: utils/timesince.py:22
+#, fuzzy
+msgid "month"
+msgstr "ماه"
+
+#: utils/timesince.py:23
+#, fuzzy
+msgid "week"
+msgstr "هفته"
+
+#: utils/timesince.py:24
+#, fuzzy
+msgid "day"
+msgstr "روز"
+
+#: utils/timesince.py:25
+#, fuzzy
+msgid "hour"
+msgstr "ساعت"
+
+#: utils/timesince.py:26
+#, fuzzy
+msgid "minute"
+msgstr "دقیقه"
+
+#: utils/timesince.py:46
+#, fuzzy
+msgid "minutes"
+msgstr "دقیقه"
+
+#: utils/timesince.py:51
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr ""
+
+#: utils/timesince.py:57
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ""
+
+#: utils/translation/trans_real.py:399
+msgid "DATE_FORMAT"
+msgstr ""
+
+#: utils/translation/trans_real.py:400
+msgid "DATETIME_FORMAT"
+msgstr ""
+
+#: utils/translation/trans_real.py:401
+msgid "TIME_FORMAT"
+msgstr ""
+
+#: utils/translation/trans_real.py:417
+msgid "YEAR_MONTH_FORMAT"
+msgstr ""
+
+#: utils/translation/trans_real.py:418
+msgid "MONTH_DAY_FORMAT"
+msgstr ""
+
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "%(verbose_name)s با موفقیت ایجاد شد."
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "%(verbose_name)s با موفقیت به روز شد."
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "%(verbose_name)s حذف شد."
+
+#~ msgid "AnonymousUser"
+#~ msgstr "کاربر ناشناس"
+
+#~ msgid "%d milliseconds"
+#~ msgstr "%d میلی‌ثانیه"
diff --git a/webapp/django/conf/locale/fa/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/fa/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..f2e8940
--- /dev/null
+++ b/webapp/django/conf/locale/fa/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/fa/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/fa/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..56dcedc
--- /dev/null
+++ b/webapp/django/conf/locale/fa/LC_MESSAGES/djangojs.po
@@ -0,0 +1,118 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-24 22:09+1000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr ""
+
+#: contrib/admin/media/js/dateparse.js:32
+#: contrib/admin/media/js/calendar.js:24
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr ""
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Now"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
+msgid "Clock"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
+msgid "Choose a time"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "Midnight"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "6 a.m."
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
+msgid "Noon"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
+msgid "Cancel"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
+msgid "Today"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
+msgid "Calendar"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
+msgid "Yesterday"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
+msgid "Tomorrow"
+msgstr ""
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr ""
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr ""
diff --git a/webapp/django/conf/locale/fi/LC_MESSAGES/django.mo b/webapp/django/conf/locale/fi/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..156bf0c
--- /dev/null
+++ b/webapp/django/conf/locale/fi/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/fi/LC_MESSAGES/django.po b/webapp/django/conf/locale/fi/LC_MESSAGES/django.po
new file mode 100644
index 0000000..d74fa15
--- /dev/null
+++ b/webapp/django/conf/locale/fi/LC_MESSAGES/django.po
@@ -0,0 +1,4636 @@
+# Finnish translation of Django
+# Copyright (C) 2006-2007
+# This file is distributed under the same license as the Django package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-08-18 01:15+0300\n"
+"PO-Revision-Date: 2007-09-15 00:34+0300\n"
+"Last-Translator: Ville Säävuori <ville@unessa.net>\n"
+"Language-Team: Django I18N <Django-I18N@googlegroups.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms:  nplurals=2; plural=(n != 1);\n"
+"X-Poedit-Language: Finnish\n"
+"X-Poedit-Country: FINLAND\n"
+
+#: conf/global_settings.py:44
+msgid "Arabic"
+msgstr "arabia"
+
+#: conf/global_settings.py:45
+msgid "Bengali"
+msgstr "bengali"
+
+#: conf/global_settings.py:46
+msgid "Bulgarian"
+msgstr "bulgaria"
+
+#: conf/global_settings.py:47
+msgid "Catalan"
+msgstr "katalaani"
+
+#: conf/global_settings.py:48
+msgid "Czech"
+msgstr "tšekki"
+
+#: conf/global_settings.py:49
+msgid "Welsh"
+msgstr "wales"
+
+#: conf/global_settings.py:50
+msgid "Danish"
+msgstr "tanska"
+
+#: conf/global_settings.py:51
+msgid "German"
+msgstr "saksa"
+
+#: conf/global_settings.py:52
+msgid "Greek"
+msgstr "kreikka"
+
+#: conf/global_settings.py:53
+msgid "English"
+msgstr "englanti"
+
+#: conf/global_settings.py:54
+msgid "Spanish"
+msgstr "espanja"
+
+#: conf/global_settings.py:55
+#, fuzzy
+msgid "Estonian"
+msgstr "viro"
+
+#: conf/global_settings.py:56
+msgid "Argentinean Spanish"
+msgstr "Argentiinan espanja"
+
+#: conf/global_settings.py:57
+msgid "Basque"
+msgstr "baski"
+
+#: conf/global_settings.py:58
+msgid "Persian"
+msgstr "persia"
+
+#: conf/global_settings.py:59
+msgid "Finnish"
+msgstr "suomi"
+
+#: conf/global_settings.py:60
+msgid "French"
+msgstr "ranska"
+
+#: conf/global_settings.py:61
+#, fuzzy
+msgid "Irish"
+msgstr "turkki"
+
+#: conf/global_settings.py:62
+msgid "Galician"
+msgstr "galicia"
+
+#: conf/global_settings.py:63
+msgid "Hungarian"
+msgstr "unkari"
+
+#: conf/global_settings.py:64
+msgid "Hebrew"
+msgstr "heprea"
+
+#: conf/global_settings.py:65
+msgid "Croatian"
+msgstr "kroatia"
+
+#: conf/global_settings.py:66
+msgid "Icelandic"
+msgstr "islanti"
+
+#: conf/global_settings.py:67
+msgid "Italian"
+msgstr "italia"
+
+#: conf/global_settings.py:68
+msgid "Japanese"
+msgstr "japani"
+
+#: conf/global_settings.py:69
+#, fuzzy
+msgid "Georgian"
+msgstr "saksa"
+
+#: conf/global_settings.py:70
+msgid "Korean"
+msgstr "korea"
+
+#: conf/global_settings.py:71
+msgid "Khmer"
+msgstr "khmer"
+
+#: conf/global_settings.py:72
+msgid "Kannada"
+msgstr "kannada"
+
+#: conf/global_settings.py:73
+msgid "Latvian"
+msgstr "latvia"
+
+#: conf/global_settings.py:74
+msgid "Lithuanian"
+msgstr "liettua"
+
+#: conf/global_settings.py:75
+msgid "Macedonian"
+msgstr "makedonia"
+
+#: conf/global_settings.py:76
+msgid "Dutch"
+msgstr "hollanti"
+
+#: conf/global_settings.py:77
+msgid "Norwegian"
+msgstr "norja"
+
+#: conf/global_settings.py:78
+msgid "Polish"
+msgstr "puola"
+
+#: conf/global_settings.py:79
+msgid "Portugese"
+msgstr "portugali"
+
+#: conf/global_settings.py:80
+#, fuzzy
+msgid "Brazilian Portuguese"
+msgstr "brasilian portugali"
+
+#: conf/global_settings.py:81
+msgid "Romanian"
+msgstr "romania"
+
+#: conf/global_settings.py:82
+msgid "Russian"
+msgstr "venäjä"
+
+#: conf/global_settings.py:83
+msgid "Slovak"
+msgstr "slovakia"
+
+#: conf/global_settings.py:84
+msgid "Slovenian"
+msgstr "slovenia"
+
+#: conf/global_settings.py:85
+msgid "Serbian"
+msgstr "serbia"
+
+#: conf/global_settings.py:86
+msgid "Swedish"
+msgstr "ruotsi"
+
+#: conf/global_settings.py:87
+msgid "Tamil"
+msgstr "tamili"
+
+#: conf/global_settings.py:88
+msgid "Telugu"
+msgstr "telugu"
+
+#: conf/global_settings.py:89
+msgid "Turkish"
+msgstr "turkki"
+
+#: conf/global_settings.py:90
+msgid "Ukrainian"
+msgstr "ukraina"
+
+#: conf/global_settings.py:91
+msgid "Simplified Chinese"
+msgstr "kiina (yksinkertaistettu)"
+
+#: conf/global_settings.py:92
+msgid "Traditional Chinese"
+msgstr "kiina (perinteinen)"
+
+#: contrib/admin/filterspecs.py:44
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Yksi %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:74 contrib/admin/filterspecs.py:92
+#: contrib/admin/filterspecs.py:147 contrib/admin/filterspecs.py:173
+msgid "All"
+msgstr "Kaikki"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Any date"
+msgstr "Mikä tahansa päivä"
+
+#: contrib/admin/filterspecs.py:114
+msgid "Today"
+msgstr "Tänään"
+
+#: contrib/admin/filterspecs.py:117
+msgid "Past 7 days"
+msgstr "Viimeiset 7 päivää"
+
+#: contrib/admin/filterspecs.py:119
+msgid "This month"
+msgstr "Tässä kuussa"
+
+#: contrib/admin/filterspecs.py:121
+msgid "This year"
+msgstr "Tänä vuonna"
+
+#: contrib/admin/filterspecs.py:147 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "Yes"
+msgstr "Kyllä"
+
+#: contrib/admin/filterspecs.py:147 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "No"
+msgstr "Ei"
+
+#: contrib/admin/filterspecs.py:154 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "Unknown"
+msgstr "Tuntematon"
+
+#: contrib/admin/models.py:19
+msgid "action time"
+msgstr "tapahtumahetki"
+
+#: contrib/admin/models.py:22
+msgid "object id"
+msgstr "kohteen tunniste"
+
+#: contrib/admin/models.py:23
+msgid "object repr"
+msgstr "kohteen tiedot"
+
+#: contrib/admin/models.py:24
+msgid "action flag"
+msgstr "tapahtumatyyppi"
+
+#: contrib/admin/models.py:25
+msgid "change message"
+msgstr "selitys"
+
+#: contrib/admin/models.py:28
+msgid "log entry"
+msgstr "lokimerkintä"
+
+#: contrib/admin/models.py:29
+msgid "log entries"
+msgstr "lokimerkinnät"
+
+#: contrib/admin/options.py:143 contrib/admin/options.py:202
+#, fuzzy
+msgid "None"
+msgstr "yksi"
+
+#: contrib/admin/options.py:413
+#, python-format
+msgid "Changed %s."
+msgstr "Muokattu: %s."
+
+#: contrib/admin/options.py:413 contrib/admin/options.py:423
+#: core/validators.py:279 db/models/manipulators.py:305
+msgid "and"
+msgstr "ja"
+
+#: contrib/admin/options.py:418
+#, fuzzy, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Lisää uusi %(name)s"
+
+#: contrib/admin/options.py:422
+#, fuzzy, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "tähän liittyvät `%(label)s.%(name)s`-kohteet"
+
+#: contrib/admin/options.py:427
+#, fuzzy, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "tähän liittyvät `%(label)s.%(name)s`-kohteet"
+
+#: contrib/admin/options.py:431
+msgid "No fields changed."
+msgstr "Ei muutoksia kenttiin."
+
+#: contrib/admin/options.py:492 contrib/auth/admin.py:50
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" on nyt lisätty."
+
+#: contrib/admin/options.py:496 contrib/admin/options.py:529
+#: contrib/auth/admin.py:55
+msgid "You may edit it again below."
+msgstr "Voit muokata sitä uudelleen alla."
+
+#: contrib/admin/options.py:506 contrib/admin/options.py:539
+#, python-format
+msgid "You may add another %s below."
+msgstr "Uusi %s on lisättävissä alla."
+
+#: contrib/admin/options.py:527
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" on nyt muutettu."
+
+#: contrib/admin/options.py:535
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" on nyt lisätty. Voit muokata sitä uudelleen alla."
+
+#: contrib/admin/options.py:601
+#, python-format
+msgid "Add %s"
+msgstr "Uusi %s"
+
+#: contrib/admin/options.py:678
+#, python-format
+msgid "Change %s"
+msgstr "Muokkaa: %s"
+
+#: contrib/admin/options.py:709
+msgid "Database error"
+msgstr "Tietokantavirhe"
+
+#: contrib/admin/options.py:758
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" on poistettu."
+
+#: contrib/admin/options.py:765
+msgid "Are you sure?"
+msgstr "Oletko varma?"
+
+#: contrib/admin/options.py:792
+#, python-format
+msgid "Change history: %s"
+msgstr "Muokkaushistoria: %s"
+
+#: contrib/admin/sites.py:18 contrib/admin/views/decorators.py:16
+#: contrib/auth/forms.py:72 contrib/comments/views/comments.py:56
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Käyttäjätunnus tai salasana ei kelpaa. Huomaa, että isot ja pienet kirjaimet "
+"ovat merkitseviä."
+
+#: contrib/admin/sites.py:238 contrib/admin/views/decorators.py:68
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Kirjaudu uudelleen sisään, koska istuntosi on vanhentunut. Muutoksesi ovat "
+"silti tallessa."
+
+#: contrib/admin/sites.py:245 contrib/admin/views/decorators.py:75
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Selaimesi ei salli evästeitä. Muuta asetukset sallimaan evästeet, lataa tämä "
+"sivu uudelleen ja yritä uudelleen."
+
+#: contrib/admin/sites.py:259 contrib/admin/sites.py:265
+#: contrib/admin/views/decorators.py:92
+msgid "Usernames cannot contain the '@' character."
+msgstr "Käyttäjätunnuksessa ei saa olla '@'-merkkiä."
+
+#: contrib/admin/sites.py:262 contrib/admin/views/decorators.py:88
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "Käyttäjätunnus ei ole sama kuin sähköpostiosoite. Kokeile '%s'."
+
+#: contrib/admin/sites.py:330
+msgid "Site administration"
+msgstr "Sivuston ylläpito"
+
+#: contrib/admin/sites.py:352 contrib/admin/templates/admin/login.html:27
+#: contrib/admin/templates/registration/password_reset_complete.html:14
+#: contrib/admin/views/decorators.py:30
+msgid "Log in"
+msgstr "Kirjaudu sisään"
+
+#: contrib/admin/util.py:126
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Yksi tai useampi %(fieldname)s kohteessa %(name)s: %(obj)s"
+
+#: contrib/admin/util.py:131
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Yksi tai useampi %(fieldname)s kohteessa %(name)s:"
+
+#: contrib/admin/widgets.py:65
+msgid "Date:"
+msgstr "Pvm:"
+
+#: contrib/admin/widgets.py:65
+msgid "Time:"
+msgstr "Klo:"
+
+#: contrib/admin/widgets.py:89
+msgid "Currently:"
+msgstr "Tällä hetkellä:"
+
+#: contrib/admin/widgets.py:89
+msgid "Change:"
+msgstr "Muokkaa:"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Sivua ei löydy"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Pahoittelemme, pyydettyä sivua ei löytynyt."
+
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/change_form.html:17
+#: contrib/admin/templates/admin/change_list.html:8
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/auth/user/change_password.html:10
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_reset_complete.html:4
+#: contrib/admin/templates/registration/password_reset_confirm.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Etusivu"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Palvelinvirhe"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Palvelinvirhe (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Palvelinvirhe <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Palvelimella on tapahtunut virhe. Se on ilmoitettu sivuston ylläpitäjille "
+"sähköpostilla ja korjataan pian. Kiitämme kärsivällisyydestä."
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "Tervetuloa,"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Ohjeita"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:13
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+msgid "Change password"
+msgstr "Vaihda salasana"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/comments/templates/comments/form.html:6
+msgid "Log out"
+msgstr "Kirjaudu ulos"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django-sivuston ylläpito"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Djangon ylläpito"
+
+#: contrib/admin/templates/admin/change_form.html:19
+#: contrib/admin/templates/admin/index.html:29
+msgid "Add"
+msgstr "Lisää uusi"
+
+#: contrib/admin/templates/admin/change_form.html:26
+#: contrib/admin/templates/admin/object_history.html:5
+msgid "History"
+msgstr "Muokkaushistoria"
+
+#: contrib/admin/templates/admin/change_form.html:27
+msgid "View on site"
+msgstr "Näytä lopputulos"
+
+#: contrib/admin/templates/admin/change_form.html:37
+#: contrib/admin/templates/admin/auth/user/change_password.html:22
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Korjaa virhe."
+msgstr[1] "Korjaa virheet."
+
+#: contrib/admin/templates/admin/change_list.html:16
+#, python-format
+msgid "Add %(name)s"
+msgstr "Lisää uusi %(name)s"
+
+#: contrib/admin/templates/admin/change_list.html:26
+msgid "Filter"
+msgstr "Suodatin"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+#: contrib/admin/templates/admin/edit_inline/tabular.html:15
+msgid "Delete"
+msgstr "Poista"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:15
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Kohteen '%(escaped_object)s' (%(object_name)s) poisto poistaisi myös siihen "
+"liittyviä kohteita, mutta sinulla ei ole oikeutta näiden kohteiden "
+"poistamiseen:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:22
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Haluatko varmasti poistaa kohteen \"%(escaped_object)s\" (%(object_name)s)? "
+"Myös seuraavat kohteet poistettaisiin samalla:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:27
+msgid "Yes, I'm sure"
+msgstr "Kyllä, olen varma"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " %(filter_title)s:"
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Sovelluksen %(name)s mallit."
+
+#: contrib/admin/templates/admin/index.html:19
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:35
+msgid "Change"
+msgstr "Muokkaa"
+
+#: contrib/admin/templates/admin/index.html:45
+msgid "You don't have permission to edit anything."
+msgstr "Sinulla ei ole oikeutta muokata mitään."
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "Recent Actions"
+msgstr "Viimeisimmät muutokset"
+
+#: contrib/admin/templates/admin/index.html:54
+msgid "My Actions"
+msgstr "Sinun tekemäsi muutokset"
+
+#: contrib/admin/templates/admin/index.html:58
+msgid "None available"
+msgstr "Ei yhtään"
+
+#: contrib/admin/templates/admin/invalid_setup.html:7
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Tietokanta-asennuksessasi on jotain vialla. Varmistu, että sopivat taulut on "
+"luotu ja että oikea käyttäjä voi lukea tietokantaa."
+
+#: contrib/admin/templates/admin/login.html:19
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+msgid "Username:"
+msgstr "Käyttäjätunnus:"
+
+#: contrib/admin/templates/admin/login.html:22
+#: contrib/comments/templates/comments/form.html:8
+msgid "Password:"
+msgstr "Salasana:"
+
+#: contrib/admin/templates/admin/object_history.html:16
+msgid "Date/time"
+msgstr "Pvm/klo"
+
+#: contrib/admin/templates/admin/object_history.html:17
+msgid "User"
+msgstr "Käyttäjä"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Action"
+msgstr "Toiminto"
+
+#: contrib/admin/templates/admin/object_history.html:24
+msgid "DATE_WITH_TIME_FULL"
+msgstr "N j, Y, P"
+
+#: contrib/admin/templates/admin/object_history.html:32
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Tällä kohteella ei ole muutoshistoriaa. Sitä ei ole lisätty tämän "
+"ylläpitosivun avulla."
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Näytä kaikki"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Etsi"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 hakutulas"
+msgstr[1] "%(counter)s hakutulosta"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "yhteensä %(full_result_count)s"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Tallenna uutena"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Tallenna ja lisää seuraava"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Tallenna välillä ja jatka muokkaamista"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Tallenna ja poistu"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Syötä ensin käyttäjätunnus ja salasana. Sen jälkeen voit muokata muita "
+"käyttäjän tietoja."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:13
+#: contrib/auth/forms.py:14 contrib/auth/forms.py:51
+msgid "Username"
+msgstr "Käyttäjätunnus"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:20
+#: contrib/admin/templates/admin/auth/user/change_password.html:33
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:52 contrib/auth/forms.py:176
+msgid "Password"
+msgstr "Salasana"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:26
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+#: contrib/auth/forms.py:177
+msgid "Password (again)"
+msgstr "Salasana toistamiseen"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:27
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+msgid "Enter the same password as above, for verification."
+msgstr "Syötä sama salasana tarkistuksen vuoksi toistamiseen."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:26
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Syötä käyttäjän <strong>%(username)s</strong> uusi salasana."
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Kiitos sivuillamme viettämästäsi ajasta."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Kirjaudu uudelleen sisään"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Salasanan muuttaminen"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Salasanan muuttaminen onnistui"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Salasanasi on muutettu."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Syötä vanha salasanasi varmistukseksi, ja syötä sitten uusi salasanasi\n"
+"kaksi kertaa, jotta se tulee varmasti oikein."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Vanha salasana:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+#: contrib/admin/templates/registration/password_reset_confirm.html:18
+msgid "New password:"
+msgstr "Uusi salasana:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+#: contrib/admin/templates/registration/password_reset_confirm.html:20
+msgid "Confirm password:"
+msgstr "Varmista uusi salasana:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+#: contrib/admin/templates/registration/password_reset_confirm.html:21
+msgid "Change my password"
+msgstr "Vaihda salasana"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:4
+#: contrib/admin/templates/registration/password_reset_confirm.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+msgid "Password reset"
+msgstr "Salasanan nollaus"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:6
+#: contrib/admin/templates/registration/password_reset_complete.html:10
+#, fuzzy
+msgid "Password reset complete"
+msgstr "Salasanan nollaus"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:12
+msgid "Your password has been set.  You may go ahead and log in now."
+msgstr "Salasanasi on asetettu. Nyt voit kirjautua sisään."
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:4
+#, fuzzy
+msgid "Password reset confirmation"
+msgstr "Salasanan nollaus"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:12
+#, fuzzy
+msgid "Enter new password"
+msgstr "Uusi salasana:"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:14
+#, fuzzy
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Syötä vanha salasanasi varmistukseksi, ja syötä sitten uusi salasanasi\n"
+"kaksi kertaa, jotta se tulee varmasti oikein."
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:26
+#, fuzzy
+msgid "Password reset unsuccessful"
+msgstr "Salasanan nollaus ei onnistunut"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:28
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used.  Please request a new password reset."
+msgstr ""
+"Salasanan nollauslinkki oli virheellinen, mahdollisesti siksi että se on jo "
+"käytetty. Ole hyvä ja pyydä uusi salasanan nollaus."
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Salasanan nollaus onnistui"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+#, fuzzy
+msgid ""
+"We've e-mailed you instructions for setting your password to the e-mail "
+"address you submitted. You should be receiving it shortly."
+msgstr ""
+"Uusi salasanasi on lähetetty antamaasi sähköpostiosoitteeseen.\n"
+"Se saapuu tuota pikaa."
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Sait tämän viestin, koska pyysit uutta salasanaa"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "sivuston %(site_name)s käyttäjätilillesi"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+msgid "Please go to the following page and choose a new password:"
+msgstr "Ole hyvä ja mene oheiselle sivulle valitsemaan uusi salasana:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:9
+msgid "Your username, in case you've forgotten:"
+msgstr "Käyttäjätunnuksesi siltä varalta, että olet unohtanut sen:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Thanks for using our site!"
+msgstr "Kiitos vierailustasi sivuillemme!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s ylläpitäjät"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+#, fuzzy
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll e-mail "
+"instructions for setting a new one."
+msgstr ""
+"Unohditko salasanasi? Syötä alle sähköpostiosoitteesi, niin \n"
+"lähetämme sinulle uuden salasanan."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Sähköpostiosoite:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Nollaa salasana"
+
+#: contrib/admin/templatetags/admin_list.py:284
+msgid "All dates"
+msgstr "Kaikki päivät"
+
+#: contrib/admin/views/main.py:65
+#, python-format
+msgid "Select %s"
+msgstr "Valitse %s"
+
+#: contrib/admin/views/main.py:65
+#, python-format
+msgid "Select %s to change"
+msgstr "Valitse muokattava %s"
+
+#: contrib/admin/views/template.py:36 contrib/sites/models.py:38
+msgid "site"
+msgstr "sivusto"
+
+#: contrib/admin/views/template.py:38
+#, fuzzy
+msgid "template"
+msgstr "mallipohjan nimi"
+
+#: contrib/admindocs/views.py:53 contrib/admindocs/views.py:55
+#: contrib/admindocs/views.py:57
+msgid "tag:"
+msgstr "tag:"
+
+#: contrib/admindocs/views.py:87 contrib/admindocs/views.py:89
+#: contrib/admindocs/views.py:91
+msgid "filter:"
+msgstr "suodatin:"
+
+#: contrib/admindocs/views.py:153 contrib/admindocs/views.py:155
+#: contrib/admindocs/views.py:157
+msgid "view:"
+msgstr "view:"
+
+#: contrib/admindocs/views.py:187
+#, python-format
+msgid "App %r not found"
+msgstr "Sovellusta %r ei löydy"
+
+#: contrib/admindocs/views.py:194
+#, fuzzy, python-format
+msgid "Model %(model_name)r not found in app %(app_label)r"
+msgstr "Sovelluksesta %(label)r ei löydy mallia %(name)r"
+
+#: contrib/admindocs/views.py:206
+#, fuzzy, python-format
+msgid "the related `%(app_label)s.%(data_type)s` object"
+msgstr "tähän liittyvä `%(label)s.%(type)s`-kohde"
+
+#: contrib/admindocs/views.py:206 contrib/admindocs/views.py:228
+#: contrib/admindocs/views.py:242 contrib/admindocs/views.py:247
+msgid "model:"
+msgstr "malli:"
+
+#: contrib/admindocs/views.py:237
+#, fuzzy, python-format
+msgid "related `%(app_label)s.%(object_name)s` objects"
+msgstr "tähän liittyvät `%(label)s.%(name)s`-kohteet"
+
+#: contrib/admindocs/views.py:242
+#, python-format
+msgid "all %s"
+msgstr "kaikki %s"
+
+#: contrib/admindocs/views.py:247
+#, python-format
+msgid "number of %s"
+msgstr "%s-kohteiden lukumäärä"
+
+#: contrib/admindocs/views.py:253
+#, python-format
+msgid "Fields on %s objects"
+msgstr "%s-kohteiden kentät"
+
+#: contrib/admindocs/views.py:317 contrib/admindocs/views.py:328
+#: contrib/admindocs/views.py:330 contrib/admindocs/views.py:336
+#: contrib/admindocs/views.py:337 contrib/admindocs/views.py:339
+msgid "Integer"
+msgstr "Kokonaisluku"
+
+#: contrib/admindocs/views.py:318
+msgid "Boolean (Either True or False)"
+msgstr "Totuusarvo: joko tosi (True) tai epätosi (False)"
+
+#: contrib/admindocs/views.py:319 contrib/admindocs/views.py:338
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Merkkijono (enintään %(max_length)s merkkiä)"
+
+#: contrib/admindocs/views.py:320
+msgid "Comma-separated integers"
+msgstr "Pilkulla erotetut kokonaisluvut"
+
+#: contrib/admindocs/views.py:321
+msgid "Date (without time)"
+msgstr "Päivämäärä (ilman kellonaikaa)"
+
+#: contrib/admindocs/views.py:322
+msgid "Date (with time)"
+msgstr "Päivämäärä ja kellonaika"
+
+#: contrib/admindocs/views.py:323
+msgid "Decimal number"
+msgstr "Desimaaliluku"
+
+#: contrib/admindocs/views.py:324
+msgid "E-mail address"
+msgstr "Sähköpostiosoite"
+
+#: contrib/admindocs/views.py:325 contrib/admindocs/views.py:326
+#: contrib/admindocs/views.py:329
+msgid "File path"
+msgstr "Tiedostopolku"
+
+#: contrib/admindocs/views.py:327
+msgid "Floating point number"
+msgstr "Liukuluku"
+
+#: contrib/admindocs/views.py:331 contrib/comments/models.py:89
+msgid "IP address"
+msgstr "IP-osoite"
+
+#: contrib/admindocs/views.py:333
+msgid "Boolean (Either True, False or None)"
+msgstr "Totuusarvo: joko tosi (True), epätosi (False) tai ei mikään (None)"
+
+#: contrib/admindocs/views.py:334
+msgid "Relation to parent model"
+msgstr "Relaatio emomalliin"
+
+#: contrib/admindocs/views.py:335
+msgid "Phone number"
+msgstr "Puhelinnumero"
+
+#: contrib/admindocs/views.py:340
+msgid "Text"
+msgstr "Tekstiä"
+
+#: contrib/admindocs/views.py:341
+msgid "Time"
+msgstr "Kellonaika"
+
+#: contrib/admindocs/views.py:342 contrib/flatpages/admin.py:8
+#: contrib/flatpages/models.py:8
+msgid "URL"
+msgstr "URL-osoite"
+
+#: contrib/admindocs/views.py:343
+msgid "U.S. state (two uppercase letters)"
+msgstr "USA:n osavaltio (kaksikirjaiminen versaalein)"
+
+#: contrib/admindocs/views.py:344
+msgid "XML text"
+msgstr "XML-teksti"
+
+#: contrib/admindocs/views.py:370
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s ei näytä urlpattern-objektilta"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Kirjanmerkkiset"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:4
+msgid "Documentation bookmarklets"
+msgstr "Ohjeiden kirjanmerkkiset"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:8
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">Asenna kirjanmerkkinen raahaamalla linkki kirjanmerkkien "
+"työkalupalkkiin tai napsauttamalla linkkiä oikeanpuoleisella hiiren "
+"painikkeella ja valitsemalla kirjanmerkkeihin lisäämisen. Sen jälkeen voit "
+"valita kirjanmerkkisen miltä tahansa sivuston sivulta. Huomaa, että jotkin "
+"näistä kirjanmerkkisistä toimivat vain, jos selaat sivustoa \"paikalliseksi"
+"\" määritellyltä tietokoneelta (kysy lisätietoja verkkonne ylläpitäjältä).</"
+"p>\n"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:18
+msgid "Documentation for this page"
+msgstr "Tämän sivun ohjeita"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:19
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr "Vie avoinna olevan sivun luoneen näkymän ohjeisiin."
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:21
+msgid "Show object ID"
+msgstr "Näytä kohteen tunniste"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:22
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Näyttää yksittäistä kohdetta vastaavilla sivuilla kohteen tyypin ja "
+"tunnisteen."
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:24
+msgid "Edit this object (current window)"
+msgstr "Muokkaa tätä kohdetta (tässä ikkunassa)"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:25
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+"Siirtyy yksittäistä kohdetta vastaavalta sivulta kohteen ylläpitosivulle."
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:27
+msgid "Edit this object (new window)"
+msgstr "Muokkaa tätä kohdetta (uudessa ikkunassa)"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:28
+msgid "As above, but opens the admin page in a new window."
+msgstr "Kuten yllä, mutta avaa ylläpitosivun uuteen ikkunaan."
+
+#: contrib/auth/admin.py:21
+msgid "Personal info"
+msgstr "Henkilökohtaiset tiedot"
+
+#: contrib/auth/admin.py:22
+msgid "Permissions"
+msgstr "Oikeudet"
+
+#: contrib/auth/admin.py:23
+msgid "Important dates"
+msgstr "Tärkeät päivämäärät"
+
+#: contrib/auth/admin.py:24
+msgid "Groups"
+msgstr "Ryhmät"
+
+#: contrib/auth/admin.py:60
+msgid "Add user"
+msgstr "Uusi käyttäjä"
+
+#: contrib/auth/admin.py:85
+msgid "Password changed successfully."
+msgstr "Salasanan muuttaminen onnistui."
+
+#: contrib/auth/admin.py:91
+#, python-format
+msgid "Change password: %s"
+msgstr "Vaihda salasana: %s"
+
+#: contrib/auth/forms.py:15 contrib/auth/models.py:137
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr ""
+" Vaaditaan. Enintään 30 kirjanta (a-z), numeroa (0-9) tai alaviivaa (_)."
+
+#: contrib/auth/forms.py:16 core/validators.py:72
+msgid "This value must contain only letters, numbers and underscores."
+msgstr ""
+"Tässä voidaan käyttää vain kirjaimia (a-z), numeroita (0-9) ja alaviivoja "
+"(_)."
+
+#: contrib/auth/forms.py:18
+#, fuzzy
+msgid "Password confirmation"
+msgstr "Salasanan muuttaminen"
+
+#: contrib/auth/forms.py:30
+msgid "A user with that username already exists."
+msgstr "Käyttäjätunnus on jo rekisteröity."
+
+#: contrib/auth/forms.py:36 contrib/auth/forms.py:146
+#: contrib/auth/forms.py:188
+msgid "The two password fields didn't match."
+msgstr "Salasanat eivät täsmää."
+
+#: contrib/auth/forms.py:74 contrib/comments/views/comments.py:58
+msgid "This account is inactive."
+msgstr "Tämä käyttäjätili ei ole voimassa."
+
+#: contrib/auth/forms.py:79 contrib/comments/views/comments.py:49
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr "Selaimesi ei salli evästeitä. Sisäänkirjautuminen vaatii evästeen."
+
+#: contrib/auth/forms.py:92
+#, fuzzy
+msgid "E-mail"
+msgstr "Sähköpostios."
+
+#: contrib/auth/forms.py:101
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr ""
+"Sähköpostiosoitetta vastaavaa käyttäjätunnusta ei löydy. Oletko varmasti jo "
+"rekisteröitynyt?"
+
+#: contrib/auth/forms.py:126
+#, fuzzy, python-format
+msgid "Password reset on %s"
+msgstr "Salasanan nollaus"
+
+#: contrib/auth/forms.py:134
+#, fuzzy
+msgid "New password"
+msgstr "Uusi salasana:"
+
+#: contrib/auth/forms.py:135
+#, fuzzy
+msgid "New password confirmation"
+msgstr "Uusi salasana uudelleen:"
+
+#: contrib/auth/forms.py:160
+#, fuzzy
+msgid "Old password"
+msgstr "Vanha salasana:"
+
+#: contrib/auth/forms.py:168
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Vanha salasana on virheellinen. Yritä uudelleen."
+
+#: contrib/auth/models.py:73 contrib/auth/models.py:96
+msgid "name"
+msgstr "nimi"
+
+#: contrib/auth/models.py:75
+msgid "codename"
+msgstr "koodinimi"
+
+#: contrib/auth/models.py:78
+msgid "permission"
+msgstr "oikeus"
+
+#: contrib/auth/models.py:79 contrib/auth/models.py:97
+msgid "permissions"
+msgstr "oikeudet"
+
+#: contrib/auth/models.py:100
+msgid "group"
+msgstr "ryhmä"
+
+#: contrib/auth/models.py:101 contrib/auth/models.py:147
+msgid "groups"
+msgstr "ryhmät"
+
+#: contrib/auth/models.py:137
+msgid "username"
+msgstr "tunnus"
+
+#: contrib/auth/models.py:138
+msgid "first name"
+msgstr "etunimi"
+
+#: contrib/auth/models.py:139
+msgid "last name"
+msgstr "sukunimi"
+
+#: contrib/auth/models.py:140
+msgid "e-mail address"
+msgstr "sähköposti"
+
+#: contrib/auth/models.py:141
+msgid "password"
+msgstr "salasana"
+
+#: contrib/auth/models.py:141
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"Syötä muodossa '[algo]$[suola]$[heksa-digest]' tai käytä <a href=\"password/"
+"\">muutoslomaketta</a>."
+
+#: contrib/auth/models.py:142
+msgid "staff status"
+msgstr "ylläpitäjä"
+
+#: contrib/auth/models.py:142
+msgid "Designates whether the user can log into this admin site."
+msgstr "Ylläpitäjillä on pääsy tähän sivuston ylläpito-osioon."
+
+#: contrib/auth/models.py:143
+msgid "active"
+msgstr "voimassa"
+
+#: contrib/auth/models.py:143
+#, fuzzy
+msgid ""
+"Designates whether this user should be treated as active. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"Määrää, voiko käyttäjä kirjautua sisään. Tällä voi estää käyttäjätilin "
+"käytön poistamatta sitä."
+
+#: contrib/auth/models.py:144
+msgid "superuser status"
+msgstr "pääkäyttäjä"
+
+#: contrib/auth/models.py:144
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr ""
+"Antaa käyttäjälle kaikki oikeudet ilman, että niitä täytyy erikseen luetella."
+
+#: contrib/auth/models.py:145
+msgid "last login"
+msgstr "viimeksi kirjautunut"
+
+#: contrib/auth/models.py:146
+msgid "date joined"
+msgstr "liittynyt"
+
+#: contrib/auth/models.py:148
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"Tässä valittujen oikeuksien lisäksi käyttäjä saa myös kaikki niiden ryhmien "
+"oikeudet, joiden jäsen hän on."
+
+#: contrib/auth/models.py:149
+msgid "user permissions"
+msgstr "käyttäjän oikeudet"
+
+#: contrib/auth/models.py:153
+msgid "user"
+msgstr "käyttäjä"
+
+#: contrib/auth/models.py:154
+msgid "users"
+msgstr "käyttäjät"
+
+#: contrib/auth/models.py:309
+msgid "message"
+msgstr "viesti"
+
+#: contrib/auth/views.py:50
+msgid "Logged out"
+msgstr "Kirjautunut ulos"
+
+#: contrib/comments/models.py:71 contrib/comments/models.py:164
+msgid "object ID"
+msgstr "kohteen tunniste"
+
+#: contrib/comments/models.py:72
+msgid "headline"
+msgstr "otsikko"
+
+#: contrib/comments/models.py:73 contrib/comments/models.py:95
+#: contrib/comments/models.py:165
+msgid "comment"
+msgstr "kommentti"
+
+#: contrib/comments/models.py:74
+msgid "rating #1"
+msgstr "1. pisteytys"
+
+#: contrib/comments/models.py:75
+msgid "rating #2"
+msgstr "2. pisteytys"
+
+#: contrib/comments/models.py:76
+msgid "rating #3"
+msgstr "3. pisteytys"
+
+#: contrib/comments/models.py:77
+msgid "rating #4"
+msgstr "4. pisteytys"
+
+#: contrib/comments/models.py:78
+msgid "rating #5"
+msgstr "5. pisteytys"
+
+#: contrib/comments/models.py:79
+msgid "rating #6"
+msgstr "6. pisteytys"
+
+#: contrib/comments/models.py:80
+msgid "rating #7"
+msgstr "7. pisteytys"
+
+#: contrib/comments/models.py:81
+msgid "rating #8"
+msgstr "8. pisteytys"
+
+#: contrib/comments/models.py:86
+msgid "is valid rating"
+msgstr "on sallittu pisteytys"
+
+#: contrib/comments/models.py:87 contrib/comments/models.py:167
+msgid "date/time submitted"
+msgstr "lähetyshetki"
+
+#: contrib/comments/models.py:88 contrib/comments/models.py:168
+msgid "is public"
+msgstr "on julkinen"
+
+#: contrib/comments/models.py:90
+msgid "is removed"
+msgstr "on poistettu"
+
+#: contrib/comments/models.py:90
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Rastita jos kommentti on asiaankuulumaton. Kommentin tilalla näytetään\n"
+"viesti \"Tämä kommentti on poistettu\"."
+
+#: contrib/comments/models.py:96
+msgid "comments"
+msgstr "kommentit"
+
+#: contrib/comments/models.py:128 contrib/comments/models.py:199
+msgid "Content object"
+msgstr "Kommentoitu kohde"
+
+#: contrib/comments/models.py:156
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+" Kirjoittanut %(user)s, pvm %(date)s\\n\n"
+" \\n\n"
+" %(comment)s\\n\n"
+" \\n\n"
+" http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:166
+msgid "person's name"
+msgstr "henkilön nimi"
+
+#: contrib/comments/models.py:169
+msgid "ip address"
+msgstr "IP-osoite"
+
+#: contrib/comments/models.py:171
+msgid "approved by staff"
+msgstr "ylläpidon hyväksymä"
+
+#: contrib/comments/models.py:175
+msgid "free comment"
+msgstr "vapaa kommentti"
+
+#: contrib/comments/models.py:176
+msgid "free comments"
+msgstr "vapaat kommentit"
+
+#: contrib/comments/models.py:227
+msgid "score"
+msgstr "pisteet"
+
+#: contrib/comments/models.py:228
+msgid "score date"
+msgstr "pisteytyspäivä"
+
+#: contrib/comments/models.py:232
+msgid "karma score"
+msgstr "karma-pisteytys"
+
+#: contrib/comments/models.py:233
+msgid "karma scores"
+msgstr "karma-pisteytykset"
+
+#: contrib/comments/models.py:237
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d pistettä käyttäjältä %(user)s"
+
+#: contrib/comments/models.py:254
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+" %(user)s on merkinnyt tämän kommentin:\\n\n"
+" \\n\n"
+" %(text)s"
+
+#: contrib/comments/models.py:262
+msgid "flag date"
+msgstr "merkintäpäivä"
+
+#: contrib/comments/models.py:266
+msgid "user flag"
+msgstr "käyttäjän merkki"
+
+#: contrib/comments/models.py:267
+msgid "user flags"
+msgstr "käyttäjien merkit"
+
+#: contrib/comments/models.py:271
+#, python-format
+msgid "Flag by %r"
+msgstr "Käyttäjän %r merkki"
+
+#: contrib/comments/models.py:277
+msgid "deletion date"
+msgstr "poistamispäivä"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "valvojan poisto"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "valvojien poistot"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Valvojan %r poisto"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Unohditko salasanasi?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Pisteytykset"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Vaaditaan"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Vapaavalintainen"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Lähetä valokuva"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Kommentti:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Esikatsele kommenttia"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Nimesi:"
+
+#: contrib/comments/views/comments.py:76
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr ""
+"Tämä pisteytys on annettava, koska olet syöttänyt ainakin yhden muunkin "
+"pisteytyksen."
+
+#: contrib/comments/views/comments.py:160
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Kommentin kirjoittanut käyttäjä on kirjoittanut vain yhden kommentin:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Kommentin kirjoittanut käyttäjä on kirjoittanut alle %(count)s kommenttia:\n"
+"\n"
+"%(text)s"
+
+# Mitä "sketchy user" tarkoittaa?
+#: contrib/comments/views/comments.py:165
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Tämä on \"sketchy\"-käyttäjän kirjoittama kommentti:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:238
+#: contrib/comments/views/comments.py:331
+msgid "Only POSTs are allowed"
+msgstr "Vain POST-kutsut sallittu"
+
+#: contrib/comments/views/comments.py:242
+#: contrib/comments/views/comments.py:335
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Yksi tai useampi vaadittu kenttä on jäänyt täyttämättä"
+
+#: contrib/comments/views/comments.py:246
+#: contrib/comments/views/comments.py:337
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Kommenttilomaketta on käpälöity (turvallisuusrike)"
+
+#: contrib/comments/views/comments.py:256
+#: contrib/comments/views/comments.py:343
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"Kommenttilomakkeen 'target'-parametri ei kelpaa -- kohteen ID oli "
+"virheellinen"
+
+#: contrib/comments/views/comments.py:307
+#: contrib/comments/views/comments.py:372
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "Kommenttilomake ei pyytänyt esikatselua tai lähettämistä"
+
+#: contrib/comments/views/karma.py:21
+msgid "Anonymous users cannot vote"
+msgstr "Anonyymit käyttäjät eivät voi äänestää"
+
+#: contrib/comments/views/karma.py:25
+msgid "Invalid comment ID"
+msgstr "Kommentin tunniste on virheellinen"
+
+#: contrib/comments/views/karma.py:27
+msgid "No voting for yourself"
+msgstr "Itseään ei voi äänestää"
+
+#: contrib/contenttypes/models.py:67
+msgid "python model class name"
+msgstr "mallin python-luokan nimi"
+
+#: contrib/contenttypes/models.py:71
+msgid "content type"
+msgstr "sisältötyyppi"
+
+#: contrib/contenttypes/models.py:72
+msgid "content types"
+msgstr "sisältötyypit"
+
+#: contrib/flatpages/admin.py:9
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Esimerkki: '/tietoja/yhteystiedot/'. Varmista, että sekä alussa että lopussa "
+"on kauttaviiva."
+
+#: contrib/flatpages/admin.py:11 core/validators.py:76
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Tässä voidaan käyttää vain kirjaimia (a-z), numeroita (0-9) sekä ala-, tavu- "
+"ja kauttaviivoja (_ - /)."
+
+#: contrib/flatpages/admin.py:22
+msgid "Advanced options"
+msgstr "Lisäasetukset"
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "otsikko"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "sisältö"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "salli kommentit"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "mallipohjan nimi"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"Esimerkiksi: 'flatpages/yhteydenotto.html'. Jos tämä jätetään tyhjäksi, "
+"käytetään oletuspohjaa 'flatpages/default.html'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "vaaditaan rekisteröityminen"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+"Jos tämä kohta on valittu, vain sisäänkirjautuneet käyttäjät näkevät sivun."
+
+#: contrib/flatpages/models.py:19
+msgid "flat page"
+msgstr "tekstisivu"
+
+#: contrib/flatpages/models.py:20
+msgid "flat pages"
+msgstr "tekstisivut"
+
+#: contrib/gis/forms/fields.py:10
+msgid "No geometry value provided."
+msgstr "Geometria-arvoa ei annettu."
+
+#: contrib/gis/forms/fields.py:11
+#, fuzzy
+msgid "Invalid Geometry value."
+msgstr "Kommentin tunniste on virheellinen"
+
+#: contrib/gis/forms/fields.py:12
+#, fuzzy
+msgid "Invalid Geometry type."
+msgstr "Kommentin tunniste on virheellinen"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "th"
+msgstr "."
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "st"
+msgstr "."
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "nd"
+msgstr "."
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "rd"
+msgstr "."
+
+#: contrib/humanize/templatetags/humanize.py:51
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f miljoona"
+msgstr[1] "%(value).1f miljoonaa"
+
+#: contrib/humanize/templatetags/humanize.py:54
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f miljardi"
+msgstr[1] "%(value).1f miljardia"
+
+#: contrib/humanize/templatetags/humanize.py:57
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f triljoona"
+msgstr[1] "%(value).1f triljoonaa"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "one"
+msgstr "yksi"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "two"
+msgstr "kaksi"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "three"
+msgstr "kolme"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "four"
+msgstr "neljä"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "five"
+msgstr "viisi"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "six"
+msgstr "kuusi"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "seven"
+msgstr "seitsemän"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "eight"
+msgstr "kahdeksan"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "nine"
+msgstr "yhdeksän"
+
+#: contrib/humanize/templatetags/humanize.py:93
+msgid "today"
+msgstr "tänään"
+
+#: contrib/humanize/templatetags/humanize.py:95
+msgid "tomorrow"
+msgstr "huomenna"
+
+#: contrib/humanize/templatetags/humanize.py:97
+msgid "yesterday"
+msgstr "eilen"
+
+#: contrib/localflavor/ar/forms.py:27
+msgid "Enter a postal code in the format NNNN or ANNNNAAA."
+msgstr "Syötä postinumero muodossa NNNN tai ANNNNAAA."
+
+#: contrib/localflavor/ar/forms.py:49 contrib/localflavor/br/forms.py:96
+#: contrib/localflavor/br/forms.py:135 contrib/localflavor/pe/forms.py:23
+#: contrib/localflavor/pe/forms.py:51
+msgid "This field requires only numbers."
+msgstr "Tähän kenttään kelpaavat vain numerot."
+
+#: contrib/localflavor/ar/forms.py:50
+msgid "This field requires 7 or 8 digits."
+msgstr "Tähän kenttään vaaditaan 7 tai 8 numeroa."
+
+#: contrib/localflavor/ar/forms.py:79
+msgid "Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format."
+msgstr "Syötä validi CUIT joko XX-XXXXXXXX-X tai XXXXXXXXXXXX -muodossa."
+
+#: contrib/localflavor/ar/forms.py:80
+msgid "Invalid CUIT."
+msgstr "Virheellinen CUIT."
+
+#: contrib/localflavor/at/at_states.py:5
+#, fuzzy
+msgid "Burgenland"
+msgstr "Basel-Land"
+
+#: contrib/localflavor/at/at_states.py:6
+msgid "Carinthia"
+msgstr "Carinthia"
+
+#: contrib/localflavor/at/at_states.py:7
+msgid "Lower Austria"
+msgstr ""
+
+#: contrib/localflavor/at/at_states.py:8
+msgid "Upper Austria"
+msgstr ""
+
+#: contrib/localflavor/at/at_states.py:9
+#, fuzzy
+msgid "Salzburg"
+msgstr "Hampuri"
+
+#: contrib/localflavor/at/at_states.py:10
+#, fuzzy
+msgid "Styria"
+msgstr "serbia"
+
+#: contrib/localflavor/at/at_states.py:11
+#, fuzzy
+msgid "Tyrol"
+msgstr "Tokio"
+
+#: contrib/localflavor/at/at_states.py:12
+msgid "Vorarlberg"
+msgstr ""
+
+#: contrib/localflavor/at/at_states.py:13
+msgid "Vienna"
+msgstr ""
+
+#: contrib/localflavor/at/forms.py:20 contrib/localflavor/ch/forms.py:16
+#: contrib/localflavor/no/forms.py:12
+msgid "Enter a zip code in the format XXXX."
+msgstr "Syötä postinumero muodossa XXXX."
+
+#: contrib/localflavor/at/forms.py:48
+#, fuzzy
+msgid "Enter a valid Austrian Social Security Number in XXXX XXXXXX format."
+msgstr "Syötä oikea henkilötunnus."
+
+#: contrib/localflavor/au/forms.py:16
+msgid "Enter a 4 digit post code."
+msgstr "Syötä nelinumeroinen postinumero."
+
+#: contrib/localflavor/br/forms.py:21
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Syötä postinumero muodossa XXXXX-XXX."
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "Puhelinnumeron tulee olla muodossa XX-XXXX-XXXX."
+
+#: contrib/localflavor/br/forms.py:58
+msgid ""
+"Select a valid brazilian state. That state is not one of the available "
+"states."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:94
+msgid "Invalid CPF number."
+msgstr "Virheellinen CPF-numero."
+
+#: contrib/localflavor/br/forms.py:95
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr "Tämä kenttä vaatii vähintään 11 ja enintään 14 merkkiä."
+
+#: contrib/localflavor/br/forms.py:134
+msgid "Invalid CNPJ number."
+msgstr "Virheellinen CNPJ-numero."
+
+#: contrib/localflavor/br/forms.py:136
+msgid "This field requires at least 14 digits"
+msgstr "Tähän kenttään vaaditaan ainakin 14 numeroa."
+
+#: contrib/localflavor/ca/forms.py:17
+msgid "Enter a postal code in the format XXX XXX."
+msgstr "Syötä postinumero muodossa XXX XXX."
+
+#: contrib/localflavor/ca/forms.py:88
+#, fuzzy
+msgid "Enter a valid Canadian Social Insurance number in XXX-XXX-XXX format."
+msgstr "Syötä oikea norjalainen henkilötunnus."
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr "Aargau"
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr "Appenzell Innerrhoden"
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr "Appenzell Ausserrhoden"
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr "Basel-Stadt"
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr "Basel-Land"
+
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr "Berne"
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr "Fribourg"
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr "Geneve"
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr "Glarus"
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr "Graubuenden"
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr "Jura"
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr "Lucerne"
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr "Neuchatel"
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr "Nidwalden"
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr "Obwalden"
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr "Schaffhausen"
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr "Schwyz"
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr "Solothurn"
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr "St. Gallen"
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr "Thurgau"
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr "Ticino"
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr "Uri"
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr "Valais"
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr "Vaud"
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr "Zug"
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr "Zürich"
+
+#: contrib/localflavor/ch/forms.py:64
+msgid ""
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
+msgstr ""
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
+
+#: contrib/localflavor/cl/forms.py:29
+#, fuzzy
+msgid "Enter a valid Chilean RUT."
+msgstr "Syötä oikea chileläinen RUT"
+
+#: contrib/localflavor/cl/forms.py:30
+#, fuzzy
+msgid "Enter a valid Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr "Syötä postinumero muodossa XXXXX-XXX."
+
+#: contrib/localflavor/cl/forms.py:31
+#, fuzzy
+msgid "The Chilean RUT is not valid."
+msgstr "Tämä arvo ei kelpaa."
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr "Berliini"
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr "Bremen"
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr "Hampuri"
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr ""
+
+#: contrib/localflavor/de/forms.py:14 contrib/localflavor/fi/forms.py:12
+#: contrib/localflavor/fr/forms.py:15
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Syötä postinumero muodossa XXXXX."
+
+#: contrib/localflavor/de/forms.py:41
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:5
+#, fuzzy
+msgid "Arava"
+msgstr "Trnava"
+
+#: contrib/localflavor/es/es_provinces.py:6
+msgid "Albacete"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:7
+msgid "Alacant"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:8
+msgid "Almeria"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:9
+#, fuzzy
+msgid "Avila"
+msgstr "huhtikuu"
+
+#: contrib/localflavor/es/es_provinces.py:10
+#, fuzzy
+msgid "Badajoz"
+msgstr "Bardejov"
+
+#: contrib/localflavor/es/es_provinces.py:11
+msgid "Illes Balears"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:12
+#, fuzzy
+msgid "Barcelona"
+msgstr "makedonia"
+
+#: contrib/localflavor/es/es_provinces.py:13
+msgid "Burgos"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:14
+msgid "Caceres"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:15
+#, fuzzy
+msgid "Cadiz"
+msgstr "Cadca"
+
+#: contrib/localflavor/es/es_provinces.py:16
+msgid "Castello"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:17
+msgid "Ciudad Real"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:18
+msgid "Cordoba"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:19
+msgid "A Coruna"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:20
+#, fuzzy
+msgid "Cuenca"
+msgstr "Senica"
+
+#: contrib/localflavor/es/es_provinces.py:21
+msgid "Girona"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:22
+#, fuzzy
+msgid "Granada"
+msgstr "kannada"
+
+#: contrib/localflavor/es/es_provinces.py:23
+msgid "Guadalajara"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:24
+msgid "Guipuzkoa"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:25
+msgid "Huelva"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:26
+#, fuzzy
+msgid "Huesca"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:27
+#, fuzzy
+msgid "Jaen"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:28
+#, fuzzy
+msgid "Leon"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:29
+msgid "Lleida"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:30
+#: contrib/localflavor/es/es_regions.py:17
+msgid "La Rioja"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:31
+msgid "Lugo"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:32
+#: contrib/localflavor/es/es_regions.py:18
+#, fuzzy
+msgid "Madrid"
+msgstr "Martin"
+
+#: contrib/localflavor/es/es_provinces.py:33
+#, fuzzy
+msgid "Malaga"
+msgstr "Galanta"
+
+#: contrib/localflavor/es/es_provinces.py:34
+#, fuzzy
+msgid "Murcia"
+msgstr "Jura"
+
+#: contrib/localflavor/es/es_provinces.py:35
+msgid "Navarre"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:36
+msgid "Ourense"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:37
+msgid "Asturias"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:38
+#, fuzzy
+msgid "Palencia"
+msgstr "galicia"
+
+#: contrib/localflavor/es/es_provinces.py:39
+msgid "Las Palmas"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:40
+msgid "Pontevedra"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:41
+#, fuzzy
+msgid "Salamanca"
+msgstr "Galanta"
+
+#: contrib/localflavor/es/es_provinces.py:42
+msgid "Santa Cruz de Tenerife"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:43
+#: contrib/localflavor/es/es_regions.py:11
+#, fuzzy
+msgid "Cantabria"
+msgstr "katalaani"
+
+#: contrib/localflavor/es/es_provinces.py:44
+#, fuzzy
+msgid "Segovia"
+msgstr "slovenia"
+
+#: contrib/localflavor/es/es_provinces.py:45
+#, fuzzy
+msgid "Seville"
+msgstr "Levice"
+
+#: contrib/localflavor/es/es_provinces.py:46
+#, fuzzy
+msgid "Soria"
+msgstr "serbia"
+
+#: contrib/localflavor/es/es_provinces.py:47
+msgid "Tarragona"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:48
+#, fuzzy
+msgid "Teruel"
+msgstr "Ti"
+
+#: contrib/localflavor/es/es_provinces.py:49
+msgid "Toledo"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:50
+#, fuzzy
+msgid "Valencia"
+msgstr "galicia"
+
+#: contrib/localflavor/es/es_provinces.py:51
+#, fuzzy
+msgid "Valladolid"
+msgstr "Valais"
+
+#: contrib/localflavor/es/es_provinces.py:52
+msgid "Bizkaia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:53
+msgid "Zamora"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:54
+msgid "Zaragoza"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:55
+#, fuzzy
+msgid "Ceuta"
+msgstr "Detva"
+
+#: contrib/localflavor/es/es_provinces.py:56
+msgid "Melilla"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:5
+msgid "Andalusia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:6
+msgid "Aragon"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:7
+msgid "Principality of Asturias"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:8
+msgid "Balearic Islands"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:9
+msgid "Basque Country"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:10
+msgid "Canary Islands"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:12
+msgid "Castile-La Mancha"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:13
+msgid "Castile and Leon"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:14
+#, fuzzy
+msgid "Catalonia"
+msgstr "katalaani"
+
+#: contrib/localflavor/es/es_regions.py:15
+msgid "Extremadura"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:16
+#, fuzzy
+msgid "Galicia"
+msgstr "galicia"
+
+#: contrib/localflavor/es/es_regions.py:19
+msgid "Region of Murcia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:20
+msgid "Foral Community of Navarre"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:21
+msgid "Valencian Community"
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:19
+#, fuzzy
+msgid "Enter a valid postal code in the range and format 01XXX - 52XXX."
+msgstr "Syötä validi postinumero väliltä ja muodossa 01XXX-52XXX."
+
+#: contrib/localflavor/es/forms.py:39
+#, fuzzy
+msgid ""
+"Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or "
+"9XXXXXXXX."
+msgstr "Syötä postinumero muodossa XXXXX tai XXX XX."
+
+#: contrib/localflavor/es/forms.py:66
+#, fuzzy
+msgid "Please enter a valid NIF, NIE, or CIF."
+msgstr "IP-osoite ei kelpaa."
+
+#: contrib/localflavor/es/forms.py:67
+#, fuzzy
+msgid "Please enter a valid NIF or NIE."
+msgstr "Syöttämäsi %s ei kelpaa."
+
+#: contrib/localflavor/es/forms.py:68
+msgid "Invalid checksum for NIF."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:69
+msgid "Invalid checksum for NIE."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:70
+msgid "Invalid checksum for CIF."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:142
+msgid ""
+"Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:143
+msgid "Invalid checksum for bank account number."
+msgstr ""
+
+#: contrib/localflavor/fi/forms.py:28
+msgid "Enter a valid Finnish social security number."
+msgstr "Syötä oikea suomalainen henkilötunnus."
+
+#: contrib/localflavor/in_/forms.py:14
+msgid "Enter a zip code in the format XXXXXXX."
+msgstr "Syötä postinumero muodossa XXXXXXX."
+
+#: contrib/localflavor/is_/forms.py:17
+msgid ""
+"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr ""
+
+#: contrib/localflavor/is_/forms.py:18
+msgid "The Icelandic identification number is not valid."
+msgstr ""
+
+#: contrib/localflavor/it/forms.py:14
+msgid "Enter a valid zip code."
+msgstr "Syötä oikea postinumero."
+
+#: contrib/localflavor/it/forms.py:43
+msgid "Enter a valid Social Security number."
+msgstr "Syötä oikea henkilötunnus."
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr "Syötä oikea ALV-tunnus."
+
+#: contrib/localflavor/jp/forms.py:17
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr "Tokio"
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr "Kioto"
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:12
+msgid "Aguascalientes"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:13
+msgid "Baja California"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:14
+msgid "Baja California Sur"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:15
+#, fuzzy
+msgid "Campeche"
+msgstr "tšekki"
+
+#: contrib/localflavor/mx/mx_states.py:16
+msgid "Chihuahua"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:17
+msgid "Chiapas"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:18
+#, fuzzy
+msgid "Coahuila"
+msgstr "kroatia"
+
+#: contrib/localflavor/mx/mx_states.py:19
+msgid "Colima"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:20
+msgid "Distrito Federal"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:21
+msgid "Durango"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:22
+#, fuzzy
+msgid "Guerrero"
+msgstr "Palvelinvirhe"
+
+#: contrib/localflavor/mx/mx_states.py:23
+msgid "Guanajuato"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:24
+msgid "Hidalgo"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:25
+#, fuzzy
+msgid "Jalisco"
+msgstr "Valais"
+
+#: contrib/localflavor/mx/mx_states.py:26
+msgid "Estado de México"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:27
+#, fuzzy
+msgid "Michoacán"
+msgstr "Michalovce"
+
+#: contrib/localflavor/mx/mx_states.py:28
+msgid "Morelos"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:29
+msgid "Nayarit"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:30
+msgid "Nuevo León"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:31
+msgid "Oaxaca"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:32
+msgid "Puebla"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:33
+msgid "Querétaro"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:34
+msgid "Quintana Roo"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:35
+#, fuzzy
+msgid "Sinaloa"
+msgstr "Sala"
+
+#: contrib/localflavor/mx/mx_states.py:36
+msgid "San Luis Potosí"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:37
+msgid "Sonora"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:38
+msgid "Tabasco"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:39
+msgid "Tamaulipas"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:40
+msgid "Tlaxcala"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:41
+msgid "Veracruz"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:42
+msgid "Yucatán"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:43
+msgid "Zacatecas"
+msgstr ""
+
+#: contrib/localflavor/nl/forms.py:21
+msgid "Enter a valid postal code"
+msgstr "Syötä oikea postinumero."
+
+#: contrib/localflavor/nl/forms.py:52
+msgid "Enter a valid phone number"
+msgstr "Syötä oikea puhelinnumero."
+
+#: contrib/localflavor/nl/forms.py:78
+msgid "Enter a valid SoFi number"
+msgstr "Syötä ikea SoFi-numero."
+
+#: contrib/localflavor/nl/nl_provinces.py:4
+msgid "Drente"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:5
+msgid "Flevoland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:6
+msgid "Friesland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:7
+msgid "Gelderland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:8
+msgid "Groningen"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:9
+msgid "Limburg"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:10
+msgid "Noord-Brabant"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:11
+msgid "Noord-Holland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:12
+msgid "Overijssel"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:13
+msgid "Utrecht"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:14
+msgid "Zeeland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:15
+msgid "Zuid-Holland"
+msgstr ""
+
+#: contrib/localflavor/no/forms.py:33
+msgid "Enter a valid Norwegian social security number."
+msgstr "Syötä oikea norjalainen henkilötunnus."
+
+#: contrib/localflavor/pe/forms.py:24
+#, fuzzy
+msgid "This field requires 8 digits."
+msgstr "Tähän kenttään vaaditaan 7 tai 8 numeroa."
+
+#: contrib/localflavor/pe/forms.py:52
+#, fuzzy
+msgid "This field requires 11 digits."
+msgstr "Tähän kenttään vaaditaan 7 tai 8 numeroa."
+
+#: contrib/localflavor/pl/forms.py:38
+msgid "National Identification Number consists of 11 digits."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:39
+msgid "Wrong checksum for the National Identification Number."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:71
+msgid ""
+"Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:72
+msgid "Wrong checksum for the Tax Number (NIP)."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:111
+msgid "National Business Register Number (REGON) consists of 7 or 9 digits."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:112
+msgid "Wrong checksum for the National Business Register Number (REGON)."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:155
+msgid "Enter a postal code in the format XX-XXX."
+msgstr "Syötä postinumero muodossa XX-XXX."
+
+#: contrib/localflavor/pl/pl_voivodeships.py:8
+msgid "Lower Silesia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:9
+msgid "Kuyavia-Pomerania"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:10
+msgid "Lublin"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:11
+msgid "Lubusz"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:12
+msgid "Lodz"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:13
+msgid "Lesser Poland"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:14
+msgid "Masovia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:15
+msgid "Opole"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:16
+msgid "Subcarpatia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:17
+msgid "Podlasie"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:18
+msgid "Pomerania"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:19
+msgid "Silesia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:20
+msgid "Swietokrzyskie"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:21
+msgid "Warmia-Masuria"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:22
+msgid "Greater Poland"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:23
+msgid "West Pomerania"
+msgstr ""
+
+#: contrib/localflavor/ro/forms.py:19
+#, fuzzy
+msgid "Enter a valid CIF."
+msgstr "Syötä oikea URL-osoite."
+
+#: contrib/localflavor/ro/forms.py:56
+#, fuzzy
+msgid "Enter a valid CNP."
+msgstr "Syötä oikea URL-osoite."
+
+#: contrib/localflavor/ro/forms.py:141
+msgid "Enter a valid IBAN in ROXX-XXXX-XXXX-XXXX-XXXX-XXXX format"
+msgstr ""
+
+#: contrib/localflavor/ro/forms.py:171
+#, fuzzy
+msgid "Phone numbers must be in XXXX-XXXXXX format."
+msgstr "Puhelinnumeron tulee olla muodossa XX-XXXX-XXXX."
+
+#: contrib/localflavor/ro/forms.py:194
+#, fuzzy
+msgid "Enter a valid postal code in the format XXXXXX"
+msgstr "Syötä postinumero muodossa XXX XXX."
+
+#: contrib/localflavor/sk/forms.py:30
+msgid "Enter a postal code in the format XXXXX or XXX XX."
+msgstr "Syötä postinumero muodossa XXXXX tai XXX XX."
+
+#: contrib/localflavor/sk/sk_districts.py:8
+msgid "Banska Bystrica"
+msgstr "Banska Bystrica"
+
+#: contrib/localflavor/sk/sk_districts.py:9
+msgid "Banska Stiavnica"
+msgstr "Banska Stiavnica"
+
+#: contrib/localflavor/sk/sk_districts.py:10
+msgid "Bardejov"
+msgstr "Bardejov"
+
+#: contrib/localflavor/sk/sk_districts.py:11
+msgid "Banovce nad Bebravou"
+msgstr "Banovce nad Bebravou"
+
+#: contrib/localflavor/sk/sk_districts.py:12
+msgid "Brezno"
+msgstr "Brezno"
+
+#: contrib/localflavor/sk/sk_districts.py:13
+msgid "Bratislava I"
+msgstr "Bratislava I"
+
+#: contrib/localflavor/sk/sk_districts.py:14
+msgid "Bratislava II"
+msgstr "Bratislava II"
+
+#: contrib/localflavor/sk/sk_districts.py:15
+msgid "Bratislava III"
+msgstr "Bratislava III"
+
+#: contrib/localflavor/sk/sk_districts.py:16
+msgid "Bratislava IV"
+msgstr "Bratislava IV"
+
+#: contrib/localflavor/sk/sk_districts.py:17
+msgid "Bratislava V"
+msgstr "Bratislava V"
+
+#: contrib/localflavor/sk/sk_districts.py:18
+msgid "Bytca"
+msgstr "Bytca"
+
+#: contrib/localflavor/sk/sk_districts.py:19
+msgid "Cadca"
+msgstr "Cadca"
+
+#: contrib/localflavor/sk/sk_districts.py:20
+msgid "Detva"
+msgstr "Detva"
+
+#: contrib/localflavor/sk/sk_districts.py:21
+msgid "Dolny Kubin"
+msgstr "Dolny Kubin"
+
+#: contrib/localflavor/sk/sk_districts.py:22
+msgid "Dunajska Streda"
+msgstr "Dunajska Streda"
+
+#: contrib/localflavor/sk/sk_districts.py:23
+msgid "Galanta"
+msgstr "Galanta"
+
+#: contrib/localflavor/sk/sk_districts.py:24
+msgid "Gelnica"
+msgstr "Gelnica"
+
+#: contrib/localflavor/sk/sk_districts.py:25
+msgid "Hlohovec"
+msgstr "Hlohovec"
+
+#: contrib/localflavor/sk/sk_districts.py:26
+msgid "Humenne"
+msgstr "Humenne"
+
+#: contrib/localflavor/sk/sk_districts.py:27
+msgid "Ilava"
+msgstr "Ilava"
+
+#: contrib/localflavor/sk/sk_districts.py:28
+msgid "Kezmarok"
+msgstr "Kezmarok"
+
+#: contrib/localflavor/sk/sk_districts.py:29
+msgid "Komarno"
+msgstr "Komarno"
+
+#: contrib/localflavor/sk/sk_districts.py:30
+msgid "Kosice I"
+msgstr "Kosice I"
+
+#: contrib/localflavor/sk/sk_districts.py:31
+msgid "Kosice II"
+msgstr "Kosice II"
+
+#: contrib/localflavor/sk/sk_districts.py:32
+msgid "Kosice III"
+msgstr "Kosice III"
+
+#: contrib/localflavor/sk/sk_districts.py:33
+msgid "Kosice IV"
+msgstr "Kosice IV"
+
+#: contrib/localflavor/sk/sk_districts.py:34
+msgid "Kosice - okolie"
+msgstr "Kosice - okolie"
+
+#: contrib/localflavor/sk/sk_districts.py:35
+msgid "Krupina"
+msgstr "Krupina"
+
+#: contrib/localflavor/sk/sk_districts.py:36
+msgid "Kysucke Nove Mesto"
+msgstr "Kysucke Nove Mesto"
+
+#: contrib/localflavor/sk/sk_districts.py:37
+msgid "Levice"
+msgstr "Levice"
+
+#: contrib/localflavor/sk/sk_districts.py:38
+msgid "Levoca"
+msgstr "Levoca"
+
+#: contrib/localflavor/sk/sk_districts.py:39
+msgid "Liptovsky Mikulas"
+msgstr "Liptovsky Mikulas"
+
+#: contrib/localflavor/sk/sk_districts.py:40
+msgid "Lucenec"
+msgstr "Lucenec"
+
+#: contrib/localflavor/sk/sk_districts.py:41
+msgid "Malacky"
+msgstr "Malacky"
+
+#: contrib/localflavor/sk/sk_districts.py:42
+msgid "Martin"
+msgstr "Martin"
+
+#: contrib/localflavor/sk/sk_districts.py:43
+msgid "Medzilaborce"
+msgstr "Medzilaborce"
+
+#: contrib/localflavor/sk/sk_districts.py:44
+msgid "Michalovce"
+msgstr "Michalovce"
+
+#: contrib/localflavor/sk/sk_districts.py:45
+msgid "Myjava"
+msgstr "Myjava"
+
+#: contrib/localflavor/sk/sk_districts.py:46
+msgid "Namestovo"
+msgstr "Namestovo"
+
+#: contrib/localflavor/sk/sk_districts.py:47
+msgid "Nitra"
+msgstr "Nitra"
+
+#: contrib/localflavor/sk/sk_districts.py:48
+msgid "Nove Mesto nad Vahom"
+msgstr "Nove Mesto nad Vahom"
+
+#: contrib/localflavor/sk/sk_districts.py:49
+msgid "Nove Zamky"
+msgstr "Nove Zamky"
+
+#: contrib/localflavor/sk/sk_districts.py:50
+msgid "Partizanske"
+msgstr "Partizanske"
+
+#: contrib/localflavor/sk/sk_districts.py:51
+msgid "Pezinok"
+msgstr "Pezinok"
+
+#: contrib/localflavor/sk/sk_districts.py:52
+msgid "Piestany"
+msgstr "Piestany"
+
+#: contrib/localflavor/sk/sk_districts.py:53
+msgid "Poltar"
+msgstr "Poltar"
+
+#: contrib/localflavor/sk/sk_districts.py:54
+msgid "Poprad"
+msgstr "Poprad"
+
+#: contrib/localflavor/sk/sk_districts.py:55
+msgid "Povazska Bystrica"
+msgstr "Povazska Bystrica"
+
+#: contrib/localflavor/sk/sk_districts.py:56
+msgid "Presov"
+msgstr "Presov"
+
+#: contrib/localflavor/sk/sk_districts.py:57
+msgid "Prievidza"
+msgstr "Prievidza"
+
+#: contrib/localflavor/sk/sk_districts.py:58
+msgid "Puchov"
+msgstr "Puchov"
+
+#: contrib/localflavor/sk/sk_districts.py:59
+msgid "Revuca"
+msgstr "Revuca"
+
+#: contrib/localflavor/sk/sk_districts.py:60
+msgid "Rimavska Sobota"
+msgstr "Rimavska Sobota"
+
+#: contrib/localflavor/sk/sk_districts.py:61
+msgid "Roznava"
+msgstr "Roznava"
+
+#: contrib/localflavor/sk/sk_districts.py:62
+msgid "Ruzomberok"
+msgstr "Ruzomberok"
+
+#: contrib/localflavor/sk/sk_districts.py:63
+msgid "Sabinov"
+msgstr "Sabinov"
+
+#: contrib/localflavor/sk/sk_districts.py:64
+msgid "Senec"
+msgstr "Senec"
+
+#: contrib/localflavor/sk/sk_districts.py:65
+msgid "Senica"
+msgstr "Senica"
+
+#: contrib/localflavor/sk/sk_districts.py:66
+msgid "Skalica"
+msgstr "Skalica"
+
+#: contrib/localflavor/sk/sk_districts.py:67
+msgid "Snina"
+msgstr "Snina"
+
+#: contrib/localflavor/sk/sk_districts.py:68
+msgid "Sobrance"
+msgstr "Sobrance"
+
+#: contrib/localflavor/sk/sk_districts.py:69
+msgid "Spisska Nova Ves"
+msgstr "Spisska Nova Ves"
+
+#: contrib/localflavor/sk/sk_districts.py:70
+msgid "Stara Lubovna"
+msgstr "Stara Lubovna"
+
+#: contrib/localflavor/sk/sk_districts.py:71
+msgid "Stropkov"
+msgstr "Stropkov"
+
+#: contrib/localflavor/sk/sk_districts.py:72
+msgid "Svidnik"
+msgstr "Svidnik"
+
+#: contrib/localflavor/sk/sk_districts.py:73
+msgid "Sala"
+msgstr "Sala"
+
+#: contrib/localflavor/sk/sk_districts.py:74
+msgid "Topolcany"
+msgstr "Topolcany"
+
+#: contrib/localflavor/sk/sk_districts.py:75
+msgid "Trebisov"
+msgstr "Trebisov"
+
+#: contrib/localflavor/sk/sk_districts.py:76
+msgid "Trencin"
+msgstr "Trencin"
+
+#: contrib/localflavor/sk/sk_districts.py:77
+msgid "Trnava"
+msgstr "Trnava"
+
+#: contrib/localflavor/sk/sk_districts.py:78
+msgid "Turcianske Teplice"
+msgstr "Turcianske Teplice"
+
+#: contrib/localflavor/sk/sk_districts.py:79
+msgid "Tvrdosin"
+msgstr "Tvrdosin"
+
+#: contrib/localflavor/sk/sk_districts.py:80
+msgid "Velky Krtis"
+msgstr "Velky Krtis"
+
+#: contrib/localflavor/sk/sk_districts.py:81
+msgid "Vranov nad Toplou"
+msgstr "Vranov nad Toplou"
+
+#: contrib/localflavor/sk/sk_districts.py:82
+msgid "Zlate Moravce"
+msgstr "Zlate Moravce"
+
+#: contrib/localflavor/sk/sk_districts.py:83
+msgid "Zvolen"
+msgstr "Zvolen"
+
+#: contrib/localflavor/sk/sk_districts.py:84
+msgid "Zarnovica"
+msgstr "Zarnovica"
+
+#: contrib/localflavor/sk/sk_districts.py:85
+msgid "Ziar nad Hronom"
+msgstr "Ziar nad Hronom"
+
+#: contrib/localflavor/sk/sk_districts.py:86
+msgid "Zilina"
+msgstr "Zilina"
+
+#: contrib/localflavor/sk/sk_regions.py:8
+msgid "Banska Bystrica region"
+msgstr "Banská Bystrican aule"
+
+#: contrib/localflavor/sk/sk_regions.py:9
+msgid "Bratislava region"
+msgstr "Bratislavan alue"
+
+#: contrib/localflavor/sk/sk_regions.py:10
+msgid "Kosice region"
+msgstr "Košicen alue"
+
+#: contrib/localflavor/sk/sk_regions.py:11
+msgid "Nitra region"
+msgstr "Nitran alue"
+
+#: contrib/localflavor/sk/sk_regions.py:12
+msgid "Presov region"
+msgstr "Prešovin alue"
+
+#: contrib/localflavor/sk/sk_regions.py:13
+msgid "Trencin region"
+msgstr "Trenčínin alue"
+
+#: contrib/localflavor/sk/sk_regions.py:14
+msgid "Trnava region"
+msgstr "Trnava region"
+
+#: contrib/localflavor/sk/sk_regions.py:15
+msgid "Zilina region"
+msgstr "Zilina region"
+
+#: contrib/localflavor/uk/forms.py:21
+#, fuzzy
+msgid "Enter a valid postcode."
+msgstr "Syötä oikea postinumero."
+
+#: contrib/localflavor/uk/uk_regions.py:11
+msgid "Bedfordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:12
+msgid "Buckinghamshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:14
+msgid "Cheshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:15
+msgid "Cornwall and Isles of Scilly"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:16
+msgid "Cumbria"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:17
+msgid "Derbyshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:18
+#, fuzzy
+msgid "Devon"
+msgstr "seitsemän"
+
+#: contrib/localflavor/uk/uk_regions.py:19
+msgid "Dorset"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:20
+#, fuzzy
+msgid "Durham"
+msgstr "Jura"
+
+#: contrib/localflavor/uk/uk_regions.py:21
+msgid "East Sussex"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:22
+msgid "Essex"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:23
+msgid "Gloucestershire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:24
+msgid "Greater London"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:25
+msgid "Greater Manchester"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:26
+msgid "Hampshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:27
+msgid "Hertfordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:28
+#, fuzzy
+msgid "Kent"
+msgstr "korea"
+
+#: contrib/localflavor/uk/uk_regions.py:29
+msgid "Lancashire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:30
+msgid "Leicestershire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:31
+msgid "Lincolnshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:32
+msgid "Merseyside"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:33
+msgid "Norfolk"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:34
+msgid "North Yorkshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:35
+msgid "Northamptonshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:36
+msgid "Northumberland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:37
+msgid "Nottinghamshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:38
+msgid "Oxfordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:39
+msgid "Shropshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:40
+msgid "Somerset"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:41
+msgid "South Yorkshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:42
+msgid "Staffordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:43
+msgid "Suffolk"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:44
+#, fuzzy
+msgid "Surrey"
+msgstr "Tällä hetkellä:"
+
+#: contrib/localflavor/uk/uk_regions.py:45
+msgid "Tyne and Wear"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:46
+msgid "Warwickshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:47
+msgid "West Midlands"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:48
+msgid "West Sussex"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:49
+msgid "West Yorkshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:50
+msgid "Wiltshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:51
+msgid "Worcestershire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:55
+msgid "County Antrim"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:56
+msgid "County Armagh"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:57
+msgid "County Down"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:58
+msgid "County Fermanagh"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:59
+msgid "County Londonderry"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:60
+msgid "County Tyrone"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:64
+msgid "Clwyd"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:65
+msgid "Dyfed"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:66
+msgid "Gwent"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:67
+msgid "Gwynedd"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:68
+msgid "Mid Glamorgan"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:69
+msgid "Powys"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:70
+msgid "South Glamorgan"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:71
+msgid "West Glamorgan"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:75
+#, fuzzy
+msgid "Borders"
+msgstr "Järjestysnumero:"
+
+#: contrib/localflavor/uk/uk_regions.py:76
+msgid "Central Scotland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:77
+msgid "Dumfries and Galloway"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:78
+#, fuzzy
+msgid "Fife"
+msgstr "Suodatin"
+
+#: contrib/localflavor/uk/uk_regions.py:79
+#, fuzzy
+msgid "Grampian"
+msgstr "saksa"
+
+#: contrib/localflavor/uk/uk_regions.py:80
+msgid "Highland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:81
+#, fuzzy
+msgid "Lothian"
+msgstr "latvia"
+
+#: contrib/localflavor/uk/uk_regions.py:82
+msgid "Orkney Islands"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:83
+msgid "Shetland Islands"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:84
+msgid "Strathclyde"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:85
+msgid "Tayside"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:86
+msgid "Western Isles"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:90
+#, fuzzy
+msgid "England"
+msgstr "ja"
+
+#: contrib/localflavor/uk/uk_regions.py:91
+msgid "Northern Ireland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:92
+msgid "Scotland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:93
+#, fuzzy
+msgid "Wales"
+msgstr "wales"
+
+#: contrib/localflavor/us/forms.py:16
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr ""
+
+#: contrib/localflavor/us/forms.py:54
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr ""
+
+#: contrib/localflavor/za/forms.py:20
+#, fuzzy
+msgid "Enter a valid South African ID number"
+msgstr "Syötä ikea SoFi-numero."
+
+#: contrib/localflavor/za/forms.py:54
+#, fuzzy
+msgid "Enter a valid South African postal code"
+msgstr "Syötä oikea postinumero."
+
+#: contrib/localflavor/za/za_provinces.py:4
+#, fuzzy
+msgid "Eastern Cape"
+msgstr "Käyttäjätunnus"
+
+#: contrib/localflavor/za/za_provinces.py:5
+#, fuzzy
+msgid "Free State"
+msgstr "pisteytyspäivä"
+
+#: contrib/localflavor/za/za_provinces.py:6
+#, fuzzy
+msgid "Gauteng"
+msgstr "elo"
+
+#: contrib/localflavor/za/za_provinces.py:7
+msgid "KwaZulu-Natal"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:8
+msgid "Limpopo"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:9
+msgid "Mpumalanga"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:10
+msgid "Northern Cape"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:11
+msgid "North West"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:12
+#, fuzzy
+msgid "Western Cape"
+msgstr "Käyttäjätunnus"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "ohjaa osoitteesta"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Tässä on käytettävä absoluuttista polkua ilman verkkotunnusta. Esimerkki: "
+"'\\\n"
+"events/search/'"
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "ohjaa osoitteeseen"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Tässä on käytettävä joko absoluuttista polkua (kuten yllä) tai täydellistä "
+"'http://'-alkuista URL-osoitetta."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "edelleenohjaus"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "edelleenohjaukset"
+
+#: contrib/sessions/models.py:45
+msgid "session key"
+msgstr "istunnon avain"
+
+#: contrib/sessions/models.py:47
+msgid "session data"
+msgstr "istunnon tiedot"
+
+#: contrib/sessions/models.py:48
+msgid "expire date"
+msgstr "vanhenee"
+
+#: contrib/sessions/models.py:53
+msgid "session"
+msgstr "istunto"
+
+#: contrib/sessions/models.py:54
+msgid "sessions"
+msgstr "istunnot"
+
+#: contrib/sites/models.py:32
+msgid "domain name"
+msgstr "domain-nimi"
+
+#: contrib/sites/models.py:33
+msgid "display name"
+msgstr "näyttönimi"
+
+#: contrib/sites/models.py:39
+msgid "sites"
+msgstr "sivustot"
+
+#: core/validators.py:80
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr ""
+"Tässä voidaan käyttää vain kirjaimia (a-z), numeroita (0-9) sekä ala- ja "
+"tavuviivoja (_ -)."
+
+#: core/validators.py:84
+msgid "Uppercase letters are not allowed here."
+msgstr "Isot kirjaimet (ABC) eivät kelpaa tässä."
+
+#: core/validators.py:88
+msgid "Lowercase letters are not allowed here."
+msgstr "Pienet kirjaimet (abc) eivät kelpaa tässä."
+
+#: core/validators.py:95
+msgid "Enter only digits separated by commas."
+msgstr "Vain pilkulla erotetut luvut kelpaavat tässä."
+
+#: core/validators.py:107
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Syötä sähköpostiosoitteita pilkuilla erotettuina."
+
+#: core/validators.py:111
+msgid "Please enter a valid IP address."
+msgstr "IP-osoite ei kelpaa."
+
+#: core/validators.py:115
+msgid "Empty values are not allowed here."
+msgstr "Tätä kohtaa ei voi jättää tyhjäksi."
+
+#: core/validators.py:119
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Vain numerot (0-9) kelpaavat tässä."
+
+#: core/validators.py:123
+msgid "This value can't be comprised solely of digits."
+msgstr "Tarvitaan vähintään yksi merkki, joka ei ole numero (0-9)."
+
+#: core/validators.py:128 forms/fields.py:161
+msgid "Enter a whole number."
+msgstr "Syötä kokonaisluku."
+
+#: core/validators.py:132
+msgid "Only alphabetical characters are allowed here."
+msgstr "Vain kirjaimet kelpaavat tässä."
+
+#: core/validators.py:147
+#, python-format
+msgid "Invalid date: %s"
+msgstr "Päivämäärä %s ei kelpaa"
+
+#: core/validators.py:152 db/models/fields/__init__.py:546
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Päivämäärän pitää olla muodossa VVVV-KK-PP."
+
+#: core/validators.py:157
+msgid "Enter a valid time in HH:MM format."
+msgstr "Ajan täytyy olla muodossa TT:MM."
+
+#: core/validators.py:161
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Ajankohdan pitää olla muodossa VVVV-KK-PP TT:MM."
+
+#: core/validators.py:166 forms/fields.py:422
+msgid "Enter a valid e-mail address."
+msgstr "Syötä kelvollinen sähköpostiosoite."
+
+#: core/validators.py:178 core/validators.py:470 forms/fields.py:440
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Tiedostoa ei lähetetty. Tarkista lomakkeen koodaus (encoding)."
+
+#: core/validators.py:189 forms/fields.py:471
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Kuva ei kelpaa. Lähettämäsi tiedosto ei ole kuva, tai tiedosto on vioittunut."
+
+#: core/validators.py:196
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "Osoittessa %s ei ole kuvaa tai se on vioittunut."
+
+#: core/validators.py:200
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "Puhelinnumeron tulee olla muodossa XXX-XXX-XXXX. \"%s\" ei kelpaa."
+
+#: core/validators.py:208
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "Osoitteessa %s ei ole QuickTime-videota tai se on vioittunut."
+
+#: core/validators.py:212
+msgid "A valid URL is required."
+msgstr "URL-osoite ei kelpaa."
+
+#: core/validators.py:226
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"HTML-koodi ei kelpaa. Virheilmoitus on:\n"
+"%s"
+
+#: core/validators.py:233
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Vääränmuotoinen XML: %s"
+
+#: core/validators.py:250
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "URL-osoite %s ei kelpaa."
+
+#: core/validators.py:255 core/validators.py:257
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "Osoite %s on rikkoutunut tai väärä linkki."
+
+#: core/validators.py:263
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Syötä USA:n osavaltion lyhenne."
+
+#: core/validators.py:277
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Siivoa suusi! Sanaa \"%s\" ei saa käyttää tässä."
+msgstr[1] "Siivoa suusi! Sanoja \"%s\" ei saa käyttää tässä."
+
+#: core/validators.py:284
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Arvon täytyy olla sama kuin kentässä '%s'."
+
+#: core/validators.py:303
+msgid "Please enter something for at least one field."
+msgstr "Täytä ainakin yksi kenttä."
+
+#: core/validators.py:312 core/validators.py:323
+msgid "Please enter both fields or leave them both empty."
+msgstr "Täytä tai jätä tyhjäksi kummatkin kentät."
+
+#: core/validators.py:331
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Tämä kenttä pitää täyttää, jos %(field)s on %(value)s."
+
+#: core/validators.py:344
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Tämä kenttä pitää täyttää, jos %(field)s ei ole %(value)s."
+
+#: core/validators.py:363
+msgid "Duplicate values are not allowed."
+msgstr "Samaa arvoa ei voi käyttää kahdesti."
+
+#: core/validators.py:378
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Tämän luvun on oltava välillä %(lower)s–%(upper)s."
+
+#: core/validators.py:380
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Tämän luvun on oltava vähintään %s."
+
+#: core/validators.py:382
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Tämän luvun on oltava enintään %s."
+
+#: core/validators.py:423
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Tämän luvun on oltava %s:n potenssi."
+
+#: core/validators.py:433
+msgid "Please enter a valid decimal number."
+msgstr "Desimaaliluku ei kelpaa."
+
+#: core/validators.py:440
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] ""
+"Desimaaliluvussa saa tässä olla yhteensä vain %s merkitsevä numero. Huomaa, "
+"että desimaalierottimena käytetään pilkun (,) sijasta pistettä (.)."
+msgstr[1] ""
+"Desimaaliluvussa saa tässä olla yhteensä vain %s merkitsevää numeroa. "
+"Huomaa, että desimaalierottimena käytetään pilkun (,) sijasta pistettä (.)."
+
+#: core/validators.py:443
+#, python-format
+msgid ""
+"Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural ""
+"Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] ""
+"Desimaaliluvun kokonaisosassa saa tässä olla vain %s numero. Huomaa, että "
+"desimaalierottimena käytetään pilkun (,) sijasta pistettä (.)."
+msgstr[1] ""
+"Desimaaliluvun kokonaisosassa saa tässä olla vain %s numeroa. Huomaa, että "
+"desimaalierottimena käytetään pilkun (,) sijasta pistettä (.)."
+
+#: core/validators.py:446
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] ""
+"Tässä saa olla vain %s desimaali. Huomaa, että desimaalierottimena käytetään "
+"pilkun (,) sijasta pistettä (.)."
+msgstr[1] ""
+"Tässä saa olla vain %s desimaalia. Huomaa, että desimaalierottimena "
+"käytetään pilkun (,) sijasta pistettä (.)."
+
+#: core/validators.py:454
+msgid "Please enter a valid floating point number."
+msgstr "Syötä liukuluku."
+
+#: core/validators.py:463
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Lähetä vähintään %s tavun kokoinen tiedosto."
+
+#: core/validators.py:464
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Lähetä enintään %s tavun kokoinen tiedosto."
+
+#: core/validators.py:481
+msgid "The format for this field is wrong."
+msgstr "Muoto ei kelpaa."
+
+#: core/validators.py:496
+msgid "This field is invalid."
+msgstr "Tämä arvo ei kelpaa."
+
+#: core/validators.py:532
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Tietoja ei voida noutaa kohteesta: %s."
+
+#: core/validators.py:535
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"Osoitteesta %(url)s saatiin virheellinen Content-Type '%(contenttype)s'."
+
+#: core/validators.py:568
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Rivillä %(line)s oleva tagi %(tag)s pitää sulkea. (Rivi alkaa \"%(start)s\")"
+
+#: core/validators.py:572
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Rivillä %(line)s on tekstiä, joka ei kelpaa tässä yhteydessä. (Rivi alkaa \"%"
+"(start)s\")"
+
+#: core/validators.py:577
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"Rivillä %(line)s attribuutti %(attr)s ei kelpaa. (Rivi alkaa \"%(start)s\")"
+
+#: core/validators.py:582
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"Rivillä %(line)s tagi \"<%(tag)s>\" ei kelpaa. (Rivi alkaa \"%(start)s\")"
+
+#: core/validators.py:586
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Rivillä %(line)s yhdestä tagista puuttuu yksi tai useampi attribuutti. (Rivi "
+"alkaa \"%(start)s\")"
+
+#: core/validators.py:591
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Rivillä %(line)s attribuutin %(attr)s arvo ei kelpaa. (Rivi alkaa \"%(start)s"
+"\")"
+
+#: db/models/manipulators.py:304
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(field)s omaa jo kohteen %(object)s, joka on tyyppiä %(type)s."
+
+#: db/models/fields/__init__.py:46
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s, jolla on tämä %(fieldname)s, on jo olemassa."
+
+#: db/models/fields/__init__.py:320 db/models/fields/files.py:168
+#: db/models/fields/files.py:179 forms/fields.py:52 oldforms/__init__.py:370
+msgid "This field is required."
+msgstr "Tämä kenttä vaaditaan."
+
+#: db/models/fields/__init__.py:434
+msgid "This value must be an integer."
+msgstr "Tarvitaan kokonaisluku."
+
+#: db/models/fields/__init__.py:480
+msgid "This value must be either True or False."
+msgstr "Tarvitaan tosi (True) tai epätosi (False)."
+
+#: db/models/fields/__init__.py:509
+msgid "This field cannot be null."
+msgstr "Tämän kentän arvo ei voi olla \"null\"."
+
+#: db/models/fields/__init__.py:611 db/models/fields/__init__.py:628
+#, fuzzy
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format."
+msgstr "Ajankohdan pitää olla muodossa VVVV-KK-PP TT:MM."
+
+#: db/models/fields/__init__.py:684
+msgid "This value must be a decimal number."
+msgstr "Tähän tarvitaan desimaaliluku."
+
+#: db/models/fields/__init__.py:825
+msgid "This value must be either None, True or False."
+msgstr "Tähän tarvitaan tyhjä (None), tosi (True) tai epätosi (False)."
+
+#: db/models/fields/__init__.py:937 db/models/fields/__init__.py:950
+#, fuzzy
+msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format."
+msgstr "Ajan täytyy olla muodossa TT:MM."
+
+#: db/models/fields/files.py:188
+msgid "Enter a valid filename."
+msgstr "Tiedostonimi ei kelpaa."
+
+#: db/models/fields/related.py:92
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Syöttämäsi %s ei kelpaa."
+
+#: db/models/fields/related.py:776
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+" Pidä \"Ctrl\"-näppäin (tai Macin \"Command\") pohjassa valitaksesi useita "
+"vaihtoehtoja."
+
+#: db/models/fields/related.py:856
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "Syöttämäsi %(self)s-tunniste %(value)r ei kelpaa."
+msgstr[1] "Syöttämäsi %(self)s-tunnisteet %(value)r eivät kelpaa."
+
+#: forms/fields.py:53
+msgid "Enter a valid value."
+msgstr "Syötä oikea arvo."
+
+#: forms/fields.py:133
+#, python-format
+msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+msgstr "Tähän kelpaa enintään %(max)d merkkiä (nyt niitä on %(length)d)."
+
+#: forms/fields.py:134
+#, python-format
+msgid "Ensure this value has at least %(min)d characters (it has %(length)d)."
+msgstr "Tähän tarvitaan vähintään %(min)d merkkiä (nyt on vain %(length)d)."
+
+#: forms/fields.py:162 forms/fields.py:191 forms/fields.py:220
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Tämän luvun on oltava enintään %s."
+
+#: forms/fields.py:163 forms/fields.py:192 forms/fields.py:221
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Tämän luvun on oltava vähintään %s."
+
+#: forms/fields.py:190 forms/fields.py:219
+msgid "Enter a number."
+msgstr "Syötä kokonaisluku."
+
+#: forms/fields.py:222
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr "Tässä luvussa voi olla yhteensä enintään %s numeroa."
+
+#: forms/fields.py:223
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr "Tässä luvussa saa olla enintään %s desimaalia."
+
+#: forms/fields.py:224
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr "Tässä luvussa saa olla enintään %s numeroa ennen desimaalipilkkua."
+
+#: forms/fields.py:282 forms/fields.py:803
+msgid "Enter a valid date."
+msgstr "Syötä oikea päivämäärä."
+
+#: forms/fields.py:315 forms/fields.py:804
+msgid "Enter a valid time."
+msgstr "Syötä oikea kellonaika."
+
+#: forms/fields.py:354
+msgid "Enter a valid date/time."
+msgstr "Syötä oikea pvm/kellonaika."
+
+#: forms/fields.py:441
+msgid "No file was submitted."
+msgstr "Yhtään tiedostoa ei ole lähetetty."
+
+#: forms/fields.py:442 oldforms/__init__.py:689
+msgid "The submitted file is empty."
+msgstr "Lähetetty tiedosto on tyhjä."
+
+#: forms/fields.py:532
+msgid "Enter a valid URL."
+msgstr "Syötä oikea URL-osoite."
+
+#: forms/fields.py:533
+msgid "This URL appears to be a broken link."
+msgstr "Tämä URL-osoite on rikkinäinen linkki."
+
+#: forms/fields.py:601 forms/fields.py:652
+#, fuzzy, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "Valitse oikea vaihtoehto. %s ei löydy vaihtoehtojen joukosta."
+
+#: forms/fields.py:653 forms/fields.py:714 forms/models.py:528
+msgid "Enter a list of values."
+msgstr "Syötä lista."
+
+#: forms/fields.py:832
+#, fuzzy
+msgid "Enter a valid IPv4 address."
+msgstr "Syötä kelvollinen sähköpostiosoite."
+
+#: forms/models.py:461
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Valitse oikea vaihtoehto. Valintasi ei löydy vaihtoehtojen joukosta."
+
+#: forms/models.py:529
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Valitse oikea vaihtoehto. %s ei löydy vaihtoehtojen joukosta."
+
+#: oldforms/__init__.py:405
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Varmista, että tekstin pituus on vähemmän kuin %s merkki."
+msgstr[1] "Varmista, että teksti pituus on vähemmän kuin %s merkkiä."
+
+#: oldforms/__init__.py:410
+msgid "Line breaks are not allowed here."
+msgstr "Rivinvaihtoja ei voi käyttää."
+
+#: oldforms/__init__.py:508 oldforms/__init__.py:582 oldforms/__init__.py:621
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr ""
+"Valinta ei kelpaa; '%(data)s' ei löydy vaihtoehtojen %(choices)s joukosta."
+
+#: oldforms/__init__.py:750
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Syötä kokonaisluku väliltä -32768 ja 32767."
+
+#: oldforms/__init__.py:760
+msgid "Enter a positive number."
+msgstr "Syötä positiivinen kokonaisluku."
+
+#: oldforms/__init__.py:770
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Syötä kokonaisluku väliltä 0 ja 32767."
+
+#: template/defaultfilters.py:698
+msgid "yes,no,maybe"
+msgstr "kyllä,ei,ehkä"
+
+#: template/defaultfilters.py:729
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d tavu"
+msgstr[1] "%(size)d tavua"
+
+#: template/defaultfilters.py:731
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f Kt"
+
+#: template/defaultfilters.py:733
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f Mt"
+
+#: template/defaultfilters.py:734
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f Gt"
+
+#: utils/dateformat.py:41
+msgid "p.m."
+msgstr "ip"
+
+#: utils/dateformat.py:42
+msgid "a.m."
+msgstr "ap"
+
+#: utils/dateformat.py:47
+msgid "PM"
+msgstr "IP"
+
+#: utils/dateformat.py:48
+msgid "AM"
+msgstr "AP"
+
+#: utils/dateformat.py:97
+msgid "midnight"
+msgstr "keskiyö"
+
+#: utils/dateformat.py:99
+msgid "noon"
+msgstr "keskipäivä"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "maanantai"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "tiistai"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "keskiviikko"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "torstai"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "perjantai"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "lauantai"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "sunnuntai"
+
+#: utils/dates.py:10
+msgid "Mon"
+msgstr "Ma"
+
+#: utils/dates.py:10
+msgid "Tue"
+msgstr "Ti"
+
+#: utils/dates.py:10
+msgid "Wed"
+msgstr "Ke"
+
+#: utils/dates.py:10
+msgid "Thu"
+msgstr "To"
+
+#: utils/dates.py:10
+msgid "Fri"
+msgstr "Pe"
+
+#: utils/dates.py:11
+msgid "Sat"
+msgstr "La"
+
+#: utils/dates.py:11
+msgid "Sun"
+msgstr "Su"
+
+#: utils/dates.py:18
+msgid "January"
+msgstr "tammikuu"
+
+#: utils/dates.py:18
+msgid "February"
+msgstr "helmikuu"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "March"
+msgstr "maaliskuu"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "April"
+msgstr "huhtikuu"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "May"
+msgstr "toukokuu"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "June"
+msgstr "kesäkuu"
+
+#: utils/dates.py:19 utils/dates.py:31
+msgid "July"
+msgstr "heinäkuu"
+
+#: utils/dates.py:19
+msgid "August"
+msgstr "elokuu"
+
+#: utils/dates.py:19
+msgid "September"
+msgstr "syyskuu"
+
+#: utils/dates.py:19
+msgid "October"
+msgstr "lokakuu"
+
+#: utils/dates.py:19
+msgid "November"
+msgstr "marraskuu"
+
+#: utils/dates.py:20
+msgid "December"
+msgstr "joulukuu"
+
+#: utils/dates.py:23
+msgid "jan"
+msgstr "tam"
+
+#: utils/dates.py:23
+msgid "feb"
+msgstr "hel"
+
+#: utils/dates.py:23
+msgid "mar"
+msgstr "maa"
+
+#: utils/dates.py:23
+msgid "apr"
+msgstr "huh"
+
+#: utils/dates.py:23
+msgid "may"
+msgstr "tou"
+
+#: utils/dates.py:23
+msgid "jun"
+msgstr "kes"
+
+#: utils/dates.py:24
+msgid "jul"
+msgstr "hei"
+
+#: utils/dates.py:24
+msgid "aug"
+msgstr "elo"
+
+#: utils/dates.py:24
+msgid "sep"
+msgstr "syy"
+
+#: utils/dates.py:24
+msgid "oct"
+msgstr "lok"
+
+#: utils/dates.py:24
+msgid "nov"
+msgstr "mar"
+
+#: utils/dates.py:24
+msgid "dec"
+msgstr "jou"
+
+#: utils/dates.py:31
+msgid "Jan."
+msgstr "tammi"
+
+#: utils/dates.py:31
+msgid "Feb."
+msgstr "helmi"
+
+#: utils/dates.py:32
+msgid "Aug."
+msgstr "elo"
+
+#: utils/dates.py:32
+msgid "Sept."
+msgstr "syys"
+
+#: utils/dates.py:32
+msgid "Oct."
+msgstr "loka"
+
+#: utils/dates.py:32
+msgid "Nov."
+msgstr "marras"
+
+#: utils/dates.py:32
+msgid "Dec."
+msgstr "joulu"
+
+#: utils/text.py:128
+msgid "or"
+msgstr "tai"
+
+#: utils/timesince.py:21
+msgid "year"
+msgid_plural "years"
+msgstr[0] "vuosi"
+msgstr[1] "vuotta"
+
+#: utils/timesince.py:22
+msgid "month"
+msgid_plural "months"
+msgstr[0] "kuukausi"
+msgstr[1] "kuukautta"
+
+#: utils/timesince.py:23
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "viikko"
+msgstr[1] "viikkoa"
+
+#: utils/timesince.py:24
+msgid "day"
+msgid_plural "days"
+msgstr[0] "päivä"
+msgstr[1] "päivää"
+
+#: utils/timesince.py:25
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "tunti"
+msgstr[1] "tuntia"
+
+#: utils/timesince.py:26
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuutti"
+msgstr[1] "minuuttia"
+
+#: utils/timesince.py:46
+#, fuzzy
+msgid "minutes"
+msgstr "minuutti"
+
+#: utils/timesince.py:51
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr "%(number)d %(type)s"
+
+#: utils/timesince.py:57
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ", %(number)d %(type)s"
+
+#: utils/translation/trans_real.py:401
+msgid "DATE_FORMAT"
+msgstr "j.n.Y"
+
+#: utils/translation/trans_real.py:402
+msgid "DATETIME_FORMAT"
+msgstr "j.n.Y G:i"
+
+#: utils/translation/trans_real.py:403
+msgid "TIME_FORMAT"
+msgstr "G:i"
+
+#: utils/translation/trans_real.py:419
+msgid "YEAR_MONTH_FORMAT"
+msgstr "N Y"
+
+#: utils/translation/trans_real.py:420
+msgid "MONTH_DAY_FORMAT"
+msgstr "N j, Y"
+
+#: views/generic/create_update.py:114
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "%(verbose_name)s luotiin onnistuneesti."
+
+#: views/generic/create_update.py:156
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "%(verbose_name)s päivitettiin onnistuneesti."
+
+#: views/generic/create_update.py:198
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "%(verbose_name)s on poistettu."
+
+#~ msgid "Year must be 1900 or later."
+#~ msgstr "Vuosiluvuksi kelpaa vain 1900 tai myöhempi."
+
+#~ msgid "Separate multiple IDs with commas."
+#~ msgstr "Erottele tunnisteet pilkuilla."
+
+#~ msgid "Your new password is: %(new_password)s"
+#~ msgstr "Uusi salasanasi on: %(new_password)s"
+
+#~ msgid "Feel free to change this password by going to this page:"
+#~ msgstr "Voit vaihtaa salasanan sivulla:"
+
+#~ msgid "Ordering"
+#~ msgstr "Järjestys"
+
+#~ msgid "Added %s."
+#~ msgstr "Lisätty %s."
+
+#~ msgid "Deleted %s."
+#~ msgstr "Poistettu %s."
+
+#~ msgid "The two 'new password' fields didn't match."
+#~ msgstr "Salasanat eivät täsmää."
+
+#~ msgid "Brazilian"
+#~ msgstr "Brasilian portugali"
diff --git a/webapp/django/conf/locale/fi/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/fi/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..f94931a
--- /dev/null
+++ b/webapp/django/conf/locale/fi/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/fi/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/fi/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..cfdb73a
--- /dev/null
+++ b/webapp/django/conf/locale/fi/LC_MESSAGES/djangojs.po
@@ -0,0 +1,119 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-08-18 02:12+0300\n"
+"PO-Revision-Date: 2006-08-05 15:27+0300\n"
+"Last-Translator: Ville Säävuori <ville@unessa.net>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "Mahdolliset %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Valitse kaikki"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Lisää uusi"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Poista"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Valitut %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Valitse vasemmalta ja napsauta "
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Tyhjennä kaikki"
+
+#: contrib/admin/media/js/calendar.js:24
+#: contrib/admin/media/js/dateparse.js:32
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Tammikuu Helmikuu Maaliskuu Huhtikuu Toukokuu Kesäkuu Heinäkuu Elokuu "
+"Syyskuu Lokakuu Marraskuu Joulukuu"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "S M T K T P L"
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Sunnuntai Maanantai Tiistai Keskiviikko Torstai Perjantai Lauantai"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr "Näytä"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr "Piilota"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Now"
+msgstr "Nyt"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
+msgid "Clock"
+msgstr "Kello"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
+msgid "Choose a time"
+msgstr "Valitse kellonaika"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "Midnight"
+msgstr "24"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "6 a.m."
+msgstr "06"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
+msgid "Noon"
+msgstr "12"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
+msgid "Cancel"
+msgstr "Peruuta"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
+msgid "Today"
+msgstr "Tänään"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
+msgid "Calendar"
+msgstr "Kalenteri"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
+msgid "Yesterday"
+msgstr "Eilen"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
+msgid "Tomorrow"
+msgstr "Huomenna"
diff --git a/webapp/django/conf/locale/fr/LC_MESSAGES/django.mo b/webapp/django/conf/locale/fr/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..e52b555
--- /dev/null
+++ b/webapp/django/conf/locale/fr/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/fr/LC_MESSAGES/django.po b/webapp/django/conf/locale/fr/LC_MESSAGES/django.po
new file mode 100644
index 0000000..aedd95d
--- /dev/null
+++ b/webapp/django/conf/locale/fr/LC_MESSAGES/django.po
@@ -0,0 +1,4405 @@
+# translation of django.po to french
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) 2008 THE PACKAGE'S COPYRIGHT HOLDER.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-03-16 15:42+0100\n"
+"PO-Revision-Date: 2008-08-20 16:40+0300\n"
+"Last-Translator: Baptiste <baptiste.goupil_at_google_email.com>\n"
+"Language-Team: français <fr@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit"
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "Arabe"
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "Indien"
+
+#: conf/global_settings.py:41
+msgid "Bulgarian"
+msgstr "Bulgare"
+
+#: conf/global_settings.py:42
+msgid "Catalan"
+msgstr "Catalan"
+
+#: conf/global_settings.py:43
+msgid "Czech"
+msgstr "Tchèque"
+
+#: conf/global_settings.py:44
+msgid "Welsh"
+msgstr "Gallois"
+
+#: conf/global_settings.py:45
+msgid "Danish"
+msgstr "Dannois"
+
+#: conf/global_settings.py:46
+msgid "German"
+msgstr "Allemand"
+
+#: conf/global_settings.py:47
+msgid "Greek"
+msgstr "Grec"
+
+#: conf/global_settings.py:48
+msgid "English"
+msgstr "Anglais"
+
+#: conf/global_settings.py:49
+msgid "Spanish"
+msgstr "Espagnol"
+
+#: conf/global_settings.py:50
+msgid "Argentinean Spanish"
+msgstr "Espagnol Argentin"
+
+#: conf/global_settings.py:51
+msgid "Basque"
+msgstr "Basque"
+
+#: conf/global_settings.py:52
+msgid "Persian"
+msgstr "Perse"
+
+#: conf/global_settings.py:53
+msgid "Finnish"
+msgstr "Finlandais"
+
+#: conf/global_settings.py:54
+msgid "French"
+msgstr "Français"
+
+#: conf/global_settings.py:55
+msgid "Irish"
+msgstr "Irlandais"
+
+#: conf/global_settings.py:56
+msgid "Galician"
+msgstr "Galicien"
+
+#: conf/global_settings.py:57
+msgid "Hungarian"
+msgstr "Hongrois"
+
+#: conf/global_settings.py:58
+msgid "Hebrew"
+msgstr "Hébreu"
+
+#: conf/global_settings.py:59
+msgid "Croatian"
+msgstr "Croate"
+
+#: conf/global_settings.py:60
+msgid "Icelandic"
+msgstr "Islandais"
+
+#: conf/global_settings.py:61
+msgid "Italian"
+msgstr "Italien"
+
+#: conf/global_settings.py:62
+msgid "Japanese"
+msgstr "Japonais"
+
+#: conf/global_settings.py:63
+msgid "Georgian"
+msgstr "Géorgien"
+
+#: conf/global_settings.py:64
+msgid "Korean"
+msgstr "Coréen"
+
+#: conf/global_settings.py:65
+msgid "Khmer"
+msgstr "Khmer"
+
+#: conf/global_settings.py:66
+msgid "Kannada"
+msgstr "Kannada"
+
+#: conf/global_settings.py:67
+msgid "Latvian"
+msgstr "Letton"
+
+#: conf/global_settings.py:68
+msgid "Macedonian"
+msgstr "Macédonien"
+
+#: conf/global_settings.py:69
+msgid "Dutch"
+msgstr "Hollandais"
+
+#: conf/global_settings.py:70
+msgid "Norwegian"
+msgstr "Norvégien"
+
+#: conf/global_settings.py:71
+msgid "Polish"
+msgstr "Polonais"
+
+#: conf/global_settings.py:72
+msgid "Portugese"
+msgstr "Portugais"
+
+#: conf/global_settings.py:73
+msgid "Brazilian"
+msgstr "Brésilien"
+
+#: conf/global_settings.py:74
+msgid "Romanian"
+msgstr "Roumain"
+
+#: conf/global_settings.py:75
+msgid "Russian"
+msgstr "Russe"
+
+#: conf/global_settings.py:76
+msgid "Slovak"
+msgstr "Slovaque"
+
+#: conf/global_settings.py:77
+msgid "Slovenian"
+msgstr "Slovaque"
+
+#: conf/global_settings.py:78
+msgid "Serbian"
+msgstr "Serbe"
+
+#: conf/global_settings.py:79
+msgid "Swedish"
+msgstr "Suédois"
+
+#: conf/global_settings.py:80
+msgid "Tamil"
+msgstr "Tamoul"
+
+#: conf/global_settings.py:81
+msgid "Telugu"
+msgstr "Télougou"
+
+#: conf/global_settings.py:82
+msgid "Turkish"
+msgstr "Turc"
+
+#: conf/global_settings.py:83
+msgid "Ukrainian"
+msgstr "Ukrainien"
+
+#: conf/global_settings.py:84
+msgid "Simplified Chinese"
+msgstr "Chinois simplifié"
+
+#: conf/global_settings.py:85
+msgid "Traditional Chinese"
+msgstr "Chinois traditionnel"
+
+#: contrib/admin/filterspecs.py:44
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Par %s&nbsp;:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:74 contrib/admin/filterspecs.py:92
+#: contrib/admin/filterspecs.py:147 contrib/admin/filterspecs.py:173
+msgid "All"
+msgstr "Tout"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Any date"
+msgstr "Toutes les dates"
+
+#: contrib/admin/filterspecs.py:114
+msgid "Today"
+msgstr "Aujourd'hui"
+
+#: contrib/admin/filterspecs.py:117
+msgid "Past 7 days"
+msgstr "Les 7 derniers jours"
+
+#: contrib/admin/filterspecs.py:119
+msgid "This month"
+msgstr "Ce mois-ci"
+
+#: contrib/admin/filterspecs.py:121
+msgid "This year"
+msgstr "Cette année"
+
+#: contrib/admin/filterspecs.py:147 newforms/widgets.py:231
+#: oldforms/__init__.py:592
+msgid "Yes"
+msgstr "Oui"
+
+#: contrib/admin/filterspecs.py:147 newforms/widgets.py:231
+#: oldforms/__init__.py:592
+msgid "No"
+msgstr "Non"
+
+#: contrib/admin/filterspecs.py:154 newforms/widgets.py:231
+#: oldforms/__init__.py:592
+msgid "Unknown"
+msgstr "Inconnu"
+
+#: contrib/admin/models.py:18
+msgid "action time"
+msgstr "heure de l'action"
+
+#: contrib/admin/models.py:21
+msgid "object id"
+msgstr "id de l'objet"
+
+#: contrib/admin/models.py:22
+msgid "object repr"
+msgstr "représentation de l'objet"
+
+#: contrib/admin/models.py:23
+msgid "action flag"
+msgstr "indicateur de l'action"
+
+#: contrib/admin/models.py:24
+msgid "change message"
+msgstr "message de modification"
+
+#: contrib/admin/models.py:27
+msgid "log entry"
+msgstr "entrée d'historique"
+
+#: contrib/admin/models.py:28
+msgid "log entries"
+msgstr "entrées d'historique"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Cette page n'a pas été trouvée"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Nous sommes désolés, mais la page demandée est introuvable."
+
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:37
+#: contrib/admin/templates/admin/change_form.html:12
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/delete_confirmation.html:5
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:4
+#: contrib/admin/templates/admin/auth/user/change_password.html:11
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+msgid "Home"
+msgstr "Accueil"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Erreur du serveur"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Erreur du serveur (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Erreur du serveur <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Une erreur est survenue. Elle a été transmise par courriel aux "
+"administrateurs du site et sera corrigée dans les meilleurs délais. Merci de "
+"votre patience."
+
+#: contrib/admin/templates/admin/base.html:26
+msgid "Welcome,"
+msgstr "Bienvenue,"
+
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Documentation"
+
+#: contrib/admin/templates/admin/base.html:29
+#: contrib/admin/templates/admin/auth/user/change_password.html:14
+#: contrib/admin/templates/admin/auth/user/change_password.html:45
+msgid "Change password"
+msgstr "Modifier votre mot de passe"
+
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/comments/templates/comments/form.html:6
+msgid "Log out"
+msgstr "Déconnexion"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Site d'administration de Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Administration de Django"
+
+#: contrib/admin/templates/admin/change_form.html:14
+#: contrib/admin/templates/admin/index.html:28
+msgid "Add"
+msgstr "Ajouter"
+
+#: contrib/admin/templates/admin/change_form.html:20
+#: contrib/admin/templates/admin/object_history.html:4
+msgid "History"
+msgstr "Historique"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "Voir sur le site"
+
+#: contrib/admin/templates/admin/change_form.html:31
+#: contrib/admin/templates/admin/auth/user/change_password.html:23
+msgid "Please correct the error below."
+msgstr "Veuillez corriger l'erreur ci-dessous."
+
+#: contrib/admin/templates/admin/change_form.html:49
+msgid "Ordering"
+msgstr "Tri"
+
+#: contrib/admin/templates/admin/change_form.html:52
+msgid "Order:"
+msgstr "Ordre :"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "Ajouter %(name)s"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:8
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Supprimer"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:13
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Supprimer l'objet %(object_name)s '%(escaped_object)s' provoquerait la "
+"suppression des objets qui lui sont liés mais votre compte ne possède pas la "
+"permission de supprimer les types d'objets suivants :"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:20
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Êtes vous certain de vouloir supprimer l'objet %(object_name)s \"%"
+"(escaped_object)s\" ? Les éléments suivant sont liés à celui-ci et seront "
+"aussi supprimés :"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:25
+msgid "Yes, I'm sure"
+msgstr "Oui, j'en suis certain"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Par %(filter_title)s "
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "Filtre"
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Modèles disponibles dans l'application %(name)s."
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Modifier"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Vous n'avez pas la permission d'éditer quoi que ce soit."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Actions récentes"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Mes actions"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Aucun(e) disponible"
+
+#: contrib/admin/templates/admin/invalid_setup.html:8
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Quelque chose ne va pas avec votre base de données. Vérifiez que les bonnes "
+"tables ont été créées, et que la base est lisible par le bon utilisateur."
+
+#: contrib/admin/templates/admin/login.html:17
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+msgid "Username:"
+msgstr "Nom d'utilisateur"
+
+#: contrib/admin/templates/admin/login.html:20
+#: contrib/comments/templates/comments/form.html:8
+msgid "Password:"
+msgstr "Mot de passe"
+
+#: contrib/admin/templates/admin/login.html:25
+#: contrib/admin/views/decorators.py:31
+msgid "Log in"
+msgstr "Connectez-vous"
+
+#: contrib/admin/templates/admin/object_history.html:17
+msgid "Date/time"
+msgstr "Date/Heure"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "User"
+msgstr "Utilisateur"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "Action"
+msgstr "Action"
+
+#: contrib/admin/templates/admin/object_history.html:25
+msgid "DATE_WITH_TIME_FULL"
+msgstr "j. N Y, H:i"
+
+#: contrib/admin/templates/admin/object_history.html:35
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Cet objet n'a pas d'historique de modification. Il n'a probablement pas été "
+"ajouté au moyen de ce site d'administration."
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Tout montrer"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Envoyer"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgstr "1 résultat"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s résultats"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Sauver en tant que nouveau"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Sauver et ajouter un nouveau"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Sauver et continuer les modifications"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Sauver"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Entrez tout d'abord un nom d'utilisateur et un mot de passe. Vous pourrez "
+"ensuite modifier plus d'options."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "Nom d'utilisateur"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+#: contrib/admin/templates/admin/auth/user/change_password.html:33
+msgid "Password"
+msgstr "Mot de passe"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+#: contrib/admin/templates/admin/auth/user/change_password.html:38
+msgid "Password (again)"
+msgstr "Mot de passe (à nouveau)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+msgid "Enter the same password as above, for verification."
+msgstr "Entrez le même mot de passe que précedemment, par sécurité."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:27
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+"Entrez un nouveau mot de passe pour l'utilisateur <strong>%(username)s</"
+"strong>."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Signets"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+msgid "Documentation bookmarklets"
+msgstr "Documentation des signets"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:8
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">Pour installer des signets, faîtes glisser le lien vers\n"
+"votre barre de marques-pages, ou cliquez droit dessus et ajoutez-y le.\n"
+"Maintenant, vous pouvez le sélectionner depuis n'importe quelle page\n"
+"du site. Notez que certains d'entre eux nécessitent que vous visionniez\n"
+"le site depuis un ordinateur dit \"interne\" (veuillez contacter votre\n"
+"administrateur système si vous n'êtes pas sûr que votre ordinateur le soit)."
+"</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:18
+msgid "Documentation for this page"
+msgstr "Documentation pour cette page"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+"Vous envoie de n'importe quelle page vers la documentation de la vue qui a "
+"généré cette page."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:21
+msgid "Show object ID"
+msgstr "Afficher l'identifiant de l'objet"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Montre le content-type et l'identifiant unique pour les pages qui "
+"représentent un objet unique."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:24
+msgid "Edit this object (current window)"
+msgstr "Editer cet objet (fenêtre courante)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "Renvoie à la page d'administration qui représente un objet seul."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:27
+msgid "Edit this object (new window)"
+msgstr "Editer cet objet (nouvelle fenêtre)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "As above, but opens the admin page in a new window."
+msgstr ""
+"Comme ci-dessus, mais ouvre la page d'administration dans une nouvelle "
+"fenêtre."
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Merci pour le temps que vous avez accordé à ce site aujourd'hui."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Connectez vous à nouveau"
+
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_form.html:5
+#: contrib/admin/templates/registration/password_change_form.html:9
+msgid "Password change"
+msgstr "Modification de votre mot de passe"
+
+#: contrib/admin/templates/registration/password_change_done.html:5
+#: contrib/admin/templates/registration/password_change_done.html:9
+msgid "Password change successful"
+msgstr "Mot de passe modifié avec succés"
+
+#: contrib/admin/templates/registration/password_change_done.html:11
+msgid "Your password was changed."
+msgstr "Votre mot de passe a été modifié."
+
+#: contrib/admin/templates/registration/password_change_form.html:11
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Pour des raisons de sécurité, veuillez entrer votre ancien mot de passe puis "
+"saisissez deux fois votre nouveau mot de passe afin que nous puissions "
+"vérifier que vous l'avez tapé correctement."
+
+#: contrib/admin/templates/registration/password_change_form.html:16
+msgid "Old password:"
+msgstr "Ancien mot de passe :"
+
+#: contrib/admin/templates/registration/password_change_form.html:18
+msgid "New password:"
+msgstr "Nouveau mot de passe :"
+
+#: contrib/admin/templates/registration/password_change_form.html:20
+msgid "Confirm password:"
+msgstr "Confirmation du mot de passe"
+
+#: contrib/admin/templates/registration/password_change_form.html:22
+msgid "Change my password"
+msgstr "Modifier mon mot de passe"
+
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+msgid "Password reset"
+msgstr "Réinitialisation de votre mot de passe"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Mot de passe réinitialisé avec succès"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"Nous vous avons envoyé par courriel un nouveau mot de passe. Vous devriez le "
+"recevoir rapidement."
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr ""
+"Vous recevez ce courriel car vous avez demandé un changement de mot de passe"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "pour votre compte au site %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Votre nouveau mot de passe est : %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Vous pouvez modifier ce mot de passe à l'adresse suivante :"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Votre nom d'utilisateur, en cas d'oubli :"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Merci d'utiliser notre site !"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "L'équipe %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"Mot de passe perdu ? Saisissez votre adresse de courriel ci-dessous et nous "
+"annulerons votre mot de passe actuel avant de vous en faire parvenir un "
+"nouveau par courriel."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Courriel :"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Réinitialiser mon mot de passe"
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Date :"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Heure :"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Actuellement :"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Modification :"
+
+#: contrib/admin/templatetags/admin_list.py:257
+msgid "All dates"
+msgstr "Toutes les dates"
+
+#: contrib/admin/views/auth.py:20 contrib/admin/views/main.py:267
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "L'objet %(name)s \"%(obj)s\" a été ajouté avec succès."
+
+#: contrib/admin/views/auth.py:25 contrib/admin/views/main.py:271
+#: contrib/admin/views/main.py:356
+msgid "You may edit it again below."
+msgstr "Vous pouvez continuez de l'éditez ci-dessous."
+
+#: contrib/admin/views/auth.py:31
+msgid "Add user"
+msgstr "Ajouter l'utilisateur"
+
+#: contrib/admin/views/auth.py:58
+msgid "Password changed successfully."
+msgstr "Mot de passe modifié avec succés"
+
+#: contrib/admin/views/auth.py:65
+#, python-format
+msgid "Change password: %s"
+msgstr "Modifier le mot de passe : %s"
+
+#: contrib/admin/views/decorators.py:17 contrib/auth/forms.py:60
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Veuillez saisir un nom d'utilisateur et un mot de passe valide. Remarquez "
+"que chacun de ces champs est sensible à la casse (différenciation des "
+"majuscules/minuscules)."
+
+#: contrib/admin/views/decorators.py:69
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Veuillez vous reconnecter, car votre session a expiré. Ne vous inquiétez "
+"pas, votre soumission a été enregistrée."
+
+#: contrib/admin/views/decorators.py:76
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Il semblerait que votre navigateur n'accepte pas les cookies. Veuillezles "
+"activer, recharger cette page, puis rééssayer."
+
+#: contrib/admin/views/decorators.py:90
+msgid "Usernames cannot contain the '@' character."
+msgstr "Les noms d'utilisateur ne peuvent contenir le caractère '@'"
+
+#: contrib/admin/views/decorators.py:92
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr ""
+"Votre courriel n'est pas votre nom d'utilisateur. Essayez '%s' à la place."
+
+#: contrib/admin/views/doc.py:48 contrib/admin/views/doc.py:50
+#: contrib/admin/views/doc.py:52
+msgid "tag:"
+msgstr "mot-clé :"
+
+#: contrib/admin/views/doc.py:79 contrib/admin/views/doc.py:81
+#: contrib/admin/views/doc.py:83
+msgid "filter:"
+msgstr "filtre :"
+
+#: contrib/admin/views/doc.py:137 contrib/admin/views/doc.py:139
+#: contrib/admin/views/doc.py:141
+msgid "view:"
+msgstr "vue :"
+
+#: contrib/admin/views/doc.py:166
+#, python-format
+msgid "App %r not found"
+msgstr "L'application %r n'a pas été trouvée."
+
+#: contrib/admin/views/doc.py:173
+#, python-format
+msgid "Model %(name)r not found in app %(label)r"
+msgstr "Le modèle %(name)r n'a pas été trouvé dans l'application %(label)r"
+
+#: contrib/admin/views/doc.py:185
+#, python-format
+msgid "the related `%(label)s.%(type)s` object"
+msgstr "l'objet `%(label)s.%(type)s` en relation "
+
+#: contrib/admin/views/doc.py:185 contrib/admin/views/doc.py:207
+#: contrib/admin/views/doc.py:221 contrib/admin/views/doc.py:226
+msgid "model:"
+msgstr "modèle :"
+
+#: contrib/admin/views/doc.py:216
+#, python-format
+msgid "related `%(label)s.%(name)s` objects"
+msgstr "les objets `%(label)s.%(name)s` en relation"
+
+#: contrib/admin/views/doc.py:221
+#, python-format
+msgid "all %s"
+msgstr "tous les %s"
+
+#: contrib/admin/views/doc.py:226
+#, python-format
+msgid "number of %s"
+msgstr "nombre de %s"
+
+#: contrib/admin/views/doc.py:231
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Champs sur les objets %s"
+
+#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:304
+#: contrib/admin/views/doc.py:306 contrib/admin/views/doc.py:312
+#: contrib/admin/views/doc.py:313 contrib/admin/views/doc.py:315
+msgid "Integer"
+msgstr "Entier"
+
+#: contrib/admin/views/doc.py:294
+msgid "Boolean (Either True or False)"
+msgstr "Booléen (Vrai ou Faux)"
+
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:314
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Chaîne de caractère (jusqu'à %(max_length)s)"
+
+#: contrib/admin/views/doc.py:296
+msgid "Comma-separated integers"
+msgstr "Des entiers séparés par une virgule"
+
+#: contrib/admin/views/doc.py:297
+msgid "Date (without time)"
+msgstr "Date (sans l'heure)"
+
+#: contrib/admin/views/doc.py:298
+msgid "Date (with time)"
+msgstr "Date (avec l'heure)"
+
+#: contrib/admin/views/doc.py:299
+msgid "Decimal number"
+msgstr "Nombre décimal"
+
+#: contrib/admin/views/doc.py:300
+msgid "E-mail address"
+msgstr "Courriel"
+
+#: contrib/admin/views/doc.py:301 contrib/admin/views/doc.py:302
+#: contrib/admin/views/doc.py:305
+msgid "File path"
+msgstr "Chemin vers le fichier"
+
+#: contrib/admin/views/doc.py:303
+msgid "Floating point number"
+msgstr "Nombre à virgule flottante"
+
+#: contrib/admin/views/doc.py:307 contrib/comments/models.py:89
+msgid "IP address"
+msgstr "adresse IP"
+
+#: contrib/admin/views/doc.py:309
+msgid "Boolean (Either True, False or None)"
+msgstr "Booléen (Vrai, Faux ou None)"
+
+#: contrib/admin/views/doc.py:310
+msgid "Relation to parent model"
+msgstr "Relation au modèle parent"
+
+#: contrib/admin/views/doc.py:311
+msgid "Phone number"
+msgstr "Numéro de téléphone"
+
+#: contrib/admin/views/doc.py:316
+msgid "Text"
+msgstr "Texte"
+
+#: contrib/admin/views/doc.py:317
+msgid "Time"
+msgstr "Heure"
+
+#: contrib/admin/views/doc.py:318 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:319
+msgid "U.S. state (two uppercase letters)"
+msgstr "État Américain (deux lettres majuscules)"
+
+#: contrib/admin/views/doc.py:320
+msgid "XML text"
+msgstr "Texte XML"
+
+#: contrib/admin/views/doc.py:346
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s ne semble pas être un objet urlpattern"
+
+#: contrib/admin/views/main.py:233
+msgid "Site administration"
+msgstr "Gestion du site"
+
+#: contrib/admin/views/main.py:280 contrib/admin/views/main.py:365
+#, python-format
+msgid "You may add another %s below."
+msgstr "Vous pouvez ajouter un autre %s ci-dessous."
+
+#: contrib/admin/views/main.py:298
+#, python-format
+msgid "Add %s"
+msgstr "Ajouter %s"
+
+#: contrib/admin/views/main.py:344
+#, python-format
+msgid "Added %s."
+msgstr "Ajouté %s."
+
+#: contrib/admin/views/main.py:344 contrib/admin/views/main.py:346
+#: contrib/admin/views/main.py:348 core/validators.py:283
+#: db/models/manipulators.py:309
+msgid "and"
+msgstr "et"
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "Changed %s."
+msgstr "Modifié %s."
+
+#: contrib/admin/views/main.py:348
+#, python-format
+msgid "Deleted %s."
+msgstr "Supprimé %s."
+
+#: contrib/admin/views/main.py:351
+msgid "No fields changed."
+msgstr "Aucun champ modifié."
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "L'objet %(name)s \"%(obj)s\" a été modifié avec succès."
+
+#: contrib/admin/views/main.py:362
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"L'objet %(name)s \"%(obj)s\" a été ajouté avec succès.Vous pouvez continuez "
+"de l'éditez ci-dessous."
+
+#: contrib/admin/views/main.py:400
+#, python-format
+msgid "Change %s"
+msgstr "Changement %s"
+
+#: contrib/admin/views/main.py:487
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Un ou plusieurs %(fieldname)s dans %(name)s : %(obj)s"
+
+#: contrib/admin/views/main.py:492
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Un ou plusieurs %(fieldname)s dans %(name)s :"
+
+#: contrib/admin/views/main.py:524
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "L'objet %(name)s \"%(obj)s\" a été supprimé avec succès."
+
+#: contrib/admin/views/main.py:527
+msgid "Are you sure?"
+msgstr "Êtes-vous sûr ?"
+
+#: contrib/admin/views/main.py:549
+#, python-format
+msgid "Change history: %s"
+msgstr "Historique des changements : %s"
+
+#: contrib/admin/views/main.py:583
+#, python-format
+msgid "Select %s"
+msgstr "Sélectionnez %s"
+
+#: contrib/admin/views/main.py:583
+#, python-format
+msgid "Select %s to change"
+msgstr "Sélectionnez l'objet %s à changer"
+
+#: contrib/admin/views/main.py:784
+msgid "Database error"
+msgstr "Erreur de base de données"
+
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr "Les deux mots de passe ne correspondent pas."
+
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr "Un utilisateur avec ce nom existe déjà."
+
+#: contrib/auth/forms.py:53
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"Votre navigateur ne semble pas avoir activé les cookies. Les cookies sont "
+"nécessaire pour se connecter"
+
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "Ce compte est inactif."
+
+#: contrib/auth/forms.py:84
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr ""
+"Cette adresse e-mail ne correspond à aucun compte utilisateur. Êtes-vous sûr "
+"de vous être enregistré ?"
+
+#: contrib/auth/forms.py:107
+#, python-format
+msgid "Password reset on %s"
+msgstr "Mot de passe réinitialisé le %s"
+
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "Les deux champs \"nouveau mot de passe\" ne correspondent pas."
+
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Votre ancien mot de passe est incorrect. Veuillez le rectifier."
+
+#: contrib/auth/models.py:73 contrib/auth/models.py:93
+msgid "name"
+msgstr "nom"
+
+#: contrib/auth/models.py:75
+msgid "codename"
+msgstr "nom de code"
+
+#: contrib/auth/models.py:78
+msgid "permission"
+msgstr "permission"
+
+#: contrib/auth/models.py:79 contrib/auth/models.py:94
+msgid "permissions"
+msgstr "permissions"
+
+#: contrib/auth/models.py:97
+msgid "group"
+msgstr "groupe"
+
+#: contrib/auth/models.py:98 contrib/auth/models.py:141
+msgid "groups"
+msgstr "groupes"
+
+#: contrib/auth/models.py:131
+msgid "username"
+msgstr "nom d'utilisateur"
+
+#: contrib/auth/models.py:131
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr ""
+"Requis. 30 caractères maximum, alphanumériques uniquement (lettres, "
+"chiffres, et tirets bas _)."
+
+#: contrib/auth/models.py:132
+msgid "first name"
+msgstr "prénom"
+
+#: contrib/auth/models.py:133
+msgid "last name"
+msgstr "nom"
+
+#: contrib/auth/models.py:134
+msgid "e-mail address"
+msgstr "courriel"
+
+#: contrib/auth/models.py:135
+msgid "password"
+msgstr "mot de passe"
+
+#: contrib/auth/models.py:135
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"Utilisez [algo]$[salt]$[hexdigest]' ou le <a href=\"password/\">formulaire "
+"de changement de mot de passe</a>."
+
+#: contrib/auth/models.py:136
+msgid "staff status"
+msgstr "statut équipe"
+
+#: contrib/auth/models.py:136
+msgid "Designates whether the user can log into this admin site."
+msgstr "Précise si l'utilisateur peut se connecter à ce site d'administration."
+
+#: contrib/auth/models.py:137
+msgid "active"
+msgstr "actif"
+
+#: contrib/auth/models.py:137
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"Précise si l'utilisateur peut se connecter à l'administration. "
+"Déselectionnez ceci plutôt que supprimer le compte."
+
+#: contrib/auth/models.py:138
+msgid "superuser status"
+msgstr "statut super-utilisateur"
+
+#: contrib/auth/models.py:138
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr ""
+"Précise que l'utilisateur possède toutes les permissions sans les assigner "
+"explicitement."
+
+#: contrib/auth/models.py:139
+msgid "last login"
+msgstr "dernière connexion"
+
+#: contrib/auth/models.py:140
+msgid "date joined"
+msgstr "date d'inscription"
+
+#: contrib/auth/models.py:142
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"En plus des permissions qui lui sont manuellement assignées, cet utilisateur "
+"recevra aussi toutes les permissions de tous les groupes auquels il "
+"appartient. "
+
+#: contrib/auth/models.py:143
+msgid "user permissions"
+msgstr "permissions de l'utilisateur"
+
+#: contrib/auth/models.py:147
+msgid "user"
+msgstr "utilisateur"
+
+#: contrib/auth/models.py:148
+msgid "users"
+msgstr "utilisateurs"
+
+#: contrib/auth/models.py:154
+msgid "Personal info"
+msgstr "Information personnelle"
+
+#: contrib/auth/models.py:155
+msgid "Permissions"
+msgstr "Permissions"
+
+#: contrib/auth/models.py:156
+msgid "Important dates"
+msgstr "Dates importantes"
+
+#: contrib/auth/models.py:157
+msgid "Groups"
+msgstr "Groupes"
+
+#: contrib/auth/models.py:316
+msgid "message"
+msgstr "message"
+
+#: contrib/auth/views.py:47
+msgid "Logged out"
+msgstr "Déconnecté"
+
+#: contrib/comments/models.py:71 contrib/comments/models.py:176
+msgid "object ID"
+msgstr "ID de l'objet"
+
+#: contrib/comments/models.py:72
+msgid "headline"
+msgstr "titre"
+
+#: contrib/comments/models.py:73 contrib/comments/models.py:95
+#: contrib/comments/models.py:177
+msgid "comment"
+msgstr "commentaire"
+
+#: contrib/comments/models.py:74
+msgid "rating #1"
+msgstr "vote n°1"
+
+#: contrib/comments/models.py:75
+msgid "rating #2"
+msgstr "vote n°2"
+
+#: contrib/comments/models.py:76
+msgid "rating #3"
+msgstr "vote n°3"
+
+#: contrib/comments/models.py:77
+msgid "rating #4"
+msgstr "vote n°4"
+
+#: contrib/comments/models.py:78
+msgid "rating #5"
+msgstr "vote n°5"
+
+#: contrib/comments/models.py:79
+msgid "rating #6"
+msgstr "vote n°6"
+
+#: contrib/comments/models.py:80
+msgid "rating #7"
+msgstr "vote n°7"
+
+#: contrib/comments/models.py:81
+msgid "rating #8"
+msgstr "vote n°8"
+
+#: contrib/comments/models.py:86
+msgid "is valid rating"
+msgstr "est un vote valide"
+
+#: contrib/comments/models.py:87 contrib/comments/models.py:179
+msgid "date/time submitted"
+msgstr "date et heure soumises"
+
+#: contrib/comments/models.py:88 contrib/comments/models.py:180
+msgid "is public"
+msgstr "est public"
+
+#: contrib/comments/models.py:90
+msgid "is removed"
+msgstr "est supprimé"
+
+#: contrib/comments/models.py:90
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Cochez cette case si le commentaire est inadéquat. Un message type \"Ce "
+"commentaire a été supprimé\" sera affiché en lieu et place de celui-ci."
+
+#: contrib/comments/models.py:96
+msgid "comments"
+msgstr "commentaires"
+
+#: contrib/comments/models.py:140 contrib/comments/models.py:222
+msgid "Content object"
+msgstr "Type de contenu"
+
+#: contrib/comments/models.py:168
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Posté par %(user)s à %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:178
+msgid "person's name"
+msgstr "nom de la personne"
+
+#: contrib/comments/models.py:181
+msgid "ip address"
+msgstr "adresse IP"
+
+#: contrib/comments/models.py:183
+msgid "approved by staff"
+msgstr "approuvé par l'équipe"
+
+#: contrib/comments/models.py:187
+msgid "free comment"
+msgstr "commentaire libre"
+
+#: contrib/comments/models.py:188
+msgid "free comments"
+msgstr "commentaires libres"
+
+#: contrib/comments/models.py:250
+msgid "score"
+msgstr "evaluation"
+
+#: contrib/comments/models.py:251
+msgid "score date"
+msgstr "date d'évaluation"
+
+#: contrib/comments/models.py:255
+msgid "karma score"
+msgstr "point de Karma"
+
+#: contrib/comments/models.py:256
+msgid "karma scores"
+msgstr "points de Karma"
+
+#: contrib/comments/models.py:260
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d évalué par %(user)s"
+
+#: contrib/comments/models.py:277
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Ce commentaire a été marqué par %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:285
+msgid "flag date"
+msgstr "date d'indicateur"
+
+#: contrib/comments/models.py:289
+msgid "user flag"
+msgstr "indicateur utilisateur"
+
+#: contrib/comments/models.py:290
+msgid "user flags"
+msgstr "indicateurs utilisateur"
+
+#: contrib/comments/models.py:294
+#, python-format
+msgid "Flag by %r"
+msgstr "Indicateur par %r"
+
+#: contrib/comments/models.py:300
+msgid "deletion date"
+msgstr "date de suppression"
+
+#: contrib/comments/models.py:303
+msgid "moderator deletion"
+msgstr "suppression de modérateur"
+
+#: contrib/comments/models.py:304
+msgid "moderator deletions"
+msgstr "suppressions de modérateur"
+
+#: contrib/comments/models.py:308
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Suppression de modérateur par %r"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Mot de passe oublié ?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Votes"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Requis"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Optionel"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Poster une photo"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Commentaire :"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Prévisualisation du commentaire"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Votre nom :"
+
+#: contrib/comments/views/comments.py:28
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr "Ce vote est nécessaire car vous avez saisi au moins un autre vote."
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Ce commentaire a été posté par un utilisateur qui a posté moins de %(count)s "
+"commentaire :\n"
+"\n"
+"%(text)s"
+"Ce commentaire a été posté par un utilisateur qui a posté moins de %(count)s "
+"commentaires :\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Ce commentaire a été posté par un utilisateur imprécis :\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:190
+#: contrib/comments/views/comments.py:283
+msgid "Only POSTs are allowed"
+msgstr "Seuls les POSTs sont autorisés"
+
+#: contrib/comments/views/comments.py:194
+#: contrib/comments/views/comments.py:287
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Un ou plusieurs champs requis n'ont pas été remplis"
+
+#: contrib/comments/views/comments.py:198
+#: contrib/comments/views/comments.py:289
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr ""
+"Quelqu'un a trafiqué le formulaire de commentaire (violation des règles de "
+"sécurité)"
+
+#: contrib/comments/views/comments.py:208
+#: contrib/comments/views/comments.py:295
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"Ce formulaire de commentaire avait un paramètre cible invalide; "
+"l'identifiant de l'objet était invalide"
+
+#: contrib/comments/views/comments.py:259
+#: contrib/comments/views/comments.py:324
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr ""
+"Le formulaire de commentaire ne proposait ni la prévisualisation ni l'envoi"
+
+#: contrib/comments/views/karma.py:21
+msgid "Anonymous users cannot vote"
+msgstr "Les utilisateurs anonymes ne peuvent pas voter"
+
+#: contrib/comments/views/karma.py:25
+msgid "Invalid comment ID"
+msgstr "Identifiant de commentaire invalide"
+
+#: contrib/comments/views/karma.py:27
+msgid "No voting for yourself"
+msgstr "Impossible de voter pour soi-même"
+
+#: contrib/contenttypes/models.py:67
+msgid "python model class name"
+msgstr "nom du module python"
+
+#: contrib/contenttypes/models.py:71
+msgid "content type"
+msgstr "type de contenu"
+
+#: contrib/contenttypes/models.py:72
+msgid "content types"
+msgstr "types de contenu"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Par exemple : '/a_propos/contact/'. Vérifiez la présence du caractère '/' en "
+"début et en fin de chaine."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "titre"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "contenu"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "autoriser les commentaires"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "nom du template"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"Par exemple: 'flatfiles/contact_page'. Sans définition, le système utilisera "
+"'flatfiles/default'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "enregistrement requis"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+"Si coché, seuls les utilisateurs connectés auront la possibilité de voir "
+"cette page."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "page statique"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "pages statiques"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "th"
+msgstr "<sup>e</sup>"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "st"
+msgstr "<sup>er</sup>"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "nd"
+msgstr "<sup>d</sup>"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "rd"
+msgstr "<sup>e</sup>"
+
+#: contrib/humanize/templatetags/humanize.py:51
+#, python-format
+msgid "%(value).1f million"
+msgstr "%(value).1f million"
+
+#: contrib/humanize/templatetags/humanize.py:54
+#, python-format
+msgid "%(value).1f billion"
+msgstr "%(value).1f milliard"
+
+#: contrib/humanize/templatetags/humanize.py:57
+#, python-format
+msgid "%(value).1f trillion"
+msgstr "%(value).1f billion"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "one"
+msgstr "un"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "two"
+msgstr "deux"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "three"
+msgstr "trois"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "four"
+msgstr "quatre"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "five"
+msgstr "cinq"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "six"
+msgstr "six"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "seven"
+msgstr "sept"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "eight"
+msgstr "huit"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "nine"
+msgstr "neuf"
+
+#: contrib/humanize/templatetags/humanize.py:93
+msgid "today"
+msgstr "aujourd'hui"
+
+#: contrib/humanize/templatetags/humanize.py:95
+msgid "tomorrow"
+msgstr "demain"
+
+#: contrib/humanize/templatetags/humanize.py:97
+msgid "yesterday"
+msgstr "hier"
+
+#: contrib/localflavor/ar/forms.py:27
+msgid "Enter a postal code in the format NNNN or ANNNNAAA."
+msgstr "Entrez un code postal au format NNNN ou ANNNNAAA."
+
+#: contrib/localflavor/ar/forms.py:49 contrib/localflavor/br/forms.py:96
+#: contrib/localflavor/br/forms.py:135 contrib/localflavor/pe/forms.py:23
+#: contrib/localflavor/pe/forms.py:51
+msgid "This field requires only numbers."
+msgstr "Ce champ ne doit contenir que des nombres."
+
+#: contrib/localflavor/ar/forms.py:50
+msgid "This field requires 7 or 8 digits."
+msgstr "Ce champ requiert au 7 ou 8 chiffres."
+
+#: contrib/localflavor/ar/forms.py:79
+msgid "Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format."
+msgstr ""
+"Entrez un numéro CUIT (format XX-XXXXXXXX-X ou XXXXXXXXXXXX)."
+
+#: contrib/localflavor/ar/forms.py:80
+msgid "Invalid CUIT."
+msgstr "CUIT invalide."
+
+#: contrib/localflavor/au/forms.py:16
+msgid "Enter a 4 digit post code."
+msgstr "Entrez un code postal Australien (4 chiffres)."
+
+#: contrib/localflavor/br/forms.py:21
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Entrez un code postal Brésilien (format XXXXX-XXX)."
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "Les numéros de téléphone doivent être au format XX-XXXX-XXXX."
+
+#: contrib/localflavor/br/forms.py:58
+msgid ""
+"Select a valid brazilian state. That state is not one of the available "
+"states."
+msgstr ""
+"Sélectionnez un etat·brésilien valide. Cet etat ne fait pas partie de ceux "
+"disponibles."
+
+#: contrib/localflavor/br/forms.py:94
+msgid "Invalid CPF number."
+msgstr "Numéro CPF invalide."
+
+#: contrib/localflavor/br/forms.py:95
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr "Ce champ requiert au plus 11 chiffres ou 14 caractères."
+
+#: contrib/localflavor/br/forms.py:134
+msgid "Invalid CNPJ number."
+msgstr "Numéro CNPJ invalide."
+
+#: contrib/localflavor/br/forms.py:136
+msgid "This field requires at least 14 digits"
+msgstr "Ce champ requiert au minimum 14 chiffres."
+
+#: contrib/localflavor/ca/forms.py:17
+msgid "Enter a postal code in the format XXX XXX."
+msgstr "Entrez un code postal au format XXX XXX."
+
+#: contrib/localflavor/ca/forms.py:88
+msgid "Enter a valid Canadian Social Insurance number in XXX-XXX-XXX format."
+msgstr "Entrez un numéro de sécurité sociale Canadien (format XXX-XXX-XXX)."
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr "Argovie"
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr "Appenzell Rhodes-Intérieures"
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr "Appenzell Rhodes-Extérieures"
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr "Bâle-Ville"
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr "Bâle-Campagne"
+
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr "Berne"
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr "Fribourg"
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr "Genève"
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr "Glaris"
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr "Grisons"
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr "Jura"
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr "Lucerne"
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr "Neuchâtel"
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr "Nidwald"
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr "Obwald"
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr "Schaffhouse"
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr "Suisse"
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr "Soleure"
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr "Saint Gall"
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr "Thuringe"
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr "Tessin"
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr "Uri"
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr "Valais"
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr "Vaud"
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr "Zoug"
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr "Zurich"
+
+#: contrib/localflavor/ch/forms.py:16 contrib/localflavor/no/forms.py:12
+msgid "Enter a zip code in the format XXXX."
+msgstr "Entrez un code postal Norvégien (format XXXX)."
+
+#: contrib/localflavor/ch/forms.py:64
+msgid ""
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
+msgstr ""
+"Entrez un numéro de passeport ou de carte d'identité valide au format "
+"X1234567<0 ou 1234567890."
+
+#: contrib/localflavor/cl/forms.py:29
+msgid "Enter a valid Chilean RUT."
+msgstr "Entrez un RUT Chilien valide."
+
+#: contrib/localflavor/cl/forms.py:30
+msgid "Enter a valid Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr "Entrez un RUT Chilien valide (format XX.XXX.XXX-X)."
+
+#: contrib/localflavor/cl/forms.py:31
+msgid "The Chilean RUT is not valid."
+msgstr "Ce RUT chilien est invalide."
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr "Bade-Wurtemberg"
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr "Bavière"
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr "Berlin"
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr "Brandebourg"
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr "Brême"
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr "Hambourg"
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr "Hess"
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr "Mecklembourg-Poméranie occidentale"
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr "Basse Saxe"
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr "Rhénanie-du-Nord-Westphalie"
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr "Rhénanie-Palatinat"
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr "Sarre"
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr "Saxe"
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr "Saxe-Anhalt"
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr "Schleswig-Holstein"
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr "Thuringe"
+
+#: contrib/localflavor/de/forms.py:14 contrib/localflavor/fi/forms.py:12
+#: contrib/localflavor/fr/forms.py:15
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Entrez un code postal (format XXXXX)."
+
+#: contrib/localflavor/de/forms.py:41
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr ""
+"Entrez un numéro de carte d'identité Allemand (format XXXXXXXXXXX-XXXXXXX-"
+"XXXXXXX-X)."
+
+#: contrib/localflavor/es/es_provinces.py:5
+msgid "Arava"
+msgstr "Álava"
+
+#: contrib/localflavor/es/es_provinces.py:6
+msgid "Albacete"
+msgstr "Albacete"
+
+#: contrib/localflavor/es/es_provinces.py:7
+msgid "Alacant"
+msgstr "Alicante"
+
+#: contrib/localflavor/es/es_provinces.py:8
+msgid "Almeria"
+msgstr "Almería"
+
+#: contrib/localflavor/es/es_provinces.py:9
+msgid "Avila"
+msgstr "Ávila"
+
+#: contrib/localflavor/es/es_provinces.py:10
+msgid "Badajoz"
+msgstr "Badajoz"
+
+#: contrib/localflavor/es/es_provinces.py:11
+msgid "Illes Balears"
+msgstr "Îles Baléares"
+
+#: contrib/localflavor/es/es_provinces.py:12
+msgid "Barcelona"
+msgstr "Barcelone"
+
+#: contrib/localflavor/es/es_provinces.py:13
+msgid "Burgos"
+msgstr "Burgos"
+
+#: contrib/localflavor/es/es_provinces.py:14
+msgid "Caceres"
+msgstr "Cáceres"
+
+#: contrib/localflavor/es/es_provinces.py:15
+msgid "Cadiz"
+msgstr "Cadix"
+
+#: contrib/localflavor/es/es_provinces.py:16
+msgid "Castello"
+msgstr "Castellón"
+
+#: contrib/localflavor/es/es_provinces.py:17
+msgid "Ciudad Real"
+msgstr "Ciudad Real"
+
+#: contrib/localflavor/es/es_provinces.py:18
+msgid "Cordoba"
+msgstr "Córdoba"
+
+#: contrib/localflavor/es/es_provinces.py:19
+msgid "A Coruna"
+msgstr "La Corogne"
+
+#: contrib/localflavor/es/es_provinces.py:20
+msgid "Cuenca"
+msgstr "Cuenca"
+
+#: contrib/localflavor/es/es_provinces.py:21
+msgid "Girona"
+msgstr "Gérone"
+
+#: contrib/localflavor/es/es_provinces.py:22
+msgid "Granada"
+msgstr "Grenade"
+
+#: contrib/localflavor/es/es_provinces.py:23
+msgid "Guadalajara"
+msgstr "Guadalajara"
+
+#: contrib/localflavor/es/es_provinces.py:24
+msgid "Guipuzkoa"
+msgstr "Guipúzcoa"
+
+#: contrib/localflavor/es/es_provinces.py:25
+msgid "Huelva"
+msgstr "Huelva"
+
+#: contrib/localflavor/es/es_provinces.py:26
+msgid "Huesca"
+msgstr "Huesca"
+
+#: contrib/localflavor/es/es_provinces.py:27
+msgid "Jaen"
+msgstr "Jaén"
+
+#: contrib/localflavor/es/es_provinces.py:28
+msgid "Leon"
+msgstr "León"
+
+#: contrib/localflavor/es/es_provinces.py:29
+msgid "Lleida"
+msgstr "Lérida"
+
+#: contrib/localflavor/es/es_provinces.py:30
+#: contrib/localflavor/es/es_regions.py:17
+msgid "La Rioja"
+msgstr "La Rioja"
+
+#: contrib/localflavor/es/es_provinces.py:31
+msgid "Lugo"
+msgstr "Lugo"
+
+#: contrib/localflavor/es/es_provinces.py:32
+#: contrib/localflavor/es/es_regions.py:18
+msgid "Madrid"
+msgstr "Madrid"
+
+#: contrib/localflavor/es/es_provinces.py:33
+msgid "Malaga"
+msgstr "Málaga"
+
+#: contrib/localflavor/es/es_provinces.py:34
+msgid "Murcia"
+msgstr "Murcie"
+
+#: contrib/localflavor/es/es_provinces.py:35
+msgid "Navarre"
+msgstr "Navarre"
+
+#: contrib/localflavor/es/es_provinces.py:36
+msgid "Ourense"
+msgstr "Orense"
+
+#: contrib/localflavor/es/es_provinces.py:37
+msgid "Asturias"
+msgstr "Asturias"
+
+#: contrib/localflavor/es/es_provinces.py:38
+msgid "Palencia"
+msgstr "Palencia"
+
+#: contrib/localflavor/es/es_provinces.py:39
+msgid "Las Palmas"
+msgstr "Las Palmas"
+
+#: contrib/localflavor/es/es_provinces.py:40
+msgid "Pontevedra"
+msgstr "Pontevedra"
+
+#: contrib/localflavor/es/es_provinces.py:41
+msgid "Salamanca"
+msgstr "Salamanca"
+
+#: contrib/localflavor/es/es_provinces.py:42
+msgid "Santa Cruz de Tenerife"
+msgstr "Santa Cruz de Ténérife"
+
+#: contrib/localflavor/es/es_provinces.py:43
+#: contrib/localflavor/es/es_regions.py:11
+msgid "Cantabria"
+msgstr "Cantabrie"
+
+#: contrib/localflavor/es/es_provinces.py:44
+msgid "Segovia"
+msgstr "Ségovie"
+
+#: contrib/localflavor/es/es_provinces.py:45
+msgid "Seville"
+msgstr "Séville"
+
+#: contrib/localflavor/es/es_provinces.py:46
+msgid "Soria"
+msgstr "Soria"
+
+#: contrib/localflavor/es/es_provinces.py:47
+msgid "Tarragona"
+msgstr "Tarragone"
+
+#: contrib/localflavor/es/es_provinces.py:48
+msgid "Teruel"
+msgstr "Teruel"
+
+#: contrib/localflavor/es/es_provinces.py:49
+msgid "Toledo"
+msgstr "Toledo"
+
+#: contrib/localflavor/es/es_provinces.py:50
+msgid "Valencia"
+msgstr "Valence"
+
+#: contrib/localflavor/es/es_provinces.py:51
+msgid "Valladolid"
+msgstr "Valladolid"
+
+#: contrib/localflavor/es/es_provinces.py:52
+msgid "Bizkaia"
+msgstr "Biscaye"
+
+#: contrib/localflavor/es/es_provinces.py:53
+msgid "Zamora"
+msgstr "Zamora"
+
+#: contrib/localflavor/es/es_provinces.py:54
+msgid "Zaragoza"
+msgstr "Saragosse"
+
+#: contrib/localflavor/es/es_provinces.py:55
+msgid "Ceuta"
+msgstr "Ceuta"
+
+#: contrib/localflavor/es/es_provinces.py:56
+msgid "Melilla"
+msgstr "Melilla"
+
+#: contrib/localflavor/es/es_regions.py:5
+msgid "Andalusia"
+msgstr "Andalousie"
+
+#: contrib/localflavor/es/es_regions.py:6
+msgid "Aragon"
+msgstr "Aragon"
+
+#: contrib/localflavor/es/es_regions.py:7
+msgid "Principality of Asturias"
+msgstr "Principauté des Asturies"
+
+#: contrib/localflavor/es/es_regions.py:8
+msgid "Balearic Islands"
+msgstr "Îles Baléares"
+
+#: contrib/localflavor/es/es_regions.py:9
+msgid "Basque Country"
+msgstr "Pays basque"
+
+#: contrib/localflavor/es/es_regions.py:10
+msgid "Canary Islands"
+msgstr "Îles Canaries"
+
+#: contrib/localflavor/es/es_regions.py:12
+msgid "Castile-La Mancha"
+msgstr "Castille-La Manche"
+
+#: contrib/localflavor/es/es_regions.py:13
+msgid "Castile and Leon"
+msgstr "Castille-et-León"
+
+#: contrib/localflavor/es/es_regions.py:14
+msgid "Catalonia"
+msgstr "Catalogne"
+
+#: contrib/localflavor/es/es_regions.py:15
+msgid "Extremadura"
+msgstr "Estrémadure"
+
+#: contrib/localflavor/es/es_regions.py:16
+msgid "Galicia"
+msgstr "Galice"
+
+#: contrib/localflavor/es/es_regions.py:19
+msgid "Region of Murcia"
+msgstr "Murcie"
+
+#: contrib/localflavor/es/es_regions.py:20
+msgid "Foral Community of Navarre"
+msgstr "Navarre"
+
+#: contrib/localflavor/es/es_regions.py:21
+msgid "Valencian Community"
+msgstr "Communauté valencienne"
+
+#: contrib/localflavor/es/forms.py:19
+msgid "Enter a valid postal code in the range and format 01XXX - 52XXX."
+msgstr "Entrez un code postal dans la plage et au format 01XXX - 52XXX."
+
+#: contrib/localflavor/es/forms.py:39
+msgid ""
+"Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or "
+"9XXXXXXXX."
+msgstr "Entrez un numero de téléphone au format 6XXXXXXXX, 8XXXXXXXX ou "
+"9XXXXXXXX."
+
+#: contrib/localflavor/es/forms.py:66
+msgid "Please enter a valid NIF, NIE, or CIF."
+msgstr "Veuillez entrer une adresse NIF, NIE ou CIF valide."
+
+#: contrib/localflavor/es/forms.py:67
+msgid "Please enter a valid NIF or NIE."
+msgstr "Entrez un NIF ou NIE valide."
+
+#: contrib/localflavor/es/forms.py:68
+msgid "Invalid checksum for NIF."
+msgstr "Mauvais checksum pour NIF."
+
+#: contrib/localflavor/es/forms.py:69
+msgid "Invalid checksum for NIE."
+msgstr "Mauvais checksum pour NIE."
+
+#: contrib/localflavor/es/forms.py:70
+msgid "Invalid checksum for CIF."
+msgstr "Mauvais checksum pour CIF."
+
+#: contrib/localflavor/es/forms.py:142
+msgid ""
+"Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX."
+msgstr "Veuillez entrer un numéro de compte bancaire valide au format XXXXX-XXXX-XX-XXXXXXXXXX."
+
+#: contrib/localflavor/es/forms.py:143
+msgid "Invalid checksum for bank account number."
+msgstr "Mauvais checksum pour le numero de compte bancaire."
+
+#: contrib/localflavor/fi/forms.py:28
+msgid "Enter a valid Finnish social security number."
+msgstr "Entrez un numéro de sécurité sociale Finlandais."
+
+#: contrib/localflavor/in_/forms.py:14
+msgid "Enter a zip code in the format XXXXXXX."
+msgstr "Entrez un code postal au format XXXXXXX."
+
+#: contrib/localflavor/is_/forms.py:17
+msgid ""
+"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr "Entrez un code postal islandais valide (format XXXXXX-XXXX)."
+
+#: contrib/localflavor/is_/forms.py:18
+msgid "The Icelandic identification number is not valid."
+msgstr "Le numéro d'identification Islandais est invalide."
+
+#: contrib/localflavor/it/forms.py:14
+msgid "Enter a valid zip code."
+msgstr "Entrez un code postal valide."
+
+#: contrib/localflavor/it/forms.py:43
+msgid "Enter a valid Social Security number."
+msgstr "Entrez un numéro valide de Sécurité Sociale."
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr "Entrez une TVA valide."
+
+#: contrib/localflavor/jp/forms.py:17
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "Entrez un code postal Japonais (format XXXXXXX ou XXX-XXXX)."
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr "Hokkaidō"
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr "Aomori"
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr "Iwate"
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr "Miyagi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr "Akita"
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr "Yamagata"
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr "Fukushima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr "Ibaraki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr "Tochigi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr "Gunma"
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr "Saitama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr "Chiba"
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr "Tokyo"
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr "Kanagawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr "Yamanashi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr "Nagano"
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr "Niigata"
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr "Toyama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr "Ishikawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr "Fukui"
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr "Gifu"
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr "Shizuoka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr "Aichi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr "Mie"
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr "Shiga"
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr "Kyōto"
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr "Osaka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr "Hyōgo"
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr "Nara"
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr "Wakayama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr "Tottori"
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr "Shimane"
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr "Okayama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr "Hiroshima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr "Yamaguchi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr "Tokushima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr "Kagawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr "Ehime"
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr "Kochi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr "Fukuoka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr "Saga"
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr "Nagasaki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr "Kumamoto"
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr "Ōita"
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr "Miyazaki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr "Kagoshima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr "Okinawa"
+
+#: contrib/localflavor/mx/mx_states.py:12
+msgid "Aguascalientes"
+msgstr "Aguascalientes"
+
+#: contrib/localflavor/mx/mx_states.py:13
+msgid "Baja California"
+msgstr "Baja California"
+
+#: contrib/localflavor/mx/mx_states.py:14
+msgid "Baja California Sur"
+msgstr "Baja California Sur"
+
+#: contrib/localflavor/mx/mx_states.py:15
+msgid "Campeche"
+msgstr "Campeche"
+
+#: contrib/localflavor/mx/mx_states.py:16
+msgid "Chihuahua"
+msgstr "Chihuahua"
+
+#: contrib/localflavor/mx/mx_states.py:17
+msgid "Chiapas"
+msgstr "Chiapas"
+
+#: contrib/localflavor/mx/mx_states.py:18
+msgid "Coahuila"
+msgstr "Coahuila"
+
+#: contrib/localflavor/mx/mx_states.py:19
+msgid "Colima"
+msgstr "Colima"
+
+#: contrib/localflavor/mx/mx_states.py:20
+msgid "Distrito Federal"
+msgstr "District fédéral"
+
+#: contrib/localflavor/mx/mx_states.py:21
+msgid "Durango"
+msgstr "Durango"
+
+#: contrib/localflavor/mx/mx_states.py:22
+msgid "Guerrero"
+msgstr "Guerrero"
+
+#: contrib/localflavor/mx/mx_states.py:23
+msgid "Guanajuato"
+msgstr "Guanajuato"
+
+#: contrib/localflavor/mx/mx_states.py:24
+msgid "Hidalgo"
+msgstr "Hidalgo"
+
+#: contrib/localflavor/mx/mx_states.py:25
+msgid "Jalisco"
+msgstr "Jalisco"
+
+#: contrib/localflavor/mx/mx_states.py:26
+msgid "Estado de México"
+msgstr "État de Mexico"
+
+#: contrib/localflavor/mx/mx_states.py:27
+msgid "Michoacán"
+msgstr "Michoacán"
+
+#: contrib/localflavor/mx/mx_states.py:28
+msgid "Morelos"
+msgstr "Morelos"
+
+#: contrib/localflavor/mx/mx_states.py:29
+msgid "Nayarit"
+msgstr "Nayarit"
+
+#: contrib/localflavor/mx/mx_states.py:30
+msgid "Nuevo León"
+msgstr "Nuevo León"
+
+#: contrib/localflavor/mx/mx_states.py:31
+msgid "Oaxaca"
+msgstr "Oaxaca"
+
+#: contrib/localflavor/mx/mx_states.py:32
+msgid "Puebla"
+msgstr "Puebla"
+
+#: contrib/localflavor/mx/mx_states.py:33
+msgid "Querétaro"
+msgstr "Querétaro"
+
+#: contrib/localflavor/mx/mx_states.py:34
+msgid "Quintana Roo"
+msgstr "Quintana Roo"
+
+#: contrib/localflavor/mx/mx_states.py:35
+msgid "Sinaloa"
+msgstr "Sinaloa"
+
+#: contrib/localflavor/mx/mx_states.py:36
+msgid "San Luis Potosí"
+msgstr "San Luis Potosí"
+
+#: contrib/localflavor/mx/mx_states.py:37
+msgid "Sonora"
+msgstr "Sonora"
+
+#: contrib/localflavor/mx/mx_states.py:38
+msgid "Tabasco"
+msgstr "Tabasco"
+
+#: contrib/localflavor/mx/mx_states.py:39
+msgid "Tamaulipas"
+msgstr "Tamaulipas"
+
+#: contrib/localflavor/mx/mx_states.py:40
+msgid "Tlaxcala"
+msgstr "Tlaxcala"
+
+#: contrib/localflavor/mx/mx_states.py:41
+msgid "Veracruz"
+msgstr "Veracruz"
+
+#: contrib/localflavor/mx/mx_states.py:42
+msgid "Yucatán"
+msgstr "Yucatán"
+
+#: contrib/localflavor/mx/mx_states.py:43
+msgid "Zacatecas"
+msgstr "Zacatecas"
+
+#: contrib/localflavor/nl/forms.py:21
+msgid "Enter a valid postal code"
+msgstr "Entrez un code postal valide."
+
+#: contrib/localflavor/nl/forms.py:52
+msgid "Enter a valid phone number"
+msgstr "Entrez un numero de telephone valide."
+
+#: contrib/localflavor/nl/forms.py:78
+msgid "Enter a valid SoFi number"
+msgstr "Entrez un numero SoFi valide."
+
+#: contrib/localflavor/nl/nl_provinces.py:4
+msgid "Drente"
+msgstr "Drenthe"
+
+#: contrib/localflavor/nl/nl_provinces.py:5
+msgid "Flevoland"
+msgstr "Flevoland"
+
+#: contrib/localflavor/nl/nl_provinces.py:6
+msgid "Friesland"
+msgstr "Frise"
+
+#: contrib/localflavor/nl/nl_provinces.py:7
+msgid "Gelderland"
+msgstr "Gueldre"
+
+#: contrib/localflavor/nl/nl_provinces.py:8
+msgid "Groningen"
+msgstr "Groningue"
+
+#: contrib/localflavor/nl/nl_provinces.py:9
+msgid "Limburg"
+msgstr "Limbourg"
+
+#: contrib/localflavor/nl/nl_provinces.py:10
+msgid "Noord-Brabant"
+msgstr "Brabant-du-Nord"
+
+#: contrib/localflavor/nl/nl_provinces.py:11
+msgid "Noord-Holland"
+msgstr "Hollande-du-Nord"
+
+#: contrib/localflavor/nl/nl_provinces.py:12
+msgid "Overijssel"
+msgstr "Overijssel"
+
+#: contrib/localflavor/nl/nl_provinces.py:13
+msgid "Utrecht"
+msgstr "Utrecht"
+
+#: contrib/localflavor/nl/nl_provinces.py:14
+msgid "Zeeland"
+msgstr "Zeeland"
+
+#: contrib/localflavor/nl/nl_provinces.py:15
+msgid "Zuid-Holland"
+msgstr "Hollande-Méridionale"
+
+#: contrib/localflavor/no/forms.py:33
+msgid "Enter a valid Norwegian social security number."
+msgstr "Entrez un numéro de sécurité sociale Norvégien."
+
+#: contrib/localflavor/pe/forms.py:24
+msgid "This field requires 8 digits."
+msgstr "Ce champ requiert 8 chiffres."
+
+#: contrib/localflavor/pe/forms.py:52
+msgid "This field requires 11 digits."
+msgstr "Ce champ requiert 11 chiffres."
+
+#: contrib/localflavor/pl/forms.py:39
+msgid "National Identification Number consists of 11 digits."
+msgstr "Le numéro national d'identification (NIN) comporte 11 chiffres."
+
+#: contrib/localflavor/pl/forms.py:40
+msgid "Wrong checksum for the National Identification Number."
+msgstr "Mavais checksum pour le·\"National·Identification·Number\"."
+
+#: contrib/localflavor/pl/forms.py:72
+msgid ""
+"Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX."
+msgstr "Entrez un code NIP (impots) au format XXX-XXX-XX-XX ou XX-XX-XXX-XXX."
+
+#: contrib/localflavor/pl/forms.py:73
+msgid "Wrong checksum for the Tax Number (NIP)."
+msgstr "Mavais checksum pour le \"Tax·Number\"·(NIP)."
+
+#: contrib/localflavor/pl/forms.py:112
+msgid "National Business Register Number (REGON) consists of 7 or 9 digits."
+msgstr "Le \"National·Business·Register·Number\"·(REGON) comporte 7 ou 9 chiffres."
+
+#: contrib/localflavor/pl/forms.py:113
+msgid "Wrong checksum for the National Business Register Number (REGON)."
+msgstr "Mavais checksum pour le \"National·Business·Register·Number\"·(REGON)."
+
+#: contrib/localflavor/pl/forms.py:156
+msgid "Enter a postal code in the format XX-XXX."
+msgstr "Entrez un code postal  au format XX-XXX."
+
+#: contrib/localflavor/pl/pl_voivodeships.py:8
+msgid "Lower Silesia"
+msgstr "Basse-Silésie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:9
+msgid "Kuyavia-Pomerania"
+msgstr "Cujavie-Poméranie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:10
+msgid "Lublin"
+msgstr "Lublin"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:11
+msgid "Lubusz"
+msgstr "Lubusz"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:12
+msgid "Lodz"
+msgstr "Łódź"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:13
+msgid "Lesser Poland"
+msgstr "Petite-Pologne"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:14
+msgid "Masovia"
+msgstr "Mazovie "
+
+#: contrib/localflavor/pl/pl_voivodeships.py:15
+msgid "Opole"
+msgstr "Opole"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:16
+msgid "Subcarpatia"
+msgstr "Basses-Carpates"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:17
+msgid "Podlasie"
+msgstr "Podlachie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:18
+msgid "Pomerania"
+msgstr "Poméranie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:19
+msgid "Silesia"
+msgstr "Silésie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:20
+msgid "Swietokrzyskie"
+msgstr "Swietokrzyskie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:21
+msgid "Warmia-Masuria"
+msgstr "Varmie-Mazurie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:22
+msgid "Greater Poland"
+msgstr "Grande-Pologne"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:23
+msgid "West Pomerania"
+msgstr "Poméranie Occidentale"
+
+#: contrib/localflavor/sk/forms.py:30
+msgid "Enter a postal code in the format XXXXX or XXX XX."
+msgstr "Entrez un code postal au format XXXXX ou XXX XX."
+
+#: contrib/localflavor/sk/sk_districts.py:8
+msgid "Banska Bystrica"
+msgstr "Banská Bystrica"
+
+#: contrib/localflavor/sk/sk_districts.py:9
+msgid "Banska Stiavnica"
+msgstr "Banská Štiavnica"
+
+#: contrib/localflavor/sk/sk_districts.py:10
+msgid "Bardejov"
+msgstr "Bardejov"
+
+#: contrib/localflavor/sk/sk_districts.py:11
+msgid "Banovce nad Bebravou"
+msgstr "Bánovce nad Bebravou"
+
+#: contrib/localflavor/sk/sk_districts.py:12
+msgid "Brezno"
+msgstr "Brezno"
+
+#: contrib/localflavor/sk/sk_districts.py:13
+msgid "Bratislava I"
+msgstr "Bratislava·I"
+
+#: contrib/localflavor/sk/sk_districts.py:14
+msgid "Bratislava II"
+msgstr "Bratislava·II"
+
+#: contrib/localflavor/sk/sk_districts.py:15
+msgid "Bratislava III"
+msgstr "Bratislava·III"
+
+#: contrib/localflavor/sk/sk_districts.py:16
+msgid "Bratislava IV"
+msgstr "Bratislava·IV"
+
+#: contrib/localflavor/sk/sk_districts.py:17
+msgid "Bratislava V"
+msgstr "Bratislava·V"
+
+#: contrib/localflavor/sk/sk_districts.py:18
+msgid "Bytca"
+msgstr "Bytča"
+
+#: contrib/localflavor/sk/sk_districts.py:19
+msgid "Cadca"
+msgstr "Čadca"
+
+#: contrib/localflavor/sk/sk_districts.py:20
+msgid "Detva"
+msgstr "Detva"
+
+#: contrib/localflavor/sk/sk_districts.py:21
+msgid "Dolny Kubin"
+msgstr "Dolný Kubín"
+
+#: contrib/localflavor/sk/sk_districts.py:22
+msgid "Dunajska Streda"
+msgstr "Dunajská Streda"
+
+#: contrib/localflavor/sk/sk_districts.py:23
+msgid "Galanta"
+msgstr "Galanta"
+
+#: contrib/localflavor/sk/sk_districts.py:24
+msgid "Gelnica"
+msgstr "Gelnica"
+
+#: contrib/localflavor/sk/sk_districts.py:25
+msgid "Hlohovec"
+msgstr "Hlohovec"
+
+#: contrib/localflavor/sk/sk_districts.py:26
+msgid "Humenne"
+msgstr "Humenné"
+
+#: contrib/localflavor/sk/sk_districts.py:27
+msgid "Ilava"
+msgstr "Ilava"
+
+#: contrib/localflavor/sk/sk_districts.py:28
+msgid "Kezmarok"
+msgstr "Kežmarok"
+
+#: contrib/localflavor/sk/sk_districts.py:29
+msgid "Komarno"
+msgstr "Komárno"
+
+#: contrib/localflavor/sk/sk_districts.py:30
+msgid "Kosice I"
+msgstr "Košice I"
+
+#: contrib/localflavor/sk/sk_districts.py:31
+msgid "Kosice II"
+msgstr "Košice·II"
+
+#: contrib/localflavor/sk/sk_districts.py:32
+msgid "Kosice III"
+msgstr "Košice III"
+
+#: contrib/localflavor/sk/sk_districts.py:33
+msgid "Kosice IV"
+msgstr "Košice·IV"
+
+#: contrib/localflavor/sk/sk_districts.py:34
+msgid "Kosice - okolie"
+msgstr "Košice–okolie"
+
+#: contrib/localflavor/sk/sk_districts.py:35
+msgid "Krupina"
+msgstr "Krupina"
+
+#: contrib/localflavor/sk/sk_districts.py:36
+msgid "Kysucke Nove Mesto"
+msgstr "Kysucké Nové Mesto"
+
+#: contrib/localflavor/sk/sk_districts.py:37
+msgid "Levice"
+msgstr "Levice"
+
+#: contrib/localflavor/sk/sk_districts.py:38
+msgid "Levoca"
+msgstr "Levoča"
+
+#: contrib/localflavor/sk/sk_districts.py:39
+msgid "Liptovsky Mikulas"
+msgstr "Liptovský Mikuláš"
+
+#: contrib/localflavor/sk/sk_districts.py:40
+msgid "Lucenec"
+msgstr "Lučenec"
+
+#: contrib/localflavor/sk/sk_districts.py:41
+msgid "Malacky"
+msgstr "Malacky"
+
+#: contrib/localflavor/sk/sk_districts.py:42
+msgid "Martin"
+msgstr "Martin"
+
+#: contrib/localflavor/sk/sk_districts.py:43
+msgid "Medzilaborce"
+msgstr "Medzilaborce"
+
+#: contrib/localflavor/sk/sk_districts.py:44
+msgid "Michalovce"
+msgstr "Michalovce"
+
+#: contrib/localflavor/sk/sk_districts.py:45
+msgid "Myjava"
+msgstr "Myjava"
+
+#: contrib/localflavor/sk/sk_districts.py:46
+msgid "Namestovo"
+msgstr "Námestovo"
+
+#: contrib/localflavor/sk/sk_districts.py:47
+msgid "Nitra"
+msgstr "Nitra"
+
+#: contrib/localflavor/sk/sk_districts.py:48
+msgid "Nove Mesto nad Vahom"
+msgstr "Nové Mesto nad Váhom"
+
+#: contrib/localflavor/sk/sk_districts.py:49
+msgid "Nove Zamky"
+msgstr "Nové Zámky"
+
+#: contrib/localflavor/sk/sk_districts.py:50
+msgid "Partizanske"
+msgstr "Partizánske"
+
+#: contrib/localflavor/sk/sk_districts.py:51
+msgid "Pezinok"
+msgstr "Pezinok"
+
+#: contrib/localflavor/sk/sk_districts.py:52
+msgid "Piestany"
+msgstr "Piešťany"
+
+#: contrib/localflavor/sk/sk_districts.py:53
+msgid "Poltar"
+msgstr "Poltár"
+
+#: contrib/localflavor/sk/sk_districts.py:54
+msgid "Poprad"
+msgstr "Poprad"
+
+#: contrib/localflavor/sk/sk_districts.py:55
+msgid "Povazska Bystrica"
+msgstr "Považská Bystrica"
+
+#: contrib/localflavor/sk/sk_districts.py:56
+msgid "Presov"
+msgstr "Prešov"
+
+#: contrib/localflavor/sk/sk_districts.py:57
+msgid "Prievidza"
+msgstr "Prievidza"
+
+#: contrib/localflavor/sk/sk_districts.py:58
+msgid "Puchov"
+msgstr "Púchov"
+
+#: contrib/localflavor/sk/sk_districts.py:59
+msgid "Revuca"
+msgstr "Revúca"
+
+#: contrib/localflavor/sk/sk_districts.py:60
+msgid "Rimavska Sobota"
+msgstr "Rimavská Sobota"
+
+#: contrib/localflavor/sk/sk_districts.py:61
+msgid "Roznava"
+msgstr "Rožňava"
+
+#: contrib/localflavor/sk/sk_districts.py:62
+msgid "Ruzomberok"
+msgstr "Ružomberok"
+
+#: contrib/localflavor/sk/sk_districts.py:63
+msgid "Sabinov"
+msgstr "Sabinov"
+
+#: contrib/localflavor/sk/sk_districts.py:64
+msgid "Senec"
+msgstr "Senec"
+
+#: contrib/localflavor/sk/sk_districts.py:65
+msgid "Senica"
+msgstr "Senica"
+
+#: contrib/localflavor/sk/sk_districts.py:66
+msgid "Skalica"
+msgstr "Skalica"
+
+#: contrib/localflavor/sk/sk_districts.py:67
+msgid "Snina"
+msgstr "Snina"
+
+#: contrib/localflavor/sk/sk_districts.py:68
+msgid "Sobrance"
+msgstr "Sobrance"
+
+#: contrib/localflavor/sk/sk_districts.py:69
+msgid "Spisska Nova Ves"
+msgstr "Spišská Nová Ves"
+
+#: contrib/localflavor/sk/sk_districts.py:70
+msgid "Stara Lubovna"
+msgstr "Stará Ľubovňa"
+
+#: contrib/localflavor/sk/sk_districts.py:71
+msgid "Stropkov"
+msgstr "Stropkov"
+
+#: contrib/localflavor/sk/sk_districts.py:72
+msgid "Svidnik"
+msgstr "Svidník"
+
+#: contrib/localflavor/sk/sk_districts.py:73
+msgid "Sala"
+msgstr "Šaľa"
+
+#: contrib/localflavor/sk/sk_districts.py:74
+msgid "Topolcany"
+msgstr "Topoľčany"
+
+#: contrib/localflavor/sk/sk_districts.py:75
+msgid "Trebisov"
+msgstr "Trebišov"
+
+#: contrib/localflavor/sk/sk_districts.py:76
+msgid "Trencin"
+msgstr "Trenčín"
+
+#: contrib/localflavor/sk/sk_districts.py:77
+msgid "Trnava"
+msgstr "Trnava"
+
+#: contrib/localflavor/sk/sk_districts.py:78
+msgid "Turcianske Teplice"
+msgstr "Turčianske Teplice"
+
+#: contrib/localflavor/sk/sk_districts.py:79
+msgid "Tvrdosin"
+msgstr "Tvrdošín"
+
+#: contrib/localflavor/sk/sk_districts.py:80
+msgid "Velky Krtis"
+msgstr "Veľký Krtíš"
+
+#: contrib/localflavor/sk/sk_districts.py:81
+msgid "Vranov nad Toplou"
+msgstr "Vranov nad Topľou"
+
+#: contrib/localflavor/sk/sk_districts.py:82
+msgid "Zlate Moravce"
+msgstr "Zlaté Moravce"
+
+#: contrib/localflavor/sk/sk_districts.py:83
+msgid "Zvolen"
+msgstr "Zvolen"
+
+#: contrib/localflavor/sk/sk_districts.py:84
+msgid "Zarnovica"
+msgstr "Žarnovica"
+
+#: contrib/localflavor/sk/sk_districts.py:85
+msgid "Ziar nad Hronom"
+msgstr "Žiar nad Hronom"
+
+#: contrib/localflavor/sk/sk_districts.py:86
+msgid "Zilina"
+msgstr "Žilina"
+
+#: contrib/localflavor/sk/sk_regions.py:8
+msgid "Banska Bystrica region"
+msgstr "Région de Banská Bystrica"
+
+#: contrib/localflavor/sk/sk_regions.py:9
+msgid "Bratislava region"
+msgstr "Région de Bratislava"
+
+#: contrib/localflavor/sk/sk_regions.py:10
+msgid "Kosice region"
+msgstr "Région de Košice"
+
+#: contrib/localflavor/sk/sk_regions.py:11
+msgid "Nitra region"
+msgstr "Nitra"
+
+#: contrib/localflavor/sk/sk_regions.py:12
+msgid "Presov region"
+msgstr "Prešov"
+
+#: contrib/localflavor/sk/sk_regions.py:13
+msgid "Trencin region"
+msgstr "Trenčín"
+
+#: contrib/localflavor/sk/sk_regions.py:14
+msgid "Trnava region"
+msgstr "Trnava"
+
+#: contrib/localflavor/sk/sk_regions.py:15
+msgid "Zilina region"
+msgstr "Žilina"
+
+#: contrib/localflavor/uk/forms.py:21
+msgid "Enter a valid postcode."
+msgstr "Entrez un code postal valide."
+
+#: contrib/localflavor/uk/uk_regions.py:11
+msgid "Bedfordshire"
+msgstr "Bedfordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:12
+msgid "Buckinghamshire"
+msgstr "Buckinghamshire"
+
+#: contrib/localflavor/uk/uk_regions.py:14
+msgid "Cheshire"
+msgstr "Cheshire"
+
+#: contrib/localflavor/uk/uk_regions.py:15
+msgid "Cornwall and Isles of Scilly"
+msgstr "Cornouailles et les îles Scilly"
+
+#: contrib/localflavor/uk/uk_regions.py:16
+msgid "Cumbria"
+msgstr "Cumbrie"
+
+#: contrib/localflavor/uk/uk_regions.py:17
+msgid "Derbyshire"
+msgstr "Derbyshire"
+
+#: contrib/localflavor/uk/uk_regions.py:18
+msgid "Devon"
+msgstr "Devon"
+
+#: contrib/localflavor/uk/uk_regions.py:19
+msgid "Dorset"
+msgstr "Dorset"
+
+#: contrib/localflavor/uk/uk_regions.py:20
+msgid "Durham"
+msgstr "Durham"
+
+#: contrib/localflavor/uk/uk_regions.py:21
+msgid "East Sussex"
+msgstr "Sussex de l'Est"
+
+#: contrib/localflavor/uk/uk_regions.py:22
+msgid "Essex"
+msgstr "Essex"
+
+#: contrib/localflavor/uk/uk_regions.py:23
+msgid "Gloucestershire"
+msgstr "Gloucestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:24
+msgid "Greater London"
+msgstr "Grand Londres"
+
+#: contrib/localflavor/uk/uk_regions.py:25
+msgid "Greater Manchester"
+msgstr "Grand Manchester"
+
+#: contrib/localflavor/uk/uk_regions.py:26
+msgid "Hampshire"
+msgstr "Hampshire"
+
+#: contrib/localflavor/uk/uk_regions.py:27
+msgid "Hertfordshire"
+msgstr "Hertfordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:28
+msgid "Kent"
+msgstr "Kent"
+
+#: contrib/localflavor/uk/uk_regions.py:29
+msgid "Lancashire"
+msgstr "Lancastre"
+
+#: contrib/localflavor/uk/uk_regions.py:30
+msgid "Leicestershire"
+msgstr "Leicestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:31
+msgid "Lincolnshire"
+msgstr "Lincolnshire"
+
+#: contrib/localflavor/uk/uk_regions.py:32
+msgid "Merseyside"
+msgstr "Merseyside"
+
+#: contrib/localflavor/uk/uk_regions.py:33
+msgid "Norfolk"
+msgstr "Norfolk"
+
+#: contrib/localflavor/uk/uk_regions.py:34
+msgid "North Yorkshire"
+msgstr "Yorkshire du Nord"
+
+#: contrib/localflavor/uk/uk_regions.py:35
+msgid "Northamptonshire"
+msgstr "Northamptonshire"
+
+#: contrib/localflavor/uk/uk_regions.py:36
+msgid "Northumberland"
+msgstr "Northumberland"
+
+#: contrib/localflavor/uk/uk_regions.py:37
+msgid "Nottinghamshire"
+msgstr "Nottinghamshire"
+
+#: contrib/localflavor/uk/uk_regions.py:38
+msgid "Oxfordshire"
+msgstr "Oxfordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:39
+msgid "Shropshire"
+msgstr "Shropshire"
+
+#: contrib/localflavor/uk/uk_regions.py:40
+msgid "Somerset"
+msgstr "Somerset"
+
+#: contrib/localflavor/uk/uk_regions.py:41
+msgid "South Yorkshire"
+msgstr "Yorkshire du Su"
+
+#: contrib/localflavor/uk/uk_regions.py:42
+msgid "Staffordshire"
+msgstr "Staffordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:43
+msgid "Suffolk"
+msgstr "Suffolk"
+
+#: contrib/localflavor/uk/uk_regions.py:44
+msgid "Surrey"
+msgstr "Surrey"
+
+#: contrib/localflavor/uk/uk_regions.py:45
+msgid "Tyne and Wear"
+msgstr "Tyne et Wear"
+
+#: contrib/localflavor/uk/uk_regions.py:46
+msgid "Warwickshire"
+msgstr "Warwickshire"
+
+#: contrib/localflavor/uk/uk_regions.py:47
+msgid "West Midlands"
+msgstr "Midlands de l'Ouest"
+
+#: contrib/localflavor/uk/uk_regions.py:48
+msgid "West Sussex"
+msgstr "Sussex de l'Ouest"
+
+#: contrib/localflavor/uk/uk_regions.py:49
+msgid "West Yorkshire"
+msgstr "Yorkshire de l'Ouest"
+
+#: contrib/localflavor/uk/uk_regions.py:50
+msgid "Wiltshire"
+msgstr "Wiltshire"
+
+#: contrib/localflavor/uk/uk_regions.py:51
+msgid "Worcestershire"
+msgstr "Worcestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:55
+msgid "County Antrim"
+msgstr "Comté d'Antrim"
+
+#: contrib/localflavor/uk/uk_regions.py:56
+msgid "County Armagh"
+msgstr "Comté d'Armagh"
+
+#: contrib/localflavor/uk/uk_regions.py:57
+msgid "County Down"
+msgstr "Comté de Down"
+
+#: contrib/localflavor/uk/uk_regions.py:58
+msgid "County Fermanagh"
+msgstr "Comté de Fermanagh"
+
+#: contrib/localflavor/uk/uk_regions.py:59
+msgid "County Londonderry"
+msgstr "Comté de Londonderry"
+
+#: contrib/localflavor/uk/uk_regions.py:60
+msgid "County Tyrone"
+msgstr "Comté de Tyrone"
+
+#: contrib/localflavor/uk/uk_regions.py:64
+msgid "Clwyd"
+msgstr "Clwyd"
+
+#: contrib/localflavor/uk/uk_regions.py:65
+msgid "Dyfed"
+msgstr "Dyfed"
+
+#: contrib/localflavor/uk/uk_regions.py:66
+msgid "Gwent"
+msgstr "Gwent"
+
+#: contrib/localflavor/uk/uk_regions.py:67
+msgid "Gwynedd"
+msgstr "Gwynedd"
+
+#: contrib/localflavor/uk/uk_regions.py:68
+msgid "Mid Glamorgan"
+msgstr "Mid·Glamorgan"
+
+#: contrib/localflavor/uk/uk_regions.py:69
+msgid "Powys"
+msgstr "Powys"
+
+#: contrib/localflavor/uk/uk_regions.py:70
+msgid "South Glamorgan"
+msgstr "South Glamorgan"
+
+#: contrib/localflavor/uk/uk_regions.py:71
+msgid "West Glamorgan"
+msgstr "West Glamorgan"
+
+#: contrib/localflavor/uk/uk_regions.py:75
+msgid "Borders"
+msgstr "Borders"
+
+#: contrib/localflavor/uk/uk_regions.py:76
+msgid "Central Scotland"
+msgstr "Centre"
+
+#: contrib/localflavor/uk/uk_regions.py:77
+msgid "Dumfries and Galloway"
+msgstr "Dumfries and Galloway"
+
+#: contrib/localflavor/uk/uk_regions.py:78
+msgid "Fife"
+msgstr "Fife"
+
+#: contrib/localflavor/uk/uk_regions.py:79
+msgid "Grampian"
+msgstr "Grampian"
+
+#: contrib/localflavor/uk/uk_regions.py:80
+msgid "Highland"
+msgstr "Highland"
+
+#: contrib/localflavor/uk/uk_regions.py:81
+msgid "Lothian"
+msgstr "Lothian"
+
+#: contrib/localflavor/uk/uk_regions.py:82
+msgid "Orkney Islands"
+msgstr "Orcades"
+
+#: contrib/localflavor/uk/uk_regions.py:83
+msgid "Shetland Islands"
+msgstr "îles Shetland"
+
+#: contrib/localflavor/uk/uk_regions.py:84
+msgid "Strathclyde"
+msgstr "Strathclyde"
+
+#: contrib/localflavor/uk/uk_regions.py:85
+msgid "Tayside"
+msgstr "Tayside"
+
+#: contrib/localflavor/uk/uk_regions.py:86
+msgid "Western Isles"
+msgstr "Hébrides extérieures"
+
+#: contrib/localflavor/uk/uk_regions.py:90
+msgid "England"
+msgstr "Angleterre"
+
+#: contrib/localflavor/uk/uk_regions.py:91
+msgid "Northern Ireland"
+msgstr "Irlande du Nord"
+
+#: contrib/localflavor/uk/uk_regions.py:92
+msgid "Scotland"
+msgstr "Écosse"
+
+#: contrib/localflavor/uk/uk_regions.py:93
+msgid "Wales"
+msgstr "Pays de Galles"
+
+#: contrib/localflavor/us/forms.py:16
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "Entrez un code postal Américain (format XXXXX ou XXXXX-XXXX)."
+
+#: contrib/localflavor/us/forms.py:54
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr "Entrez un numéro de sécurité sociale Américain (format XXX-XX-XXXX)."
+
+#: contrib/localflavor/za/forms.py:20
+msgid "Enter a valid South African ID number"
+msgstr "Entrez un numero d'identification sud-africain valide."
+
+#: contrib/localflavor/za/forms.py:54
+msgid "Enter a valid South African postal code"
+msgstr "Entrez un code postal sud-africain valide."
+
+#: contrib/localflavor/za/za_provinces.py:4
+msgid "Eastern Cape"
+msgstr "Cap-Oriental"
+
+#: contrib/localflavor/za/za_provinces.py:5
+msgid "Free State"
+msgstr "État-Libre"
+
+#: contrib/localflavor/za/za_provinces.py:6
+msgid "Gauteng"
+msgstr "Gauteng"
+
+#: contrib/localflavor/za/za_provinces.py:7
+msgid "KwaZulu-Natal"
+msgstr "KwaZulu-Natal"
+
+#: contrib/localflavor/za/za_provinces.py:8
+msgid "Limpopo"
+msgstr "Limpopo"
+
+#: contrib/localflavor/za/za_provinces.py:9
+msgid "Mpumalanga"
+msgstr "Mpumalanga"
+
+#: contrib/localflavor/za/za_provinces.py:10
+msgid "Northern Cape"
+msgstr "Cap-du-Nord"
+
+#: contrib/localflavor/za/za_provinces.py:11
+msgid "North West"
+msgstr "Nord-Ouest"
+
+#: contrib/localflavor/za/za_provinces.py:12
+msgid "Western Cape"
+msgstr "Cap-Occidental"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "redirigé depuis"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Ceci doit être un chemin absolu, sans nom de domaine. Par exemple: '/"
+"evenements/rechercher/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "redirigé vers"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Ceci peut être soit un chemin absolu (voir ci-dessus) soit une URL complète "
+"débutant par 'http://'."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "redirige"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "redirige"
+
+#: contrib/sessions/models.py:41
+msgid "session key"
+msgstr "clé de session"
+
+#: contrib/sessions/models.py:42
+msgid "session data"
+msgstr "données de session"
+
+#: contrib/sessions/models.py:43
+msgid "expire date"
+msgstr "date d'expiration"
+
+#: contrib/sessions/models.py:48
+msgid "session"
+msgstr "session"
+
+#: contrib/sessions/models.py:49
+msgid "sessions"
+msgstr "sessions"
+
+#: contrib/sites/models.py:32
+msgid "domain name"
+msgstr "nom de domaine"
+
+#: contrib/sites/models.py:33
+msgid "display name"
+msgstr "nom à afficher"
+
+#: contrib/sites/models.py:37
+msgid "site"
+msgstr "site"
+
+#: contrib/sites/models.py:38
+msgid "sites"
+msgstr "sites"
+
+#: core/validators.py:72
+msgid "This value must contain only letters, numbers and underscores."
+msgstr ""
+"Ce champ ne doit contenir que des lettres, des nombres et destirets bas _."
+
+#: core/validators.py:76
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Ce champ ne doit contenir que des lettres, des nombres, des tirets bas _,des "
+"traits d'union, et des '/'."
+
+#: core/validators.py:80
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr ""
+"Ce champ ne doit contenir que des lettres, des nombres, des tirets bas _et "
+"des traits d'union."
+
+#: core/validators.py:84
+msgid "Uppercase letters are not allowed here."
+msgstr "Les lettres majuscules ne sont pas autorisées ici."
+
+#: core/validators.py:88
+msgid "Lowercase letters are not allowed here."
+msgstr "Les lettres minuscules ne sont pas autorisées ici."
+
+#: core/validators.py:95
+msgid "Enter only digits separated by commas."
+msgstr "Saisissez uniquement des chiffres séparés par des virgules."
+
+#: core/validators.py:107
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Entrez des adresses de courriel valides séparées par des virgules."
+
+#: core/validators.py:111
+msgid "Please enter a valid IP address."
+msgstr "Entrez une adresse IP valide."
+
+#: core/validators.py:115
+msgid "Empty values are not allowed here."
+msgstr "Vous ne pouvez pas laisser ce champ vide."
+
+#: core/validators.py:119
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Les caractères non numériques ne sont pas autorisés ici."
+
+#: core/validators.py:123
+msgid "This value can't be comprised solely of digits."
+msgstr "Cette valeur ne peut pas être composé uniquement de chiffres."
+
+#: core/validators.py:128 newforms/fields.py:151
+msgid "Enter a whole number."
+msgstr "Entrez un nombre entier."
+
+#: core/validators.py:132
+msgid "Only alphabetical characters are allowed here."
+msgstr "Seules les lettres de l'alphabet sont autorisées ici."
+
+#: core/validators.py:147
+msgid "Year must be 1900 or later."
+msgstr "L'année doit être supérieure à 1900."
+
+#: core/validators.py:151
+#, python-format
+msgid "Invalid date: %s"
+msgstr "Date invalide : %s"
+
+#: core/validators.py:156 db/models/fields/__init__.py:522
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Entrez une date valide au format AAAA-MM-JJ."
+
+#: core/validators.py:161
+msgid "Enter a valid time in HH:MM format."
+msgstr "Entrez une heure valide au format HH:MM."
+
+#: core/validators.py:165 db/models/fields/__init__.py:599
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Entrez une date et une heure valide au format AAAA-MM-JJ HH:MM."
+
+#: core/validators.py:170 newforms/fields.py:402
+msgid "Enter a valid e-mail address."
+msgstr "Entrez une adresse de courriel valide."
+
+#: core/validators.py:182 core/validators.py:474 newforms/fields.py:432
+#: oldforms/__init__.py:687
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Aucun fichier n'a été soumis. Vérifiez le type d'encodage du formulaire."
+
+#: core/validators.py:193 newforms/fields.py:458
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Envoyez une image valide. Le fichier que vous avez transferé n'est pas une "
+"image ou bien est corrompu."
+
+#: core/validators.py:200
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "L'URL %s ne pointe pas vers une image valide."
+
+#: core/validators.py:204
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Les numéros de téléphone doivent être au format XXX-XXX-XXXX. \"%s\" est "
+"incorrect."
+
+#: core/validators.py:212
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "L'URL %s ne pointe pas vers une vidéo QuickTime valide."
+
+#: core/validators.py:216
+msgid "A valid URL is required."
+msgstr "Une URL valide est requise."
+
+#: core/validators.py:230
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Du HTML valide est requis. Les erreurs sont les suivantes :\n"
+"%s"
+
+#: core/validators.py:237
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "XML mal formé : %s"
+
+#: core/validators.py:254
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "URL invalide : %s"
+
+#: core/validators.py:259 core/validators.py:261
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "L'URL %s est un lien cassé."
+
+#: core/validators.py:267
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Entrez une abréviation d'État Américain valide."
+
+#: core/validators.py:281
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgstr "Attention à votre langage ! Le mot %s n'est pas autorisé ici."
+
+#: core/validators.py:288
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Ce champ doit correspondre au champ '%s'."
+
+#: core/validators.py:307
+msgid "Please enter something for at least one field."
+msgstr "Veuillez saisir quelque chose dans au moins un des champs."
+
+#: core/validators.py:316 core/validators.py:327
+msgid "Please enter both fields or leave them both empty."
+msgstr ""
+"Veuillez renseigner les deux champs ou les laisser tous les deux vides."
+
+#: core/validators.py:335
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Ce champ doit être renseigné si %(field)s vaut %(value)s"
+
+#: core/validators.py:348
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Ce champ doit être renseigné si %(field)s ne vaut pas %(value)s"
+
+#: core/validators.py:367
+msgid "Duplicate values are not allowed."
+msgstr "Les valeurs identiques ne sont pas autorisées."
+
+#: core/validators.py:382
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Cette valeur doit être comprise entre %(lower)s et %(upper)s."
+
+#: core/validators.py:384
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Cette valeur doit être au moins %s."
+
+#: core/validators.py:386
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Cette valeur ne doit pas dépasser %s."
+
+#: core/validators.py:427
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Cette valeur doit être une puissance de %s."
+
+#: core/validators.py:437
+msgid "Please enter a valid decimal number."
+msgstr "Veuillez saisir un nombre décimal valide."
+
+#: core/validators.py:444
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+"Please enter a valid decimal number with at most %s total digits."
+msgstr "Veuillez saisir un nombre décimal valide avec au plus %s chiffre."
+"Veuillez saisir un nombre décimal valide avec au plus %s chiffres."
+
+#: core/validators.py:447
+#, python-format
+msgid ""
+"Please enter a valid decimal number with a whole part of at most %s digit."
+"Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr ""
+"Veuillez saisir un nombre décimal valide avec une partie entière de %s "
+"chiffre au plus."
+"Veuillez saisir un nombre décimal valide avec une partie entière de %s "
+"chiffres au plus."
+
+#: core/validators.py:450
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr "Veuillez saisir un nombre décimal valide avec au plus %s chiffre après la virgiule."
+"Veuillez saisir un nombre décimal valide avec au plus %s chiffres après la virgiule."
+
+#: core/validators.py:458
+msgid "Please enter a valid floating point number."
+msgstr "Veuillez entrer un nombre à virgule flottante valide."
+
+#: core/validators.py:467
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Vérifiez que le fichier transféré fait au moins %s octets."
+
+#: core/validators.py:468
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Vérifiez que le fichier transféré fait au plus %s octets."
+
+#: core/validators.py:485
+msgid "The format for this field is wrong."
+msgstr "Le format de ce champ est mauvais."
+
+#: core/validators.py:500
+msgid "This field is invalid."
+msgstr "Ce champ est invalide."
+
+#: core/validators.py:536
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Impossible de récupérer quoi que ce soit depuis %s."
+
+#: core/validators.py:539
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"L'entête Content-Type '%(contenttype)s', renvoyée par l'url %(url)s n'est "
+"pas valide."
+
+#: core/validators.py:572
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Veuillez fermer le tag %(tag)s à la ligne %(line)s. (Ligne débutant par \"%"
+"(start)s\".)"
+
+#: core/validators.py:576
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Du texte commençant à la ligne %(line)s n'est pas autorisé dans ce contexte. "
+"(Ligne débutant par \"%(start)s\".)"
+
+#: core/validators.py:581
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"%(attr)s\" ligne %(line)s n'est pas un attribut valide. (Ligne débutant "
+"par \"%(start)s\".)"
+
+#: core/validators.py:586
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\" ligne %(line)s n'est pas un tag valide. (Ligne débutant par \"%"
+"(start)s\".)"
+
+#: core/validators.py:590
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Un tag, ou un ou plusieurs attributs, de la ligne %(line)s est manquant. "
+"(Ligne débutant par \"%(start)s\".)"
+
+#: core/validators.py:595
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"La valeur de l'attribut \"%(attr)s\" de la ligne %(line)s n'est pas valide. "
+"(Ligne débutant par \"%(start)s\".)"
+
+#: db/models/manipulators.py:308
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(object)s·de ce·%(type)s·existent déjà pour le %(field)s données."
+
+#: db/models/fields/__init__.py:52
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s avec le champ %(fieldname)s existe déjà."
+
+#: db/models/fields/__init__.py:161 db/models/fields/__init__.py:322
+#: db/models/fields/__init__.py:754 db/models/fields/__init__.py:765
+#: newforms/fields.py:45 oldforms/__init__.py:374
+msgid "This field is required."
+msgstr "Ce champ est obligatoire."
+
+#: db/models/fields/__init__.py:422
+msgid "This value must be an integer."
+msgstr "Cette valeur doit être un entier."
+
+#: db/models/fields/__init__.py:461
+msgid "This value must be either True or False."
+msgstr "Cette valeur doit être soit Vraie soit Fausse."
+
+#: db/models/fields/__init__.py:485
+msgid "This field cannot be null."
+msgstr "Ce champ ne peut pas être vide."
+
+#: db/models/fields/__init__.py:663
+msgid "This value must be a decimal number."
+msgstr "Cette valeur doit être un nombre décimal."
+
+#: db/models/fields/__init__.py:774
+msgid "Enter a valid filename."
+msgstr "Entrez un nom de fichier valide."
+
+#: db/models/fields/__init__.py:945
+msgid "This value must be either None, True or False."
+msgstr "Cette valeur doit être Nulle, Vraie ou Fausse."
+
+#: db/models/fields/related.py:93
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Entrez un %s valide."
+
+#: db/models/fields/related.py:694
+msgid "Separate multiple IDs with commas."
+msgstr "Séparez les ID par des virgules."
+
+#: db/models/fields/related.py:696
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Maintenez \"Contrôle (ctrl)\", ou \"Commande (touche pomme)\" sur un Mac, "
+"pour en sélectionner plusieurs."
+
+#: db/models/fields/related.py:743
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr "Entrez un ID %(self)s valide. La valeur %(value)r est invalide."
+"Entrez des ID %(self)s valides. Les valeurs %(value)r sont invalides."
+
+#: newforms/fields.py:46
+msgid "Enter a valid value."
+msgstr "Entrez une valeur valide."
+
+#: newforms/fields.py:123
+#, python-format
+msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+msgstr "Assurez-vous que cette valeur fait moins de %(max)d caractères (il fait actuellement %(length)d caractères)."
+
+#: newforms/fields.py:124
+#, python-format
+msgid "Ensure this value has at least %(min)d characters (it has %(length)d)."
+msgstr "Assurez-vous que cette valeur fait plus de %(min)d caractères (il fait actuellement %(length)d caractères)."
+
+#: newforms/fields.py:152 newforms/fields.py:181 newforms/fields.py:210
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Assurez-vous que cette valeur soit inférieure ou égale à %s."
+
+#: newforms/fields.py:153 newforms/fields.py:182 newforms/fields.py:211
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Assurez-vous que cette valeur soit supérieure ou égale à %s."
+
+#: newforms/fields.py:180 newforms/fields.py:209
+msgid "Enter a number."
+msgstr "Entrez un nombre."
+
+#: newforms/fields.py:212
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr "Assurez-vous qu'il n'y a pas plus de %s chiffres au total."
+
+#: newforms/fields.py:213
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr "Assurez-vous qu'il n'y a pas plus de %s chiffres après la virgule."
+
+#: newforms/fields.py:214
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr "Assurez-vous qu'il n'y a pas plus de %s chiffres avant la virgule."
+
+#: newforms/fields.py:262 newforms/fields.py:723
+msgid "Enter a valid date."
+msgstr "Entrez une date valide."
+
+#: newforms/fields.py:295 newforms/fields.py:724
+msgid "Enter a valid time."
+msgstr "Entrez une heure valide."
+
+#: newforms/fields.py:334
+msgid "Enter a valid date/time."
+msgstr "Entrez une date et une heure valides."
+
+#: newforms/fields.py:433
+msgid "No file was submitted."
+msgstr "Aucun fichier n'a été soumis."
+
+#: newforms/fields.py:434 oldforms/__init__.py:689
+msgid "The submitted file is empty."
+msgstr "Le fichier soumis est vide."
+
+#: newforms/fields.py:496
+msgid "Enter a valid URL."
+msgstr "Entrez une URL valide."
+
+#: newforms/fields.py:497
+msgid "This URL appears to be a broken link."
+msgstr "Cette URL semble être cassée."
+
+#: newforms/fields.py:559 newforms/models.py:300
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr ""
+"Sélectionnez un choix valide. Ce choix ne fait pas partie de ceux "
+"disponibles."
+
+#: newforms/fields.py:598
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "Sélectionnez un choix valide. %(value)s n'en fait pas partie."
+
+#: newforms/fields.py:599 newforms/fields.py:661 newforms/models.py:360
+msgid "Enter a list of values."
+msgstr "Entrez une liste de valeurs."
+
+#: newforms/fields.py:752
+msgid "Enter a valid IPv4 address."
+msgstr "Entrez une adresse IPv4 valide."
+
+#: newforms/models.py:361
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Sélectionnez un choix valide; %s n'en fait pas partie."
+
+#: oldforms/__init__.py:409
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgstr "Assurez-vous que votre texte fait moins de %s caractère."
+
+#: oldforms/__init__.py:414
+msgid "Line breaks are not allowed here."
+msgstr "Les retours à la ligne ne sont pas autorisés ici."
+
+#: oldforms/__init__.py:512 oldforms/__init__.py:586 oldforms/__init__.py:625
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Sélectionnez un choix valide ; '%(data)s' n'est pas dans %(choices)s."
+
+#: oldforms/__init__.py:745
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Entrez un nombre entier entre -32 768 et 32 767."
+
+#: oldforms/__init__.py:755
+msgid "Enter a positive number."
+msgstr "Entrez un nombre entier positif."
+
+#: oldforms/__init__.py:765
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Entrez un nombre entier entre 0 et 32 767."
+
+#: template/defaultfilters.py:695
+msgid "yes,no,maybe"
+msgstr "oui, non, peut-être"
+
+#: template/defaultfilters.py:726
+#, python-format
+msgid "%(size)d byte"
+msgstr "%(size)d octet"
+
+#: template/defaultfilters.py:728
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f Ko"
+
+#: template/defaultfilters.py:730
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f Mo"
+
+#: template/defaultfilters.py:731
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f Go"
+
+#: utils/dateformat.py:41
+msgid "p.m."
+msgstr "après-midi"
+
+#: utils/dateformat.py:42
+msgid "a.m."
+msgstr "matin"
+
+#: utils/dateformat.py:47
+msgid "PM"
+msgstr "Après-midi"
+
+#: utils/dateformat.py:48
+msgid "AM"
+msgstr "Matin"
+
+#: utils/dateformat.py:97
+msgid "midnight"
+msgstr "minuit"
+
+#: utils/dateformat.py:99
+msgid "noon"
+msgstr "midi"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "lundi"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "mardi"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "mercredi"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "jeudi"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "vendredi"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "samedi"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "dimanche"
+
+#: utils/dates.py:10
+msgid "Mon"
+msgstr "lun"
+
+#: utils/dates.py:10
+msgid "Tue"
+msgstr "mar"
+
+#: utils/dates.py:10
+msgid "Wed"
+msgstr "mer"
+
+#: utils/dates.py:10
+msgid "Thu"
+msgstr "jeu"
+
+#: utils/dates.py:10
+msgid "Fri"
+msgstr "ven"
+
+#: utils/dates.py:11
+msgid "Sat"
+msgstr "sam"
+
+#: utils/dates.py:11
+msgid "Sun"
+msgstr "dim"
+
+#: utils/dates.py:18
+msgid "January"
+msgstr "janvier"
+
+#: utils/dates.py:18
+msgid "February"
+msgstr "février"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "March"
+msgstr "mars"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "April"
+msgstr "avril"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "May"
+msgstr "mai"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "June"
+msgstr "juin"
+
+#: utils/dates.py:19 utils/dates.py:31
+msgid "July"
+msgstr "juillet"
+
+#: utils/dates.py:19
+msgid "August"
+msgstr "août"
+
+#: utils/dates.py:19
+msgid "September"
+msgstr "septembre"
+
+#: utils/dates.py:19
+msgid "October"
+msgstr "octobre"
+
+#: utils/dates.py:19
+msgid "November"
+msgstr "novembre"
+
+#: utils/dates.py:20
+msgid "December"
+msgstr "décembre"
+
+#: utils/dates.py:23
+msgid "jan"
+msgstr "jan"
+
+#: utils/dates.py:23
+msgid "feb"
+msgstr "fév"
+
+#: utils/dates.py:23
+msgid "mar"
+msgstr "mar"
+
+#: utils/dates.py:23
+msgid "apr"
+msgstr "avr"
+
+#: utils/dates.py:23
+msgid "may"
+msgstr "mai"
+
+#: utils/dates.py:23
+msgid "jun"
+msgstr "jui"
+
+#: utils/dates.py:24
+msgid "jul"
+msgstr "jul"
+
+#: utils/dates.py:24
+msgid "aug"
+msgstr "août"
+
+#: utils/dates.py:24
+msgid "sep"
+msgstr "sep"
+
+#: utils/dates.py:24
+msgid "oct"
+msgstr "oct"
+
+#: utils/dates.py:24
+msgid "nov"
+msgstr "nov"
+
+#: utils/dates.py:24
+msgid "dec"
+msgstr "déc"
+
+#: utils/dates.py:31
+msgid "Jan."
+msgstr "jan."
+
+#: utils/dates.py:31
+msgid "Feb."
+msgstr "fév."
+
+#: utils/dates.py:32
+msgid "Aug."
+msgstr "août"
+
+#: utils/dates.py:32
+msgid "Sept."
+msgstr "sept."
+
+#: utils/dates.py:32
+msgid "Oct."
+msgstr "oct."
+
+#: utils/dates.py:32
+msgid "Nov."
+msgstr "nov."
+
+#: utils/dates.py:32
+msgid "Dec."
+msgstr "déc."
+
+#: utils/text.py:127
+msgid "or"
+msgstr "ou"
+
+#: utils/timesince.py:21
+msgid "year"
+msgid_plural "years"
+msgstr[0] "année"
+msgstr[1] "années"
+
+#: utils/timesince.py:22
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mois"
+msgstr[1] "mois"
+
+#: utils/timesince.py:23
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "semaine"
+msgstr[1] "semaines"
+
+#: utils/timesince.py:24
+msgid "day"
+msgid_plural "days"
+msgstr[0] "journée"
+msgstr[1] "journées"
+
+#: utils/timesince.py:25
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "heure"
+msgstr[1] "heures"
+
+#: utils/timesince.py:26
+msgid "minute"
+msgstr "minute"
+
+#: utils/timesince.py:46
+msgid "minutes"
+msgstr "minutes"
+
+#: utils/timesince.py:51
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr "%(number)d %(type)s"
+
+#: utils/timesince.py:57
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ", %(number)d %(type)s"
+
+#: utils/translation/trans_real.py:403
+msgid "DATE_FORMAT"
+msgstr "j F Y"
+
+#: utils/translation/trans_real.py:404
+msgid "DATETIME_FORMAT"
+msgstr "j F Y, G:i"
+
+#: utils/translation/trans_real.py:405
+msgid "TIME_FORMAT"
+msgstr "G:i:s"
+
+#: utils/translation/trans_real.py:421
+msgid "YEAR_MONTH_FORMAT"
+msgstr "F Y"
+
+#: utils/translation/trans_real.py:422
+msgid "MONTH_DAY_FORMAT"
+msgstr "j F"
+
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "L'objet %(verbose_name)s a été créé avec succès."
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "L'objet %(verbose_name)s a été mis à jour avec succès."
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "L'objet %(verbose_name)s a été supprimé."
+
+#~ msgid ""
+#~ "Enter a postcode. A space is required between the two postcode parts."
+#~ msgstr ""
+#~ "Entrez un code postal Anglais. Un espace est requis entre les deux "
+#~ "parties."
+
+#~ msgid "%d milliseconds"
+#~ msgstr "%d millisecondes"
+
+#~ msgid "AnonymousUser"
+#~ msgstr "Anonyme"
+
+#~ msgid "One or more %(fieldname)s in %(name)s :"
+#~ msgstr "Un ou plusieurs %(fieldname)s dans %(name)s :"
+
+#~ msgid "%dth"
+#~ msgstr "%de"
+
+#~ msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+#~ msgstr ""
+#~ "Avez vous <a href=\"/password_reset/\">perdu votre mot de passe</a>?"
+
+#~ msgid "Use '[algo]$[salt]$[hexdigest]'"
+#~ msgstr "Utilisez '[algo]$[salt]$[hexdigest]'"
+
+#~ msgid "Comment"
+#~ msgstr "Commentaire"
+
+#~ msgid "Comments"
+#~ msgstr "Commentaires"
+
+#~ msgid "String (up to 50)"
+#~ msgstr "Chaîne de caractères (jusqu'à 50)"
+
+#~ msgid "label"
+#~ msgstr "intitulé"
+
+#~ msgid "package"
+#~ msgstr "paquetage"
+
+#~ msgid "packages"
+#~ msgstr "paquetages"
+
+#~ msgid "Messages"
+#~ msgstr "Messages"
diff --git a/webapp/django/conf/locale/fr/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/fr/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..33e5087
--- /dev/null
+++ b/webapp/django/conf/locale/fr/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/fr/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/fr/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..ce457d4
--- /dev/null
+++ b/webapp/django/conf/locale/fr/LC_MESSAGES/djangojs.po
@@ -0,0 +1,109 @@
+# French translation for js. 
+# Copyright (C) 2005 Mikaël Barbero 
+# This file is distributed under the same license as the PACKAGE package. 
+# 
+msgid "" 
+msgstr "" 
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n" 
+"POT-Creation-Date: 2005-12-24 16:39+0100\n" 
+"PO-Revision-Date: 2005-12-24 16:39+0100\n" 
+"Last-Translator: Mikaël Barbero <mikael.barbero nospam at nospam free.fr>\n" 
+"Language-Team: French <fr@li.org>\n" 
+"MIME-Version: 1.0\n" 
+"Content-Type: text/plain; charset=UTF-8\n" 
+"Content-Transfer-Encoding: 8bit\n" 
+
+#: contrib/admin/media/js/calendar.js:24 
+#: contrib/admin/media/js/dateparse.js:26 
+msgid "" 
+"January February March April May June July August September October November " 
+"December" 
+msgstr "" 
+"Janvier Février Mars Avril Mai Juin Juillet Août Septembre Octobre Novembre " 
+"Décembre" 
+
+#: contrib/admin/media/js/calendar.js:25 
+msgid "S M T W T F S" 
+msgstr "D L M M J V S" 
+
+#: contrib/admin/media/js/dateparse.js:27 
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday" 
+msgstr "Dimanche Lundi Mardi Mercredi Jeudi Vendredi Samedi" 
+
+#: contrib/admin/media/js/SelectFilter2.js:33 
+#, perl-format 
+msgid "Available %s" 
+msgstr "%s disponible(s)" 
+
+#: contrib/admin/media/js/SelectFilter2.js:41 
+msgid "Choose all" 
+msgstr "Tout choisir" 
+
+#: contrib/admin/media/js/SelectFilter2.js:46 
+msgid "Add" 
+msgstr "Ajouter" 
+
+#: contrib/admin/media/js/SelectFilter2.js:48 
+msgid "Remove" 
+msgstr "Enlever" 
+
+#: contrib/admin/media/js/SelectFilter2.js:53 
+#, perl-format 
+msgid "Chosen %s" 
+msgstr "%s choisi(es)" 
+
+#: contrib/admin/media/js/SelectFilter2.js:54 
+msgid "Select your choice(s) and click " 
+msgstr "Sélectionnez un ou plusieurs choix et cliquez " 
+
+#: contrib/admin/media/js/SelectFilter2.js:59 
+msgid "Clear all" 
+msgstr "Tout enlever" 
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45 
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80 
+msgid "Now" 
+msgstr "Maintenant" 
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48 
+msgid "Clock" 
+msgstr "Horloge" 
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77 
+msgid "Choose a time" 
+msgstr "Choisir une heure" 
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81 
+msgid "Midnight" 
+msgstr "Minuit" 
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82 
+msgid "6 a.m." 
+msgstr "6:00" 
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83 
+msgid "Noon" 
+msgstr "Midi" 
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87 
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168 
+msgid "Cancel" 
+msgstr "Annuler" 
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111 
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162 
+msgid "Today" 
+msgstr "Aujourd'hui" 
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114 
+msgid "Calendar" 
+msgstr "Calendrier" 
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160 
+msgid "Yesterday" 
+msgstr "Hier" 
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164 
+msgid "Tomorrow" 
+msgstr "Demain"
diff --git a/webapp/django/conf/locale/ga/LC_MESSAGES/django.mo b/webapp/django/conf/locale/ga/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..6a28961
--- /dev/null
+++ b/webapp/django/conf/locale/ga/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/ga/LC_MESSAGES/django.po b/webapp/django/conf/locale/ga/LC_MESSAGES/django.po
new file mode 100644
index 0000000..d05c387
--- /dev/null
+++ b/webapp/django/conf/locale/ga/LC_MESSAGES/django.po
@@ -0,0 +1,4444 @@
+# 
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-08-14 10:20+0100\n"
+"PO-Revision-Date: 2008-08-14 14:46+0100\n"
+"Last-Translator: Michael Thornhill <michael@maithu.com>\n"
+"Language-Team: Gaeilge <ga@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n == 1 ? 0 : 1;"
+
+#: conf/global_settings.py:44
+msgid "Arabic"
+msgstr "Arabach"
+
+#: conf/global_settings.py:45
+msgid "Bengali"
+msgstr "Beangáilis"
+
+#: conf/global_settings.py:46
+msgid "Bulgarian"
+msgstr "Bulgárach"
+
+#: conf/global_settings.py:47
+msgid "Catalan"
+msgstr "Catalóinis"
+
+#: conf/global_settings.py:48
+msgid "Czech"
+msgstr "Seiceach"
+
+#: conf/global_settings.py:49
+msgid "Welsh"
+msgstr "Breatnach"
+
+#: conf/global_settings.py:50
+msgid "Danish"
+msgstr "Dainmhairgis"
+
+#: conf/global_settings.py:51
+msgid "German"
+msgstr "Gearmánach"
+
+#: conf/global_settings.py:52
+msgid "Greek"
+msgstr "Gréigis"
+
+#: conf/global_settings.py:53
+msgid "English"
+msgstr "Béarla"
+
+#: conf/global_settings.py:54
+msgid "Spanish"
+msgstr "Spáinneach"
+
+#: conf/global_settings.py:55
+msgid "Estonian"
+msgstr "Eastóinis"
+
+#: conf/global_settings.py:56
+msgid "Argentinean Spanish"
+msgstr "Spáinnis Airgintín"
+
+#: conf/global_settings.py:57
+msgid "Basque"
+msgstr "Bascais"
+
+#: conf/global_settings.py:58
+msgid "Persian"
+msgstr "Peirsis"
+
+#: conf/global_settings.py:59
+msgid "Finnish"
+msgstr "Fionlainnis"
+
+#: conf/global_settings.py:60
+msgid "French"
+msgstr "Francach"
+
+#: conf/global_settings.py:61
+msgid "Irish"
+msgstr "Gaeilge"
+
+#: conf/global_settings.py:62
+msgid "Galician"
+msgstr "Gailísis"
+
+#: conf/global_settings.py:63
+msgid "Hungarian"
+msgstr "Ungáiris"
+
+#: conf/global_settings.py:64
+msgid "Hebrew"
+msgstr "Eabhrach"
+
+#: conf/global_settings.py:65
+msgid "Croatian"
+msgstr "Cróitis"
+
+#: conf/global_settings.py:66
+msgid "Icelandic"
+msgstr "Mórlainnis"
+
+#: conf/global_settings.py:67
+msgid "Italian"
+msgstr "Iodáilis"
+
+#: conf/global_settings.py:68
+msgid "Japanese"
+msgstr "Seapáinis"
+
+#: conf/global_settings.py:69
+msgid "Georgian"
+msgstr "Seoirseach"
+
+#: conf/global_settings.py:70
+msgid "Korean"
+msgstr "Cóiréis"
+
+#: conf/global_settings.py:71
+msgid "Khmer"
+msgstr "Ciméiris"
+
+#: conf/global_settings.py:72
+msgid "Kannada"
+msgstr "Cannadais"
+
+#: conf/global_settings.py:73
+msgid "Latvian"
+msgstr "Laitvis"
+
+#: conf/global_settings.py:74
+msgid "Lithuanian"
+msgstr "Liotuáinis"
+
+#: conf/global_settings.py:75
+msgid "Macedonian"
+msgstr "Macadóinis"
+
+#: conf/global_settings.py:76
+msgid "Dutch"
+msgstr "Ollannach"
+
+#: conf/global_settings.py:77
+msgid "Norwegian"
+msgstr "Ioruais"
+
+#: conf/global_settings.py:78
+msgid "Polish"
+msgstr "snas"
+
+#: conf/global_settings.py:79
+msgid "Portugese"
+msgstr "Portaingéileach"
+
+#: conf/global_settings.py:80
+msgid "Brazilian Portuguese"
+msgstr "Brasaíleach"
+
+#: conf/global_settings.py:81
+msgid "Romanian"
+msgstr "Rómáinis"
+
+#: conf/global_settings.py:82
+msgid "Russian"
+msgstr "Rúiseach"
+
+#: conf/global_settings.py:83
+msgid "Slovak"
+msgstr "Slóvaicis"
+
+#: conf/global_settings.py:84
+msgid "Slovenian"
+msgstr "Slóivéinis"
+
+#: conf/global_settings.py:85
+msgid "Serbian"
+msgstr "Seirbiach"
+
+#: conf/global_settings.py:86
+msgid "Swedish"
+msgstr "Sualainnis"
+
+#: conf/global_settings.py:87
+msgid "Tamil"
+msgstr "Tamailis"
+
+#: conf/global_settings.py:88
+msgid "Telugu"
+msgstr "Teileagúis"
+
+#: conf/global_settings.py:89
+msgid "Turkish"
+msgstr "Tuircis"
+
+#: conf/global_settings.py:90
+msgid "Ukrainian"
+msgstr "Úcráinis"
+
+#: conf/global_settings.py:91
+msgid "Simplified Chinese"
+msgstr "Sínis"
+
+#: conf/global_settings.py:92
+msgid "Traditional Chinese"
+msgstr "Sínis Tradisúinta"
+
+#: contrib/admin/filterspecs.py:44
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Trí %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:74 contrib/admin/filterspecs.py:92
+#: contrib/admin/filterspecs.py:147 contrib/admin/filterspecs.py:173
+msgid "All"
+msgstr "Gach"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Any date"
+msgstr "Aon dáta"
+
+#: contrib/admin/filterspecs.py:114
+msgid "Today"
+msgstr "Inniu"
+
+#: contrib/admin/filterspecs.py:117
+msgid "Past 7 days"
+msgstr "7 lá a chuaigh thart"
+
+#: contrib/admin/filterspecs.py:119
+msgid "This month"
+msgstr "Táim cinnte"
+
+#: contrib/admin/filterspecs.py:121
+msgid "This year"
+msgstr "An blian seo"
+
+#: contrib/admin/filterspecs.py:147 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "Yes"
+msgstr "Tá"
+
+#: contrib/admin/filterspecs.py:147 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "No"
+msgstr "Níl"
+
+#: contrib/admin/filterspecs.py:154 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "Unknown"
+msgstr "Gan aithne"
+
+#: contrib/admin/models.py:19
+msgid "action time"
+msgstr "am aicsean"
+
+#: contrib/admin/models.py:22
+msgid "object id"
+msgstr "id oibiacht"
+
+#: contrib/admin/models.py:23
+msgid "object repr"
+msgstr "repr oibiacht"
+
+#: contrib/admin/models.py:24
+msgid "action flag"
+msgstr "brat an aicsean"
+
+#: contrib/admin/models.py:25
+msgid "change message"
+msgstr "teachtaireacht athrú"
+
+#: contrib/admin/models.py:28
+msgid "log entry"
+msgstr "loga iontráil"
+
+#: contrib/admin/models.py:29
+msgid "log entries"
+msgstr "loga iontrálacha"
+
+#: contrib/admin/options.py:143 contrib/admin/options.py:202
+msgid "None"
+msgstr "Dada"
+
+#: contrib/admin/options.py:407
+#, python-format
+msgid "Changed %s."
+msgstr "Athraithe %s"
+
+#: contrib/admin/options.py:407 contrib/admin/options.py:417
+#: core/validators.py:279 db/models/manipulators.py:305
+msgid "and"
+msgstr "agus"
+
+#: contrib/admin/options.py:412
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Suimithe %(name)s \"%(object)s\"."
+
+#: contrib/admin/options.py:416
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Athraithe %(list)s le %(name)s \"%(object)s\"."
+
+#: contrib/admin/options.py:421
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Scriosaithe %(name)s \"%(object)s\"."
+
+#: contrib/admin/options.py:425
+msgid "No fields changed."
+msgstr "Dada réimse aithraithe"
+
+#: contrib/admin/options.py:486 contrib/auth/admin.py:50
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Bhí  %(name)s \"%(obj)s\" breisithe go rathúil"
+
+#: contrib/admin/options.py:490 contrib/admin/options.py:523
+#: contrib/auth/admin.py:55
+msgid "You may edit it again below."
+msgstr "Is féidir leat é a cuir in eagar thíos."
+
+#: contrib/admin/options.py:500 contrib/admin/options.py:533
+#, python-format
+msgid "You may add another %s below."
+msgstr "Is féidir le ceann eile %s a cuir le thíos."
+
+#: contrib/admin/options.py:521
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Bhí an %(name)s \"%(obj)s\" aithraithe to rathúil"
+
+#: contrib/admin/options.py:529
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"Chuir an %(name)s·\"%(obj)s\"·go rathúil.·Is féidir leat é a cuir in eagar "
+"thíos."
+
+#: contrib/admin/options.py:596
+#, python-format
+msgid "Add %s"
+msgstr "Cuir %s le"
+
+#: contrib/admin/options.py:673
+#, python-format
+msgid "Change %s"
+msgstr "Aithrigh %s"
+
+#: contrib/admin/options.py:704
+msgid "Database error"
+msgstr "Botún bunachar sonraí"
+
+#: contrib/admin/options.py:753
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Bhí %(name)s \"%(obj)s\" scrioste go rathúil."
+
+#: contrib/admin/options.py:760
+msgid "Are you sure?"
+msgstr "An bhfuil tú cinnte?"
+
+#: contrib/admin/options.py:787
+#, python-format
+msgid "Change history: %s"
+msgstr "Athraigh stáir %s"
+
+#: contrib/admin/sites.py:18 contrib/admin/views/decorators.py:16
+#: contrib/auth/forms.py:72 contrib/comments/views/comments.py:56
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Le do thoil, iontráil aihm úsaideora agus focal faire ceart. Bí cúramach go "
+"bhfuil an beirt acu cásíogair."
+
+#: contrib/admin/sites.py:238 contrib/admin/views/decorators.py:68
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Le do thoil, logáil isteach arís cé go bhfuil to seisúin críochnaithe.  Ná "
+"bí imní ort, tá do iarratas sabháilte."
+
+#: contrib/admin/sites.py:245 contrib/admin/views/decorators.py:75
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Feictear nach bhfuil do brabhsálaí réidh le cuaiche a glacadh. Le do thoil, "
+"cumasaigh cuaiche, athlódáil an leathanach seo, agus déan iarracht arís."
+
+#: contrib/admin/sites.py:259 contrib/admin/sites.py:265
+#: contrib/admin/views/decorators.py:92
+msgid "Usernames cannot contain the '@' character."
+msgstr "Níl an carachtar '@' ceadaithe in ainmeacha úsaideora."
+
+#: contrib/admin/sites.py:262 contrib/admin/views/decorators.py:88
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "Níl do ríomhseoladh do ainm úsaideora. Bain trial as '%s'."
+
+#: contrib/admin/sites.py:330
+msgid "Site administration"
+msgstr "Riaracháin an suíomh"
+
+#: contrib/admin/sites.py:352 contrib/admin/templates/admin/login.html:27
+#: contrib/admin/templates/registration/password_reset_complete.html:14
+#: contrib/admin/views/decorators.py:30
+msgid "Log in"
+msgstr "Logáil isteach"
+
+#: contrib/admin/util.py:126
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Ceann amhain nó níos mó  %(fieldname)s in %(name)s: %(obj)s"
+
+#: contrib/admin/util.py:131
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Ceann amhain nó níos mó  %(fieldname)s in %(name)s:"
+
+#: contrib/admin/widgets.py:65
+msgid "Date:"
+msgstr "Dáta:"
+
+#: contrib/admin/widgets.py:65
+msgid "Time:"
+msgstr "Am:"
+
+#: contrib/admin/widgets.py:89
+msgid "Currently:"
+msgstr "Ag an am seo."
+
+#: contrib/admin/widgets.py:89
+msgid "Change:"
+msgstr "Athraigh:"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Ní bhfuarthas an leathanach"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Tá brón orainn, ach ní bhfuarthas an leathanach iarraite."
+
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/change_form.html:17
+#: contrib/admin/templates/admin/change_list.html:8
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/auth/user/change_password.html:10
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_reset_complete.html:4
+#: contrib/admin/templates/registration/password_reset_confirm.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Baile"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Botún freastalaí"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Botún freastalaí (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Botún Freastalaí <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Bhí botún. Seolah é go dtí riarthóirí an suíomh agus beidh sé ceartaithe i "
+"gceann tamallín. Go raibh maith agat le hadhaigh do foighne."
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "Fáilte"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Doiciméadúchán"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:13
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+msgid "Change password"
+msgstr "Athraigh focal faire"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/comments/templates/comments/form.html:6
+msgid "Log out"
+msgstr "Logáil amach"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Riarthóir suíomh Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Riarachán Django"
+
+#: contrib/admin/templates/admin/change_form.html:19
+#: contrib/admin/templates/admin/index.html:29
+msgid "Add"
+msgstr "Cuir le"
+
+#: contrib/admin/templates/admin/change_form.html:26
+#: contrib/admin/templates/admin/object_history.html:5
+msgid "History"
+msgstr "Stair"
+
+#: contrib/admin/templates/admin/change_form.html:27
+msgid "View on site"
+msgstr "Breath ar suíomh"
+
+#: contrib/admin/templates/admin/change_form.html:37
+#: contrib/admin/templates/admin/auth/user/change_password.html:22
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Le do thoil ceartaigh an botún thíos."
+msgstr[1] "Le do thoil ceartaigh na botúin thíos."
+
+#: contrib/admin/templates/admin/change_list.html:16
+#, python-format
+msgid "Add %(name)s"
+msgstr "Cuir %(name)s le"
+
+#: contrib/admin/templates/admin/change_list.html:26
+msgid "Filter"
+msgstr "Scagaire"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+#: contrib/admin/templates/admin/edit_inline/tabular.html:15
+msgid "Delete"
+msgstr "Cealaigh"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:15
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Má scriossan tú  %(object_name)s '%(escaped_object)s' scriosfaidh oibiachtí "
+"gaolta. Ach níl cead ag do cuntas na oibiacht a leanúint a scriosadh:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:22
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"An bhfuil tú cinnte na  %(object_name)s \"%(escaped_object)s\" a scroiseadh?"
+"Beidh gach oibiacht a leanúint scroiste freisin:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:27
+msgid "Yes, I'm sure"
+msgstr "Táim cinnte"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Trí %(filter_title)s "
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Samhla ar fáil ins an feidhmchlár %(name)s."
+
+#: contrib/admin/templates/admin/index.html:19
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:35
+msgid "Change"
+msgstr "Athraigh"
+
+#: contrib/admin/templates/admin/index.html:45
+msgid "You don't have permission to edit anything."
+msgstr "Níl cead agat aon rud a cuir in eagar."
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "Recent Actions"
+msgstr "Aicsean úrnua"
+
+#: contrib/admin/templates/admin/index.html:54
+msgid "My Actions"
+msgstr "Mo Aicseain"
+
+#: contrib/admin/templates/admin/index.html:58
+msgid "None available"
+msgstr "Dada ar fáil"
+
+#: contrib/admin/templates/admin/invalid_setup.html:7
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Tá rud éigin mícheart le suitéail do bunachar sonraí.  Déan cinnte go bhfuil "
+"boird an bunachar sonraI cruthaithe cheana, agus déan cinnte go bhfuil do "
+"úsaideoir in ann an bunacchar sonraí a léamh."
+
+#: contrib/admin/templates/admin/login.html:19
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+msgid "Username:"
+msgstr "Ainm úsaideor:"
+
+#: contrib/admin/templates/admin/login.html:22
+#: contrib/comments/templates/comments/form.html:8
+msgid "Password:"
+msgstr "Focal faire:"
+
+#: contrib/admin/templates/admin/object_history.html:16
+msgid "Date/time"
+msgstr "Dáta/am"
+
+#: contrib/admin/templates/admin/object_history.html:17
+msgid "User"
+msgstr "Úsaideoir"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Action"
+msgstr "Aicsean"
+
+#: contrib/admin/templates/admin/object_history.html:24
+msgid "DATE_WITH_TIME_FULL"
+msgstr "DATE_WITH_TIME_FULL"
+
+#: contrib/admin/templates/admin/object_history.html:32
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Níl stáir aitraithe ag an oibiacht seo agús is dócha ná cuir le tríd an an "
+"suíomh riarachán."
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Taispéan gach rud"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Té"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "toradh 1"
+msgstr[1] "1 toradh"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s iomlán"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Sabháil mar nua"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Sabháil agus cuir le ceann eile"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Sábhail agus lean ag cuir in eagar"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Sábháil"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Ar dtús, iontráil ainm úsaideoir agus focal faire.  Ansin, beidh tú in ann "
+"cuir in eagar níos mó roghaí úsaideoira."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:13
+#: contrib/auth/forms.py:14 contrib/auth/forms.py:51
+msgid "Username"
+msgstr "Ainm úsaideoir"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:20
+#: contrib/admin/templates/admin/auth/user/change_password.html:33
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:52 contrib/auth/forms.py:176
+msgid "Password"
+msgstr "Focal faire"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:26
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+#: contrib/auth/forms.py:177
+msgid "Password (again)"
+msgstr "Focal faire (arís)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:27
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+msgid "Enter the same password as above, for verification."
+msgstr "Iontráíl an focal faire céanna mar thuas, le fíorúchán."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:26
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+"Iontráil focal faire nua le hadhaigh an úsaideor <strong>%(username)s</"
+"strong>."
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Go raibh maith agat le hadhaigh do cuairt ar an suíomh idirlínn inniú."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Logáil isteacj arís"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Athrú focal faire"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Athrú an focal faire rathúil"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Bhí do focal faire aithraithe."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Le do thoil, iontráil do sean-focal faire, ar son slándáil, agus ansin "
+"iontráil do focal faire dhá uaire cé go mbeimid in ann a seiceal go bhfuil "
+"sé scríobhte isteach i gceart."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Sean-focal faire"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+#: contrib/admin/templates/registration/password_reset_confirm.html:18
+msgid "New password:"
+msgstr "Focal faire nua:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+#: contrib/admin/templates/registration/password_reset_confirm.html:20
+msgid "Confirm password:"
+msgstr "Deimhnigh focal faire:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+#: contrib/admin/templates/registration/password_reset_confirm.html:21
+msgid "Change my password"
+msgstr "Athraigh mo focal faire"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:4
+#: contrib/admin/templates/registration/password_reset_confirm.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+msgid "Password reset"
+msgstr "Athsocraigh focal faire"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:6
+#: contrib/admin/templates/registration/password_reset_complete.html:10
+msgid "Password reset complete"
+msgstr "Athshocraigh an focal faire críochnaithe"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:12
+msgid "Your password has been set.  You may go ahead and log in now."
+msgstr "Tá do focal faire réidh.  Is féidir leat logáil isteach anois."
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:4
+msgid "Password reset confirmation"
+msgstr "Deimhniú athshocraigh focal faire"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:12
+msgid "Enter new password"
+msgstr "Cuir isteach focal faire nua"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:14
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Le do thoil, iontráil do focal faire dhá uaire cé go mbeimid in ann a "
+"seiceal go bhfuil sé scríobhte isteach i gceart."
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:26
+msgid "Password reset unsuccessful"
+msgstr "Athshocraigh focal faire mí-rathúil"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:28
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used.  Please request a new password reset."
+msgstr ""
+"Bhí nasc athshocraigh an focal faire mícheart, b'fheidir mar go raibh sé "
+"úsaidte cheana.  Le do thoil, iarr ar athsocraigh focal faire nua."
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Athshocraigh focal faire mí-rathúil"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed you instructions for setting your password to the e-mail "
+"address you submitted. You should be receiving it shortly."
+msgstr ""
+"Seolamar teagasca chugat le hadhaigh do r-phost a úsaid mar to focal faire.  "
+"Gheobaidh tú an r-phost i gceann tamallín."
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr ""
+"Tá tú ag fáil an r-phost seo mar iarr tú ar athshocraigh an focal faire."
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "Le do cuntas úsaideor ar %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+msgid "Please go to the following page and choose a new password:"
+msgstr ""
+"Le do thoil té go dtí an leathanach a leanúint agus roghmaigh focal faire "
+"nua:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:9
+msgid "Your username, in case you've forgotten:"
+msgstr "Do ainm úsaideoir, má tá dearmad déanta agat."
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Thanks for using our site!"
+msgstr "Go raibh maith agat le hadhaigh do cuairt!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Foireann an %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll e-mail "
+"instructions for setting a new one."
+msgstr ""
+"Dearmad déanta ar do focal faire? Iontráil do r-phost thíos agus seolfaimid "
+"teagasca chun ceann nua a fháil."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "R-phost:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Athsocraigh mo focal faire"
+
+#: contrib/admin/templatetags/admin_list.py:257
+msgid "All dates"
+msgstr "Gach dáta"
+
+#: contrib/admin/views/main.py:65
+#, python-format
+msgid "Select %s"
+msgstr "Roghnaigh %s"
+
+#: contrib/admin/views/main.py:65
+#, python-format
+msgid "Select %s to change"
+msgstr "Roghnaigh %s a athrú"
+
+#: contrib/admin/views/template.py:36 contrib/sites/models.py:38
+msgid "site"
+msgstr "suíomh"
+
+#: contrib/admin/views/template.py:38
+msgid "template"
+msgstr "teimpléad"
+
+#: contrib/admindocs/views.py:53 contrib/admindocs/views.py:55
+#: contrib/admindocs/views.py:57
+msgid "tag:"
+msgstr "clib:"
+
+#: contrib/admindocs/views.py:87 contrib/admindocs/views.py:89
+#: contrib/admindocs/views.py:91
+msgid "filter:"
+msgstr "scag:"
+
+#: contrib/admindocs/views.py:153 contrib/admindocs/views.py:155
+#: contrib/admindocs/views.py:157
+msgid "view:"
+msgstr "radharc:"
+
+#: contrib/admindocs/views.py:187
+#, python-format
+msgid "App %r not found"
+msgstr "Ní bhfuarthas feidhmchlár %r "
+
+#: contrib/admindocs/views.py:194
+#, python-format
+msgid "Model %(model_name)r not found in app %(app_label)r"
+msgstr "Ní bhfuarthas samhail %(model_name)r  i bhfeidhmclár %(app_label)r"
+
+#: contrib/admindocs/views.py:206
+#, python-format
+msgid "the related `%(app_label)s.%(data_type)s` object"
+msgstr "An oibiacht gaolmhara `%(app_label)s.%(data_type)s`"
+
+#: contrib/admindocs/views.py:206 contrib/admindocs/views.py:228
+#: contrib/admindocs/views.py:242 contrib/admindocs/views.py:247
+msgid "model:"
+msgstr "samhail:"
+
+#: contrib/admindocs/views.py:237
+#, python-format
+msgid "related `%(app_label)s.%(object_name)s` objects"
+msgstr "Oibiachtí gaolmhara `%(app_label)s.%(object_name)s`"
+
+#: contrib/admindocs/views.py:242
+#, python-format
+msgid "all %s"
+msgstr "gach %s"
+
+#: contrib/admindocs/views.py:247
+#, python-format
+msgid "number of %s"
+msgstr "líon %s"
+
+#: contrib/admindocs/views.py:253
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Réimse ar oibiachtí %s"
+
+#: contrib/admindocs/views.py:317 contrib/admindocs/views.py:328
+#: contrib/admindocs/views.py:330 contrib/admindocs/views.py:336
+#: contrib/admindocs/views.py:337 contrib/admindocs/views.py:339
+msgid "Integer"
+msgstr "Slánuimhir"
+
+#: contrib/admindocs/views.py:318
+msgid "Boolean (Either True or False)"
+msgstr "Boole"
+
+#: contrib/admindocs/views.py:319 contrib/admindocs/views.py:338
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Teaghrán (suas go %(max_length)s)"
+
+#: contrib/admindocs/views.py:320
+msgid "Comma-separated integers"
+msgstr "Slánuimhireacha camóg-scartha"
+
+#: contrib/admindocs/views.py:321
+msgid "Date (without time)"
+msgstr "Dáta (gan am)"
+
+#: contrib/admindocs/views.py:322
+msgid "Date (with time)"
+msgstr "Dáta (le am)"
+
+#: contrib/admindocs/views.py:323
+msgid "Decimal number"
+msgstr "Uimhir deachúlach"
+
+#: contrib/admindocs/views.py:324
+msgid "E-mail address"
+msgstr "R-phost"
+
+#: contrib/admindocs/views.py:325 contrib/admindocs/views.py:326
+#: contrib/admindocs/views.py:329
+msgid "File path"
+msgstr "Conair comhaid"
+
+#: contrib/admindocs/views.py:327
+msgid "Floating point number"
+msgstr "Snámhphointe"
+
+#: contrib/admindocs/views.py:331 contrib/comments/models.py:89
+msgid "IP address"
+msgstr "Seol IP"
+
+#: contrib/admindocs/views.py:333
+msgid "Boolean (Either True, False or None)"
+msgstr "Boole (Fíor, Bréagach nó Dada)"
+
+#: contrib/admindocs/views.py:334
+msgid "Relation to parent model"
+msgstr "Cine do samhail máthair"
+
+#: contrib/admindocs/views.py:335
+msgid "Phone number"
+msgstr "Uimhir telefón"
+
+#: contrib/admindocs/views.py:340
+msgid "Text"
+msgstr "téacs"
+
+#: contrib/admindocs/views.py:341
+msgid "Time"
+msgstr "am"
+
+#: contrib/admindocs/views.py:342 contrib/flatpages/admin.py:8
+#: contrib/flatpages/models.py:8
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admindocs/views.py:343
+msgid "U.S. state (two uppercase letters)"
+msgstr "U.S. stát (dhá litreacha móra)"
+
+#: contrib/admindocs/views.py:344
+msgid "XML text"
+msgstr "Téacs XML"
+
+#: contrib/admindocs/views.py:370
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "Feiceann sé nach bhfuil %s oibiacht urlpattern"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Leabharmharcín"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:4
+msgid "Documentation bookmarklets"
+msgstr "Leabharmharcín doiciméadúchán"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:8
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">Chun leabharmarcín a suitéal, Tarraing an nasc go dtí do barra uirlisí leabhairmairc\n, nó deaschliceáil and nasc agus cuir leis do leabharmairc.  Anois is féidir\n"
+"leat an leabharmarcín a roghnaigh ón aon leathanach ar an suíomh.  Bí cúramach go dteastaíonn cuid de na leabharmarcín go bhfuil tú ag féachaint ar an suíomh ó ríomhaire inmheánach\n(leabhar le do riarthóir córais muna bhfuil tú cinnte).</p>\n"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:18
+msgid "Documentation for this page"
+msgstr "Doiciméadúchán le hadhaigh an leathanach seo"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:19
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+"Tógann se tusa ón aon leathanach go dtí an doiciméadúchán le hadhaigh an "
+"radharc a rinne an leathanach."
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:21
+msgid "Show object ID"
+msgstr "Taispéain oibiacht ID"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:22
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Taispéain an content-type agus ID uathúil le leathanaigh le hadhaigh "
+"oibiacht amháin."
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:24
+msgid "Edit this object (current window)"
+msgstr "Cuir in eagar an oibiacht seo (fuinneog láthair)"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:25
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+"Léimeann go dtí an leathanach riaracháin le leathainaigh le hadhaigh "
+"oibiacht amháin."
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:27
+msgid "Edit this object (new window)"
+msgstr "Cuir in eagar an oibiacht seo (fuinneog nua)"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:28
+msgid "As above, but opens the admin page in a new window."
+msgstr "Mar thuas, ach osclaíonn sé an leathanach riarachán if fuinneog nua"
+
+#: contrib/auth/admin.py:21
+msgid "Personal info"
+msgstr "Eolas pearsantach"
+
+#: contrib/auth/admin.py:22
+msgid "Permissions"
+msgstr "Ceada"
+
+#: contrib/auth/admin.py:23
+msgid "Important dates"
+msgstr "Dáta tábhactach"
+
+#: contrib/auth/admin.py:24
+msgid "Groups"
+msgstr "Grúpa"
+
+#: contrib/auth/admin.py:60
+msgid "Add user"
+msgstr "Cuir úsaideoir le"
+
+#: contrib/auth/admin.py:85
+msgid "Password changed successfully."
+msgstr "Focal faire aithraithe rathúil"
+
+#: contrib/auth/admin.py:91
+#, python-format
+msgid "Change password: %s"
+msgstr "Athraigh focal faire: %s"
+
+#: contrib/auth/forms.py:15 contrib/auth/models.py:137
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr "Riachtanach. 30 carachtair nó níos lú. Alfa-uimhriúil amhain (litreacha, digite agus fostríce)."
+
+#: contrib/auth/forms.py:16 core/validators.py:72
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Cathaigh litreacha, digite agus fostríce amhain le hadhaigh an méid seo."
+
+#: contrib/auth/forms.py:18
+msgid "Password confirmation"
+msgstr "Focal faire deimhniú"
+
+#: contrib/auth/forms.py:30
+msgid "A user with that username already exists."
+msgstr "In ann do úsáideoir leis an ainm úsáideora."
+
+#: contrib/auth/forms.py:36 contrib/auth/forms.py:146
+#: contrib/auth/forms.py:188
+msgid "The two password fields didn't match."
+msgstr "Níl an dá focla faire comhoiriúnigh"
+
+#: contrib/auth/forms.py:74 contrib/comments/views/comments.py:58
+msgid "This account is inactive."
+msgstr "Tá an cuntas seo neamhghníomhach."
+
+#: contrib/auth/forms.py:79 contrib/comments/views/comments.py:49
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+""
+"Feictear nach bhfuil do brabhsálaí réidh le cuaiche a glacadh. Tá cuaiche ag teastail le logáil isteach."
+
+#: contrib/auth/forms.py:92
+msgid "E-mail"
+msgstr "R-phost"
+
+#: contrib/auth/forms.py:101
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr ""
+"Níl cuntas in éineacht leis an r-phost sin. An bhfuil tú cinnte go bhfuil tú cláraithe?"
+
+#: contrib/auth/forms.py:126
+#, python-format
+msgid "Password reset on %s"
+msgstr "Athsocraigh focal faire ar %s"
+
+#: contrib/auth/forms.py:134
+msgid "New password"
+msgstr "Focal faire nua"
+
+#: contrib/auth/forms.py:135
+msgid "New password confirmation"
+msgstr "Deimnhiú focal faire nua"
+
+#: contrib/auth/forms.py:160
+msgid "Old password"
+msgstr "Sean-focal faire "
+
+#: contrib/auth/forms.py:168
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Cuireadh do sean-focal faire isteach go mícheart. Iontráil isteach é arís."
+
+#: contrib/auth/models.py:73 contrib/auth/models.py:96
+msgid "name"
+msgstr "ainm"
+
+#: contrib/auth/models.py:75
+msgid "codename"
+msgstr "Ainm cód"
+
+#: contrib/auth/models.py:78
+msgid "permission"
+msgstr "cead"
+
+#: contrib/auth/models.py:79 contrib/auth/models.py:97
+msgid "permissions"
+msgstr "ceada"
+
+#: contrib/auth/models.py:100
+msgid "group"
+msgstr "grúpa"
+
+#: contrib/auth/models.py:101 contrib/auth/models.py:147
+msgid "groups"
+msgstr "grúpa"
+
+#: contrib/auth/models.py:137
+msgid "username"
+msgstr "Ainm úsáideoir"
+
+#: contrib/auth/models.py:138
+msgid "first name"
+msgstr "ainm baiste"
+
+#: contrib/auth/models.py:139
+msgid "last name"
+msgstr "sloinne"
+
+#: contrib/auth/models.py:140
+msgid "e-mail address"
+msgstr "seoladh r-phost"
+
+#: contrib/auth/models.py:141
+msgid "password"
+msgstr "focal faire"
+
+#: contrib/auth/models.py:141
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"Úsáid '[algo]$[salt]$[hexdigest]' nó <a href=\"password/\">athraigh focal faire foirm</a>."
+
+#: contrib/auth/models.py:142
+msgid "staff status"
+msgstr "stádas foirne"
+
+#: contrib/auth/models.py:142
+msgid "Designates whether the user can log into this admin site."
+msgstr "Sainigh an bhfuil cead ag an úsáideoir logáil isteach go dtí an suíomh riaracháin seo."
+
+#: contrib/auth/models.py:143
+msgid "active"
+msgstr "gníomhach"
+
+#: contrib/auth/models.py:143
+msgid ""
+"Designates whether this user should be treated as active. Unselect this "
+"instead of deleting accounts."
+msgstr "Sainíonn an bhfuil an úsáideoir gníomhach. Míroghnaigh seo in aineonn de scriseadh cuntasí."
+
+#: contrib/auth/models.py:144
+msgid "superuser status"
+msgstr "stádas forúsáideoir"
+
+#: contrib/auth/models.py:144
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr "Sainíonn go bhfuil gach ceada ag an úsáideoir seo gan iad a cur le go díreach."
+
+#: contrib/auth/models.py:145
+msgid "last login"
+msgstr "logáil deirneach"
+
+#: contrib/auth/models.py:146
+msgid "date joined"
+msgstr "Dáta teacht isteach"
+
+#: contrib/auth/models.py:148
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr "Breis leis na ceada sannta láimhe, faigheann an úsáideoir seo gach ceada sannta do na grúpaí a bhfuil sé/sí isteach in."
+
+#: contrib/auth/models.py:149
+msgid "user permissions"
+msgstr "ceada úsáideoira"
+
+#: contrib/auth/models.py:153
+msgid "user"
+msgstr "úsáideoir"
+
+#: contrib/auth/models.py:154
+msgid "users"
+msgstr "úsáideora"
+
+#: contrib/auth/models.py:309
+msgid "message"
+msgstr "teachtaireacht"
+
+#: contrib/auth/views.py:52
+msgid "Logged out"
+msgstr "Logáilte amach"
+
+#: contrib/comments/models.py:71 contrib/comments/models.py:164
+msgid "object ID"
+msgstr "oibiacht ID"
+
+#: contrib/comments/models.py:72
+msgid "headline"
+msgstr "ceannlíne"
+
+#: contrib/comments/models.py:73 contrib/comments/models.py:95
+#: contrib/comments/models.py:165
+msgid "comment"
+msgstr "trácht"
+
+#: contrib/comments/models.py:74
+msgid "rating #1"
+msgstr "rátáil #1"
+
+#: contrib/comments/models.py:75
+msgid "rating #2"
+msgstr "rátáil #2"
+
+#: contrib/comments/models.py:76
+msgid "rating #3"
+msgstr "rátáil #3"
+
+#: contrib/comments/models.py:77
+msgid "rating #4"
+msgstr "rátáil #4"
+
+#: contrib/comments/models.py:78
+msgid "rating #5"
+msgstr "rátáil #5"
+
+#: contrib/comments/models.py:79
+msgid "rating #6"
+msgstr "rátáil #6"
+
+#: contrib/comments/models.py:80
+msgid "rating #7"
+msgstr "rátáil #7"
+
+#: contrib/comments/models.py:81
+msgid "rating #8"
+msgstr "rátáil #8"
+
+#: contrib/comments/models.py:86
+msgid "is valid rating"
+msgstr "is rátáil bailí"
+
+#: contrib/comments/models.py:87 contrib/comments/models.py:167
+msgid "date/time submitted"
+msgstr "Dáta/am curtha isteach"
+
+#: contrib/comments/models.py:88 contrib/comments/models.py:168
+msgid "is public"
+msgstr "poiblí"
+
+#: contrib/comments/models.py:90
+msgid "is removed"
+msgstr "Scrioste"
+
+#: contrib/comments/models.py:90
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Seic an bosca seo dá bbéadh an nóta tráchta seo míchuí. Taispeantar \"Bhí an nóta tráchta scrioste\" in áit an nóta tráchta seo."
+
+#: contrib/comments/models.py:96
+msgid "comments"
+msgstr "nótaí tráchta"
+
+#: contrib/comments/models.py:128 contrib/comments/models.py:199
+msgid "Content object"
+msgstr "Oibiacht inneachar"
+
+#: contrib/comments/models.py:156
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Postáilte trí %(user)s ar %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:166
+msgid "person's name"
+msgstr "Ainm"
+
+#: contrib/comments/models.py:169
+msgid "ip address"
+msgstr "seoladh ip"
+
+#: contrib/comments/models.py:171
+msgid "approved by staff"
+msgstr "ceadaithe tríd an foireann"
+
+#: contrib/comments/models.py:175
+msgid "free comment"
+msgstr "Nóta tráchta saor"
+
+#: contrib/comments/models.py:176
+msgid "free comments"
+msgstr "Nótaí tráchtaí saoire"
+
+#: contrib/comments/models.py:227
+msgid "score"
+msgstr "scór"
+
+#: contrib/comments/models.py:228
+msgid "score date"
+msgstr "Dáta scór"
+
+#: contrib/comments/models.py:232
+msgid "karma score"
+msgstr "Scór karma"
+
+#: contrib/comments/models.py:233
+msgid "karma scores"
+msgstr "Scóra karma"
+
+#: contrib/comments/models.py:237
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d rátailte trí  %(user)s"
+
+#: contrib/comments/models.py:254
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Bhí bratach curtha leis an nóta tráchta seo trí %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:262
+msgid "flag date"
+msgstr "Dáta brait"
+
+#: contrib/comments/models.py:266
+msgid "user flag"
+msgstr "Brat úsáideoir"
+
+#: contrib/comments/models.py:267
+msgid "user flags"
+msgstr "Brait úsáideoira"
+
+#: contrib/comments/models.py:271
+#, python-format
+msgid "Flag by %r"
+msgstr "Cuir brat leis roimh %r"
+
+#: contrib/comments/models.py:277
+msgid "deletion date"
+msgstr "Dáta scrioseadh"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "Scroiseadh modhnóir"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "Scrios modhnóra"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Scrios modhnóir trí %r"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Dearmad déanta ar do focal faire?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Rátála"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Riachtanach"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Roghnach"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Post griangraf"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Nóta tráchta"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Nóta tráchta réamhamharc"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Do chuid ainm:"
+
+#: contrib/comments/views/comments.py:76
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr "Tá an rátáil seo ag teastail mar cuir tú rátáil amhain eile isteach ar a laghad."
+
+#: contrib/comments/views/comments.py:160
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Bhí an nóta tráchta póstailte trí úsáideoir a cuir níos lú ná %(count)s nótaí tráchtaí\n"
+"\n"
+"%(text)s"
+"Bhí an nóta tráchta póstailte trí úsáideoir a cuir níos lú ná %(count)s nótaí tráchtaí\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:165
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr "Bhí an nóta tráchta póstailte trí úsáideoir ait \n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:238
+#: contrib/comments/views/comments.py:331
+msgid "Only POSTs are allowed"
+msgstr "POSTs amhain ceadaithe"
+
+#: contrib/comments/views/comments.py:242
+#: contrib/comments/views/comments.py:335
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Níor curtha isteach ceann amhain nó níos mó de na réimse riachtanach"
+
+#: contrib/comments/views/comments.py:246
+#: contrib/comments/views/comments.py:337
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Cuir duine éigin isteach leis an foirm nóta tráchta (fadbh slándála)"
+
+#: contrib/comments/views/comments.py:256
+#: contrib/comments/views/comments.py:343
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"Bhí paraiméadar targaid mícheart ag an foirm nóta tráchta -- bhí ID an oibiacht neamhbhailí"
+
+#: contrib/comments/views/comments.py:307
+#: contrib/comments/views/comments.py:372
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "Níor sholáthair an foirm nóta tráchta 'réamhamharc' nó 'post'"
+
+#: contrib/comments/views/karma.py:21
+msgid "Anonymous users cannot vote"
+msgstr "Níl cead ag úsáideoira anaithnid vótáil"
+
+#: contrib/comments/views/karma.py:25
+msgid "Invalid comment ID"
+msgstr "Nóta tráchta ID neamhbhailí"
+
+#: contrib/comments/views/karma.py:27
+msgid "No voting for yourself"
+msgstr "Vótáil leat féin coiscthe"
+
+#: contrib/contenttypes/models.py:67
+msgid "python model class name"
+msgstr "píotón samhail aicme ainm"
+
+#: contrib/contenttypes/models.py:71
+msgid "content type"
+msgstr "tíopa inneachar "
+
+#: contrib/contenttypes/models.py:72
+msgid "content types"
+msgstr "tíopaI inneachair"
+
+#: contrib/flatpages/admin.py:9
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr "Sampla '/about/contact/' Déan cinnte go bhfuil príomhslaid agus cúlslais agat."
+
+#: contrib/flatpages/admin.py:11 core/validators.py:76
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr "Níl ach litreacha, uimhreacha, slaiseacha, fólíniú agus daiseanna ceadaithe."
+
+#: contrib/flatpages/admin.py:22
+msgid "Advanced options"
+msgstr "Ard-rogha"
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "teideal"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "suaimhneach"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "Cuir nótaí tráchta ar chumas"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "ainm an teimpléid"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"Sampla: 'flatpages/contact_page.html'. Muna bhfuil sé ar soláthair, bainfidh an córás úsáid as 'flatpages/default.html'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "clárúchán riachtanach"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Dá mbéadh é seo seicailte, ní beidh ach úsáideora logáilte isteach in ann an leathanach seo a fheiceail"
+
+#: contrib/flatpages/models.py:19
+msgid "flat page"
+msgstr "leacleathanach"
+
+#: contrib/flatpages/models.py:20
+msgid "flat pages"
+msgstr "leacleathanaigh"
+
+#: contrib/gis/forms/fields.py:10
+msgid "No geometry value provided."
+msgstr "Ní soláthair méid geoiméadracht"
+
+#: contrib/gis/forms/fields.py:11
+msgid "Invalid Geometry value."
+msgstr "Méid geoiméadracht neamhbhailí"
+
+#: contrib/gis/forms/fields.py:12
+msgid "Invalid Geometry type."
+msgstr "Tíopa geoiméadracht neamhbhailí"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "th"
+msgstr "ú"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "st"
+msgstr "ú"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "nd"
+msgstr "ú"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "rd"
+msgstr "ú"
+
+#: contrib/humanize/templatetags/humanize.py:51
+#, python-format
+msgid "%(value).1f million"
+msgstr "%(value).1f milliún"
+
+#: contrib/humanize/templatetags/humanize.py:54
+#, python-format
+msgid "%(value).1f billion"
+msgstr "%(value).1f billiún"
+
+#: contrib/humanize/templatetags/humanize.py:57
+#, python-format
+msgid "%(value).1f trillion"
+msgstr "%(value).1f trilliún"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "one"
+msgstr "aon"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "two"
+msgstr "dó"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "three"
+msgstr "trí"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "four"
+msgstr "ceathair"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "five"
+msgstr "cúig"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "six"
+msgstr "sé"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "seven"
+msgstr "seacht"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "eight"
+msgstr "ocht"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "nine"
+msgstr "naoi"
+
+#: contrib/humanize/templatetags/humanize.py:93
+msgid "today"
+msgstr "inniu"
+
+#: contrib/humanize/templatetags/humanize.py:95
+msgid "tomorrow"
+msgstr "amárach"
+
+#: contrib/humanize/templatetags/humanize.py:97
+msgid "yesterday"
+msgstr "inné"
+
+#: contrib/localflavor/ar/forms.py:27
+msgid "Enter a postal code in the format NNNN or ANNNNAAA."
+msgstr "Cuir isteach cód póstal ins an formáid NNNN nó ANNNNAAA"
+
+#: contrib/localflavor/ar/forms.py:49 contrib/localflavor/br/forms.py:96
+#: contrib/localflavor/br/forms.py:135 contrib/localflavor/pe/forms.py:23
+#: contrib/localflavor/pe/forms.py:51
+msgid "This field requires only numbers."
+msgstr "Teastaíonn an réimse seo uimhreacha amháin."
+
+#: contrib/localflavor/ar/forms.py:50
+msgid "This field requires 7 or 8 digits."
+msgstr "Teastaíonn an réimse seo 7 nó 8 digite."
+
+#: contrib/localflavor/ar/forms.py:79
+msgid "Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format."
+msgstr "Cuir isteach CUIT bailí i formáid XX-XXXXXXXX-X nó XXXXXXXXXXXX."
+
+#: contrib/localflavor/ar/forms.py:80
+msgid "Invalid CUIT."
+msgstr "CUIT neamhbailí"
+
+#: contrib/localflavor/at/at_states.py:5
+msgid "Burgenland"
+msgstr "Burgenland"
+
+#: contrib/localflavor/at/at_states.py:6
+msgid "Carinthia"
+msgstr "Carinthia"
+
+#: contrib/localflavor/at/at_states.py:7
+msgid "Lower Austria"
+msgstr "An Ostair íochtarach"
+
+#: contrib/localflavor/at/at_states.py:8
+msgid "Upper Austria"
+msgstr "An Ostair uachtarach"
+
+#: contrib/localflavor/at/at_states.py:9
+msgid "Salzburg"
+msgstr "Salzburg"
+
+#: contrib/localflavor/at/at_states.py:10
+msgid "Styria"
+msgstr "Styria"
+
+#: contrib/localflavor/at/at_states.py:11
+msgid "Tyrol"
+msgstr "Tyrol"
+
+#: contrib/localflavor/at/at_states.py:12
+msgid "Vorarlberg"
+msgstr "Tyrol"
+
+#: contrib/localflavor/at/at_states.py:13
+msgid "Vienna"
+msgstr "Vín"
+
+#: contrib/localflavor/at/forms.py:20 contrib/localflavor/ch/forms.py:16
+#: contrib/localflavor/no/forms.py:12
+msgid "Enter a zip code in the format XXXX."
+msgstr "Cuir isteach cód zip ins an formáid XXXX."
+
+#: contrib/localflavor/at/forms.py:48
+msgid "Enter a valid Austrian Social Security Number in XXXX XXXXXX format."
+msgstr ""
+
+#: contrib/localflavor/au/forms.py:16
+msgid "Enter a 4 digit post code."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:21
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:58
+msgid ""
+"Select a valid brazilian state. That state is not one of the available "
+"states."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:94
+msgid "Invalid CPF number."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:95
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:134
+msgid "Invalid CNPJ number."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:136
+msgid "This field requires at least 14 digits"
+msgstr ""
+
+#: contrib/localflavor/ca/forms.py:17
+msgid "Enter a postal code in the format XXX XXX."
+msgstr ""
+
+#: contrib/localflavor/ca/forms.py:88
+msgid "Enter a valid Canadian Social Insurance number in XXX-XXX-XXX format."
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr "An Ghinéiv"
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr ""
+
+#: contrib/localflavor/ch/forms.py:64
+msgid ""
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
+msgstr ""
+
+#: contrib/localflavor/cl/forms.py:29
+msgid "Enter a valid Chilean RUT."
+msgstr ""
+
+#: contrib/localflavor/cl/forms.py:30
+msgid "Enter a valid Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr ""
+
+#: contrib/localflavor/cl/forms.py:31
+msgid "The Chilean RUT is not valid."
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr "Beirlín"
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr ""
+
+#: contrib/localflavor/de/forms.py:14 contrib/localflavor/fi/forms.py:12
+#: contrib/localflavor/fr/forms.py:15
+msgid "Enter a zip code in the format XXXXX."
+msgstr ""
+
+#: contrib/localflavor/de/forms.py:41
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:5
+msgid "Arava"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:6
+msgid "Albacete"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:7
+msgid "Alacant"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:8
+msgid "Almeria"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:9
+msgid "Avila"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:10
+msgid "Badajoz"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:11
+msgid "Illes Balears"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:12
+msgid "Barcelona"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:13
+msgid "Burgos"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:14
+msgid "Caceres"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:15
+msgid "Cadiz"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:16
+msgid "Castello"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:17
+msgid "Ciudad Real"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:18
+msgid "Cordoba"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:19
+msgid "A Coruna"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:20
+msgid "Cuenca"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:21
+msgid "Girona"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:22
+msgid "Granada"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:23
+msgid "Guadalajara"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:24
+msgid "Guipuzkoa"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:25
+msgid "Huelva"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:26
+msgid "Huesca"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:27
+msgid "Jaen"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:28
+msgid "Leon"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:29
+msgid "Lleida"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:30
+#: contrib/localflavor/es/es_regions.py:17
+msgid "La Rioja"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:31
+msgid "Lugo"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:32
+#: contrib/localflavor/es/es_regions.py:18
+msgid "Madrid"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:33
+msgid "Malaga"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:34
+msgid "Murcia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:35
+msgid "Navarre"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:36
+msgid "Ourense"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:37
+msgid "Asturias"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:38
+msgid "Palencia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:39
+msgid "Las Palmas"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:40
+msgid "Pontevedra"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:41
+msgid "Salamanca"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:42
+msgid "Santa Cruz de Tenerife"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:43
+#: contrib/localflavor/es/es_regions.py:11
+msgid "Cantabria"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:44
+msgid "Segovia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:45
+msgid "Seville"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:46
+msgid "Soria"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:47
+msgid "Tarragona"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:48
+msgid "Teruel"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:49
+msgid "Toledo"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:50
+msgid "Valencia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:51
+msgid "Valladolid"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:52
+msgid "Bizkaia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:53
+msgid "Zamora"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:54
+msgid "Zaragoza"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:55
+msgid "Ceuta"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:56
+msgid "Melilla"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:5
+msgid "Andalusia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:6
+msgid "Aragon"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:7
+msgid "Principality of Asturias"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:8
+msgid "Balearic Islands"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:9
+msgid "Basque Country"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:10
+msgid "Canary Islands"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:12
+msgid "Castile-La Mancha"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:13
+msgid "Castile and Leon"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:14
+msgid "Catalonia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:15
+msgid "Extremadura"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:16
+msgid "Galicia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:19
+msgid "Region of Murcia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:20
+msgid "Foral Community of Navarre"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:21
+msgid "Valencian Community"
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:19
+msgid "Enter a valid postal code in the range and format 01XXX - 52XXX."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:39
+msgid ""
+"Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or "
+"9XXXXXXXX."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:66
+msgid "Please enter a valid NIF, NIE, or CIF."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:67
+msgid "Please enter a valid NIF or NIE."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:68
+msgid "Invalid checksum for NIF."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:69
+msgid "Invalid checksum for NIE."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:70
+msgid "Invalid checksum for CIF."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:142
+msgid ""
+"Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:143
+msgid "Invalid checksum for bank account number."
+msgstr ""
+
+#: contrib/localflavor/fi/forms.py:28
+msgid "Enter a valid Finnish social security number."
+msgstr ""
+
+#: contrib/localflavor/in_/forms.py:14
+msgid "Enter a zip code in the format XXXXXXX."
+msgstr ""
+
+#: contrib/localflavor/is_/forms.py:17
+msgid ""
+"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr ""
+
+#: contrib/localflavor/is_/forms.py:18
+msgid "The Icelandic identification number is not valid."
+msgstr ""
+
+#: contrib/localflavor/it/forms.py:14
+msgid "Enter a valid zip code."
+msgstr ""
+
+#: contrib/localflavor/it/forms.py:43
+msgid "Enter a valid Social Security number."
+msgstr ""
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr ""
+
+#: contrib/localflavor/jp/forms.py:17
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:12
+msgid "Aguascalientes"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:13
+msgid "Baja California"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:14
+msgid "Baja California Sur"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:15
+msgid "Campeche"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:16
+msgid "Chihuahua"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:17
+msgid "Chiapas"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:18
+msgid "Coahuila"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:19
+msgid "Colima"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:20
+msgid "Distrito Federal"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:21
+msgid "Durango"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:22
+msgid "Guerrero"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:23
+msgid "Guanajuato"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:24
+msgid "Hidalgo"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:25
+msgid "Jalisco"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:26
+msgid "Estado de México"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:27
+msgid "Michoacán"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:28
+msgid "Morelos"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:29
+msgid "Nayarit"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:30
+msgid "Nuevo León"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:31
+msgid "Oaxaca"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:32
+msgid "Puebla"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:33
+msgid "Querétaro"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:34
+msgid "Quintana Roo"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:35
+msgid "Sinaloa"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:36
+msgid "San Luis Potosí"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:37
+msgid "Sonora"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:38
+msgid "Tabasco"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:39
+msgid "Tamaulipas"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:40
+msgid "Tlaxcala"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:41
+msgid "Veracruz"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:42
+msgid "Yucatán"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:43
+msgid "Zacatecas"
+msgstr ""
+
+#: contrib/localflavor/nl/forms.py:21
+msgid "Enter a valid postal code"
+msgstr ""
+
+#: contrib/localflavor/nl/forms.py:52
+msgid "Enter a valid phone number"
+msgstr ""
+
+#: contrib/localflavor/nl/forms.py:78
+msgid "Enter a valid SoFi number"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:4
+msgid "Drente"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:5
+msgid "Flevoland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:6
+msgid "Friesland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:7
+msgid "Gelderland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:8
+msgid "Groningen"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:9
+msgid "Limburg"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:10
+msgid "Noord-Brabant"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:11
+msgid "Noord-Holland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:12
+msgid "Overijssel"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:13
+msgid "Utrecht"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:14
+msgid "Zeeland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:15
+msgid "Zuid-Holland"
+msgstr ""
+
+#: contrib/localflavor/no/forms.py:33
+msgid "Enter a valid Norwegian social security number."
+msgstr ""
+
+#: contrib/localflavor/pe/forms.py:24
+msgid "This field requires 8 digits."
+msgstr ""
+
+#: contrib/localflavor/pe/forms.py:52
+msgid "This field requires 11 digits."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:38
+msgid "National Identification Number consists of 11 digits."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:39
+msgid "Wrong checksum for the National Identification Number."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:71
+msgid ""
+"Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:72
+msgid "Wrong checksum for the Tax Number (NIP)."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:111
+msgid "National Business Register Number (REGON) consists of 7 or 9 digits."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:112
+msgid "Wrong checksum for the National Business Register Number (REGON)."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:155
+msgid "Enter a postal code in the format XX-XXX."
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:8
+msgid "Lower Silesia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:9
+msgid "Kuyavia-Pomerania"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:10
+msgid "Lublin"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:11
+msgid "Lubusz"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:12
+msgid "Lodz"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:13
+msgid "Lesser Poland"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:14
+msgid "Masovia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:15
+msgid "Opole"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:16
+msgid "Subcarpatia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:17
+msgid "Podlasie"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:18
+msgid "Pomerania"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:19
+msgid "Silesia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:20
+msgid "Swietokrzyskie"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:21
+msgid "Warmia-Masuria"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:22
+msgid "Greater Poland"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:23
+msgid "West Pomerania"
+msgstr ""
+
+#: contrib/localflavor/ro/forms.py:19
+msgid "Enter a valid CIF."
+msgstr ""
+
+#: contrib/localflavor/ro/forms.py:56
+msgid "Enter a valid CNP."
+msgstr ""
+
+#: contrib/localflavor/ro/forms.py:141
+msgid "Enter a valid IBAN in ROXX-XXXX-XXXX-XXXX-XXXX-XXXX format"
+msgstr ""
+
+#: contrib/localflavor/ro/forms.py:171
+msgid "Phone numbers must be in XXXX-XXXXXX format."
+msgstr ""
+
+#: contrib/localflavor/ro/forms.py:194
+msgid "Enter a valid postal code in the format XXXXXX"
+msgstr ""
+
+#: contrib/localflavor/sk/forms.py:30
+msgid "Enter a postal code in the format XXXXX or XXX XX."
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:8
+msgid "Banska Bystrica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:9
+msgid "Banska Stiavnica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:10
+msgid "Bardejov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:11
+msgid "Banovce nad Bebravou"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:12
+msgid "Brezno"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:13
+msgid "Bratislava I"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:14
+msgid "Bratislava II"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:15
+msgid "Bratislava III"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:16
+msgid "Bratislava IV"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:17
+msgid "Bratislava V"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:18
+msgid "Bytca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:19
+msgid "Cadca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:20
+msgid "Detva"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:21
+msgid "Dolny Kubin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:22
+msgid "Dunajska Streda"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:23
+msgid "Galanta"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:24
+msgid "Gelnica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:25
+msgid "Hlohovec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:26
+msgid "Humenne"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:27
+msgid "Ilava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:28
+msgid "Kezmarok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:29
+msgid "Komarno"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:30
+msgid "Kosice I"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:31
+msgid "Kosice II"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:32
+msgid "Kosice III"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:33
+msgid "Kosice IV"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:34
+msgid "Kosice - okolie"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:35
+msgid "Krupina"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:36
+msgid "Kysucke Nove Mesto"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:37
+msgid "Levice"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:38
+msgid "Levoca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:39
+msgid "Liptovsky Mikulas"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:40
+msgid "Lucenec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:41
+msgid "Malacky"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:42
+msgid "Martin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:43
+msgid "Medzilaborce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:44
+msgid "Michalovce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:45
+msgid "Myjava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:46
+msgid "Namestovo"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:47
+msgid "Nitra"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:48
+msgid "Nove Mesto nad Vahom"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:49
+msgid "Nove Zamky"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:50
+msgid "Partizanske"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:51
+msgid "Pezinok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:52
+msgid "Piestany"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:53
+msgid "Poltar"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:54
+msgid "Poprad"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:55
+msgid "Povazska Bystrica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:56
+msgid "Presov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:57
+msgid "Prievidza"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:58
+msgid "Puchov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:59
+msgid "Revuca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:60
+msgid "Rimavska Sobota"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:61
+msgid "Roznava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:62
+msgid "Ruzomberok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:63
+msgid "Sabinov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:64
+msgid "Senec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:65
+msgid "Senica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:66
+msgid "Skalica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:67
+msgid "Snina"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:68
+msgid "Sobrance"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:69
+msgid "Spisska Nova Ves"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:70
+msgid "Stara Lubovna"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:71
+msgid "Stropkov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:72
+msgid "Svidnik"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:73
+msgid "Sala"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:74
+msgid "Topolcany"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:75
+msgid "Trebisov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:76
+msgid "Trencin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:77
+msgid "Trnava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:78
+msgid "Turcianske Teplice"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:79
+msgid "Tvrdosin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:80
+msgid "Velky Krtis"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:81
+msgid "Vranov nad Toplou"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:82
+msgid "Zlate Moravce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:83
+msgid "Zvolen"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:84
+msgid "Zarnovica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:85
+msgid "Ziar nad Hronom"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:86
+msgid "Zilina"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:8
+msgid "Banska Bystrica region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:9
+msgid "Bratislava region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:10
+msgid "Kosice region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:11
+msgid "Nitra region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:12
+msgid "Presov region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:13
+msgid "Trencin region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:14
+msgid "Trnava region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:15
+msgid "Zilina region"
+msgstr ""
+
+#: contrib/localflavor/uk/forms.py:21
+msgid "Enter a valid postcode."
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:11
+msgid "Bedfordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:12
+msgid "Buckinghamshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:14
+msgid "Cheshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:15
+msgid "Cornwall and Isles of Scilly"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:16
+msgid "Cumbria"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:17
+msgid "Derbyshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:18
+msgid "Devon"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:19
+msgid "Dorset"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:20
+msgid "Durham"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:21
+msgid "East Sussex"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:22
+msgid "Essex"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:23
+msgid "Gloucestershire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:24
+msgid "Greater London"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:25
+msgid "Greater Manchester"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:26
+msgid "Hampshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:27
+msgid "Hertfordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:28
+msgid "Kent"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:29
+msgid "Lancashire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:30
+msgid "Leicestershire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:31
+msgid "Lincolnshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:32
+msgid "Merseyside"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:33
+msgid "Norfolk"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:34
+msgid "North Yorkshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:35
+msgid "Northamptonshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:36
+msgid "Northumberland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:37
+msgid "Nottinghamshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:38
+msgid "Oxfordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:39
+msgid "Shropshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:40
+msgid "Somerset"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:41
+msgid "South Yorkshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:42
+msgid "Staffordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:43
+msgid "Suffolk"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:44
+msgid "Surrey"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:45
+msgid "Tyne and Wear"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:46
+msgid "Warwickshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:47
+msgid "West Midlands"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:48
+msgid "West Sussex"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:49
+msgid "West Yorkshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:50
+msgid "Wiltshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:51
+msgid "Worcestershire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:55
+msgid "County Antrim"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:56
+msgid "County Armagh"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:57
+msgid "County Down"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:58
+msgid "County Fermanagh"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:59
+msgid "County Londonderry"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:60
+msgid "County Tyrone"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:64
+msgid "Clwyd"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:65
+msgid "Dyfed"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:66
+msgid "Gwent"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:67
+msgid "Gwynedd"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:68
+msgid "Mid Glamorgan"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:69
+msgid "Powys"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:70
+msgid "South Glamorgan"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:71
+msgid "West Glamorgan"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:75
+msgid "Borders"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:76
+msgid "Central Scotland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:77
+msgid "Dumfries and Galloway"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:78
+msgid "Fife"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:79
+msgid "Grampian"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:80
+msgid "Highland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:81
+msgid "Lothian"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:82
+msgid "Orkney Islands"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:83
+msgid "Shetland Islands"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:84
+msgid "Strathclyde"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:85
+msgid "Tayside"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:86
+msgid "Western Isles"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:90
+msgid "England"
+msgstr "Sasana"
+
+#: contrib/localflavor/uk/uk_regions.py:91
+msgid "Northern Ireland"
+msgstr "Tuaisceart Éireann"
+
+#: contrib/localflavor/uk/uk_regions.py:92
+msgid "Scotland"
+msgstr "Albain"
+
+#: contrib/localflavor/uk/uk_regions.py:93
+msgid "Wales"
+msgstr "An Bhreatain Bheag"
+
+#: contrib/localflavor/us/forms.py:16
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr ""
+
+#: contrib/localflavor/us/forms.py:54
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr ""
+
+#: contrib/localflavor/za/forms.py:20
+msgid "Enter a valid South African ID number"
+msgstr ""
+
+#: contrib/localflavor/za/forms.py:54
+msgid "Enter a valid South African postal code"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:4
+msgid "Eastern Cape"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:5
+msgid "Free State"
+msgstr "Saorstát"
+
+#: contrib/localflavor/za/za_provinces.py:6
+msgid "Gauteng"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:7
+msgid "KwaZulu-Natal"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:8
+msgid "Limpopo"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:9
+msgid "Mpumalanga"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:10
+msgid "Northern Cape"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:11
+msgid "North West"
+msgstr "Iarthuaisceart"
+
+#: contrib/localflavor/za/za_provinces.py:12
+msgid "Western Cape"
+msgstr ""
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "atreoraigh ó"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Teastaíonn dearbhchosán gan ainm fearainn. Sampla '/events/search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "atreoraigh go dtí"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr "Is féidir dearbhchosán nó URL lán ag tosnú le 'http://'."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "athsheol"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "atreoraithe"
+
+#: contrib/sessions/models.py:45
+msgid "session key"
+msgstr "eochair an seisiún"
+
+#: contrib/sessions/models.py:47
+msgid "session data"
+msgstr "sonraíocht an seisiún"
+
+#: contrib/sessions/models.py:48
+msgid "expire date"
+msgstr "Data dul as feidhm"
+
+#: contrib/sessions/models.py:53
+msgid "session"
+msgstr "seisiún"
+
+#: contrib/sessions/models.py:54
+msgid "sessions"
+msgstr "seisúin"
+
+#: contrib/sites/models.py:32
+msgid "domain name"
+msgstr "ainm fearainn"
+
+#: contrib/sites/models.py:33
+msgid "display name"
+msgstr "ainm taispeáinta"
+
+#: contrib/sites/models.py:39
+msgid "sites"
+msgstr "suíomhanna"
+
+#: core/validators.py:80
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "Níl ach litreacha, uimhreacha, fílínta agus daiseanna ceadaithe."
+
+#: core/validators.py:84
+msgid "Uppercase letters are not allowed here."
+msgstr "Níl cás uachtair ceadaithe anseo."
+
+#: core/validators.py:88
+msgid "Lowercase letters are not allowed here."
+msgstr "Nil cás íochtair ceadaithe anseo."
+
+#: core/validators.py:95
+msgid "Enter only digits separated by commas."
+msgstr "Cuir isteach digite amháin anseo scartha le camóg."
+
+#: core/validators.py:107
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Cuir isteach r-phostanna bailí scartha le camóige."
+
+#: core/validators.py:111
+msgid "Please enter a valid IP address."
+msgstr "Le do thoil cuir isteach seoladh IP bailí."
+
+#: core/validators.py:115
+msgid "Empty values are not allowed here."
+msgstr "Níl méideanna folmh ceadaithe anseo."
+
+#: core/validators.py:119
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Níl ach uimhreacha ceadaithe anseo."
+
+#: core/validators.py:123
+msgid "This value can't be comprised solely of digits."
+msgstr "Cathaigh níos mó ná digite amháin sa méid seo."
+
+#: core/validators.py:128 forms/fields.py:161
+msgid "Enter a whole number."
+msgstr "Cuir isteach uimhir lán."
+
+#: core/validators.py:132
+msgid "Only alphabetical characters are allowed here."
+msgstr ""
+
+#: core/validators.py:147
+#, python-format
+msgid "Invalid date: %s"
+msgstr ""
+
+#: core/validators.py:152 db/models/fields/__init__.py:569
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr ""
+
+#: core/validators.py:157
+msgid "Enter a valid time in HH:MM format."
+msgstr ""
+
+#: core/validators.py:161
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr ""
+
+#: core/validators.py:166 forms/fields.py:412
+msgid "Enter a valid e-mail address."
+msgstr ""
+
+#: core/validators.py:178 core/validators.py:470 forms/fields.py:430
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+
+#: core/validators.py:189 forms/fields.py:461
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+
+#: core/validators.py:196
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr ""
+
+#: core/validators.py:200
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+
+#: core/validators.py:208
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr ""
+
+#: core/validators.py:212
+msgid "A valid URL is required."
+msgstr ""
+
+#: core/validators.py:226
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+
+#: core/validators.py:233
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr ""
+
+#: core/validators.py:250
+#, python-format
+msgid "Invalid URL: %s"
+msgstr ""
+
+#: core/validators.py:255 core/validators.py:257
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr ""
+
+#: core/validators.py:263
+msgid "Enter a valid U.S. state abbreviation."
+msgstr ""
+
+#: core/validators.py:277
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgstr ""
+
+#: core/validators.py:284
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr ""
+
+#: core/validators.py:303
+msgid "Please enter something for at least one field."
+msgstr ""
+
+#: core/validators.py:312 core/validators.py:323
+msgid "Please enter both fields or leave them both empty."
+msgstr ""
+
+#: core/validators.py:331
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr ""
+
+#: core/validators.py:344
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr ""
+
+#: core/validators.py:363
+msgid "Duplicate values are not allowed."
+msgstr ""
+
+#: core/validators.py:378
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr ""
+
+#: core/validators.py:380
+#, python-format
+msgid "This value must be at least %s."
+msgstr ""
+
+#: core/validators.py:382
+#, python-format
+msgid "This value must be no more than %s."
+msgstr ""
+
+#: core/validators.py:423
+#, python-format
+msgid "This value must be a power of %s."
+msgstr ""
+
+#: core/validators.py:433
+msgid "Please enter a valid decimal number."
+msgstr ""
+
+#: core/validators.py:440
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+"Please enter a valid decimal number with at most %s total digits."
+msgstr ""
+
+#: core/validators.py:443
+#, python-format
+msgid ""
+"Please enter a valid decimal number with a whole part of at most %s digit."
+"Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr ""
+
+#: core/validators.py:446
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr ""
+
+#: core/validators.py:454
+msgid "Please enter a valid floating point number."
+msgstr ""
+
+#: core/validators.py:463
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr ""
+
+#: core/validators.py:464
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr ""
+
+#: core/validators.py:481
+msgid "The format for this field is wrong."
+msgstr ""
+
+#: core/validators.py:496
+msgid "This field is invalid."
+msgstr ""
+
+#: core/validators.py:532
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr ""
+
+#: core/validators.py:535
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+
+#: core/validators.py:568
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:572
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:577
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+
+#: core/validators.py:582
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+
+#: core/validators.py:586
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:591
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: db/models/manipulators.py:304
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr ""
+
+#: db/models/fields/__init__.py:46
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr ""
+
+#: db/models/fields/__init__.py:170 db/models/fields/__init__.py:343
+#: db/models/fields/files.py:168 db/models/fields/files.py:179
+#: forms/fields.py:52 oldforms/__init__.py:370
+msgid "This field is required."
+msgstr ""
+
+#: db/models/fields/__init__.py:457
+msgid "This value must be an integer."
+msgstr ""
+
+#: db/models/fields/__init__.py:503
+msgid "This value must be either True or False."
+msgstr ""
+
+#: db/models/fields/__init__.py:532
+msgid "This field cannot be null."
+msgstr ""
+
+#: db/models/fields/__init__.py:634 db/models/fields/__init__.py:651
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format."
+msgstr ""
+
+#: db/models/fields/__init__.py:707
+msgid "This value must be a decimal number."
+msgstr ""
+
+#: db/models/fields/__init__.py:854
+msgid "This value must be either None, True or False."
+msgstr ""
+
+#: db/models/fields/__init__.py:969 db/models/fields/__init__.py:982
+msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format."
+msgstr ""
+
+#: db/models/fields/files.py:188
+msgid "Enter a valid filename."
+msgstr ""
+
+#: db/models/fields/related.py:92
+#, python-format
+msgid "Please enter a valid %s."
+msgstr ""
+
+#: db/models/fields/related.py:759
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+#: db/models/fields/related.py:839
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr ""
+
+#: forms/fields.py:53
+msgid "Enter a valid value."
+msgstr ""
+
+#: forms/fields.py:133
+#, python-format
+msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+msgstr ""
+
+#: forms/fields.py:134
+#, python-format
+msgid "Ensure this value has at least %(min)d characters (it has %(length)d)."
+msgstr ""
+
+#: forms/fields.py:162 forms/fields.py:191 forms/fields.py:220
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr ""
+
+#: forms/fields.py:163 forms/fields.py:192 forms/fields.py:221
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr ""
+
+#: forms/fields.py:190 forms/fields.py:219
+msgid "Enter a number."
+msgstr ""
+
+#: forms/fields.py:222
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr ""
+
+#: forms/fields.py:223
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr ""
+
+#: forms/fields.py:224
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr ""
+
+#: forms/fields.py:272 forms/fields.py:793
+msgid "Enter a valid date."
+msgstr ""
+
+#: forms/fields.py:305 forms/fields.py:794
+msgid "Enter a valid time."
+msgstr ""
+
+#: forms/fields.py:344
+msgid "Enter a valid date/time."
+msgstr ""
+
+#: forms/fields.py:431
+msgid "No file was submitted."
+msgstr ""
+
+#: forms/fields.py:432 oldforms/__init__.py:689
+msgid "The submitted file is empty."
+msgstr ""
+
+#: forms/fields.py:522
+msgid "Enter a valid URL."
+msgstr ""
+
+#: forms/fields.py:523
+msgid "This URL appears to be a broken link."
+msgstr ""
+
+#: forms/fields.py:591 forms/fields.py:642
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr ""
+
+#: forms/fields.py:643 forms/fields.py:704 forms/models.py:528
+msgid "Enter a list of values."
+msgstr ""
+
+#: forms/fields.py:822
+msgid "Enter a valid IPv4 address."
+msgstr ""
+
+#: forms/models.py:461
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr ""
+
+#: forms/models.py:529
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr ""
+
+#: oldforms/__init__.py:405
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgstr ""
+
+#: oldforms/__init__.py:410
+msgid "Line breaks are not allowed here."
+msgstr ""
+
+#: oldforms/__init__.py:508 oldforms/__init__.py:582 oldforms/__init__.py:621
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr ""
+
+#: oldforms/__init__.py:750
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr ""
+
+#: oldforms/__init__.py:760
+msgid "Enter a positive number."
+msgstr ""
+
+#: oldforms/__init__.py:770
+msgid "Enter a whole number between 0 and 32,767."
+msgstr ""
+
+#: template/defaultfilters.py:698
+msgid "yes,no,maybe"
+msgstr "tá, níl, b'fhéidir"
+
+#: template/defaultfilters.py:729
+#, python-format
+msgid "%(size)d byte"
+msgstr ""
+
+#: template/defaultfilters.py:731
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f KB"
+
+#: template/defaultfilters.py:733
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: template/defaultfilters.py:734
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#: utils/dateformat.py:41
+msgid "p.m."
+msgstr "p.m."
+
+#: utils/dateformat.py:42
+msgid "a.m."
+msgstr "a.m."
+
+#: utils/dateformat.py:47
+msgid "PM"
+msgstr "PM"
+
+#: utils/dateformat.py:48
+msgid "AM"
+msgstr "AM"
+
+#: utils/dateformat.py:97
+msgid "midnight"
+msgstr "meán oíche"
+
+#: utils/dateformat.py:99
+msgid "noon"
+msgstr "nóin"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Luan"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Máirt"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Céadaoin"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Déardaoin"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Aoine"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Satharn"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Domhnach"
+
+#: utils/dates.py:10
+msgid "Mon"
+msgstr "Lua"
+
+#: utils/dates.py:10
+msgid "Tue"
+msgstr "Mai"
+
+#: utils/dates.py:10
+msgid "Wed"
+msgstr "Céa"
+
+#: utils/dates.py:10
+msgid "Thu"
+msgstr "Déa"
+
+#: utils/dates.py:10
+msgid "Fri"
+msgstr "Aoi"
+
+#: utils/dates.py:11
+msgid "Sat"
+msgstr "Sat"
+
+#: utils/dates.py:11
+msgid "Sun"
+msgstr "Dom"
+
+#: utils/dates.py:18
+msgid "January"
+msgstr "Mí Eanair"
+
+#: utils/dates.py:18
+msgid "February"
+msgstr "Mí Feabhra"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "March"
+msgstr "Mí Márta"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "April"
+msgstr "Aibreán"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "May"
+msgstr "Bealtaine"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "June"
+msgstr "Mí an Mheithimh"
+
+#: utils/dates.py:19 utils/dates.py:31
+msgid "July"
+msgstr "Mí Iúil"
+
+#: utils/dates.py:19
+msgid "August"
+msgstr "Lúnasa"
+
+#: utils/dates.py:19
+msgid "September"
+msgstr "Meán Fómhair"
+
+#: utils/dates.py:19
+msgid "October"
+msgstr "Deireadh Fómhair"
+
+#: utils/dates.py:19
+msgid "November"
+msgstr "Samhain"
+
+#: utils/dates.py:20
+msgid "December"
+msgstr "Mí na Nollag"
+
+#: utils/dates.py:23
+msgid "jan"
+msgstr "ean"
+
+#: utils/dates.py:23
+msgid "feb"
+msgstr "fea"
+
+#: utils/dates.py:23
+msgid "mar"
+msgstr "loit"
+
+#: utils/dates.py:23
+msgid "apr"
+msgstr "aib"
+
+#: utils/dates.py:23
+msgid "may"
+msgstr "bealtaine"
+
+#: utils/dates.py:23
+msgid "jun"
+msgstr "mei"
+
+#: utils/dates.py:24
+msgid "jul"
+msgstr "iui"
+
+#: utils/dates.py:24
+msgid "aug"
+msgstr "lun"
+
+#: utils/dates.py:24
+msgid "sep"
+msgstr "mea"
+
+#: utils/dates.py:24
+msgid "oct"
+msgstr "dei"
+
+#: utils/dates.py:24
+msgid "nov"
+msgstr "sam"
+
+#: utils/dates.py:24
+msgid "dec"
+msgstr "nol"
+
+#: utils/dates.py:31
+msgid "Jan."
+msgstr "Ean"
+
+#: utils/dates.py:31
+msgid "Feb."
+msgstr "Fea"
+
+#: utils/dates.py:32
+msgid "Aug."
+msgstr "Lún"
+
+#: utils/dates.py:32
+msgid "Sept."
+msgstr "Mea"
+
+#: utils/dates.py:32
+msgid "Oct."
+msgstr "Dei"
+
+#: utils/dates.py:32
+msgid "Nov."
+msgstr "Sam"
+
+#: utils/dates.py:32
+msgid "Dec."
+msgstr "Nol"
+
+#: utils/text.py:128
+msgid "or"
+msgstr "nó"
+
+#: utils/timesince.py:21
+msgid "year"
+msgid_plural "years"
+msgstr[0] "blian"
+msgstr[1] "blianta"
+
+#: utils/timesince.py:22
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mí"
+msgstr[1] "mhí"
+
+#: utils/timesince.py:23
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "seachtain"
+msgstr[1] "seachtain"
+
+#: utils/timesince.py:24
+msgid "day"
+msgid_plural "days"
+msgstr[0] "lá"
+msgstr[1] "laethanta"
+
+#: utils/timesince.py:25
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "uair"
+msgstr[1] "uair"
+
+#: utils/timesince.py:26
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "nóiméad"
+msgstr[1] "nóiméad"
+
+#: utils/timesince.py:46
+msgid "minutes"
+msgstr "nóiméad"
+
+#: utils/timesince.py:51
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr ""
+
+#: utils/timesince.py:57
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ""
+
+#: utils/translation/trans_real.py:401
+msgid "DATE_FORMAT"
+msgstr "DATE_FORMAT"
+
+#: utils/translation/trans_real.py:402
+msgid "DATETIME_FORMAT"
+msgstr "DATETIME_FORMAT"
+
+#: utils/translation/trans_real.py:403
+msgid "TIME_FORMAT"
+msgstr "TIME_FORMAT"
+
+#: utils/translation/trans_real.py:419
+msgid "YEAR_MONTH_FORMAT"
+msgstr "YEAR_MONTH_FORMAT"
+
+#: utils/translation/trans_real.py:420
+msgid "MONTH_DAY_FORMAT"
+msgstr "MONTH_DAY_FORMAT"
+
+#: views/generic/create_update.py:114
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr ""
+
+#: views/generic/create_update.py:156
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr ""
+
+#: views/generic/create_update.py:198
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr ""
+
+#~ msgid "Gaeilge"
+#~ msgstr "Gaeilge"
diff --git a/webapp/django/conf/locale/ga/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/ga/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..ba93d35
--- /dev/null
+++ b/webapp/django/conf/locale/ga/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/ga/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/ga/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..0b935f1
--- /dev/null
+++ b/webapp/django/conf/locale/ga/LC_MESSAGES/djangojs.po
@@ -0,0 +1,116 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-09-14 12:33+0100\n"
+"PO-Revision-Date: 2008-01-23 11:04+0100\n"
+"Last-Translator: Michael Thornhill <michael@maithu.com>\n"
+"Language-Team: Gaeilge <ga@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/calendar.js:24
+#: contrib/admin/media/js/dateparse.js:32
+msgid "January February March April May June July August September October November December"
+msgstr "Eanair Feabhra Márta Aibreán Bealtaine Meitheamh Iúil Lúnasa Mean Fómhair Deireadh Fómhair Nollaig"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "D L M C D A S"
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Domhnaigh Luain Máirt Céadaoin Déardaoin Aoine Sathairn"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "%s ar fáil"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Roghnaigh iomlán"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Cuir le"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Bain amach"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Roghnófar %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Roghnaigh do rogha agus cniog"
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Glan iomlán"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Now"
+msgstr "Anois"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
+msgid "Clock"
+msgstr "Clog"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
+msgid "Choose a time"
+msgstr "Roghnaigh am"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "Midnight"
+msgstr "Meán oíche"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "6 a.m."
+msgstr "6 a.m."
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
+msgid "Noon"
+msgstr "Nóin"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
+msgid "Cancel"
+msgstr "Cealaigh"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
+msgid "Today"
+msgstr "Inniu"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
+msgid "Calendar"
+msgstr "Féilire"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
+msgid "Yesterday"
+msgstr "Inné"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
+msgid "Tomorrow"
+msgstr "Amárach"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr "Taispeán"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr "Folaigh"
+
diff --git a/webapp/django/conf/locale/gl/LC_MESSAGES/django.mo b/webapp/django/conf/locale/gl/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..491d161
--- /dev/null
+++ b/webapp/django/conf/locale/gl/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/gl/LC_MESSAGES/django.po b/webapp/django/conf/locale/gl/LC_MESSAGES/django.po
new file mode 100644
index 0000000..f5db1f0
--- /dev/null
+++ b/webapp/django/conf/locale/gl/LC_MESSAGES/django.po
@@ -0,0 +1,3028 @@
+# Translation of django.po to Galego
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-05-28 12:56+0200\n"
+"PO-Revision-Date: 2007-05-28 17:29+0200\n"
+"Last-Translator: Afonso Fernández Nogueira <fonzzo.django@gmail.com>\n"
+"Language-Team: Galego\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Galician\n"
+"X-Poedit-SourceCharset: utf-8\n"
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "árabe"
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "bengalí"
+
+#: conf/global_settings.py:41
+msgid "Bulgarian"
+msgstr "búlgaro"
+
+#: conf/global_settings.py:42
+msgid "Catalan"
+msgstr "catalán"
+
+#: conf/global_settings.py:43
+msgid "Czech"
+msgstr "checo"
+
+#: conf/global_settings.py:44
+msgid "Welsh"
+msgstr "galés"
+
+#: conf/global_settings.py:45
+msgid "Danish"
+msgstr "dinamarqués"
+
+#: conf/global_settings.py:46
+msgid "German"
+msgstr "alemán"
+
+#: conf/global_settings.py:47
+msgid "Greek"
+msgstr "grego"
+
+#: conf/global_settings.py:48
+msgid "English"
+msgstr "inglés"
+
+#: conf/global_settings.py:49
+msgid "Spanish"
+msgstr "español"
+
+#: conf/global_settings.py:50
+msgid "Argentinean Spanish"
+msgstr "español de Arxentina"
+
+#: conf/global_settings.py:51
+msgid "Finnish"
+msgstr "finés"
+
+#: conf/global_settings.py:52
+msgid "French"
+msgstr "francés"
+
+#: conf/global_settings.py:53
+msgid "Galician"
+msgstr "galego"
+
+#: conf/global_settings.py:54
+msgid "Hungarian"
+msgstr "húngaro"
+
+#: conf/global_settings.py:55
+msgid "Hebrew"
+msgstr "hebreo"
+
+#: conf/global_settings.py:56
+msgid "Icelandic"
+msgstr "islandés"
+
+#: conf/global_settings.py:57
+msgid "Italian"
+msgstr "italiano"
+
+#: conf/global_settings.py:58
+msgid "Japanese"
+msgstr "xaponés"
+
+#: conf/global_settings.py:59
+msgid "Korean"
+msgstr "coreano"
+
+#: conf/global_settings.py:60
+msgid "Kannada"
+msgstr "canará"
+
+#: conf/global_settings.py:61
+msgid "Latvian"
+msgstr "letón"
+
+#: conf/global_settings.py:62
+msgid "Macedonian"
+msgstr "macedonio"
+
+#: conf/global_settings.py:63
+msgid "Dutch"
+msgstr "holandés"
+
+#: conf/global_settings.py:64
+msgid "Norwegian"
+msgstr "noruegués"
+
+#: conf/global_settings.py:65
+msgid "Polish"
+msgstr "polaco"
+
+#: conf/global_settings.py:66
+msgid "Portugese"
+msgstr "portugués"
+
+#: conf/global_settings.py:67
+msgid "Brazilian"
+msgstr "brasileiro"
+
+#: conf/global_settings.py:68
+msgid "Romanian"
+msgstr "romanés"
+
+#: conf/global_settings.py:69
+msgid "Russian"
+msgstr "ruso"
+
+#: conf/global_settings.py:70
+msgid "Slovak"
+msgstr "eslovaco"
+
+#: conf/global_settings.py:71
+msgid "Slovenian"
+msgstr "esloveno"
+
+#: conf/global_settings.py:72
+msgid "Serbian"
+msgstr "serbio"
+
+#: conf/global_settings.py:73
+msgid "Swedish"
+msgstr "sueco"
+
+#: conf/global_settings.py:74
+msgid "Tamil"
+msgstr "támil"
+
+#: conf/global_settings.py:75
+msgid "Telugu"
+msgstr "telugu"
+
+#: conf/global_settings.py:76
+msgid "Turkish"
+msgstr "turco"
+
+#: conf/global_settings.py:77
+msgid "Ukrainian"
+msgstr "ucraíno"
+
+#: conf/global_settings.py:78
+msgid "Simplified Chinese"
+msgstr "chinés simplificado"
+
+#: conf/global_settings.py:79
+msgid "Traditional Chinese"
+msgstr "chinés tradicional"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Por %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169
+msgid "All"
+msgstr "Todo"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "Calquera data"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "Hoxe"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "Últimos 7 días"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "Este mes"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "Este ano"
+
+#: contrib/admin/filterspecs.py:143 newforms/widgets.py:182
+#: oldforms/__init__.py:577
+msgid "Yes"
+msgstr "Si"
+
+#: contrib/admin/filterspecs.py:143 newforms/widgets.py:182
+#: oldforms/__init__.py:577
+msgid "No"
+msgstr "Non"
+
+#: contrib/admin/filterspecs.py:150 newforms/widgets.py:182
+#: oldforms/__init__.py:577
+msgid "Unknown"
+msgstr "Descoñecido"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "hora da acción"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "id do obxecto"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "repr do obxecto"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "código do tipo de acción"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "cambiar mensaxe"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "entrada de rexistro"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "entradas de rexistro"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Páxina non atopada"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Sentímolo, pero non se atopou a páxina solicitada."
+
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/auth/user/change_password.html:12
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+msgid "Home"
+msgstr "Inicio"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Erro no servidor"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Erro no servidor (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Erro do servidor <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Houbo un erro. Xa se informou aos administradores do sitio por correo "
+"electrónico e debería quedar arranxado pronto. Grazas pola súa paciencia."
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "Benvido,"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+msgid "Documentation"
+msgstr "Documentación"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin/auth/user/change_password.html:15
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+msgid "Change password"
+msgstr "Cambiar contrasinal"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/comments/templates/comments/form.html:6
+msgid "Log out"
+msgstr "Rematar sesión"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Administración de sitio Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Administración de Django"
+
+#: contrib/admin/templates/admin/change_form.html:15
+#: contrib/admin/templates/admin/index.html:28
+msgid "Add"
+msgstr "Engadir"
+
+#: contrib/admin/templates/admin/change_form.html:21
+#: contrib/admin/templates/admin/object_history.html:5
+msgid "History"
+msgstr "Histórico"
+
+#: contrib/admin/templates/admin/change_form.html:22
+msgid "View on site"
+msgstr "Ver na web"
+
+#: contrib/admin/templates/admin/change_form.html:32
+#: contrib/admin/templates/admin/auth/user/change_password.html:24
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Por favor, corrixa o erro de embaixo."
+msgstr[1] "Por favor, corrixa os erros de embaixo."
+
+#: contrib/admin/templates/admin/change_form.html:50
+msgid "Ordering"
+msgstr "Orde"
+
+#: contrib/admin/templates/admin/change_form.html:53
+msgid "Order:"
+msgstr "Orde:"
+
+#: contrib/admin/templates/admin/change_list.html:12
+#, python-format
+msgid "Add %(name)s"
+msgstr "Engadir %(name)s"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Eliminar"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Borrar o %(object_name)s '%(escaped_object)s' resultaría na eliminación de elementos "
+"relacionados, pero a súa conta non ten permiso para borrar os seguintes "
+"tipos de elementos:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Seguro que quere borrar o %(object_name)s \"%(escaped_object)s\"? Eliminaranse os "
+"seguintes obxectos relacionados:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Si, estou seguro"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Por %(filter_title)s "
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "Filtro"
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Modelos dispoñíbeis na aplicación %(name)s."
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Modificar"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Non ten permiso para editar nada."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Accións recentes"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "As miñas accións"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Ningunha dispoñíbel"
+
+#: contrib/admin/templates/admin/invalid_setup.html:8
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Hai un problema coa súa instalación de base de datos. Asegúrese "
+"de que se creasen as táboas axeitadas na base de datos, e de que o usuario "
+"apropiado teña permisos para lela."
+
+#: contrib/admin/templates/admin/login.html:17
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+msgid "Username:"
+msgstr "Usuario:"
+
+#: contrib/admin/templates/admin/login.html:20
+#: contrib/comments/templates/comments/form.html:8
+msgid "Password:"
+msgstr "Contrasinal:"
+
+#: contrib/admin/templates/admin/login.html:25
+#: contrib/admin/views/decorators.py:24
+msgid "Log in"
+msgstr "Iniciar sesión"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Data/hora"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Usuario"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Acción"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "j de N de Y, H:i"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Este obxecto non ten histórico de cambios. Posibelmente non se creou usando "
+"este sitio de administración."
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Amosar todo"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Ir"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 resultado"
+msgstr[1] "%(counter)s resultados"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s en total"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Gardar coma novo"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Gardar e engadir outro"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Gardar e seguir editando"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Gardar"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr "Primeiro insira un nome de usuario e un contrasinal. Despois poderá "
+"editar máis opcións de usuario."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "Usuario"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+#: contrib/admin/templates/admin/auth/user/change_password.html:34
+msgid "Password"
+msgstr "Contrasinal"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+msgid "Password (again)"
+msgstr "Contrasinal (outra vez)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+msgid "Enter the same password as above, for verification."
+msgstr "Insira o mesmo contrasinal ca enriba para verificalo."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:28
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Insira un novo contrasinal para o usuario <strong>%(username)s</strong>."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Bookmarklets"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "Bookmarklets de documentación"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">Para instalar bookmarklets, arrastre a ligazón á súa\n"
+"barra de favoritos ou marcadores, ou faga clic co botón dereito\n"
+"e engádao aos marcadores. Agora pode usar o bookmarklet dende\n"
+" calquera páxina do sitio web. Teña en conta que algúns destes\n"
+"bookmarklets precisan que estea a visitar o sitio dende un ordenador\n"
+"designado coma \"interno\" (fale co administrador do sistema se\n"
+"non está seguro de que o seu ordenador é \"interno\" .</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Documentación para esta páxina"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr "Salta á documentación para a vista que xera a páxina."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Amosar ID do obxecto"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Amosa o tipo de contido e a ID única para páxinas que representan un obxecto "
+"determinado."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Editar este obxecto (nesta fiestra)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+"Salta á páxina de administración para páxina que representan un obxecto "
+"determinado."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Editar este obxecto (nunha nova fiestra)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "Como enriba, pero abre a páxina de administración nunha nova fiestra."
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Grazas polo tempo que dedicou ao sitio web."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Entrar de novo"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Cambiar o contrasinal"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "O seu contrasinal cambiouse correctamente."
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Cambiouse o seu contrasinal."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Por razóns de seguridade, introduza o contrasinal actual. Despois introduza "
+"dúas veces o contrasinal para verificarmos que o escribiu correctamente."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Contrasinal actual:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Contrasinal novo:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Confirmar contrasinal:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Cambiar o contrasinal"
+
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+msgid "Password reset"
+msgstr "Recuperar o contrasinal"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "O contrasinal foi recuperado correctamente"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"Acabamos de enviarlle un novo contrasinal ao enderezo de correo indicado. "
+"Debería recibilo en breve."
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Recibe esta mensaxe porque solicitou recuperar o contrasinal"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "para a súa conta de usuario en %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "O seu novo contrasinal é: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Pode cambiar este contrasinal visitando esta páxina:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "No caso de que o esquecese, o seu nome de usuario é:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Grazas por usar o noso sitio web!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "O equipo de %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"Esqueceu o contrasinal? Introduza o seu enderezo de correo electrónico "
+"embaixo e enviarémoslle un novo contrasinal."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Enderezo de correo electrónico:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Recuperar o meu contrasinal"
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Data:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Hora"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Agora:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Modificar:"
+
+#: contrib/admin/templatetags/admin_list.py:249
+msgid "All dates"
+msgstr "Todas as datas"
+
+#: contrib/admin/views/auth.py:19 contrib/admin/views/main.py:257
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Engadiuse correctamente o/a %(name)s  \"%(obj)s\"."
+
+#: contrib/admin/views/auth.py:24 contrib/admin/views/main.py:261
+#: contrib/admin/views/main.py:347
+msgid "You may edit it again below."
+msgstr "Pode editalo embaixo."
+
+#: contrib/admin/views/auth.py:30
+msgid "Add user"
+msgstr "Engadir usuario"
+
+#: contrib/admin/views/auth.py:57
+msgid "Password changed successfully."
+msgstr "O contrasinal cambiouse correctamente."
+
+#: contrib/admin/views/auth.py:64
+#, python-format
+msgid "Change password: %s"
+msgstr "Cambiar contrasinal: %s"
+
+#: contrib/admin/views/decorators.py:10 contrib/auth/forms.py:60
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Insira un nome de usuario e un contrasinal correctos. Teña en conta que nos "
+"dous campos se distingue entre maiúsculas e minúsculas."
+
+#: contrib/admin/views/decorators.py:62
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Ten que identicarse outra vez porque a súa sesión expirou. Non se preocupe, "
+"o que enviou quedou gardado."
+
+#: contrib/admin/views/decorators.py:69
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Semella que o seu navegador non está configurado para aceptar  'cookies'. "
+"Por favor, habilite as 'cookies', recargue a páxina e ténteo de novo."
+
+#: contrib/admin/views/decorators.py:83
+msgid "Usernames cannot contain the '@' character."
+msgstr "Os nomes de usuario non poden conter o carácter '@'."
+
+#: contrib/admin/views/decorators.py:85
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr ""
+"O seu enderezo de correo electrónico non é o seu nome de usuario. Probe con "
+"'%s'."
+
+#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48
+#: contrib/admin/views/doc.py:50
+msgid "tag:"
+msgstr "etiqueta:"
+
+#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79
+#: contrib/admin/views/doc.py:81
+msgid "filter:"
+msgstr "filtro:"
+
+#: contrib/admin/views/doc.py:135 contrib/admin/views/doc.py:137
+#: contrib/admin/views/doc.py:139
+msgid "view:"
+msgstr "vista:"
+
+#: contrib/admin/views/doc.py:164
+#, python-format
+msgid "App %r not found"
+msgstr "Non se atopou a aplicación %r"
+
+#: contrib/admin/views/doc.py:171
+#, python-format
+msgid "Model %(name)r not found in app %(label)r"
+msgstr "Non se atopou o modelo %(name)r na aplicación %(label)r"
+
+#: contrib/admin/views/doc.py:183
+#, python-format
+msgid "the related `%(label)s.%(type)s` object"
+msgstr "o obxecto `%(label)s.%(type)s` relacionado"
+
+#: contrib/admin/views/doc.py:183 contrib/admin/views/doc.py:205
+#: contrib/admin/views/doc.py:219 contrib/admin/views/doc.py:224
+msgid "model:"
+msgstr "modelo:"
+
+#: contrib/admin/views/doc.py:214
+#, python-format
+msgid "related `%(label)s.%(name)s` objects"
+msgstr "obxectos `%(label)s.%(name)s` relacionados"
+
+#: contrib/admin/views/doc.py:219
+#, python-format
+msgid "all %s"
+msgstr "todos os %s"
+
+#: contrib/admin/views/doc.py:224
+#, python-format
+msgid "number of %s"
+msgstr "número de %s"
+
+#: contrib/admin/views/doc.py:229
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Campos dos obxectos %s"
+
+#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:302
+#: contrib/admin/views/doc.py:304 contrib/admin/views/doc.py:310
+#: contrib/admin/views/doc.py:311 contrib/admin/views/doc.py:313
+msgid "Integer"
+msgstr "Número enteiro"
+
+#: contrib/admin/views/doc.py:292
+msgid "Boolean (Either True or False)"
+msgstr "Valor booleano (verdadeiro ou falso)"
+
+#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:312
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "Cadea (ata %(maxlength)s caracteres)"
+
+#: contrib/admin/views/doc.py:294
+msgid "Comma-separated integers"
+msgstr "Números enteiros separados por comas"
+
+#: contrib/admin/views/doc.py:295
+msgid "Date (without time)"
+msgstr "Data (sen a hora)"
+
+#: contrib/admin/views/doc.py:296
+msgid "Date (with time)"
+msgstr "Data (coa hora)"
+
+#: contrib/admin/views/doc.py:297
+msgid "Decimal number"
+msgstr "Número decimal"
+
+#: contrib/admin/views/doc.py:298
+msgid "E-mail address"
+msgstr "Enderezo de correo electrónico"
+
+#: contrib/admin/views/doc.py:299 contrib/admin/views/doc.py:300
+#: contrib/admin/views/doc.py:303
+msgid "File path"
+msgstr "Ruta do ficheiro"
+
+#: contrib/admin/views/doc.py:301
+msgid "Floating point number"
+msgstr "Número de coma flotante"
+
+#: contrib/admin/views/doc.py:305 contrib/comments/models.py:85
+msgid "IP address"
+msgstr "Enderezo IP"
+
+#: contrib/admin/views/doc.py:307
+msgid "Boolean (Either True, False or None)"
+msgstr "Booleano (verdadeiro, falso ou ningún)"
+
+#: contrib/admin/views/doc.py:308
+msgid "Relation to parent model"
+msgstr "Relación cun modelo pai"
+
+#: contrib/admin/views/doc.py:309
+msgid "Phone number"
+msgstr "Número de teléfono"
+
+#: contrib/admin/views/doc.py:314
+msgid "Text"
+msgstr "Texto"
+
+#: contrib/admin/views/doc.py:315
+msgid "Time"
+msgstr "Hora"
+
+#: contrib/admin/views/doc.py:316 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:317
+msgid "U.S. state (two uppercase letters)"
+msgstr "Estado dos Estados Unidos (dúas letras maiúsculas)"
+
+#: contrib/admin/views/doc.py:318
+msgid "XML text"
+msgstr "Texto XML"
+
+#: contrib/admin/views/doc.py:344
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s non semella ser un obxecto urlpattern"
+
+#: contrib/admin/views/main.py:223
+msgid "Site administration"
+msgstr "Administración do sitio web"
+
+#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356
+#, python-format
+msgid "You may add another %s below."
+msgstr "Pode engadir outro/a %s embaixo."
+
+#: contrib/admin/views/main.py:289
+#, python-format
+msgid "Add %s"
+msgstr "Engadir %s"
+
+#: contrib/admin/views/main.py:335
+#, python-format
+msgid "Added %s."
+msgstr "Engadido/a %s."
+
+#: contrib/admin/views/main.py:335 contrib/admin/views/main.py:337
+#: contrib/admin/views/main.py:339 db/models/manipulators.py:308
+msgid "and"
+msgstr "e"
+
+#: contrib/admin/views/main.py:337
+#, python-format
+msgid "Changed %s."
+msgstr "Modificado(s) %s."
+
+#: contrib/admin/views/main.py:339
+#, python-format
+msgid "Deleted %s."
+msgstr "Eliminado(s) %s."
+
+#: contrib/admin/views/main.py:342
+msgid "No fields changed."
+msgstr "Non se modificou ningún campo."
+
+#: contrib/admin/views/main.py:345
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Modificouse correctamente o/a %(name)s \"%(obj)s\"."
+
+#: contrib/admin/views/main.py:353
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "Engadiuse correctamente o/a %(name)s \"%(obj)s\" Pode editalo embaixo."
+
+#: contrib/admin/views/main.py:391
+#, python-format
+msgid "Change %s"
+msgstr "Modificar %s"
+
+#: contrib/admin/views/main.py:476
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Un ou máis %(fieldname)s no/a %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:481
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Un ou máis %(fieldname)s no/a %(name)s:"
+
+#: contrib/admin/views/main.py:514
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Eliminouse correctamente o/a %(name)s \"%(obj)s\"."
+
+#: contrib/admin/views/main.py:517
+msgid "Are you sure?"
+msgstr "Está seguro?"
+
+#: contrib/admin/views/main.py:539
+#, python-format
+msgid "Change history: %s"
+msgstr "Histórico de cambios: %s"
+
+#: contrib/admin/views/main.py:573
+#, python-format
+msgid "Select %s"
+msgstr "Seleccione un/ha %s"
+
+#: contrib/admin/views/main.py:573
+#, python-format
+msgid "Select %s to change"
+msgstr "Seleccione %s que modificar"
+
+#: contrib/admin/views/main.py:768
+msgid "Database error"
+msgstr "Erro da base de datos"
+
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr "Os dous campos de contrasinal non coinciden."
+
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr "Xa existe un usuario con ese nome de usuario."
+
+#: contrib/auth/forms.py:53
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"Semella que o seu navegador non acepta 'cookies'. Requírense 'cookies' para "
+"iniciar sesión."
+
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "Esta conta está inactiva."
+
+#: contrib/auth/forms.py:85
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr ""
+"Este enderezo de correo electrónico non ten unha conta de usuario asociada. "
+"Está seguro de que está rexistrado?"
+
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "Os dous campos 'contrasinal novo' non coinciden."
+
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Inseriu incorrectamente o seu contrasinal actual. Por favor, insírao de novo."
+
+#: contrib/auth/models.py:44 contrib/auth/models.py:64
+msgid "name"
+msgstr "nome"
+
+#: contrib/auth/models.py:46
+msgid "codename"
+msgstr "código"
+
+#: contrib/auth/models.py:49
+msgid "permission"
+msgstr "permiso"
+
+#: contrib/auth/models.py:50 contrib/auth/models.py:65
+msgid "permissions"
+msgstr "permisos"
+
+#: contrib/auth/models.py:68
+msgid "group"
+msgstr "grupo"
+
+#: contrib/auth/models.py:69 contrib/auth/models.py:109
+msgid "groups"
+msgstr "grupos"
+
+#: contrib/auth/models.py:99
+msgid "username"
+msgstr "nome de usuario"
+
+#: contrib/auth/models.py:99
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr ""
+"Requirido. 30 caracteres ou menos. Soamente caracteres alfanuméricos "
+"(letras, díxitos ou guións baixos)."
+
+#: contrib/auth/models.py:100
+msgid "first name"
+msgstr "nome"
+
+#: contrib/auth/models.py:101
+msgid "last name"
+msgstr "apelidos"
+
+#: contrib/auth/models.py:102
+msgid "e-mail address"
+msgstr "enderezo de correo electrónico"
+
+#: contrib/auth/models.py:103
+msgid "password"
+msgstr "contrasinal"
+
+#: contrib/auth/models.py:103
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"Use '[algo]$[salt]$[hexdigest]' ou utilice o <a href=\"password/\">formulario de "
+"cambio de contrasinal</a>."
+
+#: contrib/auth/models.py:104
+msgid "staff status"
+msgstr "membro do persoal"
+
+#: contrib/auth/models.py:104
+msgid "Designates whether the user can log into this admin site."
+msgstr "Indica se o usuario pode entrar neste sitio de administración."
+
+#: contrib/auth/models.py:105
+msgid "active"
+msgstr "activo"
+
+#: contrib/auth/models.py:105
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr "Indica se o usuario pode entrar na sección de administración. "
+"Desactíveo no canto de borrar contas de usuario."
+
+#: contrib/auth/models.py:106
+msgid "superuser status"
+msgstr "estatus de superusuario"
+
+#: contrib/auth/models.py:106
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr ""
+"Indica que este usuario ten todos os permisos sen asignarllos explicitamente."
+
+
+#: contrib/auth/models.py:107
+msgid "last login"
+msgstr "última sesión"
+
+#: contrib/auth/models.py:108
+msgid "date joined"
+msgstr "data de rexistro"
+
+#: contrib/auth/models.py:110
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"Ademais dos permisos asignados manualmente, este usuario gozará de todos os "
+"permisos concedidos a cada un dos grupos aos que pertence."
+
+#: contrib/auth/models.py:111
+msgid "user permissions"
+msgstr "permisos de usuario"
+
+#: contrib/auth/models.py:115
+msgid "user"
+msgstr "usuario"
+
+#: contrib/auth/models.py:116
+msgid "users"
+msgstr "usuarios"
+
+#: contrib/auth/models.py:122
+msgid "Personal info"
+msgstr "Información persoal"
+
+#: contrib/auth/models.py:123
+msgid "Permissions"
+msgstr "Permisos"
+
+#: contrib/auth/models.py:124
+msgid "Important dates"
+msgstr "Datas importantes"
+
+#: contrib/auth/models.py:125
+msgid "Groups"
+msgstr "Grupos"
+
+#: contrib/auth/models.py:269
+msgid "message"
+msgstr "mensaxe"
+
+#: contrib/auth/models.py:282
+msgid "AnonymousUser"
+msgstr "UsuarioAnónimo"
+
+#: contrib/auth/views.py:40
+msgid "Logged out"
+msgstr "Rematou a sesión"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "ID do obxecto"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "título"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "comentario"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "valoración 1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "valoración 2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "valoración 3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "valoración 4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "valoración 5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "valoración 6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "valoración 7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "valoración 8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "é unha valoración válida"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "data/hora do envío"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "é público"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "está borrado"
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Marque esta caixa se o comentario non é apropiado. Verase a mensaxe \"Este "
+"comentario foi borrado\" no canto do seu contido."
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "comentarios"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "Obxecto de contido"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Publicado por %(user)s o %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "nome da persoa"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "enderezo IP"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "aprobado polos moderadores"
+
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "comentario libre"
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "comentarios libres"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "puntuación"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "data da puntuación"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "puntos de karma"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "puntos de karma"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "puntuación de %(score)d por %(user)s"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Este comentario foi marcado por %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "data da marca"
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "marca de usuario"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "marcas de usuario"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "Marca por %r"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "data de borrado"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "borrado de moderador"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "borrados de moderador"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Borrado polo moderador %r"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Esqueceu o contrasinal?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Valoracións"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Requirido"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Opcional"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Publicar unha foto"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Comentario:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Previsualizar comentario"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "O seu nome:"
+
+#: contrib/comments/views/comments.py:27
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr "Requírese esta valoración porque vostede inseriu polo menos "
+"outra valoración."
+
+#: contrib/comments/views/comments.py:111
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Este comentario foi publicado por un usuario que ten publicados menos de %"
+"(count)s comentario:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Este comentario foi publicado por un usuario que ten publicados menos de %"
+"(count)s comentarios:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:116
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Este comentario foi enviado por un usuario conflitivo:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:188
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Soamente se permiten envíos polo método POST"
+
+#: contrib/comments/views/comments.py:192
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Non se enviaron un ou máis dos campos requiridos"
+
+#: contrib/comments/views/comments.py:196
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Alguén manipulou o formulario do comentario (violación de seguridade)"
+
+#: contrib/comments/views/comments.py:206
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"O formulario do comentario tiña un parámetro 'target' non válido: a ID do "
+"obxecto non é válida"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "O formulario de comentario non proporciona 'preview' ou 'post'"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Os usuarios anónimos non poden votar"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "ID de comentario non válida"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "Vostede non se pode votar a si mesmo"
+
+#: contrib/contenttypes/models.py:36
+msgid "python model class name"
+msgstr "nome do módulo Python"
+
+#: contrib/contenttypes/models.py:39
+msgid "content type"
+msgstr "tipo de contido"
+
+#: contrib/contenttypes/models.py:40
+msgid "content types"
+msgstr "tipos de contido"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Exemplo: '/about/contact/'. Lembre incluír as barras ao principio e ao final."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "título"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "contido"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "activar comentarios"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "nome da plantilla"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"Exemplo: 'flatpages/contact_page.html'. Se non se especifica, o sistema usará "
+"'flatpages/default.html'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "require rexistro"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Se se marca, só poderán ver a páxina os usuarios identificados."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "páxina simple"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "páxinas simples"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "th"
+msgstr "º"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "st"
+msgstr "º"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "nd"
+msgstr "º"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "rd"
+msgstr "º"
+
+#: contrib/humanize/templatetags/humanize.py:47
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f millón"
+msgstr[1] "%(value).1f millóns"
+
+#: contrib/humanize/templatetags/humanize.py:50
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f mil millóns"
+msgstr[1] "%(value).1f miles de millóns"
+
+#: contrib/humanize/templatetags/humanize.py:53
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f billón"
+msgstr[1] "%(value).1f billóns"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "one"
+msgstr "un"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "two"
+msgstr "dous"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "three"
+msgstr "tres"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "four"
+msgstr "catro"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "five"
+msgstr "cinco"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "six"
+msgstr "seis"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "seven"
+msgstr "sete"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "eight"
+msgstr "oito"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "nine"
+msgstr "nove"
+
+#: contrib/localflavor/au/forms.py:18
+msgid "Enter a 4 digit post code."
+msgstr "Insira un código postal de 4 díxitos."
+
+#: contrib/localflavor/br/forms.py:18
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Insira un código postal no formato XXXXX-XXX."
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr ""
+"Os números de teléfono deben estar no formato XX-XXXX-XXXX."
+
+#: contrib/localflavor/br/forms.py:72
+msgid "This field requires only numbers."
+msgstr "Este campo soamente admite números."
+
+#: contrib/localflavor/br/forms.py:74
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr "Este campo acepta como máximo 11 díxitos ou 14 caracteres."
+
+#: contrib/localflavor/br/forms.py:84
+msgid "Invalid CPF number."
+msgstr "Número de CPF non válido."
+
+#: contrib/localflavor/br/forms.py:106
+msgid "This field requires at least 14 digits"
+msgstr "Este campo require polo menos 14 díxitos."
+
+#: contrib/localflavor/br/forms.py:116
+msgid "Invalid CNPJ number."
+msgstr "Número de CNPJ non válido"
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr "Argovia"
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr "Appenzell Interior"
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr "Appenzell Exterior"
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr "Basilea-Cidade"
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr "Basilea-Campo"
+
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr "Berna"
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr "Friburgo"
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr "Xenebra"
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr "Glarus"
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr "Grisóns"
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr "Xura"
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr "Lucerna"
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr "Neuchatel"
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr "Nidwald"
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr "Obwald"
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr "Schaffhausen"
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr "Schwyz"
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr "Soleura"
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr "San Galo"
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr "Turgovia"
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr "Tesino"
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr "Uri"
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr "Valais"
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr "Vaud"
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr "Zug"
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr "Zurich"
+
+#: contrib/localflavor/ch/forms.py:18 contrib/localflavor/no/forms.py:15
+msgid "Enter a zip code in the format XXXX."
+msgstr "Insira un código posttal no formato XXXX."
+
+#: contrib/localflavor/ch/forms.py:90
+msgid ""
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
+msgstr "Insira un número válido de tarxeta de identidade ou pasaporte no "
+"formato X1234567<0 ou 1234567890."
+
+#: contrib/localflavor/cl/forms.py:21
+msgid "Enter valid a Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr "Insira un RUT chileno válido. O formato é XX.XXX.XXX-X."
+
+#: contrib/localflavor/cl/forms.py:26
+msgid "Enter valid a Chilean RUT"
+msgstr "Insira un RUT chileno válido."
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr "Baden-Württemberg"
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr "Baviera"
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr "Berlín"
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr "Brandemburgo"
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr "Bremen"
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr "Hamburgo"
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr "Hesse"
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr "Mecklemburgo-Pomerania Occidental"
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr "Baixa Saxonia"
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr "Renania do Norte-Westfalia"
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr "Renania-Palatinado"
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr "Sarre"
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr "Saxonia"
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr "Saxonia-Anhalt"
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr "Schleswig-Holstein"
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr "Turinxia"
+
+#: contrib/localflavor/de/forms.py:16 contrib/localflavor/fi/forms.py:14
+#: contrib/localflavor/fr/forms.py:17
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Insira un código postal no formato XXXXX"
+
+#: contrib/localflavor/de/forms.py:60
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr "Insira un número válido de tarxeta de identidade alemá no formato "
+"XXXXXXXXXXX-XXXXXXX-XXXXXXX-X."
+
+#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:45
+msgid "Enter a valid Finnish social security number."
+msgstr "Insira un número válido de tarxeta da seguridade social finlandesa."
+
+#: contrib/localflavor/is_/forms.py:16
+msgid ""
+"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr ""
+"Insira un número de identificación islandés válido. O formato é XXXXXX-XXXX."
+
+#: contrib/localflavor/is_/forms.py:30
+msgid "The Icelandic identification number is not valid."
+msgstr "O número de identificación islandés non é válido."
+
+#: contrib/localflavor/it/forms.py:16
+msgid "Enter a valid zip code."
+msgstr "Insira un código postal válido."
+
+#: contrib/localflavor/it/forms.py:41
+msgid "Enter a valid Social Security number."
+msgstr "Insira un número da seguridade social válido."
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr "Insira un número de IVE válido."
+
+#: contrib/localflavor/jp/forms.py:21
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "Insira un código postal no formato XXXXXXX ou XXX-XXXX."
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr "Hokkaidō"
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr "Aomori"
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr "Iwate"
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr "Miyagi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr "Akita"
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr "Yamagata"
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr "Fukushima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr "Ibaraki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr "Tochigi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr "Gunma"
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr "Saitama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr "Chiba"
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr "Toquio"
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr "Kanagawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr "Yamanashi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr "Nagano"
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr "Niigata"
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr "Toyama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr "Ishikawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr "Fukui"
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr "Gifu"
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr "Shizuoka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr "Aichi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr "Mie"
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr "Shiga"
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr "Kioto"
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr "Osaka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr "Hyōgo"
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr "Nara"
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr "Wakayama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr "Tottori"
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr "Shimane"
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr "Okayama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr "Hiroshima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr "Yamaguchi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr "Tokushima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr "Kagawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr "Ehime"
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr "Kōchi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr "Fukuoka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr "Saga"
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr "Nagasaki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr "Kumamoto"
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr "Ōita"
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr "Miyazaki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr "Kagoshima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr "Okinawa"
+
+#: contrib/localflavor/no/forms.py:36
+msgid "Enter a valid Norwegian social security number."
+msgstr "Insira un número válida da seguridade social norueguesa."
+
+#: contrib/localflavor/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
+msgstr "Insira un código postal. Requírese un espazo entre as dúas partes do código postal."
+
+#: contrib/localflavor/us/forms.py:18
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "Insira un código postal no formato XXXXX ou XXXXX-XXXX."
+
+#: contrib/localflavor/us/forms.py:51
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr "Insira un número válido da seguridade social dos Estados Unidos no formato XXX-XX-XXXX."
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "orixe da redirección"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Debe ser unha ruta absoluta, sen o nome de dominio. Exemplo: '/events/"
+"search/'"
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "destino da redirección"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Pode ser unha ruta absoluta (coma a de enriba) ou un URL completo que empece "
+"por 'http://'"
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "redirección"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "redireccións"
+
+#: contrib/sessions/models.py:68
+msgid "session key"
+msgstr "clave da sesión"
+
+#: contrib/sessions/models.py:69
+msgid "session data"
+msgstr "datos da sesión"
+
+#: contrib/sessions/models.py:70
+msgid "expire date"
+msgstr "data de caducidade"
+
+#: contrib/sessions/models.py:74
+msgid "session"
+msgstr "sesión"
+
+#: contrib/sessions/models.py:75
+msgid "sessions"
+msgstr "sesións"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "dominio"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "nome"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "sitio"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "sitios"
+
+#: core/validators.py:65
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Este valor soamente pode conter letras, números e guións baixos (_)."
+
+#: core/validators.py:69
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Este valor soamente pode conter letras, números, guións baixos (_), guións "
+"(-) e barras inclinadas (/)."
+
+#: core/validators.py:73
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr ""
+"Este valor soamente pode conter letras, números, guións baixos (_) e guións."
+
+#: core/validators.py:77
+msgid "Uppercase letters are not allowed here."
+msgstr "Non se permiten letras maiúsculas."
+
+#: core/validators.py:81
+msgid "Lowercase letters are not allowed here."
+msgstr "Non se permiten letras minúsculas."
+
+#: core/validators.py:88
+msgid "Enter only digits separated by commas."
+msgstr "Insira só díxitos separados por comas."
+
+#: core/validators.py:100
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Insira enderezos de correo elecrónico válidos separados por comas."
+
+#: core/validators.py:104
+msgid "Please enter a valid IP address."
+msgstr "Insira un enderezo IP válido."
+
+#: core/validators.py:108
+msgid "Empty values are not allowed here."
+msgstr "Non se permiten valores en branco."
+
+#: core/validators.py:112
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Non se permiten caracteres non númericos."
+
+#: core/validators.py:116
+msgid "This value can't be comprised solely of digits."
+msgstr "Este valor non pode estar composto por díxitos soamente."
+
+#: core/validators.py:121 newforms/fields.py:135
+msgid "Enter a whole number."
+msgstr "Insira un número enteiro."
+
+#: core/validators.py:125
+msgid "Only alphabetical characters are allowed here."
+msgstr "Soamente se permiten caracteres do alfabeto."
+
+#: core/validators.py:140
+msgid "Year must be 1900 or later."
+msgstr "O ano debe ser 1900 ou posterior."
+
+#: core/validators.py:144
+#, python-format
+msgid "Invalid date: %s"
+msgstr "Data non válida: %s"
+
+#: core/validators.py:149 db/models/fields/__init__.py:463
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Insira unha data válida en formato AAAA-MM-DD."
+
+#: core/validators.py:154
+msgid "Enter a valid time in HH:MM format."
+msgstr "Insira unha hora válida en formato HH:MM."
+
+#: core/validators.py:158 db/models/fields/__init__.py:532
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Insira unha data/hora válida en formato AAAA-MM-DD HH:MM."
+
+#: core/validators.py:163 newforms/fields.py:339
+msgid "Enter a valid e-mail address."
+msgstr "Insira un enderezo de correo electrónico válido."
+
+#: core/validators.py:175 core/validators.py:453 oldforms/__init__.py:672
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Non se enviou ficheiro ningún. Comprobe o tipo de codificación do formulario."
+
+#: core/validators.py:179
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Suba unha imaxe válida. O ficheiro subido non era unha imaxe ou esta estaba "
+"corrupta."
+
+#: core/validators.py:186
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "O URL %s non apunta a unha imaxe válida."
+
+#: core/validators.py:190
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Os números de teléfono deben estar no formato XXX-XXX-XXXX. \"%s\" non é "
+"válido."
+
+#: core/validators.py:198
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "O URL %s non apunta a unha vídeo QuickTime válido."
+
+#: core/validators.py:202
+msgid "A valid URL is required."
+msgstr "Precísase un URL válido."
+
+#: core/validators.py:216
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Precísase HTML válido. Os erros específicos son estes:\n"
+"%s"
+
+#: core/validators.py:223
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "XML mal formado: %s"
+
+#: core/validators.py:240
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "URL non válido: %s"
+
+#: core/validators.py:245 core/validators.py:247
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "O URL %s é unha ligazón rota."
+
+#: core/validators.py:253
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Insira unha abreviatura estatal válida para os Estados Unidos."
+
+#: core/validators.py:267
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Sen palabrotas, por favor! Aquí non se pode usar a palabra %s."
+msgstr[1] "Sen palabrotas, por favor! Aquí non se poden usar as palabras %s."
+
+#: core/validators.py:274
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Este campo ten que coincidir co campo '%s'."
+
+#: core/validators.py:293
+msgid "Please enter something for at least one field."
+msgstr "Por favor, encha polo menos un campo."
+
+#: core/validators.py:302 core/validators.py:313
+msgid "Please enter both fields or leave them both empty."
+msgstr "Por favor, encha os dous campos ou deixe ambos en branco."
+
+#: core/validators.py:321
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Débese encher este campo se %(field)s é %(value)s"
+
+#: core/validators.py:334
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Este campo débese encher se %(field)s non é %(value)s"
+
+#: core/validators.py:353
+msgid "Duplicate values are not allowed."
+msgstr "Non se permiten valores duplicados."
+
+#: core/validators.py:368
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Este valor ten que estar comprendido entre %(lower)s e %(upper)s."
+
+#: core/validators.py:370
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Este valor ten que ser polo menos %s."
+
+#: core/validators.py:372
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Este valor non pode ser superior a %s."
+
+#: core/validators.py:408
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Este valor ten que ser unha potencia de %s."
+
+#: core/validators.py:417
+msgid "Please enter a valid decimal number."
+msgstr "Insira un número decimal válido."
+
+#: core/validators.py:423
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Insira un número decimal válido cun máximo de %s díxito en total."
+msgstr[1] "Insira un número decimal válido cun máximo de %s díxitos en total."
+
+#: core/validators.py:426
+#, python-format
+msgid ""
+"Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural ""
+"Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] "Insira un número decimal válido cunha parte enteira de como máximo %s díxito."
+msgstr[1] "Insira un número decimal válido cunha parte enteira de como máximo %s díxitos."
+
+#: core/validators.py:429
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "Insira un número decimal válido cun máximo de %s lugar decimal."
+msgstr[1] "Insira un número decimal válido cun máximo de %s lugares decimais."
+
+#: core/validators.py:437
+msgid "Please enter a valid floating point number."
+msgstr "Insira un número de coma flotante válido."
+
+#: core/validators.py:446
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Verifique que o ficheiro subido ten un tamaño mínimo de %s bytes."
+
+#: core/validators.py:447
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Verifique que o ficheiro subido ten un tamaño máximo de %s bytes."
+
+#: core/validators.py:464
+msgid "The format for this field is wrong."
+msgstr "O formato deste campo é incorrecto."
+
+#: core/validators.py:479
+msgid "This field is invalid."
+msgstr "Este campo non é válido."
+
+#: core/validators.py:515
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Non se puido recibir ningún dato de %s."
+
+#: core/validators.py:518
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"O URL %(url)s devolveu a cabeceira Content-Type non válida '%(contenttype)s'."
+
+#: core/validators.py:551
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Por favor, peche a etiqueta %(tag)s da liña %(line)s. (A liña comeza con \"%"
+"(start)s\")."
+
+#: core/validators.py:555
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Algún texto a partir da liña %(line)s non é válido nese contexto. (A liña "
+"comeza con \"%(start)s\")."
+
+#: core/validators.py:560
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"%(attr)s\" na liña %(line)s non é un atributo válido. (A liña comeza con "
+"\"%(start)s\")."
+
+#: core/validators.py:565
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\" na liña %(line)s non é unha etiqueta válida. (A liña comeza "
+"con \"%(start)s\")."
+
+#: core/validators.py:569
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Falta un o máis dos atributos requiridos para unha etiqueta da liña %(line)"
+"s. (A liña comeza con \"%(start)s\")."
+
+#: core/validators.py:574
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"O atributo \"%(attr)s\" na liña %(line)s contén un valor non válido. (A liña "
+"comeza con \"%(start)s\")."
+
+#: db/models/manipulators.py:307
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr ""
+"Xa existe un obxecto %(object)s con este %(type)s para o campo %(field)s."
+
+#: db/models/fields/__init__.py:46
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "Xa existe un/ha %(optname)s con este/a %(fieldname)s."
+
+#: db/models/fields/__init__.py:121 db/models/fields/__init__.py:278
+#: db/models/fields/__init__.py:675 db/models/fields/__init__.py:686
+#: newforms/fields.py:87 newforms/fields.py:444 newforms/fields.py:520
+#: newforms/fields.py:531 newforms/models.py:186 oldforms/__init__.py:357
+msgid "This field is required."
+msgstr "Requírese este campo."
+
+#: db/models/fields/__init__.py:373
+msgid "This value must be an integer."
+msgstr "Este valor ten que ser un número enteiro."
+
+#: db/models/fields/__init__.py:408
+msgid "This value must be either True or False."
+msgstr "Este valor ten que verdadeiro ou falso."
+
+#: db/models/fields/__init__.py:429
+msgid "This field cannot be null."
+msgstr "Este campo non pode ser nulo."
+
+#: db/models/fields/__init__.py:592
+msgid "This value must be a decimal number."
+msgstr "Este valor ten que ser un número decimal."
+
+#: db/models/fields/__init__.py:695
+msgid "Enter a valid filename."
+msgstr "Introduza un nome de ficheiro válido."
+
+#: db/models/fields/__init__.py:818
+msgid "This value must be either None, True or False."
+msgstr "Este valor ten que verdadeiro, falso ou nulo."
+
+#: db/models/fields/related.py:53
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Insira un %s válido/a."
+
+#: db/models/fields/related.py:642
+msgid "Separate multiple IDs with commas."
+msgstr "Separe varias IDs con comas."
+
+#: db/models/fields/related.py:644
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+" Para seleccionar máis dunha entrada, manteña premida a tecla \"Control\", "
+"ou \"Comando\" nun Mac."
+
+#: db/models/fields/related.py:691
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "Insira IDs de %(self)s válidas. O valor %(value)r non é válido."
+msgstr[1] ""
+"Insira IDs de %(self)s válidas. Os valores %(value)r non son válidos."
+
+#: newforms/fields.py:110 newforms/fields.py:324
+#, python-format
+msgid "Ensure this value has at most %d characters."
+msgstr "Asegúrese de que este valor ten como máximo %d caracteres."
+
+#: newforms/fields.py:112 newforms/fields.py:326
+#, python-format
+msgid "Ensure this value has at least %d characters."
+msgstr "Asegúrese de que este valor ten polo menos %d caracteres."
+
+#: newforms/fields.py:137 newforms/fields.py:160 newforms/fields.py:192
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Asegúrese de que este valor é menor ou igual a %s."
+
+#: newforms/fields.py:139 newforms/fields.py:162 newforms/fields.py:194
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Asegúrese de que este valor é maior ou igual a %s"
+
+#: newforms/fields.py:158 newforms/fields.py:186
+msgid "Enter a number."
+msgstr "Insira un número."
+
+#: newforms/fields.py:196
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr "Asegñurese de que non hai máis de %s díxitos en total."
+
+#: newforms/fields.py:198
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr "Asegúrese de que non hai máis de %s lugares decimais."
+
+#: newforms/fields.py:200
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr "Asegúrese de que no hai máis de %s díxitos antes do punto ou coma decimal."
+
+#: newforms/fields.py:233
+msgid "Enter a valid date."
+msgstr "Insira unha data válida."
+
+#: newforms/fields.py:260
+msgid "Enter a valid time."
+msgstr "Insira unha hora válida."
+
+#: newforms/fields.py:296
+msgid "Enter a valid date/time."
+msgstr "Insira unha data/hora válida."
+
+#: newforms/fields.py:310
+msgid "Enter a valid value."
+msgstr "Insira un valor válido."
+
+#: newforms/fields.py:357 newforms/fields.py:379
+msgid "Enter a valid URL."
+msgstr "Insira un URL válido."
+
+#: newforms/fields.py:381
+msgid "This URL appears to be a broken link."
+msgstr "Semella que este URL é unha ligazón rota."
+
+#: newforms/fields.py:432 newforms/models.py:173
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Escolla unha opción válida. Esta opción non se atopa entre as opcións dispoñíbeis"
+
+#: newforms/fields.py:448 newforms/fields.py:524 newforms/models.py:190
+msgid "Enter a list of values."
+msgstr "Insira unha lista de valores."
+
+#: newforms/fields.py:457 newforms/models.py:196
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Escolla unha opción válida. %s non se atopa entre as opcións dispoñíbeis."
+
+#: oldforms/__init__.py:392
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Asegúrese de que o seu texto contén menos de %s carácter."
+msgstr[1] "Asegúrese de que o seu texto contén menos de %s caracteres."
+
+#: oldforms/__init__.py:397
+msgid "Line breaks are not allowed here."
+msgstr "Aquí non se permiten saltos de liña."
+
+#: oldforms/__init__.py:498 oldforms/__init__.py:571 oldforms/__init__.py:610
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Elixa unha opción válida; '%(data)s' non está en %(choices)s."
+
+#: oldforms/__init__.py:674
+msgid "The submitted file is empty."
+msgstr "O ficheiro enviado está baleiro."
+
+#: oldforms/__init__.py:730
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Insira un número enteiro entre -32.768 e 32.767."
+
+#: oldforms/__init__.py:740
+msgid "Enter a positive number."
+msgstr "Insira un número positivo."
+
+#: oldforms/__init__.py:750
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Insira un número enteiro entre 0 e 32.767."
+
+#: template/defaultfilters.py:491
+msgid "yes,no,maybe"
+msgstr "si,non,quizais"
+
+#: template/defaultfilters.py:520
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d byte"
+msgstr[1] "%(size)d bytes"
+
+#: template/defaultfilters.py:522
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f KB"
+
+#: template/defaultfilters.py:524
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: template/defaultfilters.py:525
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#: utils/dateformat.py:40
+msgid "p.m."
+msgstr "p.m."
+
+#: utils/dateformat.py:41
+msgid "a.m."
+msgstr "a.m."
+
+#: utils/dateformat.py:46
+msgid "PM"
+msgstr "PM"
+
+#: utils/dateformat.py:47
+msgid "AM"
+msgstr "AM"
+
+#: utils/dateformat.py:95
+msgid "midnight"
+msgstr "medianoite"
+
+#: utils/dateformat.py:97
+msgid "noon"
+msgstr "mediodía"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "luns"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "martes"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "mércores"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "xoves"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "venres"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "sábado"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "domingo"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "xaneiro"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "febreiro"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "marzo"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "abril"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "maio"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "xuño"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "xullo"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "agosto"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "setembro"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "outubro"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "novembro"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "decembro"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr "xan"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "feb"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "mar"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "abr"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "mai"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "xuñ"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "xul"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "ago"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "set"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "out"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "nov"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "dec"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "xan."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "feb."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "ago."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "set."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "out."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "nov."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "dec."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "ano"
+msgstr[1] "anos"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mes"
+msgstr[1] "meses"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "semana"
+msgstr[1] "semanas"
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "día"
+msgstr[1] "días"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "hora"
+msgstr[1] "horas"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuto"
+msgstr[1] "minutos"
+
+#: utils/timesince.py:40
+#, python-format
+msgid "%d milliseconds"
+msgstr "%d milisegundos"
+
+#: utils/timesince.py:41
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr "%(number)d %(type)s"
+
+#: utils/timesince.py:47
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ", %(number)d %(type)s"
+
+#: utils/translation/trans_real.py:358
+msgid "DATE_FORMAT"
+msgstr "d-m-Y"
+
+#: utils/translation/trans_real.py:359
+msgid "DATETIME_FORMAT"
+msgstr "d-m-Y H:i"
+
+#: utils/translation/trans_real.py:360
+msgid "TIME_FORMAT"
+msgstr "H:i"
+
+#: utils/translation/trans_real.py:376
+msgid "YEAR_MONTH_FORMAT"
+msgstr "m Y"
+
+#: utils/translation/trans_real.py:377
+msgid "MONTH_DAY_FORMAT"
+msgstr "d m"
+
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "Creouse correctamente o/a %(verbose_name)s ."
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "Actualizouse correctamente o/a %(verbose_name)s."
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "Eliminouse o/a %(verbose_name)s"
+
+#~ msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+#~ msgstr "<a href=\"/password_reset/\">Esqueceu o contrasinal</a>?"
+
+#~ msgid "Use '[algo]$[salt]$[hexdigest]'"
+#~ msgstr "Use '[algo]$[salt]$[hexdigest]'"
+
+#~ msgid "Comment"
+#~ msgstr "Comentario"
+
+#~ msgid "Comments"
+#~ msgstr "Comentarios"
+
+#~ msgid "String (up to 50)"
+#~ msgstr "Cadea (ata 50 caracteres)"
+
+#~ msgid "label"
+#~ msgstr "etiqueta"
+
+#~ msgid "package"
+#~ msgstr "paquete"
+
+#~ msgid "packages"
+#~ msgstr "paquetes"
diff --git a/webapp/django/conf/locale/gl/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/gl/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..fcb6976
--- /dev/null
+++ b/webapp/django/conf/locale/gl/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/gl/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/gl/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..9d273db
--- /dev/null
+++ b/webapp/django/conf/locale/gl/LC_MESSAGES/djangojs.po
@@ -0,0 +1,109 @@
+# Translation of djangojs.po to Galego.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-12-09 11:51+0100\n"
+"PO-Revision-Date: 2005-07-02 13:25+0200\n"
+"Last-Translator: Afonso Fernández Nogueira <fonzzo.django@gmail.com>\n"
+"Language-Team: Galego\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "%s dispoñíbeis"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Escoller todo"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Engadir"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Quitar"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "%s escollido/a(s)"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Seleccione unha ou varias entrada e faga clic "
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Quitar todo"
+
+#: contrib/admin/media/js/dateparse.js:26
+#: contrib/admin/media/js/calendar.js:24
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"xaneiro febreiro marzo abril maio xuño xullo agosto setembro outubro novembro "
+"decembro"
+
+#: contrib/admin/media/js/dateparse.js:27
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "domingo luns martes mércores xoves venres sábado"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "D L M M X V S"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "Agora"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "Reloxo"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "Escolla unha hora"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "Medianoite"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "6 da mañá"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "Mediodía"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "Hoxe"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "Calendario"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "Onte"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "Mañá"
diff --git a/webapp/django/conf/locale/he/LC_MESSAGES/django.mo b/webapp/django/conf/locale/he/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..27fa6d5
--- /dev/null
+++ b/webapp/django/conf/locale/he/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/he/LC_MESSAGES/django.po b/webapp/django/conf/locale/he/LC_MESSAGES/django.po
new file mode 100644
index 0000000..6fbac31
--- /dev/null
+++ b/webapp/django/conf/locale/he/LC_MESSAGES/django.po
@@ -0,0 +1,4489 @@
+# translation of Django.
+# Copyright (C) 2008 The Django Project
+# This file is distributed under the same license as the Django package.
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-08-23 02:48+0300\n"
+"PO-Revision-Date: 2008-08-23 02:44+0200\n"
+"Last-Translator: Meir Kriheli <meir@mksoft.co.il>\n"
+"Language-Team: Django-i18n <django-i18n@googlegroups.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Poedit-Bookmarks: -1,988,-1,-1,-1,-1,-1,-1,-1,-1\n"
+
+#: conf/global_settings.py:44
+msgid "Arabic"
+msgstr "ערבית"
+
+#: conf/global_settings.py:45
+msgid "Bengali"
+msgstr "בנגאלית"
+
+#: conf/global_settings.py:46
+msgid "Bulgarian"
+msgstr "בולגרית"
+
+#: conf/global_settings.py:47
+msgid "Catalan"
+msgstr "קאטלונית"
+
+#: conf/global_settings.py:48
+msgid "Czech"
+msgstr "צ'כית"
+
+#: conf/global_settings.py:49
+msgid "Welsh"
+msgstr "וולשית"
+
+#: conf/global_settings.py:50
+msgid "Danish"
+msgstr "דנית"
+
+#: conf/global_settings.py:51
+msgid "German"
+msgstr "גרמנית"
+
+#: conf/global_settings.py:52
+msgid "Greek"
+msgstr "יוונית"
+
+#: conf/global_settings.py:53
+msgid "English"
+msgstr "אנגלית"
+
+#: conf/global_settings.py:54
+msgid "Spanish"
+msgstr "ספרדית"
+
+#: conf/global_settings.py:55
+msgid "Estonian"
+msgstr "אסטונית"
+
+#: conf/global_settings.py:56
+msgid "Argentinean Spanish"
+msgstr "ספרדית ארגנטינאית"
+
+#: conf/global_settings.py:57
+msgid "Basque"
+msgstr "בסקית"
+
+#: conf/global_settings.py:58
+msgid "Persian"
+msgstr "פרסית"
+
+#: conf/global_settings.py:59
+msgid "Finnish"
+msgstr "פינית"
+
+#: conf/global_settings.py:60
+msgid "French"
+msgstr "צרפתית"
+
+#: conf/global_settings.py:61
+msgid "Irish"
+msgstr "אירית"
+
+#: conf/global_settings.py:62
+msgid "Galician"
+msgstr "גאליצית"
+
+#: conf/global_settings.py:63
+msgid "Hungarian"
+msgstr "הונגרית"
+
+#: conf/global_settings.py:64
+msgid "Hebrew"
+msgstr "עברית"
+
+#: conf/global_settings.py:65
+msgid "Croatian"
+msgstr "קרואטית"
+
+#: conf/global_settings.py:66
+msgid "Icelandic"
+msgstr "איסלנדית"
+
+#: conf/global_settings.py:67
+msgid "Italian"
+msgstr "איטלקית"
+
+#: conf/global_settings.py:68
+msgid "Japanese"
+msgstr "יפנית"
+
+#: conf/global_settings.py:69
+msgid "Georgian"
+msgstr "גיאורגית"
+
+#: conf/global_settings.py:70
+msgid "Korean"
+msgstr "קוריאנית"
+
+#: conf/global_settings.py:71
+msgid "Khmer"
+msgstr "חמר"
+
+#: conf/global_settings.py:72
+msgid "Kannada"
+msgstr "קנדית"
+
+#: conf/global_settings.py:73
+msgid "Latvian"
+msgstr "לטבית"
+
+#: conf/global_settings.py:74
+msgid "Lithuanian"
+msgstr "ליטאית"
+
+#: conf/global_settings.py:75
+msgid "Macedonian"
+msgstr "מקדונית"
+
+#: conf/global_settings.py:76
+msgid "Dutch"
+msgstr "הולנדית"
+
+#: conf/global_settings.py:77
+msgid "Norwegian"
+msgstr "נורווגית"
+
+#: conf/global_settings.py:78
+msgid "Polish"
+msgstr "פולנית"
+
+#: conf/global_settings.py:79
+msgid "Portugese"
+msgstr "פורטוגזית"
+
+#: conf/global_settings.py:80
+msgid "Brazilian Portuguese"
+msgstr "פורטוגזית ברזילאית"
+
+#: conf/global_settings.py:81
+msgid "Romanian"
+msgstr "רומנית"
+
+#: conf/global_settings.py:82
+msgid "Russian"
+msgstr "רוסית"
+
+#: conf/global_settings.py:83
+msgid "Slovak"
+msgstr "סלובקית"
+
+#: conf/global_settings.py:84
+msgid "Slovenian"
+msgstr "סלובנית"
+
+#: conf/global_settings.py:85
+msgid "Serbian"
+msgstr "סרבית"
+
+#: conf/global_settings.py:86
+msgid "Swedish"
+msgstr "שוודית"
+
+#: conf/global_settings.py:87
+msgid "Tamil"
+msgstr "טמילית"
+
+#: conf/global_settings.py:88
+msgid "Telugu"
+msgstr "טלגו"
+
+#: conf/global_settings.py:89
+msgid "Turkish"
+msgstr "טורקית"
+
+#: conf/global_settings.py:90
+msgid "Ukrainian"
+msgstr "אוקראינית"
+
+#: conf/global_settings.py:91
+msgid "Simplified Chinese"
+msgstr "סינית פשוטה"
+
+#: conf/global_settings.py:92
+msgid "Traditional Chinese"
+msgstr "סינית מסורתית"
+
+#: contrib/admin/filterspecs.py:44
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>ע\"י %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:74 contrib/admin/filterspecs.py:92
+#: contrib/admin/filterspecs.py:147 contrib/admin/filterspecs.py:173
+msgid "All"
+msgstr "הכל"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Any date"
+msgstr "כל תאריך"
+
+#: contrib/admin/filterspecs.py:114
+msgid "Today"
+msgstr "היום"
+
+#: contrib/admin/filterspecs.py:117
+msgid "Past 7 days"
+msgstr "בשבוע האחרון"
+
+#: contrib/admin/filterspecs.py:119
+msgid "This month"
+msgstr "החודש"
+
+#: contrib/admin/filterspecs.py:121
+msgid "This year"
+msgstr "השנה"
+
+#: contrib/admin/filterspecs.py:147 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "Yes"
+msgstr "כן"
+
+#: contrib/admin/filterspecs.py:147 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "No"
+msgstr "לא"
+
+#: contrib/admin/filterspecs.py:154 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "Unknown"
+msgstr "לא ידוע"
+
+#: contrib/admin/models.py:19
+msgid "action time"
+msgstr "זמן פעולה"
+
+#: contrib/admin/models.py:22
+msgid "object id"
+msgstr "מזהה אובייקט"
+
+#: contrib/admin/models.py:23
+msgid "object repr"
+msgstr "ייצוג אובייקט"
+
+#: contrib/admin/models.py:24
+msgid "action flag"
+msgstr "דגל פעולה"
+
+#: contrib/admin/models.py:25
+msgid "change message"
+msgstr "הערה לשינוי"
+
+#: contrib/admin/models.py:28
+msgid "log entry"
+msgstr "רישום יומן"
+
+#: contrib/admin/models.py:29
+msgid "log entries"
+msgstr "רישומי יומן"
+
+#: contrib/admin/options.py:56 contrib/admin/options.py:115
+msgid "None"
+msgstr "ללא"
+
+#: contrib/admin/options.py:329
+#, python-format
+msgid "Changed %s."
+msgstr "%s שונה."
+
+#: contrib/admin/options.py:329 contrib/admin/options.py:339
+#: core/validators.py:279 db/models/manipulators.py:305
+msgid "and"
+msgstr "ו"
+
+#: contrib/admin/options.py:334
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "התווסף %(name)s \"%(object)s\"."
+
+#: contrib/admin/options.py:338
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "שונה %(list)s עבור %(name)s \"%(object)s\"."
+
+#: contrib/admin/options.py:343
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "נמחק %(name)s \"%(object)s\"."
+
+#: contrib/admin/options.py:347
+msgid "No fields changed."
+msgstr "אף שדה לא השתנה."
+
+#: contrib/admin/options.py:408 contrib/auth/admin.py:50
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "הוספת %(name)s \"%(obj)s\" בוצעה בהצלחה."
+
+#: contrib/admin/options.py:412 contrib/admin/options.py:445
+#: contrib/auth/admin.py:55
+msgid "You may edit it again below."
+msgstr "ניתן לערוך שוב מתחת"
+
+#: contrib/admin/options.py:422 contrib/admin/options.py:455
+#, python-format
+msgid "You may add another %s below."
+msgstr "ניתן להוסיף %s נוסף מתחת."
+
+#: contrib/admin/options.py:443
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "שינוי %(name)s \"%(obj)s\" בוצע בהצלחה."
+
+#: contrib/admin/options.py:451
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "הוספת %(name)s \"%(obj)s\" בוצעה בהצלחה. ניתן לערוך אותו שוב מתחת."
+
+#: contrib/admin/options.py:517
+#, python-format
+msgid "Add %s"
+msgstr "הוספת %s"
+
+#: contrib/admin/options.py:594
+#, python-format
+msgid "Change %s"
+msgstr "שינוי %s"
+
+#: contrib/admin/options.py:625
+msgid "Database error"
+msgstr "שגיאת בסיס נתונים"
+
+#: contrib/admin/options.py:674
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "מחיקת %(name)s \"%(obj)s\" בוצעה בהצלחה."
+
+#: contrib/admin/options.py:681
+msgid "Are you sure?"
+msgstr "האם את/ה בטוח/ה ?"
+
+#: contrib/admin/options.py:708
+#, python-format
+msgid "Change history: %s"
+msgstr "היסטוריית שינוי: %s"
+
+#: contrib/admin/sites.py:18 contrib/admin/views/decorators.py:16
+#: contrib/auth/forms.py:72 contrib/comments/views/comments.py:56
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"נא להזין שם משתמש וסיסמה נכונים. בשני השדות גודל האותיות האנגליות משנה."
+
+#: contrib/admin/sites.py:238 contrib/admin/views/decorators.py:68
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"נא להתחבר שוב, מאחר ופג תוקף ההתחברות הנוכחית. אל דאגה: המידע ששלחת נשמר."
+
+#: contrib/admin/sites.py:245 contrib/admin/views/decorators.py:75
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"נראה שהדפדפן שלך אינו מוגדר לקבל עוגיות. נא לאפשר עוגיות, לטעון מחדש את הדף "
+"ולנסות שוב."
+
+#: contrib/admin/sites.py:259 contrib/admin/sites.py:265
+#: contrib/admin/views/decorators.py:92
+msgid "Usernames cannot contain the '@' character."
+msgstr "שם משתמש אינו יכול להכיל את התו '@'."
+
+#: contrib/admin/sites.py:262 contrib/admin/views/decorators.py:88
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "כתובת הדוא\"ל שלך אינה שם המשתמש שלך. נסה/י '%s' במקום."
+
+#: contrib/admin/sites.py:330
+msgid "Site administration"
+msgstr "ניהול אתר"
+
+#: contrib/admin/sites.py:352 contrib/admin/templates/admin/login.html:27
+#: contrib/admin/templates/registration/password_reset_complete.html:14
+#: contrib/admin/views/decorators.py:30
+msgid "Log in"
+msgstr "כניסה"
+
+#: contrib/admin/util.py:138
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "אחד או יותר %(fieldname)s ב%(name)s: %(obj)s"
+
+#: contrib/admin/util.py:143
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "אחד או יותר %(fieldname)s ב%(name)s:"
+
+#: contrib/admin/widgets.py:65
+msgid "Date:"
+msgstr "תאריך:"
+
+#: contrib/admin/widgets.py:65
+msgid "Time:"
+msgstr "שעה:"
+
+#: contrib/admin/widgets.py:89
+msgid "Currently:"
+msgstr "הנוכחי:"
+
+#: contrib/admin/widgets.py:89
+msgid "Change:"
+msgstr "שינוי:"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "דף לא קיים"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "אנו מצטערים, לא ניתן למצוא את הדף המבוקש."
+
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/change_form.html:17
+#: contrib/admin/templates/admin/change_list.html:8
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/auth/user/change_password.html:10
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_reset_complete.html:4
+#: contrib/admin/templates/registration/password_reset_confirm.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "דף הבית"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "שגיאת שרת"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "שגיאת שרת (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "שגיאת שרת <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"התרחשה שגיאה. היא דווחה למנהלי האתר בדוא\"ל ותתוקן בקרוב. תודה על סבלנותך."
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "שלום,"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "תיעוד"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:13
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+msgid "Change password"
+msgstr "שינוי סיסמה"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/comments/templates/comments/form.html:6
+msgid "Log out"
+msgstr "יציאה"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "ניהול אתר Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "ניהול Django"
+
+#: contrib/admin/templates/admin/change_form.html:19
+#: contrib/admin/templates/admin/index.html:29
+msgid "Add"
+msgstr "הוספה"
+
+#: contrib/admin/templates/admin/change_form.html:26
+#: contrib/admin/templates/admin/object_history.html:5
+msgid "History"
+msgstr "היסטוריה"
+
+#: contrib/admin/templates/admin/change_form.html:27
+msgid "View on site"
+msgstr "צפיה באתר"
+
+#: contrib/admin/templates/admin/change_form.html:37
+#: contrib/admin/templates/admin/auth/user/change_password.html:22
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "נא לתקן את השגיאה המופיעה מתחת."
+msgstr[1] "נא לתקן את השגיאות המופיעות מתחת."
+
+#: contrib/admin/templates/admin/change_list.html:16
+#, python-format
+msgid "Add %(name)s"
+msgstr "הוספת %(name)s"
+
+#: contrib/admin/templates/admin/change_list.html:26
+msgid "Filter"
+msgstr "סינון"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+#: contrib/admin/templates/admin/edit_inline/tabular.html:15
+msgid "Delete"
+msgstr "מחיקה"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:15
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"מחיקת %(object_name)s '%(escaped_object)s' מצריכה מחיקת אובייקטים מקושרים, "
+"אך לחשבון שלך אין הרשאות למחיקת סוגי האובייקטים הבאים:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:22
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"האם ברצונך למחוק את %(object_name)s \"%(escaped_object)s\"? כל הפריטים "
+"הקשורים הבאים יימחקו:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:27
+msgid "Yes, I'm sure"
+msgstr "כן, אני בטוח/ה"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " לפי %(filter_title)s "
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "מודלים זמינים ביישום %(name)s."
+
+#: contrib/admin/templates/admin/index.html:19
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:35
+msgid "Change"
+msgstr "שינוי"
+
+#: contrib/admin/templates/admin/index.html:45
+msgid "You don't have permission to edit anything."
+msgstr "אין לך הרשאות לעריכה."
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "Recent Actions"
+msgstr "פעולות אחרונות"
+
+#: contrib/admin/templates/admin/index.html:54
+msgid "My Actions"
+msgstr "הפעולות שלי"
+
+#: contrib/admin/templates/admin/index.html:58
+msgid "None available"
+msgstr "לא נמצאו"
+
+#: contrib/admin/templates/admin/invalid_setup.html:7
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"משהו שגוי בהתקנת בסיס הנתונים שלך. נא לוודא שנוצרו טבלאות בסיס הנתונים "
+"המתאימות, ובסיס הנתונים ניתן לקריאה על ידי המשתמש המתאים."
+
+#: contrib/admin/templates/admin/login.html:19
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+msgid "Username:"
+msgstr "שם משתמש:"
+
+#: contrib/admin/templates/admin/login.html:22
+#: contrib/comments/templates/comments/form.html:8
+msgid "Password:"
+msgstr "סיסמה:"
+
+#: contrib/admin/templates/admin/object_history.html:16
+msgid "Date/time"
+msgstr "תאריך/שעה"
+
+#: contrib/admin/templates/admin/object_history.html:17
+msgid "User"
+msgstr "משתמש"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Action"
+msgstr "פעולה"
+
+#: contrib/admin/templates/admin/object_history.html:24
+msgid "DATE_WITH_TIME_FULL"
+msgstr "l d.m.y H:i:s"
+
+#: contrib/admin/templates/admin/object_history.html:32
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"לאובייקט זה אין היסטוריית שינוי. כנראה לא השתמשו בממשק הניהול הזה להוספתו."
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "הצג הכל"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "בצע"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "תוצאה אחת"
+msgstr[1] "%(counter)s תוצאות"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s סה\"כ"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "שמירה כחדש"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "שמירה והוספת אחר"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "שמירה והמשך עריכה"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "שמירה"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"ראשית יש להזין שם משתמש וסיסמה. לאחר מכן יהיה ביכולתך לערוך אפשרויות נוספות "
+"עבור המשתמש."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:13
+#: contrib/auth/forms.py:14 contrib/auth/forms.py:51
+msgid "Username"
+msgstr "שם משתמש"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:20
+#: contrib/admin/templates/admin/auth/user/change_password.html:33
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:52 contrib/auth/forms.py:176
+msgid "Password"
+msgstr "סיסמה"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:26
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+#: contrib/auth/forms.py:177
+msgid "Password (again)"
+msgstr "סיסמה (שוב)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:27
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+msgid "Enter the same password as above, for verification."
+msgstr "יש להזין את אותה סיסמה שוב,לאימות."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:26
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "יש להזין סיסמה חדשה עבור המשתמש <strong>%(username)s</strong>."
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "תודה על בילוי זמן איכות עם האתר."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "התחבר/י שוב"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "שינוי סיסמה"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "הסיסמה שונתה בהצלחה"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "סיסמתך שונתה."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"נא להזין את סיסמתך הישנה, למען האבטחה, ולאחר מכן את סיסמתך החדשה פעמיים כדי "
+"שנוכל לוודא שהקלדת אותה כראוי."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "סיסמה ישנה:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+#: contrib/admin/templates/registration/password_reset_confirm.html:18
+msgid "New password:"
+msgstr "סיסמה חדשה:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+#: contrib/admin/templates/registration/password_reset_confirm.html:20
+msgid "Confirm password:"
+msgstr "אימות סיסמה:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+#: contrib/admin/templates/registration/password_reset_confirm.html:21
+msgid "Change my password"
+msgstr "שנה את סיסמתי"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:4
+#: contrib/admin/templates/registration/password_reset_confirm.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+msgid "Password reset"
+msgstr "איפוס סיסמה"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:6
+#: contrib/admin/templates/registration/password_reset_complete.html:10
+msgid "Password reset complete"
+msgstr "איפוס הסיסמה הושלם"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:12
+msgid "Your password has been set.  You may go ahead and log in now."
+msgstr "ססמתך נשמרה. כעת ניתן להתחבר."
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:4
+msgid "Password reset confirmation"
+msgstr "אימות איפוס סיסמה"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:12
+msgid "Enter new password"
+msgstr "הזנת סיסמה חדשה"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:14
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr "נא להזין את סיסמתך החדשה פעמיים כדי שנוכל לוודא שהקלדת אותה כראוי."
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:26
+msgid "Password reset unsuccessful"
+msgstr "איפוס הסיסמה נכשל"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:28
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used.  Please request a new password reset."
+msgstr ""
+"הקישור לאיפוס הסיסמה אינו חוקי. ייתכן והשתמשו בו כבר. נא לבקש איפוס סיסמה "
+"חדש."
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "הסיסמה אופסה בהצלחה"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed you instructions for setting your password to the e-mail "
+"address you submitted. You should be receiving it shortly."
+msgstr ""
+"שלחנו הוראות לקביעת הסיסמה אל כתובת הדוא\"ל שהזנת. ההודעה אמורה להתקבל בקרוב."
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "הודעה זו התקבלה כי ביקשת איפוס סיסמה"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "עבור חשבון המשתמש שלך ב %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+msgid "Please go to the following page and choose a new password:"
+msgstr "נא להגיע לעמוד הבא ולבחור סיסמה חדשה:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:9
+msgid "Your username, in case you've forgotten:"
+msgstr "שם המשתמש שלך, במקרה ששכחת:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Thanks for using our site!"
+msgstr "תודה על השימוש באתר שלנו!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "צוות %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll e-mail "
+"instructions for setting a new one."
+msgstr ""
+"שכחת את סיסמתך ? נא להזין את כתובת הדוא\"ל מתחת, ואנו נשלח הוראות לקביעת "
+"סיסמה חדשה."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "כתובת דוא\"ל:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "אפס את סיסמתי"
+
+#: contrib/admin/templatetags/admin_list.py:284
+msgid "All dates"
+msgstr "כל התאריכים"
+
+#: contrib/admin/views/main.py:65
+#, python-format
+msgid "Select %s"
+msgstr "בחירת %s"
+
+#: contrib/admin/views/main.py:65
+#, python-format
+msgid "Select %s to change"
+msgstr "בחירת %s לשינוי"
+
+#: contrib/admin/views/template.py:36 contrib/sites/models.py:38
+msgid "site"
+msgstr "אתר"
+
+#: contrib/admin/views/template.py:38
+msgid "template"
+msgstr "תבנית"
+
+#: contrib/admindocs/views.py:53 contrib/admindocs/views.py:55
+#: contrib/admindocs/views.py:57
+msgid "tag:"
+msgstr "תג:"
+
+#: contrib/admindocs/views.py:87 contrib/admindocs/views.py:89
+#: contrib/admindocs/views.py:91
+msgid "filter:"
+msgstr "סינון:"
+
+#: contrib/admindocs/views.py:153 contrib/admindocs/views.py:155
+#: contrib/admindocs/views.py:157
+msgid "view:"
+msgstr "ה-view:"
+
+#: contrib/admindocs/views.py:187
+#, python-format
+msgid "App %r not found"
+msgstr "יישום %r לא נמצא"
+
+#: contrib/admindocs/views.py:194
+#, python-format
+msgid "Model %(model_name)r not found in app %(app_label)r"
+msgstr "מודל %(model_name)r לא נמצא ביישום %(app_label)r"
+
+#: contrib/admindocs/views.py:206
+#, python-format
+msgid "the related `%(app_label)s.%(data_type)s` object"
+msgstr "אוביקטי `%(app_label)s.%(data_type)s` קשורים"
+
+#: contrib/admindocs/views.py:206 contrib/admindocs/views.py:228
+#: contrib/admindocs/views.py:242 contrib/admindocs/views.py:247
+msgid "model:"
+msgstr "מודל:"
+
+#: contrib/admindocs/views.py:237
+#, python-format
+msgid "related `%(app_label)s.%(object_name)s` objects"
+msgstr "אובייקטי `%(app_label)s.%(object_name)s` קשורים"
+
+#: contrib/admindocs/views.py:242
+#, python-format
+msgid "all %s"
+msgstr "כל %s"
+
+#: contrib/admindocs/views.py:247
+#, python-format
+msgid "number of %s"
+msgstr "מספר %s"
+
+#: contrib/admindocs/views.py:253
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Fields on %s objects"
+
+#: contrib/admindocs/views.py:317 contrib/admindocs/views.py:328
+#: contrib/admindocs/views.py:330 contrib/admindocs/views.py:336
+#: contrib/admindocs/views.py:337 contrib/admindocs/views.py:339
+msgid "Integer"
+msgstr "מספר שלם"
+
+#: contrib/admindocs/views.py:318
+msgid "Boolean (Either True or False)"
+msgstr "בוליאני (אמת או שקר)"
+
+#: contrib/admindocs/views.py:319 contrib/admindocs/views.py:338
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "מחרוזת (עד %(max_length)s תווים)"
+
+#: contrib/admindocs/views.py:320
+msgid "Comma-separated integers"
+msgstr "מספרים שלמים מופרדים בפסיקים"
+
+#: contrib/admindocs/views.py:321
+msgid "Date (without time)"
+msgstr "תאריך (ללא שעה)"
+
+#: contrib/admindocs/views.py:322
+msgid "Date (with time)"
+msgstr "תאריך (כולל שעה)"
+
+#: contrib/admindocs/views.py:323
+msgid "Decimal number"
+msgstr "מספר עשרוני"
+
+#: contrib/admindocs/views.py:324
+msgid "E-mail address"
+msgstr "כתובת דוא\"ל"
+
+#: contrib/admindocs/views.py:325 contrib/admindocs/views.py:326
+#: contrib/admindocs/views.py:329
+msgid "File path"
+msgstr "נתיב קובץ"
+
+#: contrib/admindocs/views.py:327
+msgid "Floating point number"
+msgstr "מספר עשרוני"
+
+#: contrib/admindocs/views.py:331 contrib/comments/models.py:89
+msgid "IP address"
+msgstr "כתובת IP"
+
+#: contrib/admindocs/views.py:333
+msgid "Boolean (Either True, False or None)"
+msgstr "בוליאני (אמת, שקר או כלום)"
+
+#: contrib/admindocs/views.py:334
+msgid "Relation to parent model"
+msgstr "יחס למודל אב"
+
+#: contrib/admindocs/views.py:335
+msgid "Phone number"
+msgstr "מספר טלפון"
+
+#: contrib/admindocs/views.py:340
+msgid "Text"
+msgstr "טקסט"
+
+#: contrib/admindocs/views.py:341
+msgid "Time"
+msgstr "זמן"
+
+#: contrib/admindocs/views.py:342 contrib/flatpages/admin.py:8
+#: contrib/flatpages/models.py:8
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admindocs/views.py:343
+msgid "U.S. state (two uppercase letters)"
+msgstr "מדינה בארה\"ב (שתי אותיות גדולות)"
+
+#: contrib/admindocs/views.py:344
+msgid "XML text"
+msgstr "טקסט XML"
+
+#: contrib/admindocs/views.py:370
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "לא נראה ש-%s הוא אובייקט urlpattern"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "ייסומניות"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:4
+msgid "Documentation bookmarklets"
+msgstr "ייסומוניות תיעוד"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:8
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">כדי להתקין ייסומניות, יש לגרור את הקישור לסרגל הסימניות\n"
+"שלך, או קליק ימני והוספה לסימניות. כעת ניתן\n"
+"לבחור את הייסומניה מכל עמוד באתר.  יש לשים לב כי חלק מהייסומניות\n"
+"ניתנות לצפיה רק ממחשב שמסווג\n"
+"כ\"פנימי\" (יש לדבר עם מנהל המערכת שלך אם אינך בטוח/ה\n"
+"שהמחשב מסווג ככזה).</p>\n"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:18
+msgid "Documentation for this page"
+msgstr "תיעוד לדף זה"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:19
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr "מקפיץ אותך מכל עמוד לתיעוד התצוגה שייצרה אותו."
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:21
+msgid "Show object ID"
+msgstr "הצג מזהה אובייקט"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:22
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr "מציג את סוג התוכן והמזהה הייחודי לעמודים המייצגים אובייקט בודד."
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:24
+msgid "Edit this object (current window)"
+msgstr "עריכת אובייקט זה (בחלון הנוכחי)"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:25
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "קופץ לעמוד הניהול לעמודים אשר מייצגים אובייקטים בודד."
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:27
+msgid "Edit this object (new window)"
+msgstr "עריכת אובייקט זה (בחלון חדש)"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:28
+msgid "As above, but opens the admin page in a new window."
+msgstr "כנ\"ל, אך דף הניהול ייפתח בחלון חדש."
+
+#: contrib/auth/admin.py:21
+msgid "Personal info"
+msgstr "מידע אישי"
+
+#: contrib/auth/admin.py:22
+msgid "Permissions"
+msgstr "הרשאות"
+
+#: contrib/auth/admin.py:23
+msgid "Important dates"
+msgstr "תאריכים חשובים"
+
+#: contrib/auth/admin.py:24
+msgid "Groups"
+msgstr "קבוצות"
+
+#: contrib/auth/admin.py:60
+msgid "Add user"
+msgstr "הוספת משתמש"
+
+#: contrib/auth/admin.py:85
+msgid "Password changed successfully."
+msgstr "הסיסמה שונתה בהצלחה."
+
+#: contrib/auth/admin.py:91
+#, python-format
+msgid "Change password: %s"
+msgstr "שינוי סיסמה: %s"
+
+#: contrib/auth/forms.py:15 contrib/auth/models.py:137
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr ""
+"דורש 30 תווים או פחות. תווים אלפאנומריים בלבד (אותיות, ספרות וקווים תחתונים)."
+
+#: contrib/auth/forms.py:16 core/validators.py:72
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "ערך זה חייב להכיל אותיות, ספרות וקווים תחתונים בלבד."
+
+#: contrib/auth/forms.py:18
+msgid "Password confirmation"
+msgstr "אימות סיסמה"
+
+#: contrib/auth/forms.py:30
+msgid "A user with that username already exists."
+msgstr "משתמש עם שם משתמש זה קיים כבר"
+
+#: contrib/auth/forms.py:36 contrib/auth/forms.py:146
+#: contrib/auth/forms.py:188
+msgid "The two password fields didn't match."
+msgstr "שני שדות הסיסמה אינם זהים."
+
+#: contrib/auth/forms.py:74 contrib/comments/views/comments.py:58
+msgid "This account is inactive."
+msgstr "חשבון זה אינו פעיל."
+
+#: contrib/auth/forms.py:79 contrib/comments/views/comments.py:49
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr "נראה שעוגיות לא מאופשרות בדפדפן שלך. הן נדרשות כדי להתחבר."
+
+#: contrib/auth/forms.py:92
+msgid "E-mail"
+msgstr "כתובת דוא\"ל"
+
+#: contrib/auth/forms.py:101
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr "כתובת דואר אלקטרוני זו אינה משוייכת למשתמש. בטוח שנרשמת ?"
+
+#: contrib/auth/forms.py:126
+#, python-format
+msgid "Password reset on %s"
+msgstr "איפוס סיסמה על %s"
+
+#: contrib/auth/forms.py:134
+msgid "New password"
+msgstr "סיסמה חדשה"
+
+#: contrib/auth/forms.py:135
+msgid "New password confirmation"
+msgstr "אימות סיסמה חדשה"
+
+#: contrib/auth/forms.py:160
+msgid "Old password"
+msgstr "סיסמה ישנה"
+
+#: contrib/auth/forms.py:168
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "סיסמתך הישנה הוזנה בצורה שגויה. נא להזינה שוב."
+
+#: contrib/auth/models.py:73 contrib/auth/models.py:96
+msgid "name"
+msgstr "שם"
+
+#: contrib/auth/models.py:75
+msgid "codename"
+msgstr "שם קוד"
+
+#: contrib/auth/models.py:78
+msgid "permission"
+msgstr "הרשאה"
+
+#: contrib/auth/models.py:79 contrib/auth/models.py:97
+msgid "permissions"
+msgstr "הרשאות"
+
+#: contrib/auth/models.py:100
+msgid "group"
+msgstr "קבוצה"
+
+#: contrib/auth/models.py:101 contrib/auth/models.py:147
+msgid "groups"
+msgstr "קבוצות"
+
+#: contrib/auth/models.py:137
+msgid "username"
+msgstr "שם משתמש"
+
+#: contrib/auth/models.py:138
+msgid "first name"
+msgstr "שם פרטי"
+
+#: contrib/auth/models.py:139
+msgid "last name"
+msgstr "שם משפחה"
+
+#: contrib/auth/models.py:140
+msgid "e-mail address"
+msgstr "כתובת דוא\"ל"
+
+#: contrib/auth/models.py:141
+msgid "password"
+msgstr "סיסמה"
+
+#: contrib/auth/models.py:141
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"יש להזין '[algo]$[salt]$[hexdigest]' או להשתמש ב<a href=\"password/\">טופס "
+"שינוי הסיסמה</a>."
+
+#: contrib/auth/models.py:142
+msgid "staff status"
+msgstr "סטטוס איש צוות"
+
+#: contrib/auth/models.py:142
+msgid "Designates whether the user can log into this admin site."
+msgstr "מציין האם המשתמש יכול להתחבר לאתר הניהול."
+
+#: contrib/auth/models.py:143
+msgid "active"
+msgstr "פעיל"
+
+#: contrib/auth/models.py:143
+msgid ""
+"Designates whether this user should be treated as active. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"מציין האם יש להתייחס למשתמש כפעיל. יש לבטל בחירה זו במקום למחוק חשבונות "
+"משתמשים."
+
+#: contrib/auth/models.py:144
+msgid "superuser status"
+msgstr "סטטוס משתמש על"
+
+#: contrib/auth/models.py:144
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr "מציין שלמשתמש זה יש את כל ההרשאות ללא הצורך המפורש בהענקתן."
+
+#: contrib/auth/models.py:145
+msgid "last login"
+msgstr "כניסה אחרונה"
+
+#: contrib/auth/models.py:146
+msgid "date joined"
+msgstr "תאריך הצטרפות"
+
+#: contrib/auth/models.py:148
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"בנוסף לכל ההרשאות שהוקצו ידנית, יוענקו למשתמש גם כל ההרשאות של כל קבוצה "
+"המשוייכת אליו."
+
+#: contrib/auth/models.py:149
+msgid "user permissions"
+msgstr "הרשאות משתמש"
+
+#: contrib/auth/models.py:153
+msgid "user"
+msgstr "משתמש"
+
+#: contrib/auth/models.py:154
+msgid "users"
+msgstr "משתמשים"
+
+#: contrib/auth/models.py:309
+msgid "message"
+msgstr "הודעה"
+
+#: contrib/auth/views.py:50
+msgid "Logged out"
+msgstr "יצאת מהמערכת"
+
+#: contrib/comments/models.py:71 contrib/comments/models.py:164
+msgid "object ID"
+msgstr "מזהה אובייקט"
+
+#: contrib/comments/models.py:72
+msgid "headline"
+msgstr "כותרת"
+
+#: contrib/comments/models.py:73 contrib/comments/models.py:95
+#: contrib/comments/models.py:165
+msgid "comment"
+msgstr "תגובה"
+
+#: contrib/comments/models.py:74
+msgid "rating #1"
+msgstr "דירוג #1"
+
+#: contrib/comments/models.py:75
+msgid "rating #2"
+msgstr "דירוג #2"
+
+#: contrib/comments/models.py:76
+msgid "rating #3"
+msgstr "דירוג #3"
+
+#: contrib/comments/models.py:77
+msgid "rating #4"
+msgstr "דירוג #4"
+
+#: contrib/comments/models.py:78
+msgid "rating #5"
+msgstr "דירוג #5"
+
+#: contrib/comments/models.py:79
+msgid "rating #6"
+msgstr "דירוג #6"
+
+#: contrib/comments/models.py:80
+msgid "rating #7"
+msgstr "דירוג #7"
+
+#: contrib/comments/models.py:81
+msgid "rating #8"
+msgstr "דירוג #8"
+
+#: contrib/comments/models.py:86
+msgid "is valid rating"
+msgstr "האם דירוג חוקי"
+
+#: contrib/comments/models.py:87 contrib/comments/models.py:167
+msgid "date/time submitted"
+msgstr "תאריך/שעת הגשה"
+
+#: contrib/comments/models.py:88 contrib/comments/models.py:168
+msgid "is public"
+msgstr "ציבורי"
+
+#: contrib/comments/models.py:90
+msgid "is removed"
+msgstr "האם הוסר"
+
+#: contrib/comments/models.py:90
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"יש לסמן תיבה זו עבור תגובה לא נאותה. הודעת \"תגובה זו נמחקה\" תוצג במקום."
+
+#: contrib/comments/models.py:96
+msgid "comments"
+msgstr "תגובות"
+
+#: contrib/comments/models.py:128 contrib/comments/models.py:199
+msgid "Content object"
+msgstr "אובייקט תוכן"
+
+#: contrib/comments/models.py:156
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"הוגש ע\"י %(user)s ב %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:166
+msgid "person's name"
+msgstr "שם"
+
+#: contrib/comments/models.py:169
+msgid "ip address"
+msgstr "כתובת IP"
+
+#: contrib/comments/models.py:171
+msgid "approved by staff"
+msgstr "אושר ע\"י הצוות"
+
+#: contrib/comments/models.py:175
+msgid "free comment"
+msgstr "הערה אנונימית"
+
+#: contrib/comments/models.py:176
+msgid "free comments"
+msgstr "הערות אנונימיות"
+
+#: contrib/comments/models.py:227
+msgid "score"
+msgstr "ציון"
+
+#: contrib/comments/models.py:228
+msgid "score date"
+msgstr "תאריך ציון"
+
+#: contrib/comments/models.py:232
+msgid "karma score"
+msgstr "ניקוד קארמה"
+
+#: contrib/comments/models.py:233
+msgid "karma scores"
+msgstr "ניקודי קארמה"
+
+#: contrib/comments/models.py:237
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d·דירוג ע\"י·%(user)s"
+
+#: contrib/comments/models.py:254
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"התגובה סומנה ע\"י %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:262
+msgid "flag date"
+msgstr "תאריך סימון"
+
+#: contrib/comments/models.py:266
+msgid "user flag"
+msgstr "סימון ע\"י משתמש"
+
+#: contrib/comments/models.py:267
+msgid "user flags"
+msgstr "סימונים ע\"י משתמש"
+
+#: contrib/comments/models.py:271
+#, python-format
+msgid "Flag by %r"
+msgstr "סימון ע\"י %r"
+
+#: contrib/comments/models.py:277
+msgid "deletion date"
+msgstr "תאריך מחיקה"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "מחיקת מודרטור"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "מחיקות מודרטור"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "מחיקת מודרציה ע\"י %r"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "שכחת את סיסמתך?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "דירוג"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "נדרש"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "אופציונלי"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "שליחת תמונה"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "תגובה:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "תצוגה מקדימה של התגובה"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "שמך:"
+
+#: contrib/comments/views/comments.py:76
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr "הדירוג נדרש מאחר והזנת לפחות דרוג אחד אחר."
+
+#: contrib/comments/views/comments.py:160
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"ההודעה נשלחה ע\"י משתמש ששלח פחות מ-%(count)s תגובה:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"ההודעה נשלחה ע\"י משתמש ששלח פחות מ-%(count)s תגובות:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:165
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"ההודעה נשלחה ע\"י משתמש מפוקפק:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:238
+#: contrib/comments/views/comments.py:331
+msgid "Only POSTs are allowed"
+msgstr "רק פעולות POST מותרות"
+
+#: contrib/comments/views/comments.py:242
+#: contrib/comments/views/comments.py:335
+msgid "One or more of the required fields wasn't submitted"
+msgstr "אחד או יותר מהשדות הנדרשים אינו נשלח."
+
+#: contrib/comments/views/comments.py:246
+#: contrib/comments/views/comments.py:337
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "מישהו התעסק עם טופס התגובה (הפרת אבטחה)"
+
+#: contrib/comments/views/comments.py:256
+#: contrib/comments/views/comments.py:343
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr "טופס התגובה הכיל פרמטר target לא חוקי -- מזהה האובייקט אינו חוקי"
+
+#: contrib/comments/views/comments.py:307
+#: contrib/comments/views/comments.py:372
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "טופס התגובה לא הכיל 'preview' או 'post'"
+
+#: contrib/comments/views/karma.py:21
+msgid "Anonymous users cannot vote"
+msgstr "משתמשים אנונימיים אינם יכולים להצביע"
+
+#: contrib/comments/views/karma.py:25
+msgid "Invalid comment ID"
+msgstr "מזהה תגובה שגוי"
+
+#: contrib/comments/views/karma.py:27
+msgid "No voting for yourself"
+msgstr "לא ניתן להצביע לעצמך"
+
+#: contrib/contenttypes/models.py:67
+msgid "python model class name"
+msgstr "שם ה-class של מודל פייתון"
+
+#: contrib/contenttypes/models.py:71
+msgid "content type"
+msgstr "סוג תוכן"
+
+#: contrib/contenttypes/models.py:72
+msgid "content types"
+msgstr "סוגי תוכן"
+
+#: contrib/flatpages/admin.py:9
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"לדוגמא: '/about/contact/'. יש לוודא הימצאות הקווים הנטויים בהתחלה ובסוף."
+
+#: contrib/flatpages/admin.py:11 core/validators.py:76
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr "ערך זה חייב להכיל אותיות, ספרות, מקפים, קווים תחתונים ונטויים בלבד."
+
+#: contrib/flatpages/admin.py:22
+msgid "Advanced options"
+msgstr "אפשרויות מתקדמות"
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "כותרת"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "תוכן"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "אפשר תגובות"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "שם תבנית"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"דוגמא: 'flatpages/contact_page.html'. אם זה לא צויין, המערכת תשתמש "
+"ב-'flatpages/default.html'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "הרשמה נדרשת"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "אם מסומן, רק משתמשים מחוברים יוכלו לצפות בדף."
+
+#: contrib/flatpages/models.py:19
+msgid "flat page"
+msgstr "דף פשוט"
+
+#: contrib/flatpages/models.py:20
+msgid "flat pages"
+msgstr "דפים פשוטים"
+
+#: contrib/gis/forms/fields.py:10
+msgid "No geometry value provided."
+msgstr "לא סופק ערך גיאומטרי."
+
+#: contrib/gis/forms/fields.py:11
+msgid "Invalid Geometry value."
+msgstr "ערך גאומטרי שגוי"
+
+#: contrib/gis/forms/fields.py:12
+msgid "Invalid Geometry type."
+msgstr "סוג גיאומטרי שגוי."
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "th"
+msgstr "רביעי"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "st"
+msgstr "ראשון"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "nd"
+msgstr "שני"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "rd"
+msgstr "שלישי"
+
+#: contrib/humanize/templatetags/humanize.py:51
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f מיליון"
+msgstr[1] "%(value).1f מיליונים"
+
+#: contrib/humanize/templatetags/humanize.py:54
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f מיליארד"
+msgstr[1] "%(value).1f מיליארדים"
+
+#: contrib/humanize/templatetags/humanize.py:57
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f טריליון"
+msgstr[1] "%(value).1f טריליונים"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "one"
+msgstr "אחד"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "two"
+msgstr "שניים"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "three"
+msgstr "שלושה"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "four"
+msgstr "ארבעה"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "five"
+msgstr "חמישה"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "six"
+msgstr "שישה"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "seven"
+msgstr "שבעה"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "eight"
+msgstr "שמונה"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "nine"
+msgstr "תשעה"
+
+#: contrib/humanize/templatetags/humanize.py:93
+msgid "today"
+msgstr "היום"
+
+#: contrib/humanize/templatetags/humanize.py:95
+msgid "tomorrow"
+msgstr "מחר"
+
+#: contrib/humanize/templatetags/humanize.py:97
+msgid "yesterday"
+msgstr "אתמול"
+
+#: contrib/localflavor/ar/forms.py:27
+msgid "Enter a postal code in the format NNNN or ANNNNAAA."
+msgstr "יש להזין קוד דואר בתחביר NNNN או ANNNNAAA."
+
+#: contrib/localflavor/ar/forms.py:49 contrib/localflavor/br/forms.py:96
+#: contrib/localflavor/br/forms.py:135 contrib/localflavor/pe/forms.py:23
+#: contrib/localflavor/pe/forms.py:51
+msgid "This field requires only numbers."
+msgstr "יש להזין רק ספרות בשדה זה."
+
+#: contrib/localflavor/ar/forms.py:50
+msgid "This field requires 7 or 8 digits."
+msgstr "שדה זה דורש 7 או 8 ספרות."
+
+#: contrib/localflavor/ar/forms.py:79
+msgid "Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format."
+msgstr "יש להזין מספר CUIT חוקי בתחביר XX-XXXXXXXX-X או XXXXXXXXXXXX."
+
+#: contrib/localflavor/ar/forms.py:80
+msgid "Invalid CUIT."
+msgstr "CUIT שגוי"
+
+#: contrib/localflavor/at/at_states.py:5
+msgid "Burgenland"
+msgstr "\tבורגנלנד"
+
+#: contrib/localflavor/at/at_states.py:6
+msgid "Carinthia"
+msgstr "קרינתיה"
+
+#: contrib/localflavor/at/at_states.py:7
+msgid "Lower Austria"
+msgstr "אוסטריה התחתונה"
+
+#: contrib/localflavor/at/at_states.py:8
+msgid "Upper Austria"
+msgstr "אוסטריה עילית"
+
+#: contrib/localflavor/at/at_states.py:9
+msgid "Salzburg"
+msgstr "זלצבורג"
+
+#: contrib/localflavor/at/at_states.py:10
+msgid "Styria"
+msgstr "שטיריה"
+
+#: contrib/localflavor/at/at_states.py:11
+msgid "Tyrol"
+msgstr "טירול"
+
+#: contrib/localflavor/at/at_states.py:12
+msgid "Vorarlberg"
+msgstr "פורארלברג"
+
+#: contrib/localflavor/at/at_states.py:13
+msgid "Vienna"
+msgstr "וינה"
+
+#: contrib/localflavor/at/forms.py:20 contrib/localflavor/ch/forms.py:16
+#: contrib/localflavor/no/forms.py:12
+msgid "Enter a zip code in the format XXXX."
+msgstr "יש להזין מיקוד בתחביר XXXX."
+
+#: contrib/localflavor/at/forms.py:48
+msgid "Enter a valid Austrian Social Security Number in XXXX XXXXXX format."
+msgstr "יש להזין מספר ביטוח לאומי אוסטרלי חוקי בתחביר XXXX XXXXXX."
+
+#: contrib/localflavor/au/forms.py:16
+msgid "Enter a 4 digit post code."
+msgstr "יש להזין קוד דואר בן 4 ספרות."
+
+#: contrib/localflavor/br/forms.py:21
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "יש להזין מיקוד בתחביר XXXXX-XXX."
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "מספרי טלפון חייבים להיות בתחביר XX-XXXX-XXXX."
+
+#: contrib/localflavor/br/forms.py:58
+msgid ""
+"Select a valid brazilian state. That state is not one of the available "
+"states."
+msgstr "נא לבחור מדינה ברזילאית חוקית. מדינה זו אינה אחת מהמדינות האפשריות."
+
+#: contrib/localflavor/br/forms.py:94
+msgid "Invalid CPF number."
+msgstr "מספר CPF לא חוקי"
+
+#: contrib/localflavor/br/forms.py:95
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr "שדה זה דורש 11 או 14 ספרות לכל היותר."
+
+#: contrib/localflavor/br/forms.py:134
+msgid "Invalid CNPJ number."
+msgstr "מספר CNPJ לא חוקי"
+
+#: contrib/localflavor/br/forms.py:136
+msgid "This field requires at least 14 digits"
+msgstr "שדה זה דורש לפחות 14 ספרות."
+
+#: contrib/localflavor/ca/forms.py:17
+msgid "Enter a postal code in the format XXX XXX."
+msgstr "יש להזין מיקוד בתחביר XXX XXX."
+
+#: contrib/localflavor/ca/forms.py:88
+msgid "Enter a valid Canadian Social Insurance number in XXX-XXX-XXX format."
+msgstr "יש להזין מספר ביטוח לאומי קנדי חוקי בתחביר XXX-XXX-XXXX."
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr "ארגאו"
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr "אפנצל אינר-רודן"
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr "אפנצל אוסר-רודן"
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr "באזל-שטאדט"
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr "באזל-לנדשאפט"
+
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr "ברן"
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr "פריבור"
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr "ג'נבה"
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr "גלרוס"
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr "גראובינדן"
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr "ז'ורה"
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr "לוצרן"
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr "נשאטל"
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr "נידוולדן"
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr "אובוולדן"
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr "שפהאוזן"
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr "שוויץ"
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr "זולותורן"
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr "סנט גלן"
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr "Thurgau"
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr "טיצ'ינו"
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr "אורי"
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr "ואלה"
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr "וו"
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr "צוג"
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr "ציריך"
+
+#: contrib/localflavor/ch/forms.py:64
+msgid ""
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
+msgstr "יש להזין מספר זיהוי או דרכון שוויצרי בתחביר X1234567<0 או 1234567890."
+
+#: contrib/localflavor/cl/forms.py:29
+msgid "Enter a valid Chilean RUT."
+msgstr "יש להזין RUT צ'יליאני חוקי."
+
+#: contrib/localflavor/cl/forms.py:30
+msgid "Enter a valid Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr "יש להזין RUT צ'יליאני חוקי. התחביר הוא XX.XXX.XXX-X."
+
+#: contrib/localflavor/cl/forms.py:31
+msgid "The Chilean RUT is not valid."
+msgstr "שדה RUT צ'יליאני אינו חוקי."
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr "באדן-וירטמברג"
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr "באווריה"
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr "ברלין"
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr "ברנדנבורג"
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr "ברמן"
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr "המבורג"
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr "הסה"
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr "מקלנבורג-מערב פומרניה"
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr "סקסוניה התחתונה"
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr "נורדריין-וסטפאליה"
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr "ריינלנד-פאלץ"
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr "חבל הסאר"
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr "סקסוניה"
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr "סקסוניה-אנהלט"
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr "שלזוויג-הולשטיין"
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr "תורינגיה"
+
+#: contrib/localflavor/de/forms.py:14 contrib/localflavor/fi/forms.py:12
+#: contrib/localflavor/fr/forms.py:15
+msgid "Enter a zip code in the format XXXXX."
+msgstr "יש להזין מיקוד בתחביר XXXXX."
+
+#: contrib/localflavor/de/forms.py:41
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr "יש להזין מספר זיהוי גרמני חוקי בתחביר XXXXXXXXXXX-XXXXXXX-XXXXXXX-X."
+
+#: contrib/localflavor/es/es_provinces.py:5
+msgid "Arava"
+msgstr "אראבה"
+
+#: contrib/localflavor/es/es_provinces.py:6
+msgid "Albacete"
+msgstr "אלבסטה"
+
+#: contrib/localflavor/es/es_provinces.py:7
+msgid "Alacant"
+msgstr "אלאקאנט"
+
+#: contrib/localflavor/es/es_provinces.py:8
+msgid "Almeria"
+msgstr "אלמריה"
+
+#: contrib/localflavor/es/es_provinces.py:9
+msgid "Avila"
+msgstr "אווילה"
+
+#: contrib/localflavor/es/es_provinces.py:10
+msgid "Badajoz"
+msgstr "באדאג'וז"
+
+#: contrib/localflavor/es/es_provinces.py:11
+msgid "Illes Balears"
+msgstr "האיים הבלאריים"
+
+#: contrib/localflavor/es/es_provinces.py:12
+msgid "Barcelona"
+msgstr "ברצלונה"
+
+#: contrib/localflavor/es/es_provinces.py:13
+msgid "Burgos"
+msgstr "בורגוס"
+
+#: contrib/localflavor/es/es_provinces.py:14
+msgid "Caceres"
+msgstr "קסרס"
+
+#: contrib/localflavor/es/es_provinces.py:15
+msgid "Cadiz"
+msgstr "קדיס"
+
+#: contrib/localflavor/es/es_provinces.py:16
+msgid "Castello"
+msgstr "קסטלו"
+
+#: contrib/localflavor/es/es_provinces.py:17
+msgid "Ciudad Real"
+msgstr "העיר הקולוניאלית"
+
+#: contrib/localflavor/es/es_provinces.py:18
+msgid "Cordoba"
+msgstr "קורדובה"
+
+#: contrib/localflavor/es/es_provinces.py:19
+msgid "A Coruna"
+msgstr "א קורוניה"
+
+#: contrib/localflavor/es/es_provinces.py:20
+msgid "Cuenca"
+msgstr "קואנקה"
+
+#: contrib/localflavor/es/es_provinces.py:21
+msgid "Girona"
+msgstr "ז'ירונה"
+
+#: contrib/localflavor/es/es_provinces.py:22
+msgid "Granada"
+msgstr "גרנדה"
+
+#: contrib/localflavor/es/es_provinces.py:23
+msgid "Guadalajara"
+msgstr "גוודלחרה"
+
+#: contrib/localflavor/es/es_provinces.py:24
+msgid "Guipuzkoa"
+msgstr "גוויפוזקואה"
+
+#: contrib/localflavor/es/es_provinces.py:25
+msgid "Huelva"
+msgstr "אואלבה"
+
+#: contrib/localflavor/es/es_provinces.py:26
+msgid "Huesca"
+msgstr "אואסקה"
+
+#: contrib/localflavor/es/es_provinces.py:27
+msgid "Jaen"
+msgstr "חאאן"
+
+#: contrib/localflavor/es/es_provinces.py:28
+msgid "Leon"
+msgstr "לאון"
+
+#: contrib/localflavor/es/es_provinces.py:29
+msgid "Lleida"
+msgstr "ליידה"
+
+#: contrib/localflavor/es/es_provinces.py:30
+#: contrib/localflavor/es/es_regions.py:17
+msgid "La Rioja"
+msgstr "לה ריוחה"
+
+#: contrib/localflavor/es/es_provinces.py:31
+msgid "Lugo"
+msgstr "לוגו"
+
+#: contrib/localflavor/es/es_provinces.py:32
+#: contrib/localflavor/es/es_regions.py:18
+msgid "Madrid"
+msgstr "מדריד"
+
+#: contrib/localflavor/es/es_provinces.py:33
+msgid "Malaga"
+msgstr "מאלאגה"
+
+#: contrib/localflavor/es/es_provinces.py:34
+msgid "Murcia"
+msgstr "מורסיה"
+
+#: contrib/localflavor/es/es_provinces.py:35
+msgid "Navarre"
+msgstr "נווארה"
+
+#: contrib/localflavor/es/es_provinces.py:36
+msgid "Ourense"
+msgstr "אוורנס"
+
+#: contrib/localflavor/es/es_provinces.py:37
+msgid "Asturias"
+msgstr "אסטוריאס"
+
+#: contrib/localflavor/es/es_provinces.py:38
+msgid "Palencia"
+msgstr "פלנסיה"
+
+#: contrib/localflavor/es/es_provinces.py:39
+msgid "Las Palmas"
+msgstr "לאס פאלמס"
+
+#: contrib/localflavor/es/es_provinces.py:40
+msgid "Pontevedra"
+msgstr "פונטוורדה"
+
+#: contrib/localflavor/es/es_provinces.py:41
+msgid "Salamanca"
+msgstr "סלמנקה"
+
+#: contrib/localflavor/es/es_provinces.py:42
+msgid "Santa Cruz de Tenerife"
+msgstr "סנטה קרוז דה טנריף"
+
+#: contrib/localflavor/es/es_provinces.py:43
+#: contrib/localflavor/es/es_regions.py:11
+msgid "Cantabria"
+msgstr "קנטבריה"
+
+#: contrib/localflavor/es/es_provinces.py:44
+msgid "Segovia"
+msgstr "סגוביה"
+
+#: contrib/localflavor/es/es_provinces.py:45
+msgid "Seville"
+msgstr "סביליה"
+
+#: contrib/localflavor/es/es_provinces.py:46
+msgid "Soria"
+msgstr "סוריה"
+
+#: contrib/localflavor/es/es_provinces.py:47
+msgid "Tarragona"
+msgstr "טרגונה"
+
+#: contrib/localflavor/es/es_provinces.py:48
+msgid "Teruel"
+msgstr "טרואל"
+
+#: contrib/localflavor/es/es_provinces.py:49
+msgid "Toledo"
+msgstr "טולדו"
+
+#: contrib/localflavor/es/es_provinces.py:50
+msgid "Valencia"
+msgstr "ולנסיה"
+
+#: contrib/localflavor/es/es_provinces.py:51
+msgid "Valladolid"
+msgstr "ויאדוליד"
+
+#: contrib/localflavor/es/es_provinces.py:52
+msgid "Bizkaia"
+msgstr "ביסקאיה"
+
+#: contrib/localflavor/es/es_provinces.py:53
+msgid "Zamora"
+msgstr "סמורה"
+
+#: contrib/localflavor/es/es_provinces.py:54
+msgid "Zaragoza"
+msgstr "סראגוסה"
+
+#: contrib/localflavor/es/es_provinces.py:55
+msgid "Ceuta"
+msgstr "סאוטה"
+
+#: contrib/localflavor/es/es_provinces.py:56
+msgid "Melilla"
+msgstr "מלייה"
+
+#: contrib/localflavor/es/es_regions.py:5
+msgid "Andalusia"
+msgstr "אנדלוסיה"
+
+#: contrib/localflavor/es/es_regions.py:6
+msgid "Aragon"
+msgstr "אראגון"
+
+#: contrib/localflavor/es/es_regions.py:7
+msgid "Principality of Asturias"
+msgstr "נסיכות אסטוריאס"
+
+#: contrib/localflavor/es/es_regions.py:8
+msgid "Balearic Islands"
+msgstr "האיים הבלאריים"
+
+#: contrib/localflavor/es/es_regions.py:9
+msgid "Basque Country"
+msgstr "חבל הבסקים"
+
+#: contrib/localflavor/es/es_regions.py:10
+msgid "Canary Islands"
+msgstr "האיים הקנריים"
+
+#: contrib/localflavor/es/es_regions.py:12
+msgid "Castile-La Mancha"
+msgstr "קסטיליה-לה מנצ'ה"
+
+#: contrib/localflavor/es/es_regions.py:13
+msgid "Castile and Leon"
+msgstr "קסטיליה ולאון"
+
+#: contrib/localflavor/es/es_regions.py:14
+msgid "Catalonia"
+msgstr "קאטלוניה"
+
+#: contrib/localflavor/es/es_regions.py:15
+msgid "Extremadura"
+msgstr "אקסטרמדורה"
+
+#: contrib/localflavor/es/es_regions.py:16
+msgid "Galicia"
+msgstr "גאליציה"
+
+#: contrib/localflavor/es/es_regions.py:19
+msgid "Region of Murcia"
+msgstr "אזור מורסיה"
+
+#: contrib/localflavor/es/es_regions.py:20
+msgid "Foral Community of Navarre"
+msgstr "הקהילה האוטונומית של נווארה"
+
+#: contrib/localflavor/es/es_regions.py:21
+msgid "Valencian Community"
+msgstr "קהילת ולנסיה"
+
+#: contrib/localflavor/es/forms.py:19
+msgid "Enter a valid postal code in the range and format 01XXX - 52XXX."
+msgstr "נא להזיו מיקוד חוקי בתחום ובתחביר 01XXX - 52XXX."
+
+#: contrib/localflavor/es/forms.py:39
+msgid ""
+"Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or "
+"9XXXXXXXX."
+msgstr ""
+"נא להזין מספר טלפון חוקי באחד מהתחבירים 6XXXXXXXX, 8XXXXXXXX or 9XXXXXXXX."
+
+#: contrib/localflavor/es/forms.py:66
+msgid "Please enter a valid NIF, NIE, or CIF."
+msgstr "נא להזין NIF, NIE, או CIF חוקי."
+
+#: contrib/localflavor/es/forms.py:67
+msgid "Please enter a valid NIF or NIE."
+msgstr "נא להזין NIF או NIE חוקי."
+
+#: contrib/localflavor/es/forms.py:68
+msgid "Invalid checksum for NIF."
+msgstr "סיכום ביקורת שגוי עבור NIF."
+
+#: contrib/localflavor/es/forms.py:69
+msgid "Invalid checksum for NIE."
+msgstr "סיכום ביקורת שגוי עבור NIE."
+
+#: contrib/localflavor/es/forms.py:70
+msgid "Invalid checksum for CIF."
+msgstr "סיכום ביקורת שגוי עבור CIF."
+
+#: contrib/localflavor/es/forms.py:142
+msgid ""
+"Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX."
+msgstr "נא להזין חשבון בנק חוקי בתחביר XXXX-XXXX-XX-XXXXXXXXXX."
+
+#: contrib/localflavor/es/forms.py:143
+msgid "Invalid checksum for bank account number."
+msgstr "סיכום ביקורת שגוי עבור מספר חשבון בנק."
+
+#: contrib/localflavor/fi/forms.py:28
+msgid "Enter a valid Finnish social security number."
+msgstr "יש להזין מספר ביטוח לאומי פיני חוקי."
+
+#: contrib/localflavor/in_/forms.py:14
+msgid "Enter a zip code in the format XXXXXXX."
+msgstr "יש להזין מיקוד בתחביר XXXXXXX."
+
+#: contrib/localflavor/is_/forms.py:17
+msgid ""
+"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr "יש להזין מספר זיהוי איסלנדי חוקי. התחביר הוא XXXXXX-XXXX."
+
+#: contrib/localflavor/is_/forms.py:18
+msgid "The Icelandic identification number is not valid."
+msgstr "מספר הזיהוי האיסלנדי אינו חוקי"
+
+#: contrib/localflavor/it/forms.py:14
+msgid "Enter a valid zip code."
+msgstr "יש להזין מיקוד חוקי."
+
+#: contrib/localflavor/it/forms.py:43
+msgid "Enter a valid Social Security number."
+msgstr "יש להזין מספר ביטוח לאומי חוקי."
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr "יש להזין מספר מעמ חוקי"
+
+#: contrib/localflavor/jp/forms.py:17
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "יש להזין קוד דואר בתחביר XXXXXXX או XXX-XXXX."
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr "הוקאידו"
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr "אאומורי"
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr "Iwate"
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr "מיאגי"
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr "אקיטה"
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr "יאמאגטה"
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr "פוקושימה"
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr "איברקי"
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr "טושיגי"
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr "גונמה"
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr "סאיטאמה"
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr "צ'יבה"
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr "טוקיו"
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr "קאנגאווה"
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr "יאמאנשי"
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr "נאגאנו"
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr "נייגטה"
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr "טויאמה"
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr "אישיקאוואה"
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr "פוקוי"
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr "גיפו"
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr "שיזואוקה"
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr "אייצ'י"
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr "מיי"
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr "שיגה"
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr "קיוטו"
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr "אוסקה"
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr "הייוגו"
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr "נארה"
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr "ווקאייאמה"
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr "טוטורי"
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr "Shimane"
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr "אוקייאמה"
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr "הירושימה"
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr "יאמאגוצ'י"
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr "טוקושימה"
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr "קאגאווה"
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr "Ehime"
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr "קוצ'י"
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr "פוקוקה"
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr "סגה"
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr "נגסקי"
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr "קומאמוטו"
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr "אויטה"
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr "מיאזאקי"
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr "קגושימה"
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr "אוקינאווה"
+
+#: contrib/localflavor/mx/mx_states.py:12
+msgid "Aguascalientes"
+msgstr "אגואסקליינטס"
+
+#: contrib/localflavor/mx/mx_states.py:13
+msgid "Baja California"
+msgstr "באחה קליפורניה"
+
+#: contrib/localflavor/mx/mx_states.py:14
+msgid "Baja California Sur"
+msgstr "באחה קליפורניה הדרומית"
+
+#: contrib/localflavor/mx/mx_states.py:15
+msgid "Campeche"
+msgstr "קמפצ'ה"
+
+#: contrib/localflavor/mx/mx_states.py:16
+msgid "Chihuahua"
+msgstr "צ'יוואוה"
+
+#: contrib/localflavor/mx/mx_states.py:17
+msgid "Chiapas"
+msgstr "צ'יאפס"
+
+#: contrib/localflavor/mx/mx_states.py:18
+msgid "Coahuila"
+msgstr "קואהווילה"
+
+#: contrib/localflavor/mx/mx_states.py:19
+msgid "Colima"
+msgstr "קולימה"
+
+#: contrib/localflavor/mx/mx_states.py:20
+msgid "Distrito Federal"
+msgstr "מחוז פדרלי"
+
+#: contrib/localflavor/mx/mx_states.py:21
+msgid "Durango"
+msgstr "צ'יוואוה"
+
+#: contrib/localflavor/mx/mx_states.py:22
+msgid "Guerrero"
+msgstr "גררו"
+
+#: contrib/localflavor/mx/mx_states.py:23
+msgid "Guanajuato"
+msgstr "גואנחואטו"
+
+#: contrib/localflavor/mx/mx_states.py:24
+msgid "Hidalgo"
+msgstr "אידלגו"
+
+#: contrib/localflavor/mx/mx_states.py:25
+msgid "Jalisco"
+msgstr "חליסקו"
+
+#: contrib/localflavor/mx/mx_states.py:26
+msgid "Estado de México"
+msgstr "אסטאדו דה מקסיקו"
+
+#: contrib/localflavor/mx/mx_states.py:27
+msgid "Michoacán"
+msgstr "מיצ'ואקן"
+
+#: contrib/localflavor/mx/mx_states.py:28
+msgid "Morelos"
+msgstr "מורלוס"
+
+#: contrib/localflavor/mx/mx_states.py:29
+msgid "Nayarit"
+msgstr "נייארית"
+
+#: contrib/localflavor/mx/mx_states.py:30
+msgid "Nuevo León"
+msgstr "נואבו ליאון"
+
+#: contrib/localflavor/mx/mx_states.py:31
+msgid "Oaxaca"
+msgstr "אואסקה"
+
+#: contrib/localflavor/mx/mx_states.py:32
+msgid "Puebla"
+msgstr "פואבלה"
+
+#: contrib/localflavor/mx/mx_states.py:33
+msgid "Querétaro"
+msgstr "קוורטארו"
+
+#: contrib/localflavor/mx/mx_states.py:34
+msgid "Quintana Roo"
+msgstr "קינטאנה רו"
+
+#: contrib/localflavor/mx/mx_states.py:35
+msgid "Sinaloa"
+msgstr "סינאלוה"
+
+#: contrib/localflavor/mx/mx_states.py:36
+msgid "San Luis Potosí"
+msgstr "סאן לואי פוטוסי"
+
+#: contrib/localflavor/mx/mx_states.py:37
+msgid "Sonora"
+msgstr "סונורה"
+
+#: contrib/localflavor/mx/mx_states.py:38
+msgid "Tabasco"
+msgstr "טבסקו"
+
+#: contrib/localflavor/mx/mx_states.py:39
+msgid "Tamaulipas"
+msgstr "טמפוליפס"
+
+#: contrib/localflavor/mx/mx_states.py:40
+msgid "Tlaxcala"
+msgstr "טלקסקאלה"
+
+#: contrib/localflavor/mx/mx_states.py:41
+msgid "Veracruz"
+msgstr "ורקרוז"
+
+#: contrib/localflavor/mx/mx_states.py:42
+msgid "Yucatán"
+msgstr "יוקטן"
+
+#: contrib/localflavor/mx/mx_states.py:43
+msgid "Zacatecas"
+msgstr "זאקאטקס"
+
+#: contrib/localflavor/nl/forms.py:21
+msgid "Enter a valid postal code"
+msgstr "יש להזין מיקוד חוקי."
+
+#: contrib/localflavor/nl/forms.py:52
+msgid "Enter a valid phone number"
+msgstr "יש להזין מספר טלפון חוקי"
+
+#: contrib/localflavor/nl/forms.py:78
+msgid "Enter a valid SoFi number"
+msgstr "יש להזין מספר SoFi חוקי"
+
+#: contrib/localflavor/nl/nl_provinces.py:4
+msgid "Drenthe"
+msgstr "דרנתה"
+
+#: contrib/localflavor/nl/nl_provinces.py:5
+msgid "Flevoland"
+msgstr "פלבולנד"
+
+#: contrib/localflavor/nl/nl_provinces.py:6
+msgid "Friesland"
+msgstr "פריזלנד"
+
+#: contrib/localflavor/nl/nl_provinces.py:7
+msgid "Gelderland"
+msgstr "חלדרלנד"
+
+#: contrib/localflavor/nl/nl_provinces.py:8
+msgid "Groningen"
+msgstr "חרונינגן"
+
+#: contrib/localflavor/nl/nl_provinces.py:9
+msgid "Limburg"
+msgstr "לימבורג"
+
+#: contrib/localflavor/nl/nl_provinces.py:10
+msgid "Noord-Brabant"
+msgstr "צפון בראבנט"
+
+#: contrib/localflavor/nl/nl_provinces.py:11
+msgid "Noord-Holland"
+msgstr "צפון הולנד"
+
+#: contrib/localflavor/nl/nl_provinces.py:12
+msgid "Overijssel"
+msgstr "אובראיסל"
+
+#: contrib/localflavor/nl/nl_provinces.py:13
+msgid "Utrecht"
+msgstr "אוטרכט"
+
+#: contrib/localflavor/nl/nl_provinces.py:14
+msgid "Zeeland"
+msgstr "זילנד"
+
+#: contrib/localflavor/nl/nl_provinces.py:15
+msgid "Zuid-Holland"
+msgstr "דרום הולנד"
+
+#: contrib/localflavor/no/forms.py:33
+msgid "Enter a valid Norwegian social security number."
+msgstr "יש להזין מספר ביטוח לאומי נורבגי חוקי."
+
+#: contrib/localflavor/pe/forms.py:24
+msgid "This field requires 8 digits."
+msgstr "שדה זה דורש 8 ספרות."
+
+#: contrib/localflavor/pe/forms.py:52
+msgid "This field requires 11 digits."
+msgstr "שדה זה דורש 11 ספרות."
+
+#: contrib/localflavor/pl/forms.py:38
+msgid "National Identification Number consists of 11 digits."
+msgstr "מספר זיהוי לאומי מורכב מ-11 ספרות"
+
+#: contrib/localflavor/pl/forms.py:39
+msgid "Wrong checksum for the National Identification Number."
+msgstr "סכום ביקורת שגוי עבודי מספר הזיהוי הלאומי"
+
+#: contrib/localflavor/pl/forms.py:71
+msgid ""
+"Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX."
+msgstr "נא להזין שדה מספר מס (NIP) בתחביר XXX-XXX-XX-XX או XX-XX-XXX-XXX."
+
+#: contrib/localflavor/pl/forms.py:72
+msgid "Wrong checksum for the Tax Number (NIP)."
+msgstr "סיכום ביקורת שגוי עבור מספר מס (NIP)."
+
+#: contrib/localflavor/pl/forms.py:111
+msgid "National Business Register Number (REGON) consists of 7 or 9 digits."
+msgstr "מספר רישום עסק לאומי (REGON) מכיל 7 או 9 ספרות."
+
+#: contrib/localflavor/pl/forms.py:112
+msgid "Wrong checksum for the National Business Register Number (REGON)."
+msgstr "סיכום שגוי National Business Register Number (REGON)."
+
+#: contrib/localflavor/pl/forms.py:155
+msgid "Enter a postal code in the format XX-XXX."
+msgstr "נא להזין מיקוד בתחביר XX-XXX."
+
+#: contrib/localflavor/pl/pl_voivodeships.py:8
+msgid "Lower Silesia"
+msgstr "סילסיה התחתונה"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:9
+msgid "Kuyavia-Pomerania"
+msgstr "קויאבויה - פומרניה"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:10
+msgid "Lublin"
+msgstr "לובלין"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:11
+msgid "Lubusz"
+msgstr "לובוש"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:12
+msgid "Lodz"
+msgstr "לודז'"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:13
+msgid "Lesser Poland"
+msgstr "פולין זוטא"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:14
+msgid "Masovia"
+msgstr "מזוביה"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:15
+msgid "Opole"
+msgstr "אופולה"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:16
+msgid "Subcarpatia"
+msgstr "תת קרפטיה"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:17
+msgid "Podlasie"
+msgstr "פודלסיה"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:18
+msgid "Pomerania"
+msgstr "פומרניה"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:19
+msgid "Silesia"
+msgstr "סילסיה"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:20
+msgid "Swietokrzyskie"
+msgstr "סבייטוקזי'סקי"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:21
+msgid "Warmia-Masuria"
+msgstr "וורמיה- מזוריה"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:22
+msgid "Greater Poland"
+msgstr "פולין רבתי"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:23
+msgid "West Pomerania"
+msgstr "מערב פומרניה"
+
+#: contrib/localflavor/ro/forms.py:19
+msgid "Enter a valid CIF."
+msgstr "יש להזין CIF חוקי."
+
+#: contrib/localflavor/ro/forms.py:56
+msgid "Enter a valid CNP."
+msgstr "יש להזין CNP חוקי."
+
+#: contrib/localflavor/ro/forms.py:141
+msgid "Enter a valid IBAN in ROXX-XXXX-XXXX-XXXX-XXXX-XXXX format"
+msgstr "יש להזין מספר IBAN חוקי בתחביר ROXX-XXXX-XXXX-XXXX-XXXX-XXXX"
+
+#: contrib/localflavor/ro/forms.py:171
+msgid "Phone numbers must be in XXXX-XXXXXX format."
+msgstr "תחביר מספרי טלפון חייב להיות XXXX-XXXXXX."
+
+#: contrib/localflavor/ro/forms.py:194
+msgid "Enter a valid postal code in the format XXXXXX"
+msgstr "נא להזין מיקוד חוקי בתחביר XXXXXX"
+
+#: contrib/localflavor/sk/forms.py:30
+msgid "Enter a postal code in the format XXXXX or XXX XX."
+msgstr "יש להזין קוד דואר בתחביר XXXXX או XXX XX."
+
+#: contrib/localflavor/sk/sk_districts.py:8
+msgid "Banska Bystrica"
+msgstr " בנסקה ביסטריצה"
+
+#: contrib/localflavor/sk/sk_districts.py:9
+msgid "Banska Stiavnica"
+msgstr "בנסקה שטיאבניצה"
+
+#: contrib/localflavor/sk/sk_districts.py:10
+msgid "Bardejov"
+msgstr "ברדיוב"
+
+#: contrib/localflavor/sk/sk_districts.py:11
+msgid "Banovce nad Bebravou"
+msgstr "בנובץ ע\"מ בברבו"
+
+#: contrib/localflavor/sk/sk_districts.py:12
+msgid "Brezno"
+msgstr "ברזנו"
+
+#: contrib/localflavor/sk/sk_districts.py:13
+msgid "Bratislava I"
+msgstr "ברטיסלאבה 1"
+
+#: contrib/localflavor/sk/sk_districts.py:14
+msgid "Bratislava II"
+msgstr "ברטיסלאבה 2"
+
+#: contrib/localflavor/sk/sk_districts.py:15
+msgid "Bratislava III"
+msgstr "ברטיסלאבה 3"
+
+#: contrib/localflavor/sk/sk_districts.py:16
+msgid "Bratislava IV"
+msgstr "ברטיסלאבה 4"
+
+#: contrib/localflavor/sk/sk_districts.py:17
+msgid "Bratislava V"
+msgstr "ברטיסלאבה 5"
+
+#: contrib/localflavor/sk/sk_districts.py:18
+msgid "Bytca"
+msgstr "ביטצ'ה"
+
+#: contrib/localflavor/sk/sk_districts.py:19
+msgid "Cadca"
+msgstr "צ'דקה"
+
+#: contrib/localflavor/sk/sk_districts.py:20
+msgid "Detva"
+msgstr "דטבה"
+
+#: contrib/localflavor/sk/sk_districts.py:21
+msgid "Dolny Kubin"
+msgstr "דולני קובין"
+
+#: contrib/localflavor/sk/sk_districts.py:22
+msgid "Dunajska Streda"
+msgstr "דונאייסקה סטרדה"
+
+#: contrib/localflavor/sk/sk_districts.py:23
+msgid "Galanta"
+msgstr "גלנטה"
+
+#: contrib/localflavor/sk/sk_districts.py:24
+msgid "Gelnica"
+msgstr "גלניקה"
+
+#: contrib/localflavor/sk/sk_districts.py:25
+msgid "Hlohovec"
+msgstr "הלוהובץ"
+
+#: contrib/localflavor/sk/sk_districts.py:26
+msgid "Humenne"
+msgstr "הומנה"
+
+#: contrib/localflavor/sk/sk_districts.py:27
+msgid "Ilava"
+msgstr "אילבה"
+
+#: contrib/localflavor/sk/sk_districts.py:28
+msgid "Kezmarok"
+msgstr "קזמרוק"
+
+#: contrib/localflavor/sk/sk_districts.py:29
+msgid "Komarno"
+msgstr "קומרנו"
+
+#: contrib/localflavor/sk/sk_districts.py:30
+msgid "Kosice I"
+msgstr "קושיצה 1"
+
+#: contrib/localflavor/sk/sk_districts.py:31
+msgid "Kosice II"
+msgstr "קושיצה 2"
+
+#: contrib/localflavor/sk/sk_districts.py:32
+msgid "Kosice III"
+msgstr "קושיצה 3"
+
+#: contrib/localflavor/sk/sk_districts.py:33
+msgid "Kosice IV"
+msgstr "קושיצה 4"
+
+#: contrib/localflavor/sk/sk_districts.py:34
+msgid "Kosice - okolie"
+msgstr "קושיצ'ה - אוקולי"
+
+#: contrib/localflavor/sk/sk_districts.py:35
+msgid "Krupina"
+msgstr "קרופינה"
+
+#: contrib/localflavor/sk/sk_districts.py:36
+msgid "Kysucke Nove Mesto"
+msgstr "קיוסקה נובה מסטו"
+
+#: contrib/localflavor/sk/sk_districts.py:37
+msgid "Levice"
+msgstr "לביצה"
+
+#: contrib/localflavor/sk/sk_districts.py:38
+msgid "Levoca"
+msgstr "לבוצ'ה"
+
+#: contrib/localflavor/sk/sk_districts.py:39
+msgid "Liptovsky Mikulas"
+msgstr "ליפטובסקי מיקולס"
+
+#: contrib/localflavor/sk/sk_districts.py:40
+msgid "Lucenec"
+msgstr "לוצ'נץ'"
+
+#: contrib/localflavor/sk/sk_districts.py:41
+msgid "Malacky"
+msgstr "מאלאקי"
+
+#: contrib/localflavor/sk/sk_districts.py:42
+msgid "Martin"
+msgstr "מרטין"
+
+#: contrib/localflavor/sk/sk_districts.py:43
+msgid "Medzilaborce"
+msgstr "מדזילבורצה"
+
+#: contrib/localflavor/sk/sk_districts.py:44
+msgid "Michalovce"
+msgstr "מיחלובצה"
+
+#: contrib/localflavor/sk/sk_districts.py:45
+msgid "Myjava"
+msgstr "מיאווה"
+
+#: contrib/localflavor/sk/sk_districts.py:46
+msgid "Namestovo"
+msgstr "נמסטובו"
+
+#: contrib/localflavor/sk/sk_districts.py:47
+msgid "Nitra"
+msgstr "ניטרה"
+
+#: contrib/localflavor/sk/sk_districts.py:48
+msgid "Nove Mesto nad Vahom"
+msgstr "נובה מסטו ע\"נ וה"
+
+#: contrib/localflavor/sk/sk_districts.py:49
+msgid "Nove Zamky"
+msgstr "נווי-זאמקי"
+
+#: contrib/localflavor/sk/sk_districts.py:50
+msgid "Partizanske"
+msgstr "פרטיזנסקה"
+
+#: contrib/localflavor/sk/sk_districts.py:51
+msgid "Pezinok"
+msgstr "פזינוק"
+
+#: contrib/localflavor/sk/sk_districts.py:52
+msgid "Piestany"
+msgstr "פיאסטאני"
+
+#: contrib/localflavor/sk/sk_districts.py:53
+msgid "Poltar"
+msgstr "פולטר"
+
+#: contrib/localflavor/sk/sk_districts.py:54
+msgid "Poprad"
+msgstr "פופרד"
+
+#: contrib/localflavor/sk/sk_districts.py:55
+msgid "Povazska Bystrica"
+msgstr "פובסקה ביסטריצ'ה"
+
+#: contrib/localflavor/sk/sk_districts.py:56
+msgid "Presov"
+msgstr "פרשוב"
+
+#: contrib/localflavor/sk/sk_districts.py:57
+msgid "Prievidza"
+msgstr "פרבידזה"
+
+#: contrib/localflavor/sk/sk_districts.py:58
+msgid "Puchov"
+msgstr "פוצ'וב"
+
+#: contrib/localflavor/sk/sk_districts.py:59
+msgid "Revuca"
+msgstr "ריץ"
+
+#: contrib/localflavor/sk/sk_districts.py:60
+msgid "Rimavska Sobota"
+msgstr "רימובסקה סובוטה"
+
+#: contrib/localflavor/sk/sk_districts.py:61
+msgid "Roznava"
+msgstr "רוזנבה"
+
+#: contrib/localflavor/sk/sk_districts.py:62
+msgid "Ruzomberok"
+msgstr "רוזומברוק"
+
+#: contrib/localflavor/sk/sk_districts.py:63
+msgid "Sabinov"
+msgstr "סבינוב"
+
+#: contrib/localflavor/sk/sk_districts.py:64
+msgid "Senec"
+msgstr "סנץ"
+
+#: contrib/localflavor/sk/sk_districts.py:65
+msgid "Senica"
+msgstr "סניצ'ה"
+
+#: contrib/localflavor/sk/sk_districts.py:66
+msgid "Skalica"
+msgstr "סקליצ'ה"
+
+#: contrib/localflavor/sk/sk_districts.py:67
+msgid "Snina"
+msgstr "סנינה"
+
+#: contrib/localflavor/sk/sk_districts.py:68
+msgid "Sobrance"
+msgstr "סוברנס"
+
+#: contrib/localflavor/sk/sk_districts.py:69
+msgid "Spisska Nova Ves"
+msgstr "ספישסקה נובה וס"
+
+#: contrib/localflavor/sk/sk_districts.py:70
+msgid "Stara Lubovna"
+msgstr "סטרה לובובנה"
+
+#: contrib/localflavor/sk/sk_districts.py:71
+msgid "Stropkov"
+msgstr "סרטופקוב"
+
+#: contrib/localflavor/sk/sk_districts.py:72
+msgid "Svidnik"
+msgstr "סבידניק"
+
+#: contrib/localflavor/sk/sk_districts.py:73
+msgid "Sala"
+msgstr "סאלה"
+
+#: contrib/localflavor/sk/sk_districts.py:74
+msgid "Topolcany"
+msgstr "טופולצ'ני"
+
+#: contrib/localflavor/sk/sk_districts.py:75
+msgid "Trebisov"
+msgstr "טרביסוב"
+
+#: contrib/localflavor/sk/sk_districts.py:76
+msgid "Trencin"
+msgstr "טרנצ'ין"
+
+#: contrib/localflavor/sk/sk_districts.py:77
+msgid "Trnava"
+msgstr "טרנאוה"
+
+#: contrib/localflavor/sk/sk_districts.py:78
+msgid "Turcianske Teplice"
+msgstr "טורצינסק טפליץ"
+
+#: contrib/localflavor/sk/sk_districts.py:79
+msgid "Tvrdosin"
+msgstr "טברודוסין"
+
+#: contrib/localflavor/sk/sk_districts.py:80
+msgid "Velky Krtis"
+msgstr "ולקי קריץ"
+
+#: contrib/localflavor/sk/sk_districts.py:81
+msgid "Vranov nad Toplou"
+msgstr "טרנוב ע\"נ טופולו"
+
+#: contrib/localflavor/sk/sk_districts.py:82
+msgid "Zlate Moravce"
+msgstr "זלטה מורבצה"
+
+#: contrib/localflavor/sk/sk_districts.py:83
+msgid "Zvolen"
+msgstr "זבולן"
+
+#: contrib/localflavor/sk/sk_districts.py:84
+msgid "Zarnovica"
+msgstr "זרנוביקה"
+
+#: contrib/localflavor/sk/sk_districts.py:85
+msgid "Ziar nad Hronom"
+msgstr "ז'יר ע\"נ הרון"
+
+#: contrib/localflavor/sk/sk_districts.py:86
+msgid "Zilina"
+msgstr "ז'ילינה"
+
+#: contrib/localflavor/sk/sk_regions.py:8
+msgid "Banska Bystrica region"
+msgstr "מחוז בטנסקה ביסטריקה"
+
+#: contrib/localflavor/sk/sk_regions.py:9
+msgid "Bratislava region"
+msgstr "מחוז ברטיסלבה"
+
+#: contrib/localflavor/sk/sk_regions.py:10
+msgid "Kosice region"
+msgstr "מחוז קושיצ'ה"
+
+#: contrib/localflavor/sk/sk_regions.py:11
+msgid "Nitra region"
+msgstr "מחוז ניטרה"
+
+#: contrib/localflavor/sk/sk_regions.py:12
+msgid "Presov region"
+msgstr "מחוז פראסוב"
+
+#: contrib/localflavor/sk/sk_regions.py:13
+msgid "Trencin region"
+msgstr "מחוז טראנצין"
+
+#: contrib/localflavor/sk/sk_regions.py:14
+msgid "Trnava region"
+msgstr "מחוז טרנאוה"
+
+#: contrib/localflavor/sk/sk_regions.py:15
+msgid "Zilina region"
+msgstr "מחוז ז'ילינה"
+
+#: contrib/localflavor/uk/forms.py:21
+msgid "Enter a valid postcode."
+msgstr "יש להזין מיקוד חוקי."
+
+#: contrib/localflavor/uk/uk_regions.py:11
+msgid "Bedfordshire"
+msgstr " בדפורשייר"
+
+#: contrib/localflavor/uk/uk_regions.py:12
+msgid "Buckinghamshire"
+msgstr "באקינגהמשייר"
+
+#: contrib/localflavor/uk/uk_regions.py:14
+msgid "Cheshire"
+msgstr " צ'שייר"
+
+#: contrib/localflavor/uk/uk_regions.py:15
+msgid "Cornwall and Isles of Scilly"
+msgstr "קורנוול ואיי סילי"
+
+#: contrib/localflavor/uk/uk_regions.py:16
+msgid "Cumbria"
+msgstr " קאמבריה"
+
+#: contrib/localflavor/uk/uk_regions.py:17
+msgid "Derbyshire"
+msgstr "דרבישייר"
+
+#: contrib/localflavor/uk/uk_regions.py:18
+msgid "Devon"
+msgstr " דבון"
+
+#: contrib/localflavor/uk/uk_regions.py:19
+msgid "Dorset"
+msgstr "דורסט"
+
+#: contrib/localflavor/uk/uk_regions.py:20
+msgid "Durham"
+msgstr "דרהאם"
+
+#: contrib/localflavor/uk/uk_regions.py:21
+msgid "East Sussex"
+msgstr "מזרח אסקס"
+
+#: contrib/localflavor/uk/uk_regions.py:22
+msgid "Essex"
+msgstr "אסקס"
+
+#: contrib/localflavor/uk/uk_regions.py:23
+msgid "Gloucestershire"
+msgstr "גלוסטרשייר"
+
+#: contrib/localflavor/uk/uk_regions.py:24
+msgid "Greater London"
+msgstr "לונדון רבתי"
+
+#: contrib/localflavor/uk/uk_regions.py:25
+msgid "Greater Manchester"
+msgstr "מנצ'סטר רבתי"
+
+#: contrib/localflavor/uk/uk_regions.py:26
+msgid "Hampshire"
+msgstr "המפשייר"
+
+#: contrib/localflavor/uk/uk_regions.py:27
+msgid "Hertfordshire"
+msgstr "הארטפורדשייר"
+
+#: contrib/localflavor/uk/uk_regions.py:28
+msgid "Kent"
+msgstr "קנט"
+
+#: contrib/localflavor/uk/uk_regions.py:29
+msgid "Lancashire"
+msgstr "לנקשייר"
+
+#: contrib/localflavor/uk/uk_regions.py:30
+msgid "Leicestershire"
+msgstr "ליסטרשייר"
+
+#: contrib/localflavor/uk/uk_regions.py:31
+msgid "Lincolnshire"
+msgstr " לינקולנשייר"
+
+#: contrib/localflavor/uk/uk_regions.py:32
+msgid "Merseyside"
+msgstr "מרסיסייד"
+
+#: contrib/localflavor/uk/uk_regions.py:33
+msgid "Norfolk"
+msgstr "נורפולק"
+
+#: contrib/localflavor/uk/uk_regions.py:34
+msgid "North Yorkshire"
+msgstr "צפון יורקשייר"
+
+#: contrib/localflavor/uk/uk_regions.py:35
+msgid "Northamptonshire"
+msgstr "נורת'המפטונשייר"
+
+#: contrib/localflavor/uk/uk_regions.py:36
+msgid "Northumberland"
+msgstr "נורת'אמברלנד"
+
+#: contrib/localflavor/uk/uk_regions.py:37
+msgid "Nottinghamshire"
+msgstr "נוטינגהאמשייר"
+
+#: contrib/localflavor/uk/uk_regions.py:38
+msgid "Oxfordshire"
+msgstr "אוקספורדשייר"
+
+#: contrib/localflavor/uk/uk_regions.py:39
+msgid "Shropshire"
+msgstr "שרופשייר"
+
+#: contrib/localflavor/uk/uk_regions.py:40
+msgid "Somerset"
+msgstr "סומרסט"
+
+#: contrib/localflavor/uk/uk_regions.py:41
+msgid "South Yorkshire"
+msgstr "דרום יורקשייר"
+
+#: contrib/localflavor/uk/uk_regions.py:42
+msgid "Staffordshire"
+msgstr "סטאפורדשייר"
+
+#: contrib/localflavor/uk/uk_regions.py:43
+msgid "Suffolk"
+msgstr " סאפוק"
+
+#: contrib/localflavor/uk/uk_regions.py:44
+msgid "Surrey"
+msgstr "סוריי"
+
+#: contrib/localflavor/uk/uk_regions.py:45
+msgid "Tyne and Wear"
+msgstr "טיין ו-וויר"
+
+#: contrib/localflavor/uk/uk_regions.py:46
+msgid "Warwickshire"
+msgstr " וורוויקשייר"
+
+#: contrib/localflavor/uk/uk_regions.py:47
+msgid "West Midlands"
+msgstr "מערב המידלנדס"
+
+#: contrib/localflavor/uk/uk_regions.py:48
+msgid "West Sussex"
+msgstr "מערב סאסקס"
+
+#: contrib/localflavor/uk/uk_regions.py:49
+msgid "West Yorkshire"
+msgstr "מערב יורקשייר"
+
+#: contrib/localflavor/uk/uk_regions.py:50
+msgid "Wiltshire"
+msgstr " ווילטשייר"
+
+#: contrib/localflavor/uk/uk_regions.py:51
+msgid "Worcestershire"
+msgstr " ווסטרשייר"
+
+#: contrib/localflavor/uk/uk_regions.py:55
+msgid "County Antrim"
+msgstr "מחוז אנטרים"
+
+#: contrib/localflavor/uk/uk_regions.py:56
+msgid "County Armagh"
+msgstr "ארמה"
+
+#: contrib/localflavor/uk/uk_regions.py:57
+msgid "County Down"
+msgstr "מחוז דאון"
+
+#: contrib/localflavor/uk/uk_regions.py:58
+msgid "County Fermanagh"
+msgstr "מחוז פרמאנה"
+
+#: contrib/localflavor/uk/uk_regions.py:59
+msgid "County Londonderry"
+msgstr "מחוז לונדונברי"
+
+#: contrib/localflavor/uk/uk_regions.py:60
+msgid "County Tyrone"
+msgstr "מחוז טיירון"
+
+#: contrib/localflavor/uk/uk_regions.py:64
+msgid "Clwyd"
+msgstr "קלוויד"
+
+#: contrib/localflavor/uk/uk_regions.py:65
+msgid "Dyfed"
+msgstr "דייפד"
+
+#: contrib/localflavor/uk/uk_regions.py:66
+msgid "Gwent"
+msgstr "גוונט"
+
+#: contrib/localflavor/uk/uk_regions.py:67
+msgid "Gwynedd"
+msgstr "גווינד"
+
+#: contrib/localflavor/uk/uk_regions.py:68
+msgid "Mid Glamorgan"
+msgstr "מרכז גלמורגן"
+
+#: contrib/localflavor/uk/uk_regions.py:69
+msgid "Powys"
+msgstr "ַפואיס"
+
+#: contrib/localflavor/uk/uk_regions.py:70
+msgid "South Glamorgan"
+msgstr "דרום גלמורגן"
+
+#: contrib/localflavor/uk/uk_regions.py:71
+msgid "West Glamorgan"
+msgstr "מערב גלמורגן"
+
+#: contrib/localflavor/uk/uk_regions.py:75
+msgid "Borders"
+msgstr "גבולות"
+
+#: contrib/localflavor/uk/uk_regions.py:76
+msgid "Central Scotland"
+msgstr "מרכז סקוטלנד"
+
+#: contrib/localflavor/uk/uk_regions.py:77
+msgid "Dumfries and Galloway"
+msgstr "דמפרייס וגאלוויי"
+
+#: contrib/localflavor/uk/uk_regions.py:78
+msgid "Fife"
+msgstr "פייף"
+
+#: contrib/localflavor/uk/uk_regions.py:79
+msgid "Grampian"
+msgstr " גרמפיאן"
+
+#: contrib/localflavor/uk/uk_regions.py:80
+msgid "Highland"
+msgstr "רמה"
+
+#: contrib/localflavor/uk/uk_regions.py:81
+msgid "Lothian"
+msgstr "לודיאן"
+
+#: contrib/localflavor/uk/uk_regions.py:82
+msgid "Orkney Islands"
+msgstr "איי אורקיי"
+
+#: contrib/localflavor/uk/uk_regions.py:83
+msgid "Shetland Islands"
+msgstr "איי שטלנד"
+
+#: contrib/localflavor/uk/uk_regions.py:84
+msgid "Strathclyde"
+msgstr "סטראת'קלייד"
+
+#: contrib/localflavor/uk/uk_regions.py:85
+msgid "Tayside"
+msgstr "טייסייד"
+
+#: contrib/localflavor/uk/uk_regions.py:86
+msgid "Western Isles"
+msgstr "האיים המערביים"
+
+#: contrib/localflavor/uk/uk_regions.py:90
+msgid "England"
+msgstr "אנגליה"
+
+#: contrib/localflavor/uk/uk_regions.py:91
+msgid "Northern Ireland"
+msgstr "צפון אירלנד"
+
+#: contrib/localflavor/uk/uk_regions.py:92
+msgid "Scotland"
+msgstr "סקוטלנד"
+
+#: contrib/localflavor/uk/uk_regions.py:93
+msgid "Wales"
+msgstr "וויילס"
+
+#: contrib/localflavor/us/forms.py:16
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "יש להזין מיקוד חוקי בתחביר XXXXX או XXXXX-XXXX."
+
+#: contrib/localflavor/us/forms.py:54
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr "יש להזין מספר ביטוח לאומי אמריקאי בתחביר XXX-XX-XXXX."
+
+#: contrib/localflavor/za/forms.py:20
+msgid "Enter a valid South African ID number"
+msgstr "נא להזין מספר זיהוי דרום אפריקאי חוקי"
+
+#: contrib/localflavor/za/forms.py:54
+msgid "Enter a valid South African postal code"
+msgstr "נא להזין מיקוד דרום אפריקאי חוקי"
+
+#: contrib/localflavor/za/za_provinces.py:4
+msgid "Eastern Cape"
+msgstr "הכף המזרחי"
+
+#: contrib/localflavor/za/za_provinces.py:5
+msgid "Free State"
+msgstr "המדינה החופשית"
+
+#: contrib/localflavor/za/za_provinces.py:6
+msgid "Gauteng"
+msgstr "גאוטנג"
+
+#: contrib/localflavor/za/za_provinces.py:7
+msgid "KwaZulu-Natal"
+msgstr "קווזולו-נטל"
+
+#: contrib/localflavor/za/za_provinces.py:8
+msgid "Limpopo"
+msgstr "לימפופו"
+
+#: contrib/localflavor/za/za_provinces.py:9
+msgid "Mpumalanga"
+msgstr "מפומלנגה"
+
+#: contrib/localflavor/za/za_provinces.py:10
+msgid "Northern Cape"
+msgstr "כף צפוני"
+
+#: contrib/localflavor/za/za_provinces.py:11
+msgid "North West"
+msgstr "דרום מערב"
+
+#: contrib/localflavor/za/za_provinces.py:12
+msgid "Western Cape"
+msgstr "כף מערבי"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "הפניה מ"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr "זה אמור להיות נתיב מלא, ללא שם המתחם. לדוגמא: '/‎/events/search'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "הפניה אל"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr "יכול להיות נתיב מלא (כנ\"ל) או URL מלא המתחיל ב'http://'."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "הפניה"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "הפניות"
+
+#: contrib/sessions/models.py:45
+msgid "session key"
+msgstr "מפתח התחברות (session key)"
+
+#: contrib/sessions/models.py:47
+msgid "session data"
+msgstr "מידע התחברות (session data)"
+
+#: contrib/sessions/models.py:48
+msgid "expire date"
+msgstr "תאריך פג תוקף"
+
+#: contrib/sessions/models.py:53
+msgid "session"
+msgstr "התחברות"
+
+#: contrib/sessions/models.py:54
+msgid "sessions"
+msgstr "התחברויות"
+
+#: contrib/sites/models.py:32
+msgid "domain name"
+msgstr "שם מתחם"
+
+#: contrib/sites/models.py:33
+msgid "display name"
+msgstr "שם לתצוגה"
+
+#: contrib/sites/models.py:39
+msgid "sites"
+msgstr "אתרים"
+
+#: core/validators.py:80
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "ערך זה חייב להכיל אותיות, ספרות, מקפים וקווים תחתונים בלבד."
+
+#: core/validators.py:84
+msgid "Uppercase letters are not allowed here."
+msgstr "אסור להשתמש באותיות גדולות."
+
+#: core/validators.py:88
+msgid "Lowercase letters are not allowed here."
+msgstr "אסור להשתמש באותיות קטנות."
+
+#: core/validators.py:95
+msgid "Enter only digits separated by commas."
+msgstr "יש להזין רק ספרות מופרדות בפסיקים."
+
+#: core/validators.py:107
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "יש להזין רק כתובות דוא\"ל מופרדות בפסיקים."
+
+#: core/validators.py:111
+msgid "Please enter a valid IP address."
+msgstr "נא להזין כתובת IP חוקית."
+
+#: core/validators.py:115
+msgid "Empty values are not allowed here."
+msgstr "חובה להזין ערך בשדה זה."
+
+#: core/validators.py:119
+msgid "Non-numeric characters aren't allowed here."
+msgstr "מותר להזין ספרות בלבד."
+
+#: core/validators.py:123
+msgid "This value can't be comprised solely of digits."
+msgstr "ערך זה אינו יכול להכיל ספרות בלבד."
+
+#: core/validators.py:128 forms/fields.py:161
+msgid "Enter a whole number."
+msgstr "נא להזין מספר שלם."
+
+#: core/validators.py:132
+msgid "Only alphabetical characters are allowed here."
+msgstr "יש להזין כאן אותיות בלבד."
+
+#: core/validators.py:147
+#, python-format
+msgid "Invalid date: %s"
+msgstr "תאריך שגוי: %s"
+
+#: core/validators.py:152 db/models/fields/__init__.py:546
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "יש להזין תאריך במבנה YYYY-MM-DD."
+
+#: core/validators.py:157
+msgid "Enter a valid time in HH:MM format."
+msgstr "יש להזין שעה במבנה HH:MM."
+
+#: core/validators.py:161
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "יש להזין תאריך ושעה במבנה YYYY-MM-DD HH:MM."
+
+#: core/validators.py:166 forms/fields.py:422
+msgid "Enter a valid e-mail address."
+msgstr "יש להזין כתובת דוא\"ל חוקית."
+
+#: core/validators.py:178 core/validators.py:470 forms/fields.py:440
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "לא נשלח שום קובץ. נא לבדוק את סוג הקידוד של הטופס."
+
+#: core/validators.py:189 forms/fields.py:471
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr "נא להעלות תמונה חוקית. הקובץ שהעלת אינו תמונה או מכיל תמונה מקולקלת."
+
+#: core/validators.py:196
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "ה-URL %s אנו מצביע לתמונה חוקית."
+
+#: core/validators.py:200
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "מספרי טלפון חייבים להיות במבנה XXX-XXX-XXXX.‏ \"%s\" אינו חוקי."
+
+#: core/validators.py:208
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "ה-URL‏ %s אינו מצביע לסרטון QuickTime חוקי."
+
+#: core/validators.py:212
+msgid "A valid URL is required."
+msgstr "יש להזין URL חוקי."
+
+#: core/validators.py:226
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"יש להזין HTML חוקי. שגיאות ספציפיות:\n"
+"%s"
+
+#: core/validators.py:233
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "מבנה XML שגוי: %s"
+
+#: core/validators.py:250
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "URL שגוי: %s"
+
+#: core/validators.py:255 core/validators.py:257
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "ה-URL‏ %s הוא קישור שבור."
+
+#: core/validators.py:263
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "יש להזין קיצור חוקי למדינה בארה\"ב."
+
+#: core/validators.py:277
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "שמור על לשונך! המילה %s אסורה לשימוש כאן."
+msgstr[1] "שמור על לשונך! המילים %s אסורות לשימוש כאן."
+
+#: core/validators.py:284
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "תוכן השדה חייב להיות זהה לשדה '%s'."
+
+#: core/validators.py:303
+msgid "Please enter something for at least one field."
+msgstr "יש להזין תוכן בלפחות אחד מהשדות."
+
+#: core/validators.py:312 core/validators.py:323
+msgid "Please enter both fields or leave them both empty."
+msgstr "יש להזין תוכן בשני השדות או להשאיר את שניהם ריקים."
+
+#: core/validators.py:331
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "יש להזין תוכן בשדה זה אם שדה %(field)s מכיל %(value)s"
+
+#: core/validators.py:344
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "יש להזין תוכן בשדה זה אם תוכן שדה %(field)s אינו %(value)s"
+
+#: core/validators.py:363
+msgid "Duplicate values are not allowed."
+msgstr "לא ניתן להזין ערכים כפולים."
+
+#: core/validators.py:378
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "ערך זה חייב להיות בין %(lower)s ל-%(upper)s."
+
+#: core/validators.py:380
+#, python-format
+msgid "This value must be at least %s."
+msgstr "ערך זה חייב להיות לפחות %s."
+
+#: core/validators.py:382
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "ערך זה אינו יכול להיות יותר מ-%s."
+
+#: core/validators.py:423
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "ערך זה חייב להיות חזקה של %s."
+
+#: core/validators.py:433
+msgid "Please enter a valid decimal number."
+msgstr "יש להזין מספר עשרוני חוקי."
+
+#: core/validators.py:440
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "יש להזין מספר עשרוני חוקי עם ספרה %s לכל היותר."
+msgstr[1] "יש להזין מספר עשרוני חוקי עם %s ספרות לכל היותר."
+
+#: core/validators.py:443
+#, python-format
+msgid ""
+"Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural ""
+"Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] "יש להזין מספר עשרוני חוקי עם ספרה %s בחלק השלם לכל היותר."
+msgstr[1] "יש להזין מספר עשרוני חוקי עם %s ספרות בחלק השלם לכל היותר."
+
+#: core/validators.py:446
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "יש להזין מספר עשרוני חוקי עם ספרה %s בחלק העשרוני לכל היותר."
+msgstr[1] "יש להזין מספר עשרוני חוקי עם %s ספרות בחלק העשרוני לכל היותר."
+
+#: core/validators.py:454
+msgid "Please enter a valid floating point number."
+msgstr "נא להזין מספר נקודה צפה חוקי."
+
+#: core/validators.py:463
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "יש להעלות קובץ בגודל %s בתים לפחות."
+
+#: core/validators.py:464
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "יש לוודא שהקובץ שהעלת הוא בגודל %s בתים לכל היותר."
+
+#: core/validators.py:481
+msgid "The format for this field is wrong."
+msgstr "מבנה תוכן שדה זה שגוי."
+
+#: core/validators.py:496
+msgid "This field is invalid."
+msgstr "שדה זה אינו חוקי."
+
+#: core/validators.py:532
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "לא ניתן לאחזר כלום מ %s."
+
+#: core/validators.py:535
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "ה-URL·%(url)s·החזיר כותרת·Content-Type·לא חוקית·'%(contenttype)s'."
+
+#: core/validators.py:568
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr "נא לסגור את תג·%(tag)s·בשורה·%(line)s.·(השורה מתחילה ב·\"%(start)s\".)"
+
+#: core/validators.py:572
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"חלק מהטקסט בשורה·%(line)s·אסור בהקשר זה.·(השורה·מתחילה ב·\"%(start)s\".)"
+
+#: core/validators.py:577
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"%(attr)s\"·בשורה·%(line)s·אינה תכונה חוקית.·(השורה מתחילה ב·\"%(start)s\".)"
+
+#: core/validators.py:582
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\"·בשורה·%(line)s·אינו תג חוקי.·(השורה מתחילה ב·\"%(start)s\".)"
+
+#: core/validators.py:586
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"לתג בשורה %(line)s חסרה תכונה אחת או יותר נדרשות. (השורה מתחילה ב-\"%(start)s"
+"\".)"
+
+#: core/validators.py:591
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"לתכונה·\"%(attr)s\"·בשורה·%(line)s·יש ערך לא חוקי.·(השורה·מתחילה ב·\"%(start)"
+"s\".)"
+
+#: db/models/manipulators.py:304
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(object)s עם %(type)s קיים כבר עבור %(field)s נתון."
+
+#: db/models/fields/__init__.py:46
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s·עם·%(fieldname)s·זה קיימת כבר."
+
+#: db/models/fields/__init__.py:320 db/models/fields/files.py:168
+#: db/models/fields/files.py:179 forms/fields.py:52 oldforms/__init__.py:370
+msgid "This field is required."
+msgstr "יש להזין תוכן בשדה זה."
+
+#: db/models/fields/__init__.py:434
+msgid "This value must be an integer."
+msgstr "ערך זה חייב להיות מספר שלם."
+
+#: db/models/fields/__init__.py:480
+msgid "This value must be either True or False."
+msgstr "ערך זה חייב להיות אמת או שקר."
+
+#: db/models/fields/__init__.py:509
+msgid "This field cannot be null."
+msgstr "שדה זה אינו יכול להכיל null."
+
+#: db/models/fields/__init__.py:611 db/models/fields/__init__.py:628
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format."
+msgstr "נא להזין תאריך/שעה חוקיים בתחביר YYYY-MM-DD HH:MM[:ss[.uuuuuu]]."
+
+#: db/models/fields/__init__.py:684
+msgid "This value must be a decimal number."
+msgstr "ערך זה חייב להיות מספר עשרוני."
+
+#: db/models/fields/__init__.py:825
+msgid "This value must be either None, True or False."
+msgstr "ערך זה חייב להיות כלום, אמת או שקר."
+
+#: db/models/fields/__init__.py:937 db/models/fields/__init__.py:950
+msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format."
+msgstr "נא להזין זמן חוקי בתחביר HH:MM[:ss[.uuuuuu]]."
+
+#: db/models/fields/files.py:188
+msgid "Enter a valid filename."
+msgstr "יש להזין שם קובץ חוקי."
+
+#: db/models/fields/related.py:92
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "יש להזין %s חוקי."
+
+#: db/models/fields/related.py:786
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"יש להחזיק את \"Control\", או \"Command\" על מק, לחוץ כדי לבחור יותר מאחד."
+
+#: db/models/fields/related.py:866
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "נא להזין מזהה %(self)s חוקי. הערך %(value)r אינו חוקי."
+msgstr[1] "נא להזין מזהי %(self)s חוקיים. הערכים %(value)r אינם חוקיים."
+
+#: forms/fields.py:53
+msgid "Enter a valid value."
+msgstr "יש להזין ערך חוקי."
+
+#: forms/fields.py:133
+#, python-format
+msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+msgstr "נא לוודא שערך זה מכיל  %(max)d תווים לכל היותר (מכיל %(length)d)."
+
+#: forms/fields.py:134
+#, python-format
+msgid "Ensure this value has at least %(min)d characters (it has %(length)d)."
+msgstr "נא לוודא שערך זה מכיל לפחות %(min)d תווים (מכיל %(length)d)."
+
+#: forms/fields.py:162 forms/fields.py:191 forms/fields.py:220
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "יש לוודא שערך זה פחות מ או שווה ל %s."
+
+#: forms/fields.py:163 forms/fields.py:192 forms/fields.py:221
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "יש לוודא שהערך גדול מ או שווה ל %s."
+
+#: forms/fields.py:190 forms/fields.py:219
+msgid "Enter a number."
+msgstr "נא להזין מספר."
+
+#: forms/fields.py:222
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr "נא לוודא שאין יותר מ-%s ספרות סה\"כ"
+
+#: forms/fields.py:223
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr "נא לוודא שאין יותר מ-%s ספרות אחרי הנקודה"
+
+#: forms/fields.py:224
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr "נא לוודא שאין יותר מ-%s ספרות לפני הנקודה העשרונית"
+
+#: forms/fields.py:282 forms/fields.py:803
+msgid "Enter a valid date."
+msgstr "יש להזין תאריך חוקי."
+
+#: forms/fields.py:315 forms/fields.py:804
+msgid "Enter a valid time."
+msgstr "יש להזין שעה חוקית."
+
+#: forms/fields.py:354
+msgid "Enter a valid date/time."
+msgstr "יש להזין תאריך ושעה חוקיים."
+
+#: forms/fields.py:441
+msgid "No file was submitted."
+msgstr "לא נשלח שום קובץ"
+
+#: forms/fields.py:442 oldforms/__init__.py:689
+msgid "The submitted file is empty."
+msgstr "הקובץ שנשלח ריק."
+
+#: forms/fields.py:532
+msgid "Enter a valid URL."
+msgstr "יש להזין URL חוקי."
+
+#: forms/fields.py:533
+msgid "This URL appears to be a broken link."
+msgstr "ה-URL הזה נראה כקישור שבור."
+
+#: forms/fields.py:601 forms/fields.py:652
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "יש לבחור אפשרות חוקית. %(value)s אינו בין האפשרויות הזמינות."
+
+#: forms/fields.py:653 forms/fields.py:714 forms/models.py:528
+msgid "Enter a list of values."
+msgstr "יש להזין רשימת ערכים"
+
+#: forms/fields.py:832
+msgid "Enter a valid IPv4 address."
+msgstr "יש להזין כתובת IPv4 חוקית."
+
+#: forms/models.py:461
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "יש לבחור אפשרות חוקית; '%(data)s' אינו בין %(choices)s."
+
+#: forms/models.py:529
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "יש לבחור אפשרות חוקית. %s אינו בין האפשרויות הזמינות."
+
+#: oldforms/__init__.py:405
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "נא לוודא שהטקסט שלך מכיל פחות מ %s תו."
+msgstr[1] "נא לוודא שהטקסט שלך מכיל פחות מ %s תווים."
+
+#: oldforms/__init__.py:410
+msgid "Line breaks are not allowed here."
+msgstr "מעברי שורה אסורים כאן."
+
+#: oldforms/__init__.py:508 oldforms/__init__.py:582 oldforms/__init__.py:621
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "יש לבחור אפשרות חוקית; '%(data)s' אינו בין %(choices)s."
+
+#: oldforms/__init__.py:750
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "יש להזין מספר שלם בין ‎-32,768 ל- 32,767."
+
+#: oldforms/__init__.py:760
+msgid "Enter a positive number."
+msgstr "יש להזין מספר חיובי."
+
+#: oldforms/__init__.py:770
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "יש להזין מספר שלם בין 0 ל- 32,767."
+
+#: template/defaultfilters.py:698
+msgid "yes,no,maybe"
+msgstr "כן,לא,אולי"
+
+#: template/defaultfilters.py:729
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d בית"
+msgstr[1] "%(size)d בתים"
+
+#: template/defaultfilters.py:731
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f KB"
+
+#: template/defaultfilters.py:733
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: template/defaultfilters.py:734
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#: utils/dateformat.py:41
+msgid "p.m."
+msgstr "אחר הצהריים"
+
+#: utils/dateformat.py:42
+msgid "a.m."
+msgstr "בבוקר"
+
+#: utils/dateformat.py:47
+msgid "PM"
+msgstr "אחר הצהריים"
+
+#: utils/dateformat.py:48
+msgid "AM"
+msgstr "בבוקר"
+
+#: utils/dateformat.py:97
+msgid "midnight"
+msgstr "חצות"
+
+#: utils/dateformat.py:99
+msgid "noon"
+msgstr "צהריים"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "שני"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "שלישי"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "רביעי"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "חמישי"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "שישי"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "שבת"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "ראשון"
+
+#: utils/dates.py:10
+msgid "Mon"
+msgstr "שני"
+
+#: utils/dates.py:10
+msgid "Tue"
+msgstr "שלישי"
+
+#: utils/dates.py:10
+msgid "Wed"
+msgstr "רביעי"
+
+#: utils/dates.py:10
+msgid "Thu"
+msgstr "חמישי"
+
+#: utils/dates.py:10
+msgid "Fri"
+msgstr "שישי"
+
+#: utils/dates.py:11
+msgid "Sat"
+msgstr "שבת"
+
+#: utils/dates.py:11
+msgid "Sun"
+msgstr "ראשון"
+
+#: utils/dates.py:18
+msgid "January"
+msgstr "ינואר"
+
+#: utils/dates.py:18
+msgid "February"
+msgstr "פברואר"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "March"
+msgstr "מרס"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "April"
+msgstr "אפריל"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "May"
+msgstr "מאי"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "June"
+msgstr "יוני"
+
+#: utils/dates.py:19 utils/dates.py:31
+msgid "July"
+msgstr "יולי"
+
+#: utils/dates.py:19
+msgid "August"
+msgstr "אוגוסט"
+
+#: utils/dates.py:19
+msgid "September"
+msgstr "ספטמבר"
+
+#: utils/dates.py:19
+msgid "October"
+msgstr "אוקטובר"
+
+#: utils/dates.py:19
+msgid "November"
+msgstr "נובמבר"
+
+#: utils/dates.py:20
+msgid "December"
+msgstr "דצמבר"
+
+#: utils/dates.py:23
+msgid "jan"
+msgstr "ינו"
+
+#: utils/dates.py:23
+msgid "feb"
+msgstr "פבר"
+
+#: utils/dates.py:23
+msgid "mar"
+msgstr "מרס"
+
+#: utils/dates.py:23
+msgid "apr"
+msgstr "אפר"
+
+#: utils/dates.py:23
+msgid "may"
+msgstr "מאי"
+
+#: utils/dates.py:23
+msgid "jun"
+msgstr "יונ"
+
+#: utils/dates.py:24
+msgid "jul"
+msgstr "יול"
+
+#: utils/dates.py:24
+msgid "aug"
+msgstr "אוג"
+
+#: utils/dates.py:24
+msgid "sep"
+msgstr "ספט"
+
+#: utils/dates.py:24
+msgid "oct"
+msgstr "אוק"
+
+#: utils/dates.py:24
+msgid "nov"
+msgstr "נוב"
+
+#: utils/dates.py:24
+msgid "dec"
+msgstr "דצמ"
+
+#: utils/dates.py:31
+msgid "Jan."
+msgstr "ינו'"
+
+#: utils/dates.py:31
+msgid "Feb."
+msgstr "פבר'"
+
+#: utils/dates.py:32
+msgid "Aug."
+msgstr "אוג'"
+
+#: utils/dates.py:32
+msgid "Sept."
+msgstr "ספט'"
+
+#: utils/dates.py:32
+msgid "Oct."
+msgstr "אוק'"
+
+#: utils/dates.py:32
+msgid "Nov."
+msgstr "נוב'"
+
+#: utils/dates.py:32
+msgid "Dec."
+msgstr "דצמ'"
+
+#: utils/text.py:128
+msgid "or"
+msgstr "או"
+
+#: utils/timesince.py:21
+msgid "year"
+msgid_plural "years"
+msgstr[0] "שנה"
+msgstr[1] "שנים"
+
+#: utils/timesince.py:22
+msgid "month"
+msgid_plural "months"
+msgstr[0] "חודש"
+msgstr[1] "חודשים"
+
+#: utils/timesince.py:23
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "שבוע"
+msgstr[1] "שבועות"
+
+#: utils/timesince.py:24
+msgid "day"
+msgid_plural "days"
+msgstr[0] "יום"
+msgstr[1] "ימים"
+
+#: utils/timesince.py:25
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "שעה"
+msgstr[1] "שעות"
+
+#: utils/timesince.py:26
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "דקה"
+msgstr[1] "דקות"
+
+#: utils/timesince.py:46
+msgid "minutes"
+msgstr "דקות"
+
+#: utils/timesince.py:51
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr "%(number)d %(type)s"
+
+#: utils/timesince.py:57
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ", %(number)d %(type)s"
+
+#: utils/translation/trans_real.py:401
+msgid "DATE_FORMAT"
+msgstr "d.m.Y"
+
+#: utils/translation/trans_real.py:402
+msgid "DATETIME_FORMAT"
+msgstr "d.m.‏Y H:i:s"
+
+#: utils/translation/trans_real.py:403
+msgid "TIME_FORMAT"
+msgstr "H:i:s"
+
+#: utils/translation/trans_real.py:419
+msgid "YEAR_MONTH_FORMAT"
+msgstr "d.m.Y"
+
+#: utils/translation/trans_real.py:420
+msgid "MONTH_DAY_FORMAT"
+msgstr "d.m.Y"
+
+#: views/generic/create_update.py:114
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "ה-%(verbose_name)s  נוצר בהצלחה."
+
+#: views/generic/create_update.py:156
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "ה-%(verbose_name)s עודכן בהצלחה."
+
+#: views/generic/create_update.py:198
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "ה-%(verbose_name)s נמחק."
+
+#~ msgid "Ordering"
+#~ msgstr "מיון"
+
+#~ msgid "Order:"
+#~ msgstr "מיון:"
+
+#~ msgid "Your new password is: %(new_password)s"
+#~ msgstr "סיסמתך החדשה: %(new_password)s"
+
+#~ msgid "Feel free to change this password by going to this page:"
+#~ msgstr "ניתן לשנות את הסיסמה בכל עת ע\"י פניה לדף זה:"
+
+#~ msgid "Added %s."
+#~ msgstr "%s התווסף."
+
+#~ msgid "Deleted %s."
+#~ msgstr "%s נמחק."
+
+#~ msgid "The two 'new password' fields didn't match."
+#~ msgstr "שני שדות 'הסיסמה החדשה' אינם זהים."
+
+#~ msgid "Year must be 1900 or later."
+#~ msgstr "שנה צריכה להיות 1900 ומעלה."
+
+#~ msgid "Separate multiple IDs with commas."
+#~ msgstr "יש להפריד מזהים מרובים בפסיקים."
diff --git a/webapp/django/conf/locale/he/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/he/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..9448068
--- /dev/null
+++ b/webapp/django/conf/locale/he/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/he/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/he/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..cc68885
--- /dev/null
+++ b/webapp/django/conf/locale/he/LC_MESSAGES/djangojs.po
@@ -0,0 +1,120 @@
+# Hebrew translation of djangojs.
+# Copyright (C) 2006 THE djangojs'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the djangojs package.
+# Meir Kriheli <meir@mksoft.co.il>, 2006.
+# 
+# 
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-05-06 13:08+0300\n"
+"PO-Revision-Date: 2007-05-06 13:08+0300\n"
+"Last-Translator: Meir Kriheli <meir@mksoft.co.il>\n"
+"Language-Team: Hebrew\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "%s זמינות"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "בחירת הכל"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "הוספה"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "הסרה"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "%s נבחרות"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "יש לסמן את ההרשאות המבוקשות וללחוץ על "
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "איפוס הכל"
+
+#: contrib/admin/media/js/calendar.js:24
+#: contrib/admin/media/js/dateparse.js:32
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"ינואר פברואר מרץ אפריל מאי יוני יולי אוגוסט ספטמבר אוקטובר נובמבר דצמבר"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "ר ש ש ר ח ש ש"
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "ראשון שני שלישי רביעי חמישי שישי שבת"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr "הצג"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr "הסתר"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Now"
+msgstr "כעת"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
+msgid "Clock"
+msgstr "שעון"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
+msgid "Choose a time"
+msgstr "בחירת שעה"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "Midnight"
+msgstr "חצות"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "6 a.m."
+msgstr "6 בבוקר"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
+msgid "Noon"
+msgstr "צהריים"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
+msgid "Cancel"
+msgstr "ביטול"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
+msgid "Today"
+msgstr "היום"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
+msgid "Calendar"
+msgstr "לוח שנה"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
+msgid "Yesterday"
+msgstr "אתמול"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
+msgid "Tomorrow"
+msgstr "מחר"
+
diff --git a/webapp/django/conf/locale/hr/LC_MESSAGES/django.mo b/webapp/django/conf/locale/hr/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..0326a71
--- /dev/null
+++ b/webapp/django/conf/locale/hr/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/hr/LC_MESSAGES/django.po b/webapp/django/conf/locale/hr/LC_MESSAGES/django.po
new file mode 100644
index 0000000..cfdcf6f
--- /dev/null
+++ b/webapp/django/conf/locale/hr/LC_MESSAGES/django.po
@@ -0,0 +1,4320 @@
+# translation of django.po to Hrvatski jezik
+# This file is distributed under the same license as the Django package.
+#
+# Aljosa Mohorovic <aljosa.mohorovic@gmail.com>, 2008.
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-01-06 16:24+0100\n"
+"PO-Revision-Date: 2008-06-17 23:25+0100\n"
+"Last-Translator: Aljosa Mohorovic <aljosa.mohorovic@gmail.com>\n"
+"Language-Team: Hrvatski jezik\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms:  nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "Arapski"
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "Bengalski"
+
+#: conf/global_settings.py:41
+msgid "Bulgarian"
+msgstr "Bugarski"
+
+#: conf/global_settings.py:42
+msgid "Catalan"
+msgstr "Katalanski"
+
+#: conf/global_settings.py:43
+msgid "Czech"
+msgstr "Češki"
+
+#: conf/global_settings.py:44
+msgid "Welsh"
+msgstr "Velški"
+
+#: conf/global_settings.py:45
+msgid "Danish"
+msgstr "Danski"
+
+#: conf/global_settings.py:46
+msgid "German"
+msgstr "Njemački"
+
+#: conf/global_settings.py:47
+msgid "Greek"
+msgstr "Grčki"
+
+#: conf/global_settings.py:48
+msgid "English"
+msgstr "Engleski"
+
+#: conf/global_settings.py:49
+msgid "Spanish"
+msgstr "Španjolski"
+
+#: conf/global_settings.py:50
+msgid "Argentinean Spanish"
+msgstr "Argentinski španjolski"
+
+#: conf/global_settings.py:51
+msgid "Persian"
+msgstr "Perzijski"
+
+#: conf/global_settings.py:52
+msgid "Finnish"
+msgstr "Finski"
+
+#: conf/global_settings.py:53
+msgid "French"
+msgstr "Francuski"
+
+#: conf/global_settings.py:54
+msgid "Gaeilge"
+msgstr "Gaeilge"
+
+#: conf/global_settings.py:55
+msgid "Galician"
+msgstr "Galski"
+
+#: conf/global_settings.py:56
+msgid "Hungarian"
+msgstr "Mađarski"
+
+#: conf/global_settings.py:57
+msgid "Hebrew"
+msgstr "Hebrejski"
+
+#: conf/global_settings.py:58
+msgid "Croatian"
+msgstr "Hrvatski"
+
+#: conf/global_settings.py:59
+msgid "Icelandic"
+msgstr "Islandski"
+
+#: conf/global_settings.py:60
+msgid "Italian"
+msgstr "Talijanski"
+
+#: conf/global_settings.py:61
+msgid "Japanese"
+msgstr "Japanski"
+
+#: conf/global_settings.py:62
+msgid "Korean"
+msgstr "Koreanski"
+
+#: conf/global_settings.py:63
+msgid "Khmer"
+msgstr "Kambođanski"
+
+#: conf/global_settings.py:64
+msgid "Kannada"
+msgstr "Kannada"
+
+#: conf/global_settings.py:65
+msgid "Latvian"
+msgstr "Letonski"
+
+#: conf/global_settings.py:66
+msgid "Macedonian"
+msgstr "Makedonski"
+
+#: conf/global_settings.py:67
+msgid "Dutch"
+msgstr "Nizozemski"
+
+#: conf/global_settings.py:68
+msgid "Norwegian"
+msgstr "Norveški"
+
+#: conf/global_settings.py:69
+msgid "Polish"
+msgstr "Poljski"
+
+#: conf/global_settings.py:70
+msgid "Portugese"
+msgstr "Portugalski"
+
+#: conf/global_settings.py:71
+msgid "Brazilian"
+msgstr "Brazilski"
+
+#: conf/global_settings.py:72
+msgid "Romanian"
+msgstr "Rumunjski"
+
+#: conf/global_settings.py:73
+msgid "Russian"
+msgstr "Ruski"
+
+#: conf/global_settings.py:74
+msgid "Slovak"
+msgstr "Slovački"
+
+#: conf/global_settings.py:75
+msgid "Slovenian"
+msgstr "Slovenski"
+
+#: conf/global_settings.py:76
+msgid "Serbian"
+msgstr "Srpski"
+
+#: conf/global_settings.py:77
+msgid "Swedish"
+msgstr "Švedski"
+
+#: conf/global_settings.py:78
+msgid "Tamil"
+msgstr "Tamilski"
+
+#: conf/global_settings.py:79
+msgid "Telugu"
+msgstr "Telugu"
+
+#: conf/global_settings.py:80
+msgid "Turkish"
+msgstr "Turski"
+
+#: conf/global_settings.py:81
+msgid "Ukrainian"
+msgstr "Ukrajinski"
+
+#: conf/global_settings.py:82
+msgid "Simplified Chinese"
+msgstr "Pojednostavljeni kineski"
+
+#: conf/global_settings.py:83
+msgid "Traditional Chinese"
+msgstr "Tradicionalni kineski"
+
+#: contrib/admin/filterspecs.py:44
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Po %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:74 contrib/admin/filterspecs.py:92
+#: contrib/admin/filterspecs.py:147 contrib/admin/filterspecs.py:173
+msgid "All"
+msgstr "Svi"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Any date"
+msgstr "Bilo koji datum"
+
+#: contrib/admin/filterspecs.py:114
+msgid "Today"
+msgstr "Danas"
+
+#: contrib/admin/filterspecs.py:117
+msgid "Past 7 days"
+msgstr "Prošlih 7 dana"
+
+#: contrib/admin/filterspecs.py:119
+msgid "This month"
+msgstr "Ovaj mjesec"
+
+#: contrib/admin/filterspecs.py:121
+msgid "This year"
+msgstr "Ova godina"
+
+#: contrib/admin/filterspecs.py:147 newforms/widgets.py:231
+#: oldforms/__init__.py:592
+msgid "Yes"
+msgstr "Da"
+
+#: contrib/admin/filterspecs.py:147 newforms/widgets.py:231
+#: oldforms/__init__.py:592
+msgid "No"
+msgstr "Ne"
+
+#: contrib/admin/filterspecs.py:154 newforms/widgets.py:231
+#: oldforms/__init__.py:592
+msgid "Unknown"
+msgstr "Nepoznat pojam"
+
+#: contrib/admin/models.py:18
+msgid "action time"
+msgstr "vrijeme akcije"
+
+#: contrib/admin/models.py:21
+msgid "object id"
+msgstr "id objekta"
+
+#: contrib/admin/models.py:22
+msgid "object repr"
+msgstr "object repr"
+
+#: contrib/admin/models.py:23
+msgid "action flag"
+msgstr "action flag"
+
+#: contrib/admin/models.py:24
+msgid "change message"
+msgstr "promijeni poruku"
+
+#: contrib/admin/models.py:27
+msgid "log entry"
+msgstr "log entry"
+
+#: contrib/admin/models.py:28
+msgid "log entries"
+msgstr "log entries"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Stranica nije pronađena"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Ispričavamo se, ali tražena stranica nije pronađena."
+
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:37
+#: contrib/admin/templates/admin/change_form.html:12
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/delete_confirmation.html:5
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:4
+#: contrib/admin/templates/admin/auth/user/change_password.html:11
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+msgid "Home"
+msgstr "Doma"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Serverska pogreška"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Serverska pogreška (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Serverska pogreška <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr "Dogodila se pogreška. Administratori su obaviješteni putem e-maila te bi pogreška uskoro trebala biti ispravljena. Hvala na strpljenju."
+
+#: contrib/admin/templates/admin/base.html:26
+msgid "Welcome,"
+msgstr "Dobrodošli,"
+
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Dokumentacija"
+
+#: contrib/admin/templates/admin/base.html:29
+#: contrib/admin/templates/admin/auth/user/change_password.html:14
+#: contrib/admin/templates/admin/auth/user/change_password.html:45
+msgid "Change password"
+msgstr "Promijeni lozinku"
+
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/comments/templates/comments/form.html:6
+msgid "Log out"
+msgstr "Odjava"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django administracija stranica"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django administracija"
+
+#: contrib/admin/templates/admin/change_form.html:14
+#: contrib/admin/templates/admin/index.html:28
+msgid "Add"
+msgstr "Dodaj"
+
+#: contrib/admin/templates/admin/change_form.html:20
+#: contrib/admin/templates/admin/object_history.html:4
+msgid "History"
+msgstr "Povijest"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "Pogledaj na stranicama"
+
+#: contrib/admin/templates/admin/change_form.html:31
+#: contrib/admin/templates/admin/auth/user/change_password.html:23
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Molim ispravite navedenu pogrešku."
+msgstr[1] "Molim ispravite navedene pogreške."
+
+#: contrib/admin/templates/admin/change_form.html:49
+msgid "Ordering"
+msgstr "Redoslijed"
+
+#: contrib/admin/templates/admin/change_form.html:52
+msgid "Order:"
+msgstr "Redoslijed:"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "Dodaj %(name)s"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:8
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Izbriši"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:13
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Brisanje %(object_name)s '%(escaped_object)s' rezultiralo bi brisanjem "
+"povezanih objekta, ali vi nemate privilegije za brisanje navedenih objekta: "
+
+#: contrib/admin/templates/admin/delete_confirmation.html:20
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Jeste li sigurni da želite izbrisati %(object_name)s \"%(escaped_object)s\"? "
+"Svi navedeni objekti biti će izbrisani:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:25
+msgid "Yes, I'm sure"
+msgstr "Da, siguran sam"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "Po %(filter_title)s "
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "Filter"
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Modeli dostupni u %(name)s aplikaciji."
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Promijeni"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Nemate privilegije za promjenu podataka."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Nedavne promjene"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Moje promjene"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Nije dostupno"
+
+#: contrib/admin/templates/admin/invalid_setup.html:8
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Nešto je pogrešno sa instalacijom/postavkama baze. Provjerite jesu li "
+"potrebne tablice u bazi kreirane i provjerite je li baza dostupna korisniku."
+
+#: contrib/admin/templates/admin/login.html:17
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+msgid "Username:"
+msgstr "Korisničko ime:"
+
+#: contrib/admin/templates/admin/login.html:20
+#: contrib/comments/templates/comments/form.html:8
+msgid "Password:"
+msgstr "Lozinka:"
+
+#: contrib/admin/templates/admin/login.html:25
+#: contrib/admin/views/decorators.py:25
+msgid "Log in"
+msgstr "Prijavi se"
+
+#: contrib/admin/templates/admin/object_history.html:17
+msgid "Date/time"
+msgstr "Datum/vrijeme"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "User"
+msgstr "Korisnik"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "Action"
+msgstr "Akcija"
+
+#: contrib/admin/templates/admin/object_history.html:25
+msgid "DATE_WITH_TIME_FULL"
+msgstr "DATE_WITH_TIME_FULL"
+
+#: contrib/admin/templates/admin/object_history.html:35
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Ovaj objekt nema povijest promjena. Moguće je da nije dodan korištenjem ove "
+"administracije."
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Prikaži sve"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Idi"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 rezultat"
+msgstr[1] "%(counter)s rezultata"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s ukupno"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Spremi kao novi unos"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Spremi i dodaj novi unos"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Spremi i nastavi uređivati"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Spremi"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Prvo, unesi korisničko ime i lozinku. Onda možete promijeniti više postavki "
+"korisnika."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "Korisničko ime"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+#: contrib/admin/templates/admin/auth/user/change_password.html:33
+msgid "Password"
+msgstr "Lozinka"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+#: contrib/admin/templates/admin/auth/user/change_password.html:38
+msgid "Password (again)"
+msgstr "Lozinka (unesi ponovo)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+msgid "Enter the same password as above, for verification."
+msgstr "Unesi istu lozinku, za potvrdu."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:27
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Unesi novu lozinku za korisnika <strong>%(username)s</strong>."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Bookmarklets"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+msgid "Documentation bookmarklets"
+msgstr "Dokumentacija bookmarklets-a"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:8
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">Da bi instalirali bookmarklet, povucite link na svoj bookmarks\n"
+"toolbar, ili desnim klikom na link dodajte u svoje bookmarke. Sada možete\n"
+"selektirati bookmarklet sa bilo koje stranice. Zapamtite da neki bookmarkleti\n"
+"zahtjevaju da gledate stranice sa računala označenog\n"
+"kao \"internal\" (razgovarajte sa svojim sistem administratorom ako niste sigurni\n"
+"je li vaše računalo \"internal\").</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:18
+msgid "Documentation for this page"
+msgstr "Dokumentacija za ovu stranicu"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+"Preusmjeri te sa bilo koje stranice na dokumentaciju za taj prikaz (view) "
+"koji generira stranicu."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:21
+msgid "Show object ID"
+msgstr "Prikaži ID objekta"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Prikazuje tip sadržaja (content-type) i jedinstveni ID za stranice koje predstavljaju "
+"pojedinačan objekt."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:24
+msgid "Edit this object (current window)"
+msgstr "Uredi objekt (u trenutnom prozoru)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "Preusmjeri na admin stranicu za stranice koje predstavljaju pojedinačan objekt."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:27
+msgid "Edit this object (new window)"
+msgstr "Uredi objekt (u novom prozoru)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "As above, but opens the admin page in a new window."
+msgstr "Isto kao prethodno, ali otvara admin stranicu u novom prozoru."
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Hvala što ste proveli malo kvalitetnog vremena na stranicama danas."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Prijavite se ponovo"
+
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_form.html:5
+#: contrib/admin/templates/registration/password_change_form.html:9
+msgid "Password change"
+msgstr "Promjena lozinke"
+
+#: contrib/admin/templates/registration/password_change_done.html:5
+#: contrib/admin/templates/registration/password_change_done.html:9
+msgid "Password change successful"
+msgstr "Promjena lozinke uspješna"
+
+#: contrib/admin/templates/registration/password_change_done.html:11
+msgid "Your password was changed."
+msgstr "Vaša lozinka je promijenjena."
+
+#: contrib/admin/templates/registration/password_change_form.html:11
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Molim unesite staru lozinku, zbog sigurnosti, i onda unesite novu lozinku "
+"dvaput da bi mogli provjeriti jeste li ispravno unesli."
+
+#: contrib/admin/templates/registration/password_change_form.html:16
+msgid "Old password:"
+msgstr "Stara lozinka:"
+
+#: contrib/admin/templates/registration/password_change_form.html:18
+msgid "New password:"
+msgstr "Nova lozinka:"
+
+#: contrib/admin/templates/registration/password_change_form.html:20
+msgid "Confirm password:"
+msgstr "Potvrdi lozinku:"
+
+#: contrib/admin/templates/registration/password_change_form.html:22
+msgid "Change my password"
+msgstr "Promijeni moju lozinku"
+
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+msgid "Password reset"
+msgstr "Resetiranje lozinke"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Resetiranje lozinke uspješno"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"Poslali smo novu lozinku na e-mail adresu koju ste unijeli. Trebali bi je "
+"uskoro primiti."
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Dobili ste ovaj e-mail jer ste zatražili resetiranje lozinke"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "za vaš korisnički račun na %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Vaša nova lozinka je: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Slobodno promijenite lozinku odlaskom na ovu stranicu:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Vaše korisničko ime, u slučaju da ste zaboravili:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Hvala šta koristite naše stranice!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s tim"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"Zaboravili ste lozinku? Unesite vašu e-mail adresu ispod i onda ćemo "
+"resetirati vašu lozinku i poslati novu na vaš e-mail."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "E-mail adresa:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Resetiraj moju lozinku"
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Datum:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Vrijeme:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Trenutno:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Promijeni:"
+
+#: contrib/admin/templatetags/admin_list.py:257
+msgid "All dates"
+msgstr "Svi datumi"
+
+#: contrib/admin/views/auth.py:20 contrib/admin/views/main.py:267
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" uspješno je dodano."
+
+#: contrib/admin/views/auth.py:25 contrib/admin/views/main.py:271
+#: contrib/admin/views/main.py:356
+msgid "You may edit it again below."
+msgstr "Možete ponovo urediti unos dolje."
+
+#: contrib/admin/views/auth.py:31
+msgid "Add user"
+msgstr "Dodaj korisnika"
+
+#: contrib/admin/views/auth.py:58
+msgid "Password changed successfully."
+msgstr "Lozinka uspješno promijenjena."
+
+#: contrib/admin/views/auth.py:65
+#, python-format
+msgid "Change password: %s"
+msgstr "Promijeni lozinku: %s"
+
+#: contrib/admin/views/decorators.py:11 contrib/auth/forms.py:60
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Molim unesite ispravno korisničko ime i lozinku. Uzmite u obzir da oba polja "
+"razlikuju velika/mala slova."
+
+#: contrib/admin/views/decorators.py:63
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Molim prijavite se ponovo jer je vaš session istekao. Nemojte brinuti, vaš "
+"unos je sačuvan."
+
+#: contrib/admin/views/decorators.py:70
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Izgleda da vaš browser nije podešen da prihvaća kolačiće (cookies). Molim "
+"promijenite postavke, ponovno učitajte stranicu i pokušajte ponovo."
+
+#: contrib/admin/views/decorators.py:84
+msgid "Usernames cannot contain the '@' character."
+msgstr "Korisnička imena ne mogu sadržavati '@' znak."
+
+#: contrib/admin/views/decorators.py:86
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "Vaša e-mail adresa nije vaše korisničko ime. Pokušajte sa '%s'"
+
+#: contrib/admin/views/doc.py:48 contrib/admin/views/doc.py:50
+#: contrib/admin/views/doc.py:52
+msgid "tag:"
+msgstr "tag:"
+
+#: contrib/admin/views/doc.py:79 contrib/admin/views/doc.py:81
+#: contrib/admin/views/doc.py:83
+msgid "filter:"
+msgstr "filter:"
+
+#: contrib/admin/views/doc.py:137 contrib/admin/views/doc.py:139
+#: contrib/admin/views/doc.py:141
+msgid "view:"
+msgstr "prikaz:"
+
+#: contrib/admin/views/doc.py:166
+#, python-format
+msgid "App %r not found"
+msgstr "Aplikacija %r nije pronađena"
+
+#: contrib/admin/views/doc.py:173
+#, python-format
+msgid "Model %(name)r not found in app %(label)r"
+msgstr "Model %(name)r nije pronađen u aplikaciji %(label)r"
+
+#: contrib/admin/views/doc.py:185
+#, python-format
+msgid "the related `%(label)s.%(type)s` object"
+msgstr "povezan `%(label)s.%(type)s` objekt"
+
+#: contrib/admin/views/doc.py:185 contrib/admin/views/doc.py:207
+#: contrib/admin/views/doc.py:221 contrib/admin/views/doc.py:226
+msgid "model:"
+msgstr "model:"
+
+#: contrib/admin/views/doc.py:216
+#, python-format
+msgid "related `%(label)s.%(name)s` objects"
+msgstr "povezani `%(label)s.%(name)s` objekti"
+
+#: contrib/admin/views/doc.py:221
+#, python-format
+msgid "all %s"
+msgstr "svi %s"
+
+#: contrib/admin/views/doc.py:226
+#, python-format
+msgid "number of %s"
+msgstr "broj %s"
+
+#: contrib/admin/views/doc.py:231
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Polja na %s objektima"
+
+#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:304
+#: contrib/admin/views/doc.py:306 contrib/admin/views/doc.py:312
+#: contrib/admin/views/doc.py:313 contrib/admin/views/doc.py:315
+msgid "Integer"
+msgstr "Cijeli broj"
+
+#: contrib/admin/views/doc.py:294
+msgid "Boolean (Either True or False)"
+msgstr "Boolean (True ili False)"
+
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:314
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Slova (do %(max_length)s)"
+
+#: contrib/admin/views/doc.py:296
+msgid "Comma-separated integers"
+msgstr "Cijeli brojevi odvojeni zarezom"
+
+#: contrib/admin/views/doc.py:297
+msgid "Date (without time)"
+msgstr "Datum (bez vremena/sati)"
+
+#: contrib/admin/views/doc.py:298
+msgid "Date (with time)"
+msgstr "Datum (sa vremenom/satima)"
+
+#: contrib/admin/views/doc.py:299
+msgid "Decimal number"
+msgstr "Decimalni broj"
+
+#: contrib/admin/views/doc.py:300
+msgid "E-mail address"
+msgstr "E-mail adresa"
+
+#: contrib/admin/views/doc.py:301 contrib/admin/views/doc.py:302
+#: contrib/admin/views/doc.py:305
+msgid "File path"
+msgstr "Put do datoteke"
+
+#: contrib/admin/views/doc.py:303
+msgid "Floating point number"
+msgstr "Broj s pomičnim zarezom (floating point number)"
+
+#: contrib/admin/views/doc.py:307 contrib/comments/models.py:85
+msgid "IP address"
+msgstr "IP adresa"
+
+#: contrib/admin/views/doc.py:309
+msgid "Boolean (Either True, False or None)"
+msgstr "Boolean (True, False ili None)"
+
+#: contrib/admin/views/doc.py:310
+msgid "Relation to parent model"
+msgstr "Relacija na roditeljski model (parent model)"
+
+#: contrib/admin/views/doc.py:311
+msgid "Phone number"
+msgstr "Telefonski broj"
+
+#: contrib/admin/views/doc.py:316
+msgid "Text"
+msgstr "Tekst"
+
+#: contrib/admin/views/doc.py:317
+msgid "Time"
+msgstr "Vrijeme"
+
+#: contrib/admin/views/doc.py:318 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:319
+msgid "U.S. state (two uppercase letters)"
+msgstr "Država S.A.D.-a (dva velika slova)"
+
+#: contrib/admin/views/doc.py:320
+msgid "XML text"
+msgstr "XML tekst"
+
+#: contrib/admin/views/doc.py:346
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "izgleda da %s nije urlpattern objekt"
+
+#: contrib/admin/views/main.py:233
+msgid "Site administration"
+msgstr "Administracija stranica"
+
+#: contrib/admin/views/main.py:280 contrib/admin/views/main.py:365
+#, python-format
+msgid "You may add another %s below."
+msgstr "Možete dodati još jedan %s ispod."
+
+#: contrib/admin/views/main.py:298
+#, python-format
+msgid "Add %s"
+msgstr "Dodaj %s"
+
+#: contrib/admin/views/main.py:344
+#, python-format
+msgid "Added %s."
+msgstr "Dodano %s"
+
+#: contrib/admin/views/main.py:344 contrib/admin/views/main.py:346
+#: contrib/admin/views/main.py:348 core/validators.py:283
+#: db/models/manipulators.py:309
+msgid "and"
+msgstr "i"
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "Changed %s."
+msgstr "Promijenjeno %s."
+
+#: contrib/admin/views/main.py:348
+#, python-format
+msgid "Deleted %s."
+msgstr "Izbrisano %s."
+
+#: contrib/admin/views/main.py:351
+msgid "No fields changed."
+msgstr "Nije bilo promjena polja."
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" uspješno promijenjeno."
+
+#: contrib/admin/views/main.py:362
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" uspješno dodan. Možete ponovo urediti dolje."
+
+#: contrib/admin/views/main.py:400
+#, python-format
+msgid "Change %s"
+msgstr "Promijeni %s"
+
+#: contrib/admin/views/main.py:487
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Jedan ili više %(fieldname)s u %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:492
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Jedan ili više %(fieldname)s u %(name)s"
+
+#: contrib/admin/views/main.py:524
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" uspješno izbrisan."
+
+#: contrib/admin/views/main.py:527
+msgid "Are you sure?"
+msgstr "Jeste li sigurni?"
+
+#: contrib/admin/views/main.py:549
+#, python-format
+msgid "Change history: %s"
+msgstr "Promijeni povijest: %s"
+
+#: contrib/admin/views/main.py:583
+#, python-format
+msgid "Select %s"
+msgstr "Odaberi %s"
+
+#: contrib/admin/views/main.py:583
+#, python-format
+msgid "Select %s to change"
+msgstr "Odaberi %s za promjenu"
+
+#: contrib/admin/views/main.py:784
+msgid "Database error"
+msgstr "Pogreška u bazi"
+
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr "Dva polja za lozinku nisu jednaka."
+
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr "Korisnik sa navedenim imenom već postoji."
+
+#: contrib/auth/forms.py:53
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"Izgleda da Vaš browser ne podržava kolačiće (cookies). Kolačići su potrebni "
+"da bi se prijavili."
+
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "Ovaj korisnički račun nije aktivan."
+
+#: contrib/auth/forms.py:84
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr ""
+"Za navedenu e-mail adresu ne postoji korisnički račun. Jeste li sigurni da "
+"ste registrirani?"
+
+#: contrib/auth/forms.py:107
+#, python-format
+msgid "Password reset on %s"
+msgstr "Lozinka resetirana na %s"
+
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "Dva polja 'nova lozinka' nisu jednaka."
+
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Vaša stara lozinka je pogrešno unesena. Molim unesite ponovo."
+
+#: contrib/auth/models.py:73 contrib/auth/models.py:93
+msgid "name"
+msgstr "ime"
+
+#: contrib/auth/models.py:75
+msgid "codename"
+msgstr "kodno ime"
+
+#: contrib/auth/models.py:78
+msgid "permission"
+msgstr "privilegija"
+
+#: contrib/auth/models.py:79 contrib/auth/models.py:94
+msgid "permissions"
+msgstr "privilegije"
+
+#: contrib/auth/models.py:97
+msgid "group"
+msgstr "grupa"
+
+#: contrib/auth/models.py:98 contrib/auth/models.py:141
+msgid "groups"
+msgstr "grupe"
+
+#: contrib/auth/models.py:131
+msgid "username"
+msgstr "korisničko ime"
+
+#: contrib/auth/models.py:131
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr "Obavezno 30 alfanumeričkih znakova ili manje (slova, brojevi i povlaka)."
+
+#: contrib/auth/models.py:132
+msgid "first name"
+msgstr "ime"
+
+#: contrib/auth/models.py:133
+msgid "last name"
+msgstr "prezime"
+
+#: contrib/auth/models.py:134
+msgid "e-mail address"
+msgstr "e-mail adresa"
+
+#: contrib/auth/models.py:135
+msgid "password"
+msgstr "lozinka"
+
+#: contrib/auth/models.py:135
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"Koristite '[algo]$[salt]$[hexdigest]' ili <a href=\"password/\">formu za "
+"promjenu lozinke</a>."
+
+#: contrib/auth/models.py:136
+msgid "staff status"
+msgstr "status osoblja"
+
+#: contrib/auth/models.py:136
+msgid "Designates whether the user can log into this admin site."
+msgstr "Određuje može li se korisnik prijaviti na ove stranice administracije."
+
+#: contrib/auth/models.py:137
+msgid "active"
+msgstr "aktivan"
+
+#: contrib/auth/models.py:137
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"Određuje može li se korisnik prijaviti na stranice Django administracije. "
+"Koristite ovu opciju umjesto brisanja korisničkih računa."
+
+#: contrib/auth/models.py:138
+msgid "superuser status"
+msgstr "superuser status"
+
+#: contrib/auth/models.py:138
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr ""
+"Određuje da ovaj korisnik ima sve privilegije te uklanja potrebu da se "
+"privilegije dodaju eksplicitno/ručno."
+
+#: contrib/auth/models.py:139
+msgid "last login"
+msgstr "posljednja prijava"
+
+#: contrib/auth/models.py:140
+msgid "date joined"
+msgstr "datum učlanjenja"
+
+#: contrib/auth/models.py:142
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"Uz ručno dodane privilegije korisnik će također dobiti sve privilegije "
+"odobrene grupama kojima korisnik pripada."
+
+#: contrib/auth/models.py:143
+msgid "user permissions"
+msgstr "privilegije korisnika"
+
+#: contrib/auth/models.py:147
+msgid "user"
+msgstr "korisnik"
+
+#: contrib/auth/models.py:148
+msgid "users"
+msgstr "korisnici"
+
+#: contrib/auth/models.py:154
+msgid "Personal info"
+msgstr "Osobni podaci"
+
+#: contrib/auth/models.py:155
+msgid "Permissions"
+msgstr "Privilegije"
+
+#: contrib/auth/models.py:156
+msgid "Important dates"
+msgstr "Važni datumi"
+
+#: contrib/auth/models.py:157
+msgid "Groups"
+msgstr "Grupe"
+
+#: contrib/auth/models.py:316
+msgid "message"
+msgstr "poruka"
+
+#: contrib/auth/views.py:47
+msgid "Logged out"
+msgstr "Niste logirani"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:169
+msgid "object ID"
+msgstr "ID objekta"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "naslov"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:170
+msgid "comment"
+msgstr "komentar"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "ocjena #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "ocjena #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "ocjena #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "ocjena #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "ocjena #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "ocjena #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "ocjena #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "ocjena #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "ocjena je ispravana"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:172
+msgid "date/time submitted"
+msgstr "datum/vrijeme unosa"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:173
+msgid "is public"
+msgstr "javno dostupno"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "uklonjeno"
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Uključite ako je komentar neprikladan. Umjesto komentara biti će prikazana "
+"poruka \"Komentar je uklonjen.\"."
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "komentari"
+
+#: contrib/comments/models.py:134 contrib/comments/models.py:213
+msgid "Content object"
+msgstr "Objekt sadržaja"
+
+#: contrib/comments/models.py:162
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Napisao %(user)s dana %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:171
+msgid "person's name"
+msgstr "ime osobe"
+
+#: contrib/comments/models.py:174
+msgid "ip address"
+msgstr "ip adresa"
+
+#: contrib/comments/models.py:176
+msgid "approved by staff"
+msgstr "odobreno od strane osoblja"
+
+#: contrib/comments/models.py:179
+msgid "free comment"
+msgstr "slobodan komentar"
+
+#: contrib/comments/models.py:180
+msgid "free comments"
+msgstr "slobodni komentari"
+
+#: contrib/comments/models.py:239
+msgid "score"
+msgstr "rezultat"
+
+#: contrib/comments/models.py:240
+msgid "score date"
+msgstr "datum rezultata"
+
+#: contrib/comments/models.py:243
+msgid "karma score"
+msgstr "karma rezultat"
+
+#: contrib/comments/models.py:244
+msgid "karma scores"
+msgstr "karma rezultati"
+
+#: contrib/comments/models.py:248
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d ocjena po %(user)s"
+
+#: contrib/comments/models.py:264
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Ovaj komentar je označio %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:271
+msgid "flag date"
+msgstr "označeno datuma"
+
+#: contrib/comments/models.py:274
+msgid "user flag"
+msgstr "korisnička oznaka"
+
+#: contrib/comments/models.py:275
+msgid "user flags"
+msgstr "korisničke oznake"
+
+#: contrib/comments/models.py:279
+#, python-format
+msgid "Flag by %r"
+msgstr "Oznaka po %r"
+
+#: contrib/comments/models.py:284
+msgid "deletion date"
+msgstr "datum brisanja"
+
+#: contrib/comments/models.py:286
+msgid "moderator deletion"
+msgstr "brisanje moderatora"
+
+#: contrib/comments/models.py:287
+msgid "moderator deletions"
+msgstr "brisanja moderatora"
+
+#: contrib/comments/models.py:291
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Brisanje moderatora po %r"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Zaboravili ste lozinku?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Ocjene"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Obavezno"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Izborno, nije obavezno"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Pošalji sliku"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Komentar:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Pregled komentara"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Vaše ime:"
+
+#: contrib/comments/views/comments.py:28
+msgid "This rating is required because you've entered at least one other rating."
+msgstr "Ova ocjena je obavezna jer ste bar jednom već ocjenjivali"
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Ovaj komentar je napisao korisnik koji je napisao manje od %(count)s "
+"komentara:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Ovaj komentar je napisao korisnik koji je napisao manje od %(count)s "
+"komentara:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Ovaj komentar je napisao nedorečen korisnik:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:190
+#: contrib/comments/views/comments.py:283
+msgid "Only POSTs are allowed"
+msgstr "Samo POST dopušten."
+
+#: contrib/comments/views/comments.py:194
+#: contrib/comments/views/comments.py:287
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Jedno ili više obaveznih polja nisu poslana"
+
+#: contrib/comments/views/comments.py:198
+#: contrib/comments/views/comments.py:289
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Netko je mijenjao formu komentara (sigurnosni propust)"
+
+#: contrib/comments/views/comments.py:208
+#: contrib/comments/views/comments.py:295
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"Forma komentara ima nepravilni 'target' parametar -- ID objekta je bio "
+"nepravilan"
+
+#: contrib/comments/views/comments.py:259
+#: contrib/comments/views/comments.py:324
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "Forma komentara nije imala ni 'preview' ni 'post'"
+
+#: contrib/comments/views/karma.py:21
+msgid "Anonymous users cannot vote"
+msgstr "Anonimni korisnici ne mogu glasati"
+
+#: contrib/comments/views/karma.py:25
+msgid "Invalid comment ID"
+msgstr "Neispravan ID komentara"
+
+#: contrib/comments/views/karma.py:27
+msgid "No voting for yourself"
+msgstr "Ne možete glasati za sebe"
+
+#: contrib/contenttypes/models.py:37
+msgid "python model class name"
+msgstr "ime klase (class) python modela"
+
+#: contrib/contenttypes/models.py:40
+msgid "content type"
+msgstr "tip sadržaja"
+
+#: contrib/contenttypes/models.py:41
+msgid "content types"
+msgstr "tipovi sadržaja"
+
+#: contrib/flatpages/models.py:8
+msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Primjer: '/about/contact/'. Provjerite ako imate prvi i preostale slash-eve "
+"(/)."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "naslov"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "sadržaj"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "uključi komentare"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "ime template-a"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"Primjer: 'flatpages/contact_page.html'. Ako navedeno nije definirano sistem "
+"će koristiti 'flatpages/default.html'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "registracija obavezna"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Ako je ovo selektirano samo logirani korisnici moći će vidjeti ovu stranicu."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "statična stranica"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "statične stranice"
+
+#: contrib/humanize/templatetags/humanize.py:20
+msgid "th"
+msgstr "th"
+
+#: contrib/humanize/templatetags/humanize.py:20
+msgid "st"
+msgstr "st"
+
+#: contrib/humanize/templatetags/humanize.py:20
+msgid "nd"
+msgstr "nd"
+
+#: contrib/humanize/templatetags/humanize.py:20
+msgid "rd"
+msgstr "rd"
+
+#: contrib/humanize/templatetags/humanize.py:52
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f milijun"
+msgstr[1] "%(value).1f milijuna"
+
+#: contrib/humanize/templatetags/humanize.py:55
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f milijarda"
+msgstr[1] "%(value).1f milijarde"
+
+#: contrib/humanize/templatetags/humanize.py:58
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f bilijun"
+msgstr[1] "%(value).1f bilijuna"
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "one"
+msgstr "jedan"
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "two"
+msgstr "dva"
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "three"
+msgstr "tri"
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "four"
+msgstr "četiri"
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "five"
+msgstr "pet"
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "six"
+msgstr "šest"
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "seven"
+msgstr "sedam"
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "eight"
+msgstr "osam"
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "nine"
+msgstr "devet"
+
+#: contrib/humanize/templatetags/humanize.py:94
+msgid "today"
+msgstr "danas"
+
+#: contrib/humanize/templatetags/humanize.py:96
+msgid "tomorrow"
+msgstr "sutra"
+
+#: contrib/humanize/templatetags/humanize.py:98
+msgid "yesterday"
+msgstr "jučer"
+
+#: contrib/localflavor/ar/forms.py:28
+msgid "Enter a postal code in the format NNNN or ANNNNAAA."
+msgstr "Unesi ispravan poštanski broj formata NNNN ili ANNNNAAA."
+
+#: contrib/localflavor/ar/forms.py:50 contrib/localflavor/br/forms.py:96
+#: contrib/localflavor/br/forms.py:135 contrib/localflavor/pe/forms.py:23
+#: contrib/localflavor/pe/forms.py:51
+msgid "This field requires only numbers."
+msgstr "Ovo polje zahtjeva samo brojeve."
+
+#: contrib/localflavor/ar/forms.py:51
+msgid "This field requires 7 or 8 digits."
+msgstr "Ovo polje zahtjeva 7 ili 8 numeričkih znakova."
+
+#: contrib/localflavor/ar/forms.py:80
+msgid "Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format."
+msgstr "Unesite ispravan CUIT formata XX-XXXXXXXX-X ili XXXXXXXXXXXX."
+
+#: contrib/localflavor/ar/forms.py:81
+msgid "Invalid CUIT."
+msgstr "Neispravan CUIT."
+
+#: contrib/localflavor/au/forms.py:16
+msgid "Enter a 4 digit post code."
+msgstr "Unesite poštanski kod sa 4 numerička znaka."
+
+#: contrib/localflavor/br/forms.py:21
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Unesite zip kod formata XXXXX-XXX."
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "Telefonski brojevi moraju biti formata XX-XXXX-XXXX."
+
+#: contrib/localflavor/br/forms.py:58
+msgid ""
+"Select a valid brazilian state. That state is not one of the available "
+"states."
+msgstr "Izaberite ispravnu brazilsku državu. Država nije jedna od dostupnih "
+"država."
+
+#: contrib/localflavor/br/forms.py:94
+msgid "Invalid CPF number."
+msgstr "Neispravan CPF broj."
+
+#: contrib/localflavor/br/forms.py:95
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr "Ovo polje zahtjeva najviše 11 numeričkih znakova ili 14 slova."
+
+#: contrib/localflavor/br/forms.py:134
+msgid "Invalid CNPJ number."
+msgstr "Neispravan CNPJ broj."
+
+#: contrib/localflavor/br/forms.py:136
+msgid "This field requires at least 14 digits"
+msgstr "Ovo polje zahtjeva bar 14 numeričkih znakova"
+
+#: contrib/localflavor/ca/forms.py:17
+msgid "Enter a postal code in the format XXX XXX."
+msgstr "Unesi poštanski broj formata XXX XXX."
+
+#: contrib/localflavor/ca/forms.py:88
+msgid "Enter a valid Canadian Social Insurance number in XXX-XXX-XXX format."
+msgstr "Unesite valjani kanadski broj socijalnog osiguranja formata XXX-XXX-XXX."
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr "Aargau"
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr "Appenzell Innerrhoden"
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr "Appenzell Ausserrhoden"
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr "Basel-Stadt"
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr "Basel-Land"
+
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr "Berne"
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr "Fribourg"
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr "Geneva"
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr "Glarus"
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr "Graubuenden"
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr "Jura"
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr "Lucerne"
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr "Neuchatel"
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr "Nidwalden"
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr "Obwalden"
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr "Schaffhausen"
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr "Schwyz"
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr "Solothurn"
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr "St. Gallen"
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr "Thurgau"
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr "Ticino"
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr "Uri"
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr "Valais"
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr "Vaud"
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr "Zug"
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr "Zurich"
+
+#: contrib/localflavor/ch/forms.py:16 contrib/localflavor/no/forms.py:12
+msgid "Enter a zip code in the format XXXX."
+msgstr "Unesite zip kod formata XXXX."
+
+#: contrib/localflavor/ch/forms.py:64
+msgid ""
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
+msgstr "Unesite ispravan švicarski identifikacijski broj ili broj putovnice formata X1234567<0 ili "
+"1234567890"
+
+#: contrib/localflavor/cl/forms.py:29
+msgid "Enter a valid Chilean RUT."
+msgstr "Unesi ispravan čileanski RUT"
+
+#: contrib/localflavor/cl/forms.py:30
+msgid "Enter a valid Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr "Unesi ispravan čileanski RUT formata XX.XXX.XXX-X."
+
+#: contrib/localflavor/cl/forms.py:31
+msgid "The Chilean RUT is not valid."
+msgstr "Čileanski RUT nije ispravan."
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr "Baden-Wuerttemberg"
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr "Bavaria"
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr "Berlin"
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr "Brandenburg"
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr "Bremen"
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr "Hamburg"
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr "Hessen"
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr "Mecklenburg-Western Pomerania"
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr "Lower Saxony"
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr "North Rhine-Westphalia"
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr "Rhineland-Palatinate"
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr "Saarland"
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr "Saxony"
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr "Saxony-Anhalt"
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr "Schleswig-Holstein"
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr "Thuringia"
+
+#: contrib/localflavor/de/forms.py:14 contrib/localflavor/fi/forms.py:12
+#: contrib/localflavor/fr/forms.py:15
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Unesite zip kod formata XXXXX."
+
+#: contrib/localflavor/de/forms.py:41
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr "Unesite broj njemačke identifikacijske kartice formata XXXXXXXXXXX-XXXXXXX-XXXXXXX-X."
+""
+
+#: contrib/localflavor/es/es_provinces.py:5
+msgid "Arava"
+msgstr "Arava"
+
+#: contrib/localflavor/es/es_provinces.py:6
+msgid "Albacete"
+msgstr "Albacete"
+
+#: contrib/localflavor/es/es_provinces.py:7
+msgid "Alacant"
+msgstr "Alacant"
+
+#: contrib/localflavor/es/es_provinces.py:8
+msgid "Almeria"
+msgstr "Almeria"
+
+#: contrib/localflavor/es/es_provinces.py:9
+msgid "Avila"
+msgstr "Avila"
+
+#: contrib/localflavor/es/es_provinces.py:10
+msgid "Badajoz"
+msgstr "Badajoz"
+
+#: contrib/localflavor/es/es_provinces.py:11
+msgid "Illes Balears"
+msgstr "Illes Balears"
+
+#: contrib/localflavor/es/es_provinces.py:12
+msgid "Barcelona"
+msgstr "Barcelona"
+
+#: contrib/localflavor/es/es_provinces.py:13
+msgid "Burgos"
+msgstr "Burgos"
+
+#: contrib/localflavor/es/es_provinces.py:14
+msgid "Caceres"
+msgstr "Caceres"
+
+#: contrib/localflavor/es/es_provinces.py:15
+msgid "Cadiz"
+msgstr "Cadiz"
+
+#: contrib/localflavor/es/es_provinces.py:16
+msgid "Castello"
+msgstr "Castello"
+
+#: contrib/localflavor/es/es_provinces.py:17
+msgid "Ciudad Real"
+msgstr "Ciudad Real"
+
+#: contrib/localflavor/es/es_provinces.py:18
+msgid "Cordoba"
+msgstr "Cordoba"
+
+#: contrib/localflavor/es/es_provinces.py:19
+msgid "A Coruna"
+msgstr "A Coruna"
+
+#: contrib/localflavor/es/es_provinces.py:20
+msgid "Cuenca"
+msgstr "Cuenca"
+
+#: contrib/localflavor/es/es_provinces.py:21
+msgid "Girona"
+msgstr "Girona"
+
+#: contrib/localflavor/es/es_provinces.py:22
+msgid "Granada"
+msgstr "Granada"
+
+#: contrib/localflavor/es/es_provinces.py:23
+msgid "Guadalajara"
+msgstr "Guadalajara"
+
+#: contrib/localflavor/es/es_provinces.py:24
+msgid "Guipuzkoa"
+msgstr "Guipuzkoa"
+
+#: contrib/localflavor/es/es_provinces.py:25
+msgid "Huelva"
+msgstr "Huelva"
+
+#: contrib/localflavor/es/es_provinces.py:26
+msgid "Huesca"
+msgstr "Huesca"
+
+#: contrib/localflavor/es/es_provinces.py:27
+msgid "Jaen"
+msgstr "Jaen"
+
+#: contrib/localflavor/es/es_provinces.py:28
+msgid "Leon"
+msgstr "Leon"
+
+#: contrib/localflavor/es/es_provinces.py:29
+msgid "Lleida"
+msgstr "Lleida"
+
+#: contrib/localflavor/es/es_provinces.py:30
+#: contrib/localflavor/es/es_regions.py:17
+msgid "La Rioja"
+msgstr "La Rioja"
+
+#: contrib/localflavor/es/es_provinces.py:31
+msgid "Lugo"
+msgstr "Lugo"
+
+#: contrib/localflavor/es/es_provinces.py:32
+#: contrib/localflavor/es/es_regions.py:18
+msgid "Madrid"
+msgstr "Madrid"
+
+#: contrib/localflavor/es/es_provinces.py:33
+msgid "Malaga"
+msgstr "Malaga"
+
+#: contrib/localflavor/es/es_provinces.py:34
+msgid "Murcia"
+msgstr "Murcia"
+
+#: contrib/localflavor/es/es_provinces.py:35
+msgid "Navarre"
+msgstr "Navarre"
+
+#: contrib/localflavor/es/es_provinces.py:36
+msgid "Ourense"
+msgstr "Ourense"
+
+#: contrib/localflavor/es/es_provinces.py:37
+msgid "Asturias"
+msgstr "Asturias"
+
+#: contrib/localflavor/es/es_provinces.py:38
+msgid "Palencia"
+msgstr "Palencia"
+
+#: contrib/localflavor/es/es_provinces.py:39
+msgid "Las Palmas"
+msgstr "Las Palmas"
+
+#: contrib/localflavor/es/es_provinces.py:40
+msgid "Pontevedra"
+msgstr "Pontevedra"
+
+#: contrib/localflavor/es/es_provinces.py:41
+msgid "Salamanca"
+msgstr "Salamanca"
+
+#: contrib/localflavor/es/es_provinces.py:42
+msgid "Santa Cruz de Tenerife"
+msgstr "Santa Cruz de Tenerife"
+
+#: contrib/localflavor/es/es_provinces.py:43
+#: contrib/localflavor/es/es_regions.py:11
+msgid "Cantabria"
+msgstr "Cantabria"
+
+#: contrib/localflavor/es/es_provinces.py:44
+msgid "Segovia"
+msgstr "Segovia"
+
+#: contrib/localflavor/es/es_provinces.py:45
+msgid "Seville"
+msgstr "Seville"
+
+#: contrib/localflavor/es/es_provinces.py:46
+msgid "Soria"
+msgstr "Soria"
+
+#: contrib/localflavor/es/es_provinces.py:47
+msgid "Tarragona"
+msgstr "Tarragona"
+
+#: contrib/localflavor/es/es_provinces.py:48
+msgid "Teruel"
+msgstr "Teruel"
+
+#: contrib/localflavor/es/es_provinces.py:49
+msgid "Toledo"
+msgstr "Toledo"
+
+#: contrib/localflavor/es/es_provinces.py:50
+msgid "Valencia"
+msgstr "Valencia"
+
+#: contrib/localflavor/es/es_provinces.py:51
+msgid "Valladolid"
+msgstr "Valladolid"
+
+#: contrib/localflavor/es/es_provinces.py:52
+msgid "Bizkaia"
+msgstr "Bizkaia"
+
+#: contrib/localflavor/es/es_provinces.py:53
+msgid "Zamora"
+msgstr "Zamora"
+
+#: contrib/localflavor/es/es_provinces.py:54
+msgid "Zaragoza"
+msgstr "Zaragoza"
+
+#: contrib/localflavor/es/es_provinces.py:55
+msgid "Ceuta"
+msgstr "Ceuta"
+
+#: contrib/localflavor/es/es_provinces.py:56
+msgid "Melilla"
+msgstr "Melilla"
+
+#: contrib/localflavor/es/es_regions.py:5
+msgid "Andalusia"
+msgstr "Andalusia"
+
+#: contrib/localflavor/es/es_regions.py:6
+msgid "Aragon"
+msgstr "Aragon"
+
+#: contrib/localflavor/es/es_regions.py:7
+msgid "Principality of Asturias"
+msgstr "Principality of Asturias"
+
+#: contrib/localflavor/es/es_regions.py:8
+msgid "Balearic Islands"
+msgstr "Balearic Islands"
+
+#: contrib/localflavor/es/es_regions.py:9
+msgid "Basque Country"
+msgstr "Basque Country"
+
+#: contrib/localflavor/es/es_regions.py:10
+msgid "Canary Islands"
+msgstr "Canary Islands"
+
+#: contrib/localflavor/es/es_regions.py:12
+msgid "Castile-La Mancha"
+msgstr "Castile-La Mancha"
+
+#: contrib/localflavor/es/es_regions.py:13
+msgid "Castile and Leon"
+msgstr "Castile and Leon"
+
+#: contrib/localflavor/es/es_regions.py:14
+msgid "Catalonia"
+msgstr "Catalonia"
+
+#: contrib/localflavor/es/es_regions.py:15
+msgid "Extremadura"
+msgstr "Extremadura"
+
+#: contrib/localflavor/es/es_regions.py:16
+msgid "Galicia"
+msgstr "Galicia"
+
+#: contrib/localflavor/es/es_regions.py:19
+msgid "Region of Murcia"
+msgstr "Region of Murcia"
+
+#: contrib/localflavor/es/es_regions.py:20
+msgid "Foral Community of Navarre"
+msgstr "Foral Community of Navarre"
+
+#: contrib/localflavor/es/es_regions.py:21
+msgid "Valencian Community"
+msgstr "Valencian Community"
+
+#: contrib/localflavor/es/forms.py:19
+msgid "Enter a valid postal code in the range and format 01XXX - 52XXX."
+msgstr "Unesi ispravan poštanski broj u rasponu i formatu od 01XXX - 52XXX."
+
+#: contrib/localflavor/es/forms.py:39
+msgid ""
+"Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or "
+"9XXXXXXXX."
+msgstr ""
+"Unesite ispravan broj telefona u jednom od formata 6XXXXXXXX, 8XXXXXXXX ili "
+"9XXXXXXXX."
+
+#: contrib/localflavor/es/forms.py:66
+msgid "Please enter a valid NIF, NIE, or CIF."
+msgstr "Unesite ispravan NIF, NIE ili CIF."
+
+#: contrib/localflavor/es/forms.py:67
+msgid "Please enter a valid NIF or NIE."
+msgstr "Molim unesite ispravan NIF ili NIE."
+
+#: contrib/localflavor/es/forms.py:68
+msgid "Invalid checksum for NIF."
+msgstr "Neispravan checksum za NIF"
+
+#: contrib/localflavor/es/forms.py:69
+msgid "Invalid checksum for NIE."
+msgstr "Neispravan checksum za NIF"
+
+#: contrib/localflavor/es/forms.py:70
+msgid "Invalid checksum for CIF."
+msgstr "Neispravan checksum za CIF."
+
+#: contrib/localflavor/es/forms.py:142
+msgid "Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX."
+msgstr "Molim unesite ispravan broj bankovnog računa formata XXXX-XXXX-XX-XXXXXXXXXX."
+
+#: contrib/localflavor/es/forms.py:143
+msgid "Invalid checksum for bank account number."
+msgstr "Neispravan checksum za broj bankovnog računa."
+
+#: contrib/localflavor/fi/forms.py:28
+msgid "Enter a valid Finnish social security number."
+msgstr "Unesi ispravan broj finskog socijalnog osiguranja."
+
+#: contrib/localflavor/in_/forms.py:14
+msgid "Enter a zip code in the format XXXXXXX."
+msgstr "Unesi ispravan zip kod formata XXXXXXX."
+
+#: contrib/localflavor/is_/forms.py:17
+msgid "Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr "Unesite ispravan islandski identifikacijski broj formata XXXXXX-XXXX."
+
+#: contrib/localflavor/is_/forms.py:18
+msgid "The Icelandic identification number is not valid."
+msgstr "Islandski identifikacijski broj nije ispravan."
+
+#: contrib/localflavor/it/forms.py:14
+msgid "Enter a valid zip code."
+msgstr "Unesite ispravan zip kod."
+
+#: contrib/localflavor/it/forms.py:43
+msgid "Enter a valid Social Security number."
+msgstr "Unesite ispravan broj socijalnog osiguranja."
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr "Unesite ispravan VAT broj."
+
+#: contrib/localflavor/jp/forms.py:19
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "Unesite poštanski broj formata XXXXXXX or XXX-XXXX."
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr "Hokkaido"
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr "Aomori"
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr "Iwate"
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr "Miyagi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr "Akita"
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr "Yamagata"
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr "Fukushima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr "Ibaraki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr "Tochigi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr "Gunma"
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr "Saitama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr "Chiba"
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr "Tokyo"
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr "Kanagawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr "Yamanashi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr "Nagano"
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr "Niigata"
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr "Toyama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr "Ishikawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr "Fukui"
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr "Gifu"
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr "Shizuoka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr "Aichi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr "Mie"
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr "Shiga"
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr "Kyoto"
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr "Osaka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr "Hyogo"
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr "Nara"
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr "Wakayama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr "Tottori"
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr "Shimane"
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr "Okayama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr "Hiroshima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr "Yamaguchi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr "Tokushima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr "Kagawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr "Ehime"
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr "Kochi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr "Fukuoka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr "Saga"
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr "Nagasaki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr "Kumamoto"
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr "Oita"
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr "Miyazaki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr "Kagoshima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr "Okinawa"
+
+#: contrib/localflavor/mx/mx_states.py:12
+msgid "Aguascalientes"
+msgstr "Aguascalientes"
+
+#: contrib/localflavor/mx/mx_states.py:13
+msgid "Baja California"
+msgstr "Baja California"
+
+#: contrib/localflavor/mx/mx_states.py:14
+msgid "Baja California Sur"
+msgstr "Baja California Sur"
+
+#: contrib/localflavor/mx/mx_states.py:15
+msgid "Campeche"
+msgstr "Campeche"
+
+#: contrib/localflavor/mx/mx_states.py:16
+msgid "Chihuahua"
+msgstr "Chihuahua"
+
+#: contrib/localflavor/mx/mx_states.py:17
+msgid "Chiapas"
+msgstr "Chiapas"
+
+#: contrib/localflavor/mx/mx_states.py:18
+msgid "Coahuila"
+msgstr "Coahuila"
+
+#: contrib/localflavor/mx/mx_states.py:19
+msgid "Colima"
+msgstr "Colima"
+
+#: contrib/localflavor/mx/mx_states.py:20
+msgid "Distrito Federal"
+msgstr "Distrito Federal"
+
+#: contrib/localflavor/mx/mx_states.py:21
+msgid "Durango"
+msgstr "Durango"
+
+#: contrib/localflavor/mx/mx_states.py:22
+msgid "Guerrero"
+msgstr "Guerrero"
+
+#: contrib/localflavor/mx/mx_states.py:23
+msgid "Guanajuato"
+msgstr "Guanajuato"
+
+#: contrib/localflavor/mx/mx_states.py:24
+msgid "Hidalgo"
+msgstr "Hidalgo"
+
+#: contrib/localflavor/mx/mx_states.py:25
+msgid "Jalisco"
+msgstr "Jalisco"
+
+#: contrib/localflavor/mx/mx_states.py:26
+msgid "Estado de México"
+msgstr "Estado de México"
+
+#: contrib/localflavor/mx/mx_states.py:27
+msgid "Michoacán"
+msgstr "Michoacán"
+
+#: contrib/localflavor/mx/mx_states.py:28
+msgid "Morelos"
+msgstr "Morelos"
+
+#: contrib/localflavor/mx/mx_states.py:29
+msgid "Nayarit"
+msgstr "Nayarit"
+
+#: contrib/localflavor/mx/mx_states.py:30
+msgid "Nuevo León"
+msgstr "Nuevo León"
+
+#: contrib/localflavor/mx/mx_states.py:31
+msgid "Oaxaca"
+msgstr "Oaxaca"
+
+#: contrib/localflavor/mx/mx_states.py:32
+msgid "Puebla"
+msgstr "Puebla"
+
+#: contrib/localflavor/mx/mx_states.py:33
+msgid "Querétaro"
+msgstr "Querétaro"
+
+#: contrib/localflavor/mx/mx_states.py:34
+msgid "Quintana Roo"
+msgstr "Quintana Roo"
+
+#: contrib/localflavor/mx/mx_states.py:35
+msgid "Sinaloa"
+msgstr "Sinaloa"
+
+#: contrib/localflavor/mx/mx_states.py:36
+msgid "San Luis Potosí"
+msgstr "San Luis Potosí"
+
+#: contrib/localflavor/mx/mx_states.py:37
+msgid "Sonora"
+msgstr "Sonora"
+
+#: contrib/localflavor/mx/mx_states.py:38
+msgid "Tabasco"
+msgstr "Tabasco"
+
+#: contrib/localflavor/mx/mx_states.py:39
+msgid "Tamaulipas"
+msgstr "Tamaulipas"
+
+#: contrib/localflavor/mx/mx_states.py:40
+msgid "Tlaxcala"
+msgstr "Tlaxcala"
+
+#: contrib/localflavor/mx/mx_states.py:41
+msgid "Veracruz"
+msgstr "Veracruz"
+
+#: contrib/localflavor/mx/mx_states.py:42
+msgid "Yucatán"
+msgstr "Yucatán"
+
+#: contrib/localflavor/mx/mx_states.py:43
+msgid "Zacatecas"
+msgstr "Zacatecas"
+
+#: contrib/localflavor/nl/forms.py:21
+msgid "Enter a valid postal code"
+msgstr "Unesite ispravan poštanski broj"
+
+#: contrib/localflavor/nl/forms.py:52
+msgid "Enter a valid phone number"
+msgstr "Unesite ispravan telefonski broj"
+
+#: contrib/localflavor/nl/forms.py:78
+msgid "Enter a valid SoFi number"
+msgstr "Unesite ispravan SoFi broj"
+
+#: contrib/localflavor/nl/nl_provinces.py:4
+msgid "Drente"
+msgstr "Drente"
+
+#: contrib/localflavor/nl/nl_provinces.py:5
+msgid "Flevoland"
+msgstr "Flevoland"
+
+#: contrib/localflavor/nl/nl_provinces.py:6
+msgid "Friesland"
+msgstr "Friesland"
+
+#: contrib/localflavor/nl/nl_provinces.py:7
+msgid "Gelderland"
+msgstr "Gelderland"
+
+#: contrib/localflavor/nl/nl_provinces.py:8
+msgid "Groningen"
+msgstr "Groningen"
+
+#: contrib/localflavor/nl/nl_provinces.py:9
+msgid "Limburg"
+msgstr "Limburg"
+
+#: contrib/localflavor/nl/nl_provinces.py:10
+msgid "Noord-Brabant"
+msgstr "Noord-Brabant"
+
+#: contrib/localflavor/nl/nl_provinces.py:11
+msgid "Noord-Holland"
+msgstr "Noord-Holland"
+
+#: contrib/localflavor/nl/nl_provinces.py:12
+msgid "Overijssel"
+msgstr "Overijssel"
+
+#: contrib/localflavor/nl/nl_provinces.py:13
+msgid "Utrecht"
+msgstr "Utrecht"
+
+#: contrib/localflavor/nl/nl_provinces.py:14
+msgid "Zeeland"
+msgstr "Zeeland"
+
+#: contrib/localflavor/nl/nl_provinces.py:15
+msgid "Zuid-Holland"
+msgstr "Zuid-Holland"
+
+#: contrib/localflavor/no/forms.py:33
+msgid "Enter a valid Norwegian social security number."
+msgstr "Unesite ispravan broj norveškog socijalnog osiguranja."
+
+#: contrib/localflavor/pe/forms.py:24
+msgid "This field requires 8 digits."
+msgstr "Ovo polje zahtjeva 8 numeričkih znakova."
+
+#: contrib/localflavor/pe/forms.py:52
+msgid "This field requires 11 digits."
+msgstr "Ovo polje zahtjeva 11 numeričkih znakova."
+
+#: contrib/localflavor/pl/forms.py:39
+msgid "National Identification Number consists of 11 digits."
+msgstr "Nacionalni identifikacijski broj sadrži 11 numeričkih znakova."
+
+#: contrib/localflavor/pl/forms.py:40
+msgid "Wrong checksum for the National Identification Number."
+msgstr "Neispravan checksum za Nacionalni identifikacijski broj."
+
+#: contrib/localflavor/pl/forms.py:72
+msgid "Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX."
+msgstr "Unesite ispravan porezni broj (NIP) formata XXX-XXX-XX-XX or XX-XX-XXX-XXX."
+
+#: contrib/localflavor/pl/forms.py:73
+msgid "Wrong checksum for the Tax Number (NIP)."
+msgstr "Neispravan checksum za porezni broj (NIP)."
+
+#: contrib/localflavor/pl/forms.py:112
+msgid "National Business Register Number (REGON) consists of 7 or 9 digits."
+msgstr "National Business Register Number (REGON) sastoji se od 7 ili 9 numeričkih znakova."
+
+#: contrib/localflavor/pl/forms.py:113
+msgid "Wrong checksum for the National Business Register Number (REGON)."
+msgstr "Neispravan checked za National Business Register Number (REGON)."
+
+#: contrib/localflavor/pl/forms.py:156
+msgid "Enter a postal code in the format XX-XXX."
+msgstr "Unesi poštanski broj formata XX-XXX."
+
+#: contrib/localflavor/pl/pl_voivodeships.py:8
+msgid "Lower Silesia"
+msgstr "Lower Silesia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:9
+msgid "Kuyavia-Pomerania"
+msgstr "Kuyavia-Pomerania"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:10
+msgid "Lublin"
+msgstr "Lublin"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:11
+msgid "Lubusz"
+msgstr "Lubusz"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:12
+msgid "Lodz"
+msgstr "Lodz"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:13
+msgid "Lesser Poland"
+msgstr "Lesser Poland"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:14
+msgid "Masovia"
+msgstr "Masovia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:15
+msgid "Opole"
+msgstr "Opole"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:16
+msgid "Subcarpatia"
+msgstr "Subcarpatia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:17
+msgid "Podlasie"
+msgstr "Podlasie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:18
+msgid "Pomerania"
+msgstr "Pomerania"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:19
+msgid "Silesia"
+msgstr "Silesia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:20
+msgid "Swietokrzyskie"
+msgstr "Swietokrzyskie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:21
+msgid "Warmia-Masuria"
+msgstr "Warmia-Masuria"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:22
+msgid "Greater Poland"
+msgstr "Greater Poland"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:23
+msgid "West Pomerania"
+msgstr "West Pomerania"
+
+#: contrib/localflavor/sk/forms.py:30
+msgid "Enter a postal code in the format XXXXX or XXX XX."
+msgstr "Unesi ispravan poštanski broj formata XXXXX or XXX XX."
+
+#: contrib/localflavor/sk/sk_districts.py:8
+msgid "Banska Bystrica"
+msgstr "Banska Bystrica"
+
+#: contrib/localflavor/sk/sk_districts.py:9
+msgid "Banska Stiavnica"
+msgstr "Banska Stiavnica"
+
+#: contrib/localflavor/sk/sk_districts.py:10
+msgid "Bardejov"
+msgstr "Bardejov"
+
+#: contrib/localflavor/sk/sk_districts.py:11
+msgid "Banovce nad Bebravou"
+msgstr "Banovce nad Bebravou"
+
+#: contrib/localflavor/sk/sk_districts.py:12
+msgid "Brezno"
+msgstr "Brezno"
+
+#: contrib/localflavor/sk/sk_districts.py:13
+msgid "Bratislava I"
+msgstr "Bratislava I"
+
+#: contrib/localflavor/sk/sk_districts.py:14
+msgid "Bratislava II"
+msgstr "Bratislava II"
+
+#: contrib/localflavor/sk/sk_districts.py:15
+msgid "Bratislava III"
+msgstr "Bratislava III"
+
+#: contrib/localflavor/sk/sk_districts.py:16
+msgid "Bratislava IV"
+msgstr "Bratislava IV"
+
+#: contrib/localflavor/sk/sk_districts.py:17
+msgid "Bratislava V"
+msgstr "Bratislava V"
+
+#: contrib/localflavor/sk/sk_districts.py:18
+msgid "Bytca"
+msgstr "Bytca"
+
+#: contrib/localflavor/sk/sk_districts.py:19
+msgid "Cadca"
+msgstr "Cadca"
+
+#: contrib/localflavor/sk/sk_districts.py:20
+msgid "Detva"
+msgstr "Detva"
+
+#: contrib/localflavor/sk/sk_districts.py:21
+msgid "Dolny Kubin"
+msgstr "Dolny Kubin"
+
+#: contrib/localflavor/sk/sk_districts.py:22
+msgid "Dunajska Streda"
+msgstr "Dunajska Streda"
+
+#: contrib/localflavor/sk/sk_districts.py:23
+msgid "Galanta"
+msgstr "Galanta"
+
+#: contrib/localflavor/sk/sk_districts.py:24
+msgid "Gelnica"
+msgstr "Gelnica"
+
+#: contrib/localflavor/sk/sk_districts.py:25
+msgid "Hlohovec"
+msgstr "Hlohovec"
+
+#: contrib/localflavor/sk/sk_districts.py:26
+msgid "Humenne"
+msgstr "Humenne"
+
+#: contrib/localflavor/sk/sk_districts.py:27
+msgid "Ilava"
+msgstr "Ilava"
+
+#: contrib/localflavor/sk/sk_districts.py:28
+msgid "Kezmarok"
+msgstr "Kezmarok"
+
+#: contrib/localflavor/sk/sk_districts.py:29
+msgid "Komarno"
+msgstr "Komarno"
+
+#: contrib/localflavor/sk/sk_districts.py:30
+msgid "Kosice I"
+msgstr "Kosice I"
+
+#: contrib/localflavor/sk/sk_districts.py:31
+msgid "Kosice II"
+msgstr "Kosice II"
+
+#: contrib/localflavor/sk/sk_districts.py:32
+msgid "Kosice III"
+msgstr "Kosice III"
+
+#: contrib/localflavor/sk/sk_districts.py:33
+msgid "Kosice IV"
+msgstr "Kosice IV"
+
+#: contrib/localflavor/sk/sk_districts.py:34
+msgid "Kosice - okolie"
+msgstr "Kosice - okolie"
+
+#: contrib/localflavor/sk/sk_districts.py:35
+msgid "Krupina"
+msgstr "Krupina"
+
+#: contrib/localflavor/sk/sk_districts.py:36
+msgid "Kysucke Nove Mesto"
+msgstr "Kysucke Nove Mesto"
+
+#: contrib/localflavor/sk/sk_districts.py:37
+msgid "Levice"
+msgstr "Levice"
+
+#: contrib/localflavor/sk/sk_districts.py:38
+msgid "Levoca"
+msgstr "Levoca"
+
+#: contrib/localflavor/sk/sk_districts.py:39
+msgid "Liptovsky Mikulas"
+msgstr "Liptovsky Mikulas"
+
+#: contrib/localflavor/sk/sk_districts.py:40
+msgid "Lucenec"
+msgstr "Lucenec"
+
+#: contrib/localflavor/sk/sk_districts.py:41
+msgid "Malacky"
+msgstr "Malacky"
+
+#: contrib/localflavor/sk/sk_districts.py:42
+msgid "Martin"
+msgstr "Martin"
+
+#: contrib/localflavor/sk/sk_districts.py:43
+msgid "Medzilaborce"
+msgstr "Medzilaborce"
+
+#: contrib/localflavor/sk/sk_districts.py:44
+msgid "Michalovce"
+msgstr "Michalovce"
+
+#: contrib/localflavor/sk/sk_districts.py:45
+msgid "Myjava"
+msgstr "Myjava"
+
+#: contrib/localflavor/sk/sk_districts.py:46
+msgid "Namestovo"
+msgstr "Namestovo"
+
+#: contrib/localflavor/sk/sk_districts.py:47
+msgid "Nitra"
+msgstr "Nitra"
+
+#: contrib/localflavor/sk/sk_districts.py:48
+msgid "Nove Mesto nad Vahom"
+msgstr "Nove Mesto nad Vahom"
+
+#: contrib/localflavor/sk/sk_districts.py:49
+msgid "Nove Zamky"
+msgstr "Nove Zamky"
+
+#: contrib/localflavor/sk/sk_districts.py:50
+msgid "Partizanske"
+msgstr "Partizanske"
+
+#: contrib/localflavor/sk/sk_districts.py:51
+msgid "Pezinok"
+msgstr "Pezinok"
+
+#: contrib/localflavor/sk/sk_districts.py:52
+msgid "Piestany"
+msgstr "Piestany"
+
+#: contrib/localflavor/sk/sk_districts.py:53
+msgid "Poltar"
+msgstr "Poltar"
+
+#: contrib/localflavor/sk/sk_districts.py:54
+msgid "Poprad"
+msgstr "Poprad"
+
+#: contrib/localflavor/sk/sk_districts.py:55
+msgid "Povazska Bystrica"
+msgstr "Povazska Bystrica"
+
+#: contrib/localflavor/sk/sk_districts.py:56
+msgid "Presov"
+msgstr "Presov"
+
+#: contrib/localflavor/sk/sk_districts.py:57
+msgid "Prievidza"
+msgstr "Prievidza"
+
+#: contrib/localflavor/sk/sk_districts.py:58
+msgid "Puchov"
+msgstr "Puchov"
+
+#: contrib/localflavor/sk/sk_districts.py:59
+msgid "Revuca"
+msgstr "Revuca"
+
+#: contrib/localflavor/sk/sk_districts.py:60
+msgid "Rimavska Sobota"
+msgstr "Rimavska Sobota"
+
+#: contrib/localflavor/sk/sk_districts.py:61
+msgid "Roznava"
+msgstr "Roznava"
+
+#: contrib/localflavor/sk/sk_districts.py:62
+msgid "Ruzomberok"
+msgstr "Ruzomberok"
+
+#: contrib/localflavor/sk/sk_districts.py:63
+msgid "Sabinov"
+msgstr "Sabinov"
+
+#: contrib/localflavor/sk/sk_districts.py:64
+msgid "Senec"
+msgstr "Senec"
+
+#: contrib/localflavor/sk/sk_districts.py:65
+msgid "Senica"
+msgstr "Senica"
+
+#: contrib/localflavor/sk/sk_districts.py:66
+msgid "Skalica"
+msgstr "Skalica"
+
+#: contrib/localflavor/sk/sk_districts.py:67
+msgid "Snina"
+msgstr "Snina"
+
+#: contrib/localflavor/sk/sk_districts.py:68
+msgid "Sobrance"
+msgstr "Sobrance"
+
+#: contrib/localflavor/sk/sk_districts.py:69
+msgid "Spisska Nova Ves"
+msgstr "Spisska Nova Ves"
+
+#: contrib/localflavor/sk/sk_districts.py:70
+msgid "Stara Lubovna"
+msgstr "Stara Lubovna"
+
+#: contrib/localflavor/sk/sk_districts.py:71
+msgid "Stropkov"
+msgstr "Stropkov"
+
+#: contrib/localflavor/sk/sk_districts.py:72
+msgid "Svidnik"
+msgstr "Svidnik"
+
+#: contrib/localflavor/sk/sk_districts.py:73
+msgid "Sala"
+msgstr "Sala"
+
+#: contrib/localflavor/sk/sk_districts.py:74
+msgid "Topolcany"
+msgstr "Topolcany"
+
+#: contrib/localflavor/sk/sk_districts.py:75
+msgid "Trebisov"
+msgstr "Trebisov"
+
+#: contrib/localflavor/sk/sk_districts.py:76
+msgid "Trencin"
+msgstr "Trencin"
+
+#: contrib/localflavor/sk/sk_districts.py:77
+msgid "Trnava"
+msgstr "Trnava"
+
+#: contrib/localflavor/sk/sk_districts.py:78
+msgid "Turcianske Teplice"
+msgstr "Turcianske Teplice"
+
+#: contrib/localflavor/sk/sk_districts.py:79
+msgid "Tvrdosin"
+msgstr "Tvrdosin"
+
+#: contrib/localflavor/sk/sk_districts.py:80
+msgid "Velky Krtis"
+msgstr "Velky Krtis"
+
+#: contrib/localflavor/sk/sk_districts.py:81
+msgid "Vranov nad Toplou"
+msgstr "Vranov nad Toplou"
+
+#: contrib/localflavor/sk/sk_districts.py:82
+msgid "Zlate Moravce"
+msgstr "Zlate Moravce"
+
+#: contrib/localflavor/sk/sk_districts.py:83
+msgid "Zvolen"
+msgstr "Zvolen"
+
+#: contrib/localflavor/sk/sk_districts.py:84
+msgid "Zarnovica"
+msgstr "Zarnovica"
+
+#: contrib/localflavor/sk/sk_districts.py:85
+msgid "Ziar nad Hronom"
+msgstr "Ziar nad Hronom"
+
+#: contrib/localflavor/sk/sk_districts.py:86
+msgid "Zilina"
+msgstr "Zilina"
+
+#: contrib/localflavor/sk/sk_regions.py:8
+msgid "Banska Bystrica region"
+msgstr "Banska Bystrica regija"
+
+#: contrib/localflavor/sk/sk_regions.py:9
+msgid "Bratislava region"
+msgstr "Bratislava regija"
+
+#: contrib/localflavor/sk/sk_regions.py:10
+msgid "Kosice region"
+msgstr "Kosice regija"
+
+#: contrib/localflavor/sk/sk_regions.py:11
+msgid "Nitra region"
+msgstr "Nitra regija"
+
+#: contrib/localflavor/sk/sk_regions.py:12
+msgid "Presov region"
+msgstr "Presov regija"
+
+#: contrib/localflavor/sk/sk_regions.py:13
+msgid "Trencin region"
+msgstr "Trencin regija"
+
+#: contrib/localflavor/sk/sk_regions.py:14
+msgid "Trnava region"
+msgstr "Trnava regija"
+
+#: contrib/localflavor/sk/sk_regions.py:15
+msgid "Zilina region"
+msgstr "Zilina regija"
+
+#: contrib/localflavor/uk/forms.py:21
+msgid "Enter a valid postcode."
+msgstr "Unesite ispravan poštanski broj."
+
+#: contrib/localflavor/uk/uk_regions.py:11
+msgid "Bedfordshire"
+msgstr "Bedfordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:12
+msgid "Buckinghamshire"
+msgstr "Buckinghamshire"
+
+#: contrib/localflavor/uk/uk_regions.py:14
+msgid "Cheshire"
+msgstr "Cheshire"
+
+#: contrib/localflavor/uk/uk_regions.py:15
+msgid "Cornwall and Isles of Scilly"
+msgstr "Cornwall and Isles of Scilly"
+
+#: contrib/localflavor/uk/uk_regions.py:16
+msgid "Cumbria"
+msgstr "Cumbria"
+
+#: contrib/localflavor/uk/uk_regions.py:17
+msgid "Derbyshire"
+msgstr "Derbyshire"
+
+#: contrib/localflavor/uk/uk_regions.py:18
+msgid "Devon"
+msgstr "Devon"
+
+#: contrib/localflavor/uk/uk_regions.py:19
+msgid "Dorset"
+msgstr "Dorset"
+
+#: contrib/localflavor/uk/uk_regions.py:20
+msgid "Durham"
+msgstr "Durham"
+
+#: contrib/localflavor/uk/uk_regions.py:21
+msgid "East Sussex"
+msgstr "East Sussex"
+
+#: contrib/localflavor/uk/uk_regions.py:22
+msgid "Essex"
+msgstr "Essex"
+
+#: contrib/localflavor/uk/uk_regions.py:23
+msgid "Gloucestershire"
+msgstr "Gloucestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:24
+msgid "Greater London"
+msgstr "Greater London"
+
+#: contrib/localflavor/uk/uk_regions.py:25
+msgid "Greater Manchester"
+msgstr "Greater Manchester"
+
+#: contrib/localflavor/uk/uk_regions.py:26
+msgid "Hampshire"
+msgstr "Hampshire"
+
+#: contrib/localflavor/uk/uk_regions.py:27
+msgid "Hertfordshire"
+msgstr "Hertfordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:28
+msgid "Kent"
+msgstr "Kent"
+
+#: contrib/localflavor/uk/uk_regions.py:29
+msgid "Lancashire"
+msgstr "Lancashire"
+
+#: contrib/localflavor/uk/uk_regions.py:30
+msgid "Leicestershire"
+msgstr "Leicestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:31
+msgid "Lincolnshire"
+msgstr "Lincolnshire"
+
+#: contrib/localflavor/uk/uk_regions.py:32
+msgid "Merseyside"
+msgstr "Merseyside"
+
+#: contrib/localflavor/uk/uk_regions.py:33
+msgid "Norfolk"
+msgstr "Norfolk"
+
+#: contrib/localflavor/uk/uk_regions.py:34
+msgid "North Yorkshire"
+msgstr "North Yorkshire"
+
+#: contrib/localflavor/uk/uk_regions.py:35
+msgid "Northamptonshire"
+msgstr "Northamptonshire"
+
+#: contrib/localflavor/uk/uk_regions.py:36
+msgid "Northumberland"
+msgstr "Northumberland"
+
+#: contrib/localflavor/uk/uk_regions.py:37
+msgid "Nottinghamshire"
+msgstr "Nottinghamshire"
+
+#: contrib/localflavor/uk/uk_regions.py:38
+msgid "Oxfordshire"
+msgstr "Oxfordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:39
+msgid "Shropshire"
+msgstr "Shropshire"
+
+#: contrib/localflavor/uk/uk_regions.py:40
+msgid "Somerset"
+msgstr "Somerset"
+
+#: contrib/localflavor/uk/uk_regions.py:41
+msgid "South Yorkshire"
+msgstr "South Yorkshire"
+
+#: contrib/localflavor/uk/uk_regions.py:42
+msgid "Staffordshire"
+msgstr "Staffordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:43
+msgid "Suffolk"
+msgstr "Suffolk"
+
+#: contrib/localflavor/uk/uk_regions.py:44
+msgid "Surrey"
+msgstr "Surrey"
+
+#: contrib/localflavor/uk/uk_regions.py:45
+msgid "Tyne and Wear"
+msgstr "Tyne and Wear"
+
+#: contrib/localflavor/uk/uk_regions.py:46
+msgid "Warwickshire"
+msgstr "Warwickshire"
+
+#: contrib/localflavor/uk/uk_regions.py:47
+msgid "West Midlands"
+msgstr "West Midlands"
+
+#: contrib/localflavor/uk/uk_regions.py:48
+msgid "West Sussex"
+msgstr "West Sussex"
+
+#: contrib/localflavor/uk/uk_regions.py:49
+msgid "West Yorkshire"
+msgstr "West Yorkshire"
+
+#: contrib/localflavor/uk/uk_regions.py:50
+msgid "Wiltshire"
+msgstr "Wiltshire"
+
+#: contrib/localflavor/uk/uk_regions.py:51
+msgid "Worcestershire"
+msgstr "Worcestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:55
+msgid "County Antrim"
+msgstr "County Antrim"
+
+#: contrib/localflavor/uk/uk_regions.py:56
+msgid "County Armagh"
+msgstr "County Armagh"
+
+#: contrib/localflavor/uk/uk_regions.py:57
+#: contrib/localflavor/uk/uk_regions.py:58
+msgid "County Down"
+msgstr "County Down"
+
+#: contrib/localflavor/uk/uk_regions.py:59
+msgid "County Londonderry"
+msgstr "County Londonderry"
+
+#: contrib/localflavor/uk/uk_regions.py:60
+msgid "County Tyrone"
+msgstr "Country Tyrone"
+
+#: contrib/localflavor/uk/uk_regions.py:64
+msgid "Clwyd"
+msgstr "Clwyd"
+
+#: contrib/localflavor/uk/uk_regions.py:65
+msgid "Dyfed"
+msgstr "Dyfed"
+
+#: contrib/localflavor/uk/uk_regions.py:66
+msgid "Gwent"
+msgstr "Gwent"
+
+#: contrib/localflavor/uk/uk_regions.py:67
+msgid "Gwynedd"
+msgstr "Gwynedd"
+
+#: contrib/localflavor/uk/uk_regions.py:68
+msgid "Mid Glamorgan"
+msgstr "Mid Glamorgan"
+
+#: contrib/localflavor/uk/uk_regions.py:69
+msgid "Powys"
+msgstr "Powys"
+
+#: contrib/localflavor/uk/uk_regions.py:70
+msgid "South Glamorgan"
+msgstr "South Glamorgan"
+
+#: contrib/localflavor/uk/uk_regions.py:71
+msgid "West Glamorgan"
+msgstr "West Glamorgan"
+
+#: contrib/localflavor/uk/uk_regions.py:75
+msgid "Borders"
+msgstr "Borders"
+
+#: contrib/localflavor/uk/uk_regions.py:76
+msgid "Central Scotland"
+msgstr "Central Scotland"
+
+#: contrib/localflavor/uk/uk_regions.py:77
+msgid "Dumfries and Galloway"
+msgstr "Dumfries and Galloway"
+
+#: contrib/localflavor/uk/uk_regions.py:78
+msgid "Fife"
+msgstr "Fife"
+
+#: contrib/localflavor/uk/uk_regions.py:79
+msgid "Grampian"
+msgstr "Grampian"
+
+#: contrib/localflavor/uk/uk_regions.py:80
+msgid "Highland"
+msgstr "Highland"
+
+#: contrib/localflavor/uk/uk_regions.py:81
+msgid "Lothian"
+msgstr "Lothian"
+
+#: contrib/localflavor/uk/uk_regions.py:82
+msgid "Orkney Islands"
+msgstr "Orkney Islands"
+
+#: contrib/localflavor/uk/uk_regions.py:83
+msgid "Shetland Islands"
+msgstr "Shetland Islands"
+
+#: contrib/localflavor/uk/uk_regions.py:84
+msgid "Strathclyde"
+msgstr "Strathclyde"
+
+#: contrib/localflavor/uk/uk_regions.py:85
+msgid "Tayside"
+msgstr "Tayside"
+
+#: contrib/localflavor/uk/uk_regions.py:86
+msgid "Western Isles"
+msgstr "Western Isles"
+
+#: contrib/localflavor/uk/uk_regions.py:90
+msgid "England"
+msgstr "Engleska"
+
+#: contrib/localflavor/uk/uk_regions.py:91
+msgid "Northern Ireland"
+msgstr "Sjeverna irska"
+
+#: contrib/localflavor/uk/uk_regions.py:92
+msgid "Scotland"
+msgstr "Škotska"
+
+#: contrib/localflavor/uk/uk_regions.py:93
+msgid "Wales"
+msgstr "Wales"
+
+#: contrib/localflavor/us/forms.py:16
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "Unesite zip kod formata XXXXX or XXXXX-XXXX."
+
+#: contrib/localflavor/us/forms.py:54
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr "Unesi ispravan broj socijalnog osiguranja S.A.D.-a formata XXX-XX-XXXX."
+
+#: contrib/localflavor/za/forms.py:20
+msgid "Enter a valid South African ID number"
+msgstr "Unesi ispravan južnoafrički ID broj."
+
+#: contrib/localflavor/za/forms.py:54
+msgid "Enter a valid South African postal code"
+msgstr "Unesite ispravan južnoafrički poštanski broj."
+
+#: contrib/localflavor/za/za_provinces.py:4
+msgid "Eastern Cape"
+msgstr "Eastern Cape"
+
+#: contrib/localflavor/za/za_provinces.py:5
+msgid "Free State"
+msgstr "Free State"
+
+#: contrib/localflavor/za/za_provinces.py:6
+msgid "Gauteng"
+msgstr "Gauteng"
+
+#: contrib/localflavor/za/za_provinces.py:7
+msgid "KwaZulu-Natal"
+msgstr "KwaZulu-Natal"
+
+#: contrib/localflavor/za/za_provinces.py:8
+msgid "Limpopo"
+msgstr "Limpopo"
+
+#: contrib/localflavor/za/za_provinces.py:9
+msgid "Mpumalanga"
+msgstr "Mpumalanga"
+
+#: contrib/localflavor/za/za_provinces.py:10
+msgid "Northern Cape"
+msgstr "Northern Cape"
+
+#: contrib/localflavor/za/za_provinces.py:11
+msgid "North West"
+msgstr "North West"
+
+#: contrib/localflavor/za/za_provinces.py:12
+msgid "Western Cape"
+msgstr "Western Cape"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "preusmjeri od"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Ovo bi trebala biti apsolutna putanja, bez imena domene. Primjer: '/events/"
+"search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "preusmjeri na"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Ovo može biti ili apsolutna putanja (kao gore) ili potpuni URL koji počinje "
+"sa 'http://'"
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "preusmjeri"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "preusmjeravanja"
+
+#: contrib/sessions/models.py:46
+msgid "session key"
+msgstr "session ključ (key)"
+
+#: contrib/sessions/models.py:47
+msgid "session data"
+msgstr "session podaci"
+
+#: contrib/sessions/models.py:48
+msgid "expire date"
+msgstr "ističe na datum"
+
+#: contrib/sessions/models.py:53
+msgid "session"
+msgstr "session"
+
+#: contrib/sessions/models.py:54
+msgid "sessions"
+msgstr "sessions"
+
+#: contrib/sites/models.py:32
+msgid "domain name"
+msgstr "ime domene"
+
+#: contrib/sites/models.py:33
+msgid "display name"
+msgstr "ime za prikaz"
+
+#: contrib/sites/models.py:37
+msgid "site"
+msgstr "stranica"
+
+#: contrib/sites/models.py:38
+msgid "sites"
+msgstr "stranice"
+
+#: core/validators.py:72
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Ova vrijednost može sadržavati samo slova, brojeve i povlaku."
+
+#: core/validators.py:76
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Ova vrijednost može sadržavati samo slova, brojeve, povlaku, crtice ili "
+"slashes (/)."
+
+#: core/validators.py:80
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "Ova vrijednost može sadržavati samo slova, brojeve, povlake ili hyphens."
+
+#: core/validators.py:84
+msgid "Uppercase letters are not allowed here."
+msgstr "Velika slova ovdje nisu dopuštena."
+
+#: core/validators.py:88
+msgid "Lowercase letters are not allowed here."
+msgstr "Mala slova ovdje nisu dopuštena"
+
+#: core/validators.py:95
+msgid "Enter only digits separated by commas."
+msgstr "Unesite samo brojeve razdvojene zarezom."
+
+#: core/validators.py:107
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Unesite ispravne e-mail adrese odvojene zarezom."
+
+#: core/validators.py:111
+msgid "Please enter a valid IP address."
+msgstr "Unesite ispravnu IP adresu."
+
+#: core/validators.py:115
+msgid "Empty values are not allowed here."
+msgstr "Prazne vrijednosti nisu dopuštene ovdje."
+
+#: core/validators.py:119
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Dozvoljeni su samo numerički znakovi."
+
+#: core/validators.py:123
+msgid "This value can't be comprised solely of digits."
+msgstr "Ova vrijednost ne može sadržavati samo brojeve."
+
+#: core/validators.py:128 newforms/fields.py:151
+msgid "Enter a whole number."
+msgstr "Unesite cijeli broj."
+
+#: core/validators.py:132
+msgid "Only alphabetical characters are allowed here."
+msgstr "Dozvoljena su samo slova abecede."
+
+#: core/validators.py:147
+msgid "Year must be 1900 or later."
+msgstr "Godina mora biti 1900 ili poslije."
+
+#: core/validators.py:151
+#, python-format
+msgid "Invalid date: %s"
+msgstr "Neispravan datum: %s"
+
+#: core/validators.py:156 db/models/fields/__init__.py:509
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Unesite ispravan datum u formatu YYYY-MM-DD."
+
+#: core/validators.py:161
+msgid "Enter a valid time in HH:MM format."
+msgstr "Unesite ispravno vrijeme u HH:MM formatu."
+
+#: core/validators.py:165 db/models/fields/__init__.py:583
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Unesite ispravan datum/vrijeme u formatu YYYY-MM-DD HH:MM."
+
+#: core/validators.py:170 newforms/fields.py:402
+msgid "Enter a valid e-mail address."
+msgstr "Unesite ispravnu e-mail adresu."
+
+#: core/validators.py:182 core/validators.py:474 newforms/fields.py:432
+#: oldforms/__init__.py:687
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Datoteka nije poslana. Provjerite 'encoding type' forme."
+
+#: core/validators.py:193 newforms/fields.py:456
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Upload-ajte ispravnu sliku. Datoteka koju ste upload-ali ili nije slika ili "
+"je oštečena."
+
+#: core/validators.py:200
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "URL %s ne vodi na ispravnu sliku."
+
+#: core/validators.py:204
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Telefonski brojevi moraju biti u formatu XXX-XXX-XXXX. \"%s\" nije ispravan "
+"format."
+
+#: core/validators.py:212
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "URL %s ne vodi na ispravan QuickTime video."
+
+#: core/validators.py:216
+msgid "A valid URL is required."
+msgstr "Ispravan URL je obavezan."
+
+#: core/validators.py:230
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr "Ispravan HTML je obavezan. Pogreške:<br> %s"
+
+#: core/validators.py:237
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Loše formatiran XML: %s"
+
+#: core/validators.py:254
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Neispravan URL: %s"
+
+#: core/validators.py:259 core/validators.py:261
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "URL %s je neispravan (broken) link."
+
+#: core/validators.py:267
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Unesite ispravanu kraticu za državu S.A.D.-a."
+
+#: core/validators.py:281
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Pazite na izražavanje! Riječ %s nije dopuštena."
+msgstr[1] "Pazite na izražavanje! Riječi %s nisu dopuštene."
+
+#: core/validators.py:288
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Ovo polje mora biti jednako %s polju."
+
+#: core/validators.py:307
+msgid "Please enter something for at least one field."
+msgstr "Molim unesite nešto bar za jedno polje."
+
+#: core/validators.py:316 core/validators.py:327
+msgid "Please enter both fields or leave them both empty."
+msgstr "Molim unesite vrijednosti za oba polja ili ostavite oba polja prazna."
+
+#: core/validators.py:335
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Ovo polje mora biti ispunjeno ako je %(field)s %(value)s"
+
+#: core/validators.py:348
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Ovo polje je obavezno ako je %(field)s različito od %(value)s"
+
+#: core/validators.py:367
+msgid "Duplicate values are not allowed."
+msgstr "Duplicirane vrijednosti nisu dopuštene."
+
+#: core/validators.py:382
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Vrijednost mora biti između %(lower)s i %(upper)s."
+
+#: core/validators.py:384
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Vrijednost mora biti bar %s."
+
+#: core/validators.py:386
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Vrijednost ne može biti veća od %s."
+
+#: core/validators.py:427
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Ova vrijednost mora biti %s na kvadrat."
+
+#: core/validators.py:437
+msgid "Please enter a valid decimal number."
+msgstr "Molim unesite ispravan decimalni broj."
+
+#: core/validators.py:444
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural "Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Molim unesite ispravan decimalni broj sa najviše %s numerička znaka."
+msgstr[1] "Molim unesite ispravan decimalni broj sa najviše %s numeričkih znakova."
+
+#: core/validators.py:447
+#, python-format
+msgid "Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural "Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] "Molim unesite ispravan decimalni broj sa najviše %s numerička znaka u cijelom dijelu."
+msgstr[1] "Molim unesite ispravan decimalni broj sa najviše %s numeričkih znakova u cijelom dijelu."
+
+#: core/validators.py:450
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural "Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "Molim unesite ispravan decimalni broj sa najviše %s decimalna mjesta."
+msgstr[1] "Molim unesite ispravan decimalni broj sa najviše %s decimalnih mjesta."
+
+#: core/validators.py:458
+msgid "Please enter a valid floating point number."
+msgstr "Molim unesite ispravan broj sa pomičnim zarezom (floating point number)."
+
+#: core/validators.py:467
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Provjerite je li Vaša upload-ana datoteka bar %s byte-ova velika."
+
+#: core/validators.py:468
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Provjerite je li Vaša upload-ana datoteka najviše %s byte-ova velika."
+
+#: core/validators.py:485
+msgid "The format for this field is wrong."
+msgstr "Format za ovo polje je pogrešno."
+
+#: core/validators.py:500
+msgid "This field is invalid."
+msgstr "Ovo polje je neispravno."
+
+#: core/validators.py:536
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Ništa nije izvučeno iz %s."
+
+#: core/validators.py:539
+#, python-format
+msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "URL %(url)s je vratio neispravan Content-Type header '%(contenttype)s'."
+
+#: core/validators.py:572
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Molim zatvorite %(tag)s na liniji %(line)s. (Linija počinje sa "
+"\"%(start)s\".)"
+
+#: core/validators.py:576
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Neki tekst koji počinje na liniji %(line)s nije dopušten u tom kontekstu. (Linija "
+"počinje sa \"%(start)s\".)"
+
+#: core/validators.py:581
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"%(attr)s\" na liniji %(line)s je neispravan atribut. (Linija počinje sa \"%"
+"(start)s\".)"
+
+#: core/validators.py:586
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\" na liniji %(line)s je neispravan tag. (Linija počinje sa \"%"
+"(start)s\".)"
+
+#: core/validators.py:590
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Tagu na liniji %(line)s nedostaje jedan ili više obaveznih atributa. (Linija "
+"počinje sa \"%(start)s\".)"
+
+#: core/validators.py:595
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"\"%(attr)s\" atribut na liniji %(line)s ima neispravnu vrijednost. (Linija "
+"počinje sa \"%(start)s\".)"
+
+#: db/models/manipulators.py:308
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(object)s sa %(type)s već postoji za navedeno %(field)s."
+
+#: db/models/fields/__init__.py:52
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s sa navedenim %(fieldname)s već postoji."
+
+#: db/models/fields/__init__.py:161 db/models/fields/__init__.py:318
+#: db/models/fields/__init__.py:735 db/models/fields/__init__.py:746
+#: newforms/fields.py:45 oldforms/__init__.py:374
+msgid "This field is required."
+msgstr "Unos za ovo polje je obavezno."
+
+#: db/models/fields/__init__.py:418
+msgid "This value must be an integer."
+msgstr "Vrijednost mora biti cijeli broj."
+
+#: db/models/fields/__init__.py:454
+msgid "This value must be either True or False."
+msgstr "Vrijednost mora biti True ili False."
+
+#: db/models/fields/__init__.py:475
+msgid "This field cannot be null."
+msgstr "Ovo polje ne može biti null."
+
+#: db/models/fields/__init__.py:644
+msgid "This value must be a decimal number."
+msgstr "Vrijednost mora biti decimalan broj."
+
+#: db/models/fields/__init__.py:755
+msgid "Enter a valid filename."
+msgstr "Unesite ime datoteke koja postoji."
+
+#: db/models/fields/__init__.py:904
+msgid "This value must be either None, True or False."
+msgstr "Vrijednost mora biti None, True ili False."
+
+#: db/models/fields/related.py:55
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Molim unesite ispravan %s."
+
+#: db/models/fields/related.py:658
+msgid "Separate multiple IDs with commas."
+msgstr "Odvojite više ID-a zarezom."
+
+#: db/models/fields/related.py:660
+msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Držite \"Control\", ili \"Command\" na Mac-u, da bi odabrali više od "
+"jednog objekta."
+
+#: db/models/fields/related.py:707
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural "Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "Molim unesite ispravan %(self)s ID-eve. Vrijednost %(value)r je neispravna."
+msgstr[1] "Molim unesite ispravan %(self)s ID-eve. Vrijednosti %(value)r su neispravne."
+
+#: newforms/fields.py:46
+msgid "Enter a valid value."
+msgstr "Unesite ispravnu vrijednost."
+
+#: newforms/fields.py:123
+#, python-format
+msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+msgstr "Osigurajte da ova vrijednost ima najviše %(max)d znakova (ima %(length)d)."
+
+#: newforms/fields.py:124
+#, python-format
+msgid "Ensure this value has at least %(min)d characters (it has %(length)d)."
+msgstr "Osigurajte da ova vrijednost ima najmanje %(min)d znakova (ima %(length)d)."
+
+#: newforms/fields.py:152 newforms/fields.py:181 newforms/fields.py:210
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Osigurajte da je ova vrijednost manja ili jednaka %s."
+
+#: newforms/fields.py:153 newforms/fields.py:182 newforms/fields.py:211
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Osigurajte da je ova vrijednost veća ili jednaka %s."
+
+#: newforms/fields.py:180 newforms/fields.py:209
+msgid "Enter a number."
+msgstr "Unesite broj."
+
+#: newforms/fields.py:212
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr "Osigurajte da ukupno nema više od %s numeričkih znakova."
+
+#: newforms/fields.py:213
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr "Osigurajte da ukupno nema više od %s decimalnih mjesta."
+
+#: newforms/fields.py:214
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr "Osigurajte da ukupno nema više od %s numeričkih znakova prije decimalne točke."
+
+#: newforms/fields.py:262 newforms/fields.py:719
+msgid "Enter a valid date."
+msgstr "Unesite ispravan datum."
+
+#: newforms/fields.py:295 newforms/fields.py:720
+msgid "Enter a valid time."
+msgstr "Unesite ispravno vrijeme."
+
+#: newforms/fields.py:334
+msgid "Enter a valid date/time."
+msgstr "Unesite ispravan datum/vrijeme."
+
+#: newforms/fields.py:433
+msgid "No file was submitted."
+msgstr "Datoteka nije poslana."
+
+#: newforms/fields.py:434 oldforms/__init__.py:689
+msgid "The submitted file is empty."
+msgstr "Poslana datoteka je prazna."
+
+#: newforms/fields.py:492
+msgid "Enter a valid URL."
+msgstr "Unesite ispravan URL."
+
+#: newforms/fields.py:493
+msgid "This URL appears to be a broken link."
+msgstr "Izgleda da je URL neispravan."
+
+#: newforms/fields.py:555 newforms/models.py:317
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Izaberite ispravnu opciju. Ta opcija nije jedna od dostupnih opcija."
+
+#: newforms/fields.py:594
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "Odaberite iz ponuđenog. %(value)s nije ponuđen kao opcija."
+
+#: newforms/fields.py:595 newforms/fields.py:657 newforms/models.py:377
+msgid "Enter a list of values."
+msgstr ""
+
+#: newforms/fields.py:748
+msgid "Enter a valid IPv4 address."
+msgstr "Unesite ispravnu IPv4 adresu."
+
+#: newforms/models.py:378
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Odaberite iz ponuđenog. %s nije ponuđen kao opcija."
+
+#: oldforms/__init__.py:409
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Osigurajte da tekst sadrži manje od %s znaka."
+msgstr[1] "Osigurajte da tekst sadrži manje od %s znakova."
+
+#: oldforms/__init__.py:414
+msgid "Line breaks are not allowed here."
+msgstr "Novi redovi ovdje nisu dozvoljeni."
+
+#: oldforms/__init__.py:512 oldforms/__init__.py:586 oldforms/__init__.py:625
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Odaberite iz ponuđenog; '%(data)s' nije u %(choices)s."
+
+#: oldforms/__init__.py:745
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Unesite cijeli broj između -32,768 i 32,767."
+
+#: oldforms/__init__.py:755
+msgid "Enter a positive number."
+msgstr "Unesite pozitivan broj."
+
+#: oldforms/__init__.py:765
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Unesite cijeli broj između 0 i 32,767."
+
+#: template/defaultfilters.py:683
+msgid "yes,no,maybe"
+msgstr "da,ne,možda"
+
+#: template/defaultfilters.py:714
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d bajt"
+msgstr[1] "%(size)d bajta"
+
+#: template/defaultfilters.py:716
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f KB"
+
+#: template/defaultfilters.py:718
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: template/defaultfilters.py:719
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#: utils/dateformat.py:41
+msgid "p.m."
+msgstr "popodne"
+
+#: utils/dateformat.py:42
+msgid "a.m."
+msgstr "ujutro"
+
+#: utils/dateformat.py:47
+msgid "PM"
+msgstr "popodne"
+
+#: utils/dateformat.py:48
+msgid "AM"
+msgstr "ujutro"
+
+#: utils/dateformat.py:97
+msgid "midnight"
+msgstr "ponoć"
+
+#: utils/dateformat.py:99
+msgid "noon"
+msgstr "podne"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Ponedjeljak"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Utorak"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Srijeda"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Četvrtak"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Petak"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Subota"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Nedjelja"
+
+#: utils/dates.py:10
+msgid "Mon"
+msgstr "Pon"
+
+#: utils/dates.py:10
+msgid "Tue"
+msgstr "Uto"
+
+#: utils/dates.py:10
+msgid "Wed"
+msgstr "Sri"
+
+#: utils/dates.py:10
+msgid "Thu"
+msgstr "Čet"
+
+#: utils/dates.py:10
+msgid "Fri"
+msgstr "Pet"
+
+#: utils/dates.py:11
+msgid "Sat"
+msgstr "Sub"
+
+#: utils/dates.py:11
+msgid "Sun"
+msgstr "Ned"
+
+#: utils/dates.py:18
+msgid "January"
+msgstr "Siječanj"
+
+#: utils/dates.py:18
+msgid "February"
+msgstr "Veljača"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "March"
+msgstr "Ožujak"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "April"
+msgstr "Travanj"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "May"
+msgstr "Svibanj"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "June"
+msgstr "Lipanj"
+
+#: utils/dates.py:19 utils/dates.py:31
+msgid "July"
+msgstr "Srpanj"
+
+#: utils/dates.py:19
+msgid "August"
+msgstr "Kolovoz"
+
+#: utils/dates.py:19
+msgid "September"
+msgstr "Rujan"
+
+#: utils/dates.py:19
+msgid "October"
+msgstr "Listopad"
+
+#: utils/dates.py:19
+msgid "November"
+msgstr "Studeni"
+
+#: utils/dates.py:20
+msgid "December"
+msgstr "Prosinac"
+
+#: utils/dates.py:23
+msgid "jan"
+msgstr "sij."
+
+#: utils/dates.py:23
+msgid "feb"
+msgstr "velj."
+
+#: utils/dates.py:23
+msgid "mar"
+msgstr "ožu."
+
+#: utils/dates.py:23
+msgid "apr"
+msgstr "tra."
+
+#: utils/dates.py:23
+msgid "may"
+msgstr "svi."
+
+#: utils/dates.py:23
+msgid "jun"
+msgstr "lip."
+
+#: utils/dates.py:24
+msgid "jul"
+msgstr "srp."
+
+#: utils/dates.py:24
+msgid "aug"
+msgstr "kol."
+
+#: utils/dates.py:24
+msgid "sep"
+msgstr "ruj."
+
+#: utils/dates.py:24
+msgid "oct"
+msgstr "lis."
+
+#: utils/dates.py:24
+msgid "nov"
+msgstr "stu."
+
+#: utils/dates.py:24
+msgid "dec"
+msgstr "pro."
+
+#: utils/dates.py:31
+msgid "Jan."
+msgstr "Sij."
+
+#: utils/dates.py:31
+msgid "Feb."
+msgstr "Velj."
+
+#: utils/dates.py:32
+msgid "Aug."
+msgstr "Kol."
+
+#: utils/dates.py:32
+msgid "Sept."
+msgstr "Ruj."
+
+#: utils/dates.py:32
+msgid "Oct."
+msgstr "Lis."
+
+#: utils/dates.py:32
+msgid "Nov."
+msgstr "Stu."
+
+#: utils/dates.py:32
+msgid "Dec."
+msgstr "Pro."
+
+#: utils/text.py:127
+msgid "or"
+msgstr "ili"
+
+#: utils/timesince.py:21
+msgid "year"
+msgid_plural "years"
+msgstr[0] "godina"
+msgstr[1] "godine"
+
+#: utils/timesince.py:22
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mjesec"
+msgstr[1] "mjeseci"
+
+#: utils/timesince.py:23
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "tjedan"
+msgstr[1] "tjedani"
+
+#: utils/timesince.py:24
+msgid "day"
+msgid_plural "days"
+msgstr[0] "dan"
+msgstr[1] "dani"
+
+#: utils/timesince.py:25
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "sat"
+msgstr[1] "sati"
+
+#: utils/timesince.py:26
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuta"
+msgstr[1] "minute"
+
+#: utils/timesince.py:46
+msgid "minutes"
+msgstr "minuta"
+
+#: utils/timesince.py:51
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr "%(number)d %(type)s"
+
+#: utils/timesince.py:57
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ", %(number)d %(type)s"
+
+#: utils/translation/trans_real.py:399
+msgid "DATE_FORMAT"
+msgstr "DATE_FORMAT"
+
+#: utils/translation/trans_real.py:400
+msgid "DATETIME_FORMAT"
+msgstr "DATETIME_FORMAT"
+
+#: utils/translation/trans_real.py:401
+msgid "TIME_FORMAT"
+msgstr "TIME_FORMAT"
+
+#: utils/translation/trans_real.py:417
+msgid "YEAR_MONTH_FORMAT"
+msgstr "YEAR_MONTH_FORMAT"
+
+#: utils/translation/trans_real.py:418
+msgid "MONTH_DAY_FORMAT"
+msgstr "MONTH_DAY_FORMAT"
+
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "%(verbose_name)s je uspješno kreirano."
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "%(verbose_name)s je uspješno promijenjeno."
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "%(verbose_name)s je izbrisano."
+
diff --git a/webapp/django/conf/locale/hr/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/hr/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..30f7c19
--- /dev/null
+++ b/webapp/django/conf/locale/hr/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/hr/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/hr/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..5ad8993
--- /dev/null
+++ b/webapp/django/conf/locale/hr/LC_MESSAGES/djangojs.po
@@ -0,0 +1,117 @@
+# translation of djangojs.po to Hrvatski jezik
+# This file is distributed under the same license as the Django package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-08-13 11:13+1000\n"
+"PO-Revision-Date: 2008-06-17 23:45+0100\n"
+"Last-Translator: Aljosa Mohorovic <aljosa.mohorovic@gmail.com>\n"
+"Language-Team: Hrvatski jezik\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "Dostupno %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Odaberi sve"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Dodaj"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Ukloni"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Odabrano %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Odaberi iz izbora i klikni "
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Očisti sve"
+
+#: contrib/admin/media/js/dateparse.js:32
+#: contrib/admin/media/js/calendar.js:24
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr "Siječanj Veljača Ožujak Travanj Svibanj Lipanj Srpanj Kolovoz Rujan Listopad Studeni Prosinac"
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Nedjelja Ponedjeljak Utorak Srijeda Četvrtak Petak Subota"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "N P U S Č P S"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Now"
+msgstr "Sada"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
+msgid "Clock"
+msgstr "Sat"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
+msgid "Choose a time"
+msgstr "Izaberite vrijeme"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "Midnight"
+msgstr "Ponoć"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "6 a.m."
+msgstr "6 ujutro"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
+msgid "Noon"
+msgstr "Podne"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
+msgid "Cancel"
+msgstr "Odustani"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
+msgid "Today"
+msgstr "Danas"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
+msgid "Calendar"
+msgstr "Kalendar"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
+msgid "Yesterday"
+msgstr "Jučer"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
+msgid "Tomorrow"
+msgstr "Sutra"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr "Prikaži"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr "Sakri"
+
diff --git a/webapp/django/conf/locale/hu/LC_MESSAGES/django.mo b/webapp/django/conf/locale/hu/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..60c544a
--- /dev/null
+++ b/webapp/django/conf/locale/hu/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/hu/LC_MESSAGES/django.po b/webapp/django/conf/locale/hu/LC_MESSAGES/django.po
new file mode 100644
index 0000000..2f1d10a
--- /dev/null
+++ b/webapp/django/conf/locale/hu/LC_MESSAGES/django.po
@@ -0,0 +1,3497 @@
+# translation of django.po to Hungarian
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-08-21 02:23+0200\n"
+"PO-Revision-Date: 2007-08-21 02:28+0200\n"
+"Last-Translator: Szilveszter Farkas <szilveszter.farkas@gmail.com>\n"
+"Language-Team: Hungarian <hu@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms:  nplurals=2; plural=(n != 1);\n"
+
+#: oldforms/__init__.py:373 db/models/fields/__init__.py:156
+#: db/models/fields/__init__.py:313 db/models/fields/__init__.py:721
+#: db/models/fields/__init__.py:732 newforms/models.py:193
+#: newforms/fields.py:92 newforms/fields.py:490 newforms/fields.py:566
+#: newforms/fields.py:577
+msgid "This field is required."
+msgstr "Ennek a mezőnek a megadása kötelező."
+
+#: oldforms/__init__.py:408
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "A szövegnek rövidebbnek kell lennie %s karakternél."
+msgstr[1] "A szövegnek rövidebbnek kell lennie %s karakternél."
+
+#: oldforms/__init__.py:413
+msgid "Line breaks are not allowed here."
+msgstr "Sortörések itt nem megengedettek."
+
+#: oldforms/__init__.py:511 oldforms/__init__.py:585 oldforms/__init__.py:624
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Válasszon egy érvényes elemet, '%(data)s' nincs ezek között: %(choices)s."
+
+#: oldforms/__init__.py:591 newforms/widgets.py:188
+#: contrib/admin/filterspecs.py:152
+msgid "Unknown"
+msgstr "Ismeretlen"
+
+#: oldforms/__init__.py:591 newforms/widgets.py:188
+#: contrib/admin/filterspecs.py:145
+msgid "Yes"
+msgstr "Igen"
+
+#: oldforms/__init__.py:591 newforms/widgets.py:188
+#: contrib/admin/filterspecs.py:145
+msgid "No"
+msgstr "Nem"
+
+#: oldforms/__init__.py:686 core/validators.py:181 core/validators.py:461
+#: newforms/fields.py:376
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Nem küldött el fájlt. Ellenőrizze a kódolás típusát az űrlapon."
+
+#: oldforms/__init__.py:688 newforms/fields.py:380
+msgid "The submitted file is empty."
+msgstr "A küldött fájl üres."
+
+#: oldforms/__init__.py:744
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Írjon be egy egész számot -32 768 és 32 767 között."
+
+#: oldforms/__init__.py:754
+msgid "Enter a positive number."
+msgstr "Írjon be egy pozitív számot."
+
+#: oldforms/__init__.py:764
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Írjon be egy egész számot 0 és 32 767 között."
+
+#: db/models/manipulators.py:309
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "A megadott %(field)s mezőhöz már létezik %(type)s típusú %(object)s elem."
+
+#: db/models/manipulators.py:310 core/validators.py:275
+#: contrib/admin/views/main.py:342 contrib/admin/views/main.py:344
+#: contrib/admin/views/main.py:346
+msgid "and"
+msgstr "és"
+
+# TODO
+#: db/models/fields/__init__.py:49
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s ezzel a(z) %(fieldname)s már létezik."
+
+#: db/models/fields/__init__.py:411
+msgid "This value must be an integer."
+msgstr "Az értéknek egész számnak kell lennie."
+
+#: db/models/fields/__init__.py:446
+msgid "This value must be either True or False."
+msgstr "Az értéknek igaznak (True) vagy hamisnak (False) kell lennie."
+
+#: db/models/fields/__init__.py:467
+msgid "This field cannot be null."
+msgstr "Ez a mező nem lehet nulla."
+
+#: db/models/fields/__init__.py:501 core/validators.py:155
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Írjon be egy érvényes dátumot 'ÉÉÉÉ-HH-NN' alakban."
+
+#: db/models/fields/__init__.py:570 core/validators.py:164
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Írjon be egy érvényes dátumot/időt 'ÉÉÉÉ-HH-NN ÓÓ-PP' alakban."
+
+#: db/models/fields/__init__.py:631
+msgid "This value must be a decimal number."
+msgstr "Az értéknek decimálisnak kell lennie."
+
+#: db/models/fields/__init__.py:741
+msgid "Enter a valid filename."
+msgstr "Adjon meg egy érvényes fájlnevet."
+
+#: db/models/fields/__init__.py:883
+msgid "This value must be either None, True or False."
+msgstr ""
+"Az értéknek semminek (None), igaznak (True), vagy hamisnak (False) kell "
+"lennie."
+
+#: db/models/fields/related.py:55
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Adjon meg egy érvényes %s értéket."
+
+#: db/models/fields/related.py:658
+msgid "Separate multiple IDs with commas."
+msgstr "Az ID-ket vesszővel válassza el."
+
+#: db/models/fields/related.py:660
+msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Tartsa lenyomva a \"Control\"-t (vagy Mac-en a \"Command\"-ot) több elem "
+"kiválasztásához."
+
+#: db/models/fields/related.py:707
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural "Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "Írjon be érvényes %(self)s ID-t. A mostani érték érvénytelen: %(value)r."
+msgstr[1] ""
+"Írjon be érvényes %(self)s ID-ket. A mostani értékek érvénytelenek: %(value)"
+"r."
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "Arab"
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "Bengáli"
+
+#: conf/global_settings.py:41
+msgid "Bulgarian"
+msgstr "Bolgár"
+
+#: conf/global_settings.py:42
+msgid "Catalan"
+msgstr "Katalán"
+
+#: conf/global_settings.py:43
+msgid "Czech"
+msgstr "Cseh"
+
+#: conf/global_settings.py:44
+msgid "Welsh"
+msgstr "Walesi"
+
+#: conf/global_settings.py:45
+msgid "Danish"
+msgstr "Dán"
+
+#: conf/global_settings.py:46
+msgid "German"
+msgstr "Német"
+
+#: conf/global_settings.py:47
+msgid "Greek"
+msgstr "Görög"
+
+#: conf/global_settings.py:48
+msgid "English"
+msgstr "Angol"
+
+#: conf/global_settings.py:49
+msgid "Spanish"
+msgstr "Spanyol"
+
+#: conf/global_settings.py:50
+msgid "Argentinean Spanish"
+msgstr "Argentín spanyol"
+
+#: conf/global_settings.py:51
+msgid "Persian"
+msgstr "Perzsa"
+
+#: conf/global_settings.py:52
+msgid "Finnish"
+msgstr "Finn"
+
+#: conf/global_settings.py:53
+msgid "French"
+msgstr "Francia"
+
+#: conf/global_settings.py:54
+msgid "Galician"
+msgstr "Gall"
+
+#: conf/global_settings.py:55
+msgid "Hungarian"
+msgstr "Magyar"
+
+#: conf/global_settings.py:56
+msgid "Hebrew"
+msgstr "Héber"
+
+#: conf/global_settings.py:57
+msgid "Croatian"
+msgstr "Horvát"
+
+#: conf/global_settings.py:58
+msgid "Icelandic"
+msgstr "Izlandi"
+
+#: conf/global_settings.py:59
+msgid "Italian"
+msgstr "Olasz"
+
+#: conf/global_settings.py:60
+msgid "Japanese"
+msgstr "Japán"
+
+#: conf/global_settings.py:61
+msgid "Korean"
+msgstr "Koreai"
+
+#: conf/global_settings.py:62
+msgid "Kannada"
+msgstr "Kannada"
+
+#: conf/global_settings.py:63
+msgid "Latvian"
+msgstr "Litván"
+
+#: conf/global_settings.py:64
+msgid "Macedonian"
+msgstr "Macedón"
+
+#: conf/global_settings.py:65
+msgid "Dutch"
+msgstr "Holland"
+
+#: conf/global_settings.py:66
+msgid "Norwegian"
+msgstr "Norvég"
+
+#: conf/global_settings.py:67
+msgid "Polish"
+msgstr "Lengyel"
+
+#: conf/global_settings.py:68
+msgid "Portugese"
+msgstr "Portugál"
+
+#: conf/global_settings.py:69
+msgid "Brazilian"
+msgstr "Brazil"
+
+#: conf/global_settings.py:70
+msgid "Romanian"
+msgstr "Román"
+
+#: conf/global_settings.py:71
+msgid "Russian"
+msgstr "Orosz"
+
+#: conf/global_settings.py:72
+msgid "Slovak"
+msgstr "Szlovák"
+
+#: conf/global_settings.py:73
+msgid "Slovenian"
+msgstr "Szlovén"
+
+#: conf/global_settings.py:74
+msgid "Serbian"
+msgstr "Szerb"
+
+#: conf/global_settings.py:75
+msgid "Swedish"
+msgstr "Svéd"
+
+#: conf/global_settings.py:76
+msgid "Tamil"
+msgstr "Tamil"
+
+#: conf/global_settings.py:77
+msgid "Telugu"
+msgstr "Telugu"
+
+#: conf/global_settings.py:78
+msgid "Turkish"
+msgstr "Török"
+
+#: conf/global_settings.py:79
+msgid "Ukrainian"
+msgstr "Ukrán"
+
+#: conf/global_settings.py:80
+msgid "Simplified Chinese"
+msgstr "Egyszerű kínai"
+
+#: conf/global_settings.py:81
+msgid "Traditional Chinese"
+msgstr "Hagyományos kínai"
+
+#: core/validators.py:71
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Az érték csak betűket, számokat és aláhúzást tartalmazhat."
+
+#: core/validators.py:75
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr "Az érték csak betűket, számokat, aláhúzást és perjelet tartalmazhat."
+
+#: core/validators.py:79
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "Az érték csak betűket, számokat, aláhúzást és kötőjelet tartalmazhat."
+
+#: core/validators.py:83
+msgid "Uppercase letters are not allowed here."
+msgstr "Nagybetűk itt nem megengedettek."
+
+#: core/validators.py:87
+msgid "Lowercase letters are not allowed here."
+msgstr "Kisbetűk itt nem megengedettek."
+
+#: core/validators.py:94
+msgid "Enter only digits separated by commas."
+msgstr "Csak számokat adjon meg, vesszővel elválasztva."
+
+#: core/validators.py:106
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Érvényes e-mail címeket adjon meg, vesszővel elválasztva."
+
+#: core/validators.py:110
+msgid "Please enter a valid IP address."
+msgstr "Írjon be egy érvényes IP címet."
+
+#: core/validators.py:114
+msgid "Empty values are not allowed here."
+msgstr "Üres érték itt nem megengedett."
+
+#: core/validators.py:118
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Nem szám karakterek itt nem megengedettek."
+
+#: core/validators.py:122
+msgid "This value can't be comprised solely of digits."
+msgstr "Ez az érték nem tartalmazhat kizárólag számokat."
+
+#: core/validators.py:127 newforms/fields.py:142
+msgid "Enter a whole number."
+msgstr "Adjon meg egy egész számot."
+
+#: core/validators.py:131
+msgid "Only alphabetical characters are allowed here."
+msgstr "Itt csak betűk megengedettek."
+
+#: core/validators.py:146
+msgid "Year must be 1900 or later."
+msgstr "Az évnek 1900-nak vagy későbbinek kell lennie."
+
+#: core/validators.py:150
+#, python-format
+msgid "Invalid date: %s"
+msgstr "Érvénytelen dátum: %s"
+
+#: core/validators.py:160
+msgid "Enter a valid time in HH:MM format."
+msgstr "Írjon be egy érvényes időt 'ÓÓ:PP' alakban."
+
+#: core/validators.py:169 newforms/fields.py:336
+msgid "Enter a valid e-mail address."
+msgstr "Írjon be egy érvényes e-mail címet."
+
+#: core/validators.py:185 newforms/fields.py:397
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Töltsön fel egy érvényes képfájlt. A feltöltött fájl nem kép volt, vagy "
+"megsérült."
+
+#: core/validators.py:192
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "A hivatkozás (%s) érvénytelen képfájlra mutat."
+
+#: core/validators.py:196
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"A telefonszámoknak 'XXX-XXX-XXXX' formátumúnak kell lenniük. \"%s\" "
+"érvénytelen."
+
+#: core/validators.py:204
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "A hivatkozás (%s) érvénytelen QuickTime videóra mutat."
+
+#: core/validators.py:208
+msgid "A valid URL is required."
+msgstr "Érvényes URL szükséges."
+
+#: core/validators.py:222
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Érvényes HTML kell. A hiba:\n"
+"%s"
+
+#: core/validators.py:229
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Rosszul formázott XML: %s"
+
+#: core/validators.py:246
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Érvénytelen URL: %s"
+
+#: core/validators.py:251 core/validators.py:253
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "A hivatkozás (%s) egy törött link."
+
+#: core/validators.py:259
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Írja be egy érvényes USA állam rövidítését."
+
+#: core/validators.py:273
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Vigyázzon a szájára! Az ilyen szó (%s) itt nem megengedett."
+msgstr[1] "Vigyázzon a szájára! Az ilyen szavak (%s) itt nem megengedettek."
+
+# TODO
+#: core/validators.py:280
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Ennek a mezőnek egyeznie kell a(z) %s mezővel."
+
+#: core/validators.py:299
+msgid "Please enter something for at least one field."
+msgstr "Írjon be valamit legalább egy mezőbe."
+
+#: core/validators.py:308 core/validators.py:319
+msgid "Please enter both fields or leave them both empty."
+msgstr "Töltse ki mindkét mezőt, vagy hagyja üresen mindkettőt."
+
+#: core/validators.py:327
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Ezt a mezőt meg kell adni, ha %(field)s értéke %(value)s"
+
+#: core/validators.py:340
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Ezt a mezőt meg kell adni, ha %(field)s értéke nem %(value)s"
+
+#: core/validators.py:359
+msgid "Duplicate values are not allowed."
+msgstr "Ugyanazok az értékek nem megengedettek."
+
+#: core/validators.py:374
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Az értéknek %(lower)s és %(upper)s között kell lennie."
+
+#: core/validators.py:376
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Az értéknek legalább ennyinek kell lennie: %s."
+
+#: core/validators.py:378
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Az érték nem lehet több ennyinél: %s."
+
+#: core/validators.py:414
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Az értéknek %s hatványának kell lennie."
+
+#: core/validators.py:424
+msgid "Please enter a valid decimal number."
+msgstr "Írjon be egy érvényes decimális számot."
+
+#: core/validators.py:431
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural "Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Írjon be egy legalább %s jegyű érvényes decimális számot."
+msgstr[1] "Írjon be egy legalább %s jegyű érvényes decimális számot."
+
+#: core/validators.py:434
+#, python-format
+msgid "Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural "Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] "Írjon be egy érvényes decimális számot, legfeljebb %s egész számjeggyel."
+msgstr[1] "Írjon be egy érvényes decimális számot, legfeljebb %s egész számjeggyel."
+
+#: core/validators.py:437
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural "Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "Írjon be egy érvényes decimális számot, legfeljebb %s tizedessel."
+msgstr[1] "Írj be egy érvényes decimális számot, legfeljebb %s tizedessel."
+
+#: core/validators.py:445
+msgid "Please enter a valid floating point number."
+msgstr "Írj be egy érvényes lebegőpontos számot."
+
+#: core/validators.py:454
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "A feltöltött fájl legalább %s bájt méretű legyen."
+
+#: core/validators.py:455
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "A feltöltött fájl legfeljebb %s bájt méretű lehet."
+
+#: core/validators.py:472
+msgid "The format for this field is wrong."
+msgstr "Ennek a mezőnek rossz a formátuma."
+
+#: core/validators.py:487
+msgid "This field is invalid."
+msgstr "A mező érvénytelen."
+
+#: core/validators.py:523
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Nem lehet semmit kinyerni innen: %s."
+
+#: core/validators.py:526
+#, python-format
+msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"A hivatkozás (%(url)s) érvénytelen '%(contenttype)s' Content-Type fejlécet "
+"adott vissza."
+
+#: core/validators.py:559
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Zárja le a nyitott %(tag)s címkét a következő sorban: %(line)s. (A sor "
+"kezdete: \"%(start)s\".)"
+
+#: core/validators.py:563
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Valamely szöveg nem megengedett ebben a környezetben a következő sorban: %"
+"(line)s. (A sor kezdete: \"%(start)s\".)"
+
+#: core/validators.py:568
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"%(attr)s\" érvénytelen tulajdonság a következő sorban: %(line)s. (A sor "
+"kezdete: \"%(start)s\".)"
+
+#: core/validators.py:573
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\" érvénytelen címke a következő sorban: %(line)s. (A sor "
+"kezdete: \"%(start)s\".)"
+
+#: core/validators.py:577
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"A következő sorban lévő címkéről hiányzik egy vagy több kötelező "
+"tulajdonság: %(line)s. (A sor kezdete: \"%(start)s\".)"
+
+#: core/validators.py:582
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"A tulajdonság (\"%(attr)s\") érvénytelen a következő sorban: %(line)s. (A "
+"sor kezdete: \"%(start)s\".)"
+
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "%(verbose_name)s sikeresen létrehozva."
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "%(verbose_name)s sikeresen frissítve."
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "%(verbose_name)s törölve."
+
+#: newforms/models.py:180 newforms/fields.py:478
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr ""
+"Válasszon érvényes elemet. Az Ön választása nincs az elérhető lehetőségek "
+"között."
+
+#: newforms/models.py:197 newforms/fields.py:494 newforms/fields.py:570
+msgid "Enter a list of values."
+msgstr "Adja meg értékek egy listáját."
+
+#: newforms/models.py:203 newforms/fields.py:500
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Válasszon érvényes elemet. %s nincs az elérhető lehetőségek között."
+
+#: newforms/fields.py:116
+#, python-format
+msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+msgstr ""
+"Bizonyosodjon meg arról, hogy ez az érték legfeljebb %(max)d karaktert "
+"tartalmaz (jelenlegi hossza: %(length)d)."
+
+#: newforms/fields.py:118
+#, python-format
+msgid "Ensure this value has at least %(min)d characters (it has %(length)d)."
+msgstr ""
+"Bizonyosodjon meg arról, hogy ez az érték legalább %(min)d karaktert "
+"tartalmaz (jelenlegi hossza: %(length)d)."
+
+#: newforms/fields.py:144 newforms/fields.py:167 newforms/fields.py:197
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Bizonyosodjon meg arról, hogy az érték %s vagy kisebb."
+
+#: newforms/fields.py:146 newforms/fields.py:169 newforms/fields.py:199
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Bizonyosodjon meg arról, hogy az érték %s vagy nagyobb."
+
+#: newforms/fields.py:165 newforms/fields.py:192
+msgid "Enter a number."
+msgstr "Adj meg egy számot."
+
+#: newforms/fields.py:201
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr "Bizonyosodjon meg arról, hogy nincs ennél több számjegy: %s."
+
+#: newforms/fields.py:203
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr "Bizonyosodjon meg arról, hogy nincs ennél több tizedesjegy: %s."
+
+#: newforms/fields.py:205
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr ""
+"Bizonyosodjon meg arról, hogy nincs ennél több számjegy a tizedesvessző "
+"előtt: %s."
+
+#: newforms/fields.py:238 newforms/fields.py:610
+msgid "Enter a valid date."
+msgstr "Adjon meg egy érvényes dátumot."
+
+#: newforms/fields.py:265 newforms/fields.py:612
+msgid "Enter a valid time."
+msgstr "Adjon meg egy érvényes időt."
+
+#: newforms/fields.py:301
+msgid "Enter a valid date/time."
+msgstr "Adjon meg egy érvényes dátumot/időt."
+
+#: newforms/fields.py:314
+msgid "Enter a valid value."
+msgstr "Adjon meg egy érvényes értéket."
+
+#: newforms/fields.py:378
+msgid "No file was submitted."
+msgstr "Semmilyen fájl sem került feltöltésre."
+
+#: newforms/fields.py:403 newforms/fields.py:425
+msgid "Enter a valid URL."
+msgstr "Adjon meg egy érvényes URL-t."
+
+#: newforms/fields.py:427
+msgid "This URL appears to be a broken link."
+msgstr "Ez a hivatkozás törött linknek tűnik."
+
+#: contrib/humanize/templatetags/humanize.py:20
+msgid "th"
+msgstr "."
+
+#: contrib/humanize/templatetags/humanize.py:20
+msgid "st"
+msgstr "."
+
+#: contrib/humanize/templatetags/humanize.py:20
+msgid "nd"
+msgstr "."
+
+#: contrib/humanize/templatetags/humanize.py:20
+msgid "rd"
+msgstr "."
+
+#: contrib/humanize/templatetags/humanize.py:50
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value)1f millió"
+msgstr[1] "%(value)1f millió"
+
+#: contrib/humanize/templatetags/humanize.py:53
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value)1f milliárd"
+msgstr[1] "%(value)1f milliárd"
+
+#: contrib/humanize/templatetags/humanize.py:56
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value)1f trilliárd"
+msgstr[1] "%(value)1f trilliárd"
+
+#: contrib/humanize/templatetags/humanize.py:71
+msgid "one"
+msgstr "egy"
+
+#: contrib/humanize/templatetags/humanize.py:71
+msgid "two"
+msgstr "kettő"
+
+#: contrib/humanize/templatetags/humanize.py:71
+msgid "three"
+msgstr "három"
+
+#: contrib/humanize/templatetags/humanize.py:71
+msgid "four"
+msgstr "négy"
+
+#: contrib/humanize/templatetags/humanize.py:71
+msgid "five"
+msgstr "öt"
+
+#: contrib/humanize/templatetags/humanize.py:71
+msgid "six"
+msgstr "hat"
+
+#: contrib/humanize/templatetags/humanize.py:71
+msgid "seven"
+msgstr "hét"
+
+#: contrib/humanize/templatetags/humanize.py:71
+msgid "eight"
+msgstr "nyolc"
+
+#: contrib/humanize/templatetags/humanize.py:71
+msgid "nine"
+msgstr "kilenc"
+
+#: contrib/humanize/templatetags/humanize.py:90
+msgid "today"
+msgstr "ma"
+
+#: contrib/humanize/templatetags/humanize.py:92
+msgid "tomorrow"
+msgstr "holnap"
+
+#: contrib/humanize/templatetags/humanize.py:94
+msgid "yesterday"
+msgstr "tegnap"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "átirányítva innen"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Ennek abszolút elérési útnak kell lennie, a tartománynév nélkül. Példa: '/"
+"events/search/'"
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "átirányítva ide"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Ennek vagy abszolút elérési útnak kell lennie (mint fentebb), vagy teljes "
+"URL-nek 'http://'-vel kezdve."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "átirányítás"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "átirányít"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:169
+msgid "object ID"
+msgstr "objektum ID"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "címsor"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:170
+msgid "comment"
+msgstr "megjegyzés"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "besorolás #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "besorolás #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "besorolás #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "besorolás #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "besorolás #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "besorolás #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "besorolás #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "besorolás #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "érvényes besorolás"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:172
+msgid "date/time submitted"
+msgstr "dátum/idő beállítva"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:173
+msgid "is public"
+msgstr "publikus"
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:306
+msgid "IP address"
+msgstr "IP cím"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "eltávolítva"
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Jelöld be a négyzetet, ha a megjegyzés nem megfelelő. Az \"Ezt a megjegyzést "
+"törölték\" üzenet fog megjelenni helyette."
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "megjegyzés"
+
+#: contrib/comments/models.py:134 contrib/comments/models.py:213
+msgid "Content object"
+msgstr "Tartalom objektum"
+
+#: contrib/comments/models.py:162
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Beküldte %(user)s ekkor: %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:171
+msgid "person's name"
+msgstr "személy neve"
+
+#: contrib/comments/models.py:174
+msgid "ip address"
+msgstr "IP cím"
+
+#: contrib/comments/models.py:176
+msgid "approved by staff"
+msgstr "személyzet által elfogadva"
+
+#: contrib/comments/models.py:179
+msgid "free comment"
+msgstr "szabad megjegyzés"
+
+#: contrib/comments/models.py:180
+msgid "free comments"
+msgstr "szabad megjegyzések"
+
+#: contrib/comments/models.py:239
+msgid "score"
+msgstr "értékelés"
+
+#: contrib/comments/models.py:240
+msgid "score date"
+msgstr "értékelés dátuma"
+
+#: contrib/comments/models.py:243
+msgid "karma score"
+msgstr "karma értékelés"
+
+#: contrib/comments/models.py:244
+msgid "karma scores"
+msgstr "karma értékelések"
+
+#: contrib/comments/models.py:248
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d értékelés %(user)s felhasználótól"
+
+#: contrib/comments/models.py:264
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Ezt a megjegyzést %(user)s jelölte meg:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:271
+msgid "flag date"
+msgstr "jelölés dátuma"
+
+#: contrib/comments/models.py:274
+msgid "user flag"
+msgstr "felhasználó jelölése"
+
+#: contrib/comments/models.py:275
+msgid "user flags"
+msgstr "felhasználó jelölései"
+
+#: contrib/comments/models.py:279
+#, python-format
+msgid "Flag by %r"
+msgstr "Megjelölte %r"
+
+#: contrib/comments/models.py:284
+msgid "deletion date"
+msgstr "törlés dátuma"
+
+#: contrib/comments/models.py:286
+msgid "moderator deletion"
+msgstr "moderátor törlése"
+
+#: contrib/comments/models.py:287
+msgid "moderator deletions"
+msgstr "moderátor törlései"
+
+#: contrib/comments/models.py:291
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Moderátor törlés %r által"
+
+#: contrib/comments/views/karma.py:20
+msgid "Anonymous users cannot vote"
+msgstr "Névtelen felhasználó nem szavazhat"
+
+#: contrib/comments/views/karma.py:24
+msgid "Invalid comment ID"
+msgstr "Érvénytelen megjegyzés ID"
+
+#: contrib/comments/views/karma.py:26
+msgid "No voting for yourself"
+msgstr "Nem szavazhat önmagára"
+
+#: contrib/comments/views/comments.py:28
+msgid "This rating is required because you've entered at least one other rating."
+msgstr "Ez az értékelés szükséges, mert legalább még egy értékelést megadott."
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Ezt a megjegyzést olyan felhasználó küldte akinek kevesebb mint %(count)s "
+"megjegyzése van:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Ezt a megjegyzést olyan felhasználó küldte akinek kevesebb mint %(count)s "
+"megjegyzése van:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Ezt a megjegyzést egy nem értékelt felhasználó küldte:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:281
+msgid "Only POSTs are allowed"
+msgstr "Csak POST engedélyezett"
+
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:285
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Egy vagy több kötelező mező nincs kitöltve"
+
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:287
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Valaki megváltoztatta a megjegyzés űrlapot (biztonság megsértése)"
+
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:293
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"A megjegyzés űrlap érvénytelen 'target' paramétert tartalmaz -- az objektum "
+"ID-je érvénytelen volt"
+
+#: contrib/comments/views/comments.py:258
+#: contrib/comments/views/comments.py:322
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "A megjegyzés űrlap nem biztosít sem 'preview' -t sem 'post' -ot."
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "Felhasználó:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+msgid "Log out"
+msgstr "Kijelentkezés"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Jelszó:"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Elfelejtette a jelszavát?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Értékelések"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Kötelező"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Opcionális"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Fénykép beküldése"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Megjegyzés:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Megjegyzés előnézete"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Név:"
+
+#: contrib/sites/models.py:15
+msgid "domain name"
+msgstr "tartománynév"
+
+#: contrib/sites/models.py:16
+msgid "display name"
+msgstr "megjelenítendő név"
+
+#: contrib/sites/models.py:20
+msgid "site"
+msgstr "honlap"
+
+#: contrib/sites/models.py:21
+msgid "sites"
+msgstr "honlapok"
+
+#: contrib/admin/filterspecs.py:42
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Szerző: %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:72 contrib/admin/filterspecs.py:90
+#: contrib/admin/filterspecs.py:145 contrib/admin/filterspecs.py:171
+msgid "All"
+msgstr "Mind"
+
+#: contrib/admin/filterspecs.py:111
+msgid "Any date"
+msgstr "Bármely dátum"
+
+#: contrib/admin/filterspecs.py:112
+msgid "Today"
+msgstr "Ma"
+
+#: contrib/admin/filterspecs.py:115
+msgid "Past 7 days"
+msgstr "Utolsó 7 nap"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This month"
+msgstr "Ez a hónap"
+
+#: contrib/admin/filterspecs.py:119
+msgid "This year"
+msgstr "Ez az év"
+
+#: contrib/admin/models.py:17
+msgid "action time"
+msgstr "művelet időpontja"
+
+#: contrib/admin/models.py:20
+msgid "object id"
+msgstr "objektum id"
+
+#: contrib/admin/models.py:21
+msgid "object repr"
+msgstr "objektum repr"
+
+#: contrib/admin/models.py:22
+msgid "action flag"
+msgstr "művelet jelölés"
+
+#: contrib/admin/models.py:23
+msgid "change message"
+msgstr "üzenet módosítása"
+
+#: contrib/admin/models.py:26
+msgid "log entry"
+msgstr "naplóbejegyzés"
+
+#: contrib/admin/models.py:27
+msgid "log entries"
+msgstr "naplóbejegyzések"
+
+#: contrib/admin/templatetags/admin_list.py:254
+msgid "All dates"
+msgstr "Minden dátum"
+
+# TODO
+#: contrib/admin/views/auth.py:20 contrib/admin/views/main.py:264
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "\"%(obj)s\" %(name)s sikeresen létrehozva."
+
+#: contrib/admin/views/auth.py:25 contrib/admin/views/main.py:268
+#: contrib/admin/views/main.py:354
+msgid "You may edit it again below."
+msgstr "Alább ismét szerkesztheti."
+
+#: contrib/admin/views/auth.py:31
+msgid "Add user"
+msgstr "Felhasználó hozzáadása"
+
+#: contrib/admin/views/auth.py:58
+msgid "Password changed successfully."
+msgstr "Sikeres jelszóváltoztatás."
+
+#: contrib/admin/views/auth.py:65
+#, python-format
+msgid "Change password: %s"
+msgstr "Jelszó megváltoztatása: %s"
+
+#: contrib/admin/views/main.py:230
+msgid "Site administration"
+msgstr "Honlap karbantartás"
+
+#: contrib/admin/views/main.py:278 contrib/admin/views/main.py:363
+#, python-format
+msgid "You may add another %s below."
+msgstr "Alább hozzáadhat egy másikat ebből: %s."
+
+#: contrib/admin/views/main.py:296
+#, python-format
+msgid "Add %s"
+msgstr "Új %s"
+
+#: contrib/admin/views/main.py:342
+#, python-format
+msgid "Added %s."
+msgstr "%s létrehozva."
+
+#: contrib/admin/views/main.py:344
+#, python-format
+msgid "Changed %s."
+msgstr "%s módosítva."
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "Deleted %s."
+msgstr "%s törölve."
+
+#: contrib/admin/views/main.py:349
+msgid "No fields changed."
+msgstr "Egy mező sem változott."
+
+#: contrib/admin/views/main.py:352
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "\"%(obj)s\" %(name)s sikeresen módosítva."
+
+#: contrib/admin/views/main.py:360
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "\"%(obj)s\" %(name)s sikeresen létrehozva. Alább ismét szerkesztheted."
+
+#: contrib/admin/views/main.py:398
+#, python-format
+msgid "Change %s"
+msgstr "%s módosítása"
+
+# TODO
+#: contrib/admin/views/main.py:483
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Egy vagy több %(fieldname)s a(z) %(name)s -ban: %(obj)s"
+
+# TODO
+#: contrib/admin/views/main.py:488
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Egy vagy több %(fieldname)s a(z) %(name)s:"
+
+#: contrib/admin/views/main.py:520
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "\"%(obj)s\" %(name)s sikeresen törölve."
+
+#: contrib/admin/views/main.py:523
+msgid "Are you sure?"
+msgstr "Biztos benne?"
+
+#: contrib/admin/views/main.py:545
+#, python-format
+msgid "Change history: %s"
+msgstr "Változások története: %s"
+
+#: contrib/admin/views/main.py:579
+#, python-format
+msgid "Select %s"
+msgstr "Kiválasztás %s"
+
+#: contrib/admin/views/main.py:579
+#, python-format
+msgid "Select %s to change"
+msgstr "Válasszon ki egyet a módosításhoz (%s)"
+
+#: contrib/admin/views/main.py:780
+msgid "Database error"
+msgstr "Adatbázis hiba"
+
+#: contrib/admin/views/decorators.py:10 contrib/auth/forms.py:60
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Írjon be egy helyes felhasználónevet és jelszót. Mindkét mező kisbetű-"
+"nagybetű érzékeny."
+
+#: contrib/admin/views/decorators.py:24
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Bejelentkezés"
+
+#: contrib/admin/views/decorators.py:62
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Jelentkezzen be újra, mert a munkamenete végetért. Ne aggódjon, minden "
+"beküldött adata el van mentve."
+
+#: contrib/admin/views/decorators.py:69
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Úgy tűnik a böngészőjében nincs engedélyezve a cookie-k fogadása. Kérem "
+"engedélyezze és töltse újra az oldalt!"
+
+#: contrib/admin/views/decorators.py:83
+msgid "Usernames cannot contain the '@' character."
+msgstr "A felhasználónév nem tartalmazhat '@' karaktert."
+
+#: contrib/admin/views/decorators.py:85
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "Az email címe nem a felhasználóneve. Próbálja inkább ezt: %s."
+
+#: contrib/admin/views/doc.py:47 contrib/admin/views/doc.py:49
+#: contrib/admin/views/doc.py:51
+msgid "tag:"
+msgstr "címke:"
+
+#: contrib/admin/views/doc.py:78 contrib/admin/views/doc.py:80
+#: contrib/admin/views/doc.py:82
+msgid "filter:"
+msgstr "szűrő:"
+
+#: contrib/admin/views/doc.py:136 contrib/admin/views/doc.py:138
+#: contrib/admin/views/doc.py:140
+msgid "view:"
+msgstr "nézet:"
+
+#: contrib/admin/views/doc.py:165
+#, python-format
+msgid "App %r not found"
+msgstr "%r alkalmazás nem található"
+
+#: contrib/admin/views/doc.py:172
+#, python-format
+msgid "Model %(name)r not found in app %(label)r"
+msgstr "%(name)r modell nem található a következő alkalmazásban: %(label)r"
+
+#: contrib/admin/views/doc.py:184
+#, python-format
+msgid "the related `%(label)s.%(type)s` object"
+msgstr "a kapcsolódó '%(label)s.%(type)s' objektum"
+
+#: contrib/admin/views/doc.py:184 contrib/admin/views/doc.py:206
+#: contrib/admin/views/doc.py:220 contrib/admin/views/doc.py:225
+msgid "model:"
+msgstr "modell:"
+
+#: contrib/admin/views/doc.py:215
+#, python-format
+msgid "related `%(label)s.%(name)s` objects"
+msgstr "kapcsolódó '%(label)s.%(name)sí' objektumok"
+
+#: contrib/admin/views/doc.py:220
+#, python-format
+msgid "all %s"
+msgstr "minden %s"
+
+#: contrib/admin/views/doc.py:225
+#, python-format
+msgid "number of %s"
+msgstr "%s mennyisége"
+
+#: contrib/admin/views/doc.py:230
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Mezők %s objektumokban"
+
+#: contrib/admin/views/doc.py:292 contrib/admin/views/doc.py:303
+#: contrib/admin/views/doc.py:305 contrib/admin/views/doc.py:311
+#: contrib/admin/views/doc.py:312 contrib/admin/views/doc.py:314
+msgid "Integer"
+msgstr "Egész"
+
+#: contrib/admin/views/doc.py:293
+msgid "Boolean (Either True or False)"
+msgstr "Logikai (True vagy False)"
+
+#: contrib/admin/views/doc.py:294 contrib/admin/views/doc.py:313
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Karakterlánc (%(max_length)s hosszig)"
+
+#: contrib/admin/views/doc.py:295
+msgid "Comma-separated integers"
+msgstr "Vesszővel elválasztott egészek"
+
+#: contrib/admin/views/doc.py:296
+msgid "Date (without time)"
+msgstr "Dátum (idő nélkül)"
+
+#: contrib/admin/views/doc.py:297
+msgid "Date (with time)"
+msgstr "Dátum (idővel)"
+
+#: contrib/admin/views/doc.py:298
+msgid "Decimal number"
+msgstr "Tizes számrendszerű (decimális) szám"
+
+#: contrib/admin/views/doc.py:299
+msgid "E-mail address"
+msgstr "E-mail cím"
+
+#: contrib/admin/views/doc.py:300 contrib/admin/views/doc.py:301
+#: contrib/admin/views/doc.py:304
+msgid "File path"
+msgstr "Elérési út"
+
+#: contrib/admin/views/doc.py:302
+msgid "Floating point number"
+msgstr "Lebegőpontos szám"
+
+#: contrib/admin/views/doc.py:308
+msgid "Boolean (Either True, False or None)"
+msgstr "Logikai (True, False vagy None)"
+
+#: contrib/admin/views/doc.py:309
+msgid "Relation to parent model"
+msgstr "Szülőkapcsolat"
+
+#: contrib/admin/views/doc.py:310
+msgid "Phone number"
+msgstr "Telefonszám"
+
+#: contrib/admin/views/doc.py:315
+msgid "Text"
+msgstr "Szöveg"
+
+#: contrib/admin/views/doc.py:316
+msgid "Time"
+msgstr "Idő"
+
+#: contrib/admin/views/doc.py:317 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:318
+msgid "U.S. state (two uppercase letters)"
+msgstr "USA állam (két nagybetű)"
+
+#: contrib/admin/views/doc.py:319
+msgid "XML text"
+msgstr "XML szöveg"
+
+#: contrib/admin/views/doc.py:345
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s nem tűnik egy urlpattern objektumnak."
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Éppen:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Változás:"
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Dátum:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Idő:"
+
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Dokumentáció"
+
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin/auth/user/change_password.html:15
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+msgid "Change password"
+msgstr "Jelszó megváltoztatása"
+
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/auth/user/change_password.html:12
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Kezdőlap"
+
+#: contrib/admin/templates/admin/change_list.html:12
+#, python-format
+msgid "Add %(name)s"
+msgstr "Új %(name)s"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " %(filter_title)s szerint "
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "History"
+msgstr "Történet"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Dátum/idő"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Felhasználó"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Művelet"
+
+# TODO
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "N j, Y, P"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Az objektumnak nincs változási története. Valószínűleg nem ezen a "
+"karbantartó oldalon lett rögzítve."
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Mehet"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "Egy találat."
+msgstr[1] "%(counter)s találat."
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s összesen"
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Mutassa mindet"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django honlap adminisztráció"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django adminisztráció"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Szerverhiba"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Szerverhiba (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Szerverhiba <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Hiba történt, melyet e-mailben jelentettünk az oldal karbantartójának. A "
+"rendszer remélhetően hamar megjavul. Köszönjük a türelmét."
+
+#: contrib/admin/templates/admin/invalid_setup.html:8
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Valami nem stimmel a telepített adatbázissal. Bizonyosodjon meg arról, hogy "
+"a megfelelő táblák létre lettek-e hozva, és hogy a megfelelő felhasználó "
+"tudja-e őket olvasni."
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "%(name)s alkalmazásban elérhető modellek."
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "Új"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Módosítás"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Nincs joga szerkeszteni."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Utolsó műveletek"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Az én műveleteim"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Nincs elérhető"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Nincs ilyen oldal"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Sajnáljuk, de a kért oldal nem található."
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "Szűrő"
+
+#: contrib/admin/templates/admin/change_form.html:22
+msgid "View on site"
+msgstr "Megtekintés a honlapon"
+
+#: contrib/admin/templates/admin/change_form.html:32
+#: contrib/admin/templates/admin/auth/user/change_password.html:24
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Kérem javítsa az alábbi hibát."
+msgstr[1] "Kérlem javítsa az alábbi hibákat."
+
+#: contrib/admin/templates/admin/change_form.html:50
+msgid "Ordering"
+msgstr "Rendezés"
+
+#: contrib/admin/templates/admin/change_form.html:53
+msgid "Order:"
+msgstr "Rendezés:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Törlés"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"'%(escaped_object)s' %(object_name)s törlése a kapcsolódó objektumok "
+"törlését is eredményezi, de a hozzáférése nem engedi a következő típusú "
+"objektumok törlését:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Biztos hogy törli a következőt: \"%(escaped_object)s\" (típus: %(object_name)"
+"s)? A összes további kapcsolódó elem is törlődik:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Igen, biztos vagyok benne"
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "Üdvözlöm,"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Mentés újként"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Mentés és másik hozzáadása"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Mentés és a szerkesztés folytatása"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Mentés"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:28
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Adjon meg egy új jelszót a <strong>%(username)s</strong> nevű felhasználónak."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:34
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+msgid "Password"
+msgstr "Jelszó"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+msgid "Password (again)"
+msgstr "Jelszó újra"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+msgid "Enter the same password as above, for verification."
+msgstr "Írja be a fenti jelszót ellenőrzés céljából."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Először adjon meg egy felhasználói nevet és egy jelszót. Ezek után további "
+"módosításokat is végezhet a felhasználó adatain."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "Felhasználó"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Jelszó megváltoztatása"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Sikeres jelszóváltoztatás"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Megváltozott a jelszava."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Jelszó törlése"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"Elfelejtette a jelszavát? Írja be az e-mail címét, mi töröljük a jelszavát "
+"és az újat e-mailben elküldjük."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "E-mail cím:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Jelszavam törlése"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Köszönjük hogy egy kis időt eltöltött ma a honlapunkon."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Jelentkezzen be újra"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Sikeres jelszótörlés"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"Új jelszavát elküldtük e-mailben a megadott címre. Hamarosan meg kell "
+"érkeznie."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Írja be a régi jelszavát biztonsági okokból, majd az újat kétszer, hogy "
+"biztosan ne gépelje el."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Régi jelszó:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Új jelszó:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Jelszó megerősítése:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Jelszavam megváltoztatása"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Ezt az e-mail-t azért kapta, mert jelszótörlést kért"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "hozzáféréséhez a következő honlapon: %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Új jelszava: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Bármikor megváltoztathatja a jelszavát a következő oldalon:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Felhasználóneve, ha elfelejtette volna:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Köszönjük, hogy használta honlapunkat!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s csapat"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Könyvjelzők"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "Dokumentum könyvjelzők"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">A könyvjelzők felvételéhez húzza a könyvjelzők linkjét az "
+"eszköztárra, vagy kattintson rájuk jobb egérgombbal és úgy adja hozzá. "
+"Ezután \n"
+"már ki tudja választani a könyvjelzőt a honlap bármely oldaláról. A "
+"könyvjelzők között néhány oldal csak \"belső\" gépekről nézhető meg.\n"
+"(Kérdezze meg rendszergazdáját, hogy az Ön gépe \"belső\" gép-e.).</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Az oldal dokumentációja"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+"Bármely oldalról annak a nézetnek a dokumentációjára ugrik, amely a kérdéses "
+"oldalt generálta."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Az objektum ID mutatása"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Az objektum által reprezentált oldalak 'content-type' és 'unique ID' "
+"értékeit mutatja."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Objektum szerkesztése (aktuális ablakban)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "Az objektumhoz tartozó oldalak adminisztrációjához ugrik."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Objektum szerkesztése (új ablakban)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "Mint fentebb, de az adminisztrációs oldalt új ablakban nyitja meg."
+
+#: contrib/contenttypes/models.py:37
+msgid "python model class name"
+msgstr "python modell osztály neve"
+
+#: contrib/contenttypes/models.py:40
+msgid "content type"
+msgstr "tartalom típusa"
+
+#: contrib/contenttypes/models.py:41
+msgid "content types"
+msgstr "tartalom típusok"
+
+#: contrib/auth/views.py:47
+msgid "Logged out"
+msgstr "Kijelentkezve"
+
+#: contrib/auth/models.py:53 contrib/auth/models.py:73
+msgid "name"
+msgstr "név"
+
+#: contrib/auth/models.py:55
+msgid "codename"
+msgstr "kódnév"
+
+#: contrib/auth/models.py:58
+msgid "permission"
+msgstr "jogosultság"
+
+#: contrib/auth/models.py:59 contrib/auth/models.py:74
+msgid "permissions"
+msgstr "jogosultságok"
+
+#: contrib/auth/models.py:77
+msgid "group"
+msgstr "csoport"
+
+#: contrib/auth/models.py:78 contrib/auth/models.py:121
+msgid "groups"
+msgstr "csoportok"
+
+#: contrib/auth/models.py:111
+msgid "username"
+msgstr "felhasználónév"
+
+#: contrib/auth/models.py:111
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr ""
+"Kötelező. Legfeljebb 30 karakter. Csak alfanumerikus karaktereket "
+"tartalmazhat (betűk, számok és aláhúzás)."
+
+#: contrib/auth/models.py:112
+msgid "first name"
+msgstr "keresztnév"
+
+#: contrib/auth/models.py:113
+msgid "last name"
+msgstr "vezetéknév"
+
+#: contrib/auth/models.py:114
+msgid "e-mail address"
+msgstr "e-mail cím"
+
+#: contrib/auth/models.py:115
+msgid "password"
+msgstr "jelszó"
+
+#: contrib/auth/models.py:115
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"Használja az \"[algo]$[salt]$[hexdigest]\" formátumot, vagy a <a href="
+"\"password/\">jelszó megváltoztatása űrlapot</a>."
+
+#: contrib/auth/models.py:116
+msgid "staff status"
+msgstr "személyzet státusz"
+
+#: contrib/auth/models.py:116
+msgid "Designates whether the user can log into this admin site."
+msgstr "Megadja, hogy a felhasználó bejelentkezhet-e erre az adminisztrációs oldalra."
+
+#: contrib/auth/models.py:117
+msgid "active"
+msgstr "aktív"
+
+#: contrib/auth/models.py:117
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"Megadja, hogy a felhasználó bejelentkezhet-e erre az adminisztrációs "
+"oldalra. Állítsa át ezt az értéket a fiókok törlése helyett."
+
+#: contrib/auth/models.py:118
+msgid "superuser status"
+msgstr "rendszergazda státusz"
+
+#: contrib/auth/models.py:118
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr ""
+"Megadja, hogy ez a felhasználó rendelkezik-e minden jogosultsággal anélkül, "
+"hogy azt külön meg kellene adni."
+
+#: contrib/auth/models.py:119
+msgid "last login"
+msgstr "utolsó bejelentkezés"
+
+#: contrib/auth/models.py:120
+msgid "date joined"
+msgstr "csatlakozás dátuma"
+
+#: contrib/auth/models.py:122
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"A kézzel beállított jogosultságok mellett a felhasználó a csoportjának "
+"jogait is megkapja."
+
+#: contrib/auth/models.py:123
+msgid "user permissions"
+msgstr "felhasználói jogosultságok"
+
+#: contrib/auth/models.py:127
+msgid "user"
+msgstr "felhasználó"
+
+#: contrib/auth/models.py:128
+msgid "users"
+msgstr "felhasználók"
+
+#: contrib/auth/models.py:134
+msgid "Personal info"
+msgstr "személyes információ"
+
+#: contrib/auth/models.py:135
+msgid "Permissions"
+msgstr "jogosultságok"
+
+#: contrib/auth/models.py:136
+msgid "Important dates"
+msgstr "Fontos dátumok"
+
+#: contrib/auth/models.py:137
+msgid "Groups"
+msgstr "Csoportok"
+
+#: contrib/auth/models.py:288
+msgid "message"
+msgstr "üzenet"
+
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr "A két jelszó mező tartalma nem egyezik meg."
+
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr "Létezik már egy felhasználó ezzel a névvel."
+
+#: contrib/auth/forms.py:53
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"A böngészője úgy tűnik nem támogatja a cookie-kat. A cookie-k engedélyezése "
+"szükséges a bejelentkezéshez."
+
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "Ez a fiók inaktív."
+
+#: contrib/auth/forms.py:84
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr ""
+"Ehhez az e-mail címhez nem tartozik felhasználói fiók. Biztos benne, hogy "
+"regisztrált?"
+
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "A két \"új jelszó\" mezó tartalma nem egyezik meg."
+
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "A régi jelszó hibásan lett megadva. Írja be újra."
+
+#: contrib/localflavor/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
+msgstr ""
+"Írjon be egy irányítószámot. Az irányítószám két része között szóköznek kell "
+"állnia."
+
+#: contrib/localflavor/br/forms.py:18
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Írjon be egy irányítószámot 'XXXXX-XXX' alakban."
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "A telefonszámoknak 'XXX-XXX-XXXX' formátumúnak kell lenniük."
+
+#: contrib/localflavor/br/forms.py:72
+msgid "This field requires only numbers."
+msgstr "Ez a mező csak számokat tartalmazhat."
+
+#: contrib/localflavor/br/forms.py:74
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr "Ez a mező legfeljebb 11 számjegyet vagy 14 karaktert tartalmazhat."
+
+#: contrib/localflavor/br/forms.py:84
+msgid "Invalid CPF number."
+msgstr "Érvénytelen CPF szám."
+
+#: contrib/localflavor/br/forms.py:106
+msgid "This field requires at least 14 digits"
+msgstr "Ennek a mezőnek legalább 14 számjegyet kell tartalmaznia."
+
+#: contrib/localflavor/br/forms.py:116
+msgid "Invalid CNPJ number."
+msgstr "Érvénytelen CNPJ szám."
+
+#: contrib/localflavor/au/forms.py:18
+msgid "Enter a 4 digit post code."
+msgstr "Írjon be egy négyjegyű irányítószámot."
+
+#: contrib/localflavor/fr/forms.py:17 contrib/localflavor/de/forms.py:16
+#: contrib/localflavor/fi/forms.py:14
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Írjon be egy irányítószámot 'XXXXX' alakban."
+
+#: contrib/localflavor/us/forms.py:18
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "Írjon be egy irányítószámot 'XXXXX', vagy 'XXXXX-XXXX' alakban."
+
+#: contrib/localflavor/us/forms.py:51
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr "Írjon be egy érvényes USA SSN-t 'XXX-XX-XXXX' formátumban."
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr "Baden-Württemberg"
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr "Bajorország"
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr "Berlin"
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr "Brandenburg"
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr "Bréma"
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr "Hamburg"
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr "Hessen"
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr "Mecklenburg-Nyugat-Pomeránia"
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr "Alsó-Szászország"
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr "Észak-Rajna-Vesztfália"
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr "Rhineland-Palatinate"
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr "Szárföld"
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr "Szászország"
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr "Szász-Anhalt"
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr "Schleswig-Holstein"
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr "Türingia"
+
+#: contrib/localflavor/de/forms.py:60
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr ""
+"Írjon be egy érvényes német személyazonosító számot \"XXXXXXXXXXX-XXXXXXX-"
+"XXXXXXX-X\" alakban."
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr "Hokkaido"
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr "Aomori"
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr "Iwate"
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr "Miyagi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr "Akita"
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr "Yamagata"
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr "Fukushima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr "Ibaraki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr "Tochigi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr "Gunma"
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr "Saitama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr "Chiba"
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr "Tókió"
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr "Kanagawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr "Yamanashi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr "Nagano"
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr "Niigata"
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr "Toyama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr "Ishikawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr "Fukui"
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr "Gifu"
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr "Shizuoka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr "Aichi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr "Mie"
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr "Shiga"
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr "Kiotó"
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr "Oszaka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr "Hyogo"
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr "Nara"
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr "Wakayama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr "Tottori"
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr "Shimane"
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr "Okayama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr "Hiroshima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr "Yamaguchi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr "Tokushima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr "Kagawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr "Ehime"
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr "Kochi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr "Fukuoka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr "Saga"
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr "Nagaszaki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr "Kumamoto"
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr "Oita"
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr "Miyazaki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr "Kagoshima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr "Okinawa"
+
+#: contrib/localflavor/jp/forms.py:21
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "Írjon be egy irányítószámot \"XXXXXXX\" vagy \"XXX-XXXX\" alakban."
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr "Aargau"
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr "Appenzell Innerrhoden"
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr "Appenzell Ausserrhoden"
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr "Bázel-város"
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr "Bázel-vidék"
+
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr "Berne"
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr "Fribourg"
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr "Genf"
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr "Glarus"
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr "Graubuenden"
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr "Jura"
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr "Lucerne"
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr "Neuchatel"
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr "Nidwalden"
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr "Obwalden"
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr "Schaffhausen"
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr "Schwyz"
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr "Solothurn"
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr "St. Gallen"
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr "Thurgau"
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr "Ticino"
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr "Uri"
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr "Valais"
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr "Vaud"
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr "Zug"
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr "Zürich"
+
+#: contrib/localflavor/ch/forms.py:18 contrib/localflavor/no/forms.py:14
+msgid "Enter a zip code in the format XXXX."
+msgstr "Írjon be egy irányítószámot 'XXXX' alakban."
+
+#: contrib/localflavor/ch/forms.py:90
+msgid ""
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
+msgstr ""
+"Írjon be egy érvényes svájci személyazonosító vagy útlevél számot "
+"\"X1234567<0\" vagy \"1234567890\" alakban."
+
+#: contrib/localflavor/is_/forms.py:17
+msgid "Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr ""
+"Írjon be egy érvényes izlandi személyazonosító számot \"XXXXXX-XXXX\" "
+"alakban."
+
+#: contrib/localflavor/is_/forms.py:31
+msgid "The Icelandic identification number is not valid."
+msgstr "Az izlandi személyazonosító szám érvénytelen."
+
+#: contrib/localflavor/it/forms.py:16
+msgid "Enter a valid zip code."
+msgstr "Adjon meg egy érvényes irányítószámot."
+
+#: contrib/localflavor/it/forms.py:41
+msgid "Enter a valid Social Security number."
+msgstr "Adjon meg egy érvényes társadalombiztosítási számot."
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr "Adjon meg egy érvényes ÁFA számot."
+
+#: contrib/localflavor/no/forms.py:35
+msgid "Enter a valid Norwegian social security number."
+msgstr "Írjon be egy érvényes norvég társadalombiztosítási számot."
+
+#: contrib/localflavor/sk/sk_regions.py:8
+msgid "Banska Bystrica region"
+msgstr "Besztercebánya régió"
+
+#: contrib/localflavor/sk/sk_regions.py:9
+msgid "Bratislava region"
+msgstr "Pozsony régió"
+
+#: contrib/localflavor/sk/sk_regions.py:10
+msgid "Kosice region"
+msgstr "Kassa régió"
+
+#: contrib/localflavor/sk/sk_regions.py:11
+msgid "Nitra region"
+msgstr "Nyitra régió"
+
+#: contrib/localflavor/sk/sk_regions.py:12
+msgid "Presov region"
+msgstr "Presov régió"
+
+#: contrib/localflavor/sk/sk_regions.py:13
+msgid "Trencin region"
+msgstr "Trencsén régió"
+
+#: contrib/localflavor/sk/sk_regions.py:14
+msgid "Trnava region"
+msgstr "Trnava régió"
+
+#: contrib/localflavor/sk/sk_regions.py:15
+msgid "Zilina region"
+msgstr "Zsolna régió"
+
+#: contrib/localflavor/sk/sk_districts.py:8
+msgid "Banska Bystrica"
+msgstr "Besztercebánya"
+
+#: contrib/localflavor/sk/sk_districts.py:9
+msgid "Banska Stiavnica"
+msgstr "Banska Stiavnica"
+
+#: contrib/localflavor/sk/sk_districts.py:10
+msgid "Bardejov"
+msgstr "Bardejov"
+
+#: contrib/localflavor/sk/sk_districts.py:11
+msgid "Banovce nad Bebravou"
+msgstr "Banovce nad Bebravou"
+
+#: contrib/localflavor/sk/sk_districts.py:12
+msgid "Brezno"
+msgstr "Brezno"
+
+#: contrib/localflavor/sk/sk_districts.py:13
+msgid "Bratislava I"
+msgstr "Pozsony I"
+
+#: contrib/localflavor/sk/sk_districts.py:14
+msgid "Bratislava II"
+msgstr "Pozsony II"
+
+#: contrib/localflavor/sk/sk_districts.py:15
+msgid "Bratislava III"
+msgstr "Pozsony III"
+
+#: contrib/localflavor/sk/sk_districts.py:16
+msgid "Bratislava IV"
+msgstr "Pozsony IV"
+
+#: contrib/localflavor/sk/sk_districts.py:17
+msgid "Bratislava V"
+msgstr "Pozsony V"
+
+#: contrib/localflavor/sk/sk_districts.py:18
+msgid "Bytca"
+msgstr "Bytca"
+
+#: contrib/localflavor/sk/sk_districts.py:19
+msgid "Cadca"
+msgstr "Cadca"
+
+#: contrib/localflavor/sk/sk_districts.py:20
+msgid "Detva"
+msgstr "Detva"
+
+#: contrib/localflavor/sk/sk_districts.py:21
+msgid "Dolny Kubin"
+msgstr "Dolny Kubin"
+
+#: contrib/localflavor/sk/sk_districts.py:22
+msgid "Dunajska Streda"
+msgstr "Dunaszerdahely"
+
+#: contrib/localflavor/sk/sk_districts.py:23
+msgid "Galanta"
+msgstr "Galánta"
+
+#: contrib/localflavor/sk/sk_districts.py:24
+msgid "Gelnica"
+msgstr "Gelnica"
+
+#: contrib/localflavor/sk/sk_districts.py:25
+msgid "Hlohovec"
+msgstr "Hlohovec"
+
+#: contrib/localflavor/sk/sk_districts.py:26
+msgid "Humenne"
+msgstr "Humenne"
+
+#: contrib/localflavor/sk/sk_districts.py:27
+msgid "Ilava"
+msgstr "Ilava"
+
+#: contrib/localflavor/sk/sk_districts.py:28
+msgid "Kezmarok"
+msgstr "Késmárk"
+
+#: contrib/localflavor/sk/sk_districts.py:29
+msgid "Komarno"
+msgstr "Komárom"
+
+#: contrib/localflavor/sk/sk_districts.py:30
+msgid "Kosice I"
+msgstr "Kassa I"
+
+#: contrib/localflavor/sk/sk_districts.py:31
+msgid "Kosice II"
+msgstr "Kassa II"
+
+#: contrib/localflavor/sk/sk_districts.py:32
+msgid "Kosice III"
+msgstr "Kassa III"
+
+#: contrib/localflavor/sk/sk_districts.py:33
+msgid "Kosice IV"
+msgstr "Kassa IV"
+
+#: contrib/localflavor/sk/sk_districts.py:34
+msgid "Kosice - okolie"
+msgstr "Kosice - okolie"
+
+#: contrib/localflavor/sk/sk_districts.py:35
+msgid "Krupina"
+msgstr "Krupina"
+
+#: contrib/localflavor/sk/sk_districts.py:36
+msgid "Kysucke Nove Mesto"
+msgstr "Kysucke Nove Mesto"
+
+#: contrib/localflavor/sk/sk_districts.py:37
+msgid "Levice"
+msgstr "Levice"
+
+#: contrib/localflavor/sk/sk_districts.py:38
+msgid "Levoca"
+msgstr "Levoca"
+
+#: contrib/localflavor/sk/sk_districts.py:39
+msgid "Liptovsky Mikulas"
+msgstr "Liptovsky Mikulas"
+
+#: contrib/localflavor/sk/sk_districts.py:40
+msgid "Lucenec"
+msgstr "Lucenec"
+
+#: contrib/localflavor/sk/sk_districts.py:41
+msgid "Malacky"
+msgstr "Malacky"
+
+#: contrib/localflavor/sk/sk_districts.py:42
+msgid "Martin"
+msgstr "Martin"
+
+#: contrib/localflavor/sk/sk_districts.py:43
+msgid "Medzilaborce"
+msgstr "Medzilaborce"
+
+#: contrib/localflavor/sk/sk_districts.py:44
+msgid "Michalovce"
+msgstr "Michalovce"
+
+#: contrib/localflavor/sk/sk_districts.py:45
+msgid "Myjava"
+msgstr "Myjava"
+
+#: contrib/localflavor/sk/sk_districts.py:46
+msgid "Namestovo"
+msgstr "Namestovo"
+
+#: contrib/localflavor/sk/sk_districts.py:47
+msgid "Nitra"
+msgstr "Nyitra"
+
+#: contrib/localflavor/sk/sk_districts.py:48
+msgid "Nove Mesto nad Vahom"
+msgstr "Nove Mesto nad Vahom"
+
+#: contrib/localflavor/sk/sk_districts.py:49
+msgid "Nove Zamky"
+msgstr "Nove Zamky"
+
+#: contrib/localflavor/sk/sk_districts.py:50
+msgid "Partizanske"
+msgstr "Partizanske"
+
+#: contrib/localflavor/sk/sk_districts.py:51
+msgid "Pezinok"
+msgstr "Pezinok"
+
+#: contrib/localflavor/sk/sk_districts.py:52
+msgid "Piestany"
+msgstr "Piestany"
+
+#: contrib/localflavor/sk/sk_districts.py:53
+msgid "Poltar"
+msgstr "Poltar"
+
+#: contrib/localflavor/sk/sk_districts.py:54
+msgid "Poprad"
+msgstr "Poprád"
+
+#: contrib/localflavor/sk/sk_districts.py:55
+msgid "Povazska Bystrica"
+msgstr "Povazska Bystrica"
+
+#: contrib/localflavor/sk/sk_districts.py:56
+msgid "Presov"
+msgstr "Presov"
+
+#: contrib/localflavor/sk/sk_districts.py:57
+msgid "Prievidza"
+msgstr "Prievidza"
+
+#: contrib/localflavor/sk/sk_districts.py:58
+msgid "Puchov"
+msgstr "Puchov"
+
+#: contrib/localflavor/sk/sk_districts.py:59
+msgid "Revuca"
+msgstr "Revuca"
+
+#: contrib/localflavor/sk/sk_districts.py:60
+msgid "Rimavska Sobota"
+msgstr "Rimaszombat"
+
+#: contrib/localflavor/sk/sk_districts.py:61
+msgid "Roznava"
+msgstr "Rozsnyó"
+
+#: contrib/localflavor/sk/sk_districts.py:62
+msgid "Ruzomberok"
+msgstr "Rózsahegy"
+
+#: contrib/localflavor/sk/sk_districts.py:63
+msgid "Sabinov"
+msgstr "Sabinov"
+
+#: contrib/localflavor/sk/sk_districts.py:64
+msgid "Senec"
+msgstr "Senec"
+
+#: contrib/localflavor/sk/sk_districts.py:65
+msgid "Senica"
+msgstr "Senica"
+
+#: contrib/localflavor/sk/sk_districts.py:66
+msgid "Skalica"
+msgstr "Skalica"
+
+#: contrib/localflavor/sk/sk_districts.py:67
+msgid "Snina"
+msgstr "Snina"
+
+#: contrib/localflavor/sk/sk_districts.py:68
+msgid "Sobrance"
+msgstr "Sobrance"
+
+#: contrib/localflavor/sk/sk_districts.py:69
+msgid "Spisska Nova Ves"
+msgstr "Igló"
+
+#: contrib/localflavor/sk/sk_districts.py:70
+msgid "Stara Lubovna"
+msgstr "Stara Lubovna"
+
+#: contrib/localflavor/sk/sk_districts.py:71
+msgid "Stropkov"
+msgstr "Stropkov"
+
+#: contrib/localflavor/sk/sk_districts.py:72
+msgid "Svidnik"
+msgstr "Svidnik"
+
+#: contrib/localflavor/sk/sk_districts.py:73
+msgid "Sala"
+msgstr "Sellye"
+
+#: contrib/localflavor/sk/sk_districts.py:74
+msgid "Topolcany"
+msgstr "Topolcany"
+
+#: contrib/localflavor/sk/sk_districts.py:75
+msgid "Trebisov"
+msgstr "Trebisov"
+
+#: contrib/localflavor/sk/sk_districts.py:76
+msgid "Trencin"
+msgstr "Trencsén"
+
+#: contrib/localflavor/sk/sk_districts.py:77
+msgid "Trnava"
+msgstr "Trnava"
+
+#: contrib/localflavor/sk/sk_districts.py:78
+msgid "Turcianske Teplice"
+msgstr "Turcianske Teplice"
+
+#: contrib/localflavor/sk/sk_districts.py:79
+msgid "Tvrdosin"
+msgstr "Tvrdosin"
+
+#: contrib/localflavor/sk/sk_districts.py:80
+msgid "Velky Krtis"
+msgstr "Velky Krtis"
+
+#: contrib/localflavor/sk/sk_districts.py:81
+msgid "Vranov nad Toplou"
+msgstr "Vranov nad Toplou"
+
+#: contrib/localflavor/sk/sk_districts.py:82
+msgid "Zlate Moravce"
+msgstr "Zlate Moravce"
+
+#: contrib/localflavor/sk/sk_districts.py:83
+msgid "Zvolen"
+msgstr "Zvolen"
+
+#: contrib/localflavor/sk/sk_districts.py:84
+msgid "Zarnovica"
+msgstr "Zarnovica"
+
+#: contrib/localflavor/sk/sk_districts.py:85
+msgid "Ziar nad Hronom"
+msgstr "Ziar nad Hronom"
+
+#: contrib/localflavor/sk/sk_districts.py:86
+msgid "Zilina"
+msgstr "Zsolna"
+
+#: contrib/localflavor/sk/forms.py:32
+msgid "Enter a postal code in the format XXXXX or XXX XX."
+msgstr "Írjon be egy irányítószámot \"XXXXX\" vagy \"XXX XX\" alakban."
+
+#: contrib/localflavor/cl/forms.py:32
+msgid "Enter valid a Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr "Írjon be egy érvényes chilei RUT-ot \"XX.XXX.XXX-X\" alakban."
+
+#: contrib/localflavor/cl/forms.py:37
+msgid "Enter valid a Chilean RUT"
+msgstr "Írjon be egy érvényes chilei RUT-ot"
+
+#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:45
+msgid "Enter a valid Finnish social security number."
+msgstr "Adjon meg egy érvényes finn társadalombiztosítási számot."
+
+#: contrib/localflavor/in_/forms.py:16
+msgid "Enter a zip code in the format XXXXXXX."
+msgstr "Írjon be egy irányítószámot \"XXXXXXX\" alakban."
+
+#: contrib/localflavor/pl/pl_voivodeships.py:8
+msgid "Lower Silesia"
+msgstr "Alsó-Szilézia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:9
+msgid "Kuyavia-Pomerania"
+msgstr "Kuyavia-Pomerania"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:10
+msgid "Lublin"
+msgstr "Lublin"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:11
+msgid "Lubusz"
+msgstr "Lubusz"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:12
+msgid "Lodz"
+msgstr "Lodz"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:13
+msgid "Lesser Poland"
+msgstr "Kis-Lengyelország"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:14
+msgid "Masovia"
+msgstr "Masovia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:15
+msgid "Opole"
+msgstr "Opole"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:16
+msgid "Subcarpatia"
+msgstr "Szubkárpátok"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:17
+msgid "Podlasie"
+msgstr "Podlasie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:18
+msgid "Pomerania"
+msgstr "Pomeránia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:19
+msgid "Silesia"
+msgstr "Szilézia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:20
+msgid "Swietokrzyskie"
+msgstr "Swietokrzyskie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:21
+msgid "Warmia-Masuria"
+msgstr "Warmia-Masuria"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:22
+msgid "Greater Poland"
+msgstr "Nagy-Lengyelország"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:23
+msgid "West Pomerania"
+msgstr "Nyugat-Pomeránia"
+
+#: contrib/localflavor/pl/forms.py:53
+msgid "National Identification Number consists of 11 digits."
+msgstr "A nemzeti azonosítószám 11 számjegyből áll."
+
+#: contrib/localflavor/pl/forms.py:59
+msgid "Wrong checksum for the National Identification Number."
+msgstr "Hibás a nemzeti azonosítószám ellenőrző kódja."
+
+#: contrib/localflavor/pl/forms.py:71
+msgid "Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX."
+msgstr "Írjon be egy adószámot \"XXX-XXX-XX-XX\" vagy \"XX-XX-XXX-XXX\" alakban."
+
+#: contrib/localflavor/pl/forms.py:82
+msgid "Enter a postal code in the format XX-XXX."
+msgstr "Írjon be egy irányítószámot 'XX-XXX' alakban."
+
+#: contrib/sessions/models.py:68
+msgid "session key"
+msgstr "munkamenet kulcs"
+
+#: contrib/sessions/models.py:69
+msgid "session data"
+msgstr "munkamenet adat"
+
+#: contrib/sessions/models.py:70
+msgid "expire date"
+msgstr "lejárat dátuma"
+
+#: contrib/sessions/models.py:74
+msgid "session"
+msgstr "munkamenet"
+
+#: contrib/sessions/models.py:75
+msgid "sessions"
+msgstr "munkamenetek"
+
+#: contrib/flatpages/models.py:8
+msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr "Például: '/about/contact/'. Figyeljen a nyitó és záró perjelre!"
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "cím"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "tartalom"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "megjegyzések engedélyezése"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "sablon neve"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"Példa: 'flatpages/contact_page'. Ha ez nem létezik, a rendszer a 'flatpages/"
+"default.html' sablont fogja használni."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "regisztráció szükséges"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+"Ha ez be van jelölve, csak bejelentkezett felhasználó tudja az oldalt "
+"megnézni."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "egyszerű oldal"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "egyszerű oldalak"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "hétfő"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "kedd"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "szerda"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "csütörtök"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "péntek"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "szombat"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "vasárnap"
+
+#: utils/dates.py:10
+msgid "Mon"
+msgstr "hét"
+
+#: utils/dates.py:10
+msgid "Tue"
+msgstr "kedd"
+
+#: utils/dates.py:10
+msgid "Wed"
+msgstr "sze"
+
+#: utils/dates.py:10
+msgid "Thu"
+msgstr "csüt"
+
+#: utils/dates.py:10
+msgid "Fri"
+msgstr "pén"
+
+#: utils/dates.py:11
+msgid "Sat"
+msgstr "szo"
+
+#: utils/dates.py:11
+msgid "Sun"
+msgstr "vas"
+
+#: utils/dates.py:18
+msgid "January"
+msgstr "január"
+
+#: utils/dates.py:18
+msgid "February"
+msgstr "február"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "March"
+msgstr "március"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "April"
+msgstr "április"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "May"
+msgstr "május"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "June"
+msgstr "június"
+
+#: utils/dates.py:19 utils/dates.py:31
+msgid "July"
+msgstr "július"
+
+#: utils/dates.py:19
+msgid "August"
+msgstr "augusztus"
+
+#: utils/dates.py:19
+msgid "September"
+msgstr "szeptember"
+
+#: utils/dates.py:19
+msgid "October"
+msgstr "október"
+
+#: utils/dates.py:19
+msgid "November"
+msgstr "november"
+
+#: utils/dates.py:20
+msgid "December"
+msgstr "december"
+
+#: utils/dates.py:23
+msgid "jan"
+msgstr "jan"
+
+#: utils/dates.py:23
+msgid "feb"
+msgstr "febr"
+
+#: utils/dates.py:23
+msgid "mar"
+msgstr "márc"
+
+#: utils/dates.py:23
+msgid "apr"
+msgstr "ápr"
+
+#: utils/dates.py:23
+msgid "may"
+msgstr "máj"
+
+#: utils/dates.py:23
+msgid "jun"
+msgstr "jún"
+
+#: utils/dates.py:24
+msgid "jul"
+msgstr "júl"
+
+#: utils/dates.py:24
+msgid "aug"
+msgstr "aug"
+
+#: utils/dates.py:24
+msgid "sep"
+msgstr "szept"
+
+#: utils/dates.py:24
+msgid "oct"
+msgstr "okt"
+
+#: utils/dates.py:24
+msgid "nov"
+msgstr "nov"
+
+#: utils/dates.py:24
+msgid "dec"
+msgstr "dec"
+
+#: utils/dates.py:31
+msgid "Jan."
+msgstr "jan."
+
+#: utils/dates.py:31
+msgid "Feb."
+msgstr "febr."
+
+#: utils/dates.py:32
+msgid "Aug."
+msgstr "aug."
+
+#: utils/dates.py:32
+msgid "Sept."
+msgstr "szept."
+
+#: utils/dates.py:32
+msgid "Oct."
+msgstr "okt."
+
+#: utils/dates.py:32
+msgid "Nov."
+msgstr "nov."
+
+#: utils/dates.py:32
+msgid "Dec."
+msgstr "dec."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "év"
+msgstr[1] "év"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "hónap"
+msgstr[1] "hónap"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "hét"
+msgstr[1] "hét"
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "nap"
+msgstr[1] "nap"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "óra"
+msgstr[1] "óra"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "perc"
+msgstr[1] "perc"
+
+#: utils/timesince.py:39
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr "%(number)d %(type)s"
+
+#: utils/timesince.py:45
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ", %(number)d %(type)s"
+
+#: utils/text.py:127
+msgid "or"
+msgstr "vagy"
+
+#: utils/dateformat.py:41
+msgid "p.m."
+msgstr "du"
+
+#: utils/dateformat.py:42
+msgid "a.m."
+msgstr "de"
+
+#: utils/dateformat.py:47
+msgid "PM"
+msgstr "DU"
+
+#: utils/dateformat.py:48
+msgid "AM"
+msgstr "DE"
+
+#: utils/dateformat.py:97
+msgid "midnight"
+msgstr "éjfél"
+
+#: utils/dateformat.py:99
+msgid "noon"
+msgstr "dél"
+
+#: utils/translation/trans_real.py:391
+msgid "DATE_FORMAT"
+msgstr "Y. F j."
+
+#: utils/translation/trans_real.py:392
+msgid "DATETIME_FORMAT"
+msgstr "Y. F j., H:i"
+
+#: utils/translation/trans_real.py:393
+msgid "TIME_FORMAT"
+msgstr "H:i"
+
+#: utils/translation/trans_real.py:409
+msgid "YEAR_MONTH_FORMAT"
+msgstr "Y. F j."
+
+#: utils/translation/trans_real.py:410
+msgid "MONTH_DAY_FORMAT"
+msgstr "Y. F j."
+
+#: template/defaultfilters.py:485
+msgid "yes,no,maybe"
+msgstr "igen,nem,talán"
+
+#: template/defaultfilters.py:514
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d bájt"
+msgstr[1] "%(size)d bájt"
+
+#: template/defaultfilters.py:516
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f KB"
+
+#: template/defaultfilters.py:518
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: template/defaultfilters.py:519
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
diff --git a/webapp/django/conf/locale/hu/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/hu/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..e538984
--- /dev/null
+++ b/webapp/django/conf/locale/hu/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/hu/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/hu/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..26f0232
--- /dev/null
+++ b/webapp/django/conf/locale/hu/LC_MESSAGES/djangojs.po
@@ -0,0 +1,111 @@
+# translation of djangojs.po to Hungarian
+# translation of djangojs.po to
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-12-09 11:51+0100\n"
+"PO-Revision-Date: 2007-09-13 13:30+0200\n"
+"Last-Translator: Szilveszter Farkas <szilveszter.farkas@gmail.com>\n"
+"Language-Team: Hungarian <hu@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms:  nplurals=2; plural=(n != 1);\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "Elérhető %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Mindet kijelölni"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Hozzáadás"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Eltávolítás"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "%s kiválasztva"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Válassza ki a kért elemeket és kattintson"
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Összes törlése"
+
+#: contrib/admin/media/js/dateparse.js:26
+#: contrib/admin/media/js/calendar.js:24
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr "január február március április május június július augusztus szeptember október november december"
+
+#: contrib/admin/media/js/dateparse.js:27
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "vasárnap hétfő kedd szerda csütörtök péntek szombat"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "V H K Sz Cs P Szo"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "Most"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "Óra"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "Válassza ki az időt"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "Éjfél"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "Reggel 6 óra"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "Dél"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "Mégsem"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "Ma"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "Naptár"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "Tegnap"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "Holnap"
+
diff --git a/webapp/django/conf/locale/is/LC_MESSAGES/django.mo b/webapp/django/conf/locale/is/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..1a95aad
--- /dev/null
+++ b/webapp/django/conf/locale/is/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/is/LC_MESSAGES/django.po b/webapp/django/conf/locale/is/LC_MESSAGES/django.po
new file mode 100644
index 0000000..82cfa67
--- /dev/null
+++ b/webapp/django/conf/locale/is/LC_MESSAGES/django.po
@@ -0,0 +1,4266 @@
+# Icelandic translation of Django.
+# This file is distributed under the same license as the Django package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-01-18 15:00+0000\n"
+"PO-Revision-Date: 2008-01-18 17:16+0100\n"
+"Last-Translator: Jökull Sólberg Auðunsson <jokullsolberg@gmail.com>\n"
+"Language-Team:  <dagurp@gmail.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1\n"
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "Arabíska"
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "Bengalska"
+
+#: conf/global_settings.py:41
+msgid "Bulgarian"
+msgstr "Búlgarska"
+
+#: conf/global_settings.py:42
+msgid "Catalan"
+msgstr ""
+
+#: conf/global_settings.py:43
+msgid "Czech"
+msgstr "Tékkneska"
+
+#: conf/global_settings.py:44
+msgid "Welsh"
+msgstr "Velska"
+
+#: conf/global_settings.py:45
+msgid "Danish"
+msgstr "Danska"
+
+#: conf/global_settings.py:46
+msgid "German"
+msgstr "Þýska"
+
+#: conf/global_settings.py:47
+msgid "Greek"
+msgstr "Gríska"
+
+#: conf/global_settings.py:48
+msgid "English"
+msgstr "Enska"
+
+#: conf/global_settings.py:49
+msgid "Spanish"
+msgstr "Spænska"
+
+#: conf/global_settings.py:50
+msgid "Argentinean Spanish"
+msgstr "Argentínsk Spænska"
+
+#: conf/global_settings.py:51
+msgid "Persian"
+msgstr ""
+
+#: conf/global_settings.py:52
+msgid "Finnish"
+msgstr "Finnska"
+
+#: conf/global_settings.py:53
+msgid "French"
+msgstr "Franska"
+
+#: conf/global_settings.py:54
+msgid "Gaeilge"
+msgstr ""
+
+#: conf/global_settings.py:55
+msgid "Galician"
+msgstr "Galíska"
+
+#: conf/global_settings.py:56
+msgid "Hungarian"
+msgstr "Ungverska"
+
+#: conf/global_settings.py:57
+msgid "Hebrew"
+msgstr "Hebreska"
+
+#: conf/global_settings.py:58
+msgid "Croatian"
+msgstr ""
+
+#: conf/global_settings.py:59
+msgid "Icelandic"
+msgstr "Íslenska"
+
+#: conf/global_settings.py:60
+msgid "Italian"
+msgstr "Ítalska"
+
+#: conf/global_settings.py:61
+msgid "Japanese"
+msgstr "Japanska"
+
+#: conf/global_settings.py:62
+msgid "Korean"
+msgstr ""
+
+#: conf/global_settings.py:63
+msgid "Khmer"
+msgstr ""
+
+#: conf/global_settings.py:64
+msgid "Kannada"
+msgstr ""
+
+#: conf/global_settings.py:65
+msgid "Latvian"
+msgstr ""
+
+#: conf/global_settings.py:66
+msgid "Macedonian"
+msgstr ""
+
+#: conf/global_settings.py:67
+msgid "Dutch"
+msgstr "Hollenska"
+
+#: conf/global_settings.py:68
+msgid "Norwegian"
+msgstr "Norska"
+
+#: conf/global_settings.py:69
+msgid "Polish"
+msgstr ""
+
+#: conf/global_settings.py:70
+msgid "Portugese"
+msgstr "Portúgalska"
+
+#: conf/global_settings.py:71
+msgid "Brazilian"
+msgstr "Brasilíska"
+
+#: conf/global_settings.py:72
+msgid "Romanian"
+msgstr "Rúmenska"
+
+#: conf/global_settings.py:73
+msgid "Russian"
+msgstr "Rússneska"
+
+#: conf/global_settings.py:74
+msgid "Slovak"
+msgstr "Slóvaska"
+
+#: conf/global_settings.py:75
+msgid "Slovenian"
+msgstr ""
+
+#: conf/global_settings.py:76
+msgid "Serbian"
+msgstr "Serbneska"
+
+#: conf/global_settings.py:77
+msgid "Swedish"
+msgstr "Sænska"
+
+#: conf/global_settings.py:78
+msgid "Tamil"
+msgstr ""
+
+#: conf/global_settings.py:79
+msgid "Telugu"
+msgstr ""
+
+#: conf/global_settings.py:80
+msgid "Turkish"
+msgstr ""
+
+#: conf/global_settings.py:81
+msgid "Ukrainian"
+msgstr ""
+
+#: conf/global_settings.py:82
+msgid "Simplified Chinese"
+msgstr "Einfölduð Kínverska "
+
+#: conf/global_settings.py:83
+msgid "Traditional Chinese"
+msgstr "Hefðbundin Kínverska"
+
+#: contrib/admin/filterspecs.py:44
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Frá %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:74
+#: contrib/admin/filterspecs.py:92
+#: contrib/admin/filterspecs.py:147
+#: contrib/admin/filterspecs.py:173
+msgid "All"
+msgstr "Allt"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Any date"
+msgstr "Allar dagsetningar"
+
+#: contrib/admin/filterspecs.py:114
+msgid "Today"
+msgstr "Dagurinn í dag"
+
+#: contrib/admin/filterspecs.py:117
+msgid "Past 7 days"
+msgstr "Síðustu 7 dagar"
+
+#: contrib/admin/filterspecs.py:119
+msgid "This month"
+msgstr "Þessi mánuður"
+
+#: contrib/admin/filterspecs.py:121
+msgid "This year"
+msgstr "Þetta ár"
+
+#: contrib/admin/filterspecs.py:147
+#: newforms/widgets.py:231
+#: oldforms/__init__.py:592
+msgid "Yes"
+msgstr "Já"
+
+#: contrib/admin/filterspecs.py:147
+#: newforms/widgets.py:231
+#: oldforms/__init__.py:592
+msgid "No"
+msgstr "Nei"
+
+#: contrib/admin/filterspecs.py:154
+#: newforms/widgets.py:231
+#: oldforms/__init__.py:592
+msgid "Unknown"
+msgstr "Óþekkt"
+
+#: contrib/admin/models.py:18
+msgid "action time"
+msgstr "tími aðgerðar"
+
+#: contrib/admin/models.py:21
+msgid "object id"
+msgstr "kenni hlutar"
+
+#: contrib/admin/models.py:22
+msgid "object repr"
+msgstr "framsetning hlutar"
+
+#: contrib/admin/models.py:23
+msgid "action flag"
+msgstr "aðgerðarveifa"
+
+#: contrib/admin/models.py:24
+msgid "change message"
+msgstr "breyta skilaboði"
+
+#: contrib/admin/models.py:27
+msgid "log entry"
+msgstr "kladdafærsla"
+
+#: contrib/admin/models.py:28
+msgid "log entries"
+msgstr "kladdafærslur"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Síða fannst ekki"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Því miður fannst umbeðin síða ekki."
+
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:37
+#: contrib/admin/templates/admin/change_form.html:12
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/delete_confirmation.html:5
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:4
+#: contrib/admin/templates/admin/auth/user/change_password.html:11
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+msgid "Home"
+msgstr "Heim"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Kerfisvilla"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Kerfisvilla (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Kerfisvilla <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid "There's been an error. It's been reported to the site administrators via e-mail and should be fixed shortly. Thanks for your patience."
+msgstr "Villa hefur komið upp. Hún hefur verið tilkynnt vefstjórunum með tölvupósti og verður örugglega löguð fljótlega. Við þökkum þolinmæðina."
+
+#: contrib/admin/templates/admin/base.html:26
+msgid "Welcome,"
+msgstr "Velkomin(n),"
+
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Skjölun"
+
+#: contrib/admin/templates/admin/base.html:29
+#: contrib/admin/templates/admin/auth/user/change_password.html:14
+#: contrib/admin/templates/admin/auth/user/change_password.html:45
+msgid "Change password"
+msgstr "Breyta lykilorði"
+
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/comments/templates/comments/form.html:6
+msgid "Log out"
+msgstr "Skrá út"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django vefstjóri"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django vefstjórn"
+
+#: contrib/admin/templates/admin/change_form.html:14
+#: contrib/admin/templates/admin/index.html:28
+msgid "Add"
+msgstr "Bæta við"
+
+#: contrib/admin/templates/admin/change_form.html:20
+#: contrib/admin/templates/admin/object_history.html:4
+msgid "History"
+msgstr "Saga"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "Skoða á vef"
+
+#: contrib/admin/templates/admin/change_form.html:31
+#: contrib/admin/templates/admin/auth/user/change_password.html:23
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Vinsamlegast leiðréttu villuna hér að neðan:"
+msgstr[1] "Vinsamlegast leiðréttu villurnar hér að neðan:"
+
+#: contrib/admin/templates/admin/change_form.html:49
+msgid "Ordering"
+msgstr "Röðun"
+
+#: contrib/admin/templates/admin/change_form.html:52
+msgid "Order:"
+msgstr "Röð:"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "Bæta við %(name)s"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:8
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Eyða"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:13
+#, python-format
+msgid "Deleting the %(object_name)s '%(escaped_object)s' would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:"
+msgstr "Eyðing á %(object_name)s „%(escaped_object)s“ hefði í för með sér eyðingu á tengdum hlutum en þú hefur ekki réttindi til að eyða eftirfarandi hlutum:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:20
+#, python-format
+msgid "Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? All of the following related items will be deleted:"
+msgstr "Ertu viss um að þú viljir eyða %(object_name)s „%(escaped_object)s“? Öllu eftirfarandi verður eytt:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:25
+msgid "Yes, I'm sure"
+msgstr "Já ég er viss."
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Eftir %(filter_title)s "
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "Sía"
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Líkön sem eru hluti af %(name)s forritinu."
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Breyta"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Þú hefur ekki réttindi til að breyta neinu"
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Nýlegar aðgerðir"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Mínar aðgerðir"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Engin fáanleg"
+
+#: contrib/admin/templates/admin/invalid_setup.html:8
+msgid "Something's wrong with your database installation. Make sure the appropriate database tables have been created, and make sure the database is readable by the appropriate user."
+msgstr "Eitthvað er að gagnagrunnsuppsetningu. Gakktu úr skuggum um að allar töflur séu til staðar og að notandinn hafi aðgang að grunninum."
+
+#: contrib/admin/templates/admin/login.html:17
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+msgid "Username:"
+msgstr "Notandanafn:"
+
+#: contrib/admin/templates/admin/login.html:20
+#: contrib/comments/templates/comments/form.html:8
+msgid "Password:"
+msgstr "Lykilorð:"
+
+#: contrib/admin/templates/admin/login.html:25
+#: contrib/admin/views/decorators.py:25
+msgid "Log in"
+msgstr "Skrá inn"
+
+#: contrib/admin/templates/admin/object_history.html:17
+msgid "Date/time"
+msgstr "Dagsetning/tími"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "User"
+msgstr "Notandi"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "Action"
+msgstr "Aðgerð"
+
+#: contrib/admin/templates/admin/object_history.html:25
+msgid "DATE_WITH_TIME_FULL"
+msgstr "N j, Y, P"
+
+#: contrib/admin/templates/admin/object_history.html:35
+msgid "This object doesn't have a change history. It probably wasn't added via this admin site."
+msgstr "Þessi hlutur hefur enga breytingasögu. Hann var líklega ekki búinn til á þessu stjórnunarsvæði."
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Sýna allt"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Áfram"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 niðustaða"
+msgstr[1] "%(counter)s niðurstöður"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s í heildina"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Vista sem nýtt"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Vista og búa til nýtt"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Vista og halda áfram að breyta"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Vista"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid "First, enter a username and password. Then, you'll be able to edit more user options."
+msgstr "Fyrst, settu inn notendanafn og lykilorð. Svo geturðu breytt öðrum notendamöguleikum."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "Notandanafn"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+#: contrib/admin/templates/admin/auth/user/change_password.html:33
+msgid "Password"
+msgstr "Lykilorð"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+#: contrib/admin/templates/admin/auth/user/change_password.html:38
+msgid "Password (again)"
+msgstr "Lykilorð (aftur)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+msgid "Enter the same password as above, for verification."
+msgstr "Settu inn sama lykilorðið aftur til staðfestingar."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:27
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Settu inn nýtt lykilorð fyrir notandann <strong>%(username)s</strong>."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Bókamerklar"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+msgid "Documentation bookmarklets"
+msgstr "Skjölunarbókamerklar"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:8
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">Til að setja upp bókamerkil (Bookmarklet) þarftu að draga tengilinn\n"
+"í bókamerkjareinina þína eða hægrismella á tengilinn og bæta honum við bókamerkin þín\n"
+"Nú getur þú notað bókamerkilinn frá hvaða síðu sem er innan vefjarins. Athugaðu að sumir\n"
+"þessara bókamerkla krefjast þess að þú sért að skoða vefinn frá tölvu sem er\n"
+"skráð sem \"internal\" (hafðu samband við kerfisstjórann ef þú ert óviss hvort tölvan þín er \"internal\").</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:18
+msgid "Documentation for this page"
+msgstr "Skjölun þessarar síðu"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Jumps you from any page to the documentation for the view that generates that page."
+msgstr "Sendir þig af hvaða síðu sem er á skjölun þess framsetningarlags sem myndar hana."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:21
+msgid "Show object ID"
+msgstr "Sýna kenni hlutar"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Shows the content-type and unique ID for pages that represent a single object."
+msgstr "Sýnir efnistag og sérkenni síða sem gefa tiltekna mynd af stökum hlut."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:24
+msgid "Edit this object (current window)"
+msgstr "Breyta þessum hlut (í þessum glugga)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "Stekkur á stjórnunarsíðuna fyrir þær síður sem gefa tiltekna mynd af stökum hlut."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:27
+msgid "Edit this object (new window)"
+msgstr "Breyta þessum hlut (nýr gluggi)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "As above, but opens the admin page in a new window."
+msgstr "Eins og að ofan en opnar stjórnunarsíðuna í nýjum glugga."
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Takk fyrir að verja tíma í vefsíðuna í dag."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Skráðu þig inn aftur"
+
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_form.html:5
+#: contrib/admin/templates/registration/password_change_form.html:9
+msgid "Password change"
+msgstr "Breyta lykilorði"
+
+#: contrib/admin/templates/registration/password_change_done.html:5
+#: contrib/admin/templates/registration/password_change_done.html:9
+msgid "Password change successful"
+msgstr "Breyting á lykilorði tókst"
+
+#: contrib/admin/templates/registration/password_change_done.html:11
+msgid "Your password was changed."
+msgstr "Lykilorði þínu var breytt"
+
+#: contrib/admin/templates/registration/password_change_form.html:11
+msgid "Please enter your old password, for security's sake, and then enter your new password twice so we can verify you typed it in correctly."
+msgstr "Vinsamlegast skrifaðu gamla lykilorðið þitt til öryggis. Sláðu svo nýja lykilorðið tvisvar inn svo að hægt sé að ganga úr skugga um að þú hafir ekki gert innsláttarvillu."
+
+#: contrib/admin/templates/registration/password_change_form.html:16
+msgid "Old password:"
+msgstr "Gamla lykilorðið:"
+
+#: contrib/admin/templates/registration/password_change_form.html:18
+msgid "New password:"
+msgstr "Nýja lykilorðið:"
+
+#: contrib/admin/templates/registration/password_change_form.html:20
+msgid "Confirm password:"
+msgstr "Staðfesta lykilorð:"
+
+#: contrib/admin/templates/registration/password_change_form.html:22
+msgid "Change my password"
+msgstr "Breyta lykilorðinu mínu"
+
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+msgid "Password reset"
+msgstr "Endurstilla lykilorð"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Endurstilling á lykilorði tókst"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid "We've e-mailed a new password to the e-mail address you submitted. You should be receiving it shortly."
+msgstr "Við sendum nýtt lykilorð á tölvupóstfangið sem þú gafst upp. Það ætti að berast fljótlega til þín."
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Þú fékkst þennan tölvupóst vegna þess að þú baðst um endurstillingu á lykilorðinu þínu"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "fyrir notandareikning þinn á %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Nýja lykilorðið þitt er: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Þér er frjálst að breyta lykilorðinu með því að fara á þessa síðu:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Notandanafnið þitt ef þú skyldir hafa gleymt því:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Takk fyrir að nota vefinn okkar!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s hópurinn"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid "Forgotten your password? Enter your e-mail address below, and we'll reset your password and e-mail the new one to you."
+msgstr "Gleymdir þú lykilorðinu þínu? Sláðu tölvupóstfangið þitt inn að neðan og við munum endurstilla lykilorðið þitt og senda til þín."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Tölvupóstfang:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Endursstilla lykilorðið mitt"
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Dagsetning:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Tími:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Eins og er:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Breyta:"
+
+#: contrib/admin/templatetags/admin_list.py:257
+msgid "All dates"
+msgstr "Allar dagsetningar"
+
+#: contrib/admin/views/auth.py:20
+#: contrib/admin/views/main.py:267
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s „%(obj)s“ var bætt við."
+
+#: contrib/admin/views/auth.py:25
+#: contrib/admin/views/main.py:271
+#: contrib/admin/views/main.py:356
+msgid "You may edit it again below."
+msgstr "Þú getur breytt því aftur að neðan."
+
+#: contrib/admin/views/auth.py:31
+msgid "Add user"
+msgstr "Bæta við notanda"
+
+#: contrib/admin/views/auth.py:58
+msgid "Password changed successfully."
+msgstr "Breyting á lykilorði tókst."
+
+#: contrib/admin/views/auth.py:65
+#, python-format
+msgid "Change password: %s"
+msgstr "Breyta lykilorði: %s"
+
+#: contrib/admin/views/decorators.py:11
+#: contrib/auth/forms.py:60
+msgid "Please enter a correct username and password. Note that both fields are case-sensitive."
+msgstr "Vinsamlegast sláðu inn rétt notandanafn og lykilorð. Athugaðu að báðir reitirnir þurfa að vera stafréttir."
+
+#: contrib/admin/views/decorators.py:63
+msgid "Please log in again, because your session has expired. Don't worry: Your submission has been saved."
+msgstr "Vinsamlegast skráðu þig inn aftur vegna þess að setan þín rann út. Engar áhyggjur, breytingin þín var vistuð."
+
+#: contrib/admin/views/decorators.py:70
+msgid "Looks like your browser isn't configured to accept cookies. Please enable cookies, reload this page, and try again."
+msgstr "Vafri þinn virðist ekki vera stilltur til að leyfa dúsur (cookies). Vinsamlegast gerðu dúsur virkar, endurhladdu þessa síðu og reyndu aftur."
+
+#: contrib/admin/views/decorators.py:84
+msgid "Usernames cannot contain the '@' character."
+msgstr "Notendanöfn geta ekki innihaldið '@' merkið."
+
+#: contrib/admin/views/decorators.py:86
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "Tölvupóstfangið þitt er ekki notandanafnið þitt. Prófaðu '%s' í staðinn."
+
+#: contrib/admin/views/doc.py:48
+#: contrib/admin/views/doc.py:50
+#: contrib/admin/views/doc.py:52
+msgid "tag:"
+msgstr "merki:"
+
+#: contrib/admin/views/doc.py:79
+#: contrib/admin/views/doc.py:81
+#: contrib/admin/views/doc.py:83
+msgid "filter:"
+msgstr "sía:"
+
+#: contrib/admin/views/doc.py:137
+#: contrib/admin/views/doc.py:139
+#: contrib/admin/views/doc.py:141
+msgid "view:"
+msgstr "skoða:"
+
+#: contrib/admin/views/doc.py:166
+#, python-format
+msgid "App %r not found"
+msgstr "Forrit %r fannst ekki"
+
+#: contrib/admin/views/doc.py:173
+#, python-format
+msgid "Model %(name)r not found in app %(label)r"
+msgstr "Líkanið %(name)r finnst ekki í forritinu %(label)r"
+
+#: contrib/admin/views/doc.py:185
+#, python-format
+msgid "the related `%(label)s.%(type)s` object"
+msgstr "tengdur `%(label)s.%(type)s` hluturinn"
+
+#: contrib/admin/views/doc.py:185
+#: contrib/admin/views/doc.py:207
+#: contrib/admin/views/doc.py:221
+#: contrib/admin/views/doc.py:226
+msgid "model:"
+msgstr "líkan:"
+
+#: contrib/admin/views/doc.py:216
+#, python-format
+msgid "related `%(label)s.%(name)s` objects"
+msgstr "tengdir `%(label)s.%(name)s` hlutir"
+
+#: contrib/admin/views/doc.py:221
+#, python-format
+msgid "all %s"
+msgstr "allt %s"
+
+#: contrib/admin/views/doc.py:226
+#, python-format
+msgid "number of %s"
+msgstr "fjöldi af %s"
+
+#: contrib/admin/views/doc.py:231
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Svæði í %s hlutnum"
+
+#: contrib/admin/views/doc.py:293
+#: contrib/admin/views/doc.py:304
+#: contrib/admin/views/doc.py:306
+#: contrib/admin/views/doc.py:312
+#: contrib/admin/views/doc.py:313
+#: contrib/admin/views/doc.py:315
+msgid "Integer"
+msgstr "Heiltala"
+
+#: contrib/admin/views/doc.py:294
+msgid "Boolean (Either True or False)"
+msgstr "Boole-gildi (True eða False)"
+
+#: contrib/admin/views/doc.py:295
+#: contrib/admin/views/doc.py:314
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Strengur (mest %(max_length)s)"
+
+#: contrib/admin/views/doc.py:296
+msgid "Comma-separated integers"
+msgstr "Kommuaðgreindar heiltölur"
+
+#: contrib/admin/views/doc.py:297
+msgid "Date (without time)"
+msgstr "Dagsetning (án tíma)"
+
+#: contrib/admin/views/doc.py:298
+msgid "Date (with time)"
+msgstr "Dagsetning (með tíma)"
+
+#: contrib/admin/views/doc.py:299
+msgid "Decimal number"
+msgstr "Tugatala"
+
+#: contrib/admin/views/doc.py:300
+msgid "E-mail address"
+msgstr "Tölvupóstfang"
+
+#: contrib/admin/views/doc.py:301
+#: contrib/admin/views/doc.py:302
+#: contrib/admin/views/doc.py:305
+msgid "File path"
+msgstr "Skjalaslóð"
+
+#: contrib/admin/views/doc.py:303
+msgid "Floating point number"
+msgstr "Hlaupakommutala (floating point number)"
+
+#: contrib/admin/views/doc.py:307
+#: contrib/comments/models.py:85
+msgid "IP address"
+msgstr "IP tala"
+
+#: contrib/admin/views/doc.py:309
+msgid "Boolean (Either True, False or None)"
+msgstr "Boole-gildi (True, False eða None)"
+
+#: contrib/admin/views/doc.py:310
+msgid "Relation to parent model"
+msgstr "Tengsl við yfirlíkan"
+
+#: contrib/admin/views/doc.py:311
+msgid "Phone number"
+msgstr "Símanúmer"
+
+#: contrib/admin/views/doc.py:316
+msgid "Text"
+msgstr "Texti"
+
+#: contrib/admin/views/doc.py:317
+msgid "Time"
+msgstr "Tími"
+
+#: contrib/admin/views/doc.py:318
+#: contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "Veffang"
+
+#: contrib/admin/views/doc.py:319
+msgid "U.S. state (two uppercase letters)"
+msgstr "Bandarískt fylki (tveir hástafir)"
+
+#: contrib/admin/views/doc.py:320
+msgid "XML text"
+msgstr "XML texti"
+
+#: contrib/admin/views/doc.py:346
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s virðist ekki vera urlpattern hlutur"
+
+#: contrib/admin/views/main.py:233
+msgid "Site administration"
+msgstr "Vefstjórn"
+
+#: contrib/admin/views/main.py:280
+#: contrib/admin/views/main.py:365
+#, python-format
+msgid "You may add another %s below."
+msgstr "Þú getur bætt öðru %s við að neðan."
+
+#: contrib/admin/views/main.py:298
+#, python-format
+msgid "Add %s"
+msgstr "Bæta við %s"
+
+#: contrib/admin/views/main.py:344
+#, python-format
+msgid "Added %s."
+msgstr "Bætti við %s."
+
+#: contrib/admin/views/main.py:344
+#: contrib/admin/views/main.py:346
+#: contrib/admin/views/main.py:348
+#: core/validators.py:283
+#: db/models/manipulators.py:309
+msgid "and"
+msgstr "og"
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "Changed %s."
+msgstr "Breytti %s."
+
+#: contrib/admin/views/main.py:348
+#, python-format
+msgid "Deleted %s."
+msgstr "Eyddi %s."
+
+#: contrib/admin/views/main.py:351
+msgid "No fields changed."
+msgstr "Engum reitum breytt."
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s „%(obj)s“ hefur verið breytt."
+
+#: contrib/admin/views/main.py:362
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s „%(obj)s“ hefur verið bætt við. Þú getur breytt því aftur að neðan."
+
+#: contrib/admin/views/main.py:400
+#, python-format
+msgid "Change %s"
+msgstr "Breyta %s"
+
+#: contrib/admin/views/main.py:487
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Eitt eða fleiri %(fieldname)s í %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:492
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Eitt eða fleiri %(fieldname)s í %(name)s:"
+
+#: contrib/admin/views/main.py:524
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s „%(obj)s“ var eytt."
+
+#: contrib/admin/views/main.py:527
+msgid "Are you sure?"
+msgstr "Ertu viss?"
+
+#: contrib/admin/views/main.py:549
+#, python-format
+msgid "Change history: %s"
+msgstr "Breytingarsaga: %s"
+
+#: contrib/admin/views/main.py:583
+#, python-format
+msgid "Select %s"
+msgstr "Veldu %s"
+
+#: contrib/admin/views/main.py:583
+#, python-format
+msgid "Select %s to change"
+msgstr "Veldu %s til að breyta"
+
+#: contrib/admin/views/main.py:784
+msgid "Database error"
+msgstr "Gagnagrunnsvilla"
+
+#: contrib/auth/forms.py:17
+#: contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr "Lykilorðin tvö pössuðu ekki saman."
+
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr "Notandi með þetta notendanafn er nú þegar til."
+
+#: contrib/auth/forms.py:53
+msgid "Your Web browser doesn't appear to have cookies enabled. Cookies are required for logging in."
+msgstr "Vafri þinn virðist ekki vera stilltur til að leyfa dúsur (cookies). Dúsur eru nauðsynlegar fyrir innskráningu."
+
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "Þessi reikningur er óvirku."
+
+#: contrib/auth/forms.py:84
+msgid "That e-mail address doesn't have an associated user account. Are you sure you've registered?"
+msgstr "Þetta netfang hefur engan tengdan notandareikning. Ertu viss um að þú hafi skráð þig?"
+
+#: contrib/auth/forms.py:107
+#, python-format
+msgid "Password reset on %s"
+msgstr "Lykilorð endurstillt á %s"
+
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "'Nýtt lykilorð' svæðin passa ekki saman."
+
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Gamla lykilorðið var vitlaust. Vinsamlegast reyndu aftur."
+
+#: contrib/auth/models.py:73
+#: contrib/auth/models.py:93
+msgid "name"
+msgstr "nafn"
+
+#: contrib/auth/models.py:75
+msgid "codename"
+msgstr "vinnuheiti"
+
+#: contrib/auth/models.py:78
+msgid "permission"
+msgstr "réttindi"
+
+#: contrib/auth/models.py:79
+#: contrib/auth/models.py:94
+msgid "permissions"
+msgstr "réttindi"
+
+#: contrib/auth/models.py:97
+msgid "group"
+msgstr "hópur"
+
+#: contrib/auth/models.py:98
+#: contrib/auth/models.py:141
+msgid "groups"
+msgstr "hópar"
+
+#: contrib/auth/models.py:131
+msgid "username"
+msgstr "notandanafn"
+
+#: contrib/auth/models.py:131
+msgid "Required. 30 characters or fewer. Alphanumeric characters only (letters, digits and underscores)."
+msgstr "Krafist. 30 stafir eða færri. Aðeins enskir ritstafastafir (enskir ritstafir, tölur og undirstrik)."
+
+#: contrib/auth/models.py:132
+msgid "first name"
+msgstr "skírnarnafn"
+
+#: contrib/auth/models.py:133
+msgid "last name"
+msgstr "eftirnafn"
+
+#: contrib/auth/models.py:134
+msgid "e-mail address"
+msgstr "tölvupóstfang"
+
+#: contrib/auth/models.py:135
+msgid "password"
+msgstr "lykilorð"
+
+#: contrib/auth/models.py:135
+msgid "Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change password form</a>."
+msgstr "Notaðu '[algo]$[salt]$[hexdigest]' eða <a href=\"password/\">'breyta lykilorði' formið</a>."
+
+#: contrib/auth/models.py:136
+msgid "staff status"
+msgstr "staða starfsmanns"
+
+#: contrib/auth/models.py:136
+msgid "Designates whether the user can log into this admin site."
+msgstr "Segir til um hvort notandinn getur skráð sig inn á þetta stjórnunarsvæði."
+
+#: contrib/auth/models.py:137
+msgid "active"
+msgstr "virkur"
+
+#: contrib/auth/models.py:137
+msgid "Designates whether this user can log into the Django admin. Unselect this instead of deleting accounts."
+msgstr "Segir til um hvort notandinn geti skráð sig inn á þetta stjórnunarsvæði. Slökktu á þessum möguleika í stað þess að eyða notandanum."
+
+#: contrib/auth/models.py:138
+msgid "superuser status"
+msgstr "staða ofurnotanda"
+
+#: contrib/auth/models.py:138
+msgid "Designates that this user has all permissions without explicitly assigning them."
+msgstr "Til marks um að notandinn hafi öll réttindi án þess að taka þau sérstaklega fram."
+
+#: contrib/auth/models.py:139
+msgid "last login"
+msgstr "síðasta innskráning"
+
+#: contrib/auth/models.py:140
+msgid "date joined"
+msgstr "skráning dags."
+
+#: contrib/auth/models.py:142
+msgid "In addition to the permissions manually assigned, this user will also get all permissions granted to each group he/she is in."
+msgstr "Auk réttindanna sem notandanum var gefið sérstaklega fær hann öll þau réttindi sem hópurinn hans hefur."
+
+#: contrib/auth/models.py:143
+msgid "user permissions"
+msgstr "réttindi"
+
+#: contrib/auth/models.py:147
+msgid "user"
+msgstr "notandi"
+
+#: contrib/auth/models.py:148
+msgid "users"
+msgstr "notendur"
+
+#: contrib/auth/models.py:154
+msgid "Personal info"
+msgstr "Persónuupplýsingar"
+
+#: contrib/auth/models.py:155
+msgid "Permissions"
+msgstr "Réttindi"
+
+#: contrib/auth/models.py:156
+msgid "Important dates"
+msgstr "Mikilvægar dagsetningar"
+
+#: contrib/auth/models.py:157
+msgid "Groups"
+msgstr "Hópar"
+
+#: contrib/auth/models.py:316
+msgid "message"
+msgstr "skilaboð"
+
+#: contrib/auth/views.py:47
+msgid "Logged out"
+msgstr "Útskráður"
+
+#: contrib/comments/models.py:67
+#: contrib/comments/models.py:169
+msgid "object ID"
+msgstr "kenni hlutar"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "fyrirsögn"
+
+#: contrib/comments/models.py:69
+#: contrib/comments/models.py:90
+#: contrib/comments/models.py:170
+msgid "comment"
+msgstr "athugasemd"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "einkunn #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "einkunn #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "einkunn #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "einkunn #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "einkunn #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "einkunn #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "einkunn #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "einkunn #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "er gild einkunn"
+
+#: contrib/comments/models.py:83
+#: contrib/comments/models.py:172
+msgid "date/time submitted"
+msgstr "innsent dags/tími"
+
+#: contrib/comments/models.py:84
+#: contrib/comments/models.py:173
+msgid "is public"
+msgstr "er öllum sýnilegt"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "hefur verið fjarlægt"
+
+#: contrib/comments/models.py:86
+msgid "Check this box if the comment is inappropriate. A \"This comment has been removed\" message will be displayed instead."
+msgstr "Hakaðu við þennan reit ef athugasemdin er óviðeigandi. Skilaboðin „Þessi athugasemd hefur verið fjarlægð“ birtist í staðinn."
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "athugasemdir"
+
+#: contrib/comments/models.py:134
+#: contrib/comments/models.py:213
+msgid "Content object"
+msgstr "Efnishlutur"
+
+#: contrib/comments/models.py:162
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"%(user)s sendi inn %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:171
+msgid "person's name"
+msgstr "nafn einstaklings"
+
+#: contrib/comments/models.py:174
+msgid "ip address"
+msgstr "IP tala"
+
+#: contrib/comments/models.py:176
+msgid "approved by staff"
+msgstr "samþykkt af umsjónarmönnum"
+
+#: contrib/comments/models.py:179
+msgid "free comment"
+msgstr "frjáls athugasemd"
+
+#: contrib/comments/models.py:180
+msgid "free comments"
+msgstr "frjálsar athugasemdir"
+
+#: contrib/comments/models.py:239
+msgid "score"
+msgstr "stig"
+
+#: contrib/comments/models.py:240
+msgid "score date"
+msgstr "dagsetning stigagjafar"
+
+#: contrib/comments/models.py:243
+msgid "karma score"
+msgstr "karma stig"
+
+#: contrib/comments/models.py:244
+msgid "karma scores"
+msgstr "karma stig"
+
+#: contrib/comments/models.py:248
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d stig frá %(user)s"
+
+#: contrib/comments/models.py:264
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Þessi athugasemd var veifuð af %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:271
+msgid "flag date"
+msgstr "Dagsetning veifu"
+
+#: contrib/comments/models.py:274
+msgid "user flag"
+msgstr "notandaveifa"
+
+#: contrib/comments/models.py:275
+msgid "user flags"
+msgstr "notendaveifur"
+
+#: contrib/comments/models.py:279
+#, python-format
+msgid "Flag by %r"
+msgstr "Veifað af %r"
+
+#: contrib/comments/models.py:284
+msgid "deletion date"
+msgstr "eytt dags."
+
+#: contrib/comments/models.py:286
+msgid "moderator deletion"
+msgstr "eytt af umsjónarmanni"
+
+#: contrib/comments/models.py:287
+msgid "moderator deletions"
+msgstr "eytt af umsjónarmanni"
+
+#: contrib/comments/models.py:291
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Eytt af umsjónarmanni %r"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Gleymdir þú lykilorðinu þínu?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Einkunnir"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Nauðsynlegt"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Valfrjálst"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Sendu inn ljósmynd"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Athugasemd:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Forskoða athugasemd"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Nafnið þitt:"
+
+#: contrib/comments/views/comments.py:28
+msgid "This rating is required because you've entered at least one other rating."
+msgstr "Þessi stigagjöf er nauðsynleg vegna þess að þú gafst að minnsta kosti eina aðra einkunn."
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Þessi athugasemd var send inn af notanda sem hefur sent inn færri en %(count)s athugasemd:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Þessi athugasemd var send inn af notanda sem hefur sent inn færri en %(count)s athugasemdir:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Þessi athugasemd var send inn af vafasömum notanda:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:190
+#: contrib/comments/views/comments.py:283
+msgid "Only POSTs are allowed"
+msgstr "Eingöngu POST eru leyfð"
+
+#: contrib/comments/views/comments.py:194
+#: contrib/comments/views/comments.py:287
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Einn eða fleiri nauðsynlegir reitir voru ekki fylltir"
+
+#: contrib/comments/views/comments.py:198
+#: contrib/comments/views/comments.py:289
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Einhver átti við athugasemdaformið (öryggisbrot)"
+
+#: contrib/comments/views/comments.py:208
+#: contrib/comments/views/comments.py:295
+msgid "The comment form had an invalid 'target' parameter -- the object ID was invalid"
+msgstr "Athugasemdaformið hafði ógildan 'target' stika -- kenni hlutarins var ógilt"
+
+#: contrib/comments/views/comments.py:259
+#: contrib/comments/views/comments.py:324
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "Athugasemdaformið útvegaði ekki annað hvort 'forskoða' eða 'senda'"
+
+#: contrib/comments/views/karma.py:21
+msgid "Anonymous users cannot vote"
+msgstr "Ónafngreindir notendur geta ekki kosið"
+
+#: contrib/comments/views/karma.py:25
+msgid "Invalid comment ID"
+msgstr "Ógilt kenni á athugasemd"
+
+#: contrib/comments/views/karma.py:27
+msgid "No voting for yourself"
+msgstr "Þú getur ekki kosið sjálfa(n) þig"
+
+#: contrib/contenttypes/models.py:37
+msgid "python model class name"
+msgstr "python eininga klasa nafn"
+
+#: contrib/contenttypes/models.py:40
+msgid "content type"
+msgstr "efnistag"
+
+#: contrib/contenttypes/models.py:41
+msgid "content types"
+msgstr "efnistög"
+
+#: contrib/flatpages/models.py:8
+msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr "Dæmi: '/about/contact/'. Passaðu að hafa skástrik fremst og aftast."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "titill"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "innihald"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "virkja athugasemdir"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "nafn sniðmáts"
+
+#: contrib/flatpages/models.py:13
+msgid "Example: 'flatpages/contact_page.html'. If this isn't provided, the system will use 'flatpages/default.html'."
+msgstr "Dæmi: 'flatpages/contact_page.html'. Ef ekkert er gefið upp mun kerfið nota 'flatpages/default.html'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "skráning nauðsynleg"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Ef þetta er valið geta eingöngu innskráðir notendur séð síðuna."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "flatskrá"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "flatskrár"
+
+#: contrib/humanize/templatetags/humanize.py:20
+msgid "th"
+msgstr "."
+
+#: contrib/humanize/templatetags/humanize.py:20
+msgid "st"
+msgstr "."
+
+#: contrib/humanize/templatetags/humanize.py:20
+msgid "nd"
+msgstr "."
+
+#: contrib/humanize/templatetags/humanize.py:20
+msgid "rd"
+msgstr "."
+
+#: contrib/humanize/templatetags/humanize.py:52
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f milljón"
+msgstr[1] "%(value).1f milljónir"
+
+#: contrib/humanize/templatetags/humanize.py:55
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f milljarður"
+msgstr[1] "%(value).1f milljarðar"
+
+#: contrib/humanize/templatetags/humanize.py:58
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f billjarður"
+msgstr[1] "%(value).1f billjónir"
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "one"
+msgstr "einn"
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "two"
+msgstr "tveir"
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "three"
+msgstr "þrír"
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "four"
+msgstr "fjórir"
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "five"
+msgstr "fimm"
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "six"
+msgstr "sex"
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "seven"
+msgstr "sjö"
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "eight"
+msgstr "átta"
+
+#: contrib/humanize/templatetags/humanize.py:74
+msgid "nine"
+msgstr "níu"
+
+#: contrib/humanize/templatetags/humanize.py:94
+msgid "today"
+msgstr "í dag"
+
+#: contrib/humanize/templatetags/humanize.py:96
+msgid "tomorrow"
+msgstr "morgundagur"
+
+#: contrib/humanize/templatetags/humanize.py:98
+msgid "yesterday"
+msgstr "gærdagur"
+
+#: contrib/localflavor/ar/forms.py:28
+msgid "Enter a postal code in the format NNNN or ANNNNAAA."
+msgstr "Færðu inn póstnúmer í sniðinu NNNN eða ANNNNAAA."
+
+#: contrib/localflavor/ar/forms.py:50
+#: contrib/localflavor/br/forms.py:96
+#: contrib/localflavor/br/forms.py:135
+#: contrib/localflavor/pe/forms.py:23
+#: contrib/localflavor/pe/forms.py:51
+msgid "This field requires only numbers."
+msgstr "Þessi reitur tekur aðeins tölugildi."
+
+#: contrib/localflavor/ar/forms.py:51
+msgid "This field requires 7 or 8 digits."
+msgstr "Þessi reitur krefst 7 eða 8 tölustafa."
+
+#: contrib/localflavor/ar/forms.py:80
+msgid "Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format."
+msgstr "Færðu inn gilt CUIT í XX-XXXXXXXX-X eða XXXXXXXXXXXX sniðinu."
+
+#: contrib/localflavor/ar/forms.py:81
+msgid "Invalid CUIT."
+msgstr "Ógilt CUIT."
+
+#: contrib/localflavor/au/forms.py:16
+msgid "Enter a 4 digit post code."
+msgstr "Sláðu inn 4 stafa póstkóða."
+
+#: contrib/localflavor/br/forms.py:21
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Sláðu inn zip póstfang í sniðinu XXXXX-XXX."
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "Símanúmer verða að vera í XXX-XXX-XXXX sniði."
+
+#: contrib/localflavor/br/forms.py:58
+msgid "Select a valid brazilian state. That state is not one of the available states."
+msgstr "Veldu gilt brasilískt fylki. Fylkið er ekki eitt af gildum fylkjum."
+
+#: contrib/localflavor/br/forms.py:94
+msgid "Invalid CPF number."
+msgstr "Ógilt CPF númer."
+
+#: contrib/localflavor/br/forms.py:95
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:134
+msgid "Invalid CNPJ number."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:136
+msgid "This field requires at least 14 digits"
+msgstr "Þessi reitur krefst að minnsta kosti 14 tölustafa."
+
+#: contrib/localflavor/ca/forms.py:17
+msgid "Enter a postal code in the format XXX XXX."
+msgstr ""
+
+#: contrib/localflavor/ca/forms.py:88
+msgid "Enter a valid Canadian Social Insurance number in XXX-XXX-XXX format."
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr ""
+
+#: contrib/localflavor/ch/forms.py:16
+#: contrib/localflavor/no/forms.py:12
+msgid "Enter a zip code in the format XXXX."
+msgstr ""
+
+#: contrib/localflavor/ch/forms.py:64
+msgid "Enter a valid Swiss identity or passport card number in X1234567<0 or 1234567890 format."
+msgstr ""
+
+#: contrib/localflavor/cl/forms.py:29
+msgid "Enter a valid Chilean RUT."
+msgstr ""
+
+#: contrib/localflavor/cl/forms.py:30
+msgid "Enter a valid Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr ""
+
+#: contrib/localflavor/cl/forms.py:31
+msgid "The Chilean RUT is not valid."
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr ""
+
+#: contrib/localflavor/de/forms.py:14
+#: contrib/localflavor/fi/forms.py:12
+#: contrib/localflavor/fr/forms.py:15
+msgid "Enter a zip code in the format XXXXX."
+msgstr ""
+
+#: contrib/localflavor/de/forms.py:41
+msgid "Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X format."
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:5
+msgid "Arava"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:6
+msgid "Albacete"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:7
+msgid "Alacant"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:8
+msgid "Almeria"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:9
+msgid "Avila"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:10
+msgid "Badajoz"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:11
+msgid "Illes Balears"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:12
+msgid "Barcelona"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:13
+msgid "Burgos"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:14
+msgid "Caceres"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:15
+msgid "Cadiz"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:16
+msgid "Castello"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:17
+msgid "Ciudad Real"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:18
+msgid "Cordoba"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:19
+msgid "A Coruna"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:20
+msgid "Cuenca"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:21
+msgid "Girona"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:22
+msgid "Granada"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:23
+msgid "Guadalajara"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:24
+msgid "Guipuzkoa"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:25
+msgid "Huelva"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:26
+msgid "Huesca"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:27
+msgid "Jaen"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:28
+msgid "Leon"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:29
+msgid "Lleida"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:30
+#: contrib/localflavor/es/es_regions.py:17
+msgid "La Rioja"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:31
+msgid "Lugo"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:32
+#: contrib/localflavor/es/es_regions.py:18
+msgid "Madrid"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:33
+msgid "Malaga"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:34
+msgid "Murcia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:35
+msgid "Navarre"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:36
+msgid "Ourense"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:37
+msgid "Asturias"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:38
+msgid "Palencia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:39
+msgid "Las Palmas"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:40
+msgid "Pontevedra"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:41
+msgid "Salamanca"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:42
+msgid "Santa Cruz de Tenerife"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:43
+#: contrib/localflavor/es/es_regions.py:11
+msgid "Cantabria"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:44
+msgid "Segovia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:45
+msgid "Seville"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:46
+msgid "Soria"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:47
+msgid "Tarragona"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:48
+msgid "Teruel"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:49
+msgid "Toledo"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:50
+msgid "Valencia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:51
+msgid "Valladolid"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:52
+msgid "Bizkaia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:53
+msgid "Zamora"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:54
+msgid "Zaragoza"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:55
+msgid "Ceuta"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:56
+msgid "Melilla"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:5
+msgid "Andalusia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:6
+msgid "Aragon"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:7
+msgid "Principality of Asturias"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:8
+msgid "Balearic Islands"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:9
+msgid "Basque Country"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:10
+msgid "Canary Islands"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:12
+msgid "Castile-La Mancha"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:13
+msgid "Castile and Leon"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:14
+msgid "Catalonia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:15
+msgid "Extremadura"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:16
+msgid "Galicia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:19
+msgid "Region of Murcia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:20
+msgid "Foral Community of Navarre"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:21
+msgid "Valencian Community"
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:19
+msgid "Enter a valid postal code in the range and format 01XXX - 52XXX."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:39
+msgid "Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or 9XXXXXXXX."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:66
+msgid "Please enter a valid NIF, NIE, or CIF."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:67
+msgid "Please enter a valid NIF or NIE."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:68
+msgid "Invalid checksum for NIF."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:69
+msgid "Invalid checksum for NIE."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:70
+msgid "Invalid checksum for CIF."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:142
+msgid "Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:143
+msgid "Invalid checksum for bank account number."
+msgstr ""
+
+#: contrib/localflavor/fi/forms.py:28
+msgid "Enter a valid Finnish social security number."
+msgstr ""
+
+#: contrib/localflavor/in_/forms.py:14
+msgid "Enter a zip code in the format XXXXXXX."
+msgstr ""
+
+#: contrib/localflavor/is_/forms.py:17
+msgid "Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr "Sláðu inn gilda íslenska kennitölu. Sniðið er DDMMÁÁÁÁ-XXXX."
+
+#: contrib/localflavor/is_/forms.py:18
+msgid "The Icelandic identification number is not valid."
+msgstr "Íslenska kennitalan er ekki gild."
+
+#: contrib/localflavor/it/forms.py:14
+msgid "Enter a valid zip code."
+msgstr ""
+
+#: contrib/localflavor/it/forms.py:43
+msgid "Enter a valid Social Security number."
+msgstr ""
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr ""
+
+#: contrib/localflavor/jp/forms.py:19
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:12
+msgid "Aguascalientes"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:13
+msgid "Baja California"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:14
+msgid "Baja California Sur"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:15
+msgid "Campeche"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:16
+msgid "Chihuahua"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:17
+msgid "Chiapas"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:18
+msgid "Coahuila"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:19
+msgid "Colima"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:20
+msgid "Distrito Federal"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:21
+msgid "Durango"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:22
+msgid "Guerrero"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:23
+msgid "Guanajuato"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:24
+msgid "Hidalgo"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:25
+msgid "Jalisco"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:26
+msgid "Estado de México"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:27
+msgid "Michoacán"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:28
+msgid "Morelos"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:29
+msgid "Nayarit"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:30
+msgid "Nuevo León"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:31
+msgid "Oaxaca"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:32
+msgid "Puebla"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:33
+msgid "Querétaro"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:34
+msgid "Quintana Roo"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:35
+msgid "Sinaloa"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:36
+msgid "San Luis Potosí"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:37
+msgid "Sonora"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:38
+msgid "Tabasco"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:39
+msgid "Tamaulipas"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:40
+msgid "Tlaxcala"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:41
+msgid "Veracruz"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:42
+msgid "Yucatán"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:43
+msgid "Zacatecas"
+msgstr ""
+
+#: contrib/localflavor/nl/forms.py:21
+msgid "Enter a valid postal code"
+msgstr "Sláðu inn gilt póstnúmer."
+
+#: contrib/localflavor/nl/forms.py:52
+msgid "Enter a valid phone number"
+msgstr "Sláðu inn gilt símanúmer."
+
+#: contrib/localflavor/nl/forms.py:78
+msgid "Enter a valid SoFi number"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:4
+msgid "Drente"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:5
+msgid "Flevoland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:6
+msgid "Friesland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:7
+msgid "Gelderland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:8
+msgid "Groningen"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:9
+msgid "Limburg"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:10
+msgid "Noord-Brabant"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:11
+msgid "Noord-Holland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:12
+msgid "Overijssel"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:13
+msgid "Utrecht"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:14
+msgid "Zeeland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:15
+msgid "Zuid-Holland"
+msgstr ""
+
+#: contrib/localflavor/no/forms.py:33
+msgid "Enter a valid Norwegian social security number."
+msgstr ""
+
+#: contrib/localflavor/pe/forms.py:24
+msgid "This field requires 8 digits."
+msgstr "Þessi reitur krefst 8 tölustafa."
+
+#: contrib/localflavor/pe/forms.py:52
+msgid "This field requires 11 digits."
+msgstr "Þessi reitur krefst 11 tölustafa."
+
+#: contrib/localflavor/pl/forms.py:39
+msgid "National Identification Number consists of 11 digits."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:40
+msgid "Wrong checksum for the National Identification Number."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:72
+msgid "Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:73
+msgid "Wrong checksum for the Tax Number (NIP)."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:112
+msgid "National Business Register Number (REGON) consists of 7 or 9 digits."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:113
+msgid "Wrong checksum for the National Business Register Number (REGON)."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:156
+msgid "Enter a postal code in the format XX-XXX."
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:8
+msgid "Lower Silesia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:9
+msgid "Kuyavia-Pomerania"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:10
+msgid "Lublin"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:11
+msgid "Lubusz"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:12
+msgid "Lodz"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:13
+msgid "Lesser Poland"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:14
+msgid "Masovia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:15
+msgid "Opole"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:16
+msgid "Subcarpatia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:17
+msgid "Podlasie"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:18
+msgid "Pomerania"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:19
+msgid "Silesia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:20
+msgid "Swietokrzyskie"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:21
+msgid "Warmia-Masuria"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:22
+msgid "Greater Poland"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:23
+msgid "West Pomerania"
+msgstr ""
+
+#: contrib/localflavor/sk/forms.py:30
+msgid "Enter a postal code in the format XXXXX or XXX XX."
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:8
+msgid "Banska Bystrica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:9
+msgid "Banska Stiavnica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:10
+msgid "Bardejov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:11
+msgid "Banovce nad Bebravou"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:12
+msgid "Brezno"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:13
+msgid "Bratislava I"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:14
+msgid "Bratislava II"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:15
+msgid "Bratislava III"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:16
+msgid "Bratislava IV"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:17
+msgid "Bratislava V"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:18
+msgid "Bytca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:19
+msgid "Cadca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:20
+msgid "Detva"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:21
+msgid "Dolny Kubin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:22
+msgid "Dunajska Streda"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:23
+msgid "Galanta"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:24
+msgid "Gelnica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:25
+msgid "Hlohovec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:26
+msgid "Humenne"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:27
+msgid "Ilava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:28
+msgid "Kezmarok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:29
+msgid "Komarno"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:30
+msgid "Kosice I"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:31
+msgid "Kosice II"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:32
+msgid "Kosice III"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:33
+msgid "Kosice IV"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:34
+msgid "Kosice - okolie"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:35
+msgid "Krupina"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:36
+msgid "Kysucke Nove Mesto"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:37
+msgid "Levice"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:38
+msgid "Levoca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:39
+msgid "Liptovsky Mikulas"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:40
+msgid "Lucenec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:41
+msgid "Malacky"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:42
+msgid "Martin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:43
+msgid "Medzilaborce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:44
+msgid "Michalovce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:45
+msgid "Myjava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:46
+msgid "Namestovo"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:47
+msgid "Nitra"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:48
+msgid "Nove Mesto nad Vahom"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:49
+msgid "Nove Zamky"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:50
+msgid "Partizanske"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:51
+msgid "Pezinok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:52
+msgid "Piestany"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:53
+msgid "Poltar"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:54
+msgid "Poprad"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:55
+msgid "Povazska Bystrica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:56
+msgid "Presov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:57
+msgid "Prievidza"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:58
+msgid "Puchov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:59
+msgid "Revuca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:60
+msgid "Rimavska Sobota"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:61
+msgid "Roznava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:62
+msgid "Ruzomberok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:63
+msgid "Sabinov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:64
+msgid "Senec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:65
+msgid "Senica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:66
+msgid "Skalica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:67
+msgid "Snina"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:68
+msgid "Sobrance"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:69
+msgid "Spisska Nova Ves"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:70
+msgid "Stara Lubovna"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:71
+msgid "Stropkov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:72
+msgid "Svidnik"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:73
+msgid "Sala"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:74
+msgid "Topolcany"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:75
+msgid "Trebisov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:76
+msgid "Trencin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:77
+msgid "Trnava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:78
+msgid "Turcianske Teplice"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:79
+msgid "Tvrdosin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:80
+msgid "Velky Krtis"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:81
+msgid "Vranov nad Toplou"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:82
+msgid "Zlate Moravce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:83
+msgid "Zvolen"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:84
+msgid "Zarnovica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:85
+msgid "Ziar nad Hronom"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:86
+msgid "Zilina"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:8
+msgid "Banska Bystrica region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:9
+msgid "Bratislava region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:10
+msgid "Kosice region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:11
+msgid "Nitra region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:12
+msgid "Presov region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:13
+msgid "Trencin region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:14
+msgid "Trnava region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:15
+msgid "Zilina region"
+msgstr ""
+
+#: contrib/localflavor/uk/forms.py:21
+msgid "Enter a valid postcode."
+msgstr "Sláðu inn gilt póstnúmer."
+
+#: contrib/localflavor/uk/uk_regions.py:11
+msgid "Bedfordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:12
+msgid "Buckinghamshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:14
+msgid "Cheshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:15
+msgid "Cornwall and Isles of Scilly"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:16
+msgid "Cumbria"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:17
+msgid "Derbyshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:18
+msgid "Devon"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:19
+msgid "Dorset"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:20
+msgid "Durham"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:21
+msgid "East Sussex"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:22
+msgid "Essex"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:23
+msgid "Gloucestershire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:24
+msgid "Greater London"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:25
+msgid "Greater Manchester"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:26
+msgid "Hampshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:27
+msgid "Hertfordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:28
+msgid "Kent"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:29
+msgid "Lancashire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:30
+msgid "Leicestershire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:31
+msgid "Lincolnshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:32
+msgid "Merseyside"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:33
+msgid "Norfolk"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:34
+msgid "North Yorkshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:35
+msgid "Northamptonshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:36
+msgid "Northumberland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:37
+msgid "Nottinghamshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:38
+msgid "Oxfordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:39
+msgid "Shropshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:40
+msgid "Somerset"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:41
+msgid "South Yorkshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:42
+msgid "Staffordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:43
+msgid "Suffolk"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:44
+msgid "Surrey"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:45
+msgid "Tyne and Wear"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:46
+msgid "Warwickshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:47
+msgid "West Midlands"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:48
+msgid "West Sussex"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:49
+msgid "West Yorkshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:50
+msgid "Wiltshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:51
+msgid "Worcestershire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:55
+msgid "County Antrim"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:56
+msgid "County Armagh"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:57
+#: contrib/localflavor/uk/uk_regions.py:58
+msgid "County Down"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:59
+msgid "County Londonderry"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:60
+msgid "County Tyrone"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:64
+msgid "Clwyd"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:65
+msgid "Dyfed"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:66
+msgid "Gwent"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:67
+msgid "Gwynedd"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:68
+msgid "Mid Glamorgan"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:69
+msgid "Powys"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:70
+msgid "South Glamorgan"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:71
+msgid "West Glamorgan"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:75
+msgid "Borders"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:76
+msgid "Central Scotland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:77
+msgid "Dumfries and Galloway"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:78
+msgid "Fife"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:79
+msgid "Grampian"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:80
+msgid "Highland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:81
+msgid "Lothian"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:82
+msgid "Orkney Islands"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:83
+msgid "Shetland Islands"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:84
+msgid "Strathclyde"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:85
+msgid "Tayside"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:86
+msgid "Western Isles"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:90
+msgid "England"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:91
+msgid "Northern Ireland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:92
+msgid "Scotland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:93
+msgid "Wales"
+msgstr ""
+
+#: contrib/localflavor/us/forms.py:16
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr ""
+
+#: contrib/localflavor/us/forms.py:54
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr ""
+
+#: contrib/localflavor/za/forms.py:20
+msgid "Enter a valid South African ID number"
+msgstr ""
+
+#: contrib/localflavor/za/forms.py:54
+msgid "Enter a valid South African postal code"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:4
+msgid "Eastern Cape"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:5
+msgid "Free State"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:6
+msgid "Gauteng"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:7
+msgid "KwaZulu-Natal"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:8
+msgid "Limpopo"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:9
+msgid "Mpumalanga"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:10
+msgid "Northern Cape"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:11
+msgid "North West"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:12
+msgid "Western Cape"
+msgstr ""
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "vísun frá"
+
+#: contrib/redirects/models.py:8
+msgid "This should be an absolute path, excluding the domain name. Example: '/events/search/'."
+msgstr "Þetta þarf að vera full slóð án lénsins. Dæmi: '/events/search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "vísa á"
+
+#: contrib/redirects/models.py:10
+msgid "This can be either an absolute path (as above) or a full URL starting with 'http://'."
+msgstr "Þetta getur verið full slóð (eins og hér að ofan) eða veffang með 'http://' fremst."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "vísun"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "vísanir"
+
+#: contrib/sessions/models.py:46
+msgid "session key"
+msgstr "setulykill"
+
+#: contrib/sessions/models.py:47
+msgid "session data"
+msgstr "setugögn"
+
+#: contrib/sessions/models.py:48
+msgid "expire date"
+msgstr "fyrningardagsetning"
+
+#: contrib/sessions/models.py:53
+msgid "session"
+msgstr "seta"
+
+#: contrib/sessions/models.py:54
+msgid "sessions"
+msgstr "setur"
+
+#: contrib/sites/models.py:32
+msgid "domain name"
+msgstr "lén"
+
+#: contrib/sites/models.py:33
+msgid "display name"
+msgstr "birtingarnafn"
+
+#: contrib/sites/models.py:37
+msgid "site"
+msgstr "vefur"
+
+#: contrib/sites/models.py:38
+msgid "sites"
+msgstr "vefir"
+
+#: core/validators.py:72
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Þetta gildi má einungis innihalda stafi, tölur og undirstrik."
+
+#: core/validators.py:76
+msgid "This value must contain only letters, numbers, underscores, dashes or slashes."
+msgstr "Þetta gildi má einungis innihalda stafi, tölur, undirstrik, skástrik og bandstrik."
+
+#: core/validators.py:80
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "Þetta gildi má einungis innihalda stafi, tölur, undirstrik og úrfellingarkommur."
+
+#: core/validators.py:84
+msgid "Uppercase letters are not allowed here."
+msgstr "Hástafir eru ekki leyfðir hér."
+
+#: core/validators.py:88
+msgid "Lowercase letters are not allowed here."
+msgstr "Lágstafir eru ekki leyfðir hér."
+
+#: core/validators.py:95
+msgid "Enter only digits separated by commas."
+msgstr "Skrifaðu einungis tölur aðskildar með kommum."
+
+#: core/validators.py:107
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Sláðu inn gild tölvupóstföng aðskilin með kommum."
+
+#: core/validators.py:111
+msgid "Please enter a valid IP address."
+msgstr "Vinsamlegast sláðu inn gilda IP tölu."
+
+#: core/validators.py:115
+msgid "Empty values are not allowed here."
+msgstr "Tóm gildi eru ekki leyfð hér."
+
+#: core/validators.py:119
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Aðeins tölustafir eru leyfðir hér."
+
+#: core/validators.py:123
+msgid "This value can't be comprised solely of digits."
+msgstr "Þetta gildi verður að vera samsett úr fleiru en tölustöfum."
+
+#: core/validators.py:128
+#: newforms/fields.py:151
+msgid "Enter a whole number."
+msgstr "Sláðu inn heila tölu."
+
+#: core/validators.py:132
+msgid "Only alphabetical characters are allowed here."
+msgstr "Einungis bókstafir eru leyfðir hér."
+
+#: core/validators.py:147
+msgid "Year must be 1900 or later."
+msgstr ""
+
+#: core/validators.py:151
+#, python-format
+msgid "Invalid date: %s"
+msgstr "Ógild dagsetning: %s"
+
+#: core/validators.py:156
+#: db/models/fields/__init__.py:509
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Sláðu inn gilda dagsetningu á YYYY-MM-DD sniði."
+
+#: core/validators.py:161
+msgid "Enter a valid time in HH:MM format."
+msgstr "Sláðu inn gildan tíma á HH:MM sniði."
+
+#: core/validators.py:165
+#: db/models/fields/__init__.py:583
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Sláðu inn gilda dagsetningu/tíma á YYYY-MM-DD HH:MM sniði."
+
+#: core/validators.py:170
+#: newforms/fields.py:402
+msgid "Enter a valid e-mail address."
+msgstr "Sláðu inn gilt tölvupóstfang."
+
+#: core/validators.py:182
+#: core/validators.py:474
+#: newforms/fields.py:432
+#: oldforms/__init__.py:687
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Engin skrá var send. Athugaðu kótunartegund á forminu (encoding type)."
+
+#: core/validators.py:193
+#: newforms/fields.py:456
+msgid "Upload a valid image. The file you uploaded was either not an image or a corrupted image."
+msgstr "Halaðu upp gildri myndskrá. Skráin sem þú halaðir upp var annað hvort gölluð eða ekki mynd."
+
+#: core/validators.py:200
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "Veffangið %s bendir ekki á fullgilda mynd."
+
+#: core/validators.py:204
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "Símanúmer verða að vera á XXX-XXX-XXXX forminu. „%s“ er ógilt."
+
+#: core/validators.py:212
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "Veffangið %s vísar ekki á gilt QuickTime myndskeið."
+
+#: core/validators.py:216
+msgid "A valid URL is required."
+msgstr "Gilds veffangs er krafist."
+
+#: core/validators.py:230
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Gilt HTML er nauðsynlegt. Tilteknar villur:\n"
+"%s"
+
+#: core/validators.py:237
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Illa sniðið XML: %s"
+
+#: core/validators.py:254
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Ógilt veffang: %s"
+
+#: core/validators.py:259
+#: core/validators.py:261
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "Veffangið %s er brotinn hlekkur."
+
+#: core/validators.py:267
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Skrifaðu gilda styttingu á bandarísku fylkisnafni."
+
+#: core/validators.py:281
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Passaðu orðbragðið! Orðið %s er ekki leyft hér."
+msgstr[1] "Passaðu orðbragðið! Orðin %s eru ekki leyfð hér."
+
+#: core/validators.py:288
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Þessi reitur verður að passa við „%s“ reitinn."
+
+#: core/validators.py:307
+msgid "Please enter something for at least one field."
+msgstr "Vinsamlegast fylltu út einn reit að minnsta kosti."
+
+#: core/validators.py:316
+#: core/validators.py:327
+msgid "Please enter both fields or leave them both empty."
+msgstr "Vinsamlegast fylltu út í báða reitina eða skildu þá eftir tóma."
+
+#: core/validators.py:335
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Þessi reitur þarf að vera útfylltur ef %(field)s er %(value)s"
+
+#: core/validators.py:348
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Þessi reitur verður að vera útfylltur ef %(field)s er ekki %(value)s"
+
+#: core/validators.py:367
+msgid "Duplicate values are not allowed."
+msgstr "Endurtekin gildi eru ekki leyfð."
+
+#: core/validators.py:382
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Þetta gildi verður að vera á milli  %(lower)s og %(upper)s."
+
+#: core/validators.py:384
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Þetta gildi verður að vera að minnsta kosti  %s."
+
+#: core/validators.py:386
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Þetta gildi má ekki vera hærra en  %s."
+
+#: core/validators.py:427
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Þessi reitur verður að vera veldi af %s."
+
+#: core/validators.py:437
+msgid "Please enter a valid decimal number."
+msgstr "Vinsamlegast settu inn gilda tugatölu."
+
+#: core/validators.py:444
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural "Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Vinsamlegast skrifaðu gilda tugatölu með hámark %s tölustaf."
+msgstr[1] "Vinsamlegast skrifaðu gilda tugatölu með hámark %s tölustafi."
+
+#: core/validators.py:447
+#, python-format
+msgid "Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural "Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] "Vinsamlegast settu inn gilda tugatölu með hámark %s tölustaf."
+msgstr[1] "Vinsamlegast settu inn gilda tugatölu með hámark %s tölustafi."
+
+#: core/validators.py:450
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural "Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "Vinsamlegast skrifaðu gilda tugatölu með hámark %s tugbrotastaf."
+msgstr[1] "Vinsamlegast skrifaðu gilda tugatölu með hámark %s tugbrotastafi."
+
+#: core/validators.py:458
+msgid "Please enter a valid floating point number."
+msgstr "Vinsamlegast settu inn gilda hlaupakommutölu (floating point number)."
+
+#: core/validators.py:467
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Gakktu úr skugga um að upphöluð skrá sé að minnsta kosti %s bæti að stærð."
+
+#: core/validators.py:468
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Gakktu úr skugga um að upphlaðin skrá sé í mesta lagi %s bæti að stærð."
+
+#: core/validators.py:485
+msgid "The format for this field is wrong."
+msgstr "Sniðið á þessum reit í rangt."
+
+#: core/validators.py:500
+msgid "This field is invalid."
+msgstr "Þessi reitur er ótækur."
+
+#: core/validators.py:536
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Gat engu náð úr %s."
+
+#: core/validators.py:539
+#, python-format
+msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "Veffangið %(url)s skilaði ótæka efnistagshausnum '%(contenttype)s'."
+
+#: core/validators.py:572
+#, python-format
+msgid "Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with \"%(start)s\".)"
+msgstr "Vinsamlegast lokaðu opna %(tag)s taginu sem byrjar á línu %(line)s. (Línan hefst á \"%(start)s\".)"
+
+#: core/validators.py:576
+#, python-format
+msgid "Some text starting on line %(line)s is not allowed in that context. (Line starts with \"%(start)s\".)"
+msgstr "Texti sem hefst á línu %(line)s er ekki leyfður í því samhengi. (Line starts with \"%(start)s\".)"
+
+#: core/validators.py:581
+#, python-format
+msgid "\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%(start)s\".)"
+msgstr "\"%(attr)s\" á línu %(line)s er ótækt eigindi (línan hefst á \"%(start)s\")."
+
+#: core/validators.py:586
+#, python-format
+msgid "\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%(start)s\".)"
+msgstr "\"<%(tag)s>\" á línu %(line)s er ótækt tag. (Línan hefst á \"%(start)s\".)"
+
+#: core/validators.py:590
+#, python-format
+msgid "A tag on line %(line)s is missing one or more required attributes. (Line starts with \"%(start)s\".)"
+msgstr "Tag á línu %(line)s vantar eitt eða fleiri nauðsynleg eigindi. (Línan hefst á \"%(start)s\".)"
+
+#: core/validators.py:595
+#, python-format
+msgid "The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line starts with \"%(start)s\".)"
+msgstr "\"%(attr)s\" eigindið á línu %(line)s hefur ótækt gildi (línan hefst á \"%(start)s\")."
+
+#: db/models/manipulators.py:308
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(object)s með þetta %(type)s er nú þegar til fyrir uppgefið %(field)s."
+
+#: db/models/fields/__init__.py:52
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s með þetta %(fieldname)s er nú þegar til."
+
+#: db/models/fields/__init__.py:161
+#: db/models/fields/__init__.py:318
+#: db/models/fields/__init__.py:735
+#: db/models/fields/__init__.py:746
+#: newforms/fields.py:45
+#: oldforms/__init__.py:374
+msgid "This field is required."
+msgstr "Þennan reit þarf að fylla út."
+
+#: db/models/fields/__init__.py:418
+msgid "This value must be an integer."
+msgstr "Þetta gildi verður að vera heil tala."
+
+#: db/models/fields/__init__.py:454
+msgid "This value must be either True or False."
+msgstr "Þetta gildi verður að vera True eða False."
+
+#: db/models/fields/__init__.py:475
+msgid "This field cannot be null."
+msgstr "Þessi reitur getur ekki haft tómgildi (null)."
+
+#: db/models/fields/__init__.py:644
+msgid "This value must be a decimal number."
+msgstr "Þetta gildi verður að vera tugatala (decimal number)."
+
+#: db/models/fields/__init__.py:755
+msgid "Enter a valid filename."
+msgstr "Sláðu inn gilt tölvupóstfang."
+
+#: db/models/fields/__init__.py:904
+msgid "This value must be either None, True or False."
+msgstr "Þetta gildi verður að vera annaðhvort None, True eða False."
+
+#: db/models/fields/related.py:55
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Vinsamlegast sláðu inn fullgilt %s."
+
+#: db/models/fields/related.py:658
+msgid "Separate multiple IDs with commas."
+msgstr "Aðgreindu mörg kenni með kommum."
+
+#: db/models/fields/related.py:660
+msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "Haltu inni „Control“, eða „Command“ á Mac til þess að velja fleira en eitt."
+
+#: db/models/fields/related.py:707
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural "Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "Vinsamlegast sláðu inn gild %(self)s kenni. Gildið %(value)r er ógilt."
+msgstr[1] "Vinsamlegast sláðu inn gild %(self)s kenni. Gildin %(value)r eru ógild."
+
+#: newforms/fields.py:46
+msgid "Enter a valid value."
+msgstr "Sláðu inn gilt gildi."
+
+#: newforms/fields.py:123
+#, python-format
+msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+msgstr "Gildið má ekki hafa fleiri en %(max)d stafi (gildið hefur %(length)d)."
+
+#: newforms/fields.py:124
+#, python-format
+msgid "Ensure this value has at least %(min)d characters (it has %(length)d)."
+msgstr "Gildið má ekki hafa færri en %(min)d stafi (gildið hefur %(length)d)."
+
+#: newforms/fields.py:152
+#: newforms/fields.py:181
+#: newforms/fields.py:210
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Gakktu úr skuggum um að gildið sé minna en eða jafn og %s."
+
+#: newforms/fields.py:153
+#: newforms/fields.py:182
+#: newforms/fields.py:211
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Gildið þarf að vera jafnt og eða hærra en %s."
+
+#: newforms/fields.py:180
+#: newforms/fields.py:209
+msgid "Enter a number."
+msgstr "Sláðu inn heila tölu."
+
+#: newforms/fields.py:212
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr "Gildið má ekki hafa fleiri en %s tölur."
+
+#: newforms/fields.py:213
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr "Gildið má ekki hafa meira en %s tugatölustafi (decimal places)."
+
+#: newforms/fields.py:214
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr "Gildið má ekki hafa fleiri en %s tölur fyrir tugabrotskil."
+
+#: newforms/fields.py:262
+#: newforms/fields.py:719
+msgid "Enter a valid date."
+msgstr "Sláðu inn gilda dagsetningu."
+
+#: newforms/fields.py:295
+#: newforms/fields.py:720
+msgid "Enter a valid time."
+msgstr "Sláðu inn gilda tímasetningu."
+
+#: newforms/fields.py:334
+msgid "Enter a valid date/time."
+msgstr "Sláðu inn gilda dagsetningu ásamt tíma."
+
+#: newforms/fields.py:433
+msgid "No file was submitted."
+msgstr "Engin skrá var send."
+
+#: newforms/fields.py:434
+#: oldforms/__init__.py:689
+msgid "The submitted file is empty."
+msgstr "Innsend skrá er tóm."
+
+#: newforms/fields.py:492
+msgid "Enter a valid URL."
+msgstr "Sláðu inn gilt veffang (URL)."
+
+#: newforms/fields.py:493
+msgid "This URL appears to be a broken link."
+msgstr "Síðan á þessari slóð lítur út fyrir að skila villu."
+
+#: newforms/fields.py:555
+#: newforms/models.py:317
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Veldu gildan valmöguleika. Valið virðist ekki vera eitt af gildum valmöguleikum."
+
+#: newforms/fields.py:594
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "Veldu gildan valmöguleika. %(value)s er ekki eitt af gildum valmöguleikum."
+
+#: newforms/fields.py:595
+#: newforms/fields.py:657
+#: newforms/models.py:377
+msgid "Enter a list of values."
+msgstr "Sláðu inn lista af gildum."
+
+#: newforms/fields.py:748
+msgid "Enter a valid IPv4 address."
+msgstr "Sláðu inn gilda IPv4 tölu."
+
+#: newforms/models.py:378
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Veldu gildan valmöguleika. %s er ekki einn af gildum valmöguleikum."
+
+#: oldforms/__init__.py:409
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Gangtu úr skugga um að textinn þin sé styttri en %s tákn."
+msgstr[1] "Gangtu úr skugga um að textinn þin sé styttri en %s tákn."
+
+#: oldforms/__init__.py:414
+msgid "Line breaks are not allowed here."
+msgstr "Línuskil eru ekki leyfð hér."
+
+#: oldforms/__init__.py:512
+#: oldforms/__init__.py:586
+#: oldforms/__init__.py:625
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Veldu gildan valmöguleika; „%(data)s“ er ekki í %(choices)s."
+
+#: oldforms/__init__.py:745
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Sláðu inn heila tölu á bilinu -32.768 til 32.767."
+
+#: oldforms/__init__.py:755
+msgid "Enter a positive number."
+msgstr "Sláðu inn jákvæða tölu."
+
+#: oldforms/__init__.py:765
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Sláðu inn heila tölu á bilinu 0 til 32.767."
+
+#: template/defaultfilters.py:691
+msgid "yes,no,maybe"
+msgstr "já,nei,kannski"
+
+#: template/defaultfilters.py:722
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d bæti"
+msgstr[1] "%(size)d bæti"
+
+#: template/defaultfilters.py:724
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f KB"
+
+#: template/defaultfilters.py:726
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: template/defaultfilters.py:727
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#: utils/dateformat.py:41
+msgid "p.m."
+msgstr "eftirmiðdegi"
+
+#: utils/dateformat.py:42
+msgid "a.m."
+msgstr "morgun"
+
+#: utils/dateformat.py:47
+msgid "PM"
+msgstr "Eftirmiðdegi"
+
+#: utils/dateformat.py:48
+msgid "AM"
+msgstr "Morgun"
+
+#: utils/dateformat.py:97
+msgid "midnight"
+msgstr "miðnætti"
+
+#: utils/dateformat.py:99
+msgid "noon"
+msgstr "hádegi"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "mánudagur"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "þriðjudagur"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "miðvikudagur"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "fimmtudagur"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "föstudagur"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "laugardagur"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "sunnudagur"
+
+#: utils/dates.py:10
+msgid "Mon"
+msgstr "Mán"
+
+#: utils/dates.py:10
+msgid "Tue"
+msgstr "Þri"
+
+#: utils/dates.py:10
+msgid "Wed"
+msgstr "Mið"
+
+#: utils/dates.py:10
+msgid "Thu"
+msgstr "Fim"
+
+#: utils/dates.py:10
+msgid "Fri"
+msgstr "Fös"
+
+#: utils/dates.py:11
+msgid "Sat"
+msgstr "Lau"
+
+#: utils/dates.py:11
+msgid "Sun"
+msgstr "Sun"
+
+#: utils/dates.py:18
+msgid "January"
+msgstr "janúar"
+
+#: utils/dates.py:18
+msgid "February"
+msgstr "febrúar"
+
+#: utils/dates.py:18
+#: utils/dates.py:31
+msgid "March"
+msgstr "mars"
+
+#: utils/dates.py:18
+#: utils/dates.py:31
+msgid "April"
+msgstr "apríl"
+
+#: utils/dates.py:18
+#: utils/dates.py:31
+msgid "May"
+msgstr "maí"
+
+#: utils/dates.py:18
+#: utils/dates.py:31
+msgid "June"
+msgstr "júní"
+
+#: utils/dates.py:19
+#: utils/dates.py:31
+msgid "July"
+msgstr "júlí"
+
+#: utils/dates.py:19
+msgid "August"
+msgstr "ágúst"
+
+#: utils/dates.py:19
+msgid "September"
+msgstr "september"
+
+#: utils/dates.py:19
+msgid "October"
+msgstr "október"
+
+#: utils/dates.py:19
+msgid "November"
+msgstr "nóvember"
+
+#: utils/dates.py:20
+msgid "December"
+msgstr "desember"
+
+#: utils/dates.py:23
+msgid "jan"
+msgstr "Jan"
+
+#: utils/dates.py:23
+msgid "feb"
+msgstr "feb"
+
+#: utils/dates.py:23
+msgid "mar"
+msgstr "mar"
+
+#: utils/dates.py:23
+msgid "apr"
+msgstr "apr"
+
+#: utils/dates.py:23
+msgid "may"
+msgstr "maí"
+
+#: utils/dates.py:23
+msgid "jun"
+msgstr "jún"
+
+#: utils/dates.py:24
+msgid "jul"
+msgstr "júl"
+
+#: utils/dates.py:24
+msgid "aug"
+msgstr "ágú"
+
+#: utils/dates.py:24
+msgid "sep"
+msgstr "sep"
+
+#: utils/dates.py:24
+msgid "oct"
+msgstr "okt"
+
+#: utils/dates.py:24
+msgid "nov"
+msgstr "nóv"
+
+#: utils/dates.py:24
+msgid "dec"
+msgstr "des"
+
+#: utils/dates.py:31
+msgid "Jan."
+msgstr "jan."
+
+#: utils/dates.py:31
+msgid "Feb."
+msgstr "feb."
+
+#: utils/dates.py:32
+msgid "Aug."
+msgstr "ág."
+
+#: utils/dates.py:32
+msgid "Sept."
+msgstr "sept."
+
+#: utils/dates.py:32
+msgid "Oct."
+msgstr "okt."
+
+#: utils/dates.py:32
+msgid "Nov."
+msgstr "nóv."
+
+#: utils/dates.py:32
+msgid "Dec."
+msgstr "des."
+
+#: utils/text.py:127
+msgid "or"
+msgstr "eða"
+
+#: utils/timesince.py:21
+msgid "year"
+msgid_plural "years"
+msgstr[0] "ár"
+msgstr[1] "ár"
+
+#: utils/timesince.py:22
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mánuður"
+msgstr[1] "mánuðir"
+
+#: utils/timesince.py:23
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "vika"
+msgstr[1] "vikur"
+
+#: utils/timesince.py:24
+msgid "day"
+msgid_plural "days"
+msgstr[0] "dagur"
+msgstr[1] "dagar"
+
+#: utils/timesince.py:25
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "klukkutími"
+msgstr[1] "klukkutímar"
+
+#: utils/timesince.py:26
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "mínúta"
+msgstr[1] "mínútur"
+
+#: utils/timesince.py:46
+msgid "minutes"
+msgstr "mínútur"
+
+#: utils/timesince.py:51
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr "%(number)d %(type)s"
+
+#: utils/timesince.py:57
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ", %(number)d %(type)s"
+
+#: utils/translation/trans_real.py:399
+msgid "DATE_FORMAT"
+msgstr "j. N Y"
+
+#: utils/translation/trans_real.py:400
+msgid "DATETIME_FORMAT"
+msgstr "j. N Y, H:i"
+
+#: utils/translation/trans_real.py:401
+msgid "TIME_FORMAT"
+msgstr "H:i"
+
+#: utils/translation/trans_real.py:417
+msgid "YEAR_MONTH_FORMAT"
+msgstr "j. N Y"
+
+#: utils/translation/trans_real.py:418
+msgid "MONTH_DAY_FORMAT"
+msgstr "j. N Y"
+
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "%(verbose_name)s var fært inn."
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "%(verbose_name)s var uppfært."
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "%(verbose_name)s var eytt."
+
+#~ msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+#~ msgstr "<a href=\"/password_reset/\">Gleymdir þú lykilorðinu</a> þínu?"
+#~ msgid "Use '[algo]$[salt]$[hexdigest]'"
+#~ msgstr "Notaðu '[algo]$[salt]$[hexdigest]'"
+#~ msgid "Comment"
+#~ msgstr "Athugasemd"
+#~ msgid "Comments"
+#~ msgstr "Athugasemdir"
+#~ msgid ""
+#~ "This comment was posted by a user who has posted fewer than %(count)s "
+#~ "comment:\n"
+#~ "\n"
+#~ "%(text)sThis comment was posted by a user who has posted fewer than %"
+#~ "(count)s comments:\n"
+#~ "\n"
+#~ "%(text)s"
+#~ msgstr ""
+#~ "Þessi athugasemd var send inn af notanda sem hefur skrifað færri en %"
+#~ "(count)s athugasemd:\n"
+#~ "\n"
+#~ "%(text)sÞessi athugasemd var send inn af notanda sem hefur skrifað færri "
+#~ "en %(count)s athugasemdir:\n"
+#~ "\n"
+#~ "%(text)s"
+#~ msgid "String (up to 50)"
+#~ msgstr "Strengur (allt að 50)"
+#~ msgid "label"
+#~ msgstr "merki"
+#~ msgid "package"
+#~ msgstr "pakki"
+#~ msgid "packages"
+#~ msgstr "pakkar"
+
+#, fuzzy
+#~ msgid "count"
+#~ msgstr "innihald"
+
diff --git a/webapp/django/conf/locale/is/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/is/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..1a11690
--- /dev/null
+++ b/webapp/django/conf/locale/is/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/is/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/is/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..c68e77d
--- /dev/null
+++ b/webapp/django/conf/locale/is/LC_MESSAGES/djangojs.po
@@ -0,0 +1,109 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-12-09 11:51+0100\n"
+"PO-Revision-Date: 2006-05-13 11:48-0000\n"
+"Last-Translator: Dagur Páll Ammendrup <dagurp@gmail.com>\n"
+"Language-Team: Icelandic <dagurp@gmail.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Icelandic\n"
+"X-Poedit-Country: ICELAND\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "Fáanleg %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Velja öll"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Bæta við"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Fjarlægja"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Valin %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Veldu úr valmöguleikunum og smelltu"
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Hreinsa öll"
+
+#: contrib/admin/media/js/dateparse.js:26
+#: contrib/admin/media/js/calendar.js:24
+msgid "January February March April May June July August September October November December"
+msgstr "janúar febrúar mars apríl maí júní júlí ágúst september október nóvember desember"
+
+#: contrib/admin/media/js/dateparse.js:27
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "sunnudagur mánudagur þriðjudagur miðvikudagur fimmtudagur föstudagur laugardagur"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "S M Þ M F F L"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "Núna"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "Klukka"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "Veldu tíma"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "Miðnætti"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "6 f.h."
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "Hádegi"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "Hætta við"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "Í dag"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "Dagatal"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "Í gær"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "Á morgun"
+
diff --git a/webapp/django/conf/locale/it/LC_MESSAGES/django.mo b/webapp/django/conf/locale/it/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..68f9f7b
--- /dev/null
+++ b/webapp/django/conf/locale/it/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/it/LC_MESSAGES/django.po b/webapp/django/conf/locale/it/LC_MESSAGES/django.po
new file mode 100644
index 0000000..c21f860
--- /dev/null
+++ b/webapp/django/conf/locale/it/LC_MESSAGES/django.po
@@ -0,0 +1,4523 @@
+# translation of django.po to Italiano
+# Italian translation of Django.
+# Copyright (C) 2006 the Lawrence Journal-World
+# This file is distributed under the same license as the Django package.
+msgid ""
+msgstr ""
+"Project-Id-Version: Django vSVN\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-08-10 16:19+0200\n"
+"PO-Revision-Date: 2008-08-14 18:37+0200\n"
+"Last-Translator: Nicola Larosa <nico@tekNico.net>\n"
+"Language-Team: Italiano\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms:  nplurals=2; plural=(n != 1);\n"
+
+#: conf/global_settings.py:44
+msgid "Arabic"
+msgstr "arabo"
+
+#: conf/global_settings.py:45
+msgid "Bengali"
+msgstr "bengali"
+
+#: conf/global_settings.py:46
+msgid "Bulgarian"
+msgstr "bulgaro"
+
+#: conf/global_settings.py:47
+msgid "Catalan"
+msgstr "catalano"
+
+#: conf/global_settings.py:48
+msgid "Czech"
+msgstr "ceco"
+
+#: conf/global_settings.py:49
+msgid "Welsh"
+msgstr "gallese"
+
+#: conf/global_settings.py:50
+msgid "Danish"
+msgstr "danese"
+
+#: conf/global_settings.py:51
+msgid "German"
+msgstr "tedesco"
+
+#: conf/global_settings.py:52
+msgid "Greek"
+msgstr "greco"
+
+#: conf/global_settings.py:53
+msgid "English"
+msgstr "inglese"
+
+#: conf/global_settings.py:54
+msgid "Spanish"
+msgstr "spagnolo"
+
+#: conf/global_settings.py:55
+msgid "Estonian"
+msgstr "estone"
+
+#: conf/global_settings.py:56
+msgid "Argentinean Spanish"
+msgstr "spagnolo argentino"
+
+#: conf/global_settings.py:57
+msgid "Basque"
+msgstr "basco"
+
+#: conf/global_settings.py:58
+msgid "Persian"
+msgstr "persiano"
+
+#: conf/global_settings.py:59
+msgid "Finnish"
+msgstr "finlandese"
+
+#: conf/global_settings.py:60
+msgid "French"
+msgstr "francese"
+
+#: conf/global_settings.py:61
+msgid "Irish"
+msgstr "irlandese"
+
+#: conf/global_settings.py:62
+msgid "Galician"
+msgstr "galiziano"
+
+#: conf/global_settings.py:63
+msgid "Hungarian"
+msgstr "ungherese"
+
+#: conf/global_settings.py:64
+msgid "Hebrew"
+msgstr "ebraico"
+
+#: conf/global_settings.py:65
+msgid "Croatian"
+msgstr "croato"
+
+#: conf/global_settings.py:66
+msgid "Icelandic"
+msgstr "islandese"
+
+#: conf/global_settings.py:67
+msgid "Italian"
+msgstr "italiano"
+
+#: conf/global_settings.py:68
+msgid "Japanese"
+msgstr "giapponese"
+
+#: conf/global_settings.py:69
+msgid "Georgian"
+msgstr "georgiano"
+
+#: conf/global_settings.py:70
+msgid "Korean"
+msgstr "coreano"
+
+#: conf/global_settings.py:71
+msgid "Khmer"
+msgstr "khmer"
+
+#: conf/global_settings.py:72
+msgid "Kannada"
+msgstr "kannada"
+
+#: conf/global_settings.py:73
+msgid "Latvian"
+msgstr "lettone"
+
+#: conf/global_settings.py:74
+msgid "Lithuanian"
+msgstr "lituano"
+
+#: conf/global_settings.py:75
+msgid "Macedonian"
+msgstr "macedone"
+
+#: conf/global_settings.py:76
+msgid "Dutch"
+msgstr "olandese"
+
+#: conf/global_settings.py:77
+msgid "Norwegian"
+msgstr "norvegese"
+
+#: conf/global_settings.py:78
+msgid "Polish"
+msgstr "polacco"
+
+#: conf/global_settings.py:79
+msgid "Portugese"
+msgstr "portoghese"
+
+#: conf/global_settings.py:80
+msgid "Brazilian Portuguese"
+msgstr "brasiliano portoghese"
+
+#: conf/global_settings.py:81
+msgid "Romanian"
+msgstr "rumeno"
+
+#: conf/global_settings.py:82
+msgid "Russian"
+msgstr "russo"
+
+#: conf/global_settings.py:83
+msgid "Slovak"
+msgstr "slovacco"
+
+#: conf/global_settings.py:84
+msgid "Slovenian"
+msgstr "sloveno"
+
+#: conf/global_settings.py:85
+msgid "Serbian"
+msgstr "serbo"
+
+#: conf/global_settings.py:86
+msgid "Swedish"
+msgstr "svedese"
+
+#: conf/global_settings.py:87
+msgid "Tamil"
+msgstr "tamil"
+
+#: conf/global_settings.py:88
+msgid "Telugu"
+msgstr "telugu"
+
+#: conf/global_settings.py:89
+msgid "Turkish"
+msgstr "turco"
+
+#: conf/global_settings.py:90
+msgid "Ukrainian"
+msgstr "ucraino"
+
+#: conf/global_settings.py:91
+msgid "Simplified Chinese"
+msgstr "cinese semplificato"
+
+#: conf/global_settings.py:92
+msgid "Traditional Chinese"
+msgstr "cinese tradizionale"
+
+#: contrib/admin/filterspecs.py:44
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Di %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:74 contrib/admin/filterspecs.py:92
+#: contrib/admin/filterspecs.py:147 contrib/admin/filterspecs.py:173
+msgid "All"
+msgstr "Tutti"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Any date"
+msgstr "Qualsiasi data"
+
+#: contrib/admin/filterspecs.py:114
+msgid "Today"
+msgstr "Oggi"
+
+#: contrib/admin/filterspecs.py:117
+msgid "Past 7 days"
+msgstr "Ultimi 7 giorni"
+
+#: contrib/admin/filterspecs.py:119
+msgid "This month"
+msgstr "Questo mese"
+
+#: contrib/admin/filterspecs.py:121
+msgid "This year"
+msgstr "Quest'anno"
+
+#: contrib/admin/filterspecs.py:147 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "Yes"
+msgstr "Sì"
+
+#: contrib/admin/filterspecs.py:147 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "No"
+msgstr "No"
+
+#: contrib/admin/filterspecs.py:154 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "Unknown"
+msgstr "Sconosciuto"
+
+#: contrib/admin/models.py:19
+msgid "action time"
+msgstr "momento dell'azione"
+
+#: contrib/admin/models.py:22
+msgid "object id"
+msgstr "id dell'oggetto"
+
+#: contrib/admin/models.py:23
+msgid "object repr"
+msgstr "rappresentazione dell'oggetto"
+
+#: contrib/admin/models.py:24
+msgid "action flag"
+msgstr "flag di azione"
+
+#: contrib/admin/models.py:25
+msgid "change message"
+msgstr "messaggio di modifica"
+
+#: contrib/admin/models.py:28
+msgid "log entry"
+msgstr "voce di log"
+
+#: contrib/admin/models.py:29
+msgid "log entries"
+msgstr "voci di log"
+
+#: contrib/admin/options.py:143 contrib/admin/options.py:202
+msgid "None"
+msgstr "Nessuno"
+
+#: contrib/admin/options.py:407
+#, python-format
+msgid "Changed %s."
+msgstr "%s modificato."
+
+#: contrib/admin/options.py:407 contrib/admin/options.py:417
+#: core/validators.py:279 db/models/manipulators.py:305
+msgid "and"
+msgstr "e"
+
+#: contrib/admin/options.py:412
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Aggiunti %(name)s \"%(object)s\"."
+
+#: contrib/admin/options.py:416
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Cambiati %(list)s per %(name)s \"%(object)s\"."
+
+#: contrib/admin/options.py:421
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Cancellati %(name)s \"%(object)s\"."
+
+#: contrib/admin/options.py:425
+msgid "No fields changed."
+msgstr "Nessun campo modificato."
+
+#: contrib/admin/options.py:480 contrib/auth/admin.py:50
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Il %(name)s \"%(obj)s\" è stato aggiunto correttamente."
+
+#: contrib/admin/options.py:484 contrib/admin/options.py:517
+#: contrib/auth/admin.py:55
+msgid "You may edit it again below."
+msgstr "È possibile modificarlo nuovamente qui sotto."
+
+#: contrib/admin/options.py:494 contrib/admin/options.py:527
+#, python-format
+msgid "You may add another %s below."
+msgstr "Puoi aggiungere un altro %s qui sotto."
+
+#: contrib/admin/options.py:515
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Il %(name)s \"%(obj)s\" è stato modificato correttamente."
+
+#: contrib/admin/options.py:523
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"Il %(name)s \"%(obj)s\" è stato aggiunto correttamente. È possibile "
+"modificarlo nuovamente qui sotto."
+
+#: contrib/admin/options.py:593
+#, python-format
+msgid "Add %s"
+msgstr "Aggiungi %s"
+
+#: contrib/admin/options.py:673
+#, python-format
+msgid "Change %s"
+msgstr "Modifica %s"
+
+#: contrib/admin/options.py:704
+msgid "Database error"
+msgstr "Errore nel database"
+
+#: contrib/admin/options.py:753
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Lo %(name)s \"%(obj)s\" è stato cancellato correttamente."
+
+#: contrib/admin/options.py:760
+msgid "Are you sure?"
+msgstr "Sei sicuro?"
+
+#: contrib/admin/options.py:787
+#, python-format
+msgid "Change history: %s"
+msgstr "Tracciato delle modifiche: %s"
+
+#: contrib/admin/sites.py:18 contrib/admin/views/decorators.py:16
+#: contrib/auth/forms.py:72 contrib/comments/views/comments.py:56
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr "Inserisci nome utente e password corretti. In entrambi i campi le maiuscole sono significative."
+
+#: contrib/admin/sites.py:238 contrib/admin/views/decorators.py:68
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Devi effettuare di nuovo l'accesso, perché la sessione è scaduta. I dati inseriti sono "
+"stati comunque salvati."
+
+#: contrib/admin/sites.py:245 contrib/admin/views/decorators.py:75
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Il browser non sembra configurato per accettare i cookie. Una volta "
+"abilitati, ricarica la pagina e riprova."
+
+#: contrib/admin/sites.py:259 contrib/admin/sites.py:265
+#: contrib/admin/views/decorators.py:92
+msgid "Usernames cannot contain the '@' character."
+msgstr "I nomi utente non possono contenere il carattere '@'."
+
+#: contrib/admin/sites.py:262 contrib/admin/views/decorators.py:88
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "Il nome utente non è costituito dall'indirizzo e-mail. Prova con '%s'."
+
+#: contrib/admin/sites.py:330
+msgid "Site administration"
+msgstr "Amministrazione sito"
+
+#: contrib/admin/sites.py:352 contrib/admin/templates/admin/login.html:27
+#: contrib/admin/templates/registration/password_reset_complete.html:14
+#: contrib/admin/views/decorators.py:30
+msgid "Log in"
+msgstr "Accedi"
+
+#: contrib/admin/util.py:126
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Uno o più %(fieldname)s in %(name)s: %(obj)s"
+
+#: contrib/admin/util.py:131
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Uno o più %(fieldname)s in %(name)s:"
+
+#: contrib/admin/widgets.py:65
+msgid "Date:"
+msgstr "Data:"
+
+#: contrib/admin/widgets.py:65
+msgid "Time:"
+msgstr "Ora:"
+
+#: contrib/admin/widgets.py:89
+msgid "Currently:"
+msgstr "Attualmente:"
+
+#: contrib/admin/widgets.py:89
+msgid "Change:"
+msgstr "Modifica:"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Pagina non trovata"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Spiacenti, ma la pagina richiesta non è stata trovata."
+
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/change_form.html:17
+#: contrib/admin/templates/admin/change_list.html:8
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/auth/user/change_password.html:10
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_reset_complete.html:4
+#: contrib/admin/templates/registration/password_reset_confirm.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Pagina iniziale"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Errore del server"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Errore del server (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Errore del server <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Si è verificato un errore. È stato riportato agli amministratori del sito "
+"via e-mail e verrà corretto a breve. Grazie per la tua pazienza."
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "Benvenuto,"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Documentazione"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:13
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+msgid "Change password"
+msgstr "Cambia la password"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/comments/templates/comments/form.html:6
+msgid "Log out"
+msgstr "Esci"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Amministrazione sito Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Amministrazione Django"
+
+#: contrib/admin/templates/admin/change_form.html:19
+#: contrib/admin/templates/admin/index.html:29
+msgid "Add"
+msgstr "Aggiungi"
+
+#: contrib/admin/templates/admin/change_form.html:26
+#: contrib/admin/templates/admin/object_history.html:5
+msgid "History"
+msgstr "Storia"
+
+#: contrib/admin/templates/admin/change_form.html:27
+msgid "View on site"
+msgstr "Vedi sul sito"
+
+#: contrib/admin/templates/admin/change_form.html:37
+#: contrib/admin/templates/admin/auth/user/change_password.html:22
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Correggi l'errore qui sotto."
+msgstr[1] "Correggi gli errori qui sotto."
+
+#: contrib/admin/templates/admin/change_list.html:16
+#, python-format
+msgid "Add %(name)s"
+msgstr "Aggiungi %(name)s"
+
+#: contrib/admin/templates/admin/change_list.html:26
+msgid "Filter"
+msgstr "Filtro"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+#: contrib/admin/templates/admin/edit_inline/tabular.html:15
+msgid "Delete"
+msgstr "Cancella"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:15
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"La cancellazione di %(object_name)s '%(escaped_object)s' causerebbe la "
+"cancellazione di oggetti collegati, ma questo account non ha i permessi per "
+"cancellare gli oggetti dei seguenti tipi:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:22
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Sei sicuro di voler cancellare gli %(object_name)s \"%(escaped_object)s\"? "
+"Tutti i seguenti oggetti collegati saranno cancellati:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:27
+msgid "Yes, I'm sure"
+msgstr "Sì, sono sicuro"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Per %(filter_title)s "
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Modelli disponibili nell'applicazione %(name)s."
+
+#: contrib/admin/templates/admin/index.html:19
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:35
+msgid "Change"
+msgstr "Modifica"
+
+#: contrib/admin/templates/admin/index.html:45
+msgid "You don't have permission to edit anything."
+msgstr "Non hai i privilegi per modificare alcunché."
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "Recent Actions"
+msgstr "Azioni Recenti"
+
+#: contrib/admin/templates/admin/index.html:54
+msgid "My Actions"
+msgstr "Azioni Proprie"
+
+#: contrib/admin/templates/admin/index.html:58
+msgid "None available"
+msgstr "Nessuno disponibile"
+
+#: contrib/admin/templates/admin/invalid_setup.html:7
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Ci sono problemi nell'installazione del database. Assicurarsi che le tabelle "
+"appropriate del database siano state create, e che il database sia leggibile "
+"dall'utente appropriato."
+
+#: contrib/admin/templates/admin/login.html:19
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+msgid "Username:"
+msgstr "Nome utente:"
+
+#: contrib/admin/templates/admin/login.html:22
+#: contrib/comments/templates/comments/form.html:8
+msgid "Password:"
+msgstr "Password:"
+
+#: contrib/admin/templates/admin/object_history.html:16
+msgid "Date/time"
+msgstr "Data/ora"
+
+#: contrib/admin/templates/admin/object_history.html:17
+msgid "User"
+msgstr "Utente"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Action"
+msgstr "Azione"
+
+#: contrib/admin/templates/admin/object_history.html:24
+msgid "DATE_WITH_TIME_FULL"
+msgstr "j F Y, H:i"
+
+#: contrib/admin/templates/admin/object_history.html:32
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Questo oggetto non ha cambiamenti registrati. Probabilmente non è stato "
+"creato con questo sito di amministrazione."
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Mostra tutto"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Vai"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 risultato"
+msgstr[1] "%(counter)s risultati"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s totali"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Salva come nuovo"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Salva e aggiungi un altro"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Salva e continua le modifiche"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Salva"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr "Inserisci innanzitutto nome utente e password. Potrai poi modificare le altre impostazioni dell'utente."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:13
+#: contrib/auth/forms.py:14 contrib/auth/forms.py:51
+msgid "Username"
+msgstr "Nome utente"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:20
+#: contrib/admin/templates/admin/auth/user/change_password.html:33
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:52 contrib/auth/forms.py:176
+msgid "Password"
+msgstr "Password"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:26
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+#: contrib/auth/forms.py:177
+msgid "Password (again)"
+msgstr "Password (di nuovo)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:27
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+msgid "Enter the same password as above, for verification."
+msgstr "Inserisci la stessa password inserita sopra, come verifica."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:26
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Inserisci una nuova password per l'utente <strong>%(username)s</strong>."
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Grazie per aver speso il tuo tempo prezioso su questo sito oggi."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Accedi di nuovo"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Cambio password"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Cambio di password avvenuto correttamente"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "La password è stata cambiata."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Inserisci la password attuale, per ragioni di sicurezza, e poi la nuova "
+"password due volte, per verificare di averla scritta correttamente."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Password attuale:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+#: contrib/admin/templates/registration/password_reset_confirm.html:18
+msgid "New password:"
+msgstr "Nuova password:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+#: contrib/admin/templates/registration/password_reset_confirm.html:20
+msgid "Confirm password:"
+msgstr "Conferma la password:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+#: contrib/admin/templates/registration/password_reset_confirm.html:21
+msgid "Change my password"
+msgstr "Modifica la mia password"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:4
+#: contrib/admin/templates/registration/password_reset_confirm.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+msgid "Password reset"
+msgstr "Reimposta la password"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:6
+#: contrib/admin/templates/registration/password_reset_complete.html:10
+msgid "Password reset complete"
+msgstr "Password reimpostata"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:12
+msgid "Your password has been set.  You may go ahead and log in now."
+msgstr "La tua password è stata impostata. Ora puoi effettuare l'accesso."
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:4
+msgid "Password reset confirmation"
+msgstr "Conferma reimpostazione password"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:12
+msgid "Enter new password"
+msgstr "Inserisci la nuova password"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:14
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Inserisci la nuova password due volte, per verificare di averla scritta "
+"correttamente."
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:26
+msgid "Password reset unsuccessful"
+msgstr "Password NON reimpostata"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:28
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used.  Please request a new password reset."
+msgstr ""
+"Il link per la reimpostazione della password non era valido, forse perché "
+"era già stato usato. Richiedi una nuova reimpostazione della password."
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Password reimpostata correttamente"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed you instructions for setting your password to the e-mail "
+"address you submitted. You should be receiving it shortly."
+msgstr ""
+"Abbiamo inviato le istruzioni per impostare la tua password all'indirizzo e-"
+"mail inserito. Arriveranno a breve."
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Hai ricevuto questa e-mail perché hai chiesto di reimpostare la password"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "per il tuo account utente su %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+msgid "Please go to the following page and choose a new password:"
+msgstr "Vai alla pagina seguente e scegli una nuova password:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:9
+msgid "Your username, in case you've forgotten:"
+msgstr "Il tuo nome utente, in caso l'abbia dimenticato:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Thanks for using our site!"
+msgstr "Grazie per aver usato il nostro sito!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Il team di %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll e-mail "
+"instructions for setting a new one."
+msgstr ""
+"Dimenticata la password? Inserisci il tuo indirizzo email qui sotto, e ti "
+"invieremo per email le istruzioni per impostarne una nuova."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Indirizzo e-mail:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Reimposta la mia password"
+
+#: contrib/admin/templatetags/admin_list.py:257
+msgid "All dates"
+msgstr "Tutte le date"
+
+#: contrib/admin/views/main.py:65
+#, python-format
+msgid "Select %s"
+msgstr "Scegli %s"
+
+#: contrib/admin/views/main.py:65
+#, python-format
+msgid "Select %s to change"
+msgstr "Scegli %s da modificare"
+
+#: contrib/admindocs/views.py:53 contrib/admindocs/views.py:55
+#: contrib/admindocs/views.py:57
+msgid "tag:"
+msgstr "tag:"
+
+#: contrib/admindocs/views.py:87 contrib/admindocs/views.py:89
+#: contrib/admindocs/views.py:91
+msgid "filter:"
+msgstr "filtro:"
+
+#: contrib/admindocs/views.py:153 contrib/admindocs/views.py:155
+#: contrib/admindocs/views.py:157
+msgid "view:"
+msgstr "view:"
+
+#: contrib/admindocs/views.py:187
+#, python-format
+msgid "App %r not found"
+msgstr "Appl. %r non trovata"
+
+#: contrib/admindocs/views.py:194
+#, python-format
+msgid "Model %(model_name)r not found in app %(app_label)r"
+msgstr "Modello %(model_name)r non trovato nell'appl. %(app_label)r"
+
+#: contrib/admindocs/views.py:206
+#, python-format
+msgid "the related `%(app_label)s.%(data_type)s` object"
+msgstr "l'oggetto `%(app_label)s.%(data_type)s` collegato"
+
+#: contrib/admindocs/views.py:206 contrib/admindocs/views.py:228
+#: contrib/admindocs/views.py:242 contrib/admindocs/views.py:247
+msgid "model:"
+msgstr "modello:"
+
+#: contrib/admindocs/views.py:237
+#, python-format
+msgid "related `%(app_label)s.%(object_name)s` objects"
+msgstr "oggetti `%(app_label)s.%(object_name)s` collegati"
+
+#: contrib/admindocs/views.py:242
+#, python-format
+msgid "all %s"
+msgstr "tutti %s"
+
+#: contrib/admindocs/views.py:247
+#, python-format
+msgid "number of %s"
+msgstr "numero di %s"
+
+#: contrib/admindocs/views.py:253
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Campi sugli oggetti %s"
+
+#: contrib/admindocs/views.py:317 contrib/admindocs/views.py:328
+#: contrib/admindocs/views.py:330 contrib/admindocs/views.py:336
+#: contrib/admindocs/views.py:337 contrib/admindocs/views.py:339
+msgid "Integer"
+msgstr "Intero"
+
+#: contrib/admindocs/views.py:318
+msgid "Boolean (Either True or False)"
+msgstr "Booleano (True o False)"
+
+#: contrib/admindocs/views.py:319 contrib/admindocs/views.py:338
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Stringa (fino a %(max_length)s)"
+
+#: contrib/admindocs/views.py:320
+msgid "Comma-separated integers"
+msgstr "Interi separati da virgola"
+
+#: contrib/admindocs/views.py:321
+msgid "Date (without time)"
+msgstr "Data (senza ora)"
+
+#: contrib/admindocs/views.py:322
+msgid "Date (with time)"
+msgstr "Data (con ora)"
+
+#: contrib/admindocs/views.py:323
+msgid "Decimal number"
+msgstr "Numero decimale"
+
+#: contrib/admindocs/views.py:324
+msgid "E-mail address"
+msgstr "Indirizzo e-mail"
+
+#: contrib/admindocs/views.py:325 contrib/admindocs/views.py:326
+#: contrib/admindocs/views.py:329
+msgid "File path"
+msgstr "Percorso di file"
+
+#: contrib/admindocs/views.py:327
+msgid "Floating point number"
+msgstr "Numero decimale"
+
+#: contrib/admindocs/views.py:331 contrib/comments/models.py:89
+msgid "IP address"
+msgstr "indirizzo IP"
+
+#: contrib/admindocs/views.py:333
+msgid "Boolean (Either True, False or None)"
+msgstr "Booleano (True, False o None)"
+
+#: contrib/admindocs/views.py:334
+msgid "Relation to parent model"
+msgstr "Collegamento a modello padre"
+
+#: contrib/admindocs/views.py:335
+msgid "Phone number"
+msgstr "Numero di telefono"
+
+#: contrib/admindocs/views.py:340
+msgid "Text"
+msgstr "Testo"
+
+#: contrib/admindocs/views.py:341
+msgid "Time"
+msgstr "Ora"
+
+#: contrib/admindocs/views.py:342 contrib/flatpages/models.py:8
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admindocs/views.py:343
+msgid "U.S. state (two uppercase letters)"
+msgstr "Stato USA (due lettere maiuscole)"
+
+#: contrib/admindocs/views.py:344
+msgid "XML text"
+msgstr "Testo XML"
+
+#: contrib/admindocs/views.py:370
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s non sembra essere un oggetto urlpattern"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Bookmarklet"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:4
+msgid "Documentation bookmarklets"
+msgstr "Bookmarklet alla documentazione"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:8
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">Per installare i bookmarklet, trascina il link sulla barra \n"
+"dei bookmark, o clicca il link con il tasto destro e aggiungilo ai "
+"bookmark.\n"
+"Potrai poi scegliere un bookmarklet in qualsiasi pagina del sito.\n"
+"Nota che alcuni di questi bookmarklet richiedono l'accesso al sito tramite un\n"
+"computer designato come \"interno\" (chiedi al tuo amministratore di \n"
+"sistema se non sei sicuro che il tuo computer sia \"interno\").</p>\n"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:18
+msgid "Documentation for this page"
+msgstr "Documentazione per questa pagina"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:19
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+"Porta da qualsiasi pagina alla documentazione della view che genera quella "
+"pagina."
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:21
+msgid "Show object ID"
+msgstr "Mostra l'ID dell'oggetto"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:22
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Mostra il content-type e l'ID univoco di pagine che rappresentano un singolo "
+"oggetto."
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:24
+msgid "Edit this object (current window)"
+msgstr "Modifica quest'oggetto (nella finestra corrente)"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:25
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+"Porta alla pagina amministrativa di pagine che rappresentano un oggetto "
+"singolo."
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:27
+msgid "Edit this object (new window)"
+msgstr "Modifica quest'oggetto (in una nuova finestra)"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:28
+msgid "As above, but opens the admin page in a new window."
+msgstr "Come sopra, ma apre la pagina di amministrazione in una nuova finestra."
+
+#: contrib/auth/admin.py:21
+msgid "Personal info"
+msgstr "Informazioni personali"
+
+#: contrib/auth/admin.py:22
+msgid "Permissions"
+msgstr "Permessi"
+
+#: contrib/auth/admin.py:23
+msgid "Important dates"
+msgstr "Date importanti"
+
+#: contrib/auth/admin.py:24
+msgid "Groups"
+msgstr "Gruppi"
+
+#: contrib/auth/admin.py:60
+msgid "Add user"
+msgstr "Aggiungi utente"
+
+#: contrib/auth/admin.py:85
+msgid "Password changed successfully."
+msgstr "La password è stata cambiata correttamente."
+
+#: contrib/auth/admin.py:91
+#, python-format
+msgid "Change password: %s"
+msgstr "Cambia la password: %s"
+
+#: contrib/auth/forms.py:15 contrib/auth/models.py:134
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr ""
+"Obbligatorio. 30 caratteri o meno. Solo caratteri alfanumerici (lettere, "
+"cifre e sottolineati)."
+
+#: contrib/auth/forms.py:16 core/validators.py:72
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Questo valore può contenere solo lettere, cifre e sottolineati."
+
+#: contrib/auth/forms.py:18
+msgid "Password confirmation"
+msgstr "Conferma password"
+
+#: contrib/auth/forms.py:30
+msgid "A user with that username already exists."
+msgstr "Un utente con questo nome·è già presente."
+
+#: contrib/auth/forms.py:36 contrib/auth/forms.py:146
+#: contrib/auth/forms.py:188
+msgid "The two password fields didn't match."
+msgstr "I due campi password non corrispondono."
+
+#: contrib/auth/forms.py:74 contrib/comments/views/comments.py:58
+msgid "This account is inactive."
+msgstr "Questo account non è attivo."
+
+#: contrib/auth/forms.py:79 contrib/comments/views/comments.py:49
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"Il browser web sembra non avere i cookie abilitati. I cookie sono necessari "
+"per poter accedere."
+
+#: contrib/auth/forms.py:92
+msgid "E-mail"
+msgstr "E-mail"
+
+#: contrib/auth/forms.py:101
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr ""
+"Questo indirizzo email non è associato ad alcun account utente. Sei sicuro "
+"di esserti registrato?"
+
+#: contrib/auth/forms.py:126
+#, python-format
+msgid "Password reset on %s"
+msgstr "Password reimpostata su %s"
+
+#: contrib/auth/forms.py:134
+msgid "New password"
+msgstr "Nuova password"
+
+#: contrib/auth/forms.py:135
+msgid "New password confirmation"
+msgstr "Conferma nuova password"
+
+#: contrib/auth/forms.py:160
+msgid "Old password"
+msgstr "Password attuale"
+
+#: contrib/auth/forms.py:168
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "La password attuale non è stata inserita correttamente: va inserita di nuovo."
+
+#: contrib/auth/models.py:73 contrib/auth/models.py:93
+msgid "name"
+msgstr "nome"
+
+#: contrib/auth/models.py:75
+msgid "codename"
+msgstr "nome in codice"
+
+#: contrib/auth/models.py:78
+msgid "permission"
+msgstr "permesso"
+
+#: contrib/auth/models.py:79 contrib/auth/models.py:94
+msgid "permissions"
+msgstr "permessi"
+
+#: contrib/auth/models.py:97
+msgid "group"
+msgstr "gruppo"
+
+#: contrib/auth/models.py:98 contrib/auth/models.py:144
+msgid "groups"
+msgstr "gruppi"
+
+#: contrib/auth/models.py:134
+msgid "username"
+msgstr "nome utente"
+
+#: contrib/auth/models.py:135
+msgid "first name"
+msgstr "nome"
+
+#: contrib/auth/models.py:136
+msgid "last name"
+msgstr "cognome"
+
+#: contrib/auth/models.py:137
+msgid "e-mail address"
+msgstr "indirizzo e-mail"
+
+#: contrib/auth/models.py:138
+msgid "password"
+msgstr "password"
+
+#: contrib/auth/models.py:138
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"Usa '[algo]$[salt]$[hexdigest]' oppure la <a href=\"password/\">maschera "
+"di cambio password</a>."
+
+#: contrib/auth/models.py:139
+msgid "staff status"
+msgstr "privilegi di staff"
+
+#: contrib/auth/models.py:139
+msgid "Designates whether the user can log into this admin site."
+msgstr "Indica se l'utente può accedere a questo sito di amministrazione."
+
+#: contrib/auth/models.py:140
+msgid "active"
+msgstr "attivo"
+
+#: contrib/auth/models.py:140
+msgid ""
+"Designates whether this user should be treated as active. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"Indica se l'utente debba essere considerato attivo. Deseleziona qui, "
+"piuttosto che cancellare gli account."
+
+#: contrib/auth/models.py:141
+msgid "superuser status"
+msgstr "privilegi di superutente"
+
+#: contrib/auth/models.py:141
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr ""
+"Indica che l'utente ha tutti i privilegi, senza che siano stati assegnati "
+"esplicitamente."
+
+#: contrib/auth/models.py:142
+msgid "last login"
+msgstr "ultimo accesso"
+
+#: contrib/auth/models.py:143
+msgid "date joined"
+msgstr "iscritto in data"
+
+#: contrib/auth/models.py:145
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"In aggiunta ai privilegi assegnati manualmente, l'utente riceverà anche "
+"tutti i privilegi assegnati ad ogni gruppo cui appartiene."
+
+#: contrib/auth/models.py:146
+msgid "user permissions"
+msgstr "privilegi utente"
+
+#: contrib/auth/models.py:150
+msgid "user"
+msgstr "utente"
+
+#: contrib/auth/models.py:151
+msgid "users"
+msgstr "utenti"
+
+#: contrib/auth/models.py:306
+msgid "message"
+msgstr "messaggio"
+
+#: contrib/auth/views.py:51
+msgid "Logged out"
+msgstr "Accesso annullato"
+
+#: contrib/comments/models.py:71 contrib/comments/models.py:164
+msgid "object ID"
+msgstr "ID dell'oggetto"
+
+#: contrib/comments/models.py:72
+msgid "headline"
+msgstr "intestazione"
+
+#: contrib/comments/models.py:73 contrib/comments/models.py:95
+#: contrib/comments/models.py:165
+msgid "comment"
+msgstr "commento"
+
+#: contrib/comments/models.py:74
+msgid "rating #1"
+msgstr "valutazione #1"
+
+#: contrib/comments/models.py:75
+msgid "rating #2"
+msgstr "valutazione #2"
+
+#: contrib/comments/models.py:76
+msgid "rating #3"
+msgstr "valutazione #3"
+
+#: contrib/comments/models.py:77
+msgid "rating #4"
+msgstr "valutazione #4"
+
+#: contrib/comments/models.py:78
+msgid "rating #5"
+msgstr "valutazione #5"
+
+#: contrib/comments/models.py:79
+msgid "rating #6"
+msgstr "valutazione #6"
+
+#: contrib/comments/models.py:80
+msgid "rating #7"
+msgstr "valutazione #7"
+
+#: contrib/comments/models.py:81
+msgid "rating #8"
+msgstr "valutazione #8"
+
+#: contrib/comments/models.py:86
+msgid "is valid rating"
+msgstr "è una valutazione valida"
+
+#: contrib/comments/models.py:87 contrib/comments/models.py:167
+msgid "date/time submitted"
+msgstr "data/ora di inserimento"
+
+#: contrib/comments/models.py:88 contrib/comments/models.py:168
+msgid "is public"
+msgstr "è pubblico"
+
+#: contrib/comments/models.py:90
+msgid "is removed"
+msgstr "è rimosso"
+
+#: contrib/comments/models.py:90
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Spunta la casella se il commento è inappropriato. Verrà sostituito dal "
+"messaggio \"Questo commento è stato rimosso\"."
+
+#: contrib/comments/models.py:96
+msgid "comments"
+msgstr "commenti"
+
+#: contrib/comments/models.py:128 contrib/comments/models.py:199
+msgid "Content object"
+msgstr "Oggetto con contenuto"
+
+#: contrib/comments/models.py:156
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Inserito da %(user)s il %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:166
+msgid "person's name"
+msgstr "nome della persona"
+
+#: contrib/comments/models.py:169
+msgid "ip address"
+msgstr "indirizzo IP"
+
+#: contrib/comments/models.py:171
+msgid "approved by staff"
+msgstr "approvato dallo staff"
+
+#: contrib/comments/models.py:175
+msgid "free comment"
+msgstr "commento libero"
+
+#: contrib/comments/models.py:176
+msgid "free comments"
+msgstr "commenti liberi"
+
+#: contrib/comments/models.py:227
+msgid "score"
+msgstr "punteggio"
+
+#: contrib/comments/models.py:228
+msgid "score date"
+msgstr "data punteggio"
+
+#: contrib/comments/models.py:232
+msgid "karma score"
+msgstr "livello karma"
+
+#: contrib/comments/models.py:233
+msgid "karma scores"
+msgstr "livelli karma"
+
+#: contrib/comments/models.py:237
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "valutazione: %(score)d da %(user)s"
+
+#: contrib/comments/models.py:254
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"A questo commento è stato apposto un flag da %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:262
+msgid "flag date"
+msgstr "data flag"
+
+#: contrib/comments/models.py:266
+msgid "user flag"
+msgstr "flag utente"
+
+#: contrib/comments/models.py:267
+msgid "user flags"
+msgstr "flag utente"
+
+#: contrib/comments/models.py:271
+#, python-format
+msgid "Flag by %r"
+msgstr "Flag da %r"
+
+#: contrib/comments/models.py:277
+msgid "deletion date"
+msgstr "data cancellazione"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "cancellazione da moderatore"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "cancellazioni da moderatore"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Cancellazione da moderatore %r"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Hai dimenticato la password?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Valutazioni"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Obbligatorio"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Facoltativo"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Inserisci una foto"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Commento:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Anteprima commento"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Il tuo nome:"
+
+#: contrib/comments/views/comments.py:76
+msgid "This rating is required because you've entered at least one other rating."
+msgstr ""
+"Questa valutazione è obbligatoria perché hai inserito almeno un'altra "
+"valutazione."
+
+#: contrib/comments/views/comments.py:160
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Questo commento è stato inserito da un utente autore di meno di %(count)s "
+"commento:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Questo commento è stato inserito da un utente autore di meno di %(count)s "
+"commenti:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:165
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Questo commento è stato inserito da un utente non confermato:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:238
+#: contrib/comments/views/comments.py:331
+msgid "Only POSTs are allowed"
+msgstr "Sono ammessi solo POST"
+
+#: contrib/comments/views/comments.py:242
+#: contrib/comments/views/comments.py:335
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Uno o più campi richiesti non sono stati inseriti"
+
+#: contrib/comments/views/comments.py:246
+#: contrib/comments/views/comments.py:337
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Qualcuno ha alterato il modulo di commento (violazione di sicurezza)"
+
+#: contrib/comments/views/comments.py:256
+#: contrib/comments/views/comments.py:343
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"Il modulo di commento ha un parametro 'target' non valido -- l'ID "
+"dell'oggetto non è valido"
+
+#: contrib/comments/views/comments.py:307
+#: contrib/comments/views/comments.py:372
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "Il modulo di commento non fornisce né 'anteprima' né 'invia'"
+
+#: contrib/comments/views/karma.py:21
+msgid "Anonymous users cannot vote"
+msgstr "Gli utenti anonimi non possono votare"
+
+#: contrib/comments/views/karma.py:25
+msgid "Invalid comment ID"
+msgstr "ID commento non valido"
+
+#: contrib/comments/views/karma.py:27
+msgid "No voting for yourself"
+msgstr "Impossibile votare per se stessi"
+
+#: contrib/contenttypes/models.py:67
+msgid "python model class name"
+msgstr "nome della classe del modello Python"
+
+#: contrib/contenttypes/models.py:71
+msgid "content type"
+msgstr "content type"
+
+#: contrib/contenttypes/models.py:72
+msgid "content types"
+msgstr "content type"
+
+#: contrib/flatpages/admin.py:9
+msgid "Advanced options"
+msgstr "Opzioni avanzate"
+
+#: contrib/flatpages/models.py:9
+msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr "Esempio: '/about/contact/'. Assicurati di inserire le barre diagonali iniziali e finali."
+
+#: contrib/flatpages/models.py:10
+msgid "title"
+msgstr "titolo"
+
+#: contrib/flatpages/models.py:11
+msgid "content"
+msgstr "contenuto"
+
+#: contrib/flatpages/models.py:12
+msgid "enable comments"
+msgstr "abilita commenti"
+
+#: contrib/flatpages/models.py:13
+msgid "template name"
+msgstr "nome modello"
+
+#: contrib/flatpages/models.py:14
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"Esempio: 'flatpages/contact_page.html'. Se non specificato, il sistema userà "
+"'flatpages/default.html'."
+
+#: contrib/flatpages/models.py:15
+msgid "registration required"
+msgstr "registrazione obbligatoria"
+
+#: contrib/flatpages/models.py:15
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+"Se selezionato, solo gli utenti che hanno effettuato l'accesso potranno "
+"vedere la pagina."
+
+#: contrib/flatpages/models.py:20
+msgid "flat page"
+msgstr "pagina statica"
+
+#: contrib/flatpages/models.py:21
+msgid "flat pages"
+msgstr "pagine statiche"
+
+#: contrib/gis/forms/fields.py:10
+msgid "No geometry value provided."
+msgstr "Nessun valore geometrico fornito."
+
+#: contrib/gis/forms/fields.py:11
+msgid "Invalid Geometry value."
+msgstr "Valore geometrico non valido."
+
+#: contrib/gis/forms/fields.py:12
+msgid "Invalid Geometry type."
+msgstr "Tipo geometrico non valido."
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "th"
+msgstr "º"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "st"
+msgstr "º"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "nd"
+msgstr "º"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "rd"
+msgstr "º"
+
+#: contrib/humanize/templatetags/humanize.py:51
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f milione"
+msgstr[1] "%(value).1f milioni"
+
+#: contrib/humanize/templatetags/humanize.py:54
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f miliardo"
+msgstr[1] "%(value).1f miliardi"
+
+#: contrib/humanize/templatetags/humanize.py:57
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f migliaio di miliardi"
+msgstr[1] "%(value).1f migliaia di miliardi"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "one"
+msgstr "uno"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "two"
+msgstr "due"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "three"
+msgstr "tre"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "four"
+msgstr "quattro"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "five"
+msgstr "cinque"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "six"
+msgstr "sei"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "seven"
+msgstr "sette"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "eight"
+msgstr "otto"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "nine"
+msgstr "nove"
+
+#: contrib/humanize/templatetags/humanize.py:93
+msgid "today"
+msgstr "oggi"
+
+#: contrib/humanize/templatetags/humanize.py:95
+msgid "tomorrow"
+msgstr "domani"
+
+#: contrib/humanize/templatetags/humanize.py:97
+msgid "yesterday"
+msgstr "ieri"
+
+#: contrib/localflavor/ar/forms.py:27
+msgid "Enter a postal code in the format NNNN or ANNNNAAA."
+msgstr "Inserisci un codice postale nel formato NNNN o ANNNNAAA."
+
+#: contrib/localflavor/ar/forms.py:49 contrib/localflavor/br/forms.py:96
+#: contrib/localflavor/br/forms.py:135 contrib/localflavor/pe/forms.py:23
+#: contrib/localflavor/pe/forms.py:51
+msgid "This field requires only numbers."
+msgstr "Questo campo può contenere solo numeri."
+
+#: contrib/localflavor/ar/forms.py:50
+msgid "This field requires 7 or 8 digits."
+msgstr "Questo campo richiede 7 o 8 cifre."
+
+#: contrib/localflavor/ar/forms.py:79
+msgid "Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format."
+msgstr "Inserisci un CUIT valido nel formato XX-XXXXXXXX-X o XXXXXXXXXXXX."
+
+#: contrib/localflavor/ar/forms.py:80
+msgid "Invalid CUIT."
+msgstr "CUIT non valido."
+
+#: contrib/localflavor/at/at_states.py:5
+msgid "Burgenland"
+msgstr "Burgenland"
+
+#: contrib/localflavor/at/at_states.py:6
+msgid "Carinthia"
+msgstr "Carinthia"
+
+#: contrib/localflavor/at/at_states.py:7
+msgid "Lower Austria"
+msgstr "Bassa Austria"
+
+#: contrib/localflavor/at/at_states.py:8
+msgid "Upper Austria"
+msgstr "Alta Austria"
+
+#: contrib/localflavor/at/at_states.py:9
+msgid "Salzburg"
+msgstr "Salisburgo"
+
+#: contrib/localflavor/at/at_states.py:10
+msgid "Styria"
+msgstr "Styria"
+
+#: contrib/localflavor/at/at_states.py:11
+msgid "Tyrol"
+msgstr "Tirolo"
+
+#: contrib/localflavor/at/at_states.py:12
+msgid "Vorarlberg"
+msgstr "Vorarlberg"
+
+#: contrib/localflavor/at/at_states.py:13
+msgid "Vienna"
+msgstr "Vienna"
+
+#: contrib/localflavor/at/forms.py:20 contrib/localflavor/ch/forms.py:16
+#: contrib/localflavor/no/forms.py:12
+msgid "Enter a zip code in the format XXXX."
+msgstr "Inserisci un codice postale nel formato XXXXX ."
+
+#: contrib/localflavor/at/forms.py:48
+msgid "Enter a valid Austrian Social Security Number in XXXX XXXXXX format."
+msgstr ""
+"Inserisci un Numero di Assistenza Sociale Austriaco valido, nel formato XXXX "
+"XXXXXX."
+
+#: contrib/localflavor/au/forms.py:16
+msgid "Enter a 4 digit post code."
+msgstr "Inserisci un codice postale di 4 cifre."
+
+#: contrib/localflavor/br/forms.py:21
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Inserisci un codice postale nel formato XXXXX-XXX ."
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "I numeri di telefono devono essere in formato XX-XXXX-XXXX ."
+
+#: contrib/localflavor/br/forms.py:58
+msgid ""
+"Select a valid brazilian state. That state is not one of the available "
+"states."
+msgstr ""
+"Scegliere uno stato brasiliano valido. Questo stato non è uno di quelli "
+"disponibili."
+
+#: contrib/localflavor/br/forms.py:94
+msgid "Invalid CPF number."
+msgstr "Numero CPF non valido."
+
+#: contrib/localflavor/br/forms.py:95
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr "Questo campo richiede non più di 11 cifre, o 14 caratteri."
+
+#: contrib/localflavor/br/forms.py:134
+msgid "Invalid CNPJ number."
+msgstr "Numero CNPJ non valido."
+
+#: contrib/localflavor/br/forms.py:136
+msgid "This field requires at least 14 digits"
+msgstr "Questo campo richiede almeno 14 cifre"
+
+#: contrib/localflavor/ca/forms.py:17
+msgid "Enter a postal code in the format XXX XXX."
+msgstr "Inserisci un codice postale nel formato XXX XXX."
+
+#: contrib/localflavor/ca/forms.py:88
+msgid "Enter a valid Canadian Social Insurance number in XXX-XXX-XXX format."
+msgstr ""
+"Inserisci un numero di assicurazione sociale canadese valido, nel formato XXX-"
+"XXX-XXX."
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr "Aargau"
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr "Appenzell Innerrhoden"
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr "Appenzell Ausserrhoden"
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr "Basel-Stadt"
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr "Basel-Land"
+
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr "Berna"
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr "Friburgo"
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr "Ginevra"
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr "Glarus"
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr "Graubuenden"
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr "Jura"
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr "Lucerna"
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr "Neuchatel"
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr "Nidwalden"
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr "Obwalden"
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr "Schaffhausen"
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr "Schwyz"
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr "Solothurn"
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr "St. Gallen"
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr "Thurgau"
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr "Ticino"
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr "Uri"
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr "Valais"
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr "Vaud"
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr "Zug"
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr "Zurigo"
+
+#: contrib/localflavor/ch/forms.py:64
+msgid ""
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
+msgstr ""
+"Inserisci un numero di carta d'identità o passaporto svizzeri validi, in "
+"formato X1234567<0 o 1234567890 ."
+
+#: contrib/localflavor/cl/forms.py:29
+msgid "Enter a valid Chilean RUT."
+msgstr "Inserisci un RUT cileno valido."
+
+#: contrib/localflavor/cl/forms.py:30
+msgid "Enter a valid Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr "Inserisci un RUT cileno valido. Il formato è XX.XXX.XXX-X."
+
+#: contrib/localflavor/cl/forms.py:31
+msgid "The Chilean RUT is not valid."
+msgstr "Il RUT cileno non è valido."
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr "Baden-Wuerttemberg"
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr "Baviera"
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr "Berlino"
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr "Brandenburgo"
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr "Brema"
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr "Amburgo"
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr "Hessen"
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr "Mecklenburg-Pomerania Ovest"
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr "Bassa Sassonia"
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr "Reno Nord-Wesfalia"
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr "Rhineland-Palatinate"
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr "Saarland"
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr "Sassonia"
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr "Saxony-Anhalt"
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr "Schleswig-Holstein"
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr "Thuringia"
+
+#: contrib/localflavor/de/forms.py:14 contrib/localflavor/fi/forms.py:12
+#: contrib/localflavor/fr/forms.py:15
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Inserisci un codice postale nel formato XXXXX ."
+
+#: contrib/localflavor/de/forms.py:41
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr ""
+"Inserisci un numero di carta d'identità tedesco valido nel formato "
+"XXXXXXXXXXX-XXXXXXX-XXXXXXX-X ."
+
+#: contrib/localflavor/es/es_provinces.py:5
+msgid "Arava"
+msgstr "Arava"
+
+#: contrib/localflavor/es/es_provinces.py:6
+msgid "Albacete"
+msgstr "Albacete"
+
+#: contrib/localflavor/es/es_provinces.py:7
+msgid "Alacant"
+msgstr "Alacant"
+
+#: contrib/localflavor/es/es_provinces.py:8
+msgid "Almeria"
+msgstr "Almeria"
+
+#: contrib/localflavor/es/es_provinces.py:9
+msgid "Avila"
+msgstr "Avila"
+
+#: contrib/localflavor/es/es_provinces.py:10
+msgid "Badajoz"
+msgstr "Badajoz"
+
+#: contrib/localflavor/es/es_provinces.py:11
+msgid "Illes Balears"
+msgstr "Isole Baleari"
+
+#: contrib/localflavor/es/es_provinces.py:12
+msgid "Barcelona"
+msgstr "Barcellona"
+
+#: contrib/localflavor/es/es_provinces.py:13
+msgid "Burgos"
+msgstr "Burgos"
+
+#: contrib/localflavor/es/es_provinces.py:14
+msgid "Caceres"
+msgstr "Caceres"
+
+#: contrib/localflavor/es/es_provinces.py:15
+msgid "Cadiz"
+msgstr "Cadice"
+
+#: contrib/localflavor/es/es_provinces.py:16
+msgid "Castello"
+msgstr "Castello"
+
+#: contrib/localflavor/es/es_provinces.py:17
+msgid "Ciudad Real"
+msgstr "Città Reale"
+
+#: contrib/localflavor/es/es_provinces.py:18
+msgid "Cordoba"
+msgstr "Cordoba"
+
+#: contrib/localflavor/es/es_provinces.py:19
+msgid "A Coruna"
+msgstr "A Coruna"
+
+#: contrib/localflavor/es/es_provinces.py:20
+msgid "Cuenca"
+msgstr "Cuenca"
+
+#: contrib/localflavor/es/es_provinces.py:21
+msgid "Girona"
+msgstr "Girona"
+
+#: contrib/localflavor/es/es_provinces.py:22
+msgid "Granada"
+msgstr "Granada"
+
+#: contrib/localflavor/es/es_provinces.py:23
+msgid "Guadalajara"
+msgstr "Guadalajara"
+
+#: contrib/localflavor/es/es_provinces.py:24
+msgid "Guipuzkoa"
+msgstr "Guipuzkoa"
+
+#: contrib/localflavor/es/es_provinces.py:25
+msgid "Huelva"
+msgstr "Huelva"
+
+#: contrib/localflavor/es/es_provinces.py:26
+msgid "Huesca"
+msgstr "Huesca"
+
+#: contrib/localflavor/es/es_provinces.py:27
+msgid "Jaen"
+msgstr "Jaen"
+
+#: contrib/localflavor/es/es_provinces.py:28
+msgid "Leon"
+msgstr "Leon"
+
+#: contrib/localflavor/es/es_provinces.py:29
+msgid "Lleida"
+msgstr "Lleida"
+
+#: contrib/localflavor/es/es_provinces.py:30
+#: contrib/localflavor/es/es_regions.py:17
+msgid "La Rioja"
+msgstr "La Rioja"
+
+#: contrib/localflavor/es/es_provinces.py:31
+msgid "Lugo"
+msgstr "Lugo"
+
+#: contrib/localflavor/es/es_provinces.py:32
+#: contrib/localflavor/es/es_regions.py:18
+msgid "Madrid"
+msgstr "Madrid"
+
+#: contrib/localflavor/es/es_provinces.py:33
+msgid "Malaga"
+msgstr "Malaga"
+
+#: contrib/localflavor/es/es_provinces.py:34
+msgid "Murcia"
+msgstr "Murcia"
+
+#: contrib/localflavor/es/es_provinces.py:35
+msgid "Navarre"
+msgstr "Navarre"
+
+#: contrib/localflavor/es/es_provinces.py:36
+msgid "Ourense"
+msgstr "Ourense"
+
+#: contrib/localflavor/es/es_provinces.py:37
+msgid "Asturias"
+msgstr "Asturias"
+
+#: contrib/localflavor/es/es_provinces.py:38
+msgid "Palencia"
+msgstr "Palencia"
+
+#: contrib/localflavor/es/es_provinces.py:39
+msgid "Las Palmas"
+msgstr "Las Palmas"
+
+#: contrib/localflavor/es/es_provinces.py:40
+msgid "Pontevedra"
+msgstr "Pontevedra"
+
+#: contrib/localflavor/es/es_provinces.py:41
+msgid "Salamanca"
+msgstr "Salamanca"
+
+#: contrib/localflavor/es/es_provinces.py:42
+msgid "Santa Cruz de Tenerife"
+msgstr "Santa Croce di Tenerife"
+
+#: contrib/localflavor/es/es_provinces.py:43
+#: contrib/localflavor/es/es_regions.py:11
+msgid "Cantabria"
+msgstr "Cantabria"
+
+#: contrib/localflavor/es/es_provinces.py:44
+msgid "Segovia"
+msgstr "Segovia"
+
+#: contrib/localflavor/es/es_provinces.py:45
+msgid "Seville"
+msgstr "Siviglia"
+
+#: contrib/localflavor/es/es_provinces.py:46
+msgid "Soria"
+msgstr "Soria"
+
+#: contrib/localflavor/es/es_provinces.py:47
+msgid "Tarragona"
+msgstr "Tarragona"
+
+#: contrib/localflavor/es/es_provinces.py:48
+msgid "Teruel"
+msgstr "Teruel"
+
+#: contrib/localflavor/es/es_provinces.py:49
+msgid "Toledo"
+msgstr "Toledo"
+
+#: contrib/localflavor/es/es_provinces.py:50
+msgid "Valencia"
+msgstr "Valenza"
+
+#: contrib/localflavor/es/es_provinces.py:51
+msgid "Valladolid"
+msgstr "Valladolid"
+
+#: contrib/localflavor/es/es_provinces.py:52
+msgid "Bizkaia"
+msgstr "Bizkaia"
+
+#: contrib/localflavor/es/es_provinces.py:53
+msgid "Zamora"
+msgstr "Zamora"
+
+#: contrib/localflavor/es/es_provinces.py:54
+msgid "Zaragoza"
+msgstr "Saragozza"
+
+#: contrib/localflavor/es/es_provinces.py:55
+msgid "Ceuta"
+msgstr "Ceuta"
+
+#: contrib/localflavor/es/es_provinces.py:56
+msgid "Melilla"
+msgstr "Melilla"
+
+#: contrib/localflavor/es/es_regions.py:5
+msgid "Andalusia"
+msgstr "Andalusia"
+
+#: contrib/localflavor/es/es_regions.py:6
+msgid "Aragon"
+msgstr "Aragon"
+
+#: contrib/localflavor/es/es_regions.py:7
+msgid "Principality of Asturias"
+msgstr "Principato delle Asturie"
+
+#: contrib/localflavor/es/es_regions.py:8
+msgid "Balearic Islands"
+msgstr "Isole Baleari"
+
+#: contrib/localflavor/es/es_regions.py:9
+msgid "Basque Country"
+msgstr "Paese Basco"
+
+#: contrib/localflavor/es/es_regions.py:10
+msgid "Canary Islands"
+msgstr "Isole Canarie"
+
+#: contrib/localflavor/es/es_regions.py:12
+msgid "Castile-La Mancha"
+msgstr "Castile-La Mancha"
+
+#: contrib/localflavor/es/es_regions.py:13
+msgid "Castile and Leon"
+msgstr "Castile and Leon"
+
+#: contrib/localflavor/es/es_regions.py:14
+msgid "Catalonia"
+msgstr "Catalogna"
+
+#: contrib/localflavor/es/es_regions.py:15
+msgid "Extremadura"
+msgstr "Estremadura"
+
+#: contrib/localflavor/es/es_regions.py:16
+msgid "Galicia"
+msgstr "Galizia"
+
+#: contrib/localflavor/es/es_regions.py:19
+msgid "Region of Murcia"
+msgstr "Regione Murzia"
+
+#: contrib/localflavor/es/es_regions.py:20
+msgid "Foral Community of Navarre"
+msgstr "Comunità Forale di Navarra"
+
+#: contrib/localflavor/es/es_regions.py:21
+msgid "Valencian Community"
+msgstr "Comunità di Valenza"
+
+#: contrib/localflavor/es/forms.py:19
+msgid "Enter a valid postal code in the range and format 01XXX - 52XXX."
+msgstr "Inserisci un codice postale valido nell'intervallo e formato 01XXX - 52XXX."
+
+#: contrib/localflavor/es/forms.py:39
+msgid ""
+"Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or "
+"9XXXXXXXX."
+msgstr ""
+"Inserisci un numero telefonico valido in uno dei formati 6XXXXXXXX, 8XXXXXXXX "
+"o 9XXXXXXXX."
+
+#: contrib/localflavor/es/forms.py:66
+msgid "Please enter a valid NIF, NIE, or CIF."
+msgstr "Inserisci un NIF, NIE, o CIF valido."
+
+#: contrib/localflavor/es/forms.py:67
+msgid "Please enter a valid NIF or NIE."
+msgstr "Inserisci un NIF o NIE valido."
+
+#: contrib/localflavor/es/forms.py:68
+msgid "Invalid checksum for NIF."
+msgstr "Checksum non valido per il NIF."
+
+#: contrib/localflavor/es/forms.py:69
+msgid "Invalid checksum for NIE."
+msgstr "Checksum non valido per il NIE."
+
+#: contrib/localflavor/es/forms.py:70
+msgid "Invalid checksum for CIF."
+msgstr "Checksum non valido per il CIF."
+
+#: contrib/localflavor/es/forms.py:142
+msgid "Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX."
+msgstr ""
+"Inserisci un numero di conto corrente bancario valido nel formato XXXX-XXXX-"
+"XX-XXXXXXXXXX."
+
+#: contrib/localflavor/es/forms.py:143
+msgid "Invalid checksum for bank account number."
+msgstr "Checksum non valido per il numero di conto corrente bancario."
+
+#: contrib/localflavor/fi/forms.py:28
+msgid "Enter a valid Finnish social security number."
+msgstr "Inserisci un numero di assistenza sociale finlandese valido."
+
+#: contrib/localflavor/in_/forms.py:14
+msgid "Enter a zip code in the format XXXXXXX."
+msgstr "Inserisci un codice postale nel formato XXXXXXX."
+
+#: contrib/localflavor/is_/forms.py:17
+msgid "Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr ""
+"Inserisci un numero di identificazione islandese valido. Il formato è XXXXXX-"
+"XXXX ."
+
+#: contrib/localflavor/is_/forms.py:18
+msgid "The Icelandic identification number is not valid."
+msgstr "Il numero di identificazione islandese non è valido."
+
+#: contrib/localflavor/it/forms.py:14
+msgid "Enter a valid zip code."
+msgstr "Inserisci un codice postale valido."
+
+#: contrib/localflavor/it/forms.py:43
+msgid "Enter a valid Social Security number."
+msgstr "Inserisci un numero di codice fiscale valido."
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr "Inserisci una partita IVA valida."
+
+#: contrib/localflavor/jp/forms.py:17
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "Inserisci un codice postale nel formato XXXXXXX o XXX-XXXX ."
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr "Hokkaido"
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr "Aomori"
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr "Iwate"
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr "Miyagi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr "Akita"
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr "Yamagata"
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr "Fukushima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr "Ibaraki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr "Tochigi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr "Gunma"
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr "Saitama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr "Chiba"
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr "Tokyo"
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr "Kanagawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr "Yamanashi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr "Nagano"
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr "Niigata"
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr "Toyama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr "Ishikawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr "Fukui"
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr "Gifu"
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr "Shizuoka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr "Aichi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr "Mie"
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr "Shiga"
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr "Kyoto"
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr "Osaka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr "Hyogo"
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr "Nara"
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr "Wakayama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr "Tottori"
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr "Shimane"
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr "Okayama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr "Hiroshima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr "Yamaguchi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr "Tokushima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr "Kagawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr "Ehime"
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr "Kochi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr "Fukuoka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr "Saga"
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr "Nagasaki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr "Kumamoto"
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr "Oita"
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr "Miyazaki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr "Kagoshima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr "Okinawa"
+
+#: contrib/localflavor/mx/mx_states.py:12
+msgid "Aguascalientes"
+msgstr "Aguascalientes"
+
+#: contrib/localflavor/mx/mx_states.py:13
+msgid "Baja California"
+msgstr "Baia California"
+
+#: contrib/localflavor/mx/mx_states.py:14
+msgid "Baja California Sur"
+msgstr "Baia California Sud"
+
+#: contrib/localflavor/mx/mx_states.py:15
+msgid "Campeche"
+msgstr "Campeche"
+
+#: contrib/localflavor/mx/mx_states.py:16
+msgid "Chihuahua"
+msgstr "Chihuahua"
+
+#: contrib/localflavor/mx/mx_states.py:17
+msgid "Chiapas"
+msgstr "Chiapas"
+
+#: contrib/localflavor/mx/mx_states.py:18
+msgid "Coahuila"
+msgstr "Coahuila"
+
+#: contrib/localflavor/mx/mx_states.py:19
+msgid "Colima"
+msgstr "Colima"
+
+#: contrib/localflavor/mx/mx_states.py:20
+msgid "Distrito Federal"
+msgstr "Distretto Federale"
+
+#: contrib/localflavor/mx/mx_states.py:21
+msgid "Durango"
+msgstr "Durango"
+
+#: contrib/localflavor/mx/mx_states.py:22
+msgid "Guerrero"
+msgstr "Guerrero"
+
+#: contrib/localflavor/mx/mx_states.py:23
+msgid "Guanajuato"
+msgstr "Guanajuato"
+
+#: contrib/localflavor/mx/mx_states.py:24
+msgid "Hidalgo"
+msgstr "Hidalgo"
+
+#: contrib/localflavor/mx/mx_states.py:25
+msgid "Jalisco"
+msgstr "Jalisco"
+
+#: contrib/localflavor/mx/mx_states.py:26
+msgid "Estado de México"
+msgstr "Stato del Messico"
+
+#: contrib/localflavor/mx/mx_states.py:27
+msgid "Michoacán"
+msgstr "Michoacán"
+
+#: contrib/localflavor/mx/mx_states.py:28
+msgid "Morelos"
+msgstr "Morelos"
+
+#: contrib/localflavor/mx/mx_states.py:29
+msgid "Nayarit"
+msgstr "Nayarit"
+
+#: contrib/localflavor/mx/mx_states.py:30
+msgid "Nuevo León"
+msgstr "Nuova Leòn"
+
+#: contrib/localflavor/mx/mx_states.py:31
+msgid "Oaxaca"
+msgstr "Oaxaca"
+
+#: contrib/localflavor/mx/mx_states.py:32
+msgid "Puebla"
+msgstr "Puebla"
+
+#: contrib/localflavor/mx/mx_states.py:33
+msgid "Querétaro"
+msgstr "Querétaro"
+
+#: contrib/localflavor/mx/mx_states.py:34
+msgid "Quintana Roo"
+msgstr "Quintana Roo"
+
+#: contrib/localflavor/mx/mx_states.py:35
+msgid "Sinaloa"
+msgstr "Sinaloa"
+
+#: contrib/localflavor/mx/mx_states.py:36
+msgid "San Luis Potosí"
+msgstr "San Luis Potosí"
+
+#: contrib/localflavor/mx/mx_states.py:37
+msgid "Sonora"
+msgstr "Sonora"
+
+#: contrib/localflavor/mx/mx_states.py:38
+msgid "Tabasco"
+msgstr "Tabasco"
+
+#: contrib/localflavor/mx/mx_states.py:39
+msgid "Tamaulipas"
+msgstr "Tamaulipas"
+
+#: contrib/localflavor/mx/mx_states.py:40
+msgid "Tlaxcala"
+msgstr "Tlaxcala"
+
+#: contrib/localflavor/mx/mx_states.py:41
+msgid "Veracruz"
+msgstr "Veracruz"
+
+#: contrib/localflavor/mx/mx_states.py:42
+msgid "Yucatán"
+msgstr "Yucatán"
+
+#: contrib/localflavor/mx/mx_states.py:43
+msgid "Zacatecas"
+msgstr "Zacatecas"
+
+#: contrib/localflavor/nl/forms.py:21
+msgid "Enter a valid postal code"
+msgstr "Inserisci un codice postale valido"
+
+#: contrib/localflavor/nl/forms.py:52
+msgid "Enter a valid phone number"
+msgstr "Inserisci un numero telefonico valido"
+
+#: contrib/localflavor/nl/forms.py:78
+msgid "Enter a valid SoFi number"
+msgstr "Inserisci un numero SoFi valido"
+
+#: contrib/localflavor/nl/nl_provinces.py:4
+msgid "Drente"
+msgstr "Drente"
+
+#: contrib/localflavor/nl/nl_provinces.py:5
+msgid "Flevoland"
+msgstr "Flevoland"
+
+#: contrib/localflavor/nl/nl_provinces.py:6
+msgid "Friesland"
+msgstr "Friesland"
+
+#: contrib/localflavor/nl/nl_provinces.py:7
+msgid "Gelderland"
+msgstr "Gelderland"
+
+#: contrib/localflavor/nl/nl_provinces.py:8
+msgid "Groningen"
+msgstr "Groningen"
+
+#: contrib/localflavor/nl/nl_provinces.py:9
+msgid "Limburg"
+msgstr "Limburg"
+
+#: contrib/localflavor/nl/nl_provinces.py:10
+msgid "Noord-Brabant"
+msgstr "Noord-Brabant"
+
+#: contrib/localflavor/nl/nl_provinces.py:11
+msgid "Noord-Holland"
+msgstr "Noord-Holland"
+
+#: contrib/localflavor/nl/nl_provinces.py:12
+msgid "Overijssel"
+msgstr "Overijssel"
+
+#: contrib/localflavor/nl/nl_provinces.py:13
+msgid "Utrecht"
+msgstr "Utrecht"
+
+#: contrib/localflavor/nl/nl_provinces.py:14
+msgid "Zeeland"
+msgstr "Zeeland"
+
+#: contrib/localflavor/nl/nl_provinces.py:15
+msgid "Zuid-Holland"
+msgstr "Zuid-Holland"
+
+#: contrib/localflavor/no/forms.py:33
+msgid "Enter a valid Norwegian social security number."
+msgstr "Inserisci un numero di assistenza sociale norvegese valido."
+
+#: contrib/localflavor/pe/forms.py:24
+msgid "This field requires 8 digits."
+msgstr "Questo campo richiede 8 cifre."
+
+#: contrib/localflavor/pe/forms.py:52
+msgid "This field requires 11 digits."
+msgstr "Questo campo richiede 11 cifre."
+
+#: contrib/localflavor/pl/forms.py:39
+msgid "National Identification Number consists of 11 digits."
+msgstr "Il Numero Identificativo Nazionale è costituito da 11 cifre."
+
+#: contrib/localflavor/pl/forms.py:40
+msgid "Wrong checksum for the National Identification Number."
+msgstr "Checksum errato per il Numero Identificativo Nazionale."
+
+#: contrib/localflavor/pl/forms.py:72
+msgid "Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX."
+msgstr ""
+"Inserisci un campo di numero d'imposta (NIP) nel formato XXX-XXX-XX-XX o XX-"
+"XX-XXX-XXX."
+
+#: contrib/localflavor/pl/forms.py:73
+msgid "Wrong checksum for the Tax Number (NIP)."
+msgstr "Checksum errato per il Numero d'Imposta (NIP)."
+
+#: contrib/localflavor/pl/forms.py:112
+msgid "National Business Register Number (REGON) consists of 7 or 9 digits."
+msgstr ""
+"Il Numero di Registro Nazionale d'Impresa (REGON) è costituito da 7 o 9 "
+"cifre."
+
+#: contrib/localflavor/pl/forms.py:113
+msgid "Wrong checksum for the National Business Register Number (REGON)."
+msgstr "Checksum errato per il Numero di Registro Nazionale d'Impresa (REGON)."
+
+#: contrib/localflavor/pl/forms.py:156
+msgid "Enter a postal code in the format XX-XXX."
+msgstr "Inserisci un codice postale nel formato XX-XXX."
+
+#: contrib/localflavor/pl/pl_voivodeships.py:8
+msgid "Lower Silesia"
+msgstr "Bassa Silesia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:9
+msgid "Kuyavia-Pomerania"
+msgstr "Kuyavia-Pomerania"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:10
+msgid "Lublin"
+msgstr "Lublino"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:11
+msgid "Lubusz"
+msgstr "Lubusz"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:12
+msgid "Lodz"
+msgstr "Lodz"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:13
+msgid "Lesser Poland"
+msgstr "Polonia Minore"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:14
+msgid "Masovia"
+msgstr "Masovia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:15
+msgid "Opole"
+msgstr "Opole"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:16
+msgid "Subcarpatia"
+msgstr "Subcarpatia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:17
+msgid "Podlasie"
+msgstr "Podlasie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:18
+msgid "Pomerania"
+msgstr "Pomerania"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:19
+msgid "Silesia"
+msgstr "Silesia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:20
+msgid "Swietokrzyskie"
+msgstr "Swietokrzyskie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:21
+msgid "Warmia-Masuria"
+msgstr "Warmia-Masuria"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:22
+msgid "Greater Poland"
+msgstr "Polonia Maggiore"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:23
+msgid "West Pomerania"
+msgstr "Pomerania Ovest"
+
+#: contrib/localflavor/ro/forms.py:19
+msgid "Enter a valid CIF."
+msgstr "Inserisci un codice CIF valido."
+
+#: contrib/localflavor/ro/forms.py:56
+msgid "Enter a valid CNP."
+msgstr "Inserisci un codice CNP valido."
+
+#: contrib/localflavor/ro/forms.py:141
+msgid "Enter a valid IBAN in ROXX-XXXX-XXXX-XXXX-XXXX-XXXX format"
+msgstr "Inserisci un codice IBAN valido nel formato ROXX-XXXX-XXXX-XXXX-XXXX-XXXX."
+
+#: contrib/localflavor/ro/forms.py:171
+msgid "Phone numbers must be in XXXX-XXXXXX format."
+msgstr "I numeri di telefono devono essere in formato XXXX-XXXXXX."
+
+#: contrib/localflavor/ro/forms.py:194
+msgid "Enter a valid postal code in the format XXXXXX"
+msgstr "Inserisci un codice postale valido nel formato XXXXXX."
+
+#: contrib/localflavor/sk/forms.py:30
+msgid "Enter a postal code in the format XXXXX or XXX XX."
+msgstr "Inserisci un codice postale nel formato XXXXX o XXX XX ."
+
+#: contrib/localflavor/sk/sk_districts.py:8
+msgid "Banska Bystrica"
+msgstr "Banska Bystrica"
+
+#: contrib/localflavor/sk/sk_districts.py:9
+msgid "Banska Stiavnica"
+msgstr "Banska Stiavnica"
+
+#: contrib/localflavor/sk/sk_districts.py:10
+msgid "Bardejov"
+msgstr "Bardejov"
+
+#: contrib/localflavor/sk/sk_districts.py:11
+msgid "Banovce nad Bebravou"
+msgstr "Banovce nad Bebravou"
+
+#: contrib/localflavor/sk/sk_districts.py:12
+msgid "Brezno"
+msgstr "Brezno"
+
+#: contrib/localflavor/sk/sk_districts.py:13
+msgid "Bratislava I"
+msgstr "Bratislava I"
+
+#: contrib/localflavor/sk/sk_districts.py:14
+msgid "Bratislava II"
+msgstr "Bratislava II"
+
+#: contrib/localflavor/sk/sk_districts.py:15
+msgid "Bratislava III"
+msgstr "Bratislava III"
+
+#: contrib/localflavor/sk/sk_districts.py:16
+msgid "Bratislava IV"
+msgstr "Bratislava IV"
+
+#: contrib/localflavor/sk/sk_districts.py:17
+msgid "Bratislava V"
+msgstr "Bratislava V"
+
+#: contrib/localflavor/sk/sk_districts.py:18
+msgid "Bytca"
+msgstr "Bytca"
+
+#: contrib/localflavor/sk/sk_districts.py:19
+msgid "Cadca"
+msgstr "Cadca"
+
+#: contrib/localflavor/sk/sk_districts.py:20
+msgid "Detva"
+msgstr "Detva"
+
+#: contrib/localflavor/sk/sk_districts.py:21
+msgid "Dolny Kubin"
+msgstr "Dolny Kubin"
+
+#: contrib/localflavor/sk/sk_districts.py:22
+msgid "Dunajska Streda"
+msgstr "Dunajska Streda"
+
+#: contrib/localflavor/sk/sk_districts.py:23
+msgid "Galanta"
+msgstr "Galanta"
+
+#: contrib/localflavor/sk/sk_districts.py:24
+msgid "Gelnica"
+msgstr "Gelnica"
+
+#: contrib/localflavor/sk/sk_districts.py:25
+msgid "Hlohovec"
+msgstr "Hlohovec"
+
+#: contrib/localflavor/sk/sk_districts.py:26
+msgid "Humenne"
+msgstr "Humenne"
+
+#: contrib/localflavor/sk/sk_districts.py:27
+msgid "Ilava"
+msgstr "Ilava"
+
+#: contrib/localflavor/sk/sk_districts.py:28
+msgid "Kezmarok"
+msgstr "Kezmarok"
+
+#: contrib/localflavor/sk/sk_districts.py:29
+msgid "Komarno"
+msgstr "Komarno"
+
+#: contrib/localflavor/sk/sk_districts.py:30
+msgid "Kosice I"
+msgstr "Kosice I"
+
+#: contrib/localflavor/sk/sk_districts.py:31
+msgid "Kosice II"
+msgstr "Kosice II"
+
+#: contrib/localflavor/sk/sk_districts.py:32
+msgid "Kosice III"
+msgstr "Kosice III"
+
+#: contrib/localflavor/sk/sk_districts.py:33
+msgid "Kosice IV"
+msgstr "Kosice IV"
+
+#: contrib/localflavor/sk/sk_districts.py:34
+msgid "Kosice - okolie"
+msgstr "Kosice - okolie"
+
+#: contrib/localflavor/sk/sk_districts.py:35
+msgid "Krupina"
+msgstr "Krupina"
+
+#: contrib/localflavor/sk/sk_districts.py:36
+msgid "Kysucke Nove Mesto"
+msgstr "Kysucke Nove Mesto"
+
+#: contrib/localflavor/sk/sk_districts.py:37
+msgid "Levice"
+msgstr "Levice"
+
+#: contrib/localflavor/sk/sk_districts.py:38
+msgid "Levoca"
+msgstr "Levoca"
+
+#: contrib/localflavor/sk/sk_districts.py:39
+msgid "Liptovsky Mikulas"
+msgstr "Liptovsky Mikulas"
+
+#: contrib/localflavor/sk/sk_districts.py:40
+msgid "Lucenec"
+msgstr "Lucenec"
+
+#: contrib/localflavor/sk/sk_districts.py:41
+msgid "Malacky"
+msgstr "Malacky"
+
+#: contrib/localflavor/sk/sk_districts.py:42
+msgid "Martin"
+msgstr "Martin"
+
+#: contrib/localflavor/sk/sk_districts.py:43
+msgid "Medzilaborce"
+msgstr "Medzilaborce"
+
+#: contrib/localflavor/sk/sk_districts.py:44
+msgid "Michalovce"
+msgstr "Michalovce"
+
+#: contrib/localflavor/sk/sk_districts.py:45
+msgid "Myjava"
+msgstr "Myjava"
+
+#: contrib/localflavor/sk/sk_districts.py:46
+msgid "Namestovo"
+msgstr "Namestovo"
+
+#: contrib/localflavor/sk/sk_districts.py:47
+msgid "Nitra"
+msgstr "Nitra"
+
+#: contrib/localflavor/sk/sk_districts.py:48
+msgid "Nove Mesto nad Vahom"
+msgstr "Nove Mesto nad Vahom"
+
+#: contrib/localflavor/sk/sk_districts.py:49
+msgid "Nove Zamky"
+msgstr "Nove Zamky"
+
+#: contrib/localflavor/sk/sk_districts.py:50
+msgid "Partizanske"
+msgstr "Partizanske"
+
+#: contrib/localflavor/sk/sk_districts.py:51
+msgid "Pezinok"
+msgstr "Pezinok"
+
+#: contrib/localflavor/sk/sk_districts.py:52
+msgid "Piestany"
+msgstr "Piestany"
+
+#: contrib/localflavor/sk/sk_districts.py:53
+msgid "Poltar"
+msgstr "Poltar"
+
+#: contrib/localflavor/sk/sk_districts.py:54
+msgid "Poprad"
+msgstr "Poprad"
+
+#: contrib/localflavor/sk/sk_districts.py:55
+msgid "Povazska Bystrica"
+msgstr "Povazska Bystrica"
+
+#: contrib/localflavor/sk/sk_districts.py:56
+msgid "Presov"
+msgstr "Presov"
+
+#: contrib/localflavor/sk/sk_districts.py:57
+msgid "Prievidza"
+msgstr "Prievidza"
+
+#: contrib/localflavor/sk/sk_districts.py:58
+msgid "Puchov"
+msgstr "Puchov"
+
+#: contrib/localflavor/sk/sk_districts.py:59
+msgid "Revuca"
+msgstr "Revuca"
+
+#: contrib/localflavor/sk/sk_districts.py:60
+msgid "Rimavska Sobota"
+msgstr "Rimavska Sobota"
+
+#: contrib/localflavor/sk/sk_districts.py:61
+msgid "Roznava"
+msgstr "Roznava"
+
+#: contrib/localflavor/sk/sk_districts.py:62
+msgid "Ruzomberok"
+msgstr "Ruzomberok"
+
+#: contrib/localflavor/sk/sk_districts.py:63
+msgid "Sabinov"
+msgstr "Sabinov"
+
+#: contrib/localflavor/sk/sk_districts.py:64
+msgid "Senec"
+msgstr "Senec"
+
+#: contrib/localflavor/sk/sk_districts.py:65
+msgid "Senica"
+msgstr "Senica"
+
+#: contrib/localflavor/sk/sk_districts.py:66
+msgid "Skalica"
+msgstr "Skalica"
+
+#: contrib/localflavor/sk/sk_districts.py:67
+msgid "Snina"
+msgstr "Snina"
+
+#: contrib/localflavor/sk/sk_districts.py:68
+msgid "Sobrance"
+msgstr "Sobrance"
+
+#: contrib/localflavor/sk/sk_districts.py:69
+msgid "Spisska Nova Ves"
+msgstr "Spisska Nova Ves"
+
+#: contrib/localflavor/sk/sk_districts.py:70
+msgid "Stara Lubovna"
+msgstr "Stara Lubovna"
+
+#: contrib/localflavor/sk/sk_districts.py:71
+msgid "Stropkov"
+msgstr "Stropkov"
+
+#: contrib/localflavor/sk/sk_districts.py:72
+msgid "Svidnik"
+msgstr "Svidnik"
+
+#: contrib/localflavor/sk/sk_districts.py:73
+msgid "Sala"
+msgstr "Sala"
+
+#: contrib/localflavor/sk/sk_districts.py:74
+msgid "Topolcany"
+msgstr "Topolcany"
+
+#: contrib/localflavor/sk/sk_districts.py:75
+msgid "Trebisov"
+msgstr "Trebisov"
+
+#: contrib/localflavor/sk/sk_districts.py:76
+msgid "Trencin"
+msgstr "Trencin"
+
+#: contrib/localflavor/sk/sk_districts.py:77
+msgid "Trnava"
+msgstr "Trnava"
+
+#: contrib/localflavor/sk/sk_districts.py:78
+msgid "Turcianske Teplice"
+msgstr "Turcianske Teplice"
+
+#: contrib/localflavor/sk/sk_districts.py:79
+msgid "Tvrdosin"
+msgstr "Tvrdosin"
+
+#: contrib/localflavor/sk/sk_districts.py:80
+msgid "Velky Krtis"
+msgstr "Velky Krtis"
+
+#: contrib/localflavor/sk/sk_districts.py:81
+msgid "Vranov nad Toplou"
+msgstr "Vranov nad Toplou"
+
+#: contrib/localflavor/sk/sk_districts.py:82
+msgid "Zlate Moravce"
+msgstr "Zlate Moravce"
+
+#: contrib/localflavor/sk/sk_districts.py:83
+msgid "Zvolen"
+msgstr "Zvolen"
+
+#: contrib/localflavor/sk/sk_districts.py:84
+msgid "Zarnovica"
+msgstr "Zarnovica"
+
+#: contrib/localflavor/sk/sk_districts.py:85
+msgid "Ziar nad Hronom"
+msgstr "Ziar nad Hronom"
+
+#: contrib/localflavor/sk/sk_districts.py:86
+msgid "Zilina"
+msgstr "Zilina"
+
+#: contrib/localflavor/sk/sk_regions.py:8
+msgid "Banska Bystrica region"
+msgstr "Banska Bystrica region"
+
+#: contrib/localflavor/sk/sk_regions.py:9
+msgid "Bratislava region"
+msgstr "Regione di Bratislava"
+
+#: contrib/localflavor/sk/sk_regions.py:10
+msgid "Kosice region"
+msgstr "Regione di Kosice"
+
+#: contrib/localflavor/sk/sk_regions.py:11
+msgid "Nitra region"
+msgstr "Regione di Nitra"
+
+#: contrib/localflavor/sk/sk_regions.py:12
+msgid "Presov region"
+msgstr "Regione di Presov"
+
+#: contrib/localflavor/sk/sk_regions.py:13
+msgid "Trencin region"
+msgstr "Regione di Trencin"
+
+#: contrib/localflavor/sk/sk_regions.py:14
+msgid "Trnava region"
+msgstr "Regione di Trnava"
+
+#: contrib/localflavor/sk/sk_regions.py:15
+msgid "Zilina region"
+msgstr "Regione di Zilina"
+
+#: contrib/localflavor/uk/forms.py:21
+msgid "Enter a valid postcode."
+msgstr "Inserisci un codice postale valido."
+
+#: contrib/localflavor/uk/uk_regions.py:11
+msgid "Bedfordshire"
+msgstr "Bedfordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:12
+msgid "Buckinghamshire"
+msgstr "Buckinghamshire"
+
+#: contrib/localflavor/uk/uk_regions.py:14
+msgid "Cheshire"
+msgstr "Cheshire"
+
+#: contrib/localflavor/uk/uk_regions.py:15
+msgid "Cornwall and Isles of Scilly"
+msgstr "Cornovaglia e Isole di Scilly"
+
+#: contrib/localflavor/uk/uk_regions.py:16
+msgid "Cumbria"
+msgstr "Cumbria"
+
+#: contrib/localflavor/uk/uk_regions.py:17
+msgid "Derbyshire"
+msgstr "Derbyshire"
+
+#: contrib/localflavor/uk/uk_regions.py:18
+msgid "Devon"
+msgstr "Devon"
+
+#: contrib/localflavor/uk/uk_regions.py:19
+msgid "Dorset"
+msgstr "Dorset"
+
+#: contrib/localflavor/uk/uk_regions.py:20
+msgid "Durham"
+msgstr "Durham"
+
+#: contrib/localflavor/uk/uk_regions.py:21
+msgid "East Sussex"
+msgstr "Sussex dell'Est"
+
+#: contrib/localflavor/uk/uk_regions.py:22
+msgid "Essex"
+msgstr "Essex"
+
+#: contrib/localflavor/uk/uk_regions.py:23
+msgid "Gloucestershire"
+msgstr "Gloucestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:24
+msgid "Greater London"
+msgstr "Greater London"
+
+#: contrib/localflavor/uk/uk_regions.py:25
+msgid "Greater Manchester"
+msgstr "Greater Manchester"
+
+#: contrib/localflavor/uk/uk_regions.py:26
+msgid "Hampshire"
+msgstr "Hampshire"
+
+#: contrib/localflavor/uk/uk_regions.py:27
+msgid "Hertfordshire"
+msgstr "Hertfordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:28
+msgid "Kent"
+msgstr "Kent"
+
+#: contrib/localflavor/uk/uk_regions.py:29
+msgid "Lancashire"
+msgstr "Lancashire"
+
+#: contrib/localflavor/uk/uk_regions.py:30
+msgid "Leicestershire"
+msgstr "Leicestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:31
+msgid "Lincolnshire"
+msgstr "Lincolnshire"
+
+#: contrib/localflavor/uk/uk_regions.py:32
+msgid "Merseyside"
+msgstr "Merseyside"
+
+#: contrib/localflavor/uk/uk_regions.py:33
+msgid "Norfolk"
+msgstr "Norfolk"
+
+#: contrib/localflavor/uk/uk_regions.py:34
+msgid "North Yorkshire"
+msgstr "Yorkshire del Nord"
+
+#: contrib/localflavor/uk/uk_regions.py:35
+msgid "Northamptonshire"
+msgstr "Northamptonshire"
+
+#: contrib/localflavor/uk/uk_regions.py:36
+msgid "Northumberland"
+msgstr "Northumberland"
+
+#: contrib/localflavor/uk/uk_regions.py:37
+msgid "Nottinghamshire"
+msgstr "Nottinghamshire"
+
+#: contrib/localflavor/uk/uk_regions.py:38
+msgid "Oxfordshire"
+msgstr "Oxfordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:39
+msgid "Shropshire"
+msgstr "Shropshire"
+
+#: contrib/localflavor/uk/uk_regions.py:40
+msgid "Somerset"
+msgstr "Somerset"
+
+#: contrib/localflavor/uk/uk_regions.py:41
+msgid "South Yorkshire"
+msgstr "Yorkshire del Sud"
+
+#: contrib/localflavor/uk/uk_regions.py:42
+msgid "Staffordshire"
+msgstr "Staffordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:43
+msgid "Suffolk"
+msgstr "Suffolk"
+
+#: contrib/localflavor/uk/uk_regions.py:44
+msgid "Surrey"
+msgstr "Surrey"
+
+#: contrib/localflavor/uk/uk_regions.py:45
+msgid "Tyne and Wear"
+msgstr "Tyne and Wear"
+
+#: contrib/localflavor/uk/uk_regions.py:46
+msgid "Warwickshire"
+msgstr "Warwickshire"
+
+#: contrib/localflavor/uk/uk_regions.py:47
+msgid "West Midlands"
+msgstr "Midland dell'Ovest"
+
+#: contrib/localflavor/uk/uk_regions.py:48
+msgid "West Sussex"
+msgstr "Sussex dell'Ovest"
+
+#: contrib/localflavor/uk/uk_regions.py:49
+msgid "West Yorkshire"
+msgstr "Yorkshire dell'Ovest"
+
+#: contrib/localflavor/uk/uk_regions.py:50
+msgid "Wiltshire"
+msgstr "Wiltshire"
+
+#: contrib/localflavor/uk/uk_regions.py:51
+msgid "Worcestershire"
+msgstr "Worcestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:55
+msgid "County Antrim"
+msgstr "County Antrim"
+
+#: contrib/localflavor/uk/uk_regions.py:56
+msgid "County Armagh"
+msgstr "County Armagh"
+
+#: contrib/localflavor/uk/uk_regions.py:57
+msgid "County Down"
+msgstr "County Down"
+
+#: contrib/localflavor/uk/uk_regions.py:58
+msgid "County Fermanagh"
+msgstr "County Fermanagh"
+
+#: contrib/localflavor/uk/uk_regions.py:59
+msgid "County Londonderry"
+msgstr "County Londonderry"
+
+#: contrib/localflavor/uk/uk_regions.py:60
+msgid "County Tyrone"
+msgstr "County Tyrone"
+
+#: contrib/localflavor/uk/uk_regions.py:64
+msgid "Clwyd"
+msgstr "Clwyd"
+
+#: contrib/localflavor/uk/uk_regions.py:65
+msgid "Dyfed"
+msgstr "Dyfed"
+
+#: contrib/localflavor/uk/uk_regions.py:66
+msgid "Gwent"
+msgstr "Gwent"
+
+#: contrib/localflavor/uk/uk_regions.py:67
+msgid "Gwynedd"
+msgstr "Gwynedd"
+
+#: contrib/localflavor/uk/uk_regions.py:68
+msgid "Mid Glamorgan"
+msgstr "Glamorgan centrale"
+
+#: contrib/localflavor/uk/uk_regions.py:69
+msgid "Powys"
+msgstr "Powys"
+
+#: contrib/localflavor/uk/uk_regions.py:70
+msgid "South Glamorgan"
+msgstr "Glamorgan Sud"
+
+#: contrib/localflavor/uk/uk_regions.py:71
+msgid "West Glamorgan"
+msgstr "Glamorgan Ovest"
+
+#: contrib/localflavor/uk/uk_regions.py:75
+msgid "Borders"
+msgstr "Borders"
+
+#: contrib/localflavor/uk/uk_regions.py:76
+msgid "Central Scotland"
+msgstr "Scozia Centrale"
+
+#: contrib/localflavor/uk/uk_regions.py:77
+msgid "Dumfries and Galloway"
+msgstr "Dumfries and Galloway"
+
+#: contrib/localflavor/uk/uk_regions.py:78
+msgid "Fife"
+msgstr "Fife"
+
+#: contrib/localflavor/uk/uk_regions.py:79
+msgid "Grampian"
+msgstr "Grampian"
+
+#: contrib/localflavor/uk/uk_regions.py:80
+msgid "Highland"
+msgstr "Highland"
+
+#: contrib/localflavor/uk/uk_regions.py:81
+msgid "Lothian"
+msgstr "Lothian"
+
+#: contrib/localflavor/uk/uk_regions.py:82
+msgid "Orkney Islands"
+msgstr "Isole Orkney"
+
+#: contrib/localflavor/uk/uk_regions.py:83
+msgid "Shetland Islands"
+msgstr "Isole Shetland"
+
+#: contrib/localflavor/uk/uk_regions.py:84
+msgid "Strathclyde"
+msgstr "Strathclyde"
+
+#: contrib/localflavor/uk/uk_regions.py:85
+msgid "Tayside"
+msgstr "Tayside"
+
+#: contrib/localflavor/uk/uk_regions.py:86
+msgid "Western Isles"
+msgstr "Isole dell'Ovest"
+
+#: contrib/localflavor/uk/uk_regions.py:90
+msgid "England"
+msgstr "Inghilterra"
+
+#: contrib/localflavor/uk/uk_regions.py:91
+msgid "Northern Ireland"
+msgstr "Irlanda del Nord"
+
+#: contrib/localflavor/uk/uk_regions.py:92
+msgid "Scotland"
+msgstr "Scozia"
+
+#: contrib/localflavor/uk/uk_regions.py:93
+msgid "Wales"
+msgstr "Galles"
+
+#: contrib/localflavor/us/forms.py:16
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "Inserisci un codice postale nel formato XXXXX o XXXXX-XXXX ."
+
+#: contrib/localflavor/us/forms.py:54
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr ""
+"Inserisci un numero di assistenza sociale statunitense valido, nel formato "
+"XXX-XX-XXXX ."
+
+#: contrib/localflavor/za/forms.py:20
+msgid "Enter a valid South African ID number"
+msgstr "Inserisci un numero ID sudafricano valido"
+
+#: contrib/localflavor/za/forms.py:54
+msgid "Enter a valid South African postal code"
+msgstr "Inserisci un codice postale sudafricano valido"
+
+#: contrib/localflavor/za/za_provinces.py:4
+msgid "Eastern Cape"
+msgstr "Capo Est"
+
+#: contrib/localflavor/za/za_provinces.py:5
+msgid "Free State"
+msgstr "Libero Stato"
+
+#: contrib/localflavor/za/za_provinces.py:6
+msgid "Gauteng"
+msgstr "Gauteng"
+
+#: contrib/localflavor/za/za_provinces.py:7
+msgid "KwaZulu-Natal"
+msgstr "KwaZulu-Natal"
+
+#: contrib/localflavor/za/za_provinces.py:8
+msgid "Limpopo"
+msgstr "Limpopo"
+
+#: contrib/localflavor/za/za_provinces.py:9
+msgid "Mpumalanga"
+msgstr "Mpumalanga"
+
+#: contrib/localflavor/za/za_provinces.py:10
+msgid "Northern Cape"
+msgstr "Capo Nord"
+
+#: contrib/localflavor/za/za_provinces.py:11
+msgid "North West"
+msgstr "Nordovest"
+
+#: contrib/localflavor/za/za_provinces.py:12
+msgid "Western Cape"
+msgstr "Capo Ovest"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "redirezione da"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Deve essere un percorso assoluto, senza nome di dominio. Esempio: '/events/"
+"search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "redirezione verso"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Può essere un percorso assoluto (come sopra) o una URL completa che inizia "
+"con 'http://'."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "redirezione"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "redirezioni"
+
+#: contrib/sessions/models.py:45
+msgid "session key"
+msgstr "chiave di sessione"
+
+#: contrib/sessions/models.py:47
+msgid "session data"
+msgstr "dati di sessione"
+
+#: contrib/sessions/models.py:48
+msgid "expire date"
+msgstr "data di scadenza"
+
+#: contrib/sessions/models.py:53
+msgid "session"
+msgstr "sessione"
+
+#: contrib/sessions/models.py:54
+msgid "sessions"
+msgstr "sessioni"
+
+#: contrib/sites/models.py:32
+msgid "domain name"
+msgstr "nome di dominio"
+
+#: contrib/sites/models.py:33
+msgid "display name"
+msgstr "nome visualizzato"
+
+#: contrib/sites/models.py:38
+msgid "site"
+msgstr "sito"
+
+#: contrib/sites/models.py:39
+msgid "sites"
+msgstr "siti"
+
+#: core/validators.py:76
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Questo valore può contenere solo lettere, cifre, sottolineati, trattini e "
+"barre diagonali."
+
+#: core/validators.py:80
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "Questo valore può contenere solo lettere, cifre, sottolineati e trattini."
+
+#: core/validators.py:84
+msgid "Uppercase letters are not allowed here."
+msgstr "Non sono ammesse lettere maiuscole."
+
+#: core/validators.py:88
+msgid "Lowercase letters are not allowed here."
+msgstr "Non sono ammesse lettere minuscole."
+
+#: core/validators.py:95
+msgid "Enter only digits separated by commas."
+msgstr "Inserisci solo cifre separate da virgole."
+
+#: core/validators.py:107
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Inserisci indirizzi e-mail validi separati da virgole."
+
+#: core/validators.py:111
+msgid "Please enter a valid IP address."
+msgstr "Inserisci un indirizzo IP valido."
+
+#: core/validators.py:115
+msgid "Empty values are not allowed here."
+msgstr "I valori vuoti non sono ammessi qui."
+
+#: core/validators.py:119
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Sono ammessi soltanto caratteri numerici."
+
+#: core/validators.py:123
+msgid "This value can't be comprised solely of digits."
+msgstr "Questo valore non può essere composto solo da cifre."
+
+#: core/validators.py:128 forms/fields.py:161
+msgid "Enter a whole number."
+msgstr "Inserisci un numero intero."
+
+#: core/validators.py:132
+msgid "Only alphabetical characters are allowed here."
+msgstr "Sono ammessi solo caratteri alfabetici."
+
+#: core/validators.py:147
+#, python-format
+msgid "Invalid date: %s"
+msgstr "Data non valida: %s"
+
+#: core/validators.py:152 db/models/fields/__init__.py:569
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Inserisci una data valida in formato AAAA-MM-GG."
+
+#: core/validators.py:157
+msgid "Enter a valid time in HH:MM format."
+msgstr "Inserisci un ora valida in formato OO:MM."
+
+#: core/validators.py:161
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Inserisci una data/ora valida in formato AAAA-MM-GG OO:MM."
+
+#: core/validators.py:166 forms/fields.py:412
+msgid "Enter a valid e-mail address."
+msgstr "Inserisci un indirizzo e-mail valido."
+
+#: core/validators.py:178 core/validators.py:470 forms/fields.py:430
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Non è stato inviato alcun file. Verifica il tipo di codifica della form."
+
+#: core/validators.py:189 forms/fields.py:470
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr "Carica un'immagine valida. Il file caricato non è un'immagine o è corrotto."
+
+#: core/validators.py:196
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "La URL %s non punta ad un'immagine valida."
+
+#: core/validators.py:200
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"I numeri di telefono devono essere in formato XXX-XXX-XXXX . \"%s\" non è "
+"valido."
+
+#: core/validators.py:208
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "La URL %s non punta ad un video QuickTime valido."
+
+#: core/validators.py:212
+msgid "A valid URL is required."
+msgstr "Inserisci una URL valida."
+
+#: core/validators.py:226
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"È richiesto HTML valido. Gli errori sono i seguenti:\n"
+"%s"
+
+#: core/validators.py:233
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "XML malformato: %s"
+
+#: core/validators.py:250
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "URL non valida: %s"
+
+#: core/validators.py:255 core/validators.py:257
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "La URL %s è un link non funzionante."
+
+#: core/validators.py:263
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Inserisci un valido nome di stato USA abbreviato."
+
+#: core/validators.py:277
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Modera i termini: la parola %s non è ammessa."
+msgstr[1] "Modera i termini: le parole %s non sono ammesse."
+
+#: core/validators.py:284
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Questo campo deve corrispondere al campo '%s'."
+
+#: core/validators.py:303
+msgid "Please enter something for at least one field."
+msgstr "Inserisci qualcosa in almeno un campo."
+
+#: core/validators.py:312 core/validators.py:323
+msgid "Please enter both fields or leave them both empty."
+msgstr "Inserisci entrambi i campi o lasciarli entrambi vuoti."
+
+#: core/validators.py:331
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Questo campo è obbligatorio se %(field)s è %(value)s"
+
+#: core/validators.py:344
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Questo campo è obbligatorio se %(field)s non è %(value)s"
+
+#: core/validators.py:363
+msgid "Duplicate values are not allowed."
+msgstr "Non sono ammessi valori duplicati."
+
+#: core/validators.py:378
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Questo valore deve essere compreso tra %(lower)s e %(upper)s."
+
+#: core/validators.py:380
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Questo valore deve essere almeno pari a %s."
+
+#: core/validators.py:382
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Questo valore non deve essere maggiore di %s."
+
+#: core/validators.py:423
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Questo valore deve essere una potenza di %s."
+
+#: core/validators.py:433
+msgid "Please enter a valid decimal number."
+msgstr "Inserisci un numero decimale valido."
+
+#: core/validators.py:440
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural "Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Inserisci un numero decimale con non più di %s cifra in totale."
+msgstr[1] "Inserisci un numero decimale con non più di %s cifre in totale."
+
+#: core/validators.py:443
+#, python-format
+msgid "Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural "Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] ""
+"Inserisci un numero decimale la cui parte intera sia composta da non più di %"
+"s cifra."
+msgstr[1] ""
+"Inserisci un numero decimale la cui parte intera sia composta da non più di %"
+"s cifre."
+
+#: core/validators.py:446
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural "Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "Inserisci un decimale con non più di %s cifra decimale."
+msgstr[1] "Inserisci un decimale con non più di %s cifre decimali."
+
+#: core/validators.py:454
+msgid "Please enter a valid floating point number."
+msgstr "Inserisci un numero decimale valido."
+
+#: core/validators.py:463
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Verifica che il file caricato sia grande almeno %s byte."
+
+#: core/validators.py:464
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Verifica che il file caricato non sia più grande di %s byte."
+
+#: core/validators.py:481
+msgid "The format for this field is wrong."
+msgstr "Il formato di questo campo non è valido."
+
+#: core/validators.py:496
+msgid "This field is invalid."
+msgstr "Questo campo non è valido."
+
+#: core/validators.py:532
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Impossibile recupera alcunché da %s."
+
+#: core/validators.py:535
+#, python-format
+msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"La URL %(url)s ha restituito un header Content-Type non valido: '%"
+"(contenttype)s'."
+
+#: core/validators.py:568
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Chiudi il tag %(tag)s a linea %(line)s. (La linea inizia con \"%(start)s"
+"\".)"
+
+#: core/validators.py:572
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Il testo che comincia a linea %(line)s non e' ammesso in quel contesto. (La "
+"linea comincia con \"%(start)s\".)"
+
+#: core/validators.py:577
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"%(attr)s\" a linea %(line)s non è un attributo valido. (La linea comincia "
+"con \"%(start)s\".)"
+
+#: core/validators.py:582
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\" a linea %(line)s non è un tag valido. (La linea comincia con "
+"\"%(start)s\".)"
+
+#: core/validators.py:586
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Un tag a linea %(line)s manca di uno o più attributi richiesti. (La linea "
+"comincia con \"%(start)s\".)"
+
+#: core/validators.py:591
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"L'attributo \"%(attr)s\" a linea %(line)s ha un valore non valido. (La linea "
+"comincia con \"%(start)s\".)"
+
+#: db/models/manipulators.py:304
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "Un %(object)s·con questo·%(type)s·esiste già per questo·%(field)s."
+
+#: db/models/fields/__init__.py:46
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "Un %(optname)s·con questo·%(fieldname)s·esiste già."
+
+#: db/models/fields/__init__.py:170 db/models/fields/__init__.py:343
+#: db/models/fields/files.py:168 db/models/fields/files.py:179
+#: forms/fields.py:52 oldforms/__init__.py:370
+msgid "This field is required."
+msgstr "Questo campo è obbligatorio."
+
+#: db/models/fields/__init__.py:457
+msgid "This value must be an integer."
+msgstr "Questo valore deve essere un intero."
+
+#: db/models/fields/__init__.py:503
+msgid "This value must be either True or False."
+msgstr "Questo valore deve essere True o False."
+
+#: db/models/fields/__init__.py:532
+msgid "This field cannot be null."
+msgstr "Questo campo non può essere nullo."
+
+#: db/models/fields/__init__.py:634 db/models/fields/__init__.py:651
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format."
+msgstr "Inserisci una data/ora valida nel formato AAAA-MM-GG OO:MM[ss[.uuuuuu]]."
+
+#: db/models/fields/__init__.py:707
+msgid "This value must be a decimal number."
+msgstr "Questo valore deve essere un numero decimale."
+
+#: db/models/fields/__init__.py:854
+msgid "This value must be either None, True or False."
+msgstr "Questo valore deve essere None, True o False."
+
+#: db/models/fields/__init__.py:969 db/models/fields/__init__.py:982
+msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format."
+msgstr "Inserisci un ora valida nel formato OO:MM[ss[.uuuuuu]]."
+
+#: db/models/fields/files.py:188
+msgid "Enter a valid filename."
+msgstr "Inserisci un nome di file valido."
+
+#: db/models/fields/related.py:92
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Inserisci un %s valido."
+
+#: db/models/fields/related.py:759
+msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Tieni premuto \"Control\", o \"Command\" su Mac, per selezionarne più di "
+"uno."
+
+#: db/models/fields/related.py:839
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural "Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "Inserisci un ID valido per %(self)s. Il valore %(value)r non è valido."
+msgstr[1] "Inserisci ID validi per %(self)s. I valori %(value)r non sono validi."
+
+#: forms/fields.py:53
+msgid "Enter a valid value."
+msgstr "Inserisci un valore valido."
+
+#: forms/fields.py:133
+#, python-format
+msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+msgstr ""
+"Assicurarsi che questo valore non contenga più di %(max)d caratteri (ne ha %"
+"(length)d)."
+
+#: forms/fields.py:134
+#, python-format
+msgid "Ensure this value has at least %(min)d characters (it has %(length)d)."
+msgstr ""
+"Assicurarsi che questo valore contenga almeno %(min)d caratteri (ne ha %"
+"(length)d)."
+
+#: forms/fields.py:162 forms/fields.py:191 forms/fields.py:220
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Assicurarsi che questo valore sia minore o uguale a %s."
+
+#: forms/fields.py:163 forms/fields.py:192 forms/fields.py:221
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Assicurarsi che questo valore sia maggiore o uguale a %s."
+
+#: forms/fields.py:190 forms/fields.py:219
+msgid "Enter a number."
+msgstr "Inserisci un numero."
+
+#: forms/fields.py:222
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr "Assicurarsi che non vi siano più di %s cifre in totale."
+
+#: forms/fields.py:223
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr "Assicurarsi che non vi siano più di %s cifre decimali."
+
+#: forms/fields.py:224
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr "Assicurarsi che non vi siano più di %s cifre prima della virgola."
+
+#: forms/fields.py:272 forms/fields.py:802
+msgid "Enter a valid date."
+msgstr "Inserisci una data valida."
+
+#: forms/fields.py:305 forms/fields.py:803
+msgid "Enter a valid time."
+msgstr "Inserisci un ora valida."
+
+#: forms/fields.py:344
+msgid "Enter a valid date/time."
+msgstr "Inserisci una coppia data/ora valida."
+
+#: forms/fields.py:431
+msgid "No file was submitted."
+msgstr "Nessun file è stato inviato."
+
+#: forms/fields.py:432 oldforms/__init__.py:689
+msgid "The submitted file is empty."
+msgstr "Il file inviato è vuoto."
+
+#: forms/fields.py:531
+msgid "Enter a valid URL."
+msgstr "Inserisci una URL valida."
+
+#: forms/fields.py:532
+msgid "This URL appears to be a broken link."
+msgstr "Questa URL non sembra funzionare."
+
+#: forms/fields.py:600 forms/fields.py:651
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "Scegli un'opzione valida. '%(value)s non compare tra quelle disponibili."
+
+#: forms/fields.py:652 forms/fields.py:713 forms/models.py:589
+msgid "Enter a list of values."
+msgstr "Inserisci una lista di valori."
+
+#: forms/fields.py:831
+msgid "Enter a valid IPv4 address."
+msgstr "Inserisci un indirizzo IPv4 valido."
+
+#: forms/models.py:522
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr ""
+"Scegli un'opzione valida. La scelta effettuata non compare tra quelle "
+"disponibili."
+
+#: forms/models.py:590
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Scegli un'opzione valida. %s non compare tra quelle disponibili."
+
+#: oldforms/__init__.py:405
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Assicurarsi che il testo sia più corto di %s carattere."
+msgstr[1] "Assicurarsi che il testo sia più corto di %s caratteri."
+
+#: oldforms/__init__.py:410
+msgid "Line breaks are not allowed here."
+msgstr "Non sono ammessi a capo manuali qui."
+
+#: oldforms/__init__.py:508 oldforms/__init__.py:582 oldforms/__init__.py:621
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Scegli un'opzione valida; '%(data)s' non è presente in %(choices)s."
+
+#: oldforms/__init__.py:750
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Inserisci un numero intero compreso tra -32.768 e 32.767 ."
+
+#: oldforms/__init__.py:760
+msgid "Enter a positive number."
+msgstr "Inserisci un numero positivo."
+
+#: oldforms/__init__.py:770
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Inserisci un numero intero compreso tra 0 e 32.767 ."
+
+#: template/defaultfilters.py:698
+msgid "yes,no,maybe"
+msgstr "sì,no,forse"
+
+#: template/defaultfilters.py:729
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d byte"
+msgstr[1] "%(size)d byte"
+
+#: template/defaultfilters.py:731
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f KB"
+
+#: template/defaultfilters.py:733
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: template/defaultfilters.py:734
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#: utils/dateformat.py:41
+msgid "p.m."
+msgstr "p.m."
+
+#: utils/dateformat.py:42
+msgid "a.m."
+msgstr "a.m."
+
+#: utils/dateformat.py:47
+msgid "PM"
+msgstr "PM"
+
+#: utils/dateformat.py:48
+msgid "AM"
+msgstr "AM"
+
+#: utils/dateformat.py:97
+msgid "midnight"
+msgstr "mezzanotte"
+
+#: utils/dateformat.py:99
+msgid "noon"
+msgstr "mezzogiorno"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "lunedì"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "martedì"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "mercoledì"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "giovedì"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "venerdì"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "sabato"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "domenica"
+
+#: utils/dates.py:10
+msgid "Mon"
+msgstr "lun"
+
+#: utils/dates.py:10
+msgid "Tue"
+msgstr "mar"
+
+#: utils/dates.py:10
+msgid "Wed"
+msgstr "mer"
+
+#: utils/dates.py:10
+msgid "Thu"
+msgstr "gio"
+
+#: utils/dates.py:10
+msgid "Fri"
+msgstr "ven"
+
+#: utils/dates.py:11
+msgid "Sat"
+msgstr "sab"
+
+#: utils/dates.py:11
+msgid "Sun"
+msgstr "dom"
+
+#: utils/dates.py:18
+msgid "January"
+msgstr "gennaio"
+
+#: utils/dates.py:18
+msgid "February"
+msgstr "febbraio"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "March"
+msgstr "marzo"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "April"
+msgstr "aprile"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "May"
+msgstr "maggio"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "June"
+msgstr "giugno"
+
+#: utils/dates.py:19 utils/dates.py:31
+msgid "July"
+msgstr "luglio"
+
+#: utils/dates.py:19
+msgid "August"
+msgstr "agosto"
+
+#: utils/dates.py:19
+msgid "September"
+msgstr "settembre"
+
+#: utils/dates.py:19
+msgid "October"
+msgstr "ottobre"
+
+#: utils/dates.py:19
+msgid "November"
+msgstr "novembre"
+
+#: utils/dates.py:20
+msgid "December"
+msgstr "dicembre"
+
+#: utils/dates.py:23
+msgid "jan"
+msgstr "gen"
+
+#: utils/dates.py:23
+msgid "feb"
+msgstr "feb"
+
+#: utils/dates.py:23
+msgid "mar"
+msgstr "mar"
+
+#: utils/dates.py:23
+msgid "apr"
+msgstr "apr"
+
+#: utils/dates.py:23
+msgid "may"
+msgstr "mag"
+
+#: utils/dates.py:23
+msgid "jun"
+msgstr "giu"
+
+#: utils/dates.py:24
+msgid "jul"
+msgstr "lug"
+
+#: utils/dates.py:24
+msgid "aug"
+msgstr "ago"
+
+#: utils/dates.py:24
+msgid "sep"
+msgstr "set"
+
+#: utils/dates.py:24
+msgid "oct"
+msgstr "ott"
+
+#: utils/dates.py:24
+msgid "nov"
+msgstr "nov"
+
+#: utils/dates.py:24
+msgid "dec"
+msgstr "dic"
+
+#: utils/dates.py:31
+msgid "Jan."
+msgstr "gen."
+
+#: utils/dates.py:31
+msgid "Feb."
+msgstr "feb."
+
+#: utils/dates.py:32
+msgid "Aug."
+msgstr "ago."
+
+#: utils/dates.py:32
+msgid "Sept."
+msgstr "set."
+
+#: utils/dates.py:32
+msgid "Oct."
+msgstr "ott."
+
+#: utils/dates.py:32
+msgid "Nov."
+msgstr "nov."
+
+#: utils/dates.py:32
+msgid "Dec."
+msgstr "dic."
+
+#: utils/text.py:128
+msgid "or"
+msgstr "o"
+
+#: utils/timesince.py:21
+msgid "year"
+msgid_plural "years"
+msgstr[0] "anno"
+msgstr[1] "anni"
+
+#: utils/timesince.py:22
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mese"
+msgstr[1] "mesi"
+
+#: utils/timesince.py:23
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "settimana"
+msgstr[1] "settimane"
+
+#: utils/timesince.py:24
+msgid "day"
+msgid_plural "days"
+msgstr[0] "giorno"
+msgstr[1] "giorni"
+
+#: utils/timesince.py:25
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "ora"
+msgstr[1] "ore"
+
+#: utils/timesince.py:26
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuto"
+msgstr[1] "minuti"
+
+#: utils/timesince.py:46
+msgid "minutes"
+msgstr "minuti"
+
+#: utils/timesince.py:51
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr "%(number)d %(type)s"
+
+#: utils/timesince.py:57
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ", %(number)d %(type)s"
+
+#: utils/translation/trans_real.py:401
+msgid "DATE_FORMAT"
+msgstr "j F Y"
+
+#: utils/translation/trans_real.py:402
+msgid "DATETIME_FORMAT"
+msgstr "j F Y, H:i"
+
+#: utils/translation/trans_real.py:403
+msgid "TIME_FORMAT"
+msgstr "H:i"
+
+#: utils/translation/trans_real.py:419
+msgid "YEAR_MONTH_FORMAT"
+msgstr "Y F"
+
+#: utils/translation/trans_real.py:420
+msgid "MONTH_DAY_FORMAT"
+msgstr "F j"
+
+#: views/generic/create_update.py:129
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "%(verbose_name)s è stato creato correttamente."
+
+#: views/generic/create_update.py:172
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "%(verbose_name)s è stato aggiornato correttamente."
+
+#: views/generic/create_update.py:214
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "%(verbose_name)s è stato cancellato."
+
diff --git a/webapp/django/conf/locale/it/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/it/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..827f6e4
--- /dev/null
+++ b/webapp/django/conf/locale/it/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/it/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/it/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..8f6d6dd
--- /dev/null
+++ b/webapp/django/conf/locale/it/LC_MESSAGES/djangojs.po
@@ -0,0 +1,121 @@
+# translation of djangojs.po to Italiano
+# Italian translation for the django-admin JS files
+# Copyright (C) 2006 the Lawrence Journal-World
+# This file is distributed under the same license as the Django package.
+msgid ""
+msgstr ""
+"Project-Id-Version: Django vSVN\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-08-10 16:19+0200\n"
+"PO-Revision-Date: 2008-08-14 18:36+0200\n"
+"Last-Translator: Nicola Larosa <nico@tekNico.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms:  nplurals=2; plural=(n != 1);\n"
+"X-Generator: KBabel 1.11.4\n"
+"Language-Team: Italiano\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "%s disponibili"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Scegli tutto"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Aggiungi"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Rimuovi"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "%s scelti"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Fai le tue scelte e clicca "
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Cancella tutto"
+
+#: contrib/admin/media/js/calendar.js:24
+#: contrib/admin/media/js/dateparse.js:32
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"gennaio febbraio marzo aprile maggio giugno luglio agosto settembre ottobre "
+"novembre dicembre"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "D L M M G V S"
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "domenica lunedì martedì mercoledì giovedì venerdì sabato"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr "Mostra"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr "Nascondi"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Now"
+msgstr "Adesso"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
+msgid "Clock"
+msgstr "Orologio"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
+msgid "Choose a time"
+msgstr "Scegli un orario"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "Midnight"
+msgstr "Mezzanotte"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "6 a.m."
+msgstr "6 del mattino"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
+msgid "Noon"
+msgstr "Mezzogiorno"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
+msgid "Cancel"
+msgstr "Annulla"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
+msgid "Today"
+msgstr "Oggi"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
+msgid "Calendar"
+msgstr "Calendario"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
+msgid "Yesterday"
+msgstr "Ieri"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
+msgid "Tomorrow"
+msgstr "Domani"
+
diff --git a/webapp/django/conf/locale/ja/LC_MESSAGES/django.mo b/webapp/django/conf/locale/ja/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..907d7df
--- /dev/null
+++ b/webapp/django/conf/locale/ja/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/ja/LC_MESSAGES/django.po b/webapp/django/conf/locale/ja/LC_MESSAGES/django.po
new file mode 100644
index 0000000..675d41a
--- /dev/null
+++ b/webapp/django/conf/locale/ja/LC_MESSAGES/django.po
@@ -0,0 +1,4510 @@
+# Translation of django.po to japanese.
+
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-08-17 10:54+0900\n"
+"PO-Revision-Date: 2008-08-17 11:05+0900\n"
+"Last-Translator: Takashi Matsuo <matsuo.takashi@gmail.com>\n"
+"Language-Team: Japanese <django-ja@googlegroups.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: conf/global_settings.py:44
+msgid "Arabic"
+msgstr "アラビア語"
+
+#: conf/global_settings.py:45
+msgid "Bengali"
+msgstr "ベンガル語"
+
+#: conf/global_settings.py:46
+msgid "Bulgarian"
+msgstr "ブルガリア語"
+
+#: conf/global_settings.py:47
+msgid "Catalan"
+msgstr "カタロニア語"
+
+#: conf/global_settings.py:48
+msgid "Czech"
+msgstr "チェコ語"
+
+#: conf/global_settings.py:49
+msgid "Welsh"
+msgstr "ウェールズ語"
+
+#: conf/global_settings.py:50
+msgid "Danish"
+msgstr "デンマーク語"
+
+#: conf/global_settings.py:51
+msgid "German"
+msgstr "ドイツ語"
+
+#: conf/global_settings.py:52
+msgid "Greek"
+msgstr "ギリシャ語"
+
+#: conf/global_settings.py:53
+msgid "English"
+msgstr "英語"
+
+#: conf/global_settings.py:54
+msgid "Spanish"
+msgstr "スペイン語"
+
+#: conf/global_settings.py:55
+msgid "Estonian"
+msgstr "エストニア語"
+
+#: conf/global_settings.py:56
+msgid "Argentinean Spanish"
+msgstr "アルゼンチンスペイン語"
+
+#: conf/global_settings.py:57
+msgid "Basque"
+msgstr "バスク語"
+
+#: conf/global_settings.py:58
+msgid "Persian"
+msgstr "ペルシア語"
+
+#: conf/global_settings.py:59
+msgid "Finnish"
+msgstr "フィンランド語"
+
+#: conf/global_settings.py:60
+msgid "French"
+msgstr "フランス語"
+
+#: conf/global_settings.py:61
+msgid "Irish"
+msgstr "アイルランド語"
+
+#: conf/global_settings.py:62
+msgid "Galician"
+msgstr "ガリシア語"
+
+#: conf/global_settings.py:63
+msgid "Hungarian"
+msgstr "ハンガリー語"
+
+#: conf/global_settings.py:64
+msgid "Hebrew"
+msgstr "ヘブライ語"
+
+#: conf/global_settings.py:65
+msgid "Croatian"
+msgstr "クロアチア語"
+
+#: conf/global_settings.py:66
+msgid "Icelandic"
+msgstr "アイスランド語"
+
+#: conf/global_settings.py:67
+msgid "Italian"
+msgstr "イタリア語"
+
+#: conf/global_settings.py:68
+msgid "Japanese"
+msgstr "日本語"
+
+#: conf/global_settings.py:69
+msgid "Georgian"
+msgstr "グルジア語"
+
+#: conf/global_settings.py:70
+msgid "Korean"
+msgstr "韓国語"
+
+#: conf/global_settings.py:71
+msgid "Khmer"
+msgstr "クメール語"
+
+#: conf/global_settings.py:72
+msgid "Kannada"
+msgstr "カンナダ語"
+
+#: conf/global_settings.py:73
+msgid "Latvian"
+msgstr "ラトビア語"
+
+#: conf/global_settings.py:74
+msgid "Lithuanian"
+msgstr "リトアニア語"
+
+#: conf/global_settings.py:75
+msgid "Macedonian"
+msgstr "マケドニア語"
+
+#: conf/global_settings.py:76
+msgid "Dutch"
+msgstr "オランダ語"
+
+#: conf/global_settings.py:77
+msgid "Norwegian"
+msgstr "ノルウェー語"
+
+#: conf/global_settings.py:78
+msgid "Polish"
+msgstr "ポーランド語"
+
+#: conf/global_settings.py:79
+msgid "Portugese"
+msgstr "ポルトガル語"
+
+#: conf/global_settings.py:80
+msgid "Brazilian Portuguese"
+msgstr "ブラジルポルトガル語"
+
+#: conf/global_settings.py:81
+msgid "Romanian"
+msgstr "ルーマニア語"
+
+#: conf/global_settings.py:82
+msgid "Russian"
+msgstr "ロシア語"
+
+#: conf/global_settings.py:83
+msgid "Slovak"
+msgstr "スロバキア語"
+
+#: conf/global_settings.py:84
+msgid "Slovenian"
+msgstr "スロヴェニア語"
+
+#: conf/global_settings.py:85
+msgid "Serbian"
+msgstr "セルビア語"
+
+#: conf/global_settings.py:86
+msgid "Swedish"
+msgstr "スウェーデン語"
+
+#: conf/global_settings.py:87
+msgid "Tamil"
+msgstr "タミル語"
+
+#: conf/global_settings.py:88
+msgid "Telugu"
+msgstr "テルグ語"
+
+#: conf/global_settings.py:89
+msgid "Turkish"
+msgstr "トルコ語"
+
+#: conf/global_settings.py:90
+msgid "Ukrainian"
+msgstr "ウクライナ語"
+
+#: conf/global_settings.py:91
+msgid "Simplified Chinese"
+msgstr "簡体字中国語"
+
+#: conf/global_settings.py:92
+msgid "Traditional Chinese"
+msgstr "繁体字中国語"
+
+#: contrib/admin/filterspecs.py:44
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>%s で絞り込む</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:74 contrib/admin/filterspecs.py:92
+#: contrib/admin/filterspecs.py:147 contrib/admin/filterspecs.py:173
+msgid "All"
+msgstr "全て"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Any date"
+msgstr "いつでも"
+
+#: contrib/admin/filterspecs.py:114
+msgid "Today"
+msgstr "今日"
+
+#: contrib/admin/filterspecs.py:117
+msgid "Past 7 days"
+msgstr "過去 7 日間"
+
+#: contrib/admin/filterspecs.py:119
+msgid "This month"
+msgstr "今月"
+
+#: contrib/admin/filterspecs.py:121
+msgid "This year"
+msgstr "今年"
+
+#: contrib/admin/filterspecs.py:147 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "Yes"
+msgstr "はい"
+
+#: contrib/admin/filterspecs.py:147 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "No"
+msgstr "いいえ"
+
+#: contrib/admin/filterspecs.py:154 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "Unknown"
+msgstr "不明"
+
+#: contrib/admin/models.py:19
+msgid "action time"
+msgstr "操作時刻"
+
+#: contrib/admin/models.py:22
+msgid "object id"
+msgstr "オブジェクト ID"
+
+#: contrib/admin/models.py:23
+msgid "object repr"
+msgstr "オブジェクトの文字列表現"
+
+#: contrib/admin/models.py:24
+msgid "action flag"
+msgstr "操作種別"
+
+#: contrib/admin/models.py:25
+msgid "change message"
+msgstr "変更メッセージ"
+
+#: contrib/admin/models.py:28
+msgid "log entry"
+msgstr "ログエントリ"
+
+#: contrib/admin/models.py:29
+msgid "log entries"
+msgstr "ログエントリ"
+
+#: contrib/admin/options.py:143 contrib/admin/options.py:202
+msgid "None"
+msgstr "None"
+
+#: contrib/admin/options.py:413
+#, python-format
+msgid "Changed %s."
+msgstr "%s を変更しました。"
+
+#: contrib/admin/options.py:413 contrib/admin/options.py:423
+#: core/validators.py:279 db/models/manipulators.py:305
+msgid "and"
+msgstr "と"
+
+#: contrib/admin/options.py:418
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\"を追加しました。"
+
+#: contrib/admin/options.py:422
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" の %(list)s を変更しました。"
+
+#: contrib/admin/options.py:427
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" を削除しました。"
+
+#: contrib/admin/options.py:431
+msgid "No fields changed."
+msgstr "変更はありませんでした。"
+
+#: contrib/admin/options.py:492 contrib/auth/admin.py:50
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" を追加しました。"
+
+#: contrib/admin/options.py:496 contrib/admin/options.py:529
+#: contrib/auth/admin.py:55
+msgid "You may edit it again below."
+msgstr "続けて編集できます。"
+
+#: contrib/admin/options.py:506 contrib/admin/options.py:539
+#, python-format
+msgid "You may add another %s below."
+msgstr "続けて別の %s を追加できます。"
+
+#: contrib/admin/options.py:527
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" を変更しました。"
+
+#: contrib/admin/options.py:535
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" を追加しました。続けて編集できます。"
+
+#: contrib/admin/options.py:601
+#, python-format
+msgid "Add %s"
+msgstr "%s を追加"
+
+#: contrib/admin/options.py:678
+#, python-format
+msgid "Change %s"
+msgstr "%s を変更"
+
+#: contrib/admin/options.py:709
+msgid "Database error"
+msgstr "データベースエラー"
+
+#: contrib/admin/options.py:758
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" を削除しました。"
+
+#: contrib/admin/options.py:765
+msgid "Are you sure?"
+msgstr "よろしいですか?"
+
+#: contrib/admin/options.py:792
+#, python-format
+msgid "Change history: %s"
+msgstr "変更履歴: %s"
+
+#: contrib/admin/sites.py:18 contrib/admin/views/decorators.py:16
+#: contrib/auth/forms.py:72 contrib/comments/views/comments.py:56
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"正しいユーザ名とパスワードを入力してください (大文字小文字は区別します) 。"
+
+#: contrib/admin/sites.py:238 contrib/admin/views/decorators.py:68
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"再ログインしてください。ログインセッションが有効期間切れしてしまいました。入"
+"力データは失われておりませんのでご安心ください。"
+
+#: contrib/admin/sites.py:245 contrib/admin/views/decorators.py:75
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"ブラウザがクッキーの使用を許可していないようです。クッキーの使用を許可して、"
+"もう一度このページを表示してください。"
+
+#: contrib/admin/sites.py:259 contrib/admin/sites.py:265
+#: contrib/admin/views/decorators.py:92
+msgid "Usernames cannot contain the '@' character."
+msgstr "ユーザ名には '@' を含められません。"
+
+#: contrib/admin/sites.py:262 contrib/admin/views/decorators.py:88
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "メールアドレスはユーザ名ではありません。 '%s' を試してみてください。"
+
+#: contrib/admin/sites.py:330
+msgid "Site administration"
+msgstr "サイト管理"
+
+#: contrib/admin/sites.py:352 contrib/admin/templates/admin/login.html:27
+#: contrib/admin/templates/registration/password_reset_complete.html:14
+#: contrib/admin/views/decorators.py:30
+msgid "Log in"
+msgstr "ログイン"
+
+#: contrib/admin/util.py:126
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "%(name)s に %(fieldname)s が一つ以上あります: %(obj)s"
+
+#: contrib/admin/util.py:131
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "%(name)s に %(fieldname)s が一つ以上あります:"
+
+#: contrib/admin/widgets.py:65
+msgid "Date:"
+msgstr "日付:"
+
+#: contrib/admin/widgets.py:65
+msgid "Time:"
+msgstr "時刻:"
+
+#: contrib/admin/widgets.py:89
+msgid "Currently:"
+msgstr "現在:"
+
+#: contrib/admin/widgets.py:89
+msgid "Change:"
+msgstr "変更:"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "ページが見つかりません"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "申し訳ありませんが、お探しのページは見つかりませんでした。"
+
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/change_form.html:17
+#: contrib/admin/templates/admin/change_list.html:8
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/auth/user/change_password.html:10
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_reset_complete.html:4
+#: contrib/admin/templates/registration/password_reset_confirm.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "ホーム"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "サーバエラー"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "サーバエラー (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "サーバエラー <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"エラーが発生しました。エラーをサイトの管理者にメールで報告しましたので、近い"
+"うちに修正されるはずです。しばらくお待ちください。"
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "ようこそ"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "ドキュメント"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:13
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+msgid "Change password"
+msgstr "パスワードの変更"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/comments/templates/comments/form.html:6
+msgid "Log out"
+msgstr "ログアウト"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django サイト管理"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django 管理サイト"
+
+#: contrib/admin/templates/admin/change_form.html:19
+#: contrib/admin/templates/admin/index.html:29
+msgid "Add"
+msgstr "追加"
+
+#: contrib/admin/templates/admin/change_form.html:26
+#: contrib/admin/templates/admin/object_history.html:5
+msgid "History"
+msgstr "履歴"
+
+#: contrib/admin/templates/admin/change_form.html:27
+msgid "View on site"
+msgstr "サイト上で表示"
+
+#: contrib/admin/templates/admin/change_form.html:37
+#: contrib/admin/templates/admin/auth/user/change_password.html:22
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "下記のエラーを修正してください。"
+
+#: contrib/admin/templates/admin/change_list.html:16
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s を追加"
+
+#: contrib/admin/templates/admin/change_list.html:26
+msgid "Filter"
+msgstr "フィルタ"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+#: contrib/admin/templates/admin/edit_inline/tabular.html:15
+msgid "Delete"
+msgstr "削除"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:15
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"%(object_name)s '%(escaped_object)s' の削除時に関連づけられたオブジェクトも削"
+"除しようとしましたが、あなたのアカウントには以下のタイプのオブジェクトを削除"
+"するパーミッションがありません:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:22
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"%(object_name)s \"%(escaped_object)s\"を削除しますか? 関連づけられている以下"
+"のオブジェクトも全て削除されます:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:27
+msgid "Yes, I'm sure"
+msgstr "はい。"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "%(filter_title)s で絞り込む"
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "%(name)s アプリケーションで利用可能なモデル"
+
+#: contrib/admin/templates/admin/index.html:19
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:35
+msgid "Change"
+msgstr "変更"
+
+#: contrib/admin/templates/admin/index.html:45
+msgid "You don't have permission to edit anything."
+msgstr "変更のためのパーミッションがありません。"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "Recent Actions"
+msgstr "最近行った操作"
+
+#: contrib/admin/templates/admin/index.html:54
+msgid "My Actions"
+msgstr "操作"
+
+#: contrib/admin/templates/admin/index.html:58
+msgid "None available"
+msgstr "利用不可"
+
+#: contrib/admin/templates/admin/invalid_setup.html:7
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"データベースの設定に問題があるようです。適切なテーブルが作られていること、適"
+"切なユーザでデータベースのデータを読み込めることを確認してください。"
+
+#: contrib/admin/templates/admin/login.html:19
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+msgid "Username:"
+msgstr "ユーザ名:"
+
+#: contrib/admin/templates/admin/login.html:22
+#: contrib/comments/templates/comments/form.html:8
+msgid "Password:"
+msgstr "パスワード:"
+
+#: contrib/admin/templates/admin/object_history.html:16
+msgid "Date/time"
+msgstr "日付/時刻"
+
+#: contrib/admin/templates/admin/object_history.html:17
+msgid "User"
+msgstr "ユーザ"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Action"
+msgstr "操作"
+
+#: contrib/admin/templates/admin/object_history.html:24
+msgid "DATE_WITH_TIME_FULL"
+msgstr "Y/m/d H:i:s"
+
+#: contrib/admin/templates/admin/object_history.html:32
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"このオブジェクトには変更履歴がありません。おそらくこの管理サイトで追加したも"
+"のではありません。"
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "全件表示"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "検索"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s 件"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "全 %(full_result_count)s 件"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "新規保存"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "保存してもう一つ追加"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "保存して編集を続ける"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "保存"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"まずユーザ名とパスワードを登録してください。その後詳細情報が編集可能になりま"
+"す。"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:13
+#: contrib/auth/forms.py:14 contrib/auth/forms.py:51
+msgid "Username"
+msgstr "ユーザ名"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:20
+#: contrib/admin/templates/admin/auth/user/change_password.html:33
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:52 contrib/auth/forms.py:176
+msgid "Password"
+msgstr "パスワード"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:26
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+#: contrib/auth/forms.py:177
+msgid "Password (again)"
+msgstr "パスワード(確認用)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:27
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+msgid "Enter the same password as above, for verification."
+msgstr "確認のため、再度パスワードを入力してください。"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:26
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+"<strong>%(username)s</strong>さんの新しいパスワードを入力してください。"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "ご利用ありがとうございました。"
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "もう一度ログイン"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "パスワードの変更"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "パスワードを変更しました"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "あなたのパスワードは変更されました"
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"セキュリティ上の理由から元のパスワードの入力が必要です。新しいパスワードは正"
+"しく入力したか確認できるように二度入力してください。"
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "元のパスワード:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+#: contrib/admin/templates/registration/password_reset_confirm.html:18
+msgid "New password:"
+msgstr "新しいパスワード:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+#: contrib/admin/templates/registration/password_reset_confirm.html:20
+msgid "Confirm password:"
+msgstr "新しいパスワード (確認用) :"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+#: contrib/admin/templates/registration/password_reset_confirm.html:21
+msgid "Change my password"
+msgstr "パスワードの変更"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:4
+#: contrib/admin/templates/registration/password_reset_confirm.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+msgid "Password reset"
+msgstr "パスワードをリセット"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:6
+#: contrib/admin/templates/registration/password_reset_complete.html:10
+msgid "Password reset complete"
+msgstr "パスワードがリセットされました"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:12
+msgid "Your password has been set.  You may go ahead and log in now."
+msgstr "パスワードがセットされました。ログインしてください。"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:4
+msgid "Password reset confirmation"
+msgstr "パスワードリセットの確認"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:12
+msgid "Enter new password"
+msgstr "新しいパスワードを入力してください"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:14
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr "確認のために、新しいパスワードを二回入力してください。"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:26
+msgid "Password reset unsuccessful"
+msgstr "パスワードのリセットに失敗しました"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:28
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used.  Please request a new password reset."
+msgstr ""
+"パスワードリセットのリンクが不正です。おそらくこのリンクは既に使われていま"
+"す。もう一度パスワードリセットしてください。"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "パスワードをリセットしました"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed you instructions for setting your password to the e-mail "
+"address you submitted. You should be receiving it shortly."
+msgstr ""
+"登録されているメールアドレスにパスワードリセットの方法を送信しました。まもな"
+"く届くでしょう。"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr ""
+"あなたのパスワードはリセットされましたので、ここにメールでご連絡差し上げま"
+"す。"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "リセットされたのは %(site_name)s のアカウントです。"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+msgid "Please go to the following page and choose a new password:"
+msgstr "次のページで新しいパスワードを選んでください:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:9
+msgid "Your username, in case you've forgotten:"
+msgstr "あなたのユーザ名 (念のため):"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Thanks for using our site!"
+msgstr "ご利用ありがとうございました!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+#, python-format
+msgid "The %(site_name)s team"
+msgstr " %(site_name)s チーム"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll e-mail "
+"instructions for setting a new one."
+msgstr ""
+"パスワードをお忘れですか?メールアドレスを入力してください。パスワードのリ"
+"セット方法をメールでお知らせします。"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "メールアドレス"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "パスワードをリセット"
+
+#: contrib/admin/templatetags/admin_list.py:284
+msgid "All dates"
+msgstr "いつでも"
+
+#: contrib/admin/views/main.py:65
+#, python-format
+msgid "Select %s"
+msgstr "%s を選択"
+
+#: contrib/admin/views/main.py:65
+#, python-format
+msgid "Select %s to change"
+msgstr "変更する %s を選択"
+
+#: contrib/admin/views/template.py:36 contrib/sites/models.py:38
+msgid "site"
+msgstr "サイト"
+
+#: contrib/admin/views/template.py:38
+msgid "template"
+msgstr "テンプレート"
+
+#: contrib/admindocs/views.py:53 contrib/admindocs/views.py:55
+#: contrib/admindocs/views.py:57
+msgid "tag:"
+msgstr "タグ"
+
+#: contrib/admindocs/views.py:87 contrib/admindocs/views.py:89
+#: contrib/admindocs/views.py:91
+msgid "filter:"
+msgstr "フィルタ"
+
+#: contrib/admindocs/views.py:153 contrib/admindocs/views.py:155
+#: contrib/admindocs/views.py:157
+msgid "view:"
+msgstr "ビュー"
+
+#: contrib/admindocs/views.py:187
+#, python-format
+msgid "App %r not found"
+msgstr "アプリケーション %r が見つかりません"
+
+#: contrib/admindocs/views.py:194
+#, python-format
+msgid "Model %(model_name)r not found in app %(app_label)r"
+msgstr ""
+"モデル %(model_name)r が %(app_label)r アプリケーションに見つかりません"
+
+#: contrib/admindocs/views.py:206
+#, python-format
+msgid "the related `%(app_label)s.%(data_type)s` object"
+msgstr "`%(app_label)s.%(data_type)s` (関連オブジェクト)"
+
+#: contrib/admindocs/views.py:206 contrib/admindocs/views.py:228
+#: contrib/admindocs/views.py:242 contrib/admindocs/views.py:247
+msgid "model:"
+msgstr "モデル :"
+
+#: contrib/admindocs/views.py:237
+#, python-format
+msgid "related `%(app_label)s.%(object_name)s` objects"
+msgstr "`%(app_label)s.%(object_name)s` (関連オブジェクト)"
+
+#: contrib/admindocs/views.py:242
+#, python-format
+msgid "all %s"
+msgstr "全ての %s"
+
+#: contrib/admindocs/views.py:247
+#, python-format
+msgid "number of %s"
+msgstr "%s の数"
+
+#: contrib/admindocs/views.py:253
+#, python-format
+msgid "Fields on %s objects"
+msgstr "%s のフィールド"
+
+#: contrib/admindocs/views.py:317 contrib/admindocs/views.py:328
+#: contrib/admindocs/views.py:330 contrib/admindocs/views.py:336
+#: contrib/admindocs/views.py:337 contrib/admindocs/views.py:339
+msgid "Integer"
+msgstr "整数"
+
+#: contrib/admindocs/views.py:318
+msgid "Boolean (Either True or False)"
+msgstr "ブール値 (真: True または偽: False)"
+
+#: contrib/admindocs/views.py:319 contrib/admindocs/views.py:338
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "文字列 ( %(max_length)s 字まで )"
+
+#: contrib/admindocs/views.py:320
+msgid "Comma-separated integers"
+msgstr "カンマ区切りの整数"
+
+#: contrib/admindocs/views.py:321
+msgid "Date (without time)"
+msgstr "日付"
+
+#: contrib/admindocs/views.py:322
+msgid "Date (with time)"
+msgstr "日時"
+
+#: contrib/admindocs/views.py:323
+msgid "Decimal number"
+msgstr "10 進数 (小数可)"
+
+#: contrib/admindocs/views.py:324
+msgid "E-mail address"
+msgstr "メールアドレス"
+
+#: contrib/admindocs/views.py:325 contrib/admindocs/views.py:326
+#: contrib/admindocs/views.py:329
+msgid "File path"
+msgstr "ファイルの場所"
+
+#: contrib/admindocs/views.py:327
+msgid "Floating point number"
+msgstr "浮動小数点"
+
+#: contrib/admindocs/views.py:331 contrib/comments/models.py:89
+msgid "IP address"
+msgstr "IP アドレス"
+
+#: contrib/admindocs/views.py:333
+msgid "Boolean (Either True, False or None)"
+msgstr "ブール値 (真: True 、偽: False または None)"
+
+#: contrib/admindocs/views.py:334
+msgid "Relation to parent model"
+msgstr "親モデルへのリレーション"
+
+#: contrib/admindocs/views.py:335
+msgid "Phone number"
+msgstr "電話番号"
+
+#: contrib/admindocs/views.py:340
+msgid "Text"
+msgstr "テキスト"
+
+#: contrib/admindocs/views.py:341
+msgid "Time"
+msgstr "時刻"
+
+#: contrib/admindocs/views.py:342 contrib/flatpages/admin.py:8
+#: contrib/flatpages/models.py:8
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admindocs/views.py:343
+msgid "U.S. state (two uppercase letters)"
+msgstr "アメリカの州 (大文字二文字で)"
+
+#: contrib/admindocs/views.py:344
+msgid "XML text"
+msgstr "XMLテキスト"
+
+#: contrib/admindocs/views.py:370
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s はurlpatternオブジェクトでは無いようです"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "ブックマークレット"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:4
+msgid "Documentation bookmarklets"
+msgstr "ドキュメントへのブックマークレット"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:8
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">ブックマークレットをインストールするには、リンクをブック"
+"マークツールバーにドラッグするか、\n"
+"リンクを右クリックしてブックマークに追加してください。これで\n"
+"サイトのどのページからでもブックマークレットを選択可能になりました。\n"
+"ブックマークレットによっては、内部ネットワークにあるコンピュータからこのサイ"
+"トを\n"
+"参照していなければならないことがあります。内部ネットワークにあるかどうか不明"
+"な場合は、システム管理者に確認してください。</p>\n"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:18
+msgid "Documentation for this page"
+msgstr "このページのドキュメント"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:19
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr "各ページから、ページを生成したビューのドキュメントにジャンプします。"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:21
+msgid "Show object ID"
+msgstr "オブジェクト ID を表示"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:22
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"単一のオブジェクトを表示するページのコンテンツタイプと一意な IDを表示します。"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:24
+msgid "Edit this object (current window)"
+msgstr "オブジェクトを (現在のウィンドウで) 編集"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:25
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "単一のオブジェクトを表示するページの管理ページへジャンプします。"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:27
+msgid "Edit this object (new window)"
+msgstr "オブジェクトを (新しいウィンドウで) 編集"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:28
+msgid "As above, but opens the admin page in a new window."
+msgstr "上と同じですが、新しいウィンドウで管理ページを開きます。"
+
+#: contrib/auth/admin.py:21
+msgid "Personal info"
+msgstr "個人情報"
+
+#: contrib/auth/admin.py:22
+msgid "Permissions"
+msgstr "パーミッション"
+
+#: contrib/auth/admin.py:23
+msgid "Important dates"
+msgstr "重要な日程"
+
+#: contrib/auth/admin.py:24
+msgid "Groups"
+msgstr "グループ"
+
+#: contrib/auth/admin.py:60
+msgid "Add user"
+msgstr "ユーザを追加"
+
+#: contrib/auth/admin.py:85
+msgid "Password changed successfully."
+msgstr "パスワードを変更しました"
+
+#: contrib/auth/admin.py:91
+#, python-format
+msgid "Change password: %s"
+msgstr "パスワードの変更: %s"
+
+#: contrib/auth/forms.py:15 contrib/auth/models.py:137
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr ""
+"この項目は必須です。半角アルファベット、半角数字、半角アンダーバーで30文字以"
+"下にしてください。"
+
+#: contrib/auth/forms.py:16 core/validators.py:72
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "半角の英数字およびアンダースコア以外は使用できません。"
+
+#: contrib/auth/forms.py:18
+msgid "Password confirmation"
+msgstr "パスワードの確認"
+
+#: contrib/auth/forms.py:30
+msgid "A user with that username already exists."
+msgstr "同じユーザ名が既に登録済みです。"
+
+#: contrib/auth/forms.py:36 contrib/auth/forms.py:146
+#: contrib/auth/forms.py:188
+msgid "The two password fields didn't match."
+msgstr "確認用パスワードが一致しません。"
+
+#: contrib/auth/forms.py:74 contrib/comments/views/comments.py:58
+msgid "This account is inactive."
+msgstr "アカウントが無効です。"
+
+#: contrib/auth/forms.py:79 contrib/comments/views/comments.py:49
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"お使いのブラウザはクッキーを有効にしていないようです。ログインにはクッキーが"
+"必要です。"
+
+#: contrib/auth/forms.py:92
+msgid "E-mail"
+msgstr "メールアドレス"
+
+#: contrib/auth/forms.py:101
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr "メールアドレスの一致するユーザはいません。本当に登録しましたか?"
+
+#: contrib/auth/forms.py:126
+#, python-format
+msgid "Password reset on %s"
+msgstr "%s にパスワードをリセット"
+
+#: contrib/auth/forms.py:134
+msgid "New password"
+msgstr "新しいパスワード"
+
+#: contrib/auth/forms.py:135
+msgid "New password confirmation"
+msgstr "新しいパスワード(確認用)"
+
+#: contrib/auth/forms.py:160
+msgid "Old password"
+msgstr "元のパスワード"
+
+#: contrib/auth/forms.py:168
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "元のパスワードが間違っています。もう一度入力してください。"
+
+#: contrib/auth/models.py:73 contrib/auth/models.py:96
+msgid "name"
+msgstr "名前"
+
+#: contrib/auth/models.py:75
+msgid "codename"
+msgstr "コード名"
+
+#: contrib/auth/models.py:78
+msgid "permission"
+msgstr "パーミッション"
+
+#: contrib/auth/models.py:79 contrib/auth/models.py:97
+msgid "permissions"
+msgstr "パーミッション"
+
+#: contrib/auth/models.py:100
+msgid "group"
+msgstr "グループ"
+
+#: contrib/auth/models.py:101 contrib/auth/models.py:147
+msgid "groups"
+msgstr "グループ"
+
+#: contrib/auth/models.py:137
+msgid "username"
+msgstr "ユーザ名"
+
+#: contrib/auth/models.py:138
+msgid "first name"
+msgstr "名"
+
+#: contrib/auth/models.py:139
+msgid "last name"
+msgstr "姓"
+
+#: contrib/auth/models.py:140
+msgid "e-mail address"
+msgstr "メールアドレス"
+
+#: contrib/auth/models.py:141
+msgid "password"
+msgstr "パスワード"
+
+#: contrib/auth/models.py:141
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"'[algo]$[salt]$[hexdigest]'形式か、<a href=\"password/\">パスワード変更フォー"
+"ム</a>を使ってください。"
+
+#: contrib/auth/models.py:142
+msgid "staff status"
+msgstr "スタッフ権限"
+
+#: contrib/auth/models.py:142
+msgid "Designates whether the user can log into this admin site."
+msgstr "ユーザが管理サイトにログイン可能かどうかを示します。"
+
+#: contrib/auth/models.py:143
+msgid "active"
+msgstr "有効"
+
+#: contrib/auth/models.py:143
+msgid ""
+"Designates whether this user should be treated as active. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"ユーザがアクティブかどうかを示します。アカウントを消す代わりに選択を解除して"
+"ください。"
+
+#: contrib/auth/models.py:144
+msgid "superuser status"
+msgstr "スーパーユーザ権限"
+
+#: contrib/auth/models.py:144
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr "全ての権限を持っているとみなされます。"
+
+#: contrib/auth/models.py:145
+msgid "last login"
+msgstr "最終ログイン"
+
+#: contrib/auth/models.py:146
+msgid "date joined"
+msgstr "登録日"
+
+#: contrib/auth/models.py:148
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"手動で付与したパーミッションに加え、所属しているグループに付与された全ての"
+"パーミッションを獲得します。"
+
+#: contrib/auth/models.py:149
+msgid "user permissions"
+msgstr "ユーザパーミッション"
+
+#: contrib/auth/models.py:153
+msgid "user"
+msgstr "ユーザ"
+
+#: contrib/auth/models.py:154
+msgid "users"
+msgstr "ユーザ"
+
+#: contrib/auth/models.py:309
+msgid "message"
+msgstr "メッセージ"
+
+#: contrib/auth/views.py:50
+msgid "Logged out"
+msgstr "ログアウト"
+
+#: contrib/comments/models.py:71 contrib/comments/models.py:164
+msgid "object ID"
+msgstr "オブジェクト ID"
+
+#: contrib/comments/models.py:72
+msgid "headline"
+msgstr "新着情報"
+
+#: contrib/comments/models.py:73 contrib/comments/models.py:95
+#: contrib/comments/models.py:165
+msgid "comment"
+msgstr "コメント"
+
+#: contrib/comments/models.py:74
+msgid "rating #1"
+msgstr "レーティング #1"
+
+#: contrib/comments/models.py:75
+msgid "rating #2"
+msgstr "レーティング #2"
+
+#: contrib/comments/models.py:76
+msgid "rating #3"
+msgstr "レーティング #3"
+
+#: contrib/comments/models.py:77
+msgid "rating #4"
+msgstr "レーティング #4"
+
+#: contrib/comments/models.py:78
+msgid "rating #5"
+msgstr "レーティング #5"
+
+#: contrib/comments/models.py:79
+msgid "rating #6"
+msgstr "レーティング #6"
+
+#: contrib/comments/models.py:80
+msgid "rating #7"
+msgstr "レーティング #7"
+
+#: contrib/comments/models.py:81
+msgid "rating #8"
+msgstr "レーティング #8"
+
+#: contrib/comments/models.py:86
+msgid "is valid rating"
+msgstr "は有効なレーティングです"
+
+#: contrib/comments/models.py:87 contrib/comments/models.py:167
+msgid "date/time submitted"
+msgstr "コメント投稿日時"
+
+#: contrib/comments/models.py:88 contrib/comments/models.py:168
+msgid "is public"
+msgstr "は公開中です"
+
+#: contrib/comments/models.py:90
+msgid "is removed"
+msgstr "は削除されました"
+
+#: contrib/comments/models.py:90
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"コメントが不適切な場合はチェックを入れてください。「コメントは削除されまし"
+"た」と表示されるようになります。"
+
+#: contrib/comments/models.py:96
+msgid "comments"
+msgstr "コメント"
+
+#: contrib/comments/models.py:128 contrib/comments/models.py:199
+msgid "Content object"
+msgstr "コンテンツオブジェクト"
+
+#: contrib/comments/models.py:156
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"%(user)s が %(date)s に投稿\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:166
+msgid "person's name"
+msgstr "名前"
+
+#: contrib/comments/models.py:169
+msgid "ip address"
+msgstr "IP アドレス"
+
+#: contrib/comments/models.py:171
+msgid "approved by staff"
+msgstr "スタッフの承認済み"
+
+#: contrib/comments/models.py:175
+msgid "free comment"
+msgstr "フリーコメント"
+
+#: contrib/comments/models.py:176
+msgid "free comments"
+msgstr "フリーコメント"
+
+#: contrib/comments/models.py:227
+msgid "score"
+msgstr "スコア"
+
+#: contrib/comments/models.py:228
+msgid "score date"
+msgstr "スコアされた日"
+
+#: contrib/comments/models.py:232
+msgid "karma score"
+msgstr "カルマスコア"
+
+#: contrib/comments/models.py:233
+msgid "karma scores"
+msgstr "カルマスコア"
+
+#: contrib/comments/models.py:237
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(user)s により %(score)d 点のレーティング"
+
+#: contrib/comments/models.py:254
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"このコメントは %(user)s がフラグ付けしました。:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:262
+msgid "flag date"
+msgstr "フラグ日"
+
+#: contrib/comments/models.py:266
+msgid "user flag"
+msgstr "ユーザフラグ"
+
+#: contrib/comments/models.py:267
+msgid "user flags"
+msgstr "ユーザフラグ"
+
+#: contrib/comments/models.py:271
+#, python-format
+msgid "Flag by %r"
+msgstr "%r によるフラグ"
+
+#: contrib/comments/models.py:277
+msgid "deletion date"
+msgstr "削除日"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "モデレータ削除"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "モデレータ削除"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "%r によるモデレータ削除"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "パスワードをお忘れですか?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "レーティング"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "必須"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "オプション"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "写真を登録"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "コメント:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "コメントをプレビュー"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "ユーザ名:"
+
+#: contrib/comments/views/comments.py:76
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr ""
+"他のレーティングを入力した場合は、このレーティングは必ず入力してください。"
+
+#: contrib/comments/views/comments.py:160
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"このコメントを投稿したユーザのコメント数は %(count)s 未満です。コメント:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:165
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"このコメントを投稿したユーザの詳細は不明です:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:238
+#: contrib/comments/views/comments.py:331
+msgid "Only POSTs are allowed"
+msgstr "POST メソッドのみ有効です。"
+
+#: contrib/comments/views/comments.py:242
+#: contrib/comments/views/comments.py:335
+msgid "One or more of the required fields wasn't submitted"
+msgstr "必須項目がいくつか入力されていません。"
+
+#: contrib/comments/views/comments.py:246
+#: contrib/comments/views/comments.py:337
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "だれかがコメントフォームを改竄しています (セキュリティ侵害です)"
+
+#: contrib/comments/views/comments.py:256
+#: contrib/comments/views/comments.py:343
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"コメントフォームの 'target' パラメータが不正です。 -- オブジェクト IDが不正な"
+"値でした"
+
+#: contrib/comments/views/comments.py:307
+#: contrib/comments/views/comments.py:372
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "コメントの「プレビュー」「投稿」種別が不明です。"
+
+#: contrib/comments/views/karma.py:21
+msgid "Anonymous users cannot vote"
+msgstr "非ログインユーザは投票できません。"
+
+#: contrib/comments/views/karma.py:25
+msgid "Invalid comment ID"
+msgstr "コメント ID が不正です"
+
+#: contrib/comments/views/karma.py:27
+msgid "No voting for yourself"
+msgstr "自分には投票できません。"
+
+#: contrib/contenttypes/models.py:67
+msgid "python model class name"
+msgstr "Python モデルクラス名"
+
+#: contrib/contenttypes/models.py:71
+msgid "content type"
+msgstr "コンテンツタイプ"
+
+#: contrib/contenttypes/models.py:72
+msgid "content types"
+msgstr "コンテンツタイプ"
+
+#: contrib/flatpages/admin.py:9
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"例: '/about/contact/'. 先頭と最後にスラッシュがあるか確認してください。"
+
+#: contrib/flatpages/admin.py:11 core/validators.py:76
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"半角の英数字、アンダースコア、ダッシュ、スラッシュ以外は使用できません。"
+
+#: contrib/flatpages/admin.py:22
+msgid "Advanced options"
+msgstr "詳細設定"
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "タイトル"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "内容"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "コメントを有効にする"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "テンプレート名"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"例: 'flatpages/contact_page.html'. 指定しなければ、デフォルト設定"
+"の'flatpages/default.html' を使います。"
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "登録が必要です"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "チェックした場合、ログインしたユーザだけがページを参照できます。"
+
+#: contrib/flatpages/models.py:19
+msgid "flat page"
+msgstr "フラットページ"
+
+#: contrib/flatpages/models.py:20
+msgid "flat pages"
+msgstr "フラットページ"
+
+#: contrib/gis/forms/fields.py:10
+msgid "No geometry value provided."
+msgstr "Geo値がありません。"
+
+#: contrib/gis/forms/fields.py:11
+msgid "Invalid Geometry value."
+msgstr "Geo値が不正です"
+
+#: contrib/gis/forms/fields.py:12
+msgid "Invalid Geometry type."
+msgstr "Geometry タイプが不正です。"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "th"
+msgstr "番目"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "st"
+msgstr "番目"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "nd"
+msgstr "番目"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "rd"
+msgstr "番目"
+
+#: contrib/humanize/templatetags/humanize.py:51
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f 百万"
+
+#: contrib/humanize/templatetags/humanize.py:54
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f 十億"
+
+#: contrib/humanize/templatetags/humanize.py:57
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f 兆"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "one"
+msgstr "1"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "two"
+msgstr "2"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "three"
+msgstr "3"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "four"
+msgstr "4"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "five"
+msgstr "5"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "six"
+msgstr "6"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "seven"
+msgstr "7"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "eight"
+msgstr "8"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "nine"
+msgstr "9"
+
+#: contrib/humanize/templatetags/humanize.py:93
+msgid "today"
+msgstr "今日"
+
+#: contrib/humanize/templatetags/humanize.py:95
+msgid "tomorrow"
+msgstr "明日"
+
+#: contrib/humanize/templatetags/humanize.py:97
+msgid "yesterday"
+msgstr "昨日"
+
+#: contrib/localflavor/ar/forms.py:27
+msgid "Enter a postal code in the format NNNN or ANNNNAAA."
+msgstr "NNNNか、ANNNNAAAの形式で郵便番号を入力してください。"
+
+#: contrib/localflavor/ar/forms.py:49 contrib/localflavor/br/forms.py:96
+#: contrib/localflavor/br/forms.py:135 contrib/localflavor/pe/forms.py:23
+#: contrib/localflavor/pe/forms.py:51
+msgid "This field requires only numbers."
+msgstr "このフィールドは必須です(数値のみ)。"
+
+#: contrib/localflavor/ar/forms.py:50
+msgid "This field requires 7 or 8 digits."
+msgstr "7桁か8桁で入力して下さい。"
+
+#: contrib/localflavor/ar/forms.py:79
+msgid "Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format."
+msgstr ""
+"XX-XXXXXXXX-X か XXXXXXXXXXXX の形式で納税証明単一番号(CUIT)を入力して下さ"
+"い。"
+
+#: contrib/localflavor/ar/forms.py:80
+msgid "Invalid CUIT."
+msgstr "無効な納税証明単一番号(CUIT): %s"
+
+#: contrib/localflavor/at/at_states.py:5
+msgid "Burgenland"
+msgstr "Burgenland"
+
+#: contrib/localflavor/at/at_states.py:6
+msgid "Carinthia"
+msgstr "Carinthia"
+
+#: contrib/localflavor/at/at_states.py:7
+msgid "Lower Austria"
+msgstr "Lower Austria"
+
+#: contrib/localflavor/at/at_states.py:8
+msgid "Upper Austria"
+msgstr "Upper Austria"
+
+#: contrib/localflavor/at/at_states.py:9
+msgid "Salzburg"
+msgstr "Salzburg"
+
+#: contrib/localflavor/at/at_states.py:10
+msgid "Styria"
+msgstr "Styria"
+
+#: contrib/localflavor/at/at_states.py:11
+msgid "Tyrol"
+msgstr "Tyrol"
+
+#: contrib/localflavor/at/at_states.py:12
+msgid "Vorarlberg"
+msgstr "Vorarlberg"
+
+#: contrib/localflavor/at/at_states.py:13
+msgid "Vienna"
+msgstr "Vienna"
+
+#: contrib/localflavor/at/forms.py:20 contrib/localflavor/ch/forms.py:16
+#: contrib/localflavor/no/forms.py:12
+msgid "Enter a zip code in the format XXXX."
+msgstr "XXXXの形式でZipコードを入力してください。"
+
+#: contrib/localflavor/at/forms.py:48
+msgid "Enter a valid Austrian Social Security Number in XXXX XXXXXX format."
+msgstr "XXXX XXXXXX の形式でオーストリア社会保障番号を入力してください。"
+
+#: contrib/localflavor/au/forms.py:16
+msgid "Enter a 4 digit post code."
+msgstr "4桁でポストコードを入力してください。"
+
+#: contrib/localflavor/br/forms.py:21
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "XXXXX-XXXの形式でZipコードを入力してください。"
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "電話番号は XX-XXXX-XXXX 形式で入力してください。"
+
+#: contrib/localflavor/br/forms.py:58
+msgid ""
+"Select a valid brazilian state. That state is not one of the available "
+"states."
+msgstr "ブラジルの州から選択してください。選択したものは候補にありません。"
+
+#: contrib/localflavor/br/forms.py:94
+msgid "Invalid CPF number."
+msgstr "ブラジル納税者番号(CPF)が無効です。"
+
+#: contrib/localflavor/br/forms.py:95
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr "11桁の数字か14文字で入力してください。"
+
+#: contrib/localflavor/br/forms.py:134
+msgid "Invalid CNPJ number."
+msgstr "納税登録番号(CNPJ)が正しくありません。"
+
+#: contrib/localflavor/br/forms.py:136
+msgid "This field requires at least 14 digits"
+msgstr "14桁以上で入力して下さい。"
+
+#: contrib/localflavor/ca/forms.py:17
+msgid "Enter a postal code in the format XXX XXX."
+msgstr "XXX XXXの形式で郵便番号を入力してください。"
+
+#: contrib/localflavor/ca/forms.py:88
+msgid "Enter a valid Canadian Social Insurance number in XXX-XXX-XXX format."
+msgstr "XXX-XXX-XXX の形式で、カナダ社会保障番号を入力して下さい。"
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr "Aargau"
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr "Appenzell Innerrhoden"
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr "Appenzell Ausserrhoden"
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr "Basel-Stadt"
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr "Basel-Land"
+
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr "Berne"
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr "Fribourg"
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr "Geneva"
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr "Glarus"
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr "Graubuenden"
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr "Jura"
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr "Lucerne"
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr "Neuchatel"
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr "Nidwalden"
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr "Obwalden"
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr "Schaffhausen"
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr "Schwyz"
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr "Solothurn"
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr "St. Gallen"
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr "Thurgau"
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr "Ticino"
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr "Uri"
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr "Valais"
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr "Vaud"
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr "Zug"
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr "Zurich"
+
+#: contrib/localflavor/ch/forms.py:64
+msgid ""
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
+msgstr ""
+"スイス アイデンティティかパスポート番号を X1234567<0 か 1234567890 の形式で入"
+"力して下さい。"
+
+#: contrib/localflavor/cl/forms.py:29
+msgid "Enter a valid Chilean RUT."
+msgstr "正しいチリ納税者番号(RUT)を入力してください。"
+
+#: contrib/localflavor/cl/forms.py:30
+msgid "Enter a valid Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr "XX.XXX.XXX-Xの形式でチリ納税者番号(RUT)を入力してください。"
+
+#: contrib/localflavor/cl/forms.py:31
+msgid "The Chilean RUT is not valid."
+msgstr "このチリ納税者番号(RUT)は無効です。"
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr "Baden-Wuerttemberg"
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr "Bavaria"
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr "Berlin"
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr "Brandenburg"
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr "Bremen"
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr "Hamburg"
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr "Hessen"
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr "Mecklenburg-Western Pomerania"
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr "Lower Saxony"
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr "North Rhine-Westphalia"
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr "Rhineland-Palatinate"
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr "Saarland"
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr "Saxony"
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr "Saxony-Anhalt"
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr "Schleswig-Holstein"
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr "Thuringia"
+
+#: contrib/localflavor/de/forms.py:14 contrib/localflavor/fi/forms.py:12
+#: contrib/localflavor/fr/forms.py:15
+msgid "Enter a zip code in the format XXXXX."
+msgstr "XXXXXの形式でZipコードを入力してください。"
+
+#: contrib/localflavor/de/forms.py:41
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr ""
+"XXXXXXXXXXX-XXXXXXX-XXXXXXX-X の形式でドイツIDカード番号を入力して下さい。"
+
+#: contrib/localflavor/es/es_provinces.py:5
+msgid "Arava"
+msgstr "Arava"
+
+#: contrib/localflavor/es/es_provinces.py:6
+msgid "Albacete"
+msgstr "Albacete"
+
+#: contrib/localflavor/es/es_provinces.py:7
+msgid "Alacant"
+msgstr "Alacant"
+
+#: contrib/localflavor/es/es_provinces.py:8
+msgid "Almeria"
+msgstr "Almeria"
+
+#: contrib/localflavor/es/es_provinces.py:9
+msgid "Avila"
+msgstr "Avila"
+
+#: contrib/localflavor/es/es_provinces.py:10
+msgid "Badajoz"
+msgstr "Badajoz"
+
+#: contrib/localflavor/es/es_provinces.py:11
+msgid "Illes Balears"
+msgstr "Illes Balears"
+
+#: contrib/localflavor/es/es_provinces.py:12
+msgid "Barcelona"
+msgstr "Barcelona"
+
+#: contrib/localflavor/es/es_provinces.py:13
+msgid "Burgos"
+msgstr "Burgos"
+
+#: contrib/localflavor/es/es_provinces.py:14
+msgid "Caceres"
+msgstr "Caceres"
+
+#: contrib/localflavor/es/es_provinces.py:15
+msgid "Cadiz"
+msgstr "Cadiz"
+
+#: contrib/localflavor/es/es_provinces.py:16
+msgid "Castello"
+msgstr "Castello"
+
+#: contrib/localflavor/es/es_provinces.py:17
+msgid "Ciudad Real"
+msgstr "Ciudad Real"
+
+#: contrib/localflavor/es/es_provinces.py:18
+msgid "Cordoba"
+msgstr "Cordoba"
+
+#: contrib/localflavor/es/es_provinces.py:19
+msgid "A Coruna"
+msgstr "A Coruna"
+
+#: contrib/localflavor/es/es_provinces.py:20
+msgid "Cuenca"
+msgstr "Cuenca"
+
+#: contrib/localflavor/es/es_provinces.py:21
+msgid "Girona"
+msgstr "Girona"
+
+#: contrib/localflavor/es/es_provinces.py:22
+msgid "Granada"
+msgstr "Granada"
+
+#: contrib/localflavor/es/es_provinces.py:23
+msgid "Guadalajara"
+msgstr "Guadalajara"
+
+#: contrib/localflavor/es/es_provinces.py:24
+msgid "Guipuzkoa"
+msgstr "Guipuzkoa"
+
+#: contrib/localflavor/es/es_provinces.py:25
+msgid "Huelva"
+msgstr "Huelva"
+
+#: contrib/localflavor/es/es_provinces.py:26
+msgid "Huesca"
+msgstr "Huesca"
+
+#: contrib/localflavor/es/es_provinces.py:27
+msgid "Jaen"
+msgstr "Jaen"
+
+#: contrib/localflavor/es/es_provinces.py:28
+msgid "Leon"
+msgstr "Leon"
+
+#: contrib/localflavor/es/es_provinces.py:29
+msgid "Lleida"
+msgstr "Lleida"
+
+#: contrib/localflavor/es/es_provinces.py:30
+#: contrib/localflavor/es/es_regions.py:17
+msgid "La Rioja"
+msgstr "La Rioja"
+
+#: contrib/localflavor/es/es_provinces.py:31
+msgid "Lugo"
+msgstr "Lugo"
+
+#: contrib/localflavor/es/es_provinces.py:32
+#: contrib/localflavor/es/es_regions.py:18
+msgid "Madrid"
+msgstr "Madrid"
+
+#: contrib/localflavor/es/es_provinces.py:33
+msgid "Malaga"
+msgstr "Malaga"
+
+#: contrib/localflavor/es/es_provinces.py:34
+msgid "Murcia"
+msgstr "Murcia"
+
+#: contrib/localflavor/es/es_provinces.py:35
+msgid "Navarre"
+msgstr "Navarre"
+
+#: contrib/localflavor/es/es_provinces.py:36
+msgid "Ourense"
+msgstr "Ourense"
+
+#: contrib/localflavor/es/es_provinces.py:37
+msgid "Asturias"
+msgstr "Asturias"
+
+#: contrib/localflavor/es/es_provinces.py:38
+msgid "Palencia"
+msgstr "Palencia"
+
+#: contrib/localflavor/es/es_provinces.py:39
+msgid "Las Palmas"
+msgstr "Las Palmas"
+
+#: contrib/localflavor/es/es_provinces.py:40
+msgid "Pontevedra"
+msgstr "Pontevedra"
+
+#: contrib/localflavor/es/es_provinces.py:41
+msgid "Salamanca"
+msgstr "Salamanca"
+
+#: contrib/localflavor/es/es_provinces.py:42
+msgid "Santa Cruz de Tenerife"
+msgstr "Santa Cruz de Tenerife"
+
+#: contrib/localflavor/es/es_provinces.py:43
+#: contrib/localflavor/es/es_regions.py:11
+msgid "Cantabria"
+msgstr "Cantabria"
+
+#: contrib/localflavor/es/es_provinces.py:44
+msgid "Segovia"
+msgstr "Segovia"
+
+#: contrib/localflavor/es/es_provinces.py:45
+msgid "Seville"
+msgstr "Seville"
+
+#: contrib/localflavor/es/es_provinces.py:46
+msgid "Soria"
+msgstr "Soria"
+
+#: contrib/localflavor/es/es_provinces.py:47
+msgid "Tarragona"
+msgstr "Tarragona"
+
+#: contrib/localflavor/es/es_provinces.py:48
+msgid "Teruel"
+msgstr "Teruel"
+
+#: contrib/localflavor/es/es_provinces.py:49
+msgid "Toledo"
+msgstr "Toledo"
+
+#: contrib/localflavor/es/es_provinces.py:50
+msgid "Valencia"
+msgstr "Valencia"
+
+#: contrib/localflavor/es/es_provinces.py:51
+msgid "Valladolid"
+msgstr "Valladolid"
+
+#: contrib/localflavor/es/es_provinces.py:52
+msgid "Bizkaia"
+msgstr "Bizkaia"
+
+#: contrib/localflavor/es/es_provinces.py:53
+msgid "Zamora"
+msgstr "Zamora"
+
+#: contrib/localflavor/es/es_provinces.py:54
+msgid "Zaragoza"
+msgstr "Zaragoza"
+
+#: contrib/localflavor/es/es_provinces.py:55
+msgid "Ceuta"
+msgstr "Ceuta"
+
+#: contrib/localflavor/es/es_provinces.py:56
+msgid "Melilla"
+msgstr "Melilla"
+
+#: contrib/localflavor/es/es_regions.py:5
+msgid "Andalusia"
+msgstr "Andalusia"
+
+#: contrib/localflavor/es/es_regions.py:6
+msgid "Aragon"
+msgstr "Aragon"
+
+#: contrib/localflavor/es/es_regions.py:7
+msgid "Principality of Asturias"
+msgstr "Principality of Asturias"
+
+#: contrib/localflavor/es/es_regions.py:8
+msgid "Balearic Islands"
+msgstr "Balearic Islands"
+
+#: contrib/localflavor/es/es_regions.py:9
+msgid "Basque Country"
+msgstr "Basque Country"
+
+#: contrib/localflavor/es/es_regions.py:10
+msgid "Canary Islands"
+msgstr "Canary Islands"
+
+#: contrib/localflavor/es/es_regions.py:12
+msgid "Castile-La Mancha"
+msgstr "Castile-La Mancha"
+
+#: contrib/localflavor/es/es_regions.py:13
+msgid "Castile and Leon"
+msgstr "Castile and Leon"
+
+#: contrib/localflavor/es/es_regions.py:14
+msgid "Catalonia"
+msgstr "Catalonia"
+
+#: contrib/localflavor/es/es_regions.py:15
+msgid "Extremadura"
+msgstr "Extremadura"
+
+#: contrib/localflavor/es/es_regions.py:16
+msgid "Galicia"
+msgstr "Galicia"
+
+#: contrib/localflavor/es/es_regions.py:19
+msgid "Region of Murcia"
+msgstr "Region of Murcia"
+
+#: contrib/localflavor/es/es_regions.py:20
+msgid "Foral Community of Navarre"
+msgstr "Foral Community of Navarre"
+
+#: contrib/localflavor/es/es_regions.py:21
+msgid "Valencian Community"
+msgstr "Valencian Community"
+
+#: contrib/localflavor/es/forms.py:19
+msgid "Enter a valid postal code in the range and format 01XXX - 52XXX."
+msgstr "01XXX から 52XXXの形式で郵便番号を入力してください。"
+
+#: contrib/localflavor/es/forms.py:39
+msgid ""
+"Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or "
+"9XXXXXXXX."
+msgstr ""
+"6XXXXXXXX か 8XXXXXXXX か 9XXXXXXXX かのいずれかの形式で電話番号を入力してく"
+"ださい。"
+
+#: contrib/localflavor/es/forms.py:66
+msgid "Please enter a valid NIF, NIE, or CIF."
+msgstr ""
+"スペイン納税者番号(NIF)かスペイン住民番号(N.I.E)かスペイン企業番号(CIF)のいず"
+"れかを入力してください。"
+
+#: contrib/localflavor/es/forms.py:67
+msgid "Please enter a valid NIF or NIE."
+msgstr "スペイン納税者番号(NIF)かスペイン住民番号(N.I.E)を入力してください。"
+
+#: contrib/localflavor/es/forms.py:68
+msgid "Invalid checksum for NIF."
+msgstr "スペイン納税者番号(NIF)のチェックサムがあいません。"
+
+#: contrib/localflavor/es/forms.py:69
+msgid "Invalid checksum for NIE."
+msgstr "スペイン住民番号(N.I.E)のチェックサムがあいません。"
+
+#: contrib/localflavor/es/forms.py:70
+msgid "Invalid checksum for CIF."
+msgstr "スペイン企業番号(CIF)のチェックサムがあいません。"
+
+#: contrib/localflavor/es/forms.py:142
+msgid ""
+"Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX."
+msgstr "XXXX-XXXX-XX-XXXXXXXXXX の形式で銀行口座番号を入力して下さい。"
+
+#: contrib/localflavor/es/forms.py:143
+msgid "Invalid checksum for bank account number."
+msgstr "銀行口座番号のチェックサムがあいません。"
+
+#: contrib/localflavor/fi/forms.py:28
+msgid "Enter a valid Finnish social security number."
+msgstr "フィンランド社会保証番号を正しく入力してください。"
+
+#: contrib/localflavor/in_/forms.py:14
+msgid "Enter a zip code in the format XXXXXXX."
+msgstr "XXXXXXXの形式でZipコードを入力してください。"
+
+#: contrib/localflavor/is_/forms.py:17
+msgid ""
+"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr "XXXXXか、XXXXX-XXXXの形式でアイスランド納税者番号を入力してください。"
+
+#: contrib/localflavor/is_/forms.py:18
+msgid "The Icelandic identification number is not valid."
+msgstr "アイスランド納税者番号を正しく入力して下さい。"
+
+#: contrib/localflavor/it/forms.py:14
+msgid "Enter a valid zip code."
+msgstr "Zipコードを正しく入力してください。"
+
+#: contrib/localflavor/it/forms.py:43
+msgid "Enter a valid Social Security number."
+msgstr "社会保障番号番号を正しく入力してください。"
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr "VAT番号を正しく入力してください。"
+
+#: contrib/localflavor/jp/forms.py:17
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "XXXXXか、XXXXX-XXXXの形式で郵便番号を入力してください。"
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr "北海道"
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr "青森県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr "岩手県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr "宮城県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr "秋田県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr "山形県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr "福島県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr "茨城県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr "栃木県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr "群馬県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr "埼玉県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr "千葉県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr "東京都"
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr "神奈川県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr "山梨県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr "長野県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr "新潟県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr "富山県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr "石川県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr "福井県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr "岐阜県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr "静岡県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr "愛知県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr "三重県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr "滋賀県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr "京都府"
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr "大阪府"
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr "兵庫県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr "奈良県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr "和歌山県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr "鳥取県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr "島根県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr "岡山県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr "広島県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr "山口県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr "徳島県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr "香川県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr "愛媛県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr "高知県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr "福岡県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr "佐賀県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr "長崎県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr "熊本県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr "大分県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr "宮崎県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr "鹿児島県"
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr "沖縄県"
+
+#: contrib/localflavor/mx/mx_states.py:12
+msgid "Aguascalientes"
+msgstr "Aguascalientes"
+
+#: contrib/localflavor/mx/mx_states.py:13
+msgid "Baja California"
+msgstr "Baja California"
+
+#: contrib/localflavor/mx/mx_states.py:14
+msgid "Baja California Sur"
+msgstr "Baja California Sur"
+
+#: contrib/localflavor/mx/mx_states.py:15
+msgid "Campeche"
+msgstr "Campeche"
+
+#: contrib/localflavor/mx/mx_states.py:16
+msgid "Chihuahua"
+msgstr "Chihuahua"
+
+#: contrib/localflavor/mx/mx_states.py:17
+msgid "Chiapas"
+msgstr "Chiapas"
+
+#: contrib/localflavor/mx/mx_states.py:18
+msgid "Coahuila"
+msgstr "Coahuila"
+
+#: contrib/localflavor/mx/mx_states.py:19
+msgid "Colima"
+msgstr "Colima"
+
+#: contrib/localflavor/mx/mx_states.py:20
+msgid "Distrito Federal"
+msgstr "Distrito Federal"
+
+#: contrib/localflavor/mx/mx_states.py:21
+msgid "Durango"
+msgstr "Durango"
+
+#: contrib/localflavor/mx/mx_states.py:22
+msgid "Guerrero"
+msgstr "Guerrero"
+
+#: contrib/localflavor/mx/mx_states.py:23
+msgid "Guanajuato"
+msgstr "Guanajuato"
+
+#: contrib/localflavor/mx/mx_states.py:24
+msgid "Hidalgo"
+msgstr "Hidalgo"
+
+#: contrib/localflavor/mx/mx_states.py:25
+msgid "Jalisco"
+msgstr "Jalisco"
+
+#: contrib/localflavor/mx/mx_states.py:26
+msgid "Estado de México"
+msgstr "Estado de México"
+
+#: contrib/localflavor/mx/mx_states.py:27
+msgid "Michoacán"
+msgstr "Michoacan"
+
+#: contrib/localflavor/mx/mx_states.py:28
+msgid "Morelos"
+msgstr "Morelos"
+
+#: contrib/localflavor/mx/mx_states.py:29
+msgid "Nayarit"
+msgstr "Nayarit"
+
+#: contrib/localflavor/mx/mx_states.py:30
+msgid "Nuevo León"
+msgstr "Nuevo Leon"
+
+#: contrib/localflavor/mx/mx_states.py:31
+msgid "Oaxaca"
+msgstr "Oaxaca"
+
+#: contrib/localflavor/mx/mx_states.py:32
+msgid "Puebla"
+msgstr "Puebla"
+
+#: contrib/localflavor/mx/mx_states.py:33
+msgid "Querétaro"
+msgstr "Queretaro"
+
+#: contrib/localflavor/mx/mx_states.py:34
+msgid "Quintana Roo"
+msgstr "Quintana Roo"
+
+#: contrib/localflavor/mx/mx_states.py:35
+msgid "Sinaloa"
+msgstr "Sinaloa"
+
+#: contrib/localflavor/mx/mx_states.py:36
+msgid "San Luis Potosí"
+msgstr "San Luis Potosi"
+
+#: contrib/localflavor/mx/mx_states.py:37
+msgid "Sonora"
+msgstr "Sonora"
+
+#: contrib/localflavor/mx/mx_states.py:38
+msgid "Tabasco"
+msgstr "Tabasco"
+
+#: contrib/localflavor/mx/mx_states.py:39
+msgid "Tamaulipas"
+msgstr "Tamaulipas"
+
+#: contrib/localflavor/mx/mx_states.py:40
+msgid "Tlaxcala"
+msgstr "Tlaxcala"
+
+#: contrib/localflavor/mx/mx_states.py:41
+msgid "Veracruz"
+msgstr "Veracruz"
+
+#: contrib/localflavor/mx/mx_states.py:42
+msgid "Yucatán"
+msgstr "Yucatan"
+
+#: contrib/localflavor/mx/mx_states.py:43
+msgid "Zacatecas"
+msgstr "Zacatecas"
+
+#: contrib/localflavor/nl/forms.py:21
+msgid "Enter a valid postal code"
+msgstr "郵便番号を正しく入力してください。"
+
+#: contrib/localflavor/nl/forms.py:52
+msgid "Enter a valid phone number"
+msgstr "電話番号を正しく入力してください。"
+
+#: contrib/localflavor/nl/forms.py:78
+msgid "Enter a valid SoFi number"
+msgstr "社会税務番号(SoFi)を正しく入力してください。"
+
+#: contrib/localflavor/nl/nl_provinces.py:4
+msgid "Drente"
+msgstr "Drente"
+
+#: contrib/localflavor/nl/nl_provinces.py:5
+msgid "Flevoland"
+msgstr "Flevoland"
+
+#: contrib/localflavor/nl/nl_provinces.py:6
+msgid "Friesland"
+msgstr "Friesland"
+
+#: contrib/localflavor/nl/nl_provinces.py:7
+msgid "Gelderland"
+msgstr "Gelderland"
+
+#: contrib/localflavor/nl/nl_provinces.py:8
+msgid "Groningen"
+msgstr "Groningen"
+
+#: contrib/localflavor/nl/nl_provinces.py:9
+msgid "Limburg"
+msgstr "Limburg"
+
+#: contrib/localflavor/nl/nl_provinces.py:10
+msgid "Noord-Brabant"
+msgstr "Noord-Brabant"
+
+#: contrib/localflavor/nl/nl_provinces.py:11
+msgid "Noord-Holland"
+msgstr "Noord-Holland"
+
+#: contrib/localflavor/nl/nl_provinces.py:12
+msgid "Overijssel"
+msgstr "Overijssel"
+
+#: contrib/localflavor/nl/nl_provinces.py:13
+msgid "Utrecht"
+msgstr "Utrecht"
+
+#: contrib/localflavor/nl/nl_provinces.py:14
+msgid "Zeeland"
+msgstr "Zeeland"
+
+#: contrib/localflavor/nl/nl_provinces.py:15
+msgid "Zuid-Holland"
+msgstr "Zuid-Holland"
+
+#: contrib/localflavor/no/forms.py:33
+msgid "Enter a valid Norwegian social security number."
+msgstr "ノルウェー社会保障番号を正しく入力してください。"
+
+#: contrib/localflavor/pe/forms.py:24
+msgid "This field requires 8 digits."
+msgstr "8桁で入力して下さい。"
+
+#: contrib/localflavor/pe/forms.py:52
+msgid "This field requires 11 digits."
+msgstr "11桁で入力して下さい。"
+
+#: contrib/localflavor/pl/forms.py:38
+msgid "National Identification Number consists of 11 digits."
+msgstr "国民識別番号は11文字で入力して下さい。"
+
+#: contrib/localflavor/pl/forms.py:39
+msgid "Wrong checksum for the National Identification Number."
+msgstr "国民識別番号のチェックサムがあいません。"
+
+#: contrib/localflavor/pl/forms.py:71
+msgid ""
+"Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX."
+msgstr "XXXXXか、XXXXX-XXXXの形式で納税者欄(NIP)を入力してください。"
+
+#: contrib/localflavor/pl/forms.py:72
+msgid "Wrong checksum for the Tax Number (NIP)."
+msgstr "税務署登録ID(NIP)のチェックサムがあいません。"
+
+#: contrib/localflavor/pl/forms.py:111
+msgid "National Business Register Number (REGON) consists of 7 or 9 digits."
+msgstr "ポーランド企業番号(REGON)は7文字か9文字で入力して下さい。"
+
+#: contrib/localflavor/pl/forms.py:112
+msgid "Wrong checksum for the National Business Register Number (REGON)."
+msgstr "ポーランド企業番号(REGON)のチェックサムがあいません。"
+
+#: contrib/localflavor/pl/forms.py:155
+msgid "Enter a postal code in the format XX-XXX."
+msgstr "XX-XXXの形式で郵便番号を入力してください。"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:8
+msgid "Lower Silesia"
+msgstr "Lower Silesia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:9
+msgid "Kuyavia-Pomerania"
+msgstr "Kuyavia-Pomerania"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:10
+msgid "Lublin"
+msgstr "Lublin"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:11
+msgid "Lubusz"
+msgstr "Lubusz"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:12
+msgid "Lodz"
+msgstr "Lodz"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:13
+msgid "Lesser Poland"
+msgstr "Lesser Poland"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:14
+msgid "Masovia"
+msgstr "Masovia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:15
+msgid "Opole"
+msgstr "Opole"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:16
+msgid "Subcarpatia"
+msgstr "Subcarpatia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:17
+msgid "Podlasie"
+msgstr "Podlasie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:18
+msgid "Pomerania"
+msgstr "Pomerania"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:19
+msgid "Silesia"
+msgstr "Silesia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:20
+msgid "Swietokrzyskie"
+msgstr "Swietokrzyskie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:21
+msgid "Warmia-Masuria"
+msgstr "Warmia-Masuria"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:22
+msgid "Greater Poland"
+msgstr "Greater Poland"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:23
+msgid "West Pomerania"
+msgstr "West Pomerania"
+
+#: contrib/localflavor/ro/forms.py:19
+msgid "Enter a valid CIF."
+msgstr "CIFを正しく入力してください。"
+
+#: contrib/localflavor/ro/forms.py:56
+msgid "Enter a valid CNP."
+msgstr "CNPを正しく入力してください。"
+
+#: contrib/localflavor/ro/forms.py:141
+msgid "Enter a valid IBAN in ROXX-XXXX-XXXX-XXXX-XXXX-XXXX format"
+msgstr "ROXX-XXXX-XXXX-XXXX-XXXX-XXXX の形式でIBANを入力してください"
+
+#: contrib/localflavor/ro/forms.py:171
+msgid "Phone numbers must be in XXXX-XXXXXX format."
+msgstr "電話番号は XXXX-XXXXXX 形式で入力してください。"
+
+#: contrib/localflavor/ro/forms.py:194
+msgid "Enter a valid postal code in the format XXXXXX"
+msgstr "XXXXXX の形式で郵便番号を入力してください。"
+
+#: contrib/localflavor/sk/forms.py:30
+msgid "Enter a postal code in the format XXXXX or XXX XX."
+msgstr "XXXXXか、XXX XXの形式で郵便番号を入力してください。"
+
+#: contrib/localflavor/sk/sk_districts.py:8
+msgid "Banska Bystrica"
+msgstr "Banska Bystrica"
+
+#: contrib/localflavor/sk/sk_districts.py:9
+msgid "Banska Stiavnica"
+msgstr "Banska Stiavnica"
+
+#: contrib/localflavor/sk/sk_districts.py:10
+msgid "Bardejov"
+msgstr "Bardejov"
+
+#: contrib/localflavor/sk/sk_districts.py:11
+msgid "Banovce nad Bebravou"
+msgstr "Banovce nad Bebravou"
+
+#: contrib/localflavor/sk/sk_districts.py:12
+msgid "Brezno"
+msgstr "Brezno"
+
+#: contrib/localflavor/sk/sk_districts.py:13
+msgid "Bratislava I"
+msgstr "Bratislava I"
+
+#: contrib/localflavor/sk/sk_districts.py:14
+msgid "Bratislava II"
+msgstr "Bratislava II"
+
+#: contrib/localflavor/sk/sk_districts.py:15
+msgid "Bratislava III"
+msgstr "Bratislava III"
+
+#: contrib/localflavor/sk/sk_districts.py:16
+msgid "Bratislava IV"
+msgstr "Bratislava IV"
+
+#: contrib/localflavor/sk/sk_districts.py:17
+msgid "Bratislava V"
+msgstr "Bratislava V"
+
+#: contrib/localflavor/sk/sk_districts.py:18
+msgid "Bytca"
+msgstr "Bytca"
+
+#: contrib/localflavor/sk/sk_districts.py:19
+msgid "Cadca"
+msgstr "Cadca"
+
+#: contrib/localflavor/sk/sk_districts.py:20
+msgid "Detva"
+msgstr "Detva"
+
+#: contrib/localflavor/sk/sk_districts.py:21
+msgid "Dolny Kubin"
+msgstr "Dolny Kubin"
+
+#: contrib/localflavor/sk/sk_districts.py:22
+msgid "Dunajska Streda"
+msgstr "Dunajska Streda"
+
+#: contrib/localflavor/sk/sk_districts.py:23
+msgid "Galanta"
+msgstr "Galanta"
+
+#: contrib/localflavor/sk/sk_districts.py:24
+msgid "Gelnica"
+msgstr "Gelnica"
+
+#: contrib/localflavor/sk/sk_districts.py:25
+msgid "Hlohovec"
+msgstr "Hlohovec"
+
+#: contrib/localflavor/sk/sk_districts.py:26
+msgid "Humenne"
+msgstr "Humenne"
+
+#: contrib/localflavor/sk/sk_districts.py:27
+msgid "Ilava"
+msgstr "Ilava"
+
+#: contrib/localflavor/sk/sk_districts.py:28
+msgid "Kezmarok"
+msgstr "Kezmarok"
+
+#: contrib/localflavor/sk/sk_districts.py:29
+msgid "Komarno"
+msgstr "Komarno"
+
+#: contrib/localflavor/sk/sk_districts.py:30
+msgid "Kosice I"
+msgstr "Kosice I"
+
+#: contrib/localflavor/sk/sk_districts.py:31
+msgid "Kosice II"
+msgstr "Kosice II"
+
+#: contrib/localflavor/sk/sk_districts.py:32
+msgid "Kosice III"
+msgstr "Kosice III"
+
+#: contrib/localflavor/sk/sk_districts.py:33
+msgid "Kosice IV"
+msgstr "Kosice IV"
+
+#: contrib/localflavor/sk/sk_districts.py:34
+msgid "Kosice - okolie"
+msgstr "Kosice - okolie"
+
+#: contrib/localflavor/sk/sk_districts.py:35
+msgid "Krupina"
+msgstr "Krupina"
+
+#: contrib/localflavor/sk/sk_districts.py:36
+msgid "Kysucke Nove Mesto"
+msgstr "Kysucke Nove Mesto"
+
+#: contrib/localflavor/sk/sk_districts.py:37
+msgid "Levice"
+msgstr "Levice"
+
+#: contrib/localflavor/sk/sk_districts.py:38
+msgid "Levoca"
+msgstr "Levoca"
+
+#: contrib/localflavor/sk/sk_districts.py:39
+msgid "Liptovsky Mikulas"
+msgstr "Liptovsky Mikulas"
+
+#: contrib/localflavor/sk/sk_districts.py:40
+msgid "Lucenec"
+msgstr "Lucenec"
+
+#: contrib/localflavor/sk/sk_districts.py:41
+msgid "Malacky"
+msgstr "Malacky"
+
+#: contrib/localflavor/sk/sk_districts.py:42
+msgid "Martin"
+msgstr "Martin"
+
+#: contrib/localflavor/sk/sk_districts.py:43
+msgid "Medzilaborce"
+msgstr "Medzilaborce"
+
+#: contrib/localflavor/sk/sk_districts.py:44
+msgid "Michalovce"
+msgstr "Michalovce"
+
+#: contrib/localflavor/sk/sk_districts.py:45
+msgid "Myjava"
+msgstr "Myjava"
+
+#: contrib/localflavor/sk/sk_districts.py:46
+msgid "Namestovo"
+msgstr "Namestovo"
+
+#: contrib/localflavor/sk/sk_districts.py:47
+msgid "Nitra"
+msgstr "Nitra"
+
+#: contrib/localflavor/sk/sk_districts.py:48
+msgid "Nove Mesto nad Vahom"
+msgstr "Nove Mesto nad Vahom"
+
+#: contrib/localflavor/sk/sk_districts.py:49
+msgid "Nove Zamky"
+msgstr "Nove Zamky"
+
+#: contrib/localflavor/sk/sk_districts.py:50
+msgid "Partizanske"
+msgstr "Partizanske"
+
+#: contrib/localflavor/sk/sk_districts.py:51
+msgid "Pezinok"
+msgstr "Pezinok"
+
+#: contrib/localflavor/sk/sk_districts.py:52
+msgid "Piestany"
+msgstr "Piestany"
+
+#: contrib/localflavor/sk/sk_districts.py:53
+msgid "Poltar"
+msgstr "Poltar"
+
+#: contrib/localflavor/sk/sk_districts.py:54
+msgid "Poprad"
+msgstr "Poprad"
+
+#: contrib/localflavor/sk/sk_districts.py:55
+msgid "Povazska Bystrica"
+msgstr "Povazska Bystrica"
+
+#: contrib/localflavor/sk/sk_districts.py:56
+msgid "Presov"
+msgstr "Presov"
+
+#: contrib/localflavor/sk/sk_districts.py:57
+msgid "Prievidza"
+msgstr "Prievidza"
+
+#: contrib/localflavor/sk/sk_districts.py:58
+msgid "Puchov"
+msgstr "Puchov"
+
+#: contrib/localflavor/sk/sk_districts.py:59
+msgid "Revuca"
+msgstr "Revuca"
+
+#: contrib/localflavor/sk/sk_districts.py:60
+msgid "Rimavska Sobota"
+msgstr "Rimavska Sobota"
+
+#: contrib/localflavor/sk/sk_districts.py:61
+msgid "Roznava"
+msgstr "Roznava"
+
+#: contrib/localflavor/sk/sk_districts.py:62
+msgid "Ruzomberok"
+msgstr "Ruzomberok"
+
+#: contrib/localflavor/sk/sk_districts.py:63
+msgid "Sabinov"
+msgstr "Sabinov"
+
+#: contrib/localflavor/sk/sk_districts.py:64
+msgid "Senec"
+msgstr "Senec"
+
+#: contrib/localflavor/sk/sk_districts.py:65
+msgid "Senica"
+msgstr "Senica"
+
+#: contrib/localflavor/sk/sk_districts.py:66
+msgid "Skalica"
+msgstr "Skalica"
+
+#: contrib/localflavor/sk/sk_districts.py:67
+msgid "Snina"
+msgstr "Snina"
+
+#: contrib/localflavor/sk/sk_districts.py:68
+msgid "Sobrance"
+msgstr "Sobrance"
+
+#: contrib/localflavor/sk/sk_districts.py:69
+msgid "Spisska Nova Ves"
+msgstr "Spisska Nova Ves"
+
+#: contrib/localflavor/sk/sk_districts.py:70
+msgid "Stara Lubovna"
+msgstr "Stara Lubovna"
+
+#: contrib/localflavor/sk/sk_districts.py:71
+msgid "Stropkov"
+msgstr "Stropkov"
+
+#: contrib/localflavor/sk/sk_districts.py:72
+msgid "Svidnik"
+msgstr "Svidnik"
+
+#: contrib/localflavor/sk/sk_districts.py:73
+msgid "Sala"
+msgstr "Sala"
+
+#: contrib/localflavor/sk/sk_districts.py:74
+msgid "Topolcany"
+msgstr "Topolcany"
+
+#: contrib/localflavor/sk/sk_districts.py:75
+msgid "Trebisov"
+msgstr "Trebisov"
+
+#: contrib/localflavor/sk/sk_districts.py:76
+msgid "Trencin"
+msgstr "Trencin"
+
+#: contrib/localflavor/sk/sk_districts.py:77
+msgid "Trnava"
+msgstr "Trnava"
+
+#: contrib/localflavor/sk/sk_districts.py:78
+msgid "Turcianske Teplice"
+msgstr "Turcianske Teplice"
+
+#: contrib/localflavor/sk/sk_districts.py:79
+msgid "Tvrdosin"
+msgstr "Tvrdosin"
+
+#: contrib/localflavor/sk/sk_districts.py:80
+msgid "Velky Krtis"
+msgstr "Velky Krtis"
+
+#: contrib/localflavor/sk/sk_districts.py:81
+msgid "Vranov nad Toplou"
+msgstr "Vranov nad Toplou"
+
+#: contrib/localflavor/sk/sk_districts.py:82
+msgid "Zlate Moravce"
+msgstr "Zlate Moravce"
+
+#: contrib/localflavor/sk/sk_districts.py:83
+msgid "Zvolen"
+msgstr "Zvolen"
+
+#: contrib/localflavor/sk/sk_districts.py:84
+msgid "Zarnovica"
+msgstr "Zarnovica"
+
+#: contrib/localflavor/sk/sk_districts.py:85
+msgid "Ziar nad Hronom"
+msgstr "Ziar nad Hronom"
+
+#: contrib/localflavor/sk/sk_districts.py:86
+msgid "Zilina"
+msgstr "Zilina"
+
+#: contrib/localflavor/sk/sk_regions.py:8
+msgid "Banska Bystrica region"
+msgstr "Banska Bystrica region"
+
+#: contrib/localflavor/sk/sk_regions.py:9
+msgid "Bratislava region"
+msgstr "Bratislava region"
+
+#: contrib/localflavor/sk/sk_regions.py:10
+msgid "Kosice region"
+msgstr "Kosice region"
+
+#: contrib/localflavor/sk/sk_regions.py:11
+msgid "Nitra region"
+msgstr "Nitra region"
+
+#: contrib/localflavor/sk/sk_regions.py:12
+msgid "Presov region"
+msgstr "Presov region"
+
+#: contrib/localflavor/sk/sk_regions.py:13
+msgid "Trencin region"
+msgstr "Trencin region"
+
+#: contrib/localflavor/sk/sk_regions.py:14
+msgid "Trnava region"
+msgstr "Trnava region"
+
+#: contrib/localflavor/sk/sk_regions.py:15
+msgid "Zilina region"
+msgstr "Zilina region"
+
+#: contrib/localflavor/uk/forms.py:21
+msgid "Enter a valid postcode."
+msgstr "郵便番号を正しく入力してください。"
+
+#: contrib/localflavor/uk/uk_regions.py:11
+msgid "Bedfordshire"
+msgstr "Bedfordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:12
+msgid "Buckinghamshire"
+msgstr "Buckinghamshire"
+
+#: contrib/localflavor/uk/uk_regions.py:14
+msgid "Cheshire"
+msgstr "Cheshire"
+
+#: contrib/localflavor/uk/uk_regions.py:15
+msgid "Cornwall and Isles of Scilly"
+msgstr "Cornwall and Isles of Scilly"
+
+#: contrib/localflavor/uk/uk_regions.py:16
+msgid "Cumbria"
+msgstr "Cumbria"
+
+#: contrib/localflavor/uk/uk_regions.py:17
+msgid "Derbyshire"
+msgstr "Derbyshire"
+
+#: contrib/localflavor/uk/uk_regions.py:18
+msgid "Devon"
+msgstr "Devon"
+
+#: contrib/localflavor/uk/uk_regions.py:19
+msgid "Dorset"
+msgstr "Dorset"
+
+#: contrib/localflavor/uk/uk_regions.py:20
+msgid "Durham"
+msgstr "Durham"
+
+#: contrib/localflavor/uk/uk_regions.py:21
+msgid "East Sussex"
+msgstr "East Sussex"
+
+#: contrib/localflavor/uk/uk_regions.py:22
+msgid "Essex"
+msgstr "Essex"
+
+#: contrib/localflavor/uk/uk_regions.py:23
+msgid "Gloucestershire"
+msgstr "Gloucestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:24
+msgid "Greater London"
+msgstr "Greater London"
+
+#: contrib/localflavor/uk/uk_regions.py:25
+msgid "Greater Manchester"
+msgstr "Greater Manchester"
+
+#: contrib/localflavor/uk/uk_regions.py:26
+msgid "Hampshire"
+msgstr "Hampshire"
+
+#: contrib/localflavor/uk/uk_regions.py:27
+msgid "Hertfordshire"
+msgstr "Hertfordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:28
+msgid "Kent"
+msgstr "Kent"
+
+#: contrib/localflavor/uk/uk_regions.py:29
+msgid "Lancashire"
+msgstr "Lancashire"
+
+#: contrib/localflavor/uk/uk_regions.py:30
+msgid "Leicestershire"
+msgstr "Leicestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:31
+msgid "Lincolnshire"
+msgstr "Lincolnshire"
+
+#: contrib/localflavor/uk/uk_regions.py:32
+msgid "Merseyside"
+msgstr "Merseyside"
+
+#: contrib/localflavor/uk/uk_regions.py:33
+msgid "Norfolk"
+msgstr "Norfolk"
+
+#: contrib/localflavor/uk/uk_regions.py:34
+msgid "North Yorkshire"
+msgstr "North Yorkshire"
+
+#: contrib/localflavor/uk/uk_regions.py:35
+msgid "Northamptonshire"
+msgstr "Northamptonshire"
+
+#: contrib/localflavor/uk/uk_regions.py:36
+msgid "Northumberland"
+msgstr "Northumberland"
+
+#: contrib/localflavor/uk/uk_regions.py:37
+msgid "Nottinghamshire"
+msgstr "Nottinghamshire"
+
+#: contrib/localflavor/uk/uk_regions.py:38
+msgid "Oxfordshire"
+msgstr "Oxfordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:39
+msgid "Shropshire"
+msgstr "Shropshire"
+
+#: contrib/localflavor/uk/uk_regions.py:40
+msgid "Somerset"
+msgstr "Somerset"
+
+#: contrib/localflavor/uk/uk_regions.py:41
+msgid "South Yorkshire"
+msgstr "South Yorkshire"
+
+#: contrib/localflavor/uk/uk_regions.py:42
+msgid "Staffordshire"
+msgstr "Staffordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:43
+msgid "Suffolk"
+msgstr "Suffolk"
+
+#: contrib/localflavor/uk/uk_regions.py:44
+msgid "Surrey"
+msgstr "Surrey"
+
+#: contrib/localflavor/uk/uk_regions.py:45
+msgid "Tyne and Wear"
+msgstr "Tyne and Wear"
+
+#: contrib/localflavor/uk/uk_regions.py:46
+msgid "Warwickshire"
+msgstr "Warwickshire"
+
+#: contrib/localflavor/uk/uk_regions.py:47
+msgid "West Midlands"
+msgstr "West Midlands"
+
+#: contrib/localflavor/uk/uk_regions.py:48
+msgid "West Sussex"
+msgstr "West Sussex"
+
+#: contrib/localflavor/uk/uk_regions.py:49
+msgid "West Yorkshire"
+msgstr "West Yorkshire"
+
+#: contrib/localflavor/uk/uk_regions.py:50
+msgid "Wiltshire"
+msgstr "Wiltshire"
+
+#: contrib/localflavor/uk/uk_regions.py:51
+msgid "Worcestershire"
+msgstr "Worcestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:55
+msgid "County Antrim"
+msgstr "County Antrim"
+
+#: contrib/localflavor/uk/uk_regions.py:56
+msgid "County Armagh"
+msgstr "County Armagh"
+
+#: contrib/localflavor/uk/uk_regions.py:57
+msgid "County Down"
+msgstr "County Down"
+
+#: contrib/localflavor/uk/uk_regions.py:58
+msgid "County Fermanagh"
+msgstr "County Fermanagh"
+
+#: contrib/localflavor/uk/uk_regions.py:59
+msgid "County Londonderry"
+msgstr "County Londonderry"
+
+#: contrib/localflavor/uk/uk_regions.py:60
+msgid "County Tyrone"
+msgstr "County Tyrone"
+
+#: contrib/localflavor/uk/uk_regions.py:64
+msgid "Clwyd"
+msgstr "Clwyd"
+
+#: contrib/localflavor/uk/uk_regions.py:65
+msgid "Dyfed"
+msgstr "Dyfed"
+
+#: contrib/localflavor/uk/uk_regions.py:66
+msgid "Gwent"
+msgstr "Gwent"
+
+#: contrib/localflavor/uk/uk_regions.py:67
+msgid "Gwynedd"
+msgstr "Gwynedd"
+
+#: contrib/localflavor/uk/uk_regions.py:68
+msgid "Mid Glamorgan"
+msgstr "Mid Glamorgan"
+
+#: contrib/localflavor/uk/uk_regions.py:69
+msgid "Powys"
+msgstr "Powys"
+
+#: contrib/localflavor/uk/uk_regions.py:70
+msgid "South Glamorgan"
+msgstr "South Glamorgan"
+
+#: contrib/localflavor/uk/uk_regions.py:71
+msgid "West Glamorgan"
+msgstr "West Glamorgan"
+
+#: contrib/localflavor/uk/uk_regions.py:75
+msgid "Borders"
+msgstr "Borders"
+
+#: contrib/localflavor/uk/uk_regions.py:76
+msgid "Central Scotland"
+msgstr "Central Scotland"
+
+#: contrib/localflavor/uk/uk_regions.py:77
+msgid "Dumfries and Galloway"
+msgstr "Dumfries and Galloway"
+
+#: contrib/localflavor/uk/uk_regions.py:78
+msgid "Fife"
+msgstr "Fife"
+
+#: contrib/localflavor/uk/uk_regions.py:79
+msgid "Grampian"
+msgstr "Grampian"
+
+#: contrib/localflavor/uk/uk_regions.py:80
+msgid "Highland"
+msgstr "Highland"
+
+#: contrib/localflavor/uk/uk_regions.py:81
+msgid "Lothian"
+msgstr "Lothian"
+
+#: contrib/localflavor/uk/uk_regions.py:82
+msgid "Orkney Islands"
+msgstr "Orkney Islands"
+
+#: contrib/localflavor/uk/uk_regions.py:83
+msgid "Shetland Islands"
+msgstr "Shetland Islands"
+
+#: contrib/localflavor/uk/uk_regions.py:84
+msgid "Strathclyde"
+msgstr "Strathclyde"
+
+#: contrib/localflavor/uk/uk_regions.py:85
+msgid "Tayside"
+msgstr "Tayside"
+
+#: contrib/localflavor/uk/uk_regions.py:86
+msgid "Western Isles"
+msgstr "Western Isles"
+
+#: contrib/localflavor/uk/uk_regions.py:90
+msgid "England"
+msgstr "England"
+
+#: contrib/localflavor/uk/uk_regions.py:91
+msgid "Northern Ireland"
+msgstr "Northern Ireland"
+
+#: contrib/localflavor/uk/uk_regions.py:92
+msgid "Scotland"
+msgstr "Scotland"
+
+#: contrib/localflavor/uk/uk_regions.py:93
+msgid "Wales"
+msgstr "Wales"
+
+#: contrib/localflavor/us/forms.py:16
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "XXXXXか、XXXXX-XXXXの形式で郵便番号を入力してください。"
+
+#: contrib/localflavor/us/forms.py:54
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr "XXX-XX-XXXX の形式で、米国社会保障番号を入力して下さい。"
+
+#: contrib/localflavor/za/forms.py:20
+msgid "Enter a valid South African ID number"
+msgstr "南アフリカID番号を正しく入力してください。"
+
+#: contrib/localflavor/za/forms.py:54
+msgid "Enter a valid South African postal code"
+msgstr "南アフリカ郵便番号を正しく入力してください。"
+
+#: contrib/localflavor/za/za_provinces.py:4
+msgid "Eastern Cape"
+msgstr "Eastern Cape"
+
+#: contrib/localflavor/za/za_provinces.py:5
+msgid "Free State"
+msgstr "Free State"
+
+#: contrib/localflavor/za/za_provinces.py:6
+msgid "Gauteng"
+msgstr "Gauteng"
+
+#: contrib/localflavor/za/za_provinces.py:7
+msgid "KwaZulu-Natal"
+msgstr "KwaZulu-Natal"
+
+#: contrib/localflavor/za/za_provinces.py:8
+msgid "Limpopo"
+msgstr "Limpopo"
+
+#: contrib/localflavor/za/za_provinces.py:9
+msgid "Mpumalanga"
+msgstr "Mpumalanga"
+
+#: contrib/localflavor/za/za_provinces.py:10
+msgid "Northern Cape"
+msgstr "Northern Cape"
+
+#: contrib/localflavor/za/za_provinces.py:11
+msgid "North West"
+msgstr "North West"
+
+#: contrib/localflavor/za/za_provinces.py:12
+msgid "Western Cape"
+msgstr "Western Cape"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "リダイレクト元"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr "'/events/search/' のように、ドメイン名を除いた絶対パスにします。 "
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "リダイレクト先"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr "上記のような絶対パスか、 'http://' で始まる完全な URL にします。"
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "リダイレクト"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "リダイレクト"
+
+#: contrib/sessions/models.py:45
+msgid "session key"
+msgstr "セッションキー"
+
+#: contrib/sessions/models.py:47
+msgid "session data"
+msgstr "セッションデータ"
+
+#: contrib/sessions/models.py:48
+msgid "expire date"
+msgstr "有効期限"
+
+#: contrib/sessions/models.py:53
+msgid "session"
+msgstr "セッション"
+
+#: contrib/sessions/models.py:54
+msgid "sessions"
+msgstr "セッション"
+
+#: contrib/sites/models.py:32
+msgid "domain name"
+msgstr "ドメイン名"
+
+#: contrib/sites/models.py:33
+msgid "display name"
+msgstr "表示名"
+
+#: contrib/sites/models.py:39
+msgid "sites"
+msgstr "サイト"
+
+#: core/validators.py:80
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "半角の英数字、アンダースコア、ハイフン以外は使用できません。"
+
+#: core/validators.py:84
+msgid "Uppercase letters are not allowed here."
+msgstr "大文字はここでは使用できません。"
+
+#: core/validators.py:88
+msgid "Lowercase letters are not allowed here."
+msgstr "小文字はここでは使用できません。"
+
+#: core/validators.py:95
+msgid "Enter only digits separated by commas."
+msgstr "カンマ区切りの数字だけを入力してください。"
+
+#: core/validators.py:107
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "カンマ区切りの有効なメールアドレスを入力してください。"
+
+#: core/validators.py:111
+msgid "Please enter a valid IP address."
+msgstr "有効な IP アドレスを入力してください。"
+
+#: core/validators.py:115
+msgid "Empty values are not allowed here."
+msgstr "入力は必須です。"
+
+#: core/validators.py:119
+msgid "Non-numeric characters aren't allowed here."
+msgstr "数値以外は使用できません。"
+
+#: core/validators.py:123
+msgid "This value can't be comprised solely of digits."
+msgstr "数値だけの値にはできません。"
+
+#: core/validators.py:128 forms/fields.py:161
+msgid "Enter a whole number."
+msgstr "整数を入力してください。"
+
+#: core/validators.py:132
+msgid "Only alphabetical characters are allowed here."
+msgstr "半角アルファベット以外使用できません。"
+
+#: core/validators.py:147
+#, python-format
+msgid "Invalid date: %s"
+msgstr "無効な日付: %s"
+
+#: core/validators.py:152 db/models/fields/__init__.py:546
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "YYYY-MM-DD形式で日付を入力してください。"
+
+#: core/validators.py:157
+msgid "Enter a valid time in HH:MM format."
+msgstr "HH:MM形式で時刻を入力してください。"
+
+#: core/validators.py:161
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "YYYY-MM-DD HH:MM形式で日時を入力してください。"
+
+#: core/validators.py:166 forms/fields.py:422
+msgid "Enter a valid e-mail address."
+msgstr "有効なメールアドレスを入力してください。"
+
+#: core/validators.py:178 core/validators.py:470 forms/fields.py:440
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+"ファイルが取得できませんでした。formのencoding typeを確認してください。"
+
+#: core/validators.py:189 forms/fields.py:471
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr "画像をアップロードしてください。アップロードしたファイルは画像でないか、または壊れています。"
+
+#: core/validators.py:196
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "URL ( %s )  は画像ではありません。"
+
+#: core/validators.py:200
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "電話番号は XXX-XXX-XXXX 形式で入力してください。\"%s\" は無効です。"
+
+#: core/validators.py:208
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "URL ( %s ) は QuickTime ビデオではありません。"
+
+#: core/validators.py:212
+msgid "A valid URL is required."
+msgstr "正しい URL を入力してください。"
+
+#: core/validators.py:226
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"有効な HTML を入力してください。エラー:\n"
+"%s"
+
+#: core/validators.py:233
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "不正な XML です: %s"
+
+#: core/validators.py:250
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "無効なURL: %s"
+
+#: core/validators.py:255 core/validators.py:257
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "URL ( %s ) はリンクが壊れています。"
+
+#: core/validators.py:263
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "正しい米州略称を入力してください。"
+
+#: core/validators.py:277
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "言葉使いに気を付けて! %s という言葉は使えません。"
+
+#: core/validators.py:284
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "このフィールドは '%s' フィールドと一致せねばなりません。"
+
+#: core/validators.py:303
+msgid "Please enter something for at least one field."
+msgstr "少なくとも一つのフィールドに何か入力してください。"
+
+#: core/validators.py:312 core/validators.py:323
+msgid "Please enter both fields or leave them both empty."
+msgstr "両方のフィールドに入力するか、両方とも未入力にしてください。"
+
+#: core/validators.py:331
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr ""
+"%(field)s を %(value)s にするのなら、このフィールドに必ず入力してください。"
+
+#: core/validators.py:344
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr ""
+"%(field)s を %(value)s にしないのなら、このフィールドに必ず入力してください。"
+
+#: core/validators.py:363
+msgid "Duplicate values are not allowed."
+msgstr "重複する値は認められません。"
+
+#: core/validators.py:378
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "この値は %(lower)s から %(upper)s の間でなければなりません。"
+
+#: core/validators.py:380
+#, python-format
+msgid "This value must be at least %s."
+msgstr "この値は %s 以上でなければなりません。"
+
+#: core/validators.py:382
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "この値は %s より小さくなければなりません。"
+
+#: core/validators.py:423
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "この値は %s の累乗でなければなりません。"
+
+#: core/validators.py:433
+msgid "Please enter a valid decimal number."
+msgstr "有効な 10 進数を入力してください。"
+
+#: core/validators.py:440
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "全体で %s 文字以下の数字を入力してください。"
+
+#: core/validators.py:443
+#, python-format
+msgid ""
+"Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural ""
+"Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] "整数部は %s 文字以下の数字を入力してください。"
+
+#: core/validators.py:446
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "小数部は %s 文字以下の数字を入力してください。"
+
+#: core/validators.py:454
+msgid "Please enter a valid floating point number."
+msgstr "有効な 小数 を入力してください。"
+
+#: core/validators.py:463
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "アップロードするファイルの大きさは %s バイト以上にしてください。"
+
+#: core/validators.py:464
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "アップロードするファイルの大きさは %s 最大バイトまでです。"
+
+#: core/validators.py:481
+msgid "The format for this field is wrong."
+msgstr "フィールドの形式が正しくありません。"
+
+#: core/validators.py:496
+msgid "This field is invalid."
+msgstr "このフィールドは無効です。"
+
+#: core/validators.py:532
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "%s から何も検索できませんでした。"
+
+#: core/validators.py:535
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"URL %(url)s は無効なコンテンツタイプヘッダ '%(contenttype)s' を返しました。"
+
+#: core/validators.py:568
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"%(line)s 行目から始まる %(tag)s タグを閉じてください (\"%(start)s\" で始まる"
+"行です)。"
+
+#: core/validators.py:572
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"%(line)s 行目から始まるテキストはこのコンテキストでは使えません。 (\"%(start)"
+"s\" で始まる行です)。"
+
+#: core/validators.py:577
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"%(line)s 行目の \"%(attr)s\" は無効なアトリビュートです (\"%(start)s\" で始ま"
+"る行です)。"
+
+#: core/validators.py:582
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"%(line)s 行目の \"<%(tag)s>\" は無効なタグです( \"%(start)s\" で始まる行で"
+"す)。"
+
+#: core/validators.py:586
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"%(line)s 行目のタグは必須アトリビュートが未入力です( \"%(start)s\" で始まる行"
+"です)。"
+
+#: core/validators.py:591
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"%(line)s 行目の \"%(attr)s\" アトリビュートの値が正しくありません (\"%(start)"
+"s\" で始まる行です) 。"
+
+#: db/models/manipulators.py:304
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr ""
+"%(field)s に入力されたものは、この %(type)s の %(object)s に既に存在します。"
+
+#: db/models/fields/__init__.py:46
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(fieldname)s に %(optname)s は既に存在します。"
+
+#: db/models/fields/__init__.py:320 db/models/fields/files.py:168
+#: db/models/fields/files.py:179 forms/fields.py:52 oldforms/__init__.py:370
+msgid "This field is required."
+msgstr "このフィールドは必須です。"
+
+#: db/models/fields/__init__.py:434
+msgid "This value must be an integer."
+msgstr "値は整数でなければなりません。"
+
+#: db/models/fields/__init__.py:480
+msgid "This value must be either True or False."
+msgstr "値は真: True または偽: False でなければなりません。"
+
+#: db/models/fields/__init__.py:509
+msgid "This field cannot be null."
+msgstr "このフィールドには NULL を指定できません。"
+
+#: db/models/fields/__init__.py:611 db/models/fields/__init__.py:628
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format."
+msgstr "YYYY-MM-DD HH:MM[:ss[.uuuuuu]]形式で日時を入力してください。"
+
+#: db/models/fields/__init__.py:684
+msgid "This value must be a decimal number."
+msgstr "値は整数でなければなりません。"
+
+#: db/models/fields/__init__.py:825
+msgid "This value must be either None, True or False."
+msgstr "値は、空: None、真: True または偽: False でなければなりません。"
+
+#: db/models/fields/__init__.py:937 db/models/fields/__init__.py:950
+msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format."
+msgstr "HH:MM[:ss[.uuuuuu]]形式で時刻を入力してください。"
+
+#: db/models/fields/files.py:188
+msgid "Enter a valid filename."
+msgstr "正しいファイル名を入力してください。"
+
+#: db/models/fields/related.py:92
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "正しい %s を入力してください。"
+
+#: db/models/fields/related.py:776
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"複数選択するときには Control キーを押したまま選択してください。Mac は "
+"Command キーを使ってください"
+
+#: db/models/fields/related.py:856
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "正しい %(self)s IDを入力してください。 %(value)r は無効です。"
+
+#: forms/fields.py:53
+msgid "Enter a valid value."
+msgstr "値を正しく入力してください。"
+
+#: forms/fields.py:133
+#, python-format
+msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+msgstr "%(max)d 字以下で入力してください( %(length)d 文字入力されました)。"
+
+#: forms/fields.py:134
+#, python-format
+msgid "Ensure this value has at least %(min)d characters (it has %(length)d)."
+msgstr "%(min)d 字以上で入力してください。( %(length)d 文字入力されました)。"
+
+#: forms/fields.py:162 forms/fields.py:191 forms/fields.py:220
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "この値は %s 以下でなければなりません。"
+
+#: forms/fields.py:163 forms/fields.py:192 forms/fields.py:221
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "この値は %s 以上でなければなりません。"
+
+#: forms/fields.py:190 forms/fields.py:219
+msgid "Enter a number."
+msgstr "整数を入力してください。"
+
+#: forms/fields.py:222
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr "整数部と少数部を併せて %s 桁までで入力して下さい。"
+
+#: forms/fields.py:223
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr "少数部は %s 桁までで入力して下さい。"
+
+#: forms/fields.py:224
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr "整数部は %s 桁までで入力して下さい。"
+
+#: forms/fields.py:282 forms/fields.py:803
+msgid "Enter a valid date."
+msgstr "日付を正しく入力してください。"
+
+#: forms/fields.py:315 forms/fields.py:804
+msgid "Enter a valid time."
+msgstr "時間を正しく入力してください。"
+
+#: forms/fields.py:354
+msgid "Enter a valid date/time."
+msgstr "日付/時間を正しく入力してください。"
+
+#: forms/fields.py:441
+msgid "No file was submitted."
+msgstr "ファイルが送信されていません。"
+
+#: forms/fields.py:442 oldforms/__init__.py:689
+msgid "The submitted file is empty."
+msgstr "入力されたファイルは空です。"
+
+#: forms/fields.py:532
+msgid "Enter a valid URL."
+msgstr "URLを正しく入力してください。"
+
+#: forms/fields.py:533
+msgid "This URL appears to be a broken link."
+msgstr "このURLはリンクが壊れています。"
+
+#: forms/fields.py:601 forms/fields.py:652
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "正しく選択してください。 %(value)s は候補にありません。"
+
+#: forms/fields.py:653 forms/fields.py:714 forms/models.py:528
+msgid "Enter a list of values."
+msgstr "リストを入力してください。"
+
+#: forms/fields.py:832
+msgid "Enter a valid IPv4 address."
+msgstr "有効なIPアドレス (IPv4) を入力してください。"
+
+#: forms/models.py:461
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "正しく選択してください。選択したものは候補にありません。"
+
+#: forms/models.py:529
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "正しく選択してください。 %s は候補にありません。"
+
+#: oldforms/__init__.py:405
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "%s 字以下で入力してください。"
+
+#: oldforms/__init__.py:410
+msgid "Line breaks are not allowed here."
+msgstr "改行はできません。"
+
+#: oldforms/__init__.py:508 oldforms/__init__.py:582 oldforms/__init__.py:621
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "正しく選択してください。; '%(data)s' は %(choices)s にありません。"
+
+#: oldforms/__init__.py:750
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "-32,768 から 32,767 までの整数を入力してください。"
+
+#: oldforms/__init__.py:760
+msgid "Enter a positive number."
+msgstr "正の数を入力してください。"
+
+#: oldforms/__init__.py:770
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "0 から 32,767 までの整数を入力してください。"
+
+#: template/defaultfilters.py:698
+msgid "yes,no,maybe"
+msgstr "はい,いいえ,たぶん"
+
+#: template/defaultfilters.py:729
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d バイト"
+
+#: template/defaultfilters.py:731
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f KB"
+
+#: template/defaultfilters.py:733
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: template/defaultfilters.py:734
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#: utils/dateformat.py:41
+msgid "p.m."
+msgstr "p.m."
+
+#: utils/dateformat.py:42
+msgid "a.m."
+msgstr "a.m."
+
+#: utils/dateformat.py:47
+msgid "PM"
+msgstr "PM"
+
+#: utils/dateformat.py:48
+msgid "AM"
+msgstr "AM"
+
+#: utils/dateformat.py:97
+msgid "midnight"
+msgstr "0時"
+
+#: utils/dateformat.py:99
+msgid "noon"
+msgstr "12時"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "月曜日"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "火曜日"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "水曜日"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "木曜日"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "金曜日"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "土曜日"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "日曜日"
+
+#: utils/dates.py:10
+msgid "Mon"
+msgstr "月"
+
+#: utils/dates.py:10
+msgid "Tue"
+msgstr "火"
+
+#: utils/dates.py:10
+msgid "Wed"
+msgstr "水"
+
+#: utils/dates.py:10
+msgid "Thu"
+msgstr "木"
+
+#: utils/dates.py:10
+msgid "Fri"
+msgstr "金"
+
+#: utils/dates.py:11
+msgid "Sat"
+msgstr "土"
+
+#: utils/dates.py:11
+msgid "Sun"
+msgstr "日"
+
+#: utils/dates.py:18
+msgid "January"
+msgstr "1月"
+
+#: utils/dates.py:18
+msgid "February"
+msgstr "2月"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "March"
+msgstr "3月"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "April"
+msgstr "4月"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "May"
+msgstr "5月"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "June"
+msgstr "6月"
+
+#: utils/dates.py:19 utils/dates.py:31
+msgid "July"
+msgstr "7月"
+
+#: utils/dates.py:19
+msgid "August"
+msgstr "8月"
+
+#: utils/dates.py:19
+msgid "September"
+msgstr "9月"
+
+#: utils/dates.py:19
+msgid "October"
+msgstr "10月"
+
+#: utils/dates.py:19
+msgid "November"
+msgstr "11月"
+
+#: utils/dates.py:20
+msgid "December"
+msgstr "12月"
+
+#: utils/dates.py:23
+msgid "jan"
+msgstr "1月"
+
+#: utils/dates.py:23
+msgid "feb"
+msgstr "2月"
+
+#: utils/dates.py:23
+msgid "mar"
+msgstr "3月"
+
+#: utils/dates.py:23
+msgid "apr"
+msgstr "4月"
+
+#: utils/dates.py:23
+msgid "may"
+msgstr "5月"
+
+#: utils/dates.py:23
+msgid "jun"
+msgstr "6月"
+
+#: utils/dates.py:24
+msgid "jul"
+msgstr "7月"
+
+#: utils/dates.py:24
+msgid "aug"
+msgstr "8月"
+
+#: utils/dates.py:24
+msgid "sep"
+msgstr "9月"
+
+#: utils/dates.py:24
+msgid "oct"
+msgstr "10月"
+
+#: utils/dates.py:24
+msgid "nov"
+msgstr "11月"
+
+#: utils/dates.py:24
+msgid "dec"
+msgstr "12月"
+
+#: utils/dates.py:31
+msgid "Jan."
+msgstr "1月"
+
+#: utils/dates.py:31
+msgid "Feb."
+msgstr "2月"
+
+#: utils/dates.py:32
+msgid "Aug."
+msgstr "8月"
+
+#: utils/dates.py:32
+msgid "Sept."
+msgstr "9月"
+
+#: utils/dates.py:32
+msgid "Oct."
+msgstr "10月"
+
+#: utils/dates.py:32
+msgid "Nov."
+msgstr "11月"
+
+#: utils/dates.py:32
+msgid "Dec."
+msgstr "12月"
+
+#: utils/text.py:128
+msgid "or"
+msgstr "または"
+
+#: utils/timesince.py:21
+msgid "year"
+msgid_plural "years"
+msgstr[0] "年"
+
+#: utils/timesince.py:22
+msgid "month"
+msgid_plural "months"
+msgstr[0] "ヶ月"
+
+#: utils/timesince.py:23
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "週間"
+
+#: utils/timesince.py:24
+msgid "day"
+msgid_plural "days"
+msgstr[0] "日"
+
+#: utils/timesince.py:25
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "時間"
+
+#: utils/timesince.py:26
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "分"
+
+#: utils/timesince.py:46
+msgid "minutes"
+msgstr "分"
+
+#: utils/timesince.py:51
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr "%(number)d %(type)s"
+
+#: utils/timesince.py:57
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ", %(number)d %(type)s"
+
+#: utils/translation/trans_real.py:401
+msgid "DATE_FORMAT"
+msgstr "Y/m/d"
+
+#: utils/translation/trans_real.py:402
+msgid "DATETIME_FORMAT"
+msgstr "Y/m/d H:i"
+
+#: utils/translation/trans_real.py:403
+msgid "TIME_FORMAT"
+msgstr "H:i"
+
+#: utils/translation/trans_real.py:419
+msgid "YEAR_MONTH_FORMAT"
+msgstr "Y/m/d"
+
+#: utils/translation/trans_real.py:420
+msgid "MONTH_DAY_FORMAT"
+msgstr "m/d"
+
+#: views/generic/create_update.py:114
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "%(verbose_name)s を作成しました。"
+
+#: views/generic/create_update.py:156
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "%(verbose_name)s を更新しました。"
+
+#: views/generic/create_update.py:198
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr " %(verbose_name)s を削除しました。"
+
+#~ msgid "Your new password is: %(new_password)s"
+#~ msgstr "新しいパスワード: %(new_password)s"
+
+#~ msgid "Feel free to change this password by going to this page:"
+#~ msgstr "パスワードは下記のページで自由に変更していただけます:"
+
+#~ msgid "Gaeilge"
+#~ msgstr "アイルランド語"
+
+#~ msgid "Brazilian"
+#~ msgstr "ブラジル語"
+
+#~ msgid "Ordering"
+#~ msgstr "順序"
+
+#~ msgid "Order:"
+#~ msgstr "並び変え:"
+
+#~ msgid "Added %s."
+#~ msgstr "%s を追加しました。"
+
+#~ msgid "Deleted %s."
+#~ msgstr "%s を削除しました。"
+
+#~ msgid "The two 'new password' fields didn't match."
+#~ msgstr "新しいパスワード(確認用)が一致しません。"
+
+#~ msgid "Year must be 1900 or later."
+#~ msgstr "1900年以降を指定してください。"
+
+#~ msgid "Separate multiple IDs with commas."
+#~ msgstr "複数の ID はカンマで区切ってください。"
diff --git a/webapp/django/conf/locale/ja/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/ja/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..6abe6ea
--- /dev/null
+++ b/webapp/django/conf/locale/ja/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/ja/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/ja/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..c7f2db5
--- /dev/null
+++ b/webapp/django/conf/locale/ja/LC_MESSAGES/djangojs.po
@@ -0,0 +1,113 @@
+# Japanese translation for js.

+msgid ""

+msgstr ""

+"Project-Id-Version: Django\n"

+"Report-Msgid-Bugs-To: \n"

+"POT-Creation-Date: 2007-03-26 23:41+0900\n"

+"PO-Revision-Date: 2006-05-08 13:39+0900\n"

+"Last-Translator: makoto tsuyuki <mtsuyuki@gmail.com>\n"

+"Language-Team: Japanese <django-ja@googlegroups.com>\n"

+"MIME-Version: 1.0\n"

+"Content-Type: text/plain; charset=utf-8\n"

+"Content-Transfer-Encoding: 8bit\n"

+

+#: contrib/admin/media/js/calendar.js:24

+#: contrib/admin/media/js/dateparse.js:32

+msgid ""

+"January February March April May June July August September October November "

+"December"

+msgstr "1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月"

+

+#: contrib/admin/media/js/calendar.js:25

+msgid "S M T W T F S"

+msgstr "日 月 火 水 木 金 土"

+

+#: contrib/admin/media/js/dateparse.js:33

+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"

+msgstr "日曜 月曜 火曜 水曜 木曜 金曜 土曜"

+

+#: contrib/admin/media/js/SelectFilter2.js:33

+#, perl-format

+msgid "Available %s"

+msgstr "利用可能 %s"

+

+#: contrib/admin/media/js/SelectFilter2.js:41

+msgid "Choose all"

+msgstr "全て選択"

+

+#: contrib/admin/media/js/SelectFilter2.js:46

+msgid "Add"

+msgstr "追加"

+

+#: contrib/admin/media/js/SelectFilter2.js:48

+msgid "Remove"

+msgstr "削除"

+

+#: contrib/admin/media/js/SelectFilter2.js:53

+#, perl-format

+msgid "Chosen %s"

+msgstr "選択された %s"

+

+#: contrib/admin/media/js/SelectFilter2.js:54

+msgid "Select your choice(s) and click "

+msgstr "選択してクリック"

+

+#: contrib/admin/media/js/SelectFilter2.js:59

+msgid "Clear all"

+msgstr "全てクリア"

+

+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34

+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72

+msgid "Show"

+msgstr "表示"

+

+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63

+msgid "Hide"

+msgstr "非表示"

+

+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47

+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81

+msgid "Now"

+msgstr "現在"

+

+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51

+msgid "Clock"

+msgstr "時計"

+

+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78

+msgid "Choose a time"

+msgstr "時間を選択"

+

+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82

+msgid "Midnight"

+msgstr "0時"

+

+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83

+msgid "6 a.m."

+msgstr "午前 6 時"

+

+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84

+msgid "Noon"

+msgstr "12時"

+

+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88

+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183

+msgid "Cancel"

+msgstr "キャンセル"

+

+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128

+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177

+msgid "Today"

+msgstr "今日"

+

+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132

+msgid "Calendar"

+msgstr "カレンダー"

+

+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175

+msgid "Yesterday"

+msgstr "昨日"

+

+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179

+msgid "Tomorrow"

+msgstr "明日"

diff --git a/webapp/django/conf/locale/ka/LC_MESSAGES/django.mo b/webapp/django/conf/locale/ka/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..aa632e4
--- /dev/null
+++ b/webapp/django/conf/locale/ka/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/ka/LC_MESSAGES/django.po b/webapp/django/conf/locale/ka/LC_MESSAGES/django.po
new file mode 100644
index 0000000..59bec5e
--- /dev/null
+++ b/webapp/django/conf/locale/ka/LC_MESSAGES/django.po
@@ -0,0 +1,4571 @@
+# Django translation to Georgian language.
+# Copyright (C) 2008
+# This file is distributed under the same license as the PACKAGE package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-08-20 21:33+0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: David Avsajanishvili <avsd05@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: conf/global_settings.py:44
+msgid "Arabic"
+msgstr "არაბული"
+
+#: conf/global_settings.py:45
+msgid "Bengali"
+msgstr "ბენგალიური"
+
+#: conf/global_settings.py:46
+msgid "Bulgarian"
+msgstr "ბულგარული"
+
+#: conf/global_settings.py:47
+msgid "Catalan"
+msgstr "კატალანური"
+
+#: conf/global_settings.py:48
+msgid "Czech"
+msgstr "ჩეხური"
+
+#: conf/global_settings.py:49
+msgid "Welsh"
+msgstr "უელსური"
+
+#: conf/global_settings.py:50
+msgid "Danish"
+msgstr "დანიური"
+
+#: conf/global_settings.py:51
+msgid "German"
+msgstr "გერმანული"
+
+#: conf/global_settings.py:52
+msgid "Greek"
+msgstr "ბერძნული"
+
+#: conf/global_settings.py:53
+msgid "English"
+msgstr "ინგლისური"
+
+#: conf/global_settings.py:54
+msgid "Spanish"
+msgstr "ესპანური"
+
+#: conf/global_settings.py:55
+msgid "Estonian"
+msgstr "ესტონური"
+
+#: conf/global_settings.py:56
+msgid "Argentinean Spanish"
+msgstr "არგენტინის ესპანური"
+
+#: conf/global_settings.py:57
+msgid "Basque"
+msgstr "ბასკური"
+
+#: conf/global_settings.py:58
+msgid "Persian"
+msgstr "სპარსული"
+
+#: conf/global_settings.py:59
+msgid "Finnish"
+msgstr "ფინური"
+
+#: conf/global_settings.py:60
+msgid "French"
+msgstr "ფრანგული"
+
+#: conf/global_settings.py:61
+msgid "Irish"
+msgstr "ირლანდიური"
+
+#: conf/global_settings.py:62
+msgid "Galician"
+msgstr "გალიციური"
+
+#: conf/global_settings.py:63
+msgid "Hungarian"
+msgstr "უნგრული"
+
+#: conf/global_settings.py:64
+msgid "Hebrew"
+msgstr "ებრაული"
+
+#: conf/global_settings.py:65
+msgid "Croatian"
+msgstr "ხორვატიული"
+
+#: conf/global_settings.py:66
+msgid "Icelandic"
+msgstr "ისლანდიური"
+
+#: conf/global_settings.py:67
+msgid "Italian"
+msgstr "იტალიური"
+
+#: conf/global_settings.py:68
+msgid "Japanese"
+msgstr "იაპონური"
+
+#: conf/global_settings.py:69
+msgid "Georgian"
+msgstr "ქართული"
+
+#: conf/global_settings.py:70
+msgid "Korean"
+msgstr "კორეული"
+
+#: conf/global_settings.py:71
+msgid "Khmer"
+msgstr "ხმერული"
+
+#: conf/global_settings.py:72
+msgid "Kannada"
+msgstr "კანნადა"
+
+#: conf/global_settings.py:73
+msgid "Latvian"
+msgstr "ლატვიური"
+
+#: conf/global_settings.py:74
+msgid "Lithuanian"
+msgstr "ლიტვური"
+
+#: conf/global_settings.py:75
+msgid "Macedonian"
+msgstr "მაკედონური"
+
+#: conf/global_settings.py:76
+msgid "Dutch"
+msgstr "ჰოლანდიური"
+
+#: conf/global_settings.py:77
+msgid "Norwegian"
+msgstr "ნორვეგიული"
+
+#: conf/global_settings.py:78
+msgid "Polish"
+msgstr "პოლონური"
+
+#: conf/global_settings.py:79
+msgid "Portugese"
+msgstr "პორტუგალიური"
+
+#: conf/global_settings.py:80
+msgid "Brazilian Portuguese"
+msgstr "ბრაზილიური პორტუგალიური"
+
+#: conf/global_settings.py:81
+msgid "Romanian"
+msgstr "რუმინული"
+
+#: conf/global_settings.py:82
+msgid "Russian"
+msgstr "რუსული"
+
+#: conf/global_settings.py:83
+msgid "Slovak"
+msgstr "სლოვარური"
+
+#: conf/global_settings.py:84
+msgid "Slovenian"
+msgstr "სლოვენიური"
+
+#: conf/global_settings.py:85
+msgid "Serbian"
+msgstr "სერბული"
+
+#: conf/global_settings.py:86
+msgid "Swedish"
+msgstr "შვედური"
+
+#: conf/global_settings.py:87
+msgid "Tamil"
+msgstr "თამილური"
+
+#: conf/global_settings.py:88
+msgid "Telugu"
+msgstr "ტელუგუ"
+
+#: conf/global_settings.py:89
+msgid "Turkish"
+msgstr "თურქული"
+
+#: conf/global_settings.py:90
+msgid "Ukrainian"
+msgstr "უკრაინული"
+
+#: conf/global_settings.py:91
+msgid "Simplified Chinese"
+msgstr "გამარტივებული ჩინური"
+
+#: conf/global_settings.py:92
+msgid "Traditional Chinese"
+msgstr "ტრადიციული ჩინური"
+
+#: contrib/admin/filterspecs.py:44
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>%s-ს მიერ:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:74 contrib/admin/filterspecs.py:92
+#: contrib/admin/filterspecs.py:147 contrib/admin/filterspecs.py:173
+msgid "All"
+msgstr "ყველა"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Any date"
+msgstr "ნებისმიერი თარიღი"
+
+#: contrib/admin/filterspecs.py:114
+msgid "Today"
+msgstr "დღეს"
+
+#: contrib/admin/filterspecs.py:117
+msgid "Past 7 days"
+msgstr "ბოლო 7 დღე"
+
+#: contrib/admin/filterspecs.py:119
+msgid "This month"
+msgstr "მიმდინარე თვე"
+
+#: contrib/admin/filterspecs.py:121
+msgid "This year"
+msgstr "მიმდინარე წელი"
+
+#: contrib/admin/filterspecs.py:147 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "Yes"
+msgstr "კი"
+
+#: contrib/admin/filterspecs.py:147 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "No"
+msgstr "არა"
+
+#: contrib/admin/filterspecs.py:154 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "Unknown"
+msgstr "გაურკვეველი"
+
+#: contrib/admin/models.py:19
+msgid "action time"
+msgstr "მოქმედების დრო"
+
+#: contrib/admin/models.py:22
+msgid "object id"
+msgstr "ობიექტის id"
+
+#: contrib/admin/models.py:23
+msgid "object repr"
+msgstr "ობიექტის წარმ."
+
+#: contrib/admin/models.py:24
+msgid "action flag"
+msgstr "მოქმედების დროშა"
+
+#: contrib/admin/models.py:25
+msgid "change message"
+msgstr "შეცვლის შეტყობინება"
+
+#: contrib/admin/models.py:28
+msgid "log entry"
+msgstr "ლოგის ერთეული"
+
+#: contrib/admin/models.py:29
+msgid "log entries"
+msgstr "ლოგის ერთეულები"
+
+#: contrib/admin/options.py:56 contrib/admin/options.py:115
+msgid "None"
+msgstr "არცერთი"
+
+#: contrib/admin/options.py:326
+#, python-format
+msgid "Changed %s."
+msgstr "%s შეცვლილია."
+
+#: contrib/admin/options.py:326 contrib/admin/options.py:336
+#: core/validators.py:279 db/models/manipulators.py:305
+msgid "and"
+msgstr "და"
+
+#: contrib/admin/options.py:331
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "დამატებულია %(name)s \"%(object)s\"."
+
+#: contrib/admin/options.py:335
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "შეცვლილია %(list)s for %(name)s \"%(object)s\"."
+
+#: contrib/admin/options.py:340
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "წაშლილია %(name)s \"%(object)s\"."
+
+#: contrib/admin/options.py:344
+msgid "No fields changed."
+msgstr "არცერთი ველი არ შეცვლილა."
+
+#: contrib/admin/options.py:405 contrib/auth/admin.py:50
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" წარმატებით დაემატა."
+
+#: contrib/admin/options.py:409 contrib/admin/options.py:442
+#: contrib/auth/admin.py:55
+msgid "You may edit it again below."
+msgstr "თქვენ შეგიძლიათ შეცვალოთ იგი."
+
+#: contrib/admin/options.py:419 contrib/admin/options.py:452
+#, python-format
+msgid "You may add another %s below."
+msgstr "შეგიძლიათ დაამატოთ კიდევ ერთი %s."
+
+#: contrib/admin/options.py:440
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" წარმატებით შეიცვალა."
+
+#: contrib/admin/options.py:448
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s\" წარმატებით დაემატა. შეგიძლიათ განაგრძოთ მისი "
+"რედაქტირება."
+
+#: contrib/admin/options.py:514
+#, python-format
+msgid "Add %s"
+msgstr "დავამატოთ %s"
+
+#: contrib/admin/options.py:591
+#, python-format
+msgid "Change %s"
+msgstr "შევცვალოთ %s"
+
+#: contrib/admin/options.py:622
+msgid "Database error"
+msgstr "მონაცემთა ბაზის შეცდომა"
+
+#: contrib/admin/options.py:671
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" წარმატებით წაიშალა."
+
+#: contrib/admin/options.py:678
+msgid "Are you sure?"
+msgstr "დარწმუნებული ხართ?"
+
+#: contrib/admin/options.py:705
+#, python-format
+msgid "Change history: %s"
+msgstr "ცვლილებების ისტორია: %s"
+
+#: contrib/admin/sites.py:18 contrib/admin/views/decorators.py:16
+#: contrib/auth/forms.py:72 contrib/comments/views/comments.py:56
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"გთხოვთ, შეიყვანოთ სწორი მომხმარებლის სახელი და პაროლი. გაითვალისწინეთ, რომ "
+"ორივე ველი დამოკიდებულია რეგისტრზე."
+
+#: contrib/admin/sites.py:238 contrib/admin/views/decorators.py:68
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"გთხოვთ, შეხვიდეთ კიდევ ერთხელ, რადგანაც თქვენი სესიის დრო ამოიწურა. ნუ "
+"ღელავთ: თქვენს მიერ შეტანილი ცვლილებები შენახულია."
+
+#: contrib/admin/sites.py:245 contrib/admin/views/decorators.py:75
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"როგორც ჩანს, თქვენი ბროუზერი არ ღებულობს cookie-ებს. გთხოვთ, ჩართოთ cookie-"
+"ების მიღების ფუნქცია, განაახლეთ ეს გვერდი და სცადეთ კიდევ ერთხელ."
+
+#: contrib/admin/sites.py:259 contrib/admin/sites.py:265
+#: contrib/admin/views/decorators.py:92
+msgid "Usernames cannot contain the '@' character."
+msgstr "მომხმარებლის სახელი არ უნდა შეიცავდეს სიმბოლოს '@'."
+
+#: contrib/admin/sites.py:262 contrib/admin/views/decorators.py:88
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr ""
+"ელ-ფოსტის მისამართი არ არის თქვენი მომხმარებლის სახელი. სცადეთ '%s' მის "
+"ნაცვლად."
+
+#: contrib/admin/sites.py:330
+msgid "Site administration"
+msgstr "საიტის ადმინისტრირება"
+
+#: contrib/admin/sites.py:352 contrib/admin/templates/admin/login.html:27
+#: contrib/admin/templates/registration/password_reset_complete.html:14
+#: contrib/admin/views/decorators.py:30
+msgid "Log in"
+msgstr "შესვლა"
+
+#: contrib/admin/util.py:138
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "ერთი ან რამდენიმე %(fieldname)s ობიექტში %(name)s: %(obj)s"
+
+#: contrib/admin/util.py:143
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "ერთი ან რამდენიმე %(fieldname)s ობიექტში %(name)s:"
+
+#: contrib/admin/widgets.py:65
+msgid "Date:"
+msgstr "თარიღი;"
+
+#: contrib/admin/widgets.py:65
+msgid "Time:"
+msgstr "დრო:"
+
+#: contrib/admin/widgets.py:89
+msgid "Currently:"
+msgstr "მიმდინარე:"
+
+#: contrib/admin/widgets.py:89
+msgid "Change:"
+msgstr "შეცვლა:"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "გვერდი ვერ მოიძებნა"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "უკაცრავად, მოთხოვნილი გვერდი ვერ მოიძებნა."
+
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/change_form.html:17
+#: contrib/admin/templates/admin/change_list.html:8
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/auth/user/change_password.html:10
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_reset_complete.html:4
+#: contrib/admin/templates/registration/password_reset_confirm.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "საწყისი გვერდი"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "სერვერის შეცდომა"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "სერვერის შეცდომა (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "სერვერის შეცდომა <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"სისტემაში მოხდა შეცდომა. იგი გადაგზავნილია საიტის ადმინისტრატორის ელექტრონულ "
+"ფოსტაზე და მალე გამოსწორდება. გმადლობთ მოთმინებისათვის."
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "კეთილი იყოს თქვენი მობრძანება,"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "დოკუმენტაცია"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:13
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+msgid "Change password"
+msgstr "პაროლის შეცვლა"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/comments/templates/comments/form.html:6
+msgid "Log out"
+msgstr "გამოსვლა"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django-ს ადმინისტრირების საიტი"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django-ს ადმინისტრირება"
+
+#: contrib/admin/templates/admin/change_form.html:19
+#: contrib/admin/templates/admin/index.html:29
+msgid "Add"
+msgstr "დამატება"
+
+#: contrib/admin/templates/admin/change_form.html:26
+#: contrib/admin/templates/admin/object_history.html:5
+msgid "History"
+msgstr "ისტორია"
+
+#: contrib/admin/templates/admin/change_form.html:27
+msgid "View on site"
+msgstr "წარმოდგენა საიტზე"
+
+#: contrib/admin/templates/admin/change_form.html:37
+#: contrib/admin/templates/admin/auth/user/change_password.html:22
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "გთხოვთ, გაასწორეთ ქვემოთ მოყვანილი შეცდომა."
+msgstr[1] "გთხოვთ, გაასწორეთ ქვემოთ მოყვანილი შეცდომები."
+
+#: contrib/admin/templates/admin/change_list.html:16
+#, python-format
+msgid "Add %(name)s"
+msgstr "დავამატოთ %(name)s"
+
+#: contrib/admin/templates/admin/change_list.html:26
+msgid "Filter"
+msgstr "ფილტრი"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+#: contrib/admin/templates/admin/edit_inline/tabular.html:15
+msgid "Delete"
+msgstr "წავშალოთ"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:15
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"ობიექტების წაშლა: %(object_name)s '%(escaped_object)s' გამოიწვევს "
+"დაკავშირებული ობიექტების წაშლას, მაგრამ თქვენ არა გაქვთ შემდეგი ტიპების "
+"ობიექტების წაშლის უფლება:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:22
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"ნამდვილად გსურთ, წაშალოთ %(object_name)s \"%(escaped_object)s\"? ყველა "
+"ქვემოთ მოყვანილი დაკავშირებული ობიექტი წაშლილი იქნება:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:27
+msgid "Yes, I'm sure"
+msgstr "კი, ნამდვილად"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " %(filter_title)s მიხედვით "
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "%(name)s აპლიკაციაში არსებული მოდელები."
+
+#: contrib/admin/templates/admin/index.html:19
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:35
+msgid "Change"
+msgstr "შეცვლა"
+
+#: contrib/admin/templates/admin/index.html:45
+msgid "You don't have permission to edit anything."
+msgstr "თქვენ არა გაქვთ რედაქტირების უფლება."
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "Recent Actions"
+msgstr "ბოლო მოქმედებები"
+
+#: contrib/admin/templates/admin/index.html:54
+msgid "My Actions"
+msgstr "ჩემი მოქმედებები"
+
+#: contrib/admin/templates/admin/index.html:58
+msgid "None available"
+msgstr "არ არის მისაწვდომი"
+
+#: contrib/admin/templates/admin/invalid_setup.html:7
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"თქვენი მონაცემთა ბაზის ინსტალაცია არაკორექტულია. დარწმუნდით, რომ მონაცემთა "
+"ბაზის შესაბამისი ცხრილები შექმნილია, და მონაცემთა ბაზის წაკითხვა შეუძლია "
+"შესაბამის მომხმარებელს."
+
+#: contrib/admin/templates/admin/login.html:19
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+msgid "Username:"
+msgstr "მომხმარებლის სახელი:"
+
+#: contrib/admin/templates/admin/login.html:22
+#: contrib/comments/templates/comments/form.html:8
+msgid "Password:"
+msgstr "პაროლი:"
+
+#: contrib/admin/templates/admin/object_history.html:16
+msgid "Date/time"
+msgstr "თარიღი/დრო"
+
+#: contrib/admin/templates/admin/object_history.html:17
+msgid "User"
+msgstr "მომხმარებელი"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Action"
+msgstr "მოქმედება"
+
+#: contrib/admin/templates/admin/object_history.html:24
+msgid "DATE_WITH_TIME_FULL"
+msgstr "N j, Y, P"
+
+#: contrib/admin/templates/admin/object_history.html:32
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"ამ ობიექტს ცვლილებების ისტორია არა აქვს. როგორც ჩანს, იგი არ იყო დამატებული "
+"ადმინისტრირების საიტის მეშვეობით."
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "ვაჩვენოთ ყველა"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "ძებნა"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "ერთი შედეგი"
+msgstr[1] "%(counter)s შედეგი"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "სულ %(full_result_count)s"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "შევინახოთ, როგორც ახალი"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "შევინახოთ და დავამატოთ ახალი"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "შევინახოთ და გავაგრძელოთ რედაქტირება"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "შევინახოთ"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"ჯერ შეიყვანეთ მომხმარებლის სახელი და პაროლი. ამის შემდეგ თქვენ გექნებათ "
+"მომხმარებლის სხვა ოპციების რედაქტირების შესაძლებლობა."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:13
+#: contrib/auth/forms.py:14 contrib/auth/forms.py:51
+msgid "Username"
+msgstr "მომხმარებელი"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:20
+#: contrib/admin/templates/admin/auth/user/change_password.html:33
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:52 contrib/auth/forms.py:176
+msgid "Password"
+msgstr "პაროლი"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:26
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+#: contrib/auth/forms.py:177
+msgid "Password (again)"
+msgstr "პაროლი (განმეორებით)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:27
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+msgid "Enter the same password as above, for verification."
+msgstr "შეიყვანეთ იგივე პაროლი, დამოწმებისათვის."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:26
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+"შეიყვანეთ ახალი პაროლი მომხმარებლისათვის <strong>%(username)s</strong>."
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "გმადლობთ, რომ დღეს ამ საიტთან მუშაობას დაუთმეთ დრო."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "ხელახლა შესვლა"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "პაროლის შეცვლა"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "პაროლი წარმატებით შეიცვალა"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "თქვენი პაროლი შეიცვალა."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"გთხოვთ, უსაფრთხოების დაცვის მიზნით, შეიყვანოთ თქვენი ძველი პაროლი, შემდეგ კი "
+"ახალი პაროლი ორჯერ, რათა დარწმუნდეთ, რომ იგი შეყვანილია სწორად."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "ძველი პაროლი:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+#: contrib/admin/templates/registration/password_reset_confirm.html:18
+msgid "New password:"
+msgstr "ახალი პაროლი:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+#: contrib/admin/templates/registration/password_reset_confirm.html:20
+msgid "Confirm password:"
+msgstr "პაროლის დამოწმება:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+#: contrib/admin/templates/registration/password_reset_confirm.html:21
+msgid "Change my password"
+msgstr "შევცვალოთ ჩემი პაროლი"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:4
+#: contrib/admin/templates/registration/password_reset_confirm.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+msgid "Password reset"
+msgstr "პაროლის აღდგენა"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:6
+#: contrib/admin/templates/registration/password_reset_complete.html:10
+msgid "Password reset complete"
+msgstr "პაროლის აღდგენა დასრულებულია"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:12
+msgid "Your password has been set.  You may go ahead and log in now."
+msgstr "თქვენი პაროლი დაყენებულია. ახლა შეგიძლიათ გადახვიდეთ შემდეგ გვერდზე და შეხვიდეთ სისტემაში."
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:4
+msgid "Password reset confirmation"
+msgstr "პაროლი შეცვლის დამოწმება"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:12
+msgid "Enter new password"
+msgstr "შეიყვანეთ ახალი პაროლი:"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:14
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"გთხოვთ, შეიყვანეთ თქვენი ახალი პაროლი ორჯერ, რათა დავრწმუნდეთ, "
+"რომ იგი სწორად ჩაბეჭდეთ."
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:26
+msgid "Password reset unsuccessful"
+msgstr "პაროლის აღდგენა წარუმატებლად დასრულდა"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:28
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used.  Please request a new password reset."
+msgstr ""
+"პაროლის აღდგენის ბმული არასწორი იყო, შესაძლოა იმის გამო, რომ "
+"იგი უკვე ყოფილა გამოყენებული. გთხოვთ, კიდევ ერთხელ სცადოთ პაროლის აღდგენა."
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "პაროლის აღდგენა წარმატებით დასრულდა"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed you instructions for setting your password to the e-mail "
+"address you submitted. You should be receiving it shortly."
+msgstr ""
+"თქვენს მიერ მითითებულ საფოსტო ყუთზე გამოგიგზავნეთ ინსტრუქციები, "
+"თუ როგორ უნდა დააყენოთ თქვენი პაროლი. წერილი მალე უნდა მიიღოთ."
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "თქვენ მიიღეთ ეს წერილი, რადგანაც მოითხოვეთ პაროლის აღდგენა"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "თქვენი მომხმარებლის ანგარიშისათვის %(site_name)s-საიტზე"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+msgid "Please go to the following page and choose a new password:"
+msgstr "გთხოვთ, გადახვიდეთ შემდეგ გვერდზე და აირჩიოთ ახალი პაროლი:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:9
+msgid "Your username, in case you've forgotten:"
+msgstr "თქვენი მომხმარებლის სახელი (თუ დაგავიწყდათ):"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Thanks for using our site!"
+msgstr "გმადლობთ, რომ იყენებთ ჩვენს საიტს!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s საიტის გუნდი"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll e-mail "
+"instructions for setting a new one."
+msgstr ""
+"დაგავიწყდათ პაროლი? შეიყვანეთ თქვენი ელექტრონული ფოსტის მისამართი ამ ველში, "
+"ჩვენ გამოგიგზავნით ინსტრუქციებს, როგორ დააყენოთ ახალი."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "ელ. ფოსტა:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "აღვადგინოთ ჩემი პაროლი"
+
+#: contrib/admin/templatetags/admin_list.py:284
+msgid "All dates"
+msgstr "ყველა თარიღი"
+
+#: contrib/admin/views/main.py:65
+#, python-format
+msgid "Select %s"
+msgstr "ავირჩიოთ %s"
+
+#: contrib/admin/views/main.py:65
+#, python-format
+msgid "Select %s to change"
+msgstr "აირჩიეთ %s შესაცვლელად"
+
+#: contrib/admin/views/template.py:36 contrib/sites/models.py:38
+msgid "site"
+msgstr "საიტი"
+
+#: contrib/admin/views/template.py:38
+msgid "template"
+msgstr "შაბლონი"
+
+#: contrib/admindocs/views.py:53 contrib/admindocs/views.py:55
+#: contrib/admindocs/views.py:57
+msgid "tag:"
+msgstr "ტეგი:"
+
+#: contrib/admindocs/views.py:87 contrib/admindocs/views.py:89
+#: contrib/admindocs/views.py:91
+msgid "filter:"
+msgstr "ფილტრი:"
+
+#: contrib/admindocs/views.py:153 contrib/admindocs/views.py:155
+#: contrib/admindocs/views.py:157
+msgid "view:"
+msgstr "წარმოდგენა:"
+
+#: contrib/admindocs/views.py:187
+#, python-format
+msgid "App %r not found"
+msgstr "აპლიკაცია %r ვერ მოიძებნა"
+
+#: contrib/admindocs/views.py:194
+msgid "Model %(model_name)r not found in app %(app_label)r"
+msgstr "მოდელი %(model_name)r ვერ მოიძებნა აპლიკაციაში %(app_label)r"
+
+#: contrib/admindocs/views.py:206
+msgid "the related `%(app_label)s.%(data_type)s` object"
+msgstr "`%(app_label)s.%(data_type)s` დაკავშირებული ობიექტი"
+
+#: contrib/admindocs/views.py:206 contrib/admindocs/views.py:228
+#: contrib/admindocs/views.py:242 contrib/admindocs/views.py:247
+msgid "model:"
+msgstr "მოდელი:"
+
+#: contrib/admindocs/views.py:237
+msgid "related `%(app_label)s.%(object_name)s` objects"
+msgstr "`%(app_label)s.%(object_name)s` დაკავშირებული ობიექტები"
+
+#: contrib/admindocs/views.py:242
+#, python-format
+msgid "all %s"
+msgstr "ყველა %s"
+
+#: contrib/admindocs/views.py:247
+#, python-format
+msgid "number of %s"
+msgstr "%s - რაოდენობა"
+
+#: contrib/admindocs/views.py:253
+#, python-format
+msgid "Fields on %s objects"
+msgstr "%s ობიექტების ველები"
+
+#: contrib/admindocs/views.py:317 contrib/admindocs/views.py:328
+#: contrib/admindocs/views.py:330 contrib/admindocs/views.py:336
+#: contrib/admindocs/views.py:337 contrib/admindocs/views.py:339
+msgid "Integer"
+msgstr "მთელი"
+
+#: contrib/admindocs/views.py:318
+msgid "Boolean (Either True or False)"
+msgstr "ლოგიკური (True ან False)"
+
+#: contrib/admindocs/views.py:319 contrib/admindocs/views.py:338
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "სტრიქონი (%(max_length)s სიმბოლომდე)"
+
+#: contrib/admindocs/views.py:320
+msgid "Comma-separated integers"
+msgstr "მძიმით გამოყოფილი მთელი რიცხვები"
+
+#: contrib/admindocs/views.py:321
+msgid "Date (without time)"
+msgstr "თარიღი (დროის გარეშე)"
+
+#: contrib/admindocs/views.py:322
+msgid "Date (with time)"
+msgstr "თარიღი (დროსთან ერთად)"
+
+#: contrib/admindocs/views.py:323
+msgid "Decimal number"
+msgstr "ათობითი რიცხვი"
+
+#: contrib/admindocs/views.py:324
+msgid "E-mail address"
+msgstr "ელ. ფოსტის მისამართი"
+
+#: contrib/admindocs/views.py:325 contrib/admindocs/views.py:326
+#: contrib/admindocs/views.py:329
+msgid "File path"
+msgstr "გზა ფაილისაკენ"
+
+#: contrib/admindocs/views.py:327
+msgid "Floating point number"
+msgstr "რიცხვი მცოცავი წერტილით"
+
+#: contrib/admindocs/views.py:331 contrib/comments/models.py:89
+msgid "IP address"
+msgstr "IP-მისამართი"
+
+#: contrib/admindocs/views.py:333
+msgid "Boolean (Either True, False or None)"
+msgstr "ლოგიკური (True, False ან None)"
+
+#: contrib/admindocs/views.py:334
+msgid "Relation to parent model"
+msgstr "მშობელ მოდელთან დამოკიდებულება"
+
+#: contrib/admindocs/views.py:335
+msgid "Phone number"
+msgstr "ტელეფონის ნომერი"
+
+#: contrib/admindocs/views.py:340
+msgid "Text"
+msgstr "ტექსტი"
+
+#: contrib/admindocs/views.py:341
+msgid "Time"
+msgstr "დრო"
+
+#: contrib/admindocs/views.py:342 contrib/flatpages/admin.py:8
+#: contrib/flatpages/models.py:8
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admindocs/views.py:343
+msgid "U.S. state (two uppercase letters)"
+msgstr "აშშ შტატი (ორი ასომთავრული)"
+
+#: contrib/admindocs/views.py:344
+msgid "XML text"
+msgstr "XML ტექსტი"
+
+#: contrib/admindocs/views.py:370
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s არ არის urlpattern-ის შესაბამისი ობიექტი"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "სანიშნები"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:4
+msgid "Documentation bookmarklets"
+msgstr "დოკუმენტაციის სანიშნები"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:8
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">სანიშნების დასაყენებლად გადაათრიეთ ბმული თქვენი "
+"სანიშნების\n"
+"პანელზე, ან დააწკაპეთ ბმულზე მარჯვენა ღილაკით და დაამატეთ იგი სანიშნებში.\n"
+"ამის შემდეგ თქვენ შეძლებთ სანიშნის არჩევას საიტის ნებისმიერი გვერდიდან.\n"
+"გაითვალისწინეთ, რომ ზოგიერთი სანიშნის მოხმარებისათვის საჭიროა, რომ თქვენ\n"
+"იყოთ შესული ამ საიტზე ე.წ. \"შიდა\" კომპიუტერიდან (შეუთანხმდით თქვენს\n"
+"ადმინისტრატორს, თუ არ ხართ დარწმუნებული, რომ თქვენი კომპიუტერი არის\n"
+"\"შიდა\" კომპიუტერი).</p>\n"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:18
+msgid "Documentation for this page"
+msgstr "ამ გვერდის დოკუმენტაცია"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:19
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+"გადასვლა ნებისმიერი გვერდიდან იმ წარმოდგენის დოკუმენტაციაზე, რომელიც ამ "
+"გვერდს აგენერირებს."
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:21
+msgid "Show object ID"
+msgstr "ობიექტის ID-ის ჩვენება"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:22
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"ერთი ობიექტის ამსახველი გვერდის content-type-ის და უნიკალური ID-ის ჩვენება."
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:24
+msgid "Edit this object (current window)"
+msgstr "შევცვალოთ ეს ობიექტი (იმავე ფანჯარაში)"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:25
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "ერთი ობიექტის ამსახველი გვერდების ადმინისტრირებაზე გადასვლა."
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:27
+msgid "Edit this object (new window)"
+msgstr "შევცვალოთ ეს ობიექტი (ახალ ფანჯარაში)"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:28
+msgid "As above, but opens the admin page in a new window."
+msgstr "იგივე, ოღონდ ხსნის ადმინისტრირების გვერდს ახალ ფანჯარაში."
+
+#: contrib/auth/admin.py:21
+msgid "Personal info"
+msgstr "პირადი ინფორმაცია"
+
+#: contrib/auth/admin.py:22
+msgid "Permissions"
+msgstr "უფლებები"
+
+#: contrib/auth/admin.py:23
+msgid "Important dates"
+msgstr "მნიშვნელოვანი თარიღები"
+
+#: contrib/auth/admin.py:24
+msgid "Groups"
+msgstr "ჯგუფები"
+
+#: contrib/auth/admin.py:60
+msgid "Add user"
+msgstr "მომხმარებლის დამატება"
+
+#: contrib/auth/admin.py:85
+msgid "Password changed successfully."
+msgstr "პაროლი წარმატებით შეიცვალა."
+
+#: contrib/auth/admin.py:91
+#, python-format
+msgid "Change password: %s"
+msgstr "შევცვალოთ პაროლი: %s"
+
+#: contrib/auth/forms.py:15 contrib/auth/models.py:137
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr ""
+"აუცილებელია. 30 ან ნაკლები სიმბოლო. მხოლოდ ლათინური ასოები, ციფრები და "
+"ხაზგასმა."
+
+#: contrib/auth/forms.py:16 core/validators.py:72
+msgid "This value must contain only letters, numbers and underscores."
+msgstr ""
+"ეს მნიშვნელობა შეიძლება შეიცავდეს მხოლოდ ასოებს, ციფრებს და ხაზგასმის "
+"ნიშნებს."
+
+#: contrib/auth/forms.py:18
+msgid "Password confirmation"
+msgstr "პაროლის დამოწმება"
+
+#: contrib/auth/forms.py:30
+msgid "A user with that username already exists."
+msgstr "მომხმარებელი ამ სახელით უკვე არსებობს."
+
+#: contrib/auth/forms.py:36 contrib/auth/forms.py:146
+#: contrib/auth/forms.py:188
+msgid "The two password fields didn't match."
+msgstr "პაროლის ორი ველი ერთმანეთს არ ემთხვევა."
+
+#: contrib/auth/forms.py:74 contrib/comments/views/comments.py:58
+msgid "This account is inactive."
+msgstr "თქვენი ანგარიში არააქტიურია."
+
+#: contrib/auth/forms.py:79 contrib/comments/views/comments.py:49
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"თქვენი ბროუზერი არ ღებულობს cookie-ებს. Cookie საჭიროა საიტზე შესასვლელად."
+
+#: contrib/auth/forms.py:92
+msgid "E-mail"
+msgstr "ელ. ფოსტა"
+
+#: contrib/auth/forms.py:101
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr ""
+"ელ.ფოსტის ეს მისამართი არ შეესაბამება არცერთ მომხმარებელს. ნამდვილად ხართ "
+"დარეგისტრირებული?"
+
+#: contrib/auth/forms.py:126
+#, python-format
+msgid "Password reset on %s"
+msgstr "პაროლი შეცვლილია: %s"
+
+#: contrib/auth/forms.py:134
+msgid "New password"
+msgstr "ახალი პაროლი"
+
+#: contrib/auth/forms.py:135
+msgid "New password confirmation"
+msgstr "ახალი პაროლის დამოწმება"
+
+#: contrib/auth/forms.py:160
+msgid "Old password"
+msgstr "ძველი პაროლი"
+
+#: contrib/auth/forms.py:168
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "თქვენი ძველი პაროლი შეყვანილია არასწორად. გთხოვთ, შეიყვანოთ ხელახლა."
+
+#: contrib/auth/models.py:73 contrib/auth/models.py:96
+msgid "name"
+msgstr "სახელი"
+
+#: contrib/auth/models.py:75
+msgid "codename"
+msgstr "კოდური სახელი"
+
+#: contrib/auth/models.py:78
+msgid "permission"
+msgstr "უფლება"
+
+#: contrib/auth/models.py:79 contrib/auth/models.py:97
+msgid "permissions"
+msgstr "უფლებები"
+
+#: contrib/auth/models.py:100
+msgid "group"
+msgstr "ჯგუფი"
+
+#: contrib/auth/models.py:101 contrib/auth/models.py:147
+msgid "groups"
+msgstr "ჯგუფები"
+
+#: contrib/auth/models.py:137
+msgid "username"
+msgstr "მომხმარებლის სახელი"
+
+#: contrib/auth/models.py:138
+msgid "first name"
+msgstr "სახელი"
+
+#: contrib/auth/models.py:139
+msgid "last name"
+msgstr "გვარი"
+
+#: contrib/auth/models.py:140
+msgid "e-mail address"
+msgstr "ელ. ფოსტა"
+
+#: contrib/auth/models.py:141
+msgid "password"
+msgstr "პაროლი"
+
+#: contrib/auth/models.py:141
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"გამოიყენეთ '[algo]$[salt]$[hexdigest]' ან <a href=\"password/\">პაროლის "
+"შეცვლის ფორმა</a>."
+
+#: contrib/auth/models.py:142
+msgid "staff status"
+msgstr "თანამშრომლობის სტატუსი"
+
+#: contrib/auth/models.py:142
+msgid "Designates whether the user can log into this admin site."
+msgstr ""
+"განსაზღვრავს, აქვს თუ არა მომხმარებელს ადმინისტრირების საიტზე შესვლის უფლება."
+
+#: contrib/auth/models.py:143
+msgid "active"
+msgstr "აქტიურია"
+
+#: contrib/auth/models.py:143
+msgid ""
+"Designates whether this user should be treated as active. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"განსაზღვრავს, რომ მომხმარებელი გააქტიურებულია. მომხმარებლის წაშლის მაგივრად "
+"გადანიშნეთ ეს დროშა."
+
+#: contrib/auth/models.py:144
+msgid "superuser status"
+msgstr "სუპერმომხმარებლის სტატუსი"
+
+#: contrib/auth/models.py:144
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr "განსაზღვრავს, რომ ამ მომხმარებელს აქვს ყველა უფლება."
+
+#: contrib/auth/models.py:145
+msgid "last login"
+msgstr "ბოლო შესვლა"
+
+#: contrib/auth/models.py:146
+msgid "date joined"
+msgstr "გაწევრიანების თარიღი"
+
+#: contrib/auth/models.py:148
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"ინდივიდუალურად მითითებული უფლებების გარდა, ეს მომხმარებელი მიიღებს აგრეთვე "
+"ყველა იმ ჯგუფის უფლებას, რომელშიც იგი გაწევრიანებულია."
+
+#: contrib/auth/models.py:149
+msgid "user permissions"
+msgstr "მომხმარებლის უფლებები"
+
+#: contrib/auth/models.py:153
+msgid "user"
+msgstr "მომხმარებელი"
+
+#: contrib/auth/models.py:154
+msgid "users"
+msgstr "მომხმარებლები"
+
+#: contrib/auth/models.py:309
+msgid "message"
+msgstr "შეტყობინება"
+
+#: contrib/auth/views.py:50
+msgid "Logged out"
+msgstr "გამოსული ხართ"
+
+#: contrib/comments/models.py:71 contrib/comments/models.py:164
+msgid "object ID"
+msgstr "ობიექტის ID"
+
+#: contrib/comments/models.py:72
+msgid "headline"
+msgstr "ჰედლაინი"
+
+#: contrib/comments/models.py:73 contrib/comments/models.py:95
+#: contrib/comments/models.py:165
+msgid "comment"
+msgstr "კომენტარი"
+
+#: contrib/comments/models.py:74
+msgid "rating #1"
+msgstr "რეიტინგი #1"
+
+#: contrib/comments/models.py:75
+msgid "rating #2"
+msgstr "რეიტინგი #2"
+
+#: contrib/comments/models.py:76
+msgid "rating #3"
+msgstr "რეიტინგი #3"
+
+#: contrib/comments/models.py:77
+msgid "rating #4"
+msgstr "რეიტინგი #4"
+
+#: contrib/comments/models.py:78
+msgid "rating #5"
+msgstr "რეიტინგი #5"
+
+#: contrib/comments/models.py:79
+msgid "rating #6"
+msgstr "რეიტინგი #6"
+
+#: contrib/comments/models.py:80
+msgid "rating #7"
+msgstr "რეიტინგი #7"
+
+#: contrib/comments/models.py:81
+msgid "rating #8"
+msgstr "რეიტინგი #8"
+
+#: contrib/comments/models.py:86
+msgid "is valid rating"
+msgstr "დასაშვები რეიტინგია"
+
+#: contrib/comments/models.py:87 contrib/comments/models.py:167
+msgid "date/time submitted"
+msgstr "გაგზავნის თარიღი და დრო"
+
+#: contrib/comments/models.py:88 contrib/comments/models.py:168
+msgid "is public"
+msgstr "საყოველთაოა"
+
+#: contrib/comments/models.py:90
+msgid "is removed"
+msgstr "წაშლილია"
+
+#: contrib/comments/models.py:90
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"მონიშნეთ ეს დროშა, თუ კომენტარი შეუსაბამოა. მის ნაცვლად გაჩნდება "
+"შეტყობინება: \"კომენტარი წაშლილია\"."
+
+#: contrib/comments/models.py:96
+msgid "comments"
+msgstr "კომენტარები"
+
+#: contrib/comments/models.py:128 contrib/comments/models.py:199
+msgid "Content object"
+msgstr "კონტენტის ობიექტი"
+
+#: contrib/comments/models.py:156
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"გამოგზავნილია %(user)s-ს მიერ, %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:166
+msgid "person's name"
+msgstr "პიროვნების სახელი"
+
+#: contrib/comments/models.py:169
+msgid "ip address"
+msgstr "ip-მისამართი"
+
+#: contrib/comments/models.py:171
+msgid "approved by staff"
+msgstr "მოწონებულია პერსონალის მიერ"
+
+#: contrib/comments/models.py:175
+msgid "free comment"
+msgstr "თავისუფალი კომენტარი"
+
+#: contrib/comments/models.py:176
+msgid "free comments"
+msgstr "თავისუფალი კომენტარები"
+
+#: contrib/comments/models.py:227
+msgid "score"
+msgstr "შეფასება"
+
+#: contrib/comments/models.py:228
+msgid "score date"
+msgstr "შეფასების თარიღი"
+
+#: contrib/comments/models.py:232
+msgid "karma score"
+msgstr "კარმა-შეფასება"
+
+#: contrib/comments/models.py:233
+msgid "karma scores"
+msgstr "კარმა-შეფასებები"
+
+#: contrib/comments/models.py:237
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d შეფასებულია %(user)s-ის მიერ"
+
+#: contrib/comments/models.py:254
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"ეს კომენტარი მონიშნულია %(user)s-ის მიერ:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:262
+msgid "flag date"
+msgstr "მონიშვნის თარიღი"
+
+#: contrib/comments/models.py:266
+msgid "user flag"
+msgstr "მომხმარებლის მონიშვნა"
+
+#: contrib/comments/models.py:267
+msgid "user flags"
+msgstr "მომხმარებლის მონიშვნები"
+
+#: contrib/comments/models.py:271
+#, python-format
+msgid "Flag by %r"
+msgstr "%r-ის მონიშვნები"
+
+#: contrib/comments/models.py:277
+msgid "deletion date"
+msgstr "წაშლის თარიღი"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "მოდერატორის წაშლა"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "მოდერატორის წაშლები"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "მოდერატორის წაშლა %r-ის მიერ"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "დაგავიწყდათ თქვენი პაროლი?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "რეიტინგები"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "აუცილებელია"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "არასავალდებულოა"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "სურათის გაგზავნა"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "კომენტარი:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "კომენტარის წინასწარი ნახვა"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "თქვენი სახელი:"
+
+#: contrib/comments/views/comments.py:76
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr "ეს რეიტინგი აუცილებელია, რადგანაც თქვენ შესულხართ სხვა რეიტინგებში."
+
+#: contrib/comments/views/comments.py:160
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"ეს კომენტარი გამოგზავნილია მომხმარებლის მიერ, რომელსაც %(count)s-ზე ნაკლები "
+"კომენტარი აქვს:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"ეს კომენტარი გამოგზავნილია მომხმარებლის მიერ, რომელსაც %(count)s-ზე ნაკლები "
+"კომენტარი აქვს:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:165
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"ეს კომენტარი გამოგზავნილია ზერელე მომხმარებლის მიერ:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:238
+#: contrib/comments/views/comments.py:331
+msgid "Only POSTs are allowed"
+msgstr "დაშვებულია მხოლოდ POST-ები"
+
+#: contrib/comments/views/comments.py:242
+#: contrib/comments/views/comments.py:335
+msgid "One or more of the required fields wasn't submitted"
+msgstr "ერთი ან რამდენიმე აუცილებელი ველი არ იყო მითითებული"
+
+#: contrib/comments/views/comments.py:246
+#: contrib/comments/views/comments.py:337
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "ვიღაცა ჩაერია კომენტარის ფორმაში (უსაფრთხოების დარღვევა)"
+
+#: contrib/comments/views/comments.py:256
+#: contrib/comments/views/comments.py:343
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"კომენტარის ფორმას აქვს არასწორი პარამეტრი 'target' -- ობიექტის ID არ იყო "
+"სწორი"
+
+#: contrib/comments/views/comments.py:307
+#: contrib/comments/views/comments.py:372
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "კომენტარის ფორმას არა აქვს 'წინასწარი ხედვის' ან 'გაგზავნის' საშუალება"
+
+#: contrib/comments/views/karma.py:21
+msgid "Anonymous users cannot vote"
+msgstr "ანონიმურ მომხმარებლებს ხმის მიცემის უფლება არა აქვთ"
+
+#: contrib/comments/views/karma.py:25
+msgid "Invalid comment ID"
+msgstr "კომენტარის ID არასწორია"
+
+#: contrib/comments/views/karma.py:27
+msgid "No voting for yourself"
+msgstr "საკუთარი თავისათვის ხმის მიცემა აკრძალულია"
+
+#: contrib/contenttypes/models.py:67
+msgid "python model class name"
+msgstr "python-ის მოდელის კლასის სახელი"
+
+#: contrib/contenttypes/models.py:71
+msgid "content type"
+msgstr "კონტენტის ტიპი"
+
+#: contrib/contenttypes/models.py:72
+msgid "content types"
+msgstr "კონტენტის ტიპები"
+
+#: contrib/flatpages/admin.py:9
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"მაგალითი: '/about/contact/'. ყურადღება მიაქციეთ დახრილ ხაზებს თავში და "
+"ბოლოში."
+
+#: contrib/flatpages/admin.py:11 core/validators.py:76
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"ეს მნიშვნელობა შეიძლება შეიცავდეს მხოლოდ ასოებს, ციფრებს, ხაზგასმის ნიშნებს, "
+"ტირეებს და დახრილ ხაზებს."
+
+#: contrib/flatpages/admin.py:22
+msgid "Advanced options"
+msgstr "დამატებითი პარამეტრები"
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "სათაური"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "კონტენტი"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "ჩავრთოთ კომენტარები"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "შაბლონის სახელი"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"მაგალითი: 'flatpages/contact_page.html'. თუ იგი მითითებული არ არის, "
+"გამოყენებული იქნება 'flatpages/default.html'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "რეგისტრაცია აუცილებელია"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+"თუ ეს დროშა ჩართულია, მხოლო შემოსულ მომხმარებლებს ექნებათ გვერდის "
+"დათვალიერების საშუალება."
+
+#: contrib/flatpages/models.py:19
+msgid "flat page"
+msgstr "უბრალო გვერდი"
+
+#: contrib/flatpages/models.py:20
+msgid "flat pages"
+msgstr "უბრალო გვერდები"
+
+#: contrib/gis/forms/fields.py:10
+msgid "No geometry value provided."
+msgstr "გეომეტრიის მნიშვნელობა მოცემული არ არის."
+
+#: contrib/gis/forms/fields.py:11
+msgid "Invalid Geometry value."
+msgstr "გეომეტრიის მნიშვნელობა არასწორია."
+
+#: contrib/gis/forms/fields.py:12
+msgid "Invalid Geometry type."
+msgstr "გეომეტრიის ტიპი არასწორია."
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "th"
+msgstr "-ე"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "st"
+msgstr "-ლი"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "nd"
+msgstr "-ე"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "rd"
+msgstr "-ე"
+
+#: contrib/humanize/templatetags/humanize.py:51
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f მილიონი"
+msgstr[1] "%(value).1f მილიონი"
+
+#: contrib/humanize/templatetags/humanize.py:54
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f მილიარდი"
+msgstr[1] "%(value).1f მილიარდი"
+
+#: contrib/humanize/templatetags/humanize.py:57
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f ტრილიონი"
+msgstr[1] "%(value).1f ტრილიონი"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "one"
+msgstr "ერთი"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "two"
+msgstr "ორი"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "three"
+msgstr "სამი"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "four"
+msgstr "ოთხი"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "five"
+msgstr "ხუთი"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "six"
+msgstr "ექვსი"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "seven"
+msgstr "შვიდი"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "eight"
+msgstr "რვა"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "nine"
+msgstr "ცხრა"
+
+#: contrib/humanize/templatetags/humanize.py:93
+msgid "today"
+msgstr "დღეს"
+
+#: contrib/humanize/templatetags/humanize.py:95
+msgid "tomorrow"
+msgstr "ხვალ"
+
+#: contrib/humanize/templatetags/humanize.py:97
+msgid "yesterday"
+msgstr "გუშინ"
+
+#: contrib/localflavor/ar/forms.py:27
+msgid "Enter a postal code in the format NNNN or ANNNNAAA."
+msgstr "შეიყვანეთ საფოსტო კოდი ერთ-ერთ ფორმატში: NNNN ან ANNNNAAA."
+
+#: contrib/localflavor/ar/forms.py:49 contrib/localflavor/br/forms.py:96
+#: contrib/localflavor/br/forms.py:135 contrib/localflavor/pe/forms.py:23
+#: contrib/localflavor/pe/forms.py:51
+msgid "This field requires only numbers."
+msgstr "ამ ველში შეიძლება იყოს მხოლოდ ციფრები."
+
+#: contrib/localflavor/ar/forms.py:50
+msgid "This field requires 7 or 8 digits."
+msgstr "ამ ველში შეიძლება იყოს 7 ან 8 თანრიგი."
+
+#: contrib/localflavor/ar/forms.py:79
+msgid "Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format."
+msgstr ""
+"შეიყვანეთ დასაშვები CUIT ერთ-ერთ ფორმატში: XX-XXXXXXXX-X ან XXXXXXXXXXXX."
+
+#: contrib/localflavor/ar/forms.py:80
+msgid "Invalid CUIT."
+msgstr "არასწორი CUIT."
+
+#: contrib/localflavor/at/at_states.py:5
+msgid "Burgenland"
+msgstr "ბურგლენდი"
+
+#: contrib/localflavor/at/at_states.py:6
+msgid "Carinthia"
+msgstr "კარინტია"
+
+#: contrib/localflavor/at/at_states.py:7
+msgid "Lower Austria"
+msgstr "ქვემო ავსტრია"
+
+#: contrib/localflavor/at/at_states.py:8
+msgid "Upper Austria"
+msgstr "ზემო ავსტრია"
+
+#: contrib/localflavor/at/at_states.py:9
+msgid "Salzburg"
+msgstr "ზალცბურგი"
+
+#: contrib/localflavor/at/at_states.py:10
+msgid "Styria"
+msgstr "სტირია"
+
+#: contrib/localflavor/at/at_states.py:11
+msgid "Tyrol"
+msgstr "ტიროლი"
+
+#: contrib/localflavor/at/at_states.py:12
+msgid "Vorarlberg"
+msgstr "ფორარლბერგი"
+
+#: contrib/localflavor/at/at_states.py:13
+msgid "Vienna"
+msgstr "ვენა"
+
+#: contrib/localflavor/at/forms.py:20 contrib/localflavor/ch/forms.py:16
+#: contrib/localflavor/no/forms.py:12
+msgid "Enter a zip code in the format XXXX."
+msgstr "შეიყვანეთ zip-კოდი ფორმატში XXXX."
+
+#: contrib/localflavor/at/forms.py:48
+msgid "Enter a valid Austrian Social Security Number in XXXX XXXXXX format."
+msgstr ""
+"შეიყვანეთ კანადაში დასაშვები პირადი ნომერი ფორმატში: XXX-XXX-XXX"
+
+#: contrib/localflavor/au/forms.py:16
+msgid "Enter a 4 digit post code."
+msgstr "შეიყვანეთ ოთხთანრიგიანი საფოსტო კოდი"
+
+#: contrib/localflavor/br/forms.py:21
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "შეიყვანეთ zip-კოდი ფორმატში: XXXXX-XXX."
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "ტელეფონის ნომრები უნდა იყოს XX-XXXX-XXXX ფორმატში."
+
+#: contrib/localflavor/br/forms.py:58
+msgid ""
+"Select a valid brazilian state. That state is not one of the available "
+"states."
+msgstr ""
+"შეიყვანეთ დასაშვები ბრაზილიური შტატი. მოცემული შტატი არ არის დასაშვები."
+
+#: contrib/localflavor/br/forms.py:94
+msgid "Invalid CPF number."
+msgstr "არასწორი CPF ნომერი."
+
+#: contrib/localflavor/br/forms.py:95
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr "ეს ველი უნდა შეიცავდეს 11 ციფრს ან 14 სიმბოლოს, ან ნაკლებს."
+
+#: contrib/localflavor/br/forms.py:134
+msgid "Invalid CNPJ number."
+msgstr "არასწორი CNPJ ნომერი."
+
+#: contrib/localflavor/br/forms.py:136
+msgid "This field requires at least 14 digits"
+msgstr "ეს ველი მოითხოვს არაუმეტეს 14 თანრიგისა"
+
+#: contrib/localflavor/ca/forms.py:17
+msgid "Enter a postal code in the format XXX XXX."
+msgstr "შეიყვანეთ საფოსტო კოდი ფორმატში: XXX XXX."
+
+#: contrib/localflavor/ca/forms.py:88
+msgid "Enter a valid Canadian Social Insurance number in XXX-XXX-XXX format."
+msgstr ""
+"შეიყვანეთ კანადაში დასაშვები სოციალური დაზღვევის ნომერი ფორმატში: XXX-XXX-XXX"
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr "აარგაუ"
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr "აპენცელ ინერჰოდენ"
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr "აპენცელ აუსერჰოდენ"
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr "ბაზელ-შტადტი"
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr "ბაზელ-ლანდი"
+
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr "ბერნი"
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr "ფრაიბურგი"
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr "ჟენევა"
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr "გლარუსი"
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr "გრაუბუენდენ"
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr "ჯურა"
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr "ლეცერნი"
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr "ნოიხატლი"
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr "ნიდვალდენი"
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr "ობვალდენი"
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr "შაფჰაუზენი"
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr "შვიცი"
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr "სოლოთურნი"
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr "სენტ-გალენი"
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr "თურგაუ"
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr "ტიჯინო"
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr "ური"
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr "ვალაისი"
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr "ვაუდი"
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr "ცუგი"
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr "ციურიხი"
+
+#: contrib/localflavor/ch/forms.py:64
+msgid ""
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
+msgstr ""
+"შეიყვანეთ შვეიცარიაში დაშვებული პირადი ან პასპორტის ნომერი, ფორმატებში: "
+"X1234567<0 ან 1234567890."
+
+#: contrib/localflavor/cl/forms.py:29
+msgid "Enter a valid Chilean RUT."
+msgstr "შეიყვანეთ დასაშვები ჩილიური RUT."
+
+#: contrib/localflavor/cl/forms.py:30
+msgid "Enter a valid Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr "შეიყვანეთ დასაშვები ჩილიური RUT. ფორმატი: XX.XXX.XXX-X."
+
+#: contrib/localflavor/cl/forms.py:31
+msgid "The Chilean RUT is not valid."
+msgstr "ჩილიური RUT არასწორია."
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr "ბადენ-ვურტემბერგი"
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr "ბავარია"
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr "ბერლინი"
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr "ბრანდენბურგი"
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr "ბრემენი"
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr "ჰამბურგი"
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr "ჰესენი"
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr "მეკლენბურგ-ვესტერნ პომერანია"
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr "ქვემო საქსონია"
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr "ჩრდილოეთ რაინ-ვესტფალია"
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr "რაინლანდ-პალატინატა"
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr "ზაარლანდი"
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr "საქსონია"
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr "საქსონია-ანჰალტ"
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr "შლეზვიგ-ჰოლშტაინი"
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr "თურინგია"
+
+#: contrib/localflavor/de/forms.py:14 contrib/localflavor/fi/forms.py:12
+#: contrib/localflavor/fr/forms.py:15
+msgid "Enter a zip code in the format XXXXX."
+msgstr "შეიყვანეთ zip-კოდი ფორმატში XXXXX."
+
+#: contrib/localflavor/de/forms.py:41
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr ""
+"შეიყვანეთ გერმანიაში დასაშვები პირადობის მოწმობის ნომერი, ფორმატში: "
+"XXXXXXXXXXX-XXXXXXX-XXXXXXX-X."
+
+#: contrib/localflavor/es/es_provinces.py:5
+msgid "Arava"
+msgstr "არავა"
+
+#: contrib/localflavor/es/es_provinces.py:6
+msgid "Albacete"
+msgstr "ალბასეტე"
+
+#: contrib/localflavor/es/es_provinces.py:7
+msgid "Alacant"
+msgstr "ალასანტი"
+
+#: contrib/localflavor/es/es_provinces.py:8
+msgid "Almeria"
+msgstr "ალმერია"
+
+#: contrib/localflavor/es/es_provinces.py:9
+msgid "Avila"
+msgstr "ავილა"
+
+#: contrib/localflavor/es/es_provinces.py:10
+msgid "Badajoz"
+msgstr "ბადაჰოსი"
+
+#: contrib/localflavor/es/es_provinces.py:11
+msgid "Illes Balears"
+msgstr "ილეს ბალეარს"
+
+#: contrib/localflavor/es/es_provinces.py:12
+msgid "Barcelona"
+msgstr "ბარსელონა"
+
+#: contrib/localflavor/es/es_provinces.py:13
+msgid "Burgos"
+msgstr "ბურგოსი"
+
+#: contrib/localflavor/es/es_provinces.py:14
+msgid "Caceres"
+msgstr "კასერესი"
+
+#: contrib/localflavor/es/es_provinces.py:15
+msgid "Cadiz"
+msgstr "კადიზი"
+
+#: contrib/localflavor/es/es_provinces.py:16
+msgid "Castello"
+msgstr "კასტელო"
+
+#: contrib/localflavor/es/es_provinces.py:17
+msgid "Ciudad Real"
+msgstr "სიუდად რეალი"
+
+#: contrib/localflavor/es/es_provinces.py:18
+msgid "Cordoba"
+msgstr "კორდობა"
+
+#: contrib/localflavor/es/es_provinces.py:19
+msgid "A Coruna"
+msgstr "ა კორუნია"
+
+#: contrib/localflavor/es/es_provinces.py:20
+msgid "Cuenca"
+msgstr "კუენსა"
+
+#: contrib/localflavor/es/es_provinces.py:21
+msgid "Girona"
+msgstr "გირონა"
+
+#: contrib/localflavor/es/es_provinces.py:22
+msgid "Granada"
+msgstr "გრანადა"
+
+#: contrib/localflavor/es/es_provinces.py:23
+msgid "Guadalajara"
+msgstr "გუადალაჯარა"
+
+#: contrib/localflavor/es/es_provinces.py:24
+msgid "Guipuzkoa"
+msgstr "გუიპუზკოა"
+
+#: contrib/localflavor/es/es_provinces.py:25
+msgid "Huelva"
+msgstr "ჰუელვა"
+
+#: contrib/localflavor/es/es_provinces.py:26
+msgid "Huesca"
+msgstr "ჰუესკა"
+
+#: contrib/localflavor/es/es_provinces.py:27
+msgid "Jaen"
+msgstr "ჯეინი"
+
+#: contrib/localflavor/es/es_provinces.py:28
+msgid "Leon"
+msgstr "ლეონი"
+
+#: contrib/localflavor/es/es_provinces.py:29
+msgid "Lleida"
+msgstr "ლეიდა"
+
+#: contrib/localflavor/es/es_provinces.py:30
+#: contrib/localflavor/es/es_regions.py:17
+msgid "La Rioja"
+msgstr "ლა რიოხა"
+
+#: contrib/localflavor/es/es_provinces.py:31
+msgid "Lugo"
+msgstr "ლუგო"
+
+#: contrib/localflavor/es/es_provinces.py:32
+#: contrib/localflavor/es/es_regions.py:18
+msgid "Madrid"
+msgstr "მადრიდი"
+
+#: contrib/localflavor/es/es_provinces.py:33
+msgid "Malaga"
+msgstr "მალაგა"
+
+#: contrib/localflavor/es/es_provinces.py:34
+msgid "Murcia"
+msgstr "მურსია"
+
+#: contrib/localflavor/es/es_provinces.py:35
+msgid "Navarre"
+msgstr "ნავარე"
+
+#: contrib/localflavor/es/es_provinces.py:36
+msgid "Ourense"
+msgstr "ოურენსი"
+
+#: contrib/localflavor/es/es_provinces.py:37
+msgid "Asturias"
+msgstr "ასტურია"
+
+#: contrib/localflavor/es/es_provinces.py:38
+msgid "Palencia"
+msgstr "პალენსია"
+
+#: contrib/localflavor/es/es_provinces.py:39
+msgid "Las Palmas"
+msgstr "ლას პალმას"
+
+#: contrib/localflavor/es/es_provinces.py:40
+msgid "Pontevedra"
+msgstr "პონტევედრა"
+
+#: contrib/localflavor/es/es_provinces.py:41
+msgid "Salamanca"
+msgstr "სალამანსა"
+
+#: contrib/localflavor/es/es_provinces.py:42
+msgid "Santa Cruz de Tenerife"
+msgstr "სანტა კრუზ დე ტენერიფე"
+
+#: contrib/localflavor/es/es_provinces.py:43
+#: contrib/localflavor/es/es_regions.py:11
+msgid "Cantabria"
+msgstr "კანტაბრია"
+
+#: contrib/localflavor/es/es_provinces.py:44
+msgid "Segovia"
+msgstr "სეგოვია"
+
+#: contrib/localflavor/es/es_provinces.py:45
+msgid "Seville"
+msgstr "სევილი"
+
+#: contrib/localflavor/es/es_provinces.py:46
+msgid "Soria"
+msgstr "სორია"
+
+#: contrib/localflavor/es/es_provinces.py:47
+msgid "Tarragona"
+msgstr "ტარაგონა"
+
+#: contrib/localflavor/es/es_provinces.py:48
+msgid "Teruel"
+msgstr "ტერუელი"
+
+#: contrib/localflavor/es/es_provinces.py:49
+msgid "Toledo"
+msgstr "ტოლედო"
+
+#: contrib/localflavor/es/es_provinces.py:50
+msgid "Valencia"
+msgstr "ვალენსია"
+
+#: contrib/localflavor/es/es_provinces.py:51
+msgid "Valladolid"
+msgstr "ვალადოლიდი"
+
+#: contrib/localflavor/es/es_provinces.py:52
+msgid "Bizkaia"
+msgstr "ბიზკაია"
+
+#: contrib/localflavor/es/es_provinces.py:53
+msgid "Zamora"
+msgstr "სამორა"
+
+#: contrib/localflavor/es/es_provinces.py:54
+msgid "Zaragoza"
+msgstr "სარაგოსა"
+
+#: contrib/localflavor/es/es_provinces.py:55
+msgid "Ceuta"
+msgstr "კეუტა"
+
+#: contrib/localflavor/es/es_provinces.py:56
+msgid "Melilla"
+msgstr "მელილა"
+
+#: contrib/localflavor/es/es_regions.py:5
+msgid "Andalusia"
+msgstr "ანდალუზია"
+
+#: contrib/localflavor/es/es_regions.py:6
+msgid "Aragon"
+msgstr "არაგონ"
+
+#: contrib/localflavor/es/es_regions.py:7
+msgid "Principality of Asturias"
+msgstr "ასტურიის პრინციპატი"
+
+#: contrib/localflavor/es/es_regions.py:8
+msgid "Balearic Islands"
+msgstr "ბალეარის კუნძულები"
+
+#: contrib/localflavor/es/es_regions.py:9
+msgid "Basque Country"
+msgstr "ბასკების ქვეყანა"
+
+#: contrib/localflavor/es/es_regions.py:10
+msgid "Canary Islands"
+msgstr "კანარის კუნძuლები"
+
+#: contrib/localflavor/es/es_regions.py:12
+msgid "Castile-La Mancha"
+msgstr "კასტილია ლა მანჩა"
+
+#: contrib/localflavor/es/es_regions.py:13
+msgid "Castile and Leon"
+msgstr "კასტილია და ლეონი"
+
+#: contrib/localflavor/es/es_regions.py:14
+msgid "Catalonia"
+msgstr "კატალონია"
+
+#: contrib/localflavor/es/es_regions.py:15
+msgid "Extremadura"
+msgstr "ექსტრემადურა"
+
+#: contrib/localflavor/es/es_regions.py:16
+msgid "Galicia"
+msgstr "გალიცია"
+
+#: contrib/localflavor/es/es_regions.py:19
+msgid "Region of Murcia"
+msgstr "მურსიის რეგიონი"
+
+#: contrib/localflavor/es/es_regions.py:20
+msgid "Foral Community of Navarre"
+msgstr "ნავარის ფორალური თემი"
+
+#: contrib/localflavor/es/es_regions.py:21
+msgid "Valencian Community"
+msgstr "ვალენსიის თემი"
+
+#: contrib/localflavor/es/forms.py:19
+msgid "Enter a valid postal code in the range and format 01XXX - 52XXX."
+msgstr "შეიყვანეთ სწორი საფოსტო კოდი შემდეგ ინტერვალში და ფორმატში: 01XXX - 52XXX."
+
+#: contrib/localflavor/es/forms.py:39
+msgid ""
+"Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or "
+"9XXXXXXXX."
+msgstr ""
+"შეიყვანეთ სწორი სატელეფონო ნომერი ერთ-ერთ ფორმატში: 6XXXXXXXX, 8XXXXXXXX ან "
+"9XXXXXXXX."
+
+#: contrib/localflavor/es/forms.py:66
+msgid "Please enter a valid NIF, NIE, or CIF."
+msgstr "გთხოვთ, შეიყვანოთ სწორი NIF, NIE, ან CIF."
+
+#: contrib/localflavor/es/forms.py:67
+msgid "Please enter a valid NIF or NIE."
+msgstr "გთხოვთ, შეიყვანოთ სწორი NIF ან NIE."
+
+#: contrib/localflavor/es/forms.py:68
+msgid "Invalid checksum for NIF."
+msgstr "NIF-ის საკონტროლო ჯამი არასწორია."
+
+#: contrib/localflavor/es/forms.py:69
+msgid "Invalid checksum for NIE."
+msgstr "NIE-ს საკონტროლო ჯამი არასწორია."
+
+#: contrib/localflavor/es/forms.py:70
+msgid "Invalid checksum for CIF."
+msgstr "CIF-ის საკონტროლო ჯამი არასწორია."
+
+#: contrib/localflavor/es/forms.py:142
+msgid ""
+"Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX."
+msgstr ""
+"გთხოვთ, შეიყვანოთ სწორი საბანკო ანგარიშის ნომერი ფორმატში: XXXX-XXXX-XX-XXXXXXXXXX."
+
+#: contrib/localflavor/es/forms.py:143
+msgid "Invalid checksum for bank account number."
+msgstr "არასწორი საკონტროლო ჯამი საბანკო ანგარიშის ნომრისათვის."
+
+#: contrib/localflavor/fi/forms.py:28
+msgid "Enter a valid Finnish social security number."
+msgstr "შეიყვანეთ სწორი ფინური პირადი ნომერი."
+
+#: contrib/localflavor/in_/forms.py:14
+msgid "Enter a zip code in the format XXXXXXX."
+msgstr "შეიყვანეთ zip-კოდი ფორმატში: XXXXXXX."
+
+#: contrib/localflavor/is_/forms.py:17
+msgid ""
+"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr ""
+"შეიყვანეთ სწორი ისლანდიური საიდენტიფიკაციო ნომერი. ფორმატია XXXXXX-XXXX."
+
+#: contrib/localflavor/is_/forms.py:18
+msgid "The Icelandic identification number is not valid."
+msgstr "ისლანდიური საიდენტიფიკაციო ნომერი არასწორია."
+
+#: contrib/localflavor/it/forms.py:14
+msgid "Enter a valid zip code."
+msgstr "შეიყვანეთ სწორი zip-კოდი."
+
+#: contrib/localflavor/it/forms.py:43
+msgid "Enter a valid Social Security number."
+msgstr "შეიყვანეთ სწორი პირადი ნომერი."
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr "შეიყვანეთ სწორი დღგ-ს ნომერი."
+
+#: contrib/localflavor/jp/forms.py:17
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "შეიყვანეთ საფოსტო კოდი ფორმატში XXXXXXX ან XXX-XXXX."
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr "ჰოკაიდო"
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr "აომორი"
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr "იუატე"
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr "მიიაგი"
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr "აკიტა"
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr "იამაგატა"
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr "ფუკუსიმა"
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr "იბარაკი"
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr "ტოჩიგი"
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr "გუნმა"
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr "საიტამა"
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr "ჩიბა"
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr "ტოკიო"
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr "კანაგავა"
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr "იამანაში"
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr "ნაგანო"
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr "ნიიგატა"
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr "ტოიამა"
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr "იშიკავა"
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr "ფუკუი"
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr "გიფუ"
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr "შიზუოკა"
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr "აიჩი"
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr "მიე"
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr "შიგა"
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr "კიოტო"
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr "ოსაკა"
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr "ჰიოგო"
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr "ნარა"
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr "უაკაიამა"
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr "ტოტორი"
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr "შიმანე"
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr "ოკაიამა"
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr "ჰიროსიმა"
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr "იამაგუჩი"
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr "ტოკუშიმა"
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr "კაგავა"
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr "ეჰიმე"
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr "კოჩი"
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr "ფუკუოკა"
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr "საგა"
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr "ნაგასაკი"
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr "კუმამოტო"
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr "ოიტა"
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr "მიაზაკი"
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr "კაგოსიმა"
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr "ოკინავა"
+
+#: contrib/localflavor/mx/mx_states.py:12
+msgid "Aguascalientes"
+msgstr "აგუასკალიენტესი"
+
+#: contrib/localflavor/mx/mx_states.py:13
+msgid "Baja California"
+msgstr "ქვემო კალიფორნია"
+
+#: contrib/localflavor/mx/mx_states.py:14
+msgid "Baja California Sur"
+msgstr "ქვემო სამხრეთ კალიფორნია"
+
+#: contrib/localflavor/mx/mx_states.py:15
+msgid "Campeche"
+msgstr "კამპეჩე"
+
+#: contrib/localflavor/mx/mx_states.py:16
+msgid "Chihuahua"
+msgstr "ჩიჰუაჰუა"
+
+#: contrib/localflavor/mx/mx_states.py:17
+msgid "Chiapas"
+msgstr "ჩიაპასი"
+
+#: contrib/localflavor/mx/mx_states.py:18
+msgid "Coahuila"
+msgstr "კოაჰუილა"
+
+#: contrib/localflavor/mx/mx_states.py:19
+msgid "Colima"
+msgstr "კოლიმა"
+
+#: contrib/localflavor/mx/mx_states.py:20
+msgid "Distrito Federal"
+msgstr "ფედერალური ოლქი"
+
+#: contrib/localflavor/mx/mx_states.py:21
+msgid "Durango"
+msgstr "დურანგო"
+
+#: contrib/localflavor/mx/mx_states.py:22
+msgid "Guerrero"
+msgstr "გერერო"
+
+#: contrib/localflavor/mx/mx_states.py:23
+msgid "Guanajuato"
+msgstr "გუანაჰუატო"
+
+#: contrib/localflavor/mx/mx_states.py:24
+msgid "Hidalgo"
+msgstr "იდალგო"
+
+#: contrib/localflavor/mx/mx_states.py:25
+msgid "Jalisco"
+msgstr "ჰალისკო"
+
+#: contrib/localflavor/mx/mx_states.py:26
+msgid "Estado de México"
+msgstr "მეხიკოს შტატი"
+
+#: contrib/localflavor/mx/mx_states.py:27
+msgid "Michoacán"
+msgstr "მიჩოაკანი"
+
+#: contrib/localflavor/mx/mx_states.py:28
+msgid "Morelos"
+msgstr "მორელოსი"
+
+#: contrib/localflavor/mx/mx_states.py:29
+msgid "Nayarit"
+msgstr "ნაიარიტი"
+
+#: contrib/localflavor/mx/mx_states.py:30
+msgid "Nuevo León"
+msgstr "ნუევო-ლეონი"
+
+#: contrib/localflavor/mx/mx_states.py:31
+msgid "Oaxaca"
+msgstr "ოახაკა"
+
+#: contrib/localflavor/mx/mx_states.py:32
+msgid "Puebla"
+msgstr "პუებლა"
+
+#: contrib/localflavor/mx/mx_states.py:33
+msgid "Querétaro"
+msgstr "კერეტარო"
+
+#: contrib/localflavor/mx/mx_states.py:34
+msgid "Quintana Roo"
+msgstr "კინტანა-როო"
+
+#: contrib/localflavor/mx/mx_states.py:35
+msgid "Sinaloa"
+msgstr "სინალოა"
+
+#: contrib/localflavor/mx/mx_states.py:36
+msgid "San Luis Potosí"
+msgstr "სან-ლუის-პოტოსი"
+
+#: contrib/localflavor/mx/mx_states.py:37
+msgid "Sonora"
+msgstr "sონორა"
+
+#: contrib/localflavor/mx/mx_states.py:38
+msgid "Tabasco"
+msgstr "ტაბასკო"
+
+#: contrib/localflavor/mx/mx_states.py:39
+msgid "Tamaulipas"
+msgstr "ტამაულიპასი"
+
+#: contrib/localflavor/mx/mx_states.py:40
+msgid "Tlaxcala"
+msgstr "ტლასკალა"
+
+#: contrib/localflavor/mx/mx_states.py:41
+msgid "Veracruz"
+msgstr "ვერაკრუსი"
+
+#: contrib/localflavor/mx/mx_states.py:42
+msgid "Yucatán"
+msgstr "იუკატანი"
+
+#: contrib/localflavor/mx/mx_states.py:43
+msgid "Zacatecas"
+msgstr "საკატეკასი"
+
+#: contrib/localflavor/nl/forms.py:21
+msgid "Enter a valid postal code"
+msgstr "შეიყვანეთ სწორი საფოსტო კოდი"
+
+#: contrib/localflavor/nl/forms.py:52
+msgid "Enter a valid phone number"
+msgstr "შეიყვანეთ სწორი ტელეფონის ნომერი"
+
+#: contrib/localflavor/nl/forms.py:78
+msgid "Enter a valid SoFi number"
+msgstr "შეიყვანეთ სწორი SoFi ნომერი"
+
+#: contrib/localflavor/nl/nl_provinces.py:4
+msgid "Drenthe"
+msgstr "დრენტე"
+
+#: contrib/localflavor/nl/nl_provinces.py:5
+msgid "Flevoland"
+msgstr "ფლევოლანდი"
+
+#: contrib/localflavor/nl/nl_provinces.py:6
+msgid "Friesland"
+msgstr "ფრისლანდია"
+
+#: contrib/localflavor/nl/nl_provinces.py:7
+msgid "Gelderland"
+msgstr "გელდერლანდი"
+
+#: contrib/localflavor/nl/nl_provinces.py:8
+msgid "Groningen"
+msgstr "გრონიგენი"
+
+#: contrib/localflavor/nl/nl_provinces.py:9
+msgid "Limburg"
+msgstr "ლიმბურგი"
+
+#: contrib/localflavor/nl/nl_provinces.py:10
+msgid "Noord-Brabant"
+msgstr "ჩრდილოეთ ბრაბანტი"
+
+#: contrib/localflavor/nl/nl_provinces.py:11
+msgid "Noord-Holland"
+msgstr "ჩრდილოეთ ჰოლანდია"
+
+#: contrib/localflavor/nl/nl_provinces.py:12
+msgid "Overijssel"
+msgstr "ოვერეისელი"
+
+#: contrib/localflavor/nl/nl_provinces.py:13
+msgid "Utrecht"
+msgstr "უტრეხტი"
+
+#: contrib/localflavor/nl/nl_provinces.py:14
+msgid "Zeeland"
+msgstr "ზელანდია"
+
+#: contrib/localflavor/nl/nl_provinces.py:15
+msgid "Zuid-Holland"
+msgstr "სამხრეთ ჰოლანდია"
+
+#: contrib/localflavor/no/forms.py:33
+msgid "Enter a valid Norwegian social security number."
+msgstr "შეიყვანეთ სწორი ნორვეგიული პირადი ნომერი."
+
+#: contrib/localflavor/pe/forms.py:24
+msgid "This field requires 8 digits."
+msgstr "ეს ველი შედგება 8 თანრიგისაგან."
+
+#: contrib/localflavor/pe/forms.py:52
+msgid "This field requires 11 digits."
+msgstr "ეს ველი სედგება 11 თანრიგისაგან."
+
+#: contrib/localflavor/pl/forms.py:38
+msgid "National Identification Number consists of 11 digits."
+msgstr "ეროვნული საიდენტიფიკაციო ნომერი შედგება 11 თანრიგისაგან."
+
+#: contrib/localflavor/pl/forms.py:39
+msgid "Wrong checksum for the National Identification Number."
+msgstr "არასწორი საკონტროლო ჯამი ეროვნულ საიდენტიფიკაციო ნომერში."
+
+#: contrib/localflavor/pl/forms.py:71
+msgid ""
+"Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX."
+msgstr ""
+"შეიყვანეთ საგადასახადოს ნომერი (NIP) ფორმატში: XXX-XXX-XX-XX or XX-XX-XXX-XXX."
+
+#: contrib/localflavor/pl/forms.py:72
+msgid "Wrong checksum for the Tax Number (NIP)."
+msgstr "არასწორი საკონტროლო ჯამი საგადასახადო ნომრისათვის (NIP)."
+
+#: contrib/localflavor/pl/forms.py:111
+msgid "National Business Register Number (REGON) consists of 7 or 9 digits."
+msgstr "საწარმოოს ეროვნული სარეგისტრაციო ნომერი (REGON) შედგება 7 ან 9 თანრიგისაგან."
+
+#: contrib/localflavor/pl/forms.py:112
+msgid "Wrong checksum for the National Business Register Number (REGON)."
+msgstr "არასწორი საკონტროლო ჯამი საწარმოოს ეროვნულ სარეგისტრაციო ნომერში (REGON)."
+
+#: contrib/localflavor/pl/forms.py:155
+msgid "Enter a postal code in the format XX-XXX."
+msgstr "შეიყვანეთ საფოსტო კოდი ფორმატში XX-XXX."
+
+#: contrib/localflavor/pl/pl_voivodeships.py:8
+msgid "Lower Silesia"
+msgstr "ქვემო სილეზია"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:9
+msgid "Kuyavia-Pomerania"
+msgstr "კუიავია-პომერანია"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:10
+msgid "Lublin"
+msgstr "ლუბლინი"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:11
+msgid "Lubusz"
+msgstr "ლუბუში"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:12
+msgid "Lodz"
+msgstr "ლოძი"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:13
+msgid "Lesser Poland"
+msgstr "მცირე პოლონეთი"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:14
+msgid "Masovia"
+msgstr "მაზოვია"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:15
+msgid "Opole"
+msgstr "ოპოლე"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:16
+msgid "Subcarpatia"
+msgstr "სუბკარპატია"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:17
+msgid "Podlasie"
+msgstr "პოდლასიე"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:18
+msgid "Pomerania"
+msgstr "პომერანია"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:19
+msgid "Silesia"
+msgstr "სილეზია"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:20
+msgid "Swietokrzyskie"
+msgstr "სვენტოკშისკე"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:21
+msgid "Warmia-Masuria"
+msgstr "ვარმია-მაზურია"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:22
+msgid "Greater Poland"
+msgstr "დიდი პოლონეთი"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:23
+msgid "West Pomerania"
+msgstr "დასავლეთ პომერანია"
+
+#: contrib/localflavor/ro/forms.py:19
+msgid "Enter a valid CIF."
+msgstr "შეიყვანეთ სწორი URL."
+
+#: contrib/localflavor/ro/forms.py:56
+msgid "Enter a valid CNP."
+msgstr "შეიყვანეთ სწორი URL."
+
+#: contrib/localflavor/ro/forms.py:141
+msgid "Enter a valid IBAN in ROXX-XXXX-XXXX-XXXX-XXXX-XXXX format"
+msgstr ""
+"შეიყვანეთ დასაშვები CUIT ერთ-ერთ ფორმატში: XX-XXXXXXXX-X ან XXXXXXXXXXXX."
+
+#: contrib/localflavor/ro/forms.py:171
+msgid "Phone numbers must be in XXXX-XXXXXX format."
+msgstr "ტელეფონის ნომრები უნდა იყოს XX-XXXX-XXXX ფორმატში."
+
+#: contrib/localflavor/ro/forms.py:194
+msgid "Enter a valid postal code in the format XXXXXX"
+msgstr "შეიყვანეთ საფოსტო კოდი ფორმატში: XXX XXX."
+
+#: contrib/localflavor/sk/forms.py:30
+msgid "Enter a postal code in the format XXXXX or XXX XX."
+msgstr "შეიყვანეთ საფოსტო კოდი ფორმატში XXXXX or XXX XX."
+
+#: contrib/localflavor/sk/sk_districts.py:8
+msgid "Banska Bystrica"
+msgstr "ბანსკა ბისტრიცა"
+
+#: contrib/localflavor/sk/sk_districts.py:9
+msgid "Banska Stiavnica"
+msgstr "ბანსკა შტიავნიცა"
+
+#: contrib/localflavor/sk/sk_districts.py:10
+msgid "Bardejov"
+msgstr "ბარდეიოვი"
+
+#: contrib/localflavor/sk/sk_districts.py:11
+msgid "Banovce nad Bebravou"
+msgstr "ბანოვცე-ნად-ბებრავოუ"
+
+#: contrib/localflavor/sk/sk_districts.py:12
+msgid "Brezno"
+msgstr "ბრეზნო"
+
+#: contrib/localflavor/sk/sk_districts.py:13
+msgid "Bratislava I"
+msgstr "ბრატისლავა I"
+
+#: contrib/localflavor/sk/sk_districts.py:14
+msgid "Bratislava II"
+msgstr "ბრატისლავა II"
+
+#: contrib/localflavor/sk/sk_districts.py:15
+msgid "Bratislava III"
+msgstr "ბრატისლავა III"
+
+#: contrib/localflavor/sk/sk_districts.py:16
+msgid "Bratislava IV"
+msgstr "ბრატისლავა IV"
+
+#: contrib/localflavor/sk/sk_districts.py:17
+msgid "Bratislava V"
+msgstr "ბრატისლავა V"
+
+#: contrib/localflavor/sk/sk_districts.py:18
+msgid "Bytca"
+msgstr "ბიტჩა"
+
+#: contrib/localflavor/sk/sk_districts.py:19
+msgid "Cadca"
+msgstr "ჩადცა"
+
+#: contrib/localflavor/sk/sk_districts.py:20
+msgid "Detva"
+msgstr "დეტვა"
+
+#: contrib/localflavor/sk/sk_districts.py:21
+msgid "Dolny Kubin"
+msgstr "დოლნი კუბინი"
+
+#: contrib/localflavor/sk/sk_districts.py:22
+msgid "Dunajska Streda"
+msgstr "დუნაისკა სტრედა"
+
+#: contrib/localflavor/sk/sk_districts.py:23
+msgid "Galanta"
+msgstr "გალანტა"
+
+#: contrib/localflavor/sk/sk_districts.py:24
+msgid "Gelnica"
+msgstr "გელნიცა"
+
+#: contrib/localflavor/sk/sk_districts.py:25
+msgid "Hlohovec"
+msgstr "ჰლოჰოვეცი"
+
+#: contrib/localflavor/sk/sk_districts.py:26
+msgid "Humenne"
+msgstr "ჰუმენე"
+
+#: contrib/localflavor/sk/sk_districts.py:27
+msgid "Ilava"
+msgstr "ილავა"
+
+#: contrib/localflavor/sk/sk_districts.py:28
+msgid "Kezmarok"
+msgstr "კეზმაროკი"
+
+#: contrib/localflavor/sk/sk_districts.py:29
+msgid "Komarno"
+msgstr "კომარნო"
+
+#: contrib/localflavor/sk/sk_districts.py:30
+msgid "Kosice I"
+msgstr "კოშიცე I"
+
+#: contrib/localflavor/sk/sk_districts.py:31
+msgid "Kosice II"
+msgstr "კოშიცე II"
+
+#: contrib/localflavor/sk/sk_districts.py:32
+msgid "Kosice III"
+msgstr "კოშიცე III"
+
+#: contrib/localflavor/sk/sk_districts.py:33
+msgid "Kosice IV"
+msgstr "კოშიცე IV"
+
+#: contrib/localflavor/sk/sk_districts.py:34
+msgid "Kosice - okolie"
+msgstr "კოშიცე - ოკოლიე"
+
+#: contrib/localflavor/sk/sk_districts.py:35
+msgid "Krupina"
+msgstr "კრუპინა"
+
+#: contrib/localflavor/sk/sk_districts.py:36
+msgid "Kysucke Nove Mesto"
+msgstr "კისუცკე ნოვე მესტო"
+
+#: contrib/localflavor/sk/sk_districts.py:37
+msgid "Levice"
+msgstr "ლევიცე"
+
+#: contrib/localflavor/sk/sk_districts.py:38
+msgid "Levoca"
+msgstr "ლევოჩა"
+
+#: contrib/localflavor/sk/sk_districts.py:39
+msgid "Liptovsky Mikulas"
+msgstr "ლიპტოვსკი მიკულაში"
+
+#: contrib/localflavor/sk/sk_districts.py:40
+msgid "Lucenec"
+msgstr "ლუჩენეცი"
+
+#: contrib/localflavor/sk/sk_districts.py:41
+msgid "Malacky"
+msgstr "მალაცკი"
+
+#: contrib/localflavor/sk/sk_districts.py:42
+msgid "Martin"
+msgstr "მარტინი"
+
+#: contrib/localflavor/sk/sk_districts.py:43
+msgid "Medzilaborce"
+msgstr "მეძილაბორცე"
+
+#: contrib/localflavor/sk/sk_districts.py:44
+msgid "Michalovce"
+msgstr "მიხალოვცე"
+
+#: contrib/localflavor/sk/sk_districts.py:45
+msgid "Myjava"
+msgstr "მიავა"
+
+#: contrib/localflavor/sk/sk_districts.py:46
+msgid "Namestovo"
+msgstr "ნამესტოვო"
+
+#: contrib/localflavor/sk/sk_districts.py:47
+msgid "Nitra"
+msgstr "ნიტრა"
+
+#: contrib/localflavor/sk/sk_districts.py:48
+msgid "Nove Mesto nad Vahom"
+msgstr "ნოვე-მესტო-ნად-ვაჰომ"
+
+#: contrib/localflavor/sk/sk_districts.py:49
+msgid "Nove Zamky"
+msgstr "ნოვე ზამკი"
+
+#: contrib/localflavor/sk/sk_districts.py:50
+msgid "Partizanske"
+msgstr "პარტიზანსკე"
+
+#: contrib/localflavor/sk/sk_districts.py:51
+msgid "Pezinok"
+msgstr "პეზინოკი"
+
+#: contrib/localflavor/sk/sk_districts.py:52
+msgid "Piestany"
+msgstr "პიესტანი"
+
+#: contrib/localflavor/sk/sk_districts.py:53
+msgid "Poltar"
+msgstr "პოლტარი"
+
+#: contrib/localflavor/sk/sk_districts.py:54
+msgid "Poprad"
+msgstr "პოპრადი"
+
+#: contrib/localflavor/sk/sk_districts.py:55
+msgid "Povazska Bystrica"
+msgstr "პოვაჟსკა ბისტრიცა"
+
+#: contrib/localflavor/sk/sk_districts.py:56
+msgid "Presov"
+msgstr "პრესოვი"
+
+#: contrib/localflavor/sk/sk_districts.py:57
+msgid "Prievidza"
+msgstr "პრიევიძა"
+
+#: contrib/localflavor/sk/sk_districts.py:58
+msgid "Puchov"
+msgstr "პუხოვი"
+
+#: contrib/localflavor/sk/sk_districts.py:59
+msgid "Revuca"
+msgstr "რევუცა"
+
+#: contrib/localflavor/sk/sk_districts.py:60
+msgid "Rimavska Sobota"
+msgstr "რიმავსკა სობოტა"
+
+#: contrib/localflavor/sk/sk_districts.py:61
+msgid "Roznava"
+msgstr "როზნავა"
+
+#: contrib/localflavor/sk/sk_districts.py:62
+msgid "Ruzomberok"
+msgstr "რუზომბეროკი"
+
+#: contrib/localflavor/sk/sk_districts.py:63
+msgid "Sabinov"
+msgstr "საბინოვი"
+
+#: contrib/localflavor/sk/sk_districts.py:64
+msgid "Senec"
+msgstr "სენეცი"
+
+#: contrib/localflavor/sk/sk_districts.py:65
+msgid "Senica"
+msgstr "სენიცა"
+
+#: contrib/localflavor/sk/sk_districts.py:66
+msgid "Skalica"
+msgstr "სკალიცა"
+
+#: contrib/localflavor/sk/sk_districts.py:67
+msgid "Snina"
+msgstr "სნინა"
+
+#: contrib/localflavor/sk/sk_districts.py:68
+msgid "Sobrance"
+msgstr "სობრანცე"
+
+#: contrib/localflavor/sk/sk_districts.py:69
+msgid "Spisska Nova Ves"
+msgstr "სპისკა-ნოვა-ვესი"
+
+#: contrib/localflavor/sk/sk_districts.py:70
+msgid "Stara Lubovna"
+msgstr "სტარა-ლუბოვნა"
+
+#: contrib/localflavor/sk/sk_districts.py:71
+msgid "Stropkov"
+msgstr "სტროპკოვი"
+
+#: contrib/localflavor/sk/sk_districts.py:72
+msgid "Svidnik"
+msgstr "სვიდნიკი"
+
+#: contrib/localflavor/sk/sk_districts.py:73
+msgid "Sala"
+msgstr "სალა"
+
+#: contrib/localflavor/sk/sk_districts.py:74
+msgid "Topolcany"
+msgstr "ტოპოლჩანი"
+
+#: contrib/localflavor/sk/sk_districts.py:75
+msgid "Trebisov"
+msgstr "ტრებისოვი"
+
+#: contrib/localflavor/sk/sk_districts.py:76
+msgid "Trencin"
+msgstr "ტრენჩინი"
+
+#: contrib/localflavor/sk/sk_districts.py:77
+msgid "Trnava"
+msgstr "ტრნავა"
+
+#: contrib/localflavor/sk/sk_districts.py:78
+msgid "Turcianske Teplice"
+msgstr "ტურჩანსკე ტეპლიცე"
+
+#: contrib/localflavor/sk/sk_districts.py:79
+msgid "Tvrdosin"
+msgstr "ტვრდოშინი"
+
+#: contrib/localflavor/sk/sk_districts.py:80
+msgid "Velky Krtis"
+msgstr "ველკი კრტიში"
+
+#: contrib/localflavor/sk/sk_districts.py:81
+msgid "Vranov nad Toplou"
+msgstr "ვრანოვ-ნად-ტოპლოუ"
+
+#: contrib/localflavor/sk/sk_districts.py:82
+msgid "Zlate Moravce"
+msgstr "ზლატე მორავცე"
+
+#: contrib/localflavor/sk/sk_districts.py:83
+msgid "Zvolen"
+msgstr "ზვოლენი"
+
+#: contrib/localflavor/sk/sk_districts.py:84
+msgid "Zarnovica"
+msgstr "ზარნოვიცა"
+
+#: contrib/localflavor/sk/sk_districts.py:85
+msgid "Ziar nad Hronom"
+msgstr "ზიარ-ნად-ჰრონომი"
+
+#: contrib/localflavor/sk/sk_districts.py:86
+msgid "Zilina"
+msgstr "ზილინა"
+
+#: contrib/localflavor/sk/sk_regions.py:8
+msgid "Banska Bystrica region"
+msgstr "ბანსკა-ბისტრიცის რაიონი"
+
+#: contrib/localflavor/sk/sk_regions.py:9
+msgid "Bratislava region"
+msgstr "ბრატისლავას რაიონი"
+
+#: contrib/localflavor/sk/sk_regions.py:10
+msgid "Kosice region"
+msgstr "კოშიცეს რაიონი"
+
+#: contrib/localflavor/sk/sk_regions.py:11
+msgid "Nitra region"
+msgstr "ნიტრას რაიონი"
+
+#: contrib/localflavor/sk/sk_regions.py:12
+msgid "Presov region"
+msgstr "პრესოვის რაიონი"
+
+#: contrib/localflavor/sk/sk_regions.py:13
+msgid "Trencin region"
+msgstr "ტრენჩინის რაიონი"
+
+#: contrib/localflavor/sk/sk_regions.py:14
+msgid "Trnava region"
+msgstr "ტრნავას რაიონი"
+
+#: contrib/localflavor/sk/sk_regions.py:15
+msgid "Zilina region"
+msgstr "ზილინას რაიონი"
+
+#: contrib/localflavor/uk/forms.py:21
+msgid "Enter a valid postcode."
+msgstr "შეიყვანეთ სწორი საფოსტო კოდი."
+
+#: contrib/localflavor/uk/uk_regions.py:11
+msgid "Bedfordshire"
+msgstr "ბედფორდშირი"
+
+#: contrib/localflavor/uk/uk_regions.py:12
+msgid "Buckinghamshire"
+msgstr "ბუკინჰემშირი"
+
+#: contrib/localflavor/uk/uk_regions.py:14
+msgid "Cheshire"
+msgstr "ჩეშირი"
+
+#: contrib/localflavor/uk/uk_regions.py:15
+msgid "Cornwall and Isles of Scilly"
+msgstr "კორნუოლი და სილის კუნძულები"
+
+#: contrib/localflavor/uk/uk_regions.py:16
+msgid "Cumbria"
+msgstr "კამბრია"
+
+#: contrib/localflavor/uk/uk_regions.py:17
+msgid "Derbyshire"
+msgstr "დერბიშირი"
+
+#: contrib/localflavor/uk/uk_regions.py:18
+msgid "Devon"
+msgstr "დევონი"
+
+#: contrib/localflavor/uk/uk_regions.py:19
+msgid "Dorset"
+msgstr "დორსეტი"
+
+#: contrib/localflavor/uk/uk_regions.py:20
+msgid "Durham"
+msgstr "დარემი"
+
+#: contrib/localflavor/uk/uk_regions.py:21
+msgid "East Sussex"
+msgstr "აღმოსავლეთ სასექსი"
+
+#: contrib/localflavor/uk/uk_regions.py:22
+msgid "Essex"
+msgstr "ესექსი"
+
+#: contrib/localflavor/uk/uk_regions.py:23
+msgid "Gloucestershire"
+msgstr "გლოსტეშირი"
+
+#: contrib/localflavor/uk/uk_regions.py:24
+msgid "Greater London"
+msgstr "დიდი ლონდონი"
+
+#: contrib/localflavor/uk/uk_regions.py:25
+msgid "Greater Manchester"
+msgstr "დიდი მანჩესტერი"
+
+#: contrib/localflavor/uk/uk_regions.py:26
+msgid "Hampshire"
+msgstr "ჰემპშირი"
+
+#: contrib/localflavor/uk/uk_regions.py:27
+msgid "Hertfordshire"
+msgstr "ჰარტფორდშირი"
+
+#: contrib/localflavor/uk/uk_regions.py:28
+msgid "Kent"
+msgstr "კენტი"
+
+#: contrib/localflavor/uk/uk_regions.py:29
+msgid "Lancashire"
+msgstr "ლანკაშირი"
+
+#: contrib/localflavor/uk/uk_regions.py:30
+msgid "Leicestershire"
+msgstr "ლაიჩესტეშირი"
+
+#: contrib/localflavor/uk/uk_regions.py:31
+msgid "Lincolnshire"
+msgstr "ლინკოლნშირი"
+
+#: contrib/localflavor/uk/uk_regions.py:32
+msgid "Merseyside"
+msgstr "მერსისაიდი"
+
+#: contrib/localflavor/uk/uk_regions.py:33
+msgid "Norfolk"
+msgstr "ნორფოლკი"
+
+#: contrib/localflavor/uk/uk_regions.py:34
+msgid "North Yorkshire"
+msgstr "ჩრდილოეთ იოკშირი"
+
+#: contrib/localflavor/uk/uk_regions.py:35
+msgid "Northamptonshire"
+msgstr "ნორტჰემპტონშირი"
+
+#: contrib/localflavor/uk/uk_regions.py:36
+msgid "Northumberland"
+msgstr "ნორტუმბერლანდი"
+
+#: contrib/localflavor/uk/uk_regions.py:37
+msgid "Nottinghamshire"
+msgstr "ნოტინგემშირი"
+
+#: contrib/localflavor/uk/uk_regions.py:38
+msgid "Oxfordshire"
+msgstr "ოქსფორდშირი"
+
+#: contrib/localflavor/uk/uk_regions.py:39
+msgid "Shropshire"
+msgstr "შროპშირი"
+
+#: contrib/localflavor/uk/uk_regions.py:40
+msgid "Somerset"
+msgstr "სომერსეტი"
+
+#: contrib/localflavor/uk/uk_regions.py:41
+msgid "South Yorkshire"
+msgstr "სამხრეთ იოკშირი"
+
+#: contrib/localflavor/uk/uk_regions.py:42
+msgid "Staffordshire"
+msgstr "სტაფორდშირი"
+
+#: contrib/localflavor/uk/uk_regions.py:43
+msgid "Suffolk"
+msgstr "საფოლკი"
+
+#: contrib/localflavor/uk/uk_regions.py:44
+msgid "Surrey"
+msgstr "სურეი"
+
+#: contrib/localflavor/uk/uk_regions.py:45
+msgid "Tyne and Wear"
+msgstr "თაინ და უირი"
+
+#: contrib/localflavor/uk/uk_regions.py:46
+msgid "Warwickshire"
+msgstr "უარვიკშირი"
+
+#: contrib/localflavor/uk/uk_regions.py:47
+msgid "West Midlands"
+msgstr "დასავლეთ მიდლენდსი"
+
+#: contrib/localflavor/uk/uk_regions.py:48
+msgid "West Sussex"
+msgstr "დასავლეთ სასექსი"
+
+#: contrib/localflavor/uk/uk_regions.py:49
+msgid "West Yorkshire"
+msgstr "დასავლეთ იოკშირი"
+
+#: contrib/localflavor/uk/uk_regions.py:50
+msgid "Wiltshire"
+msgstr "უილტშირი"
+
+#: contrib/localflavor/uk/uk_regions.py:51
+msgid "Worcestershire"
+msgstr "უორსესტერშირი"
+
+#: contrib/localflavor/uk/uk_regions.py:55
+msgid "County Antrim"
+msgstr "ანტრიმის ქვეყანა"
+
+#: contrib/localflavor/uk/uk_regions.py:56
+msgid "County Armagh"
+msgstr "არმაგის ქვეყანა"
+
+#: contrib/localflavor/uk/uk_regions.py:57
+msgid "County Down"
+msgstr "დაუნის ქვეყანა"
+
+#: contrib/localflavor/uk/uk_regions.py:58
+msgid "County Fermanagh"
+msgstr "ფერმანაგის ქვეყანა"
+
+#: contrib/localflavor/uk/uk_regions.py:59
+msgid "County Londonderry"
+msgstr "ლონდონდერის ქვეყანა"
+
+#: contrib/localflavor/uk/uk_regions.py:60
+msgid "County Tyrone"
+msgstr "ტაირონის ქვეყანა"
+
+#: contrib/localflavor/uk/uk_regions.py:64
+msgid "Clwyd"
+msgstr "კლოუიდი"
+
+#: contrib/localflavor/uk/uk_regions.py:65
+msgid "Dyfed"
+msgstr "დაიფიდი"
+
+#: contrib/localflavor/uk/uk_regions.py:66
+msgid "Gwent"
+msgstr "გვენტი"
+
+#: contrib/localflavor/uk/uk_regions.py:67
+msgid "Gwynedd"
+msgstr "გუაინიდი"
+
+#: contrib/localflavor/uk/uk_regions.py:68
+msgid "Mid Glamorgan"
+msgstr "შუა გლემორგენი"
+
+#: contrib/localflavor/uk/uk_regions.py:69
+msgid "Powys"
+msgstr "პოუისი"
+
+#: contrib/localflavor/uk/uk_regions.py:70
+msgid "South Glamorgan"
+msgstr "სამხრეთ გლემორგენი"
+
+#: contrib/localflavor/uk/uk_regions.py:71
+msgid "West Glamorgan"
+msgstr "დასავლეთ გლემორგენი"
+
+#: contrib/localflavor/uk/uk_regions.py:75
+msgid "Borders"
+msgstr "საზღვრები"
+
+#: contrib/localflavor/uk/uk_regions.py:76
+msgid "Central Scotland"
+msgstr "ცენტრალური შოტლანდია"
+
+#: contrib/localflavor/uk/uk_regions.py:77
+msgid "Dumfries and Galloway"
+msgstr "დამფრაის და გელოუეი"
+
+#: contrib/localflavor/uk/uk_regions.py:78
+msgid "Fife"
+msgstr "ფაიფი"
+
+#: contrib/localflavor/uk/uk_regions.py:79
+msgid "Grampian"
+msgstr "გრემპაინი"
+
+#: contrib/localflavor/uk/uk_regions.py:80
+msgid "Highland"
+msgstr "ჰაილენდი"
+
+#: contrib/localflavor/uk/uk_regions.py:81
+msgid "Lothian"
+msgstr "ლოთიენი"
+
+#: contrib/localflavor/uk/uk_regions.py:82
+msgid "Orkney Islands"
+msgstr "ორკნის კუნძულები"
+
+#: contrib/localflavor/uk/uk_regions.py:83
+msgid "Shetland Islands"
+msgstr "შიტლენდის კუნძულები"
+
+#: contrib/localflavor/uk/uk_regions.py:84
+msgid "Strathclyde"
+msgstr "სტრესკლაიდი"
+
+#: contrib/localflavor/uk/uk_regions.py:85
+msgid "Tayside"
+msgstr "თეისაიდი"
+
+#: contrib/localflavor/uk/uk_regions.py:86
+msgid "Western Isles"
+msgstr "დასავლეთ კუნძულები"
+
+#: contrib/localflavor/uk/uk_regions.py:90
+msgid "England"
+msgstr "ინგლისი"
+
+#: contrib/localflavor/uk/uk_regions.py:91
+msgid "Northern Ireland"
+msgstr "ჩრდილოეთ ირლანდია"
+
+#: contrib/localflavor/uk/uk_regions.py:92
+msgid "Scotland"
+msgstr "შოტლანდია"
+
+#: contrib/localflavor/uk/uk_regions.py:93
+msgid "Wales"
+msgstr "უელსი"
+
+#: contrib/localflavor/us/forms.py:16
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "შეიყვანეთ zip-კოდი ფორმატში XXXXX ან XXXXX-XXXX."
+
+#: contrib/localflavor/us/forms.py:54
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr "შეიყვანეთ სწორი აშშ-ს პირადი ნომერი ფორმატში XXX-XX-XXXX."
+
+#: contrib/localflavor/za/forms.py:20
+msgid "Enter a valid South African ID number"
+msgstr "შეიყვანეთ სწორი სამხრეთ-აფრიკული ID ნომერი"
+
+#: contrib/localflavor/za/forms.py:54
+msgid "Enter a valid South African postal code"
+msgstr "შეიყვანეთ სწორი სამხრეთ-აფრიკული საფოსტო კოდი"
+
+#: contrib/localflavor/za/za_provinces.py:4
+msgid "Eastern Cape"
+msgstr "აღმოსავლეთ კაპი"
+
+#: contrib/localflavor/za/za_provinces.py:5
+msgid "Free State"
+msgstr "თავისუფალი სახელმწიფო"
+
+#: contrib/localflavor/za/za_provinces.py:6
+msgid "Gauteng"
+msgstr "გაუტენგი"
+
+#: contrib/localflavor/za/za_provinces.py:7
+msgid "KwaZulu-Natal"
+msgstr "კვაზულუ-ნატალი"
+
+#: contrib/localflavor/za/za_provinces.py:8
+msgid "Limpopo"
+msgstr "ლიმპოპო"
+
+#: contrib/localflavor/za/za_provinces.py:9
+msgid "Mpumalanga"
+msgstr "მპუმალანგა"
+
+#: contrib/localflavor/za/za_provinces.py:10
+msgid "Northern Cape"
+msgstr "ჩრდილოეთ კაპი"
+
+#: contrib/localflavor/za/za_provinces.py:11
+msgid "North West"
+msgstr "ჩრდილო-დასავლეთი"
+
+#: contrib/localflavor/za/za_provinces.py:12
+msgid "Western Cape"
+msgstr "დასავლეთ კაპი"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "გადამისამართება გვერდიდან"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"უნდა იყოს აბსოლუტური გზა დომენის სახელის გარეშე. მაგალითი: '/events/search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "გადამისამართება გვერდზე"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"უნდა იყოს აბსოლუტური გზა (როგორც ზემოთ) ან სრული URL, რომელიც იწყება "
+"'http://' სტრიქონით."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "გადამისამართება"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "გადამისამართებები"
+
+#: contrib/sessions/models.py:45
+msgid "session key"
+msgstr "სესიის გასაღები"
+
+#: contrib/sessions/models.py:47
+msgid "session data"
+msgstr "სესიის მონაცემები"
+
+#: contrib/sessions/models.py:48
+msgid "expire date"
+msgstr "ამოწურვის თარიღი"
+
+#: contrib/sessions/models.py:53
+msgid "session"
+msgstr "სესია"
+
+#: contrib/sessions/models.py:54
+msgid "sessions"
+msgstr "სესიები"
+
+#: contrib/sites/models.py:32
+msgid "domain name"
+msgstr "დომენის სახელი"
+
+#: contrib/sites/models.py:33
+msgid "display name"
+msgstr "საჩვენებელი სახელი"
+
+#: contrib/sites/models.py:39
+msgid "sites"
+msgstr "საიტები"
+
+#: core/validators.py:80
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr ""
+"ეს მნიშვნელობა შეიძლება შეიცავდეს მხოლოდ ასოებს, ციფრებს, ხაზგასმის ნიშნებს "
+"და დეფისებს."
+
+#: core/validators.py:84
+msgid "Uppercase letters are not allowed here."
+msgstr "ასომთავრულები აქ დაუშვებელია."
+
+#: core/validators.py:88
+msgid "Lowercase letters are not allowed here."
+msgstr "პატარა ასოები აქ დაუშვებელია."
+
+#: core/validators.py:95
+msgid "Enter only digits separated by commas."
+msgstr "შეიყვანეთ მხოლოდ მძიმეებით გამოყოფილი ციფრები."
+
+#: core/validators.py:107
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "შეიყვანეთ მძიმეებით გამოყოფილი ელ. ფოსტის მისამართები."
+
+#: core/validators.py:111
+msgid "Please enter a valid IP address."
+msgstr "გთხოვთ, შეიყვანოთ დასაშვები IP-მისამართი"
+
+#: core/validators.py:115
+msgid "Empty values are not allowed here."
+msgstr "ცარიელი მნიშვნელობები აქ დაუშვებელია."
+
+#: core/validators.py:119
+msgid "Non-numeric characters aren't allowed here."
+msgstr "არაციფრული სიმბოლოები აქ დაუშვებელია."
+
+#: core/validators.py:123
+msgid "This value can't be comprised solely of digits."
+msgstr "ეს მნიშვნელობა არ უნდა შედგებოდეს მხოლოდ ციფრებისაგან."
+
+#: core/validators.py:128 forms/fields.py:161
+msgid "Enter a whole number."
+msgstr "შეიყვანეთ მთელი რიცხვი"
+
+#: core/validators.py:132
+msgid "Only alphabetical characters are allowed here."
+msgstr "მხოლოდ ლათინური ასოებია დასაშვები."
+
+#: core/validators.py:147
+#, python-format
+msgid "Invalid date: %s"
+msgstr "არასწორი თარიღი: %s"
+
+#: core/validators.py:152 db/models/fields/__init__.py:556
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "შეიყვანეთ სწორი თარიღი YYYY-MM-DD ფორმატში."
+
+#: core/validators.py:157
+msgid "Enter a valid time in HH:MM format."
+msgstr "შეიყვანეთ სწორი დრო HH:MM ფორმატში."
+
+#: core/validators.py:161
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "შეიყვანეთ სწორი თარიღი და დრო YYYY-MM-DD HH:MM ფორმატში."
+
+#: core/validators.py:166 forms/fields.py:422
+msgid "Enter a valid e-mail address."
+msgstr "შეიყვანეთ სწორი ელ. ფოსტის მისამართი."
+
+#: core/validators.py:178 core/validators.py:470 forms/fields.py:440
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+"ფაილი არ იყო გამოგზავნილი. შეამოწმეთ კოდირების ტიპი მოცემული ფორმისათვის."
+
+#: core/validators.py:189 forms/fields.py:471
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"ატვირთეთ დასაშვები გამოსახულება. თქვენს მიერ გამოგზავნილი ფაილი ან არ არის "
+"გამოსახულება, ან დაზიანებულია."
+
+#: core/validators.py:196
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "URL %s არ მიუთითებს დასაშვებ გამოსახულებას."
+
+#: core/validators.py:200
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "ტელეფონის ნომრები უნდა იყოს XXX-XXX-XXXX ფორმატში. \"%s\" არასწორია."
+
+#: core/validators.py:208
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "URL %s არ მიუთითებს დასაშვებ QuickTime ვიდეოფაილს."
+
+#: core/validators.py:212
+msgid "A valid URL is required."
+msgstr "საჭიროა სწორი URL"
+
+#: core/validators.py:226
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"საჭიროა სწორი HTML. ტიპიური შეცდომებია:\n"
+"%s"
+
+#: core/validators.py:233
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "ცუდად დაფორმირებული XML-ია: %s"
+
+#: core/validators.py:250
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "არასწორი URL: %s"
+
+#: core/validators.py:255 core/validators.py:257
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "URL %s არის გაწყვეტილი ბმული."
+
+#: core/validators.py:263
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "შეიყვანეთ სწორი აშშ შტატის აბრევიატურა."
+
+#: core/validators.py:277
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "ყურადღება მიაქციეთ ლექსიკას! სიტყვა %s აქ დაუშვებელია."
+msgstr[1] "ყურადღება მიაქციეთ ლექსიკას! სიტყვები %s აქ დაუშვებელია."
+
+#: core/validators.py:284
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "ველი უნდა ემთხვეოდეს '%s' ველს."
+
+#: core/validators.py:303
+msgid "Please enter something for at least one field."
+msgstr "გთხოვთ, შეიყვანოთ რაიმე მნიშვნელობა სულ მცირე ერთ ველში."
+
+#: core/validators.py:312 core/validators.py:323
+msgid "Please enter both fields or leave them both empty."
+msgstr "გთხოვთ, შეავსოთ ორივე ველი, ან ორივე დატოვოთ ცარიელი."
+
+#: core/validators.py:331
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "ეს ველი უნდა იყოს მითითებული, თუ %(field)s არის %(value)s"
+
+#: core/validators.py:344
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "ეს ველი უნდა იყოს მითითებული, თუ %(field)s არ არის %(value)s"
+
+#: core/validators.py:363
+msgid "Duplicate values are not allowed."
+msgstr "განმეორებითი მნიშვნელობები დაუშვებელია."
+
+#: core/validators.py:378
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "მნიშვნელობა უნდა იყოს %(lower)s და %(upper)s შორის."
+
+#: core/validators.py:380
+#, python-format
+msgid "This value must be at least %s."
+msgstr "მნიშვნელობა უნდა იყოს სულ მცირე %s."
+
+#: core/validators.py:382
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "მნიშვნელობა არ უნდა აღემატებოდეს %s-ს."
+
+#: core/validators.py:423
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "მნიშვნელობა უნდა იყოს %s-ის ხარისხი."
+
+#: core/validators.py:433
+msgid "Please enter a valid decimal number."
+msgstr "გთხოვთ, შეიყვანოთ სწორი ათობითი რიცხვი."
+
+#: core/validators.py:440
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] ""
+"გთხოვთ, შეიყვანოთ სწორი, არაუმეტეს %s თანრიგისაგან შემდგარი ათობითი რიცხვი."
+msgstr[1] ""
+"გთხოვთ, შეიყვანოთ სწორი, არაუმეტეს %s თანრიგისაგან შემდგარი ათობითი რიცხვი."
+
+#: core/validators.py:443
+#, python-format
+msgid ""
+"Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural ""
+"Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] ""
+"გთხოვთ, შეიყვანოთ სწორი ათობითი რიცხვი, რომლის მთელი ნაწილის სიგრძე არ "
+"აღემატება %s თანრიგს."
+msgstr[1] ""
+"გთხოვთ, შეიყვანოთ სწორი ათობითი რიცხვი, რომლის მთელი ნაწილის სიგრძე არ "
+"აღემატება %s თანრიგს."
+
+#: core/validators.py:446
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] ""
+"გთხოვთ, შეიყვანოთ სწორი ათობითი რიცხვი, რომლის წილადი ნაწილის სიგრძე არ "
+"აღემატება %s ციფრს."
+msgstr[1] ""
+"გთხოვთ, შეიყვანოთ სწორი ათობითი რიცხვი, რომლის წილადი ნაწილის სიგრძე არ "
+"აღემატება %s ციფრს."
+
+#: core/validators.py:454
+msgid "Please enter a valid floating point number."
+msgstr "გთხოვთ, შეიყვანოთ სწორი რიცხვი მცოცავი ათობითი წერტილით."
+
+#: core/validators.py:463
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr ""
+"დარწმუნდით, რომ თქვენს მიერ ატვირთული ფაილის სიგრძე არ არის %s ბაიტზე "
+"ნაკლები."
+
+#: core/validators.py:464
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr ""
+"დარწმუნდით, რომ თქვენს მიერ ატვირთული ფაილის სიგრძე არ აღემატება %s ბაიტს."
+
+#: core/validators.py:481
+msgid "The format for this field is wrong."
+msgstr "ამ ველის ფორმატი არასწორია."
+
+#: core/validators.py:496
+msgid "This field is invalid."
+msgstr "ველი არასწორია."
+
+#: core/validators.py:532
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "%s-დან მნიშვნელობის ამოღება შეუძლებელია."
+
+#: core/validators.py:535
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"URL %(url)s მისამართმა დააბრუნა არასწორი Content-Type სათაური '%(contenttype)"
+"s'."
+
+#: core/validators.py:568
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"გთხოვთ, დახუროთ დაუხურავი %(tag)s ტეგი, ხაზის ნომერია %(line)s. (სტრიქონი "
+"იწყება ტექსტით: \"%(start)s\".)"
+
+#: core/validators.py:572
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"ტექსტის ნაწილი, რომელიც %(line)s ხაზზე იწყება, დაუშვებელია მიმდინარე "
+"კონტექსტში. (სტრიქონი იწყება ტექსტით: \"%(start)s\".)"
+
+#: core/validators.py:577
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"%(attr)s\" ატრიბუტი არასწორია %(line)s ხაზზე. (სტრიქონი იწყება ტექსტით: \"%"
+"(start)s\".)"
+
+#: core/validators.py:582
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\" ტეგი არასწორია %(line)s ხაზზე. (სტრიქონი იწყება ტექსტით: \"%"
+"(start)s\".)"
+
+#: core/validators.py:586
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"ტეგში %(line)s ხაზზე ერთი ან რამდენიმე ატრიბუტი გამოტოვებულია. (სტრიქონი "
+"იწყება ტექსტით: \"%(start)s\".)"
+
+#: core/validators.py:591
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"\"%(attr)s\" ატრიბუტს %(line)s ხაზზე აქვს არასწორი მნიშვნელობა. (სტრიქონი "
+"იწყება ტექსტით: \"%(start)s\".)"
+
+#: db/models/manipulators.py:304
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(object)s მოცემული %(type)s-ით უკვე არსებობს მოცემული %(field)s-თვის."
+
+#: db/models/fields/__init__.py:46
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s მოცემული %(fieldname)s-ით უკვე არსებობს."
+
+#: db/models/fields/__init__.py:321 db/models/fields/files.py:168
+#: db/models/fields/files.py:179 forms/fields.py:52 oldforms/__init__.py:370
+msgid "This field is required."
+msgstr "ეს ველი აუცილებელია."
+
+#: db/models/fields/__init__.py:444
+msgid "This value must be an integer."
+msgstr "ეს მნიშვნელობა უნდა იყოს მთელი."
+
+#: db/models/fields/__init__.py:490
+msgid "This value must be either True or False."
+msgstr "ეს მნიშვნელობა უნდა იყოს True ან False."
+
+#: db/models/fields/__init__.py:519
+msgid "This field cannot be null."
+msgstr "ეს მნიშვნელობა არ შეიძლება იყოს null."
+
+#: db/models/fields/__init__.py:621 db/models/fields/__init__.py:638
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format."
+msgstr "შეიყვანეთ სწორი თარიღი და დრო YYYY-MM-DD HH:MM ფორმატში."
+
+#: db/models/fields/__init__.py:694
+msgid "This value must be a decimal number."
+msgstr "ეს მნიშვნელობა უნდა იყოს ათობითი რიცხვი."
+
+#: db/models/fields/__init__.py:835
+msgid "This value must be either None, True or False."
+msgstr "ეს მნიშვნელობა უნდა იყოს None, True ან False."
+
+#: db/models/fields/__init__.py:947 db/models/fields/__init__.py:960
+msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format."
+msgstr "შეიყვანეთ სწორი დრო HH:MM ფორმატში."
+
+#: db/models/fields/files.py:188
+msgid "Enter a valid filename."
+msgstr "შეიყვანეთ სწორი ფაილის სახელი."
+
+#: db/models/fields/related.py:92
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "გთხოვთ, შეიყვანოთ სწორი %s."
+
+#: db/models/fields/related.py:782
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"დააჭირეთ \"Control\", ან \"Command\" Mac-ზე, ერთზე მეტი მნიშვნელობის "
+"ასარჩევად."
+
+#: db/models/fields/related.py:862
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+"გთხოვთ, შეიყვანოთ სწორი %(self)s ID-ები. მნიშვნელობა %(value)r არასწორია."
+msgstr[1] ""
+"გთხოვთ, შეიყვანოთ სწორი %(self)s ID-ები. მნიშვნელობები %(value)r არასწორია."
+
+#: forms/fields.py:53
+msgid "Enter a valid value."
+msgstr "შეიყვანეთ სწორი მნიშვნელობა."
+
+#: forms/fields.py:133
+#, python-format
+msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+msgstr ""
+"დარწმუნდით, რომ მნიშვნელობა შედგება არაუმეტეს %(max)d სიმბოლოსაგან (ახლა "
+"მისი სიგრძეა %(length)d)."
+
+#: forms/fields.py:134
+#, python-format
+msgid "Ensure this value has at least %(min)d characters (it has %(length)d)."
+msgstr ""
+"დარწმუნდით, რომ მნიშვნელობა შედგება არანაკლებ %(min)d სიმბოლოსაგან (ახლა "
+"მისი სიგრძეა %(length)d)."
+
+#: forms/fields.py:162 forms/fields.py:191 forms/fields.py:220
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "დარწმუნდით, რომ მნიშვნელობა ნაკლებია ან ტოლია %s-ზე."
+
+#: forms/fields.py:163 forms/fields.py:192 forms/fields.py:221
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "დარწმუნდით, რომ მნიშვნელობა მეტია ან ტოლია %s-ზე."
+
+#: forms/fields.py:190 forms/fields.py:219
+msgid "Enter a number."
+msgstr "შეიყვანეთ რიცხვი."
+
+#: forms/fields.py:222
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr "დარწმუნდით, რომ მნიშვნელობა %s თანრიგს არ აღემატება."
+
+#: forms/fields.py:223
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr "დარწმუნდით, რომ წილადი ნაწილი %s თანრიგს არ აღემატება."
+
+#: forms/fields.py:224
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr "დარწმუნდით, რომ მთელი ნაწილი %s თანრიგს არ აღემატება."
+
+#: forms/fields.py:282 forms/fields.py:803
+msgid "Enter a valid date."
+msgstr "შეიყვანეთ სწორი თარიღი."
+
+#: forms/fields.py:315 forms/fields.py:804
+msgid "Enter a valid time."
+msgstr "შეიყვანეთ სწორი დრო."
+
+#: forms/fields.py:354
+msgid "Enter a valid date/time."
+msgstr "შეიყვანეთ სწორი თარიღი და დრო."
+
+#: forms/fields.py:441
+msgid "No file was submitted."
+msgstr "ფაილი არ იყო გამოგზავნილი."
+
+#: forms/fields.py:442 oldforms/__init__.py:689
+msgid "The submitted file is empty."
+msgstr "გამოგზავნილი ფაილი ცარიელია."
+
+#: forms/fields.py:532
+msgid "Enter a valid URL."
+msgstr "შეიყვანეთ სწორი URL."
+
+#: forms/fields.py:533
+msgid "This URL appears to be a broken link."
+msgstr "როგორც ჩანს, URL არის გაწყვეტილი ბმული."
+
+#: forms/fields.py:601 forms/fields.py:652
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "აირჩიეთ დასაშვები მნიშვნელობა. %(value)s დასაშვები არ არის."
+
+#: forms/fields.py:653 forms/fields.py:714 forms/models.py:528
+msgid "Enter a list of values."
+msgstr "შეიყვანეთ მნიშვნელობების სია."
+
+#: forms/fields.py:832
+msgid "Enter a valid IPv4 address."
+msgstr "შეიყვანეთ სწორი IPv4 მისამართი."
+
+#: forms/models.py:461
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "აირჩიეთ დასაშვები მნიშვნელობა. ეს არჩევანი დასაშვები არ არის."
+
+#: forms/models.py:529
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "აირჩიეთ დასაშვები მნიშვნელობა. %s დასაშვები არ არის."
+
+#: oldforms/__init__.py:405
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "დარწმუნდით, რომ თქვენს მიერ შეყვანილი ტექსტი %s სიმბოლოზე ნაკლებია."
+msgstr[1] "დარწმუნდით, რომ თქვენს მიერ შეყვანილი ტექსტი %s სიმბოლოზე ნაკლებია."
+
+#: oldforms/__init__.py:410
+msgid "Line breaks are not allowed here."
+msgstr "ახალ ხაზზე გადასვლა აქ დაუშვებელია."
+
+#: oldforms/__init__.py:508 oldforms/__init__.py:582 oldforms/__init__.py:621
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr ""
+"აირჩიეთ დასაშვები მნიშვნელობა; '%(data)s' არ არის %(choices)s მნიშვნელობების "
+"სიაში."
+
+#: oldforms/__init__.py:750
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "შეიყვანეთ მთელი რიცხვი -32,768-დან 32,767-მდე."
+
+#: oldforms/__init__.py:760
+msgid "Enter a positive number."
+msgstr "შეიყვანეთ დადებითი რიცხვი."
+
+#: oldforms/__init__.py:770
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "შეიყვანეთ მთელი რიცხვი 0-დან 32,767-მდე."
+
+#: template/defaultfilters.py:707
+msgid "yes,no,maybe"
+msgstr "კი,არა,შესაძლოა"
+
+#: template/defaultfilters.py:738
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d ბაიტი"
+msgstr[1] "%(size)d ბაიტი"
+
+#: template/defaultfilters.py:740
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f კბაიტი"
+
+#: template/defaultfilters.py:742
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f მბაიტი"
+
+#: template/defaultfilters.py:743
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f გბაიტი"
+
+#: utils/dateformat.py:41
+msgid "p.m."
+msgstr "p.m."
+
+#: utils/dateformat.py:42
+msgid "a.m."
+msgstr "a.m."
+
+#: utils/dateformat.py:47
+msgid "PM"
+msgstr "PM"
+
+#: utils/dateformat.py:48
+msgid "AM"
+msgstr "AM"
+
+#: utils/dateformat.py:97
+msgid "midnight"
+msgstr "შუაღამე"
+
+#: utils/dateformat.py:99
+msgid "noon"
+msgstr "შუადღე"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "ორშაბათი"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "სამშაბათი"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "ოთხშაბათი"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "ხუთშაბათი"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "პარასკევი"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "შაბათი"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "კვირა"
+
+#: utils/dates.py:10
+msgid "Mon"
+msgstr "ორშ"
+
+#: utils/dates.py:10
+msgid "Tue"
+msgstr "სამ"
+
+#: utils/dates.py:10
+msgid "Wed"
+msgstr "ოთხ"
+
+#: utils/dates.py:10
+msgid "Thu"
+msgstr "ხუთ"
+
+#: utils/dates.py:10
+msgid "Fri"
+msgstr "პარ"
+
+#: utils/dates.py:11
+msgid "Sat"
+msgstr "შაბ"
+
+#: utils/dates.py:11
+msgid "Sun"
+msgstr "კვრ"
+
+#: utils/dates.py:18
+msgid "January"
+msgstr "იანვარი"
+
+#: utils/dates.py:18
+msgid "February"
+msgstr "თებერვალი"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "March"
+msgstr "მარტი"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "April"
+msgstr "აპრილი"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "May"
+msgstr "მაისი"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "June"
+msgstr "ივნისი"
+
+#: utils/dates.py:19 utils/dates.py:31
+msgid "July"
+msgstr "ივლისი"
+
+#: utils/dates.py:19
+msgid "August"
+msgstr "აგვისტო"
+
+#: utils/dates.py:19
+msgid "September"
+msgstr "სექტემბერი"
+
+#: utils/dates.py:19
+msgid "October"
+msgstr "ოქტომბერი"
+
+#: utils/dates.py:19
+msgid "November"
+msgstr "ნოემბერი"
+
+#: utils/dates.py:20
+msgid "December"
+msgstr "დეკემბერი"
+
+#: utils/dates.py:23
+msgid "jan"
+msgstr "იან"
+
+#: utils/dates.py:23
+msgid "feb"
+msgstr "თებ"
+
+#: utils/dates.py:23
+msgid "mar"
+msgstr "მარ"
+
+#: utils/dates.py:23
+msgid "apr"
+msgstr "აპრ"
+
+#: utils/dates.py:23
+msgid "may"
+msgstr "მაი"
+
+#: utils/dates.py:23
+msgid "jun"
+msgstr "ივნ"
+
+#: utils/dates.py:24
+msgid "jul"
+msgstr "ივლ"
+
+#: utils/dates.py:24
+msgid "aug"
+msgstr "აგვ"
+
+#: utils/dates.py:24
+msgid "sep"
+msgstr "სექ"
+
+#: utils/dates.py:24
+msgid "oct"
+msgstr "ოქტ"
+
+#: utils/dates.py:24
+msgid "nov"
+msgstr "ნოე"
+
+#: utils/dates.py:24
+msgid "dec"
+msgstr "დეკ"
+
+#: utils/dates.py:31
+msgid "Jan."
+msgstr "იან."
+
+#: utils/dates.py:31
+msgid "Feb."
+msgstr "თებ."
+
+#: utils/dates.py:32
+msgid "Aug."
+msgstr "აგვ."
+
+#: utils/dates.py:32
+msgid "Sept."
+msgstr "სექტ."
+
+#: utils/dates.py:32
+msgid "Oct."
+msgstr "ოქტ."
+
+#: utils/dates.py:32
+msgid "Nov."
+msgstr "ნოემ."
+
+#: utils/dates.py:32
+msgid "Dec."
+msgstr "დეკ."
+
+#: utils/text.py:128
+msgid "or"
+msgstr "ან"
+
+#: utils/timesince.py:21
+msgid "year"
+msgid_plural "years"
+msgstr[0] "წელი"
+msgstr[1] "წელი"
+
+#: utils/timesince.py:22
+msgid "month"
+msgid_plural "months"
+msgstr[0] "თვე"
+msgstr[1] "თვე"
+
+#: utils/timesince.py:23
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "კვირა"
+msgstr[1] "კვირა"
+
+#: utils/timesince.py:24
+msgid "day"
+msgid_plural "days"
+msgstr[0] "დღე"
+msgstr[1] "დღე"
+
+#: utils/timesince.py:25
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "საათი"
+msgstr[1] "საათი"
+
+#: utils/timesince.py:26
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "წუთი"
+msgstr[1] "წუთი"
+
+#: utils/timesince.py:46
+msgid "minutes"
+msgstr "წუთი"
+
+#: utils/timesince.py:51
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr "%(number)d %(type)s"
+
+#: utils/timesince.py:57
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ", %(number)d %(type)s"
+
+#: utils/translation/trans_real.py:401
+msgid "DATE_FORMAT"
+msgstr "d.m.Y"
+
+#: utils/translation/trans_real.py:402
+msgid "DATETIME_FORMAT"
+msgstr "d.m.Y H:i"
+
+#: utils/translation/trans_real.py:403
+msgid "TIME_FORMAT"
+msgstr "H:i"
+
+#: utils/translation/trans_real.py:419
+msgid "YEAR_MONTH_FORMAT"
+msgstr "d.m.Y"
+
+#: utils/translation/trans_real.py:420
+msgid "MONTH_DAY_FORMAT"
+msgstr "d.m.Y"
+
+#: views/generic/create_update.py:114
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "%(verbose_name)s წარმატებით შეიქმნა."
+
+#: views/generic/create_update.py:156
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "%(verbose_name)s წარმატებით შეიცვალა."
+
+#: views/generic/create_update.py:198
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "%(verbose_name)s წაიშალა."
+
+#~ msgid "Ordering"
+#~ msgstr "დალაგება"
+
+#~ msgid "Order:"
+#~ msgstr "დალაგება:"
+
+#~ msgid "Your new password is: %(new_password)s"
+#~ msgstr "თქვენი ახალი პაროლია: %(new_password)s"
+
+#~ msgid "Feel free to change this password by going to this page:"
+#~ msgstr "თქვენ შეგიძლიათ შეცვალოთ იგი შემდეგი გვერდიდან:"
+
+#~ msgid "Added %s."
+#~ msgstr "%s დამატებულია."
+
+#~ msgid "Deleted %s."
+#~ msgstr "%s წაშლილია."
+
+#~ msgid "The two 'new password' fields didn't match."
+#~ msgstr "'ახალი პაროლის' ორი ველი ერთმანეთს არ ემთხვევა."
+
+#~ msgid "Year must be 1900 or later."
+#~ msgstr "წელი უნდა იყოს 1900 ან მეტი."
+
+#~ msgid "Separate multiple IDs with commas."
+#~ msgstr "გამოყავით ID-ები მძიმეებით."
+
+#~ msgid "Brazilian"
+#~ msgstr "ბრაზილიური"
diff --git a/webapp/django/conf/locale/ka/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/ka/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..bb70794
--- /dev/null
+++ b/webapp/django/conf/locale/ka/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/ka/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/ka/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..e23b600
--- /dev/null
+++ b/webapp/django/conf/locale/ka/LC_MESSAGES/djangojs.po
@@ -0,0 +1,117 @@
+# Translation of Django Java-script part to Georgian.
+# Copyright (C) 2008
+# This file is distributed under the same license as the PACKAGE package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-16 22:31+0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: David Avsajanishvili <avsd05@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "მისაწვდომი %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "ავირჩიოთ ყველა"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "დავამატოთ"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "წავშალოთ"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "არჩეული %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "აირჩიეთ და დააწკაპეთ "
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "გავასუფთავოთ ყველა"
+
+#: contrib/admin/media/js/calendar.js:24
+#: contrib/admin/media/js/dateparse.js:32
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr "იანვარი თებერვალი მარტი აპრილი მაისი ივნისი ივლისი აგვისტო სექტემბერი "
+"ოქტომბერი ნოემბერი დეკემბერი"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "კ ო ს ო ხ პ შ"
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "კვირა ორშაბათი სამშაბათი ოთხშაბათი ხუთშაბათი პარასკევი შაბათი"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr "ვაჩვენოთ"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr "დავმალოთ"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Now"
+msgstr "ახლა"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
+msgid "Clock"
+msgstr "საათი"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
+msgid "Choose a time"
+msgstr "ავირჩიოთ დრო"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "Midnight"
+msgstr "შუაღამე"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "6 a.m."
+msgstr "დილის 6 სთ"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
+msgid "Noon"
+msgstr "შუადღე"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
+msgid "Cancel"
+msgstr "უარი"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
+msgid "Today"
+msgstr "დღეს"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
+msgid "Calendar"
+msgstr "კალენდარი"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
+msgid "Yesterday"
+msgstr "გუშინ"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
+msgid "Tomorrow"
+msgstr "ხვალ"
diff --git a/webapp/django/conf/locale/km/LC_MESSAGES/django.mo b/webapp/django/conf/locale/km/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..91f0628
--- /dev/null
+++ b/webapp/django/conf/locale/km/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/km/LC_MESSAGES/django.po b/webapp/django/conf/locale/km/LC_MESSAGES/django.po
new file mode 100644
index 0000000..faf3a91
--- /dev/null
+++ b/webapp/django/conf/locale/km/LC_MESSAGES/django.po
@@ -0,0 +1,2508 @@
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: sengtha@e-khmer.com\n"
+"POT-Creation-Date: 2007-01-15 15:43+0200\n"
+"PO-Revision-Date: 2007-08-10 00:21+0900\n"
+"Last-Translator: Chay Sengtha <sengtha@e-khmer.com>\n"
+"Language-Team: Chay Sengtha <sengtha@e-khmer.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: Information
+msgid "Administration Page"
+msgstr "ទំព័រគ្រប់គ្រង"
+
+msgid "Tag"
+msgstr "ប្រភេទ"
+
+msgid "Headline"
+msgstr "ចំណងជើង"
+
+msgid "Article"
+msgstr "អត្ថបទ"
+
+msgid "Review"
+msgstr "ព្រឹត្តិការណ៍ និង ផលិតផលថ្មីៗ"
+
+msgid "Keyword"
+msgstr "ពាក្យសំខាន់ៗ"
+
+msgid "Advertisement"
+msgstr "ការផ្សាយពាណិជ្ជកម្ម"
+
+msgid "Link"
+msgstr "អត្ថបទភ្ជាប់"
+
+msgid "Accounting"
+msgstr "គណនី"
+
+msgid "Name"
+msgstr "ឈ្មោះ"
+
+msgid "Slug"
+msgstr "ឈ្មោះជាអក្សរឡាតាំង"
+
+msgid "Created"
+msgstr "កាលបរិច្ឆេទនៃការសរសេរ"
+
+msgid "Modified"
+msgstr "កាលបរិច្ឆេទ​នៃការ​ផ្លាស់ប្តូរ"
+
+msgid "Summary"
+msgstr "អត្ថបទសង្ខេប"
+
+msgid "Viewed number"
+msgstr "ចំនួនអាន"
+
+msgid "Site"
+msgstr "គេហទំព័រ"
+
+msgid "Rate"
+msgstr "ការវាយតំលៃ"
+
+msgid "Private"
+msgstr "សំរាប់សមាជិកបង់លុយ"
+
+msgid "Public"
+msgstr "ផ្សព្វផ្សាយ"
+
+msgid "Content"
+msgstr "អត្ថបទ"
+
+msgid "Page"
+msgstr "ទំព័រទី"
+
+msgid "Attach Image"
+msgstr "រូបភាព"
+
+msgid "Ads type"
+msgstr "ប្រភេទពាណិជ្ជកម្ម"
+
+msgid "Link type"
+msgstr "ប្រភេទអត្ថបទភ្ជាប់"
+
+msgid "Account type"
+msgstr "ប្រភេទគណនី"
+
+msgid "Amount"
+msgstr "ចំនួន"
+
+msgid "Person"
+msgstr "អ្នកទទួលខុសត្រូវ"
+
+msgid "Date"
+msgstr "កាលបរិច្ឆេទ"
+
+msgid "Information"
+msgstr "ការគ្រប់គ្រងព័ត៌មាន"
+
+msgid "Auth"
+msgstr "ការគ្រប់គ្រងសមាជិក"
+
+msgid "Comments"
+msgstr "ការគ្រប់គ្រងមតិ​យោបល់"
+
+msgid "Sites"
+msgstr "ការគ្រប់គ្រងដមែន"
+
+msgid "Flatpages"
+msgstr "ការគ្រប់គ្រងទំព័រថ្មី"
+
+msgid "File-Browser"
+msgstr "ការគ្រប់គ្រងឯកសារ"
+
+msgid "Make Directory"
+msgstr "បង្កើតថតថ្មី"
+
+msgid "Multiple Upload"
+msgstr "ទាញយកឯកសារ"
+
+msgid "results"
+msgstr "លទ្ធផល"
+
+msgid "total"
+msgstr "​សរុប"
+
+msgid "Total"
+msgstr "​សរុប"
+
+msgid "type"
+msgstr "ប្រភេទ"
+
+msgid "filename"
+msgstr "ឈ្មោះឯកសារ"
+
+msgid "size"
+msgstr "ទំហំ"
+
+msgid "Past 30 days"
+msgstr "៣០ថ្ងៃកន្លងមក"
+
+msgid "By Date"
+msgstr "តាម​កាលបរិច្ឆេទ"
+
+msgid "By Type"
+msgstr "តាម​ប្រភេទ"
+
+msgid "no entries found"
+msgstr "រកមិនឃើញ"
+
+msgid "Select files to upload"
+msgstr "សូមជ្រើសរើសឯកសារ​។"
+
+msgid "At least one file must be chosen."
+msgstr "សូមជ្រើសរើសឯកសារ​យ៉ាង​តិច១។"
+
+msgid "Wrong filetype for"
+msgstr "ប្រភេទឯកសារដែលមិនអាចទាញយកបាន។"
+
+msgid "File already exists"
+msgstr "ឯកសារនេះមានរួចហើយ។"
+
+msgid "File"
+msgstr "ឯកសារ"
+
+msgid " is existed."
+msgstr "ត្រូវបានគេយករួចហើយ។"
+
+msgid "Account registration is not complete yet.<br/>You need to activate your account first.<br/>We have already sent you the activate URL. Please check you mail box."
+msgstr "ការចុះឈ្មោះមិនទាន់ចប់នៅឡើយទេ។ <br/>យើងខ្ញុំបានបញ្ជូនអ៊ីមែល​ទៅកាន់អាស័យដ្ឋានអ៊ីមែល​របស់​លោកអ្នក​ហើយ​ សូមចុច​អត្ថបទភ្ជាប់​នៅក្នុង​អ៊ីមែល ដើម្បី​បញ្ជប់ការចុះឈ្មោះ។"
+
+msgid "Help"
+msgstr "ជំនួយ"
+
+msgid "Max. Filesize"
+msgstr "ទំហំឯកសារអតិបរិមា"
+
+msgid "Upload"
+msgstr "ទាញយក"
+
+msgid "Folder"
+msgstr "ថត"
+
+msgid "Video"
+msgstr "វីដេអូ"
+
+msgid "Document"
+msgstr "ឯកសារ"
+
+msgid "Sound"
+msgstr "សំលេង"
+
+msgid "Code"
+msgstr "កូត"
+
+msgid "Allowed"
+msgstr "ប្រភេទឯកសារដែលអាចទាញ​យកបាន"
+
+msgid "Directory already exists."
+msgstr "ថតនេះមាន​រួចហើយ។"
+
+msgid "Permission denied."
+msgstr "ពុំមានសិទ្ធិអាចបង្កើតបាន។"
+
+msgid "Please correct the errors below."
+msgstr "សូមកែកំហុសដូចខាងក្រោម។"
+
+msgid "Only letters, numbers and underscores are allowed."
+msgstr "ត្រូវបំពេញតែអក្សរឡាតាំង ចំនួនលេខ និង សញ្ញា _ ។"
+
+msgid "The directory will automatically be converted to lowercase"
+msgstr "ឈ្មោះថតនឹងត្រូវផ្លាស់ប្តូរទៅជាអក្សរតូចដោយស្វ័យប្រវត្ត។"
+
+msgid "Create"
+msgstr "បង្កើត"
+
+msgid "date"
+msgstr "​កាលបរិច្ឆេទ"
+
+msgid "Dbtemplate"
+msgstr "ការគ្រប់គ្រងឯកសារគំរូ"
+
+msgid "template"
+msgstr "ឯកសារគំរូ"
+
+msgid "templates"
+msgstr "ឯកសារគំរូ"
+
+msgid "Comment"
+msgstr "ផ្សេងៗ"
+
+msgid "Income"
+msgstr "ចំណូល"
+
+msgid "Expense"
+msgstr "ចំណាយ"
+
+msgid "Image"
+msgstr "រូបភាព"
+
+msgid "Text and Image"
+msgstr "អក្សរ និង​ រូបភាព"
+
+msgid "New Headlines"
+msgstr "អត្ថបទថ្មីៗ"
+
+msgid "New Reviews"
+msgstr "ព្រឹត្តិការណ៍ និង ផលិតផលថ្មីៗ"
+
+msgid "Login"
+msgstr "ពិនិត្យចូល"
+
+msgid "Logout"
+msgstr "ចាកចេញ"
+
+msgid "Register"
+msgstr "ចូលជាសមាជិក"
+
+msgid "Free"
+msgstr "ឥតគិតថ្លៃ"
+
+msgid "Welcome"
+msgstr "សូមស្វាគមន័ "
+
+msgid "IT Resources"
+msgstr "ប្រភពព័ត៌មានអំពី បច្ចេកទេសព័ត៌មានវិទ្យា"
+
+msgid "Copyrights"
+msgstr "រក្សាសិទ្ធិដោយ "
+
+msgid "Next page"
+msgstr "ទំព័របន្ទាប់"
+
+msgid "Previous page"
+msgstr "ទំព័រមុន "
+
+msgid "Wrong number or password. Please try it again."
+msgstr "ឈ្មោះជាសមាជិក​ ឬ ពាក្យសំងាត់ មិនត្រឹមត្រូវ។ សូមសាកល្បងម្តងទៀត។ "
+
+msgid "This username has not activated yet."
+msgstr "ឈ្មោះសាមាជិកនេះមិនទាន់ត្រូវបានគេអនុញ្ញាតនៅឡើយទេ។"
+
+msgid "Please write"
+msgstr "សូមបំពេញ"
+
+msgid "More"
+msgstr "អត្ថបទផ្សេងទៀត"
+
+msgid "Please correct below errors."
+msgstr "សូកកែកូមហុសខាងក្រោម។"
+
+msgid "Thank for your comment."
+msgstr "សូមអរគុណដែលបានបញ្ជេញមតិយោបល់ទាក់ទងនឹងអត្ថបទនេះ"
+
+#: Django standard
+#: contrib/comments/models.py:67
+#: contrib/comments/models.py:166
+msgid "object ID"
+msgstr "លេខ​សំគាល់​កម្មវិធី"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "ចំណងជើង"
+
+#: contrib/comments/models.py:69
+#: contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "មតិ​យោបល់"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "វាយ​តំលៃ #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "វាយ​តំលៃ #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "វាយ​តំលៃ #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "វាយ​តំលៃ #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "វាយ​តំលៃ #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "វាយ​តំលៃ #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "វាយ​តំលៃ #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "វាយ​តំលៃ #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "កំពុង​ត្រួត​ពិនិត្យចំពោះ​​ការ​វាយ​តំលៃ"
+
+#: contrib/comments/models.py:83
+#: contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "កាល​បរិច្ឆេទនៃ​ការ​សរសេរ​​"
+
+#: contrib/comments/models.py:84
+#: contrib/comments/models.py:170
+msgid "is public"
+msgstr "ផ្សព្វផ្សាយ​ជាសធារណៈ"
+
+#: contrib/comments/models.py:85
+#: contrib/admin/views/doc.py:304
+msgid "IP address"
+msgstr "លេខ IP"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "ត្រូវ​បាន​លប់​ចេញ"
+
+#: contrib/comments/models.py:86
+msgid "Check this box if the comment is inappropriate. A \"This comment has been removed\" message will be displayed instead."
+msgstr "សូម​ចុច​ជ្រើសរើស​យក​ប្រអប់​នេះ​ ប្រសិន​បើ​មតិ​យោបល់​មិនសមរម្យ។ ឃ្លា \" មតិ​យោបល់​នេះ​ត្រូវបាន​គេលប់​\" នឹងត្រូវ​បង្ហាញ​ជំនួស​វិញ។"
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "មតិ​យោបល់"
+
+#: contrib/comments/models.py:131
+#: contrib/comments/models.py:207
+msgid "Content object"
+msgstr "អត្ថន័យ​របស់​កម្មវិធី"
+
+#: contrib/comments/models.py:159
+#: python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"សរសេរ​ដោយ %(user)s នៅថ្ងៃ​ %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "ឈ្មោះ"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "លេខ ip"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "យល់ព្រម​ដោយ​បុគ្គលិក"
+
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "មតិ​យោបល់(មិនចាំបាច់សមាជិក)"
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "មតិ​យោបល់(មិនចាំបាច់សមាជិក)"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "ពិន្ទុ"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "កាលបរិច្ឆេទ​ដាក់ពិន្ទុ"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "ពិន្ទុ​កម្មា(karma)"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "ពិន្ទុ​កម្មា(karma)"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d វាយ​តំលៃ​ដោយ %(user)s"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"មតិ​យោបល់នេះ​ត្រូវបាន​កត់សំគាល់ទុក​ដោយ %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "កាល​បរិច្ឆេទ​កត់​សំគាល់​ទុក"
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "ការ​កត់​សំគាល់​ទុក​"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "ការ​កត់​សំគាល់​ទុក"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "កត់​សំគាល់​ទុកដោយ %r"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "កាល​បរិច្ឆេទនៃ​ការ​លប់​"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "ការ​លប់​ដោយអ្នក​គ្រប់គ្រង"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "ការ​លប់​ដោយអ្នក​គ្រប់គ្រង"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "ការ​លប់​ដោយអ្នក​គ្រប់គ្រង នៅ %r"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "ជនអនាមិក​មិន​អាច​បោះ​ឆ្នោត​បាន​ទេ"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "លេខ​សំគាល់​មតិ​យោបល់​មិន​ត្រឹម​ត្រូវ"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "មិន​អាច​បោះ​ឆ្នោត​អោយ​ខ្លួន​ឯង​បាន​ទេ"
+
+#: contrib/comments/views/comments.py:27
+msgid "This rating is required because you've entered at least one other rating."
+msgstr "ចាំបាច់ត្រូវការ វាយតំលៃ ពីព្រោះលោកអ្នកបានជ្រើសរើសធ្វើការវាយតំលៃផ្សេងពីនេះ។"
+
+#: contrib/comments/views/comments.py:111
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"មតិយោបល់នេះត្រូវបានបញ្ជូនដោយសមាជិកម្នាក់ដែលបាន​ផ្តល់មតិយោបល់​តិចជាង %(count)s។\n"
+"%(text)s"
+msgstr[1] ""
+"មតិយោបល់នេះត្រូវបានសរសេរដោយសមាជិកម្នាក់ដែលបាន​ផ្តល់មតិយោបល់​តិចជាង %(count)s។\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:116
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"មតិយោបល់បានសរសេរដោយសមាជិកមិនសូវប្រាកដប្រជា:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:188
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "អនុញ្ញាតតែទិន្នន័យតាមរយះ​ POST ​។"
+
+#: contrib/comments/views/comments.py:192
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "ទិន្នន័យរបស់ចំនុចមួយចំនួនដែលចាំបាច់ មិនទាន់បានបំពេញ។"
+
+#: contrib/comments/views/comments.py:196
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "មានគេព្យាយាមសរសេរ មតិយោបល់ មិនត្រឹមត្រូវ (ប៉ះពាល់ដល់សុវត្ថិភាព)"
+
+#: contrib/comments/views/comments.py:206
+#: contrib/comments/views/comments.py:292
+msgid "The comment form had an invalid 'target' parameter -- the object ID was invalid"
+msgstr "បែបបទបំពេញមតិយោបល់មិនមាន 'target' ​និង​ លេខសំគាល់កម្មវិធី (object ID)​ ត្រឹមត្រូវ"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "បែបបទបំពេញមតិយោបល់មិនមាន 'preview' or 'post' ។"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "ឈ្មោះសមាជិក"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr "ចាកចេញ"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "ពាក្យ​សំងាត់"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "តើលោកអ្នក​ភ្លេច​ពាក្យសំងាត់រឺ?​​"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "វាយតំលៃ"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "ចាំ​បាច់"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "មិនចាំ​បាច់​ជ្រើសរើស​យក​ក៏បាន​"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "បញ្ជូន​រូបភាព"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "មតិ​យោបល់"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "មើល​ មតិយោបល់"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "ឈ្មោះ"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>ដោយ %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:70
+#: contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143
+#: contrib/admin/filterspecs.py:169
+msgid "All"
+msgstr "ទាំងអស់"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "កាល​បរិច្ឆេទណាមួយ"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "ថ្ងៃនេះ"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "៧​ថ្ងៃ​កន្លង​មក"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "ខែ​នេះ"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "ឆ្នាំ​នេះ"
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "យល់ព្រម"
+
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "មិនយល់ព្រម"
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "មិន​ដឹង"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "ពេលវេលាប្រតិបត្តិការ"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "លេខ​សំគាល់​កម្មវិធី (object id)"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "object repr"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "សកម្មភាព"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "ផ្លាស់ប្តូរ"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "កំណត់ហេតុ"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "កំណត់ហេតុ"
+
+#: contrib/admin/templatetags/admin_list.py:230
+msgid "All dates"
+msgstr "កាលបរិច្ឆេទទាំងអស់"
+
+#: contrib/admin/views/decorators.py:10
+#: contrib/auth/forms.py:59
+msgid "Please enter a correct username and password. Note that both fields are case-sensitive."
+msgstr "សូមបំពេញ ឈ្មោះសមាជិក និង ពាក្យសំងាត់ ។ "
+
+#: contrib/admin/views/decorators.py:24
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "ពិនិត្យចូល"
+
+#: contrib/admin/views/decorators.py:62
+msgid "Please log in again, because your session has expired. Don't worry: Your submission has been saved."
+msgstr "សូមពិនិត្យចូលម្តងទៀត ។"
+
+#: contrib/admin/views/decorators.py:69
+msgid "Looks like your browser isn't configured to accept cookies. Please enable cookies, reload this page, and try again."
+msgstr "ប្រហែលជាកម្មវិធីមើលគេះទំព័រដែលលោកអ្នកកំពុងប្រើ មិនទទួល​ គូគី (cookies) ។ សូមកំណត់កម្មវិធីដែលលោកអ្នកកំពុងប្រើនេះអោយទទួលយក គូគី ហើយចូលមកមើលទំព័រនេះម្តងទៀត ។"
+
+#: contrib/admin/views/decorators.py:83
+msgid "Usernames cannot contain the '@' character."
+msgstr "ឈ្មោះសមាជិកមិនអាចមាន សញ្ញា '@' ។"
+
+#: contrib/admin/views/decorators.py:85
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "អ៊ីមែលរបស់លោកអ្នក មិនអាចធ្វើជា ឈ្មោះសមាជិកបានទេ ។ សូមសាកល្បងជាមួយ '%s'។"
+
+#: contrib/admin/views/main.py:223
+msgid "Site administration"
+msgstr "ទំព័រគ្រប់គ្រង"
+
+#: contrib/admin/views/main.py:257
+#: contrib/admin/views/auth.py:17
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "ឈ្មោះកម្មវិធី %(name)s \"%(obj)s\" បានបញ្ជូលដោយជោគជ័យ​។"
+
+#: contrib/admin/views/main.py:261
+#: contrib/admin/views/main.py:347
+#: contrib/admin/views/auth.py:22
+msgid "You may edit it again below."
+msgstr "សូមសាកល្បងកែប្រែម្តងទៀត។"
+
+#: contrib/admin/views/main.py:271
+#: contrib/admin/views/main.py:356
+#, python-format
+msgid "You may add another %s below."
+msgstr "លោកអ្នកអាចបន្ថែម  %s ផ្សេងទៀតដូចខាងក្រោម។"
+
+#: contrib/admin/views/main.py:289
+#, python-format
+msgid "Add %s"
+msgstr "បន្ថែម %s"
+
+#: contrib/admin/views/main.py:335
+#, python-format
+msgid "Added %s."
+msgstr "បានបន្ថែម %s"
+
+#: contrib/admin/views/main.py:335
+#: contrib/admin/views/main.py:337
+#: contrib/admin/views/main.py:339
+msgid "and"
+msgstr "និង"
+
+#: contrib/admin/views/main.py:337
+#, python-format
+msgid "Changed %s."
+msgstr "បានផ្លាស់ប្តូរ %s"
+
+#: contrib/admin/views/main.py:339
+#, python-format
+msgid "Deleted %s."
+msgstr "បានលប់ %s"
+
+#: contrib/admin/views/main.py:342
+msgid "No fields changed."
+msgstr "ពុំមានទិន្នន័យត្រូវបានផ្លាស់ប្តូរ។"
+
+#: contrib/admin/views/main.py:345
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "កម្មវិធីឈ្មោះ %(name)s \"%(obj)s\" ត្រូវបានផ្លាស់ប្តូរដោយជោគជ័យ។"
+
+#: contrib/admin/views/main.py:353
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "ឈ្មោះកម្មវីធី %(name)s \"%(obj)s\" ត្រូវបានបន្ថែមដោយជោគជ័យ។ លោកអ្នកអាចផ្លាស់ប្តូរម្តងទៀតនៅខាងក្រោម។"
+
+#: contrib/admin/views/main.py:391
+#, python-format
+msgid "Change %s"
+msgstr "ផ្លាស់ប្តូរ %s"
+
+#: contrib/admin/views/main.py:473
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "មានទិន្នន័យ %(fieldname)s មួយចំនួននៅក្នុង %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:478
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "មានទិន្នន័យ %(fieldname)s មួយចំនួននៅក្នុង %(name)s:"
+
+#: contrib/admin/views/main.py:511
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "ឈ្មោះកម្មវិធី %(name)s \"%(obj)s\" ត្រូវបានលប់ដោយជោគជ័យ។"
+
+#: contrib/admin/views/main.py:514
+msgid "Are you sure?"
+msgstr "តើលោកអ្នកប្រាកដទេ?"
+
+#: contrib/admin/views/main.py:536
+#, python-format
+msgid "Change history: %s"
+msgstr "សកម្មភាពផ្លាស់ប្តូរកន្លងមក : %s"
+
+#: contrib/admin/views/main.py:570
+#, python-format
+msgid "Select %s"
+msgstr "ជ្រើសរើស %s"
+
+#: contrib/admin/views/main.py:570
+#, python-format
+msgid "Select %s to change"
+msgstr "ជ្រើសរើស %s ដើម្បីផ្លាស់ប្តូរ"
+
+#: contrib/admin/views/main.py:758
+msgid "Database error"
+msgstr "ទិន្នន័យមូលដ្ឋានមានបញ្ហា"
+
+#: contrib/admin/views/doc.py:46
+#: contrib/admin/views/doc.py:48
+#: contrib/admin/views/doc.py:50
+msgid "tag:"
+msgstr "ប្រភេទ:"
+
+#: contrib/admin/views/doc.py:77
+#: contrib/admin/views/doc.py:79
+#: contrib/admin/views/doc.py:81
+msgid "filter:"
+msgstr "ពាក្យស្វែងរក"
+
+#: contrib/admin/views/doc.py:135
+#: contrib/admin/views/doc.py:137
+#: contrib/admin/views/doc.py:139
+msgid "view:"
+msgstr "មើល"
+
+#: contrib/admin/views/doc.py:164
+#, python-format
+msgid "App %r not found"
+msgstr "ស្វែងរក App %r មិនឃើញ ។"
+
+#: contrib/admin/views/doc.py:171
+#, python-format
+msgid "Model %r not found in app %r"
+msgstr "Model %r រកមិនឃើញនៅក្នុង app %r"
+
+#: contrib/admin/views/doc.py:183
+#, python-format
+msgid "the related `%s.%s` object"
+msgstr " `%s.%s` object ដែលពាក់ព័ន្ធ"
+
+#: contrib/admin/views/doc.py:183
+#: contrib/admin/views/doc.py:205
+#: contrib/admin/views/doc.py:219
+#: contrib/admin/views/doc.py:224
+msgid "model:"
+msgstr "model:"
+
+#: contrib/admin/views/doc.py:214
+#, python-format
+msgid "related `%s.%s` objects"
+msgstr "ជាប់​ទាក់ទង​ជាមួយ​នឹងកម្មវិធី​  `%s.%s` "
+
+#: contrib/admin/views/doc.py:219
+#, python-format
+msgid "all %s"
+msgstr "ទាំងអស់ %s"
+
+#: contrib/admin/views/doc.py:224
+#, python-format
+msgid "number of %s"
+msgstr "ចំនួន​នៃ​%s"
+
+#: contrib/admin/views/doc.py:229
+#, python-format
+msgid "Fields on %s objects"
+msgstr "ទិន្នន័យអំពី %s កម្មវិធី"
+
+#: contrib/admin/views/doc.py:291
+#: contrib/admin/views/doc.py:301
+#: contrib/admin/views/doc.py:303
+#: contrib/admin/views/doc.py:309
+#: contrib/admin/views/doc.py:310
+#: contrib/admin/views/doc.py:312
+msgid "Integer"
+msgstr "ចំនួនពិត(Integer)"
+
+#: contrib/admin/views/doc.py:292
+msgid "Boolean (Either True or False)"
+msgstr "Boolean (អាច​ជា True រឺ False)"
+
+#: contrib/admin/views/doc.py:293
+#: contrib/admin/views/doc.py:311
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "String (អាចសរសេរបានរហូតដល់ %(maxlength)s)"
+
+#: contrib/admin/views/doc.py:294
+msgid "Comma-separated integers"
+msgstr "ចំនួនពិត(Integer) ដែលផ្តាច់ចេញពីគ្នាដោយ​ក្បៀស"
+
+#: contrib/admin/views/doc.py:295
+msgid "Date (without time)"
+msgstr "កាល​បរិច្ឆេទ (Date) (មិនមានសរសេរម៉ោង)"
+
+#: contrib/admin/views/doc.py:296
+msgid "Date (with time)"
+msgstr "កាល​បរិច្ឆេទ (Date) (មានសរសេរម៉ោង)"
+
+#: contrib/admin/views/doc.py:297
+msgid "E-mail address"
+msgstr "អ៊ីម៉ែល"
+
+#: contrib/admin/views/doc.py:298
+#: contrib/admin/views/doc.py:299
+#: contrib/admin/views/doc.py:302
+msgid "File path"
+msgstr "ផ្លូវទៅកាន់ឯកសារ"
+
+#: contrib/admin/views/doc.py:300
+msgid "Decimal number"
+msgstr "ចំនួនទសភាគ (Decimal)"
+
+#: contrib/admin/views/doc.py:306
+msgid "Boolean (Either True, False or None)"
+msgstr "Boolean (អាចជា True​ រឺ False រឺ None)"
+
+#: contrib/admin/views/doc.py:307
+msgid "Relation to parent model"
+msgstr "ទាក់ទងទៅនឹងម៉ូដែល (model)មេ"
+
+#: contrib/admin/views/doc.py:308
+msgid "Phone number"
+msgstr "លេខទូរស័ព្ទ"
+
+#: contrib/admin/views/doc.py:313
+msgid "Text"
+msgstr "អត្ថបទ"
+
+#: contrib/admin/views/doc.py:314
+msgid "Time"
+msgstr "ពេលវេលា"
+
+#: contrib/admin/views/doc.py:315
+#: contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "អាស័យដ្ឋានគេហទំព័រ(URL)"
+
+#: contrib/admin/views/doc.py:316
+msgid "U.S. state (two uppercase letters)"
+msgstr "សហរដ្ឋអាមេរិក U.S. (ជាមួយនឹងអក្សរធំពីរ)"
+
+#: contrib/admin/views/doc.py:317
+msgid "XML text"
+msgstr "អត្ថបទ XML"
+
+#: contrib/admin/views/doc.py:343
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s ហាក់បីដូចជា URL ដែល​ត្រឹមត្រូវទេ"
+
+#: contrib/admin/views/auth.py:28
+msgid "Add user"
+msgstr "បន្ថែមសមាជិក"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "ឯកសារ"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "ផ្លាស់ប្តូរពាក្យសំងាត់"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "គេហទំព័រ"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+msgid "History"
+msgstr "សកម្មភាព​កន្លង​មក"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Date/time"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "សមាជិក"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "សកម្មភាព"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "N j, Y, P"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid "This object doesn't have a change history. It probably wasn't added via this admin site."
+msgstr "កម្មវិធីនេះមិនមានសកម្មភាព​កន្លងមកទេ។ ប្រហែលជាសកម្មភាពទាំងនេះមិនបានធ្វើនៅទំព័រគ្រប់គ្រងនេះ។"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "ទំព័រគ្រប់គ្រងរបស់ Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "ការ​គ្រប់គ្រង​របស់ ​Django"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "ម៉ាស៊ីនផ្តល់សេវាកម្ម​ មានបញ្ហា"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "ម៉ាស៊ីនផ្តល់សេវាកម្ម​ មានបញ្ហា (៥០០)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "ម៉ាស៊ីនផ្តល់សេវាកម្ម​ មានបញ្ហា  <em>(៥០០)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid "There's been an error. It's been reported to the site administrators via e-mail and should be fixed shortly. Thanks for your patience."
+msgstr "មានកំហុស។ កំហុសនេះត្រូវបានបញ្ជូនទៅកាន់អ្នកគ្រប់គ្រងគេហទំព័រនេះរួចហើយ។ សូមអភ័យទោសចំពោះបញ្ហានេះ។"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "ទំព័រ​ដែល​លោកអ្នកចង់​រក​នេះពុំមាន​នៅក្នុងម៉ាស៊ីនរបស់យើងខ្ញុំទេ"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "សួមអភ័យទោស ទំព័រ​ដែល​លោកអ្នកចង់​រក​នេះពុំមាន​នឹងក្នុងម៉ាស៊ីនរបស់យើងខ្ញុំទេ"
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "ម៉ូដែល (Models) មាននៅក្នុងកម្មវិធី %(name)s ។"
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "បន្ថែម"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "ផ្លាស់ប្តូរ"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "លោកអ្នកពុំមានសិទ្ធិ ផ្លាស់​ប្តូរ ទេ។"
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "សកម្មភាពបច្ចុប្បន្ន"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "សកម្មភាពរបស់ខ្ញុំ"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "គ្មាន"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "បន្ថែម %(name)s"
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "តើលោកអ្នក <a href=\"/password_reset/\">ភ្លេចពាក្យសំងាត់</a>?"
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "សូមស្វាគមន៏"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "លប់"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid "Deleting the %(object_name)s '%(escaped_object)s' would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:"
+msgstr "ការលប់ %(object_name)s '%(escaped_object)s' អាចធ្វើអោយ​កម្មវិធីដែលពាក់​ព័ន្ធបាត់បង់ ។ ក៏ប៉ន្តែលោកអ្នក​ពុំមាន​សិទ្ធិលប់​កម្មវិធី​ប្រភេទនេះទេ។"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid "Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? All of the following related items will be deleted:"
+msgstr "តើលោកអ្នកប្រាកដជាចង់លប់ %(object_name)s \"%(escaped_object)s\"? ការលប់ %(object_name)s '%(escaped_object)s' អាចធ្វើអោយ​កម្មវិធីដែលពាក់​ព័ន្ធបាត់បង់។"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "ខ្ញុំច្បាស់​ជាចង់លប់"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "ដោយ​  %(filter_title)s "
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "ស្វែងរក"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "លទ្ធផល ១"
+msgstr[1] "លទ្ធផល %(counter)s "
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "សរុបទាំងអស់ %(full_result_count)s"
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "បង្ហាញទាំងអស់"
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "ស្វែងរកជាមួយ"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "មើលនៅលើគេហទំព័រដោយផ្ទាល់"
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "សូមកែប្រែកំហុសខាងក្រោម ។"
+msgstr[1] "សូមកែប្រែកំហុសខាងក្រោម ។"
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr "កំពុងតំរៀប"
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr "តំរៀប"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "រក្សាទុក"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "រក្សាទុក ហើយ បន្ថែម​ថ្មី"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "រក្សាទុក ហើយ កែឯកសារដដែល"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "រក្សាទុក"
+
+#: contrib/admin/templates/admin/invalid_setup.html:8
+msgid "Something's wrong with your database installation. Make sure the appropriate database tables have been created, and make sure the database is readable by the appropriate user."
+msgstr "មូលដ្ឋាន​ទិន្នន័យ​​​ របស់លោកអ្នក មានបញ្ហា។ តើ លោកអ្នកបាន បង្កើត តារាង​ របស់មូលដ្ឋានទិន្នន័យ​ ហើយឬនៅ? តើ​ លោកអ្នកប្រាកដថាសមាជិកអាចអានមូលដ្ឋានទិន្នន័យនេះ​​បានឬទេ? "
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid "First, enter a username and password. Then, you'll be able to edit more user options."
+msgstr "តំបូងសូមបំពេញ ឈ្មោះជាសមាជិក និង ពាក្យសំងាត់​។ បន្ទាប់មកលោកអ្នកអាចបំពេញបន្ថែមជំរើសផ្សេងៗទៀតបាន។ "
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "ឈ្មោះជាសមាជិក"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+msgid "Password"
+msgstr "ពាក្យសំងាត់"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+msgid "Password (again)"
+msgstr "ពាក្យសំងាត់ (ម្តងទៀត)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+msgid "Enter the same password as above, for verification."
+msgstr "សូមបំពេញពាក្យសំងាត់ដូចខាងលើ ដើម្បីត្រួតពិនិត្យ។ "
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "ផ្លាស់ប្តូរពាក្យសំងាត់"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "ពាក្យសំងាត់បានផ្លាស់ប្តូរដោយជោគជ័យ"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "ពាក្យសំងាត់របស់លោកអ្នកបានផ្លាស់ប្តូរហើយ"
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "ពាក្យសំងាត់បានកំណត់សារជាថ្មី"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid "Forgotten your password? Enter your e-mail address below, and we'll reset your password and e-mail the new one to you."
+msgstr "តើលោកអ្នកភ្លេចពាក្យសំងាត់រឺ? សូមបំពេញអ៊ីម៉ែលខាងក្រោម យើងខ្ញុំនឹងកំណត់ពាក្យសំងាត់របស់លោកអ្នកសារឡើងវិញ ហើយបញ្ជូនទៅកាន់អ៊ីម៉ែលរបស់លោកអ្នក។"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "អ៊ីមែល"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "កំណត់ពាក្យសំងាត់សារជាថ្មី"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "សូមថ្លែងអំណរគុណ ដែលបានចំណាយ ពេលវេលាដ៏មានតំលៃ របស់លោកអ្នកមកទស្សនាគេហទំព័ររបស់យើងខ្ញុំ"
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "ពិនិត្យចូលម្តងទៀត"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "ពាក្យសំងាត់បានផ្លាស់ប្តូរដោយជោគជ័យ"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid "We've e-mailed a new password to the e-mail address you submitted. You should be receiving it shortly."
+msgstr "យើងខ្ញុំបានបញ្ជូន​ពាក្យសំងាត់ទៅកាន់​អ៊ីម៉ែលរបស់លោកអ្នករួចហើយ។ លោកអ្នកនឹងបានទទួលនៅពេលបន្តិចទៀតនេះ។"
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid "Please enter your old password, for security's sake, and then enter your new password twice so we can verify you typed it in correctly."
+msgstr "សូមបំពេញពាក្យសំងាត់ចាស់របស់លោកអ្នក។ ដើម្បីសុវត្ថភាព សូមបំពេញពាក្យសំងាត់ថ្មីខាងក្រោមពីរដង។"
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "ពាក្សំងាត់ចាស់"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "ពាក្យសំងាត់ថ្មី"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "បំពេញពាក្យសំងាត់ថ្មីម្តងទៀត"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "ផ្លាស់ប្តូរពាក្យសំងាត់"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "លោកអ្នកទទួលអ៊ីម៉ែលនេះដោយសារលោកអ្នកកំណត់ពាក្យសំងាត់នេះសារជាថ្មី"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "សំរាប់សមាជិកនៅឯគេហទំព័រ %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "ពាក្យសំងាត់ថ្មីគឺ: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "សូមផ្លាស់ប្តូរពាក្យសំងាត់នៅឯទំព័រនេះ:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "ឈ្មោះជាសមាជិកក្នុងករណីភ្លេច:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "សូមអរគុណដែលបានប្រើប្រាស់សេវាកម្មរបស់យើងខ្ញុំ"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "ក្រុមរបស់គេហទំព័រ %(site_name)s"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "កំរងចំណាំ"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "កំរងចំណាំអំពីឯកសារ"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">ដើម្បីតំលើងកំរងចំណាំ សូមទាញយកអត្ថបទភ្ជាប់ទៅ​កាន់​របាឧបករណ៍ ឬក៏ចុចខាងស្តាំលើអត្ថបទភ្ជាប់ហើយ​បញ្ជូលទៅក្នុងកំរងចំណាំរបស់លោកអ្នក។</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "ឯកសារសំរាប់ទំព័រនេះ"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid "Jumps you from any page to the documentation for the view that generates that page."
+msgstr "Jumps you from any page to the documentation for the view that generates that page."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "បង្ហាញលេខសំគាល់កម្មវិធី"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid "Shows the content-type and unique ID for pages that represent a single object."
+msgstr "Shows the content-type and unique ID for pages that represent a single object."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "កែប្រែកម្មវិធីនេះ(វីនដូវកំពុងប្រើ)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "បង្វែរទៅកាន់​ ទំព័រគ្រប់គ្រង សំរាប់ទំព័រណាដែលតំណាងអោយកម្មវិធីតែមួយ។"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "កែប្រែកម្មវិធីនេះ(វីនដូវថ្មី)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "ដូចខាងលើ តែបើកនៅទំព័រវីនដូវថ្មី"
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "កាលបរិច្ឆេទ"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "ម៉ោង"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "បច្ចុប្បន្ន"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "ផ្លាស់ប្តូរ"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "នាំចេញពី"
+
+#: contrib/redirects/models.py:8
+msgid "This should be an absolute path, excluding the domain name. Example: '/events/search/'."
+msgstr "គួរតែជាផ្លូវពេញ (absolute path) ហើយមិនបញ្ជូលឈ្មោះ ដមែន (domain name​)។​ឧទាហរណ៍ '/events/search/'។"
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "នាំចេញទៅ"
+
+#: contrib/redirects/models.py:10
+msgid "This can be either an absolute path (as above) or a full URL starting with 'http://'."
+msgstr "អាចជាផ្លូវពេញ (absolute path) ឬក៏ URL ទាំងមូលដែលចាប់ផ្តើមជាមួយ 'http://'។"
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "នាំចេញ"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "នាំចេញ"
+
+#: contrib/flatpages/models.py:8
+msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr "ឧទាហរណ៍  '/about/contact/' ។ ត្រូវប្រាកដថាមានសញ្ញា / ទាំងនៅផ្នែកខាងមុខ និង ខាងក្រោយ។"
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "ចំណងជើង"
+
+msgid "Title"
+msgstr "ចំណងជើង"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "អត្ថន័យ"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "អនុញ្ញាត"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "ឈ្មោះឯកសារគំរូ"
+
+#: contrib/flatpages/models.py:13
+msgid "Example: 'flatpages/contact_page.html'. If this isn't provided, the system will use 'flatpages/default.html'."
+msgstr "ឧទាហរណ៍ 'flatpages/contact_page.html'។ ប្រសិនឯកសារនេះមិនមានទេ​ នោះឯកសារ 'flatpages/default.html'នឹងត្រូវប្រើ។"
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "ត្រូវការសមាជិកភាព"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "ប្រសិនជាចុចជ្រើសរើសយកជំរើសនេះ នោះ មានតែសមាជិកទេដែលអាចមើលទំព័រនេះបាន​។"
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "ទំព័ថ្មី"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "ទំព័ថ្មី"
+
+#: contrib/auth/views.py:39
+msgid "Logged out"
+msgstr "ចាកចេញ"
+
+#: contrib/auth/models.py:38
+#: contrib/auth/models.py:57
+msgid "name"
+msgstr "ឈ្មោះ"
+
+#: contrib/auth/models.py:40
+msgid "codename"
+msgstr "ឈ្មោះលេខកូត"
+
+#: contrib/auth/models.py:42
+msgid "permission"
+msgstr "អនុញ្ញាត"
+
+#: contrib/auth/models.py:43
+#: contrib/auth/models.py:58
+msgid "permissions"
+msgstr "អនុញ្ញាត"
+
+#: contrib/auth/models.py:60
+msgid "group"
+msgstr "ក្រុម"
+
+#: contrib/auth/models.py:61
+#: contrib/auth/models.py:100
+msgid "groups"
+msgstr "ក្រុម"
+
+#: contrib/auth/models.py:90
+msgid "username"
+msgstr "ឈ្មោះជាសមាជិក"
+
+#: contrib/auth/models.py:90
+msgid "Required. 30 characters or fewer. Alphanumeric characters only (letters, digits and underscores)."
+msgstr "ត្រូចវបំពេញអក្សរឡាតាំងចំនួន៣០ ឬ តិចជាងនេះ (អក្សរ លេខ ឬ សញ្ញា _)។"
+
+#: contrib/auth/models.py:91
+msgid "First name"
+msgstr "នាម"
+
+#: contrib/auth/models.py:92
+msgid "Last name"
+msgstr "គោត្តនាម"
+
+msgid "first name"
+msgstr "នាម"
+
+#: contrib/auth/models.py:92
+msgid "last name"
+msgstr "គោត្តនាម"
+
+#: contrib/auth/models.py:93
+msgid "e-mail address"
+msgstr "អ៊ីមែល"
+
+#: contrib/auth/models.py:94
+msgid "password"
+msgstr "ពាក្យសំងាត់"
+
+#: contrib/auth/models.py:94
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr "ប្រើ '[algo]$[salt]$[hexdigest]'"
+
+#: contrib/auth/models.py:95
+msgid "staff status"
+msgstr "ស្ថានភាពបុគ្គលិក"
+
+#: contrib/auth/models.py:95
+msgid "Designates whether the user can log into this admin site."
+msgstr "កំណត់អោយសមាជិកអាចចូលមកប្រើប្រាស់ទំព័រគ្រប់គ្រងនេះ។"
+
+#: contrib/auth/models.py:96
+msgid "active"
+msgstr "សកម្ម"
+
+#: contrib/auth/models.py:96
+msgid "Designates whether this user can log into the Django admin. Unselect this instead of deleting accounts."
+msgstr "កំណត់ថាតើសមាជិកអាច​ពិនិត្យចូលមកប្រើទំព័រគ្រប់គ្រង។ មិនជ្រើសរើស ជាជាងលប់ចោល។"
+
+#: contrib/auth/models.py:97
+msgid "superuser status"
+msgstr "ស្ថានភាពអ្នកគ្រងគ្រង"
+
+#: contrib/auth/models.py:97
+msgid "Designates that this user has all permissions without explicitly assigning them."
+msgstr "កំណត់អោយសមាជិកនេះមានសិទ្ធិទាំងអស់។"
+
+#: contrib/auth/models.py:98
+msgid "last login"
+msgstr "ការពិនិត្យចូលកន្លងមក"
+
+#: contrib/auth/models.py:99
+msgid "date joined"
+msgstr "កាលបរិច្ឆេទចូលរួម"
+
+#: contrib/auth/models.py:101
+msgid "In addition to the permissions manually assigned, this user will also get all permissions granted to each group he/she is in."
+msgstr "បន្ថែមចំពោះសិទ្ធិដែលគេបាន​ផ្តល់​អោយ សមាជិកនេះអាចទទួលបានសិទ្ធិទាំងអស់​ដែលកំណត់​សំរាប់​ក្រុម​ ដែលសមាជិកនេះស្ថិតនៅ។"
+
+#: contrib/auth/models.py:102
+msgid "user permissions"
+msgstr "ការអនុញ្ញាតអោយសមាជិក"
+
+#: contrib/auth/models.py:105
+msgid "user"
+msgstr "សមាជិក"
+
+#: contrib/auth/models.py:106
+msgid "users"
+msgstr "សមាជិក"
+
+#: contrib/auth/models.py:111
+msgid "Personal info"
+msgstr "ព័ត៌មានផ្ទាល់ខ្លួន"
+
+#: contrib/auth/models.py:112
+msgid "Permissions"
+msgstr "ការអនុញ្ញាត"
+
+#: contrib/auth/models.py:113
+msgid "Important dates"
+msgstr "កាលបរិច្ឆេទសំខាន់"
+
+#: contrib/auth/models.py:114
+msgid "Groups"
+msgstr "ក្រុម"
+
+#: contrib/auth/models.py:256
+msgid "message"
+msgstr "អត្ថបទ"
+
+#: contrib/auth/forms.py:52
+msgid "Your Web browser doesn't appear to have cookies enabled. Cookies are required for logging in."
+msgstr "កម្មវិធីសំរាប់មើលគេហទំព័រនេះហាក់បីដូចជាមិនទាន់បានទទួលយកគុគី ។ ចាំបាច់ត្រូវកំណត់អោយ​កម្មវិធីសំរាប់មើលគេហទំព័រទទួល​យក គុគី ដើម្បីពិនិត្យចូល ។"
+
+#: contrib/auth/forms.py:61
+msgid "This account is inactive."
+msgstr "ឈ្មោះសមាជិកនេះ​លែងដំណើរការ"
+
+#: contrib/contenttypes/models.py:20
+msgid "python model class name"
+msgstr "ឈ្មោះ python model class"
+
+#: contrib/contenttypes/models.py:23
+msgid "content type"
+msgstr "ប្រភេទអត្ថន័យ"
+
+#: contrib/contenttypes/models.py:24
+msgid "content types"
+msgstr "ប្រភេទអត្ថន័យ"
+
+#: contrib/sessions/models.py:51
+msgid "session key"
+msgstr "លេខសំគាល់​រយះពេល​ពិនិត្យ​ចូល"
+
+#: contrib/sessions/models.py:52
+msgid "session data"
+msgstr "ទិន្នន័យរយះពេល​ពិនិត្យ​ចូល"
+
+#: contrib/sessions/models.py:53
+msgid "expire date"
+msgstr "ហួសពេលកំណត់"
+
+#: contrib/sessions/models.py:57
+msgid "session"
+msgstr "រយះពេល​ពិនិត្យ​ចូល"
+
+#: contrib/sessions/models.py:58
+msgid "sessions"
+msgstr "រយះពេល​ពិនិត្យ​ចូល"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "ឈ្មោះដមែន"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "ឈ្មោះសំរាប់បង្ហាញ"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "គេហទំព័រ"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "គេហទំព័រ"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "ច័ន្ទ"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "អង្គារ"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "ពុធ"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "ព្រហស្បតិ៍"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "សុក្រ"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "សៅរ៍"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "អាទិត្យ"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "មករា"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "កុម្ភៈ"
+
+#: utils/dates.py:14
+#: utils/dates.py:27
+msgid "March"
+msgstr "មិនា"
+
+#: utils/dates.py:14
+#: utils/dates.py:27
+msgid "April"
+msgstr "មេសា"
+
+#: utils/dates.py:14
+#: utils/dates.py:27
+msgid "May"
+msgstr "ឧសភា"
+
+#: utils/dates.py:14
+#: utils/dates.py:27
+msgid "June"
+msgstr "មិថុនា"
+
+#: utils/dates.py:15
+#: utils/dates.py:27
+msgid "July"
+msgstr "កក្កដា"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "សីហា"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "កញ្ញា"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "តុលា"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "វិច្ឆិកា"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "ធ្នូ"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr "មករា"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "កុម្ភះ"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "មិនា"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "មេសា"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "ឧសភា"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "មិថុនា"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "កក្កដា"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "សីហា"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "កញ្ញា"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "តុលា"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "វិច្ឆិកា"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "ធ្នូ"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "មករា"
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "កុម្ភះ"
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "សីហា"
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "កញ្ញា"
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "តុលា"
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "វិច្ឆិកា"
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "ធ្នូ"
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "ឆ្នាំ"
+msgstr[1] "ឆ្នាំ"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "ខែ"
+msgstr[1] "ខែ"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "សប្តាហ៍"
+msgstr[1] "សប្តាហ៍"
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "ថ្ងៃ"
+msgstr[1] "ថ្ងៃ"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "ម៉ោង"
+msgstr[1] "ម៉ោង"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "នាទី"
+msgstr[1] "នាទី"
+
+#: utils/translation/trans_real.py:362
+msgid "DATE_FORMAT"
+msgstr "ថ្ងៃទី j ​ខែ N ឆ្នាំ Y"
+
+#: utils/translation/trans_real.py:363
+msgid "DATETIME_FORMAT"
+msgstr "ថ្ងៃទី j ​ខែ N ឆ្នាំ Y ម៉ោង P"
+
+#: utils/translation/trans_real.py:364
+msgid "TIME_FORMAT"
+msgstr "ម៉ោង P"
+
+#: utils/translation/trans_real.py:380
+msgid "YEAR_MONTH_FORMAT"
+msgstr "ខែ F ឆ្នាំ Y"
+
+#: utils/translation/trans_real.py:381
+msgid "MONTH_DAY_FORMAT"
+msgstr "ថ្ងៃទី​​ j ខែ F"
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "ភាសាអារ៉ាប់"
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "ភាសាបេឡារុស្ស"
+
+#: conf/global_settings.py:41
+msgid "Czech"
+msgstr "ភាសាឆេក"
+
+#: conf/global_settings.py:42
+msgid "Welsh"
+msgstr "ភាសាអ៊ុយក្រែន"
+
+#: conf/global_settings.py:43
+msgid "Danish"
+msgstr "ភាសាដាណឺម៉ាក"
+
+#: conf/global_settings.py:44
+msgid "German"
+msgstr "ភាសាអាល្លឺម៉ង់"
+
+#: conf/global_settings.py:45
+msgid "Greek"
+msgstr "ភាសាហ្កែលិគ"
+
+#: conf/global_settings.py:46
+msgid "English"
+msgstr "ភាសាអង់គ្លេស"
+
+#: conf/global_settings.py:47
+msgid "Spanish"
+msgstr "ភាសាអេស្ប៉ាញ"
+
+#: conf/global_settings.py:48
+msgid "Argentinean Spanish"
+msgstr "ភាសាអេស្ប៉ាញ"
+
+#: conf/global_settings.py:49
+msgid "Finnish"
+msgstr "ភាសាហ្វាំងឡង់"
+
+#: conf/global_settings.py:50
+msgid "French"
+msgstr "ភាសាបារាំង"
+
+#: conf/global_settings.py:51
+msgid "Galician"
+msgstr "ភាសាហ្កែលិគ"
+
+#: conf/global_settings.py:52
+msgid "Hungarian"
+msgstr "ភាសាហុងគ្រី"
+
+#: conf/global_settings.py:53
+msgid "Hebrew"
+msgstr "ភាសាហេប្រិ"
+
+#: conf/global_settings.py:54
+msgid "Icelandic"
+msgstr "ភាសាអ៉ីស្លង់"
+
+#: conf/global_settings.py:55
+msgid "Italian"
+msgstr "ភាសាអ៊ីតាលី"
+
+#: conf/global_settings.py:56
+msgid "Japanese"
+msgstr "ភាសាជប៉ុន"
+
+#: conf/global_settings.py:57
+msgid "Dutch"
+msgstr "ភាសាហ្វាំងឡង់"
+
+#: conf/global_settings.py:58
+msgid "Norwegian"
+msgstr "ភាសាន័រវែស"
+
+#: conf/global_settings.py:59
+msgid "Brazilian"
+msgstr "ភាសាប្រេស៊ីល"
+
+#: conf/global_settings.py:60
+msgid "Romanian"
+msgstr "ភាសារូម៉ានី"
+
+#: conf/global_settings.py:61
+msgid "Russian"
+msgstr "ភាសាรัរូស្ស៉ី"
+
+#: conf/global_settings.py:62
+msgid "Slovak"
+msgstr "ភាសាស្លូវ៉ាគី"
+
+#: conf/global_settings.py:63
+msgid "Slovenian"
+msgstr "ភាសាស្លូវ៉ានី"
+
+#: conf/global_settings.py:64
+msgid "Serbian"
+msgstr ""
+
+#: conf/global_settings.py:65
+msgid "Swedish"
+msgstr "ភាសាស៊ុយអែដ"
+
+#: conf/global_settings.py:66
+msgid "Tamil"
+msgstr "ភាសាតាមីល"
+
+#: conf/global_settings.py:67
+msgid "Turkish"
+msgstr "ភាសាទួរគី"
+
+#: conf/global_settings.py:68
+msgid "Ukrainian"
+msgstr "ភាសាអ៊ុយក្រែន"
+
+#: conf/global_settings.py:69
+msgid "Simplified Chinese"
+msgstr "ភាសាចិនសាមញ្ញ"
+
+#: conf/global_settings.py:70
+msgid "Traditional Chinese"
+msgstr "ភាសាចិនបុរាណ"
+
+#: core/validators.py:63
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "ត្រូវបំពេញតែអក្សរឡាតាំង ចំនួនលេខ និង សញ្ញា _"
+
+#: core/validators.py:67
+msgid "This value must contain only letters, numbers, underscores, dashes or slashes."
+msgstr "ត្រូវបំពេញតែអក្សរឡាតាំង ចំនួនលេខ និង សញ្ញា _ សញ្ញា - ឬ សញ្ញា / ។"
+
+#: core/validators.py:71
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "ត្រូវបំពេញតែអក្សរឡាតាំង ចំនួនលេខ និង សញ្ញា _ សញ្ញា - ។"
+
+#: core/validators.py:75
+msgid "Uppercase letters are not allowed here."
+msgstr "មិនអនុញ្ញាតអោយសរសេរអក្សរធំ។"
+
+#: core/validators.py:79
+msgid "Lowercase letters are not allowed here."
+msgstr "មិនអនុញ្ញាតអោយសរសេរអក្សរតូច។"
+
+#: core/validators.py:86
+msgid "Enter only digits separated by commas."
+msgstr "បំពេញតែលេខហើយផ្តាច់ចេញពីគ្នាដោយសញ្ញាក្បៀស។"
+
+#: core/validators.py:98
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "បំពេញអ៊ីម៉ែលហើយផ្តាច់ចេញពីគ្នាដោយសញ្ញាក្បៀស។"
+
+#: core/validators.py:102
+msgid "Please enter a valid IP address."
+msgstr "សូមបំពេញអាស័យដ្ឋាន IP។"
+
+#: core/validators.py:106
+msgid "Empty values are not allowed here."
+msgstr "មិនអនុញ្ញាតអោយមានចំនួនទទេ។"
+
+#: core/validators.py:110
+msgid "Non-numeric characters aren't allowed here."
+msgstr "មិនអនុញ្ញាតអោយសរសេរអក្សរដែលមិនមែនជាលេខ។"
+
+#: core/validators.py:114
+msgid "This value can't be comprised solely of digits."
+msgstr "មិនអាចអនុញ្ញាតអោយមានតែចំនួនលេខ។"
+
+#: core/validators.py:119
+msgid "Enter a whole number."
+msgstr "បំពេញចំនួនទាំងអស់។"
+
+#: core/validators.py:123
+msgid "Only alphabetical characters are allowed here."
+msgstr "អនុញ្ញាតអោយសរសេរតែអក្សរឡាតាំង។"
+
+#: core/validators.py:138
+msgid "Year must be 1900 or later."
+msgstr "ត្រូវបំពេញឆ្នាំចាប់ពី ១៩០០។"
+
+#: core/validators.py:142
+#, python-format
+msgid "Invalid date: %s."
+msgstr "កាលបរិច្ឆេទមិនត្រឹមត្រូវ : %s។"
+
+#: core/validators.py:146
+#: db/models/fields/__init__.py:415
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "សូមបំពេញកាលបរិច្ឆេទក្នុងទំរង់ជា YYYY-MM-DD ។"
+
+#: core/validators.py:151
+msgid "Enter a valid time in HH:MM format."
+msgstr "សូមបំពេញពេលវេលាក្នុងទំរង់ជា HH:MM ។"
+
+#: core/validators.py:155
+#: db/models/fields/__init__.py:477
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "សូមបំពេញកាលបរិច្ឆេទក្នុងទំរង់ជា YYYY-MM-DD HH:MM ។"
+
+#: core/validators.py:160
+msgid "Enter a valid e-mail address."
+msgstr "សូមបំពេញអ៊ីមែល"
+
+#: core/validators.py:172
+#: core/validators.py:401
+#: forms/__init__.py:661
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "មិនមានឯកសារត្រូវបានជ្រើសរើស។ សូមពិនិត្យប្រភេទឯកសារម្តងទៀត។"
+
+#: core/validators.py:176
+msgid "Upload a valid image. The file you uploaded was either not an image or a corrupted image."
+msgstr "រូបភាពដែលទាញយកមិនត្រឹមត្រូវ ប្រហែលជាមិនមែនជារូបភាព ឬក៏ជា រូបភាពខូច។"
+
+#: core/validators.py:183
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "URL រូបភាព %s មិនត្រឹមត្រូវ ។"
+
+#: core/validators.py:187
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "លេខទូរស័ព្ទត្រូវតែក្នុងទំរង់ជា XXX-XXX-XXXX ។ \"%s\" គឺមិនត្រឹមត្រូវទេ។"
+
+#: core/validators.py:195
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "URL ទៅកាន់វីដេអូ QuickTime %s មិនត្រឹមត្រូវ ។"
+
+#: core/validators.py:199
+msgid "A valid URL is required."
+msgstr "URL មិនត្រឹមត្រូវ។"
+
+#: core/validators.py:213
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"ចាំបាច់ HTML ដែលត្រឹមត្រូវ។ ខាងក្រោម​គឺ​ជាកំហុស​:\n"
+"%s"
+
+#: core/validators.py:220
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "XML មិនត្រឹមត្រូវ​: %s"
+
+#: core/validators.py:230
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "URL ដែលមិនត្រឹមត្រូវ: %s"
+
+#: core/validators.py:234
+#: core/validators.py:236
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "URL​ខូច: %s"
+
+#: core/validators.py:242
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "សូមបំពេញអក្សរកាត់រដ្ឋរបស់សហរដ្ឋអាមេរិកអោយបានត្រឹមត្រូវ។"
+
+#: core/validators.py:256
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "ពាក្យ %s មិនអនុញ្ញាតអោយប្រើនៅទីនេះទេ។"
+msgstr[1] "ពាក្យ %s មិនអនុញ្ញាតអោយប្រើនៅទីនេះទេ។"
+
+#: core/validators.py:263
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "ទិន្នន័យនៅកន្លែងនេះត្រូវតែដូច '%s'  ។"
+
+#: core/validators.py:282
+msgid "Please enter something for at least one field."
+msgstr "សូមបំពេញទិន្នន័យយ៉ាងតិចនៅមួយ​កន្លែង។"
+
+#: core/validators.py:291
+#: core/validators.py:302
+msgid "Please enter both fields or leave them both empty."
+msgstr "អាចបំពេញ ឬ មិនបំពេញ ទិន្នន័យនៅកន្លែងទាំងពីរនេះ។"
+
+#: core/validators.py:309
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "ទិន្នន័យកន្លែងនេះត្រូវបំពេញ​ប្រសិន​បើ %(field)s មានតំលៃ %(value)s"
+
+#: core/validators.py:321
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "ទិន្នន័យកន្លែងនេះត្រូវបំពេញ​ប្រសិន​បើ %(field)s មិនមានតំលៃ %(value)s"
+
+#: core/validators.py:340
+msgid "Duplicate values are not allowed."
+msgstr "មិនអនុញ្ញាតអោយមានតំលៃដូចគ្នា។"
+
+#: core/validators.py:363
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "ចំនួនត្រូវតែជាស្វ័យគុណរបស់ %s។"
+
+#: core/validators.py:374
+msgid "Please enter a valid decimal number."
+msgstr "សូមបំពេញចំនួនទសភាគអោយបានត្រឹមត្រូវ។"
+
+#: core/validators.py:378
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural "Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "សូមបំពេញចំនួនទសភាគយ៉ាងតិច  %sខ្ទង់។"
+msgstr[1] "សូមបំពេញចំនួនទសភាគយ៉ាងតិច  %sខ្ទង់។"
+
+#: core/validators.py:381
+#, python-format
+msgid "Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural "Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] "សូមបំពេញចំនួនទសភាគទាំងអស់  %sខ្ទង់។"
+msgstr[1] "សូមបំពេញចំនួនទសភាគទាំងអស់  %sខ្ទង់។"
+
+#: core/validators.py:384
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural "Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "សូមបំពេញចំនួនទសភាគយ៉ាងច្រើន  %sខ្ទង់។"
+msgstr[1] "សូមបំពេញចំនួនទសភាគយ៉ាងច្រើន  %sខ្ទង់។"
+
+#: core/validators.py:394
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "ឯកសារដែលទាញយកត្រូវមានទំហំយ៉ាងតិច %s បៃ។"
+
+#: core/validators.py:395
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "ឯកសារដែលទាញយកត្រូវមានទំហំអតិបរិមា %s បៃ។"
+
+#: core/validators.py:412
+msgid "The format for this field is wrong."
+msgstr "ទំរង់ទិន្នន័យនៅកន្លែងនេះមិនត្រឹមត្រូវ។"
+
+#: core/validators.py:427
+msgid "This field is invalid."
+msgstr "ទិន្នន័យកន្លែងនេះមិនត្រឹមត្រូវ។"
+
+#: core/validators.py:463
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "មិនអាចទាញយកពី  %s។"
+
+#: core/validators.py:466
+#, python-format
+msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "ទទួលចំលើយ ​Content-Type header '%(contenttype)s' មិនត្រឹមត្រូវពី URL %(url)s ។"
+
+#: core/validators.py:499
+#, python-format
+msgid "Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with \"%(start)s\".)"
+msgstr "សូមបិទ ថាក់(tag) ដែលមិនទាន់បិទ %(tag)s នៅបន្ទាត់ %(line)s ។ (បន្ទាត់ដែលចាប់ផ្តើមជាមួយ \"%(start)s\".)"
+
+#: core/validators.py:503
+#, python-format
+msgid "Some text starting on line %(line)s is not allowed in that context. (Line starts with \"%(start)s\".)"
+msgstr "ពាក្យមួយចំនួននៅបន្ទាត់ %(line)s មិនអនុញ្ញាតអោយប្រើទេ។ (បន្ទាត់ចាប់ផ្តើមជាមួយ \"%(start)s\"។)"
+
+#: core/validators.py:508
+#, python-format
+msgid "\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%(start)s\".)"
+msgstr "\"%(attr)s\" on line %(line)s គឺជាគុណលក្ខណៈ(attribute) មិនត្រឹមត្រូវ។ (បន្ទាត់ចាប់ផ្តើមជាមួយ \"%(start)s\".)"
+
+#: core/validators.py:513
+#, python-format
+msgid "\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%(start)s\".)"
+msgstr "\"<%(tag)s>\" ថាក់(tag)នៅបន្ទាត់ %(line)s គឺមិនត្រឹមត្រូវ។ (បន្ទាត់ចាប់ផ្តើមជាមួយ \"%(start)s\".)"
+
+#: core/validators.py:517
+#, python-format
+msgid "A tag on line %(line)s is missing one or more required attributes. (Line starts with \"%(start)s\".)"
+msgstr "ថាក់ (tag)​នៅបន្ទាត់ %(line)s បាត់គុណលក្ខណៈ មួយ ឬ ច្រើន។(បន្ទាត់ចាប់ផ្តើមជាមួយ \"%(start)s\".)"
+
+#: core/validators.py:522
+#, python-format
+msgid "The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line starts with \"%(start)s\".)"
+msgstr "គុណលក្ខណៈ \"%(attr)s\" នៅបន្ទាត់ %(line)s ពុំមានតំលៃត្រឹមត្រូវទេ។ (បន្ទាត់ចាប់ផ្តើមជាមួយ \"%(start)s\".)"
+
+#: views/generic/create_update.py:43
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "The %(verbose_name)s បានផ្លាស់ប្តូរដោយជោគជ័យ។"
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "The %(verbose_name)s​ បានលប់។ "
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(object)s ជាមួយនឹងប្រភេទ %(type)s នេះមានម្តងរួចហើយនៅជាមួយ %(field)s"
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s ជាមួយឈ្មោះ %(fieldname)s នេះមានរួចរាល់ហើយ។"
+
+#: db/models/fields/__init__.py:114
+#: db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:551
+#: db/models/fields/__init__.py:562
+#: forms/__init__.py:346
+msgid "This field is required."
+msgstr "ចាំបាច់បំពេញទិន្នន័យកន្លែងនេះ។"
+
+#: db/models/fields/__init__.py:340
+msgid "This value must be an integer."
+msgstr "តំលៃនេះត្រូវតែជាចំនួនលេខ។"
+
+#: db/models/fields/__init__.py:372
+msgid "This value must be either True or False."
+msgstr "តំលៃអាចជា True ឬ False។"
+
+#: db/models/fields/__init__.py:388
+msgid "This field cannot be null."
+msgstr "ចាំបាច់បំពេញទិន្នន័យកន្លែងនេះ។"
+
+#: db/models/fields/__init__.py:571
+msgid "Enter a valid filename."
+msgstr "សូមបំពេញឈ្មោះឯកសារអោយបានត្រឹមត្រូវ។"
+
+#: db/models/fields/related.py:51
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "សូមបំពេញ  %s អោយបានត្រឹមត្រូវ។"
+
+#: db/models/fields/related.py:618
+msgid "Separate multiple IDs with commas."
+msgstr "ផ្តាច់លេច ID ចេញពីគ្នាដោយក្បៀស។"
+
+#: db/models/fields/related.py:620
+msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "សូមចុចប៉ូតុន \"Control\", ឬ \"Command\" ចំពោះកុំព្យូទ័រ Mac, ដើម្បីជ្រើសរើសច្រើនជាងមួយ។"
+
+#: db/models/fields/related.py:664
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural "Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "សូមបំពេញលេខ %(self)s អោយបានត្រឹមត្រូវ។ តំលៃ %(value)r នេះមិនត្រឹមត្រូវទេ។"
+msgstr[1] "សូមបំពេញលេខ %(self)s អោយបានត្រឹមត្រូវ។ តំលៃ %(value)r នេះមិនត្រឹមត្រូវទេ។"
+
+#: forms/__init__.py:381
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "អត្ថបទរបស់អ្នកតិចជាង %s អក្សរ។"
+msgstr[1] ""
+
+msgid "Ensure this value has at most %d characters."
+msgstr "អត្ថបទរបស់អ្នកត្រូវតិចជាង %d អក្សរ។"
+
+#: newforms/fields.py:105
+#: newforms/fields.py:258
+#, python-format
+msgid "Ensure this value has at least %d characters."
+msgstr "អត្ថបទរបស់អ្នកត្រូវច្រើនជាង  %d អក្សរ។"
+
+#: forms/__init__.py:386
+msgid "Line breaks are not allowed here."
+msgstr "បន្ទាត់មិនអនុញ្ញាតនៅទីនេះទេ។"
+
+#: forms/__init__.py:487
+#: forms/__init__.py:560
+#: forms/__init__.py:599
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "សូមជ្រើសរើស ; '%(data)s' មិនមាននៅក្នុង %(choices)s"
+
+#: forms/__init__.py:663
+msgid "The submitted file is empty."
+msgstr "ពុំមានឯកសារ។​"
+
+#: forms/__init__.py:719
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "សូម​បំពេញ​លេខចន្លោះ​ពី​ -៣២.៧៦៧ និង ៣២.៧៦៧"
+
+#: forms/__init__.py:729
+msgid "Enter a positive number."
+msgstr "សូមបំពេញចំនួន​វិជ្ជមាន"
+
+#: forms/__init__.py:739
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "សូម​បំពេញ​លេខចន្លោះ​ពី​ ០ និង ៣២.៧៦៧"
+
+#: template/defaultfilters.py:401
+msgid "yes,no,maybe"
+msgstr "យល់ព្រម មិនយល់ព្រម​ ប្រហែល"
+
+msgid "Your username and password didn't match. Please try again."
+msgstr "ឈ្មោះជាសមាជិក និង ពាក្យ​សំងាត់​មិន​ត្រឹមត្រូវ។"
+
+msgid "That e-mail address doesn't have an associated user account. Are you sure you've registered?"
+msgstr "អ៊ីមែល នេះ មិនមាន​នៅក្នុង​ទិន្នន័យ​របស់​យើង​ខ្ញុំ​ទេ។"
+
+msgid "5-30 alphanumeric characters or underscores."
+msgstr "ត្រូវបំពេញអក្សរឡាតាំង (អក្សរ លេខ ឬ សញ្ញា _) ចំនួនពី​៥​ ទៅ ៣០។"
+
+msgid "Must be 5-30 alphanumeric characters or underscores."
+msgstr "ត្រូចវបំពេញអក្សរឡាតាំង (អក្សរ លេខ ឬ សញ្ញា _) ចំនួនពី​៥​ ទៅ ៣០។"
+
+msgid "Confirm password"
+msgstr "បំពេញពាក្យសំងាត់ម្តងទៀត"
+
+msgid "Please make sure your passwords match."
+msgstr "ពាក្យសំងាត់មិនដូចគ្នា។"
+
+msgid "The username \"%s\" is already taken."
+msgstr "ឈ្មោះជាសមាជិក  \"%s\" ត្រូវបានគេយករួចហើយ។ សូមជ្រើសរើសឈ្មោះជាសមាជិកផ្សេងទៀត។"
+
+msgid "The email \"%s\" existed."
+msgstr "អ៊ីមែល  \"%s\" មានរួចហើយ។ សូមជ្រើសរើសអ៊ីមែលផ្សេងទៀត។"
+
+msgid "Audio"
+msgstr "ចំរៀង"
+
+msgid "Video id"
+msgstr "លេខ វីដេអូ"
+
+msgid "Video title"
+msgstr "ចំណងជើើង  វីដេអូ"
+
+msgid "Video length"
+msgstr "ទំហំ  វីដេអូ"
+
+msgid "Outside url"
+msgstr "គេហទំព័រ​ពីក្រៅ"
+
+msgid "Receive name"
+msgstr "ឈ្មោះ​អ្នក​ទទួល"
+
+msgid "Receive email"
+msgstr "អ៊ីមែល​របស់​​អ្នក​ទទួល"
+
+msgid "Message"
+msgstr "អត្ថបទ"
+
+msgid "Sending date"
+msgstr "បញ្ជូន​នៅ​ថ្ងៃ"
+
+msgid "Received date"
+msgstr "​ថ្ងៃ​ទទួល"
+
+msgid "Send as private message"
+msgstr "ជាអត្ថបទ​ផ្ទាល់​ខ្លួន​"
+
+msgid "Sent"
+msgstr "បានបញ្ជូន​"
+
+msgid "Question"
+msgstr "សំណួរ"
+
+msgid "Answer"
+msgstr "ចំលើយ​"
+
+msgid "Tags"
+msgstr "ប្រភេទ​"
+
+msgid "Business"
+msgstr "ពាណិជ្ជកម្ម"
+
+msgid "Beauty & Style"
+msgstr "សោភ័ណភាព និង ម៉ូត​"
+
+msgid "Education"
+msgstr "ការអប់រំ​"
+
+msgid "Environment"
+msgstr "បរិដ្ឋាន"
+
+msgid "Family & Relationships"
+msgstr "គ្រួសារ និង សេចក្តីស្នេហា"
+
+msgid "Food & Drink"
+msgstr "ម្ហូប និង ភេសជ្ជៈ"
+
+msgid "General"
+msgstr "ផ្សេងៗ"
+
+msgid "Games & Recreation"
+msgstr "កំសាន្ត និង ហ្គេម"
+
+msgid "Health"
+msgstr "សុខភាព"
+
+msgid "Pets"
+msgstr "សត្វ ចិញ្ជឹម"
+
+msgid "Politics & Government"
+msgstr "រដ្ឋាភិបាល និង នយោបាយ"
+
+msgid "Sports"
+msgstr "កីឡា"
+
+msgid "Technology"
+msgstr "បច្ចេកវិទ្សា"
+
+msgid "Travel"
+msgstr "ដំណើរកំសាន្ត"
+
+msgid "Source"
+msgstr "ដកស្រង់ចេញ"
+
+msgid "Left column"
+msgstr "ជួរទីមួយ"
+
+msgid "Right column"
+msgstr "ជួរទីពីរ"
+
+msgid "Start date"
+msgstr "ចាប់ផ្តើមនៅ"
+
+msgid "End date"
+msgstr "បញ្ជប់នៅ"
+
diff --git a/webapp/django/conf/locale/km/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/km/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..613f548
--- /dev/null
+++ b/webapp/django/conf/locale/km/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/km/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/km/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..6084219
--- /dev/null
+++ b/webapp/django/conf/locale/km/LC_MESSAGES/djangojs.po
@@ -0,0 +1,108 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: sengtha@e-khmer.com\n"
+"POT-Creation-Date: 2007-01-15 15:43+0200\n"
+"PO-Revision-Date: 2007-01-21 01:25+0900\n"
+"Last-Translator: Chay Sengtha <sengtha@e-khmer.com>\n"
+"Language-Team: Chay Sengtha <sengtha@e-khmer.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "%s ដែលអាច​ជ្រើសរើសបាន"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "ជ្រើសរើសទាំងអស់"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "បន្ថែម"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "លប់ចេញ"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "%s ដែលបានជ្រើសរើស"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "សូមជ្រើសរើសយក"
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "លប់ចេញទាំងអស់"
+
+#: contrib/admin/media/js/dateparse.js:26
+#: contrib/admin/media/js/calendar.js:24
+msgid "January February March April May June July August September October November December"
+msgstr "January February March April May June July August September October November December"
+
+#: contrib/admin/media/js/dateparse.js:27
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "S M T W T F S"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "ឥឡូវនេះ"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "នាឡិការ"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "ជ្រើសរើសម៉ោង"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "អធ្រាត្រ"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "ម៉ោង ៦ ព្រឹក"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "ពេលថ្ងែត្រង់"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "លប់ចោល"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "ថ្ងៃនេះ"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "ប្រក្រតិទិន"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "ម្សិលមិញ"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "ថ្ងៃស្អែក"
+
diff --git a/webapp/django/conf/locale/kn/LC_MESSAGES/django.mo b/webapp/django/conf/locale/kn/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..8c9fe23
--- /dev/null
+++ b/webapp/django/conf/locale/kn/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/kn/LC_MESSAGES/django.po b/webapp/django/conf/locale/kn/LC_MESSAGES/django.po
new file mode 100644
index 0000000..37c632c
--- /dev/null
+++ b/webapp/django/conf/locale/kn/LC_MESSAGES/django.po
@@ -0,0 +1,2536 @@
+# Kannada translation of Django.
+# Copyright (C) 2007 Translation Team <translation@sampada.info>
+# This file is distributed under the same license as the Django package.
+# Kannada Localization Team <translation@sampada.info>, 2007.
+# 
+# 
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-09-25 15:43+0200\n"
+"PO-Revision-Date: 2007-01-08 20:22+0530\n"
+"Last-Translator: Kannada Localization Team <translation@sampada.info>\n"
+"Language-Team: Kannada <translation@sampada.info>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "ವಸ್ತುವಿನ ಐಡಿ"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "ತಲೆಬರಹ"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "ಟಿಪ್ಪಣಿ"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "ಕ್ರಮಾಂಕ ೧"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "ಕ್ರಮಾಂಕ  ೨"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "ಕ್ರಮಾಂಕ  ೩ "
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "ಕ್ರಮಾಂಕ ೪"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "ಕ್ರಮಾಂಕ ೫ "
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "ಕ್ರಮಾಂಕ ೬ "
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "ಕ್ರಮಾಂಕ ೭"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "ಕ್ರಮಾಂಕ ೮"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "ಕ್ರಮಬದ್ಧ ಕ್ರಮಾಂಕ"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "ಸಲ್ಲಿಸಿದ ದಿನಾಂಕ/ಸಮಯ"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "ಸಾರ್ವಜನಿಕವಾಗಿದೆ"
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:304
+msgid "IP address"
+msgstr "IP ವಿಳಾಸ"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "ತೆಗೆದು ಹಾಕಲಾಗಿದೆ"
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"ಟಿಪ್ಪಣಿ ಅನುಚಿತವಾಗಿ "
+"ಇದ್ದಲ್ಲಿ ಈ ಚೌಕದಲ್ಲಿ ಗುರುತು "
+"ಮಾಡಿ. ಅದರ ಬದಲಾಗಿ \"ಈ ಟಿಪ್ಪಣಿ "
+"ತೆಗೆದುಹಾಕಲಾಗಿದೆ\" ಎಂಬ "
+"ಸಂದೇಶವನ್ನು  ತೋರಿಸಲಾಗುವುದು."
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "ಟಿಪ್ಪಣಿಗಳು"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "ಒಳವಿಷಯ ವಸ್ತು"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"ಸಲ್ಲಿಸಿದವರು %(user)s ರವರು  %(date)s\n"
+"\n"
+"  ದಿನ/ಸಮಯಕ್ಕೆ %(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s  ಸಲ್ಲಿಸಿದ್ದು"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "ವ್ಯಕ್ತಿಯ ಹೆಸರು"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "IP ವಿಳಾಸ"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr ""
+"ಸಿಬ್ಬಂದಿಯಿಂದ ಅನುಮೋದನೆ "
+"ಪಡೆದಿದೆ"
+
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "ಉಚಿತ ಟಿಪ್ಪಣಿ"
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "ಉಚಿತ ಟಿಪ್ಪಣಿಗಳು"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "ಅಂಕ"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "ಅಂಕದ ದಿನಾಂಕ"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "ಕರ್ಮ ಅಂಕ"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "ಕರ್ಮ ಅಂಕಗಳು"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr " %(user)s ಇಂದ  %(score)d ಕ್ರಮಾಂಕ"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"ಈ ಟಿಪ್ಪಣಿಯನ್ನು %(user)s ರವರು "
+"ಪತಾಕೆಯಿಂದ ಗುರುತು "
+"ಮಾಡಿದ್ದಾರೆ:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "ಪತಾಕೆ ದಿನಾಂಕ"
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "ಬಳಕೆದಾರ ಪತಾಕೆ"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "ಬಳಕೆದಾರ ಪತಾಕೆಗಳು"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "%r ಇಂದ ಪತಾಕೆ"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "ತೆಗೆದುಹಾಕಿದ ದಿನಾಂಕ"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "ನಿಯಂತ್ರಕರು ಅಳಿಸಿದ್ದು"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "ನಿಯಂತ್ರಕರು ಅಳಿಸಿದ್ದು"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr " %r ಇಂದ ನಿಯಂತ್ರಕರ ಅಳಿಸುವಿಕೆ "
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr ""
+"ಅನಾಮಧೇಯ ಬಳಕೆದಾರರು ಮತ "
+"ಹಾಕುವಂತಿಲ್ಲ"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "ತಪ್ಪು ಟಿಪ್ಪಣಿ ಐಡಿ"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr ""
+"ತಮಗೇ ಮತ ಹಾಕಿಕೊಳ್ಳುವಂತಿಲ್ಲ."
+
+#: contrib/comments/views/comments.py:27
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr ""
+"ನೀವು  ಬೇರೆಯ ಕ್ರಮಾಂಕ "
+"ನೀಡಿರುವುದರಿಂದ ಈ ಕ್ರಮಾಂಕ "
+"ಅವಶ್ಯವಾಗಿದೆ."
+
+#: contrib/comments/views/comments.py:111
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"%(count)s ಕ್ಕಿಂತಲೂ ಕಡಿಮೆ "
+"ಟಿಪ್ಪಣಿಗಳನ್ನು ಬರೆದಿರುವ "
+"ಸದಸ್ಯರಿಂದ ಈ ಟಿಪ್ಪಣಿ "
+"ಬರೆಯಲ್ಪಟ್ಟಿದೆ:\n"
+"\n"
+"%(text)s"
+"%(count)sಕ್ಕಿಂತಲೂ ಕಡಿಮೆ "
+"ಟಿಪ್ಪಣಿಗಳನ್ನು ಬರೆದಿರುವ "
+"ಸದಸ್ಯರಿಂದ ಈ ಟಿಪ್ಪಣಿ "
+"ಬರೆಯಲ್ಪಟ್ಟಿದೆ:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:116
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"ಈ ಟಿಪ್ಪಣಿಯನ್ನು ಅಪೂರ್ಣ "
+"ಮಾಹಿತಿಯುಳ್ಳ ಬಳಕೆದಾರ :\n"
+"\n"
+" %(text)s ರು ಸಲ್ಲಿಸಿದ್ದಾರೆ"
+
+#: contrib/comments/views/comments.py:188
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr ""
+"ಸಲ್ಲಿಕೆಗಳಿಗೆ ಮಾತ್ರ "
+"ಅನುಮತಿಯಿದೆ"
+
+#: contrib/comments/views/comments.py:192
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr ""
+"ಒಂದು ಅಥವಾ ಹೆಚ್ಚು ಅಗತ್ಯ "
+"ಅಂಶಗಳನ್ನು ಸಲ್ಲಿಸಿಲ್ಲ"
+
+#: contrib/comments/views/comments.py:196
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr ""
+"ಯಾರೋ ಟಿಪ್ಪಣಿಯನ್ನು "
+"ಬದಲಾಯಿಸಿದ್ದಾರೆ( ಭದ್ರತೆಯ "
+"ಉಲ್ಲಂಘನೆ)"
+
+#: contrib/comments/views/comments.py:206
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"ಟಿಪ್ಪಣಿ ನಮೂನೆಗೆ ತಪ್ಪು "
+"ಟಾರ್ಗೆಟ್ ಪ್ಯಾರಾಮೀಟರ್ ಇದೆ. "
+"ವಸ್ತುವಿನ ಐಡಿಯು "
+"ದೋಷಪೂರಿತವಾಗಿತ್ತು."
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr ""
+"ಟಿಪ್ಪಣಿ ನಮೂನೆ "
+"'ಮುನ್ನೋಟ'ವನ್ನಾಗಲೀ "
+"'ಸಲ್ಲಿಕೆ'ಯನ್ನಾಗಲೀ "
+"ಒದಗಿಸಲಿಲ್ಲ."
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "ಬಳಕೆದಾರನ ಹೆಸರು:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr "ಹೊರಕ್ಕೆ ಹೋಗಿ"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "ಪ್ರವೇಶಪದ:"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr ""
+"ನಿಮ್ಮ ಪ್ರವೇಶಪದ ಮರೆತಿದ್ದೀರಾ?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "ಕ್ರಮಾಂಕಗಳು"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "ಅವಶ್ಯ"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "ಐಚ್ಛಿಕ"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "ಭಾವಚಿತ್ರ ಸಲ್ಲಿಸಿ"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "ಟಿಪ್ಪಣಿ:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "ಟಿಪ್ಪಣಿ ಮುನ್ನೋಟ"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "ನಿಮ್ಮ ಹೆಸರು:"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>%s ಇಂದ :</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169
+msgid "All"
+msgstr "ಎಲ್ಲಾ"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "ಯಾವುದೇ ದಿನಾಂಕ"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "ಈದಿನ"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "ಕಳೆದ ೭ ದಿನಗಳು"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "ಈ ತಿಂಗಳು"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "ಈ ವರ್ಷ"
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "ಹೌದು"
+
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "ಇಲ್ಲ"
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "ಗೊತ್ತಿಲ್ಲ(ದ/ದ್ದು)"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "ಕ್ರಮದ(ಕ್ರಿಯೆಯ) ಸಮಯ"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "ವಸ್ತುವಿನ ಐಡಿ"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "ವಸ್ತು ಪ್ರಾತಿನಿಧ್ಯ"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "ಕ್ರಮದ(ಕ್ರಿಯೆಯ) ಪತಾಕೆ"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr ""
+"ಬದಲಾವಣೆಯ ಸಂದೇಶ/ಸಂದೇಶ ಬದಲಿಸಿ"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "ಲಾಗ್ ದಾಖಲೆ"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "ಲಾಗ್ ದಾಖಲೆಗಳು"
+
+#: contrib/admin/templatetags/admin_list.py:230
+msgid "All dates"
+msgstr "ಎಲ್ಲಾ ದಿನಾಂಕಗಳು"
+
+#: contrib/admin/views/decorators.py:10 contrib/auth/forms.py:59
+msgid ""
+"Please enter a correct username and password. Note that both fields are "
+"case-sensitive."
+msgstr ""
+"ದಯವಿಟ್ಟು ಸರಿಯಾದ ಬಳಕೆದಾರ-ಪದ "
+"ಮತ್ತು  ಪ್ರವೇಶಪದ ಬರೆಯಿರಿ "
+".ಎರಡೂ ಇಂಗ್ಲೀಷಿನ  ಸಣ್ಣ ಮತ್ತು "
+"ದೊಡ್ಡ ಅಕ್ಷರ ಸಂವೇದಿ  "
+"ಎಂಬುದನ್ನು ಗಮನದಲ್ಲಿಡಿ"
+
+#: contrib/admin/views/decorators.py:24
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "ಒಳಗೆ ಬನ್ನಿ"
+
+#: contrib/admin/views/decorators.py:62
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"ದಯವಿಟ್ಟು ಇನ್ನೊಮ್ಮೆ ಒಳಬನ್ನಿ "
+"(ಲಾಗಿನ್ ಮಾಡಿ) . ನಿಮ್ಮ ಅಧಿವೇಶನ "
+"ಕೊನೆಗೊಂಡಿದೆ. "
+"ಚಿಂತಿಸಬೇಡಿ:ನಿಮ್ಮ "
+"ಸಲ್ಲಿಕೆಯನ್ನು ಉಳಿಸಲಾಗಿದೆ."
+
+#: contrib/admin/views/decorators.py:69
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"ಕುಕೀಗಳನ್ನು ಸ್ವೀಕರಿಸುವಂತೆ "
+"ನಿಮ್ಮ ಜಾಲವೀಕ್ಷಕವನ್ನು "
+"ಸಂರಚಿಸಲಾಗಿಲ್ಲ ಎಂದು "
+"ತೋರುತ್ತದೆ. ದಯವಿಟ್ಟು "
+"ಕುಕೀಗಳನ್ನು  ಸಕ್ರಿಯಗೊಳಿಸಿ , ಈ "
+"ಪುಟವನ್ನು ಮತ್ತೆ ಲೋಡ್ ಮಾಡಿ "
+"ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿರಿ. "
+
+#: contrib/admin/views/decorators.py:83
+msgid "Usernames cannot contain the '@' character."
+msgstr ""
+"ಬಳಕೆದಾರ-ಹೆಸರುಗಳು '@' "
+"ಅಕ್ಷರವನ್ನು ಒಳಗೊಳ್ಳುವಂತಿಲ್ಲ"
+
+#: contrib/admin/views/decorators.py:85
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr ""
+"ನಿಮ್ಮ ವಿ-ಅಂಚೆ ವಿಳಾಸವು ನಿಮ್ಮ "
+"ಬಳಕೆದಾರ-ಹೆಸರಲ್ಲ; ಬದಲಾಗಿ '%s'  "
+"ಪ್ರಯತ್ನಿಸಿ."
+
+#: contrib/admin/views/main.py:223
+msgid "Site administration"
+msgstr "ತಾಣ ನಿರ್ವಹಣೆ"
+
+#: contrib/admin/views/main.py:257 contrib/admin/views/auth.py:17
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr ""
+" %(name)s \"%(obj)s\" ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ "
+"ಸೇರಿಸಲಾಯಿತು."
+
+#: contrib/admin/views/main.py:261 contrib/admin/views/main.py:347
+#: contrib/admin/views/auth.py:22
+msgid "You may edit it again below."
+msgstr ""
+"ನೀವು ಅದನ್ನು ಕೆಳಗೆ ಮತ್ತೆ "
+"ಬದಲಾಯಿಸಬಹುದು."
+
+#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356
+#, python-format
+msgid "You may add another %s below."
+msgstr ""
+"ನೀವು ಕೆಳಗೆ ಇನ್ನೊಂದು %s "
+"ಸೇರಿಸಬಹುದು."
+
+#: contrib/admin/views/main.py:289
+#, python-format
+msgid "Add %s"
+msgstr "%s ಸೇರಿಸಿ"
+
+#: contrib/admin/views/main.py:335
+#, python-format
+msgid "Added %s."
+msgstr "%s ಸೇರಿಸಲಾಯಿತು."
+
+#: contrib/admin/views/main.py:335 contrib/admin/views/main.py:337
+#: contrib/admin/views/main.py:339
+msgid "and"
+msgstr "ಮತ್ತು"
+
+#: contrib/admin/views/main.py:337
+#, python-format
+msgid "Changed %s."
+msgstr "%s ಬದಲಾಯಿಸಲಾಯಿತು."
+
+#: contrib/admin/views/main.py:339
+#, python-format
+msgid "Deleted %s."
+msgstr "%s ತೆಗೆದುಹಾಕಲಾಯಿತು."
+
+#: contrib/admin/views/main.py:342
+msgid "No fields changed."
+msgstr "ಯಾವುದೇ ಅಂಶಗಳು ಬದಲಾಗಲಿಲ್ಲ."
+
+#: contrib/admin/views/main.py:345
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr ""
+"%(name)s \"%(obj)s\" ಸಫಲವಾಗಿ "
+"ಬದಲಾಯಿಸಲಾಯಿತು."
+
+#: contrib/admin/views/main.py:353
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s\" ಅನ್ನು  ಯಶಸ್ವಿಯಾಗಿ "
+"ಸೇರಿಸಲಾಯಿತು. ನೀವು ಕೆಳಗೆ "
+"ಅದನ್ನು ಮತ್ತೆ ಬದಲಾಯಿಸಬಹುದು."
+
+#: contrib/admin/views/main.py:391
+#, python-format
+msgid "Change %s"
+msgstr "%s ಅನ್ನು ಬದಲಿಸು"
+
+#: contrib/admin/views/main.py:473
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr ""
+"%(name)s ನಲ್ಲಿ ಒಂದು ಅಥವಾ ಹೆಚ್ಚು "
+"%(fieldname)s :%(obj)s"
+
+#: contrib/admin/views/main.py:478
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr ""
+"%(name)s ನಲ್ಲಿ ಒಂದು ಅಥವಾ ಹೆಚ್ಚು "
+"%(fieldname)s :"
+
+#: contrib/admin/views/main.py:511
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr ""
+"%(name)s \"%(obj)s\" ಯಶಸ್ವಿಯಾಗಿ "
+"ಅಳಿಸಲಾಯಿತು."
+
+#: contrib/admin/views/main.py:514
+msgid "Are you sure?"
+msgstr "ಖಚಿತಪಡಿಸುವಿರಾ? "
+
+#: contrib/admin/views/main.py:536
+#, python-format
+msgid "Change history: %s"
+msgstr "ಬದಲಾವಣೆಗಳ ಇತಿಹಾಸ: %s"
+
+#: contrib/admin/views/main.py:570
+#, python-format
+msgid "Select %s"
+msgstr "%s ಆಯ್ದುಕೊಳ್ಳಿ"
+
+#: contrib/admin/views/main.py:570
+#, python-format
+msgid "Select %s to change"
+msgstr "ಬದಲಾಯಿಸಲು %s ಆಯ್ದುಕೊಳ್ಳಿ"
+
+#: contrib/admin/views/main.py:758
+msgid "Database error"
+msgstr "ದತ್ತಸಂಚಯದ ದೋಷ"
+
+#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48
+#: contrib/admin/views/doc.py:50
+msgid "tag:"
+msgstr "ಟ್ಯಾಗ್:"
+
+#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79
+#: contrib/admin/views/doc.py:81
+msgid "filter:"
+msgstr "ಸೋಸಕ:"
+
+#: contrib/admin/views/doc.py:135 contrib/admin/views/doc.py:137
+#: contrib/admin/views/doc.py:139
+msgid "view:"
+msgstr "ನೋಟ:"
+
+#: contrib/admin/views/doc.py:164
+#, python-format
+msgid "App %r not found"
+msgstr "%r ಅನ್ವಯಾಂಶ ಸಿಗಲಿಲ್ಲ"
+
+#: contrib/admin/views/doc.py:171
+#, python-format
+msgid "Model %r not found in app %r"
+msgstr ""
+"%r ಅನ್ವಯಾಂಶದಲ್ಲಿ %r  ಮಾಡೆಲ್ಲು "
+"ಸಿಗಲಿಲ್ಲ"
+
+#: contrib/admin/views/doc.py:183
+#, python-format
+msgid "the related `%s.%s` object"
+msgstr "ಸಂಬಂಧಿಸಿದ `%s.%s` ವಸ್ತು"
+
+#: contrib/admin/views/doc.py:183 contrib/admin/views/doc.py:205
+#: contrib/admin/views/doc.py:219 contrib/admin/views/doc.py:224
+msgid "model:"
+msgstr "ಮಾಡೆಲ್:"
+
+#: contrib/admin/views/doc.py:214
+#, python-format
+msgid "related `%s.%s` objects"
+msgstr "ಸಂಬಂಧಿಸಿದ `%s.%s` ವಸ್ತುಗಳು"
+
+#: contrib/admin/views/doc.py:219
+#, python-format
+msgid "all %s"
+msgstr "ಎಲ್ಲಾ %s"
+
+#: contrib/admin/views/doc.py:224
+#, python-format
+msgid "number of %s"
+msgstr "%s ಗಳ ಸಂಖ್ಯೆ"
+
+#: contrib/admin/views/doc.py:229
+#, python-format
+msgid "Fields on %s objects"
+msgstr "%s ವಸ್ತುಗಳ ಅಂಶಗಳು"
+
+#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:301
+#: contrib/admin/views/doc.py:303 contrib/admin/views/doc.py:309
+#: contrib/admin/views/doc.py:310 contrib/admin/views/doc.py:312
+msgid "Integer"
+msgstr "ಸಂಖ್ಯೆ"
+
+#: contrib/admin/views/doc.py:292
+msgid "Boolean (Either True or False)"
+msgstr "ಬೂಲಿಯನ್( ನಿಜ ಅಥವಾ ಸುಳ್ಳು)"
+
+#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:311
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "(%(maxlength)s ವರೆಗಿನ  ) ಅಕ್ಷರಪುಂಜ"
+
+#: contrib/admin/views/doc.py:294
+msgid "Comma-separated integers"
+msgstr ""
+"ಅಲ್ಪವಿರಾಮ(,) ದಿಂದ ಬೇರ್ಪಟ್ಟ "
+"ಸಂಖ್ಯೆಗಳು"
+
+#: contrib/admin/views/doc.py:295
+msgid "Date (without time)"
+msgstr "ದಿನಾಂಕ (ಸಮಯರಹಿತ)"
+
+#: contrib/admin/views/doc.py:296
+msgid "Date (with time)"
+msgstr "ದಿನಾಂಕ(ಸಮಯದೊಂದಿಗೆ)"
+
+#: contrib/admin/views/doc.py:297
+msgid "E-mail address"
+msgstr "ವಿ-ಅಂಚೆ ವಿಳಾಸ"
+
+#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:299
+#: contrib/admin/views/doc.py:302
+msgid "File path"
+msgstr "ಕಡತದ ಸ್ಥಾನಪಥ"
+
+#: contrib/admin/views/doc.py:300
+msgid "Decimal number"
+msgstr "ದಶಮಾನ ಸಂಖ್ಯೆ"
+
+#: contrib/admin/views/doc.py:306
+msgid "Boolean (Either True, False or None)"
+msgstr ""
+"ಬೂಲಿಯನ್( ನಿಜ ಅಥವಾ ಸುಳ್ಳು "
+"ಅಥವಾ ಯಾವುದೂ ಅಲ್ಲ)"
+
+#: contrib/admin/views/doc.py:307
+msgid "Relation to parent model"
+msgstr ""
+"ಹಿರಿಯ ಮಾಡೆಲ್‍ನೊಂದಿಗಿನ ಸಂಬಂಧ"
+
+#: contrib/admin/views/doc.py:308
+msgid "Phone number"
+msgstr "ದೂರವಾಣಿ ಸಂಖ್ಯೆ"
+
+#: contrib/admin/views/doc.py:313
+msgid "Text"
+msgstr "ಪಠ್ಯ"
+
+#: contrib/admin/views/doc.py:314
+msgid "Time"
+msgstr "ಸಮಯ"
+
+#: contrib/admin/views/doc.py:315 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:316
+msgid "U.S. state (two uppercase letters)"
+msgstr ""
+"ಅಮೇರಿಕಾ ಸಂಯುಕ್ತ ಸಂಸ್ಥಾನದ "
+"ರಾಜ್ಯ ( ಎರಡು ಇಂಗ್ಲೀಷ್ "
+"ದೊಡ್ಡಕ್ಷರಗಳು)"
+
+#: contrib/admin/views/doc.py:317
+msgid "XML text"
+msgstr "XML ಪಠ್ಯ"
+
+#: contrib/admin/views/doc.py:343
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr ""
+"%s  URL ಸ್ವರೂಪದ್ದಾಗಿ ತೋರುವದಿಲ್ಲ."
+
+#: contrib/admin/views/auth.py:28
+msgid "Add user"
+msgstr "ಬಳಕೆದಾರನನ್ನು ಸೇರಿಸಿ"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "ವಿವರಮಾಹಿತಿ"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "ಪ್ರವೇಶಪದ ಬದಲಿಸಿ"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "ಪ್ರಾರಂಭಸ್ಥಳ(ಮನೆ)"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+msgid "History"
+msgstr "ಚರಿತ್ರೆ"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "ದಿನಾಂಕ/ಸಮಯ"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "ಬಳಕೆದಾರ"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "ಕ್ರಮ(ಕ್ರಿಯೆ)"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "N j, Y, P"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"ಈ ವಸ್ತುವಿಗೆ ಬದಲಾವಣೆಯ "
+"ಇತಿಹಾಸವಿಲ್ಲ. ಅದು ಬಹುಶಃ ಈ "
+"ಆಡಳಿತತಾಣದ ಮೂಲಕ "
+"ಸೇರಿಸಲ್ಪಟ್ಟಿಲ್ಲ."
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "ಜಾಂಗೋ ತಾಣದ ಆಡಳಿತಗಾರರು"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "ಜಾಂಗೋ ಆಡಳಿತ"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "ಸರ್ವರ್ ದೋಷ"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "ಸರ್ವರ್ ದೋಷ(೫೦೦)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "ಸರ್ವರ್ ದೋಷ<em>(೫೦೦)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via "
+"e-mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"ಇಲ್ಲಿ ಒಂದು ತಪ್ಪಾಗಿದೆ. ಅದನ್ನು "
+"ತಾಣದ ಆಡಳಿತಗಾರರಿಗೆ ವರದಿ "
+"ಮಾಡಲಾಗಿದ್ದು ಶೀಘ್ರದ್ದಲ್ಲಿ "
+"ಸರಿಪಡಿಸಲಾಗುವದು. ನಿಮ್ಮ "
+"ತಾಳ್ಮೆಗೆ ಧನ್ಯವಾದಗಳು."
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "ಪುಟ ಸಿಗಲಿಲ್ಲ"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr ""
+"ಕ್ಷಮಿಸಿ, ನೀವು ಕೇಳಿದ ಪುಟ "
+"ಸಿಗಲಿಲ್ಲ"
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr ""
+"%(name)s ಅನ್ವಯಾಂಶದಲ್ಲಿ "
+"ಮಾಡೆಲ್ಲುಗಳು ಲಭ್ಯ."
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "ಸೇರಿಸಿ"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "ಬದಲಿಸಿ/ಬದಲಾವಣೆ"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr ""
+"ಯಾವುದನ್ನೂ ತಿದ್ದಲು ನಿಮಗೆ "
+"ಅನುಮತಿ ಇಲ್ಲ ."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "ಇತ್ತೀಚಿನ ಕ್ರಮಗಳು"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "ನನ್ನ ಕ್ರಮಗಳು"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "ಯಾವುದೂ ಲಭ್ಯವಿಲ್ಲ"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s ಸೇರಿಸಿ"
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr ""
+"ನೀವು <a "
+"href=\"/password_reset/\">ಪ್ರವೇಶಪದವನ್ನು "
+"ಮರೆತಿದ್ದೀರಾ</a>?"
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "ಸುಸ್ವಾಗತ."
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "ಅಳಿಸಿಹಾಕಿ"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"'%(escaped_object)s'  %(object_name)s ಅನ್ನು "
+"ತೆಗೆದುಹಾಕುವುದರಿಂದ ಸಂಬಂಧಿತ "
+"ವಸ್ತುಗಳೂ ಕಳೆದುಹೋಗುತ್ತವೆ. "
+"ಆದರೆ ನಿಮ್ಮ ಖಾತೆಗೆ ಕೆಳಕಂಡ "
+"ಬಗೆಗಳ ವಸ್ತುಗಳನ್ನು "
+"ತೆಗೆದುಹಾಕಲು ಅನುಮತಿಯಿಲ್ಲ."
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+#,fuzzy
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"ದಿಟವಾಗಿಯೂ, ನೀವು %(object_name)s  "
+"\"%(escaped_object)ಗಳನ್ನು\"? "
+"ತೆಗೆದುಹಾಕಬಯಸಿದ್ದೀರಾ? "
+"ಸಂಬಂಧಪಟ್ಟ ಕೆಳಕಂಡ ಎಲ್ಲವನ್ನೂ "
+"ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "ಹೌದು,ನನಗೆ ಖಚಿತವಿದೆ"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "%(filter_title)s ಇಂದ"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "ಹೋಗಿ"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgstr "೧ ಫಲಿತಾಂಶ"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "ಒಟ್ಟು %(full_result_count)s"
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "ಎಲ್ಲವನ್ನೂ ತೋರಿಸು"
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "ಸೋಸಕ"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "ತಾಣದಲ್ಲಿ ನೋಡಿ"
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgstr ""
+"ದಯಮಾಡಿ ಕೆಳಗಿನ ತಪ್ಪನ್ನು "
+"ಸರಿಪಡಿಸಿ "
+"ದಯಮಾಡಿ ಕೆಳಗಿನ ತಪ್ಪುಗಳನ್ನು "
+"ಸರಿಪಡಿಸಿ. "
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr "ಅನುಕ್ರಮದಲ್ಲಿ ಜೋಡಣೆ"
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr "ಅನುಕ್ರಮ:"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "ಹೊಸದರಂತೆ ಉಳಿಸಿ"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr ""
+"ಉಳಿಸಿ ಮತ್ತು ಇನ್ನೊಂದನ್ನು "
+"ಸೇರಿಸಿ"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr ""
+"ಉಳಿಸಿ ಮತ್ತು ತಿದ್ದುವುದನ್ನು "
+"ಮುಂದುವರಿಸಿರಿ."
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "ಉಳಿಸಿ"
+
+#: contrib/admin/templates/admin/invalid_setup.html:8
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"ಡಾಟಾಬೇಸನ್ನು ಇನ್ಸ್ಟಾಲ್ "
+"ಮಾಡುವಾಗ ಏನೋ ತಪ್ಪಾಗಿದೆ. ಸೂಕ್ತ "
+" ಡಾಟಾಬೇಸ್ ಕೋಷ್ಟಕಗಳು "
+"ರಚನೆಯಾಗಿ ಅರ್ಹ ಬಳಕೆದಾರರು "
+"ಅವುಗಳನ್ನು ಓದಬಹುದಾಗಿದೆಯೇ "
+"ಎಂಬುದನ್ನು ಖಾತರಿ "
+"ಪಡಿಸಿಕೊಳ್ಳಿ."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"ಮೊದಲು ಬಳಕೆದಾರ-ಹೆಸರು ಮತ್ತು "
+"ಪ್ರವೇಶಪದವನ್ನು ಕೊಡಿರಿ. ನಂತರ, "
+"ನೀವು ಇನ್ನಷ್ಟು ಆಯ್ಕೆಗಳನ್ನು  "
+"ಬದಲಿಸಬಹುದಾಗಿದೆ."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "ಬಳಕೆದಾರ-ಹೆಸರು"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+msgid "Password"
+msgstr "ಪ್ರವೇಶಪದ"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+msgid "Password (again)"
+msgstr "ಪ್ರವೇಶಪದ(ಇನ್ನೊಮ್ಮೆ)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+msgid "Enter the same password as above, for verification."
+msgstr ""
+"ಖಚಿತಗೊಳಿಸಲು ಮೇಲಿನ "
+"ಪ್ರವೇಶಪದವನ್ನು ಇನ್ನೊಮ್ಮೆ "
+"ಬರೆಯಿರಿ."
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "ಪ್ರವೇಶಪದ ಬದಲಾವಣೆ"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "ಪ್ರವೇಶಪದ ಬದಲಾವಣೆ ಯಶಸ್ವಿ"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr ""
+"ನಿಮ್ಮ ಪ್ರವೇಶಪದ "
+"ಬದಲಾಯಿಸಲಾಗಿದೆ"
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "ಪ್ರವೇಶಪದವನ್ನು ಬದಲಿಸುವಿಕೆ"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"ಪ್ರವೇಶಪದವನ್ನು ಮರೆತಿದ್ದೀರಾ? "
+"ನಿಮ್ಮ ವಿ-ಅಂಚೆಯ ವಿಳಾಸವನ್ನು "
+"ಕೆಳಗೆ ಸೂಚಿಸಿರಿ, ನಾವು ನಿಮ್ಮ "
+"ಪ್ರವೇಶಪದವನ್ನು ಬದಲಾಯಿಸಿ "
+"ಅದನ್ನು ರವಾನಿಸುತ್ತೇವೆ."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "ವಿ-ಅಂಚೆ ವಿಳಾಸ:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr ""
+"ನನ್ನ ಪ್ರವೇಶಪದವನ್ನು ಮತ್ತೆ "
+"ನಿರ್ಧರಿಸಿ "
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr ""
+"ಈದಿನ ತಮ್ಮ ಅತ್ಯಮೂಲ್ಯವಾದ "
+"ಸಮಯವನ್ನು ನಮ್ಮ ತಾಣದಲ್ಲಿ "
+"ಕಳೆದುದಕ್ಕಾಗಿ ಧನ್ಯವಾದಗಳು."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "ಮತ್ತೆ ಒಳಬನ್ನಿ"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr ""
+"ಪ್ರವೇಶಪದದ ಮರುನಿರ್ಧಾರ "
+"ಸಾಧ್ಯವಾಗಿದೆ"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"ನಾವು ಹೊಸ ಪ್ರವೇಶಪದವನ್ನು "
+"ನಿಮ್ಮ ವಿ-ಅಂಚೆಗೆ ಕಳಿಸಿದ್ದೇವೆ. "
+"ಕೆಲವೇ ಕ್ಷಣಗಳಲ್ಲಿ ನೀವದನ್ನು "
+"ಪಡೆಯಲಿದ್ದೀರಿ."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"ಭದ್ರತೆಯ ದೃಷ್ಟಿಯಿಂದ "
+"ದಯವಿಟ್ಟು ನಿಮ್ಮ ಹಳೆಯ "
+"ಪ್ರವೇಶಪದವನ್ನು ಸೂಚಿಸಿರಿ. "
+"ಆನಂತರ ನೀವು ಸರಿಯಾಗಿ "
+"ಬರೆದಿದ್ದೀರೆಂದು ನಾವು "
+"ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು   ಹೊಸ "
+"ಪ್ರವೇಶಪದವನ್ನು ಎರಡು ಬಾರಿ "
+"ಬರೆಯಿರಿ."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "ಹಳೆಯ ಪ್ರವೇಶಪದ:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "ಹೊಸ ಪ್ರವೇಶಪದ:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "ಪ್ರವೇಶಪದವನ್ನು ಖಚಿತಪಡಿಸಿ:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "ನನ್ನ ಪ್ರವೇಶಪದ ಬದಲಿಸಿ"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr ""
+"ಪ್ರವೇಶಪದದ ಮರುನಿರ್ಧಾರವನ್ನು "
+"ನೀವು ಕೇಳಿದುದರಿಂದ ಈ "
+"ವಿ-ಅಂಚೆಯನ್ನು "
+"ಪಡೆಯುತ್ತಿದ್ದೀರಿ."
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr ""
+"%(site_name)s ತಾಣದಲ್ಲಿ ನಿಮ್ಮ "
+"ಬಳಕೆದಾರ-ಖಾತೆಗಾಗಿ"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "ನಿಮ್ಮ ಹೊಸ ಪ್ರವೇಶಪದ : %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr ""
+"ನಿಸ್ಸಂಕೋಚವಾಗಿ ಈ ಪುಟಕ್ಕೆ "
+"ಹೋಗಿ ಈ ಪ್ರವೇಶಪದವನ್ನು "
+"ಬದಲಿಸಿರಿ."
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr ""
+"ನೀವು ಮರೆತಿದ್ದಲ್ಲಿ , ನಿಮ್ಮ "
+"ಬಳಕೆದಾರ-ಹೆಸರು"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr ""
+"ನಮ್ಮ ತಾಣವನ್ನು "
+"ಬಳಸಿದ್ದಕ್ದಾಗಿ ಧನ್ಯವಾದಗಳು!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s ತಂಡ"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "ಚಿಕ್ಕ ಪುಟಗುರುತುಗಳು"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr ""
+"ಮಾಹಿತಿಯ ಚಿಕ್ಕ ಪುಟಗುರುತುಗಳು"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p "
+"class=\"help\">ಸಣ್ಣ್ಪುಟಗುರುತುಗಳನ್ನು "
+"ಅನುಸ್ಥಾಪಿಸಲು ಕೊಂಡಿಯನ್ನು "
+"ಪುಟಗುರುತು ಉಪಕರಣಪಟ್ಟಿ(ಟೂಲ್ "
+"ಬಾರ್)ಕಡೆಗೆ ಎಳೆದೊಯ್ಯಿರಿ,\n"
+" ಅಥವಾ ಕೊಂಡಿಯ ಮೇಲೆ "
+"ಮೂಷಿಕ(ಮೌಸ್)ದ ಬಲಬಟನ್ನನ್ನು "
+"ಒತ್ತಿ ಪುಟಗುರುತುಗಳಿಗೆ "
+"ಸೇರಿಸಿಕೊಳ್ಳಿ. ಈಗ \n"
+" ನೀವು ಸಣ್ಣಪುಟಗುರುತುಗಳನ್ನು "
+"ತಾಣದ ಯಾವ ಪುಟದಿಂದ ಬೇಕಾದರೂ "
+"ಆಯ್ಕೆಮಾಡಿಕೊಳ್ಳಬಹುದು.\n"
+"ನೆನಪಿರಲಿ, ಕೆಲವು "
+"ಸಣ್ಣಪುಟಗುರುತುಗಳಿಗೆ ನೀವು ಈ "
+"ತಾಣವನ್ನು ಆಂತರಿಕ (\"internal\") ಎಂದು "
+"ಸೂಚಿತವಾಗಿರುವ ಗಣಕದಿಂದ "
+"ವೀಕ್ಷಿಸಬೇಕಾಗುತ್ತದೆ.\n"
+"(  ನಿಮ್ಮ ಗಣಕವು \"internal\" ಹೌದೇ "
+"ಅಲ್ಲವೇ ಎಂದು "
+"ಗೊತ್ತಿಲ್ಲದಿದ್ದರೆ , ಗಣಕದ "
+"ಆಡಳಿತಗಾರರನ್ನು ಕೇಳಿರಿ).</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "ಈ ಪುಟದ ಬಗೆಗಿನ ಮಾಹಿತಿ"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+"ನಿಮ್ಮನ್ನು ಯಾವುದೇ ಪುಟದಿಂದ ಆ "
+"ಪುಟವನ್ನು ಸೃಷ್ಟಿಸುವ ನೋಟದ "
+"ಮಾಹಿತಿಪುಟಕ್ಕೆ ಕೊಂಡೊಯ್ಯುವದು"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "ವಸ್ತುವಿನ ಐಡಿ ತೋರಿಸಿ"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"ಏಕೈಕ ವಸ್ತುವನ್ನು "
+"ಪ್ರತಿನಿಧಿಸುವ ಪುಟಗಳ ವಿಶಿಷ್ಠ "
+"ಐಡಿ ಮತ್ತು ಒಳವಿಷಯಬಗೆಯನ್ನು "
+"ತೋರಿಸುತ್ತದೆ."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr ""
+"ಈ ವಸ್ತುವನ್ನು ಬದಲಿಸಿ(ಈಗಿನ "
+"ಕಿಟಕಿಯಲ್ಲಿ)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+"ಏಕೈಕ ವಸ್ತುವನ್ನು "
+"ಪ್ರತಿನಿಧಿಸುವ ಪುಟಗಳಿಗಾಗಿ "
+"ಆಡಳಿತಪುಟಕ್ಕೆ ಒಯ್ಯುತ್ತದೆ"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr ""
+"ಈ ವಸ್ತುವನ್ನು ಬದಲಿಸಿ(ಹೊಸ "
+"ಕಿಟಕಿಯಲ್ಲಿ)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr ""
+"ಮೇಲಿನಂತೆ, ಆದರೆ "
+"ಆಡಳಿತಪುಟವನ್ನು ಹೊಸ "
+"ಕಿಟಕಿಯಲ್ಲಿ ತೆರೆಯುವದು."
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "ದಿನಾಂಕ:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "ಸಮಯ:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "ಈಗ:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "ಬದಲಿಸಿ / ಬದಲಾವಣೆ :"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "ಪುನರ್ನಿರ್ದೇಶನ ಇಲ್ಲಿಂದ->"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: "
+"'/events/search/'."
+msgstr ""
+"ಇದು ಡೊಮೈನ್ ಹೊರತುಪಡಿಸಿದ "
+"ಸಂಪೂರ್ಣ ಪಥವಾಗಿರಬೇಕು "
+"ಉದಾ.'/events/search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "ಪುನರ್ನಿರ್ದೇಶನ ಇಲ್ಲಿಗೆ->"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"ಇದು ಮೇಲಿನಂತೆ ಸಂಪೂರ್ಣ "
+"ಪಥವಾದರೂ ಆಗಿರಬಹುದು ಅಥವಾ "
+"'http://'ದಿಂದ ಆರಂಭವಾಗುವ ಸಂಪೂರ್ಣ URL "
+"ಆಗಿರಬಹುದು."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "ಪುನರ್ನಿರ್ದೇಶನ"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "ಪುನರ್ನಿರ್ದೇಶನ(ಗಳು)"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"ಉದಾ:'/about/contact/'. ಮೊದಲು ಮತ್ತು "
+"ಕೊನೆಯಲ್ಲಿ ಓರೆಗೆರೆ (/) ಇರುವಂತೆ "
+"ನೋಡಿಕೊಳ್ಳಿ."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "ಶೀರ್ಷಿಕೆ"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "ಒಳವಿಷಯ"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr ""
+"ಟಿಪ್ಪಣಿಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "ಟೆಂಪ್ಲೇಟಿನ ಹೆಸರು"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"ಉದಾ:'flatpages/contact_page.html'. ಇದನ್ನು "
+"ಕೊಡದಿದ್ದರೆ ಗಣಕವ್ಯವಸ್ಥೆಯು  "
+"'flatpages/default.html' ಅನ್ನು ಬಳಸುವದು."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "ನೋಂದಾವಣೆ ಅಗತ್ಯವಿದೆ."
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+"ಇದರಲ್ಲಿ ಗುರುತು  ಮಾಡಿದರೆ,  "
+"ಒಳಬಂದ (ಲಾಗಿನ್ ಆದ) ಬಳಕೆದಾರರು "
+"ಮಾತ್ರ ಪುಟವನ್ನು ನೋಡಬಹುದು."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "ಚಪ್ಪಟೆ ಪುಟ"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "ಚಪ್ಪಟೆ  ಪುಟಗಳು"
+
+#: contrib/auth/views.py:39
+msgid "Logged out"
+msgstr "ಹೊರಬರಲಾಗಿದೆ"
+
+#: contrib/auth/models.py:38 contrib/auth/models.py:57
+msgid "name"
+msgstr "ಹೆಸರು"
+
+#: contrib/auth/models.py:40
+msgid "codename"
+msgstr "ಸಾಂಕೇತಿಕ ಹೆಸರು"
+
+#: contrib/auth/models.py:42
+msgid "permission"
+msgstr "ಅನುಮತಿ"
+
+#: contrib/auth/models.py:43 contrib/auth/models.py:58
+msgid "permissions"
+msgstr "ಅನುಮತಿಗಳು"
+
+#: contrib/auth/models.py:60
+msgid "group"
+msgstr "ಗುಂಪು"
+
+#: contrib/auth/models.py:61 contrib/auth/models.py:100
+msgid "groups"
+msgstr "ಗುಂಪುಗಳು"
+
+#: contrib/auth/models.py:90
+msgid "username"
+msgstr "ಬಳಕೆದಾರ-ಹೆಸರು"
+
+#: contrib/auth/models.py:90
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr ""
+"೩೦ ಅಥವಾ ಕಡಿಮೆ ಅಕ್ಷರಗಳು "
+"ಅವಶ್ಯ. ( ಅಕ್ಷರಗಳು , ಅಂಕೆಗಳು "
+"ಮತ್ತು ಅಂಡರ್ಸ್ಕೋರ್(_) ಗಳು "
+"ಮಾತ್ರ)"
+
+#: contrib/auth/models.py:91
+msgid "first name"
+msgstr "ಮೊದಲ ಹೆಸರು"
+
+#: contrib/auth/models.py:92
+msgid "last name"
+msgstr "ಕೊನೆಯ ಹೆಸರು"
+
+#: contrib/auth/models.py:93
+msgid "e-mail address"
+msgstr "ವಿ-ಅಂಚೆ ವಿಳಾಸ"
+
+#: contrib/auth/models.py:94
+msgid "password"
+msgstr "ಪ್ರವೇಶಪದ"
+
+#: contrib/auth/models.py:94
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr " '[algo]$[salt]$[hexdigest]' ಬಳಸಿ"
+
+#: contrib/auth/models.py:95
+msgid "staff status"
+msgstr "ಸಿಬ್ಬಂದಿ ಸ್ಥಿತಿ"
+
+#: contrib/auth/models.py:95
+msgid "Designates whether the user can log into this admin site."
+msgstr ""
+"ಬಲಕೆದಾರರು ಈ ಆಡಳಿತ ತಾಣಕ್ಕೆ  "
+"ಪ್ರವೇಶಪಡೆಯಬಹುದೇ ಎಂಬುದನ್ನು "
+"ತಿಳಿಸುತ್ತದೆ."
+
+#: contrib/auth/models.py:96
+msgid "active"
+msgstr "ಸಕ್ರಿಯ"
+
+#: contrib/auth/models.py:96
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"ಈ ಬಳಕೆದಾರರು ಜಾಂಗೋ "
+"ಆಡಳಿತಪುಟಕ್ಕೆ "
+"ಪ್ರವೇಶಪಡೆಯಬಹುದೇ ಎಂಬುದನ್ನು "
+"ತಿಳಿಸುತ್ತದೆ. ಖಾತೆಗಳನ್ನು "
+"ಕಿತ್ತುಹಾಕುವ ಬದಲು ಇದನ್ನು "
+"ಆಯ್ಕೆಯನ್ನು ತೆಗೆದುಹಾಕಿರಿ."
+
+#: contrib/auth/models.py:97
+msgid "superuser status"
+msgstr "ಮಹಾಬಳಕೆದಾರನ ಸ್ಧಿತಿ"
+
+#: contrib/auth/models.py:97
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr ""
+"ಈ ಸದಸ್ಯರು ಸುವ್ಯಕ್ತವಾಗಿ  "
+"ನೀಡದಿದ್ದರೂ ಎಲ್ಲಾ "
+"ಅನುಮತಿಗಳನ್ನು ಪಡೆದಿರುವರು "
+"ಎಂಬುದನ್ನು ಸೂಚಿಸುತ್ತದೆ."
+
+#: contrib/auth/models.py:98
+msgid "last login"
+msgstr "ಕಡೇ ಸಾರಿ ಒಳಬಂದದ್ದು"
+
+#: contrib/auth/models.py:99
+msgid "date joined"
+msgstr "ಸೇರಿದ ದಿನಾಂಕ"
+
+#: contrib/auth/models.py:101
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"ವೈಯಕ್ತಿಕವಾಗಿ ನೀಡಲಾಗಿರುವ "
+"ಅನುಮತಿಗಳ ಜೊತೆಗೆ, ಈ ಸದಸ್ಯರು "
+"ತಮ್ಮ ಗುಂಪಿಗೆ ನೀಡಲಾಗಿರುವ "
+"ಅನುಮತಿಗಳನ್ನೂ ಕೂಡ "
+"ಪಡೆಯುತ್ತಾರೆ."
+
+#: contrib/auth/models.py:102
+msgid "user permissions"
+msgstr "ಬಳಕೆದಾರ ಅನುಮತಿಗಳು"
+
+#: contrib/auth/models.py:105
+msgid "user"
+msgstr "ಬಳಕೆದಾರ"
+
+#: contrib/auth/models.py:106
+msgid "users"
+msgstr "ಬಳಕೆದಾರರು"
+
+#: contrib/auth/models.py:111
+msgid "Personal info"
+msgstr "ವೈಯುಕ್ತಿಕ ಮಾಹಿತಿ"
+
+#: contrib/auth/models.py:112
+msgid "Permissions"
+msgstr "ಅನುಮತಿಗಳು"
+
+#: contrib/auth/models.py:113
+msgid "Important dates"
+msgstr "ಮಹತ್ವದ ದಿನಾಂಕಗಳು"
+
+#: contrib/auth/models.py:114
+msgid "Groups"
+msgstr "ಗುಂಪುಗಳು"
+
+#: contrib/auth/models.py:256
+msgid "message"
+msgstr "ಸಂದೇಶ"
+
+#: contrib/auth/forms.py:52
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"ನಿಮ್ಮ ಜಾಲವೀಕ್ಷಕದಲ್ಲಿ "
+"ಕುಕೀಗಳು "
+"ಸಕ್ರಿಯಗೊಳಿಸಲ್ಪಟ್ಟಂತಿಲ್ಲ. "
+"ಒಳಬರಲು ಕುಕೀಗಳು ಅಗತ್ಯ. "
+
+#: contrib/auth/forms.py:61
+msgid "This account is inactive."
+msgstr "ಈ ಖಾತೆಯು ನಿಷ್ಕ್ರಿಯವಾಗಿದೆ"
+
+#: contrib/contenttypes/models.py:20
+msgid "python model class name"
+msgstr ""
+"ಪೈಥಾನ್ ಮಾಡೆಲ್  ಕ್ಲಾಸಿನ ಹೆಸರು"
+
+#: contrib/contenttypes/models.py:23
+msgid "content type"
+msgstr "ಒಳವಿಷಯದ ಬಗೆ"
+
+#: contrib/contenttypes/models.py:24
+msgid "content types"
+msgstr "ಒಳವಿಷಯದ ಬಗೆಗಳು"
+
+#: contrib/sessions/models.py:51
+msgid "session key"
+msgstr "ಅಧಿವೇಶನದ ಕೀಲಿಕೈ"
+
+#: contrib/sessions/models.py:52
+msgid "session data"
+msgstr "ಅಧಿವೇಶನದ ದತ್ತಾಂಶ"
+
+#: contrib/sessions/models.py:53
+msgid "expire date"
+msgstr "ಅವಧಿಮೀರುವ ದಿನಾಂಕ"
+
+#: contrib/sessions/models.py:57
+msgid "session"
+msgstr "ಅಧಿವೇಶನ"
+
+#: contrib/sessions/models.py:58
+msgid "sessions"
+msgstr "ಅಧಿವೇಶನಗಳು"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "ಡೊಮೈನ್  ಹೆಸರು"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "ತೋರಿಸುವ ಹೆಸರು"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "ತಾಣ"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "ತಾಣಗಳು"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "ಸೋಮವಾರ"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "ಮಂಗಳವಾರ"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "ಬುಧವಾರ"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "ಗುರುವಾರ"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "ಶುಕ್ರವಾರ"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "ಶನಿವಾರ"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "ರವಿವಾರ"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "ಜನವರಿ"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "ಫೆಬ್ರುವರಿ"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "ಮಾರ್ಚ್"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "ಎಪ್ರಿಲ್"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "ಮೇ"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "ಜೂನ್"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "ಜುಲೈ"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "ಆಗಸ್ಟ್"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "ಸೆಪ್ಟೆಂಬರ್"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "ಅಕ್ಟೋಬರ್"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "ನವೆಂಬರ್"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "ಡಿಸೆಂಬರ್"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr "ಜನವರಿ"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "ಫೆಬ್ರವರಿ"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "ಮಾರ್ಚ್"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "ಏಪ್ರಿಲ್"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "ಮೇ"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "ಜೂನ್"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "ಜುಲೈ"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "ಆಗಸ್ಟ್"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "ಸೆಪ್ಟೆಂಬರ್"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "ಅಕ್ಟೋಬರ್"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "ನವೆಂಬರ್"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "ಡಿಸೆಂಬರ್"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "ಜನವರಿ."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "ಫೆಬ್ರವರಿ."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "ಆಗಸ್ಟ್."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "ಸೆಪ್ಟೆಂಬರ್."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "ಅಕ್ಟೋಬರ್."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "ನವೆಂಬರ್."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "ಡಿಸೆಂಬರ್."
+
+#: utils/timesince.py:12
+msgid "year"
+msgstr "ವರ್ಷ"
+
+#: utils/timesince.py:13
+msgid "month"
+msgstr "ತಿಂಗಳು"
+
+#: utils/timesince.py:14
+msgid "week"
+msgstr "ವಾರ"
+
+#: utils/timesince.py:15
+msgid "day"
+msgstr "ದಿನ"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgstr "ಘಂಟೆ"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgstr "ನಿಮಿಷ"
+
+#: utils/translation/trans_real.py:362
+msgid "DATE_FORMAT"
+msgstr "N j, Y"
+
+#: utils/translation/trans_real.py:363
+msgid "DATETIME_FORMAT"
+msgstr "N j, Y, P"
+
+#: utils/translation/trans_real.py:364
+msgid "TIME_FORMAT"
+msgstr "P"
+
+#: utils/translation/trans_real.py:380
+msgid "YEAR_MONTH_FORMAT"
+msgstr "F Y"
+
+#: utils/translation/trans_real.py:381
+msgid "MONTH_DAY_FORMAT"
+msgstr "F j"
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "ಅರೇಬಿಕ್"
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "ಬೆಂಗಾಲಿ"
+
+#: conf/global_settings.py:41
+msgid "Czech"
+msgstr "ಝೆಕ್"
+
+#: conf/global_settings.py:42
+msgid "Welsh"
+msgstr "ವೆಲ್ಷ್"
+
+#: conf/global_settings.py:43
+msgid "Danish"
+msgstr "ಡ್ಯಾನಿಷ್"
+
+#: conf/global_settings.py:44
+msgid "German"
+msgstr "ಜರ್ಮನ್"
+
+#: conf/global_settings.py:45
+msgid "Greek"
+msgstr "ಗ್ರೀಕ್"
+
+#: conf/global_settings.py:46
+msgid "English"
+msgstr "ಇಂಗ್ಲಿಷ್"
+
+#: conf/global_settings.py:47
+msgid "Spanish"
+msgstr "ಸ್ಪ್ಯಾನಿಷ್"
+
+#: conf/global_settings.py:48
+msgid "Argentinean Spanish"
+msgstr "ಅರ್ಜೆಂಟೈನಾದ ಸ್ಪ್ಯಾನಿಷ್"
+
+#: conf/global_settings.py:49
+msgid "Finnish"
+msgstr "ಫಿನ್ನಿಶ್"
+
+#: conf/global_settings.py:50
+msgid "French"
+msgstr "ಫ್ರೆಂಚ್"
+
+#: conf/global_settings.py:51
+msgid "Galician"
+msgstr "ಗ್ಯಾಲಿಶಿಯನ್"
+
+#: conf/global_settings.py:52
+msgid "Hungarian"
+msgstr "ಹಂಗೇರಿಯನ್"
+
+#: conf/global_settings.py:53
+msgid "Hebrew"
+msgstr "ಹೀಬ್ರೂ"
+
+#: conf/global_settings.py:54
+msgid "Icelandic"
+msgstr "ಐಸ್‍ಲ್ಯಾಂಡಿಕ್"
+
+#: conf/global_settings.py:55
+msgid "Italian"
+msgstr "ಇಟಾಲಿಯನ್"
+
+#: conf/global_settings.py:56
+msgid "Japanese"
+msgstr "ಜಪಾನೀಸ್"
+
+#: conf/global_settings.py:57
+msgid "Dutch"
+msgstr "ಡಚ್"
+
+#: conf/global_settings.py:58
+msgid "Norwegian"
+msgstr "ನಾರ್ವೇಜಿಯನ್"
+
+#: conf/global_settings.py:59
+msgid "Brazilian"
+msgstr "ಬ್ರಾಝಿಲಿಯನ್"
+
+#: conf/global_settings.py:60
+msgid "Romanian"
+msgstr "ರೋಮೇನಿಯನ್"
+
+#: conf/global_settings.py:61
+msgid "Russian"
+msgstr "ರಶಿಯನ್"
+
+#: conf/global_settings.py:62
+msgid "Slovak"
+msgstr "ಸ್ಲೋವಾಕ್"
+
+#: conf/global_settings.py:63
+msgid "Slovenian"
+msgstr "ಸ್ಲೋವೇನಿಯನ್"
+
+#: conf/global_settings.py:64
+msgid "Serbian"
+msgstr "ಸೆರ್ಬಿಯನ್"
+
+#: conf/global_settings.py:65
+msgid "Swedish"
+msgstr "ಸ್ವೀಡಿಷ್"
+
+#: conf/global_settings.py:66
+msgid "Tamil"
+msgstr "ತಮಿಳು"
+
+#: conf/global_settings.py:67
+msgid "Turkish"
+msgstr "ಟರ್ಕಿಶ್"
+
+#: conf/global_settings.py:68
+msgid "Ukrainian"
+msgstr "ಯುಕ್ರೇನಿಯನ್"
+
+#: conf/global_settings.py:69
+msgid "Simplified Chinese"
+msgstr "ಸರಳೀಕೃತ ಚೈನೀಸ್"
+
+#: conf/global_settings.py:70
+msgid "Traditional Chinese"
+msgstr "ಸಂಪ್ರದಾಯಿಕ ಚೈನೀಸ್ "
+
+#: core/validators.py:63
+msgid "This value must contain only letters, numbers and underscores."
+msgstr ""
+"ಈ ಬೆಲೆಯು ಕೇವಲ ಅಕ್ಷರಗಳು , "
+"ಅಂಕೆಗಳು ಮತ್ತು ಅಂಡರ್ಸ್ಕೋರ್(_) "
+"ಗಳನ್ನು ಒಳಗೊಂಡಿರಬೇಕು"
+
+#: core/validators.py:67
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"ಈ ಬೆಲೆಯು ಅಕ್ಷರಗಳು , ಅಂಕೆಗಳು , "
+"ಅಡಿಗೆರೆ ಅರ್ಥಾತ್ "
+"ಅಂಡರ್ಸ್ಕೋರ್(_) ,ಅಡ್ಡಗೆರೆ "
+"ಅರ್ಥಾತ್ ಡ್ಯಾಷ್(-) ಮತ್ತು "
+"ಓರೆಗೆರೆ ಅರ್ಥಾತ್ ಸ್ಲ್ಯಾಶ್ (/) "
+"ಗಳನ್ನು ಒಳಗೊಳ್ಳಬಹುದು."
+
+#: core/validators.py:71
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr ""
+"ಈ ಬೆಲೆಯು ಕೇವಲ ಅಕ್ಷರಗಳು , "
+"ಅಂಕೆಗಳು ಮತ್ತು ಅಂಡರ್ಸ್ಕೋರ್(_) "
+"ಮತ್ತು ಹೈಫನ್(-)ಗಳನ್ನು "
+"ಒಳಗೊಂಡಿರಬೇಕು"
+
+#: core/validators.py:75
+msgid "Uppercase letters are not allowed here."
+msgstr ""
+"ಇಂಗ್ಲೀಷ್ ದೊಡ್ಡಕ್ಷರಗಳನ್ನು "
+"ಇಲ್ಲಿ ಬಳಸುವಂತಿಲ್ಲ"
+
+#: core/validators.py:79
+msgid "Lowercase letters are not allowed here."
+msgstr ""
+"ಇಂಗ್ಲೀಷ್ ಸಣ್ಣಕ್ಷರಗಳನ್ನು "
+"ಇಲ್ಲಿ ಬಳಸುವಂತಿಲ್ಲ"
+
+#: core/validators.py:86
+msgid "Enter only digits separated by commas."
+msgstr ""
+"ಅಲ್ಪವಿರಾಮ(,)ಗಳಿಂದ  ಬೇರ್ಪಟ್ಟ  "
+"ಅಂಕೆಗಳನ್ನು ಮಾತ್ರ ಬರೆಯಿರಿ."
+
+#: core/validators.py:98
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr ""
+"ಇ-ಅಂಚೆಗಳ ವಿಳಾಸಗಳನ್ನು, "
+"ಅಲ್ಪವಿರಾಮ(,)ಗಳಿಂದ "
+"ಬೇರ್ಪಟ್ಟಿರುವಂತೆ ಸೂಚಿಸಿರಿ."
+
+#: core/validators.py:102
+msgid "Please enter a valid IP address."
+msgstr "ಸರಿಯಾದ  IP ವಿಳಾಸ ಬರೆಯಿರಿ"
+
+#: core/validators.py:106
+msgid "Empty values are not allowed here."
+msgstr "ಇಲ್ಲಿ ಖಾಲಿ ಬಿಡುವಂತಿಲ್ಲ"
+
+#: core/validators.py:110
+msgid "Non-numeric characters aren't allowed here."
+msgstr ""
+"ಅಂಕೆಗಳಲ್ಲದೆ ಯಾವದೇ "
+"ಅಕ್ಷರಗಳನ್ನು ಇಲ್ಲಿ "
+"ಬಳಸುವಂತಿಲ್ಲ"
+
+#: core/validators.py:114
+msgid "This value can't be comprised solely of digits."
+msgstr ""
+"ಈ ಬೆಲೆಯಲ್ಲಿ ಅಂಕೆಗಳಷ್ಟೇ  "
+"ಇರುವಂತಿಲ್ಲ"
+
+#: core/validators.py:119
+msgid "Enter a whole number."
+msgstr "ಪೂರ್ಣಾಂಕವೊಂದನ್ನು ಬರೆಯಿರಿ"
+
+#: core/validators.py:123
+msgid "Only alphabetical characters are allowed here."
+msgstr ""
+"ವರ್ಣಮಾಲೆಯ ಅಕ್ಷರಗಳನ್ನು "
+"ಮಾತ್ರ ಇಲ್ಲಿ ಬಳಸಬಹುದು."
+
+#: core/validators.py:138
+msgid "Year must be 1900 or later."
+msgstr ""
+"ವರ್ಷವು ೧೯೦೦ ಅಥವಾ "
+"ನಂತರದ್ದಿರಬೇಕು."
+
+#: core/validators.py:142
+#, python-format
+msgid "Invalid date: %s."
+msgstr "ತಪ್ಪು ದಿನಾಂಕ: %s."
+
+#: core/validators.py:146 db/models/fields/__init__.py:415
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr ""
+"ಸರಿಯಾದ ದಿನಾಂಕವನ್ನು "
+"ವವವವ-ತಿತಿ-ದಿದಿ ರೀತಿಗೆ "
+"ಹೊಂದುವಂತೆ ಸೂಚಿಸಿರಿ."
+
+#: core/validators.py:151
+msgid "Enter a valid time in HH:MM format."
+msgstr ""
+"HH:MM ರೂಪದಲ್ಲಿ  ಸರಿಯಾದ ಸಮಯವನ್ನು "
+"ಬರೆಯಿರಿ"
+
+#: core/validators.py:155 db/models/fields/__init__.py:477
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr ""
+"ಸರಿಯಾದ ದಿನಾಂಕ/ವೇಳೆಯನ್ನು "
+"ವವವವ-ತಿತಿ-ದಿದಿ ಗಗ:ನಿನಿ "
+"ರೀತಿಗೆ ಹೊಂದುವಂತೆ ಸೂಚಿಸಿರಿ."
+
+#: core/validators.py:160
+msgid "Enter a valid e-mail address."
+msgstr ""
+"ಕ್ರಮಬದ್ಧ ವಿ-ವಿಳಾಸವೊಂದನ್ನು "
+"ಇಲ್ಲಿ ಬರೆಯಿರಿ"
+
+#: core/validators.py:172 core/validators.py:401 forms/__init__.py:661
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+"ಯಾವದೇ ಕಡತವನ್ನೂ "
+"ಸಲ್ಲಿಸಲಾಗಿಲ್ಲ.ನಮೂನೆಯ ಮೇಲಿನ "
+"ಸಂಕೇತೀಕರಣ ಬಗೆಯನ್ನು "
+"ಪರೀಕ್ಷಿಸಿ."
+
+#: core/validators.py:176
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"ಸರಿಯಾದ ಚಿತ್ರವನ್ನು ಏರಿಸಿ. "
+"ನೀವು ಏರಿಸಿದ ಕಡತವು ಚಿತ್ರವಲ್ಲ "
+"ಅಥವಾ ಅದು ಕೆಟ್ಟು ಹೋಗಿರುವ "
+"ಚಿತ್ರ. "
+
+#: core/validators.py:183
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr ""
+"%s URL ಸರಿಯಾದ ಚಿತ್ರದೆಡೆಗೆ "
+"ಒಯ್ಯುತ್ತಿಲ್ಲ."
+
+#: core/validators.py:187
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"ದೂರವಾಣಿ ಅಂಕೆಗಳು XXX-XXX-XXXX "
+"ರೀತಿಯಲ್ಲಿರಬೇಕು. \"%s\" "
+"ತಪ್ಪಾಗಿರುತ್ತದೆ."
+
+#: core/validators.py:195
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr ""
+"%s URL ಸರಿಯಾದ ಕ್ವಿಕ್‍ಟೈಮ್ "
+"ದೃಶ್ಯದೆಡೆಗೆ ಒಯ್ಯುತ್ತಿಲ್ಲ."
+
+#: core/validators.py:199
+msgid "A valid URL is required."
+msgstr "ಸರಿಯಾದ URL ಅವಶ್ಯವಿದೆ"
+
+#: core/validators.py:213
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"ಸರಿಯಾದ  HTML ಅವಶ್ಯ. ಇಲ್ಲಿನ "
+"ನಿರ್ದಿಷ್ಟ ತಪ್ಪುಗಳು:\n"
+"%s"
+
+#: core/validators.py:220
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "ತಪ್ಪು XML: %s"
+
+#: core/validators.py:230
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "ತಪ್ಪು URL: %s"
+
+#: core/validators.py:234 core/validators.py:236
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "%s ಈ  URL  ಮುರಿದ ಕೊಂಡಿಯಾಗಿದೆ."
+
+#: core/validators.py:242
+msgid "Enter a valid U.S. state abbreviation."
+msgstr ""
+" ಅಮೇರಿಕೆಯ ಸಂಯುಕ್ತ ಸಂಸ್ಥಾನದ "
+"ರಾಜ್ಯದ ಸರಿಯಾದ "
+"ಸಂಕ್ಷಿಪ್ತರೂಪವನ್ನು ಕೊಡಿ."
+
+#: core/validators.py:256
+#, python-format
+#,fuzzy
+msgid "Watch your mouth! The word %s is not allowed here."
+msgstr ""
+"ನಾಲಿಗೆ ಬಿಗಿ ಹಿಡಿಯಿರಿ! %s  "
+"ಶಬ್ದವನ್ನು ಇಲ್ಲಿ "
+"ಬಳಸುವಂತಿಲ್ಲ."
+"ನಾಲಿಗೆ ಬಿಗಿ ಹಿಡಿಯಿರಿ! %s ಈ "
+"ಶಬ್ದಗಳನ್ನು ಇಲ್ಲಿ "
+"ಬಳಸುವಂತಿಲ್ಲ."
+
+#: core/validators.py:263
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr ""
+"ಈ ಅಂಶವು  '%s' ಅಂಶದೊಂದಿಗೆ "
+"ಹೊಂದಿಕೊಳ್ಳಬೇಕು."
+
+#: core/validators.py:282
+msgid "Please enter something for at least one field."
+msgstr ""
+"ಕನಿಷ್ಠ ಒಂದು ಅಂಶದಲ್ಲಿ "
+"ಏನನ್ನಾದರೂ ಬರೆಯಿರಿ."
+
+#: core/validators.py:291 core/validators.py:302
+msgid "Please enter both fields or leave them both empty."
+msgstr ""
+"ಎರಡೂ ಅಂಶಗಳನ್ನು ಭರತಿ ಮಾಡಿರಿ "
+"ಅಥವಾ ಎರಡನ್ನೂ ಖಾಲಿಯಾಗಿಡಿ."
+
+#: core/validators.py:309
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr ""
+" %(field)s ಇದು  %(value)s ಆಗಿದ್ದರೆ ಈ "
+"ಅಂಶವನ್ನು ಕೊಡಲೇಬೇಕು"
+
+#: core/validators.py:321
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr ""
+" %(field)s ಇದು  %(value)s ಆಗಿಲ್ಲದಿದ್ದರೆ ಈ "
+"ಅಂಶವನ್ನು ಕೊಡಲೇಬೇಕು"
+
+#: core/validators.py:340
+msgid "Duplicate values are not allowed."
+msgstr ""
+"ಪಡಿಯಚ್ಚುಬೆಲೆಗಳಿಗೆ "
+"ಅನುಮತಿಯಿಲ್ಲ"
+
+#: core/validators.py:363
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "ಈ ಬೆಲೆಯು %sದ ಘಾತವಾಗಿರಬೇಕು."
+
+#: core/validators.py:374
+msgid "Please enter a valid decimal number."
+msgstr ""
+"ದಯವಿಟ್ಟು ಸರಿಯಾದ ದಶಮಾನ "
+"ಸಂಖ್ಯೆ ಬರೆಯಿರಿ"
+
+#: core/validators.py:378
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+"Please enter a valid decimal number with at most %s total digits."
+msgstr ""
+"ದಯವಿಟ್ಟು ಸರಿಯಾದ ದಶಮಾನ "
+"ಸಂಖ್ಯೆಯನ್ನು - ಹೆಚ್ಚೆಂದರೆ  "
+"ಒಟ್ಟು %s ಅಂಕೆ ಇರುವಂತೆ - "
+"ಬರೆಯಿರಿ."
+"ದಯವಿಟ್ಟು ಸರಿಯಾದ ದಶಮಾನ "
+"ಸಂಖ್ಯೆಯನ್ನು - ಹೆಚ್ಚೆಂದರೆ  "
+"ಒಟ್ಟು %s ಅಂಕೆಗಳು ಇರುವಂತೆ - "
+"ಬರೆಯಿರಿ."
+
+#: core/validators.py:381
+#, python-format
+msgid ""
+"Please enter a valid decimal number with a whole part of at most %s digit."
+"Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr ""
+"ದಯವಿಟ್ಟು ಸರಿಯಾದ ದಶಮಾನ "
+"ಸಂಖ್ಯೆಯನ್ನು - ಪೂರ್ಣಾಂಕ ಭಾಗವು "
+"ಹೆಚ್ಚೆಂದರೆ  ಒಟ್ಟು %s ಅಂಕೆ "
+"ಇರುವಂತೆ - ಬರೆಯಿರಿ."
+"ದಯವಿಟ್ಟು ಸರಿಯಾದ ದಶಮಾನ "
+"ಸಂಖ್ಯೆಯನ್ನು - ಪೂರ್ಣಾಂಕ ಭಾಗವು "
+"ಹೆಚ್ಚೆಂದರೆ  ಒಟ್ಟು %s ಅಂಕೆಗಳು "
+"ಇರುವಂತೆ - ಬರೆಯಿರಿ."
+
+#: core/validators.py:384
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr ""
+"ದಯವಿಟ್ಟು ಸರಿಯಾದ ದಶಮಾನ "
+"ಸಂಖ್ಯೆಯನ್ನು - ದಶಮಾಂಶ ಭಾಗವು "
+"ಹೆಚ್ಚೆಂದರೆ  ಒಟ್ಟು %s ಸ್ಥಾನ "
+"ಇರುವಂತೆ - ಬರೆಯಿರಿ."
+"ದಯವಿಟ್ಟು ಸರಿಯಾದ ದಶಮಾನ "
+"ಸಂಖ್ಯೆಯನ್ನು - ದಶಮಾಂಶ ಭಾಗವು "
+"ಹೆಚ್ಚೆಂದರೆ   %s ಸ್ಥಾನಗಳು  "
+"ಇರುವಂತೆ - ಬರೆಯಿರಿ."
+
+#: core/validators.py:394
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr ""
+"ನೀವು ಏರಿಸಿದ ಕಡತವು ಕನಿಷ್ಟ %s "
+"ಬೈಟ್‍ಗಳಷ್ಟು ದೊಡ್ಡದಿದೆ ಎಂದು "
+"ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ."
+
+#: core/validators.py:395
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr ""
+"ನೀವು ಏರಿಸಿದ ಕಡತವು %s "
+"ಬೈಟ್‍ಗಳಿಗಿಂತ ಹೆಚ್ಚಿರದ ಹಾಗೆ "
+"ನೋಡಿಕೊಳ್ಳಿ."
+
+#: core/validators.py:412
+msgid "The format for this field is wrong."
+msgstr "ಈ ಅಂಶದ ಸ್ವರೂಪವು ತಪ್ಪಾಗಿದೆ"
+
+#: core/validators.py:427
+msgid "This field is invalid."
+msgstr "ಈ ಅಂಶವು ತಪ್ಪಾಗಿದೆ"
+
+#: core/validators.py:463
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr ""
+" %s ದಿಂದ ಏನನ್ನೂ "
+"ಹೊರತೆಗೆದುಕೊಳ್ಳಲಾಗಲಿಲ್ಲ."
+
+#: core/validators.py:466
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+" %(url)s ಈ  URL ತಪ್ಪು ಒಳವಿಷಯ-ಬಗೆಯ "
+"ಶಿರೋ‍ಭಾಗ '%(contenttype)s' ಅನ್ನು "
+"ಮರಳಿಸಿತು."
+
+#: core/validators.py:499
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"ದಯವಿಟ್ಟು  %(line)s - ಸಾಲಿನಿಂದ "
+"ಮುಚ್ಚಿರದ %(tag)s ಟ್ಯಾಗ್ ಅನ್ನು "
+"ಮುಚ್ಚಿರಿ . (ಸಾಲು  \"%(start)s\" ಎಂದು "
+"ಆರಂಭವಾಗುತ್ತದೆ.)"
+
+#: core/validators.py:503
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+" %(line)s ಸಾಲಿನಲ್ಲಿ ಆರಂಭವಾಗುವ ಕೆಲ "
+"ಪಠ್ಯಭಾಗವನ್ನು ಆ ಸಂದರ್ಭದಲ್ಲಿ "
+"ಬಳಸಲಾಗದು.(ಸಾಲು  \"%(start)s\" ಎಂದು "
+"ಆರಂಭವಾಗುತ್ತದೆ.)"
+
+#: core/validators.py:508
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+" %(line)sನೆ ಸಾಲಿನಲ್ಲಿರುವ \"%(attr)s\"  "
+"ತಪ್ಪು ಗುಣಧರ್ಮವಾಗಿದೆ . (ಸಾಲು "
+"\"%(start)s\" ಎಂದು ಆರಂಭವಾಗುತ್ತದೆ.)"
+
+#: core/validators.py:513
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+" %(line)s ನೆ ಸಾಲಿನಲ್ಲಿರುವ \"<%(tag)s>\"  "
+"ತಪ್ಪು ಟ್ಯಾಗ್ ಆಗಿದೆ . (ಸಾಲು "
+"\"%(start)s\" ಎಂದು ಆರಂಭವಾಗುತ್ತದೆ.)"
+
+#: core/validators.py:517
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+" %(line)s ನೆ ಸಾಲಿನಲ್ಲಿರುವ  ಟ್ಯಾಗ್ "
+"ಗೆ ಅಗತ್ಯವಾದ ಒಂದು ಅಥವಾ ಹೆಚ್ಚು "
+"ಗುಣಧರ್ಮಗಳು ಕಾಣೆಯಾಗಿವೆ . "
+"(ಸಾಲು \"%(start)s\" ಎಂದು "
+"ಆರಂಭವಾಗುತ್ತದೆ.)"
+
+#: core/validators.py:522
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+" %(line)s ನೆ ಸಾಲಿನಲ್ಲಿರುವ  \"%(attr)s\" ಗೆ "
+"ತಪ್ಪು ಬೆಲೆ ಇದೆ. (ಸಾಲು \"%(start)s\" "
+"ಎಂದು ಆರಂಭವಾಗುತ್ತದೆ.)"
+
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr ""
+" %(verbose_name)s ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ "
+"ನಿರ್ಮಿಸಲಾಯಿತು."
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr ""
+" %(verbose_name)s ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ "
+"ಮಾರ್ಪಡಿಸಲಾಯಿತು."
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr ""
+" %(verbose_name)s ಅನ್ನು "
+"ತೆಗೆದುಹಾಕಲಾಯಿತು"
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr ""
+"ಕೊಟ್ಟಿರುವ %(field)sಗೆ  ಈ %(type)s  "
+"ಹೊಂದಿರುವ %(object)s ಈಗಾಗಲೇ ಇದೆ."
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr ""
+"ಈ %(fieldname)s ಹೊಂದಿರುವ %(optname)s ಈಗಾಗಲೇ "
+"ಇದೆ."
+
+#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:551 db/models/fields/__init__.py:562
+#: forms/__init__.py:346
+msgid "This field is required."
+msgstr "ಈ ಅಂಶ ಅಗತ್ಯ."
+
+#: db/models/fields/__init__.py:340
+msgid "This value must be an integer."
+msgstr ""
+"ಈ ಬೆಲೆಯು ಪೂರ್ಣ ಸಂಖ್ಯೆ ಇರಬೇಕು."
+
+#: db/models/fields/__init__.py:372
+msgid "This value must be either True or False."
+msgstr ""
+"ಈ ಬೆಲೆಯು  ಹೌದು ಅಥವಾ ಇಲ್ಲ "
+"ಇರಬೇಕು."
+
+#: db/models/fields/__init__.py:388
+msgid "This field cannot be null."
+msgstr ""
+"ಈ ಅಂಶವನ್ನು ಖಾಲಿ ಬಿಡುವಂತಿಲ್ಲ."
+
+#: db/models/fields/__init__.py:571
+msgid "Enter a valid filename."
+msgstr ""
+"ಸರಿಯಾದ ಕಡತದ ಹೆಸರನ್ನು "
+"ಬರೆಯಿರಿ"
+
+#: db/models/fields/related.py:51
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "ಸರಿಯಾದ %s ಅನ್ನು ಬರೆಯಿರಿ ."
+
+#: db/models/fields/related.py:618
+msgid "Separate multiple IDs with commas."
+msgstr ""
+"ಅನೇಕ ಐಡಿಗಳನ್ನು "
+"ಅಲ್ಪವಿರಾಮ(,)ಗಳಿಂದ "
+"ಬೇರ್ಪಡಿಸಿರಿ"
+
+#: db/models/fields/related.py:620
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"ಒಂದಕ್ಕಿಂತ ಹೆಚ್ಚನ್ನು "
+"ಆಯ್ದುಕೊಳ್ಳಲು ಮ್ಯಾಕ್ ಗಣಕದ "
+"ಮೇಲೆ  \"ಕಂಟ್ರೋಲ್\", ಅಥವಾ "
+"\"ಕಮ್ಯಾಂಡ್\" ಅನ್ನು ಒತ್ತಿ "
+"ಹಿಡಿಯಿರಿ."
+
+#: db/models/fields/related.py:664
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr ""
+"ದಯವಿಟ್ಟು ಸರಿಯಾದ %(self)s "
+"ಐಡಿಗಳನ್ನು ಸೂಚಿಸಿರಿ . ಈಗ "
+"ಸೂಚಿಸಿದ          %(value)r   ತಪ್ಪಾಗಿದೆ."
+"ದಯವಿಟ್ಟು ಸರಿಯಾದ %(self)s "
+"ಐಡಿಗಳನ್ನು ಸೂಚಿಸಿರಿ . ಈಗ "
+"ಸೂಚಿಸಿದ          %(value)s ತಪ್ಪಾಗಿವೆ"
+
+#: forms/__init__.py:381
+#, python-format
+#,fuzzy
+msgid "Ensure your text is less than %s character."
+msgstr ""
+"ನಿಮ್ಮ ಗದ್ಯ %s ಅಕ್ಷರಕ್ಕಿಂತ "
+"ಕಡಿಮೆ ಇರುವಂತೆ ಜಾಗ್ರತೆ ವಹಿಸಿ."
+"ನಿಮ್ಮ ಗದ್ಯ %s ಅಕ್ಷರಗಳಿಗಿಂತ "
+"ಕಡಿಮೆ ಇರುವಂತೆ ಜಾಗ್ರತೆ ವಹಿಸಿ."
+
+#: forms/__init__.py:386
+msgid "Line breaks are not allowed here."
+msgstr ""
+" ಇಲ್ಲಿ "
+"ಸಾಲುಗಳನ್ನುತುಂಡರಿಸುವಂತಿಲ್ಲ"
+
+#: forms/__init__.py:487 forms/__init__.py:560 forms/__init__.py:599
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr ""
+"ಸರಿಯಾದ ಆಯ್ಕೆಯನ್ನು "
+"ಆಯ್ದುಕೊಳ್ಳಿರಿ.'%(data)s' %(choices)s "
+"ನಲ್ಲಿಲ್ಲ."
+
+#: forms/__init__.py:663
+msgid "The submitted file is empty."
+msgstr "ಸಲ್ಲಿಸಲಾದ ಕಡತ ಖಾಲಿ ಇದೆ."
+
+#: forms/__init__.py:719
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr ""
+"-೩೨,೭೬೮ ಹಾಗೂ ೩೨,೭೬೭ ರ ನಡುವಿನ "
+"ಪೂರ್ಣ ಸಂಖ್ಯೆ ಕೊಡಿ."
+
+#: forms/__init__.py:729
+msgid "Enter a positive number."
+msgstr "ಧನಾತ್ಮಕ ಸಂಖ್ಯೆ ಕೊಡಿ."
+
+#: forms/__init__.py:739
+msgid "Enter a whole number between 0 and 32,767."
+msgstr ""
+"೦ ಮತ್ತು ೩೨,೭೬೭ ರ ನಡುವಿನ ಒಂದು "
+"ಪೂರ್ಣಾಂಕ ಕೊಡಿ"
+
+#: template/defaultfilters.py:401
+msgid "yes,no,maybe"
+msgstr "ಹೌದು,ಇಲ್ಲ,ಇರಬಹುದು"
+
diff --git a/webapp/django/conf/locale/kn/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/kn/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..60272ca
--- /dev/null
+++ b/webapp/django/conf/locale/kn/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/kn/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/kn/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..5909436
--- /dev/null
+++ b/webapp/django/conf/locale/kn/LC_MESSAGES/djangojs.po
@@ -0,0 +1,116 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-09-25 15:43+0200\n"
+"PO-Revision-Date: 2007-01-08 20:22+0530\n"
+"Last-Translator: Kannada Localization Team <translation@sampada.info>\n"
+"Language-Team: Kannada <translation@sampada.info>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "ಲಭ್ಯ %s "
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "ಎಲ್ಲವನ್ನೂ  ಆಯ್ದುಕೊಳ್ಳಿ"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "ಸೇರಿಸಿ"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "ತೆಗೆದು ಹಾಕಿ"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "%s ಆಯ್ದುಕೊಳ್ಳಲಾಗಿದೆ"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr ""
+"ನಿಮ್ಮ ಆಯ್ಕೆ(ಗಳ)ನ್ನು ಆರಿಸಿ "
+"ಮತ್ತು ಕ್ಲಿಕ್ಕಿಸಿ"
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "ಎಲ್ಲವನ್ನೂ  ತೆರವುಗೊಳಿಸಿ"
+
+#: contrib/admin/media/js/dateparse.js:26
+#: contrib/admin/media/js/calendar.js:24
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"ಜನವರಿ ಫೆಬ್ರುವರಿ ಮಾರ್ಚ್ "
+"ಎಪ್ರಿಲ್ ಮೇ ಜೂನ್ ಜುಲೈ ಆಗಸ್ಟ್ "
+"ಸೆಪ್ಟೆಂಬರ್ ನವೆಂಬರ್ ಡಿಸೆಂಬರ್"
+
+#: contrib/admin/media/js/dateparse.js:27
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr ""
+"ರವಿವಾರ ಸೋಮವಾರ ಮಂಗಳವಾರ "
+"ಬುಧವಾರ ಗುರುವಾರ ಶುಕ್ರವಾರ "
+"ಶನಿವಾರ"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "ರ ಸೋ ಮ ಬು ಗು ಶು ಶ"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "ಈಗ"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "ಗಡಿಯಾರ"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "ಸಮಯವೊಂದನ್ನು ಆರಿಸಿ"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "ಮಧ್ಯರಾತ್ರಿ"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "ಬೆಳಗಿನ ೬ ಗಂಟೆ "
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "ಮಧ್ಯಾಹ್ನ"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "ರದ್ದುಗೊಳಿಸಿ"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "ಈ ದಿನ"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "ಪಂಚಾಂಗ"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "ನಿನ್ನೆ"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "ನಾಳೆ"
diff --git a/webapp/django/conf/locale/ko/LC_MESSAGES/django.mo b/webapp/django/conf/locale/ko/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..d200157
--- /dev/null
+++ b/webapp/django/conf/locale/ko/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/ko/LC_MESSAGES/django.po b/webapp/django/conf/locale/ko/LC_MESSAGES/django.po
new file mode 100644
index 0000000..fee4895
--- /dev/null
+++ b/webapp/django/conf/locale/ko/LC_MESSAGES/django.po
@@ -0,0 +1,2797 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-04-24 12:33+0900\n"
+"PO-Revision-Date: 2007-04-06 11:04+0900\n"
+"Last-Translator: Sung-Jin Hong <serialx.net@gmail.com>\n"
+"Language-Team: Korean\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: db/models/manipulators.py:307
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(field)s 에 입력된 값은 %(type)s 의 %(object)s 에 이미 존재합니다."
+
+#: db/models/manipulators.py:308 contrib/admin/views/main.py:335
+#: contrib/admin/views/main.py:337 contrib/admin/views/main.py:339
+msgid "and"
+msgstr "또한"
+
+#: db/models/fields/__init__.py:42
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(fieldname)s 의 %(optname)s (은)는 이미 존재합니다."
+
+#: db/models/fields/__init__.py:117 db/models/fields/__init__.py:274
+#: db/models/fields/__init__.py:610 db/models/fields/__init__.py:621
+#: newforms/fields.py:80 newforms/fields.py:376 newforms/fields.py:452
+#: newforms/fields.py:463 newforms/models.py:178 oldforms/__init__.py:357
+msgid "This field is required."
+msgstr "필수 항목입니다."
+
+#: db/models/fields/__init__.py:367
+msgid "This value must be an integer."
+msgstr "정수 값을 사용하세요."
+
+#: db/models/fields/__init__.py:402
+msgid "This value must be either True or False."
+msgstr "True 또는 False 값을 사용하세요."
+
+#: db/models/fields/__init__.py:423
+msgid "This field cannot be null."
+msgstr "이 필드는 null 값은 사용할 수 없습니다. "
+
+#: db/models/fields/__init__.py:457 core/validators.py:148
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "날짜는 YYYY-MM-DD 형식으로 입력하세요."
+
+#: db/models/fields/__init__.py:526 core/validators.py:157
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "날짜/시각을 YYYY-MM-DD HH:MM 형식으로 입력하세요."
+
+#: db/models/fields/__init__.py:630
+msgid "Enter a valid filename."
+msgstr "올바른 파일명을 입력하세요."
+
+#: db/models/fields/__init__.py:751
+msgid "This value must be either None, True or False."
+msgstr "None, True 또는 False 값을 사용하세요."
+
+#: db/models/fields/related.py:53
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "올바른  %s (을)를 입력하세요."
+
+#: db/models/fields/related.py:642
+msgid "Separate multiple IDs with commas."
+msgstr "복수 ID는 콤마로 구분해 주세요."
+
+#: db/models/fields/related.py:644
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"복수 선택 시에는 \"Control\" 키를 누른 상태에서 선택해 주세요.(Mac은 "
+"\"Command\" 키)"
+
+#: db/models/fields/related.py:691
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+"올바른 %(self)s ID를 입력해 주세요. %(value)r (은)는 적절치 않습니다."
+msgstr[1] ""
+"올바른 %(self)s ID를 입력해 주세요. %(value)r (은)는 적절치 않습니다."
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "아랍어"
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "방글라데시어"
+
+#: conf/global_settings.py:41
+msgid "Catalan"
+msgstr "카탈로니아어"
+
+#: conf/global_settings.py:42
+msgid "Czech"
+msgstr "체코어"
+
+#: conf/global_settings.py:43
+msgid "Welsh"
+msgstr "웨일즈어"
+
+#: conf/global_settings.py:44
+msgid "Danish"
+msgstr "덴마크어"
+
+#: conf/global_settings.py:45
+msgid "German"
+msgstr "독일어"
+
+#: conf/global_settings.py:46
+msgid "Greek"
+msgstr "그리스어"
+
+#: conf/global_settings.py:47
+msgid "English"
+msgstr "영어"
+
+#: conf/global_settings.py:48
+msgid "Spanish"
+msgstr "스페인어"
+
+#: conf/global_settings.py:49
+msgid "Argentinean Spanish"
+msgstr "아르헨티나_스페인어"
+
+#: conf/global_settings.py:50
+msgid "Finnish"
+msgstr "핀란드어"
+
+#: conf/global_settings.py:51
+msgid "French"
+msgstr "프랑스어"
+
+#: conf/global_settings.py:52
+msgid "Galician"
+msgstr "갈리시아어"
+
+#: conf/global_settings.py:53
+msgid "Hungarian"
+msgstr "헝가리어"
+
+#: conf/global_settings.py:54
+msgid "Hebrew"
+msgstr "히브리어"
+
+#: conf/global_settings.py:55
+msgid "Icelandic"
+msgstr "아이슬란드어"
+
+#: conf/global_settings.py:56
+msgid "Italian"
+msgstr "이탈리아어"
+
+#: conf/global_settings.py:57
+msgid "Japanese"
+msgstr "일본어"
+
+#: conf/global_settings.py:58
+msgid "Korean"
+msgstr "한국어"
+
+#: conf/global_settings.py:59
+msgid "Kannada"
+msgstr "칸나다어"
+
+#: conf/global_settings.py:60
+msgid "Latvian"
+msgstr "라트비아어"
+
+#: conf/global_settings.py:61
+msgid "Macedonian"
+msgstr "마케도니아어"
+
+#: conf/global_settings.py:62
+msgid "Dutch"
+msgstr "네덜란드어"
+
+#: conf/global_settings.py:63
+msgid "Norwegian"
+msgstr "노르웨이어"
+
+#: conf/global_settings.py:64
+msgid "Polish"
+msgstr "폴란드어"
+
+#: conf/global_settings.py:65
+msgid "Portugese"
+msgstr "포르투갈어"
+
+#: conf/global_settings.py:66
+msgid "Brazilian"
+msgstr "브라질어"
+
+#: conf/global_settings.py:67
+msgid "Romanian"
+msgstr "루마니아어"
+
+#: conf/global_settings.py:68
+msgid "Russian"
+msgstr "러시아어"
+
+#: conf/global_settings.py:69
+msgid "Slovak"
+msgstr "슬로바키아어"
+
+#: conf/global_settings.py:70
+msgid "Slovenian"
+msgstr "슬로베니아어"
+
+#: conf/global_settings.py:71
+msgid "Serbian"
+msgstr "세르비아어"
+
+#: conf/global_settings.py:72
+msgid "Swedish"
+msgstr "스웨덴어"
+
+#: conf/global_settings.py:73
+msgid "Tamil"
+msgstr "타밀어"
+
+#: conf/global_settings.py:74
+msgid "Telugu"
+msgstr "텔루구어"
+
+#: conf/global_settings.py:75
+msgid "Turkish"
+msgstr "터키어"
+
+#: conf/global_settings.py:76
+msgid "Ukrainian"
+msgstr "우크라이나어"
+
+#: conf/global_settings.py:77
+msgid "Simplified Chinese"
+msgstr "중국어 간체"
+
+#: conf/global_settings.py:78
+msgid "Traditional Chinese"
+msgstr "중국어 번체"
+
+#: core/validators.py:64
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "문자, 숫자, '_'만 가능합니다."
+
+#: core/validators.py:68
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr "문자, 숫자, '_', '-', '/'만 가능합니다."
+
+#: core/validators.py:72
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "문자, 숫자, '_', '-'만 가능합니다."
+
+#: core/validators.py:76
+msgid "Uppercase letters are not allowed here."
+msgstr "대문자는 사용할 수 없습니다."
+
+#: core/validators.py:80
+msgid "Lowercase letters are not allowed here."
+msgstr "소문자는 사용할 수 없습니다."
+
+#: core/validators.py:87
+msgid "Enter only digits separated by commas."
+msgstr "콤마로 구분된 숫자만 입력하세요."
+
+#: core/validators.py:99
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "콤마로 구분된 이메일 주소만 입력하세요."
+
+#: core/validators.py:103
+msgid "Please enter a valid IP address."
+msgstr "올바른 IP 주소를 입력하세요."
+
+#: core/validators.py:107
+msgid "Empty values are not allowed here."
+msgstr "반드시 입력하세요."
+
+#: core/validators.py:111
+msgid "Non-numeric characters aren't allowed here."
+msgstr "숫자만 사용할 수 있습니다."
+
+#: core/validators.py:115
+msgid "This value can't be comprised solely of digits."
+msgstr "숫자만 사용할 수는 없습니다."
+
+#: core/validators.py:120 newforms/fields.py:128
+msgid "Enter a whole number."
+msgstr "정수를 입력하세요."
+
+#: core/validators.py:124
+msgid "Only alphabetical characters are allowed here."
+msgstr "문자만 사용할 수 있습니다."
+
+#: core/validators.py:139
+msgid "Year must be 1900 or later."
+msgstr "1900년 이후의 연도만 가능"
+
+#: core/validators.py:143
+#, python-format
+msgid "Invalid date: %s"
+msgstr "날짜가 부적절합니다.: %s"
+
+#: core/validators.py:153
+msgid "Enter a valid time in HH:MM format."
+msgstr "시각은 HH:MM 형식으로 입력하세요."
+
+#: core/validators.py:162 newforms/fields.py:271
+msgid "Enter a valid e-mail address."
+msgstr "올바른 이메일 주소를 입력하세요."
+
+#: core/validators.py:174 core/validators.py:445 oldforms/__init__.py:672
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "등록된 파일이 없습니다. 인코딩 형식을 확인하세요."
+
+#: core/validators.py:178
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"올바른 이미지를 업로드하세요.업로드하신 파일은 이미지 파일이 아니거나 파일이 "
+"깨져 있습니다."
+
+#: core/validators.py:185
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "해당 URL %s (은)는 올바른 이미지가 아닙니다."
+
+#: core/validators.py:189
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"전화번호는 xxx-xxx-xxxx 형식으로 입력하세요.  \"%s\" (은)는 부적절합니다."
+
+#: core/validators.py:197
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "해당 URL %s (은)는 올바른 QuickTime video가 아닙니다."
+
+#: core/validators.py:201
+msgid "A valid URL is required."
+msgstr "올바른 URL을 입력하세요."
+
+#: core/validators.py:215
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"올바른 HTML을 입력하세요. 오류:\n"
+"%s"
+
+#: core/validators.py:222
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "잘못된 형식의 XML: %s"
+
+#: core/validators.py:239
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "부적절한 URL: %s"
+
+#: core/validators.py:244 core/validators.py:246
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "해당 URL %s 링크가 깨졌습니다."
+
+#: core/validators.py:252
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "올바른 미국의 주의 약어를 입력하세요."
+
+#: core/validators.py:266
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "비속어/욕설입니다. %s (은)는 사용하실 수 없습니다."
+msgstr[1] "비속어/욕설입니다. %s (은)는 사용하실 수 없습니다."
+
+#: core/validators.py:273
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "이 필드는 '%s' 필드와 일치해야 합니다."
+
+#: core/validators.py:292
+msgid "Please enter something for at least one field."
+msgstr "하나 이상의 필드에 입력해 주세요."
+
+#: core/validators.py:301 core/validators.py:312
+msgid "Please enter both fields or leave them both empty."
+msgstr "양쪽 필드에 모두 입력하시거나, 모두 빈칸으로 해 주십시오."
+
+#: core/validators.py:320
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "%(field)s (이)가 %(value)s 일 경우, 이 필드에 반드시 입력해 주세요."
+
+#: core/validators.py:333
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr ""
+"%(field)s (이)가 %(value)s (이)가 아닐 경우, 이 필드에 반드시 입력해 주세요."
+
+#: core/validators.py:352
+msgid "Duplicate values are not allowed."
+msgstr "중복해서 사용할 수 없습니다."
+
+#: core/validators.py:367
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "%(lower)s 에서 %(upper)s 사이의 값을 사용해 주세요."
+
+#: core/validators.py:369
+#, python-format
+msgid "This value must be at least %s."
+msgstr "%s 이상의 값을 사용해 주세요."
+
+#: core/validators.py:371
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "%s 이하의 값을 사용해 주세요."
+
+#: core/validators.py:407
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "%s 제곱의 값을 사용해 주세요."
+
+#: core/validators.py:418
+msgid "Please enter a valid decimal number."
+msgstr "10진수를 사용해 주세요."
+
+#: core/validators.py:422
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "전체 %s 자리 이하의 10진수를 입력하세요."
+msgstr[1] "전체 %s 자리 이하의 10진수를 입력하세요."
+
+#: core/validators.py:425
+#, python-format
+msgid ""
+"Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural ""
+"Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] "정수부분이 %s 자리 이하인 10진수를 입력하세요."
+msgstr[1] "정수부분이 %s 자리 이하인 10진수를 입력하세요."
+
+#: core/validators.py:428
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "소수부분이 %s 자리 이하인 10진수를 입력하세요."
+msgstr[1] "소수부분이 %s 자리 이하인 10진수를 입력하세요."
+
+#: core/validators.py:438
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "업로드 파일은 %s bytes 이상입니다."
+
+#: core/validators.py:439
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "업로드 파일은 %s bytes 이하입니다."
+
+#: core/validators.py:456
+msgid "The format for this field is wrong."
+msgstr "이 필드의 형식이 잘못되었습니다."
+
+#: core/validators.py:471
+msgid "This field is invalid."
+msgstr "필드가 올바르지 않습니다."
+
+#: core/validators.py:507
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "%s 에서 검색된 내용이 없습니다."
+
+#: core/validators.py:510
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"URL %(url)s (이)가 부적절한 Content-Type heade '%(contenttype)s' (을)를 반환"
+"했습니다."
+
+#: core/validators.py:543
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"%(line)s 줄의 %(tag)s 태그가 닫히지 않았습니다.(시작줄 : \"%(start)s\")"
+
+#: core/validators.py:547
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"%(line)s 줄의 내용으로 시작하는 텍스트는 사용할 수 없습니다.(시작줄 : \"%"
+"(start)s\")"
+
+#: core/validators.py:552
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"%(line)s 줄의 \"%(attr)s\" (은)는 부적절한 속성입니다.(시작줄 : \"%(start)s"
+"\")"
+
+#: core/validators.py:557
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"%(line)s 줄의 \"<%(tag)s>\" (은)는 부적절한 태그입니다.(시작줄 : \"%(start)s"
+"\")"
+
+#: core/validators.py:561
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"%(line)s 줄의 태그는 하나 이상의 필수 속성이 생략되어 있습니다.(시작줄 : \"%"
+"(start)s\")"
+
+#: core/validators.py:566
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"%(line)s 줄의 \"%(attr)s\" 속성의 값이 부적절합니다.(시작줄 : \"%(start)s\")"
+
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "%(verbose_name)s (이)가 생성되었습니다."
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "%(verbose_name)s (이)가 수정되었습니다."
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "%(verbose_name)s (이)가 삭제되었습니다."
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "월요일"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "화요일"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "수요일"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "목요일"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "금요일"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "토요일"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "일요일"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "1월"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "2월"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "3월"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "4월"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "5월"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "6월"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "7월"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "8월"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "9월"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "10월"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "11월"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "12월"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr "1월"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "2월"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "3월"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "4월"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "5월"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "6월"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "7월"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "8월"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "9월"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "10월"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "11월"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "12월"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "1월"
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "2월"
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "8월"
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "9월"
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "10월"
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "11월"
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "12월"
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "년"
+msgstr[1] "년"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "월"
+msgstr[1] "월"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "주"
+msgstr[1] "주"
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "일"
+msgstr[1] "일"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "시간"
+msgstr[1] "시간"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "분"
+msgstr[1] "분"
+
+#: utils/timesince.py:40
+#, python-format
+msgid "%d milliseconds"
+msgstr "%d밀리초"
+
+#: utils/timesince.py:41
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr "%(number)d%(type)s"
+
+#: utils/timesince.py:47
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ", %(number)d%(type)s"
+
+#: utils/dateformat.py:40
+msgid "p.m."
+msgstr "오후"
+
+#: utils/dateformat.py:41
+msgid "a.m."
+msgstr "오전"
+
+#: utils/dateformat.py:46
+msgid "PM"
+msgstr "오후"
+
+#: utils/dateformat.py:47
+msgid "AM"
+msgstr "오전"
+
+#: utils/dateformat.py:95
+msgid "midnight"
+msgstr "자정"
+
+#: utils/dateformat.py:97
+msgid "noon"
+msgstr "정오"
+
+#: utils/translation/trans_real.py:358
+msgid "DATE_FORMAT"
+msgstr ""
+
+#: utils/translation/trans_real.py:359
+msgid "DATETIME_FORMAT"
+msgstr ""
+
+#: utils/translation/trans_real.py:360
+msgid "TIME_FORMAT"
+msgstr ""
+
+#: utils/translation/trans_real.py:376
+msgid "YEAR_MONTH_FORMAT"
+msgstr ""
+
+#: utils/translation/trans_real.py:377
+msgid "MONTH_DAY_FORMAT"
+msgstr ""
+
+#: newforms/fields.py:103 newforms/fields.py:256
+#, python-format
+msgid "Ensure this value has at most %d characters."
+msgstr "%d 자 이하로 입력해 주세요."
+
+#: newforms/fields.py:105 newforms/fields.py:258
+#, python-format
+msgid "Ensure this value has at least %d characters."
+msgstr "%d 자 이상 입력해 주세요."
+
+#: newforms/fields.py:130
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "%s 이하의 값을 입력해 주세요."
+
+#: newforms/fields.py:132
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "%s 이상의 값을 입력해 주세요."
+
+#: newforms/fields.py:165
+msgid "Enter a valid date."
+msgstr "올바른 날짜를 입력하세요."
+
+#: newforms/fields.py:192
+msgid "Enter a valid time."
+msgstr "올바른 시각을 입력하세요."
+
+#: newforms/fields.py:228
+msgid "Enter a valid date/time."
+msgstr "올바른 날짜/시각을 입력하세요."
+
+#: newforms/fields.py:242
+msgid "Enter a valid value."
+msgstr "올바른 값을 입력하세요."
+
+#: newforms/fields.py:289 newforms/fields.py:311
+msgid "Enter a valid URL."
+msgstr "올바른 URL을 입력하세요."
+
+#: newforms/fields.py:313
+msgid "This URL appears to be a broken link."
+msgstr "해당 URL의 링크가 잘못 되어 있습니다."
+
+#: newforms/fields.py:364 newforms/models.py:165
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "올바르게 선택해 주세요. 선택하신 것이 선택가능항목에 없습니다."
+
+#: newforms/fields.py:380 newforms/fields.py:456 newforms/models.py:182
+msgid "Enter a list of values."
+msgstr "리스트를 입력하세요."
+
+#: newforms/fields.py:389 newforms/models.py:188
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "올바르게 선택해 주세요. %s (이)가 선택가능항목에 없습니다."
+
+#: newforms/widgets.py:180 contrib/admin/filterspecs.py:150
+#: oldforms/__init__.py:577
+msgid "Unknown"
+msgstr "알 수 없습니다."
+
+#: newforms/widgets.py:180 contrib/admin/filterspecs.py:143
+#: oldforms/__init__.py:577
+msgid "Yes"
+msgstr "예"
+
+#: newforms/widgets.py:180 contrib/admin/filterspecs.py:143
+#: oldforms/__init__.py:577
+msgid "No"
+msgstr "아니오"
+
+#: contrib/contenttypes/models.py:36
+msgid "python model class name"
+msgstr "python 모델 클래스 명"
+
+#: contrib/contenttypes/models.py:39
+msgid "content type"
+msgstr "콘텐츠 타입"
+
+#: contrib/contenttypes/models.py:40
+msgid "content types"
+msgstr "콘텐츠 타입(들)"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "th"
+msgstr "번째"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "st"
+msgstr "번째"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "nd"
+msgstr "번째"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "rd"
+msgstr "번째"
+
+#: contrib/humanize/templatetags/humanize.py:47
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "(value).1f"
+msgstr[1] "(value).1f"
+
+#: contrib/humanize/templatetags/humanize.py:50
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f"
+msgstr[1] "%(value).1f"
+
+#: contrib/humanize/templatetags/humanize.py:53
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f"
+msgstr[1] "%(value).1f"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "one"
+msgstr "1"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "two"
+msgstr "2"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "three"
+msgstr "3"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "four"
+msgstr "4"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "five"
+msgstr "5"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "six"
+msgstr "6"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "seven"
+msgstr "7"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "eight"
+msgstr "8"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "nine"
+msgstr "9"
+
+#: contrib/auth/views.py:39
+msgid "Logged out"
+msgstr "로그 아웃"
+
+#: contrib/auth/models.py:38 contrib/auth/models.py:58
+msgid "name"
+msgstr "이름"
+
+#: contrib/auth/models.py:40
+msgid "codename"
+msgstr "코드명"
+
+#: contrib/auth/models.py:43
+msgid "permission"
+msgstr "허가"
+
+#: contrib/auth/models.py:44 contrib/auth/models.py:59
+msgid "permissions"
+msgstr "허가"
+
+#: contrib/auth/models.py:62
+msgid "group"
+msgstr "그룹"
+
+#: contrib/auth/models.py:63 contrib/auth/models.py:103
+msgid "groups"
+msgstr "그룹"
+
+#: contrib/auth/models.py:93
+msgid "username"
+msgstr "사용자명"
+
+#: contrib/auth/models.py:93
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr "필수항목입니다. 30자 이내로 입력하세요.(알파벳, 숫자, '_' 만 가능)"
+
+#: contrib/auth/models.py:94
+msgid "first name"
+msgstr "이름"
+
+#: contrib/auth/models.py:95
+msgid "last name"
+msgstr "성"
+
+#: contrib/auth/models.py:96
+msgid "e-mail address"
+msgstr "이메일 주소"
+
+#: contrib/auth/models.py:97
+msgid "password"
+msgstr "비밀번호"
+
+#: contrib/auth/models.py:97
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"'[algo]$[salt]$[hexdigest]' 또는 <a href=\"password/\">비밀번호 변경</a>"
+
+#: contrib/auth/models.py:98
+msgid "staff status"
+msgstr "스태프 권한"
+
+#: contrib/auth/models.py:98
+msgid "Designates whether the user can log into this admin site."
+msgstr "사용자가 관리사이트에 로그인이 가능한지를 나타냅니다."
+
+#: contrib/auth/models.py:99
+msgid "active"
+msgstr "활성"
+
+#: contrib/auth/models.py:99
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr "사용자가 'Django 관리'에 로그인이 가능한지를 나타냅니다."
+
+#: contrib/auth/models.py:100
+msgid "superuser status"
+msgstr "최상위 사용자 권한"
+
+#: contrib/auth/models.py:100
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr "해당 사용자에게 모든 권한을 허가합니다."
+
+#: contrib/auth/models.py:101
+msgid "last login"
+msgstr "마지막 로그인"
+
+#: contrib/auth/models.py:102
+msgid "date joined"
+msgstr "등록일"
+
+#: contrib/auth/models.py:104
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr "해당 사용자에게 속해있는 그룹의 모든 권한을 허가합니다."
+
+#: contrib/auth/models.py:105
+msgid "user permissions"
+msgstr "사용자 권한"
+
+#: contrib/auth/models.py:109
+msgid "user"
+msgstr "사용자"
+
+#: contrib/auth/models.py:110
+msgid "users"
+msgstr "사용자(들)"
+
+#: contrib/auth/models.py:116
+msgid "Personal info"
+msgstr "개인정보"
+
+#: contrib/auth/models.py:117
+msgid "Permissions"
+msgstr "권한"
+
+#: contrib/auth/models.py:118
+msgid "Important dates"
+msgstr "중요한 일정"
+
+#: contrib/auth/models.py:119
+msgid "Groups"
+msgstr "그룹"
+
+#: contrib/auth/models.py:263
+msgid "message"
+msgstr "메시지"
+
+#: contrib/auth/models.py:276
+#, fuzzy
+msgid "AnonymousUser"
+msgstr "익명사용자"
+
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr "비밀번호가 일치하지 않습니다."
+
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr "해당 사용자명은 이미 존재합니다."
+
+#: contrib/auth/forms.py:53
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"사용하시는 브라우저가 쿠키를 허용하지 않습니다.로그인하기 위해서는 쿠키 사용"
+"이 필요합니다."
+
+#: contrib/auth/forms.py:60 contrib/admin/views/decorators.py:10
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr "사용자명과 비밀번호를 입력하세요.(대, 소문자 구별)"
+
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "이 계정은 유효하지 않습니다."
+
+#: contrib/auth/forms.py:85
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr ""
+"이메일주소와 일치하는 사용자가 없습니다.이 이메일주소로 등록하셨습니까?"
+
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "새로운 비밀번호가 일치하지 않습니다."
+
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "기존 비밀번호를 잘못 입력하셨습니다. 다시 입력해 주세요."
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "에서 재전송"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr "도메인명을 제외한 절대경로로 입력하세요. 예: '/events/search/'"
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "(으)로 재전송"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr "절대경로와 URL('http://' 포함) 모두 가능합니다."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "재전송"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "재전송"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "오브젝트 ID"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "최근 정보"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "코멘트"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "rating #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "rating #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "rating #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "rating #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "rating #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "rating #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "rating #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "rating #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "올바른 레이팅입니다."
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "날짜/시간 확인"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "공개합니다."
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:304
+msgid "IP address"
+msgstr "IP 주소"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "삭제합니다."
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"코멘트가 부적절한 경우 체크하세요. \"코멘트가 삭제되었습니다.\" 메시지가 표시"
+"됩니다."
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "코멘트(들)"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "콘텐츠 오브젝트"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"%(user)s (이)가 %(date)s 등록\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "사용자 이름"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "IP 주소"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "스태프 승인"
+
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "프리 코멘트"
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "프리 코멘트(들)"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "스코어"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "스코어 날짜"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "카르마 스코어"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "카르마 스코어"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(user)s (이)가 %(score)d 점 부여했습니다."
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"%(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "플래그 날짜"
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "사용자 플래그"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "사용자 플래그"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "%r (으)로 플래그"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "삭제일"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr ""
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr ""
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr ""
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "미등록 사용자는 투표할 수 없습니다."
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "코멘트 ID가 부적절합니다."
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "자신이 직접 투표할 수 없습니다."
+
+#: contrib/comments/views/comments.py:27
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr "다른 레이팅을 입력했을 경우, 이 레이팅은 필히 입력하셔야 합니다."
+
+#: contrib/comments/views/comments.py:111
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"이 코멘트를 작성한 사용자의 코멘트 포스팅은 %(count)s 번 이하입니다.:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"이 코멘트를 작성한 사용자의 코멘트 포스팅은 %(count)s 번 이하입니다.:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:116
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"이 코멘트는 알수 없는 사용자가 작성했습니다.:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:188
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "POST만 가능합니다."
+
+#: contrib/comments/views/comments.py:192
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "하나 이상의 필수항목이 누락되었습니다."
+
+#: contrib/comments/views/comments.py:196
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "해당 코멘트가 누군가에 의해 변경되었습니다."
+
+#: contrib/comments/views/comments.py:206
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"'target' 파라미터가 코멘트 폼에 적합하지 않습니다.오브젝트 ID가 부적절합니다."
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "해당 코멘트 폼은 '미리보기'와 'post' 기능을 제공하지 않습니다."
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "이름:"
+
+#: contrib/comments/templates/comments/freeform.html:5
+#: contrib/comments/templates/comments/form.html:28
+msgid "Comment:"
+msgstr "코멘트:"
+
+#: contrib/comments/templates/comments/freeform.html:10
+#: contrib/comments/templates/comments/form.html:35
+msgid "Preview comment"
+msgstr "코멘트 미리보기"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "사용자명"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr "로그아웃"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "비밀번호"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "비밀번호를 잊으셨습니까?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "레이팅"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "필수항목"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "옵션"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "사진 등록"
+
+#: contrib/flatpages/models.py:7 contrib/admin/views/doc.py:315
+msgid "URL"
+msgstr "URL"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr "앞, 뒤에 슬래시(/)를 넣으세요. 예:'/about/contact/' "
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "제목"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "내용"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "사용 가능한 코멘트"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "템플릿명"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"예: 'flatpages/contact_page.html' 를 사용할 수 없는 경우 시스템이 'flatpages/"
+"default.html' (을)를 사용합니다."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "등록하세요."
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "체크할 경우, 로그인 사용자만 해당 페이지를 볼 수 있습니다."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "플랫 페이지"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "플랫 페이지(들)"
+
+#: contrib/sessions/models.py:68
+msgid "session key"
+msgstr "세션 키"
+
+#: contrib/sessions/models.py:69
+msgid "session data"
+msgstr "세션 날짜"
+
+#: contrib/sessions/models.py:70
+msgid "expire date"
+msgstr "유효날짜"
+
+#: contrib/sessions/models.py:74
+msgid "session"
+msgstr "세션"
+
+#: contrib/sessions/models.py:75
+msgid "sessions"
+msgstr "세션"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "도메인 명"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "표시명"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "사이트"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "사이트(들)"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>%s(으)로:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169
+msgid "All"
+msgstr "모두"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "언제나"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "오늘"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "지난 7일"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "이번 달"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "이번 해"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "액션 타임"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "오브젝트 아이디"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "오브젝트 표현"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "액션 플래그"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "메시지 변경"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "로그 엔트리"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "로그 엔트리"
+
+#: contrib/admin/templatetags/admin_list.py:247
+msgid "All dates"
+msgstr "언제나"
+
+#: contrib/admin/views/decorators.py:24
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "로그인"
+
+#: contrib/admin/views/decorators.py:62
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr "로그인 세션이 끊겼습니다. 다시 로그인 하세요."
+
+#: contrib/admin/views/decorators.py:69
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"사용하시는 브라우저가 쿠키 사용을 허가하고 있지 않습니다.쿠키 사용을 체크하시"
+"고 다시 시도해 주세요."
+
+#: contrib/admin/views/decorators.py:83
+msgid "Usernames cannot contain the '@' character."
+msgstr "사용자명에는 '@'을 사용할 수 없습니다."
+
+#: contrib/admin/views/decorators.py:85
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "이메일 주소와 사용자명은 다릅니다. '%s'를 사용하세요."
+
+#: contrib/admin/views/auth.py:19 contrib/admin/views/main.py:257
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" (이)가 추가되었습니다."
+
+#: contrib/admin/views/auth.py:24 contrib/admin/views/main.py:261
+#: contrib/admin/views/main.py:347
+msgid "You may edit it again below."
+msgstr "계속해서 편집하실 수 있습니다."
+
+#: contrib/admin/views/auth.py:30
+msgid "Add user"
+msgstr "사용자 추가"
+
+#: contrib/admin/views/auth.py:57
+msgid "Password changed successfully."
+msgstr "비밀번호가 변경되었습니다."
+
+#: contrib/admin/views/auth.py:64
+#, python-format
+msgid "Change password: %s"
+msgstr "비밀번호 변경: %s"
+
+#: contrib/admin/views/main.py:223
+msgid "Site administration"
+msgstr "사이트 관리"
+
+#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356
+#, python-format
+msgid "You may add another %s below."
+msgstr "계속해서 다른 %s (을)를 추가하세요."
+
+#: contrib/admin/views/main.py:289
+#, python-format
+msgid "Add %s"
+msgstr "%s 추가"
+
+#: contrib/admin/views/main.py:335
+#, python-format
+msgid "Added %s."
+msgstr "%s (이)가 추가되었습니다."
+
+#: contrib/admin/views/main.py:337
+#, python-format
+msgid "Changed %s."
+msgstr "%s (이)가 변경되었습니다."
+
+#: contrib/admin/views/main.py:339
+#, python-format
+msgid "Deleted %s."
+msgstr "%s (이)가 삭제되었습니다."
+
+#: contrib/admin/views/main.py:342
+msgid "No fields changed."
+msgstr "변경된 필드가 없습니다."
+
+#: contrib/admin/views/main.py:345
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" (이)가 변경되었습니다."
+
+#: contrib/admin/views/main.py:353
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" (이)가 추가되었습니다. 계속해서 편집하세요."
+
+#: contrib/admin/views/main.py:391
+#, python-format
+msgid "Change %s"
+msgstr "%s 변경"
+
+#: contrib/admin/views/main.py:476
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "%(name)s 에 %(fieldname)s (이)가 하나 이상 있는 %(obj)s"
+
+#: contrib/admin/views/main.py:481
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "%(name)s 에 %(fieldname)s (이)가 하나 이상 있는"
+
+#: contrib/admin/views/main.py:514
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" (이)가 삭제되었습니다."
+
+#: contrib/admin/views/main.py:517
+msgid "Are you sure?"
+msgstr "확실합니까?"
+
+#: contrib/admin/views/main.py:539
+#, python-format
+msgid "Change history: %s"
+msgstr "변경 히스토리: %s"
+
+#: contrib/admin/views/main.py:573
+#, python-format
+msgid "Select %s"
+msgstr "%s 선택"
+
+#: contrib/admin/views/main.py:573
+#, python-format
+msgid "Select %s to change"
+msgstr "변경할 %s 선택"
+
+#: contrib/admin/views/main.py:768
+msgid "Database error"
+msgstr "데이터베이스 오류"
+
+#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48
+#: contrib/admin/views/doc.py:50
+msgid "tag:"
+msgstr "태그:"
+
+#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79
+#: contrib/admin/views/doc.py:81
+msgid "filter:"
+msgstr "필터:"
+
+#: contrib/admin/views/doc.py:135 contrib/admin/views/doc.py:137
+#: contrib/admin/views/doc.py:139
+msgid "view:"
+msgstr "뷰:"
+
+#: contrib/admin/views/doc.py:164
+#, python-format
+msgid "App %r not found"
+msgstr "어플리케이션 %r (이)가 없습니다."
+
+#: contrib/admin/views/doc.py:171
+#, python-format
+msgid "Model %(name)r not found in app %(label)r"
+msgstr "모델 %(name)r (이)가 어플리케이션 %(label)r 에 없습니다."
+
+#: contrib/admin/views/doc.py:183
+#, python-format
+msgid "the related `%(label)s.%(type)s` object"
+msgstr "`%(label)s.%(type)s` 관련 오브젝트"
+
+#: contrib/admin/views/doc.py:183 contrib/admin/views/doc.py:205
+#: contrib/admin/views/doc.py:219 contrib/admin/views/doc.py:224
+msgid "model:"
+msgstr "모델:"
+
+#: contrib/admin/views/doc.py:214
+#, python-format
+msgid "related `%(label)s.%(name)s` objects"
+msgstr "`%(label)s.%(name)s` 관련 오브젝트(들)"
+
+#: contrib/admin/views/doc.py:219
+#, python-format
+msgid "all %s"
+msgstr "모든 %s"
+
+#: contrib/admin/views/doc.py:224
+#, python-format
+msgid "number of %s"
+msgstr "%s 의 수"
+
+#: contrib/admin/views/doc.py:229
+#, python-format
+msgid "Fields on %s objects"
+msgstr "%s 오브젝트의 필드"
+
+#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:301
+#: contrib/admin/views/doc.py:303 contrib/admin/views/doc.py:309
+#: contrib/admin/views/doc.py:310 contrib/admin/views/doc.py:312
+msgid "Integer"
+msgstr "정수"
+
+#: contrib/admin/views/doc.py:292
+msgid "Boolean (Either True or False)"
+msgstr "boolean(참 또는 거짓)"
+
+#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:311
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "문자열(%(maxlength)s 까지)"
+
+#: contrib/admin/views/doc.py:294
+msgid "Comma-separated integers"
+msgstr "정수(콤마로 구분)"
+
+#: contrib/admin/views/doc.py:295
+msgid "Date (without time)"
+msgstr "날짜(시간 제외)"
+
+#: contrib/admin/views/doc.py:296
+msgid "Date (with time)"
+msgstr "날짜(시간 포함)"
+
+#: contrib/admin/views/doc.py:297
+msgid "E-mail address"
+msgstr "이메일 주소"
+
+#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:299
+#: contrib/admin/views/doc.py:302
+msgid "File path"
+msgstr "파일 경로"
+
+#: contrib/admin/views/doc.py:300
+msgid "Decimal number"
+msgstr "10진수"
+
+#: contrib/admin/views/doc.py:306
+msgid "Boolean (Either True, False or None)"
+msgstr "boolean (참, 거짓 또는 none)"
+
+#: contrib/admin/views/doc.py:307
+msgid "Relation to parent model"
+msgstr "부모(상위) 모델과 연계"
+
+#: contrib/admin/views/doc.py:308
+msgid "Phone number"
+msgstr "전화번호"
+
+#: contrib/admin/views/doc.py:313
+msgid "Text"
+msgstr "텍스트"
+
+#: contrib/admin/views/doc.py:314
+msgid "Time"
+msgstr "시각"
+
+#: contrib/admin/views/doc.py:316
+msgid "U.S. state (two uppercase letters)"
+msgstr "미국의 주 (두개의 대문자로)"
+
+#: contrib/admin/views/doc.py:317
+msgid "XML text"
+msgstr "XML 텍스트"
+
+#: contrib/admin/views/doc.py:343
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s (은)는 url 패턴의 오브젝트가 아닙니다."
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "현재:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "변경:"
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "날짜:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "시각:"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "문서"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin/auth/user/change_password.html:15
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "비밀번호 변경"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/auth/user/change_password.html:12
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "홈"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "History"
+msgstr "히스토리"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "날짜/시간"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "사용자"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "액션"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "년/월/일 시:분:초"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"오브젝트에 변경사항이 없습니다.이 admin 사이트를 통해 추가된 사항이 아닙니다."
+
+#: contrib/admin/templates/admin/change_list.html:12
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s 추가"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "%(filter_title)s (으)로"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "서버 오류"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "서버 오류 (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "서버 오류 <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"오류가 발생했습니다. 사이트 관리자에게 이메일로 에러를 보고 했습니다.조속히 "
+"수정하도록 하겠습니다. 고맙습니다."
+
+#: contrib/admin/templates/admin/invalid_setup.html:8
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"데이터베이스 설정에 문제가 발생했습니다. 해당 데이터베이스 테이블이 생성되었"
+"는지,해당 유저가 데이터베이스를 읽어 들일 수 있는지 확인하세요."
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "실행"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1건"
+msgstr[1] "%(counter)s 건"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "모두 %(full_result_count)s 건"
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "모두 표시"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django 사이트 관리"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django 관리"
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "필터"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "해당 페이지가 없습니다."
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "죄송합니다, 요청하신 페이지를 찾을 수 없습니다."
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "%(name)s 어플리케이션으로 이용 가능한 모델"
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "추가"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "변경"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "수정할 권한이 없습니다."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "최근 액션"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "나의 액션"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "이용할 수 없습니다."
+
+#: contrib/admin/templates/admin/change_form.html:22
+msgid "View on site"
+msgstr "사이트에서 보기"
+
+#: contrib/admin/templates/admin/change_form.html:32
+#: contrib/admin/templates/admin/auth/user/change_password.html:24
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "아래의 오류를 수정해 주세요."
+msgstr[1] "아래의 오류들을 수정해 주세요."
+
+#: contrib/admin/templates/admin/change_form.html:50
+msgid "Ordering"
+msgstr "순서"
+
+#: contrib/admin/templates/admin/change_form.html:53
+msgid "Order:"
+msgstr "순서:"
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "환영합니다,"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "삭제"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"%(object_name)s \"%(escaped_object)s\" (을)를 삭제하면서관련 오브젝트를 제거"
+"하고자 했으나, 지금 사용하시는 계정은 다음 타입의 오브젝트를 제거할 권한이 없"
+"습니다. :"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"정말로 %(object_name)s \"%(escaped_object)s\" (을)를 삭제하시겠습니까?다음의 "
+"관련 아이템들이 모두 삭제됩니다. :"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "네, 확실합니다."
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "새로 저장"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "저장 및 다른 이름으로 추가"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "저장 및 편집 계속"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "저장"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:28
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "<strong>%(username)s</strong> 새로운 비밀번호를 입력하세요."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:34
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+msgid "Password"
+msgstr "비밀번호"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+msgid "Password (again)"
+msgstr "비밀번호 (확인)"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+msgid "Enter the same password as above, for verification."
+msgstr "확인을 위해 위와 동일한 비밀번호를 입력하세요. "
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"사용자명와 비밀번호를 입력하세요.더 많은 사용자 옵션을 사용하실 수 있습니다."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "사용자명"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "비밀번호 변경"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "비밀번호를 변경하였습니다."
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "비밀번호가 변경되었습니다."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "비밀번호 초기화"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"비밀번호를 잊으셨나요? 아래에 비밀번호를 입력하시면비밀전호를 초기화 한 후, "
+"새로운 비밀번호를 보내드리겠습니다."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "이메일 주소:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "비밀번호 초기화"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "사이트를 이용해 주셔서 고맙습니다."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "다시 로그인하기"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "비밀번호가 초기화 되었습니다."
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr "새로운 비밀번호를 등록하신 이메일로 보내드렸습니다."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"보안상 필요하오니 기존에 사용하시던 비밀번호를 입력해 주세요.새로운 비밀번호"
+"는 정확히 입력했는지 확인할 수 있도록 두 번 입력하시기 바랍니다."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "기존 비밀번호:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "새로운 비밀번호:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "새로운 비밀번호(확인):"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "비밀번호 변경"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "비밀번호가 초기화 되었음을 알려드립니다."
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "%(site_name)s 의 사용자 비밀번호가 초기화 되었습니다."
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "새로운 비밀번호는 %(new_password)s 입니다."
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "해당 페이지에서 언제든지 비밀번호 변경이 가능합니다."
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "사용자명:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "사이트를 이용해 주셔서 고맙습니다."
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s 팀"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "북마크릿"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "문서 북마크릿"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\"> 북마크릿을 설치하시려면 링크를 북마크 툴바로 드래그 하거"
+"나,\n"
+"오른쪽 클릭으로 해당 링크를 북마크에 추가하세요.\n"
+"이제 사이트 내의 모든 페이지에서 북마크릿 선택이 가능합니다.\n"
+"북마크릿에 따라 내부 네트워크 상의 컴퓨터로부터 이 사이트를 참조해야하는 경우"
+"가 있습니다.\n"
+"(내부 네트워크가 있는지 불명확한 경우 시스템 관리자에게 확인하시기 바랍니다.)"
+"</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "이 페이지의 문서"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr "각 페이지로에서 해당 페이지를 생성한 뷰의 문서로 갑니다."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "오브젝트 아이디 표시"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr "단일 오브젝트 페이지의 고유 아이디와 컨텐츠 타입을 표시합니다."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "오브젝트 편집(현재 창)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "단일 오브젝트 페이지의 관리 페이지로 이동"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "오브젝트 편집(새로운 창)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "위와 동일하며, 새로운 창에서 관리 페이지를 엽니다."
+
+#: contrib/localflavor/au/forms.py:18
+#, 
+msgid "Enter a 4 digit post code."
+msgstr "우편번호를 입력하세요. (xxxx)"
+
+#: contrib/localflavor/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
+msgstr "우편번호를 입력하세요. (xxx xxx)"
+
+#: contrib/localflavor/fr/forms.py:17 contrib/localflavor/fi/forms.py:14
+#: contrib/localflavor/de/forms.py:16
+msgid "Enter a zip code in the format XXXXX."
+msgstr "우편번호를 입력하세요.(xxx xxx)"
+
+#: contrib/localflavor/jp/forms.py:21
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "우변번호를 입력하세요.(xxxxxx 또는 xxx-xxx)"
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr ""
+
+#: contrib/localflavor/it/forms.py:16
+#, 
+msgid "Enter a valid zip code."
+msgstr "올바른 우편번호를 입력하세요."
+
+#: contrib/localflavor/it/forms.py:41
+#, 
+msgid "Enter a valid Social Security number."
+msgstr "올바른 Social Security number를 입력하세요."
+
+#: contrib/localflavor/it/forms.py:68
+#, 
+msgid "Enter a valid VAT number."
+msgstr "올바른 VAT번호를 입력하세요."
+
+#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:45
+#, 
+msgid "Enter a valid Finnish social security number."
+msgstr "올바른 핀란드 Social Security number를 입력하세요."
+
+#: contrib/localflavor/br/forms.py:18
+#, 
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "우편번호는 XXXXX-XXX 형식으로 입력하세요."
+
+#: contrib/localflavor/br/forms.py:30
+#, fuzzy
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr ""
+"전화번호는 xx-xxxx-xxxx 형식으로 입력하세요."
+
+#: contrib/localflavor/no/forms.py:15
+#, fuzzy
+msgid "Enter a zip code in the format XXXX."
+msgstr "우편번호를 입력하세요.(xxx xxx)"
+
+#: contrib/localflavor/no/forms.py:36
+#, fuzzy
+msgid "Enter a valid Norwegian social security number."
+msgstr "10진수를 사용해 주세요."
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:7
+#, fuzzy
+msgid "Berlin"
+msgstr "브라질어"
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:11
+#, fuzzy
+msgid "Hessen"
+msgstr "메시지"
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:16
+#, fuzzy
+msgid "Saarland"
+msgstr "카탈로니아어"
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr ""
+
+#: contrib/localflavor/de/forms.py:60
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr ""
+
+#: contrib/localflavor/us/forms.py:18
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "우변번호를 입력하세요.(xxxxxx 또는 xxx-xxx)"
+
+#: contrib/localflavor/us/forms.py:51
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr ""
+
+#: template/defaultfilters.py:491
+msgid "yes,no,maybe"
+msgstr "예, 아니오, 아마도"
+
+#: template/defaultfilters.py:520
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: template/defaultfilters.py:522
+#, python-format
+msgid "%.1f KB"
+msgstr ""
+
+#: template/defaultfilters.py:524
+#, python-format
+msgid "%.1f MB"
+msgstr ""
+
+#: template/defaultfilters.py:525
+#, python-format
+msgid "%.1f GB"
+msgstr ""
+
+#: oldforms/__init__.py:392
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "%s 자 이하로 입력해 주세요."
+msgstr[1] "%s 자 이하로 입력해 주세요."
+
+#: oldforms/__init__.py:397
+msgid "Line breaks are not allowed here."
+msgstr "줄바꿈이 허용되지 않습니다."
+
+#: oldforms/__init__.py:498 oldforms/__init__.py:571 oldforms/__init__.py:610
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "올바르게 선택해 주세요. '%(data)s' (이)가 %(choices)s 에 없습니다."
+
+#: oldforms/__init__.py:674
+msgid "The submitted file is empty."
+msgstr "입력하신 파일은 빈 파일입니다."
+
+#: oldforms/__init__.py:730
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "-32,768 ~ 32,767 사이의 정수를 입력하세요."
+
+#: oldforms/__init__.py:740
+msgid "Enter a positive number."
+msgstr "양수를 입력하세요."
+
+#: oldforms/__init__.py:750
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "0 ~ 32,767 사이의 정수를 입력하세요."
diff --git a/webapp/django/conf/locale/ko/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/ko/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..cdc19a1
--- /dev/null
+++ b/webapp/django/conf/locale/ko/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/ko/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/ko/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..fe1c7a4
--- /dev/null
+++ b/webapp/django/conf/locale/ko/LC_MESSAGES/djangojs.po
@@ -0,0 +1,118 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-04-06 11:10+0900\n"
+"PO-Revision-Date: 2007-04-06 11:15+0900\n"
+"Last-Translator: Hyun Mi Ae <happyhyun@gmail.com>\n"
+"Language-Team: Korean\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/calendar.js:24
+#: contrib/admin/media/js/dateparse.js:32
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr "1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "일 월 화 수 목 금 토"
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "일요일 월요일 화요일 수요일 목요일 금요일 토요일"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "이용 가능한 %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "모두 선택"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "추가"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "삭제"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "선택된 %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "선택한 후 클릭하세요"
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "모두 삭제"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr "보기"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr "감추기"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Now"
+msgstr "현재"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
+msgid "Clock"
+msgstr "시계"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
+msgid "Choose a time"
+msgstr "시간 선택"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "Midnight"
+msgstr "자정"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "6 a.m."
+msgstr "오전 6시"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
+msgid "Noon"
+msgstr "정오"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
+msgid "Cancel"
+msgstr "취소"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
+msgid "Today"
+msgstr "오늘"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
+msgid "Calendar"
+msgstr "달력"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
+msgid "Yesterday"
+msgstr "어제"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
+msgid "Tomorrow"
+msgstr "내일"
diff --git a/webapp/django/conf/locale/lt/LC_MESSAGES/django.mo b/webapp/django/conf/locale/lt/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..3d42827
--- /dev/null
+++ b/webapp/django/conf/locale/lt/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/lt/LC_MESSAGES/django.po b/webapp/django/conf/locale/lt/LC_MESSAGES/django.po
new file mode 100644
index 0000000..d855d87
--- /dev/null
+++ b/webapp/django/conf/locale/lt/LC_MESSAGES/django.po
@@ -0,0 +1,2868 @@
+# Lithuanian translation of Django.
+# Copyright (C) 2008 The Django Software Foundation
+# This file is distributed under the same license as the Django package.
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-06-15 23:03+0300\n"
+"PO-Revision-Date: 2008-06-18 22:37+0200\n"
+"Last-Translator: Rapolas Kaselis <rapolas@gmail.com>\n"
+"Language-Team: Django-i18n <django-i18n@googlegroups.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: oldforms/__init__.py:357
+#: db/models/fields/__init__.py:117
+#: db/models/fields/__init__.py:274
+#: db/models/fields/__init__.py:612
+#: db/models/fields/__init__.py:623
+#: newforms/models.py:178
+#: newforms/fields.py:80
+#: newforms/fields.py:376
+#: newforms/fields.py:452
+#: newforms/fields.py:463
+msgid "This field is required."
+msgstr "Šis laukas yra privalomas."
+
+#: oldforms/__init__.py:392
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Įsitikink, kad tavo tekstas turi mažiau nei %s simbolį."
+msgstr[1] "Įsitikink, kad tavo tekstas turi mažiau nei %s simbolių."
+
+#: oldforms/__init__.py:397
+msgid "Line breaks are not allowed here."
+msgstr "Nauja eilutė nėra leidžiama."
+
+#: oldforms/__init__.py:498
+#: oldforms/__init__.py:571
+#: oldforms/__init__.py:610
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Pasirink gerą variantą; '%(data)s' nėra tarp %(choices)s."
+
+#: oldforms/__init__.py:577
+#: newforms/widgets.py:180
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "Nežinomas"
+
+#: oldforms/__init__.py:577
+#: newforms/widgets.py:180
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Taip"
+
+#: oldforms/__init__.py:577
+#: newforms/widgets.py:180
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "Ne"
+
+#: oldforms/__init__.py:672
+#: core/validators.py:174
+#: core/validators.py:445
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Failas nebuvo nurodytas. Patikrink formos koduotę."
+
+#: oldforms/__init__.py:674
+msgid "The submitted file is empty."
+msgstr "Nurodytas failas yra tuščias"
+
+#: oldforms/__init__.py:730
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Įvesk sveiką skaičių nuo -32,768 iki 32,767."
+
+#: oldforms/__init__.py:740
+msgid "Enter a positive number."
+msgstr "Įvesk teigiamą skaičių."
+
+#: oldforms/__init__.py:750
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Įvesk sveiką skaičių nuo 0 iki 32,767."
+
+#: db/models/manipulators.py:307
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(object)s su šiuo %(type)s jau egzistuoja duotuose %(field)s."
+
+#: db/models/manipulators.py:308
+#: contrib/admin/views/main.py:335
+#: contrib/admin/views/main.py:337
+#: contrib/admin/views/main.py:339
+msgid "and"
+msgstr "ir"
+
+#: db/models/fields/__init__.py:42
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s su šiuo %(fieldname)s jau egzistuoja."
+
+#: db/models/fields/__init__.py:369
+msgid "This value must be an integer."
+msgstr "Ši reikšme turi būti sveikas skaičius."
+
+#: db/models/fields/__init__.py:404
+msgid "This value must be either True or False."
+msgstr "Ši reikšmė turi būti True arba False."
+
+#: db/models/fields/__init__.py:425
+msgid "This field cannot be null."
+msgstr "Šis laukas negali būti null"
+
+#: db/models/fields/__init__.py:459
+#: core/validators.py:148
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Įvesk tinkamą datą YYYY-MM-DD formatu."
+
+#: db/models/fields/__init__.py:528
+#: core/validators.py:157
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Įvesk tinkamą datą/laiką YYYY-MM-DD HH:MM formatu."
+
+#: db/models/fields/__init__.py:632
+msgid "Enter a valid filename."
+msgstr "Įvesk tinkamą failo vardą."
+
+#: db/models/fields/__init__.py:753
+msgid "This value must be either None, True or False."
+msgstr "Ši reikšmė turi būti viena iš None, True arba False."
+
+#: db/models/fields/related.py:53
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Įveskite tinkamą %s"
+
+#: db/models/fields/related.py:642
+msgid "Separate multiple IDs with commas."
+msgstr "Atskirkite skirtingus ID su kableliu."
+
+#: db/models/fields/related.py:644
+msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "Paspausk ir laikyk \"Control\", arba \"Command\" Mac'uose, kad pasirinkti daugiau nei vieną."
+
+#: db/models/fields/related.py:691
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural "Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "Įveskite tinkamą %(self)s ID. Reikšmė %(value)r yra netinkama."
+msgstr[1] "Įveskite tinkamą %(self)s ID. Reikšmės %(value)r yra netinkamos."
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "Arabų"
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "Bengalų"
+
+#: conf/global_settings.py:41
+msgid "Catalan"
+msgstr "Katalonų"
+
+#: conf/global_settings.py:42
+msgid "Czech"
+msgstr "Čekų"
+
+#: conf/global_settings.py:43
+msgid "Welsh"
+msgstr "Velso"
+
+#: conf/global_settings.py:44
+msgid "Danish"
+msgstr "Danų"
+
+#: conf/global_settings.py:45
+msgid "German"
+msgstr "Vokiečių"
+
+#: conf/global_settings.py:46
+msgid "Greek"
+msgstr "Graikų"
+
+#: conf/global_settings.py:47
+msgid "English"
+msgstr "Anglų"
+
+#: conf/global_settings.py:48
+msgid "Spanish"
+msgstr "Ispanų"
+
+#: conf/global_settings.py:49
+msgid "Argentinean Spanish"
+msgstr "Argentinos Ispanų"
+
+#: conf/global_settings.py:50
+msgid "Finnish"
+msgstr "Suomių"
+
+#: conf/global_settings.py:51
+msgid "French"
+msgstr "Prancūzų"
+
+#: conf/global_settings.py:52
+msgid "Galician"
+msgstr "Galų"
+
+#: conf/global_settings.py:53
+msgid "Hungarian"
+msgstr "Vengrų"
+
+#: conf/global_settings.py:54
+msgid "Hebrew"
+msgstr "Hebrajų"
+
+#: conf/global_settings.py:55
+msgid "Icelandic"
+msgstr "Islandų"
+
+#: conf/global_settings.py:56
+msgid "Italian"
+msgstr "Italų"
+
+#: conf/global_settings.py:57
+msgid "Japanese"
+msgstr "Japonų"
+
+#: conf/global_settings.py:58
+msgid "Korean"
+msgstr "Korėjiečių"
+
+#: conf/global_settings.py:59
+msgid "Kannada"
+msgstr "Dravidų"
+
+#: conf/global_settings.py:60
+msgid "Latvian"
+msgstr "Latvių"
+
+#: conf/global_settings.py:61
+msgid "Macedonian"
+msgstr "Makedonų"
+
+#: conf/global_settings.py:62
+msgid "Dutch"
+msgstr "Olandų"
+
+#: conf/global_settings.py:63
+msgid "Norwegian"
+msgstr "Norvegų"
+
+#: conf/global_settings.py:64
+msgid "Polish"
+msgstr "Lenkų"
+
+#: conf/global_settings.py:65
+msgid "Portugese"
+msgstr "Portugalų"
+
+#: conf/global_settings.py:66
+msgid "Brazilian"
+msgstr "Brazilų"
+
+#: conf/global_settings.py:67
+msgid "Romanian"
+msgstr "Rumunų"
+
+#: conf/global_settings.py:68
+msgid "Russian"
+msgstr "Rusų"
+
+#: conf/global_settings.py:69
+msgid "Slovak"
+msgstr "Slovakų"
+
+#: conf/global_settings.py:70
+msgid "Slovenian"
+msgstr "Slovėnų"
+
+#: conf/global_settings.py:71
+msgid "Serbian"
+msgstr "Serbų"
+
+#: conf/global_settings.py:72
+msgid "Swedish"
+msgstr "Švedų"
+
+#: conf/global_settings.py:73
+msgid "Tamil"
+msgstr "Tamilų"
+
+#: conf/global_settings.py:74
+msgid "Telugu"
+msgstr "Telugų"
+
+#: conf/global_settings.py:75
+msgid "Turkish"
+msgstr "Turkų"
+
+#: conf/global_settings.py:76
+msgid "Ukrainian"
+msgstr "Ukrainiečių"
+
+#: conf/global_settings.py:77
+msgid "Simplified Chinese"
+msgstr "Supaprastinta kinų"
+
+#: conf/global_settings.py:78
+msgid "Traditional Chinese"
+msgstr "Tradicinė kinų"
+
+#: core/validators.py:64
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Ši reikšmė gali būti sudaryta tik iš raidžių, skaičių ir pabraukimų."
+
+#: core/validators.py:68
+msgid "This value must contain only letters, numbers, underscores, dashes or slashes."
+msgstr "Ši reikšmė gali būti sudaryta tik iš raidžių, skaičių, pabraukimų, brūkšnių ir/arba pasvirų brūkšnių."
+
+#: core/validators.py:72
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "Ši reikšmė gali būti sudaryta tik iš raidžių, skaičių, pabraukimų arba brūkšnelių."
+
+#: core/validators.py:76
+msgid "Uppercase letters are not allowed here."
+msgstr "Didžiosios raidės nėra leidžiamos."
+
+#: core/validators.py:80
+msgid "Lowercase letters are not allowed here."
+msgstr "Mažosios raidės nėra leidžiamos."
+
+#: core/validators.py:87
+msgid "Enter only digits separated by commas."
+msgstr "Įvesk skaitmenis atskirtus kableliais."
+
+#: core/validators.py:99
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Įvesk tinkamus e-mailus atskirtus kableliais."
+
+#: core/validators.py:103
+msgid "Please enter a valid IP address."
+msgstr "Įveskt tinkamą IP adresą."
+
+#: core/validators.py:107
+msgid "Empty values are not allowed here."
+msgstr "Tuščios reikšmės neleidžiamos."
+
+#: core/validators.py:111
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Ne skaičius neleidžiamas čia."
+
+#: core/validators.py:115
+msgid "This value can't be comprised solely of digits."
+msgstr "Ši reikšmė negali būti sudaryta vientik iš skaičių."
+
+#: core/validators.py:120
+#: newforms/fields.py:128
+msgid "Enter a whole number."
+msgstr "Įvesk sveiką skaičių."
+
+#: core/validators.py:124
+msgid "Only alphabetical characters are allowed here."
+msgstr "Tik alfabetiniai simboliai leidžiami."
+
+#: core/validators.py:139
+msgid "Year must be 1900 or later."
+msgstr "Metai turi būti 1900 arba vėlesni."
+
+#: core/validators.py:143
+#, python-format
+msgid "Invalid date: %s"
+msgstr "Netinkama data: %s"
+
+#: core/validators.py:153
+msgid "Enter a valid time in HH:MM format."
+msgstr "Įvesk tinkamą laiką HH:MM formatu"
+
+#: core/validators.py:162
+#: newforms/fields.py:271
+msgid "Enter a valid e-mail address."
+msgstr "Įvesk tinkamą e-mailą."
+
+#: core/validators.py:178
+msgid "Upload a valid image. The file you uploaded was either not an image or a corrupted image."
+msgstr "Atsiųsk tinkamą paveiksliuką. Failas, kurį siuntei buvo arba ne paveiksliukas, arba sugadintas paveiksliukas"
+
+#: core/validators.py:185
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "URL %s nenurodo tinkamo paveiksliuko."
+
+#: core/validators.py:189
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "Telefono numeris turi būti XXX-XXX-XXXX formatu. \"%s\" yra netinkamas."
+
+#: core/validators.py:197
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "URL %s nenurodo tinkamo QuickTime video."
+
+#: core/validators.py:201
+msgid "A valid URL is required."
+msgstr "Tinkamas URL privalomas."
+
+#: core/validators.py:215
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Tinkamas HTML privalomas. Klaidos:\n"
+"%s"
+
+#: core/validators.py:222
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Blogai suformuotas XML: %s"
+
+#: core/validators.py:239
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Netinkamas URL: %s"
+
+#: core/validators.py:244
+#: core/validators.py:246
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "URL %s yra neveikiantis."
+
+#: core/validators.py:252
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Įvesk tinkamą JAV valstijos sutrumpinimą."
+
+#: core/validators.py:266
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Kontroliuok liežuvį! %s neleidžiamas."
+msgstr[1] "Kontroliuok liežuvį! %s neleidžiami."
+
+#: core/validators.py:273
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Šis laukas turi atitikti %s lauką."
+
+#: core/validators.py:292
+msgid "Please enter something for at least one field."
+msgstr "Nors vienam lauke kažką reikia įvesti."
+
+#: core/validators.py:301
+#: core/validators.py:312
+msgid "Please enter both fields or leave them both empty."
+msgstr "Įveskite abu laukus arba abu palikite tuščius."
+
+#: core/validators.py:320
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Šis laukas turi būti užpildytas, jei %(field)s yra %(value)s"
+
+#: core/validators.py:333
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Šis laukas turi būti užpildytas, jei %(field)s nėra %(value)s"
+
+#: core/validators.py:352
+msgid "Duplicate values are not allowed."
+msgstr "Vienodos reikšmės neleidžiamos."
+
+#: core/validators.py:367
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Ši reikšmė turi būti tarp %(lower)s ir %(upper)s."
+
+#: core/validators.py:369
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Ši reikšme mažiausiai turi būti %s."
+
+#: core/validators.py:371
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Ši reikšmė negali būti daugiau nei %s."
+
+#: core/validators.py:407
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Ši reikšmė turi būti %s laipsnis."
+
+#: core/validators.py:418
+msgid "Please enter a valid decimal number."
+msgstr "Įveskite tinkamą dešimtainį skaičių."
+
+#: core/validators.py:422
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural "Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Įveskite tinkamą dešimtainį skaičių su daugiausiai %s skaitmeniu."
+msgstr[1] "Įveskite tinkamą dešimtainį skaičių su daugiausiai %s skaitmenimis."
+
+#: core/validators.py:425
+#, python-format
+msgid "Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural "Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] "Įveskite tinkamą dešimtainį skaičių, kurio sveikoji dalis ne didenė nei %s skaitmens."
+msgstr[1] "Įveskite tinkamą dešimtainį skaičių, kurio sveikoji dalis ne didenė nei %s skaitmenų."
+
+#: core/validators.py:428
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural "Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "Įveskite tinkamą dešimtainį skaičių, kur po kablelio max %s skaitmuo."
+msgstr[1] "Įveskite tinkamą dešimtainį skaičių, kur po kablelio max %s skaitmenų."
+
+#: core/validators.py:438
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Įsitikink, kad įkeltas failas yra mažiausiai %s baitų dydžio."
+
+#: core/validators.py:439
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Įsitikink, kad įkeltas failas yra daugiausiai %s baitų dydžio."
+
+#: core/validators.py:456
+msgid "The format for this field is wrong."
+msgstr "Šis formatas yra netinkamas šiam laukui."
+
+#: core/validators.py:471
+msgid "This field is invalid."
+msgstr "Šis laukas yra netinkamas."
+
+#: core/validators.py:507
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Nieko negaliu gauti iš %s"
+
+#: core/validators.py:510
+#, python-format
+msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "URL %(url)s gražino blogą Content-Type headerį '%(contenttype)s'."
+
+#: core/validators.py:543
+#, python-format
+msgid "Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with \"%(start)s\".)"
+msgstr "Uždaryk neuždarytus %(tag)s tagus nuo %(line)s eilutės. (Pradedant \"%(start)s\" eilute.)"
+
+#: core/validators.py:547
+#, python-format
+msgid "Some text starting on line %(line)s is not allowed in that context. (Line starts with \"%(start)s\".)"
+msgstr "Kažkiek teksto pradedant %(line)s eilute nėra leidžiamas šiame kontekste. (Pradedant \"%(start)s\" eilute."
+
+#: core/validators.py:552
+#, python-format
+msgid "\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%(start)s\".)"
+msgstr "\"%(attr)s\" eilutėje %(line)s yra netinkamas atributas. (Pradedant \"%(start)s\" eilute.)"
+
+#: core/validators.py:557
+#, python-format
+msgid "\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%(start)s\".)"
+msgstr "\"<%(tag)s>\" eilutėje %(line)s yra netinkami tagai. (Pradedant \"%(start)s\" eilute.)"
+
+#: core/validators.py:561
+#, python-format
+msgid "A tag on line %(line)s is missing one or more required attributes. (Line starts with \"%(start)s\".)"
+msgstr "Eilutėje %(line)s tagui trūksta vieno ar daugiau privalomų atributų. (Pradedant \"%(start)s\" eilute.)"
+
+#: core/validators.py:566
+#, python-format
+msgid "The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line starts with \"%(start)s\".)"
+msgstr "\"%(attr)s\" atributas eilutėje %(line)s turi netinkamą reikšmę. (Pradedant \"%(start)s\" eilute.)"
+
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "%(verbose_name)s sėkmingai sukurtas."
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "%(verbose_name)s sėkmingai atnaujintas."
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "%(verbose_name)s buvo ištrintas."
+
+#: newforms/models.py:165
+#: newforms/fields.py:364
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Pasirink tinkamą. Tas pasirinkimas nėra iš galimų."
+
+#: newforms/models.py:182
+#: newforms/fields.py:380
+#: newforms/fields.py:456
+msgid "Enter a list of values."
+msgstr "Įvesk reikšmių sarašą."
+
+#: newforms/models.py:188
+#: newforms/fields.py:389
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Pasirink tinkamą. %s nėra vienas iš galimų."
+
+#: newforms/fields.py:103
+#: newforms/fields.py:256
+#, python-format
+msgid "Ensure this value has at most %d characters."
+msgstr "Įsitikink, kad reikšmė daugiausiai turi %d simbolių."
+
+#: newforms/fields.py:105
+#: newforms/fields.py:258
+#, python-format
+msgid "Ensure this value has at least %d characters."
+msgstr "Įsitikink, kad reikšmė mažiausiai turi %d simbolių."
+
+#: newforms/fields.py:130
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Įsitikink, kad ši reikšmė yra mažiau arba lygu %s."
+
+#: newforms/fields.py:132
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Įsitikink, kad ši reikšmė yra daugiau arba lygu %s."
+
+#: newforms/fields.py:165
+msgid "Enter a valid date."
+msgstr "Įvesk tinkamą datą."
+
+#: newforms/fields.py:192
+msgid "Enter a valid time."
+msgstr "Įvesk tinkamą laiką."
+
+#: newforms/fields.py:228
+msgid "Enter a valid date/time."
+msgstr "Įvesk tinkamą datą/laiką."
+
+#: newforms/fields.py:242
+msgid "Enter a valid value."
+msgstr "Įvesk tinkamą reikšmę."
+
+#: newforms/fields.py:289
+#: newforms/fields.py:311
+msgid "Enter a valid URL."
+msgstr "Įvesk tinkamą URL."
+
+#: newforms/fields.py:313
+msgid "This URL appears to be a broken link."
+msgstr "Atrodo URL blogas."
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "th"
+msgstr "th"
+
+#: contrib/humanize/templatetags/humanize.py:17
+#, fuzzy
+msgid "st"
+msgstr "st"
+
+#: contrib/humanize/templatetags/humanize.py:17
+#, fuzzy
+msgid "nd"
+msgstr "nd"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "rd"
+msgstr "rd"
+
+#: contrib/humanize/templatetags/humanize.py:47
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f milijonas"
+msgstr[1] "%(value).1f milijonas"
+
+#: contrib/humanize/templatetags/humanize.py:50
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f milijardas"
+msgstr[1] "%(value).1f milijardas"
+
+#: contrib/humanize/templatetags/humanize.py:53
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f trilijonas"
+msgstr[1] "%(value).1f trilijonas"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "one"
+msgstr "vienas"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "two"
+msgstr "du"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "three"
+msgstr "trys"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "four"
+msgstr "keturi"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "five"
+msgstr "penki"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "six"
+msgstr "šeši"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "seven"
+msgstr "septyni"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "eight"
+msgstr "aštuoni"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "nine"
+msgstr "devyni"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "nukreiptas (redirect) iš"
+
+#: contrib/redirects/models.py:8
+msgid "This should be an absolute path, excluding the domain name. Example: '/events/search/'."
+msgstr "Turi būti absoliutus adresas neįtraukiant domaino. Pavyzdžiui: '/events/search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "nukreipti(redirect) į"
+
+#: contrib/redirects/models.py:10
+msgid "This can be either an absolute path (as above) or a full URL starting with 'http://'."
+msgstr "Gali būti absoliutus adresas (kaip viršuj) arba pilnas URL pradedant 'http://'."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "nukreipti"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "nukreipia"
+
+#: contrib/comments/models.py:67
+#: contrib/comments/models.py:166
+msgid "object ID"
+msgstr "objekto ID"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "antraštė"
+
+#: contrib/comments/models.py:69
+#: contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "komentaras"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "reitingas #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "reitingas #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "reitingas #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "reitingas #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "reitingas #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "reitingas #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "reitingas #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "reitingas #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "tinkamas reitingas"
+
+#: contrib/comments/models.py:83
+#: contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "įvesta data/laikas"
+
+#: contrib/comments/models.py:84
+#: contrib/comments/models.py:170
+msgid "is public"
+msgstr "viešas"
+
+#: contrib/comments/models.py:85
+#: contrib/admin/views/doc.py:304
+msgid "IP address"
+msgstr "IP adresas"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "pašalintas"
+
+#: contrib/comments/models.py:86
+msgid "Check this box if the comment is inappropriate. A \"This comment has been removed\" message will be displayed instead."
+msgstr "Pažymėk šį laukelį, jei komentaras netinkamas. \"Šis komentaras ištrintas\" bus rodoma."
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "komentarai"
+
+#: contrib/comments/models.py:131
+#: contrib/comments/models.py:207
+msgid "Content object"
+msgstr "Turinio objektas"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Paskelbta  %(user)s, %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "asmens vardas"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "ip adresas"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "patvirtinta personalo"
+
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "laisvas komentaras"
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "laisvi komentarai"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "rezultatas"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "rezultato data"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "karma rezultatas"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "karma rezultatai"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d reitingas nuo %(user)s"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Šis komentaras pažymėtas %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "pažymėjimo data"
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "vartotojo žymė"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "vartotojo žymės"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "Pažymėtas %r"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "ištrinimo data"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "moderatoriaus ištrynimas"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "moderatoriaus ištrynimai"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Moderatoriaus ištrynimas, pagal %r"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Neprisijungę vartotojai negali balsuoti"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "Blogas komentaro ID"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "Negali balsuoti už save"
+
+#: contrib/comments/views/comments.py:27
+msgid "This rating is required because you've entered at least one other rating."
+msgstr "Šis reitingas privalomas nes įvedei mažiausiai vieną kitą reitingą."
+
+#: contrib/comments/views/comments.py:111
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Šis komentaras buvo paskelbtas vartotojo, kuris paskelbė mažiau nei %(count)s komentarą:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Šis komentaras buvo paskelbtas vartotojo, kuris paskelbė mažiau nei %(count)s komentarų:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:116
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Šis komentaras buvo paskelbtas nerimto vartotojo:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:188
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Tik POSTai yra leidžiami"
+
+#: contrib/comments/views/comments.py:192
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Vienas ar daugiau privalomų laukų nebuvo įrašytas"
+
+#: contrib/comments/views/comments.py:196
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Kažkas padirbo komentaro formą (saugumo pažeidimai)"
+
+#: contrib/comments/views/comments.py:206
+#: contrib/comments/views/comments.py:292
+msgid "The comment form had an invalid 'target' parameter -- the object ID was invalid"
+msgstr "Komentaro forma turi blogą 'target' parametrą -- objekto ID blogas"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "Komentaro forma nepateikė 'preview' arba 'post'"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "Vartotojo vardas:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+msgid "Log out"
+msgstr "Atsijungti"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Slaptažodis:"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Pamiršai slaptažodį?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Reitingas"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Privalomas"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Neprivalomas"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Įkelk nuotrauką"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Komentaras:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Peržiūrėti komentarą"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Jūsų vardas:"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "domeno vardas"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "rodomas vardas"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "saitas"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "saitai"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:70
+#: contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143
+#: contrib/admin/filterspecs.py:169
+msgid "All"
+msgstr "Visi"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "Betkokia data"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "Šiandien"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "Paskutinės 7 dienos"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "Šį mėnesį"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "Šiais metais"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "veiksmo laikas"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "objekto id"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "objekto repr"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "veiksmo žymė"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "pakeisti žinutę"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "log įrašas"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "log įrašai"
+
+#: contrib/admin/templatetags/admin_list.py:247
+msgid "All dates"
+msgstr "Visos datos"
+
+#: contrib/admin/views/auth.py:19
+#: contrib/admin/views/main.py:257
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" pridėtas sėkmingai."
+
+#: contrib/admin/views/auth.py:24
+#: contrib/admin/views/main.py:261
+#: contrib/admin/views/main.py:347
+msgid "You may edit it again below."
+msgstr "Gali taisyti dar kartą žemiau."
+
+#: contrib/admin/views/auth.py:30
+msgid "Add user"
+msgstr "Pridėti vartotoją"
+
+#: contrib/admin/views/auth.py:57
+msgid "Password changed successfully."
+msgstr "Slaptažodis pakeistas sėkmingai."
+
+#: contrib/admin/views/auth.py:64
+#, python-format
+msgid "Change password: %s"
+msgstr "Pakeisti slaptažodį: %s"
+
+#: contrib/admin/views/main.py:223
+msgid "Site administration"
+msgstr "Saito administracija"
+
+#: contrib/admin/views/main.py:271
+#: contrib/admin/views/main.py:356
+#, python-format
+msgid "You may add another %s below."
+msgstr "Gali pridėti dar vieną %s žemiau."
+
+#: contrib/admin/views/main.py:289
+#, python-format
+msgid "Add %s"
+msgstr "Pridėti %s"
+
+#: contrib/admin/views/main.py:335
+#, python-format
+msgid "Added %s."
+msgstr "Pridėtas %s."
+
+#: contrib/admin/views/main.py:337
+#, python-format
+msgid "Changed %s."
+msgstr "Pakeistas %s."
+
+#: contrib/admin/views/main.py:339
+#, python-format
+msgid "Deleted %s."
+msgstr "Ištrintas %s"
+
+#: contrib/admin/views/main.py:342
+msgid "No fields changed."
+msgstr "Nei vienas laukas nepakeistas"
+
+#: contrib/admin/views/main.py:345
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" buvo sėkmingai pakeistas."
+
+#: contrib/admin/views/main.py:353
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" pridėtas sėkmingai. Gali taisytį jį dar kartą žemiau."
+
+#: contrib/admin/views/main.py:391
+#, python-format
+msgid "Change %s"
+msgstr "Pakeisti %s"
+
+#: contrib/admin/views/main.py:476
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Vienas arba daugiau %(fieldname)s %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:481
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Vienas arba daugiau %(fieldname)s %(name)s:"
+
+#: contrib/admin/views/main.py:514
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" sėkmingai ištrintas."
+
+#: contrib/admin/views/main.py:517
+msgid "Are you sure?"
+msgstr "Ar tu tikras?"
+
+#: contrib/admin/views/main.py:539
+#, python-format
+msgid "Change history: %s"
+msgstr "Pakeisti istoriją: %s"
+
+#: contrib/admin/views/main.py:573
+#, python-format
+msgid "Select %s"
+msgstr "Pasirinkti %s"
+
+#: contrib/admin/views/main.py:573
+#, python-format
+msgid "Select %s to change"
+msgstr "Pasirinkti %s pakeitimui"
+
+#: contrib/admin/views/main.py:768
+msgid "Database error"
+msgstr "Duomenų bazės klaida"
+
+#: contrib/admin/views/decorators.py:10
+#: contrib/auth/forms.py:60
+msgid "Please enter a correct username and password. Note that both fields are case-sensitive."
+msgstr "Įveskite teisingą vartotojo vardą ir slaptažodį. Abiejuose laukuose didžiosios mažosios raidės skiriasi"
+
+#: contrib/admin/views/decorators.py:24
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Prisijungti"
+
+#: contrib/admin/views/decorators.py:62
+msgid "Please log in again, because your session has expired. Don't worry: Your submission has been saved."
+msgstr "Prisijunkite dar kartą, nes sesijos laikas baigėsi. Nesirūpinkite, įrašai buvo išsaugoti."
+
+#: contrib/admin/views/decorators.py:69
+msgid "Looks like your browser isn't configured to accept cookies. Please enable cookies, reload this page, and try again."
+msgstr "Atrodo, kad Jūsų naršyklė nepriima sausainėlių (cookies). Įjunkite sausainėlių palaikymą, perkraukite puslapį ir bandykite dar kartą."
+
+#: contrib/admin/views/decorators.py:83
+msgid "Usernames cannot contain the '@' character."
+msgstr "Vartotojo vardas negali turėti '@'."
+
+#: contrib/admin/views/decorators.py:85
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "E-mailas nėra vartotojo vardas. Pabandyk '%s' vietoj to."
+
+#: contrib/admin/views/doc.py:46
+#: contrib/admin/views/doc.py:48
+#: contrib/admin/views/doc.py:50
+msgid "tag:"
+msgstr "tagas"
+
+#: contrib/admin/views/doc.py:77
+#: contrib/admin/views/doc.py:79
+#: contrib/admin/views/doc.py:81
+msgid "filter:"
+msgstr "filtras:"
+
+#: contrib/admin/views/doc.py:135
+#: contrib/admin/views/doc.py:137
+#: contrib/admin/views/doc.py:139
+msgid "view:"
+msgstr "vaizdas:"
+
+#: contrib/admin/views/doc.py:164
+#, python-format
+msgid "App %r not found"
+msgstr "Programa %r nerasta"
+
+#: contrib/admin/views/doc.py:171
+#, python-format
+msgid "Model %(name)r not found in app %(label)r"
+msgstr "Modelis %(name)r programoje %(label)r nerastas"
+
+#: contrib/admin/views/doc.py:183
+#, python-format
+msgid "the related `%(label)s.%(type)s` object"
+msgstr "susijęs `%(label)s.%(type)s` objektas"
+
+#: contrib/admin/views/doc.py:183
+#: contrib/admin/views/doc.py:205
+#: contrib/admin/views/doc.py:219
+#: contrib/admin/views/doc.py:224
+msgid "model:"
+msgstr "modelis:"
+
+#: contrib/admin/views/doc.py:214
+#, python-format
+msgid "related `%(label)s.%(name)s` objects"
+msgstr "susiję `%(label)s.%(name)s` objektai"
+
+#: contrib/admin/views/doc.py:219
+#, python-format
+msgid "all %s"
+msgstr "visi %s"
+
+#: contrib/admin/views/doc.py:224
+#, python-format
+msgid "number of %s"
+msgstr "%s skaičius"
+
+#: contrib/admin/views/doc.py:229
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Objekto %s laukai"
+
+#: contrib/admin/views/doc.py:291
+#: contrib/admin/views/doc.py:301
+#: contrib/admin/views/doc.py:303
+#: contrib/admin/views/doc.py:309
+#: contrib/admin/views/doc.py:310
+#: contrib/admin/views/doc.py:312
+msgid "Integer"
+msgstr "Sveikas skaičius"
+
+#: contrib/admin/views/doc.py:292
+msgid "Boolean (Either True or False)"
+msgstr "Boolean (True arba False)"
+
+#: contrib/admin/views/doc.py:293
+#: contrib/admin/views/doc.py:311
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "Eilutė (iki %(maxlength)s)"
+
+#: contrib/admin/views/doc.py:294
+msgid "Comma-separated integers"
+msgstr "Kableliais atskirti sveikieji skaičiai"
+
+#: contrib/admin/views/doc.py:295
+msgid "Date (without time)"
+msgstr "Data (be laiko)"
+
+#: contrib/admin/views/doc.py:296
+msgid "Date (with time)"
+msgstr "Data (su laiku)"
+
+#: contrib/admin/views/doc.py:297
+msgid "E-mail address"
+msgstr "E-mailo adresas"
+
+#: contrib/admin/views/doc.py:298
+#: contrib/admin/views/doc.py:299
+#: contrib/admin/views/doc.py:302
+msgid "File path"
+msgstr "Kelias iki failo"
+
+#: contrib/admin/views/doc.py:300
+msgid "Decimal number"
+msgstr "Dešimtainis skaičius"
+
+#: contrib/admin/views/doc.py:306
+msgid "Boolean (Either True, False or None)"
+msgstr "Boolean (True arba False arba None)"
+
+#: contrib/admin/views/doc.py:307
+msgid "Relation to parent model"
+msgstr "Sąsaja su tėviniu modeliu"
+
+#: contrib/admin/views/doc.py:308
+msgid "Phone number"
+msgstr "Telefono numeris"
+
+#: contrib/admin/views/doc.py:313
+msgid "Text"
+msgstr "Tekstas"
+
+#: contrib/admin/views/doc.py:314
+msgid "Time"
+msgstr "Laikas"
+
+#: contrib/admin/views/doc.py:315
+#: contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:316
+msgid "U.S. state (two uppercase letters)"
+msgstr "JAV valstija (dvi didžiosios raidės)"
+
+#: contrib/admin/views/doc.py:317
+msgid "XML text"
+msgstr "XML tekstas"
+
+#: contrib/admin/views/doc.py:343
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s neatrodo kaip urlpattern objektas"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Dabartinis:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Pakeisti:"
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Data:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Laikas:"
+
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Dokumentacija"
+
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin/auth/user/change_password.html:15
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+msgid "Change password"
+msgstr "Pakeisti slaptažodį"
+
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/auth/user/change_password.html:12
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Pradinis"
+
+#: contrib/admin/templates/admin/change_list.html:12
+#, python-format
+msgid "Add %(name)s"
+msgstr "Pridėti %(name)s"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Pagal %(filter_title)s "
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "History"
+msgstr "Istorija"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Data/laikas"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Vartotojas"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Veiksmas"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "j. N Y, H:i"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid "This object doesn't have a change history. It probably wasn't added via this admin site."
+msgstr "Šis objektas neturi pakeitimų istorijos. Tikriausiai jis buvo pridėtas ne per admin puslapį."
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Eiti!"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 rezultatas"
+msgstr[1] "%(counter)s rezultatai"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s iš viso"
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Rodyti visus"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django saito administravimas"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django administravimas"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Serverio klaida"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Serverio klaida (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Serverio klaida <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid "There's been an error. It's been reported to the site administrators via e-mail and should be fixed shortly. Thanks for your patience."
+msgstr "Įvyko klaida. Apie ją buvo pranešta administratoriams ir turėtų būti greitai ištaisyta. Dėkojame už kantrybę."
+
+#: contrib/admin/templates/admin/invalid_setup.html:8
+msgid "Something's wrong with your database installation. Make sure the appropriate database tables have been created, and make sure the database is readable by the appropriate user."
+msgstr "Kažkas yra negerai su jūsų duomenų bazės instaliacija. Įsitikink, kad visos reikalingos lentelės sukurtos ir vartotojas turi teises skaityti duomenų bazę."
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Modelis prieinamas %(name)s programoje."
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "Pridėti"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Pakeisti"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Neturi teisių ką nors keistis."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Neseni veiksmai"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Mano Veiksmai"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Nėra prieinamų"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Puslapis nerastas"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Atsiprašome, bet prašytas puslapis nerastas."
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "Filtras"
+
+#: contrib/admin/templates/admin/change_form.html:22
+msgid "View on site"
+msgstr "Matyti saite"
+
+#: contrib/admin/templates/admin/change_form.html:32
+#: contrib/admin/templates/admin/auth/user/change_password.html:24
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Ištaisykite klaidą žemiau"
+msgstr[1] "Ištaisykite klaidas žemiau"
+
+#: contrib/admin/templates/admin/change_form.html:50
+msgid "Ordering"
+msgstr "Rūšiavimas"
+
+#: contrib/admin/templates/admin/change_form.html:53
+msgid "Order:"
+msgstr "Rūšiuoti:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Ištrinti"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid "Deleting the %(object_name)s '%(escaped_object)s' would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:"
+msgstr "Trinant %(object_name)s '%(escaped_object)s' turi būti ištrinti ir susiję objektai, bet tavo vartotojas neturi teisių ištrinti šių objektų:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid "Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? All of the following related items will be deleted:"
+msgstr "Ar tu esi tikras, kad nori ištrinti %(object_name)s \"%(escaped_object)s\"? Visi susiję objektai bus ištrinti:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Taip, aš esu tikras"
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "Sveiki,"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Išsaugoti kaip naują"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Išsaugoti ir pridėti naują"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Išsaugoti ir tęsti redagavimą"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Išsaugoti"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:28
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Įvesk naują slaptažodį vartotojui <strong>%(username)s</strong>."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:34
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+msgid "Password"
+msgstr "Slaptažodis"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+msgid "Password (again)"
+msgstr "Slaptažodis (dar kartą)"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+msgid "Enter the same password as above, for verification."
+msgstr "Patikrinimui įvesk tokį patį slaptažodį, kaip viršuje."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid "First, enter a username and password. Then, you'll be able to edit more user options."
+msgstr "Pirmiausi įvesk vartotojo vardą ir slaptažodį. Tada turėsi galimybę redaguoti daugiau nustatymų."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "Vartotojo vardas"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Slaptažodžio keitimas"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Slaptažodis sėkmingai pakeistas"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Jūsų slaptažodis buvo pakeistas."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Slaptažodžiu atstatymas(reset)"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid "Forgotten your password? Enter your e-mail address below, and we'll reset your password and e-mail the new one to you."
+msgstr "Pamiršai slaptažodį? Įvesk savo emailą žemiau ir mes atsiųsime naują slaptažodį emailu."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "E-mailo adresas:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Atstatyti slaptažodį"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Dėkui už praleistą laiką šiandien."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Prisijungti dar kartą"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Slaptažodis sėkmingai atsatytas"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid "We've e-mailed a new password to the e-mail address you submitted. You should be receiving it shortly."
+msgstr "Išsiuntėm naują slaptažodį e-mailu. Turėtumėte greitai gauti."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid "Please enter your old password, for security's sake, and then enter your new password twice so we can verify you typed it in correctly."
+msgstr "Saugumo sumetimais įvesk seną slaptažodį ir tada du kartus naują, kad įsitikinti, jog nesuklydai rašydamas"
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Senas slaptažodis:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Naujas slaptažodis:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Slaptažodžio patvirtinimas:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Pakeisti slaptažodį"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Gavote šį laišką, nes paprašėte atstatyti slaptažodį"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "Jūsų vartotojui %(site_name)s saite"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Jūsų naujas slaptažodis yra: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Nebijokite pasikeisti šį slaptažodį puslapyje:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Jūsų vartotojo vardas, jei netyčia užmiršote:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Dėkui, kad naudojatės mūsų saitu!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s komanda"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Greitosios žymės"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "Doumentacijos greitosios žymės"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">Greitųjų žymių įdiegimui, nutempkite nuorodą į greitųjų žymių\n"
+"juostą, arba spauskite dešinį pelės klavišą ir pridėkite prie greitųjų žymių. Dabar galite\n"
+"pasirinkti greitąją žymę iš bet kurio saito puslapio. Pastebėjimas, kad keletas iš šių\n"
+"greitųjų žymių reikalauja, kad saitas būtų žiūrimas iš vidinio kompiuterio \n"
+"(pasitarkite su administratorium, jei nežinai ar tavo kompiuteris yra vidinis).</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Šio puslapio dokumentacija"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid "Jumps you from any page to the documentation for the view that generates that page."
+msgstr "Pereina iš bet kurio puslapio į jo view funkcijos dokumentaciją, kuri sukūria tą puslapį"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Parodyti objekto ID"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid "Shows the content-type and unique ID for pages that represent a single object."
+msgstr "Parodyti content-type ir unikalų puslapių ID, kuris parodo vieną objektą."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Redaguoti šį objektą (einamajame lange)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "Pereina į administravimo puslapį, kuris parodo vieną objektą."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Redaguoti šį objektą (naujame lange)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "Kaip ir viršuje, bet administravimo puslapį atidaro naujame lange."
+
+#: contrib/contenttypes/models.py:36
+msgid "python model class name"
+msgstr "python modelio klasės vardas"
+
+#: contrib/contenttypes/models.py:39
+msgid "content type"
+msgstr "turinio tipas"
+
+#: contrib/contenttypes/models.py:40
+msgid "content types"
+msgstr "turinio tipai"
+
+#: contrib/auth/views.py:40
+msgid "Logged out"
+msgstr "Atsijungęs"
+
+#: contrib/auth/models.py:44
+#: contrib/auth/models.py:64
+msgid "name"
+msgstr "vardas"
+
+#: contrib/auth/models.py:46
+msgid "codename"
+msgstr "kodinis vardas"
+
+#: contrib/auth/models.py:49
+msgid "permission"
+msgstr "leidimas"
+
+#: contrib/auth/models.py:50
+#: contrib/auth/models.py:65
+msgid "permissions"
+msgstr "leidimai"
+
+#: contrib/auth/models.py:68
+msgid "group"
+msgstr "grupė"
+
+#: contrib/auth/models.py:69
+#: contrib/auth/models.py:109
+msgid "groups"
+msgstr "grupės"
+
+#: contrib/auth/models.py:99
+msgid "username"
+msgstr "vartotojo vardas"
+
+#: contrib/auth/models.py:99
+msgid "Required. 30 characters or fewer. Alphanumeric characters only (letters, digits and underscores)."
+msgstr "Privalomas. 30 simbolių arba mažiau. Alfanumeriniai simboliai tik (raidės, skaitmenys ir pabraukimai)"
+
+#: contrib/auth/models.py:100
+msgid "first name"
+msgstr "vardas"
+
+#: contrib/auth/models.py:101
+msgid "last name"
+msgstr "pavardė"
+
+#: contrib/auth/models.py:102
+msgid "e-mail address"
+msgstr "e-mailo adresas"
+
+#: contrib/auth/models.py:103
+msgid "password"
+msgstr "slaptažodis"
+
+#: contrib/auth/models.py:103
+msgid "Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change password form</a>."
+msgstr "Naudok '[algo]$[salt]$[hexdigest]' arba naudok <a href=\"password/\">slaptažodžio keitimo formą</a>."
+
+#: contrib/auth/models.py:104
+msgid "staff status"
+msgstr "personalo statusas"
+
+#: contrib/auth/models.py:104
+msgid "Designates whether the user can log into this admin site."
+msgstr "Pažymi ar vartotojas gali prisijungti prie administravimo puslapio."
+
+#: contrib/auth/models.py:105
+msgid "active"
+msgstr "aktyvus"
+
+#: contrib/auth/models.py:105
+msgid "Designates whether this user can log into the Django admin. Unselect this instead of deleting accounts."
+msgstr "Pažymi ar šis vartotojas gali prisijungti prie Django administravimo. Nepažymėk šios lauko, vietoj vartotojo trynimo."
+
+#: contrib/auth/models.py:106
+msgid "superuser status"
+msgstr "supervartotojo statusas"
+
+#: contrib/auth/models.py:106
+msgid "Designates that this user has all permissions without explicitly assigning them."
+msgstr "Pažymi, kad šis vartotojas turi visas teises be specialių nustatymų."
+
+#: contrib/auth/models.py:107
+msgid "last login"
+msgstr "paskutinį kartą prisijungęs"
+
+#: contrib/auth/models.py:108
+msgid "date joined"
+msgstr "data, kada prisijungė"
+
+#: contrib/auth/models.py:110
+msgid "In addition to the permissions manually assigned, this user will also get all permissions granted to each group he/she is in."
+msgstr "Prie rankiniu būdų priskirtų teisių, šis vartotojas taip pat gaus visas teises, kurias turi grupės, kurioms jis priklauso."
+
+#: contrib/auth/models.py:111
+msgid "user permissions"
+msgstr "vartotojo leidimai"
+
+#: contrib/auth/models.py:115
+msgid "user"
+msgstr "vartotojas"
+
+#: contrib/auth/models.py:116
+msgid "users"
+msgstr "vartotojai"
+
+#: contrib/auth/models.py:122
+msgid "Personal info"
+msgstr "Asmeninė informacija"
+
+#: contrib/auth/models.py:123
+msgid "Permissions"
+msgstr "Leidimai"
+
+#: contrib/auth/models.py:124
+msgid "Important dates"
+msgstr "Svarbios datos"
+
+#: contrib/auth/models.py:125
+msgid "Groups"
+msgstr "Grupės"
+
+#: contrib/auth/models.py:269
+msgid "message"
+msgstr "žinutė"
+
+#: contrib/auth/models.py:282
+msgid "AnonymousUser"
+msgstr "Anoniminis vartotojas"
+
+#: contrib/auth/forms.py:17
+#: contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr "Slaptažodžio laukai nesutapo"
+
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr "Jau egzistuoja vartotojas su tokiu vardu."
+
+#: contrib/auth/forms.py:53
+msgid "Your Web browser doesn't appear to have cookies enabled. Cookies are required for logging in."
+msgstr "Atrodo, jūsų naršyklė nepriima sausainėlių(cookies). Sausainėliai yra reikalingi norint prisijungti."
+
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "Ši paskyra yra neaktyvi."
+
+#: contrib/auth/forms.py:85
+msgid "That e-mail address doesn't have an associated user account. Are you sure you've registered?"
+msgstr "Šis emailas nėra registruotas sistemoje. Ar esi tikras, kad tu užsiregistravęs?"
+
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "Naujo slaptažodžio laukai nesutapo"
+
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Blogai įvestas senas slaptažodis. Bandykite dar kartą."
+
+#: contrib/localflavor/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
+msgstr "Įveskite pašto kodą. Tarpas reikalingas tarp dviejų pašto kodo dalių."
+
+#: contrib/localflavor/br/forms.py:18
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Įveskite pašto kodą XXXXX-XXX formatu."
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "Telefonas turi būti XXX-XXXX-XXXX formatu."
+
+#: contrib/localflavor/br/forms.py:72
+msgid "This field requires only numbers."
+msgstr "Šis laukas priima tik skaičius."
+
+#: contrib/localflavor/br/forms.py:74
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr "Šis laukas talpina daugiausiai 11 skaitmenų arba 14 simbolių."
+
+#: contrib/localflavor/br/forms.py:84
+msgid "Invalid CPF number."
+msgstr "Netinkamas CPF numeris"
+
+#: contrib/localflavor/br/forms.py:106
+msgid "This field requires at least 14 digits"
+msgstr "Šis laukas reikalauja mažiausiai 14 skaitmenų."
+
+#: contrib/localflavor/br/forms.py:116
+msgid "Invalid CNPJ number."
+msgstr "Netinkamas CNPJ numeris"
+
+#: contrib/localflavor/au/forms.py:18
+msgid "Enter a 4 digit post code."
+msgstr "Įveskite 4 skaitmenų pašto kodą."
+
+#: contrib/localflavor/fr/forms.py:17
+#: contrib/localflavor/de/forms.py:16
+#: contrib/localflavor/fi/forms.py:14
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Įveskite pašto kodą XXXXX formatu."
+
+#: contrib/localflavor/us/forms.py:18
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "Įveskite pašto kodą XXXXX arba XXXXX-XXXX formatu."
+
+#: contrib/localflavor/us/forms.py:51
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr "Įveskite tinkamą JAV socialinio draudimo numerį."
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr "Bavarija"
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr "Berlynas"
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr "Brandenburgas"
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr "Bremenas"
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr "Hamburgas"
+
+#: contrib/localflavor/de/de_states.py:11
+#, fuzzy
+msgid "Hessen"
+msgstr "Hesenas"
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr "Saksonija"
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr ""
+
+#: contrib/localflavor/de/forms.py:60
+msgid "Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X format."
+msgstr "Įveskite tinkamą Vokiško asmens id numerį XXXXXXXXXXX-XXXXXXX-XXXXXXX-X formatu."
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr "Hokaidas"
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+#, fuzzy
+msgid "Iwate"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr "Tokijas"
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr "Osaka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+#, fuzzy
+msgid "Shimane"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr "Hirošima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+#, fuzzy
+msgid "Ehime"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr "Okinava"
+
+#: contrib/localflavor/jp/forms.py:21
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "Įveskite pašto kodą XXXXXXX arba XXX-XXXX formatu."
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:10
+#, fuzzy
+msgid "Berne"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:13
+#, fuzzy
+msgid "Glarus"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:16
+#, fuzzy
+msgid "Lucerne"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:24
+#, fuzzy
+msgid "Thurgau"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:29
+#, fuzzy
+msgid "Zug"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr ""
+
+#: contrib/localflavor/ch/forms.py:18
+#: contrib/localflavor/no/forms.py:15
+msgid "Enter a zip code in the format XXXX."
+msgstr "Įveskite pašto kodą XXXX formatu."
+
+#: contrib/localflavor/ch/forms.py:90
+msgid "Enter a valid Swiss identity or passport card number in X1234567<0 or 1234567890 format."
+msgstr "Įveskite tinkamą šveicarų asmens id ar paso numerį X1234567<0 arba 1234567890 formatu."
+
+#: contrib/localflavor/is_/forms.py:16
+msgid "Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr "Įveskite tinkamą islandų asmens id numerį XXXXXX-XXXX formatu."
+
+#: contrib/localflavor/is_/forms.py:30
+msgid "The Icelandic identification number is not valid."
+msgstr "Islandiškas asmend id yra netinkamas."
+
+#: contrib/localflavor/it/forms.py:16
+msgid "Enter a valid zip code."
+msgstr "Įveskite tinkamą pašto kodą."
+
+#: contrib/localflavor/it/forms.py:41
+msgid "Enter a valid Social Security number."
+msgstr "Įveskite tinkamą socialinio draudimo numerį."
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr "Įveskite tinkamą PVM numerį"
+
+#: contrib/localflavor/no/forms.py:36
+msgid "Enter a valid Norwegian social security number."
+msgstr "Įveskite tinkamą norvegiška socialinio draudimo numerį."
+
+#: contrib/localflavor/cl/forms.py:21
+msgid "Enter valid a Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr "Įveskite tinkamą Čilės RUT XX.XXX.XXX-X formatu."
+
+#: contrib/localflavor/cl/forms.py:26
+msgid "Enter valid a Chilean RUT"
+msgstr "Įveskite tinkamą Čilės RUT"
+
+#: contrib/localflavor/fi/forms.py:40
+#: contrib/localflavor/fi/forms.py:45
+msgid "Enter a valid Finnish social security number."
+msgstr "Įveskite tinkamą suomišką socialinio draudimo numerį."
+
+#: contrib/sessions/models.py:68
+msgid "session key"
+msgstr "sesijos raktas"
+
+#: contrib/sessions/models.py:69
+msgid "session data"
+msgstr "sesijos data"
+
+#: contrib/sessions/models.py:70
+msgid "expire date"
+msgstr "galiojima data"
+
+#: contrib/sessions/models.py:74
+msgid "session"
+msgstr "sesija"
+
+#: contrib/sessions/models.py:75
+msgid "sessions"
+msgstr "sesijos"
+
+#: contrib/flatpages/models.py:8
+msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr "Pavyzdžiui: '/about/contact/'. Įsitikink, kad yra pasvirieji brūkšniai pradžioj ir gale."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "pavadinimas"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "turinys"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "įjungti komentavimą"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "šablono vardas"
+
+#: contrib/flatpages/models.py:13
+msgid "Example: 'flatpages/contact_page.html'. If this isn't provided, the system will use 'flatpages/default.html'."
+msgstr "Pavyzdžiui: 'flatpages/contact_page.html'. Jeigu bus nenurodytas, sistema naudos 'flatpages/default.html'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "registracija privaloma"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Jeigu pažymėta, tik prisijungę vartotojai galės matyti šį puslapį."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "paprastas puslapis"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "paprasti puslapiai"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Pirmadienis"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Antradienis"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Trečiadienis"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Ketvirtadienis"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Penktadienis"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Šeštadienis"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Sekmadienis"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Sausis"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Vasaris"
+
+#: utils/dates.py:14
+#: utils/dates.py:27
+msgid "March"
+msgstr "Kovas"
+
+#: utils/dates.py:14
+#: utils/dates.py:27
+msgid "April"
+msgstr "Balandis"
+
+#: utils/dates.py:14
+#: utils/dates.py:27
+msgid "May"
+msgstr "Gegužė"
+
+#: utils/dates.py:14
+#: utils/dates.py:27
+msgid "June"
+msgstr "Birželis"
+
+#: utils/dates.py:15
+#: utils/dates.py:27
+msgid "July"
+msgstr "Liepa"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "Rugpjūtis"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "Rugsėjis"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Spalis"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "Lapkritis"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "Gruodis"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr "sau"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "vas"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "kov"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "bal"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "geg"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "bir"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "lie"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "rugp"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "rugs"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "spa"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "lap"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "grd"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Sau."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Vas."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Rugp."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Rugs."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Spa."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "Lap."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Grd."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "metai"
+msgstr[1] "metai"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mėnesis"
+msgstr[1] "mėnesiai"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "savaitė"
+msgstr[1] "savaitės"
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "diena"
+msgstr[1] "dienos"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "valanda"
+msgstr[1] "valandos"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minutė"
+msgstr[1] "minutės"
+
+#: utils/timesince.py:40
+#, python-format
+msgid "%d milliseconds"
+msgstr "%d milisekundės"
+
+#: utils/timesince.py:41
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr "%(number)d %(type)s"
+
+#: utils/timesince.py:47
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ", %(number)d %(type)s"
+
+#: utils/dateformat.py:40
+#, fuzzy
+msgid "p.m."
+msgstr "p.m."
+
+#: utils/dateformat.py:41
+#, fuzzy
+msgid "a.m."
+msgstr "a.m."
+
+#: utils/dateformat.py:46
+#, fuzzy
+msgid "PM"
+msgstr "PM"
+
+#: utils/dateformat.py:47
+#, fuzzy
+msgid "AM"
+msgstr "AM"
+
+#: utils/dateformat.py:95
+msgid "midnight"
+msgstr "vidurnaktis"
+
+#: utils/dateformat.py:97
+msgid "noon"
+msgstr "vidurdienis"
+
+#: utils/translation/trans_real.py:358
+msgid "DATE_FORMAT"
+msgstr "DATE_FORMAT"
+
+#: utils/translation/trans_real.py:359
+msgid "DATETIME_FORMAT"
+msgstr "DATETIME_FORMAT"
+
+#: utils/translation/trans_real.py:360
+msgid "TIME_FORMAT"
+msgstr "TIME_FORMAT"
+
+#: utils/translation/trans_real.py:376
+msgid "YEAR_MONTH_FORMAT"
+msgstr "YEAR_MONTH_FORMAT"
+
+#: utils/translation/trans_real.py:377
+msgid "MONTH_DAY_FORMAT"
+msgstr "MONTH_DAY_FORMAT"
+
+#: template/defaultfilters.py:491
+msgid "yes,no,maybe"
+msgstr "taip,ne,galbūt"
+
+#: template/defaultfilters.py:520
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d baitas"
+msgstr[1] "%(size)d baitai"
+
+#: template/defaultfilters.py:522
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f KB"
+
+#: template/defaultfilters.py:524
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: template/defaultfilters.py:525
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
diff --git a/webapp/django/conf/locale/lt/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/lt/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..d703bfb
--- /dev/null
+++ b/webapp/django/conf/locale/lt/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/lt/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/lt/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..81d6988
--- /dev/null
+++ b/webapp/django/conf/locale/lt/LC_MESSAGES/djangojs.po
@@ -0,0 +1,116 @@
+# Lithuanian translation of Django.
+# Copyright (C) 2008 The Django Software Foundation
+# This file is distributed under the same license as the Django package.
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-06-15 23:03+0300\n"
+"PO-Revision-Date: 2008-06-18 22:37+0200\n"
+"Last-Translator: Rapolas Kaselis <rapolas@gmail.com>\n"
+"Language-Team: Django-i18n <django-i18n@googlegroups.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "Galimas %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Pasirinkti visus"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Pridėti"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Pašalinti"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Pasirinktas %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Pasirink ir paspausk"
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Išvalyti visus"
+
+#: contrib/admin/media/js/dateparse.js:32
+#: contrib/admin/media/js/calendar.js:24
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr "Sausis Vasaris Kovas Balandis Gegužė Birželis Liepa Rugpjūtis Rugsėjis "
+"Spalis Lapkritis Gruodis"
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Sekmadienis Pirmadienis Antradienis Trečiadienis Ketvirtadienis Penktadienis Šeštadienis"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "S P A T K P Š"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Now"
+msgstr "Dabar"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
+msgid "Clock"
+msgstr "Laikrodis"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
+msgid "Choose a time"
+msgstr "Pasirink laiką"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "Midnight"
+msgstr "Vidurnaktis"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "6 a.m."
+msgstr "6 a.m."
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
+msgid "Noon"
+msgstr "Vidurdienis"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
+msgid "Cancel"
+msgstr "Atšaukti"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
+msgid "Today"
+msgstr "Šiandien"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
+msgid "Calendar"
+msgstr "Kalendorius"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
+msgid "Yesterday"
+msgstr "Vakar"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
+msgid "Tomorrow"
+msgstr "Rytoj"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr "Parodyti"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr "Slėpti"
diff --git a/webapp/django/conf/locale/lv/LC_MESSAGES/django.mo b/webapp/django/conf/locale/lv/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..ad9bf70
--- /dev/null
+++ b/webapp/django/conf/locale/lv/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/lv/LC_MESSAGES/django.po b/webapp/django/conf/locale/lv/LC_MESSAGES/django.po
new file mode 100644
index 0000000..c6541d2
--- /dev/null
+++ b/webapp/django/conf/locale/lv/LC_MESSAGES/django.po
@@ -0,0 +1,2864 @@
+# Django Latvian translation.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# , fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-05-07 23:28+0300\n"
+"PO-Revision-Date: 2007-05-08 00:35+0300\n"
+"Last-Translator: Gatis Tomsons <gatis.tomsons@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: oldforms/__init__.py:357
+#: db/models/fields/__init__.py:117
+#: db/models/fields/__init__.py:274
+#: db/models/fields/__init__.py:612
+#: db/models/fields/__init__.py:623
+#: newforms/models.py:178
+#: newforms/fields.py:80
+#: newforms/fields.py:376
+#: newforms/fields.py:452
+#: newforms/fields.py:463
+msgid "This field is required."
+msgstr "Šis lauks ir obligāts."
+
+#: oldforms/__init__.py:392
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] ""
+msgstr[1] ""
+
+#: oldforms/__init__.py:397
+msgid "Line breaks are not allowed here."
+msgstr "Pārnešana jaunā rindā šeit nav atļauta."
+
+#: oldforms/__init__.py:498
+#: oldforms/__init__.py:571
+#: oldforms/__init__.py:610
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr ""
+
+#: oldforms/__init__.py:577
+#: newforms/widgets.py:180
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "Nezināms"
+
+#: oldforms/__init__.py:577
+#: newforms/widgets.py:180
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Jā"
+
+#: oldforms/__init__.py:577
+#: newforms/widgets.py:180
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "Nē"
+
+#: oldforms/__init__.py:672
+#: core/validators.py:174
+#: core/validators.py:445
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+
+#: oldforms/__init__.py:674
+msgid "The submitted file is empty."
+msgstr "Jūsu norādītais fails ir tukšs."
+
+#: oldforms/__init__.py:730
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Ievadiet veselu skaitli intervālā no -32,768 līdz 32,767."
+
+#: oldforms/__init__.py:740
+msgid "Enter a positive number."
+msgstr "Ievadiet pozitīvu skaitli."
+
+#: oldforms/__init__.py:750
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Ievadiet veselu skaitli intervāla starp 0 un 32,767."
+
+#: db/models/manipulators.py:307
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr ""
+
+#: db/models/manipulators.py:308
+#: contrib/admin/views/main.py:335
+#: contrib/admin/views/main.py:337
+#: contrib/admin/views/main.py:339
+msgid "and"
+msgstr "un"
+
+#: db/models/fields/__init__.py:42
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr ""
+
+#: db/models/fields/__init__.py:369
+msgid "This value must be an integer."
+msgstr "Vērtībai ir jābūt veselam skaitlim."
+
+#: db/models/fields/__init__.py:404
+msgid "This value must be either True or False."
+msgstr "Vērtībai jābūt True vai False."
+
+#: db/models/fields/__init__.py:425
+msgid "This field cannot be null."
+msgstr "Šis lauks nevar būt null"
+
+#: db/models/fields/__init__.py:459
+#: core/validators.py:148
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Ievadiet korektu datumu YYYY-MM-DD formātā."
+
+#: db/models/fields/__init__.py:528
+#: core/validators.py:157
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Ievadiet korektu datumu/laiku YYYY-MM-DD HH:MM formātā."
+
+#: db/models/fields/__init__.py:632
+msgid "Enter a valid filename."
+msgstr "Ievadiet korektu faila vārdu."
+
+#: db/models/fields/__init__.py:753
+msgid "This value must be either None, True or False."
+msgstr "Šai vērtībai jābūt None, True vai False."
+
+#: db/models/fields/related.py:53
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Lūdzu ievadiet korektu %s"
+
+#: db/models/fields/related.py:642
+msgid "Separate multiple IDs with commas."
+msgstr "Atdaliet vairākus ID ar komatiem."
+
+#: db/models/fields/related.py:644
+msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+#: db/models/fields/related.py:691
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural "Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+msgstr[1] ""
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "Arābu"
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "Bengāļu"
+
+#: conf/global_settings.py:41
+msgid "Catalan"
+msgstr ""
+
+#: conf/global_settings.py:42
+msgid "Czech"
+msgstr "Čehu"
+
+#: conf/global_settings.py:43
+msgid "Welsh"
+msgstr "Velsas"
+
+#: conf/global_settings.py:44
+msgid "Danish"
+msgstr "Dāņu"
+
+#: conf/global_settings.py:45
+msgid "German"
+msgstr "Vācu"
+
+#: conf/global_settings.py:46
+msgid "Greek"
+msgstr "Grieķu"
+
+#: conf/global_settings.py:47
+msgid "English"
+msgstr "Angļu"
+
+#: conf/global_settings.py:48
+msgid "Spanish"
+msgstr "Spaņu"
+
+#: conf/global_settings.py:49
+msgid "Argentinean Spanish"
+msgstr "Argentīniešu Spāņu"
+
+#: conf/global_settings.py:50
+msgid "Finnish"
+msgstr "Somu"
+
+#: conf/global_settings.py:51
+msgid "French"
+msgstr "Franču"
+
+#: conf/global_settings.py:52
+msgid "Galician"
+msgstr "Galīciešu"
+
+#: conf/global_settings.py:53
+msgid "Hungarian"
+msgstr "Ungāru"
+
+#: conf/global_settings.py:54
+msgid "Hebrew"
+msgstr ""
+
+#: conf/global_settings.py:55
+msgid "Icelandic"
+msgstr "Islandiešu"
+
+#: conf/global_settings.py:56
+msgid "Italian"
+msgstr "Itāļu"
+
+#: conf/global_settings.py:57
+msgid "Japanese"
+msgstr "Japāņu"
+
+#: conf/global_settings.py:58
+msgid "Korean"
+msgstr "Koreiešu"
+
+#: conf/global_settings.py:59
+msgid "Kannada"
+msgstr "Kanāda"
+
+#: conf/global_settings.py:60
+msgid "Latvian"
+msgstr "Latviešu"
+
+#: conf/global_settings.py:61
+msgid "Macedonian"
+msgstr "Maķedoniešu"
+
+#: conf/global_settings.py:62
+msgid "Dutch"
+msgstr "Dāņu"
+
+#: conf/global_settings.py:63
+msgid "Norwegian"
+msgstr "Norvēģu"
+
+#: conf/global_settings.py:64
+msgid "Polish"
+msgstr "Poļu"
+
+#: conf/global_settings.py:65
+msgid "Portugese"
+msgstr "Portugāļu"
+
+#: conf/global_settings.py:66
+msgid "Brazilian"
+msgstr "Brazīliešu"
+
+#: conf/global_settings.py:67
+msgid "Romanian"
+msgstr "Rumāņu"
+
+#: conf/global_settings.py:68
+msgid "Russian"
+msgstr "Krievu"
+
+#: conf/global_settings.py:69
+msgid "Slovak"
+msgstr "Slovāku"
+
+#: conf/global_settings.py:70
+msgid "Slovenian"
+msgstr "Slovēņu"
+
+#: conf/global_settings.py:71
+msgid "Serbian"
+msgstr "Serbu"
+
+#: conf/global_settings.py:72
+msgid "Swedish"
+msgstr "Zviedru"
+
+#: conf/global_settings.py:73
+msgid "Tamil"
+msgstr "Tamiliešu"
+
+#: conf/global_settings.py:74
+msgid "Telugu"
+msgstr "Telugu"
+
+#: conf/global_settings.py:75
+msgid "Turkish"
+msgstr "Turku"
+
+#: conf/global_settings.py:76
+msgid "Ukrainian"
+msgstr "Ukraiņu"
+
+#: conf/global_settings.py:77
+msgid "Simplified Chinese"
+msgstr "Vienkāršā ķīniešu"
+
+#: conf/global_settings.py:78
+msgid "Traditional Chinese"
+msgstr "Tradicionālā ķīniešu"
+
+#: core/validators.py:64
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Šī vērtība var saturēt tikai burtus, numurus un apakšsvītras."
+
+#: core/validators.py:68
+msgid "This value must contain only letters, numbers, underscores, dashes or slashes."
+msgstr "Šī vērtība var saturēt tikai burtus, numurus un apakšsvītras, svītras vai šķērssvītras."
+
+#: core/validators.py:72
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "Šī vērtība var saturēt tikai burtus, numurus un apakšsvītras vai šķērssvītras."
+
+#: core/validators.py:76
+msgid "Uppercase letters are not allowed here."
+msgstr "Augšējā reģistra burti nav atļauti."
+
+#: core/validators.py:80
+msgid "Lowercase letters are not allowed here."
+msgstr "Apakšējā reģistra burti nav atļauti."
+
+#: core/validators.py:87
+msgid "Enter only digits separated by commas."
+msgstr "Ievadiet tikai numurus, kas atdalīti ar komatiem."
+
+#: core/validators.py:99
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Ievadiet korektas e-pasta adreses, kas atdalītas ar komatiem."
+
+#: core/validators.py:103
+msgid "Please enter a valid IP address."
+msgstr "Lūdzu ievadiet korektu IP adresi."
+
+#: core/validators.py:107
+msgid "Empty values are not allowed here."
+msgstr "Tukšas vērtības nav atļautas."
+
+#: core/validators.py:111
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Ne ciparu simboli nav atļauti."
+
+#: core/validators.py:115
+msgid "This value can't be comprised solely of digits."
+msgstr "Šī vērtība nevar saturēt tikai ciparus."
+
+#: core/validators.py:120
+#: newforms/fields.py:128
+msgid "Enter a whole number."
+msgstr "Ievadiet veselus skaitļus."
+
+#: core/validators.py:124
+msgid "Only alphabetical characters are allowed here."
+msgstr "Atļauti tikai alfabētiskie simboli."
+
+#: core/validators.py:139
+msgid "Year must be 1900 or later."
+msgstr "Gadam jabūt 1900 vai vēlākam."
+
+#: core/validators.py:143
+#, python-format
+msgid "Invalid date: %s"
+msgstr "Nekorekts datums: %s"
+
+#: core/validators.py:153
+msgid "Enter a valid time in HH:MM format."
+msgstr "Ievadiet korektu laiku HH:MM formātā"
+
+#: core/validators.py:162
+#: newforms/fields.py:271
+msgid "Enter a valid e-mail address."
+msgstr "Ievadiet korektu e-pasta adresi."
+
+#: core/validators.py:178
+msgid "Upload a valid image. The file you uploaded was either not an image or a corrupted image."
+msgstr "Augšupielādējiet korektu attēlu. Fails, ko Jūs augšupielādējāt nav attēls vai arī bojāts attēla fails."
+
+#: core/validators.py:185
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "URL %s nesatur korektu attēlu."
+
+#: core/validators.py:189
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "Telefona numuriem jābūt XXX-XXX-XXXX formātā. \"%s\" is nekorekts."
+
+#: core/validators.py:197
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "URL %s nenorāda uz korektu QuickTime video."
+
+#: core/validators.py:201
+msgid "A valid URL is required."
+msgstr "Reāls URL obligāts."
+
+#: core/validators.py:215
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Korekts HTML ir obligāts. Specifiskās kļūdas:\n"
+"%s"
+
+#: core/validators.py:222
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Slikti formēts XML: %s"
+
+#: core/validators.py:239
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Nekorekts URL: %s"
+
+#: core/validators.py:244
+#: core/validators.py:246
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "URL %s ir salauzta saite."
+
+#: core/validators.py:252
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Ievadiet korektu ASV štata abriviatūru."
+
+#: core/validators.py:266
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Seko saviem vārdiem! Vārds %s nav atļauts šeit."
+msgstr[1] "Seko saviem vārdiem! Vārdi %s nav atļauts šeit."
+
+#: core/validators.py:273
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Laukam jāsaskan ar %s lauku."
+
+#: core/validators.py:292
+msgid "Please enter something for at least one field."
+msgstr "Lūdzu ievadiet kaut ko vismaz vienā laukā."
+
+#: core/validators.py:301
+#: core/validators.py:312
+msgid "Please enter both fields or leave them both empty."
+msgstr "Lūdzu ievadiet abus laukus vai atstājiet abus tukšus."
+
+#: core/validators.py:320
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Šis lauks ir jāaizpilda, ja %(field)s ir vienāds %(value)s"
+
+#: core/validators.py:333
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Šis lauks ir jāaizpilda, ja %(field)s nav vienāds %(value)s"
+
+#: core/validators.py:352
+msgid "Duplicate values are not allowed."
+msgstr "Duplicētas vērtības nav atļautas."
+
+#: core/validators.py:367
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Šai vērtībai jābūt starp %(lower)s un %(upper)s."
+
+#: core/validators.py:369
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Šai vērtībai jābūt vismaz %s."
+
+#: core/validators.py:371
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Šai vērtība nedrīkst pārsniegt %s."
+
+#: core/validators.py:407
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Šai vērtībai jābūt %s pakāpei."
+
+#: core/validators.py:418
+msgid "Please enter a valid decimal number."
+msgstr "Lūdzu ievadiet korektu decimālu numuru."
+
+#: core/validators.py:422
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural "Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Lūdzu ievadiet korektu decimālu numuru ar maksimālu ciparu skaitu %s."
+msgstr[1] "Lūdzu ievadiet korektu decimālu numuru ar maksimālu ciparu skaitu %s."
+
+#: core/validators.py:425
+#, python-format
+msgid "Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural "Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] "Lūdzu ievadiet korektu decimālu numuru ar maksimālu ciparu skaitu %s."
+msgstr[1] "Lūdzu ievadiet korektu decimālu numuru ar maksimālu ciparu skaitu %s."
+
+#: core/validators.py:428
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural "Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "Lūdzu ievadiet korektu decimālu numuru ar maksimālu ciparu skaitu aiz komata %s."
+msgstr[1] "Lūdzu ievadiet korektu decimālu numuru ar maksimālu ciparu skaitu aiz komata %s."
+
+#: core/validators.py:438
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Pārliecinieties, ka jūsu augšupielādētais fails ir vismaz %s baiti liels."
+
+#: core/validators.py:439
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Pārliecinieties, ka jūsu augšupielādētais fails ir maksimums %s baiti liels."
+
+#: core/validators.py:456
+msgid "The format for this field is wrong."
+msgstr "Šī faila formāts ir nekorekts."
+
+#: core/validators.py:471
+msgid "This field is invalid."
+msgstr "Šis lauks ir nekorekts."
+
+#: core/validators.py:507
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Nevar neko no %s"
+
+#: core/validators.py:510
+#, python-format
+msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "URL %(url)s atgrieza nekorektu Content-Type headeri '%(contenttype)s'."
+
+#: core/validators.py:543
+#, python-format
+msgid "Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with \"%(start)s\".)"
+msgstr "Lūdzu aiztaisiet neaiztaisīto %(tag)s tagu no rindas nr %(line)s. (Rinda sākas ar \"%(start)s\".)"
+
+#: core/validators.py:547
+#, python-format
+msgid "Some text starting on line %(line)s is not allowed in that context. (Line starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:552
+#, python-format
+msgid "\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:557
+#, python-format
+msgid "\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:561
+#, python-format
+msgid "A tag on line %(line)s is missing one or more required attributes. (Line starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:566
+#, python-format
+msgid "The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line starts with \"%(start)s\".)"
+msgstr ""
+
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "%(verbose_name)s tika veiksmīgi izveidots."
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "%(verbose_name)s tika veiksmīgi dzēsts."
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "%(verbose_name)s tika dzēsts."
+
+#: newforms/models.py:165
+#: newforms/fields.py:364
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Izvēlaties pareizu izvēli. Jūsu izvēlētais objekts neietilpst pieejamo sarakstā."
+
+#: newforms/models.py:182
+#: newforms/fields.py:380
+#: newforms/fields.py:456
+msgid "Enter a list of values."
+msgstr "Ievadiet sarakstu ar vērtībām."
+
+#: newforms/models.py:188
+#: newforms/fields.py:389
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Izvēlieties pareizu izvēli. %s nav pieejamo izvēļu sarakstā."
+
+#: newforms/fields.py:103
+#: newforms/fields.py:256
+#, python-format
+msgid "Ensure this value has at most %d characters."
+msgstr "Vērtībai jasatur ne vairāk, kā %d rakstzīmju."
+
+#: newforms/fields.py:105
+#: newforms/fields.py:258
+#, python-format
+msgid "Ensure this value has at least %d characters."
+msgstr "Vērtībai jasatur vismaz %d rakstzīmju."
+
+#: newforms/fields.py:130
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Šai vērtībai jabūt mazākai vai vienādai ar %s."
+
+#: newforms/fields.py:132
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Vērtībai jabūt lielākai vai vienādai ar %s."
+
+#: newforms/fields.py:165
+msgid "Enter a valid date."
+msgstr "Ievadiet korektu datumu."
+
+#: newforms/fields.py:192
+msgid "Enter a valid time."
+msgstr "Ievadiet korektu laiku."
+
+#: newforms/fields.py:228
+msgid "Enter a valid date/time."
+msgstr "Ievadiet korektu datumu/laiku."
+
+#: newforms/fields.py:242
+msgid "Enter a valid value."
+msgstr "Ievadiet korektu vērtību."
+
+#: newforms/fields.py:289
+#: newforms/fields.py:311
+msgid "Enter a valid URL."
+msgstr "Ievadiet korektu adresi."
+
+#: newforms/fields.py:313
+msgid "This URL appears to be a broken link."
+msgstr "Šī adrese ir bojāta."
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "th"
+msgstr "th"
+
+#: contrib/humanize/templatetags/humanize.py:17
+#, fuzzy
+msgid "st"
+msgstr "saits"
+
+#: contrib/humanize/templatetags/humanize.py:17
+#, fuzzy
+msgid "nd"
+msgstr "un"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "rd"
+msgstr "rd"
+
+#: contrib/humanize/templatetags/humanize.py:47
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/humanize/templatetags/humanize.py:50
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/humanize/templatetags/humanize.py:53
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "one"
+msgstr "viens"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "two"
+msgstr "divi"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "three"
+msgstr "trīs"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "four"
+msgstr "četri"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "five"
+msgstr "pieci"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "six"
+msgstr "seši"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "seven"
+msgstr "septiņi"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "eight"
+msgstr "astoņi"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "nine"
+msgstr "deviņi"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "novirzīt(redirect) no"
+
+#: contrib/redirects/models.py:8
+msgid "This should be an absolute path, excluding the domain name. Example: '/events/search/'."
+msgstr "Tam jābūt absolūtajam ceļam, ieskaitot domēna vārdu. Piemēram: '/events/search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "novirzīt(redirect) uz"
+
+#: contrib/redirects/models.py:10
+msgid "This can be either an absolute path (as above) or a full URL starting with 'http://'."
+msgstr "Tas ir vai nu absolūtais ceļš (kā pirms tam) vai pilnais URL, kas sākas ar 'http://'."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "novirzīt"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "novirzījumi"
+
+#: contrib/comments/models.py:67
+#: contrib/comments/models.py:166
+msgid "object ID"
+msgstr "objekta ID"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "virsraksts"
+
+#: contrib/comments/models.py:69
+#: contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "komentārs"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "reitings #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "reitings #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "reitings #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "reitings #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "reitings #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "reitings #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "reitings #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "reitings #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "korekts reitings"
+
+#: contrib/comments/models.py:83
+#: contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "ievietošanas datums/laiks"
+
+#: contrib/comments/models.py:84
+#: contrib/comments/models.py:170
+msgid "is public"
+msgstr "publisks"
+
+#: contrib/comments/models.py:85
+#: contrib/admin/views/doc.py:304
+msgid "IP address"
+msgstr "IP adrese"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "idzēsts"
+
+#: contrib/comments/models.py:86
+msgid "Check this box if the comment is inappropriate. A \"This comment has been removed\" message will be displayed instead."
+msgstr "Atķeksējiet, ja komentārs ir neatbilstošs. Paziņojums A \"Šis komentārs ir izdzēsts\" tiks parādīts tai vietā."
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "komentāri"
+
+#: contrib/comments/models.py:131
+#: contrib/comments/models.py:207
+msgid "Content object"
+msgstr "Satura objekts"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Pievienojis  %(user)s, %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "personas vārds"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "ip adrese"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "apstiprinājusi administrācija"
+
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "brīvais komentārs"
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "brīvie komentāri"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "rezultāts"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "rezultāta datums"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "karmas rezultāts"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "karmas rezultāti"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d reitingu publicējis %(user)s"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Šo komentāru atzīmējis %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "atzīmēšanas datums"
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "lietotāja atzīme"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "lietotāja atzīmes"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "Atzīmējis %r"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "dzēšanas datums"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "moderācijas dzēšana"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "moderācijas dzēšanas"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Moderācijas dzēšana, veicis %r"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Anonīmie lietotāji nedrīkst balsot"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "Invalīds komentāru ID"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "Nedrīkst balsot par sevi"
+
+#: contrib/comments/views/comments.py:27
+msgid "This rating is required because you've entered at least one other rating."
+msgstr "Šis reiting ir obligāts jo Jūs ievietojāt vismaz vienu citu reitingu."
+
+#: contrib/comments/views/comments.py:111
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Šo komentāru ir ievietojis lietotājs, kas ievietojis mazāk kā %(count)s komentāru:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Šo komentāru ir ievietojis lietotājs, kas ievietojis mazāk kā %(count)s komentārus:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:116
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Šo komentāru ieviejis paviršs lietotājs:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:188
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Atļauti tikai POST izsaukumi"
+
+#: contrib/comments/views/comments.py:192
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Viens vai vairāki pieprasītie lauki netika ievadīti"
+
+#: contrib/comments/views/comments.py:196
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Kāds ir iejaucies komentāru formā (drošības traucējums)"
+
+#: contrib/comments/views/comments.py:206
+#: contrib/comments/views/comments.py:292
+msgid "The comment form had an invalid 'target' parameter -- the object ID was invalid"
+msgstr "Komentāru forma ir nekorekts 'target' parametrs -- objekta ID bija nepareizs"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "Komentāru forma nenodrošināja 'preview' vai 'post'"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "Lietotāja vārds:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+msgid "Log out"
+msgstr "Izlogoties"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Parole:"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Esat aizmirsis savu paroli?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Reitings"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Pieprasīts"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Neobligāts"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Ievietojiet fotogrāfiju"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Komentārs:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Pirmsskatīt komentāru"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Jūsu vārds:"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "domēna vārds"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "izvadāmais vārds"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "saits"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "saiti"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:70
+#: contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143
+#: contrib/admin/filterspecs.py:169
+msgid "All"
+msgstr "Visi"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "Jebkuršs datums"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "Šodien"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "Pēdējās 7 dienas"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "Šomēnes"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "Šogad"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "darbības laiks"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "objekta id"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "objekta attēlojunms"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "darbības atzīme"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "momainīt paziņojumu"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "žurnāla ieraksts"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "žurnāla ieraksti"
+
+#: contrib/admin/templatetags/admin_list.py:247
+msgid "All dates"
+msgstr "Visi datumi"
+
+#: contrib/admin/views/auth.py:19
+#: contrib/admin/views/main.py:257
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" pievienots sekmīgi."
+
+#: contrib/admin/views/auth.py:24
+#: contrib/admin/views/main.py:261
+#: contrib/admin/views/main.py:347
+msgid "You may edit it again below."
+msgstr "Jūs varat labot to atkal zemāk."
+
+#: contrib/admin/views/auth.py:30
+msgid "Add user"
+msgstr "Pievienot lietotāju"
+
+#: contrib/admin/views/auth.py:57
+msgid "Password changed successfully."
+msgstr "Paroles maiņa notikusi veiksmīgi."
+
+#: contrib/admin/views/auth.py:64
+#, python-format
+msgid "Change password: %s"
+msgstr "Paroles maiņa: %s"
+
+#: contrib/admin/views/main.py:223
+msgid "Site administration"
+msgstr "Saita administrācija"
+
+#: contrib/admin/views/main.py:271
+#: contrib/admin/views/main.py:356
+#, python-format
+msgid "You may add another %s below."
+msgstr "Jūs varat pievienot vēl vienu %s zemāk."
+
+#: contrib/admin/views/main.py:289
+#, python-format
+msgid "Add %s"
+msgstr "Pievienot %s"
+
+#: contrib/admin/views/main.py:335
+#, python-format
+msgid "Added %s."
+msgstr "Pievienots %s."
+
+#: contrib/admin/views/main.py:337
+#, python-format
+msgid "Changed %s."
+msgstr "Izmainīts %s."
+
+#: contrib/admin/views/main.py:339
+#, python-format
+msgid "Deleted %s."
+msgstr "Izdzēsts %s"
+
+#: contrib/admin/views/main.py:342
+msgid "No fields changed."
+msgstr "Neviens lauks nav izmainīts"
+
+#: contrib/admin/views/main.py:345
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" nomainīts sekmīgi."
+
+#: contrib/admin/views/main.py:353
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" pievienots sekmīgi. Jūs to varat regiģēt zemāk."
+
+#: contrib/admin/views/main.py:391
+#, python-format
+msgid "Change %s"
+msgstr "Izmainīt %s"
+
+#: contrib/admin/views/main.py:476
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr ""
+
+#: contrib/admin/views/main.py:481
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr ""
+
+#: contrib/admin/views/main.py:514
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" sekmīgi izdzēsts."
+
+#: contrib/admin/views/main.py:517
+msgid "Are you sure?"
+msgstr "Vai esat pārliecināts?"
+
+#: contrib/admin/views/main.py:539
+#, python-format
+msgid "Change history: %s"
+msgstr "Izmainīt vēsturi: %s"
+
+#: contrib/admin/views/main.py:573
+#, python-format
+msgid "Select %s"
+msgstr "Izvēlēties %s"
+
+#: contrib/admin/views/main.py:573
+#, python-format
+msgid "Select %s to change"
+msgstr "Izvēlēties %s lai izmainītu"
+
+#: contrib/admin/views/main.py:768
+msgid "Database error"
+msgstr "Datubāzes kļūda"
+
+#: contrib/admin/views/decorators.py:10
+#: contrib/auth/forms.py:60
+msgid "Please enter a correct username and password. Note that both fields are case-sensitive."
+msgstr "Lūdzu ievadiet lietotājvārdu un paroli. Atceraties ka abi lauki ir reģistrjūtīgi."
+
+#: contrib/admin/views/decorators.py:24
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Pieslēdzieties"
+
+#: contrib/admin/views/decorators.py:62
+msgid "Please log in again, because your session has expired. Don't worry: Your submission has been saved."
+msgstr "Lūdzu pieslēdzieties vēlreiz, jo jūsu sesija ir novecojusi. Neuztraucieties: Jūsu ievadītie dati ir saglabāti."
+
+#: contrib/admin/views/decorators.py:69
+msgid "Looks like your browser isn't configured to accept cookies. Please enable cookies, reload this page, and try again."
+msgstr "Izskatās, ka Jūsu pārlūks neatbalsta sīkdatnes (cookies). Lūdzu ieslēdziet sīkdatņu atbalstu, pārlādējiet lapu un mēģiniet vēlreiz."
+
+#: contrib/admin/views/decorators.py:83
+msgid "Usernames cannot contain the '@' character."
+msgstr "Lietotājvārdi nevar saturēt simbolu '@'."
+
+#: contrib/admin/views/decorators.py:85
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "Jūsu e-pasta adrese nav jūsu lietotājvārds. Lietojiet '%s' tā vietā."
+
+#: contrib/admin/views/doc.py:46
+#: contrib/admin/views/doc.py:48
+#: contrib/admin/views/doc.py:50
+msgid "tag:"
+msgstr ""
+
+#: contrib/admin/views/doc.py:77
+#: contrib/admin/views/doc.py:79
+#: contrib/admin/views/doc.py:81
+msgid "filter:"
+msgstr "filtrs:"
+
+#: contrib/admin/views/doc.py:135
+#: contrib/admin/views/doc.py:137
+#: contrib/admin/views/doc.py:139
+msgid "view:"
+msgstr "skats:"
+
+#: contrib/admin/views/doc.py:164
+#, python-format
+msgid "App %r not found"
+msgstr "Aplikācija %r netika atrasta"
+
+#: contrib/admin/views/doc.py:171
+#, python-format
+msgid "Model %(name)r not found in app %(label)r"
+msgstr ""
+
+#: contrib/admin/views/doc.py:183
+#, python-format
+msgid "the related `%(label)s.%(type)s` object"
+msgstr ""
+
+#: contrib/admin/views/doc.py:183
+#: contrib/admin/views/doc.py:205
+#: contrib/admin/views/doc.py:219
+#: contrib/admin/views/doc.py:224
+msgid "model:"
+msgstr "modelis:"
+
+#: contrib/admin/views/doc.py:214
+#, python-format
+msgid "related `%(label)s.%(name)s` objects"
+msgstr "saistītie `%(label)s.%(name)s` objekti"
+
+#: contrib/admin/views/doc.py:219
+#, python-format
+msgid "all %s"
+msgstr "visi %s"
+
+#: contrib/admin/views/doc.py:224
+#, python-format
+msgid "number of %s"
+msgstr ""
+
+#: contrib/admin/views/doc.py:229
+#, python-format
+msgid "Fields on %s objects"
+msgstr ""
+
+#: contrib/admin/views/doc.py:291
+#: contrib/admin/views/doc.py:301
+#: contrib/admin/views/doc.py:303
+#: contrib/admin/views/doc.py:309
+#: contrib/admin/views/doc.py:310
+#: contrib/admin/views/doc.py:312
+msgid "Integer"
+msgstr "Vesels skaitlis"
+
+#: contrib/admin/views/doc.py:292
+msgid "Boolean (Either True or False)"
+msgstr "Boolean (Pareizs vai Nepareizs)"
+
+#: contrib/admin/views/doc.py:293
+#: contrib/admin/views/doc.py:311
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "Virkne (līdz pat %(maxlength)s)"
+
+#: contrib/admin/views/doc.py:294
+msgid "Comma-separated integers"
+msgstr "Ar komatu atdalīti veselie skaitļi"
+
+#: contrib/admin/views/doc.py:295
+msgid "Date (without time)"
+msgstr "Datums (bez laika)"
+
+#: contrib/admin/views/doc.py:296
+msgid "Date (with time)"
+msgstr "Datums (ar laiku)"
+
+#: contrib/admin/views/doc.py:297
+msgid "E-mail address"
+msgstr "E-pasta adrese"
+
+#: contrib/admin/views/doc.py:298
+#: contrib/admin/views/doc.py:299
+#: contrib/admin/views/doc.py:302
+msgid "File path"
+msgstr "Faila ceļš"
+
+#: contrib/admin/views/doc.py:300
+msgid "Decimal number"
+msgstr "Decimāls skaitlis"
+
+#: contrib/admin/views/doc.py:306
+msgid "Boolean (Either True, False or None)"
+msgstr "Loģiskais (Pareizs vai Nepareizs)"
+
+#: contrib/admin/views/doc.py:307
+msgid "Relation to parent model"
+msgstr "Relācija uz vecāka modeli"
+
+#: contrib/admin/views/doc.py:308
+msgid "Phone number"
+msgstr "Telefona numurs"
+
+#: contrib/admin/views/doc.py:313
+msgid "Text"
+msgstr "Teksts"
+
+#: contrib/admin/views/doc.py:314
+msgid "Time"
+msgstr "Laiks"
+
+#: contrib/admin/views/doc.py:315
+#: contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:316
+msgid "U.S. state (two uppercase letters)"
+msgstr "ASV štats (divi augšējā reģistra burti)"
+
+#: contrib/admin/views/doc.py:317
+msgid "XML text"
+msgstr "XML teksts"
+
+#: contrib/admin/views/doc.py:343
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr ""
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Patreiz:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Nomainīt:"
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Datums:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Laiks:"
+
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Dokumentācija"
+
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin/auth/user/change_password.html:15
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+msgid "Change password"
+msgstr "Paroles maiņa"
+
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/auth/user/change_password.html:12
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Sākums"
+
+#: contrib/admin/templates/admin/change_list.html:12
+#, python-format
+msgid "Add %(name)s"
+msgstr "Pievienot %(name)s"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Pēc %(filter_title)s "
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "History"
+msgstr "Vēsture"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Datums/laiks"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Lietotājs"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "darbība"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "j. N Y, H:i"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid "This object doesn't have a change history. It probably wasn't added via this admin site."
+msgstr "Šim objektam nav izmaiņu vēsture. Tas visdrīzāk nav pievienots izmantojot administrācijas saitu."
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Aiziet!"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr ""
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Rādīt visu"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django saita administrācija"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django administrēšana"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Servera kļūda"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Servera kļūda (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Servera kļūda <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid "There's been an error. It's been reported to the site administrators via e-mail and should be fixed shortly. Thanks for your patience."
+msgstr "Ir notikusi kļūda. Tas ir paziņots saita administratoriem ar e-pasta starpniecību un visdrīzākajā laikā tiks izlabots. Paldies par sapratni."
+
+#: contrib/admin/templates/admin/invalid_setup.html:8
+msgid "Something's wrong with your database installation. Make sure the appropriate database tables have been created, and make sure the database is readable by the appropriate user."
+msgstr "Kaut kas nav kārtībā ar Jūsu datubāzes instalāciju. Pārliecinieties vai attiecīgās tabulas ir izveidotas un attiecīgajam lietotājam ir tiesības lasīt datubāzi."
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Modeļi, kas pieejami %(name)s aplikācijā."
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "Pievienot"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Izmainīt"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Jums nav tiesības jebko labot."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Nesenās darbības"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Manas darbības"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Nav pieejams"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Lapa nav atrasta"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Mēs atvainojamies, bet pieprasītā lapa nevar tikt atrasta."
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "Filtrs"
+
+#: contrib/admin/templates/admin/change_form.html:22
+msgid "View on site"
+msgstr "Apskatīt saitā"
+
+#: contrib/admin/templates/admin/change_form.html:32
+#: contrib/admin/templates/admin/auth/user/change_password.html:24
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Lūdzu izlabojiet kļūdu zemāk"
+msgstr[1] "Lūdzu izlabojiet kļūdas zemāk"
+
+#: contrib/admin/templates/admin/change_form.html:50
+msgid "Ordering"
+msgstr "Sakārtošana"
+
+#: contrib/admin/templates/admin/change_form.html:53
+msgid "Order:"
+msgstr "Sakārtojums:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Dzēst"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid "Deleting the %(object_name)s '%(escaped_object)s' would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:"
+msgstr "Izdzēšot objektu %(object_name)s '%(escaped_object)s' tiks dzēsti visi saistītie objekti , bet Jums nav tiesību dzēst sekojošus objektu tipus:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid "Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? All of the following related items will be deleted:"
+msgstr "Vai esat pārliecināts, ka vēlaties dzēst %(object_name)s \"%(escaped_object)s\"? Tiks dzēsti  asrī sekojoši saistītie objekti:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Jā, es esmu pārliecināts"
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "Sveicināti,"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Saglabāt kā jaunu"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Saglabāt un pievienot vēl vienu"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Saglabāt un turpināt labošanu"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Saglabāt"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:28
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Ievadiet jaunu paroli lietotājam <strong>%(username)s</strong>."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:34
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+msgid "Password"
+msgstr "Parole"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+msgid "Password (again)"
+msgstr "Parole (vēlreiz)"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+msgid "Enter the same password as above, for verification."
+msgstr "Ievadot tādu pašu paroli, kā augstāk, pārbaudei."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid "First, enter a username and password. Then, you'll be able to edit more user options."
+msgstr ""
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "Lietotāja vārds"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Paroles maiņa"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Paroles nomaiņa sekmīga"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Jūsu parole ir nomainīta."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Paroles pārstatīšana(reset)"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid "Forgotten your password? Enter your e-mail address below, and we'll reset your password and e-mail the new one to you."
+msgstr "Esat aizmirsuši savu paroli? Ievadiet e-pasta adresi zemāk un mēs pārstatīsim Jūsu paroli un aizsūtīsim jaunu pa e-pastu."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "E-pasta adrese:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Paroles pārstatīšana"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Paldies par pavadīto laiku māja lapā."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Pieslēgties vēlreiz"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Paroles pārstatīšana sekmīga"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid "We've e-mailed a new password to the e-mail address you submitted. You should be receiving it shortly."
+msgstr "Mēs aizsūtījām pa e-pastu jaunu paroli, ko Jūs esat apstiprinājis. Jūs to drīzumā saņemsiet."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid "Please enter your old password, for security's sake, and then enter your new password twice so we can verify you typed it in correctly."
+msgstr "Drošības nolūkos ievadiet veco paroli un pēc tam ievadiet Jūsu jauno paroli divreiz lai mēs varētu pārbaudīt, vai tā ir uzrakstīta pareizi."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Vecā parole:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Jaunā parole:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Apstiprināt paroli:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Nomainīt manu paroli"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Jūs esat saņēmuši šo e-pastu sakarā ar Jūsu pieprasīto paroles pārstatīšanu"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "Jūsu lietotāja kontam %(site_name)s saitā"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Jūsu jaunais parole ir: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Jūs vienmēr varat nomainīt šo paroli aizejot uz šo lapu:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Jūsu lietotājvārds, ja gadījumā Jūs esat to aizmirsis:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Paldies par mūsu saita lietošanu!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s komanda"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Grāmatzīmes"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "Dokumentācijas grāmatzīmes"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Dokumentācija šai lapai"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid "Jumps you from any page to the documentation for the view that generates that page."
+msgstr "Pārvieto jūs no jebkuras lapas dokumentācijā uz skatu, kas ģenerē šo lapu."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Parādīt objekta ID"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid "Shows the content-type and unique ID for pages that represent a single object."
+msgstr "Parāda content-type un unikālo ID lapām, kas atspoguļo vientuļu objektu."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Labot šo objektu (patreizējā logā)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "Pāriet uz admininstrācijas lapu tām lapām, kas atspoguļo vientuļu objektu."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Labot šo lapu (jaunā logā)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "Tāpat kā iepriekš, tikai atver administrācijas lapu jaunā logā."
+
+#: contrib/contenttypes/models.py:36
+msgid "python model class name"
+msgstr "python modeļa klases nosaukums"
+
+#: contrib/contenttypes/models.py:39
+msgid "content type"
+msgstr "satura tips"
+
+#: contrib/contenttypes/models.py:40
+msgid "content types"
+msgstr "satura tips"
+
+#: contrib/auth/views.py:40
+msgid "Logged out"
+msgstr "Izlogojies"
+
+#: contrib/auth/models.py:44
+#: contrib/auth/models.py:64
+msgid "name"
+msgstr "nosaukums"
+
+#: contrib/auth/models.py:46
+msgid "codename"
+msgstr "kods"
+
+#: contrib/auth/models.py:49
+msgid "permission"
+msgstr "tiesība"
+
+#: contrib/auth/models.py:50
+#: contrib/auth/models.py:65
+msgid "permissions"
+msgstr "tiesības"
+
+#: contrib/auth/models.py:68
+msgid "group"
+msgstr "grupa"
+
+#: contrib/auth/models.py:69
+#: contrib/auth/models.py:109
+msgid "groups"
+msgstr "grupas"
+
+#: contrib/auth/models.py:99
+msgid "username"
+msgstr "lietotāja vārds"
+
+#: contrib/auth/models.py:99
+msgid "Required. 30 characters or fewer. Alphanumeric characters only (letters, digits and underscores)."
+msgstr ""
+
+#: contrib/auth/models.py:100
+msgid "first name"
+msgstr "vārds"
+
+#: contrib/auth/models.py:101
+msgid "last name"
+msgstr "uzvārds"
+
+#: contrib/auth/models.py:102
+msgid "e-mail address"
+msgstr "e-pasta adrese"
+
+#: contrib/auth/models.py:103
+msgid "password"
+msgstr "parole"
+
+#: contrib/auth/models.py:103
+msgid "Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change password form</a>."
+msgstr ""
+
+#: contrib/auth/models.py:104
+msgid "staff status"
+msgstr "personāla statuss"
+
+#: contrib/auth/models.py:104
+msgid "Designates whether the user can log into this admin site."
+msgstr "Atzīmējiet, ja vēlaties, lai lietotājs var pieslēgties administrācijas lapā."
+
+#: contrib/auth/models.py:105
+msgid "active"
+msgstr "aktīvs"
+
+#: contrib/auth/models.py:105
+msgid "Designates whether this user can log into the Django admin. Unselect this instead of deleting accounts."
+msgstr "Nosaka, ka lietotājs var pieslēgties Django administrācijas lapai. Ieteicams atcelt šo izvēli nevis dzēst lietotājus."
+
+#: contrib/auth/models.py:106
+msgid "superuser status"
+msgstr "superlietotāja statuss"
+
+#: contrib/auth/models.py:106
+msgid "Designates that this user has all permissions without explicitly assigning them."
+msgstr ""
+
+#: contrib/auth/models.py:107
+msgid "last login"
+msgstr "pēdējoreiz pieslēdzies"
+
+#: contrib/auth/models.py:108
+msgid "date joined"
+msgstr "datums, kad pievienojies"
+
+#: contrib/auth/models.py:110
+msgid "In addition to the permissions manually assigned, this user will also get all permissions granted to each group he/she is in."
+msgstr "Papildus manuāli piešķirtajām atļaujām, šis lietotājs papildus iegūs visas atļaujas, kas piešķirtas grupām, kurās lietotājs atrodas."
+
+#: contrib/auth/models.py:111
+msgid "user permissions"
+msgstr "lietotāja atļaujas"
+
+#: contrib/auth/models.py:115
+msgid "user"
+msgstr "lietotājs"
+
+#: contrib/auth/models.py:116
+msgid "users"
+msgstr "lietotāji"
+
+#: contrib/auth/models.py:122
+msgid "Personal info"
+msgstr "Personīgā informācija"
+
+#: contrib/auth/models.py:123
+msgid "Permissions"
+msgstr "Atļaujas"
+
+#: contrib/auth/models.py:124
+msgid "Important dates"
+msgstr "Svarīgi datumi"
+
+#: contrib/auth/models.py:125
+msgid "Groups"
+msgstr "Grupas"
+
+#: contrib/auth/models.py:269
+msgid "message"
+msgstr "ziņojums"
+
+#: contrib/auth/models.py:282
+msgid "AnonymousUser"
+msgstr "Anonīms lietotājs"
+
+#: contrib/auth/forms.py:17
+#: contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr ""
+
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr "Lietotājs ar šādu lietotāja vārdu jau eksistē."
+
+#: contrib/auth/forms.py:53
+msgid "Your Web browser doesn't appear to have cookies enabled. Cookies are required for logging in."
+msgstr "Izskatās, ka Jūsu pārlūks neatbalsta cookies. Cookies ir obligātas, lai pieslēgtos."
+
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "Šis konts ir neaktīvs."
+
+#: contrib/auth/forms.py:85
+msgid "That e-mail address doesn't have an associated user account. Are you sure you've registered?"
+msgstr ""
+
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "Abi \"Jaunā parole\" lauki nesakrīt."
+
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Jūsu iepriekšējā parole tika ievadīta nekorekti. Lūdzu ievadiet to atkārtoti."
+
+#: contrib/localflavor/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
+msgstr "Ievadiet pasta indeksu. Atstarpe ir nepieciešama starp abām pasta indeksa daļām."
+
+#: contrib/localflavor/br/forms.py:18
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Ievadiet pasta indeksu XXXXX-XXX formātā."
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "Telefona numuriem jābūt XXX-XXXX-XXXX formātā."
+
+#: contrib/localflavor/br/forms.py:72
+msgid "This field requires only numbers."
+msgstr "Šis lauks drīkst saturēt tikai skaitļus."
+
+#: contrib/localflavor/br/forms.py:74
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr "Šī lauka vērtībai jabūt vismaz 11 cipariem vai 14 simboliem."
+
+#: contrib/localflavor/br/forms.py:84
+msgid "Invalid CPF number."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:106
+msgid "This field requires at least 14 digits"
+msgstr "Šim laukam jasastāv vismaz no 14 cipariem."
+
+#: contrib/localflavor/br/forms.py:116
+msgid "Invalid CNPJ number."
+msgstr ""
+
+#: contrib/localflavor/au/forms.py:18
+msgid "Enter a 4 digit post code."
+msgstr "Ievadiet pasta indeksu, kurš sastāv no 4 cipariem."
+
+#: contrib/localflavor/fr/forms.py:17
+#: contrib/localflavor/de/forms.py:16
+#: contrib/localflavor/fi/forms.py:14
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Ievadiet pasta indeksu formātā XXXXX."
+
+#: contrib/localflavor/us/forms.py:18
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr ""
+
+#: contrib/localflavor/us/forms.py:51
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr "Hamburga"
+
+#: contrib/localflavor/de/de_states.py:11
+#, fuzzy
+msgid "Hessen"
+msgstr "sesija"
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr ""
+
+#: contrib/localflavor/de/forms.py:60
+msgid "Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X format."
+msgstr "Ievadiet korektu vāciešu identifikācijas nummuru XXXXXXXXXXX-XXXXXXX-XXXXXXX-X formātā."
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+#, fuzzy
+msgid "Iwate"
+msgstr "Datums:"
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr "Tokija"
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+#, fuzzy
+msgid "Shimane"
+msgstr "Izmainīt"
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+#, fuzzy
+msgid "Ehime"
+msgstr "Laiks"
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr "Okinava"
+
+#: contrib/localflavor/jp/forms.py:21
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "Ievadiet pasta indeksu XXXXXXX vai XXX-XXXX formātā."
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:10
+#, fuzzy
+msgid "Berne"
+msgstr "lietotāja vārds"
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:13
+#, fuzzy
+msgid "Glarus"
+msgstr "Grupas"
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:16
+#, fuzzy
+msgid "Lucerne"
+msgstr "lietotāja vārds"
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:24
+#, fuzzy
+msgid "Thurgau"
+msgstr "Ceturdiena"
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:29
+#, fuzzy
+msgid "Zug"
+msgstr "aug"
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr ""
+
+#: contrib/localflavor/ch/forms.py:18
+#: contrib/localflavor/no/forms.py:15
+msgid "Enter a zip code in the format XXXX."
+msgstr "Ievadiet pasta indeksu formātā XXXX."
+
+#: contrib/localflavor/ch/forms.py:90
+msgid "Enter a valid Swiss identity or passport card number in X1234567<0 or 1234567890 format."
+msgstr "Lūdzu ievadiet korektu šveiciešu identifikācijas vai pases nummuru X1234567<0 vai 1234567890 formātā."
+
+#: contrib/localflavor/is_/forms.py:16
+msgid "Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr "Lūdzu ievadiet korektu islandiešu identifikācijas nummuru XXXXXX-XXXX formātā."
+
+#: contrib/localflavor/is_/forms.py:30
+msgid "The Icelandic identification number is not valid."
+msgstr "Islandiešu identifikācijas nummurs nav korekts."
+
+#: contrib/localflavor/it/forms.py:16
+msgid "Enter a valid zip code."
+msgstr "Ievadiet korektu pasta indeksu."
+
+#: contrib/localflavor/it/forms.py:41
+msgid "Enter a valid Social Security number."
+msgstr "Ievadiet korektu sociālās drošības nummuru."
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr "Ievadiet korektu VAT nummuru."
+
+#: contrib/localflavor/no/forms.py:36
+msgid "Enter a valid Norwegian social security number."
+msgstr "Lūdzu ievadiet korektu norvēģu sociālās drošības nummuru."
+
+#: contrib/localflavor/cl/forms.py:21
+msgid "Enter valid a Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr "Ievadiet korektu čīliešu RUT XX.XXX.XXX-X formātā."
+
+#: contrib/localflavor/cl/forms.py:26
+msgid "Enter valid a Chilean RUT"
+msgstr "Ievadiet korektu čīliešu RUT"
+
+#: contrib/localflavor/fi/forms.py:40
+#: contrib/localflavor/fi/forms.py:45
+msgid "Enter a valid Finnish social security number."
+msgstr "Ievadiet korektu somu sociālās drošības nummuru."
+
+#: contrib/sessions/models.py:68
+msgid "session key"
+msgstr "sesijas atslēga"
+
+#: contrib/sessions/models.py:69
+msgid "session data"
+msgstr "sesijas dati"
+
+#: contrib/sessions/models.py:70
+msgid "expire date"
+msgstr "beigu datums"
+
+#: contrib/sessions/models.py:74
+msgid "session"
+msgstr "sesija"
+
+#: contrib/sessions/models.py:75
+msgid "sessions"
+msgstr "sesijas"
+
+#: contrib/flatpages/models.py:8
+msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr "Piemēram: '/about/contact/'. Pārliecinieties, ka esat ievietojuši sākuma un beigu slīpsvītras."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "virsraksts"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "saturs"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "ieslēgt komentārus"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "šablona nosaukums"
+
+#: contrib/flatpages/models.py:13
+msgid "Example: 'flatpages/contact_page.html'. If this isn't provided, the system will use 'flatpages/default.html'."
+msgstr "Piemēram: 'flatpages/contact_page.html'. Ja tas nav norādīts, sistēma lietos  'flatpages/default.html'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "reģistrācija obligāta"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Ja tas ir atzīmēts, tikai lietotāji, kas ir pieslēgušies sistēmās redzēs šo lapu."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "vienkārša lapa"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "vienkāršas lapas"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Pirmdiena"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Otrdiena"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Trešdiena"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Ceturdiena"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Piektdiena"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Sestdiena"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Svētdiena"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Janvāris"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Februāris"
+
+#: utils/dates.py:14
+#: utils/dates.py:27
+msgid "March"
+msgstr "Marts"
+
+#: utils/dates.py:14
+#: utils/dates.py:27
+msgid "April"
+msgstr "Aprīlis"
+
+#: utils/dates.py:14
+#: utils/dates.py:27
+msgid "May"
+msgstr "Maijs"
+
+#: utils/dates.py:14
+#: utils/dates.py:27
+msgid "June"
+msgstr "Jūnijs"
+
+#: utils/dates.py:15
+#: utils/dates.py:27
+msgid "July"
+msgstr "Jūlijs"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "Augusts"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "Septembris"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Oktobris"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "Novembris"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "Decembris"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr "jan"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "feb"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "mar"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "apr"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "mai"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "jūn"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "jūl"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "aug"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "sep"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "okt"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "nov"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "dec"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Jan."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Feb."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Aug."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Sept."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Okt."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "Nov."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Dec."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "gads"
+msgstr[1] "gadi"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mēnesis"
+msgstr[1] "mēneši"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "nedēļa"
+msgstr[1] "nedēļas"
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "diena"
+msgstr[1] "dienas"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "stunda"
+msgstr[1] "stundas"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minūte"
+msgstr[1] "minūtes"
+
+#: utils/timesince.py:40
+#, python-format
+msgid "%d milliseconds"
+msgstr "%d millisekundes"
+
+#: utils/timesince.py:41
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr "%(number)d %(type)s"
+
+#: utils/timesince.py:47
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ", %(number)d %(type)s"
+
+#: utils/dateformat.py:40
+#, fuzzy
+msgid "p.m."
+msgstr "p.m."
+
+#: utils/dateformat.py:41
+#, fuzzy
+msgid "a.m."
+msgstr "a.m."
+
+#: utils/dateformat.py:46
+#, fuzzy
+msgid "PM"
+msgstr "PM"
+
+#: utils/dateformat.py:47
+#, fuzzy
+msgid "AM"
+msgstr "AM"
+
+#: utils/dateformat.py:95
+msgid "midnight"
+msgstr "pusnakts"
+
+#: utils/dateformat.py:97
+msgid "noon"
+msgstr "dienas vidus"
+
+#: utils/translation/trans_real.py:358
+msgid "DATE_FORMAT"
+msgstr "DATE_FORMAT"
+
+#: utils/translation/trans_real.py:359
+msgid "DATETIME_FORMAT"
+msgstr "DATETIME_FORMAT"
+
+#: utils/translation/trans_real.py:360
+msgid "TIME_FORMAT"
+msgstr "TIME_FORMAT"
+
+#: utils/translation/trans_real.py:376
+msgid "YEAR_MONTH_FORMAT"
+msgstr "YEAR_MONTH_FORMAT"
+
+#: utils/translation/trans_real.py:377
+msgid "MONTH_DAY_FORMAT"
+msgstr "MONTH_DAY_FORMAT"
+
+#: template/defaultfilters.py:491
+msgid "yes,no,maybe"
+msgstr "jā,nē,varbūt"
+
+#: template/defaultfilters.py:520
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: template/defaultfilters.py:522
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f KB"
+
+#: template/defaultfilters.py:524
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: template/defaultfilters.py:525
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
diff --git a/webapp/django/conf/locale/lv/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/lv/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..6f9a8a8
--- /dev/null
+++ b/webapp/django/conf/locale/lv/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/lv/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/lv/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..2e1d307
--- /dev/null
+++ b/webapp/django/conf/locale/lv/LC_MESSAGES/djangojs.po
@@ -0,0 +1,119 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-02-15 10:46+1100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Gatis Tomsons <gatis.tomsons@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "Pieejams %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Izvēlēties visu"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Pievienot"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Izņemt"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Izvēlies %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Izvēlies un klikšķini"
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Attīrīt visu"
+
+#: contrib/admin/media/js/dateparse.js:32
+#: contrib/admin/media/js/calendar.js:24
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr "Janvāris Februāris Marts Aprīlis Maijs Jūnijs Jūlijs Augusts Septembris Oktobris Novembris"
+"Decembris"
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Svētdiena Pirmdiena Otrdiena Trešdiena Ceturtdiena Piektdiena Sestdiena"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "S M T W T F S"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Now"
+msgstr "Tagad"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
+msgid "Clock"
+msgstr "Pulkstens"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
+msgid "Choose a time"
+msgstr "Izvēlieties laiku"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "Midnight"
+msgstr "Pusnakts"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "6 a.m."
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
+msgid "Noon"
+msgstr "Pusdienas laiks"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
+msgid "Cancel"
+msgstr "Atcelt"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
+msgid "Today"
+msgstr "Šodien"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
+msgid "Calendar"
+msgstr "Kalendārs"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
+msgid "Yesterday"
+msgstr "Vakar"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
+msgid "Tomorrow"
+msgstr "Rīt"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr "Parādīt"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr "Slēpt"
diff --git a/webapp/django/conf/locale/mk/LC_MESSAGES/django.mo b/webapp/django/conf/locale/mk/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..6dfd651
--- /dev/null
+++ b/webapp/django/conf/locale/mk/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/mk/LC_MESSAGES/django.po b/webapp/django/conf/locale/mk/LC_MESSAGES/django.po
new file mode 100644
index 0000000..5e531a4
--- /dev/null
+++ b/webapp/django/conf/locale/mk/LC_MESSAGES/django.po
@@ -0,0 +1,4353 @@
+# translation of django.po to Macedonian
+#
+# Georgi Stanojevski <glisha@gmail.com>, 2006, 2007, 2008.
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-06-18 12:26+0200\n"
+"PO-Revision-Date: 2008-06-28 16:36+0200\n"
+"Last-Translator: Georgi Stanojevski <glisha@gmail.com>\n"
+"Language-Team: Macedonian <ossm-members@hedona.on.net.mk>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: conf/global_settings.py:44
+msgid "Arabic"
+msgstr "Арапски"
+
+#: conf/global_settings.py:45
+msgid "Bengali"
+msgstr "Бенгалски"
+
+#: conf/global_settings.py:46
+msgid "Bulgarian"
+msgstr "Бугарски"
+
+#: conf/global_settings.py:47
+msgid "Catalan"
+msgstr "Каталански"
+
+#: conf/global_settings.py:48
+msgid "Czech"
+msgstr "Чешки"
+
+#: conf/global_settings.py:49
+msgid "Welsh"
+msgstr "Велшки"
+
+#: conf/global_settings.py:50
+msgid "Danish"
+msgstr "Дански"
+
+#: conf/global_settings.py:51
+msgid "German"
+msgstr "Германски"
+
+#: conf/global_settings.py:52
+msgid "Greek"
+msgstr "Грчки"
+
+#: conf/global_settings.py:53
+msgid "English"
+msgstr "Англиски"
+
+#: conf/global_settings.py:54
+msgid "Spanish"
+msgstr "Шпански"
+
+#: conf/global_settings.py:55
+msgid "Argentinean Spanish"
+msgstr "Аргентиско шпански"
+
+#: conf/global_settings.py:56
+msgid "Basque"
+msgstr "Баскиски"
+
+#: conf/global_settings.py:57
+msgid "Persian"
+msgstr "Персиски"
+
+#: conf/global_settings.py:58
+msgid "Finnish"
+msgstr "Фински"
+
+#: conf/global_settings.py:59
+msgid "French"
+msgstr "Француски"
+
+#: conf/global_settings.py:60
+msgid "Irish"
+msgstr "Ирски"
+
+#: conf/global_settings.py:61
+msgid "Galician"
+msgstr "Галски"
+
+#: conf/global_settings.py:62
+msgid "Hungarian"
+msgstr "Унгарски"
+
+#: conf/global_settings.py:63
+msgid "Hebrew"
+msgstr "Еврејски"
+
+#: conf/global_settings.py:64
+msgid "Croatian"
+msgstr "Хрватски"
+
+#: conf/global_settings.py:65
+msgid "Icelandic"
+msgstr "Исландски"
+
+#: conf/global_settings.py:66
+msgid "Italian"
+msgstr "Италијански"
+
+#: conf/global_settings.py:67
+msgid "Japanese"
+msgstr "Јапонски"
+
+#: conf/global_settings.py:68
+msgid "Georgian"
+msgstr "Грузиски"
+
+#: conf/global_settings.py:69
+msgid "Korean"
+msgstr "Корејски"
+
+#: conf/global_settings.py:70
+msgid "Khmer"
+msgstr "Кмер"
+
+#: conf/global_settings.py:71
+msgid "Kannada"
+msgstr "Канада"
+
+#: conf/global_settings.py:72
+msgid "Latvian"
+msgstr "Латвиски"
+
+#: conf/global_settings.py:73
+msgid "Macedonian"
+msgstr "Македонски"
+
+#: conf/global_settings.py:74
+msgid "Dutch"
+msgstr "Холандски"
+
+#: conf/global_settings.py:75
+msgid "Norwegian"
+msgstr "Норвешки"
+
+#: conf/global_settings.py:76
+msgid "Polish"
+msgstr "Полски"
+
+#: conf/global_settings.py:77
+msgid "Portugese"
+msgstr "Португалкски"
+
+#: conf/global_settings.py:78
+msgid "Brazilian Portuguese"
+msgstr "Бразилско португалски"
+
+#: conf/global_settings.py:79
+msgid "Romanian"
+msgstr "Романски"
+
+#: conf/global_settings.py:80
+msgid "Russian"
+msgstr "Руски"
+
+#: conf/global_settings.py:81
+msgid "Slovak"
+msgstr "Словачки"
+
+#: conf/global_settings.py:82
+msgid "Slovenian"
+msgstr "Словенечки"
+
+#: conf/global_settings.py:83
+msgid "Serbian"
+msgstr "Српски"
+
+#: conf/global_settings.py:84
+msgid "Swedish"
+msgstr "Шведски"
+
+#: conf/global_settings.py:85
+msgid "Tamil"
+msgstr "Тамил"
+
+#: conf/global_settings.py:86
+msgid "Telugu"
+msgstr "Телугу"
+
+#: conf/global_settings.py:87
+msgid "Turkish"
+msgstr "Турски"
+
+#: conf/global_settings.py:88
+msgid "Ukrainian"
+msgstr "Украински"
+
+#: conf/global_settings.py:89
+msgid "Simplified Chinese"
+msgstr "Упростен кинески"
+
+#: conf/global_settings.py:90
+msgid "Traditional Chinese"
+msgstr "Традиционален кинески"
+
+#: contrib/admin/filterspecs.py:44
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Од %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:74 contrib/admin/filterspecs.py:92
+#: contrib/admin/filterspecs.py:147 contrib/admin/filterspecs.py:173
+msgid "All"
+msgstr "Сите"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Any date"
+msgstr "Било кој датум"
+
+#: contrib/admin/filterspecs.py:114
+msgid "Today"
+msgstr "Денеска"
+
+#: contrib/admin/filterspecs.py:117
+msgid "Past 7 days"
+msgstr "Последните 7 дена"
+
+#: contrib/admin/filterspecs.py:119
+msgid "This month"
+msgstr "Овој месец"
+
+#: contrib/admin/filterspecs.py:121
+msgid "This year"
+msgstr "Оваа година"
+
+#: contrib/admin/filterspecs.py:147 newforms/widgets.py:231
+#: oldforms/__init__.py:592
+msgid "Yes"
+msgstr "Да"
+
+#: contrib/admin/filterspecs.py:147 newforms/widgets.py:231
+#: oldforms/__init__.py:592
+msgid "No"
+msgstr "Не"
+
+#: contrib/admin/filterspecs.py:154 newforms/widgets.py:231
+#: oldforms/__init__.py:592
+msgid "Unknown"
+msgstr "Непознато"
+
+#: contrib/admin/models.py:18
+msgid "action time"
+msgstr "време на акција"
+
+#: contrib/admin/models.py:21
+msgid "object id"
+msgstr "идентификационен број на објект"
+
+#: contrib/admin/models.py:22
+msgid "object repr"
+msgstr "object repr"
+
+#: contrib/admin/models.py:23
+msgid "action flag"
+msgstr "знакче за акција"
+
+#: contrib/admin/models.py:24
+msgid "change message"
+msgstr "измени ја пораката"
+
+#: contrib/admin/models.py:27
+msgid "log entry"
+msgstr "ставка во записникот"
+
+#: contrib/admin/models.py:28
+msgid "log entries"
+msgstr "ставки во записникот"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Страницата не е најдена"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Се извинуваме, но неможе да ја најдеме страницата која ја баравте."
+
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:37
+#: contrib/admin/templates/admin/change_form.html:12
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/delete_confirmation.html:5
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:4
+#: contrib/admin/templates/admin/auth/user/change_password.html:11
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+msgid "Home"
+msgstr "Дома"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Грешка со серверот"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Грешка со серверот (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Грешка со серверот <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Имаше грешка. Истата беше пријавена на администраторите и ќе биде поправена "
+"во брзо време. Ви благодариме за вашето трпение."
+
+#: contrib/admin/templates/admin/base.html:26
+msgid "Welcome,"
+msgstr "Добредојдовте,"
+
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Документација"
+
+#: contrib/admin/templates/admin/base.html:29
+#: contrib/admin/templates/admin/auth/user/change_password.html:14
+#: contrib/admin/templates/admin/auth/user/change_password.html:45
+msgid "Change password"
+msgstr "Промени лозинка"
+
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/comments/templates/comments/form.html:6
+msgid "Log out"
+msgstr "Одјава"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Џанго администрација на сајт"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Џанго администрација"
+
+#: contrib/admin/templates/admin/change_form.html:14
+#: contrib/admin/templates/admin/index.html:28
+msgid "Add"
+msgstr "Додади"
+
+#: contrib/admin/templates/admin/change_form.html:20
+#: contrib/admin/templates/admin/object_history.html:4
+msgid "History"
+msgstr "Историја"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "Погледни на сајтот"
+
+#: contrib/admin/templates/admin/change_form.html:31
+#: contrib/admin/templates/admin/auth/user/change_password.html:23
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Ве молам поправете ја грешката подолу."
+msgstr[1] "Ве молам поправете ги грешките подолу."
+
+#: contrib/admin/templates/admin/change_form.html:49
+msgid "Ordering"
+msgstr "Подредување"
+
+#: contrib/admin/templates/admin/change_form.html:52
+msgid "Order:"
+msgstr "Подреди:"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "Додади %(name)s"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:8
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Избриши"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:13
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Бришење на %(object_name)s '%(escaped_object)s' ќе резултира со бришење на "
+"поврзаните објекти, но со вашата сметка немате доволно привилегии да ги "
+"бришете следните типови на објекти:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:20
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Сигурне сте дека сакате да ги бришете %(object_name)s „%(escaped_object)s“? "
+"Сите овие ставки ќе бидат избришани:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:25
+msgid "Yes, I'm sure"
+msgstr "Да, сигурен сум"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Од %(filter_title)s "
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "Филтер"
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Достапни модели во апликацијата %(name)s."
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Измени"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Немате дозвола ништо да уредува."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Последни акции"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Мои акции"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Ништо не е достапно"
+
+#: contrib/admin/templates/admin/invalid_setup.html:8
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Нешто не е во ред со инсталацијата на базата на податоци. Потврдете дека "
+"соодветни табели во базата се направени и потврдете дека базата може да биде "
+"прочитана од соодветниот корисник."
+
+#: contrib/admin/templates/admin/login.html:17
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+msgid "Username:"
+msgstr "Корисник:"
+
+#: contrib/admin/templates/admin/login.html:20
+#: contrib/comments/templates/comments/form.html:8
+msgid "Password:"
+msgstr "Лозинка:"
+
+#: contrib/admin/templates/admin/login.html:25
+#: contrib/admin/views/decorators.py:31
+msgid "Log in"
+msgstr "Најава"
+
+#: contrib/admin/templates/admin/object_history.html:17
+msgid "Date/time"
+msgstr "Датум/час"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "User"
+msgstr "Корисник"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "Action"
+msgstr "Акција"
+
+#: contrib/admin/templates/admin/object_history.html:25
+msgid "DATE_WITH_TIME_FULL"
+msgstr "j M Y, H:i"
+
+#: contrib/admin/templates/admin/object_history.html:35
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Овој објект нема историја на измени. Најверојатно не бил додаден со админ "
+"сајтот."
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Прикажи ги сите"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Оди"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 резултат"
+msgstr[1] "%(counter)s резултати"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "вкупно %(full_result_count)s"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Сними како нова"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Сними и додади уште"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Сними и продолжи со уредување"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Сними"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Прво, внесете корисничко име и лозинка. Потоа ќе можете да уредувате повеќе "
+"кориснички опции."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "Корисник"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+#: contrib/admin/templates/admin/auth/user/change_password.html:33
+msgid "Password"
+msgstr "Лозинка"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+#: contrib/admin/templates/admin/auth/user/change_password.html:38
+msgid "Password (again)"
+msgstr "Лозинка (повторно)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+msgid "Enter the same password as above, for verification."
+msgstr "Заради верификација внесете ја истата лозинка како и горе."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:27
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Внесете нова лозинка за корисникот <strong>%(username)s</strong>."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Обележувачи"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+msgid "Documentation bookmarklets"
+msgstr "Обележувачи на документација"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:8
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">За да инсталирате обележувачи, влечете ја врската до "
+"вашата\n"
+"лента со алатки, или кликнете со десното копче  и додадете го во вашите \n"
+"обележувачи. Сега може да го изберете обележувачот од било која страница "
+"на \n"
+"сајтот. Имајте на ум дека за некои од овие обележувачи е потребно да го "
+"гледате \n"
+"сајтот од компјутер кој е означен како „внатрешен“ (разговарајте со вашиот \n"
+"администратор ако не сте сигурни).</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:18
+msgid "Documentation for this page"
+msgstr "Документација за оваа страница"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+"Ве носи од било која страница од документацијата до погледот кој ја генерира "
+"таа страница."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:21
+msgid "Show object ID"
+msgstr "Прикажи идентификационен број на објектот"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Го прикажува типот на содржината и уникатниот идентификационен број за "
+"страници  кои претставуваат единечен објект."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:24
+msgid "Edit this object (current window)"
+msgstr "Уреди го овој објект (во овој прозорец)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "Скокнува до админ страницата за страници кои претставуваат единечен објект."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:27
+msgid "Edit this object (new window)"
+msgstr "Уреди го овој објект (во нов прозорец)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "As above, but opens the admin page in a new window."
+msgstr "Како погоре, но ја отвара админ страницата во нов прозорец."
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Ви благодариме што денеска поминавте квалитетно време со интернет страницава."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Логирајте се повторно"
+
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_form.html:5
+#: contrib/admin/templates/registration/password_change_form.html:9
+msgid "Password change"
+msgstr "Измена на лозинка"
+
+#: contrib/admin/templates/registration/password_change_done.html:5
+#: contrib/admin/templates/registration/password_change_done.html:9
+msgid "Password change successful"
+msgstr "Успешна промена на лозинката"
+
+#: contrib/admin/templates/registration/password_change_done.html:11
+msgid "Your password was changed."
+msgstr "Вашата лозинка беше сменета."
+
+#: contrib/admin/templates/registration/password_change_form.html:11
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Заради сигурност ве молам внесете ја вашата стара лозинка и потоа внесете ја "
+"новата двапати за да може да се потврди дека правилно сте ја искуцале."
+
+#: contrib/admin/templates/registration/password_change_form.html:16
+msgid "Old password:"
+msgstr "Стара лозинка:"
+
+#: contrib/admin/templates/registration/password_change_form.html:18
+msgid "New password:"
+msgstr "Нова лозинка:"
+
+#: contrib/admin/templates/registration/password_change_form.html:20
+msgid "Confirm password:"
+msgstr "Потврди лозинка:"
+
+#: contrib/admin/templates/registration/password_change_form.html:22
+msgid "Change my password"
+msgstr "Промени ја мојата лозинка"
+
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+msgid "Password reset"
+msgstr "Ресетирање на лозинка"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Успешно е ресетирањето на лозинката"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"Ви пративме нова лозинка на адресата која ја внесовте.Треба да ја примите за "
+"кратко време."
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Ја добивата оваа порака бидејќи побаравте да се ресетира вашата лозинка"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "за корисничката сметка на %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Вашата нова лозинка е: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Чуствувајте се слободно да ја промените оваа лозинка преку оваа страница:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Вашето корисничко име, во случај да сте го заборавиле:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Ви благодариме што го користите овој сајт!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Тимот на %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"Сте ја заборавиле вашата лозинка? Внесете ја вашата е-пошта подолу, ќе ја "
+"ресетираме вашата лозинка и новата ќе ви ја пратиме по е-пошта."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Е-пошта:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Ресетирај ја мојата лозинка"
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Датум:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Време:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Моментално:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Измена:"
+
+#: contrib/admin/templatetags/admin_list.py:257
+msgid "All dates"
+msgstr "Сите датуми"
+
+#: contrib/admin/views/auth.py:20 contrib/admin/views/main.py:267
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" беше успешно додаден."
+
+#: contrib/admin/views/auth.py:25 contrib/admin/views/main.py:271
+#: contrib/admin/views/main.py:356
+msgid "You may edit it again below."
+msgstr "Подолу можете повторно да го уредите."
+
+#: contrib/admin/views/auth.py:31
+msgid "Add user"
+msgstr "Додади корисник"
+
+#: contrib/admin/views/auth.py:58
+msgid "Password changed successfully."
+msgstr "Успешна промена на лозинката."
+
+#: contrib/admin/views/auth.py:65
+#, python-format
+msgid "Change password: %s"
+msgstr "Промени лозинка: %s"
+
+#: contrib/admin/views/decorators.py:17 contrib/auth/forms.py:60
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Ве молам внесете точно корисничко име и лозинка. Имајте на ум дека и во "
+"двете полиња се битни големите и малите букви."
+
+#: contrib/admin/views/decorators.py:69
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Ве молам најавете се повторно бидејќи вашата сесија е истечена. Не се "
+"грижете. Вашите внесови беа зачувани."
+
+#: contrib/admin/views/decorators.py:76
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Изгледа дека вашиот прелистувач не е конфигуриран да прифаќа колачиња. Ве "
+"молам овозможете ги колачињата, превчитајте ја страта и пробајте повторно."
+
+#: contrib/admin/views/decorators.py:89
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "Вашата е-пошта не е вашето корисничко име. Пробајте со „%s“."
+
+#: contrib/admin/views/decorators.py:93
+msgid "Usernames cannot contain the '@' character."
+msgstr "Корисничките имиња неможе да го содржат „@“ знакот."
+
+#: contrib/admin/views/doc.py:48 contrib/admin/views/doc.py:50
+#: contrib/admin/views/doc.py:52
+msgid "tag:"
+msgstr "таг:"
+
+#: contrib/admin/views/doc.py:79 contrib/admin/views/doc.py:81
+#: contrib/admin/views/doc.py:83
+msgid "filter:"
+msgstr "филтер:"
+
+#: contrib/admin/views/doc.py:137 contrib/admin/views/doc.py:139
+#: contrib/admin/views/doc.py:141
+msgid "view:"
+msgstr "поглед:"
+
+#: contrib/admin/views/doc.py:166
+#, python-format
+msgid "App %r not found"
+msgstr "Не е најдена апликацијата %r"
+
+#: contrib/admin/views/doc.py:173
+#, python-format
+msgid "Model %(name)r not found in app %(label)r"
+msgstr "Моделот %(name)r не е најден во апликацијата %(label)r"
+
+#: contrib/admin/views/doc.py:185
+#, python-format
+msgid "the related `%(label)s.%(type)s` object"
+msgstr "поврзаниот`%(label)s.%(type)s` објект"
+
+#: contrib/admin/views/doc.py:185 contrib/admin/views/doc.py:207
+#: contrib/admin/views/doc.py:221 contrib/admin/views/doc.py:226
+msgid "model:"
+msgstr "модел:"
+
+#: contrib/admin/views/doc.py:216
+#, python-format
+msgid "related `%(label)s.%(name)s` objects"
+msgstr "поврзани `%(label)s.%(name)s` објекти"
+
+#: contrib/admin/views/doc.py:221
+#, python-format
+msgid "all %s"
+msgstr "сите %s"
+
+#: contrib/admin/views/doc.py:226
+#, python-format
+msgid "number of %s"
+msgstr "број на %s"
+
+#: contrib/admin/views/doc.py:231
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Полиња на %s објекти"
+
+#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:304
+#: contrib/admin/views/doc.py:306 contrib/admin/views/doc.py:312
+#: contrib/admin/views/doc.py:313 contrib/admin/views/doc.py:315
+msgid "Integer"
+msgstr "Цел број"
+
+#: contrib/admin/views/doc.py:294
+msgid "Boolean (Either True or False)"
+msgstr "Логичка (или точно или неточно)"
+
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:314
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Збор (до %(max_length)s)"
+
+#: contrib/admin/views/doc.py:296
+msgid "Comma-separated integers"
+msgstr "Целобројни вредности одделени со запирка"
+
+#: contrib/admin/views/doc.py:297
+msgid "Date (without time)"
+msgstr "Датум (без час)"
+
+#: contrib/admin/views/doc.py:298
+msgid "Date (with time)"
+msgstr "Датум (со час)"
+
+#: contrib/admin/views/doc.py:299
+msgid "Decimal number"
+msgstr "Децимален број"
+
+#: contrib/admin/views/doc.py:300
+msgid "E-mail address"
+msgstr "Адреса на е-пошта"
+
+#: contrib/admin/views/doc.py:301 contrib/admin/views/doc.py:302
+#: contrib/admin/views/doc.py:305
+msgid "File path"
+msgstr "Патека на датотека"
+
+#: contrib/admin/views/doc.py:303
+msgid "Floating point number"
+msgstr "Децимален број"
+
+#: contrib/admin/views/doc.py:307 contrib/comments/models.py:89
+msgid "IP address"
+msgstr "ИП адреса"
+
+#: contrib/admin/views/doc.py:309
+msgid "Boolean (Either True, False or None)"
+msgstr "Логичка (точно,неточно или празно)"
+
+#: contrib/admin/views/doc.py:310
+msgid "Relation to parent model"
+msgstr "Релација со родителскиот модел"
+
+#: contrib/admin/views/doc.py:311
+msgid "Phone number"
+msgstr "Телефонски број"
+
+#: contrib/admin/views/doc.py:316
+msgid "Text"
+msgstr "Текст"
+
+#: contrib/admin/views/doc.py:317
+msgid "Time"
+msgstr "Час"
+
+#: contrib/admin/views/doc.py:318 contrib/flatpages/models.py:8
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:319
+msgid "U.S. state (two uppercase letters)"
+msgstr "Држава во САД (две големи букви)"
+
+#: contrib/admin/views/doc.py:320
+msgid "XML text"
+msgstr "XML текст"
+
+#: contrib/admin/views/doc.py:346
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s не изгледа дека е url објект"
+
+#: contrib/admin/views/main.py:233
+msgid "Site administration"
+msgstr "Администрација на сајт"
+
+#: contrib/admin/views/main.py:280 contrib/admin/views/main.py:365
+#, python-format
+msgid "You may add another %s below."
+msgstr "Подолу можете да додате уште еден %s."
+
+#: contrib/admin/views/main.py:298
+#, python-format
+msgid "Add %s"
+msgstr "Додади %s"
+
+#: contrib/admin/views/main.py:344
+#, python-format
+msgid "Added %s."
+msgstr "Додадено %s."
+
+#: contrib/admin/views/main.py:344 contrib/admin/views/main.py:346
+#: contrib/admin/views/main.py:348 core/validators.py:283
+#: db/models/manipulators.py:309
+msgid "and"
+msgstr "и"
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "Changed %s."
+msgstr "Изменета %s."
+
+#: contrib/admin/views/main.py:348
+#, python-format
+msgid "Deleted %s."
+msgstr "Избришана %s."
+
+#: contrib/admin/views/main.py:351
+msgid "No fields changed."
+msgstr "Не беше изменето ниедно поле."
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" беше успешно изменета."
+
+#: contrib/admin/views/main.py:362
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s\" беше успешно додадена.Подолу можете повторно да ја "
+"уредите."
+
+#: contrib/admin/views/main.py:400
+#, python-format
+msgid "Change %s"
+msgstr "Измени %s"
+
+#: contrib/admin/views/main.py:487
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Еден или повеќе %(fieldname)s во %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:492
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Еден или повеќе %(fieldname)s во %(name)s:"
+
+#: contrib/admin/views/main.py:524
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" беше избришана успешно."
+
+#: contrib/admin/views/main.py:527
+msgid "Are you sure?"
+msgstr "Сигурни сте?"
+
+#: contrib/admin/views/main.py:549
+#, python-format
+msgid "Change history: %s"
+msgstr "Историја на измени: %s"
+
+#: contrib/admin/views/main.py:583
+#, python-format
+msgid "Select %s"
+msgstr "Изберет %s"
+
+#: contrib/admin/views/main.py:583
+#, python-format
+msgid "Select %s to change"
+msgstr "Изберете %s за измена"
+
+#: contrib/admin/views/main.py:765
+msgid "Database error"
+msgstr "Грешка во базата со податоци"
+
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr "Двете полиња со лозинките не се совпаѓаат."
+
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr "Веќе постои корисник со тоа корисничко име."
+
+#: contrib/auth/forms.py:53
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"Не изгледа дека вашиот прелистувач има овозможено колачиња. Колачињата се "
+"потребни за да се најавите."
+
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "Оваа сметка е неактивна."
+
+#: contrib/auth/forms.py:84
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr ""
+"Нема регистрирано корисник со оваа адреса за е-пошта. Сигурни ли сте дека "
+"сте регистрирани?"
+
+#: contrib/auth/forms.py:107
+#, python-format
+msgid "Password reset on %s"
+msgstr "Ресетирање на лозинка на %s"
+
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "Двете нови лозинки не се совпаѓаат."
+
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Не ја внесовте точно вашата стара лозинка. Ве молам внесете ја повторно."
+
+#: contrib/auth/models.py:73 contrib/auth/models.py:93
+msgid "name"
+msgstr "име"
+
+#: contrib/auth/models.py:75
+msgid "codename"
+msgstr "кодно име"
+
+#: contrib/auth/models.py:78
+msgid "permission"
+msgstr "привилегија"
+
+#: contrib/auth/models.py:79 contrib/auth/models.py:94
+msgid "permissions"
+msgstr "привилегии"
+
+#: contrib/auth/models.py:97
+msgid "group"
+msgstr "група"
+
+#: contrib/auth/models.py:98 contrib/auth/models.py:148
+msgid "groups"
+msgstr "групи"
+
+#: contrib/auth/models.py:138
+msgid "username"
+msgstr "корисничко име"
+
+#: contrib/auth/models.py:138
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr ""
+"Дозволени се најмногу 30 знаци. Дозволени се само алфанумерички знаци "
+"(букви, цифри и долна црта)."
+
+#: contrib/auth/models.py:139
+msgid "first name"
+msgstr "име"
+
+#: contrib/auth/models.py:140
+msgid "last name"
+msgstr "презиме"
+
+#: contrib/auth/models.py:141
+msgid "e-mail address"
+msgstr "е-пошта"
+
+#: contrib/auth/models.py:142
+msgid "password"
+msgstr "лозинка"
+
+#: contrib/auth/models.py:142
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"Користете '[algo]$[salt]$[hexdigest]' или користете ја <a href=\"password/"
+"\">формата за промена на лозинката</a>."
+
+#: contrib/auth/models.py:143
+msgid "staff status"
+msgstr "статус на администраторите"
+
+#: contrib/auth/models.py:143
+msgid "Designates whether the user can log into this admin site."
+msgstr "Означува дали корисникот може да се логира во сајтот за администрација."
+
+#: contrib/auth/models.py:144
+msgid "active"
+msgstr "активен"
+
+#: contrib/auth/models.py:144
+msgid ""
+"Designates whether this user should be treated as active. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"Означува дали корисникот треба да биде активен. Одштиклирајте го ова наместо да "
+"бришете корисници."
+
+#: contrib/auth/models.py:145
+msgid "superuser status"
+msgstr "статус на суперкорисник"
+
+#: contrib/auth/models.py:145
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr ""
+"Означува дека овој корисник ги има сите привилегии без експлицитно да се "
+"доделуваат сите."
+
+#: contrib/auth/models.py:146
+msgid "last login"
+msgstr "последна најава"
+
+#: contrib/auth/models.py:147
+msgid "date joined"
+msgstr "датум на зачленување"
+
+#: contrib/auth/models.py:149
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"Како дополнување на рачно доделени привилегии, овој корисник ќе ги добие "
+"автоматски и сите привилегии за секоја група во која тој/таа членува."
+
+#: contrib/auth/models.py:150
+msgid "user permissions"
+msgstr "кориснички привилегии"
+
+#: contrib/auth/models.py:154
+msgid "user"
+msgstr "корисник"
+
+#: contrib/auth/models.py:155
+msgid "users"
+msgstr "корисници"
+
+#: contrib/auth/models.py:161
+msgid "Personal info"
+msgstr "Лични информации"
+
+#: contrib/auth/models.py:162
+msgid "Permissions"
+msgstr "Привилегии"
+
+#: contrib/auth/models.py:163
+msgid "Important dates"
+msgstr "Важни датуми"
+
+#: contrib/auth/models.py:164
+msgid "Groups"
+msgstr "Групи"
+
+#: contrib/auth/models.py:323
+msgid "message"
+msgstr "порака"
+
+#: contrib/auth/views.py:47
+msgid "Logged out"
+msgstr "Одјавен"
+
+#: contrib/comments/models.py:71 contrib/comments/models.py:176
+msgid "object ID"
+msgstr "object ID"
+
+#: contrib/comments/models.py:72
+msgid "headline"
+msgstr "наслов"
+
+#: contrib/comments/models.py:73 contrib/comments/models.py:95
+#: contrib/comments/models.py:177
+msgid "comment"
+msgstr "коментар"
+
+#: contrib/comments/models.py:74
+msgid "rating #1"
+msgstr "популарност #1"
+
+#: contrib/comments/models.py:75
+msgid "rating #2"
+msgstr "популарност #2"
+
+#: contrib/comments/models.py:76
+msgid "rating #3"
+msgstr "популарност #3"
+
+#: contrib/comments/models.py:77
+msgid "rating #4"
+msgstr "популарност #4"
+
+#: contrib/comments/models.py:78
+msgid "rating #5"
+msgstr "популарност #5"
+
+#: contrib/comments/models.py:79
+msgid "rating #6"
+msgstr "популарност #6"
+
+#: contrib/comments/models.py:80
+msgid "rating #7"
+msgstr "популарност #7"
+
+#: contrib/comments/models.py:81
+msgid "rating #8"
+msgstr "популарност #8"
+
+#: contrib/comments/models.py:86
+msgid "is valid rating"
+msgstr "е валидна популарност"
+
+#: contrib/comments/models.py:87 contrib/comments/models.py:179
+msgid "date/time submitted"
+msgstr "датум/време пријавен"
+
+#: contrib/comments/models.py:88 contrib/comments/models.py:180
+msgid "is public"
+msgstr "е јавен"
+
+#: contrib/comments/models.py:90
+msgid "is removed"
+msgstr "е отстранет"
+
+#: contrib/comments/models.py:90
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Штиклирајте го ова поле ако коментарот не е пригоден. Наместо него пораката "
+"„Овој коментар беше отстранет“ ќе биде прикажана."
+
+#: contrib/comments/models.py:96
+msgid "comments"
+msgstr "коментари"
+
+#: contrib/comments/models.py:140 contrib/comments/models.py:222
+msgid "Content object"
+msgstr "Content објект"
+
+#: contrib/comments/models.py:168
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Напишан од %(user)s на %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:178
+msgid "person's name"
+msgstr "име на личноста"
+
+#: contrib/comments/models.py:181
+msgid "ip address"
+msgstr "ип адреса"
+
+#: contrib/comments/models.py:183
+msgid "approved by staff"
+msgstr "одобрено од администраторите"
+
+#: contrib/comments/models.py:187
+msgid "free comment"
+msgstr "слободен коментар"
+
+#: contrib/comments/models.py:188
+msgid "free comments"
+msgstr "слободни коментари"
+
+#: contrib/comments/models.py:250
+msgid "score"
+msgstr "поени"
+
+#: contrib/comments/models.py:251
+msgid "score date"
+msgstr "датум поени"
+
+#: contrib/comments/models.py:255
+msgid "karma score"
+msgstr "карма поен"
+
+#: contrib/comments/models.py:256
+msgid "karma scores"
+msgstr "карма поени"
+
+#: contrib/comments/models.py:260
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d гласање за популарност од %(user)s"
+
+#: contrib/comments/models.py:277
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Овој коментар беше означен од %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:285
+msgid "flag date"
+msgstr "датум на означување"
+
+#: contrib/comments/models.py:289
+msgid "user flag"
+msgstr "корисничка ознака"
+
+#: contrib/comments/models.py:290
+msgid "user flags"
+msgstr "кориснички ознаки"
+
+#: contrib/comments/models.py:294
+#, python-format
+msgid "Flag by %r"
+msgstr "Означено од %r"
+
+#: contrib/comments/models.py:300
+msgid "deletion date"
+msgstr "датум на бришење"
+
+#: contrib/comments/models.py:303
+msgid "moderator deletion"
+msgstr "бришење од модератор"
+
+#: contrib/comments/models.py:304
+msgid "moderator deletions"
+msgstr "бришења од модератор"
+
+#: contrib/comments/models.py:308
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Бришење од модератор од %r"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Ја заборавите вашата лозинка?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Популарност"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Потребно"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "По желба"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Објави фотографија"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Коментар:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Прегледај"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Вашето име:"
+
+#: contrib/comments/views/comments.py:28
+msgid "This rating is required because you've entered at least one other rating."
+msgstr ""
+"Ова гласање за популарност е потребно бидејќи внесовте најмалку уште едно "
+"друго."
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Овој коментар беше пратен од корисник кој пратил помалку од %(count)s "
+"коментар:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Овој коментар беше пратен од корисник кој пратил помалку од %(count)s "
+"коментари:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Овој коментар беше пратен од недоверлив корисник:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:190
+#: contrib/comments/views/comments.py:283
+msgid "Only POSTs are allowed"
+msgstr "Дозволено е само POST"
+
+#: contrib/comments/views/comments.py:194
+#: contrib/comments/views/comments.py:287
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Едно или повеќе од потребните полиња не беше пополнето"
+
+#: contrib/comments/views/comments.py:198
+#: contrib/comments/views/comments.py:289
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Некој ја променил формата за коментари (сигурносен прекршок)"
+
+#: contrib/comments/views/comments.py:208
+#: contrib/comments/views/comments.py:295
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"Формата за коментар имаше неправилен „target“ параметар - идентификациониот "
+"број на објектот беше неправилен"
+
+#: contrib/comments/views/comments.py:259
+#: contrib/comments/views/comments.py:324
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "Формата за коментар не овозможи ниту „преглед“ ниту „праќање“"
+
+#: contrib/comments/views/karma.py:21
+msgid "Anonymous users cannot vote"
+msgstr "Анонимните корисници неможе да гласаат"
+
+#: contrib/comments/views/karma.py:25
+msgid "Invalid comment ID"
+msgstr "Невалидно ИД на коментарот"
+
+#: contrib/comments/views/karma.py:27
+msgid "No voting for yourself"
+msgstr "Нема гласање за самиот себе"
+
+#: contrib/contenttypes/models.py:67
+msgid "python model class name"
+msgstr "има на класата на питон моделите"
+
+#: contrib/contenttypes/models.py:71
+msgid "content type"
+msgstr "content type"
+
+#: contrib/contenttypes/models.py:72
+msgid "content types"
+msgstr "content types"
+
+#: contrib/flatpages/models.py:9
+msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"На пр. „/za/kontakt/“. Осигурајте се да имате коса црта и на крајот и на "
+"почетокот."
+
+#: contrib/flatpages/models.py:10
+msgid "title"
+msgstr "наслов"
+
+#: contrib/flatpages/models.py:11
+msgid "content"
+msgstr "содржина"
+
+#: contrib/flatpages/models.py:12
+msgid "enable comments"
+msgstr "овозможи коментари"
+
+#: contrib/flatpages/models.py:13
+msgid "template name"
+msgstr "име на шаблонот"
+
+#: contrib/flatpages/models.py:14
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"На пр. „flatpages/kontakt.html'. Ако не го внесете ова, системот ќе користи "
+"„flatpages/default.html“."
+
+#: contrib/flatpages/models.py:15
+msgid "registration required"
+msgstr "потребна е регистрација"
+
+#: contrib/flatpages/models.py:15
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+"Ако ова е штиклирано, само најавените корисници ќе можат да ја гледаат оваа "
+"страница."
+
+#: contrib/flatpages/models.py:20
+msgid "flat page"
+msgstr "статична страница"
+
+#: contrib/flatpages/models.py:21
+msgid "flat pages"
+msgstr "статични страници"
+
+#: contrib/flatpages/models.py:27
+msgid "Advanced options"
+msgstr "Напредни можности"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "th"
+msgstr "th"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "st"
+msgstr "st"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "nd"
+msgstr "nd"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "rd"
+msgstr "rd"
+
+#: contrib/humanize/templatetags/humanize.py:51
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f милион"
+msgstr[1] "%(value).1f милион"
+
+#: contrib/humanize/templatetags/humanize.py:54
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f милијарда"
+msgstr[1] "%(value).1f милијарда"
+
+#: contrib/humanize/templatetags/humanize.py:57
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f трилион"
+msgstr[1] "%(value).1f трилион"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "one"
+msgstr "еден"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "two"
+msgstr "два"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "three"
+msgstr "три"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "four"
+msgstr "четири"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "five"
+msgstr "пет"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "six"
+msgstr "шест"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "seven"
+msgstr "седум"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "eight"
+msgstr "осум"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "nine"
+msgstr "девет"
+
+#: contrib/humanize/templatetags/humanize.py:93
+msgid "today"
+msgstr "денеска"
+
+#: contrib/humanize/templatetags/humanize.py:95
+msgid "tomorrow"
+msgstr "утре"
+
+#: contrib/humanize/templatetags/humanize.py:97
+msgid "yesterday"
+msgstr "вчера"
+
+#: contrib/localflavor/ar/forms.py:27
+msgid "Enter a postal code in the format NNNN or ANNNNAAA."
+msgstr "Внесете поштенски број во форматот NNNN или ANNNNAAA."
+
+#: contrib/localflavor/ar/forms.py:49 contrib/localflavor/br/forms.py:96
+#: contrib/localflavor/br/forms.py:135 contrib/localflavor/pe/forms.py:23
+#: contrib/localflavor/pe/forms.py:51
+msgid "This field requires only numbers."
+msgstr "Во ова поле смее да бидат само бројки."
+
+#: contrib/localflavor/ar/forms.py:50
+msgid "This field requires 7 or 8 digits."
+msgstr "Во ова поле смее да има 7 или 8 цифри."
+
+#: contrib/localflavor/ar/forms.py:79
+msgid "Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format."
+msgstr "Внесете правилен CUIT во XX-XXXXXXXX-X or XXXXXXXXXXXX формат."
+
+#: contrib/localflavor/ar/forms.py:80
+msgid "Invalid CUIT."
+msgstr "Неправилен CUIT."
+
+#: contrib/localflavor/au/forms.py:16
+msgid "Enter a 4 digit post code."
+msgstr "Внесете 4 цифрен поштенски број."
+
+#: contrib/localflavor/br/forms.py:21
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Внесете правилен поштенски број во форматот XXXXX-XXX."
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "Телефонските броеви мора да бидат во XX-XXXX-XXXX форматот."
+
+#: contrib/localflavor/br/forms.py:58
+msgid ""
+"Select a valid brazilian state. That state is not one of the available "
+"states."
+msgstr "Изберете правилна бразилска држава. Оваа држава не е од достапните држави."
+
+#: contrib/localflavor/br/forms.py:94
+msgid "Invalid CPF number."
+msgstr "Неправилен CPF број."
+
+#: contrib/localflavor/br/forms.py:95
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr "Во ова поле смее да има најмногу 11 цифри или 14 знаци."
+
+#: contrib/localflavor/br/forms.py:134
+msgid "Invalid CNPJ number."
+msgstr "Неправилен CNPJ број."
+
+#: contrib/localflavor/br/forms.py:136
+msgid "This field requires at least 14 digits"
+msgstr "Во ова поле треба да има најмалку 14 цифри"
+
+#: contrib/localflavor/ca/forms.py:17
+msgid "Enter a postal code in the format XXX XXX."
+msgstr "Внесете правилен поштенски број во формат XXX XXX."
+
+#: contrib/localflavor/ca/forms.py:88
+msgid "Enter a valid Canadian Social Insurance number in XXX-XXX-XXX format."
+msgstr "Внесте правилен канадски број за осигурување во XXX-XXX-XXX форматот."
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr "Aargau"
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr "Appenzell Innerrhoden"
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr "Appenzell Ausserrhoden"
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr "Basel-Stadt"
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr "Basel-Land"
+
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr "Berne"
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr "Fribourg"
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr "Женева"
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr "Glarus"
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr "Graubuenden"
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr "Jura"
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr "Lucerne"
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr "Neuchatel"
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr "Nidwalden"
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr "Obwalden"
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr "Schaffhausen"
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr "Schwyz"
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr "Solothurn"
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr "St. Gallen"
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr "Thurgau"
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr "Ticino"
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr "Uri"
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr "Valais"
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr "Vaud"
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr "Zug"
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr "Цирих"
+
+#: contrib/localflavor/ch/forms.py:16 contrib/localflavor/no/forms.py:12
+msgid "Enter a zip code in the format XXXX."
+msgstr "Внесете правилен поштенски број во форматот XXXX."
+
+#: contrib/localflavor/ch/forms.py:64
+msgid ""
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
+msgstr ""
+"Внесете правилен швајцарски број на пасош во X1234567<0 или "
+" 1234567890 формат."
+
+#: contrib/localflavor/cl/forms.py:29
+msgid "Enter a valid Chilean RUT."
+msgstr "Внесете правилeн RUT за Чиле."
+
+#: contrib/localflavor/cl/forms.py:30
+msgid "Enter a valid Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr "Внесете правилен RUT за Чиле. Форматот е Xx.XXX.XXX-X."
+
+#: contrib/localflavor/cl/forms.py:31
+msgid "The Chilean RUT is not valid."
+msgstr "RUT бројот за Чиле е невалиден."
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr "Баден-Вуертемберг"
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr "Баварија"
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr "Берлин"
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr "Бранденбург"
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr "Бремен"
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr "Хамбург"
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr "Хесен"
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr "Мекленбург - Западна Померанија"
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr "Долна Саксонија"
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr "Северна Рајна-Вестфалија"
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr "Рајналенд-Палатинате"
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr "Сарленд"
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr "Саксонија"
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr "Саксонија-Анхалт"
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr "Шлесвиг-Холштајн"
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr "Турингиа"
+
+#: contrib/localflavor/de/forms.py:14 contrib/localflavor/fi/forms.py:12
+#: contrib/localflavor/fr/forms.py:15
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Внесете правилен поштенски број во формат XXXXXX."
+
+#: contrib/localflavor/de/forms.py:41
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr ""
+"Внесете правилен број на лична карта во Германија во XXXXXXXXXXX-XXXXXXX-"
+"XXXXXXX-X  форматот."
+
+#: contrib/localflavor/es/es_provinces.py:5
+msgid "Arava"
+msgstr "Arava"
+
+#: contrib/localflavor/es/es_provinces.py:6
+msgid "Albacete"
+msgstr "Albacete"
+
+#: contrib/localflavor/es/es_provinces.py:7
+msgid "Alacant"
+msgstr "Alacant"
+
+#: contrib/localflavor/es/es_provinces.py:8
+msgid "Almeria"
+msgstr "Almeria"
+
+#: contrib/localflavor/es/es_provinces.py:9
+msgid "Avila"
+msgstr "Авила"
+
+#: contrib/localflavor/es/es_provinces.py:10
+msgid "Badajoz"
+msgstr "Badajoz"
+
+#: contrib/localflavor/es/es_provinces.py:11
+msgid "Illes Balears"
+msgstr "Illes Balears"
+
+#: contrib/localflavor/es/es_provinces.py:12
+msgid "Barcelona"
+msgstr "Барцелона"
+
+#: contrib/localflavor/es/es_provinces.py:13
+msgid "Burgos"
+msgstr "Burgos"
+
+#: contrib/localflavor/es/es_provinces.py:14
+msgid "Caceres"
+msgstr "Caceres"
+
+#: contrib/localflavor/es/es_provinces.py:15
+msgid "Cadiz"
+msgstr "Cadiz"
+
+#: contrib/localflavor/es/es_provinces.py:16
+msgid "Castello"
+msgstr "Castello"
+
+#: contrib/localflavor/es/es_provinces.py:17
+msgid "Ciudad Real"
+msgstr "Ciudad Real"
+
+#: contrib/localflavor/es/es_provinces.py:18
+msgid "Cordoba"
+msgstr "Кордоба"
+
+#: contrib/localflavor/es/es_provinces.py:19
+msgid "A Coruna"
+msgstr "A Coruna"
+
+#: contrib/localflavor/es/es_provinces.py:20
+msgid "Cuenca"
+msgstr "Cuenca"
+
+#: contrib/localflavor/es/es_provinces.py:21
+msgid "Girona"
+msgstr "Girona"
+
+#: contrib/localflavor/es/es_provinces.py:22
+msgid "Granada"
+msgstr "Granada"
+
+#: contrib/localflavor/es/es_provinces.py:23
+msgid "Guadalajara"
+msgstr "Guadalajara"
+
+#: contrib/localflavor/es/es_provinces.py:24
+msgid "Guipuzkoa"
+msgstr "Guipuzkoa"
+
+#: contrib/localflavor/es/es_provinces.py:25
+msgid "Huelva"
+msgstr "Huelva"
+
+#: contrib/localflavor/es/es_provinces.py:26
+msgid "Huesca"
+msgstr "Huesca"
+
+#: contrib/localflavor/es/es_provinces.py:27
+msgid "Jaen"
+msgstr "Jaen"
+
+#: contrib/localflavor/es/es_provinces.py:28
+msgid "Leon"
+msgstr "Леон"
+
+#: contrib/localflavor/es/es_provinces.py:29
+msgid "Lleida"
+msgstr "Lleida"
+
+#: contrib/localflavor/es/es_provinces.py:30
+#: contrib/localflavor/es/es_regions.py:17
+msgid "La Rioja"
+msgstr "La Rioja"
+
+#: contrib/localflavor/es/es_provinces.py:31
+msgid "Lugo"
+msgstr "Луго"
+
+#: contrib/localflavor/es/es_provinces.py:32
+#: contrib/localflavor/es/es_regions.py:18
+msgid "Madrid"
+msgstr "Мадрид"
+
+#: contrib/localflavor/es/es_provinces.py:33
+msgid "Malaga"
+msgstr "Малага"
+
+#: contrib/localflavor/es/es_provinces.py:34
+msgid "Murcia"
+msgstr "Murcia"
+
+#: contrib/localflavor/es/es_provinces.py:35
+msgid "Navarre"
+msgstr "Navarre"
+
+#: contrib/localflavor/es/es_provinces.py:36
+msgid "Ourense"
+msgstr "Ourense"
+
+#: contrib/localflavor/es/es_provinces.py:37
+msgid "Asturias"
+msgstr "Asturias"
+
+#: contrib/localflavor/es/es_provinces.py:38
+msgid "Palencia"
+msgstr "Palencia"
+
+#: contrib/localflavor/es/es_provinces.py:39
+msgid "Las Palmas"
+msgstr "Las Palmas"
+
+#: contrib/localflavor/es/es_provinces.py:40
+msgid "Pontevedra"
+msgstr "Pontevedra"
+
+#: contrib/localflavor/es/es_provinces.py:41
+msgid "Salamanca"
+msgstr "Salamanca"
+
+#: contrib/localflavor/es/es_provinces.py:42
+msgid "Santa Cruz de Tenerife"
+msgstr "Санта Круз и Тенерифе"
+
+#: contrib/localflavor/es/es_provinces.py:43
+#: contrib/localflavor/es/es_regions.py:11
+msgid "Cantabria"
+msgstr "Cantabria"
+
+#: contrib/localflavor/es/es_provinces.py:44
+msgid "Segovia"
+msgstr "Segovia"
+
+#: contrib/localflavor/es/es_provinces.py:45
+msgid "Seville"
+msgstr "Севиља"
+
+#: contrib/localflavor/es/es_provinces.py:46
+msgid "Soria"
+msgstr "Soria"
+
+#: contrib/localflavor/es/es_provinces.py:47
+msgid "Tarragona"
+msgstr "Tarragona"
+
+#: contrib/localflavor/es/es_provinces.py:48
+msgid "Teruel"
+msgstr "Teruel"
+
+#: contrib/localflavor/es/es_provinces.py:49
+msgid "Toledo"
+msgstr "Толедо"
+
+#: contrib/localflavor/es/es_provinces.py:50
+msgid "Valencia"
+msgstr "Валенсија"
+
+#: contrib/localflavor/es/es_provinces.py:51
+msgid "Valladolid"
+msgstr "Valladolid"
+
+#: contrib/localflavor/es/es_provinces.py:52
+msgid "Bizkaia"
+msgstr "Bizkaia"
+
+#: contrib/localflavor/es/es_provinces.py:53
+msgid "Zamora"
+msgstr "Zamora"
+
+#: contrib/localflavor/es/es_provinces.py:54
+msgid "Zaragoza"
+msgstr "Сарагоса"
+
+#: contrib/localflavor/es/es_provinces.py:55
+msgid "Ceuta"
+msgstr "Ceuta"
+
+#: contrib/localflavor/es/es_provinces.py:56
+msgid "Melilla"
+msgstr "Melilla"
+
+#: contrib/localflavor/es/es_regions.py:5
+msgid "Andalusia"
+msgstr "Андалузија"
+
+#: contrib/localflavor/es/es_regions.py:6
+msgid "Aragon"
+msgstr "Арагон"
+
+#: contrib/localflavor/es/es_regions.py:7
+msgid "Principality of Asturias"
+msgstr "Principality of Asturias"
+
+#: contrib/localflavor/es/es_regions.py:8
+msgid "Balearic Islands"
+msgstr "Острови Балеарик"
+
+#: contrib/localflavor/es/es_regions.py:9
+msgid "Basque Country"
+msgstr "Баскија"
+
+#: contrib/localflavor/es/es_regions.py:10
+msgid "Canary Islands"
+msgstr "Канарски острови"
+
+#: contrib/localflavor/es/es_regions.py:12
+msgid "Castile-La Mancha"
+msgstr "Кастиља ла Манча"
+
+#: contrib/localflavor/es/es_regions.py:13
+msgid "Castile and Leon"
+msgstr "Кастиња и Леон"
+
+#: contrib/localflavor/es/es_regions.py:14
+msgid "Catalonia"
+msgstr "Каталонија"
+
+#: contrib/localflavor/es/es_regions.py:15
+msgid "Extremadura"
+msgstr "Екстремадура"
+
+#: contrib/localflavor/es/es_regions.py:16
+msgid "Galicia"
+msgstr "Галиција"
+
+#: contrib/localflavor/es/es_regions.py:19
+msgid "Region of Murcia"
+msgstr "Регион Мурција"
+
+#: contrib/localflavor/es/es_regions.py:20
+msgid "Foral Community of Navarre"
+msgstr "Foral Community of Navarre"
+
+#: contrib/localflavor/es/es_regions.py:21
+msgid "Valencian Community"
+msgstr "Valencian Community"
+
+#: contrib/localflavor/es/forms.py:19
+msgid "Enter a valid postal code in the range and format 01XXX - 52XXX."
+msgstr "Внесете поштенски број во опсег и формат 01XXX - 52XXX."
+
+#: contrib/localflavor/es/forms.py:39
+msgid ""
+"Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or "
+"9XXXXXXXX."
+msgstr "Внесете правилен телефонски број во еден од формативе 6XXXXXXXX, 8XXXXXXXX или 9XXXXXXXX."
+
+#: contrib/localflavor/es/forms.py:66
+msgid "Please enter a valid NIF, NIE, or CIF."
+msgstr "Ве молам внесете правиелн NIF, NIE или CIF."
+
+#: contrib/localflavor/es/forms.py:67
+msgid "Please enter a valid NIF or NIE."
+msgstr "Ве молам внесете валиден NIF или NIE."
+
+#: contrib/localflavor/es/forms.py:68
+msgid "Invalid checksum for NIF."
+msgstr "Неправилна контролна сума за NIF."
+
+#: contrib/localflavor/es/forms.py:69
+msgid "Invalid checksum for NIE."
+msgstr "Неправилна контролна сума за NIE."
+
+#: contrib/localflavor/es/forms.py:70
+msgid "Invalid checksum for CIF."
+msgstr "Неправилна контролна сум за CIF."
+
+#: contrib/localflavor/es/forms.py:142
+msgid "Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX."
+msgstr "Внесете правилна банкарска сметка во формат XXXX-XXXX-XX-XXXXXXXXXX."
+
+#: contrib/localflavor/es/forms.py:143
+msgid "Invalid checksum for bank account number."
+msgstr "Неправилна контролна сума за бројот на банкарската сметка."
+
+#: contrib/localflavor/fi/forms.py:28
+msgid "Enter a valid Finnish social security number."
+msgstr "Внесте правилен фински матичен број."
+
+#: contrib/localflavor/in_/forms.py:14
+msgid "Enter a zip code in the format XXXXXXX."
+msgstr "Внесете правилен поштенски број во форматот  XXXXXXXX."
+
+#: contrib/localflavor/is_/forms.py:17
+msgid "Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr "Внесете валиден идентификационен број од Исланд. Форматот е XXXXXX-XXXX."
+
+#: contrib/localflavor/is_/forms.py:18
+msgid "The Icelandic identification number is not valid."
+msgstr "Исландскиот идентификационент број е невалиден."
+
+#: contrib/localflavor/it/forms.py:14
+msgid "Enter a valid zip code."
+msgstr "Внесете правилен поштенски број."
+
+#: contrib/localflavor/it/forms.py:43
+msgid "Enter a valid Social Security number."
+msgstr "Внесете правилен осигурителен број."
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr "Внесете правилен даночен број."
+
+#: contrib/localflavor/jp/forms.py:17
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "Внесете поштенски број во форматот XXXXXXX или XXX-XXXX."
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr "Хокаидо"
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr "Аомори"
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr "Ивате"
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr "Мијаги"
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr "Акита"
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr "Јамагата"
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr "Фукушима"
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr "Ибараки"
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr "Точиги"
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr "Гунма"
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr "Саитама"
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr "Чиба"
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr "Токио"
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr "Канагава"
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr "Јаманаши"
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr "Нагано"
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr "Нигита"
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr "Тојама"
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr "Ишикава"
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr "Фукуи"
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr "Гифу"
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr "Шизоука"
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr "Аичи"
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr "Мие"
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr "Шига"
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr "Кјото"
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr "Осака"
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr "Хиого"
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr "Нара"
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr "Вакајама"
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr "Тотори"
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr "Шимане"
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr "Окајама"
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr "Хирошима"
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr "Јамагучи"
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr "Токушима"
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr "Кагава"
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr "Еиме"
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr "Кочи"
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr "Фукуока"
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr "Сага"
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr "Нагасаки"
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr "Кумамото"
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr "Оита"
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr "Мијазаки"
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr "Кагошима"
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr "Окинава"
+
+#: contrib/localflavor/mx/mx_states.py:12
+msgid "Aguascalientes"
+msgstr "Aguascalientes"
+
+#: contrib/localflavor/mx/mx_states.py:13
+msgid "Baja California"
+msgstr "Баја Калифорнија"
+
+#: contrib/localflavor/mx/mx_states.py:14
+msgid "Baja California Sur"
+msgstr "Baja California Sur"
+
+#: contrib/localflavor/mx/mx_states.py:15
+msgid "Campeche"
+msgstr "Кампеш"
+
+#: contrib/localflavor/mx/mx_states.py:16
+msgid "Chihuahua"
+msgstr "Chihuahua"
+
+#: contrib/localflavor/mx/mx_states.py:17
+msgid "Chiapas"
+msgstr "Чиапас"
+
+#: contrib/localflavor/mx/mx_states.py:18
+msgid "Coahuila"
+msgstr "Coahuila"
+
+#: contrib/localflavor/mx/mx_states.py:19
+msgid "Colima"
+msgstr "Колима"
+
+#: contrib/localflavor/mx/mx_states.py:20
+msgid "Distrito Federal"
+msgstr "Distrito Federal"
+
+#: contrib/localflavor/mx/mx_states.py:21
+msgid "Durango"
+msgstr "Дуранго"
+
+#: contrib/localflavor/mx/mx_states.py:22
+msgid "Guerrero"
+msgstr "Гуереро"
+
+#: contrib/localflavor/mx/mx_states.py:23
+msgid "Guanajuato"
+msgstr "Guanajuato"
+
+#: contrib/localflavor/mx/mx_states.py:24
+msgid "Hidalgo"
+msgstr "Хидалго"
+
+#: contrib/localflavor/mx/mx_states.py:25
+msgid "Jalisco"
+msgstr "Џалиско"
+
+#: contrib/localflavor/mx/mx_states.py:26
+msgid "Estado de México"
+msgstr "Estado de México"
+
+#: contrib/localflavor/mx/mx_states.py:27
+msgid "Michoacán"
+msgstr "Michoacán"
+
+#: contrib/localflavor/mx/mx_states.py:28
+msgid "Morelos"
+msgstr "Morelos"
+
+#: contrib/localflavor/mx/mx_states.py:29
+msgid "Nayarit"
+msgstr "Nayarit"
+
+#: contrib/localflavor/mx/mx_states.py:30
+msgid "Nuevo León"
+msgstr "Nuevo León"
+
+#: contrib/localflavor/mx/mx_states.py:31
+msgid "Oaxaca"
+msgstr "Oaxaca"
+
+#: contrib/localflavor/mx/mx_states.py:32
+msgid "Puebla"
+msgstr "Puebla"
+
+#: contrib/localflavor/mx/mx_states.py:33
+msgid "Querétaro"
+msgstr "Querétaro"
+
+#: contrib/localflavor/mx/mx_states.py:34
+msgid "Quintana Roo"
+msgstr "Куантана Ро"
+
+#: contrib/localflavor/mx/mx_states.py:35
+msgid "Sinaloa"
+msgstr "Синалоа"
+
+#: contrib/localflavor/mx/mx_states.py:36
+msgid "San Luis Potosí"
+msgstr "Сан Луис Потоси"
+
+#: contrib/localflavor/mx/mx_states.py:37
+msgid "Sonora"
+msgstr "Сонора"
+
+#: contrib/localflavor/mx/mx_states.py:38
+msgid "Tabasco"
+msgstr "Табаско"
+
+#: contrib/localflavor/mx/mx_states.py:39
+msgid "Tamaulipas"
+msgstr "Тамаулипас"
+
+#: contrib/localflavor/mx/mx_states.py:40
+msgid "Tlaxcala"
+msgstr "Tlaxcala"
+
+#: contrib/localflavor/mx/mx_states.py:41
+msgid "Veracruz"
+msgstr "Веракруз"
+
+#: contrib/localflavor/mx/mx_states.py:42
+msgid "Yucatán"
+msgstr "Јукатан"
+
+#: contrib/localflavor/mx/mx_states.py:43
+msgid "Zacatecas"
+msgstr "Зацатекас"
+
+#: contrib/localflavor/nl/forms.py:21
+msgid "Enter a valid postal code"
+msgstr "Внесете правилен поштенски код"
+
+#: contrib/localflavor/nl/forms.py:52
+msgid "Enter a valid phone number"
+msgstr "Внесете валиден телефонски број"
+
+#: contrib/localflavor/nl/forms.py:78
+msgid "Enter a valid SoFi number"
+msgstr "Внесете валиден осигурителен број"
+
+#: contrib/localflavor/nl/nl_provinces.py:4
+msgid "Drente"
+msgstr "Дренте"
+
+#: contrib/localflavor/nl/nl_provinces.py:5
+msgid "Flevoland"
+msgstr "Флеволанд"
+
+#: contrib/localflavor/nl/nl_provinces.py:6
+msgid "Friesland"
+msgstr "Фраисланд"
+
+#: contrib/localflavor/nl/nl_provinces.py:7
+msgid "Gelderland"
+msgstr "Гелдерланд"
+
+#: contrib/localflavor/nl/nl_provinces.py:8
+msgid "Groningen"
+msgstr "Гронинген"
+
+#: contrib/localflavor/nl/nl_provinces.py:9
+msgid "Limburg"
+msgstr "Лимбург"
+
+#: contrib/localflavor/nl/nl_provinces.py:10
+msgid "Noord-Brabant"
+msgstr "Noord-Brabant"
+
+#: contrib/localflavor/nl/nl_provinces.py:11
+msgid "Noord-Holland"
+msgstr "Noord-Holland"
+
+#: contrib/localflavor/nl/nl_provinces.py:12
+msgid "Overijssel"
+msgstr "Overijssel"
+
+#: contrib/localflavor/nl/nl_provinces.py:13
+msgid "Utrecht"
+msgstr "Утрехт"
+
+#: contrib/localflavor/nl/nl_provinces.py:14
+msgid "Zeeland"
+msgstr "Зиланд"
+
+#: contrib/localflavor/nl/nl_provinces.py:15
+msgid "Zuid-Holland"
+msgstr "Zuid-Holland"
+
+#: contrib/localflavor/no/forms.py:33
+msgid "Enter a valid Norwegian social security number."
+msgstr "Ве молам внесете правилен норвешки матичен број."
+
+#: contrib/localflavor/pe/forms.py:24
+msgid "This field requires 8 digits."
+msgstr "Во ова поле мора да се внесат 8 цифри."
+
+#: contrib/localflavor/pe/forms.py:52
+msgid "This field requires 11 digits."
+msgstr "Во ова поле се потребни 11 цифри."
+
+#: contrib/localflavor/pl/forms.py:39
+msgid "National Identification Number consists of 11 digits."
+msgstr "Националниот идентификационен број се состои од 11 цифири."
+
+#: contrib/localflavor/pl/forms.py:40
+msgid "Wrong checksum for the National Identification Number."
+msgstr "Погрешна проверка за Националниот идентификационен број."
+
+#: contrib/localflavor/pl/forms.py:72
+msgid "Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX."
+msgstr "Внесете даночен број (NIP) во форматот XXX-XXX-XX-XX или XX-XX-XXX-XXX."
+
+#: contrib/localflavor/pl/forms.py:73
+msgid "Wrong checksum for the Tax Number (NIP)."
+msgstr "Даночниот број (NIP) е погрешен."
+
+#: contrib/localflavor/pl/forms.py:112
+msgid "National Business Register Number (REGON) consists of 7 or 9 digits."
+msgstr "Националниот бизнис регистрациски број (REGON) се состои од 7 или 9 цифри."
+
+#: contrib/localflavor/pl/forms.py:113
+msgid "Wrong checksum for the National Business Register Number (REGON)."
+msgstr "Неправилна контролна сум за Националниот бизнис регистрационен број (REGON)."
+
+#: contrib/localflavor/pl/forms.py:156
+msgid "Enter a postal code in the format XX-XXX."
+msgstr "Внесете правилен поштенски број во формат XX-XXX."
+
+#: contrib/localflavor/pl/pl_voivodeships.py:8
+msgid "Lower Silesia"
+msgstr "Долна Силесиа"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:9
+msgid "Kuyavia-Pomerania"
+msgstr "Kuyavia-Pomerania"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:10
+msgid "Lublin"
+msgstr "Лублин"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:11
+msgid "Lubusz"
+msgstr "Лубус"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:12
+msgid "Lodz"
+msgstr "Лодз"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:13
+msgid "Lesser Poland"
+msgstr "Lesser Poland"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:14
+msgid "Masovia"
+msgstr "Масовиа"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:15
+msgid "Opole"
+msgstr "Ополе"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:16
+msgid "Subcarpatia"
+msgstr "Субкарпатиа"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:17
+msgid "Podlasie"
+msgstr "Подласи"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:18
+msgid "Pomerania"
+msgstr "Померанија"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:19
+msgid "Silesia"
+msgstr "Силесиа"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:20
+msgid "Swietokrzyskie"
+msgstr "Swietokrzyskie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:21
+msgid "Warmia-Masuria"
+msgstr "Warmia-Masuria"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:22
+msgid "Greater Poland"
+msgstr "Greater Poland"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:23
+msgid "West Pomerania"
+msgstr "Западна Померанија"
+
+#: contrib/localflavor/sk/forms.py:30
+msgid "Enter a postal code in the format XXXXX or XXX XX."
+msgstr "Внесете поштенски број во форматот XXXXX или XXX XX."
+
+#: contrib/localflavor/sk/sk_districts.py:8
+msgid "Banska Bystrica"
+msgstr "Банска Бистрица"
+
+#: contrib/localflavor/sk/sk_districts.py:9
+msgid "Banska Stiavnica"
+msgstr "Банска Стиавница"
+
+#: contrib/localflavor/sk/sk_districts.py:10
+msgid "Bardejov"
+msgstr "Бардејов"
+
+#: contrib/localflavor/sk/sk_districts.py:11
+msgid "Banovce nad Bebravou"
+msgstr "Бановце над Бебраво"
+
+#: contrib/localflavor/sk/sk_districts.py:12
+msgid "Brezno"
+msgstr "Брезно"
+
+#: contrib/localflavor/sk/sk_districts.py:13
+msgid "Bratislava I"
+msgstr "Братислава I"
+
+#: contrib/localflavor/sk/sk_districts.py:14
+msgid "Bratislava II"
+msgstr "Братислава II"
+
+#: contrib/localflavor/sk/sk_districts.py:15
+msgid "Bratislava III"
+msgstr "Братислава III"
+
+#: contrib/localflavor/sk/sk_districts.py:16
+msgid "Bratislava IV"
+msgstr "Братислава IV"
+
+#: contrib/localflavor/sk/sk_districts.py:17
+msgid "Bratislava V"
+msgstr "Братислава V"
+
+#: contrib/localflavor/sk/sk_districts.py:18
+msgid "Bytca"
+msgstr "Битка"
+
+#: contrib/localflavor/sk/sk_districts.py:19
+msgid "Cadca"
+msgstr "Кадка"
+
+#: contrib/localflavor/sk/sk_districts.py:20
+msgid "Detva"
+msgstr "Детва"
+
+#: contrib/localflavor/sk/sk_districts.py:21
+msgid "Dolny Kubin"
+msgstr "Dolny Kubin"
+
+#: contrib/localflavor/sk/sk_districts.py:22
+msgid "Dunajska Streda"
+msgstr "Dunajska Streda"
+
+#: contrib/localflavor/sk/sk_districts.py:23
+msgid "Galanta"
+msgstr "Galanta"
+
+#: contrib/localflavor/sk/sk_districts.py:24
+msgid "Gelnica"
+msgstr "Гелника"
+
+#: contrib/localflavor/sk/sk_districts.py:25
+msgid "Hlohovec"
+msgstr "Хлоховец"
+
+#: contrib/localflavor/sk/sk_districts.py:26
+msgid "Humenne"
+msgstr "Хумен"
+
+#: contrib/localflavor/sk/sk_districts.py:27
+msgid "Ilava"
+msgstr "Ilava"
+
+#: contrib/localflavor/sk/sk_districts.py:28
+msgid "Kezmarok"
+msgstr "Кезмарок"
+
+#: contrib/localflavor/sk/sk_districts.py:29
+msgid "Komarno"
+msgstr "Комарно"
+
+#: contrib/localflavor/sk/sk_districts.py:30
+msgid "Kosice I"
+msgstr "Кошице I"
+
+#: contrib/localflavor/sk/sk_districts.py:31
+msgid "Kosice II"
+msgstr "Кошице II"
+
+#: contrib/localflavor/sk/sk_districts.py:32
+msgid "Kosice III"
+msgstr "Кошице III"
+
+#: contrib/localflavor/sk/sk_districts.py:33
+msgid "Kosice IV"
+msgstr "Кошице IV"
+
+#: contrib/localflavor/sk/sk_districts.py:34
+msgid "Kosice - okolie"
+msgstr "Кошице - околина"
+
+#: contrib/localflavor/sk/sk_districts.py:35
+msgid "Krupina"
+msgstr "Крупина"
+
+#: contrib/localflavor/sk/sk_districts.py:36
+msgid "Kysucke Nove Mesto"
+msgstr "Kysucke Nove Mesto"
+
+#: contrib/localflavor/sk/sk_districts.py:37
+msgid "Levice"
+msgstr "Левице"
+
+#: contrib/localflavor/sk/sk_districts.py:38
+msgid "Levoca"
+msgstr "Левока"
+
+#: contrib/localflavor/sk/sk_districts.py:39
+msgid "Liptovsky Mikulas"
+msgstr "Liptovsky Mikulas"
+
+#: contrib/localflavor/sk/sk_districts.py:40
+msgid "Lucenec"
+msgstr "Луценец"
+
+#: contrib/localflavor/sk/sk_districts.py:41
+msgid "Malacky"
+msgstr "Malacky"
+
+#: contrib/localflavor/sk/sk_districts.py:42
+msgid "Martin"
+msgstr "Мартин"
+
+#: contrib/localflavor/sk/sk_districts.py:43
+msgid "Medzilaborce"
+msgstr "Medzilaborce"
+
+#: contrib/localflavor/sk/sk_districts.py:44
+msgid "Michalovce"
+msgstr "Michalovce"
+
+#: contrib/localflavor/sk/sk_districts.py:45
+msgid "Myjava"
+msgstr "Myjava"
+
+#: contrib/localflavor/sk/sk_districts.py:46
+msgid "Namestovo"
+msgstr "Наместово"
+
+#: contrib/localflavor/sk/sk_districts.py:47
+msgid "Nitra"
+msgstr "Нитра"
+
+#: contrib/localflavor/sk/sk_districts.py:48
+msgid "Nove Mesto nad Vahom"
+msgstr "Nove Mesto nad Vahom"
+
+#: contrib/localflavor/sk/sk_districts.py:49
+msgid "Nove Zamky"
+msgstr "Nove Zamky"
+
+#: contrib/localflavor/sk/sk_districts.py:50
+msgid "Partizanske"
+msgstr "Партизанске"
+
+#: contrib/localflavor/sk/sk_districts.py:51
+msgid "Pezinok"
+msgstr "Пезинок"
+
+#: contrib/localflavor/sk/sk_districts.py:52
+msgid "Piestany"
+msgstr "Piestany"
+
+#: contrib/localflavor/sk/sk_districts.py:53
+msgid "Poltar"
+msgstr "Полтар"
+
+#: contrib/localflavor/sk/sk_districts.py:54
+msgid "Poprad"
+msgstr "Попрад"
+
+#: contrib/localflavor/sk/sk_districts.py:55
+msgid "Povazska Bystrica"
+msgstr "Povazska Bystrica"
+
+#: contrib/localflavor/sk/sk_districts.py:56
+msgid "Presov"
+msgstr "Пресов"
+
+#: contrib/localflavor/sk/sk_districts.py:57
+msgid "Prievidza"
+msgstr "Prievidza"
+
+#: contrib/localflavor/sk/sk_districts.py:58
+msgid "Puchov"
+msgstr "Пучов"
+
+#: contrib/localflavor/sk/sk_districts.py:59
+msgid "Revuca"
+msgstr "Ревука"
+
+#: contrib/localflavor/sk/sk_districts.py:60
+msgid "Rimavska Sobota"
+msgstr "Rimavska Sobota"
+
+#: contrib/localflavor/sk/sk_districts.py:61
+msgid "Roznava"
+msgstr "Рознава"
+
+#: contrib/localflavor/sk/sk_districts.py:62
+msgid "Ruzomberok"
+msgstr "Рузомберок"
+
+#: contrib/localflavor/sk/sk_districts.py:63
+msgid "Sabinov"
+msgstr "Сабинов"
+
+#: contrib/localflavor/sk/sk_districts.py:64
+msgid "Senec"
+msgstr "Сенец"
+
+#: contrib/localflavor/sk/sk_districts.py:65
+msgid "Senica"
+msgstr "Сеника"
+
+#: contrib/localflavor/sk/sk_districts.py:66
+msgid "Skalica"
+msgstr "Скалица"
+
+#: contrib/localflavor/sk/sk_districts.py:67
+msgid "Snina"
+msgstr "Шнина"
+
+#: contrib/localflavor/sk/sk_districts.py:68
+msgid "Sobrance"
+msgstr "Собранце"
+
+#: contrib/localflavor/sk/sk_districts.py:69
+msgid "Spisska Nova Ves"
+msgstr "Spisska Nova Ves"
+
+#: contrib/localflavor/sk/sk_districts.py:70
+msgid "Stara Lubovna"
+msgstr "Стара Љубовна"
+
+#: contrib/localflavor/sk/sk_districts.py:71
+msgid "Stropkov"
+msgstr "Стропков"
+
+#: contrib/localflavor/sk/sk_districts.py:72
+msgid "Svidnik"
+msgstr "Свидник"
+
+#: contrib/localflavor/sk/sk_districts.py:73
+msgid "Sala"
+msgstr "Сала"
+
+#: contrib/localflavor/sk/sk_districts.py:74
+msgid "Topolcany"
+msgstr "Тополчани"
+
+#: contrib/localflavor/sk/sk_districts.py:75
+msgid "Trebisov"
+msgstr "Требисов"
+
+#: contrib/localflavor/sk/sk_districts.py:76
+msgid "Trencin"
+msgstr "Тренцин"
+
+#: contrib/localflavor/sk/sk_districts.py:77
+msgid "Trnava"
+msgstr "Трнава"
+
+#: contrib/localflavor/sk/sk_districts.py:78
+msgid "Turcianske Teplice"
+msgstr "Turcianske Teplice"
+
+#: contrib/localflavor/sk/sk_districts.py:79
+msgid "Tvrdosin"
+msgstr "Тврдосин"
+
+#: contrib/localflavor/sk/sk_districts.py:80
+msgid "Velky Krtis"
+msgstr "Velky Krtis"
+
+#: contrib/localflavor/sk/sk_districts.py:81
+msgid "Vranov nad Toplou"
+msgstr "Vranov nad Toplou"
+
+#: contrib/localflavor/sk/sk_districts.py:82
+msgid "Zlate Moravce"
+msgstr "Злате Моравце"
+
+#: contrib/localflavor/sk/sk_districts.py:83
+msgid "Zvolen"
+msgstr "Зволен"
+
+#: contrib/localflavor/sk/sk_districts.py:84
+msgid "Zarnovica"
+msgstr "Зарновица"
+
+#: contrib/localflavor/sk/sk_districts.py:85
+msgid "Ziar nad Hronom"
+msgstr "Ziar nad Hronom"
+
+#: contrib/localflavor/sk/sk_districts.py:86
+msgid "Zilina"
+msgstr "Зилина"
+
+#: contrib/localflavor/sk/sk_regions.py:8
+msgid "Banska Bystrica region"
+msgstr "Banska Bystrica region"
+
+#: contrib/localflavor/sk/sk_regions.py:9
+msgid "Bratislava region"
+msgstr "Братиславски регион"
+
+#: contrib/localflavor/sk/sk_regions.py:10
+msgid "Kosice region"
+msgstr "Кошице регион"
+
+#: contrib/localflavor/sk/sk_regions.py:11
+msgid "Nitra region"
+msgstr "Нитра регион"
+
+#: contrib/localflavor/sk/sk_regions.py:12
+msgid "Presov region"
+msgstr "Пресов регион"
+
+#: contrib/localflavor/sk/sk_regions.py:13
+msgid "Trencin region"
+msgstr "Тренцин регион"
+
+#: contrib/localflavor/sk/sk_regions.py:14
+msgid "Trnava region"
+msgstr "Трнава регион"
+
+#: contrib/localflavor/sk/sk_regions.py:15
+msgid "Zilina region"
+msgstr "Зилина регион"
+
+#: contrib/localflavor/uk/forms.py:21
+msgid "Enter a valid postcode."
+msgstr "Внесете правилен поштенски код."
+
+#: contrib/localflavor/uk/uk_regions.py:11
+msgid "Bedfordshire"
+msgstr "Бедфордшир"
+
+#: contrib/localflavor/uk/uk_regions.py:12
+msgid "Buckinghamshire"
+msgstr "Букингхамшир"
+
+#: contrib/localflavor/uk/uk_regions.py:14
+msgid "Cheshire"
+msgstr "Чешир"
+
+#: contrib/localflavor/uk/uk_regions.py:15
+msgid "Cornwall and Isles of Scilly"
+msgstr "Cornwall and Isles of Scilly"
+
+#: contrib/localflavor/uk/uk_regions.py:16
+msgid "Cumbria"
+msgstr "Кумбриа"
+
+#: contrib/localflavor/uk/uk_regions.py:17
+msgid "Derbyshire"
+msgstr "Дербишир"
+
+#: contrib/localflavor/uk/uk_regions.py:18
+msgid "Devon"
+msgstr "Девон"
+
+#: contrib/localflavor/uk/uk_regions.py:19
+msgid "Dorset"
+msgstr "Дорсет"
+
+#: contrib/localflavor/uk/uk_regions.py:20
+msgid "Durham"
+msgstr "Дурам"
+
+#: contrib/localflavor/uk/uk_regions.py:21
+msgid "East Sussex"
+msgstr "Источен Сасекс"
+
+#: contrib/localflavor/uk/uk_regions.py:22
+msgid "Essex"
+msgstr "Есекс"
+
+#: contrib/localflavor/uk/uk_regions.py:23
+msgid "Gloucestershire"
+msgstr "Gloucestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:24
+msgid "Greater London"
+msgstr "Поширок Лондон"
+
+#: contrib/localflavor/uk/uk_regions.py:25
+msgid "Greater Manchester"
+msgstr "Поширок Манчестер"
+
+#: contrib/localflavor/uk/uk_regions.py:26
+msgid "Hampshire"
+msgstr "Хемпшир"
+
+#: contrib/localflavor/uk/uk_regions.py:27
+msgid "Hertfordshire"
+msgstr "Хертфордшир"
+
+#: contrib/localflavor/uk/uk_regions.py:28
+msgid "Kent"
+msgstr "Кент"
+
+#: contrib/localflavor/uk/uk_regions.py:29
+msgid "Lancashire"
+msgstr "Ланкашир"
+
+#: contrib/localflavor/uk/uk_regions.py:30
+msgid "Leicestershire"
+msgstr "Leicestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:31
+msgid "Lincolnshire"
+msgstr "Линколншир"
+
+#: contrib/localflavor/uk/uk_regions.py:32
+msgid "Merseyside"
+msgstr "Мерсејсајд"
+
+#: contrib/localflavor/uk/uk_regions.py:33
+msgid "Norfolk"
+msgstr "Норфолк"
+
+#: contrib/localflavor/uk/uk_regions.py:34
+msgid "North Yorkshire"
+msgstr "Северен Јоркшир"
+
+#: contrib/localflavor/uk/uk_regions.py:35
+msgid "Northamptonshire"
+msgstr "Нортхамтоншир"
+
+#: contrib/localflavor/uk/uk_regions.py:36
+msgid "Northumberland"
+msgstr "Northumberland"
+
+#: contrib/localflavor/uk/uk_regions.py:37
+msgid "Nottinghamshire"
+msgstr "Нотингхамшир"
+
+#: contrib/localflavor/uk/uk_regions.py:38
+msgid "Oxfordshire"
+msgstr "Оксфордшир"
+
+#: contrib/localflavor/uk/uk_regions.py:39
+msgid "Shropshire"
+msgstr "Шропшир"
+
+#: contrib/localflavor/uk/uk_regions.py:40
+msgid "Somerset"
+msgstr "Сомерсет"
+
+#: contrib/localflavor/uk/uk_regions.py:41
+msgid "South Yorkshire"
+msgstr "Јужен Јоркшир"
+
+#: contrib/localflavor/uk/uk_regions.py:42
+msgid "Staffordshire"
+msgstr "Стафордшир"
+
+#: contrib/localflavor/uk/uk_regions.py:43
+msgid "Suffolk"
+msgstr "Суфолк"
+
+#: contrib/localflavor/uk/uk_regions.py:44
+msgid "Surrey"
+msgstr "Surrey"
+
+#: contrib/localflavor/uk/uk_regions.py:45
+msgid "Tyne and Wear"
+msgstr "Tyne and Wear"
+
+#: contrib/localflavor/uk/uk_regions.py:46
+msgid "Warwickshire"
+msgstr "Warwickshire"
+
+#: contrib/localflavor/uk/uk_regions.py:47
+msgid "West Midlands"
+msgstr "Западен Мидландс"
+
+#: contrib/localflavor/uk/uk_regions.py:48
+msgid "West Sussex"
+msgstr "Западен Сасекс"
+
+#: contrib/localflavor/uk/uk_regions.py:49
+msgid "West Yorkshire"
+msgstr "Западен Јоркшир"
+
+#: contrib/localflavor/uk/uk_regions.py:50
+msgid "Wiltshire"
+msgstr "Вилтшир"
+
+#: contrib/localflavor/uk/uk_regions.py:51
+msgid "Worcestershire"
+msgstr "Worcestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:55
+msgid "County Antrim"
+msgstr "County Antrim"
+
+#: contrib/localflavor/uk/uk_regions.py:56
+msgid "County Armagh"
+msgstr "County Armagh"
+
+#: contrib/localflavor/uk/uk_regions.py:57
+msgid "County Down"
+msgstr "County Down"
+
+#: contrib/localflavor/uk/uk_regions.py:58
+msgid "County Fermanagh"
+msgstr "County Fermanagh"
+
+#: contrib/localflavor/uk/uk_regions.py:59
+msgid "County Londonderry"
+msgstr "County Londonderry"
+
+#: contrib/localflavor/uk/uk_regions.py:60
+msgid "County Tyrone"
+msgstr "County Tyrone"
+
+#: contrib/localflavor/uk/uk_regions.py:64
+msgid "Clwyd"
+msgstr "Clwyd"
+
+#: contrib/localflavor/uk/uk_regions.py:65
+msgid "Dyfed"
+msgstr "Dyfed"
+
+#: contrib/localflavor/uk/uk_regions.py:66
+msgid "Gwent"
+msgstr "Гвент"
+
+#: contrib/localflavor/uk/uk_regions.py:67
+msgid "Gwynedd"
+msgstr "Gwynedd"
+
+#: contrib/localflavor/uk/uk_regions.py:68
+msgid "Mid Glamorgan"
+msgstr "Mid Glamorgan"
+
+#: contrib/localflavor/uk/uk_regions.py:69
+msgid "Powys"
+msgstr "Powys"
+
+#: contrib/localflavor/uk/uk_regions.py:70
+msgid "South Glamorgan"
+msgstr "Јужен Гламорга"
+
+#: contrib/localflavor/uk/uk_regions.py:71
+msgid "West Glamorgan"
+msgstr "Западен Гламорган"
+
+#: contrib/localflavor/uk/uk_regions.py:75
+msgid "Borders"
+msgstr "Borders"
+
+#: contrib/localflavor/uk/uk_regions.py:76
+msgid "Central Scotland"
+msgstr "Централна Шкотска"
+
+#: contrib/localflavor/uk/uk_regions.py:77
+msgid "Dumfries and Galloway"
+msgstr "Dumfries and Galloway"
+
+#: contrib/localflavor/uk/uk_regions.py:78
+msgid "Fife"
+msgstr "Fife"
+
+#: contrib/localflavor/uk/uk_regions.py:79
+msgid "Grampian"
+msgstr "Грампиан"
+
+#: contrib/localflavor/uk/uk_regions.py:80
+msgid "Highland"
+msgstr "Highland"
+
+#: contrib/localflavor/uk/uk_regions.py:81
+msgid "Lothian"
+msgstr "Lothian"
+
+#: contrib/localflavor/uk/uk_regions.py:82
+msgid "Orkney Islands"
+msgstr "Orkney Islands"
+
+#: contrib/localflavor/uk/uk_regions.py:83
+msgid "Shetland Islands"
+msgstr "Shetland Islands"
+
+#: contrib/localflavor/uk/uk_regions.py:84
+msgid "Strathclyde"
+msgstr "Strathclyde"
+
+#: contrib/localflavor/uk/uk_regions.py:85
+msgid "Tayside"
+msgstr "Tayside"
+
+#: contrib/localflavor/uk/uk_regions.py:86
+msgid "Western Isles"
+msgstr "Western Isles"
+
+#: contrib/localflavor/uk/uk_regions.py:90
+msgid "England"
+msgstr "Англија"
+
+#: contrib/localflavor/uk/uk_regions.py:91
+msgid "Northern Ireland"
+msgstr "Северна Ирска"
+
+#: contrib/localflavor/uk/uk_regions.py:92
+msgid "Scotland"
+msgstr "Шкотска"
+
+#: contrib/localflavor/uk/uk_regions.py:93
+msgid "Wales"
+msgstr "Велс"
+
+#: contrib/localflavor/us/forms.py:16
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "Внесете поштенски број во форматот XXXXX или XXXXX-XXXX."
+
+#: contrib/localflavor/us/forms.py:54
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr "Внесте правилен матичен број за САД во XXX-XX-XXXX форматот."
+
+#: contrib/localflavor/za/forms.py:20
+msgid "Enter a valid South African ID number"
+msgstr "Внесете правилен јужно афрички број за идентификација"
+
+#: contrib/localflavor/za/forms.py:54
+msgid "Enter a valid South African postal code"
+msgstr "Внесете правилен јужно афрички поштенски код"
+
+#: contrib/localflavor/za/za_provinces.py:4
+msgid "Eastern Cape"
+msgstr "Источен Кејп"
+
+#: contrib/localflavor/za/za_provinces.py:5
+msgid "Free State"
+msgstr "Free State"
+
+#: contrib/localflavor/za/za_provinces.py:6
+msgid "Gauteng"
+msgstr "Gauteng"
+
+#: contrib/localflavor/za/za_provinces.py:7
+msgid "KwaZulu-Natal"
+msgstr "KwaZulu-Natal"
+
+#: contrib/localflavor/za/za_provinces.py:8
+msgid "Limpopo"
+msgstr "Limpopo"
+
+#: contrib/localflavor/za/za_provinces.py:9
+msgid "Mpumalanga"
+msgstr "Mpumalanga"
+
+#: contrib/localflavor/za/za_provinces.py:10
+msgid "Northern Cape"
+msgstr "Northern Cape"
+
+#: contrib/localflavor/za/za_provinces.py:11
+msgid "North West"
+msgstr "North West"
+
+#: contrib/localflavor/za/za_provinces.py:12
+msgid "Western Cape"
+msgstr "Western Cape"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "пренасочи од"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Ова треба да биде апсолутна патека без името на домејнот. На пр. „/nastani/"
+"prebaraj/“."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "пренасочи кон"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Ова може да биде или апсолутна патека (како погоре) или цела адреса "
+"почувајќи со „http://“."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "пренасочување"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "пренасочувања"
+
+#: contrib/sessions/models.py:41
+msgid "session key"
+msgstr "клуч на сесијата"
+
+#: contrib/sessions/models.py:42
+msgid "session data"
+msgstr "податоци од сесијата"
+
+#: contrib/sessions/models.py:43
+msgid "expire date"
+msgstr "датум на истекување"
+
+#: contrib/sessions/models.py:48
+msgid "session"
+msgstr "сесија"
+
+#: contrib/sessions/models.py:49
+msgid "sessions"
+msgstr "сесии"
+
+#: contrib/sites/models.py:32
+msgid "domain name"
+msgstr "домејн"
+
+#: contrib/sites/models.py:33
+msgid "display name"
+msgstr "име кое се прикажува"
+
+#: contrib/sites/models.py:37
+msgid "site"
+msgstr "сајт"
+
+#: contrib/sites/models.py:38
+msgid "sites"
+msgstr "сајтови"
+
+#: core/validators.py:72
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Оваа вредност смее да има само букви, бројки или долни црти."
+
+#: core/validators.py:76
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr "Оваа вредност смее да има само букви, бројки, долни црти, црти или коси црти."
+
+#: core/validators.py:80
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "Оваа вредност смее да содржи само букви, бројки, долни црти или црти."
+
+#: core/validators.py:84
+msgid "Uppercase letters are not allowed here."
+msgstr "Големи букви не се дозволени."
+
+#: core/validators.py:88
+msgid "Lowercase letters are not allowed here."
+msgstr "Мали букви не се дозволени."
+
+#: core/validators.py:95
+msgid "Enter only digits separated by commas."
+msgstr "Внесете само цифри одделени со запирки."
+
+#: core/validators.py:107
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Внесете валидни адреси за е-пошта одделени со запирки."
+
+#: core/validators.py:111
+msgid "Please enter a valid IP address."
+msgstr "Ве молам внесете валидна ИП адреса."
+
+#: core/validators.py:115
+msgid "Empty values are not allowed here."
+msgstr "Празни вредности не се дозволени."
+
+#: core/validators.py:119
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Ненумерички знаци не се дозволени тука."
+
+#: core/validators.py:123
+msgid "This value can't be comprised solely of digits."
+msgstr "Оваа вредност не смее да биде само од цифри."
+
+#: core/validators.py:128 newforms/fields.py:152
+msgid "Enter a whole number."
+msgstr "Внеси цел број."
+
+#: core/validators.py:132
+msgid "Only alphabetical characters are allowed here."
+msgstr "Дозволени се само букви."
+
+#: core/validators.py:147
+msgid "Year must be 1900 or later."
+msgstr "Годината мора да биде 1900 или покасно."
+
+#: core/validators.py:151
+#, python-format
+msgid "Invalid date: %s"
+msgstr "Неправилен датум: %s"
+
+#: core/validators.py:156 db/models/fields/__init__.py:548
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Внесете правилен датум во форматот ГГГГ-ММ-ДД."
+
+#: core/validators.py:161
+msgid "Enter a valid time in HH:MM format."
+msgstr "Внесете правилно време во форматот HH:MM."
+
+#: core/validators.py:165 db/models/fields/__init__.py:625
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Внесете правилен датум/време во форматот ГГГГ-ММ-ДД ЧЧ:ММ."
+
+#: core/validators.py:170 newforms/fields.py:403
+msgid "Enter a valid e-mail address."
+msgstr "Внесeте правилна адреса за е-пошта."
+
+#: core/validators.py:182 core/validators.py:474 newforms/fields.py:433
+#: oldforms/__init__.py:687
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Не беше пратена датотека. Проверете го типот на енкодирање на формата."
+
+#: core/validators.py:193 newforms/fields.py:459
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Качете валидна фотографија. Датотеката која ја качивте или не беше "
+"фотографија или беше расипана датотеката."
+
+#: core/validators.py:200
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "Адресата %s не покажува кон валидна фотографија."
+
+#: core/validators.py:204
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Телефонските броеви мора да бидат во XXX-XXX-XXXX форматот. „%s“ не е "
+"валиден."
+
+#: core/validators.py:212
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "Адресата „%s“ не покажува кон QuickTime видео."
+
+#: core/validators.py:216
+msgid "A valid URL is required."
+msgstr "Задолжителна е правилна адреса."
+
+#: core/validators.py:230
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Задолжителен е правилен HTML. Грешките се:\n"
+"%s"
+
+#: core/validators.py:237
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Неправилно формиран XML: %s"
+
+#: core/validators.py:254
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Неправилна адреса: %s"
+
+#: core/validators.py:259 core/validators.py:261
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "Адресата %s е скршена врска."
+
+#: core/validators.py:267
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Внесете правилна скратеница за држава во САД."
+
+#: core/validators.py:281
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Внимавајте на јазикот. Тука не е дозволен зборот %s."
+msgstr[1] "Внимавајте на јазикот. Тука не се дозволени зборовите %s."
+
+#: core/validators.py:288
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Ова поле мора да соодејствува со полето „%s“."
+
+#: core/validators.py:307
+msgid "Please enter something for at least one field."
+msgstr "Ве молам внесете нешто во барем едно поле."
+
+#: core/validators.py:316 core/validators.py:327
+msgid "Please enter both fields or leave them both empty."
+msgstr "Ве молам внесете во двете полиња или оставете ги двете празни."
+
+#: core/validators.py:335
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Ова поле мора да биде зададено ако %(field)s е %(value)s"
+
+#: core/validators.py:348
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Ова поле мора да биде зададено ако %(field)s не е %(value)s"
+
+#: core/validators.py:367
+msgid "Duplicate values are not allowed."
+msgstr "Дупликат вредности не се дозволени."
+
+#: core/validators.py:382
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Оваа вредноста мора да биде помеѓу %(lower)s и %(upper)s."
+
+#: core/validators.py:384
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Оваа вредноста мора да биде најмалку %s."
+
+#: core/validators.py:386
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Оваа вредност не смее да биде поголема од %s."
+
+#: core/validators.py:427
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Оваа вредноста мора да биде степен од %s."
+
+#: core/validators.py:437
+msgid "Please enter a valid decimal number."
+msgstr "Ве молам внесете правилен децимален број."
+
+#: core/validators.py:444
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural "Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Ве молам внесете правилен децимален број со најмногу %s цифрa."
+msgstr[1] "Ве молам внесете правилен децимален број со најмногу %s вкупно цифри."
+
+#: core/validators.py:447
+#, python-format
+msgid "Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural "Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] ""
+"Ве молам внесете правилен децимален број кој во целиот број има најмногу %s "
+"цифра."
+msgstr[1] ""
+"Ве молам внесете правилен децимален број кој во целиот број има најмногу %s "
+"цифри."
+
+#: core/validators.py:450
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural "Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "Ве молам внесете правилен децимален број кој има најмногу %s децимална цифра."
+msgstr[1] "Ве молам внесете правилен децимален број кој има најмногу %s децимални цифри."
+
+#: core/validators.py:458
+msgid "Please enter a valid floating point number."
+msgstr "Ве молам внесете правилен децимален број."
+
+#: core/validators.py:467
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Потврдете дека качената датотека има најмалку %s бајти."
+
+#: core/validators.py:468
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Потврдете дека качената датотека има најмногу %s бајти."
+
+#: core/validators.py:485
+msgid "The format for this field is wrong."
+msgstr "Форматот за ова поле е грешен."
+
+#: core/validators.py:500
+msgid "This field is invalid."
+msgstr "Ова поле не е правилно."
+
+#: core/validators.py:536
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Неможев да извадам ништо од %s."
+
+#: core/validators.py:539
+#, python-format
+msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "Адресата %(url)s врати неправилно заглавје Content-Type „%(contenttype)s“."
+
+#: core/validators.py:572
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Ве молам затворете го отворениот %(tag)s таг од линијата %(line)s. (линијата "
+"почнува со „%(start)s“.)"
+
+#: core/validators.py:576
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Некој текст  кој почнува на линијата %(line)s не е дозволен во тој контекст. "
+"(Линијата започнува со „%(start)s“.)"
+
+#: core/validators.py:581
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"„%(attr)s“ на линија %(line)s е неправилен атрибут. (линијата започнува со „%"
+"(start)s“.)"
+
+#: core/validators.py:586
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"„<%(tag)s>“ на линија %(line)s е неправилен таг. (линијата започнува со „%"
+"(start)s“.)"
+
+#: core/validators.py:590
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"На таг од линијата %(line)s му недостасува еден или повеќе од потребните "
+"атрибути (линијата започнува со „%(start)s“)."
+
+#: core/validators.py:595
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr "Атрибутот „%(attr)s“ на линијата %(line)s има неправилна вредност (линијата започнува со „%(start)s“)."
+
+#: db/models/manipulators.py:308
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(object)s од овој тип %(type)s веќе постои за даденото %(field)s."
+
+#: db/models/fields/__init__.py:51
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s со ова %(fieldname)s веќе постои."
+
+#: db/models/fields/__init__.py:176 db/models/fields/__init__.py:348
+#: db/models/fields/__init__.py:780 db/models/fields/__init__.py:791
+#: newforms/fields.py:46 oldforms/__init__.py:374
+msgid "This field is required."
+msgstr "Ова поле е задолжително."
+
+#: db/models/fields/__init__.py:448
+msgid "This value must be an integer."
+msgstr "Оваа вредност мора да биде цел број."
+
+#: db/models/fields/__init__.py:487
+msgid "This value must be either True or False."
+msgstr "Оваа вредност мора да биде или точно или неточно."
+
+#: db/models/fields/__init__.py:511
+msgid "This field cannot be null."
+msgstr "Оваа вредност неможе да биде null."
+
+#: db/models/fields/__init__.py:689
+msgid "This value must be a decimal number."
+msgstr "Оваа вредност мора да биде децимален број."
+
+#: db/models/fields/__init__.py:800
+msgid "Enter a valid filename."
+msgstr "Внесите правилно име на датотека."
+
+#: db/models/fields/__init__.py:981
+msgid "This value must be either None, True or False."
+msgstr "Оваа вредност мора да биде празна, точно или неточно."
+
+#: db/models/fields/related.py:94
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Ве молам внесете правилно %s."
+
+#: db/models/fields/related.py:746
+msgid "Separate multiple IDs with commas."
+msgstr "Одвојте ги идентификационите броеви со запирки."
+
+#: db/models/fields/related.py:748
+msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "Држете го „Control“ или „Command“ на Мекинтош за да изберете повеќе од едно."
+
+#: db/models/fields/related.py:795
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural "Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+"Ве молам внесете правилен %(self)s идентификацион број. Оваа вредност %"
+"(value)r е неправилна."
+msgstr[1] ""
+"Ве молам внесете правилен %(self)s идентификацион број. Вредностите %(value)"
+"r се неправилни."
+
+#: newforms/fields.py:47
+msgid "Enter a valid value."
+msgstr "Внесете правилна вредност."
+
+#: newforms/fields.py:124
+#, python-format
+msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+msgstr "Осигурајте се дека оваа вредност има најмногу %(max)d знаци (има %(length)d)."
+
+#: newforms/fields.py:125
+#, python-format
+msgid "Ensure this value has at least %(min)d characters (it has %(length)d)."
+msgstr "Осигурајте се дека оваа вредност има најмалку %(min)d знаци (има %(length)d)."
+
+#: newforms/fields.py:153 newforms/fields.py:182 newforms/fields.py:211
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Осигурајте се дека оваа вредност е помала или еднаква со %s."
+
+#: newforms/fields.py:154 newforms/fields.py:183 newforms/fields.py:212
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Осигурајте се дека оваа вредност е поголема или еднаква со %s."
+
+#: newforms/fields.py:181 newforms/fields.py:210
+msgid "Enter a number."
+msgstr "Внесете број."
+
+#: newforms/fields.py:213
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr "Осигурајте се дека нема вкупно повеќе од %s цифри."
+
+#: newforms/fields.py:214
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr "Осигурајте се дека нема повеќе од %s децимални места."
+
+#: newforms/fields.py:215
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr "Осигурајте се дека нема повеќе од %s цифри пред децималната запирка."
+
+#: newforms/fields.py:263 newforms/fields.py:750
+msgid "Enter a valid date."
+msgstr "Внесете правилен датум."
+
+#: newforms/fields.py:296 newforms/fields.py:751
+msgid "Enter a valid time."
+msgstr "Внесете правилно време."
+
+#: newforms/fields.py:335
+msgid "Enter a valid date/time."
+msgstr "Внесете правилен датум со време."
+
+#: newforms/fields.py:434
+msgid "No file was submitted."
+msgstr "Не беше пратена датотека."
+
+#: newforms/fields.py:435 oldforms/__init__.py:689
+msgid "The submitted file is empty."
+msgstr "Пратената датотека е празна."
+
+#: newforms/fields.py:497
+msgid "Enter a valid URL."
+msgstr "Внесете правилна адреса."
+
+#: newforms/fields.py:498
+msgid "This URL appears to be a broken link."
+msgstr "Оваа адреса изгледа дека не е достапна."
+
+#: newforms/fields.py:559 newforms/models.py:299
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Изберете правилно. Тоа не е едно од можните избори."
+
+#: newforms/fields.py:598
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "Внесете валиден избор. %(value)s не е еден од можните избори."
+
+#: newforms/fields.py:599 newforms/fields.py:661 newforms/models.py:365
+msgid "Enter a list of values."
+msgstr "Внесете листа на вредности."
+
+#: newforms/fields.py:779
+msgid "Enter a valid IPv4 address."
+msgstr "Внесeте правилна IPv4 адреса."
+
+#: newforms/models.py:366
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Внесете правилно. %s не е еден од достапните вредности."
+
+#: oldforms/__init__.py:409
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Осигурајте се дека вашиот текст има помалку од %s знак."
+msgstr[1] "Осигурајте се дека вашиот текст има помалку од %s знаци."
+
+#: oldforms/__init__.py:414
+msgid "Line breaks are not allowed here."
+msgstr "Тука не се дозволени прекини на линија."
+
+#: oldforms/__init__.py:512 oldforms/__init__.py:586 oldforms/__init__.py:625
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Изберете правилно, %(data)s' не е во %(choices)s."
+
+#: oldforms/__init__.py:745
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Внесете цел број помеѓу -32,768 и 32,767."
+
+#: oldforms/__init__.py:755
+msgid "Enter a positive number."
+msgstr "Внесете позитивен број."
+
+#: oldforms/__init__.py:765
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Внесете цел број помеѓу 0 и 32,767."
+
+#: template/defaultfilters.py:698
+msgid "yes,no,maybe"
+msgstr "да, не, можеби"
+
+#: template/defaultfilters.py:729
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d бајт"
+msgstr[1] "%(size)d бајти"
+
+#: template/defaultfilters.py:731
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f КБ"
+
+#: template/defaultfilters.py:733
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f МБ"
+
+#: template/defaultfilters.py:734
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f ГБ"
+
+#: utils/dateformat.py:41
+msgid "p.m."
+msgstr "попладне"
+
+#: utils/dateformat.py:42
+msgid "a.m."
+msgstr "наутро"
+
+#: utils/dateformat.py:47
+msgid "PM"
+msgstr "попладне"
+
+#: utils/dateformat.py:48
+msgid "AM"
+msgstr "наутро"
+
+#: utils/dateformat.py:97
+msgid "midnight"
+msgstr "полноќ"
+
+#: utils/dateformat.py:99
+msgid "noon"
+msgstr "пладне"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "понеделник"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "вторник"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "среда"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "четврток"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "петок"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "сабота"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "недела"
+
+#: utils/dates.py:10
+msgid "Mon"
+msgstr "пон"
+
+#: utils/dates.py:10
+msgid "Tue"
+msgstr "вто"
+
+#: utils/dates.py:10
+msgid "Wed"
+msgstr "сре"
+
+#: utils/dates.py:10
+msgid "Thu"
+msgstr "чет"
+
+#: utils/dates.py:10
+msgid "Fri"
+msgstr "пет"
+
+#: utils/dates.py:11
+msgid "Sat"
+msgstr "саб"
+
+#: utils/dates.py:11
+msgid "Sun"
+msgstr "нед"
+
+#: utils/dates.py:18
+msgid "January"
+msgstr "јануари"
+
+#: utils/dates.py:18
+msgid "February"
+msgstr "февруари"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "March"
+msgstr "март"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "April"
+msgstr "април"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "May"
+msgstr "мај"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "June"
+msgstr "јуни"
+
+#: utils/dates.py:19 utils/dates.py:31
+msgid "July"
+msgstr "јули"
+
+#: utils/dates.py:19
+msgid "August"
+msgstr "август"
+
+#: utils/dates.py:19
+msgid "September"
+msgstr "септември"
+
+#: utils/dates.py:19
+msgid "October"
+msgstr "октомври"
+
+#: utils/dates.py:19
+msgid "November"
+msgstr "ноември"
+
+#: utils/dates.py:20
+msgid "December"
+msgstr "декември"
+
+#: utils/dates.py:23
+msgid "jan"
+msgstr "јан"
+
+#: utils/dates.py:23
+msgid "feb"
+msgstr "фев"
+
+#: utils/dates.py:23
+msgid "mar"
+msgstr "мар"
+
+#: utils/dates.py:23
+msgid "apr"
+msgstr "апр"
+
+#: utils/dates.py:23
+msgid "may"
+msgstr "мај"
+
+#: utils/dates.py:23
+msgid "jun"
+msgstr "јун"
+
+#: utils/dates.py:24
+msgid "jul"
+msgstr "јул"
+
+#: utils/dates.py:24
+msgid "aug"
+msgstr "авг"
+
+#: utils/dates.py:24
+msgid "sep"
+msgstr "сеп"
+
+#: utils/dates.py:24
+msgid "oct"
+msgstr "окт"
+
+#: utils/dates.py:24
+msgid "nov"
+msgstr "ное"
+
+#: utils/dates.py:24
+msgid "dec"
+msgstr "дек"
+
+#: utils/dates.py:31
+msgid "Jan."
+msgstr "јан."
+
+#: utils/dates.py:31
+msgid "Feb."
+msgstr "фев."
+
+#: utils/dates.py:32
+msgid "Aug."
+msgstr "авг."
+
+#: utils/dates.py:32
+msgid "Sept."
+msgstr "сеп."
+
+#: utils/dates.py:32
+msgid "Oct."
+msgstr "окт."
+
+#: utils/dates.py:32
+msgid "Nov."
+msgstr "ное."
+
+#: utils/dates.py:32
+msgid "Dec."
+msgstr "дек."
+
+#: utils/text.py:127
+msgid "or"
+msgstr "или"
+
+#: utils/timesince.py:21
+msgid "year"
+msgid_plural "years"
+msgstr[0] "година"
+msgstr[1] "години"
+
+#: utils/timesince.py:22
+msgid "month"
+msgid_plural "months"
+msgstr[0] "месец"
+msgstr[1] "месеци"
+
+#: utils/timesince.py:23
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "седмица"
+msgstr[1] "седмици"
+
+#: utils/timesince.py:24
+msgid "day"
+msgid_plural "days"
+msgstr[0] "ден"
+msgstr[1] "дена"
+
+#: utils/timesince.py:25
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "час"
+msgstr[1] "часа"
+
+#: utils/timesince.py:26
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "минута"
+msgstr[1] "минути"
+
+#: utils/timesince.py:46
+msgid "minutes"
+msgstr "минути"
+
+#: utils/timesince.py:51
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr "%(number)d %(type)s"
+
+#: utils/timesince.py:57
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ", %(number)d %(type)s"
+
+#: utils/translation/trans_real.py:403
+msgid "DATE_FORMAT"
+msgstr "j M Y"
+
+#: utils/translation/trans_real.py:404
+msgid "DATETIME_FORMAT"
+msgstr "j M Y, P"
+
+#: utils/translation/trans_real.py:405
+msgid "TIME_FORMAT"
+msgstr "P"
+
+#: utils/translation/trans_real.py:421
+msgid "YEAR_MONTH_FORMAT"
+msgstr "F Y"
+
+#: utils/translation/trans_real.py:422
+msgid "MONTH_DAY_FORMAT"
+msgstr "F j"
+
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "%(verbose_name)s беше успешно создаден."
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "%(verbose_name)s беше успешно ажуриран."
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "%(verbose_name)s беше избришан."
+
diff --git a/webapp/django/conf/locale/mk/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/mk/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..200ddce
--- /dev/null
+++ b/webapp/django/conf/locale/mk/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/mk/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/mk/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..122a189
--- /dev/null
+++ b/webapp/django/conf/locale/mk/LC_MESSAGES/djangojs.po
@@ -0,0 +1,119 @@
+# translation of djangojs.po to Macedonian
+#
+# Georgi Stanojevski <glisha@gmail.com>, 2006, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-02-15 10:53+1100\n"
+"PO-Revision-Date: 2007-02-24 13:49+0100\n"
+"Last-Translator: Georgi Stanojevski <glisha@gmail.com>\n"
+"Language-Team: Macedonian <ossm-members@hedona.on.net.mk>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "Достапно %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Избери ги сите"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Додади"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Отстрани"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Избрано %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Означете го вашиот избор/и и кликнете"
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Исчисти ги сите"
+
+#: contrib/admin/media/js/dateparse.js:32
+#: contrib/admin/media/js/calendar.js:24
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Јануари Февруари Март Април Мај Јуни Јули Август Септември Октомври Ноември "
+"Декември"
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Недела Понеделник Вторник Среда Четврток Петок Сабота"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "Н П В С Ч П С"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Now"
+msgstr "Сега"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
+msgid "Clock"
+msgstr "Часовник"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
+msgid "Choose a time"
+msgstr "Избери време"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "Midnight"
+msgstr "Полноќ"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "6 a.m."
+msgstr "6 наутро"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
+msgid "Noon"
+msgstr "Пладне"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
+msgid "Cancel"
+msgstr "Откажи"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
+msgid "Today"
+msgstr "Денеска"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
+msgid "Calendar"
+msgstr "Календар"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
+msgid "Yesterday"
+msgstr "Вчера"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
+msgid "Tomorrow"
+msgstr "Утре"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr "Прикажи"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr "Скриј"
+
diff --git a/webapp/django/conf/locale/nl/LC_MESSAGES/django.mo b/webapp/django/conf/locale/nl/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..5f1f10c
--- /dev/null
+++ b/webapp/django/conf/locale/nl/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/nl/LC_MESSAGES/django.po b/webapp/django/conf/locale/nl/LC_MESSAGES/django.po
new file mode 100644
index 0000000..6d3d365
--- /dev/null
+++ b/webapp/django/conf/locale/nl/LC_MESSAGES/django.po
@@ -0,0 +1,4548 @@
+# Dutch translation for Django.
+# Copyright (C) 2008, Django Software Foundation
+# This file is distributed under the same license as the Django package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-08-14 19:46+0200\n"
+"PO-Revision-Date: 2008-07-31 23:08+0200\n"
+"Last-Translator: Rudolph Froger <rudolphfroger@estrate.nl>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: conf/global_settings.py:44
+msgid "Arabic"
+msgstr "Arabisch"
+
+#: conf/global_settings.py:45
+msgid "Bengali"
+msgstr "Bengaals"
+
+#: conf/global_settings.py:46
+msgid "Bulgarian"
+msgstr "Bulgaars"
+
+#: conf/global_settings.py:47
+msgid "Catalan"
+msgstr "Catalaans"
+
+#: conf/global_settings.py:48
+msgid "Czech"
+msgstr "Tjechisch"
+
+#: conf/global_settings.py:49
+msgid "Welsh"
+msgstr "Welsh"
+
+#: conf/global_settings.py:50
+msgid "Danish"
+msgstr "Deens"
+
+#: conf/global_settings.py:51
+msgid "German"
+msgstr "Duits"
+
+#: conf/global_settings.py:52
+msgid "Greek"
+msgstr "Grieks"
+
+#: conf/global_settings.py:53
+msgid "English"
+msgstr "Engels"
+
+#: conf/global_settings.py:54
+msgid "Spanish"
+msgstr "Spaans"
+
+#: conf/global_settings.py:55
+msgid "Estonian"
+msgstr "Ests"
+
+#: conf/global_settings.py:56
+msgid "Argentinean Spanish"
+msgstr "Argentijns Spaans"
+
+#: conf/global_settings.py:57
+msgid "Basque"
+msgstr "Baskisch"
+
+#: conf/global_settings.py:58
+msgid "Persian"
+msgstr "Perzisch"
+
+#: conf/global_settings.py:59
+msgid "Finnish"
+msgstr "Fins"
+
+#: conf/global_settings.py:60
+msgid "French"
+msgstr "Frans"
+
+#: conf/global_settings.py:61
+msgid "Irish"
+msgstr "Iers"
+
+#: conf/global_settings.py:62
+msgid "Galician"
+msgstr "Galicisch"
+
+#: conf/global_settings.py:63
+msgid "Hungarian"
+msgstr "Hongaars"
+
+#: conf/global_settings.py:64
+msgid "Hebrew"
+msgstr "Hebreews"
+
+#: conf/global_settings.py:65
+msgid "Croatian"
+msgstr "Kroatisch"
+
+#: conf/global_settings.py:66
+msgid "Icelandic"
+msgstr "IJslands"
+
+#: conf/global_settings.py:67
+msgid "Italian"
+msgstr "Italiaans"
+
+#: conf/global_settings.py:68
+msgid "Japanese"
+msgstr "Japans"
+
+#: conf/global_settings.py:69
+msgid "Georgian"
+msgstr "Georgisch"
+
+#: conf/global_settings.py:70
+msgid "Korean"
+msgstr "Koreaans"
+
+#: conf/global_settings.py:71
+msgid "Khmer"
+msgstr "Khmer"
+
+#: conf/global_settings.py:72
+msgid "Kannada"
+msgstr "Kannada"
+
+#: conf/global_settings.py:73
+msgid "Latvian"
+msgstr "Lets"
+
+#: conf/global_settings.py:74
+msgid "Lithuanian"
+msgstr "Litouws"
+
+#: conf/global_settings.py:75
+msgid "Macedonian"
+msgstr "Macedonisch"
+
+#: conf/global_settings.py:76
+msgid "Dutch"
+msgstr "Nederlands"
+
+#: conf/global_settings.py:77
+msgid "Norwegian"
+msgstr "Noors"
+
+#: conf/global_settings.py:78
+msgid "Polish"
+msgstr "Pools"
+
+#: conf/global_settings.py:79
+msgid "Portugese"
+msgstr "Portugees"
+
+#: conf/global_settings.py:80
+msgid "Brazilian Portuguese"
+msgstr "Braziliaans Portugees"
+
+#: conf/global_settings.py:81
+msgid "Romanian"
+msgstr "Roemeens"
+
+#: conf/global_settings.py:82
+msgid "Russian"
+msgstr "Russisch"
+
+#: conf/global_settings.py:83
+msgid "Slovak"
+msgstr "Slovaaks"
+
+#: conf/global_settings.py:84
+msgid "Slovenian"
+msgstr "Sloveens"
+
+#: conf/global_settings.py:85
+msgid "Serbian"
+msgstr "Servisch"
+
+#: conf/global_settings.py:86
+msgid "Swedish"
+msgstr "Zweeds"
+
+#: conf/global_settings.py:87
+msgid "Tamil"
+msgstr "Tamil"
+
+#: conf/global_settings.py:88
+msgid "Telugu"
+msgstr "Telegu"
+
+#: conf/global_settings.py:89
+msgid "Turkish"
+msgstr "Turks"
+
+#: conf/global_settings.py:90
+msgid "Ukrainian"
+msgstr "Oekraïens"
+
+#: conf/global_settings.py:91
+msgid "Simplified Chinese"
+msgstr "Vereenvoudigd Chinees"
+
+#: conf/global_settings.py:92
+msgid "Traditional Chinese"
+msgstr "Traditioneel Chinees"
+
+#: contrib/admin/filterspecs.py:44
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Door %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:74 contrib/admin/filterspecs.py:92
+#: contrib/admin/filterspecs.py:147 contrib/admin/filterspecs.py:173
+msgid "All"
+msgstr "Alle"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Any date"
+msgstr "Elke datum"
+
+#: contrib/admin/filterspecs.py:114
+msgid "Today"
+msgstr "Vandaag"
+
+#: contrib/admin/filterspecs.py:117
+msgid "Past 7 days"
+msgstr "Laatste 7 dagen"
+
+#: contrib/admin/filterspecs.py:119
+msgid "This month"
+msgstr "Deze maand"
+
+#: contrib/admin/filterspecs.py:121
+msgid "This year"
+msgstr "Dit jaar"
+
+#: contrib/admin/filterspecs.py:147 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "Yes"
+msgstr "Ja"
+
+#: contrib/admin/filterspecs.py:147 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "No"
+msgstr "Nee"
+
+#: contrib/admin/filterspecs.py:154 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "Unknown"
+msgstr "Onbekend"
+
+#: contrib/admin/models.py:19
+msgid "action time"
+msgstr "actietijd"
+
+#: contrib/admin/models.py:22
+msgid "object id"
+msgstr "object-id"
+
+#: contrib/admin/models.py:23
+msgid "object repr"
+msgstr "object-repr"
+
+#: contrib/admin/models.py:24
+msgid "action flag"
+msgstr "actievlag"
+
+#: contrib/admin/models.py:25
+msgid "change message"
+msgstr "wijzig bericht"
+
+#: contrib/admin/models.py:28
+msgid "log entry"
+msgstr "logregistratie"
+
+#: contrib/admin/models.py:29
+msgid "log entries"
+msgstr "logregistraties"
+
+#: contrib/admin/options.py:143 contrib/admin/options.py:202
+msgid "None"
+msgstr "Geen"
+
+#: contrib/admin/options.py:407
+#, python-format
+msgid "Changed %s."
+msgstr "%s gewijzigd."
+
+#: contrib/admin/options.py:407 contrib/admin/options.py:417
+#: core/validators.py:279 db/models/manipulators.py:305
+msgid "and"
+msgstr "en"
+
+#: contrib/admin/options.py:412
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" toegevoegd."
+
+#: contrib/admin/options.py:416
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "%(list)s aangepast voor %(name)s \"%(object)s\"."
+
+#: contrib/admin/options.py:421
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "%(name)s \"%(object)s\" verwijderd."
+
+#: contrib/admin/options.py:425
+msgid "No fields changed."
+msgstr "Geen velden gewijzigd."
+
+#: contrib/admin/options.py:486 contrib/auth/admin.py:50
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "De %(name)s \"%(obj)s\" is toegevoegd."
+
+#: contrib/admin/options.py:490 contrib/admin/options.py:523
+#: contrib/auth/admin.py:55
+msgid "You may edit it again below."
+msgstr "U kunt dit hieronder weer bewerken."
+
+#: contrib/admin/options.py:500 contrib/admin/options.py:533
+#, python-format
+msgid "You may add another %s below."
+msgstr "U kunt hieronder de volgende %s toevoegen."
+
+#: contrib/admin/options.py:521
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Het wijzigen van %(name)s \"%(obj)s\" is geslaagd."
+
+#: contrib/admin/options.py:529
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "De %(name)s \"%(obj)s\" was toegevoegd. U kunt het hieronder wijzigen."
+
+#: contrib/admin/options.py:595
+#, python-format
+msgid "Add %s"
+msgstr "Toevoegen %s"
+
+#: contrib/admin/options.py:672
+#, python-format
+msgid "Change %s"
+msgstr "Wijzig %s"
+
+#: contrib/admin/options.py:703
+msgid "Database error"
+msgstr "Databasefout"
+
+#: contrib/admin/options.py:752
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "De verwijdering van %(name)s \"%(obj)s\" is geslaagd."
+
+#: contrib/admin/options.py:759
+msgid "Are you sure?"
+msgstr "Weet u het zeker?"
+
+#: contrib/admin/options.py:786
+#, python-format
+msgid "Change history: %s"
+msgstr "Wijzigingsgeschiedenis: %s"
+
+#: contrib/admin/sites.py:18 contrib/admin/views/decorators.py:16
+#: contrib/auth/forms.py:72 contrib/comments/views/comments.py:56
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Voer een correcte gebruikersnaam en wachtwoord in. Let op, de velden zijn "
+"hoofdletter-gevoelig."
+
+#: contrib/admin/sites.py:238 contrib/admin/views/decorators.py:68
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Uw sessie is verlopen, meld u opnieuw aan. Maakt u zich geen zorgen: Uw "
+"bijdrage is opgeslagen."
+
+#: contrib/admin/sites.py:245 contrib/admin/views/decorators.py:75
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Het lijkt erop dat uw browser geen cookies accepteert. Zet het gebruik van "
+"cookies aan in uw browser, laad deze pagina nogmaals en probeer het opnieuw."
+
+#: contrib/admin/sites.py:259 contrib/admin/sites.py:265
+#: contrib/admin/views/decorators.py:92
+msgid "Usernames cannot contain the '@' character."
+msgstr "Gebruikersnamen mogen geen '@' teken bevatten."
+
+#: contrib/admin/sites.py:262 contrib/admin/views/decorators.py:88
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "Uw e-mailadres is niet uw gebruikersnaam. Probeer '%s' eens."
+
+#: contrib/admin/sites.py:330
+msgid "Site administration"
+msgstr "Sitebeheer"
+
+#: contrib/admin/sites.py:352 contrib/admin/templates/admin/login.html:27
+#: contrib/admin/templates/registration/password_reset_complete.html:14
+#: contrib/admin/views/decorators.py:30
+msgid "Log in"
+msgstr "Inloggen"
+
+#: contrib/admin/util.py:126
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Eén of meer %(fieldname)s in %(name)s: %(obj)s"
+
+#: contrib/admin/util.py:131
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Eén of meer %(fieldname)s in %(name)s:"
+
+#: contrib/admin/widgets.py:65
+msgid "Date:"
+msgstr "Datum:"
+
+#: contrib/admin/widgets.py:65
+msgid "Time:"
+msgstr "Tijd:"
+
+#: contrib/admin/widgets.py:89
+msgid "Currently:"
+msgstr "Huidige:"
+
+#: contrib/admin/widgets.py:89
+msgid "Change:"
+msgstr "Wijziging:"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Pagina niet gevonden"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Onze excuses, maar de gevraagde pagina bestaat niet."
+
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/change_form.html:17
+#: contrib/admin/templates/admin/change_list.html:8
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/auth/user/change_password.html:10
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_reset_complete.html:4
+#: contrib/admin/templates/registration/password_reset_confirm.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Voorpagina"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Serverfout"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Serverfout (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Serverfout <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Er is een fout opgetreden. Dit is inmiddels doorgegeven aan de sitebeheerder "
+"via e-mail en zal spoedig worden gerepareerd. Bedankt voor uw geduld."
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "Welkom,"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Documentatie"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:13
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+msgid "Change password"
+msgstr "Wachtwoord wijzigen"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/comments/templates/comments/form.html:6
+msgid "Log out"
+msgstr "Afmelden"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django sitebeheer"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Djangobeheer"
+
+#: contrib/admin/templates/admin/change_form.html:19
+#: contrib/admin/templates/admin/index.html:29
+msgid "Add"
+msgstr "Toevoegen"
+
+#: contrib/admin/templates/admin/change_form.html:26
+#: contrib/admin/templates/admin/object_history.html:5
+msgid "History"
+msgstr "Geschiedenis"
+
+#: contrib/admin/templates/admin/change_form.html:27
+msgid "View on site"
+msgstr "Toon op site"
+
+#: contrib/admin/templates/admin/change_form.html:37
+#: contrib/admin/templates/admin/auth/user/change_password.html:22
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Herstel de fout hieronder."
+msgstr[1] "Herstel de fouten hieronder."
+
+#: contrib/admin/templates/admin/change_list.html:16
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s toevoegen"
+
+#: contrib/admin/templates/admin/change_list.html:26
+msgid "Filter"
+msgstr "Filter"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+#: contrib/admin/templates/admin/edit_inline/tabular.html:15
+msgid "Delete"
+msgstr "Verwijderen"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:15
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Het verwijderen van %(object_name)s '%(escaped_object)s' zal ook "
+"gerelateerde objecten verwijderen. Echter u heeft geen rechten om de "
+"volgende typen objecten te verwijderen:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:22
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Weet u zeker dat u %(object_name)s \"%(escaped_object)s\" wilt verwijderen? "
+"Alle volgende objecten worden verwijderd:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:27
+msgid "Yes, I'm sure"
+msgstr "Ja, ik weet het zeker"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Op %(filter_title)s "
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Beschikbare modellen in de %(name)s toepassing."
+
+#: contrib/admin/templates/admin/index.html:19
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:35
+msgid "Change"
+msgstr "Wijzigen"
+
+#: contrib/admin/templates/admin/index.html:45
+msgid "You don't have permission to edit anything."
+msgstr "U heeft geen rechten om iets te wijzigen."
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "Recent Actions"
+msgstr "Recente acties"
+
+#: contrib/admin/templates/admin/index.html:54
+msgid "My Actions"
+msgstr "Mijn acties"
+
+#: contrib/admin/templates/admin/index.html:58
+msgid "None available"
+msgstr "Geen beschikbaar"
+
+#: contrib/admin/templates/admin/invalid_setup.html:7
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Er is iets mis met de database. Verzeker u ervan dat de benodigde tabellen "
+"zijn aangemaakt en dat de database toegankelijk is voor de juiste gebruiker."
+
+#: contrib/admin/templates/admin/login.html:19
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+msgid "Username:"
+msgstr "Gebruikersnaam:"
+
+#: contrib/admin/templates/admin/login.html:22
+#: contrib/comments/templates/comments/form.html:8
+msgid "Password:"
+msgstr "Wachtwoord:"
+
+#: contrib/admin/templates/admin/object_history.html:16
+msgid "Date/time"
+msgstr "Datum/tijd"
+
+#: contrib/admin/templates/admin/object_history.html:17
+msgid "User"
+msgstr "Gebruiker"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Action"
+msgstr "Actie"
+
+#: contrib/admin/templates/admin/object_history.html:24
+msgid "DATE_WITH_TIME_FULL"
+msgstr "d-n-Y H:i:s"
+
+#: contrib/admin/templates/admin/object_history.html:32
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Dit object heeft geen wijzigingsgeschiedenis. Het is mogelijk niet via de "
+"beheersite toegevoegd."
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Alles tonen"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Zoek"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 resultaat"
+msgstr[1] "%(counter)s resultaten"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s totaal"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Opslaan als nieuw item"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Opslaan en nieuw item"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Opslaan en opnieuw bewerken"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Opslaan"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Vul allereerst een gebruikersnaam en wachtwoord in. Vervolgens kunt u de "
+"andere opties instellen."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:13
+#: contrib/auth/forms.py:14 contrib/auth/forms.py:51
+msgid "Username"
+msgstr "Gebruikersnaam"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:20
+#: contrib/admin/templates/admin/auth/user/change_password.html:33
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:52 contrib/auth/forms.py:176
+msgid "Password"
+msgstr "Wachtwoord"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:26
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+#: contrib/auth/forms.py:177
+msgid "Password (again)"
+msgstr "Wachtwoord (nogmaals)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:27
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+msgid "Enter the same password as above, for verification."
+msgstr "Vul hetzelfde wachtwoord als hierboven in, ter bevestiging."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:26
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Geef een nieuw passwoord voor gebruiker <strong>%(username)s</strong>."
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Bedankt voor de aanwezigheid op de site vandaag."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Log opnieuw in"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Wachtwoordwijziging"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Wachtwoord wijzigen is geslaagd"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Uw wachtwoord is gewijzigd."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Vanwege de beveiliging moet u uw oude en twee keer een nieuw wachtwoord "
+"invoeren, zodat we kunnen controleren of er geen typefouten zijn gemaakt."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Oud wachtwoord:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+#: contrib/admin/templates/registration/password_reset_confirm.html:18
+msgid "New password:"
+msgstr "Nieuw wachtwoord:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+#: contrib/admin/templates/registration/password_reset_confirm.html:20
+msgid "Confirm password:"
+msgstr "Bevestig wachtwoord:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+#: contrib/admin/templates/registration/password_reset_confirm.html:21
+msgid "Change my password"
+msgstr "Wijzig mijn wachtwoord"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:4
+#: contrib/admin/templates/registration/password_reset_confirm.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+msgid "Password reset"
+msgstr "Wachtwoord hersteld"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:6
+#: contrib/admin/templates/registration/password_reset_complete.html:10
+msgid "Password reset complete"
+msgstr "Wachtwoord herstellen volooid"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:12
+msgid "Your password has been set.  You may go ahead and log in now."
+msgstr "Uw wachtwoord is ingesteld. U kunt nu verder gaan en inloggen."
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:4
+msgid "Password reset confirmation"
+msgstr "Bevestiging wachtwoord herstellen"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:12
+msgid "Enter new password"
+msgstr "Voer nieuw wachtwoord in"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:14
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Voer het nieuwe wachtwoord twee keer in, zodat we kunnen controleren of er "
+"geen typefouten zijn gemaakt."
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:26
+msgid "Password reset unsuccessful"
+msgstr "Wachtwoord herstel geslaagd"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:28
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used.  Please request a new password reset."
+msgstr ""
+"De link voor het herstellen van het wachtwoord is ongeldig, misschien omdat "
+"de link al eens is gebruikt. Vraag opnieuw het wachtwoord herstellenaan."
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Wachtwoord herstel geslaagd"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed you instructions for setting your password to the e-mail "
+"address you submitted. You should be receiving it shortly."
+msgstr ""
+"We hebben u de instructies voor het instellen van een nieuw wachtwoord per e-"
+"mail gestuurd. U zou dit spoedig moeten ontvangen."
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "U krijgt deze e-mail omdat u om een nieuw wachtwoord heeft gevraagd"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "voor uw gebruikersaccount op %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+msgid "Please go to the following page and choose a new password:"
+msgstr "Gaat u naar de volgende pagina en kies een nieuw wachtwoord:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:9
+msgid "Your username, in case you've forgotten:"
+msgstr "Uw gebruikersnaam, mocht u deze vergeten zijn:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Thanks for using our site!"
+msgstr "Bedankt voor het gebruik van onze site!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Het %(site_name)s team"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll e-mail "
+"instructions for setting a new one."
+msgstr ""
+"Uw wachtwoord vergeten? Geef uw e-mailadres op en we sturen u per e-mail de "
+"instructies voor het instellen van een nieuw wachtwoord."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "E-mailadres:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Herstel mijn wachtwoord"
+
+#: contrib/admin/templatetags/admin_list.py:284
+msgid "All dates"
+msgstr "Alle data"
+
+#: contrib/admin/views/main.py:65
+#, python-format
+msgid "Select %s"
+msgstr "Selecteer %s"
+
+#: contrib/admin/views/main.py:65
+#, python-format
+msgid "Select %s to change"
+msgstr "Selecteer %s om te wijzigen"
+
+#: contrib/admin/views/template.py:36 contrib/sites/models.py:38
+msgid "site"
+msgstr "site"
+
+#: contrib/admin/views/template.py:38
+msgid "template"
+msgstr "sjabloon"
+
+#: contrib/admindocs/views.py:53 contrib/admindocs/views.py:55
+#: contrib/admindocs/views.py:57
+msgid "tag:"
+msgstr "tag:"
+
+#: contrib/admindocs/views.py:87 contrib/admindocs/views.py:89
+#: contrib/admindocs/views.py:91
+msgid "filter:"
+msgstr "filter:"
+
+#: contrib/admindocs/views.py:153 contrib/admindocs/views.py:155
+#: contrib/admindocs/views.py:157
+msgid "view:"
+msgstr "view:"
+
+#: contrib/admindocs/views.py:187
+#, python-format
+msgid "App %r not found"
+msgstr "Toepassing %r niet gevonden"
+
+#: contrib/admindocs/views.py:194
+#, python-format
+msgid "Model %(model_name)r not found in app %(app_label)r"
+msgstr "Model %(model_name)r niet gevonden in toepassing %(app_label)r"
+
+#: contrib/admindocs/views.py:206
+#, python-format
+msgid "the related `%(app_label)s.%(data_type)s` object"
+msgstr "het gerelateerde `%(app_label)s.%(data_type)s` object"
+
+#: contrib/admindocs/views.py:206 contrib/admindocs/views.py:228
+#: contrib/admindocs/views.py:242 contrib/admindocs/views.py:247
+msgid "model:"
+msgstr "model:"
+
+#: contrib/admindocs/views.py:237
+#, python-format
+msgid "related `%(app_label)s.%(object_name)s` objects"
+msgstr "gerelateerde `%(app_label)s.%(object_name)s` objecten"
+
+#: contrib/admindocs/views.py:242
+#, python-format
+msgid "all %s"
+msgstr "alle %s"
+
+#: contrib/admindocs/views.py:247
+#, python-format
+msgid "number of %s"
+msgstr "aantal %s"
+
+#: contrib/admindocs/views.py:253
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Velden van %s objecten"
+
+#: contrib/admindocs/views.py:317 contrib/admindocs/views.py:328
+#: contrib/admindocs/views.py:330 contrib/admindocs/views.py:336
+#: contrib/admindocs/views.py:337 contrib/admindocs/views.py:339
+msgid "Integer"
+msgstr "Geheel getal"
+
+#: contrib/admindocs/views.py:318
+msgid "Boolean (Either True or False)"
+msgstr "Boolean (True danwel False)"
+
+#: contrib/admindocs/views.py:319 contrib/admindocs/views.py:338
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Karakterreeks (hooguit %(max_length)s)"
+
+#: contrib/admindocs/views.py:320
+msgid "Comma-separated integers"
+msgstr "Komma-gescheiden gehele getallen"
+
+#: contrib/admindocs/views.py:321
+msgid "Date (without time)"
+msgstr "Datum (zonder tijd)"
+
+#: contrib/admindocs/views.py:322
+msgid "Date (with time)"
+msgstr "Datum (met tijd)"
+
+#: contrib/admindocs/views.py:323
+msgid "Decimal number"
+msgstr "Decimaal getal"
+
+#: contrib/admindocs/views.py:324
+msgid "E-mail address"
+msgstr "E-mailadres"
+
+#: contrib/admindocs/views.py:325 contrib/admindocs/views.py:326
+#: contrib/admindocs/views.py:329
+msgid "File path"
+msgstr "Bestandspad"
+
+#: contrib/admindocs/views.py:327
+msgid "Floating point number"
+msgstr "Decimaal getal"
+
+#: contrib/admindocs/views.py:331 contrib/comments/models.py:89
+msgid "IP address"
+msgstr "IP-adres"
+
+#: contrib/admindocs/views.py:333
+msgid "Boolean (Either True, False or None)"
+msgstr "Boolean (True, False of None)"
+
+#: contrib/admindocs/views.py:334
+msgid "Relation to parent model"
+msgstr "Relatie tot oudermodel"
+
+#: contrib/admindocs/views.py:335
+msgid "Phone number"
+msgstr "Telefoonnummer"
+
+#: contrib/admindocs/views.py:340
+msgid "Text"
+msgstr "Tekst"
+
+#: contrib/admindocs/views.py:341
+msgid "Time"
+msgstr "Tijd"
+
+#: contrib/admindocs/views.py:342 contrib/flatpages/admin.py:8
+#: contrib/flatpages/models.py:8
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admindocs/views.py:343
+msgid "U.S. state (two uppercase letters)"
+msgstr "Staat van de VS (twee hoofdletters)"
+
+#: contrib/admindocs/views.py:344
+msgid "XML text"
+msgstr "XML-tekst"
+
+#: contrib/admindocs/views.py:370
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s lijkt geen urlpattern-object te zijn"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Bookmarklets"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:4
+msgid "Documentation bookmarklets"
+msgstr "Documentatie bookmarklets"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:8
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">Om bookmarklets te installeren, sleep de link naar uw "
+"bladwijzers\n"
+"werkbalk, of rechtermuis klik op de link en voeg het toe aan de bladwijzer. "
+"Nu kan\n"
+"de bookmarklet vanuit elke pagina op de site worden gekozen. Let erop dat "
+"het soms\n"
+"noodzakelijk is dat de computer van waaruit de pagina wordt bekeken intern "
+"is.\n"
+"(Raadpleeg uw systeembeheerder of uw computer zich op het interne netwerk "
+"bevind).<p>\n"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:18
+msgid "Documentation for this page"
+msgstr "Documentatie voor deze pagina"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:19
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+"Springt vanuit elke pagina naar de documentatie voor de view die gegenereerd "
+"wordt door die pagina"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:21
+msgid "Show object ID"
+msgstr "Toon object-ID"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:22
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Toont het content-type en unieke ID voor pagina's die een enkel object "
+"voorstellen."
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:24
+msgid "Edit this object (current window)"
+msgstr "Bewerk dit object (huidig venster)"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:25
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+"Gaat naar de beheerpagina voor pagina's die een enkel object weergeven."
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:27
+msgid "Edit this object (new window)"
+msgstr "Bewerk dit object (nieuwe pagina)"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:28
+msgid "As above, but opens the admin page in a new window."
+msgstr "Zoals hierboven, maar opent de beheerpagina in een nieuw venster."
+
+#: contrib/auth/admin.py:21
+msgid "Personal info"
+msgstr "Persoonlijke informatie"
+
+#: contrib/auth/admin.py:22
+msgid "Permissions"
+msgstr "Rechten"
+
+#: contrib/auth/admin.py:23
+msgid "Important dates"
+msgstr "Belangrijke datums"
+
+#: contrib/auth/admin.py:24
+msgid "Groups"
+msgstr "Groepen"
+
+#: contrib/auth/admin.py:60
+msgid "Add user"
+msgstr "Gebruiker toevoegen"
+
+#: contrib/auth/admin.py:85
+msgid "Password changed successfully."
+msgstr "Wachtwoord wijzigen is geslaagd"
+
+#: contrib/auth/admin.py:91
+#, python-format
+msgid "Change password: %s"
+msgstr "Wijzig wachtwoord: %s"
+
+#: contrib/auth/forms.py:15 contrib/auth/models.py:137
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr ""
+"Verplicht. 30 tekens of minder. Alleen alfanumerieke tekens (letters, "
+"cijfers en liggende strepen)."
+
+#: contrib/auth/forms.py:16 core/validators.py:72
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Deze waarde mag alleen letters, getallen en liggende strepen bevatten."
+
+#: contrib/auth/forms.py:18
+msgid "Password confirmation"
+msgstr "Bevestiging wachtwoord"
+
+#: contrib/auth/forms.py:30
+msgid "A user with that username already exists."
+msgstr "Een gebruiker met deze gebruikersnaam bestaat al."
+
+#: contrib/auth/forms.py:36 contrib/auth/forms.py:146
+#: contrib/auth/forms.py:188
+msgid "The two password fields didn't match."
+msgstr "De twee ingevulde wachtwoorden zijn niet gelijk."
+
+#: contrib/auth/forms.py:74 contrib/comments/views/comments.py:58
+msgid "This account is inactive."
+msgstr "Dit account is inactief."
+
+#: contrib/auth/forms.py:79 contrib/comments/views/comments.py:49
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"Het lijkt erop dat uw browser geen cookies accepteert. Om in te loggen "
+"moeten cookies worden geaccepteerd."
+
+#: contrib/auth/forms.py:92
+msgid "E-mail"
+msgstr "E-mail"
+
+#: contrib/auth/forms.py:101
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr ""
+"Dat e-mailadres heeft geen gerelateerd gebruikersaccount. Weet u zeker dat u "
+"zich heeft geregistreerd?"
+
+#: contrib/auth/forms.py:126
+#, python-format
+msgid "Password reset on %s"
+msgstr "Wachtwoord hersteld op %s"
+
+#: contrib/auth/forms.py:134
+msgid "New password"
+msgstr "Nieuw wachtwoord"
+
+#: contrib/auth/forms.py:135
+msgid "New password confirmation"
+msgstr "Nieuw wachtwoord bevestigen"
+
+#: contrib/auth/forms.py:160
+msgid "Old password"
+msgstr "Oud wachtwoord"
+
+#: contrib/auth/forms.py:168
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr ""
+"Uw oude wachtwoord is niet correct ingevoerd. Voert u het alstublieft "
+"opnieuw in."
+
+#: contrib/auth/models.py:73 contrib/auth/models.py:96
+msgid "name"
+msgstr "naam"
+
+#: contrib/auth/models.py:75
+msgid "codename"
+msgstr "codenaam"
+
+#: contrib/auth/models.py:78
+msgid "permission"
+msgstr "recht"
+
+#: contrib/auth/models.py:79 contrib/auth/models.py:97
+msgid "permissions"
+msgstr "rechten"
+
+#: contrib/auth/models.py:100
+msgid "group"
+msgstr "groep"
+
+#: contrib/auth/models.py:101 contrib/auth/models.py:147
+msgid "groups"
+msgstr "groepen"
+
+#: contrib/auth/models.py:137
+msgid "username"
+msgstr "gebruikersnaam"
+
+#: contrib/auth/models.py:138
+msgid "first name"
+msgstr "voornaam"
+
+#: contrib/auth/models.py:139
+msgid "last name"
+msgstr "achternaam"
+
+#: contrib/auth/models.py:140
+msgid "e-mail address"
+msgstr "e-mailadres"
+
+#: contrib/auth/models.py:141
+msgid "password"
+msgstr "wachtwoord"
+
+#: contrib/auth/models.py:141
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"Gebruik '[algo]$[salt]$[hexdigest]' of gebruik het<a href=\"password/"
+"\">wachtwoord wijzigen formulier</a>."
+
+#: contrib/auth/models.py:142
+msgid "staff status"
+msgstr "stafstatus"
+
+#: contrib/auth/models.py:142
+msgid "Designates whether the user can log into this admin site."
+msgstr "Bepaalt of de gebruiker kan inloggen op deze beheersite."
+
+#: contrib/auth/models.py:143
+msgid "active"
+msgstr "actief"
+
+#: contrib/auth/models.py:143
+msgid ""
+"Designates whether this user should be treated as active. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"Bepaalt of deze gebruiker als actief dient te worden behandeld. U kunt dit "
+"uitvinken in plaats van een gebruiker te verwijderen."
+
+#: contrib/auth/models.py:144
+msgid "superuser status"
+msgstr "supergebruikerstatus"
+
+#: contrib/auth/models.py:144
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr ""
+"Bepaalt dat deze gebruiker alle rechten heeft, zonder deze expliciet toe te "
+"wijzen."
+
+#: contrib/auth/models.py:145
+msgid "last login"
+msgstr "laatste inlog"
+
+#: contrib/auth/models.py:146
+msgid "date joined"
+msgstr "datum toegetreden"
+
+#: contrib/auth/models.py:148
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"Bovenop de rechten welke handmatig zijn toegekend, krijgt deze gebruiker ook "
+"alle rechten van de groepen waar hij of zij deel van uitmaakt."
+
+#: contrib/auth/models.py:149
+msgid "user permissions"
+msgstr "gebruikersrechten"
+
+#: contrib/auth/models.py:153
+msgid "user"
+msgstr "gebruiker"
+
+#: contrib/auth/models.py:154
+msgid "users"
+msgstr "gebruikers"
+
+#: contrib/auth/models.py:309
+msgid "message"
+msgstr "bericht"
+
+#: contrib/auth/views.py:50
+msgid "Logged out"
+msgstr "Afmelden"
+
+#: contrib/comments/models.py:71 contrib/comments/models.py:164
+msgid "object ID"
+msgstr "object-ID"
+
+#: contrib/comments/models.py:72
+msgid "headline"
+msgstr "kop"
+
+#: contrib/comments/models.py:73 contrib/comments/models.py:95
+#: contrib/comments/models.py:165
+msgid "comment"
+msgstr "opmerking"
+
+#: contrib/comments/models.py:74
+msgid "rating #1"
+msgstr "waardering #1"
+
+#: contrib/comments/models.py:75
+msgid "rating #2"
+msgstr "waardering #2"
+
+#: contrib/comments/models.py:76
+msgid "rating #3"
+msgstr "waardering #3"
+
+#: contrib/comments/models.py:77
+msgid "rating #4"
+msgstr "waardering #4"
+
+#: contrib/comments/models.py:78
+msgid "rating #5"
+msgstr "waardering #5"
+
+#: contrib/comments/models.py:79
+msgid "rating #6"
+msgstr "waardering #6"
+
+#: contrib/comments/models.py:80
+msgid "rating #7"
+msgstr "waardering #7"
+
+#: contrib/comments/models.py:81
+msgid "rating #8"
+msgstr "waardering #8"
+
+#: contrib/comments/models.py:86
+msgid "is valid rating"
+msgstr "is een geldige waardering"
+
+#: contrib/comments/models.py:87 contrib/comments/models.py:167
+msgid "date/time submitted"
+msgstr "datum/tijd toegevoegd"
+
+#: contrib/comments/models.py:88 contrib/comments/models.py:168
+msgid "is public"
+msgstr "is openbaar"
+
+#: contrib/comments/models.py:90
+msgid "is removed"
+msgstr "is verwijderd"
+
+#: contrib/comments/models.py:90
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Kruis dit vak aan indien de opmerking niet gepast is. Een \"Dit commentaar "
+"is verwijderd\" bericht wordt dan getoond"
+
+#: contrib/comments/models.py:96
+msgid "comments"
+msgstr "opmerkingen"
+
+#: contrib/comments/models.py:128 contrib/comments/models.py:199
+msgid "Content object"
+msgstr "Inhoud-object"
+
+#: contrib/comments/models.py:156
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Geplaatst door %(user)s op %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:166
+msgid "person's name"
+msgstr "naam van persoon"
+
+#: contrib/comments/models.py:169
+msgid "ip address"
+msgstr "ip-adres"
+
+#: contrib/comments/models.py:171
+msgid "approved by staff"
+msgstr "goedgekeurd door de staf"
+
+#: contrib/comments/models.py:175
+msgid "free comment"
+msgstr "vrije opmerking"
+
+#: contrib/comments/models.py:176
+msgid "free comments"
+msgstr "vrije opmerkingen"
+
+#: contrib/comments/models.py:227
+msgid "score"
+msgstr "score"
+
+#: contrib/comments/models.py:228
+msgid "score date"
+msgstr "scoredatum"
+
+#: contrib/comments/models.py:232
+msgid "karma score"
+msgstr "karmascore"
+
+#: contrib/comments/models.py:233
+msgid "karma scores"
+msgstr "karmascores"
+
+#: contrib/comments/models.py:237
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d waardering door %(user)s"
+
+#: contrib/comments/models.py:254
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Deze opmerking is gemarkeerd door %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:262
+msgid "flag date"
+msgstr "markeerdatum"
+
+#: contrib/comments/models.py:266
+msgid "user flag"
+msgstr "gebruikersmarkering"
+
+#: contrib/comments/models.py:267
+msgid "user flags"
+msgstr "gebruikersmarkeringen"
+
+#: contrib/comments/models.py:271
+#, python-format
+msgid "Flag by %r"
+msgstr "Gemarkeerd door %r"
+
+#: contrib/comments/models.py:277
+msgid "deletion date"
+msgstr "verwijderingsdatum"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "verwijderd door moderator"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "verwijderd door moderator"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Verwijderd door moderator %r"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Uw wachtwoord vergeten?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Waarderingen"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Verplicht"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Optioneel"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Plaats een foto"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Opmerking:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Conceptopmerking"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Uw gebruikersnaam:"
+
+#: contrib/comments/views/comments.py:76
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr ""
+"Deze waardering is verplicht omdat u tenminste één andere waardering hebt "
+"ingevoerd."
+
+#: contrib/comments/views/comments.py:160
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Deze opmerking is gepost door een gebruiker die minder dan %(count)s "
+"opmerking heeft gepost:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Deze opmerking is gepost door een gebruiker die minder dan %(count)s "
+"opmerkingen heeft gepost:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:165
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Deze opmerking is gepost door een twijfelachtige gebruiker:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:238
+#: contrib/comments/views/comments.py:331
+msgid "Only POSTs are allowed"
+msgstr "Alleen POSTs zijn toegestaan"
+
+#: contrib/comments/views/comments.py:242
+#: contrib/comments/views/comments.py:335
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Eén of meerdere verplichte velden zijn niet ingevuld"
+
+#: contrib/comments/views/comments.py:246
+#: contrib/comments/views/comments.py:337
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Iemand heeft het opmerkingenformulier gewijzigd (beveilingsinbreuk)"
+
+#: contrib/comments/views/comments.py:256
+#: contrib/comments/views/comments.py:343
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"Het opmerkingenformulier heeft een ongeldige 'target' parameter -- het "
+"object-ID was ongeldig"
+
+#: contrib/comments/views/comments.py:307
+#: contrib/comments/views/comments.py:372
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "Het opmerkingenformulier verschaft geen 'voorbeeld' of 'post'"
+
+#: contrib/comments/views/karma.py:21
+msgid "Anonymous users cannot vote"
+msgstr "Anonieme gebruikers kunnen niet stemmen"
+
+#: contrib/comments/views/karma.py:25
+msgid "Invalid comment ID"
+msgstr "Ongeldige opmerkingen-ID"
+
+#: contrib/comments/views/karma.py:27
+msgid "No voting for yourself"
+msgstr "Niet op uzelf stemmen"
+
+#: contrib/contenttypes/models.py:67
+msgid "python model class name"
+msgstr "klassenaam van pythonmodel"
+
+#: contrib/contenttypes/models.py:71
+msgid "content type"
+msgstr "inhoudstype"
+
+#: contrib/contenttypes/models.py:72
+msgid "content types"
+msgstr "inhoudstypen"
+
+#: contrib/flatpages/admin.py:9
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr "Voorbeeld: '/about/contact/'. Zorg voor slashes aan het begin en eind."
+
+#: contrib/flatpages/admin.py:11 core/validators.py:76
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Deze waarde mag alleen letters, cijfers, liggende strepen en schuine strepen "
+"bevatten."
+
+#: contrib/flatpages/admin.py:22
+msgid "Advanced options"
+msgstr "Geavanceerde opties"
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "titel"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "inhoud"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "opmerkingen toestaan"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "sjabloonnaam"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"Voorbeeld: 'flatpages/contact_page.html'. Als deze niet is opgegeven, dan "
+"wordt 'flatpages/default.html' gebruikt."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "registratie verplicht"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+"Indien dit is aangekruist kunnen alleen ingelogde gebruikers deze pagina "
+"bekijken."
+
+#: contrib/flatpages/models.py:19
+msgid "flat page"
+msgstr "platte pagina"
+
+#: contrib/flatpages/models.py:20
+msgid "flat pages"
+msgstr "platte pagina's"
+
+#: contrib/gis/forms/fields.py:10
+msgid "No geometry value provided."
+msgstr "Geen geometrische waarde opgegeven."
+
+#: contrib/gis/forms/fields.py:11
+msgid "Invalid Geometry value."
+msgstr "Ongeldige geometrie waarde."
+
+#: contrib/gis/forms/fields.py:12
+msgid "Invalid Geometry type."
+msgstr "Ongeldig geometrie type."
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "th"
+msgstr "º"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "st"
+msgstr "º"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "nd"
+msgstr "º"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "rd"
+msgstr "º"
+
+#: contrib/humanize/templatetags/humanize.py:51
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f miljoen"
+msgstr[1] "%(value).1f miljoen"
+
+#: contrib/humanize/templatetags/humanize.py:54
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f miljard"
+msgstr[1] "%(value).1f miljard"
+
+#: contrib/humanize/templatetags/humanize.py:57
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f biljoen"
+msgstr[1] "%(value).1f biljoen"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "one"
+msgstr "één"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "two"
+msgstr "twee"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "three"
+msgstr "drie"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "four"
+msgstr "vier"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "five"
+msgstr "vijf"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "six"
+msgstr "zes"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "seven"
+msgstr "zeven"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "eight"
+msgstr "acht"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "nine"
+msgstr "negen"
+
+#: contrib/humanize/templatetags/humanize.py:93
+msgid "today"
+msgstr "vandaag"
+
+#: contrib/humanize/templatetags/humanize.py:95
+msgid "tomorrow"
+msgstr "morgen"
+
+#: contrib/humanize/templatetags/humanize.py:97
+msgid "yesterday"
+msgstr "gisteren"
+
+#: contrib/localflavor/ar/forms.py:27
+msgid "Enter a postal code in the format NNNN or ANNNNAAA."
+msgstr "Geef een postcode op volgens het NNNN of ANNNNAAA formaat."
+
+#: contrib/localflavor/ar/forms.py:49 contrib/localflavor/br/forms.py:96
+#: contrib/localflavor/br/forms.py:135 contrib/localflavor/pe/forms.py:23
+#: contrib/localflavor/pe/forms.py:51
+msgid "This field requires only numbers."
+msgstr "Dit veld dient alleen cijfers te bevatten."
+
+#: contrib/localflavor/ar/forms.py:50
+msgid "This field requires 7 or 8 digits."
+msgstr "Dit veld dient 7 of 8 cijfers te zijn."
+
+#: contrib/localflavor/ar/forms.py:79
+msgid "Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format."
+msgstr "Geef een geldige CUIT op in het XX-XXXXXXXX-X of XXXXXXXXXXXX formaat."
+
+#: contrib/localflavor/ar/forms.py:80
+msgid "Invalid CUIT."
+msgstr "Ongeldige CUIT."
+
+#: contrib/localflavor/at/at_states.py:5
+msgid "Burgenland"
+msgstr "Burgenland"
+
+#: contrib/localflavor/at/at_states.py:6
+msgid "Carinthia"
+msgstr "Carinthia"
+
+#: contrib/localflavor/at/at_states.py:7
+msgid "Lower Austria"
+msgstr "Lager Australië"
+
+#: contrib/localflavor/at/at_states.py:8
+msgid "Upper Austria"
+msgstr "Hoger Australië"
+
+#: contrib/localflavor/at/at_states.py:9
+msgid "Salzburg"
+msgstr "Salzburg"
+
+#: contrib/localflavor/at/at_states.py:10
+msgid "Styria"
+msgstr "Styria"
+
+#: contrib/localflavor/at/at_states.py:11
+msgid "Tyrol"
+msgstr "Tirol"
+
+#: contrib/localflavor/at/at_states.py:12
+msgid "Vorarlberg"
+msgstr "Vorarlberg"
+
+#: contrib/localflavor/at/at_states.py:13
+msgid "Vienna"
+msgstr "Wenen"
+
+#: contrib/localflavor/at/forms.py:20 contrib/localflavor/ch/forms.py:16
+#: contrib/localflavor/no/forms.py:12
+msgid "Enter a zip code in the format XXXX."
+msgstr "Geef een postcode op in het formaat XXXX."
+
+#: contrib/localflavor/at/forms.py:48
+msgid "Enter a valid Austrian Social Security Number in XXXX XXXXXX format."
+msgstr ""
+"Geef een geldig Oostenrijks Sociaalnummer op in het XXX-XX-XXXX formaat."
+
+#: contrib/localflavor/au/forms.py:16
+msgid "Enter a 4 digit post code."
+msgstr "Geef een vier cijferige postcode op."
+
+#: contrib/localflavor/br/forms.py:21
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Geef een postcode op in het formaat XXXXX-XXX."
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "Telefoonnummers dienen volgens het XX-XXXX-XXXX formaat te zijn."
+
+#: contrib/localflavor/br/forms.py:58
+msgid ""
+"Select a valid brazilian state. That state is not one of the available "
+"states."
+msgstr "Selecteer een geldige braziliaanse staat. Uw keuze is niet geldig."
+
+#: contrib/localflavor/br/forms.py:94
+msgid "Invalid CPF number."
+msgstr "Ongeldig CPF nummer."
+
+#: contrib/localflavor/br/forms.py:95
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr "Dit veld dient maximaal 11 cijfers of 14 letters te bevatten."
+
+#: contrib/localflavor/br/forms.py:134
+msgid "Invalid CNPJ number."
+msgstr "Ongeldig CNPJ nummer."
+
+#: contrib/localflavor/br/forms.py:136
+msgid "This field requires at least 14 digits"
+msgstr "Dit vereist minimaal 14 cijfers."
+
+#: contrib/localflavor/ca/forms.py:17
+msgid "Enter a postal code in the format XXX XXX."
+msgstr "Geef een postcode op in het formaat XXX XXX."
+
+#: contrib/localflavor/ca/forms.py:88
+msgid "Enter a valid Canadian Social Insurance number in XXX-XXX-XXX format."
+msgstr ""
+"Geef een geldig Canadees Sociaal Verzekeringsnummer op volgens het XXX-XXX-"
+"XXX formaat."
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr "Aargau"
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr "Appenzell Innerrhoden"
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr "Appenzell Ausserrhoden"
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr "Basel-Stad"
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr "Basel-Land"
+
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr "Bern"
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr "Fribourg"
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr "Genève"
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr "Glarus"
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr "Graubuenden"
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr "Jura"
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr "Lucerne"
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr "Neuchatel"
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr "Nidwalden"
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr "Obwalden"
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr "Schaffhausen"
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr "Schwyz"
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr "Solothurn"
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr "St. Gallen"
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr "Thurgau"
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr "Ticino"
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr "Uri"
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr "Valais"
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr "Vaud"
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr "Zug"
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr "Zurich"
+
+#: contrib/localflavor/ch/forms.py:64
+msgid ""
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
+msgstr ""
+"Geef een geldig Zwitsers identiteits- of paspoortnummer op volgens het "
+"X1234567<0 of 1234567890 formaat"
+
+#: contrib/localflavor/cl/forms.py:29
+msgid "Enter a valid Chilean RUT."
+msgstr "Geen een geldige Chileense RUT op."
+
+#: contrib/localflavor/cl/forms.py:30
+msgid "Enter a valid Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr "Geef een geldige Chileense RUT op. Het formaat is XX.XXX.XXX-X."
+
+#: contrib/localflavor/cl/forms.py:31
+msgid "The Chilean RUT is not valid."
+msgstr "De Chileense RUT is ongeldig."
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr "Baden-Wuerttemberg"
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr "Beieren"
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr "Berlijn"
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr "Brandenburg"
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr "Bremen"
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr "Hamburg"
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr "Hessen"
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr "Mecklenburg-Western Pomerania"
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr "Nedersaksen"
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr "Noord Rijn-Westfalen"
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr "Rijnland-Palts"
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr "Saarland"
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr "Saksen"
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr "Saksen-Anhalt"
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr "Sleeswijk-Holstein"
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr "Thüringen"
+
+#: contrib/localflavor/de/forms.py:14 contrib/localflavor/fi/forms.py:12
+#: contrib/localflavor/fr/forms.py:15
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Geef een postcode op in het formaat XXXXX."
+
+#: contrib/localflavor/de/forms.py:41
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr ""
+"Geef een geldig Duits identiteitsnummer op volgens het XXXXXXXXXXX-XXXXXXX-"
+"XXXXXXX-X formaat."
+
+#: contrib/localflavor/es/es_provinces.py:5
+msgid "Arava"
+msgstr "Arava"
+
+#: contrib/localflavor/es/es_provinces.py:6
+msgid "Albacete"
+msgstr "Albacete"
+
+#: contrib/localflavor/es/es_provinces.py:7
+msgid "Alacant"
+msgstr "Alacant"
+
+#: contrib/localflavor/es/es_provinces.py:8
+msgid "Almeria"
+msgstr "Almeria"
+
+#: contrib/localflavor/es/es_provinces.py:9
+msgid "Avila"
+msgstr "Avila"
+
+#: contrib/localflavor/es/es_provinces.py:10
+msgid "Badajoz"
+msgstr "Badajoz"
+
+#: contrib/localflavor/es/es_provinces.py:11
+msgid "Illes Balears"
+msgstr "Balearen"
+
+#: contrib/localflavor/es/es_provinces.py:12
+msgid "Barcelona"
+msgstr "Barcelona"
+
+#: contrib/localflavor/es/es_provinces.py:13
+msgid "Burgos"
+msgstr "Burgos"
+
+#: contrib/localflavor/es/es_provinces.py:14
+msgid "Caceres"
+msgstr "Caceres"
+
+#: contrib/localflavor/es/es_provinces.py:15
+msgid "Cadiz"
+msgstr "Cadiz"
+
+#: contrib/localflavor/es/es_provinces.py:16
+msgid "Castello"
+msgstr "Castello"
+
+#: contrib/localflavor/es/es_provinces.py:17
+msgid "Ciudad Real"
+msgstr "Ciudad Real"
+
+#: contrib/localflavor/es/es_provinces.py:18
+msgid "Cordoba"
+msgstr "Cordoba"
+
+#: contrib/localflavor/es/es_provinces.py:19
+msgid "A Coruna"
+msgstr "A Coruna"
+
+#: contrib/localflavor/es/es_provinces.py:20
+msgid "Cuenca"
+msgstr "Cuenca"
+
+#: contrib/localflavor/es/es_provinces.py:21
+msgid "Girona"
+msgstr "Girona"
+
+#: contrib/localflavor/es/es_provinces.py:22
+msgid "Granada"
+msgstr "Granada"
+
+#: contrib/localflavor/es/es_provinces.py:23
+msgid "Guadalajara"
+msgstr "Guadalajara"
+
+#: contrib/localflavor/es/es_provinces.py:24
+msgid "Guipuzkoa"
+msgstr "Guipuzkoa"
+
+#: contrib/localflavor/es/es_provinces.py:25
+msgid "Huelva"
+msgstr "Huelva"
+
+#: contrib/localflavor/es/es_provinces.py:26
+msgid "Huesca"
+msgstr "Huesca"
+
+#: contrib/localflavor/es/es_provinces.py:27
+msgid "Jaen"
+msgstr "Jaen"
+
+#: contrib/localflavor/es/es_provinces.py:28
+msgid "Leon"
+msgstr "Leon"
+
+#: contrib/localflavor/es/es_provinces.py:29
+msgid "Lleida"
+msgstr "Lleida"
+
+#: contrib/localflavor/es/es_provinces.py:30
+#: contrib/localflavor/es/es_regions.py:17
+msgid "La Rioja"
+msgstr "La Rioja"
+
+#: contrib/localflavor/es/es_provinces.py:31
+msgid "Lugo"
+msgstr "Lugo"
+
+#: contrib/localflavor/es/es_provinces.py:32
+#: contrib/localflavor/es/es_regions.py:18
+msgid "Madrid"
+msgstr "Madrid"
+
+#: contrib/localflavor/es/es_provinces.py:33
+msgid "Malaga"
+msgstr "Malaga"
+
+#: contrib/localflavor/es/es_provinces.py:34
+msgid "Murcia"
+msgstr "Murcia"
+
+#: contrib/localflavor/es/es_provinces.py:35
+msgid "Navarre"
+msgstr "Navarre"
+
+#: contrib/localflavor/es/es_provinces.py:36
+msgid "Ourense"
+msgstr "Ourense"
+
+#: contrib/localflavor/es/es_provinces.py:37
+msgid "Asturias"
+msgstr "Asturias"
+
+#: contrib/localflavor/es/es_provinces.py:38
+msgid "Palencia"
+msgstr "Palencia"
+
+#: contrib/localflavor/es/es_provinces.py:39
+msgid "Las Palmas"
+msgstr "Las Palmas"
+
+#: contrib/localflavor/es/es_provinces.py:40
+msgid "Pontevedra"
+msgstr "Pontevedra"
+
+#: contrib/localflavor/es/es_provinces.py:41
+msgid "Salamanca"
+msgstr "Salamanca"
+
+#: contrib/localflavor/es/es_provinces.py:42
+msgid "Santa Cruz de Tenerife"
+msgstr "Santa Cruz de Tenerife"
+
+#: contrib/localflavor/es/es_provinces.py:43
+#: contrib/localflavor/es/es_regions.py:11
+msgid "Cantabria"
+msgstr "Cantabria"
+
+#: contrib/localflavor/es/es_provinces.py:44
+msgid "Segovia"
+msgstr "Segovia"
+
+#: contrib/localflavor/es/es_provinces.py:45
+msgid "Seville"
+msgstr "Sevilla"
+
+#: contrib/localflavor/es/es_provinces.py:46
+msgid "Soria"
+msgstr "Soria"
+
+#: contrib/localflavor/es/es_provinces.py:47
+msgid "Tarragona"
+msgstr "Tarragona"
+
+#: contrib/localflavor/es/es_provinces.py:48
+msgid "Teruel"
+msgstr "Teruel"
+
+#: contrib/localflavor/es/es_provinces.py:49
+msgid "Toledo"
+msgstr "Toledo"
+
+#: contrib/localflavor/es/es_provinces.py:50
+msgid "Valencia"
+msgstr "Valencië"
+
+#: contrib/localflavor/es/es_provinces.py:51
+msgid "Valladolid"
+msgstr "Valladolid"
+
+#: contrib/localflavor/es/es_provinces.py:52
+msgid "Bizkaia"
+msgstr "Bizkaia"
+
+#: contrib/localflavor/es/es_provinces.py:53
+msgid "Zamora"
+msgstr "Zamora"
+
+#: contrib/localflavor/es/es_provinces.py:54
+msgid "Zaragoza"
+msgstr "Zaragoza"
+
+#: contrib/localflavor/es/es_provinces.py:55
+msgid "Ceuta"
+msgstr "Ceuta"
+
+#: contrib/localflavor/es/es_provinces.py:56
+msgid "Melilla"
+msgstr "Melilla"
+
+#: contrib/localflavor/es/es_regions.py:5
+msgid "Andalusia"
+msgstr "Andalusië"
+
+#: contrib/localflavor/es/es_regions.py:6
+msgid "Aragon"
+msgstr "Aragon"
+
+#: contrib/localflavor/es/es_regions.py:7
+msgid "Principality of Asturias"
+msgstr "Prinsdom Asturië"
+
+#: contrib/localflavor/es/es_regions.py:8
+msgid "Balearic Islands"
+msgstr "Balearen"
+
+#: contrib/localflavor/es/es_regions.py:9
+msgid "Basque Country"
+msgstr "Baskenland"
+
+#: contrib/localflavor/es/es_regions.py:10
+msgid "Canary Islands"
+msgstr "Canarische Eilanden"
+
+#: contrib/localflavor/es/es_regions.py:12
+msgid "Castile-La Mancha"
+msgstr "Castilië-La Mancha"
+
+#: contrib/localflavor/es/es_regions.py:13
+msgid "Castile and Leon"
+msgstr "Castilië en León"
+
+#: contrib/localflavor/es/es_regions.py:14
+msgid "Catalonia"
+msgstr "Catalonië"
+
+#: contrib/localflavor/es/es_regions.py:15
+msgid "Extremadura"
+msgstr "Extremadura"
+
+#: contrib/localflavor/es/es_regions.py:16
+msgid "Galicia"
+msgstr "Galicië"
+
+#: contrib/localflavor/es/es_regions.py:19
+msgid "Region of Murcia"
+msgstr "Murcia"
+
+#: contrib/localflavor/es/es_regions.py:20
+msgid "Foral Community of Navarre"
+msgstr "Navarra"
+
+#: contrib/localflavor/es/es_regions.py:21
+msgid "Valencian Community"
+msgstr "Valencia"
+
+#: contrib/localflavor/es/forms.py:19
+msgid "Enter a valid postal code in the range and format 01XXX - 52XXX."
+msgstr "Vul een postcode in volgens het 01XXX - 52XXX formaat."
+
+#: contrib/localflavor/es/forms.py:39
+msgid ""
+"Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or "
+"9XXXXXXXX."
+msgstr ""
+"Geef een geldig telefoonnummer op in één van de volgende formaten: "
+"6XXXXXXXX, 8XXXXXXXX of 9XXXXXXXX."
+
+#: contrib/localflavor/es/forms.py:66
+msgid "Please enter a valid NIF, NIE, or CIF."
+msgstr "Geef een geldige NIF, NIE of CIF op."
+
+#: contrib/localflavor/es/forms.py:67
+msgid "Please enter a valid NIF or NIE."
+msgstr "Geef een geldige NIF of NIE op."
+
+#: contrib/localflavor/es/forms.py:68
+msgid "Invalid checksum for NIF."
+msgstr "Ongeldig controlegetal voor NIF."
+
+#: contrib/localflavor/es/forms.py:69
+msgid "Invalid checksum for NIE."
+msgstr "Ongeldig controlegetal voor NIE."
+
+#: contrib/localflavor/es/forms.py:70
+msgid "Invalid checksum for CIF."
+msgstr "Ongeldig controlegetal voor CIF."
+
+#: contrib/localflavor/es/forms.py:142
+msgid ""
+"Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX."
+msgstr ""
+"Geef een geldig bankrekeningnummer op in het formaat XXXX-XXXX-XX-XXXXXXXXXX."
+
+#: contrib/localflavor/es/forms.py:143
+msgid "Invalid checksum for bank account number."
+msgstr "Ongeldig controlegetal voor het bankrekeningnummer."
+
+#: contrib/localflavor/fi/forms.py:28
+msgid "Enter a valid Finnish social security number."
+msgstr "Geef een geldig Fins sociaal nummer op."
+
+#: contrib/localflavor/in_/forms.py:14
+msgid "Enter a zip code in the format XXXXXXX."
+msgstr "Geef een geldige postcode op in het formaat XXXXXXX."
+
+#: contrib/localflavor/is_/forms.py:17
+msgid ""
+"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr ""
+"Geef een geldig IJslands identificatienummer op. Het formaat is XXXXXX-XXXX."
+
+#: contrib/localflavor/is_/forms.py:18
+msgid "The Icelandic identification number is not valid."
+msgstr "Het IJslandse identificatienummer is niet geldig."
+
+#: contrib/localflavor/it/forms.py:14
+msgid "Enter a valid zip code."
+msgstr "Geef een geldige postcode op."
+
+#: contrib/localflavor/it/forms.py:43
+msgid "Enter a valid Social Security number."
+msgstr "Geef een geldig Sociaal Nummer op."
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr "Geef een geldig BTW nummer op."
+
+#: contrib/localflavor/jp/forms.py:17
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "Geef een geldige postcode op in het formaat XXXXXXX of XXX-XXXX."
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr "Hokkaido"
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr "Aomori"
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr "Iwate"
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr "Miyagi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr "Akita"
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr "Yamagata"
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr "Fukushima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr "Ibaraki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr "Tochigi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr "Gunma"
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr "Saitama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr "Saitama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr "Tokyo"
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr "Kanagawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr "Yamanashi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr "Nagano"
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr "Niigata"
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr "Toyama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr "Ishikawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr "Fukui"
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr "Gifu"
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr "Shizuoka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr "Aichi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr "Mie"
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr "Shiga"
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr "Kyoto"
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr "Osaka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr "Hyogo"
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr "Nara"
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr "Wakayama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr "Tottori"
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr "Shimane"
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr "Okayama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr "Hiroshima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr "Yamaguchi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr "Tokushima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr "Kagawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr "Ehime"
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr "Kochi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr "Fukuoka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr "Saga"
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr "Nagasaki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr "Kumamoto"
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr "Oita"
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr "Miyazaki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr "Kagoshima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr "Okinawa"
+
+#: contrib/localflavor/mx/mx_states.py:12
+msgid "Aguascalientes"
+msgstr "Aguascalientes"
+
+#: contrib/localflavor/mx/mx_states.py:13
+msgid "Baja California"
+msgstr "Baja California"
+
+#: contrib/localflavor/mx/mx_states.py:14
+msgid "Baja California Sur"
+msgstr "Baja California Sur"
+
+#: contrib/localflavor/mx/mx_states.py:15
+msgid "Campeche"
+msgstr "Campeche"
+
+#: contrib/localflavor/mx/mx_states.py:16
+msgid "Chihuahua"
+msgstr "Chihuahua"
+
+#: contrib/localflavor/mx/mx_states.py:17
+msgid "Chiapas"
+msgstr "Chiapas"
+
+#: contrib/localflavor/mx/mx_states.py:18
+msgid "Coahuila"
+msgstr "Coahuila"
+
+#: contrib/localflavor/mx/mx_states.py:19
+msgid "Colima"
+msgstr "Colima"
+
+#: contrib/localflavor/mx/mx_states.py:20
+msgid "Distrito Federal"
+msgstr "Distrito Federal"
+
+#: contrib/localflavor/mx/mx_states.py:21
+msgid "Durango"
+msgstr "Durango"
+
+#: contrib/localflavor/mx/mx_states.py:22
+msgid "Guerrero"
+msgstr "Guerrero"
+
+#: contrib/localflavor/mx/mx_states.py:23
+msgid "Guanajuato"
+msgstr "Guanajuato"
+
+#: contrib/localflavor/mx/mx_states.py:24
+msgid "Hidalgo"
+msgstr "Hidalgo"
+
+#: contrib/localflavor/mx/mx_states.py:25
+msgid "Jalisco"
+msgstr "Jalisco"
+
+#: contrib/localflavor/mx/mx_states.py:26
+msgid "Estado de México"
+msgstr "de Staat Mexico"
+
+#: contrib/localflavor/mx/mx_states.py:27
+msgid "Michoacán"
+msgstr "Michoacán"
+
+#: contrib/localflavor/mx/mx_states.py:28
+msgid "Morelos"
+msgstr "Morelos"
+
+#: contrib/localflavor/mx/mx_states.py:29
+msgid "Nayarit"
+msgstr "Nayarit"
+
+#: contrib/localflavor/mx/mx_states.py:30
+msgid "Nuevo León"
+msgstr "Nuevo León"
+
+#: contrib/localflavor/mx/mx_states.py:31
+msgid "Oaxaca"
+msgstr "Oaxaca"
+
+#: contrib/localflavor/mx/mx_states.py:32
+msgid "Puebla"
+msgstr "Puebla"
+
+#: contrib/localflavor/mx/mx_states.py:33
+msgid "Querétaro"
+msgstr "Querétaro"
+
+#: contrib/localflavor/mx/mx_states.py:34
+msgid "Quintana Roo"
+msgstr "Quintana Roo"
+
+#: contrib/localflavor/mx/mx_states.py:35
+msgid "Sinaloa"
+msgstr "Sinaloa"
+
+#: contrib/localflavor/mx/mx_states.py:36
+msgid "San Luis Potosí"
+msgstr "San Luis Potosí"
+
+#: contrib/localflavor/mx/mx_states.py:37
+msgid "Sonora"
+msgstr "Sonora"
+
+#: contrib/localflavor/mx/mx_states.py:38
+msgid "Tabasco"
+msgstr "Tabasco"
+
+#: contrib/localflavor/mx/mx_states.py:39
+msgid "Tamaulipas"
+msgstr "Tamaulipas"
+
+#: contrib/localflavor/mx/mx_states.py:40
+msgid "Tlaxcala"
+msgstr "Tlaxcala"
+
+#: contrib/localflavor/mx/mx_states.py:41
+msgid "Veracruz"
+msgstr "Veracruz"
+
+#: contrib/localflavor/mx/mx_states.py:42
+msgid "Yucatán"
+msgstr "Yucatán"
+
+#: contrib/localflavor/mx/mx_states.py:43
+msgid "Zacatecas"
+msgstr "Zacatecas"
+
+#: contrib/localflavor/nl/forms.py:22
+msgid "Enter a valid postal code"
+msgstr "Geef een geldige postcode op"
+
+#: contrib/localflavor/nl/forms.py:53
+msgid "Enter a valid phone number"
+msgstr "Geef een geldig telefoonnummer op"
+
+#: contrib/localflavor/nl/forms.py:79
+msgid "Enter a valid SoFi number"
+msgstr "Geef een geldig SoFi nummer"
+
+#: contrib/localflavor/nl/forms.py:115
+msgid "Enter a valid Dutch bank account number"
+msgstr "Geef een geldig Nederlands bankrekeningnummer op"
+
+#: contrib/localflavor/nl/nl_provinces.py:4
+msgid "Drente"
+msgstr "Drente"
+
+#: contrib/localflavor/nl/nl_provinces.py:5
+msgid "Flevoland"
+msgstr "Flevoland"
+
+#: contrib/localflavor/nl/nl_provinces.py:6
+msgid "Friesland"
+msgstr "Friesland"
+
+#: contrib/localflavor/nl/nl_provinces.py:7
+msgid "Gelderland"
+msgstr "Gelderland"
+
+#: contrib/localflavor/nl/nl_provinces.py:8
+msgid "Groningen"
+msgstr "Groningen"
+
+#: contrib/localflavor/nl/nl_provinces.py:9
+msgid "Limburg"
+msgstr "Limburg"
+
+#: contrib/localflavor/nl/nl_provinces.py:10
+msgid "Noord-Brabant"
+msgstr "Noord-Brabant"
+
+#: contrib/localflavor/nl/nl_provinces.py:11
+msgid "Noord-Holland"
+msgstr "Noord-Holland"
+
+#: contrib/localflavor/nl/nl_provinces.py:12
+msgid "Overijssel"
+msgstr "Overijssel"
+
+#: contrib/localflavor/nl/nl_provinces.py:13
+msgid "Utrecht"
+msgstr "Utrecht"
+
+#: contrib/localflavor/nl/nl_provinces.py:14
+msgid "Zeeland"
+msgstr "Zeeland"
+
+#: contrib/localflavor/nl/nl_provinces.py:15
+msgid "Zuid-Holland"
+msgstr "Zuid-Holland"
+
+#: contrib/localflavor/no/forms.py:33
+msgid "Enter a valid Norwegian social security number."
+msgstr "Geef een geldig Noors Sociaal Nummer op."
+
+#: contrib/localflavor/pe/forms.py:24
+msgid "This field requires 8 digits."
+msgstr "Dit veld vereist 8 cijfers."
+
+#: contrib/localflavor/pe/forms.py:52
+msgid "This field requires 11 digits."
+msgstr "Dit veld vereist 11 cijfers."
+
+#: contrib/localflavor/pl/forms.py:38
+msgid "National Identification Number consists of 11 digits."
+msgstr "Het Nationaal Identificatie Nummer bestaat uit 11 cijfers."
+
+#: contrib/localflavor/pl/forms.py:39
+msgid "Wrong checksum for the National Identification Number."
+msgstr "Verkeerd controlecijfer voor het Nationaal Identificatie Nummer."
+
+#: contrib/localflavor/pl/forms.py:71
+msgid ""
+"Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX."
+msgstr ""
+"Geef een fiscaal nummer (NIP) op volgens het formaat XXX-XXX-XX-XX or XX-XX-"
+"XXX-XXX."
+
+#: contrib/localflavor/pl/forms.py:72
+msgid "Wrong checksum for the Tax Number (NIP)."
+msgstr "Verkeerd controlecijfer voor het fiscaal nummer (NIP)."
+
+#: contrib/localflavor/pl/forms.py:111
+msgid "National Business Register Number (REGON) consists of 7 or 9 digits."
+msgstr ""
+"Het Nationaal Zakelijk Registratie Nummer (REGON) bestaat uit 7 of 9 cijfers."
+
+#: contrib/localflavor/pl/forms.py:112
+msgid "Wrong checksum for the National Business Register Number (REGON)."
+msgstr ""
+"Verkeerd controlecijfer op het Nationaal Zakelijk Registratie Nummer (REGON)."
+
+#: contrib/localflavor/pl/forms.py:155
+msgid "Enter a postal code in the format XX-XXX."
+msgstr "Geef een postcode op in het formaat XX-XXX."
+
+#: contrib/localflavor/pl/pl_voivodeships.py:8
+msgid "Lower Silesia"
+msgstr "Neder-Silezië"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:9
+msgid "Kuyavia-Pomerania"
+msgstr "Kuyavia-Pomerania"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:10
+msgid "Lublin"
+msgstr "Lublin"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:11
+msgid "Lubusz"
+msgstr "Lubusz"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:12
+msgid "Lodz"
+msgstr "Lodz"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:13
+msgid "Lesser Poland"
+msgstr "Klein-Polen"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:14
+msgid "Masovia"
+msgstr "Masovia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:15
+msgid "Opole"
+msgstr "Opole"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:16
+msgid "Subcarpatia"
+msgstr "Subcarpatia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:17
+msgid "Podlasie"
+msgstr "Podlasie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:18
+msgid "Pomerania"
+msgstr "Pomerania"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:19
+msgid "Silesia"
+msgstr "Silesia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:20
+msgid "Swietokrzyskie"
+msgstr "Swietokrzyskie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:21
+msgid "Warmia-Masuria"
+msgstr "Warmia-Masuria"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:22
+msgid "Greater Poland"
+msgstr "Groot-Polen"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:23
+msgid "West Pomerania"
+msgstr "West Pomerania"
+
+#: contrib/localflavor/ro/forms.py:19
+msgid "Enter a valid CIF."
+msgstr "Geef een geldige CIF op."
+
+#: contrib/localflavor/ro/forms.py:56
+msgid "Enter a valid CNP."
+msgstr "Geef een geldige CNP op."
+
+#: contrib/localflavor/ro/forms.py:141
+msgid "Enter a valid IBAN in ROXX-XXXX-XXXX-XXXX-XXXX-XXXX format"
+msgstr ""
+"Geef een geldige IBAN volgens het ROXX-XXXX-XXXX-XXXX-XXXX-XXXX formaat"
+
+#: contrib/localflavor/ro/forms.py:171
+msgid "Phone numbers must be in XXXX-XXXXXX format."
+msgstr "Telefoonnummers moeten volgens het XXXX-XXXXXX formaat te zijn."
+
+#: contrib/localflavor/ro/forms.py:194
+msgid "Enter a valid postal code in the format XXXXXX"
+msgstr "Geef een geldige postcode in het formaat XXXXXX"
+
+#: contrib/localflavor/sk/forms.py:30
+msgid "Enter a postal code in the format XXXXX or XXX XX."
+msgstr "Geef een postcode op in het formaat XXXXX of XXX XX."
+
+#: contrib/localflavor/sk/sk_districts.py:8
+msgid "Banska Bystrica"
+msgstr "Banska Bystrica"
+
+#: contrib/localflavor/sk/sk_districts.py:9
+msgid "Banska Stiavnica"
+msgstr "Banska Stiavnica"
+
+#: contrib/localflavor/sk/sk_districts.py:10
+msgid "Bardejov"
+msgstr "Bardejov"
+
+#: contrib/localflavor/sk/sk_districts.py:11
+msgid "Banovce nad Bebravou"
+msgstr "Banovce nad Bebravou"
+
+#: contrib/localflavor/sk/sk_districts.py:12
+msgid "Brezno"
+msgstr "Brezno"
+
+#: contrib/localflavor/sk/sk_districts.py:13
+msgid "Bratislava I"
+msgstr "Bratislava I"
+
+#: contrib/localflavor/sk/sk_districts.py:14
+msgid "Bratislava II"
+msgstr "Bratislava II"
+
+#: contrib/localflavor/sk/sk_districts.py:15
+msgid "Bratislava III"
+msgstr "Bratislava III"
+
+#: contrib/localflavor/sk/sk_districts.py:16
+msgid "Bratislava IV"
+msgstr "Bratislava IV"
+
+#: contrib/localflavor/sk/sk_districts.py:17
+msgid "Bratislava V"
+msgstr "Bratislava V"
+
+#: contrib/localflavor/sk/sk_districts.py:18
+msgid "Bytca"
+msgstr "Bytca"
+
+#: contrib/localflavor/sk/sk_districts.py:19
+msgid "Cadca"
+msgstr "Cadca"
+
+#: contrib/localflavor/sk/sk_districts.py:20
+msgid "Detva"
+msgstr "Detva"
+
+#: contrib/localflavor/sk/sk_districts.py:21
+msgid "Dolny Kubin"
+msgstr "Dolny Kubin"
+
+#: contrib/localflavor/sk/sk_districts.py:22
+msgid "Dunajska Streda"
+msgstr "Dunajska Streda"
+
+#: contrib/localflavor/sk/sk_districts.py:23
+msgid "Galanta"
+msgstr "Galanta"
+
+#: contrib/localflavor/sk/sk_districts.py:24
+msgid "Gelnica"
+msgstr "Gelnica"
+
+#: contrib/localflavor/sk/sk_districts.py:25
+msgid "Hlohovec"
+msgstr "Hlohovec"
+
+#: contrib/localflavor/sk/sk_districts.py:26
+msgid "Humenne"
+msgstr "Humenne"
+
+#: contrib/localflavor/sk/sk_districts.py:27
+msgid "Ilava"
+msgstr "Ilava"
+
+#: contrib/localflavor/sk/sk_districts.py:28
+msgid "Kezmarok"
+msgstr "Kezmarok"
+
+#: contrib/localflavor/sk/sk_districts.py:29
+msgid "Komarno"
+msgstr "Komarno"
+
+#: contrib/localflavor/sk/sk_districts.py:30
+msgid "Kosice I"
+msgstr "Kosice I"
+
+#: contrib/localflavor/sk/sk_districts.py:31
+msgid "Kosice II"
+msgstr "Kosice II"
+
+#: contrib/localflavor/sk/sk_districts.py:32
+msgid "Kosice III"
+msgstr "Kosice III"
+
+#: contrib/localflavor/sk/sk_districts.py:33
+msgid "Kosice IV"
+msgstr "Kosice IV"
+
+#: contrib/localflavor/sk/sk_districts.py:34
+msgid "Kosice - okolie"
+msgstr "Kosice - okolie"
+
+#: contrib/localflavor/sk/sk_districts.py:35
+msgid "Krupina"
+msgstr "Krupina"
+
+#: contrib/localflavor/sk/sk_districts.py:36
+msgid "Kysucke Nove Mesto"
+msgstr "Kysucke Nove Mesto"
+
+#: contrib/localflavor/sk/sk_districts.py:37
+msgid "Levice"
+msgstr "Levice"
+
+#: contrib/localflavor/sk/sk_districts.py:38
+msgid "Levoca"
+msgstr "Levoca"
+
+#: contrib/localflavor/sk/sk_districts.py:39
+msgid "Liptovsky Mikulas"
+msgstr "Liptovsky Mikulas"
+
+#: contrib/localflavor/sk/sk_districts.py:40
+msgid "Lucenec"
+msgstr "Lucenec"
+
+#: contrib/localflavor/sk/sk_districts.py:41
+msgid "Malacky"
+msgstr "Malacky"
+
+#: contrib/localflavor/sk/sk_districts.py:42
+msgid "Martin"
+msgstr "Martin"
+
+#: contrib/localflavor/sk/sk_districts.py:43
+msgid "Medzilaborce"
+msgstr "Medzilaborce"
+
+#: contrib/localflavor/sk/sk_districts.py:44
+msgid "Michalovce"
+msgstr "Michalovce"
+
+#: contrib/localflavor/sk/sk_districts.py:45
+msgid "Myjava"
+msgstr "Myjava"
+
+#: contrib/localflavor/sk/sk_districts.py:46
+msgid "Namestovo"
+msgstr "Namestovo"
+
+#: contrib/localflavor/sk/sk_districts.py:47
+msgid "Nitra"
+msgstr "Nitra"
+
+#: contrib/localflavor/sk/sk_districts.py:48
+msgid "Nove Mesto nad Vahom"
+msgstr "Nove Mesto nad Vahom"
+
+#: contrib/localflavor/sk/sk_districts.py:49
+msgid "Nove Zamky"
+msgstr "Nove Zamky"
+
+#: contrib/localflavor/sk/sk_districts.py:50
+msgid "Partizanske"
+msgstr "Partizanske"
+
+#: contrib/localflavor/sk/sk_districts.py:51
+msgid "Pezinok"
+msgstr "Pezinok"
+
+#: contrib/localflavor/sk/sk_districts.py:52
+msgid "Piestany"
+msgstr "Piestany"
+
+#: contrib/localflavor/sk/sk_districts.py:53
+msgid "Poltar"
+msgstr "Poltar"
+
+#: contrib/localflavor/sk/sk_districts.py:54
+msgid "Poprad"
+msgstr "Poprad"
+
+#: contrib/localflavor/sk/sk_districts.py:55
+msgid "Povazska Bystrica"
+msgstr "Povazska Bystrica"
+
+#: contrib/localflavor/sk/sk_districts.py:56
+msgid "Presov"
+msgstr "Presov"
+
+#: contrib/localflavor/sk/sk_districts.py:57
+msgid "Prievidza"
+msgstr "Prievidza"
+
+#: contrib/localflavor/sk/sk_districts.py:58
+msgid "Puchov"
+msgstr "Puchov"
+
+#: contrib/localflavor/sk/sk_districts.py:59
+msgid "Revuca"
+msgstr "Revuca"
+
+#: contrib/localflavor/sk/sk_districts.py:60
+msgid "Rimavska Sobota"
+msgstr "Rimavska Sobota"
+
+#: contrib/localflavor/sk/sk_districts.py:61
+msgid "Roznava"
+msgstr "Roznava"
+
+#: contrib/localflavor/sk/sk_districts.py:62
+msgid "Ruzomberok"
+msgstr "Ruzomberok"
+
+#: contrib/localflavor/sk/sk_districts.py:63
+msgid "Sabinov"
+msgstr "Sabinov"
+
+#: contrib/localflavor/sk/sk_districts.py:64
+msgid "Senec"
+msgstr "Senec"
+
+#: contrib/localflavor/sk/sk_districts.py:65
+msgid "Senica"
+msgstr "Senica"
+
+#: contrib/localflavor/sk/sk_districts.py:66
+msgid "Skalica"
+msgstr "Skalica"
+
+#: contrib/localflavor/sk/sk_districts.py:67
+msgid "Snina"
+msgstr "Snina"
+
+#: contrib/localflavor/sk/sk_districts.py:68
+msgid "Sobrance"
+msgstr "Sobrance"
+
+#: contrib/localflavor/sk/sk_districts.py:69
+msgid "Spisska Nova Ves"
+msgstr "Spisska Nova Ves"
+
+#: contrib/localflavor/sk/sk_districts.py:70
+msgid "Stara Lubovna"
+msgstr "Stara Lubovna"
+
+#: contrib/localflavor/sk/sk_districts.py:71
+msgid "Stropkov"
+msgstr "Stropkov"
+
+#: contrib/localflavor/sk/sk_districts.py:72
+msgid "Svidnik"
+msgstr "Svidnik"
+
+#: contrib/localflavor/sk/sk_districts.py:73
+msgid "Sala"
+msgstr "Sala"
+
+#: contrib/localflavor/sk/sk_districts.py:74
+msgid "Topolcany"
+msgstr "Topolcany"
+
+#: contrib/localflavor/sk/sk_districts.py:75
+msgid "Trebisov"
+msgstr "Trebisov"
+
+#: contrib/localflavor/sk/sk_districts.py:76
+msgid "Trencin"
+msgstr "Trencin"
+
+#: contrib/localflavor/sk/sk_districts.py:77
+msgid "Trnava"
+msgstr "Trnava"
+
+#: contrib/localflavor/sk/sk_districts.py:78
+msgid "Turcianske Teplice"
+msgstr "Turcianske Teplice"
+
+#: contrib/localflavor/sk/sk_districts.py:79
+msgid "Tvrdosin"
+msgstr "Tvrdosin"
+
+#: contrib/localflavor/sk/sk_districts.py:80
+msgid "Velky Krtis"
+msgstr "Velky Krtis"
+
+#: contrib/localflavor/sk/sk_districts.py:81
+msgid "Vranov nad Toplou"
+msgstr "Vranov nad Toplou"
+
+#: contrib/localflavor/sk/sk_districts.py:82
+msgid "Zlate Moravce"
+msgstr "Zlate Moravce"
+
+#: contrib/localflavor/sk/sk_districts.py:83
+msgid "Zvolen"
+msgstr "Zvolen"
+
+#: contrib/localflavor/sk/sk_districts.py:84
+msgid "Zarnovica"
+msgstr "Zarnovica"
+
+#: contrib/localflavor/sk/sk_districts.py:85
+msgid "Ziar nad Hronom"
+msgstr "Ziar nad Hronom"
+
+#: contrib/localflavor/sk/sk_districts.py:86
+msgid "Zilina"
+msgstr "Zilina"
+
+#: contrib/localflavor/sk/sk_regions.py:8
+msgid "Banska Bystrica region"
+msgstr "Regio Banská Bystrica"
+
+#: contrib/localflavor/sk/sk_regions.py:9
+msgid "Bratislava region"
+msgstr "Regio Bratislava"
+
+#: contrib/localflavor/sk/sk_regions.py:10
+msgid "Kosice region"
+msgstr "Regio Košice"
+
+#: contrib/localflavor/sk/sk_regions.py:11
+msgid "Nitra region"
+msgstr "Regio Nitra"
+
+#: contrib/localflavor/sk/sk_regions.py:12
+msgid "Presov region"
+msgstr "Regio Prešov"
+
+#: contrib/localflavor/sk/sk_regions.py:13
+msgid "Trencin region"
+msgstr "Regio Trenčín"
+
+#: contrib/localflavor/sk/sk_regions.py:14
+msgid "Trnava region"
+msgstr "Regio Trnava"
+
+#: contrib/localflavor/sk/sk_regions.py:15
+msgid "Zilina region"
+msgstr "Regio Žilina"
+
+#: contrib/localflavor/uk/forms.py:21
+msgid "Enter a valid postcode."
+msgstr "Geef een geldige postcode op."
+
+#: contrib/localflavor/uk/uk_regions.py:11
+msgid "Bedfordshire"
+msgstr "Bedfordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:12
+msgid "Buckinghamshire"
+msgstr "Buckinghamshire"
+
+#: contrib/localflavor/uk/uk_regions.py:14
+msgid "Cheshire"
+msgstr "Cheshire"
+
+#: contrib/localflavor/uk/uk_regions.py:15
+msgid "Cornwall and Isles of Scilly"
+msgstr "Cornwall en de Scilly-Eilanden"
+
+#: contrib/localflavor/uk/uk_regions.py:16
+msgid "Cumbria"
+msgstr "Cumbria"
+
+#: contrib/localflavor/uk/uk_regions.py:17
+msgid "Derbyshire"
+msgstr "Derbyshire"
+
+#: contrib/localflavor/uk/uk_regions.py:18
+msgid "Devon"
+msgstr "Devon"
+
+#: contrib/localflavor/uk/uk_regions.py:19
+msgid "Dorset"
+msgstr "Dorset"
+
+#: contrib/localflavor/uk/uk_regions.py:20
+msgid "Durham"
+msgstr "Durham"
+
+#: contrib/localflavor/uk/uk_regions.py:21
+msgid "East Sussex"
+msgstr "Oost-Sussex"
+
+#: contrib/localflavor/uk/uk_regions.py:22
+msgid "Essex"
+msgstr "Essex"
+
+#: contrib/localflavor/uk/uk_regions.py:23
+msgid "Gloucestershire"
+msgstr "Gloucestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:24
+msgid "Greater London"
+msgstr "Groot-Londen"
+
+#: contrib/localflavor/uk/uk_regions.py:25
+msgid "Greater Manchester"
+msgstr "Groot-Manchester"
+
+#: contrib/localflavor/uk/uk_regions.py:26
+msgid "Hampshire"
+msgstr "Hampshire"
+
+#: contrib/localflavor/uk/uk_regions.py:27
+msgid "Hertfordshire"
+msgstr "Hertfordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:28
+msgid "Kent"
+msgstr "Kent"
+
+#: contrib/localflavor/uk/uk_regions.py:29
+msgid "Lancashire"
+msgstr "Lancashire"
+
+#: contrib/localflavor/uk/uk_regions.py:30
+msgid "Leicestershire"
+msgstr "Leicestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:31
+msgid "Lincolnshire"
+msgstr "Lincolnshire"
+
+#: contrib/localflavor/uk/uk_regions.py:32
+msgid "Merseyside"
+msgstr "Merseyside"
+
+#: contrib/localflavor/uk/uk_regions.py:33
+msgid "Norfolk"
+msgstr "Norfolk"
+
+#: contrib/localflavor/uk/uk_regions.py:34
+msgid "North Yorkshire"
+msgstr "Noord-Yorkshire"
+
+#: contrib/localflavor/uk/uk_regions.py:35
+msgid "Northamptonshire"
+msgstr "Northamptonshire"
+
+#: contrib/localflavor/uk/uk_regions.py:36
+msgid "Northumberland"
+msgstr "Northumberland"
+
+#: contrib/localflavor/uk/uk_regions.py:37
+msgid "Nottinghamshire"
+msgstr "Nottinghamshire"
+
+#: contrib/localflavor/uk/uk_regions.py:38
+msgid "Oxfordshire"
+msgstr "Oxfordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:39
+msgid "Shropshire"
+msgstr "Shropshire"
+
+#: contrib/localflavor/uk/uk_regions.py:40
+msgid "Somerset"
+msgstr "Somerset"
+
+#: contrib/localflavor/uk/uk_regions.py:41
+msgid "South Yorkshire"
+msgstr "Zuid-Yorkshire"
+
+#: contrib/localflavor/uk/uk_regions.py:42
+msgid "Staffordshire"
+msgstr "Staffordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:43
+msgid "Suffolk"
+msgstr "Suffolk"
+
+#: contrib/localflavor/uk/uk_regions.py:44
+msgid "Surrey"
+msgstr "Surrey"
+
+#: contrib/localflavor/uk/uk_regions.py:45
+msgid "Tyne and Wear"
+msgstr "Tyne and Wear"
+
+#: contrib/localflavor/uk/uk_regions.py:46
+msgid "Warwickshire"
+msgstr "Warwickshire"
+
+#: contrib/localflavor/uk/uk_regions.py:47
+msgid "West Midlands"
+msgstr "West-Midlands"
+
+#: contrib/localflavor/uk/uk_regions.py:48
+msgid "West Sussex"
+msgstr "West-Sussex"
+
+#: contrib/localflavor/uk/uk_regions.py:49
+msgid "West Yorkshire"
+msgstr "West-Yorkshire"
+
+#: contrib/localflavor/uk/uk_regions.py:50
+msgid "Wiltshire"
+msgstr "Wiltshire"
+
+#: contrib/localflavor/uk/uk_regions.py:51
+msgid "Worcestershire"
+msgstr "Worcestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:55
+msgid "County Antrim"
+msgstr "Graafschap Antrim"
+
+#: contrib/localflavor/uk/uk_regions.py:56
+msgid "County Armagh"
+msgstr "Graafschap Armagh"
+
+#: contrib/localflavor/uk/uk_regions.py:57
+msgid "County Down"
+msgstr "Graafschap Down"
+
+#: contrib/localflavor/uk/uk_regions.py:58
+msgid "County Fermanagh"
+msgstr "Graafschap Fermanagh"
+
+#: contrib/localflavor/uk/uk_regions.py:59
+msgid "County Londonderry"
+msgstr "Graafschap Londonderry"
+
+#: contrib/localflavor/uk/uk_regions.py:60
+msgid "County Tyrone"
+msgstr "Graafschap Tyrone"
+
+#: contrib/localflavor/uk/uk_regions.py:64
+msgid "Clwyd"
+msgstr "Clwyd"
+
+#: contrib/localflavor/uk/uk_regions.py:65
+msgid "Dyfed"
+msgstr "Dyfed"
+
+#: contrib/localflavor/uk/uk_regions.py:66
+msgid "Gwent"
+msgstr "Gwent"
+
+#: contrib/localflavor/uk/uk_regions.py:67
+msgid "Gwynedd"
+msgstr "Gwynedd"
+
+#: contrib/localflavor/uk/uk_regions.py:68
+msgid "Mid Glamorgan"
+msgstr "Mid Glamorgan"
+
+#: contrib/localflavor/uk/uk_regions.py:69
+msgid "Powys"
+msgstr "Powys"
+
+#: contrib/localflavor/uk/uk_regions.py:70
+msgid "South Glamorgan"
+msgstr "Zuid-Glamorgan"
+
+#: contrib/localflavor/uk/uk_regions.py:71
+msgid "West Glamorgan"
+msgstr "West-Glamorgan"
+
+#: contrib/localflavor/uk/uk_regions.py:75
+msgid "Borders"
+msgstr "Schotse-Borders"
+
+#: contrib/localflavor/uk/uk_regions.py:76
+msgid "Central Scotland"
+msgstr "Centraal-Schotland"
+
+#: contrib/localflavor/uk/uk_regions.py:77
+msgid "Dumfries and Galloway"
+msgstr "Dumfries en Galloway"
+
+#: contrib/localflavor/uk/uk_regions.py:78
+msgid "Fife"
+msgstr "Fife"
+
+#: contrib/localflavor/uk/uk_regions.py:79
+msgid "Grampian"
+msgstr "Grampian"
+
+#: contrib/localflavor/uk/uk_regions.py:80
+msgid "Highland"
+msgstr "Highland"
+
+#: contrib/localflavor/uk/uk_regions.py:81
+msgid "Lothian"
+msgstr "Lothian"
+
+#: contrib/localflavor/uk/uk_regions.py:82
+msgid "Orkney Islands"
+msgstr "Orkneyeilanden"
+
+#: contrib/localflavor/uk/uk_regions.py:83
+msgid "Shetland Islands"
+msgstr "Shetlandeilanden"
+
+#: contrib/localflavor/uk/uk_regions.py:84
+msgid "Strathclyde"
+msgstr "Strathclyde"
+
+#: contrib/localflavor/uk/uk_regions.py:85
+msgid "Tayside"
+msgstr "Tayside"
+
+#: contrib/localflavor/uk/uk_regions.py:86
+msgid "Western Isles"
+msgstr "Buiten-Hebriden"
+
+#: contrib/localflavor/uk/uk_regions.py:90
+msgid "England"
+msgstr "Engeland"
+
+#: contrib/localflavor/uk/uk_regions.py:91
+msgid "Northern Ireland"
+msgstr "Noord-Ierland"
+
+#: contrib/localflavor/uk/uk_regions.py:92
+msgid "Scotland"
+msgstr "Schotland"
+
+#: contrib/localflavor/uk/uk_regions.py:93
+msgid "Wales"
+msgstr "Wales"
+
+#: contrib/localflavor/us/forms.py:16
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "Geef een geldige postcode op volgens het XXXXX of XXXXX-XXXX formaat."
+
+#: contrib/localflavor/us/forms.py:54
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr "Geef een geldig V.S. Sociaalnummer op in het XXX-XX-XXXX formaat."
+
+#: contrib/localflavor/za/forms.py:20
+msgid "Enter a valid South African ID number"
+msgstr "Geef een geldig Zuid-Afrikaans identificatienummer op"
+
+#: contrib/localflavor/za/forms.py:54
+msgid "Enter a valid South African postal code"
+msgstr "Geef een geldige Zuid-Afrikaanse postcode op"
+
+#: contrib/localflavor/za/za_provinces.py:4
+msgid "Eastern Cape"
+msgstr "Oost-Kaap"
+
+#: contrib/localflavor/za/za_provinces.py:5
+msgid "Free State"
+msgstr "Vrijstaat"
+
+#: contrib/localflavor/za/za_provinces.py:6
+msgid "Gauteng"
+msgstr "Gauteng"
+
+#: contrib/localflavor/za/za_provinces.py:7
+msgid "KwaZulu-Natal"
+msgstr "KwaZulu-Natal"
+
+#: contrib/localflavor/za/za_provinces.py:8
+msgid "Limpopo"
+msgstr "Limpopo"
+
+#: contrib/localflavor/za/za_provinces.py:9
+msgid "Mpumalanga"
+msgstr "Mpumalanga"
+
+#: contrib/localflavor/za/za_provinces.py:10
+msgid "Northern Cape"
+msgstr "Noord-Kaap"
+
+#: contrib/localflavor/za/za_provinces.py:11
+msgid "North West"
+msgstr "Noordwest"
+
+#: contrib/localflavor/za/za_provinces.py:12
+msgid "Western Cape"
+msgstr "West-Kaap"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "omgeleid via"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Dit moet een absoluut pad zijn, zonder de domeinnaam. Bijvoorbeeld: '/events/"
+"search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "omleiden naar"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Dit kan een absoluut pad (zoals hierboven) zijn of een volledige URL "
+"beginnend met 'http://'."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "omleiding"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "omleidingen"
+
+#: contrib/sessions/models.py:45
+msgid "session key"
+msgstr "sessiesleutel"
+
+#: contrib/sessions/models.py:47
+msgid "session data"
+msgstr "sessiegegevens"
+
+#: contrib/sessions/models.py:48
+msgid "expire date"
+msgstr "verloopdatum"
+
+#: contrib/sessions/models.py:53
+msgid "session"
+msgstr "sessie"
+
+#: contrib/sessions/models.py:54
+msgid "sessions"
+msgstr "sessies"
+
+#: contrib/sites/models.py:32
+msgid "domain name"
+msgstr "domeinnaam"
+
+#: contrib/sites/models.py:33
+msgid "display name"
+msgstr "weergavenaam"
+
+#: contrib/sites/models.py:39
+msgid "sites"
+msgstr "sites"
+
+#: core/validators.py:80
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr ""
+"Deze waarde mag alleen letters, cijfers, liggende strepen en "
+"verbindingsstrepen bevatten."
+
+#: core/validators.py:84
+msgid "Uppercase letters are not allowed here."
+msgstr "Hoofdletters zijn hier niet toegestaan."
+
+#: core/validators.py:88
+msgid "Lowercase letters are not allowed here."
+msgstr "Kleine letters zijn hier niet toegestaan."
+
+#: core/validators.py:95
+msgid "Enter only digits separated by commas."
+msgstr "Geef alleen cijfers op, gescheiden door komma's."
+
+#: core/validators.py:107
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Geef geldige e-mailadressen op, gescheiden door komma's."
+
+#: core/validators.py:111
+msgid "Please enter a valid IP address."
+msgstr "Geef een geldig IP-adres op."
+
+#: core/validators.py:115
+msgid "Empty values are not allowed here."
+msgstr "Lege waarden zijn hier niet toegestaan."
+
+#: core/validators.py:119
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Niet-numerieke karakters zijn hier niet toegestaan."
+
+#: core/validators.py:123
+msgid "This value can't be comprised solely of digits."
+msgstr "Deze waarde kan niet alleen uit cijfers bestaan."
+
+#: core/validators.py:128 forms/fields.py:161
+msgid "Enter a whole number."
+msgstr "Geef een geheel getal op."
+
+#: core/validators.py:132
+msgid "Only alphabetical characters are allowed here."
+msgstr "Alleen alfabetische karakters zijn toegestaan"
+
+#: core/validators.py:147
+#, python-format
+msgid "Invalid date: %s"
+msgstr "Ongeldige datum: %s"
+
+#: core/validators.py:152 db/models/fields/__init__.py:546
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Geef een geldige datum in JJJJ-MM-DD formaat."
+
+#: core/validators.py:157
+msgid "Enter a valid time in HH:MM format."
+msgstr "Geef een geldige tijd in UU:MM formaat."
+
+#: core/validators.py:161
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Geef geldige datum/tijd in JJJJ-MM-DD UU:MM formaat."
+
+#: core/validators.py:166 forms/fields.py:422
+msgid "Enter a valid e-mail address."
+msgstr "Geef een geldig e-mailadres op."
+
+#: core/validators.py:178 core/validators.py:470 forms/fields.py:440
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+"Er was geen bestand verstuurd. Controleer het coderingstype van het "
+"formulier."
+
+#: core/validators.py:189 forms/fields.py:471
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Bestand ongeldig. Het bestand dat is gegeven is geen afbeelding of is "
+"beschadigd."
+
+#: core/validators.py:196
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "De URL %s wijst niet naar een geldige afbeelding."
+
+#: core/validators.py:200
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Telefoonnummers moeten volgens het XXX-XXX-XXXX formaat zijn. \"%s\" is "
+"ongeldig."
+
+#: core/validators.py:208
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "De URL %s wijst niet naar een geldige QuickTime video."
+
+#: core/validators.py:212
+msgid "A valid URL is required."
+msgstr "Een geldige URL is vereist."
+
+#: core/validators.py:226
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Geldige HTML is vereist. De specifieke fouten zijn:\n"
+"%s"
+
+#: core/validators.py:233
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Foute XML: %s"
+
+#: core/validators.py:250
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Ongeldige URL: %s"
+
+#: core/validators.py:255 core/validators.py:257
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "De URL %s is niet een werkende link."
+
+#: core/validators.py:263
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Geef een geldige afkorting van een staat in de VS."
+
+#: core/validators.py:277
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Pas op uw taalgebruik! Gebruik van %s niet toegestaan."
+msgstr[1] ""
+"Pas op uw taalgebruik! Gebruik van de woorden %s is niet toegestaan."
+
+#: core/validators.py:284
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Dit veld moet overeenkomen met het '%s'-veld."
+
+#: core/validators.py:303
+msgid "Please enter something for at least one field."
+msgstr "Voer tenminste één veld in."
+
+#: core/validators.py:312 core/validators.py:323
+msgid "Please enter both fields or leave them both empty."
+msgstr "Voer waarden in beide velden in of laat beide leeg."
+
+#: core/validators.py:331
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Dit veld moet opgegeven worden indien %(field)s %(value)s is"
+
+#: core/validators.py:344
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Dit veld moet worden opgegeven indien %(field)s niet %(value)s is"
+
+#: core/validators.py:363
+msgid "Duplicate values are not allowed."
+msgstr "Dubbele waarden zijn niet toegestaan."
+
+#: core/validators.py:378
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "De waarde moet tussen %(lower)s en %(upper)s zijn."
+
+#: core/validators.py:380
+#, python-format
+msgid "This value must be at least %s."
+msgstr "De waarde moet minimaal %s zijn."
+
+#: core/validators.py:382
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "De waarde mag niet meer zijn dan %s."
+
+#: core/validators.py:423
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "De waarde moet een macht van %s zijn."
+
+#: core/validators.py:433
+msgid "Please enter a valid decimal number."
+msgstr "Geef een geldig decimaal getal."
+
+#: core/validators.py:440
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Geef een geldig decimaal getal met hooguit %s cijfer."
+msgstr[1] "Geef een geldig decimaal getal met hooguit %s cijfers."
+
+#: core/validators.py:443
+#, python-format
+msgid ""
+"Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural ""
+"Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] ""
+"Geef een geldig decimaal getal waarbij het gehele getal minimaal %s cijfer "
+"heeft."
+msgstr[1] ""
+"Geef een geldig decimaal getal waarbij het gehele getal minimaal %s cijfers "
+"heeft."
+
+#: core/validators.py:446
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "Geef een decimaal getal met hooguit %s cijfer achter de komma."
+msgstr[1] "Geef een decimaal getal met hooguit %s cijfers achter de komma."
+
+#: core/validators.py:454
+msgid "Please enter a valid floating point number."
+msgstr "Geef een geldig decimaal getal."
+
+#: core/validators.py:463
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Zorg ervoor dat het bestand minstens %s bytes groot is."
+
+#: core/validators.py:464
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Zorg ervoor dat het bestand hoogstens %s bytes groot is."
+
+#: core/validators.py:481
+msgid "The format for this field is wrong."
+msgstr "Het formaat van dit veld is foutief."
+
+#: core/validators.py:496
+msgid "This field is invalid."
+msgstr "Dit veld is ongeldig."
+
+#: core/validators.py:532
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Kan niks ophalen van %s."
+
+#: core/validators.py:535
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"De geretourneerde URL %(url)s bevat een ongeldige Content-Type '%"
+"(contenttype)s."
+
+#: core/validators.py:568
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Sluit de niet gesloten %(tag)s tag op regel %(line)s. (Regel start met \"%"
+"(start)s\".)"
+
+#: core/validators.py:572
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Tekst beginnend op regel %(line)s is in deze context niet toegestaan. (Regel "
+"start met \"%(start)s\".)"
+
+#: core/validators.py:577
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"%(attr)s\" op regel %(line)s is een ongeldig attribuut. (Regel start met "
+"\"%(start)s\".)"
+
+#: core/validators.py:582
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\" op regel %(line)s is een ongeldige tag. (Regel start met \"%"
+"(start)s\".)"
+
+#: core/validators.py:586
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Een of meerdere attributen ontbreken bij een tag op regel %(line)s. (Regel "
+"start met \"%(start)s\".)"
+
+#: core/validators.py:591
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"De \"%(attr)s\" attribuut op regel %(line)s heeft een ongeldige waarde. "
+"(Regel start met \"%(start)s\".)"
+
+#: db/models/manipulators.py:304
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr ""
+"%(object)s van het type %(type)s bestaat al voor het gegeven %(field)s."
+
+#: db/models/fields/__init__.py:46
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s met deze %(fieldname)s bestaat al."
+
+#: db/models/fields/__init__.py:320 db/models/fields/files.py:168
+#: db/models/fields/files.py:179 forms/fields.py:52 oldforms/__init__.py:370
+msgid "This field is required."
+msgstr "Dit veld is verplicht."
+
+#: db/models/fields/__init__.py:434
+msgid "This value must be an integer."
+msgstr "De waarde moet een geheel getal zijn."
+
+#: db/models/fields/__init__.py:480
+msgid "This value must be either True or False."
+msgstr "De waarde moet of True (Waar) of False (Onwaar) zijn."
+
+#: db/models/fields/__init__.py:509
+msgid "This field cannot be null."
+msgstr "Dit veld mag niet leeg zijn."
+
+#: db/models/fields/__init__.py:611 db/models/fields/__init__.py:628
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format."
+msgstr "Geef geldige datum/tijd in JJJJ-MM-DD UU:MM[:ss[.uuuuuu]] formaat."
+
+#: db/models/fields/__init__.py:684
+msgid "This value must be a decimal number."
+msgstr "De waarde moet een getal zijn."
+
+#: db/models/fields/__init__.py:825
+msgid "This value must be either None, True or False."
+msgstr "De waarde moet of None (leeg), True (Waar) of False (Onwaar) zijn."
+
+#: db/models/fields/__init__.py:937 db/models/fields/__init__.py:950
+msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format."
+msgstr "Geef een geldige tijd in UU:MM[:ss[.uuuuuu]] formaat."
+
+#: db/models/fields/files.py:188
+msgid "Enter a valid filename."
+msgstr "Geef een geldige bestandsnaam."
+
+#: db/models/fields/related.py:92
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Geef een geldig %s veld."
+
+#: db/models/fields/related.py:759
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Houd \"Control\", of \"Command\" op een Mac, ingedrukt om meerdere te "
+"selecteren."
+
+#: db/models/fields/related.py:839
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "Geef een geldig %(self)s IDs. De waarde %(value)r is ongeldig."
+msgstr[1] "Geef een geldig %(self)s IDs. De waarden %(value)r zijn ongeldig."
+
+#: forms/fields.py:53
+msgid "Enter a valid value."
+msgstr "Geef een geldige waarde."
+
+#: forms/fields.py:133
+#, python-format
+msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+msgstr ""
+"Zorg ervoor dat waarde korter is dan %(max)d tekens (huidige lengte %(length)"
+"d)."
+
+#: forms/fields.py:134
+#, python-format
+msgid "Ensure this value has at least %(min)d characters (it has %(length)d)."
+msgstr ""
+"Zorg ervoor dat uw tekst langer is dan %(min)d tekens (huidige lengte %"
+"(length)d)."
+
+#: forms/fields.py:162 forms/fields.py:191 forms/fields.py:220
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Zorg ervoor dat de waarde kleiner of gelijk is aan %s."
+
+#: forms/fields.py:163 forms/fields.py:192 forms/fields.py:221
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Zorg ervoor de waarde groter of gelijk is aan %s."
+
+#: forms/fields.py:190 forms/fields.py:219
+msgid "Enter a number."
+msgstr "Geef een getal op."
+
+#: forms/fields.py:222
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr "Zorg dat er minder dan %s cijfers zijn."
+
+#: forms/fields.py:223
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr "Zorg dat er minder dan %s cijfers na de komma zijn."
+
+#: forms/fields.py:224
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr "Zorg dat er minder dan %s cijfers voor de komma zijn."
+
+#: forms/fields.py:282 forms/fields.py:803
+msgid "Enter a valid date."
+msgstr "Geef een geldige datum op."
+
+#: forms/fields.py:315 forms/fields.py:804
+msgid "Enter a valid time."
+msgstr "Geef een geldige tijd op."
+
+#: forms/fields.py:354
+msgid "Enter a valid date/time."
+msgstr "Geef een geldige datum/tijd op."
+
+#: forms/fields.py:441
+msgid "No file was submitted."
+msgstr "Geen bestand werd aangeboden."
+
+#: forms/fields.py:442 oldforms/__init__.py:689
+msgid "The submitted file is empty."
+msgstr "Het gegeven bestand is leeg."
+
+#: forms/fields.py:532
+msgid "Enter a valid URL."
+msgstr "Geef een geldige URL op."
+
+#: forms/fields.py:533
+msgid "This URL appears to be a broken link."
+msgstr "Deze URL lijkt niet te werken."
+
+#: forms/fields.py:601 forms/fields.py:652
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "Selecteer een geldige keuze. %(value)s is geen beschikbare keuze."
+
+#: forms/fields.py:653 forms/fields.py:714 forms/models.py:528
+msgid "Enter a list of values."
+msgstr "Geef een lijst op met waardes."
+
+#: forms/fields.py:832
+msgid "Enter a valid IPv4 address."
+msgstr "Geef een geldig IPv4-adres op."
+
+#: forms/models.py:461
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Selecteer een geldige keuze. Deze keuze is niet beschikbaar."
+
+#: forms/models.py:529
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Selecteer een geldige keuze. %s is geen beschikbare keuze."
+
+#: oldforms/__init__.py:405
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Zorg ervoor dat uw tekst korter is dan %s karakter."
+msgstr[1] "Zorg ervoor dat uw tekst korter is dan %s karakters."
+
+#: oldforms/__init__.py:410
+msgid "Line breaks are not allowed here."
+msgstr "Regeleindes zijn niet toegestaan."
+
+#: oldforms/__init__.py:508 oldforms/__init__.py:582 oldforms/__init__.py:621
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Selecteer een geldige keuze; '%(data)s is niet in %(choices)s."
+
+#: oldforms/__init__.py:750
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Geef een geheel getal op tussen -32.768 en 32.767."
+
+#: oldforms/__init__.py:760
+msgid "Enter a positive number."
+msgstr "Geef een geheel getal op."
+
+#: oldforms/__init__.py:770
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Geef een geheel getal op tussen 0 en 32.767."
+
+#: template/defaultfilters.py:698
+msgid "yes,no,maybe"
+msgstr "ja,nee,misschien"
+
+#: template/defaultfilters.py:729
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d byte"
+msgstr[1] "%(size)d bytes"
+
+#: template/defaultfilters.py:731
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f KB"
+
+#: template/defaultfilters.py:733
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: template/defaultfilters.py:734
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#: utils/dateformat.py:41
+msgid "p.m."
+msgstr "p.m."
+
+#: utils/dateformat.py:42
+msgid "a.m."
+msgstr "a.m."
+
+#: utils/dateformat.py:47
+msgid "PM"
+msgstr "PM"
+
+#: utils/dateformat.py:48
+msgid "AM"
+msgstr "AM"
+
+#: utils/dateformat.py:97
+msgid "midnight"
+msgstr "middernacht"
+
+#: utils/dateformat.py:99
+msgid "noon"
+msgstr "middag"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "maandag"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "dinsdag"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "woensdag"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "donderdag"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "vrijdag"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "zaterdag"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "zondag"
+
+#: utils/dates.py:10
+msgid "Mon"
+msgstr "ma"
+
+#: utils/dates.py:10
+msgid "Tue"
+msgstr "di"
+
+#: utils/dates.py:10
+msgid "Wed"
+msgstr "woe"
+
+#: utils/dates.py:10
+msgid "Thu"
+msgstr "don"
+
+#: utils/dates.py:10
+msgid "Fri"
+msgstr "vrij"
+
+#: utils/dates.py:11
+msgid "Sat"
+msgstr "zat"
+
+#: utils/dates.py:11
+msgid "Sun"
+msgstr "zon"
+
+#: utils/dates.py:18
+msgid "January"
+msgstr "januari"
+
+#: utils/dates.py:18
+msgid "February"
+msgstr "februari"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "March"
+msgstr "maart"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "April"
+msgstr "april"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "May"
+msgstr "mei"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "June"
+msgstr "juni"
+
+#: utils/dates.py:19 utils/dates.py:31
+msgid "July"
+msgstr "juli"
+
+#: utils/dates.py:19
+msgid "August"
+msgstr "augustus"
+
+#: utils/dates.py:19
+msgid "September"
+msgstr "september"
+
+#: utils/dates.py:19
+msgid "October"
+msgstr "oktober"
+
+#: utils/dates.py:19
+msgid "November"
+msgstr "november"
+
+#: utils/dates.py:20
+msgid "December"
+msgstr "december"
+
+#: utils/dates.py:23
+msgid "jan"
+msgstr "jan"
+
+#: utils/dates.py:23
+msgid "feb"
+msgstr "feb"
+
+#: utils/dates.py:23
+msgid "mar"
+msgstr "mrt"
+
+#: utils/dates.py:23
+msgid "apr"
+msgstr "apr"
+
+#: utils/dates.py:23
+msgid "may"
+msgstr "mei"
+
+#: utils/dates.py:23
+msgid "jun"
+msgstr "jun"
+
+#: utils/dates.py:24
+msgid "jul"
+msgstr "jul"
+
+#: utils/dates.py:24
+msgid "aug"
+msgstr "aug"
+
+#: utils/dates.py:24
+msgid "sep"
+msgstr "sep"
+
+#: utils/dates.py:24
+msgid "oct"
+msgstr "okt"
+
+#: utils/dates.py:24
+msgid "nov"
+msgstr "nov"
+
+#: utils/dates.py:24
+msgid "dec"
+msgstr "dec"
+
+#: utils/dates.py:31
+msgid "Jan."
+msgstr "jan."
+
+#: utils/dates.py:31
+msgid "Feb."
+msgstr "feb."
+
+#: utils/dates.py:32
+msgid "Aug."
+msgstr "aug."
+
+#: utils/dates.py:32
+msgid "Sept."
+msgstr "sept."
+
+#: utils/dates.py:32
+msgid "Oct."
+msgstr "okt."
+
+#: utils/dates.py:32
+msgid "Nov."
+msgstr "nov."
+
+#: utils/dates.py:32
+msgid "Dec."
+msgstr "dec."
+
+#: utils/text.py:128
+msgid "or"
+msgstr "of"
+
+#: utils/timesince.py:21
+msgid "year"
+msgid_plural "years"
+msgstr[0] "jaar"
+msgstr[1] "jaren"
+
+#: utils/timesince.py:22
+msgid "month"
+msgid_plural "months"
+msgstr[0] "maand"
+msgstr[1] "maanden"
+
+#: utils/timesince.py:23
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "week"
+msgstr[1] "weken"
+
+#: utils/timesince.py:24
+msgid "day"
+msgid_plural "days"
+msgstr[0] "dag"
+msgstr[1] "dagen"
+
+# In the timesince context it is stilistically wrong to use the plural for hour in Dutch.
+#: utils/timesince.py:25
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "uur"
+msgstr[1] "uur"
+
+#: utils/timesince.py:26
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuut"
+msgstr[1] "minuten"
+
+#: utils/timesince.py:46
+msgid "minutes"
+msgstr "minuten"
+
+#: utils/timesince.py:51
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr "%(number)d %(type)s"
+
+#: utils/timesince.py:57
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ", %(number)d %(type)s"
+
+#: utils/translation/trans_real.py:401
+msgid "DATE_FORMAT"
+msgstr "j-n-Y"
+
+#: utils/translation/trans_real.py:402
+msgid "DATETIME_FORMAT"
+msgstr "j-n-Y H:i"
+
+#: utils/translation/trans_real.py:403
+msgid "TIME_FORMAT"
+msgstr "H:i"
+
+#: utils/translation/trans_real.py:419
+msgid "YEAR_MONTH_FORMAT"
+msgstr "F Y"
+
+#: utils/translation/trans_real.py:420
+msgid "MONTH_DAY_FORMAT"
+msgstr "j F"
+
+#: views/generic/create_update.py:114
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "De %(verbose_name)s is succesvol aangemaakt."
+
+#: views/generic/create_update.py:156
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "De %(verbose_name)s is succesvol aangepast."
+
+#: views/generic/create_update.py:198
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "De %(verbose_name)s is verwijderd."
diff --git a/webapp/django/conf/locale/nl/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/nl/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..22015ed
--- /dev/null
+++ b/webapp/django/conf/locale/nl/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/nl/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/nl/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..e9a5d66
--- /dev/null
+++ b/webapp/django/conf/locale/nl/LC_MESSAGES/djangojs.po
@@ -0,0 +1,115 @@
+# Dutch Javascript translations.
+# Copyright (C) 2006
+# This file is distributed under the same license as the Django package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-27 10:34+0100\n"
+"PO-Revision-Date: 2008-02-27 11:22+0100\n"
+"Last-Translator: jdetaeye <jdetaeye@frepple.com>\n"
+"Language-Team: nl <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "Beschikbare %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Kies allemaal"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Toevoegen"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Verwijderen"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Gekozen %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Selecteer uw keuze(s) en klik "
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Allemaal verwijderen"
+
+#: contrib/admin/media/js/calendar.js:24
+#: contrib/admin/media/js/dateparse.js:32
+msgid "January February March April May June July August September October November December"
+msgstr "januari februari maart april mei juni juli augustus september oktober november december"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "Z M D W D V Z"
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "zondag maandag dinsdag woensdag donderdag vrijdag zaterdag"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr "Tonen"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr "Verbergen"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Now"
+msgstr "Nu"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
+msgid "Clock"
+msgstr "Klok"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
+msgid "Choose a time"
+msgstr "Kies een tijd"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "Midnight"
+msgstr "Middernacht"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "6 a.m."
+msgstr "6 uur"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
+msgid "Noon"
+msgstr "12 uur"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
+msgid "Cancel"
+msgstr "Annuleren"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
+msgid "Today"
+msgstr "Vandaag"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
+msgid "Calendar"
+msgstr "Kalender"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
+msgid "Yesterday"
+msgstr "Gisteren"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
+msgid "Tomorrow"
+msgstr "Morgen"
+
diff --git a/webapp/django/conf/locale/no/LC_MESSAGES/django.mo b/webapp/django/conf/locale/no/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..371dab5
--- /dev/null
+++ b/webapp/django/conf/locale/no/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/no/LC_MESSAGES/django.po b/webapp/django/conf/locale/no/LC_MESSAGES/django.po
new file mode 100644
index 0000000..e96f104
--- /dev/null
+++ b/webapp/django/conf/locale/no/LC_MESSAGES/django.po
@@ -0,0 +1,4502 @@
+# translation of django.po to norwegian
+# Copyright (C) 2005 and beyond
+# This file is distributed under the same license as the Django package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-05-16 10:12+0200\n"
+"PO-Revision-Date: 2008-08-19 21:57+0200\n"
+"Last-Translator: Christian Mikalsen and Jon Lønne\n"
+"Language-Team: Norsk <no@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: conf/global_settings.py:44
+msgid "Arabic"
+msgstr "Arabisk"
+
+#: conf/global_settings.py:45
+msgid "Bengali"
+msgstr "Bengalsk"
+
+#: conf/global_settings.py:46
+msgid "Bulgarian"
+msgstr "Bulgarsk"
+
+#: conf/global_settings.py:47
+msgid "Catalan"
+msgstr "Katalansk"
+
+#: conf/global_settings.py:48
+msgid "Czech"
+msgstr "Tsjekkisk"
+
+#: conf/global_settings.py:49
+msgid "Welsh"
+msgstr "Walisisk"
+
+#: conf/global_settings.py:50
+msgid "Danish"
+msgstr "Dansk"
+
+#: conf/global_settings.py:51
+msgid "German"
+msgstr "Tysk"
+
+#: conf/global_settings.py:52
+msgid "Greek"
+msgstr "Gresk"
+
+#: conf/global_settings.py:53
+msgid "English"
+msgstr "Engelsk"
+
+#: conf/global_settings.py:54
+msgid "Spanish"
+msgstr "Spansk"
+
+#: conf/global_settings.py:55
+msgid "Estonian"
+msgstr "Estisk"
+
+#: conf/global_settings.py:56
+msgid "Argentinean Spanish"
+msgstr "Argentinsk spansk"
+
+#: conf/global_settings.py:57
+msgid "Basque"
+msgstr "Baskisk"
+
+#: conf/global_settings.py:58
+msgid "Persian"
+msgstr "Persisk"
+
+#: conf/global_settings.py:59
+msgid "Finnish"
+msgstr "Finsk"
+
+#: conf/global_settings.py:60
+msgid "French"
+msgstr "Fransk"
+
+#: conf/global_settings.py:61
+msgid "Irish"
+msgstr "Irsk"
+
+#: conf/global_settings.py:62
+msgid "Galician"
+msgstr "Galisisk"
+
+#: conf/global_settings.py:63
+msgid "Hungarian"
+msgstr "Ungarsk"
+
+#: conf/global_settings.py:64
+msgid "Hebrew"
+msgstr "Hebraisk"
+
+#: conf/global_settings.py:65
+msgid "Croatian"
+msgstr "Kroatisk"
+
+#: conf/global_settings.py:66
+msgid "Icelandic"
+msgstr "Islandsk"
+
+#: conf/global_settings.py:67
+msgid "Italian"
+msgstr "Italiensk"
+
+#: conf/global_settings.py:68
+msgid "Japanese"
+msgstr "Japansk"
+
+#: conf/global_settings.py:69
+msgid "Georgian"
+msgstr "Georgisk"
+
+#: conf/global_settings.py:70
+msgid "Korean"
+msgstr "Koreansk"
+
+#: conf/global_settings.py:71
+msgid "Khmer"
+msgstr "Khmer"
+
+#: conf/global_settings.py:72
+msgid "Kannada"
+msgstr "Kannada"
+
+#: conf/global_settings.py:73
+msgid "Latvian"
+msgstr "Latvisk"
+
+#: conf/global_settings.py:74
+msgid "Lithuanian"
+msgstr "Litauisk"
+
+#: conf/global_settings.py:75
+msgid "Macedonian"
+msgstr "Makedonsk"
+
+#: conf/global_settings.py:76
+msgid "Dutch"
+msgstr "Nederlandsk"
+
+#: conf/global_settings.py:77
+msgid "Norwegian"
+msgstr "Norsk"
+
+#: conf/global_settings.py:78
+msgid "Polish"
+msgstr "Polsk"
+
+#: conf/global_settings.py:79
+msgid "Portugese"
+msgstr "Portugisisk"
+
+#: conf/global_settings.py:80
+msgid "Brazilian Portuguese"
+msgstr "Brasiliansk portugisisk"
+
+#: conf/global_settings.py:81
+msgid "Romanian"
+msgstr "Rumensk"
+
+#: conf/global_settings.py:82
+msgid "Russian"
+msgstr "Russisk"
+
+#: conf/global_settings.py:83
+msgid "Slovak"
+msgstr "Slovakisk"
+
+#: conf/global_settings.py:84
+msgid "Slovenian"
+msgstr "Slovensk"
+
+#: conf/global_settings.py:85
+msgid "Serbian"
+msgstr "Serbisk"
+
+#: conf/global_settings.py:86
+msgid "Swedish"
+msgstr "Svensk"
+
+#: conf/global_settings.py:87
+msgid "Tamil"
+msgstr "Tamil"
+
+#: conf/global_settings.py:88
+msgid "Telugu"
+msgstr "Telugu"
+
+#: conf/global_settings.py:89
+msgid "Turkish"
+msgstr "Tyrkisk"
+
+#: conf/global_settings.py:90
+msgid "Ukrainian"
+msgstr "Ukrainsk"
+
+#: conf/global_settings.py:91
+msgid "Simplified Chinese"
+msgstr "Simplifisert kinesisk"
+
+#: conf/global_settings.py:92
+msgid "Traditional Chinese"
+msgstr "Tradisjonell kinesisk"
+
+#: contrib/admin/filterspecs.py:44
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Etter %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:74 contrib/admin/filterspecs.py:92
+#: contrib/admin/filterspecs.py:147 contrib/admin/filterspecs.py:173
+msgid "All"
+msgstr "Alle"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Any date"
+msgstr "Når som helst"
+
+#: contrib/admin/filterspecs.py:114
+msgid "Today"
+msgstr "I dag"
+
+#: contrib/admin/filterspecs.py:117
+msgid "Past 7 days"
+msgstr "Siste syv dager"
+
+#: contrib/admin/filterspecs.py:119
+msgid "This month"
+msgstr "Denne måneden"
+
+#: contrib/admin/filterspecs.py:121
+msgid "This year"
+msgstr "I år"
+
+#: contrib/admin/filterspecs.py:147 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "Yes"
+msgstr "Ja"
+
+#: contrib/admin/filterspecs.py:147 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "No"
+msgstr "Nei"
+
+#: contrib/admin/filterspecs.py:154 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "Unknown"
+msgstr "Ukjent"
+
+#: contrib/admin/models.py:19
+msgid "action time"
+msgstr "tid for handling"
+
+#: contrib/admin/models.py:22
+msgid "object id"
+msgstr "objekt-ID"
+
+#: contrib/admin/models.py:23
+msgid "object repr"
+msgstr "objekt repr"
+
+#: contrib/admin/models.py:24
+msgid "action flag"
+msgstr "handlingsflagg"
+
+#: contrib/admin/models.py:25
+msgid "change message"
+msgstr "endre melding"
+
+#: contrib/admin/models.py:28
+msgid "log entry"
+msgstr "logginnlegg"
+
+#: contrib/admin/models.py:29
+msgid "log entries"
+msgstr "logginnlegg"
+
+#: contrib/admin/options.py:56 contrib/admin/options.py:115
+msgid "None"
+msgstr "Ingen"
+
+#: contrib/admin/options.py:326
+#, python-format
+msgid "Changed %s."
+msgstr "Endret %s."
+
+#: contrib/admin/options.py:326 contrib/admin/options.py:336
+#: core/validators.py:279 db/models/manipulators.py:305
+msgid "and"
+msgstr "og"
+
+#: contrib/admin/options.py:331
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Opprettet %(name)s \"%(object)s\"."
+
+#: contrib/admin/options.py:335
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Endret %(list)s for %(name)s \"%(object)s\"."
+
+#: contrib/admin/options.py:340
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Slettet %(name)s \"%(object)s\"."
+
+#: contrib/admin/options.py:344
+msgid "No fields changed."
+msgstr "Ingen felt endret."
+
+#: contrib/admin/options.py:405 contrib/auth/admin.py:50
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" ble opprettet."
+
+#: contrib/admin/options.py:409 contrib/admin/options.py:442
+#: contrib/auth/admin.py:55
+msgid "You may edit it again below."
+msgstr "Du kan redigere videre nedenfor."
+
+#: contrib/admin/options.py:419 contrib/admin/options.py:452
+#, python-format
+msgid "You may add another %s below."
+msgstr "Du kan opprette ny %s under."
+
+#: contrib/admin/options.py:440
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" ble endret."
+
+#: contrib/admin/options.py:448
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" ble endret. Du kan redigere det igjen under."
+
+#: contrib/admin/options.py:514
+#, python-format
+msgid "Add %s"
+msgstr "Opprett %s"
+
+#: contrib/admin/options.py:591
+#, python-format
+msgid "Change %s"
+msgstr "Rediger %s"
+
+#: contrib/admin/options.py:622
+msgid "Database error"
+msgstr "Databasefeil"
+
+#: contrib/admin/options.py:671
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" ble slettet."
+
+#: contrib/admin/options.py:678
+msgid "Are you sure?"
+msgstr "Er du sikker?"
+
+#: contrib/admin/options.py:705
+#, python-format
+msgid "Change history: %s"
+msgstr "Endringshistorikk: %s"
+
+#: contrib/admin/sites.py:18 contrib/admin/views/decorators.py:16
+#: contrib/auth/forms.py:72 contrib/comments/views/comments.py:56
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Vennligst angi korrekt brukernavn og passord. Merk at det er forskjell på "
+"små og store bokstaver."
+
+#: contrib/admin/sites.py:238 contrib/admin/views/decorators.py:68
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Du må logge inn igjen, fordi økten din har blitt tidsavbrutt. Slapp av, "
+"innlegget ditt ble lagret."
+
+#: contrib/admin/sites.py:245 contrib/admin/views/decorators.py:75
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Det ser ut som om nettleseren din ikke støtter informasjonskapsler "
+"(cookies). Vennligst konfigurer nettleseren din og prøv igjen."
+
+#: contrib/admin/sites.py:259 contrib/admin/sites.py:265
+#: contrib/admin/views/decorators.py:92
+msgid "Usernames cannot contain the '@' character."
+msgstr "Brukernavnet kan ikke inneholde tegnet '@'."
+
+#: contrib/admin/sites.py:262 contrib/admin/views/decorators.py:88
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "E-postadressen er ikke brukernavnet ditt, prøv '%s' isteden."
+
+#: contrib/admin/sites.py:330
+msgid "Site administration"
+msgstr "Nettstedsadministrasjon"
+
+#: contrib/admin/sites.py:352 contrib/admin/templates/admin/login.html:27
+#: contrib/admin/templates/registration/password_reset_complete.html:14
+#: contrib/admin/views/decorators.py:30
+msgid "Log in"
+msgstr "Logg inn"
+
+#: contrib/admin/util.py:138
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "En eller flere %(fieldname)s i %(name)s: %(obj)s"
+
+#: contrib/admin/util.py:143
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "En eller flere %(fieldname)s i %(name)s:"
+
+#: contrib/admin/widgets.py:65
+msgid "Date:"
+msgstr "Dato:"
+
+#: contrib/admin/widgets.py:65
+msgid "Time:"
+msgstr "Tid:"
+
+#: contrib/admin/widgets.py:89
+msgid "Currently:"
+msgstr "Nå:"
+
+#: contrib/admin/widgets.py:89
+msgid "Change:"
+msgstr "Endre:"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Fant ikke siden"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Beklager, men siden du spør etter finnes ikke."
+
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/change_form.html:17
+#: contrib/admin/templates/admin/change_list.html:8
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/auth/user/change_password.html:10
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_reset_complete.html:4
+#: contrib/admin/templates/registration/password_reset_confirm.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Hjem"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Tjenerfeil"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Tjenerfeil (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Tjenerfeil <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Det har oppstått en feil. Feilen er blitt rapportert til administrator via e-"
+"post, og vil bli fikset snart. Takk for din tålmodighet."
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "Velkommen,"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Dokumentasjon"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:13
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+msgid "Change password"
+msgstr "Endre passord"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/comments/templates/comments/form.html:6
+msgid "Log out"
+msgstr "Logg ut"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django administrasjonsside"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django-administrasjon"
+
+#: contrib/admin/templates/admin/change_form.html:19
+#: contrib/admin/templates/admin/index.html:29
+msgid "Add"
+msgstr "Opprett"
+
+#: contrib/admin/templates/admin/change_form.html:26
+#: contrib/admin/templates/admin/object_history.html:5
+msgid "History"
+msgstr "Historikk"
+
+#: contrib/admin/templates/admin/change_form.html:27
+msgid "View on site"
+msgstr "Vis på nettside"
+
+#: contrib/admin/templates/admin/change_form.html:37
+#: contrib/admin/templates/admin/auth/user/change_password.html:22
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Vennligst korriger feilen under."
+msgstr[1] "Vennligst korriger feilene under."
+
+#: contrib/admin/templates/admin/change_list.html:16
+#, python-format
+msgid "Add %(name)s"
+msgstr "Opprett %(name)s"
+
+#: contrib/admin/templates/admin/change_list.html:26
+msgid "Filter"
+msgstr "Filtrering"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+#: contrib/admin/templates/admin/edit_inline/tabular.html:15
+msgid "Delete"
+msgstr "Slett"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:15
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Hvis du sletter %(object_name)s '%(escaped_object)s', vil også slette "
+"relaterte objekter, men du har ikke tillatelse til å slette følgende "
+"objekttyper:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:22
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Er du sikker på at du vil slette %(object_name)s \"%(escaped_object)s\"? "
+"Alle de følgende relaterte objektene vil bli slettet:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:27
+msgid "Yes, I'm sure"
+msgstr "Ja, jeg er sikker"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "Etter %(filter_title)s "
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Modeller tilgjengelig i %(name)s-applikasjonen."
+
+#: contrib/admin/templates/admin/index.html:19
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:35
+msgid "Change"
+msgstr "Endre"
+
+#: contrib/admin/templates/admin/index.html:45
+msgid "You don't have permission to edit anything."
+msgstr "Du har ikke rettigheter til å redigere noe."
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "Recent Actions"
+msgstr "Siste handlinger"
+
+#: contrib/admin/templates/admin/index.html:54
+msgid "My Actions"
+msgstr "Mine handlinger"
+
+#: contrib/admin/templates/admin/index.html:58
+msgid "None available"
+msgstr "Ingen tilgjengelige"
+
+#: contrib/admin/templates/admin/invalid_setup.html:7
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Noe er galt med databaseinstallasjonen din. Sørg for at databasetabellene er "
+"opprettet og at brukeren har de nødvendige rettigheter."
+
+#: contrib/admin/templates/admin/login.html:19
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+msgid "Username:"
+msgstr "Brukernavn:"
+
+#: contrib/admin/templates/admin/login.html:22
+#: contrib/comments/templates/comments/form.html:8
+msgid "Password:"
+msgstr "Passord:"
+
+#: contrib/admin/templates/admin/object_history.html:16
+msgid "Date/time"
+msgstr "Dato/tid"
+
+#: contrib/admin/templates/admin/object_history.html:17
+msgid "User"
+msgstr "Bruker"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Action"
+msgstr "Handling"
+
+#: contrib/admin/templates/admin/object_history.html:24
+msgid "DATE_WITH_TIME_FULL"
+msgstr "H:i, j. M Y"
+
+#: contrib/admin/templates/admin/object_history.html:32
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Dette objektet har ingen endringshistorikk. Det var sannsynligvis ikke "
+"opprettet med administrasjonssiden."
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Vis alle"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Gå"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "Ett resultat"
+msgstr[1] "%(counter)s resultater"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s totalt"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Lagre som ny"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Lagre og opprett ny"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Lagre og fortsett å redigere"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Lagre"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Skriv først inn brukernavn og passord. Deretter vil du få mulighet til å "
+"endre flere brukerinnstillinger."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:13
+#: contrib/auth/forms.py:14 contrib/auth/forms.py:51
+msgid "Username"
+msgstr "Brukernavn"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:20
+#: contrib/admin/templates/admin/auth/user/change_password.html:33
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:52 contrib/auth/forms.py:176
+msgid "Password"
+msgstr "Passord"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:26
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+#: contrib/auth/forms.py:177
+msgid "Password (again)"
+msgstr "Passord (gjenta)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:27
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+msgid "Enter the same password as above, for verification."
+msgstr "Skriv inn det samme passordet som ovenfor, for verifisering."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:26
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Skriv inn et nytt passord for brukeren <strong>%(username)s</strong>."
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Takk for at du valgte å bruke kvalitetstid på nettstedet i dag."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Logg inn igjen"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Endre passord"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Passord endret"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Ditt passord ble endret."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Venligst oppgi ditt gamle passord av sikkerhetsgrunner. Oppgi deretter "
+"ditt nye passord to ganger, slik at vi kan kontrollere at det er korrekt."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Gammelt passord:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+#: contrib/admin/templates/registration/password_reset_confirm.html:18
+msgid "New password:"
+msgstr "Nytt passord:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+#: contrib/admin/templates/registration/password_reset_confirm.html:20
+msgid "Confirm password:"
+msgstr "Gjenta nytt passord:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+#: contrib/admin/templates/registration/password_reset_confirm.html:21
+msgid "Change my password"
+msgstr "Endre passord"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:4
+#: contrib/admin/templates/registration/password_reset_confirm.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+msgid "Password reset"
+msgstr "Nullstill passord"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:6
+#: contrib/admin/templates/registration/password_reset_complete.html:10
+msgid "Password reset complete"
+msgstr "Passord nullstilt"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:12
+msgid "Your password has been set.  You may go ahead and log in now."
+msgstr "Passordet ditt er satt. Du kan nå logge inn."
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:4
+msgid "Password reset confirmation"
+msgstr "Bekreftelse på nullstilt passord"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:12
+msgid "Enter new password"
+msgstr "Oppgi nytt passord"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:14
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Venligst oppgi ditt nye passord to ganger, for å sikre at du oppgir det "
+"korrekt."
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:26
+msgid "Password reset unsuccessful"
+msgstr "Passordet ble ikke nullstilt"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:28
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used.  Please request a new password reset."
+msgstr ""
+"Nullstillingslinken er ugyldig, kanskje fordi den allerede har vært brukt. "
+"Vennligst nullstill passordet ditt på nytt."
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Passordet ble nullstilt"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed you instructions for setting your password to the e-mail "
+"address you submitted. You should be receiving it shortly."
+msgstr ""
+"Vi har sendt deg en e-post med instruksjoner for nullstilling av passord. Du "
+"bør motta den om kort tid."
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr ""
+"Du har mottatt denne e-posten fordi du har bedt om nullstilling av passordet "
+"ditt"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "for din konto på %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+msgid "Please go to the following page and choose a new password:"
+msgstr "Vennligst gå til følgende side og velg et nytt passord:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:9
+msgid "Your username, in case you've forgotten:"
+msgstr "Brukernavnet ditt, i tilfelle du har glemt det:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Thanks for using our site!"
+msgstr "Takk for at du bruker siden vår!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Hilsen %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll e-mail "
+"instructions for setting a new one."
+msgstr ""
+"Glemt passordet ditt? Oppgi e-postadressen din under, så sender vi deg en e-"
+"post med instruksjoner for nullstilling av passord."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "E-postadresse:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Nullstill mitt passord"
+
+#: contrib/admin/templatetags/admin_list.py:284
+msgid "All dates"
+msgstr "Alle datoer"
+
+#: contrib/admin/views/main.py:65
+#, python-format
+msgid "Select %s"
+msgstr "Velg %s"
+
+#: contrib/admin/views/main.py:65
+#, python-format
+msgid "Select %s to change"
+msgstr "Velg %s du ønsker å redigere"
+
+#: contrib/admin/views/template.py:36 contrib/sites/models.py:38
+msgid "site"
+msgstr "nettside"
+
+#: contrib/admin/views/template.py:38
+msgid "template"
+msgstr "mal"
+
+#: contrib/admindocs/views.py:53 contrib/admindocs/views.py:55
+#: contrib/admindocs/views.py:57
+msgid "tag:"
+msgstr "tag:"
+
+#: contrib/admindocs/views.py:87 contrib/admindocs/views.py:89
+#: contrib/admindocs/views.py:91
+msgid "filter:"
+msgstr "filter:"
+
+#: contrib/admindocs/views.py:153 contrib/admindocs/views.py:155
+#: contrib/admindocs/views.py:157
+msgid "view:"
+msgstr "view:"
+
+#: contrib/admindocs/views.py:187
+#, python-format
+msgid "App %r not found"
+msgstr "Fant ikke applikasjonen %r"
+
+#: contrib/admindocs/views.py:194
+#, python-format
+msgid "Model %(model_name)r not found in app %(app_label)r"
+msgstr "Fant ikke modellen %(model_name)r i applikasjonen %(app_label)r"
+
+#: contrib/admindocs/views.py:206
+#, python-format
+msgid "the related `%(app_label)s.%(data_type)s` object"
+msgstr "det relaterte `%(app_label)s.%(data_type)s`-objektet"
+
+#: contrib/admindocs/views.py:206 contrib/admindocs/views.py:228
+#: contrib/admindocs/views.py:242 contrib/admindocs/views.py:247
+msgid "model:"
+msgstr "modell:"
+
+#: contrib/admindocs/views.py:237
+#, python-format
+msgid "related `%(app_label)s.%(object_name)s` objects"
+msgstr "relaterte `%(app_label)s.%(object_name)s`-objekter"
+
+#: contrib/admindocs/views.py:242
+#, python-format
+msgid "all %s"
+msgstr "alle %s"
+
+#: contrib/admindocs/views.py:247
+#, python-format
+msgid "number of %s"
+msgstr "antall %s"
+
+#: contrib/admindocs/views.py:253
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Felter på %s-objekter"
+
+#: contrib/admindocs/views.py:317 contrib/admindocs/views.py:328
+#: contrib/admindocs/views.py:330 contrib/admindocs/views.py:336
+#: contrib/admindocs/views.py:337 contrib/admindocs/views.py:339
+msgid "Integer"
+msgstr "Heltall"
+
+#: contrib/admindocs/views.py:318
+msgid "Boolean (Either True or False)"
+msgstr "Boolsk (True eller False)"
+
+#: contrib/admindocs/views.py:319 contrib/admindocs/views.py:338
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Tekst (opp til %(max_length)s tegn)"
+
+#: contrib/admindocs/views.py:320
+msgid "Comma-separated integers"
+msgstr "Heltall adskilt med komma"
+
+#: contrib/admindocs/views.py:321
+msgid "Date (without time)"
+msgstr "Dato (uten tid)"
+
+#: contrib/admindocs/views.py:322
+msgid "Date (with time)"
+msgstr "Dato (med tid)"
+
+#: contrib/admindocs/views.py:323
+msgid "Decimal number"
+msgstr "Desimaltall"
+
+#: contrib/admindocs/views.py:324
+msgid "E-mail address"
+msgstr "E-postadresse"
+
+#: contrib/admindocs/views.py:325 contrib/admindocs/views.py:326
+#: contrib/admindocs/views.py:329
+msgid "File path"
+msgstr "Filsti"
+
+#: contrib/admindocs/views.py:327
+msgid "Floating point number"
+msgstr "Flyttall"
+
+#: contrib/admindocs/views.py:331 contrib/comments/models.py:89
+msgid "IP address"
+msgstr "IP-adresse"
+
+#: contrib/admindocs/views.py:333
+msgid "Boolean (Either True, False or None)"
+msgstr "Boolsk (True, False eller None)"
+
+#: contrib/admindocs/views.py:334
+msgid "Relation to parent model"
+msgstr "Relasjon til foreldermodell"
+
+#: contrib/admindocs/views.py:335
+msgid "Phone number"
+msgstr "Telefonnummer"
+
+#: contrib/admindocs/views.py:340
+msgid "Text"
+msgstr "Tekst"
+
+#: contrib/admindocs/views.py:341
+msgid "Time"
+msgstr "Tid"
+
+#: contrib/admindocs/views.py:342 contrib/flatpages/admin.py:8
+#: contrib/flatpages/models.py:8
+msgid "URL"
+msgstr "Nettadresse"
+
+#: contrib/admindocs/views.py:343
+msgid "U.S. state (two uppercase letters)"
+msgstr "Stat (i USA, to store bokstaver)"
+
+#: contrib/admindocs/views.py:344
+msgid "XML text"
+msgstr "XML-tekst"
+
+#: contrib/admindocs/views.py:370
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s ser ikke ut til å være et urlpattern-objekt"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Bokmerker"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:4
+msgid "Documentation bookmarklets"
+msgstr "Dokumentasjonsbokmerker"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:8
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">For å installere bokmerker, dra linken til verktøylinja\n"
+"for bokmerker, eller høyreklikk og legg til i bokmerker. Nå kan du du velge\n"
+"bokmerket fra hvilken som helst side på nettstedet. Noen av disse\n"
+"bokmerkene krever at datamaskinen du bruker er markert som \"intern\"\n"
+"(kontakt din systemadministrator hvis du er usikker på om maskinen din er "
+"\"intern\").</p>\n"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:18
+msgid "Documentation for this page"
+msgstr "Dokumentasjon for denne siden"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:19
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+"Hopp fra hvilken som helst side til dokumentasjonen for visningsfunksjonen "
+"som genererte den siden."
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:21
+msgid "Show object ID"
+msgstr "Vis objekt-ID"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:22
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Viser \"content-type\" og en unik ID for sider som representerer et enkelt "
+"objekt."
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:24
+msgid "Edit this object (current window)"
+msgstr "Endre dette objektet (nåværende vindu)"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:25
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+"Hopper til administrasjonssiden for sider som representerer et enkelt objekt."
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:27
+msgid "Edit this object (new window)"
+msgstr "Endre dette objektet (nytt vindu)"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:28
+msgid "As above, but opens the admin page in a new window."
+msgstr "Samme som over, men åpner administrasjonssiden i et nytt vindu."
+
+#: contrib/auth/admin.py:21
+msgid "Personal info"
+msgstr "Personlig informasjon"
+
+#: contrib/auth/admin.py:22
+msgid "Permissions"
+msgstr "Rettigheter"
+
+#: contrib/auth/admin.py:23
+msgid "Important dates"
+msgstr "Viktige datoer"
+
+#: contrib/auth/admin.py:24
+msgid "Groups"
+msgstr "Grupper"
+
+#: contrib/auth/admin.py:60
+msgid "Add user"
+msgstr "Opprett ny bruker"
+
+#: contrib/auth/admin.py:85
+msgid "Password changed successfully."
+msgstr "Passordet er endret."
+
+#: contrib/auth/admin.py:91
+#, python-format
+msgid "Change password: %s"
+msgstr "Endre passord: %s"
+
+#: contrib/auth/forms.py:15 contrib/auth/models.py:137
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr ""
+"Påkrevet. 30 tegn eller færre. Kun alfanumeriske tegn (bokstaver, tall og "
+"understreker)."
+
+#: contrib/auth/forms.py:16 core/validators.py:72
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Feltet kan kun inneholde bokstaver, nummer og understreker."
+
+#: contrib/auth/forms.py:18
+msgid "Password confirmation"
+msgstr "Passordbekreftelse"
+
+#: contrib/auth/forms.py:30
+msgid "A user with that username already exists."
+msgstr "Det eksisterer allerede en bruker med dette brukernavnet."
+
+#: contrib/auth/forms.py:36 contrib/auth/forms.py:146
+#: contrib/auth/forms.py:188
+msgid "The two password fields didn't match."
+msgstr "De to passordfeltene er ikke like."
+
+#: contrib/auth/forms.py:74 contrib/comments/views/comments.py:58
+msgid "This account is inactive."
+msgstr "Denne kontoen er inaktiv."
+
+#: contrib/auth/forms.py:79 contrib/comments/views/comments.py:49
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"Din nettleser ser ikke ut til å støtte informasjonskapsler (cookies). "
+"Informasjonskapsler er påkrevet for å logge inn."
+
+#: contrib/auth/forms.py:92
+msgid "E-mail"
+msgstr "E-post"
+
+#: contrib/auth/forms.py:101
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr ""
+"Den oppgitte e-postadressen er ikke registrert hos oss. Er du sikker på at "
+"du er registrert?"
+
+#: contrib/auth/forms.py:126
+#, python-format
+msgid "Password reset on %s"
+msgstr "Nullstilling av passord på %s"
+
+#: contrib/auth/forms.py:134
+msgid "New password"
+msgstr "Nytt passord"
+
+#: contrib/auth/forms.py:135
+msgid "New password confirmation"
+msgstr "Bekreft nytt passord"
+
+#: contrib/auth/forms.py:160
+msgid "Old password"
+msgstr "Gammelt passord"
+
+#: contrib/auth/forms.py:168
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Ditt gamle passord er galt. Vennligst prøv igjen."
+
+#: contrib/auth/models.py:73 contrib/auth/models.py:96
+msgid "name"
+msgstr "navn"
+
+#: contrib/auth/models.py:75
+msgid "codename"
+msgstr "kodenavn"
+
+#: contrib/auth/models.py:78
+msgid "permission"
+msgstr "rettighet"
+
+#: contrib/auth/models.py:79 contrib/auth/models.py:97
+msgid "permissions"
+msgstr "rettigheter"
+
+#: contrib/auth/models.py:100
+msgid "group"
+msgstr "gruppe"
+
+#: contrib/auth/models.py:101 contrib/auth/models.py:147
+msgid "groups"
+msgstr "grupper"
+
+#: contrib/auth/models.py:137
+msgid "username"
+msgstr "brukernavn"
+
+#: contrib/auth/models.py:138
+msgid "first name"
+msgstr "fornavn"
+
+#: contrib/auth/models.py:139
+msgid "last name"
+msgstr "etternavn"
+
+#: contrib/auth/models.py:140
+msgid "e-mail address"
+msgstr "e-postadresse"
+
+#: contrib/auth/models.py:141
+msgid "password"
+msgstr "passord"
+
+#: contrib/auth/models.py:141
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"Bruk '[algo]$[salt]$[hexdigest]' eller <a href=\"password/\">endre passord-"
+"skjemaet</a>."
+
+#: contrib/auth/models.py:142
+msgid "staff status"
+msgstr "administrasjonsstatus"
+
+#: contrib/auth/models.py:142
+msgid "Designates whether the user can log into this admin site."
+msgstr "Angir at brukeren kan logge inn på denne administrasjonssiden."
+
+#: contrib/auth/models.py:143
+msgid "active"
+msgstr "aktiv"
+
+#: contrib/auth/models.py:143
+msgid ""
+"Designates whether this user should be treated as active. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"Angir at denne brukeren er aktiv. Avmerk denne i stedet for å slette kontoen."
+
+#: contrib/auth/models.py:144
+msgid "superuser status"
+msgstr "superbruker"
+
+#: contrib/auth/models.py:144
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr ""
+"Angir at denne brukeren har alle rettigheter uten å eksplisitt sette de."
+
+#: contrib/auth/models.py:145
+msgid "last login"
+msgstr "siste innlogging"
+
+#: contrib/auth/models.py:146
+msgid "date joined"
+msgstr "registrert"
+
+#: contrib/auth/models.py:148
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"I tillegg til de rettighetene som blir angitt manuelt, får brukeren også "
+"rettighetene til gruppene han/hun er med i."
+
+#: contrib/auth/models.py:149
+msgid "user permissions"
+msgstr "Brukerrettigheter"
+
+#: contrib/auth/models.py:153
+msgid "user"
+msgstr "bruker"
+
+#: contrib/auth/models.py:154
+msgid "users"
+msgstr "brukere"
+
+#: contrib/auth/models.py:309
+msgid "message"
+msgstr "melding"
+
+#: contrib/auth/views.py:50
+msgid "Logged out"
+msgstr "Logget ut"
+
+#: contrib/comments/models.py:71 contrib/comments/models.py:164
+msgid "object ID"
+msgstr "objekt-ID"
+
+#: contrib/comments/models.py:72
+msgid "headline"
+msgstr "overskrift"
+
+#: contrib/comments/models.py:73 contrib/comments/models.py:95
+#: contrib/comments/models.py:165
+msgid "comment"
+msgstr "kommentar"
+
+#: contrib/comments/models.py:74
+msgid "rating #1"
+msgstr "rangering #1 "
+
+#: contrib/comments/models.py:75
+msgid "rating #2"
+msgstr "rangering #2"
+
+#: contrib/comments/models.py:76
+msgid "rating #3"
+msgstr "rangering #3"
+
+#: contrib/comments/models.py:77
+msgid "rating #4"
+msgstr "rangering #4"
+
+#: contrib/comments/models.py:78
+msgid "rating #5"
+msgstr "rangering #5"
+
+#: contrib/comments/models.py:79
+msgid "rating #6"
+msgstr "rangering #6"
+
+#: contrib/comments/models.py:80
+msgid "rating #7"
+msgstr "rangering #7"
+
+#: contrib/comments/models.py:81
+msgid "rating #8"
+msgstr "rangering #8"
+
+#: contrib/comments/models.py:86
+msgid "is valid rating"
+msgstr "er gyldig rangering"
+
+#: contrib/comments/models.py:87 contrib/comments/models.py:167
+msgid "date/time submitted"
+msgstr "dato/tid for innsendelse"
+
+#: contrib/comments/models.py:88 contrib/comments/models.py:168
+msgid "is public"
+msgstr "er tilgjengelig for alle"
+
+#: contrib/comments/models.py:90
+msgid "is removed"
+msgstr "er fjernet"
+
+#: contrib/comments/models.py:90
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Huk av denne hvis kommentaren er upassende. Meldingen \"Denne kommentaren "
+"har blitt fjernet\" vil bli vist i stedet."
+
+#: contrib/comments/models.py:96
+msgid "comments"
+msgstr "kommentarer"
+
+#: contrib/comments/models.py:128 contrib/comments/models.py:199
+msgid "Content object"
+msgstr "Content-objekt"
+
+#: contrib/comments/models.py:156
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Skrevet av %(user)s, %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:166
+msgid "person's name"
+msgstr "personens navn"
+
+#: contrib/comments/models.py:169
+msgid "ip address"
+msgstr "IP-adresse"
+
+#: contrib/comments/models.py:171
+msgid "approved by staff"
+msgstr "godkjent av moderator"
+
+#: contrib/comments/models.py:175
+msgid "free comment"
+msgstr "åpen kommentar"
+
+#: contrib/comments/models.py:176
+msgid "free comments"
+msgstr "åpne kommentarer"
+
+#: contrib/comments/models.py:227
+msgid "score"
+msgstr "poeng"
+
+#: contrib/comments/models.py:228
+msgid "score date"
+msgstr "poengdato"
+
+#: contrib/comments/models.py:232
+msgid "karma score"
+msgstr "karmapoeng"
+
+#: contrib/comments/models.py:233
+msgid "karma scores"
+msgstr "karmapoeng"
+
+#: contrib/comments/models.py:237
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d rangering av %(user)s"
+
+#: contrib/comments/models.py:254
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Denne kommentaren er flagget av %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:262
+msgid "flag date"
+msgstr "flaggdato"
+
+#: contrib/comments/models.py:266
+msgid "user flag"
+msgstr "brukerflagg"
+
+#: contrib/comments/models.py:267
+msgid "user flags"
+msgstr "brukerflagg"
+
+#: contrib/comments/models.py:271
+#, python-format
+msgid "Flag by %r"
+msgstr "Flagg med %r"
+
+#: contrib/comments/models.py:277
+msgid "deletion date"
+msgstr "dato fjernet"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "fjernet av  moderator"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "fjernet av moderator"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Fjernet av moderator %r"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Har du glemt passordet ditt?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Rangeringer"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Påkrevet"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Valgfri"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Send et bilde"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Kommentar:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Forhåndvis kommentar"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Ditt navn:"
+
+#: contrib/comments/views/comments.py:76
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr "Denne rangeringen er påkrevet, fordi du har rangert tidligere."
+
+#: contrib/comments/views/comments.py:160
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Denne kommentaren var skrevet av en bruker som har skrevet mindre enn %"
+"(count)s kommentarer:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Denne kommentaren var skrevet av en bruker som har skrevet mindre enn %"
+"(count)s kommentarer:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:165
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Denne kommentaren er skrevet av en upålitelig bruker:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:238
+#: contrib/comments/views/comments.py:331
+msgid "Only POSTs are allowed"
+msgstr "Kun POST er tillatt"
+
+#: contrib/comments/views/comments.py:242
+#: contrib/comments/views/comments.py:335
+msgid "One or more of the required fields wasn't submitted"
+msgstr "En eller flere av feltene som er påkrevet ble ikke sendt"
+
+#: contrib/comments/views/comments.py:246
+#: contrib/comments/views/comments.py:337
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Noen har endret på kommentarskjemaet (sikkerhetsbrudd)"
+
+#: contrib/comments/views/comments.py:256
+#: contrib/comments/views/comments.py:343
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"Kommentarskjemaet hadde en ugyldig 'target'-verdi: objekt-IDen var ugyldig"
+
+#: contrib/comments/views/comments.py:307
+#: contrib/comments/views/comments.py:372
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "Kommentarskjemaet mangler 'preview'- eller 'post'"
+
+#: contrib/comments/views/karma.py:21
+msgid "Anonymous users cannot vote"
+msgstr "Anonyme brukere kan ikke stemme"
+
+#: contrib/comments/views/karma.py:25
+msgid "Invalid comment ID"
+msgstr "Ugyldig kommentar-ID"
+
+#: contrib/comments/views/karma.py:27
+msgid "No voting for yourself"
+msgstr "Du kan ikke stemme på deg selv"
+
+#: contrib/contenttypes/models.py:67
+msgid "python model class name"
+msgstr "python-modell klassenavn"
+
+#: contrib/contenttypes/models.py:71
+msgid "content type"
+msgstr "innholdstype"
+
+#: contrib/contenttypes/models.py:72
+msgid "content types"
+msgstr "innholdstyper"
+
+#: contrib/flatpages/admin.py:9
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Eksempel: '/om/kontakt/'. Kontroller at det er en skråstrek foran og bak."
+
+#: contrib/flatpages/admin.py:11 core/validators.py:76
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Dette feltet kan bare inneholde bokstaver, nummer, understreker, "
+"bindestreker eller skråstreker."
+
+#: contrib/flatpages/admin.py:22
+msgid "Advanced options"
+msgstr "Avanserte innstillinger"
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "tittel"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "innhold"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "tillat kommentarer"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "malnavn"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"Eksempel: 'flatpages/kontakt_side.html'. Hvis denne ikke er gitt, vil "
+"'flatpages/default.html' bli brukt."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "registrering kreves"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Hvis denne er krysset av, kan kun innloggede brukere se siden."
+
+#: contrib/flatpages/models.py:19
+msgid "flat page"
+msgstr "flatside"
+
+#: contrib/flatpages/models.py:20
+msgid "flat pages"
+msgstr "flatsider"
+
+#: contrib/gis/forms/fields.py:10
+msgid "No geometry value provided."
+msgstr "Ingen geometriverdi oppgitt."
+
+#: contrib/gis/forms/fields.py:11
+msgid "Invalid Geometry value."
+msgstr "Ugyldig Geometry-verdi"
+
+#: contrib/gis/forms/fields.py:12
+msgid "Invalid Geometry type."
+msgstr "Ugyldig Geometry-type"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "th"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "st"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "nd"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "rd"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:51
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f million"
+msgstr[1] "%(value).1f millioner"
+
+#: contrib/humanize/templatetags/humanize.py:54
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f milliard"
+msgstr[1] "%(value).1f milliarder"
+
+#: contrib/humanize/templatetags/humanize.py:57
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f billion"
+msgstr[1] "%(value).1f billioner"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "one"
+msgstr "én"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "two"
+msgstr "to"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "three"
+msgstr "tre"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "four"
+msgstr "fire"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "five"
+msgstr "fem"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "six"
+msgstr "seks"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "seven"
+msgstr "sju"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "eight"
+msgstr "åtte"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "nine"
+msgstr "ni"
+
+#: contrib/humanize/templatetags/humanize.py:93
+msgid "today"
+msgstr "i dag"
+
+#: contrib/humanize/templatetags/humanize.py:95
+msgid "tomorrow"
+msgstr "i morgen"
+
+#: contrib/humanize/templatetags/humanize.py:97
+msgid "yesterday"
+msgstr "i går"
+
+#: contrib/localflavor/ar/forms.py:27
+msgid "Enter a postal code in the format NNNN or ANNNNAAA."
+msgstr "Oppgi et postnummer på formen NNNN eller ANNNNAAA."
+
+#: contrib/localflavor/ar/forms.py:49 contrib/localflavor/br/forms.py:96
+#: contrib/localflavor/br/forms.py:135 contrib/localflavor/pe/forms.py:23
+#: contrib/localflavor/pe/forms.py:51
+msgid "This field requires only numbers."
+msgstr "Feltet krever kun tall."
+
+#: contrib/localflavor/ar/forms.py:50
+msgid "This field requires 7 or 8 digits."
+msgstr ""
+
+#: contrib/localflavor/ar/forms.py:79
+msgid "Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format."
+msgstr ""
+
+#: contrib/localflavor/ar/forms.py:80
+msgid "Invalid CUIT."
+msgstr "Ugyldig CUIT."
+
+#: contrib/localflavor/at/at_states.py:5
+msgid "Burgenland"
+msgstr ""
+
+#: contrib/localflavor/at/at_states.py:6
+msgid "Carinthia"
+msgstr ""
+
+#: contrib/localflavor/at/at_states.py:7
+msgid "Lower Austria"
+msgstr ""
+
+#: contrib/localflavor/at/at_states.py:8
+msgid "Upper Austria"
+msgstr ""
+
+#: contrib/localflavor/at/at_states.py:9
+msgid "Salzburg"
+msgstr ""
+
+#: contrib/localflavor/at/at_states.py:10
+msgid "Styria"
+msgstr ""
+
+#: contrib/localflavor/at/at_states.py:11
+msgid "Tyrol"
+msgstr ""
+
+#: contrib/localflavor/at/at_states.py:12
+msgid "Vorarlberg"
+msgstr ""
+
+#: contrib/localflavor/at/at_states.py:13
+msgid "Vienna"
+msgstr ""
+
+#: contrib/localflavor/at/forms.py:20 contrib/localflavor/ch/forms.py:16
+#: contrib/localflavor/no/forms.py:12
+msgid "Enter a zip code in the format XXXX."
+msgstr "Oppgi et postnummer på formen XXXX."
+
+#: contrib/localflavor/at/forms.py:48
+msgid "Enter a valid Austrian Social Security Number in XXXX XXXXXX format."
+msgstr ""
+
+#: contrib/localflavor/au/forms.py:16
+msgid "Enter a 4 digit post code."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:21
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Oppgi et postnummer på formen XXXXX-XXX."
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "Telefonnummeret må være i XXX-XXX-XXXX format."
+
+#: contrib/localflavor/br/forms.py:58
+msgid ""
+"Select a valid brazilian state. That state is not one of the available "
+"states."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:94
+msgid "Invalid CPF number."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:95
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:134
+msgid "Invalid CNPJ number."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:136
+msgid "This field requires at least 14 digits"
+msgstr ""
+
+#: contrib/localflavor/ca/forms.py:17
+msgid "Enter a postal code in the format XXX XXX."
+msgstr "Oppgi et postnummer på formen XXX XXX."
+
+#: contrib/localflavor/ca/forms.py:88
+msgid "Enter a valid Canadian Social Insurance number in XXX-XXX-XXX format."
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr ""
+
+#: contrib/localflavor/ch/forms.py:64
+msgid ""
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
+msgstr ""
+
+#: contrib/localflavor/cl/forms.py:29
+msgid "Enter a valid Chilean RUT."
+msgstr ""
+
+#: contrib/localflavor/cl/forms.py:30
+msgid "Enter a valid Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr ""
+
+#: contrib/localflavor/cl/forms.py:31
+msgid "The Chilean RUT is not valid."
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr ""
+
+#: contrib/localflavor/de/forms.py:14 contrib/localflavor/fi/forms.py:12
+#: contrib/localflavor/fr/forms.py:15
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Oppgi et postnummer på formen XXXXX."
+
+#: contrib/localflavor/de/forms.py:41
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:5
+msgid "Arava"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:6
+msgid "Albacete"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:7
+msgid "Alacant"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:8
+msgid "Almeria"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:9
+msgid "Avila"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:10
+msgid "Badajoz"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:11
+msgid "Illes Balears"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:12
+msgid "Barcelona"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:13
+msgid "Burgos"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:14
+msgid "Caceres"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:15
+msgid "Cadiz"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:16
+msgid "Castello"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:17
+msgid "Ciudad Real"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:18
+msgid "Cordoba"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:19
+msgid "A Coruna"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:20
+msgid "Cuenca"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:21
+msgid "Girona"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:22
+msgid "Granada"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:23
+msgid "Guadalajara"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:24
+msgid "Guipuzkoa"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:25
+msgid "Huelva"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:26
+msgid "Huesca"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:27
+msgid "Jaen"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:28
+msgid "Leon"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:29
+msgid "Lleida"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:30
+#: contrib/localflavor/es/es_regions.py:17
+msgid "La Rioja"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:31
+msgid "Lugo"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:32
+#: contrib/localflavor/es/es_regions.py:18
+msgid "Madrid"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:33
+msgid "Malaga"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:34
+msgid "Murcia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:35
+msgid "Navarre"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:36
+msgid "Ourense"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:37
+msgid "Asturias"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:38
+msgid "Palencia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:39
+msgid "Las Palmas"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:40
+msgid "Pontevedra"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:41
+msgid "Salamanca"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:42
+msgid "Santa Cruz de Tenerife"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:43
+#: contrib/localflavor/es/es_regions.py:11
+msgid "Cantabria"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:44
+msgid "Segovia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:45
+msgid "Seville"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:46
+msgid "Soria"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:47
+msgid "Tarragona"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:48
+msgid "Teruel"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:49
+msgid "Toledo"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:50
+msgid "Valencia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:51
+msgid "Valladolid"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:52
+msgid "Bizkaia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:53
+msgid "Zamora"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:54
+msgid "Zaragoza"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:55
+msgid "Ceuta"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:56
+msgid "Melilla"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:5
+msgid "Andalusia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:6
+msgid "Aragon"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:7
+msgid "Principality of Asturias"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:8
+msgid "Balearic Islands"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:9
+msgid "Basque Country"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:10
+msgid "Canary Islands"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:12
+msgid "Castile-La Mancha"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:13
+msgid "Castile and Leon"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:14
+msgid "Catalonia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:15
+msgid "Extremadura"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:16
+msgid "Galicia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:19
+msgid "Region of Murcia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:20
+msgid "Foral Community of Navarre"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:21
+msgid "Valencian Community"
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:19
+msgid "Enter a valid postal code in the range and format 01XXX - 52XXX."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:39
+msgid ""
+"Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or "
+"9XXXXXXXX."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:66
+msgid "Please enter a valid NIF, NIE, or CIF."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:67
+msgid "Please enter a valid NIF or NIE."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:68
+msgid "Invalid checksum for NIF."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:69
+msgid "Invalid checksum for NIE."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:70
+msgid "Invalid checksum for CIF."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:142
+msgid ""
+"Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:143
+msgid "Invalid checksum for bank account number."
+msgstr ""
+
+#: contrib/localflavor/fi/forms.py:28
+msgid "Enter a valid Finnish social security number."
+msgstr ""
+
+#: contrib/localflavor/in_/forms.py:14
+msgid "Enter a zip code in the format XXXXXXX."
+msgstr "Oppgi et postnummer på formen XXXXXXX."
+
+#: contrib/localflavor/is_/forms.py:17
+msgid ""
+"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr ""
+
+#: contrib/localflavor/is_/forms.py:18
+msgid "The Icelandic identification number is not valid."
+msgstr ""
+
+#: contrib/localflavor/it/forms.py:14
+msgid "Enter a valid zip code."
+msgstr "Oppgi et gyldig postnummer."
+
+#: contrib/localflavor/it/forms.py:43
+msgid "Enter a valid Social Security number."
+msgstr "Oppgi et gyldig italiensk personnummer."
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr "Oppgi et gyldig VAT-nummer."
+
+#: contrib/localflavor/jp/forms.py:17
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "Oppgi et postnummer på formen XXXXXXX eller XXX-XXXX."
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:12
+msgid "Aguascalientes"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:13
+msgid "Baja California"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:14
+msgid "Baja California Sur"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:15
+msgid "Campeche"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:16
+msgid "Chihuahua"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:17
+msgid "Chiapas"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:18
+msgid "Coahuila"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:19
+msgid "Colima"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:20
+msgid "Distrito Federal"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:21
+msgid "Durango"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:22
+msgid "Guerrero"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:23
+msgid "Guanajuato"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:24
+msgid "Hidalgo"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:25
+msgid "Jalisco"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:26
+msgid "Estado de México"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:27
+msgid "Michoacán"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:28
+msgid "Morelos"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:29
+msgid "Nayarit"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:30
+msgid "Nuevo León"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:31
+msgid "Oaxaca"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:32
+msgid "Puebla"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:33
+msgid "Querétaro"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:34
+msgid "Quintana Roo"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:35
+msgid "Sinaloa"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:36
+msgid "San Luis Potosí"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:37
+msgid "Sonora"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:38
+msgid "Tabasco"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:39
+msgid "Tamaulipas"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:40
+msgid "Tlaxcala"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:41
+msgid "Veracruz"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:42
+msgid "Yucatán"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:43
+msgid "Zacatecas"
+msgstr ""
+
+#: contrib/localflavor/nl/forms.py:21
+msgid "Enter a valid postal code"
+msgstr "Oppgi et gyldig postnummer."
+
+#: contrib/localflavor/nl/forms.py:52
+msgid "Enter a valid phone number"
+msgstr ""
+
+#: contrib/localflavor/nl/forms.py:78
+msgid "Enter a valid SoFi number"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:4
+msgid "Drente"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:5
+msgid "Flevoland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:6
+msgid "Friesland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:7
+msgid "Gelderland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:8
+msgid "Groningen"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:9
+msgid "Limburg"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:10
+msgid "Noord-Brabant"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:11
+msgid "Noord-Holland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:12
+msgid "Overijssel"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:13
+msgid "Utrecht"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:14
+msgid "Zeeland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:15
+msgid "Zuid-Holland"
+msgstr ""
+
+#: contrib/localflavor/no/forms.py:33
+msgid "Enter a valid Norwegian social security number."
+msgstr "Oppgi et gyldig norsk personnummer."
+
+#: contrib/localflavor/pe/forms.py:24
+msgid "This field requires 8 digits."
+msgstr "Dette feltet krever åtte siffer."
+
+#: contrib/localflavor/pe/forms.py:52
+msgid "This field requires 11 digits."
+msgstr "Dette feltet krever 11 siffer."
+
+#: contrib/localflavor/pl/forms.py:38
+msgid "National Identification Number consists of 11 digits."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:39
+msgid "Wrong checksum for the National Identification Number."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:71
+msgid ""
+"Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:72
+msgid "Wrong checksum for the Tax Number (NIP)."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:111
+msgid "National Business Register Number (REGON) consists of 7 or 9 digits."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:112
+msgid "Wrong checksum for the National Business Register Number (REGON)."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:155
+msgid "Enter a postal code in the format XX-XXX."
+msgstr "Oppgi et postnummer på formen XX-XXX."
+
+#: contrib/localflavor/pl/pl_voivodeships.py:8
+msgid "Lower Silesia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:9
+msgid "Kuyavia-Pomerania"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:10
+msgid "Lublin"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:11
+msgid "Lubusz"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:12
+msgid "Lodz"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:13
+msgid "Lesser Poland"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:14
+msgid "Masovia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:15
+msgid "Opole"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:16
+msgid "Subcarpatia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:17
+msgid "Podlasie"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:18
+msgid "Pomerania"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:19
+msgid "Silesia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:20
+msgid "Swietokrzyskie"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:21
+msgid "Warmia-Masuria"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:22
+msgid "Greater Poland"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:23
+msgid "West Pomerania"
+msgstr ""
+
+#: contrib/localflavor/ro/forms.py:19
+msgid "Enter a valid CIF."
+msgstr ""
+
+#: contrib/localflavor/ro/forms.py:56
+msgid "Enter a valid CNP."
+msgstr ""
+
+#: contrib/localflavor/ro/forms.py:141
+msgid "Enter a valid IBAN in ROXX-XXXX-XXXX-XXXX-XXXX-XXXX format"
+msgstr ""
+
+#: contrib/localflavor/ro/forms.py:171
+msgid "Phone numbers must be in XXXX-XXXXXX format."
+msgstr "Telefonnummeret må være i XXXX-XXXXXX format."
+
+#: contrib/localflavor/ro/forms.py:194
+msgid "Enter a valid postal code in the format XXXXXX"
+msgstr "Oppgi et postnummer på formen XXXXXX."
+
+#: contrib/localflavor/sk/forms.py:30
+msgid "Enter a postal code in the format XXXXX or XXX XX."
+msgstr "Oppgi et postnummer på formen XXXXX or XXX XX."
+
+#: contrib/localflavor/sk/sk_districts.py:8
+msgid "Banska Bystrica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:9
+msgid "Banska Stiavnica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:10
+msgid "Bardejov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:11
+msgid "Banovce nad Bebravou"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:12
+msgid "Brezno"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:13
+msgid "Bratislava I"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:14
+msgid "Bratislava II"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:15
+msgid "Bratislava III"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:16
+msgid "Bratislava IV"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:17
+msgid "Bratislava V"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:18
+msgid "Bytca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:19
+msgid "Cadca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:20
+msgid "Detva"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:21
+msgid "Dolny Kubin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:22
+msgid "Dunajska Streda"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:23
+msgid "Galanta"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:24
+msgid "Gelnica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:25
+msgid "Hlohovec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:26
+msgid "Humenne"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:27
+msgid "Ilava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:28
+msgid "Kezmarok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:29
+msgid "Komarno"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:30
+msgid "Kosice I"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:31
+msgid "Kosice II"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:32
+msgid "Kosice III"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:33
+msgid "Kosice IV"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:34
+msgid "Kosice - okolie"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:35
+msgid "Krupina"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:36
+msgid "Kysucke Nove Mesto"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:37
+msgid "Levice"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:38
+msgid "Levoca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:39
+msgid "Liptovsky Mikulas"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:40
+msgid "Lucenec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:41
+msgid "Malacky"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:42
+msgid "Martin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:43
+msgid "Medzilaborce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:44
+msgid "Michalovce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:45
+msgid "Myjava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:46
+msgid "Namestovo"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:47
+msgid "Nitra"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:48
+msgid "Nove Mesto nad Vahom"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:49
+msgid "Nove Zamky"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:50
+msgid "Partizanske"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:51
+msgid "Pezinok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:52
+msgid "Piestany"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:53
+msgid "Poltar"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:54
+msgid "Poprad"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:55
+msgid "Povazska Bystrica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:56
+msgid "Presov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:57
+msgid "Prievidza"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:58
+msgid "Puchov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:59
+msgid "Revuca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:60
+msgid "Rimavska Sobota"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:61
+msgid "Roznava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:62
+msgid "Ruzomberok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:63
+msgid "Sabinov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:64
+msgid "Senec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:65
+msgid "Senica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:66
+msgid "Skalica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:67
+msgid "Snina"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:68
+msgid "Sobrance"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:69
+msgid "Spisska Nova Ves"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:70
+msgid "Stara Lubovna"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:71
+msgid "Stropkov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:72
+msgid "Svidnik"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:73
+msgid "Sala"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:74
+msgid "Topolcany"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:75
+msgid "Trebisov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:76
+msgid "Trencin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:77
+msgid "Trnava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:78
+msgid "Turcianske Teplice"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:79
+msgid "Tvrdosin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:80
+msgid "Velky Krtis"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:81
+msgid "Vranov nad Toplou"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:82
+msgid "Zlate Moravce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:83
+msgid "Zvolen"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:84
+msgid "Zarnovica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:85
+msgid "Ziar nad Hronom"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:86
+msgid "Zilina"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:8
+msgid "Banska Bystrica region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:9
+msgid "Bratislava region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:10
+msgid "Kosice region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:11
+msgid "Nitra region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:12
+msgid "Presov region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:13
+msgid "Trencin region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:14
+msgid "Trnava region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:15
+msgid "Zilina region"
+msgstr ""
+
+#: contrib/localflavor/uk/forms.py:21
+msgid "Enter a valid postcode."
+msgstr "Oppgi et gyldig postnummer."
+
+#: contrib/localflavor/uk/uk_regions.py:11
+msgid "Bedfordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:12
+msgid "Buckinghamshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:14
+msgid "Cheshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:15
+msgid "Cornwall and Isles of Scilly"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:16
+msgid "Cumbria"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:17
+msgid "Derbyshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:18
+msgid "Devon"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:19
+msgid "Dorset"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:20
+msgid "Durham"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:21
+msgid "East Sussex"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:22
+msgid "Essex"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:23
+msgid "Gloucestershire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:24
+msgid "Greater London"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:25
+msgid "Greater Manchester"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:26
+msgid "Hampshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:27
+msgid "Hertfordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:28
+msgid "Kent"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:29
+msgid "Lancashire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:30
+msgid "Leicestershire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:31
+msgid "Lincolnshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:32
+msgid "Merseyside"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:33
+msgid "Norfolk"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:34
+msgid "North Yorkshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:35
+msgid "Northamptonshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:36
+msgid "Northumberland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:37
+msgid "Nottinghamshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:38
+msgid "Oxfordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:39
+msgid "Shropshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:40
+msgid "Somerset"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:41
+msgid "South Yorkshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:42
+msgid "Staffordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:43
+msgid "Suffolk"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:44
+msgid "Surrey"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:45
+msgid "Tyne and Wear"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:46
+msgid "Warwickshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:47
+msgid "West Midlands"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:48
+msgid "West Sussex"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:49
+msgid "West Yorkshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:50
+msgid "Wiltshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:51
+msgid "Worcestershire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:55
+msgid "County Antrim"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:56
+msgid "County Armagh"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:57
+msgid "County Down"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:58
+msgid "County Fermanagh"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:59
+msgid "County Londonderry"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:60
+msgid "County Tyrone"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:64
+msgid "Clwyd"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:65
+msgid "Dyfed"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:66
+msgid "Gwent"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:67
+msgid "Gwynedd"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:68
+msgid "Mid Glamorgan"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:69
+msgid "Powys"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:70
+msgid "South Glamorgan"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:71
+msgid "West Glamorgan"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:75
+msgid "Borders"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:76
+msgid "Central Scotland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:77
+msgid "Dumfries and Galloway"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:78
+msgid "Fife"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:79
+msgid "Grampian"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:80
+msgid "Highland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:81
+msgid "Lothian"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:82
+msgid "Orkney Islands"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:83
+msgid "Shetland Islands"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:84
+msgid "Strathclyde"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:85
+msgid "Tayside"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:86
+msgid "Western Isles"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:90
+msgid "England"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:91
+msgid "Northern Ireland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:92
+msgid "Scotland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:93
+msgid "Wales"
+msgstr ""
+
+#: contrib/localflavor/us/forms.py:16
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "Oppgi et postnummer på formen XXXXX eller XXXXX-XXXX."
+
+#: contrib/localflavor/us/forms.py:54
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr ""
+
+#: contrib/localflavor/za/forms.py:20
+msgid "Enter a valid South African ID number"
+msgstr ""
+
+#: contrib/localflavor/za/forms.py:54
+msgid "Enter a valid South African postal code"
+msgstr "Oppgi et gyldig postnummer."
+
+#: contrib/localflavor/za/za_provinces.py:4
+msgid "Eastern Cape"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:5
+msgid "Free State"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:6
+msgid "Gauteng"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:7
+msgid "KwaZulu-Natal"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:8
+msgid "Limpopo"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:9
+msgid "Mpumalanga"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:10
+msgid "Northern Cape"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:11
+msgid "North West"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:12
+msgid "Western Cape"
+msgstr ""
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "omadresser fra"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Dette bør være en fullstendig sti uten domenenavn. Eksempel: '/hendelser/"
+"finn/"
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "omadresser til"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Dette kan enten være en fullstendig sti (som over), eller en fullstendig "
+"nettadresse som starter med 'http://'"
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "omadressering"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "omadresseringer"
+
+#: contrib/sessions/models.py:45
+msgid "session key"
+msgstr "sesjonsnøkkel"
+
+#: contrib/sessions/models.py:47
+msgid "session data"
+msgstr "sesjonsdata"
+
+#: contrib/sessions/models.py:48
+msgid "expire date"
+msgstr "utløpsdato"
+
+#: contrib/sessions/models.py:53
+msgid "session"
+msgstr "sesjon"
+
+#: contrib/sessions/models.py:54
+msgid "sessions"
+msgstr "sesjoner"
+
+#: contrib/sites/models.py:32
+msgid "domain name"
+msgstr "domenenavn"
+
+#: contrib/sites/models.py:33
+msgid "display name"
+msgstr "visningsnavn"
+
+#: contrib/sites/models.py:39
+msgid "sites"
+msgstr "nettsider"
+
+#: core/validators.py:80
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr ""
+"Feltet kan bare inneholde bokstaver, nummer, understreker eller "
+"bindestreker."
+
+#: core/validators.py:84
+msgid "Uppercase letters are not allowed here."
+msgstr "Store bokstaver er ikke tillatt her."
+
+#: core/validators.py:88
+msgid "Lowercase letters are not allowed here."
+msgstr "Små bokstaver er ikke tillatt her."
+
+#: core/validators.py:95
+msgid "Enter only digits separated by commas."
+msgstr "Oppgi kun tall adskilt med komma."
+
+#: core/validators.py:107
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Oppgi gyldige e-postadresser adskilt med komma."
+
+#: core/validators.py:111
+msgid "Please enter a valid IP address."
+msgstr "Vennligst oppgi en gyldig IP-adresse."
+
+#: core/validators.py:115
+msgid "Empty values are not allowed here."
+msgstr "Feltet kan ikke være tomt."
+
+#: core/validators.py:119
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Feltet kan kun bestå av tall."
+
+#: core/validators.py:123
+msgid "This value can't be comprised solely of digits."
+msgstr "Feltet kan ikke bare bestå av siffer."
+
+#: core/validators.py:128 forms/fields.py:161
+msgid "Enter a whole number."
+msgstr "Oppgi et heltall."
+
+#: core/validators.py:132
+msgid "Only alphabetical characters are allowed here."
+msgstr "Kun bokstaver er tillatt her."
+
+#: core/validators.py:147
+#, python-format
+msgid "Invalid date: %s"
+msgstr "Ugyldig dato: %s"
+
+#: core/validators.py:152 db/models/fields/__init__.py:546
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Oppgi en gyldig dato på formen ÅÅÅÅ-MM-DD."
+
+#: core/validators.py:157
+msgid "Enter a valid time in HH:MM format."
+msgstr "Oppgi tid på formen TT:MM."
+
+#: core/validators.py:161
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Oppgi dato og tid på formen ÅÅÅÅ-MM-DD TT:MM."
+
+#: core/validators.py:166 forms/fields.py:422
+msgid "Enter a valid e-mail address."
+msgstr "Oppgi en gyldig e-postadresse."
+
+#: core/validators.py:178 core/validators.py:470 forms/fields.py:440
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Ingen fil ble sendt. Sjekk \"encoding\"-typen på skjemaet."
+
+#: core/validators.py:189 forms/fields.py:471
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Last opp et gyldig bilde. Filen du lastet opp var ødelagt eller ikke et "
+"bilde."
+
+#: core/validators.py:196
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "Nettadressen %s peker ikke på et gyldig bilde."
+
+#: core/validators.py:200
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "Telefonnummeret må være på formen XXX-XXX-XXXX. \"%s\" er ugyldig."
+
+#: core/validators.py:208
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "Nettadressen %s peker ikke på en gyldig QuickTime-video."
+
+#: core/validators.py:212
+msgid "A valid URL is required."
+msgstr "En gyldig nettadresse er påkrevet."
+
+#: core/validators.py:226
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Gyldig HTML er påkrevet. Feilene var:\n"
+"%s"
+
+#: core/validators.py:233
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Ikke velformet XML: %s"
+
+#: core/validators.py:250
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Ugyldig nettadresse: %s"
+
+#: core/validators.py:255 core/validators.py:257
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "Nettadressen %s fører til en side som ikke eksisterer."
+
+#: core/validators.py:263
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Oppgi en gyldig amerikansk delstatsforkortelse."
+
+#: core/validators.py:277
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Pass munnen din! Ordet %s er ikke tillatt her."
+msgstr[1] "Pass munnen din! Ordene %s er ikke tillatt her."
+
+#: core/validators.py:284
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Feltet må være det samme som '%s'-feltet."
+
+#: core/validators.py:303
+msgid "Please enter something for at least one field."
+msgstr "Vennligst oppgi noe i minst ett felt."
+
+#: core/validators.py:312 core/validators.py:323
+msgid "Please enter both fields or leave them both empty."
+msgstr "Vennligst oppgi noe i begge felter, eller la begge være blanke."
+
+#: core/validators.py:331
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Feltet kreves hvis %(field)s er lik %(value)s"
+
+#: core/validators.py:344
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Feltet kreves hvis %(field)s ikke er lik %(value)s"
+
+#: core/validators.py:363
+msgid "Duplicate values are not allowed."
+msgstr "Like verdier er ikke tillatt."
+
+#: core/validators.py:378
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Verdien må være mellom %(lower)s og %(upper)s."
+
+#: core/validators.py:380
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Verdien må minst være %s."
+
+#: core/validators.py:382
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Verdien kan ikke være mer enn %s."
+
+#: core/validators.py:423
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Verdien må være et kvadrat av %s."
+
+#: core/validators.py:433
+msgid "Please enter a valid decimal number."
+msgstr "Vennligst oppgi et gyldig desimaltall."
+
+#: core/validators.py:440
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Oppgi et desimaltall med maks %s siffer."
+msgstr[1] "Oppgi et desimaltall med maks %s siffer."
+
+#: core/validators.py:443
+#, python-format
+msgid ""
+"Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural ""
+"Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] "Oppgi et desimaltall hvor heltallsdelen er maks %s siffer."
+msgstr[1] "Oppgi et desimaltall hvor heltallsdelen er maks %s siffer."
+
+#: core/validators.py:446
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "Oppgi et desimaltall med maks %s siffer bak komma."
+msgstr[1] "Oppgi et desimaltall med maks %s siffer bak komma."
+
+#: core/validators.py:454
+msgid "Please enter a valid floating point number."
+msgstr "Vennligst oppgi et gyldig flyttall."
+
+#: core/validators.py:463
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Vær sikker på at filen du prøver å laste opp minst er %s bytes."
+
+#: core/validators.py:464
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Vær sikker på at filen du prøver å laste opp ikke er mer enn %s bytes."
+
+#: core/validators.py:481
+msgid "The format for this field is wrong."
+msgstr "Formatet i dette feltet er feil."
+
+#: core/validators.py:496
+msgid "This field is invalid."
+msgstr "Feltet er ugyldig."
+
+#: core/validators.py:532
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Klarte ikke å hente noe fra %s."
+
+#: core/validators.py:535
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"Nettadressen %(url)s returnerte den ugyldige Content-Type-headeren "
+"'%(contenttype)s'."
+
+#: core/validators.py:568
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Vennligst lukk taggen %(tag)s på linje %(line)s. (Linjen starer med "
+"\"%(start)s\".)"
+
+#: core/validators.py:572
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Deler av teksten som starter på linje %(line)s er ikke tillatt. (Linjen "
+"starter med \"%(start)s\".)"
+
+#: core/validators.py:577
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"%(attr)s\" på linje %(line)s er et ugyldig attributt. (Linjen starter med "
+"\"%(start)s\".)"
+
+#: core/validators.py:582
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\" på linje %(line)s er et ugyldig element. (Linjen starter med "
+"\"%(start)s\".)"
+
+#: core/validators.py:586
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Et element på linje %(line)s mangler et av de påkrevde attributtene. (Linjen "
+"starter med \"%(start)s\".)"
+
+#: core/validators.py:591
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"\"%(attr)s\"-attributtet på linje %(line)s har en ugyldig verdi. (Linjen "
+"starter med \"%(start)s\".)"
+
+#: db/models/manipulators.py:304
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(object)s med %(type)s finnes allerede for angitt %(field)s."
+
+#: db/models/fields/__init__.py:46
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s med %(fieldname)s finnes allerede."
+
+#: db/models/fields/__init__.py:320 db/models/fields/files.py:168
+#: db/models/fields/files.py:179 forms/fields.py:52 oldforms/__init__.py:370
+msgid "This field is required."
+msgstr "Feltet er påkrevet."
+
+#: db/models/fields/__init__.py:434
+msgid "This value must be an integer."
+msgstr "Verdien må være et heltall."
+
+#: db/models/fields/__init__.py:480
+msgid "This value must be either True or False."
+msgstr "Verdien må være True eller False."
+
+#: db/models/fields/__init__.py:509
+msgid "This field cannot be null."
+msgstr "Feltet kan ikke være tomt."
+
+#: db/models/fields/__init__.py:611 db/models/fields/__init__.py:628
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format."
+msgstr "Oppgi dato og tid på formen ÅÅÅÅ-MM-DD TT:MM[:ss[.uuuuuu]]."
+
+#: db/models/fields/__init__.py:684
+msgid "This value must be a decimal number."
+msgstr "Verdien må være et desimaltall."
+
+#: db/models/fields/__init__.py:825
+msgid "This value must be either None, True or False."
+msgstr "Verdien må være None, True eller False."
+
+#: db/models/fields/__init__.py:937 db/models/fields/__init__.py:950
+msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format."
+msgstr "Oppgi tiden på formen TT:MM[:ss[.uuuuuu]]."
+
+#: db/models/fields/files.py:188
+msgid "Enter a valid filename."
+msgstr "Oppgi et gyldig filnavn."
+
+#: db/models/fields/related.py:92
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Vennligst oppgi en/et gyldig %s."
+
+#: db/models/fields/related.py:782
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Hold nede \"Control\", eller \"Command\" på en Mac, for å velge mer enn en."
+
+#: db/models/fields/related.py:862
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "Oppgi gyldige %(self)s-ID-er. Verdien %(value)r er ugyldig."
+msgstr[1] ""
+"Oppgi gyldige %(self)s-ID-er. Verdiene %(value)r er ugyldige."
+
+#: forms/fields.py:53
+msgid "Enter a valid value."
+msgstr "Oppgi en gyldig verdi."
+
+#: forms/fields.py:133
+#, python-format
+msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+msgstr "Verdien kan maksimalt ha %(max)d tegn (den er %(length)d)."
+
+#: forms/fields.py:134
+#, python-format
+msgid "Ensure this value has at least %(min)d characters (it has %(length)d)."
+msgstr "Verdien må minimum ha %(min)d tegn (den er %(length)d)."
+
+#: forms/fields.py:162 forms/fields.py:191 forms/fields.py:220
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Verdien må være mindre enn eller lik %s."
+
+#: forms/fields.py:163 forms/fields.py:192 forms/fields.py:221
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Verdien må være større enn eller lik %s."
+
+#: forms/fields.py:190 forms/fields.py:219
+msgid "Enter a number."
+msgstr "Oppgi et tall."
+
+#: forms/fields.py:222
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr "Verdien kan ikke ha mer enn %s siffer totalt."
+
+#: forms/fields.py:223
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr "Verdien kan ikke ha mer enn %s desimaler."
+
+#: forms/fields.py:224
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr "Verdien kan ikke ha mer enn %s siffer foran komma."
+
+#: forms/fields.py:282 forms/fields.py:803
+msgid "Enter a valid date."
+msgstr "Oppgi en gyldig dato."
+
+#: forms/fields.py:315 forms/fields.py:804
+msgid "Enter a valid time."
+msgstr "Oppgi et gyldig tidspunkt."
+
+#: forms/fields.py:354
+msgid "Enter a valid date/time."
+msgstr "Oppgi gyldig dato og tidspunkt."
+
+#: forms/fields.py:441
+msgid "No file was submitted."
+msgstr "Ingen fil ble sendt."
+
+#: forms/fields.py:442 oldforms/__init__.py:689
+msgid "The submitted file is empty."
+msgstr "Filen er tom."
+
+#: forms/fields.py:532
+msgid "Enter a valid URL."
+msgstr "Oppgi en gyldig nettadresse."
+
+#: forms/fields.py:533
+msgid "This URL appears to be a broken link."
+msgstr "Nettadressen fører til en side som ikke eksisterer."
+
+#: forms/fields.py:601 forms/fields.py:652
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "Velg et gyldig valg. %(value)s er ikke et av de tilgjengelige valgene."
+
+#: forms/fields.py:653 forms/fields.py:714 forms/models.py:528
+msgid "Enter a list of values."
+msgstr "Oppgi en liste med verdier."
+
+#: forms/fields.py:832
+msgid "Enter a valid IPv4 address."
+msgstr "Oppgi en gyldig IPv4-adresse."
+
+#: forms/models.py:461
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Velg et gyldig valg. Valget er ikke et av de tilgjengelige valgene."
+
+#: forms/models.py:529
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Velg et gyldig valg. %s er ikke et av de tilgjengelige valgene."
+
+#: oldforms/__init__.py:405
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Teksten er kortere enn %s tegn."
+msgstr[1] "Teksten er kortere enn %s tegn."
+
+#: oldforms/__init__.py:410
+msgid "Line breaks are not allowed here."
+msgstr "Linjeskift er ikke tillatt."
+
+#: oldforms/__init__.py:508 oldforms/__init__.py:582 oldforms/__init__.py:621
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Velg et gyldig valg. '%(data)s' er ikke i %(choices)s."
+
+#: oldforms/__init__.py:750
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Oppgi et heltall mellom -32768 og 32767."
+
+#: oldforms/__init__.py:760
+msgid "Enter a positive number."
+msgstr "Oppgi et positivt heltall."
+
+#: oldforms/__init__.py:770
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Oppgi et heltall mellom 0 og 32767."
+
+#: template/defaultfilters.py:698
+msgid "yes,no,maybe"
+msgstr "ja,nei,kanskje"
+
+#: template/defaultfilters.py:729
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d byte"
+msgstr[1] "%(size)d bytes"
+
+#: template/defaultfilters.py:731
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f KB"
+
+#: template/defaultfilters.py:733
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: template/defaultfilters.py:734
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#: utils/dateformat.py:41
+msgid "p.m."
+msgstr "p.m."
+
+#: utils/dateformat.py:42
+msgid "a.m."
+msgstr "a.m."
+
+#: utils/dateformat.py:47
+msgid "PM"
+msgstr "PM"
+
+#: utils/dateformat.py:48
+msgid "AM"
+msgstr "AM"
+
+#: utils/dateformat.py:97
+msgid "midnight"
+msgstr "midnatt"
+
+#: utils/dateformat.py:99
+msgid "noon"
+msgstr "12:00"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "mandag"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "tirsdag"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "onsdag"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "torsdag"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "fredag"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "lørdag"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "søndag"
+
+#: utils/dates.py:10
+msgid "Mon"
+msgstr "man"
+
+#: utils/dates.py:10
+msgid "Tue"
+msgstr "tirs"
+
+#: utils/dates.py:10
+msgid "Wed"
+msgstr "ons"
+
+#: utils/dates.py:10
+msgid "Thu"
+msgstr "tors"
+
+#: utils/dates.py:10
+msgid "Fri"
+msgstr "fre"
+
+#: utils/dates.py:11
+msgid "Sat"
+msgstr "lør"
+
+#: utils/dates.py:11
+msgid "Sun"
+msgstr "søn"
+
+#: utils/dates.py:18
+msgid "January"
+msgstr "januar"
+
+#: utils/dates.py:18
+msgid "February"
+msgstr "februar"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "March"
+msgstr "mars"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "April"
+msgstr "april"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "May"
+msgstr "mai"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "June"
+msgstr "juni"
+
+#: utils/dates.py:19 utils/dates.py:31
+msgid "July"
+msgstr "juli"
+
+#: utils/dates.py:19
+msgid "August"
+msgstr "august"
+
+#: utils/dates.py:19
+msgid "September"
+msgstr "september"
+
+#: utils/dates.py:19
+msgid "October"
+msgstr "oktober"
+
+#: utils/dates.py:19
+msgid "November"
+msgstr "november"
+
+#: utils/dates.py:20
+msgid "December"
+msgstr "desember"
+
+#: utils/dates.py:23
+msgid "jan"
+msgstr "jan"
+
+#: utils/dates.py:23
+msgid "feb"
+msgstr "feb"
+
+#: utils/dates.py:23
+msgid "mar"
+msgstr "mar"
+
+#: utils/dates.py:23
+msgid "apr"
+msgstr "apr"
+
+#: utils/dates.py:23
+msgid "may"
+msgstr "mai"
+
+#: utils/dates.py:23
+msgid "jun"
+msgstr "jun"
+
+#: utils/dates.py:24
+msgid "jul"
+msgstr "jul"
+
+#: utils/dates.py:24
+msgid "aug"
+msgstr "aug"
+
+#: utils/dates.py:24
+msgid "sep"
+msgstr "sep"
+
+#: utils/dates.py:24
+msgid "oct"
+msgstr "okt"
+
+#: utils/dates.py:24
+msgid "nov"
+msgstr "nov"
+
+#: utils/dates.py:24
+msgid "dec"
+msgstr "des"
+
+#: utils/dates.py:31
+msgid "Jan."
+msgstr "jan."
+
+#: utils/dates.py:31
+msgid "Feb."
+msgstr "feb."
+
+#: utils/dates.py:32
+msgid "Aug."
+msgstr "aug."
+
+#: utils/dates.py:32
+msgid "Sept."
+msgstr "sept."
+
+#: utils/dates.py:32
+msgid "Oct."
+msgstr "okt."
+
+#: utils/dates.py:32
+msgid "Nov."
+msgstr "nov."
+
+#: utils/dates.py:32
+msgid "Dec."
+msgstr "des."
+
+#: utils/text.py:128
+msgid "or"
+msgstr "eller"
+
+#: utils/timesince.py:21
+msgid "year"
+msgid_plural "years"
+msgstr[0] "år"
+msgstr[1] "år"
+
+#: utils/timesince.py:22
+msgid "month"
+msgid_plural "months"
+msgstr[0] "måned"
+msgstr[1] "måneder"
+
+#: utils/timesince.py:23
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "uke"
+msgstr[1] "uker"
+
+#: utils/timesince.py:24
+msgid "day"
+msgid_plural "days"
+msgstr[0] "dag"
+msgstr[1] "dager"
+
+#: utils/timesince.py:25
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "time"
+msgstr[1] "timer"
+
+#: utils/timesince.py:26
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minutt"
+msgstr[1] "minutter"
+
+#: utils/timesince.py:46
+msgid "minutes"
+msgstr "minutter"
+
+#: utils/timesince.py:51
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr "%(number)d %(type)s"
+
+#: utils/timesince.py:57
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ", %(number)d %(type)s"
+
+#: utils/translation/trans_real.py:401
+msgid "DATE_FORMAT"
+msgstr "j. F Y"
+
+#: utils/translation/trans_real.py:402
+msgid "DATETIME_FORMAT"
+msgstr "j. F Y H:i"
+
+#: utils/translation/trans_real.py:403
+msgid "TIME_FORMAT"
+msgstr "H:i"
+
+#: utils/translation/trans_real.py:419
+msgid "YEAR_MONTH_FORMAT"
+msgstr "F Y"
+
+#: utils/translation/trans_real.py:420
+msgid "MONTH_DAY_FORMAT"
+msgstr "j. F"
+
+#: views/generic/create_update.py:114
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "%(verbose_name)s ble opprettet."
+
+#: views/generic/create_update.py:156
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "%(verbose_name)s ble oppdatert."
+
+#: views/generic/create_update.py:198
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "%(verbose_name)s ble slettet."
diff --git a/webapp/django/conf/locale/no/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/no/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..45dbab2
--- /dev/null
+++ b/webapp/django/conf/locale/no/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/no/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/no/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..cab59a3
--- /dev/null
+++ b/webapp/django/conf/locale/no/LC_MESSAGES/djangojs.po
@@ -0,0 +1,118 @@
+# translation of djangojs.po to norwegian
+# Copyright (C) 2005 and beyond
+# This file is distributed under the same license as the Django package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-12-09 11:51+0100\n"
+"PO-Revision-Date: 2008-08-19 20:12+0200\n"
+"Last-Translator: Christian Mikalsen and Jon Lønne\n"
+"Language-Team: Norsk <no@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "%s er tilgjengelige"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Velg alle"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Ny"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Slett"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Valgte %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Velg ditt svaralternativ(er) og klikk "
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Tøm"
+
+#: contrib/admin/media/js/calendar.js:24
+#: contrib/admin/media/js/dateparse.js:32
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Januar Februar Mars April Mai Juni Juli August September Oktober November "
+"Desember"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "S M T O T F L"
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Søndag Mandag Tirsdag Onsdag Torsdag Fredag Lørdag"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr "Vis"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr "Skjul"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Now"
+msgstr "Nå"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
+msgid "Clock"
+msgstr "Klokke"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
+msgid "Choose a time"
+msgstr "Velg et klokkeslett"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "Midnight"
+msgstr "Midnatt"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "6 a.m."
+msgstr "06:00"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
+msgid "Noon"
+msgstr "12:00"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
+msgid "Cancel"
+msgstr "Avbryt"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
+msgid "Today"
+msgstr "I dag"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
+msgid "Calendar"
+msgstr "Kalender"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
+msgid "Yesterday"
+msgstr "I går"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
+msgid "Tomorrow"
+msgstr "I morgen"
diff --git a/webapp/django/conf/locale/pl/LC_MESSAGES/django.mo b/webapp/django/conf/locale/pl/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..d615ced
--- /dev/null
+++ b/webapp/django/conf/locale/pl/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/pl/LC_MESSAGES/django.po b/webapp/django/conf/locale/pl/LC_MESSAGES/django.po
new file mode 100644
index 0000000..4d65b05
--- /dev/null
+++ b/webapp/django/conf/locale/pl/LC_MESSAGES/django.po
@@ -0,0 +1,4622 @@
+# translation of django.po to Polish
+# Polish .po file.
+# This file is distributed under the same license as the django package.
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-08-25 09:09+0200\n"
+"PO-Revision-Date: 2008-02-25 15:53+0100\n"
+"Last-Translator: Piotr Lewandowski <piotr.lewandowski@gmail.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms:  nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%"
+"100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: conf/global_settings.py:44
+msgid "Arabic"
+msgstr "arabski"
+
+#: conf/global_settings.py:45
+msgid "Bengali"
+msgstr "bengalski"
+
+#: conf/global_settings.py:46
+msgid "Bulgarian"
+msgstr "bułgarski"
+
+#: conf/global_settings.py:47
+msgid "Catalan"
+msgstr "kataloński"
+
+#: conf/global_settings.py:48
+msgid "Czech"
+msgstr "czeski"
+
+#: conf/global_settings.py:49
+msgid "Welsh"
+msgstr "walijski"
+
+#: conf/global_settings.py:50
+msgid "Danish"
+msgstr "duński"
+
+#: conf/global_settings.py:51
+msgid "German"
+msgstr "niemiecki"
+
+#: conf/global_settings.py:52
+msgid "Greek"
+msgstr "grecki"
+
+#: conf/global_settings.py:53
+msgid "English"
+msgstr "angielski"
+
+#: conf/global_settings.py:54
+msgid "Spanish"
+msgstr "hiszpański"
+
+#: conf/global_settings.py:55
+msgid "Estonian"
+msgstr "estoński"
+
+#: conf/global_settings.py:56
+msgid "Argentinean Spanish"
+msgstr "hiszpański argentyński"
+
+#: conf/global_settings.py:57
+msgid "Basque"
+msgstr "baskijski"
+
+#: conf/global_settings.py:58
+msgid "Persian"
+msgstr "perski"
+
+#: conf/global_settings.py:59
+msgid "Finnish"
+msgstr "fiński"
+
+#: conf/global_settings.py:60
+msgid "French"
+msgstr "francuski"
+
+#: conf/global_settings.py:61
+msgid "Irish"
+msgstr "irlandzki"
+
+#: conf/global_settings.py:62
+msgid "Galician"
+msgstr "galicyjski"
+
+#: conf/global_settings.py:63
+msgid "Hungarian"
+msgstr "węgierski"
+
+#: conf/global_settings.py:64
+msgid "Hebrew"
+msgstr "hebrajski"
+
+#: conf/global_settings.py:65
+msgid "Croatian"
+msgstr "chorwacki"
+
+#: conf/global_settings.py:66
+msgid "Icelandic"
+msgstr "islandzki"
+
+#: conf/global_settings.py:67
+msgid "Italian"
+msgstr "włoski"
+
+#: conf/global_settings.py:68
+msgid "Japanese"
+msgstr "japoński"
+
+#: conf/global_settings.py:69
+msgid "Georgian"
+msgstr "gruziński"
+
+#: conf/global_settings.py:70
+msgid "Korean"
+msgstr "koreański"
+
+#: conf/global_settings.py:71
+msgid "Khmer"
+msgstr "khmerski"
+
+#: conf/global_settings.py:72
+msgid "Kannada"
+msgstr "kannada"
+
+#: conf/global_settings.py:73
+msgid "Latvian"
+msgstr "łotewski"
+
+#: conf/global_settings.py:74
+msgid "Lithuanian"
+msgstr "litewski"
+
+#: conf/global_settings.py:75
+msgid "Macedonian"
+msgstr "macedoński"
+
+#: conf/global_settings.py:76
+msgid "Dutch"
+msgstr "holenderski"
+
+#: conf/global_settings.py:77
+msgid "Norwegian"
+msgstr "norweski"
+
+#: conf/global_settings.py:78
+msgid "Polish"
+msgstr "polski"
+
+#: conf/global_settings.py:79
+msgid "Portugese"
+msgstr "portugalski"
+
+#: conf/global_settings.py:80
+msgid "Brazilian Portuguese"
+msgstr "brazylijski portugalski"
+
+#: conf/global_settings.py:81
+msgid "Romanian"
+msgstr "rumuński"
+
+#: conf/global_settings.py:82
+msgid "Russian"
+msgstr "rosyjski"
+
+#: conf/global_settings.py:83
+msgid "Slovak"
+msgstr "słowacki"
+
+#: conf/global_settings.py:84
+msgid "Slovenian"
+msgstr "słoweński"
+
+#: conf/global_settings.py:85
+msgid "Serbian"
+msgstr "serbski"
+
+#: conf/global_settings.py:86
+msgid "Swedish"
+msgstr "szwedzki"
+
+#: conf/global_settings.py:87
+msgid "Tamil"
+msgstr "tamilski"
+
+#: conf/global_settings.py:88
+msgid "Telugu"
+msgstr "telugu"
+
+#: conf/global_settings.py:89
+msgid "Turkish"
+msgstr "turecki"
+
+#: conf/global_settings.py:90
+msgid "Ukrainian"
+msgstr "ukraiński"
+
+#: conf/global_settings.py:91
+msgid "Simplified Chinese"
+msgstr "chiński uproszczony"
+
+#: conf/global_settings.py:92
+msgid "Traditional Chinese"
+msgstr "chiński tradycyjny"
+
+#: contrib/admin/filterspecs.py:44
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Przez %s:</h3>\n"
+"</ul>\n"
+
+#: contrib/admin/filterspecs.py:74 contrib/admin/filterspecs.py:92
+#: contrib/admin/filterspecs.py:147 contrib/admin/filterspecs.py:173
+msgid "All"
+msgstr "Wszystko"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Any date"
+msgstr "Dowolna data"
+
+#: contrib/admin/filterspecs.py:114
+msgid "Today"
+msgstr "Dzisiaj"
+
+#: contrib/admin/filterspecs.py:117
+msgid "Past 7 days"
+msgstr "Ostatnie 7 dni"
+
+#: contrib/admin/filterspecs.py:119
+msgid "This month"
+msgstr "Ten miesiąc"
+
+#: contrib/admin/filterspecs.py:121
+msgid "This year"
+msgstr "Ten rok"
+
+#: contrib/admin/filterspecs.py:147 forms/widgets.py:389
+#: oldforms/__init__.py:588
+msgid "Yes"
+msgstr "Tak"
+
+#: contrib/admin/filterspecs.py:147 forms/widgets.py:389
+#: oldforms/__init__.py:588
+msgid "No"
+msgstr "Nie"
+
+#: contrib/admin/filterspecs.py:154 forms/widgets.py:389
+#: oldforms/__init__.py:588
+msgid "Unknown"
+msgstr "Nieznany"
+
+#: contrib/admin/models.py:19
+msgid "action time"
+msgstr "czas akcji"
+
+#: contrib/admin/models.py:22
+msgid "object id"
+msgstr "id obiektu"
+
+#: contrib/admin/models.py:23
+msgid "object repr"
+msgstr "reprezentacja obiektu"
+
+#: contrib/admin/models.py:24
+msgid "action flag"
+msgstr "flaga akcji"
+
+#: contrib/admin/models.py:25
+msgid "change message"
+msgstr "zmień wiadomość"
+
+#: contrib/admin/models.py:28
+msgid "log entry"
+msgstr "log"
+
+#: contrib/admin/models.py:29
+msgid "log entries"
+msgstr "logi"
+
+#: contrib/admin/options.py:56 contrib/admin/options.py:115
+msgid "None"
+msgstr "brak"
+
+#: contrib/admin/options.py:329
+#, python-format
+msgid "Changed %s."
+msgstr "Zmieniono %s"
+
+#: contrib/admin/options.py:329 contrib/admin/options.py:339
+#: core/validators.py:279 db/models/manipulators.py:305
+msgid "and"
+msgstr "i"
+
+#: contrib/admin/options.py:334
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Dodano %(name)s \"%(object)s\"."
+
+#: contrib/admin/options.py:338
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Zmieniono %(list)s w %(name)s \"%(object)s\"."
+
+#: contrib/admin/options.py:343
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Usunięto %(name)s \"%(object)s\"."
+
+#: contrib/admin/options.py:347
+msgid "No fields changed."
+msgstr "Żadne pole nie zmienione."
+
+#: contrib/admin/options.py:408 contrib/auth/admin.py:50
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" dodany pomyślnie."
+
+#: contrib/admin/options.py:412 contrib/admin/options.py:445
+#: contrib/auth/admin.py:56
+msgid "You may edit it again below."
+msgstr "Możesz ponownie edytować wpis poniżej."
+
+#: contrib/admin/options.py:422 contrib/admin/options.py:455
+#, python-format
+msgid "You may add another %s below."
+msgstr "Możesz dodać nowy wpis %s poniżej."
+
+#: contrib/admin/options.py:443
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" zostało pomyślnie zmienione."
+
+#: contrib/admin/options.py:451
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s\" dodane pomyślnie. Możesz edytować ponownie wpis poniżej."
+
+#: contrib/admin/options.py:517
+#, python-format
+msgid "Add %s"
+msgstr "Dodaj %s"
+
+#: contrib/admin/options.py:595
+#, python-format
+msgid "Change %s"
+msgstr "Zmień %s"
+
+#: contrib/admin/options.py:627
+msgid "Database error"
+msgstr "Błąd bazy danych"
+
+#: contrib/admin/options.py:677
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" usunięty pomyślnie."
+
+#: contrib/admin/options.py:684
+msgid "Are you sure?"
+msgstr "Jesteś pewien?"
+
+#: contrib/admin/options.py:712
+#, python-format
+msgid "Change history: %s"
+msgstr "Historia zmian: %s"
+
+#: contrib/admin/sites.py:18 contrib/admin/views/decorators.py:16
+#: contrib/auth/forms.py:72 contrib/comments/views/comments.py:56
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Proszę wpisać poprawną nazwę użytkownika i hasło. Uwaga: wielkość liter ma "
+"znaczenie."
+
+#: contrib/admin/sites.py:242 contrib/admin/views/decorators.py:68
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Zaloguj się ponownie. Twoja sesja wygasła lecz twoje zgłoszenie zostało "
+"zapisane."
+
+#: contrib/admin/sites.py:249 contrib/admin/views/decorators.py:75
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Twoja przeglądarka nie chce akceptować ciasteczek. Zmień jej ustawienia i "
+"spróbuj ponownie."
+
+#: contrib/admin/sites.py:265 contrib/admin/sites.py:271
+#: contrib/admin/views/decorators.py:94
+msgid "Usernames cannot contain the '@' character."
+msgstr "Nazwy użytkowników nie mogą zawierać znaku '@'."
+
+#: contrib/admin/sites.py:268 contrib/admin/views/decorators.py:90
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "Podany adres e-mail nie jest Twoją nazwą użytkownika. Spróbuj '%s'."
+
+#: contrib/admin/sites.py:336
+msgid "Site administration"
+msgstr "Administracja stroną"
+
+#: contrib/admin/sites.py:358 contrib/admin/templates/admin/login.html:27
+#: contrib/admin/templates/registration/password_reset_complete.html:14
+#: contrib/admin/views/decorators.py:30
+msgid "Log in"
+msgstr "Zaloguj się"
+
+#: contrib/admin/sites.py:403
+#, python-format
+msgid "%s administration"
+msgstr "%s - administracja"
+
+#: contrib/admin/util.py:138
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Jedno lub więcej %(fieldname)s w %(name)s: %(obj)s"
+
+#: contrib/admin/util.py:143
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Jedno lub więcej %(fieldname)s w %(name)s:"
+
+#: contrib/admin/widgets.py:65
+msgid "Date:"
+msgstr "Data:"
+
+#: contrib/admin/widgets.py:65
+msgid "Time:"
+msgstr "Czas:"
+
+#: contrib/admin/widgets.py:89
+msgid "Currently:"
+msgstr "Teraz:"
+
+#: contrib/admin/widgets.py:89
+msgid "Change:"
+msgstr "Zmień:"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Strona nie znaleziona"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Niestety, żądana strona nie została znaleziona."
+
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/app_index.html:8
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/change_form.html:17
+#: contrib/admin/templates/admin/change_list.html:8
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/auth/user/change_password.html:10
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_reset_complete.html:4
+#: contrib/admin/templates/registration/password_reset_confirm.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Początek"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Błąd serwera"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Błąd serwera (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Błąd Serwera <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Wystąpił niespodziewany błąd. Raport został wysłany e-mailem "
+"administratorowi strony i powinien zostać wkrótce naprawiony. Dziękujemy za "
+"cierpliwość."
+
+#: contrib/admin/templates/admin/app_index.html:10
+#: contrib/admin/templates/admin/index.html:19
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "Witaj,"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Dokumentacja"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:13
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+msgid "Change password"
+msgstr "Zmiana hasła"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/comments/templates/comments/form.html:6
+msgid "Log out"
+msgstr "Wyloguj się"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Administracja stroną Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Administracja Django"
+
+#: contrib/admin/templates/admin/change_form.html:20
+#: contrib/admin/templates/admin/index.html:29
+msgid "Add"
+msgstr "Dodaj"
+
+#: contrib/admin/templates/admin/change_form.html:27
+#: contrib/admin/templates/admin/object_history.html:5
+msgid "History"
+msgstr "Historia"
+
+#: contrib/admin/templates/admin/change_form.html:28
+msgid "View on site"
+msgstr "Pokaż na stronie"
+
+#: contrib/admin/templates/admin/change_form.html:38
+#: contrib/admin/templates/admin/auth/user/change_password.html:22
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Proszę popraw poniższy błąd."
+msgstr[1] "Proszę popraw poniższe błędy."
+msgstr[2] "Proszę popraw poniższe błędy."
+
+#: contrib/admin/templates/admin/change_list.html:16
+#, python-format
+msgid "Add %(name)s"
+msgstr "Dodaj %(name)s"
+
+#: contrib/admin/templates/admin/change_list.html:26
+msgid "Filter"
+msgstr "Filtr"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:10
+#: contrib/admin/templates/admin/submit_line.html:4
+#: contrib/admin/templates/admin/edit_inline/tabular.html:15
+msgid "Delete"
+msgstr "Usuń"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:16
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Skasowanie %(object_name)s '%(escaped_object)s' spowoduje usunięcie "
+"zależnych obiektów, lecz nie posiadasz uprawnień do usunięcia następujących "
+"typów obiektów:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:23
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Czy chcesz skasować %(object_name)s \"%(escaped_object)s\"? Następujące "
+"zależne obiekty zostaną skasowane:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:28
+msgid "Yes, I'm sure"
+msgstr "Tak, na pewno"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Używając %(filter_title)s "
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Modele dostępne w aplikacji %(name)s."
+
+#: contrib/admin/templates/admin/index.html:35
+msgid "Change"
+msgstr "Zmień"
+
+#: contrib/admin/templates/admin/index.html:45
+msgid "You don't have permission to edit anything."
+msgstr "Nie masz uprawnień by edytować cokolwiek."
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "Recent Actions"
+msgstr "Ostatnie akcje"
+
+#: contrib/admin/templates/admin/index.html:54
+msgid "My Actions"
+msgstr "Moje akcje"
+
+#: contrib/admin/templates/admin/index.html:58
+msgid "None available"
+msgstr "Brak"
+
+#: contrib/admin/templates/admin/invalid_setup.html:7
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Instalacja Twojej bazy danych jest niepoprawna. Upewnij się, że odpowiednie "
+"tabele zostały utworzone i odpowiedni użytkownik jest uprawniony do ich "
+"odczytu."
+
+#: contrib/admin/templates/admin/login.html:19
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+msgid "Username:"
+msgstr "Nazwa użytkownika:"
+
+#: contrib/admin/templates/admin/login.html:22
+#: contrib/comments/templates/comments/form.html:8
+msgid "Password:"
+msgstr "Hasło:"
+
+#: contrib/admin/templates/admin/object_history.html:16
+msgid "Date/time"
+msgstr "Data/czas"
+
+#: contrib/admin/templates/admin/object_history.html:17
+msgid "User"
+msgstr "Użytkownik"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Action"
+msgstr "Akcja"
+
+#: contrib/admin/templates/admin/object_history.html:24
+#: utils/translation/trans_real.py:402
+msgid "DATETIME_FORMAT"
+msgstr "Y-m-d H:i:s"
+
+#: contrib/admin/templates/admin/object_history.html:32
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Ten obiekt nie ma historii zmian. Najprawdopodobniej wpis ten nie został "
+"dodany poprzez panel administracyjny."
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Pokaż wszystko"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Szukaj"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 wynik"
+msgstr[1] "%(counter)s wyniki"
+msgstr[2] "%(counter)s wyników"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s trafień"
+
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Save"
+msgstr "Zapisz"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save as new"
+msgstr "Zapisz jako nowe"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and add another"
+msgstr "Zapisz i dodaj nowe"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save and continue editing"
+msgstr "Zapisz i kontynuuj edycję"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Najpierw podaj nazwę użytkownika i hasło. Następnie będziesz mógł edytować "
+"więcej opcji użytkownika."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:13
+#: contrib/auth/forms.py:14 contrib/auth/forms.py:51
+msgid "Username"
+msgstr "Nazwa użytkownika"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:20
+#: contrib/admin/templates/admin/auth/user/change_password.html:33
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:52 contrib/auth/forms.py:176
+msgid "Password"
+msgstr "Hasło"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:26
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+#: contrib/auth/forms.py:177
+msgid "Password (again)"
+msgstr "Hasło (powtórz)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:27
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+msgid "Enter the same password as above, for verification."
+msgstr "Podaj powyższe hasło w celu weryfikacji."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:26
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Podaj nowe hasło dla użytkownika <strong>%(username)s</strong>."
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Dziękujemy za odwiedzenie serwisu."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Zaloguj ponownie"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Zmiana hasła"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Hasło zmienione"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Twoje hasło zostało zmienione."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr "Podaj swoje stare hasło i dwa razy nowe."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Stare hasło:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+#: contrib/admin/templates/registration/password_reset_confirm.html:18
+msgid "New password:"
+msgstr "Nowe hasło:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+#: contrib/admin/templates/registration/password_reset_confirm.html:20
+msgid "Confirm password:"
+msgstr "Potwierdź hasło:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+#: contrib/admin/templates/registration/password_reset_confirm.html:21
+msgid "Change my password"
+msgstr "Zmień hasło"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:4
+#: contrib/admin/templates/registration/password_reset_confirm.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+msgid "Password reset"
+msgstr "Zresetuj hasło"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:6
+#: contrib/admin/templates/registration/password_reset_complete.html:10
+msgid "Password reset complete"
+msgstr "Resetowanie hasła zakończone"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:12
+msgid "Your password has been set.  You may go ahead and log in now."
+msgstr "Twoje hasło zostało ustawione. Możesz się teraz zalogować."
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:4
+msgid "Password reset confirmation"
+msgstr "Potwierdzenie zresetowania hasła"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:12
+msgid "Enter new password"
+msgstr "Podaj nowe hasło"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:14
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Podaj dwukrotnie nowe hasło, by można było zweryfikować, czy zostało wpisane "
+"poprawnie."
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:26
+msgid "Password reset unsuccessful"
+msgstr "Resetowanie hasła nieudane"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:28
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used.  Please request a new password reset."
+msgstr ""
+"Link do resetowania hasła był niepoprawny, być może dlatego, że został już "
+"raz użyty. Możesz ponownie zażądać zresetowania hasła."
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Udane resetowanie hasła"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed you instructions for setting your password to the e-mail "
+"address you submitted. You should be receiving it shortly."
+msgstr ""
+"Instrukcje dalszego postępowania zostały wysłane na podany adres e-mail. "
+"Powinieneś otrzymać je niebawem."
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Otrzymałeś ten e-mail gdyż zażądałeś zresetowania hasła"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "dla twojego konta użytkownika na stronie %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+msgid "Please go to the following page and choose a new password:"
+msgstr "Proszę, idź do podanej strony i wybierz nowe hasło:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:9
+msgid "Your username, in case you've forgotten:"
+msgstr "Twoja nazwa użytkownika:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Thanks for using our site!"
+msgstr "Dziękujemy za używanie naszej strony!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Zespół %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll e-mail "
+"instructions for setting a new one."
+msgstr ""
+"Zapomniałeś hasła? Podaj swój adres e-mail, a prześlemy Ci instrukcję, jak "
+"ustawić nowe hasło."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Adres e-mail:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Zresetuj moje hasło"
+
+#: contrib/admin/templatetags/admin_list.py:284
+msgid "All dates"
+msgstr "Wszystkie daty"
+
+#: contrib/admin/views/main.py:65
+#, python-format
+msgid "Select %s"
+msgstr "Zaznacz %s"
+
+#: contrib/admin/views/main.py:65
+#, python-format
+msgid "Select %s to change"
+msgstr "Zaznacz %s aby zmienić"
+
+#: contrib/admin/views/template.py:36 contrib/sites/models.py:38
+msgid "site"
+msgstr "strona"
+
+#: contrib/admin/views/template.py:38
+msgid "template"
+msgstr "szablon"
+
+#: contrib/admindocs/views.py:53 contrib/admindocs/views.py:55
+#: contrib/admindocs/views.py:57
+msgid "tag:"
+msgstr "tag:"
+
+#: contrib/admindocs/views.py:87 contrib/admindocs/views.py:89
+#: contrib/admindocs/views.py:91
+msgid "filter:"
+msgstr "filtr:"
+
+#: contrib/admindocs/views.py:153 contrib/admindocs/views.py:155
+#: contrib/admindocs/views.py:157
+msgid "view:"
+msgstr "widok:"
+
+#: contrib/admindocs/views.py:187
+#, python-format
+msgid "App %r not found"
+msgstr "Aplikacja %r nie została znaleziona"
+
+#: contrib/admindocs/views.py:194
+#, python-format
+msgid "Model %(model_name)r not found in app %(app_label)r"
+msgstr "Model %(model_name)r nie został znaleziony w aplikacji %(app_label)r"
+
+#: contrib/admindocs/views.py:206
+#, python-format
+msgid "the related `%(app_label)s.%(data_type)s` object"
+msgstr "powiązany obiekt `%(app_label)s.%(data_type)s`"
+
+#: contrib/admindocs/views.py:206 contrib/admindocs/views.py:228
+#: contrib/admindocs/views.py:242 contrib/admindocs/views.py:247
+msgid "model:"
+msgstr "model:"
+
+#: contrib/admindocs/views.py:237
+#, python-format
+msgid "related `%(app_label)s.%(object_name)s` objects"
+msgstr "powiązane obiekty `%(app_label)s.%(object_name)s`"
+
+#: contrib/admindocs/views.py:242
+#, python-format
+msgid "all %s"
+msgstr "wszystkie %s"
+
+#: contrib/admindocs/views.py:247
+#, python-format
+msgid "number of %s"
+msgstr "liczba %s"
+
+#: contrib/admindocs/views.py:253
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Pola obiektów %s"
+
+#: contrib/admindocs/views.py:317 contrib/admindocs/views.py:328
+#: contrib/admindocs/views.py:330 contrib/admindocs/views.py:336
+#: contrib/admindocs/views.py:337 contrib/admindocs/views.py:339
+msgid "Integer"
+msgstr "Liczba całkowita"
+
+#: contrib/admindocs/views.py:318
+msgid "Boolean (Either True or False)"
+msgstr "Wartość logiczna (True, False - prawda lub fałsz)"
+
+#: contrib/admindocs/views.py:319 contrib/admindocs/views.py:338
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Łańcuch (do %(max_length)s znaków)"
+
+#: contrib/admindocs/views.py:320
+msgid "Comma-separated integers"
+msgstr "Liczby całkowite rozdzielone przecinkami"
+
+#: contrib/admindocs/views.py:321
+msgid "Date (without time)"
+msgstr "Data (bez godziny)"
+
+#: contrib/admindocs/views.py:322
+msgid "Date (with time)"
+msgstr "Data (z godziną)"
+
+#: contrib/admindocs/views.py:323
+msgid "Decimal number"
+msgstr "Liczba dziesiętna"
+
+#: contrib/admindocs/views.py:324
+msgid "E-mail address"
+msgstr "Adres e-mail"
+
+#: contrib/admindocs/views.py:325 contrib/admindocs/views.py:326
+#: contrib/admindocs/views.py:329
+msgid "File path"
+msgstr "Ścieżka do pliku"
+
+#: contrib/admindocs/views.py:327
+msgid "Floating point number"
+msgstr "Liczba zmiennoprzecinkowa"
+
+#: contrib/admindocs/views.py:331 contrib/comments/models.py:89
+msgid "IP address"
+msgstr "Adres IP"
+
+#: contrib/admindocs/views.py:333
+msgid "Boolean (Either True, False or None)"
+msgstr "Wartość logiczna (True, False, None - prawda, fałsz lub nic)"
+
+#: contrib/admindocs/views.py:334
+msgid "Relation to parent model"
+msgstr "Relacja do modelu rodzica"
+
+#: contrib/admindocs/views.py:335
+msgid "Phone number"
+msgstr "Numer telefonu"
+
+#: contrib/admindocs/views.py:340
+msgid "Text"
+msgstr "Tekst"
+
+#: contrib/admindocs/views.py:341
+msgid "Time"
+msgstr "Czas"
+
+#: contrib/admindocs/views.py:342 contrib/flatpages/admin.py:8
+#: contrib/flatpages/models.py:8
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admindocs/views.py:343
+msgid "U.S. state (two uppercase letters)"
+msgstr "Stan USA (dwie duże litery)"
+
+#: contrib/admindocs/views.py:344
+msgid "XML text"
+msgstr "Tekst XML"
+
+#: contrib/admindocs/views.py:370
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s nie jest obiektem urlpattern"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Zakładki"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:4
+msgid "Documentation bookmarklets"
+msgstr "Zakładki Dokumentacji"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:8
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">Aby zainstalować skryptozakładki, przeciągnij łącze do "
+"paska zakładek\n"
+"lub kliknij prawym klawiszem na łączu i dodaj je do zakładek. Teraz możesz\n"
+"wybrać skryptozakładkę na dowolnej stronie serwisu. Uwaga: niektóre z tych "
+"skryptozakładek wymagają przeglądania serwisu z komputera\n"
+"\"wewnętrznego\" (skontaktuj się z administratorem systemu, jeśli nie jesteś "
+"pewien, czy ten komputer jest \"wewnętrznym\").</p>\n"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:18
+msgid "Documentation for this page"
+msgstr "Dokumentacja dla tej strony"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:19
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+"Przekierowuje z dowolnej strony do dokumentacji dla widoku, który ją "
+"generuje."
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:21
+msgid "Show object ID"
+msgstr "Pokaż ID obiektu"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:22
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Pokazuje typ i unikalne ID dla stron, które reprezentują pojedynczy obiekt."
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:24
+msgid "Edit this object (current window)"
+msgstr "Edytuj ten obiekt (bieżące okno)"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:25
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+"Przeskok do panelu administratora dla stron reprezentujących pojedynczy "
+"obiekt."
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:27
+msgid "Edit this object (new window)"
+msgstr "Edytuj ten obiekt (nowe okno)"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:28
+msgid "As above, but opens the admin page in a new window."
+msgstr "Jak wyżej, tyle że otwiera nowe okno."
+
+#: contrib/auth/admin.py:21
+msgid "Personal info"
+msgstr "Dane osobowe"
+
+#: contrib/auth/admin.py:22
+msgid "Permissions"
+msgstr "Uprawnienia"
+
+#: contrib/auth/admin.py:23
+msgid "Important dates"
+msgstr "Ważne daty"
+
+#: contrib/auth/admin.py:24
+msgid "Groups"
+msgstr "Grupy"
+
+#: contrib/auth/admin.py:61
+msgid "Add user"
+msgstr "Dodaj użytkownika"
+
+#: contrib/auth/admin.py:87
+msgid "Password changed successfully."
+msgstr "Hasło zostało zmienione pomyślnie."
+
+#: contrib/auth/admin.py:93
+#, python-format
+msgid "Change password: %s"
+msgstr "Zmień hasło: %s"
+
+#: contrib/auth/forms.py:15 contrib/auth/models.py:137
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr ""
+"Wymagane. 30 znaków lub mniej. Tylko znaki alfanumeryczne (litery, cyfry i "
+"podkreślenia)."
+
+#: contrib/auth/forms.py:16 core/validators.py:72
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "To pole może zawierać tylko litery, cyfry i podkreślenia."
+
+#: contrib/auth/forms.py:18
+msgid "Password confirmation"
+msgstr "Potwierdzenie hasła"
+
+#: contrib/auth/forms.py:30
+msgid "A user with that username already exists."
+msgstr "Użytkownik o tej nazwie już istnieje."
+
+#: contrib/auth/forms.py:36 contrib/auth/forms.py:146
+#: contrib/auth/forms.py:188
+msgid "The two password fields didn't match."
+msgstr "Hasła się nie zgadzają."
+
+#: contrib/auth/forms.py:74 contrib/comments/views/comments.py:58
+msgid "This account is inactive."
+msgstr "To konto jest nieaktywne."
+
+#: contrib/auth/forms.py:79 contrib/comments/views/comments.py:49
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"Twoja przeglądarka nie chce akceptować ciasteczek. Są one wymagane do "
+"zalogowania się."
+
+#: contrib/auth/forms.py:92
+msgid "E-mail"
+msgstr "E-mail"
+
+#: contrib/auth/forms.py:101
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr ""
+"Ten adres e-mail nie ma przypisanego konta. Jesteś pewien, że "
+"zarejestrowałeś się?"
+
+#: contrib/auth/forms.py:126
+#, python-format
+msgid "Password reset on %s"
+msgstr "Hasło zresetowane dla %s"
+
+#: contrib/auth/forms.py:134
+msgid "New password"
+msgstr "Nowe hasło"
+
+#: contrib/auth/forms.py:135
+msgid "New password confirmation"
+msgstr "Nowe hasło ponownie"
+
+#: contrib/auth/forms.py:160
+msgid "Old password"
+msgstr "Stare hasło"
+
+#: contrib/auth/forms.py:168
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Podane stare hasło jest niepoprawne. Proszę podać je jeszcze raz."
+
+#: contrib/auth/models.py:73 contrib/auth/models.py:96
+msgid "name"
+msgstr "nazwa"
+
+#: contrib/auth/models.py:75
+msgid "codename"
+msgstr "nazwa kodowa"
+
+#: contrib/auth/models.py:78
+msgid "permission"
+msgstr "uprawnienie"
+
+#: contrib/auth/models.py:79 contrib/auth/models.py:97
+msgid "permissions"
+msgstr "uprawnienia"
+
+#: contrib/auth/models.py:100
+msgid "group"
+msgstr "grupa"
+
+#: contrib/auth/models.py:101 contrib/auth/models.py:147
+msgid "groups"
+msgstr "grupy"
+
+#: contrib/auth/models.py:137
+msgid "username"
+msgstr "użytkownik"
+
+#: contrib/auth/models.py:138
+msgid "first name"
+msgstr "imię"
+
+#: contrib/auth/models.py:139
+msgid "last name"
+msgstr "nazwisko"
+
+#: contrib/auth/models.py:140
+msgid "e-mail address"
+msgstr "adres e-mail"
+
+#: contrib/auth/models.py:141
+msgid "password"
+msgstr "hasło"
+
+#: contrib/auth/models.py:141
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"Użyj '[algo]$[salt]$[hexdigest]' lub <a href=\"password/\">formularza zmiany "
+"hasła</a>."
+
+#: contrib/auth/models.py:142
+msgid "staff status"
+msgstr "w zespole"
+
+#: contrib/auth/models.py:142
+msgid "Designates whether the user can log into this admin site."
+msgstr "Oznacza czy użytkownik może zalogować się do panelu admina."
+
+#: contrib/auth/models.py:143
+msgid "active"
+msgstr "aktywny"
+
+#: contrib/auth/models.py:143
+msgid ""
+"Designates whether this user should be treated as active. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"Oznacza czy użytkownika należy uważać za aktywnego. Odznacz to, zamiast "
+"usuwać konta."
+
+#: contrib/auth/models.py:144
+msgid "superuser status"
+msgstr "status administratora"
+
+#: contrib/auth/models.py:144
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr ""
+"Oznacza, że ten użytkownik ma wszystkie uprawnienia bez jawnego "
+"przypisywania ich."
+
+#: contrib/auth/models.py:145
+msgid "last login"
+msgstr "ostatnio zalogowany"
+
+#: contrib/auth/models.py:146
+msgid "date joined"
+msgstr "data przyłączenia"
+
+#: contrib/auth/models.py:148
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"Oprócz uprawnień przypisanych bezpośrednio użytkownikowi otrzyma on "
+"uprawnienia grup, do których należy."
+
+#: contrib/auth/models.py:149
+msgid "user permissions"
+msgstr "uprawnienia użytkownika"
+
+#: contrib/auth/models.py:153
+msgid "user"
+msgstr "użytkownik"
+
+#: contrib/auth/models.py:154
+msgid "users"
+msgstr "użytkownicy"
+
+#: contrib/auth/models.py:309
+msgid "message"
+msgstr "wiadomość"
+
+#: contrib/auth/views.py:50
+msgid "Logged out"
+msgstr "Wylogowany"
+
+#: contrib/comments/models.py:71 contrib/comments/models.py:164
+msgid "object ID"
+msgstr "ID obiektu"
+
+#: contrib/comments/models.py:72
+msgid "headline"
+msgstr "nagłówek"
+
+#: contrib/comments/models.py:73 contrib/comments/models.py:95
+#: contrib/comments/models.py:165
+msgid "comment"
+msgstr "komentarz"
+
+#: contrib/comments/models.py:74
+msgid "rating #1"
+msgstr "ocena #1"
+
+#: contrib/comments/models.py:75
+msgid "rating #2"
+msgstr "ocena #2"
+
+#: contrib/comments/models.py:76
+msgid "rating #3"
+msgstr "ocena #3"
+
+#: contrib/comments/models.py:77
+msgid "rating #4"
+msgstr "ocena #4"
+
+#: contrib/comments/models.py:78
+msgid "rating #5"
+msgstr "ocena #5"
+
+#: contrib/comments/models.py:79
+msgid "rating #6"
+msgstr "ocena #6"
+
+#: contrib/comments/models.py:80
+msgid "rating #7"
+msgstr "ocena #7"
+
+#: contrib/comments/models.py:81
+msgid "rating #8"
+msgstr "ocena #8"
+
+#: contrib/comments/models.py:86
+msgid "is valid rating"
+msgstr "jest poprawną oceną"
+
+#: contrib/comments/models.py:87 contrib/comments/models.py:167
+msgid "date/time submitted"
+msgstr "data/czas dodania"
+
+#: contrib/comments/models.py:88 contrib/comments/models.py:168
+msgid "is public"
+msgstr "publicznie dostępny"
+
+#: contrib/comments/models.py:90
+msgid "is removed"
+msgstr "usunięty"
+
+#: contrib/comments/models.py:90
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Zaznacz to pole jeżeli komentarz jest nieodpowiedni. Wyświetlony zostanie "
+"tekst \"Ten komentarz został usunięty\"."
+
+#: contrib/comments/models.py:96
+msgid "comments"
+msgstr "komentarze"
+
+#: contrib/comments/models.py:128 contrib/comments/models.py:199
+msgid "Content object"
+msgstr "Obiekt treści"
+
+#: contrib/comments/models.py:156
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Dodane przez %(user)s dnia %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:166
+msgid "person's name"
+msgstr "Nazwa osoby"
+
+#: contrib/comments/models.py:169
+msgid "ip address"
+msgstr "adres IP"
+
+#: contrib/comments/models.py:171
+msgid "approved by staff"
+msgstr "zaakceptowano"
+
+#: contrib/comments/models.py:175
+msgid "free comment"
+msgstr "wolny komentarz"
+
+#: contrib/comments/models.py:176
+msgid "free comments"
+msgstr "wolne komentarze"
+
+#: contrib/comments/models.py:227
+msgid "score"
+msgstr "ilość punktów"
+
+#: contrib/comments/models.py:228
+msgid "score date"
+msgstr "data przyznania punktów"
+
+#: contrib/comments/models.py:232
+msgid "karma score"
+msgstr "ilość punktów"
+
+#: contrib/comments/models.py:233
+msgid "karma scores"
+msgstr "wyniki"
+
+#: contrib/comments/models.py:237
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d ocenę przez %(user)s"
+
+#: contrib/comments/models.py:254
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Komentarz oflagowany przez %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:262
+msgid "flag date"
+msgstr "data flagi"
+
+#: contrib/comments/models.py:266
+msgid "user flag"
+msgstr "flaga użytkownika"
+
+#: contrib/comments/models.py:267
+msgid "user flags"
+msgstr "flagi użytkownika"
+
+#: contrib/comments/models.py:271
+#, python-format
+msgid "Flag by %r"
+msgstr "Flaga %r"
+
+#: contrib/comments/models.py:277
+msgid "deletion date"
+msgstr "data skasowania"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "usunięcie moderatora"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "usunięcia moderatorów"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Usunięcie moderatora przez %r"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Zapomniałeś hasło?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Oceny"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Wymagane"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Opcjonalne"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Wyślij zdjęcie"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Komentarz:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Podgląd"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Twoje imię:"
+
+#: contrib/comments/views/comments.py:76
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr "Ta ocena jest wymagana gdyż podałeś przynajmniej jedną inną ocenę."
+
+#: contrib/comments/views/comments.py:160
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Ten komentarz został wysłany przez użytkownika, który wysłał mniej niż %"
+"(count)s komentarz:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Ten komentarz został wysłany przez użytkownika, który wysłał mniej niż %"
+"(count)s komentarze:\n"
+"\n"
+"%(text)s"
+msgstr[2] ""
+"Ten komentarz został wysłany przez użytkownika, który wysłał mniej niż %"
+"(count)s komentarzy:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:165
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Ten komentarz został dodany przez użytkownika::\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:238
+#: contrib/comments/views/comments.py:331
+msgid "Only POSTs are allowed"
+msgstr "Dozwolone tylko POSTy"
+
+#: contrib/comments/views/comments.py:242
+#: contrib/comments/views/comments.py:335
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Jedno lub więcej wymaganych pól nie zostało wypełnionych"
+
+#: contrib/comments/views/comments.py:246
+#: contrib/comments/views/comments.py:337
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr ""
+"Ktoś próbował obejść zabezpieczenia formularza komentarzy (naruszenie "
+"bezpieczeństwa)"
+
+#: contrib/comments/views/comments.py:256
+#: contrib/comments/views/comments.py:343
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"Formularz komentarza miał niepoprawny parametr 'target' -- ID obiektu było "
+"niepoprawne"
+
+#: contrib/comments/views/comments.py:307
+#: contrib/comments/views/comments.py:372
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "Formularz komentarza nie zapewnił obiektów 'preview' ani 'post'"
+
+#: contrib/comments/views/karma.py:21
+msgid "Anonymous users cannot vote"
+msgstr "Anonimowi użytkownicy nie mogą głosować"
+
+#: contrib/comments/views/karma.py:25
+msgid "Invalid comment ID"
+msgstr "Błędny ID komentarza"
+
+#: contrib/comments/views/karma.py:27
+msgid "No voting for yourself"
+msgstr "Nie można głosować na siebie"
+
+#: contrib/contenttypes/models.py:67
+msgid "python model class name"
+msgstr "nazwa pythonowa modelu klasy"
+
+#: contrib/contenttypes/models.py:71
+msgid "content type"
+msgstr "typ zawartości"
+
+#: contrib/contenttypes/models.py:72
+msgid "content types"
+msgstr "typy zawartości"
+
+#: contrib/flatpages/admin.py:9
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Przykład: '/about/contact/'. Upewnij się że wpisałeś otwierający i "
+"zamykający ukośnik."
+
+#: contrib/flatpages/admin.py:11 core/validators.py:76
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"To pole może zawierać jedynie litery, cyfry, podkreślenia, myślniki i "
+"ukośniki."
+
+#: contrib/flatpages/admin.py:22
+msgid "Advanced options"
+msgstr "Opcje zaawansowane"
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "tytuł"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "zawartość"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "włącz komentarze"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "nazwa szablonu"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"Przykład: 'flatpages/contact_page.html'. Jeżeli nie zostanie podane, system "
+"użyje 'flatpages/default.html'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "wymagana rejestracja"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+"Jeżeli zaznaczone - tylko zalogowani użytkownicy będą mogli zobaczyć stronę."
+
+#: contrib/flatpages/models.py:19
+msgid "flat page"
+msgstr "strona statyczna"
+
+#: contrib/flatpages/models.py:20
+msgid "flat pages"
+msgstr "strony statyczne"
+
+#: contrib/gis/forms/fields.py:10
+msgid "No geometry value provided."
+msgstr ""
+
+#: contrib/gis/forms/fields.py:11
+msgid "Invalid Geometry value."
+msgstr "Błędna wartość geometrii"
+
+#: contrib/gis/forms/fields.py:12
+msgid "Invalid Geometry type."
+msgstr "Błędny typ geometrii"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "th"
+msgstr "-y"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "st"
+msgstr "-szy"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "nd"
+msgstr "-gi"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "rd"
+msgstr "-ci"
+
+#: contrib/humanize/templatetags/humanize.py:51
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f milion"
+msgstr[1] "%(value).1f miliony"
+msgstr[2] "%(value).1f milionów"
+
+#: contrib/humanize/templatetags/humanize.py:54
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f miliard"
+msgstr[1] "%(value).1f miliardy"
+msgstr[2] "%(value).1f miliardów"
+
+#: contrib/humanize/templatetags/humanize.py:57
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f bilion"
+msgstr[1] "%(value).1f biliony"
+msgstr[2] "%(value).1f bilionów"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "one"
+msgstr "jeden"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "two"
+msgstr "dwa"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "three"
+msgstr "trzy"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "four"
+msgstr "cztery"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "five"
+msgstr "pięć"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "six"
+msgstr "sześć"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "seven"
+msgstr "siedem"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "eight"
+msgstr "osiem"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "nine"
+msgstr "dziewięć"
+
+#: contrib/humanize/templatetags/humanize.py:93
+msgid "today"
+msgstr "dzisiaj"
+
+#: contrib/humanize/templatetags/humanize.py:95
+msgid "tomorrow"
+msgstr "jutro"
+
+#: contrib/humanize/templatetags/humanize.py:97
+msgid "yesterday"
+msgstr "wczoraj"
+
+#: contrib/localflavor/ar/forms.py:27
+msgid "Enter a postal code in the format NNNN or ANNNNAAA."
+msgstr "Wpisz kod pocztowy w formacie NNNN lub ANNNNAAA."
+
+#: contrib/localflavor/ar/forms.py:49 contrib/localflavor/br/forms.py:96
+#: contrib/localflavor/br/forms.py:135 contrib/localflavor/pe/forms.py:23
+#: contrib/localflavor/pe/forms.py:51
+msgid "This field requires only numbers."
+msgstr "To pole może zawierać jedynie liczby."
+
+#: contrib/localflavor/ar/forms.py:50
+msgid "This field requires 7 or 8 digits."
+msgstr "To pole musi zawierać 7 lub 8 cyfr."
+
+#: contrib/localflavor/ar/forms.py:79
+msgid "Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format."
+msgstr "Podaj poprawny numer CUIT w formacie XX-XXXXXXXX-X lub XXXXXXXXXXXX."
+
+#: contrib/localflavor/ar/forms.py:80
+msgid "Invalid CUIT."
+msgstr "Niepoprawny CUIT"
+
+#: contrib/localflavor/at/at_states.py:5
+msgid "Burgenland"
+msgstr "Burgenland"
+
+#: contrib/localflavor/at/at_states.py:6
+msgid "Carinthia"
+msgstr "Karyntia"
+
+#: contrib/localflavor/at/at_states.py:7
+msgid "Lower Austria"
+msgstr "Dolna Austria"
+
+#: contrib/localflavor/at/at_states.py:8
+msgid "Upper Austria"
+msgstr "Górna Austria"
+
+#: contrib/localflavor/at/at_states.py:9
+msgid "Salzburg"
+msgstr "Salzburg"
+
+#: contrib/localflavor/at/at_states.py:10
+msgid "Styria"
+msgstr "Styria"
+
+#: contrib/localflavor/at/at_states.py:11
+msgid "Tyrol"
+msgstr "Tyrol"
+
+#: contrib/localflavor/at/at_states.py:12
+msgid "Vorarlberg"
+msgstr "Vorarlberg"
+
+#: contrib/localflavor/at/at_states.py:13
+msgid "Vienna"
+msgstr "Wiedeń"
+
+#: contrib/localflavor/at/forms.py:20 contrib/localflavor/ch/forms.py:16
+#: contrib/localflavor/no/forms.py:12
+msgid "Enter a zip code in the format XXXX."
+msgstr "Wpisz kod pocztowy w formacie XXXX."
+
+#: contrib/localflavor/at/forms.py:48
+msgid "Enter a valid Austrian Social Security Number in XXXX XXXXXX format."
+msgstr ""
+"Wpisz poprawny numer austriackiego ubezpieczenia w formacie XXXX XXXXXX."
+
+#: contrib/localflavor/au/forms.py:16
+msgid "Enter a 4 digit post code."
+msgstr "Wpisz czterocyfrowy kod pocztowy."
+
+#: contrib/localflavor/br/forms.py:21
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Wpisz kod pocztowy w formacie XXXXX-XXX."
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "Numery telefoniczne muszą być w formacie XX-XXXX-XXXX."
+
+#: contrib/localflavor/br/forms.py:58
+msgid ""
+"Select a valid brazilian state. That state is not one of the available "
+"states."
+msgstr ""
+"Wybierz poprawny brazylijski stan. Ten stan nie jest jednym z dostępnych "
+"stanów."
+
+#: contrib/localflavor/br/forms.py:94
+msgid "Invalid CPF number."
+msgstr "Błędny numer CPF."
+
+#: contrib/localflavor/br/forms.py:95
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr "To pole nie może zawierać więcej niż 11 cyfr lub 14 znaków."
+
+#: contrib/localflavor/br/forms.py:134
+msgid "Invalid CNPJ number."
+msgstr "Błędny numer CNPJ."
+
+#: contrib/localflavor/br/forms.py:136
+msgid "This field requires at least 14 digits"
+msgstr "To pole musi zawierać co najmniej 14 cyfr"
+
+#: contrib/localflavor/ca/forms.py:17
+msgid "Enter a postal code in the format XXX XXX."
+msgstr "Wpisz kod pocztowy w formacie XXX XXX."
+
+#: contrib/localflavor/ca/forms.py:88
+msgid "Enter a valid Canadian Social Insurance number in XXX-XXX-XXX format."
+msgstr ""
+"Wpisz poprawny numer kanadyjskiego ubezpieczenia w formacie XXX-XXX-XXXX."
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr "Argowia"
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr "Appenzell Innerrhoden"
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr "Appenzell Ausserrhoden"
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr "Bazylea-miasto"
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr "Bazylea-okręg"
+
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr "Berno"
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr "Fryburg"
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr "Genewa"
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr "Glarus"
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr "Gryzonia"
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr "Jura"
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr "Lucerna"
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr "Neuchatel"
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr "Nidwalden"
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr "Obwalden"
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr "Szafuza"
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr "Schwyz"
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr "Solura"
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr "Sankt Gallen"
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr "Turgowia"
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr "Ticino"
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr "Uri"
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr "Valais"
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr "Vaud"
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr "Zug"
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr "Zurych"
+
+#: contrib/localflavor/ch/forms.py:64
+msgid ""
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
+msgstr ""
+"Podaj poprawny numer szwajcarskiego dowodu osobistego lub paszportu w "
+"formacie X1234567<0 lub 1234567890."
+
+#: contrib/localflavor/cl/forms.py:29
+msgid "Enter a valid Chilean RUT."
+msgstr "Wpisz poprawny chilijski RUT."
+
+#: contrib/localflavor/cl/forms.py:30
+msgid "Enter a valid Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr "Podaj poprawny chilijski RUT w formacie XX.XXX.XXX-X."
+
+#: contrib/localflavor/cl/forms.py:31
+msgid "The Chilean RUT is not valid."
+msgstr "Podany chilijski RUT jest nieprawidłowy."
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr "Badenia-Wirtembergia"
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr "Bawaria"
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr "Berlin"
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr "Brandenburgia"
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr "Brema"
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr "Hamburg"
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr "Hesja"
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr "Meklemburgia-Pomorze Zachodnie"
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr "Dolna Saksonia"
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr "Nadrenia Północna-Westfalia"
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr "Nadrenia-Palatynat"
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr "Kraj Saary"
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr "Saksonia"
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr "Saksonia-Anhalt"
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr "Szlezwik-Holsztyn"
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr "Turyngia"
+
+#: contrib/localflavor/de/forms.py:14 contrib/localflavor/fi/forms.py:12
+#: contrib/localflavor/fr/forms.py:15
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Wpisz kod pocztowy w formacie XXXXX."
+
+#: contrib/localflavor/de/forms.py:41
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr ""
+"Podaj poprawny numer niemieckiego dowodu osobistego w formacie XXXXXXXXXXX-"
+"XXXXXXX-XXXXXXX-X."
+
+#: contrib/localflavor/es/es_provinces.py:5
+msgid "Arava"
+msgstr "Arawa"
+
+#: contrib/localflavor/es/es_provinces.py:6
+msgid "Albacete"
+msgstr "Albacete"
+
+#: contrib/localflavor/es/es_provinces.py:7
+msgid "Alacant"
+msgstr "Alicante"
+
+#: contrib/localflavor/es/es_provinces.py:8
+msgid "Almeria"
+msgstr "Almeria"
+
+#: contrib/localflavor/es/es_provinces.py:9
+msgid "Avila"
+msgstr "Avila"
+
+#: contrib/localflavor/es/es_provinces.py:10
+msgid "Badajoz"
+msgstr "Badajoz"
+
+#: contrib/localflavor/es/es_provinces.py:11
+msgid "Illes Balears"
+msgstr "Baleary"
+
+#: contrib/localflavor/es/es_provinces.py:12
+msgid "Barcelona"
+msgstr "Barcelona"
+
+#: contrib/localflavor/es/es_provinces.py:13
+msgid "Burgos"
+msgstr "Burgos"
+
+#: contrib/localflavor/es/es_provinces.py:14
+msgid "Caceres"
+msgstr "Caceres"
+
+#: contrib/localflavor/es/es_provinces.py:15
+msgid "Cadiz"
+msgstr "Kadyks"
+
+#: contrib/localflavor/es/es_provinces.py:16
+msgid "Castello"
+msgstr "Castellon"
+
+#: contrib/localflavor/es/es_provinces.py:17
+msgid "Ciudad Real"
+msgstr "Ciudad Real"
+
+#: contrib/localflavor/es/es_provinces.py:18
+msgid "Cordoba"
+msgstr "Kordowa"
+
+#: contrib/localflavor/es/es_provinces.py:19
+msgid "A Coruna"
+msgstr "A Coruna"
+
+#: contrib/localflavor/es/es_provinces.py:20
+msgid "Cuenca"
+msgstr "Cuenca"
+
+#: contrib/localflavor/es/es_provinces.py:21
+msgid "Girona"
+msgstr "Girona"
+
+#: contrib/localflavor/es/es_provinces.py:22
+msgid "Granada"
+msgstr "Granada"
+
+#: contrib/localflavor/es/es_provinces.py:23
+msgid "Guadalajara"
+msgstr "Guadalajara"
+
+#: contrib/localflavor/es/es_provinces.py:24
+msgid "Guipuzkoa"
+msgstr "Gipuzkoa"
+
+#: contrib/localflavor/es/es_provinces.py:25
+msgid "Huelva"
+msgstr "Huelva"
+
+#: contrib/localflavor/es/es_provinces.py:26
+msgid "Huesca"
+msgstr "Huesca"
+
+#: contrib/localflavor/es/es_provinces.py:27
+msgid "Jaen"
+msgstr "Jaen"
+
+#: contrib/localflavor/es/es_provinces.py:28
+msgid "Leon"
+msgstr "Leon"
+
+#: contrib/localflavor/es/es_provinces.py:29
+msgid "Lleida"
+msgstr "Lleida"
+
+#: contrib/localflavor/es/es_provinces.py:30
+#: contrib/localflavor/es/es_regions.py:17
+msgid "La Rioja"
+msgstr "La Rioja"
+
+#: contrib/localflavor/es/es_provinces.py:31
+msgid "Lugo"
+msgstr "Lugo"
+
+#: contrib/localflavor/es/es_provinces.py:32
+#: contrib/localflavor/es/es_regions.py:18
+msgid "Madrid"
+msgstr "Madryt"
+
+#: contrib/localflavor/es/es_provinces.py:33
+msgid "Malaga"
+msgstr "Malaga"
+
+#: contrib/localflavor/es/es_provinces.py:34
+msgid "Murcia"
+msgstr "Murcja"
+
+#: contrib/localflavor/es/es_provinces.py:35
+msgid "Navarre"
+msgstr "Nawarra"
+
+#: contrib/localflavor/es/es_provinces.py:36
+msgid "Ourense"
+msgstr "Ourense"
+
+#: contrib/localflavor/es/es_provinces.py:37
+msgid "Asturias"
+msgstr "Asturia"
+
+#: contrib/localflavor/es/es_provinces.py:38
+msgid "Palencia"
+msgstr "Palencia"
+
+#: contrib/localflavor/es/es_provinces.py:39
+msgid "Las Palmas"
+msgstr "Las Palmas"
+
+#: contrib/localflavor/es/es_provinces.py:40
+msgid "Pontevedra"
+msgstr "Pontevedra"
+
+#: contrib/localflavor/es/es_provinces.py:41
+msgid "Salamanca"
+msgstr "Salamanka"
+
+#: contrib/localflavor/es/es_provinces.py:42
+msgid "Santa Cruz de Tenerife"
+msgstr "Santa Cruz de Tenerife"
+
+#: contrib/localflavor/es/es_provinces.py:43
+#: contrib/localflavor/es/es_regions.py:11
+msgid "Cantabria"
+msgstr "Kantabria"
+
+#: contrib/localflavor/es/es_provinces.py:44
+msgid "Segovia"
+msgstr "Segowia"
+
+#: contrib/localflavor/es/es_provinces.py:45
+msgid "Seville"
+msgstr "Sewilla"
+
+#: contrib/localflavor/es/es_provinces.py:46
+msgid "Soria"
+msgstr "Soria"
+
+#: contrib/localflavor/es/es_provinces.py:47
+msgid "Tarragona"
+msgstr "Tarragona"
+
+#: contrib/localflavor/es/es_provinces.py:48
+msgid "Teruel"
+msgstr "Teruel"
+
+#: contrib/localflavor/es/es_provinces.py:49
+msgid "Toledo"
+msgstr "Toledo"
+
+#: contrib/localflavor/es/es_provinces.py:50
+msgid "Valencia"
+msgstr "Walencja"
+
+#: contrib/localflavor/es/es_provinces.py:51
+msgid "Valladolid"
+msgstr "Valladolid"
+
+#: contrib/localflavor/es/es_provinces.py:52
+msgid "Bizkaia"
+msgstr "Vizcaya"
+
+#: contrib/localflavor/es/es_provinces.py:53
+msgid "Zamora"
+msgstr "Zamora"
+
+#: contrib/localflavor/es/es_provinces.py:54
+msgid "Zaragoza"
+msgstr "Saragossa"
+
+#: contrib/localflavor/es/es_provinces.py:55
+msgid "Ceuta"
+msgstr "Ceuta"
+
+#: contrib/localflavor/es/es_provinces.py:56
+msgid "Melilla"
+msgstr "Melilla"
+
+#: contrib/localflavor/es/es_regions.py:5
+msgid "Andalusia"
+msgstr "Andaluzja"
+
+#: contrib/localflavor/es/es_regions.py:6
+msgid "Aragon"
+msgstr "Aragonia"
+
+#: contrib/localflavor/es/es_regions.py:7
+msgid "Principality of Asturias"
+msgstr "Asturia"
+
+#: contrib/localflavor/es/es_regions.py:8
+msgid "Balearic Islands"
+msgstr "Baleary"
+
+#: contrib/localflavor/es/es_regions.py:9
+msgid "Basque Country"
+msgstr "Kraj Basków"
+
+#: contrib/localflavor/es/es_regions.py:10
+msgid "Canary Islands"
+msgstr "Wyspy Kanaryjskie"
+
+#: contrib/localflavor/es/es_regions.py:12
+msgid "Castile-La Mancha"
+msgstr "Kastylia-La Mancha"
+
+#: contrib/localflavor/es/es_regions.py:13
+msgid "Castile and Leon"
+msgstr "Kastylia-Leon"
+
+#: contrib/localflavor/es/es_regions.py:14
+msgid "Catalonia"
+msgstr "Katalonia"
+
+#: contrib/localflavor/es/es_regions.py:15
+msgid "Extremadura"
+msgstr "Estremadura"
+
+#: contrib/localflavor/es/es_regions.py:16
+msgid "Galicia"
+msgstr "Galicja"
+
+#: contrib/localflavor/es/es_regions.py:19
+msgid "Region of Murcia"
+msgstr "Murcja"
+
+#: contrib/localflavor/es/es_regions.py:20
+msgid "Foral Community of Navarre"
+msgstr "Nawarra"
+
+#: contrib/localflavor/es/es_regions.py:21
+msgid "Valencian Community"
+msgstr "Walencja"
+
+#: contrib/localflavor/es/forms.py:19
+msgid "Enter a valid postal code in the range and format 01XXX - 52XXX."
+msgstr "Wpisz kod pocztowy w zakresie i formacie 01XXX - 52XXX."
+
+#: contrib/localflavor/es/forms.py:39
+msgid ""
+"Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or "
+"9XXXXXXXX."
+msgstr ""
+"Wpisz numer telefoniczny w formacie 6XXXXXXXX, 8XXXXXXXX lub 9XXXXXXXX."
+
+#: contrib/localflavor/es/forms.py:66
+msgid "Please enter a valid NIF, NIE, or CIF."
+msgstr "Proszę wpisać poprawny numer NIF, NIE lub CIF."
+
+#: contrib/localflavor/es/forms.py:67
+msgid "Please enter a valid NIF or NIE."
+msgstr "Proszę wpisać poprawny numer NIF lub NIE."
+
+#: contrib/localflavor/es/forms.py:68
+msgid "Invalid checksum for NIF."
+msgstr "Niepoprawna suma kontrolna NIF."
+
+#: contrib/localflavor/es/forms.py:69
+msgid "Invalid checksum for NIE."
+msgstr "Niepoprawna suma kontrolna NIE."
+
+#: contrib/localflavor/es/forms.py:70
+msgid "Invalid checksum for CIF."
+msgstr "Niepoprawna suma kontrolna CIF."
+
+#: contrib/localflavor/es/forms.py:142
+msgid ""
+"Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX."
+msgstr ""
+"Podaj poprawny numer konta bankowego w formacie XXXX-XXXX-XX-XXXXXXXXXX."
+
+#: contrib/localflavor/es/forms.py:143
+msgid "Invalid checksum for bank account number."
+msgstr "Niepoprawna suma kontrolna numeru konta bankowego."
+
+#: contrib/localflavor/fi/forms.py:28
+msgid "Enter a valid Finnish social security number."
+msgstr "Wpis poprawny numer fińskiego ubezpieczenia socjalnego."
+
+#: contrib/localflavor/in_/forms.py:14
+msgid "Enter a zip code in the format XXXXXXX."
+msgstr "Wpisz kod pocztowy w formacie XXXXXXX."
+
+#: contrib/localflavor/is_/forms.py:17
+msgid ""
+"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr ""
+"Podaj poprawny numer islandzkiego dowodu osobistego w formacie XXXXXX-XXXX."
+
+#: contrib/localflavor/is_/forms.py:18
+msgid "The Icelandic identification number is not valid."
+msgstr "Numer islandzkiego dowodu osobistego jest błędny."
+
+#: contrib/localflavor/it/forms.py:14
+msgid "Enter a valid zip code."
+msgstr "Wpisz poprawny kod pocztowy."
+
+#: contrib/localflavor/it/forms.py:43
+msgid "Enter a valid Social Security number."
+msgstr "Wpisz poprawny numer ubezpieczenia socjalnego."
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr "Wpisz poprawny numer VAT."
+
+#: contrib/localflavor/jp/forms.py:17
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "Wpisz kod pocztowy w formacie XXXXXXX lub XXX-XXXX."
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr "Hokkaido"
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr "Aomori"
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr "Iwate"
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr "Miyagi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr "Akita"
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr "Yamagata"
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr "Fukushima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr "Ibaraki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr "Tochigi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr "Gunma"
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr "Saitama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr "Chiba"
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr "Tokio"
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr "Kanagawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr "Yamanashi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr "Nagano"
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr "Niigata"
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr "Toyama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr "Ishikawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr "Fukui"
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr "Gifu"
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr "Shizuoka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr "Aichi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr "Mie"
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr "Shiga"
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr "Kyoto"
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr "Osaka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr "Hyogo"
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr "Nara"
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr "Wakayama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr "Tottori"
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr "Shimane"
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr "Okayama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr "Hiroszima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr "Yamaguchi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr "Tokushima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr "Kagawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr "Ehime"
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr "Kochi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr "Fukuoka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr "Saga"
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr "Nagasaki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr "Kumamoto"
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr "Oita"
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr "Miyazaki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr "Kagoshima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr "Okinawa"
+
+#: contrib/localflavor/mx/mx_states.py:12
+msgid "Aguascalientes"
+msgstr "Aguascalientes"
+
+#: contrib/localflavor/mx/mx_states.py:13
+msgid "Baja California"
+msgstr "Kalifornia Dolna"
+
+#: contrib/localflavor/mx/mx_states.py:14
+msgid "Baja California Sur"
+msgstr "Kalifornia Dolna Południowa"
+
+#: contrib/localflavor/mx/mx_states.py:15
+msgid "Campeche"
+msgstr "Campeche"
+
+#: contrib/localflavor/mx/mx_states.py:16
+msgid "Chihuahua"
+msgstr "Chihuahua"
+
+#: contrib/localflavor/mx/mx_states.py:17
+msgid "Chiapas"
+msgstr "Chiapas"
+
+#: contrib/localflavor/mx/mx_states.py:18
+msgid "Coahuila"
+msgstr "Coahuila"
+
+#: contrib/localflavor/mx/mx_states.py:19
+msgid "Colima"
+msgstr "Colima"
+
+#: contrib/localflavor/mx/mx_states.py:20
+msgid "Distrito Federal"
+msgstr "Meksyk (miasto)"
+
+#: contrib/localflavor/mx/mx_states.py:21
+msgid "Durango"
+msgstr "Durango"
+
+#: contrib/localflavor/mx/mx_states.py:22
+msgid "Guerrero"
+msgstr "Guerrero"
+
+#: contrib/localflavor/mx/mx_states.py:23
+msgid "Guanajuato"
+msgstr "Guanajuato"
+
+#: contrib/localflavor/mx/mx_states.py:24
+msgid "Hidalgo"
+msgstr "Hidalgo"
+
+#: contrib/localflavor/mx/mx_states.py:25
+msgid "Jalisco"
+msgstr "Jalisco"
+
+#: contrib/localflavor/mx/mx_states.py:26
+msgid "Estado de México"
+msgstr "Meksyk (stan)"
+
+#: contrib/localflavor/mx/mx_states.py:27
+msgid "Michoacán"
+msgstr "Michocan"
+
+#: contrib/localflavor/mx/mx_states.py:28
+msgid "Morelos"
+msgstr "Morelos"
+
+#: contrib/localflavor/mx/mx_states.py:29
+msgid "Nayarit"
+msgstr "Nayarit"
+
+#: contrib/localflavor/mx/mx_states.py:30
+msgid "Nuevo León"
+msgstr "Nuevo Leon"
+
+#: contrib/localflavor/mx/mx_states.py:31
+msgid "Oaxaca"
+msgstr "Oaxaca"
+
+#: contrib/localflavor/mx/mx_states.py:32
+msgid "Puebla"
+msgstr "Puebla"
+
+#: contrib/localflavor/mx/mx_states.py:33
+msgid "Querétaro"
+msgstr "Queretaro"
+
+#: contrib/localflavor/mx/mx_states.py:34
+msgid "Quintana Roo"
+msgstr "Quintana Roo"
+
+#: contrib/localflavor/mx/mx_states.py:35
+msgid "Sinaloa"
+msgstr "Sinaloa"
+
+#: contrib/localflavor/mx/mx_states.py:36
+msgid "San Luis Potosí"
+msgstr "San Luis Potasi"
+
+#: contrib/localflavor/mx/mx_states.py:37
+msgid "Sonora"
+msgstr "Sonora"
+
+#: contrib/localflavor/mx/mx_states.py:38
+msgid "Tabasco"
+msgstr "Tabasco"
+
+#: contrib/localflavor/mx/mx_states.py:39
+msgid "Tamaulipas"
+msgstr "Tamaulipas"
+
+#: contrib/localflavor/mx/mx_states.py:40
+msgid "Tlaxcala"
+msgstr "Tlaxcala"
+
+#: contrib/localflavor/mx/mx_states.py:41
+msgid "Veracruz"
+msgstr "Veracruz"
+
+#: contrib/localflavor/mx/mx_states.py:42
+msgid "Yucatán"
+msgstr "Jukatan"
+
+#: contrib/localflavor/mx/mx_states.py:43
+msgid "Zacatecas"
+msgstr "Zacatecas"
+
+#: contrib/localflavor/nl/forms.py:21
+msgid "Enter a valid postal code"
+msgstr "Wpisz poprawny kod pocztowy"
+
+#: contrib/localflavor/nl/forms.py:52
+msgid "Enter a valid phone number"
+msgstr "Wpisz poprawny numer telefonu"
+
+#: contrib/localflavor/nl/forms.py:78
+msgid "Enter a valid SoFi number"
+msgstr "Wpisz poprawny numer SoFi"
+
+#: contrib/localflavor/nl/nl_provinces.py:4
+msgid "Drenthe"
+msgstr "Drenthe"
+
+#: contrib/localflavor/nl/nl_provinces.py:5
+msgid "Flevoland"
+msgstr "Flevoland"
+
+#: contrib/localflavor/nl/nl_provinces.py:6
+msgid "Friesland"
+msgstr "Fryzja"
+
+#: contrib/localflavor/nl/nl_provinces.py:7
+msgid "Gelderland"
+msgstr "Geldria"
+
+#: contrib/localflavor/nl/nl_provinces.py:8
+msgid "Groningen"
+msgstr "Groningen"
+
+#: contrib/localflavor/nl/nl_provinces.py:9
+msgid "Limburg"
+msgstr "Limburgia"
+
+#: contrib/localflavor/nl/nl_provinces.py:10
+msgid "Noord-Brabant"
+msgstr "Brabancja Północna"
+
+#: contrib/localflavor/nl/nl_provinces.py:11
+msgid "Noord-Holland"
+msgstr "Holandia Północna"
+
+#: contrib/localflavor/nl/nl_provinces.py:12
+msgid "Overijssel"
+msgstr "Overijssel"
+
+#: contrib/localflavor/nl/nl_provinces.py:13
+msgid "Utrecht"
+msgstr "Utrecht"
+
+#: contrib/localflavor/nl/nl_provinces.py:14
+msgid "Zeeland"
+msgstr "Zelandia"
+
+#: contrib/localflavor/nl/nl_provinces.py:15
+msgid "Zuid-Holland"
+msgstr "Holandia Południowa"
+
+#: contrib/localflavor/no/forms.py:33
+msgid "Enter a valid Norwegian social security number."
+msgstr "Wpis poprawny numer norweskiego ubezpieczenia socjalnego."
+
+#: contrib/localflavor/pe/forms.py:24
+msgid "This field requires 8 digits."
+msgstr "To pole musi zawierać 8 cyfr."
+
+#: contrib/localflavor/pe/forms.py:52
+msgid "This field requires 11 digits."
+msgstr "To pole musi zawierać 11 cyfr."
+
+#: contrib/localflavor/pl/forms.py:38
+msgid "National Identification Number consists of 11 digits."
+msgstr "Numer PESEL składa się z 11 cyfr."
+
+#: contrib/localflavor/pl/forms.py:39
+msgid "Wrong checksum for the National Identification Number."
+msgstr "Błędna suma kontrolna numeru PESEL."
+
+#: contrib/localflavor/pl/forms.py:71
+msgid ""
+"Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX."
+msgstr "Wpisz numer NIP w formacie XXX-XXX-XX-XX or XX-XX-XXX-XXX."
+
+#: contrib/localflavor/pl/forms.py:72
+msgid "Wrong checksum for the Tax Number (NIP)."
+msgstr "Błędna suma kontrolna numeru NIP"
+
+#: contrib/localflavor/pl/forms.py:111
+msgid "National Business Register Number (REGON) consists of 7 or 9 digits."
+msgstr "Numer REGON składa się z 7 lub 9 cyfr."
+
+#: contrib/localflavor/pl/forms.py:112
+msgid "Wrong checksum for the National Business Register Number (REGON)."
+msgstr "Błędna suma kontrolna numeru REGON"
+
+#: contrib/localflavor/pl/forms.py:155
+msgid "Enter a postal code in the format XX-XXX."
+msgstr "Wpisz kod pocztowy w formacie XX-XXX."
+
+#: contrib/localflavor/pl/pl_voivodeships.py:8
+msgid "Lower Silesia"
+msgstr "Dolnośląskie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:9
+msgid "Kuyavia-Pomerania"
+msgstr "Kujawsko-Pomorskie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:10
+msgid "Lublin"
+msgstr "Lubelskie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:11
+msgid "Lubusz"
+msgstr "Lubuskie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:12
+msgid "Lodz"
+msgstr "Łódzkie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:13
+msgid "Lesser Poland"
+msgstr "Małopolskie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:14
+msgid "Masovia"
+msgstr "Mazowieckie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:15
+msgid "Opole"
+msgstr "Opolskie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:16
+msgid "Subcarpatia"
+msgstr "Podkarpackie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:17
+msgid "Podlasie"
+msgstr "Podlaskie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:18
+msgid "Pomerania"
+msgstr "Pomorskie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:19
+msgid "Silesia"
+msgstr "Śląskie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:20
+msgid "Swietokrzyskie"
+msgstr "Świętokrzyskie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:21
+msgid "Warmia-Masuria"
+msgstr "Warmińsko-Mazurskie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:22
+msgid "Greater Poland"
+msgstr "Wielkopolskie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:23
+msgid "West Pomerania"
+msgstr "Zachodniopomorskie"
+
+#: contrib/localflavor/ro/forms.py:19
+msgid "Enter a valid CIF."
+msgstr "Wpisz poprawny CIF."
+
+#: contrib/localflavor/ro/forms.py:56
+msgid "Enter a valid CNP."
+msgstr "Wpisz poprawny CNP."
+
+#: contrib/localflavor/ro/forms.py:141
+msgid "Enter a valid IBAN in ROXX-XXXX-XXXX-XXXX-XXXX-XXXX format"
+msgstr "Podaj poprawny IBAN w formacie ROXX-XXXX-XXXX-XXXX-XXXX-XXXX"
+
+#: contrib/localflavor/ro/forms.py:171
+msgid "Phone numbers must be in XXXX-XXXXXX format."
+msgstr "Numery telefoniczne muszą być w formacie XXXX-XXXXXX."
+
+#: contrib/localflavor/ro/forms.py:194
+msgid "Enter a valid postal code in the format XXXXXX"
+msgstr "Wpisz kod pocztowy w formacie XXXXXX."
+
+#: contrib/localflavor/sk/forms.py:30
+msgid "Enter a postal code in the format XXXXX or XXX XX."
+msgstr "Wpisz kod pocztowy w formacie XXXXX or XXX XX."
+
+#: contrib/localflavor/sk/sk_districts.py:8
+msgid "Banska Bystrica"
+msgstr "Bańska Bystrzyca"
+
+#: contrib/localflavor/sk/sk_districts.py:9
+msgid "Banska Stiavnica"
+msgstr "Bańska Szczawnica"
+
+#: contrib/localflavor/sk/sk_districts.py:10
+msgid "Bardejov"
+msgstr "Bardiów"
+
+#: contrib/localflavor/sk/sk_districts.py:11
+msgid "Banovce nad Bebravou"
+msgstr "Banovce nad Bebravou"
+
+#: contrib/localflavor/sk/sk_districts.py:12
+msgid "Brezno"
+msgstr "Brezno"
+
+#: contrib/localflavor/sk/sk_districts.py:13
+msgid "Bratislava I"
+msgstr "Bratysława I"
+
+#: contrib/localflavor/sk/sk_districts.py:14
+msgid "Bratislava II"
+msgstr "Bratysława II"
+
+#: contrib/localflavor/sk/sk_districts.py:15
+msgid "Bratislava III"
+msgstr "Bratysława III"
+
+#: contrib/localflavor/sk/sk_districts.py:16
+msgid "Bratislava IV"
+msgstr "Bratysława IV"
+
+#: contrib/localflavor/sk/sk_districts.py:17
+msgid "Bratislava V"
+msgstr "Bratysława V"
+
+#: contrib/localflavor/sk/sk_districts.py:18
+msgid "Bytca"
+msgstr "Bytca"
+
+#: contrib/localflavor/sk/sk_districts.py:19
+msgid "Cadca"
+msgstr "Czadca"
+
+#: contrib/localflavor/sk/sk_districts.py:20
+msgid "Detva"
+msgstr "Detva"
+
+#: contrib/localflavor/sk/sk_districts.py:21
+msgid "Dolny Kubin"
+msgstr "Dolny Kubin"
+
+#: contrib/localflavor/sk/sk_districts.py:22
+msgid "Dunajska Streda"
+msgstr "Dunajska Streda"
+
+#: contrib/localflavor/sk/sk_districts.py:23
+msgid "Galanta"
+msgstr "Galanta"
+
+#: contrib/localflavor/sk/sk_districts.py:24
+msgid "Gelnica"
+msgstr "Gelnica"
+
+#: contrib/localflavor/sk/sk_districts.py:25
+msgid "Hlohovec"
+msgstr "Hlohovec"
+
+#: contrib/localflavor/sk/sk_districts.py:26
+msgid "Humenne"
+msgstr "Humenne"
+
+#: contrib/localflavor/sk/sk_districts.py:27
+msgid "Ilava"
+msgstr "Ilava"
+
+#: contrib/localflavor/sk/sk_districts.py:28
+msgid "Kezmarok"
+msgstr "Kieżmarek"
+
+#: contrib/localflavor/sk/sk_districts.py:29
+msgid "Komarno"
+msgstr "Komarno"
+
+#: contrib/localflavor/sk/sk_districts.py:30
+msgid "Kosice I"
+msgstr "Koszyce I"
+
+#: contrib/localflavor/sk/sk_districts.py:31
+msgid "Kosice II"
+msgstr "Koszyce II"
+
+#: contrib/localflavor/sk/sk_districts.py:32
+msgid "Kosice III"
+msgstr "Koszyce III"
+
+#: contrib/localflavor/sk/sk_districts.py:33
+msgid "Kosice IV"
+msgstr "Koszyce IV"
+
+#: contrib/localflavor/sk/sk_districts.py:34
+msgid "Kosice - okolie"
+msgstr "Koszyce - okolie"
+
+#: contrib/localflavor/sk/sk_districts.py:35
+msgid "Krupina"
+msgstr "Krupina"
+
+#: contrib/localflavor/sk/sk_districts.py:36
+msgid "Kysucke Nove Mesto"
+msgstr "Kysucke Nove Mesto"
+
+#: contrib/localflavor/sk/sk_districts.py:37
+msgid "Levice"
+msgstr "Levice"
+
+#: contrib/localflavor/sk/sk_districts.py:38
+msgid "Levoca"
+msgstr "Lewocza"
+
+#: contrib/localflavor/sk/sk_districts.py:39
+msgid "Liptovsky Mikulas"
+msgstr "Liptowski Mikulasz"
+
+#: contrib/localflavor/sk/sk_districts.py:40
+msgid "Lucenec"
+msgstr "Łuczeniec"
+
+#: contrib/localflavor/sk/sk_districts.py:41
+msgid "Malacky"
+msgstr "Malacky"
+
+#: contrib/localflavor/sk/sk_districts.py:42
+msgid "Martin"
+msgstr "Martin"
+
+#: contrib/localflavor/sk/sk_districts.py:43
+msgid "Medzilaborce"
+msgstr "Medzilaborce"
+
+#: contrib/localflavor/sk/sk_districts.py:44
+msgid "Michalovce"
+msgstr "Michalovce"
+
+#: contrib/localflavor/sk/sk_districts.py:45
+msgid "Myjava"
+msgstr "Myjava"
+
+#: contrib/localflavor/sk/sk_districts.py:46
+msgid "Namestovo"
+msgstr "Namestovo"
+
+#: contrib/localflavor/sk/sk_districts.py:47
+msgid "Nitra"
+msgstr "Nitra"
+
+#: contrib/localflavor/sk/sk_districts.py:48
+msgid "Nove Mesto nad Vahom"
+msgstr "Nove Mesto nad Vahom"
+
+#: contrib/localflavor/sk/sk_districts.py:49
+msgid "Nove Zamky"
+msgstr "Nove Zamky"
+
+#: contrib/localflavor/sk/sk_districts.py:50
+msgid "Partizanske"
+msgstr "Partizanske"
+
+#: contrib/localflavor/sk/sk_districts.py:51
+msgid "Pezinok"
+msgstr "Pezinok"
+
+#: contrib/localflavor/sk/sk_districts.py:52
+msgid "Piestany"
+msgstr "Pieszczany"
+
+#: contrib/localflavor/sk/sk_districts.py:53
+msgid "Poltar"
+msgstr "Poltar"
+
+#: contrib/localflavor/sk/sk_districts.py:54
+msgid "Poprad"
+msgstr "Poprad"
+
+#: contrib/localflavor/sk/sk_districts.py:55
+msgid "Povazska Bystrica"
+msgstr "Poważska Bystrzyca"
+
+#: contrib/localflavor/sk/sk_districts.py:56
+msgid "Presov"
+msgstr "Preszów"
+
+#: contrib/localflavor/sk/sk_districts.py:57
+msgid "Prievidza"
+msgstr "Prievidza"
+
+#: contrib/localflavor/sk/sk_districts.py:58
+msgid "Puchov"
+msgstr "Puchov"
+
+#: contrib/localflavor/sk/sk_districts.py:59
+msgid "Revuca"
+msgstr "Revuca"
+
+#: contrib/localflavor/sk/sk_districts.py:60
+msgid "Rimavska Sobota"
+msgstr "Rimavska Sobota"
+
+#: contrib/localflavor/sk/sk_districts.py:61
+msgid "Roznava"
+msgstr "Roznava"
+
+#: contrib/localflavor/sk/sk_districts.py:62
+msgid "Ruzomberok"
+msgstr "Rużemberk"
+
+#: contrib/localflavor/sk/sk_districts.py:63
+msgid "Sabinov"
+msgstr "Sabinov"
+
+#: contrib/localflavor/sk/sk_districts.py:64
+msgid "Senec"
+msgstr "Senec"
+
+#: contrib/localflavor/sk/sk_districts.py:65
+msgid "Senica"
+msgstr "Senica"
+
+#: contrib/localflavor/sk/sk_districts.py:66
+msgid "Skalica"
+msgstr "Skalica"
+
+#: contrib/localflavor/sk/sk_districts.py:67
+msgid "Snina"
+msgstr "Snina"
+
+#: contrib/localflavor/sk/sk_districts.py:68
+msgid "Sobrance"
+msgstr "Sobrance"
+
+#: contrib/localflavor/sk/sk_districts.py:69
+msgid "Spisska Nova Ves"
+msgstr "Nowa Wieś Spiska"
+
+#: contrib/localflavor/sk/sk_districts.py:70
+msgid "Stara Lubovna"
+msgstr "Stara Lubowla"
+
+#: contrib/localflavor/sk/sk_districts.py:71
+msgid "Stropkov"
+msgstr "Stropkov"
+
+#: contrib/localflavor/sk/sk_districts.py:72
+msgid "Svidnik"
+msgstr "Svidnik"
+
+#: contrib/localflavor/sk/sk_districts.py:73
+msgid "Sala"
+msgstr "Sala"
+
+#: contrib/localflavor/sk/sk_districts.py:74
+msgid "Topolcany"
+msgstr "Topolczany"
+
+#: contrib/localflavor/sk/sk_districts.py:75
+msgid "Trebisov"
+msgstr "Trebisov"
+
+#: contrib/localflavor/sk/sk_districts.py:76
+msgid "Trencin"
+msgstr "Trenczyn"
+
+#: contrib/localflavor/sk/sk_districts.py:77
+msgid "Trnava"
+msgstr "Trnawa"
+
+#: contrib/localflavor/sk/sk_districts.py:78
+msgid "Turcianske Teplice"
+msgstr "Turcianske Teplice"
+
+#: contrib/localflavor/sk/sk_districts.py:79
+msgid "Tvrdosin"
+msgstr "Twardoszyn"
+
+#: contrib/localflavor/sk/sk_districts.py:80
+msgid "Velky Krtis"
+msgstr "Velky Krtis"
+
+#: contrib/localflavor/sk/sk_districts.py:81
+msgid "Vranov nad Toplou"
+msgstr "Vranov nad Toplou"
+
+#: contrib/localflavor/sk/sk_districts.py:82
+msgid "Zlate Moravce"
+msgstr "Zlate Moravce"
+
+#: contrib/localflavor/sk/sk_districts.py:83
+msgid "Zvolen"
+msgstr "Zwoleń"
+
+#: contrib/localflavor/sk/sk_districts.py:84
+msgid "Zarnovica"
+msgstr "Zarnovica"
+
+#: contrib/localflavor/sk/sk_districts.py:85
+msgid "Ziar nad Hronom"
+msgstr "Ziar nad Hronom"
+
+#: contrib/localflavor/sk/sk_districts.py:86
+msgid "Zilina"
+msgstr "Żylina"
+
+#: contrib/localflavor/sk/sk_regions.py:8
+msgid "Banska Bystrica region"
+msgstr "Kraj bańskobystrzycki"
+
+#: contrib/localflavor/sk/sk_regions.py:9
+msgid "Bratislava region"
+msgstr "Kraj bratysławski"
+
+#: contrib/localflavor/sk/sk_regions.py:10
+msgid "Kosice region"
+msgstr "Kraj koszycki"
+
+#: contrib/localflavor/sk/sk_regions.py:11
+msgid "Nitra region"
+msgstr "Kraj nitrzański"
+
+#: contrib/localflavor/sk/sk_regions.py:12
+msgid "Presov region"
+msgstr "Kraj preszowski"
+
+#: contrib/localflavor/sk/sk_regions.py:13
+msgid "Trencin region"
+msgstr "Kraj trenczyński"
+
+#: contrib/localflavor/sk/sk_regions.py:14
+msgid "Trnava region"
+msgstr "Kraj trnawski"
+
+#: contrib/localflavor/sk/sk_regions.py:15
+msgid "Zilina region"
+msgstr "Kraj żyliński"
+
+#: contrib/localflavor/uk/forms.py:21
+msgid "Enter a valid postcode."
+msgstr "Wpisz poprawny kod pocztowy."
+
+#: contrib/localflavor/uk/uk_regions.py:11
+msgid "Bedfordshire"
+msgstr "Bedfordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:12
+msgid "Buckinghamshire"
+msgstr "Buckinghamshire"
+
+#: contrib/localflavor/uk/uk_regions.py:14
+msgid "Cheshire"
+msgstr "Cheshire"
+
+#: contrib/localflavor/uk/uk_regions.py:15
+msgid "Cornwall and Isles of Scilly"
+msgstr "Kornwalia i wyspy Scilly"
+
+#: contrib/localflavor/uk/uk_regions.py:16
+msgid "Cumbria"
+msgstr "Cumbria"
+
+#: contrib/localflavor/uk/uk_regions.py:17
+msgid "Derbyshire"
+msgstr "Derbyshire"
+
+#: contrib/localflavor/uk/uk_regions.py:18
+msgid "Devon"
+msgstr "Devon"
+
+#: contrib/localflavor/uk/uk_regions.py:19
+msgid "Dorset"
+msgstr "Dorset"
+
+#: contrib/localflavor/uk/uk_regions.py:20
+msgid "Durham"
+msgstr "Durham"
+
+#: contrib/localflavor/uk/uk_regions.py:21
+msgid "East Sussex"
+msgstr "East Sussex"
+
+#: contrib/localflavor/uk/uk_regions.py:22
+msgid "Essex"
+msgstr "Essex"
+
+#: contrib/localflavor/uk/uk_regions.py:23
+msgid "Gloucestershire"
+msgstr "Gloucestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:24
+msgid "Greater London"
+msgstr "Wielki Londyn"
+
+#: contrib/localflavor/uk/uk_regions.py:25
+msgid "Greater Manchester"
+msgstr "Greater Manchester"
+
+#: contrib/localflavor/uk/uk_regions.py:26
+msgid "Hampshire"
+msgstr "Hampshire"
+
+#: contrib/localflavor/uk/uk_regions.py:27
+msgid "Hertfordshire"
+msgstr "Hertfordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:28
+msgid "Kent"
+msgstr "Kent"
+
+#: contrib/localflavor/uk/uk_regions.py:29
+msgid "Lancashire"
+msgstr "Lancashire"
+
+#: contrib/localflavor/uk/uk_regions.py:30
+msgid "Leicestershire"
+msgstr "Leicestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:31
+msgid "Lincolnshire"
+msgstr "Lincolnshire"
+
+#: contrib/localflavor/uk/uk_regions.py:32
+msgid "Merseyside"
+msgstr "Merseyside"
+
+#: contrib/localflavor/uk/uk_regions.py:33
+msgid "Norfolk"
+msgstr "Norfolk"
+
+#: contrib/localflavor/uk/uk_regions.py:34
+msgid "North Yorkshire"
+msgstr "North Yorkshire"
+
+#: contrib/localflavor/uk/uk_regions.py:35
+msgid "Northamptonshire"
+msgstr "Northamptonshire"
+
+#: contrib/localflavor/uk/uk_regions.py:36
+msgid "Northumberland"
+msgstr "Northumberland"
+
+#: contrib/localflavor/uk/uk_regions.py:37
+msgid "Nottinghamshire"
+msgstr "Nottinghamshire"
+
+#: contrib/localflavor/uk/uk_regions.py:38
+msgid "Oxfordshire"
+msgstr "Oxfordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:39
+msgid "Shropshire"
+msgstr "Shropshire"
+
+#: contrib/localflavor/uk/uk_regions.py:40
+msgid "Somerset"
+msgstr "Somerset"
+
+#: contrib/localflavor/uk/uk_regions.py:41
+msgid "South Yorkshire"
+msgstr "South Yorkshire"
+
+#: contrib/localflavor/uk/uk_regions.py:42
+msgid "Staffordshire"
+msgstr "Staffordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:43
+msgid "Suffolk"
+msgstr "Suffolk"
+
+#: contrib/localflavor/uk/uk_regions.py:44
+msgid "Surrey"
+msgstr "Surrey"
+
+#: contrib/localflavor/uk/uk_regions.py:45
+msgid "Tyne and Wear"
+msgstr "Tyne and Wear"
+
+#: contrib/localflavor/uk/uk_regions.py:46
+msgid "Warwickshire"
+msgstr "Warwickshire"
+
+#: contrib/localflavor/uk/uk_regions.py:47
+msgid "West Midlands"
+msgstr "West Midlands"
+
+#: contrib/localflavor/uk/uk_regions.py:48
+msgid "West Sussex"
+msgstr "West Sussex"
+
+#: contrib/localflavor/uk/uk_regions.py:49
+msgid "West Yorkshire"
+msgstr "West Yorkshire"
+
+#: contrib/localflavor/uk/uk_regions.py:50
+msgid "Wiltshire"
+msgstr "Wiltshire"
+
+#: contrib/localflavor/uk/uk_regions.py:51
+msgid "Worcestershire"
+msgstr "Worcestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:55
+msgid "County Antrim"
+msgstr "Hrabstwo Antrim"
+
+#: contrib/localflavor/uk/uk_regions.py:56
+msgid "County Armagh"
+msgstr "Hrabstwo Armagh"
+
+#: contrib/localflavor/uk/uk_regions.py:57
+msgid "County Down"
+msgstr "Hrabstwo Down"
+
+#: contrib/localflavor/uk/uk_regions.py:58
+msgid "County Fermanagh"
+msgstr "Hrabstwo Fermanagh"
+
+#: contrib/localflavor/uk/uk_regions.py:59
+msgid "County Londonderry"
+msgstr "Hrabstwo Londonderry"
+
+#: contrib/localflavor/uk/uk_regions.py:60
+msgid "County Tyrone"
+msgstr "Hrabstwo Tyrone"
+
+#: contrib/localflavor/uk/uk_regions.py:64
+msgid "Clwyd"
+msgstr "Clwyd"
+
+#: contrib/localflavor/uk/uk_regions.py:65
+msgid "Dyfed"
+msgstr "Dyfed"
+
+#: contrib/localflavor/uk/uk_regions.py:66
+msgid "Gwent"
+msgstr "Gwent"
+
+#: contrib/localflavor/uk/uk_regions.py:67
+msgid "Gwynedd"
+msgstr "Gwynedd"
+
+#: contrib/localflavor/uk/uk_regions.py:68
+msgid "Mid Glamorgan"
+msgstr "Mid Glamorgan"
+
+#: contrib/localflavor/uk/uk_regions.py:69
+msgid "Powys"
+msgstr "Powys"
+
+#: contrib/localflavor/uk/uk_regions.py:70
+msgid "South Glamorgan"
+msgstr "South Glamorgan"
+
+#: contrib/localflavor/uk/uk_regions.py:71
+msgid "West Glamorgan"
+msgstr "West Glamorgan"
+
+#: contrib/localflavor/uk/uk_regions.py:75
+msgid "Borders"
+msgstr "Scottish Borders"
+
+#: contrib/localflavor/uk/uk_regions.py:76
+msgid "Central Scotland"
+msgstr "Central Scotland"
+
+#: contrib/localflavor/uk/uk_regions.py:77
+msgid "Dumfries and Galloway"
+msgstr "Dumfries and Galloway"
+
+#: contrib/localflavor/uk/uk_regions.py:78
+msgid "Fife"
+msgstr "Fife"
+
+#: contrib/localflavor/uk/uk_regions.py:79
+msgid "Grampian"
+msgstr "Grampian"
+
+#: contrib/localflavor/uk/uk_regions.py:80
+msgid "Highland"
+msgstr "Highland"
+
+#: contrib/localflavor/uk/uk_regions.py:81
+msgid "Lothian"
+msgstr "Lothian"
+
+#: contrib/localflavor/uk/uk_regions.py:82
+msgid "Orkney Islands"
+msgstr "Orkady"
+
+#: contrib/localflavor/uk/uk_regions.py:83
+msgid "Shetland Islands"
+msgstr "Szetlandy"
+
+#: contrib/localflavor/uk/uk_regions.py:84
+msgid "Strathclyde"
+msgstr "Strathclyde"
+
+#: contrib/localflavor/uk/uk_regions.py:85
+msgid "Tayside"
+msgstr "Tayside"
+
+#: contrib/localflavor/uk/uk_regions.py:86
+msgid "Western Isles"
+msgstr "Hebrydy Zewnętrzne"
+
+#: contrib/localflavor/uk/uk_regions.py:90
+msgid "England"
+msgstr "Anglia"
+
+#: contrib/localflavor/uk/uk_regions.py:91
+msgid "Northern Ireland"
+msgstr "Irlandia Północna"
+
+#: contrib/localflavor/uk/uk_regions.py:92
+msgid "Scotland"
+msgstr "Szkocja"
+
+#: contrib/localflavor/uk/uk_regions.py:93
+msgid "Wales"
+msgstr "Walia"
+
+#: contrib/localflavor/us/forms.py:16
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "Wpisz kod pocztowy w formacie XXXXX. lub XXXXX-XXXX."
+
+#: contrib/localflavor/us/forms.py:54
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr "Wpisz poprawny numer U.S. Social Security w formacie XXX-XX-XXXX."
+
+#: contrib/localflavor/za/forms.py:20
+msgid "Enter a valid South African ID number"
+msgstr "Wpisz poprawny południowoafrykański numer ID"
+
+#: contrib/localflavor/za/forms.py:54
+msgid "Enter a valid South African postal code"
+msgstr "Wpisz poprawny południowoafrykański kod pocztowy"
+
+#: contrib/localflavor/za/za_provinces.py:4
+msgid "Eastern Cape"
+msgstr "Prowincja Przylądkowa Wschodnia"
+
+#: contrib/localflavor/za/za_provinces.py:5
+msgid "Free State"
+msgstr "Wolne Państwo"
+
+#: contrib/localflavor/za/za_provinces.py:6
+msgid "Gauteng"
+msgstr "Gauteng"
+
+#: contrib/localflavor/za/za_provinces.py:7
+msgid "KwaZulu-Natal"
+msgstr "KwaZulu-Natal"
+
+#: contrib/localflavor/za/za_provinces.py:8
+msgid "Limpopo"
+msgstr "Limpopo"
+
+#: contrib/localflavor/za/za_provinces.py:9
+msgid "Mpumalanga"
+msgstr "Mpumalanga"
+
+#: contrib/localflavor/za/za_provinces.py:10
+msgid "Northern Cape"
+msgstr "Prowincja Przylądkowa Północna"
+
+#: contrib/localflavor/za/za_provinces.py:11
+msgid "North West"
+msgstr "Prowincja Północno-Zachodnia"
+
+#: contrib/localflavor/za/za_provinces.py:12
+msgid "Western Cape"
+msgstr "Prowincja Przylądkowa Zachodnia"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "przekieruj z"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr "Podaj pełną ścieżkę bez nazwy domeny. Przykład: '/events/search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "przekierowanie do"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr "Ścieżka jak wyżej lub pełny URL z http://"
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "przekieruj"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "przekierowania"
+
+#: contrib/sessions/models.py:45
+msgid "session key"
+msgstr "klucz sesji"
+
+#: contrib/sessions/models.py:47
+msgid "session data"
+msgstr "data sesji"
+
+#: contrib/sessions/models.py:48
+msgid "expire date"
+msgstr "data wygaśnięcia sesji"
+
+#: contrib/sessions/models.py:53
+msgid "session"
+msgstr "sesja"
+
+#: contrib/sessions/models.py:54
+msgid "sessions"
+msgstr "sesje"
+
+#: contrib/sites/models.py:32
+msgid "domain name"
+msgstr "nazwa domeny"
+
+#: contrib/sites/models.py:33
+msgid "display name"
+msgstr "wyświetlana nazwa"
+
+#: contrib/sites/models.py:39
+msgid "sites"
+msgstr "strony"
+
+#: core/validators.py:80
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "To pole może zawierać jedynie litery, cyfry, podkreślenia i myślniki."
+
+#: core/validators.py:84
+msgid "Uppercase letters are not allowed here."
+msgstr "Wielkie litery nie są tutaj dozwolone."
+
+#: core/validators.py:88
+msgid "Lowercase letters are not allowed here."
+msgstr "Małe litery nie są tutaj dozwolone."
+
+#: core/validators.py:95
+msgid "Enter only digits separated by commas."
+msgstr "Wpisz tylko cyfry oddzielone przecinkami."
+
+#: core/validators.py:107
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Wpisz poprawne adresy e-mail oddzielone przecinkami."
+
+#: core/validators.py:111
+msgid "Please enter a valid IP address."
+msgstr "Proszę wpisać poprawny adres IP."
+
+#: core/validators.py:115
+msgid "Empty values are not allowed here."
+msgstr "Proszę wypełnić te pola."
+
+#: core/validators.py:119
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Tu mogą być tylko cyfry."
+
+#: core/validators.py:123
+msgid "This value can't be comprised solely of digits."
+msgstr "To pole nie może zawierać jedynie cyfr."
+
+#: core/validators.py:128 forms/fields.py:161
+msgid "Enter a whole number."
+msgstr "Wpisz liczbę całkowitą."
+
+#: core/validators.py:132
+msgid "Only alphabetical characters are allowed here."
+msgstr "Tutaj są dozwolone tylko litery."
+
+#: core/validators.py:147
+#, python-format
+msgid "Invalid date: %s"
+msgstr "Niepoprawna data: %s"
+
+#: core/validators.py:152 db/models/fields/__init__.py:547
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Proszę wpisać poprawną datę w formacie RRRR-MM-DD."
+
+#: core/validators.py:157
+msgid "Enter a valid time in HH:MM format."
+msgstr "Proszę wpisać poprawną godzinę w formacie HH:MM."
+
+#: core/validators.py:161
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Wprowadź poprawną datę i godzinę w formacie RRRR-MM-DD GG:MM."
+
+#: core/validators.py:166 forms/fields.py:423
+msgid "Enter a valid e-mail address."
+msgstr "Wprowadź poprawny adres e-mail."
+
+#: core/validators.py:178 core/validators.py:470 forms/fields.py:441
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Nie wysłano żadnego pliku. Sprawdź typ kodowania formularza."
+
+#: core/validators.py:189 forms/fields.py:472
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Wgraj poprawny plik graficzny. Ten, który został wgrany, nie jest obrazem, "
+"albo jest uszkodzony."
+
+#: core/validators.py:196
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "Odnośnik %s nie wskazuje na poprawny plik z obrazem."
+
+#: core/validators.py:200
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Numery telefoniczne muszą być w formacie XXX-XXX-XXXX. \"%s\" jest "
+"niepoprawny."
+
+#: core/validators.py:208
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "Odnośnik %s nie wskazuje na poprawne nagranie QuickTime video."
+
+#: core/validators.py:212
+msgid "A valid URL is required."
+msgstr "Wymagany jest poprawny URL."
+
+#: core/validators.py:226
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Wymagany jest poprawny HTML. Błędy, które wystąpiły:\n"
+"%s"
+
+#: core/validators.py:233
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Nieprawidłowy format XML: %s"
+
+#: core/validators.py:250
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Niepoprawny odnośnik: %s"
+
+#: core/validators.py:255 core/validators.py:257
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "Odnośnik %s jest nieprawidłowy."
+
+#: core/validators.py:263
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Wpisz poprawny kod stanu USA."
+
+#: core/validators.py:277
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Nie wolno przeklinać! Słowo %s nie jest dozwolone."
+msgstr[1] "Nie wolno przeklinać! Słowa %s nie są dozwolone."
+msgstr[2] "Nie wolno przeklinać! Słowa %s nie są dozwolone."
+
+#: core/validators.py:284
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "To pole musi pasować do pola '%s'."
+
+#: core/validators.py:303
+msgid "Please enter something for at least one field."
+msgstr "Proszę uzupełnić przynajmniej jedno pole."
+
+#: core/validators.py:312 core/validators.py:323
+msgid "Please enter both fields or leave them both empty."
+msgstr "Proszę uzupełnić oba pola lub zostawić je puste."
+
+#: core/validators.py:331
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "To pole musi być uzupełnione, jeśli %(field)s ma wartość %(value)s"
+
+#: core/validators.py:344
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr ""
+"To pole musi być uzupełnione, jeśli %(field)s ma wartość inną niż %(value)s"
+
+#: core/validators.py:363
+msgid "Duplicate values are not allowed."
+msgstr "Duplikaty nie są dozwolone."
+
+#: core/validators.py:378
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Ta wartość musi być pomiędzy %(lower)s a %(upper)s."
+
+#: core/validators.py:380
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Ta wartość nie może być mniejsza od %s."
+
+#: core/validators.py:382
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Ta wartość nie może być większa od %s."
+
+#: core/validators.py:423
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Ta wartość musi być potęgą %s."
+
+#: core/validators.py:433
+msgid "Please enter a valid decimal number."
+msgstr "Proszę wpisać poprawną liczbę dziesiętną."
+
+#: core/validators.py:440
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] ""
+"Proszę wpisać poprawną liczbę dziesiętną o nie więcej niż %s cyfrze."
+msgstr[1] ""
+"Proszę wpisać poprawną liczbę dziesiętną o nie więcej niż %s cyfrach."
+msgstr[2] ""
+"Proszę wpisać poprawną liczbę dziesiętną o nie więcej niż %s cyfrach."
+
+#: core/validators.py:443
+#, python-format
+msgid ""
+"Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural ""
+"Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] ""
+"Proszę wpisać poprawną liczbę dziesiętną zawierającą nie więcej niż %s cyfrę."
+msgstr[1] ""
+"Proszę wpisać poprawną liczbę dziesiętną zawierającą nie więcej niż %s cyfry."
+msgstr[2] ""
+"Proszę wpisać poprawną liczbę dziesiętną zawierającą nie więcej niż %s cyfr."
+
+#: core/validators.py:446
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] ""
+"Proszę wpisać poprawną liczbę dziesiętną z dokładnością do %s miejsca po "
+"przecinku."
+msgstr[1] ""
+"Proszę wpisać poprawną liczbę dziesiętną z dokładnością do %s miejsc po "
+"przecinku."
+msgstr[2] ""
+"Proszę wpisać poprawną liczbę dziesiętną z dokładnością do %s miejsc po "
+"przecinku."
+
+#: core/validators.py:454
+msgid "Please enter a valid floating point number."
+msgstr "Proszę wpisać poprawną liczbę rzeczywistą."
+
+#: core/validators.py:463
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Upewnij się, że wgrany plik ma co najmniej %s bajtów."
+
+#: core/validators.py:464
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Upewnij się, że wgrany plik ma co najwyżej %s bajtów."
+
+#: core/validators.py:481
+msgid "The format for this field is wrong."
+msgstr "Format tego pola jest nieprawidłowy."
+
+#: core/validators.py:496
+msgid "This field is invalid."
+msgstr "To pole jest nieprawidłowe."
+
+#: core/validators.py:532
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Nie można nic pobrać z %s."
+
+#: core/validators.py:535
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"URL %(url)s zwrócił niepoprawny nagłówek Content-Type '%(contenttype)s'."
+
+#: core/validators.py:568
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Proszę zamknąć tag %(tag)s z linii %(line)s. (Linia zaczyna się od \"%(start)"
+"s\".)"
+
+#: core/validators.py:572
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Część tekstu od linii %(line)s nie jest dozwolony w tym kontekście. (Linia "
+"zaczyna się od \"%(start)s\".)"
+
+#: core/validators.py:577
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"%(attr)s\" w linii %(line)s jest niepoprawnym atrybutem. (Linia zaczyna "
+"się od \"%(start)s\".)"
+
+#: core/validators.py:582
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\" w linii %(line)s nie jest poprawnym tagiem. (Linia zaczyna się "
+"od \"%(start)s\".)"
+
+#: core/validators.py:586
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Tag w linii %(line)s nie posiada jednego lub więcej wymaganych atrybutów. "
+"(Linia zaczyna się od \"%(start)s\".)"
+
+#: core/validators.py:591
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Atrybut \"%(attr)s\" w linii %(line)s ma niepoprawną wartość. (Linia zaczyna "
+"się od \"%(start)s\".)"
+
+#: db/models/manipulators.py:304
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(object)s z %(type)s już istnieje dla %(field)s."
+
+#: db/models/fields/__init__.py:46
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "Już istnieje %(optname)s z %(fieldname)s."
+
+#: db/models/fields/__init__.py:321 db/models/fields/files.py:168
+#: db/models/fields/files.py:179 forms/fields.py:52 oldforms/__init__.py:370
+msgid "This field is required."
+msgstr "To pole jest wymagane."
+
+#: db/models/fields/__init__.py:435 db/models/fields/__init__.py:803
+msgid "This value must be an integer."
+msgstr "Ta wartość musi być liczbą całkowitą."
+
+#: db/models/fields/__init__.py:481
+msgid "This value must be either True or False."
+msgstr ""
+"Ta wartość musi być wartością logiczną (True, False - prawda lub fałsz)."
+
+#: db/models/fields/__init__.py:510
+msgid "This field cannot be null."
+msgstr "To pole nie może być puste."
+
+#: db/models/fields/__init__.py:619 db/models/fields/__init__.py:636
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format."
+msgstr ""
+"Wprowadź poprawną datę i godzinę w formacie YYYY-MM-DD HH:MM[:ss[.uuuuuu]]."
+
+#: db/models/fields/__init__.py:692
+msgid "This value must be a decimal number."
+msgstr "Ta wartość musi być liczbą dziesiętną."
+
+#: db/models/fields/__init__.py:841
+msgid "This value must be either None, True or False."
+msgstr ""
+"Ta wartość musi być jedną z None (nic), True (prawda) lub False (fałsz)."
+
+#: db/models/fields/__init__.py:911
+msgid ""
+"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens."
+msgstr "To pole może zawierać jedynie litery, cyfry, podkreślenia i myślniki."
+
+#: db/models/fields/__init__.py:960 db/models/fields/__init__.py:973
+msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format."
+msgstr "Proszę wpisać poprawną godzinę w formacie HH:MM[:ss[.uuuuuu]]."
+
+#: db/models/fields/files.py:188
+msgid "Enter a valid filename."
+msgstr "Wpisz poprawną nazwę pliku."
+
+#: db/models/fields/related.py:92
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Proszę wpisać poprawne %s."
+
+#: db/models/fields/related.py:786
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Przytrzymaj wciśnięty klawisz \"Ctrl\" lub \"Command\" na Mac'u aby "
+"zaznaczyć więcej niż jeden wybór."
+
+#: db/models/fields/related.py:866
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+"Proszę podać poprawne identyfikatory %(self)s. Wartość %(value)r jest "
+"niepoprawna."
+msgstr[1] ""
+"Proszę podać poprawne identyfikatory %(self)s. Wartości %(value)r są "
+"niepoprawne."
+msgstr[2] ""
+"Proszę podać poprawne identyfikatory %(self)s. Wartości %(value)r są "
+"niepoprawne."
+
+#: forms/fields.py:53
+msgid "Enter a valid value."
+msgstr "Wpisz poprawną wartość."
+
+#: forms/fields.py:133
+#, python-format
+msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+msgstr ""
+"Upewnij się, że ta wartość ma co najwyżej %(max)d znaków (ma długość %"
+"(length)d)."
+
+#: forms/fields.py:134
+#, python-format
+msgid "Ensure this value has at least %(min)d characters (it has %(length)d)."
+msgstr ""
+"Upewnij się, że ta wartość ma co najmniej %(min)d znaków (ma długość %"
+"(length)d)."
+
+#: forms/fields.py:162 forms/fields.py:191 forms/fields.py:220
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Upewnij się, że ta wartość jest mniejsza lub równa %s."
+
+#: forms/fields.py:163 forms/fields.py:192 forms/fields.py:221
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Upewnij się, że ta wartość jest większa lub równa %s."
+
+#: forms/fields.py:190 forms/fields.py:219
+msgid "Enter a number."
+msgstr "Wpisz liczbę."
+
+#: forms/fields.py:222
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr "Upewnij się, że jest nie więcej niż %s cyfr."
+
+#: forms/fields.py:223
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr "Upewnij się, że jest nie więcej niż %s miejsc po przecinku."
+
+#: forms/fields.py:224
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr "Upewnij się, że jest nie więcej niż %s miejsc przed przecinkiem."
+
+#: forms/fields.py:282 forms/fields.py:804
+msgid "Enter a valid date."
+msgstr "Wpisz poprawną datę."
+
+#: forms/fields.py:316 forms/fields.py:805
+msgid "Enter a valid time."
+msgstr "Wpisz poprawną godzinę."
+
+#: forms/fields.py:355
+msgid "Enter a valid date/time."
+msgstr "Wpisz poprawną datę/godzinę."
+
+#: forms/fields.py:442
+msgid "No file was submitted."
+msgstr "Żaden plik nie został przesłany."
+
+#: forms/fields.py:443 oldforms/__init__.py:689
+msgid "The submitted file is empty."
+msgstr "Wysłany plik jest pusty."
+
+#: forms/fields.py:533
+msgid "Enter a valid URL."
+msgstr "Wpisz poprawny URL."
+
+#: forms/fields.py:534
+msgid "This URL appears to be a broken link."
+msgstr "Ten odnośnik jest nieprawidłowy."
+
+#: forms/fields.py:602 forms/fields.py:653
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr ""
+"Wybierz poprawną wartość. %(value)s nie jest jednym z dostępnych wyborów."
+
+#: forms/fields.py:654 forms/fields.py:715 forms/models.py:531
+msgid "Enter a list of values."
+msgstr "Podaj listę wartości."
+
+#: forms/fields.py:833
+msgid "Enter a valid IPv4 address."
+msgstr "Wprowadź poprawny adres IPv4."
+
+#: forms/models.py:463
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Wybierz poprawną wartość. Podana nie jest jednym z dostępnych wyborów."
+
+#: forms/models.py:532
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Wybierz poprawną wartość. %s nie jest jednym z dostępnych wyborów."
+
+#: oldforms/__init__.py:405
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Upewnij się, że tekst ma mniej niż %s znak."
+msgstr[1] "Upewnij się, że tekst ma mniej niż %s znaki."
+msgstr[2] "Upewnij się, że tekst ma mniej niż %s znaków."
+
+#: oldforms/__init__.py:410
+msgid "Line breaks are not allowed here."
+msgstr "Znaki nowej linii są tutaj niedopuszczalne."
+
+#: oldforms/__init__.py:508 oldforms/__init__.py:582 oldforms/__init__.py:621
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Wybierz poprawną opcję; '%(data)s' nie jest wśród %(choices)s."
+
+#: oldforms/__init__.py:750
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Proszę wpisać liczbę całkowitą z zakresu od -32 768 do 32 767."
+
+#: oldforms/__init__.py:760
+msgid "Enter a positive number."
+msgstr "Proszę wpisać liczbę dodatnią."
+
+#: oldforms/__init__.py:770
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Proszę wpisać liczbę całkowitą z zakresu od 0 do 32 767."
+
+#: template/defaultfilters.py:698
+msgid "yes,no,maybe"
+msgstr "tak,nie,może"
+
+#: template/defaultfilters.py:729
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d bajt"
+msgstr[1] "%(size)d bajty"
+msgstr[2] "%(size)d bajtów"
+
+#: template/defaultfilters.py:731
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f KB"
+
+#: template/defaultfilters.py:733
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: template/defaultfilters.py:734
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#: utils/dateformat.py:41
+msgid "p.m."
+msgstr "po południu"
+
+#: utils/dateformat.py:42
+msgid "a.m."
+msgstr "rano"
+
+#: utils/dateformat.py:47
+msgid "PM"
+msgstr "po południu"
+
+#: utils/dateformat.py:48
+msgid "AM"
+msgstr "rano"
+
+#: utils/dateformat.py:97
+msgid "midnight"
+msgstr "północ"
+
+#: utils/dateformat.py:99
+msgid "noon"
+msgstr "południe"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Poniedziałek"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Wtorek"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Środa"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Czwartek"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Piątek"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Sobota"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Niedziela"
+
+#: utils/dates.py:10
+msgid "Mon"
+msgstr "Pon"
+
+#: utils/dates.py:10
+msgid "Tue"
+msgstr "Wt"
+
+#: utils/dates.py:10
+msgid "Wed"
+msgstr "Śr"
+
+#: utils/dates.py:10
+msgid "Thu"
+msgstr "Czw"
+
+#: utils/dates.py:10
+msgid "Fri"
+msgstr "Pi"
+
+#: utils/dates.py:11
+msgid "Sat"
+msgstr "So"
+
+#: utils/dates.py:11
+msgid "Sun"
+msgstr "Nd"
+
+#: utils/dates.py:18
+msgid "January"
+msgstr "Styczeń"
+
+#: utils/dates.py:18
+msgid "February"
+msgstr "Luty"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "March"
+msgstr "Marzec"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "April"
+msgstr "Kwiecień"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "May"
+msgstr "Maj"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "June"
+msgstr "Czerwiec"
+
+#: utils/dates.py:19 utils/dates.py:31
+msgid "July"
+msgstr "Lipiec"
+
+#: utils/dates.py:19
+msgid "August"
+msgstr "Sierpień"
+
+#: utils/dates.py:19
+msgid "September"
+msgstr "Wrzesień"
+
+#: utils/dates.py:19
+msgid "October"
+msgstr "Październik"
+
+#: utils/dates.py:19
+msgid "November"
+msgstr "Listopad"
+
+#: utils/dates.py:20
+msgid "December"
+msgstr "Grudzień"
+
+#: utils/dates.py:23
+msgid "jan"
+msgstr "sty"
+
+#: utils/dates.py:23
+msgid "feb"
+msgstr "luty"
+
+#: utils/dates.py:23
+msgid "mar"
+msgstr "marz"
+
+#: utils/dates.py:23
+msgid "apr"
+msgstr "kwie"
+
+#: utils/dates.py:23
+msgid "may"
+msgstr "maj"
+
+#: utils/dates.py:23
+msgid "jun"
+msgstr "czerw"
+
+#: utils/dates.py:24
+msgid "jul"
+msgstr "lip"
+
+#: utils/dates.py:24
+msgid "aug"
+msgstr "sier"
+
+#: utils/dates.py:24
+msgid "sep"
+msgstr "wrze"
+
+#: utils/dates.py:24
+msgid "oct"
+msgstr "paź"
+
+#: utils/dates.py:24
+msgid "nov"
+msgstr "list"
+
+#: utils/dates.py:24
+msgid "dec"
+msgstr "gru"
+
+#: utils/dates.py:31
+msgid "Jan."
+msgstr "Sty."
+
+#: utils/dates.py:31
+msgid "Feb."
+msgstr "Lut."
+
+#: utils/dates.py:32
+msgid "Aug."
+msgstr "Sier."
+
+#: utils/dates.py:32
+msgid "Sept."
+msgstr "Wrz."
+
+#: utils/dates.py:32
+msgid "Oct."
+msgstr "Paź."
+
+#: utils/dates.py:32
+msgid "Nov."
+msgstr "Lis."
+
+#: utils/dates.py:32
+msgid "Dec."
+msgstr "Gru."
+
+#: utils/text.py:128
+msgid "or"
+msgstr "lub"
+
+#: utils/timesince.py:21
+msgid "year"
+msgid_plural "years"
+msgstr[0] "rok"
+msgstr[1] "lata"
+msgstr[2] "lat"
+
+#: utils/timesince.py:22
+msgid "month"
+msgid_plural "months"
+msgstr[0] "miesiąc"
+msgstr[1] "miesiące"
+msgstr[2] "miesięcy"
+
+#: utils/timesince.py:23
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "tydzień"
+msgstr[1] "tygodnie"
+msgstr[2] "tygodni"
+
+#: utils/timesince.py:24
+msgid "day"
+msgid_plural "days"
+msgstr[0] "dzień"
+msgstr[1] "dni"
+msgstr[2] "dni"
+
+#: utils/timesince.py:25
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "godzina"
+msgstr[1] "godziny"
+msgstr[2] "godzin"
+
+#: utils/timesince.py:26
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuta"
+msgstr[1] "minuty"
+msgstr[2] "minut"
+
+#: utils/timesince.py:46
+msgid "minutes"
+msgstr "minuty"
+
+#: utils/timesince.py:51
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr "%(number)d %(type)s"
+
+#: utils/timesince.py:57
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ", %(number)d %(type)s"
+
+#: utils/translation/trans_real.py:401
+msgid "DATE_FORMAT"
+msgstr "Y-m-d"
+
+#: utils/translation/trans_real.py:403
+msgid "TIME_FORMAT"
+msgstr "H:i:s"
+
+#: utils/translation/trans_real.py:419
+msgid "YEAR_MONTH_FORMAT"
+msgstr "Y-m"
+
+#: utils/translation/trans_real.py:420
+msgid "MONTH_DAY_FORMAT"
+msgstr "m-d"
+
+#: views/generic/create_update.py:114
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "%(verbose_name)s zostało pomyślnie utworzone."
+
+#: views/generic/create_update.py:156
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "%(verbose_name)s zostało pomyślnie zmienione."
+
+#: views/generic/create_update.py:198
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "%(verbose_name)s zostało usunięte."
+
+#~ msgid "DATE_WITH_TIME_FULL"
+#~ msgstr "j F Y H:i:s"
+
+#~ msgid "Your new password is: %(new_password)s"
+#~ msgstr "Twoje nowe hasło to: %(new_password)s"
+
+#~ msgid "Feel free to change this password by going to this page:"
+#~ msgstr "Możesz zmienić je na stronie:"
+
+#~ msgid "Ordering"
+#~ msgstr "Sortowanie"
+
+#~ msgid "Order:"
+#~ msgstr "Porządek:"
+
+#~ msgid "Added %s."
+#~ msgstr "Dodano %s"
+
+#~ msgid "Deleted %s."
+#~ msgstr "Skasowano %s"
+
+#~ msgid "The two 'new password' fields didn't match."
+#~ msgstr "Pola 'nowe hasło' nie zgadzają się."
+
+#~ msgid "Year must be 1900 or later."
+#~ msgstr "Rok nie może być wcześniejszy niż 1900."
+
+#~ msgid "Separate multiple IDs with commas."
+#~ msgstr "Oddziel identyfikatory przecinkami."
+
+#~ msgid "Brazilian"
+#~ msgstr "Brazylijski"
+
+#~ msgid "Gaeilge"
+#~ msgstr "Gaelicki"
+
+#~ msgid ""
+#~ "Enter a postcode. A space is required between the two postcode parts."
+#~ msgstr ""
+#~ "Wpisz kod pocztowy. Biały znak pomiędzy dwiema częściami kodu jest "
+#~ "wymagany."
+
+#~ msgid "AnonymousUser"
+#~ msgstr "UżytkownikAnonimowy"
+
+#~ msgid "%d milliseconds"
+#~ msgstr "%d milisekund"
diff --git a/webapp/django/conf/locale/pl/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/pl/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..24d19bb
--- /dev/null
+++ b/webapp/django/conf/locale/pl/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/pl/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/pl/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..07ab5c1
--- /dev/null
+++ b/webapp/django/conf/locale/pl/LC_MESSAGES/djangojs.po
@@ -0,0 +1,120 @@
+# translation of djangojs.po to Polish
+# This file is distributed under the same license as the django package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-08-19 07:28+0200\n"
+"PO-Revision-Date: 2007-03-12 11:42+0100\n"
+"Last-Translator: Jarek Zgoda <jarek.zgoda@gmail.com>\n"
+"Language-Team: Polish <pl@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms:  nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%"
+"100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "Dostępne %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Wybierz wszystko"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Dodaj"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Usuń"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Wybrano %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Zaznacz swój wybór i kliknij "
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Wyczyść wszystko"
+
+#: contrib/admin/media/js/calendar.js:24
+#: contrib/admin/media/js/dateparse.js:32
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Styczeń Luty Marzec Kwiecień Maj Czerwiec Lipiec Sierpień Wrzesień "
+"Październik Listopad Grudzień"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "N Pn Wt Śr Cz Pt So"
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Niedziela Poniedziałek Wtorek Środa Czwartek Piątek Sobota"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr "Pokaż"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr "Ukryj"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Now"
+msgstr "Teraz"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
+msgid "Clock"
+msgstr "Zegar"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
+msgid "Choose a time"
+msgstr "Wybierz czas"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "Midnight"
+msgstr "Północ"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "6 a.m."
+msgstr "6 rano"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
+msgid "Noon"
+msgstr "Południe"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
+msgid "Cancel"
+msgstr "Anuluj"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
+msgid "Today"
+msgstr "Dzisiaj"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
+msgid "Calendar"
+msgstr "Kalendarz"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
+msgid "Yesterday"
+msgstr "Wczoraj"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
+msgid "Tomorrow"
+msgstr "Jutro"
diff --git a/webapp/django/conf/locale/pt/LC_MESSAGES/django.mo b/webapp/django/conf/locale/pt/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..66632e8
--- /dev/null
+++ b/webapp/django/conf/locale/pt/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/pt/LC_MESSAGES/django.po b/webapp/django/conf/locale/pt/LC_MESSAGES/django.po
new file mode 100644
index 0000000..203eec4
--- /dev/null
+++ b/webapp/django/conf/locale/pt/LC_MESSAGES/django.po
@@ -0,0 +1,2128 @@
+# Portuguese translation of Django.
+# Copyright (C) 2007 the Lawrence Journal-World
+# This file is distributed under the same license as the PACKAGE package.
+# Nuno Mariz <nmariz@gmail.com>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-03-15 15:43+0200\n"
+"PO-Revision-Date: 2007-03-16 10:00+0000\n"
+"Last-Translator: Nuno Mariz <nmariz@gmail.com>\n"
+"Language-Team: pt_PT <nmariz@gmail.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "ID do objecto"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "título"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "comentário"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "avaliação #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "avaliação #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "avaliação #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "avaliação #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "avaliação #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "avaliação #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "avaliação #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "avaliação #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "é uma avaliação válida"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "data/hora de submissão"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "é público"
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:304
+msgid "IP address"
+msgstr "Endereço IP"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "foi removido"
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr "Seleccione esta opção se o comentário não é apropriado. Uma mensagem \"Este comentário foi removido\" será mostrada no seu lugar."
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "comentários"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "Objecto de conteúdo"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Colocado pelo utilizador %(user)s em %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "nome da pessoa"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "endereço ip"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "aprovado pela equipa"
+
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "comentário livre"
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "comentários livres"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "pontuação"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "data da pontuação"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "pontuação do karma"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "pontuações do karma"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "Avaliação %(score)d por %(user)s"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"O utilizador %(user)s colocou uma flag neste comentário\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "data da flag"
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "flag do utilizador"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "flags do utilizador"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "Flag por %r"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "data de remoção"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "remoção pelo moderador"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "remoções pelo moderador"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Remoção de moderador %r"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Utilizadores anónimos não podem votar"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "ID de comentário inválido"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "Não pode votar em si"
+
+#: contrib/comments/views/comments.py:27
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr "Esta avaliação é obrigatória porque introduziu pelo menos uma outra avaliação."
+
+#: contrib/comments/views/comments.py:111
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Este comentário foi colocado por um utilizador que efectuou menos de %(count)s comentário:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Este comentário foi colocado por um utilizador que efectuou menos de %(count)s comentários:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:116
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Este comentário foi colocado por um utilizador incompleto:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:188
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Apenas POSTs são autorizados"
+
+#: contrib/comments/views/comments.py:192
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Um ou mais campos obrigatórios não foram submetidos"
+
+#: contrib/comments/views/comments.py:196
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Alguém modificou o formulário de comentário (violação de segurança)"
+
+#: contrib/comments/views/comments.py:206
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr "O formulário de comentário teve um parâmetro 'target' inválido -- o ID do objecto foi inválido"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "O formulário de comentário não forneceu nem 'preview' ou 'post'"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "Utilizador:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr "Sair"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Palavra-passe:"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Esqueceu-se da palavra-passe?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Avaliações"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Obrigatório"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Opcional"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Colocar uma foto"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Comentário:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Pré-visualizar comentário"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "O seu nome:"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Por %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169
+msgid "All"
+msgstr "Todos"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "Qualquer data"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "Hoje"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "Últimos 7 dias"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "Este mês"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "Este ano"
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Sim"
+
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "Não"
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "Desconhecido"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "hora da acção"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "id do objecto"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "repr do objecto"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "flag de acção"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "modificar mensagem"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "entrada de log"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "entradas de log"
+
+#: contrib/admin/templatetags/admin_list.py:230
+msgid "All dates"
+msgstr "Todas as datas"
+
+#: contrib/admin/views/decorators.py:10 contrib/auth/forms.py:59
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr "Por favor introduza o utilizador e palavra-passe correctos. Note que ambos os casos diferenciam maiúsculas e minúsculas."
+
+#: contrib/admin/views/decorators.py:24
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Entrar"
+
+#: contrib/admin/views/decorators.py:62
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr "Por favor autentique-se novamente, porque a sua sessão expirou. Não se preocupe: Os dados submetidos foram gravados."
+
+#: contrib/admin/views/decorators.py:69
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr "Aparentemente o seu browser não está configurado para aceitar cookies. Por favor active os cookies, carrege novamente a página e volte a tentar."
+
+#: contrib/admin/views/decorators.py:83
+msgid "Usernames cannot contain the '@' character."
+msgstr "Nomes de utilizador não podem conter o caracter '@'."
+
+#: contrib/admin/views/decorators.py:85
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "O seu endereço de e-mail não é o seu nome de utilizador. Tente usar '%s'."
+
+#: contrib/admin/views/main.py:223
+msgid "Site administration"
+msgstr "Administração do site"
+
+#: contrib/admin/views/main.py:257 contrib/admin/views/auth.py:17
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "O(A) %(name)s \"%(obj)s\" foi adicionado(a) com sucesso."
+
+#: contrib/admin/views/main.py:261 contrib/admin/views/main.py:347
+#: contrib/admin/views/auth.py:22
+msgid "You may edit it again below."
+msgstr "Pode editá-lo(a) outra vez abaixo."
+
+#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356
+#, python-format
+msgid "You may add another %s below."
+msgstr "Pode adicionar outro %s abaixo."
+
+#: contrib/admin/views/main.py:289
+#, python-format
+msgid "Add %s"
+msgstr "Adicionar %s"
+
+#: contrib/admin/views/main.py:335
+#, python-format
+msgid "Added %s."
+msgstr "Foi adicionado %s"
+
+#: contrib/admin/views/main.py:335 contrib/admin/views/main.py:337
+#: contrib/admin/views/main.py:339
+msgid "and"
+msgstr "e"
+
+#: contrib/admin/views/main.py:337
+#, python-format
+msgid "Changed %s."
+msgstr "Foi modificado %s."
+
+#: contrib/admin/views/main.py:339
+#, python-format
+msgid "Deleted %s."
+msgstr "Foi removido %s."
+
+#: contrib/admin/views/main.py:342
+msgid "No fields changed."
+msgstr "Nenhum campo foi modificado."
+
+#: contrib/admin/views/main.py:345
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "O(A) %(name)s \"%(obj)s\" foi modificado(a) com sucesso."
+
+#: contrib/admin/views/main.py:353
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "O(A) %(name)s \"%(obj)s\" foi adicionado(a) com sucesso. Pode voltar a editar novamente abaixo."
+
+#: contrib/admin/views/main.py:391
+#, python-format
+msgid "Change %s"
+msgstr "Modificar %s"
+
+#: contrib/admin/views/main.py:473
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Um ou mais %(fieldname)s em %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:478
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Um ou mais %(fieldname)s em %(name)s:"
+
+#: contrib/admin/views/main.py:511
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "O(A) %(name)s \"%(obj)s\" foi removido(a) com sucesso."
+
+#: contrib/admin/views/main.py:514
+msgid "Are you sure?"
+msgstr "Tem a certeza?"
+
+#: contrib/admin/views/main.py:536
+#, python-format
+msgid "Change history: %s"
+msgstr "Histórico de modificações: %s"
+
+#: contrib/admin/views/main.py:570
+#, python-format
+msgid "Select %s"
+msgstr "Seleccionar %s"
+
+#: contrib/admin/views/main.py:570
+#, python-format
+msgid "Select %s to change"
+msgstr "Seleccione %s para modificar"
+
+#: contrib/admin/views/main.py:758
+msgid "Database error"
+msgstr "Erro de base de dados"
+
+#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48
+#: contrib/admin/views/doc.py:50
+msgid "tag:"
+msgstr "tag:"
+
+#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79
+#: contrib/admin/views/doc.py:81
+msgid "filter:"
+msgstr "filtro:"
+
+#: contrib/admin/views/doc.py:135 contrib/admin/views/doc.py:137
+#: contrib/admin/views/doc.py:139
+msgid "view:"
+msgstr "ver:"
+
+#: contrib/admin/views/doc.py:164
+#, python-format
+msgid "App %r not found"
+msgstr "A aplicação %r não encontrada"
+
+#: contrib/admin/views/doc.py:171
+#, python-format
+msgid "Model %r not found in app %r"
+msgstr "O Model %r não foi encontrado na aplicação %r"
+
+#: contrib/admin/views/doc.py:183
+#, python-format
+msgid "the related `%s.%s` object"
+msgstr "o objecto `%s.%s` relacionado"
+
+#: contrib/admin/views/doc.py:183 contrib/admin/views/doc.py:205
+#: contrib/admin/views/doc.py:219 contrib/admin/views/doc.py:224
+msgid "model:"
+msgstr "model:"
+
+#: contrib/admin/views/doc.py:214
+#, python-format
+msgid "related `%s.%s` objects"
+msgstr "os objectos `%s.%s` relacionados"
+
+#: contrib/admin/views/doc.py:219
+#, python-format
+msgid "all %s"
+msgstr "todos %s"
+
+#: contrib/admin/views/doc.py:224
+#, python-format
+msgid "number of %s"
+msgstr "número de %s"
+
+#: contrib/admin/views/doc.py:229
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Campos nos objectos %s"
+
+#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:301
+#: contrib/admin/views/doc.py:303 contrib/admin/views/doc.py:309
+#: contrib/admin/views/doc.py:310 contrib/admin/views/doc.py:312
+msgid "Integer"
+msgstr "Inteiro"
+
+#: contrib/admin/views/doc.py:292
+msgid "Boolean (Either True or False)"
+msgstr "Boolean (Pode ser True ou False)"
+
+#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:311
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "String (até %(maxlength)s)"
+
+#: contrib/admin/views/doc.py:294
+msgid "Comma-separated integers"
+msgstr "Inteiros separados por virgula"
+
+#: contrib/admin/views/doc.py:295
+msgid "Date (without time)"
+msgstr "Data (sem hora)"
+
+#: contrib/admin/views/doc.py:296
+msgid "Date (with time)"
+msgstr "Data (com hora)"
+
+#: contrib/admin/views/doc.py:297
+msgid "E-mail address"
+msgstr "Endereço de e-mail"
+
+#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:299
+#: contrib/admin/views/doc.py:302
+msgid "File path"
+msgstr "Caminho do ficheiro"
+
+#: contrib/admin/views/doc.py:300
+msgid "Decimal number"
+msgstr "Número décimal"
+
+#: contrib/admin/views/doc.py:306
+msgid "Boolean (Either True, False or None)"
+msgstr "Boolean (Pode ser True, False ou None)"
+
+#: contrib/admin/views/doc.py:307
+msgid "Relation to parent model"
+msgstr "Relação para o pai do model"
+
+#: contrib/admin/views/doc.py:308
+msgid "Phone number"
+msgstr "Número de telefone"
+
+#: contrib/admin/views/doc.py:313
+msgid "Text"
+msgstr "Texto"
+
+#: contrib/admin/views/doc.py:314
+msgid "Time"
+msgstr "Hora"
+
+#: contrib/admin/views/doc.py:315 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:316
+msgid "U.S. state (two uppercase letters)"
+msgstr "Estado dos E.U.A (duas letras em maiúsculas)"
+
+#: contrib/admin/views/doc.py:317
+msgid "XML text"
+msgstr "Texto XML"
+
+#: contrib/admin/views/doc.py:343
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s não parece ser um objecto urlpattern"
+
+#: contrib/admin/views/auth.py:28
+msgid "Add user"
+msgstr "Adicionar utilizador"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Documentação"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "Modificar palavra-passe"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Início"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+msgid "History"
+msgstr "História"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Data/hora"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Utilizador"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Acção"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "N j, Y, P"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr "Este objecto não tem histórico de modificações. Provavelmente não foi modificado via site de administração."
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Site de administração do Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Administração do Django"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Erro do servidor"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Erro do servidor (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Erro do servidor <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr "Ocorreu um erro. Foi reportado aos administradores do site via e-mail e deverá ser corrigido brevemente. Obrigado pela sua paciência."
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Página não encontrada"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Pedimos desculpa, mas a página solicitada não foi encontrada."
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Models disponíveis na aplicação %(name)s."
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "Adicionar"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Modificar"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Não tem permissão para modificar nada."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Acções Recentes"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "As minhas Acções"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Nenhum disponível"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "Adicionar %(name)s"
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "<a href=\"/password_reset/\">Esqueceu-se a sua palavra-passe?</a>"
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "Bem-vindo,"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Remover"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+#, fuzzy
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr "A remoção de %(object_name)s '%(escaped_objects)s' resultará na remoção dos objectos relacionados, mas a sua conta não tem permissão de remoção dos seguintes tipos de objectos:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr "Tem a certeza que deseja remover %(object_name)s \"%(escaped_object)s\"? Todos os items relacionados seguintes irão ser removidos:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Sim, tenho a certeza"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Por %(filter_title)s "
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Ir"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 resultado"
+msgstr[1] "%(counter)s resultados"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s no total"
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Mostrar todos"
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "Filtro"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "Ver no site"
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Por favor corrija o erro abaixo."
+msgstr[1] "Por favor corrija os erros abaixo."
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr "Ordenação"
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr "Ordem:"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Gravar como novo"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Gravar e adicionar outro"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Gravar e continuar a editar"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Gravar"
+
+#: contrib/admin/templates/admin/invalid_setup.html:8
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr "Passa-se algo de errado com a instalação da sua base de dados. Verifique se as tabelas da base de dados foram criadas apropriadamente e verifique se a base de dados pode ser lida pelo utilizador definido."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr "Primeiro introduza o nome do utilizador e palavra-passe. Depois poderá editar mais opções do utilizador."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "Utilizador"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+msgid "Password"
+msgstr "Palavra-passe"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+msgid "Password (again)"
+msgstr "Palavra-passe (novamente)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+msgid "Enter the same password as above, for verification."
+msgstr "Introduza a palavra-passe como acima, para verificação."
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Modificação de palavra-passe"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Palavra-passe modificada com sucesso"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "A sua palavra-passe foi modificada."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Reinicializar palavra-passe"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr "Esqueceu-se da palavra-passe? Introduza o seu email abaixo, e enviaremos a sua palavra-passe reinicializada para o seu e-mail."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Endereço de e-mail:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Reinicializar a minha palavra-passe"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Obrigado por ter gasto tempo de qualidade no Web site hoje."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Entrar novamente"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Palavra-passe reinicializada com sucesso"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr "Foi enviada uma nova palavra-passe nova para o e-mail que submeteu. Deverá estar a recebê-la brevemente."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr "Por razões de segurança, por favor introduza a sua palavra-passe antiga e depois introduza a nova duas vezes para que possamos verificar se introduziu correctamente."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Palavra-passe antiga:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Nova password:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Confirmação da palavra-passe:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Modificar a minha palavra-passe"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Está a receber este e-mail porque requisitou a reinicialização da sua palavra-passe"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "para a sua conta de utilizador em %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "A sua nova palavra-chave é: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Tenha a liberdade de modificar esta palavra-passe através desta página:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "O seu nome de utilizador, no caso de se ter esquecido:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Obrigado pela sua visita ao nosso site!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "A equipa do %(site_name)s"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Itens do bookmark"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "Documentação dos itens do bookmark"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">Para instalar itens no bookmark, arraste o link para sua barra \n"
+"de bookmarks, ou clique com o lado direito do rato no link e adicione ao seus bookmarks. Agora pode \n"
+"seleccionar o link do bookmark de qualquer página no site. Note que alguns destes \n"
+"itens do bookmark requerem que visualize o site de um computador designado \n"
+"por \"internal\" (entre em contacto com o seu administrador de sistema se \n"
+"não tiver a certeza se o seu computador é \"internal\".</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Documentação desta página"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr "Vai de qualquer página para a documentação da view que gera essa página."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Mostrar o ID do objecto"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr "Mostra o tipo de conteúdo e o ID único para as páginas que representam um único objecto."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Editar este objecto (janela actual)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "Vai para a página de admin para as páginas que representam um único objecto."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Editar este objecto (nova janela)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "Tal como acima, mas abre a página de admin numa nova janela."
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Data:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Hora:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Actualmente:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Modificar:"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "redireccionar de"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr "Isto deverá ser um caminho absoluto, excluindo o domínio. Exemplo: '/events/search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "redireccionar para"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr "Isto poderá ser um caminho absoluto (como acima) ou um URL completo começado por 'http://'."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "redireccionar"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "redirecciona"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr "Exemplo: '/about/contact/'. Verifique se possui as barras no inicio e no fim."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "titulo"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "conteúdo"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "permitir comentários"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "nome da template"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr "Exemplo: 'flatpages/contact_page.html'. Se não for fornecido, o sistema usará: 'flatpages/default.html'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "é necessário registo"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Se estiver seleccionado, apenas utilizadores autenticados poderão ver esta página."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "página plana"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "páginas planas"
+
+#: contrib/auth/views.py:39
+msgid "Logged out"
+msgstr "Saiu"
+
+#: contrib/auth/models.py:38 contrib/auth/models.py:57
+msgid "name"
+msgstr "nome"
+
+#: contrib/auth/models.py:40
+msgid "codename"
+msgstr "nome de código"
+
+#: contrib/auth/models.py:42
+msgid "permission"
+msgstr "permissão"
+
+#: contrib/auth/models.py:43 contrib/auth/models.py:58
+msgid "permissions"
+msgstr "permissões"
+
+#: contrib/auth/models.py:60
+msgid "group"
+msgstr "grupo"
+
+#: contrib/auth/models.py:61 contrib/auth/models.py:100
+msgid "groups"
+msgstr "grupos"
+
+#: contrib/auth/models.py:90
+msgid "username"
+msgstr "utilizador"
+
+#: contrib/auth/models.py:90
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr "Obrigatório. 30 caracteres ou menos. Apenas caracteres alfanúmericos (letras, números ou underscores)."
+
+#: contrib/auth/models.py:91
+msgid "first name"
+msgstr "primeiro nome"
+
+#: contrib/auth/models.py:92
+msgid "last name"
+msgstr "último nome"
+
+#: contrib/auth/models.py:93
+msgid "e-mail address"
+msgstr "endereço de e-mail"
+
+#: contrib/auth/models.py:94
+msgid "password"
+msgstr "palavra-passe"
+
+#: contrib/auth/models.py:94
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr "Use '[algo]$[salt]$[hexdigest]'"
+
+#: contrib/auth/models.py:95
+msgid "staff status"
+msgstr "status de equipa"
+
+#: contrib/auth/models.py:95
+msgid "Designates whether the user can log into this admin site."
+msgstr "Define se o utilizador pode usar a administração do site."
+
+#: contrib/auth/models.py:96
+msgid "active"
+msgstr "activo"
+
+#: contrib/auth/models.py:96
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr "Define se este utiliador pode usar a adminstração do site. Não seleccione em vez de remover as contas."
+
+#: contrib/auth/models.py:97
+msgid "superuser status"
+msgstr "Status de superuser"
+
+#: contrib/auth/models.py:97
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr "Define se este utilizador tem todas as permissões sem explicitamente as atribuir."
+
+#: contrib/auth/models.py:98
+msgid "last login"
+msgstr "última entrada"
+
+#: contrib/auth/models.py:99
+msgid "date joined"
+msgstr "data de registo"
+
+#: contrib/auth/models.py:101
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr "Em adição às permissões definidas manualmente, este utilizador também terá todas as permissões atribuídas a cada grupo a que partence."
+
+#: contrib/auth/models.py:102
+msgid "user permissions"
+msgstr "permissões do utilizador"
+
+#: contrib/auth/models.py:105
+msgid "user"
+msgstr "utilizador"
+
+#: contrib/auth/models.py:106
+msgid "users"
+msgstr "utilizadores"
+
+#: contrib/auth/models.py:111
+msgid "Personal info"
+msgstr "Informação pessoal"
+
+#: contrib/auth/models.py:112
+msgid "Permissions"
+msgstr "Permissões"
+
+#: contrib/auth/models.py:113
+msgid "Important dates"
+msgstr "Datas importantes"
+
+#: contrib/auth/models.py:114
+msgid "Groups"
+msgstr "Grupos"
+
+#: contrib/auth/models.py:256
+msgid "message"
+msgstr "mensagem"
+
+#: contrib/auth/forms.py:52
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr "Aparentemente que o seu browser não está configurado para aceitar cookies. Os cookies são necessários para poder entrar."
+
+#: contrib/auth/forms.py:61
+msgid "This account is inactive."
+msgstr "Esta conta não está activa."
+
+#: contrib/contenttypes/models.py:20
+msgid "python model class name"
+msgstr "python model class name"
+
+#: contrib/contenttypes/models.py:23
+msgid "content type"
+msgstr "tipo de conteúdo"
+
+#: contrib/contenttypes/models.py:24
+msgid "content types"
+msgstr "tipos de conteúdos"
+
+#: contrib/sessions/models.py:51
+msgid "session key"
+msgstr "chave da sessão"
+
+#: contrib/sessions/models.py:52
+msgid "session data"
+msgstr "dados da sessão"
+
+#: contrib/sessions/models.py:53
+msgid "expire date"
+msgstr "data de expiração"
+
+#: contrib/sessions/models.py:57
+msgid "session"
+msgstr "sessão"
+
+#: contrib/sessions/models.py:58
+msgid "sessions"
+msgstr "sessões"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "nome do domínio"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "mostrar nome"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "site"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "sites"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Segunda-feira"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Terça-feira"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Quarta-feira"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Quinta-feira"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Sexta-feira"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Sábado"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Domingo"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Janeiro"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Fevereiro"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "Março"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "Abril"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "Maio"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "Junho"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "Julho"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "Agosto"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "Setembro"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Outubro"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "Novembro"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "Dezembro"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr "jan"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "fev"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "mar"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "abr"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "mai"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "jun"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "jul"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "ago"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "set"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "out"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "nov"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "dez"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Jan."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Fev."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Ago."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Set."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Out."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "Nov."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Dez."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "ano"
+msgstr[1] "anos"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mês"
+msgstr[1] "meses"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "semana"
+msgstr[1] "semanas"
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "dia"
+msgstr[1] "dias"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "hora"
+msgstr[1] "horas"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuto"
+msgstr[1] "minutos"
+
+#: utils/translation/trans_real.py:362
+msgid "DATE_FORMAT"
+msgstr "N j, Y"
+
+#: utils/translation/trans_real.py:363
+msgid "DATETIME_FORMAT"
+msgstr "N j, Y, P"
+
+#: utils/translation/trans_real.py:364
+msgid "TIME_FORMAT"
+msgstr "P"
+
+#: utils/translation/trans_real.py:380
+msgid "YEAR_MONTH_FORMAT"
+msgstr "F Y"
+
+#: utils/translation/trans_real.py:381
+msgid "MONTH_DAY_FORMAT"
+msgstr "F j"
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "Árabe"
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "Bengalês"
+
+#: conf/global_settings.py:41
+msgid "Czech"
+msgstr "Checo"
+
+#: conf/global_settings.py:42
+msgid "Welsh"
+msgstr "Galês"
+
+#: conf/global_settings.py:43
+msgid "Danish"
+msgstr "Dinamarquês"
+
+#: conf/global_settings.py:44
+msgid "German"
+msgstr "Alemão"
+
+#: conf/global_settings.py:45
+msgid "Greek"
+msgstr "Grego"
+
+#: conf/global_settings.py:46
+msgid "English"
+msgstr "Inglês"
+
+#: conf/global_settings.py:47
+msgid "Spanish"
+msgstr "Espanhol"
+
+#: conf/global_settings.py:48
+msgid "Argentinean Spanish"
+msgstr "Espanhol Argentino"
+
+#: conf/global_settings.py:49
+msgid "Finnish"
+msgstr "Filandês"
+
+#: conf/global_settings.py:50
+msgid "French"
+msgstr "Francês"
+
+#: conf/global_settings.py:51
+msgid "Galician"
+msgstr "Galaciano"
+
+#: conf/global_settings.py:52
+msgid "Hungarian"
+msgstr "Húngaro"
+
+#: conf/global_settings.py:53
+msgid "Hebrew"
+msgstr "Hebraico"
+
+#: conf/global_settings.py:54
+msgid "Icelandic"
+msgstr "Islandês"
+
+#: conf/global_settings.py:55
+msgid "Italian"
+msgstr "Italiano"
+
+#: conf/global_settings.py:56
+msgid "Japanese"
+msgstr "Japonês"
+
+#: conf/global_settings.py:57
+msgid "Dutch"
+msgstr "Holandês"
+
+#: conf/global_settings.py:58
+msgid "Norwegian"
+msgstr "Norueguês"
+
+#: conf/global_settings.py:59
+msgid "Brazilian"
+msgstr "Brasileiro"
+
+#: conf/global_settings.py:60
+msgid "Romanian"
+msgstr "Romeno"
+
+#: conf/global_settings.py:61
+msgid "Russian"
+msgstr "Russo"
+
+#: conf/global_settings.py:62
+msgid "Slovak"
+msgstr "Eslovaco"
+
+#: conf/global_settings.py:63
+msgid "Slovenian"
+msgstr "Esloveno"
+
+#: conf/global_settings.py:64
+msgid "Serbian"
+msgstr "Sérvio"
+
+#: conf/global_settings.py:65
+msgid "Swedish"
+msgstr "Sueco"
+
+#: conf/global_settings.py:66
+msgid "Tamil"
+msgstr "Tamil"
+
+#: conf/global_settings.py:67
+msgid "Turkish"
+msgstr "Turco"
+
+#: conf/global_settings.py:68
+msgid "Ukrainian"
+msgstr "Ucraniano"
+
+#: conf/global_settings.py:69
+msgid "Simplified Chinese"
+msgstr "Chinês Simplificado"
+
+#: conf/global_settings.py:70
+msgid "Traditional Chinese"
+msgstr "Chinês Tradicional"
+
+#: core/validators.py:63
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Este valor apenas poderá conter letras, números ou underscores."
+
+#: core/validators.py:67
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr "Este valor apenas poderá conter letras, números, underscores ou traços."
+
+#: core/validators.py:71
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "Este valor apenas poderá conter letras, números, undercores ou hífenes."
+
+#: core/validators.py:75
+msgid "Uppercase letters are not allowed here."
+msgstr "Letras em maiúsculas não são permitidas aqui."
+
+#: core/validators.py:79
+msgid "Lowercase letters are not allowed here."
+msgstr "Letras em minúsculas não são permitidas aqui."
+
+#: core/validators.py:86
+msgid "Enter only digits separated by commas."
+msgstr "Introduza apenas números separados por vírgulas."
+
+#: core/validators.py:98
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Introduza endereços de e-mail válidos separados por vírgulas."
+
+#: core/validators.py:102
+msgid "Please enter a valid IP address."
+msgstr "Por favor introduza um endereço IP válido."
+
+#: core/validators.py:106
+msgid "Empty values are not allowed here."
+msgstr "Valores em branco não são permitidos aqui."
+
+#: core/validators.py:110
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Caracteres não númericos não são permitidos aqui."
+
+#: core/validators.py:114
+msgid "This value can't be comprised solely of digits."
+msgstr "Este valor não pode ser constituido apenas por números."
+
+#: core/validators.py:119
+msgid "Enter a whole number."
+msgstr "Introduza um número inteiro."
+
+#: core/validators.py:123
+msgid "Only alphabetical characters are allowed here."
+msgstr "Apenas letras são válidas aqui."
+
+#: core/validators.py:138
+msgid "Year must be 1900 or later."
+msgstr "O ano deve ser 1900 ou superior."
+
+#: core/validators.py:142
+#, python-format
+msgid "Invalid date: %s."
+msgstr "Data inválida: %s."
+
+#: core/validators.py:146 db/models/fields/__init__.py:415
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Introduza uma data válida no formato AAAA-MM-DD."
+
+#: core/validators.py:151
+msgid "Enter a valid time in HH:MM format."
+msgstr "Introduza uma hora válida no formato HH:MM."
+
+#: core/validators.py:155 db/models/fields/__init__.py:477
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Introduza uma data/hora válida no formato AAAA-MM-DD HH:MM."
+
+#: core/validators.py:160
+msgid "Enter a valid e-mail address."
+msgstr "Introduza um endereço de e-mail válido."
+
+#: core/validators.py:172 core/validators.py:401 forms/__init__.py:661
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Nenhum ficheiro foi submetido. Verifique o tipo de codificação do formulário."
+
+#: core/validators.py:176
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr "Introduza uma imagem válida. O ficheiro que introduziu ou não é uma imagem ou está corrompido."
+
+#: core/validators.py:183
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "O URL %s não aponta para uma imagem válida."
+
+#: core/validators.py:187
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "Os números de telefone deverão ser no formato XXX-XXX-XXXX. \"%s\" é inválido."
+
+#: core/validators.py:195
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "O URL %s não aponta para um QuickTime video válido."
+
+#: core/validators.py:199
+msgid "A valid URL is required."
+msgstr "É obrigatório um URL válido"
+
+#: core/validators.py:213
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"É obrigatório um HTML válido. Os erros específicos são:\n"
+"%s"
+
+#: core/validators.py:220
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "XML mal formatado: %s"
+
+#: core/validators.py:230
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "URL inválido: %s"
+
+#: core/validators.py:234 core/validators.py:236
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "O URL %s é um link quebrado."
+
+#: core/validators.py:242
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Introduza uma abreviação de um estado dos E.U.A. válido."
+
+#: core/validators.py:256
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Atenção à linguagem! A palavra %s não é permitida aqui."
+msgstr[1] "Atenção à linguagem! As palavras %s não são permitidas aqui."
+
+#: core/validators.py:263
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Este campo deve ser igual ao campo '%s'."
+
+#: core/validators.py:282
+msgid "Please enter something for at least one field."
+msgstr "Por favor preencha pelo menos um campo."
+
+#: core/validators.py:291 core/validators.py:302
+msgid "Please enter both fields or leave them both empty."
+msgstr "Por favor preencha ambos os campos ou deixe ambos vazios."
+
+#: core/validators.py:309
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Este campo deve ser preenchido se %(field)s for %(value)s"
+
+#: core/validators.py:321
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Este campo deve ser preenchido se %(field)s não é %(value)s"
+
+#: core/validators.py:340
+msgid "Duplicate values are not allowed."
+msgstr "Valores duplicados não são permitidos."
+
+#: core/validators.py:363
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Este valor deverá ser uma potência de %s."
+
+#: core/validators.py:374
+msgid "Please enter a valid decimal number."
+msgstr "Por favor introduza um número décimal válido."
+
+#: core/validators.py:378
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Por favor introduza um número décimal com um máximo de %s digito."
+msgstr[1] "Por favor introduza um número décimal com um máximo de %s digitos."
+
+#: core/validators.py:381
+#, python-format
+#, fuzzy
+msgid ""
+"Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural ""
+"Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] "Por favor introduza um número décimal com o máximo de % digito na parte inteira."
+msgstr[1] "Por favor introduza um número décimal com o máximo de % digitos na parte inteira."
+
+#: core/validators.py:384
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "Por favor introduza um número décimal com o máximo de %s digito na parte décimal."
+msgstr[1] "Por favor introduza um número décimal com o máximo de %s digitos na parte décimal."
+
+#: core/validators.py:394
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Verifique que o ficheiro introduzido tem pelo menos %s bytes."
+
+#: core/validators.py:395
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Verifique se o ficheiro introduzido tem no máximo %s bytes."
+
+#: core/validators.py:412
+msgid "The format for this field is wrong."
+msgstr "O formato deste campo é errado."
+
+#: core/validators.py:427
+msgid "This field is invalid."
+msgstr "Este campo é inválido."
+
+#: core/validators.py:463
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Não foi possível extrair nada de %s."
+
+#: core/validators.py:466
+#, python-format
+#, fuzzy
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "O URL %(url)s devolveu um tipo de conteúdo inválido no header: '%s(contenttype)s'."
+
+#: core/validators.py:499
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr "Por favor feche a tag %(tag)s na linha %(line)s. (A linha começa por \"%(start)s\".)"
+
+#: core/validators.py:503
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr "Algum texto começado na linha %(line)s não é permitido nesse contexto. (A linha começa por \"%(start)s\".)"
+
+#: core/validators.py:508
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr "\"%(attr)s\" na linha %(line)s é um atributo inválido. (A linha começa por \"%(start)s\".)"
+
+#: core/validators.py:513
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr "\"<%(tag)s>\" na linha %(line)s é um tag inválida. (A linha começa por \"%(start)s\".)"
+
+#: core/validators.py:517
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr "Uma tag na linha %(line)s não tem um o mais atributos obrigatórios. (A linha começa por \"%(start)s\".)"
+
+#: core/validators.py:522
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr "O atributo \"%(attr)s\" na linha %(line)s tem um valor inválido. (A linha começa por \"%(start)s\".)"
+
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "O(A) %(verbose_name)s foi criado(a) com sucesso."
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "O(A) %(verbose_name)s foi actualizado(a) com sucesso."
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "O(A) %(verbose_name)s foi removido(a)."
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "O(A) %(object)s com este %(type)s já existe para o(a) %(field)s fornecido."
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s com %(fieldname)s já existe."
+
+#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:551 db/models/fields/__init__.py:562
+#: forms/__init__.py:346
+msgid "This field is required."
+msgstr "Este campo é obrigatório."
+
+#: db/models/fields/__init__.py:340
+msgid "This value must be an integer."
+msgstr "Este campo deverá ser inteiro."
+
+#: db/models/fields/__init__.py:372
+msgid "This value must be either True or False."
+msgstr "Este valor deverá ser True ou False."
+
+#: db/models/fields/__init__.py:388
+msgid "This field cannot be null."
+msgstr "Este campo não pode ser nulo."
+
+#: db/models/fields/__init__.py:571
+msgid "Enter a valid filename."
+msgstr "Introduza um nome de ficheiro válido."
+
+#: db/models/fields/related.py:51
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Por favor introduza um %s válido."
+
+#: db/models/fields/related.py:618
+msgid "Separate multiple IDs with commas."
+msgstr "Separe múltiplos IDs através de vírgulas."
+
+#: db/models/fields/related.py:620
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "Mantenha pressionado o \"Control\", or \"Command\" no Mac, para seleccionar mais do que um."
+
+#: db/models/fields/related.py:664
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "Por favor introduza IDs de %(self)s válidos. O valor %(value)r é inválido."
+msgstr[1] "Por favor introduza IDs de %(self)s válidos. Os valores %(value)r são inválidos."
+
+#: forms/__init__.py:381
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Verifique se o seu texto tem menos de %s caracter."
+msgstr[1] "Verifique se o seu texto tem menos de %s caracteres."
+
+#: forms/__init__.py:386
+msgid "Line breaks are not allowed here."
+msgstr "Quebras de linha não são permitas aqui."
+
+#: forms/__init__.py:487 forms/__init__.py:560 forms/__init__.py:599
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Seleccione uma opção válida; '%(data)s' não se encontra em %(choices)s."
+
+#: forms/__init__.py:663
+msgid "The submitted file is empty."
+msgstr "O ficheiro submetido encontra-se vazio."
+
+#: forms/__init__.py:719
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Introduza um número entre -32,768 e 32,767."
+
+#: forms/__init__.py:729
+msgid "Enter a positive number."
+msgstr "Introduza um número positivo."
+
+#: forms/__init__.py:739
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Introduza um número entre 0 e 32,767."
+
+#: template/defaultfilters.py:401
+msgid "yes,no,maybe"
+msgstr "sim,não,talvez"
diff --git a/webapp/django/conf/locale/pt/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/pt/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..26ad584
--- /dev/null
+++ b/webapp/django/conf/locale/pt/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/pt/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/pt/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..130a75f
--- /dev/null
+++ b/webapp/django/conf/locale/pt/LC_MESSAGES/djangojs.po
@@ -0,0 +1,108 @@
+# Portuguese translation of Django.
+# Copyright (C) 2007 the Lawrence Journal-World
+# This file is distributed under the same license as the PACKAGE package.
+# Nuno Mariz <nmariz@gmail.com>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-03-15 11:51+0100\n"
+"PO-Revision-Date: 2007-03-16 10:01+0000\n"
+"Last-Translator: Nuno Mariz <nmariz@gmail.com>\n"
+"Language-Team: pt_PT <nmariz@gmail.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "Disponível %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Escolher todos"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Adicionar"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Remover"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Escolhido %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Seleccione a(s) sua(s) escolha(s) e clique "
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Limpar tudo"
+
+#: contrib/admin/media/js/dateparse.js:26
+#: contrib/admin/media/js/calendar.js:24
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr "Janeiro Fevereiro Março Abril Maio Junho Julho Agosto Setembro Outubro Novembro Dezembro"
+
+#: contrib/admin/media/js/dateparse.js:27
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Domingo Segunda Terça Quarta Quinta Sexta Sábado"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "D S T Q Q S S"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "Agora"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "Relógio"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "Escolha a hora"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "Meia-noite"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "6 a.m."
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "Meio-dia"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "Hoje"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "Calendário"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "Ontem"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "Amanhã"
diff --git a/webapp/django/conf/locale/pt_BR/LC_MESSAGES/django.mo b/webapp/django/conf/locale/pt_BR/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..f254e69
--- /dev/null
+++ b/webapp/django/conf/locale/pt_BR/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/pt_BR/LC_MESSAGES/django.po b/webapp/django/conf/locale/pt_BR/LC_MESSAGES/django.po
new file mode 100644
index 0000000..5f4555a
--- /dev/null
+++ b/webapp/django/conf/locale/pt_BR/LC_MESSAGES/django.po
@@ -0,0 +1,4381 @@
+# Português do Brasil translation of django.
+# Copyright (C) 2006 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-03-31 21:44-0300\n"
+"PO-Revision-Date: 2008-03-31 21:59-0300\n"
+"Last-Translator: Guilherme Mesquita Gondim <semente@taurinus.org>\n"
+"Language-Team: Grupo de Localização para o Português <django-l10n-portuguese@googlegroups.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "Arábico"
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "Bengali"
+
+#: conf/global_settings.py:41
+msgid "Bulgarian"
+msgstr "Búlgaro"
+
+#: conf/global_settings.py:42
+msgid "Catalan"
+msgstr "Catalão"
+
+#: conf/global_settings.py:43
+msgid "Czech"
+msgstr "Tcheco"
+
+#: conf/global_settings.py:44
+msgid "Welsh"
+msgstr "Galês"
+
+#: conf/global_settings.py:45
+msgid "Danish"
+msgstr "Dinamarquês"
+
+#: conf/global_settings.py:46
+msgid "German"
+msgstr "Alemão"
+
+#: conf/global_settings.py:47
+msgid "Greek"
+msgstr "Grego"
+
+#: conf/global_settings.py:48
+msgid "English"
+msgstr "Inglês"
+
+#: conf/global_settings.py:49
+msgid "Spanish"
+msgstr "Espanhol"
+
+#: conf/global_settings.py:50
+msgid "Argentinean Spanish"
+msgstr "Espanhol Argentino"
+
+#: conf/global_settings.py:51
+msgid "Basque"
+msgstr "Basco"
+
+#: conf/global_settings.py:52
+msgid "Persian"
+msgstr "Persa"
+
+#: conf/global_settings.py:53
+msgid "Finnish"
+msgstr "Finlandês"
+
+#: conf/global_settings.py:54
+msgid "French"
+msgstr "Francês"
+
+#: conf/global_settings.py:55
+msgid "Irish"
+msgstr "Irlandês"
+
+#: conf/global_settings.py:56
+msgid "Galician"
+msgstr "Galiciano"
+
+#: conf/global_settings.py:57
+msgid "Hungarian"
+msgstr "Húngaro"
+
+#: conf/global_settings.py:58
+msgid "Hebrew"
+msgstr "Hebraico"
+
+#: conf/global_settings.py:59
+msgid "Croatian"
+msgstr "Croata"
+
+#: conf/global_settings.py:60
+msgid "Icelandic"
+msgstr "Islandês"
+
+#: conf/global_settings.py:61
+msgid "Italian"
+msgstr "Italiano"
+
+#: conf/global_settings.py:62
+msgid "Japanese"
+msgstr "Japonês"
+
+#: conf/global_settings.py:63
+msgid "Georgian"
+msgstr "Georgiana"
+
+#: conf/global_settings.py:64
+msgid "Korean"
+msgstr "Coreano"
+
+#: conf/global_settings.py:65
+msgid "Khmer"
+msgstr "Khmer"
+
+#: conf/global_settings.py:66
+msgid "Kannada"
+msgstr "Canarês"
+
+#: conf/global_settings.py:67
+msgid "Latvian"
+msgstr "Letão"
+
+#: conf/global_settings.py:68
+msgid "Macedonian"
+msgstr "Macedônio"
+
+#: conf/global_settings.py:69
+msgid "Dutch"
+msgstr "Neerlandês"
+
+#: conf/global_settings.py:70
+msgid "Norwegian"
+msgstr "Norueguês"
+
+#: conf/global_settings.py:71
+msgid "Polish"
+msgstr "Polaco"
+
+#: conf/global_settings.py:72
+msgid "Portugese"
+msgstr "Português"
+
+#: conf/global_settings.py:73
+msgid "Brazilian Portuguese"
+msgstr "Português Brasileiro"
+
+#: conf/global_settings.py:74
+msgid "Romanian"
+msgstr "Romeno"
+
+#: conf/global_settings.py:75
+msgid "Russian"
+msgstr "Russo"
+
+#: conf/global_settings.py:76
+msgid "Slovak"
+msgstr "Eslovaco"
+
+#: conf/global_settings.py:77
+msgid "Slovenian"
+msgstr "Esloveno"
+
+#: conf/global_settings.py:78
+msgid "Serbian"
+msgstr "Sérvio"
+
+#: conf/global_settings.py:79
+msgid "Swedish"
+msgstr "Sueco"
+
+#: conf/global_settings.py:80
+msgid "Tamil"
+msgstr "Tâmil"
+
+#: conf/global_settings.py:81
+msgid "Telugu"
+msgstr "Telugu"
+
+#: conf/global_settings.py:82
+msgid "Turkish"
+msgstr "Turco"
+
+#: conf/global_settings.py:83
+msgid "Ukrainian"
+msgstr "Ucraniano"
+
+#: conf/global_settings.py:84
+msgid "Simplified Chinese"
+msgstr "Chinês Simplificado"
+
+#: conf/global_settings.py:85
+msgid "Traditional Chinese"
+msgstr "Chinês Tradicional"
+
+#: contrib/admin/filterspecs.py:44
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Por %s</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:74 contrib/admin/filterspecs.py:92
+#: contrib/admin/filterspecs.py:147 contrib/admin/filterspecs.py:173
+msgid "All"
+msgstr "Todos"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Any date"
+msgstr "Qualquer data"
+
+#: contrib/admin/filterspecs.py:114
+msgid "Today"
+msgstr "Hoje"
+
+#: contrib/admin/filterspecs.py:117
+msgid "Past 7 days"
+msgstr "Últimos 7 dias"
+
+#: contrib/admin/filterspecs.py:119
+msgid "This month"
+msgstr "Este mês"
+
+#: contrib/admin/filterspecs.py:121
+msgid "This year"
+msgstr "Este ano"
+
+#: contrib/admin/filterspecs.py:147 newforms/widgets.py:231
+#: oldforms/__init__.py:592
+msgid "Yes"
+msgstr "Sim"
+
+#: contrib/admin/filterspecs.py:147 newforms/widgets.py:231
+#: oldforms/__init__.py:592
+msgid "No"
+msgstr "Não"
+
+#: contrib/admin/filterspecs.py:154 newforms/widgets.py:231
+#: oldforms/__init__.py:592
+msgid "Unknown"
+msgstr "Desconhecido"
+
+#: contrib/admin/models.py:18
+msgid "action time"
+msgstr "hora da ação"
+
+#: contrib/admin/models.py:21
+msgid "object id"
+msgstr "id do objeto"
+
+#: contrib/admin/models.py:22
+msgid "object repr"
+msgstr "repr do objeto"
+
+#: contrib/admin/models.py:23
+msgid "action flag"
+msgstr "flag de ação"
+
+#: contrib/admin/models.py:24
+msgid "change message"
+msgstr "modificar mensagem"
+
+#: contrib/admin/models.py:27
+msgid "log entry"
+msgstr "entrada de log"
+
+#: contrib/admin/models.py:28
+msgid "log entries"
+msgstr "entradas de log"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Página não encontrada"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Desculpe, mas a página requisitada não pode ser encontrada."
+
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:37
+#: contrib/admin/templates/admin/change_form.html:12
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/delete_confirmation.html:5
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:4
+#: contrib/admin/templates/admin/auth/user/change_password.html:11
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+msgid "Home"
+msgstr "Início"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Erro no servidor"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Erro no servidor (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Erro no Servidor <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Houve um erro. Este foi reportado aos administradores do site através do e-"
+"mail e deve ser corrigido em breve. Obrigado pela compreensão."
+
+#: contrib/admin/templates/admin/base.html:26
+msgid "Welcome,"
+msgstr "Bem vindo,"
+
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Documentação"
+
+#: contrib/admin/templates/admin/base.html:29
+#: contrib/admin/templates/admin/auth/user/change_password.html:14
+#: contrib/admin/templates/admin/auth/user/change_password.html:45
+msgid "Change password"
+msgstr "Alterar senha"
+
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/comments/templates/comments/form.html:6
+msgid "Log out"
+msgstr "Encerrar sessão"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Site de administração do Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Administração do Django"
+
+#: contrib/admin/templates/admin/change_form.html:14
+#: contrib/admin/templates/admin/index.html:28
+msgid "Add"
+msgstr "Adicionar"
+
+#: contrib/admin/templates/admin/change_form.html:20
+#: contrib/admin/templates/admin/object_history.html:4
+msgid "History"
+msgstr "Histórico"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "Ver no site"
+
+#: contrib/admin/templates/admin/change_form.html:31
+#: contrib/admin/templates/admin/auth/user/change_password.html:23
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Por favor, corrija o erro abaixo."
+msgstr[1] "Por favor, corrija os erros abaixo."
+
+#: contrib/admin/templates/admin/change_form.html:49
+msgid "Ordering"
+msgstr "Ordenação"
+
+#: contrib/admin/templates/admin/change_form.html:52
+msgid "Order:"
+msgstr "Ordem:"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "Adicionar %(name)s"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:8
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Apagar"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:13
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"A remoção de '%(object_name)s' %(escaped_object)s pode resultar na remoção "
+"de objetos relacionados, mas sua conta não tem a permissão para remoção dos "
+"seguintes tipos de objetos:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:20
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Você tem certeza que quer remover o %(object_name)s \"%(escaped_object)s\"? "
+"Todos os seguintes itens relacionados serão removidos:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:25
+msgid "Yes, I'm sure"
+msgstr "Sim, tenho certeza"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "Por %(filter_title)s "
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "Filtro"
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Modelos disponíveis na aplicação %(name)s"
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Modificar"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Você não tem permissão para edição."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Ações Recentes"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Minhas Ações"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Nenhuma disponível"
+
+#: contrib/admin/templates/admin/invalid_setup.html:8
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Alguma coisa errada com a instalação do banco de dados. Certifique-se que as "
+"tabelas necessárias foram criadas e que o banco de dados pode ser acessado "
+"pelo usuário."
+
+#: contrib/admin/templates/admin/login.html:17
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+msgid "Username:"
+msgstr "Usuário:"
+
+#: contrib/admin/templates/admin/login.html:20
+#: contrib/comments/templates/comments/form.html:8
+msgid "Password:"
+msgstr "Senha:"
+
+#: contrib/admin/templates/admin/login.html:25
+#: contrib/admin/views/decorators.py:31
+msgid "Log in"
+msgstr "Acessar"
+
+#: contrib/admin/templates/admin/object_history.html:17
+msgid "Date/time"
+msgstr "Data/hora"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "User"
+msgstr "Usuário"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "Action"
+msgstr "Ação"
+
+#: contrib/admin/templates/admin/object_history.html:25
+msgid "DATE_WITH_TIME_FULL"
+msgstr "j. N Y, H:i"
+
+#: contrib/admin/templates/admin/object_history.html:35
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Este objeto não tem um histórico de alterações. Ele provavelmente não foi "
+"adicionado por este site de administração."
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Mostrar tudo"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Ir"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 resultado"
+msgstr[1] "%(counter)s resultados"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s total"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Salvar como novo"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Salvar e adicionar outro"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Salvar e continuar editando"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Salvar"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Primeiro, informe um nome de usuário e senha. Então, você será capaz de "
+"editar mais opções do usuário."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "Usuário:"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+#: contrib/admin/templates/admin/auth/user/change_password.html:33
+msgid "Password"
+msgstr "Senha:"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+#: contrib/admin/templates/admin/auth/user/change_password.html:38
+msgid "Password (again)"
+msgstr "Senha (novamente)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+msgid "Enter the same password as above, for verification."
+msgstr "Informe a mesma senha digitada acima, para verificação."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:27
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Informe uma nova senha para o usuário <strong>%(username)s</strong>."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Itens de bookmark"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+msgid "Documentation bookmarklets"
+msgstr "Documentação de itens de bookmark"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:8
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">Para instalar um item no bookmark, arraste o link para a \n"
+"barra de ferramentas de bookmarks, ou clique com o botão direito no link e\n"
+"adicione-o à barra de ferramentas. Agora você pode selecionar o item de\n"
+"bookmark de qualquer página do site. Lembre-se que alguns desses itens\n"
+"de bookmark requerem que você veja o site de um computador designado\n"
+"como \"interno\" (converse com seu administrador de sistemas se você não\n"
+"souber se seu computador é \"interno\").</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:18
+msgid "Documentation for this page"
+msgstr "Documentação para esta página"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+"Leva você de qualquer página da documentação para a view que gera tal página."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:21
+msgid "Show object ID"
+msgstr "Mostar ID de objeto"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Mostra o tipo de conteúdo e ID único para páginas que representam um objeto "
+"único."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:24
+msgid "Edit this object (current window)"
+msgstr "Editar este objeto (janela atual)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "Vai para a página de administração que representam um objeto único."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:27
+msgid "Edit this object (new window)"
+msgstr "Editar este objeto (nova janela)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "As above, but opens the admin page in a new window."
+msgstr "Como acima, mas abre a página de administração em uma nova janela."
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Obrigado por visitar nosso Web site hoje."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Acessar novamente"
+
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_form.html:5
+#: contrib/admin/templates/registration/password_change_form.html:9
+msgid "Password change"
+msgstr "Alterar senha"
+
+#: contrib/admin/templates/registration/password_change_done.html:5
+#: contrib/admin/templates/registration/password_change_done.html:9
+msgid "Password change successful"
+msgstr "Senha alterada com sucesso"
+
+#: contrib/admin/templates/registration/password_change_done.html:11
+msgid "Your password was changed."
+msgstr "Sua senha foi alterada."
+
+#: contrib/admin/templates/registration/password_change_form.html:11
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Por favor, informe sua senha antiga, por segurança, e então informe sua nova "
+"senha duas vezes para que possamos verificar se você digitou corretamente."
+
+#: contrib/admin/templates/registration/password_change_form.html:16
+msgid "Old password:"
+msgstr "Senha antiga:"
+
+#: contrib/admin/templates/registration/password_change_form.html:18
+msgid "New password:"
+msgstr "Nova senha:"
+
+#: contrib/admin/templates/registration/password_change_form.html:20
+msgid "Confirm password:"
+msgstr "Confirme a senha:"
+
+#: contrib/admin/templates/registration/password_change_form.html:22
+msgid "Change my password"
+msgstr "Alterar minha senha"
+
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+msgid "Password reset"
+msgstr "Recuperar senha"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Senha recuperada com sucesso"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"Nós enviamos uma nova senha para o e-mail que você informou. Você deverá "
+"receber uma mensagem em breve."
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Você está recebendo este e-mail porque você pediu uma nova senha"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "para sua conta em %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Sua nova senha é: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Sinta-se a vontade para alterar esta senha visitando esta página:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Seu nome de usuário, caso tenha esquecido:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Obrigado por usar nosso site!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Equipe do %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"Esqueceu a senha? Digite seu e-mail abaixo e nós iremos enviar uma nova "
+"senha para você."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Endereço de e-mail:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Reinicializar minha senha"
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Data:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Hora:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Atualmente:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Modificar:"
+
+#: contrib/admin/templatetags/admin_list.py:257
+msgid "All dates"
+msgstr "Todas as datas"
+
+#: contrib/admin/views/auth.py:20 contrib/admin/views/main.py:267
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "O(A) %(name)s \"%(obj)s\" foi adicionado com sucesso."
+
+#: contrib/admin/views/auth.py:25 contrib/admin/views/main.py:271
+#: contrib/admin/views/main.py:356
+msgid "You may edit it again below."
+msgstr "Você pode editá-lo(a) de novo abaixo."
+
+#: contrib/admin/views/auth.py:31
+msgid "Add user"
+msgstr "Adicionar usuário"
+
+#: contrib/admin/views/auth.py:58
+msgid "Password changed successfully."
+msgstr "Senha modificada com sucesso."
+
+#: contrib/admin/views/auth.py:65
+#, python-format
+msgid "Change password: %s"
+msgstr "Alterar senha: %s"
+
+#: contrib/admin/views/decorators.py:17 contrib/auth/forms.py:60
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Por favor entre usuário e senha corretos. Note que ambos os campos "
+"diferenciam maiúsculas e minúsculas."
+
+#: contrib/admin/views/decorators.py:69
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Por favor acesse novamente, pois sua sessão expirou. Não se preocupe: Os "
+"dados enviados foram salvos."
+
+#: contrib/admin/views/decorators.py:76
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Parece que seu navegador não está configurado para aceitar cookies. Por "
+"favor habilite os cookies, recarregue esta página, e tente novamente."
+
+#: contrib/admin/views/decorators.py:90
+msgid "Usernames cannot contain the '@' character."
+msgstr "Nomes de usuário não podem conter o caractere '@'."
+
+#: contrib/admin/views/decorators.py:92
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "Seu endereço de e-mail não é seu nome de usuário. Tente usar '%s'"
+
+#: contrib/admin/views/doc.py:48 contrib/admin/views/doc.py:50
+#: contrib/admin/views/doc.py:52
+msgid "tag:"
+msgstr "tag:"
+
+#: contrib/admin/views/doc.py:79 contrib/admin/views/doc.py:81
+#: contrib/admin/views/doc.py:83
+msgid "filter:"
+msgstr "filtro:"
+
+#: contrib/admin/views/doc.py:137 contrib/admin/views/doc.py:139
+#: contrib/admin/views/doc.py:141
+msgid "view:"
+msgstr "view:"
+
+#: contrib/admin/views/doc.py:166
+#, python-format
+msgid "App %r not found"
+msgstr "Aplicação %r não encontrada"
+
+#: contrib/admin/views/doc.py:173
+#, python-format
+msgid "Model %(name)r not found in app %(label)r"
+msgstr "O model %(name)r não encontrado na aplicação %(label)r"
+
+#: contrib/admin/views/doc.py:185
+#, python-format
+msgid "the related `%(label)s.%(type)s` object"
+msgstr "o objeto `%(label)s.%(type)s` relacionado"
+
+#: contrib/admin/views/doc.py:185 contrib/admin/views/doc.py:207
+#: contrib/admin/views/doc.py:221 contrib/admin/views/doc.py:226
+msgid "model:"
+msgstr "model:"
+
+#: contrib/admin/views/doc.py:216
+#, python-format
+msgid "related `%(label)s.%(name)s` objects"
+msgstr "objetos `%(label)s.%(name)s` relacionados"
+
+#: contrib/admin/views/doc.py:221
+#, python-format
+msgid "all %s"
+msgstr "todos %s"
+
+#: contrib/admin/views/doc.py:226
+#, python-format
+msgid "number of %s"
+msgstr "número de %s"
+
+#: contrib/admin/views/doc.py:231
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Campos nos objetos %s"
+
+#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:304
+#: contrib/admin/views/doc.py:306 contrib/admin/views/doc.py:312
+#: contrib/admin/views/doc.py:313 contrib/admin/views/doc.py:315
+msgid "Integer"
+msgstr "Inteiro"
+
+#: contrib/admin/views/doc.py:294
+msgid "Boolean (Either True or False)"
+msgstr "Lógico (Verdadeiro ou Falso)"
+
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:314
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "String (até %(max_length)s)"
+
+#: contrib/admin/views/doc.py:296
+msgid "Comma-separated integers"
+msgstr "Inteiros separados por vírgula"
+
+#: contrib/admin/views/doc.py:297
+msgid "Date (without time)"
+msgstr "Data (sem hora)"
+
+#: contrib/admin/views/doc.py:298
+msgid "Date (with time)"
+msgstr "Data/hora"
+
+#: contrib/admin/views/doc.py:299
+msgid "Decimal number"
+msgstr "Número decimal"
+
+#: contrib/admin/views/doc.py:300
+msgid "E-mail address"
+msgstr "Endereço de e-mail"
+
+#: contrib/admin/views/doc.py:301 contrib/admin/views/doc.py:302
+#: contrib/admin/views/doc.py:305
+msgid "File path"
+msgstr "Caminho do Arquivo"
+
+#: contrib/admin/views/doc.py:303
+msgid "Floating point number"
+msgstr "Número de ponto flutuante"
+
+#: contrib/admin/views/doc.py:307 contrib/comments/models.py:89
+msgid "IP address"
+msgstr "Endereço IP:"
+
+#: contrib/admin/views/doc.py:309
+msgid "Boolean (Either True, False or None)"
+msgstr "Lógico (Verdadeiro, Falso ou Nada)"
+
+#: contrib/admin/views/doc.py:310
+msgid "Relation to parent model"
+msgstr "Relação com o modelo pai"
+
+#: contrib/admin/views/doc.py:311
+msgid "Phone number"
+msgstr "Número de telefone"
+
+#: contrib/admin/views/doc.py:316
+msgid "Text"
+msgstr "Texto"
+
+#: contrib/admin/views/doc.py:317
+msgid "Time"
+msgstr "Hora"
+
+#: contrib/admin/views/doc.py:318 contrib/flatpages/models.py:8
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:319
+msgid "U.S. state (two uppercase letters)"
+msgstr "Estado dos EUA (duas letras maiúsculas)"
+
+#: contrib/admin/views/doc.py:320
+msgid "XML text"
+msgstr "Texto XML"
+
+#: contrib/admin/views/doc.py:346
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s não aparenta ser um objeto urlpattern"
+
+#: contrib/admin/views/main.py:233
+msgid "Site administration"
+msgstr "Administração do Site"
+
+#: contrib/admin/views/main.py:280 contrib/admin/views/main.py:365
+#, python-format
+msgid "You may add another %s below."
+msgstr "Você pode adicionar outro(a) %s abaixo."
+
+#: contrib/admin/views/main.py:298
+#, python-format
+msgid "Add %s"
+msgstr "Adicionar %s"
+
+#: contrib/admin/views/main.py:344
+#, python-format
+msgid "Added %s."
+msgstr "Adicionado %s."
+
+#: contrib/admin/views/main.py:344 contrib/admin/views/main.py:346
+#: contrib/admin/views/main.py:348 core/validators.py:283
+#: db/models/manipulators.py:309
+msgid "and"
+msgstr "e"
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "Changed %s."
+msgstr "Modificado %s."
+
+#: contrib/admin/views/main.py:348
+#, python-format
+msgid "Deleted %s."
+msgstr "Excluído %s."
+
+#: contrib/admin/views/main.py:351
+msgid "No fields changed."
+msgstr "Nenhum campo modificado."
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "O(A) %(name)s \"%(obj)s\" foi modificado com sucesso."
+
+#: contrib/admin/views/main.py:362
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"O(A) %(name)s \"%(obj)s\" foi adicionado com sucesso. Você pode editá-lo(a) "
+"abaixo."
+
+#: contrib/admin/views/main.py:400
+#, python-format
+msgid "Change %s"
+msgstr "Modificar %s"
+
+#: contrib/admin/views/main.py:487
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Um(a) ou mais %(fieldname)s em %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:492
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Um(a) ou mais %(fieldname)s em %(name)s:"
+
+#: contrib/admin/views/main.py:524
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "O(A) %(name)s \"%(obj)s\" foi excluído com sucesso."
+
+#: contrib/admin/views/main.py:527
+msgid "Are you sure?"
+msgstr "Você tem certeza?"
+
+#: contrib/admin/views/main.py:549
+#, python-format
+msgid "Change history: %s"
+msgstr "Histórico de Modificações: %s"
+
+#: contrib/admin/views/main.py:583
+#, python-format
+msgid "Select %s"
+msgstr "Selecione %s"
+
+#: contrib/admin/views/main.py:583
+#, python-format
+msgid "Select %s to change"
+msgstr "Selecione %s para modificar"
+
+#: contrib/admin/views/main.py:784
+msgid "Database error"
+msgstr "Erro na base de dados"
+
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr "Os dois campos de senha não combinam."
+
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr "Um usuário com este nome de usuário já existe."
+
+#: contrib/auth/forms.py:53
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"Seu navegador Web não parece estar com os cookies habilitados. Cookies são "
+"requeridos para acessar."
+
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "Esta conta está inativa."
+
+#: contrib/auth/forms.py:84
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr ""
+"Este endereço de e-mail não está associado com uma conta de usuário.Você tem "
+"certeza que está registrado?"
+
+#: contrib/auth/forms.py:107
+#, python-format
+msgid "Password reset on %s"
+msgstr "Recuperar senha em %s"
+
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "Os dois campos 'nova senha' não conferem."
+
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr ""
+"A senha antiga foi digitada incorretamente. Por favor, informe a senha "
+"novamente."
+
+#: contrib/auth/models.py:73 contrib/auth/models.py:93
+msgid "name"
+msgstr "nome"
+
+#: contrib/auth/models.py:75
+msgid "codename"
+msgstr "apelido"
+
+#: contrib/auth/models.py:78
+msgid "permission"
+msgstr "permissão"
+
+#: contrib/auth/models.py:79 contrib/auth/models.py:94
+msgid "permissions"
+msgstr "permissões"
+
+#: contrib/auth/models.py:97
+msgid "group"
+msgstr "grupo"
+
+#: contrib/auth/models.py:98 contrib/auth/models.py:141
+msgid "groups"
+msgstr "grupos"
+
+#: contrib/auth/models.py:131
+msgid "username"
+msgstr "usuário"
+
+#: contrib/auth/models.py:131
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr ""
+"Obrigatório. 30 caracteres ou menos. Apenas caracteres alfanuméricos(letras, "
+"dígitos e sublinhados (_) )"
+
+#: contrib/auth/models.py:132
+msgid "first name"
+msgstr "primeiro nome"
+
+#: contrib/auth/models.py:133
+msgid "last name"
+msgstr "último nome"
+
+#: contrib/auth/models.py:134
+msgid "e-mail address"
+msgstr "endereço de e-mail"
+
+#: contrib/auth/models.py:135
+msgid "password"
+msgstr "senha"
+
+#: contrib/auth/models.py:135
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"Use '[algo]$[salt]$[hexdigest]' ou <a href=\"password/\"> Altere a senha</a>."
+
+#: contrib/auth/models.py:136
+msgid "staff status"
+msgstr "status da equipe"
+
+#: contrib/auth/models.py:136
+msgid "Designates whether the user can log into this admin site."
+msgstr "Permite ao usuário o acesso a este site de administração."
+
+#: contrib/auth/models.py:137
+msgid "active"
+msgstr "ativar"
+
+#: contrib/auth/models.py:137
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"Permite ao usuário acessar este site de administração. Ao invés de excluir "
+"contas de usuário, desmarque isso."
+
+#: contrib/auth/models.py:138
+msgid "superuser status"
+msgstr "status de superusuário"
+
+#: contrib/auth/models.py:138
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr ""
+"Informa que este usuário tem todas as permissões sem atribuí-las "
+"explicitamente."
+
+#: contrib/auth/models.py:139
+msgid "last login"
+msgstr "último login"
+
+#: contrib/auth/models.py:140
+msgid "date joined"
+msgstr "data de registro"
+
+#: contrib/auth/models.py:142
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"Em adição às permissões atribuídas manualmente, este usuário também terá "
+"todas as permissões dadas a cada grupo que participar."
+
+#: contrib/auth/models.py:143
+msgid "user permissions"
+msgstr "permissões do usuário"
+
+#: contrib/auth/models.py:147
+msgid "user"
+msgstr "usuário"
+
+#: contrib/auth/models.py:148
+msgid "users"
+msgstr "usuários"
+
+#: contrib/auth/models.py:154
+msgid "Personal info"
+msgstr "Informações pessoais"
+
+#: contrib/auth/models.py:155
+msgid "Permissions"
+msgstr "Permissões"
+
+#: contrib/auth/models.py:156
+msgid "Important dates"
+msgstr "Datas importantes"
+
+#: contrib/auth/models.py:157
+msgid "Groups"
+msgstr "Grupos"
+
+#: contrib/auth/models.py:316
+msgid "message"
+msgstr "mensagem"
+
+#: contrib/auth/views.py:47
+msgid "Logged out"
+msgstr "Sessão encerrada"
+
+#: contrib/comments/models.py:71 contrib/comments/models.py:176
+msgid "object ID"
+msgstr "id do objeto"
+
+#: contrib/comments/models.py:72
+msgid "headline"
+msgstr "título"
+
+#: contrib/comments/models.py:73 contrib/comments/models.py:95
+#: contrib/comments/models.py:177
+msgid "comment"
+msgstr "comentário"
+
+#: contrib/comments/models.py:74
+msgid "rating #1"
+msgstr "avaliação #1"
+
+#: contrib/comments/models.py:75
+msgid "rating #2"
+msgstr "avaliação #2"
+
+#: contrib/comments/models.py:76
+msgid "rating #3"
+msgstr "avaliação #3"
+
+#: contrib/comments/models.py:77
+msgid "rating #4"
+msgstr "avaliação #4"
+
+#: contrib/comments/models.py:78
+msgid "rating #5"
+msgstr "avaliação #5"
+
+#: contrib/comments/models.py:79
+msgid "rating #6"
+msgstr "avaliação #6"
+
+#: contrib/comments/models.py:80
+msgid "rating #7"
+msgstr "avaliação #7"
+
+#: contrib/comments/models.py:81
+msgid "rating #8"
+msgstr "avaliação #8"
+
+#: contrib/comments/models.py:86
+msgid "is valid rating"
+msgstr "é uma avaliação válida"
+
+#: contrib/comments/models.py:87 contrib/comments/models.py:179
+msgid "date/time submitted"
+msgstr "data/hora de envio"
+
+#: contrib/comments/models.py:88 contrib/comments/models.py:180
+msgid "is public"
+msgstr "é público"
+
+#: contrib/comments/models.py:90
+msgid "is removed"
+msgstr "foi removido"
+
+#: contrib/comments/models.py:90
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Selecione esta opção se o comentário é inapropriado. A mensagem \"Este "
+"comentário foi removido\" será mostrada no lugar."
+
+#: contrib/comments/models.py:96
+msgid "comments"
+msgstr "comentários"
+
+#: contrib/comments/models.py:140 contrib/comments/models.py:222
+msgid "Content object"
+msgstr "Objeto de conteúdo"
+
+#: contrib/comments/models.py:168
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Enviado por %(user)s em %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:178
+msgid "person's name"
+msgstr "nome da pessoa"
+
+#: contrib/comments/models.py:181
+msgid "ip address"
+msgstr "endereço ip"
+
+#: contrib/comments/models.py:183
+msgid "approved by staff"
+msgstr "aprovado pela equipe"
+
+#: contrib/comments/models.py:187
+msgid "free comment"
+msgstr "comentário livre"
+
+#: contrib/comments/models.py:188
+msgid "free comments"
+msgstr "comentários livres"
+
+#: contrib/comments/models.py:250
+msgid "score"
+msgstr "pontuação"
+
+#: contrib/comments/models.py:251
+msgid "score date"
+msgstr "data de pontuação"
+
+#: contrib/comments/models.py:255
+msgid "karma score"
+msgstr "pontuação de karma"
+
+#: contrib/comments/models.py:256
+msgid "karma scores"
+msgstr "pontuações de karma"
+
+#: contrib/comments/models.py:260
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "Availação %(score)d por %(user)s"
+
+#: contrib/comments/models.py:277
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"O usuário %(user)s colocou flags neste comentário:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:285
+msgid "flag date"
+msgstr "flag de data"
+
+#: contrib/comments/models.py:289
+msgid "user flag"
+msgstr "flag de usuário"
+
+#: contrib/comments/models.py:290
+msgid "user flags"
+msgstr "flags de usuário"
+
+#: contrib/comments/models.py:294
+#, python-format
+msgid "Flag by %r"
+msgstr "Flag por %r"
+
+#: contrib/comments/models.py:300
+msgid "deletion date"
+msgstr "data de exclusão"
+
+#: contrib/comments/models.py:303
+msgid "moderator deletion"
+msgstr "Exclusão feita pelo moderador"
+
+#: contrib/comments/models.py:304
+msgid "moderator deletions"
+msgstr "Exclusões feitas pelo moderador"
+
+#: contrib/comments/models.py:308
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Exclusao feita pelo moderador %r"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Esqueceu sua senha?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Avaliações"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Requerido"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Opcional"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Postar uma foto"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Comentário:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Pré-visualizar comentário"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Seu nome:"
+
+#: contrib/comments/views/comments.py:28
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr ""
+"Esta avaliação é requerida porque você entrou com ao menos uma avaliação"
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Este comentário foi feito por um usuário que postou menos de %(count)s "
+"comentário:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Este comentário foi feito por um usuário que postou menos de %(count)s "
+"comentários:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Este comentário foi feito por um usuário incompleto:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:190
+#: contrib/comments/views/comments.py:283
+msgid "Only POSTs are allowed"
+msgstr "Somente POSTs são permitidos"
+
+#: contrib/comments/views/comments.py:194
+#: contrib/comments/views/comments.py:287
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Um ou mais dos campos requeridos não foram enviados"
+
+#: contrib/comments/views/comments.py:198
+#: contrib/comments/views/comments.py:289
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Alguém modificou o formulário de comentários (violação de segurança)"
+
+#: contrib/comments/views/comments.py:208
+#: contrib/comments/views/comments.py:295
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"O formulário de comentários teve um parâmetro 'target' inválido -- o ID do "
+"objeto é inválido"
+
+#: contrib/comments/views/comments.py:259
+#: contrib/comments/views/comments.py:324
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "O formulário de comentário não forneceu nem 'preview' nem 'post'"
+
+#: contrib/comments/views/karma.py:21
+msgid "Anonymous users cannot vote"
+msgstr "Usuários anônimos não podem votar"
+
+#: contrib/comments/views/karma.py:25
+msgid "Invalid comment ID"
+msgstr "ID de comentário inválido"
+
+#: contrib/comments/views/karma.py:27
+msgid "No voting for yourself"
+msgstr "Você não pode votar em si mesmo"
+
+#: contrib/contenttypes/models.py:67
+msgid "python model class name"
+msgstr "nome da classe model no python"
+
+#: contrib/contenttypes/models.py:71
+msgid "content type"
+msgstr "tipo de conteúdo"
+
+#: contrib/contenttypes/models.py:72
+msgid "content types"
+msgstr "tipos de conteúdo"
+
+#: contrib/flatpages/models.py:9
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr "Exemplo: '/sobre/contato/'. Lembre-se das barras no começo e no final."
+
+#: contrib/flatpages/models.py:10
+msgid "title"
+msgstr "título"
+
+#: contrib/flatpages/models.py:11
+msgid "content"
+msgstr "conteúdo"
+
+#: contrib/flatpages/models.py:12
+msgid "enable comments"
+msgstr "habilitar comentários"
+
+#: contrib/flatpages/models.py:13
+msgid "template name"
+msgstr "nome do modelo"
+
+#: contrib/flatpages/models.py:14
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"Exemplo: 'flatpages/contact_page.html'. Se não for informado, será utilizado "
+"'flatpages/default.html'."
+
+#: contrib/flatpages/models.py:15
+msgid "registration required"
+msgstr "registro obrigatório"
+
+#: contrib/flatpages/models.py:15
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Se estiver marcado, apenas usuários autenticados poderão ver a página."
+
+#: contrib/flatpages/models.py:20
+msgid "flat page"
+msgstr "página plana"
+
+#: contrib/flatpages/models.py:21
+msgid "flat pages"
+msgstr "páginas planas"
+
+#: contrib/flatpages/models.py:27
+msgid "Advanced options"
+msgstr "Opções avançadas"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "th"
+msgstr "º"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "st"
+msgstr "º"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "nd"
+msgstr "º"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "rd"
+msgstr "º"
+
+#: contrib/humanize/templatetags/humanize.py:51
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f milhão"
+msgstr[1] "%(value).1f milhões"
+
+#: contrib/humanize/templatetags/humanize.py:54
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f bilhão"
+msgstr[1] "%(value).1f bilhões"
+
+#: contrib/humanize/templatetags/humanize.py:57
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f trilhão"
+msgstr[1] "%(value).1f trilhões"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "one"
+msgstr "um"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "two"
+msgstr "dois"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "three"
+msgstr "três"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "four"
+msgstr "quatro"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "five"
+msgstr "cinco"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "six"
+msgstr "seis"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "seven"
+msgstr "sete"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "eight"
+msgstr "oito"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "nine"
+msgstr "nove"
+
+#: contrib/humanize/templatetags/humanize.py:93
+msgid "today"
+msgstr "hoje"
+
+#: contrib/humanize/templatetags/humanize.py:95
+msgid "tomorrow"
+msgstr "amanhã"
+
+#: contrib/humanize/templatetags/humanize.py:97
+msgid "yesterday"
+msgstr "ontem"
+
+#: contrib/localflavor/ar/forms.py:27
+msgid "Enter a postal code in the format NNNN or ANNNNAAA."
+msgstr "Informe um código postal no formato NNNN ou ANNNNAAA."
+
+#: contrib/localflavor/ar/forms.py:49 contrib/localflavor/br/forms.py:96
+#: contrib/localflavor/br/forms.py:135 contrib/localflavor/pe/forms.py:23
+#: contrib/localflavor/pe/forms.py:51
+msgid "This field requires only numbers."
+msgstr "Este campo requer somente números."
+
+#: contrib/localflavor/ar/forms.py:50
+msgid "This field requires 7 or 8 digits."
+msgstr "Este campo requer 7 ou 8 dígitos."
+
+#: contrib/localflavor/ar/forms.py:79
+msgid "Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format."
+msgstr "Informe um CUIT válido no formato XX-XXXXXXXX-X ou XXXXXXXXXXXX."
+
+#: contrib/localflavor/ar/forms.py:80
+msgid "Invalid CUIT."
+msgstr "CUIT inválido."
+
+#: contrib/localflavor/au/forms.py:16
+msgid "Enter a 4 digit post code."
+msgstr "Informe um código postal de 4 dígitos."
+
+#: contrib/localflavor/br/forms.py:21
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Informe um código postal no formato XXXXX-XXX."
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "Números de telefone devem estar no formato XX-XXXX-XXXX."
+
+#: contrib/localflavor/br/forms.py:58
+msgid ""
+"Select a valid brazilian state. That state is not one of the available "
+"states."
+msgstr ""
+"Selecione um estado brasileiro válido. O estado escolhido não é um dos "
+"estados disponíveis."
+
+#: contrib/localflavor/br/forms.py:94
+msgid "Invalid CPF number."
+msgstr "Número de CPF inválido."
+
+#: contrib/localflavor/br/forms.py:95
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr "Este campo requer no máximo 11 dígitos ou 14 caracteres."
+
+#: contrib/localflavor/br/forms.py:134
+msgid "Invalid CNPJ number."
+msgstr "Número de CNPJ inválido."
+
+#: contrib/localflavor/br/forms.py:136
+msgid "This field requires at least 14 digits"
+msgstr "Este campo requer ao menos 14 dígitos"
+
+#: contrib/localflavor/ca/forms.py:17
+msgid "Enter a postal code in the format XXX XXX."
+msgstr "Informe um código postal no formato XXX XXX."
+
+#: contrib/localflavor/ca/forms.py:88
+msgid "Enter a valid Canadian Social Insurance number in XXX-XXX-XXX format."
+msgstr ""
+"Informe um número de Canadian Social Insurance válido no formato XXX-XXX-XXX."
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr ""
+
+#: contrib/localflavor/ch/forms.py:16 contrib/localflavor/no/forms.py:12
+msgid "Enter a zip code in the format XXXX."
+msgstr "Informe um código postal no formato XXXX."
+
+#: contrib/localflavor/ch/forms.py:64
+msgid ""
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
+msgstr ""
+"Informe uma indentidade Suíça ou número de passaporte válido no formato "
+"X1234567<0 ou 1234567890."
+
+#: contrib/localflavor/cl/forms.py:29
+msgid "Enter a valid Chilean RUT."
+msgstr "Informe um RUT chileno válido."
+
+#: contrib/localflavor/cl/forms.py:30
+msgid "Enter a valid Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr "Informe um RUT chileno válido. O formato é XX.XXX.XXX-X."
+
+#: contrib/localflavor/cl/forms.py:31
+msgid "The Chilean RUT is not valid."
+msgstr "O RUT chileno não é válido."
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr ""
+
+#: contrib/localflavor/de/forms.py:14 contrib/localflavor/fi/forms.py:12
+#: contrib/localflavor/fr/forms.py:15
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Informe um código postal no formato XXXXX."
+
+#: contrib/localflavor/de/forms.py:41
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr ""
+"Informe um número de cartão de identidade Alemã no formato XXXXXXXXXXX-"
+"XXXXXXX-XXXXXXX-X."
+
+#: contrib/localflavor/es/es_provinces.py:5
+msgid "Arava"
+msgstr "Álava"
+
+#: contrib/localflavor/es/es_provinces.py:6
+msgid "Albacete"
+msgstr "Albacete"
+
+#: contrib/localflavor/es/es_provinces.py:7
+msgid "Alacant"
+msgstr "Alicante"
+
+#: contrib/localflavor/es/es_provinces.py:8
+msgid "Almeria"
+msgstr "Almería"
+
+#: contrib/localflavor/es/es_provinces.py:9
+msgid "Avila"
+msgstr "Ávila"
+
+#: contrib/localflavor/es/es_provinces.py:10
+msgid "Badajoz"
+msgstr "Badajoz"
+
+#: contrib/localflavor/es/es_provinces.py:11
+msgid "Illes Balears"
+msgstr "Ilhas Baleares"
+
+#: contrib/localflavor/es/es_provinces.py:12
+msgid "Barcelona"
+msgstr "Barcelona"
+
+#: contrib/localflavor/es/es_provinces.py:13
+msgid "Burgos"
+msgstr "Burgos"
+
+#: contrib/localflavor/es/es_provinces.py:14
+msgid "Caceres"
+msgstr "Cáceres"
+
+#: contrib/localflavor/es/es_provinces.py:15
+msgid "Cadiz"
+msgstr "Cádiz"
+
+#: contrib/localflavor/es/es_provinces.py:16
+msgid "Castello"
+msgstr "Castellón"
+
+#: contrib/localflavor/es/es_provinces.py:17
+msgid "Ciudad Real"
+msgstr "Cidade Real"
+
+#: contrib/localflavor/es/es_provinces.py:18
+msgid "Cordoba"
+msgstr "Córdoba"
+
+#: contrib/localflavor/es/es_provinces.py:19
+msgid "A Coruna"
+msgstr "Corunha"
+
+#: contrib/localflavor/es/es_provinces.py:20
+msgid "Cuenca"
+msgstr "Cuenca"
+
+#: contrib/localflavor/es/es_provinces.py:21
+msgid "Girona"
+msgstr "Gerunda"
+
+#: contrib/localflavor/es/es_provinces.py:22
+msgid "Granada"
+msgstr "Granada"
+
+#: contrib/localflavor/es/es_provinces.py:23
+msgid "Guadalajara"
+msgstr "Guadalajara"
+
+#: contrib/localflavor/es/es_provinces.py:24
+msgid "Guipuzkoa"
+msgstr "Guipúscoa"
+
+#: contrib/localflavor/es/es_provinces.py:25
+msgid "Huelva"
+msgstr "Huelva"
+
+#: contrib/localflavor/es/es_provinces.py:26
+msgid "Huesca"
+msgstr "Huesca"
+
+#: contrib/localflavor/es/es_provinces.py:27
+msgid "Jaen"
+msgstr "Jaén"
+
+#: contrib/localflavor/es/es_provinces.py:28
+msgid "Leon"
+msgstr "Leão"
+
+#: contrib/localflavor/es/es_provinces.py:29
+msgid "Lleida"
+msgstr "Lérida"
+
+#: contrib/localflavor/es/es_provinces.py:30
+#: contrib/localflavor/es/es_regions.py:17
+msgid "La Rioja"
+msgstr "La Rioja"
+
+#: contrib/localflavor/es/es_provinces.py:31
+msgid "Lugo"
+msgstr "Lugo"
+
+#: contrib/localflavor/es/es_provinces.py:32
+#: contrib/localflavor/es/es_regions.py:18
+msgid "Madrid"
+msgstr "Madrid"
+
+#: contrib/localflavor/es/es_provinces.py:33
+msgid "Malaga"
+msgstr "Málaga"
+
+#: contrib/localflavor/es/es_provinces.py:34
+msgid "Murcia"
+msgstr "Múrcia"
+
+#: contrib/localflavor/es/es_provinces.py:35
+msgid "Navarre"
+msgstr "Navarra"
+
+#: contrib/localflavor/es/es_provinces.py:36
+msgid "Ourense"
+msgstr "Ourense"
+
+#: contrib/localflavor/es/es_provinces.py:37
+msgid "Asturias"
+msgstr "Astúrias"
+
+#: contrib/localflavor/es/es_provinces.py:38
+msgid "Palencia"
+msgstr "Palência"
+
+#: contrib/localflavor/es/es_provinces.py:39
+msgid "Las Palmas"
+msgstr "Las Palmas"
+
+#: contrib/localflavor/es/es_provinces.py:40
+msgid "Pontevedra"
+msgstr "Pontevedra"
+
+#: contrib/localflavor/es/es_provinces.py:41
+msgid "Salamanca"
+msgstr "Salamanca"
+
+#: contrib/localflavor/es/es_provinces.py:42
+msgid "Santa Cruz de Tenerife"
+msgstr "Santa Cruz de Tenerife"
+
+#: contrib/localflavor/es/es_provinces.py:43
+#: contrib/localflavor/es/es_regions.py:11
+msgid "Cantabria"
+msgstr "Cantábria"
+
+#: contrib/localflavor/es/es_provinces.py:44
+msgid "Segovia"
+msgstr "Segóvia"
+
+#: contrib/localflavor/es/es_provinces.py:45
+msgid "Seville"
+msgstr "Sevilhe"
+
+#: contrib/localflavor/es/es_provinces.py:46
+msgid "Soria"
+msgstr "Sória"
+
+#: contrib/localflavor/es/es_provinces.py:47
+msgid "Tarragona"
+msgstr "Tarragona"
+
+#: contrib/localflavor/es/es_provinces.py:48
+msgid "Teruel"
+msgstr "Teruel"
+
+#: contrib/localflavor/es/es_provinces.py:49
+msgid "Toledo"
+msgstr "Toledo"
+
+#: contrib/localflavor/es/es_provinces.py:50
+msgid "Valencia"
+msgstr "Valência"
+
+#: contrib/localflavor/es/es_provinces.py:51
+msgid "Valladolid"
+msgstr "Valladolid"
+
+#: contrib/localflavor/es/es_provinces.py:52
+msgid "Bizkaia"
+msgstr "Biscaia"
+
+#: contrib/localflavor/es/es_provinces.py:53
+msgid "Zamora"
+msgstr "Zamora"
+
+#: contrib/localflavor/es/es_provinces.py:54
+msgid "Zaragoza"
+msgstr "Saragoça"
+
+#: contrib/localflavor/es/es_provinces.py:55
+msgid "Ceuta"
+msgstr "Ceuta"
+
+#: contrib/localflavor/es/es_provinces.py:56
+msgid "Melilla"
+msgstr "Melilha"
+
+#: contrib/localflavor/es/es_regions.py:5
+msgid "Andalusia"
+msgstr "Andaluzia"
+
+#: contrib/localflavor/es/es_regions.py:6
+msgid "Aragon"
+msgstr "Aragão"
+
+#: contrib/localflavor/es/es_regions.py:7
+msgid "Principality of Asturias"
+msgstr "Principado das Astúrias"
+
+#: contrib/localflavor/es/es_regions.py:8
+msgid "Balearic Islands"
+msgstr "Ilhas Baleares"
+
+#: contrib/localflavor/es/es_regions.py:9
+msgid "Basque Country"
+msgstr "País Basco"
+
+#: contrib/localflavor/es/es_regions.py:10
+msgid "Canary Islands"
+msgstr "Ilhas Canárias"
+
+#: contrib/localflavor/es/es_regions.py:12
+msgid "Castile-La Mancha"
+msgstr "Castela-La Mancha"
+
+#: contrib/localflavor/es/es_regions.py:13
+msgid "Castile and Leon"
+msgstr "Cestela e Leão"
+
+#: contrib/localflavor/es/es_regions.py:14
+msgid "Catalonia"
+msgstr "Catalunha"
+
+#: contrib/localflavor/es/es_regions.py:15
+msgid "Extremadura"
+msgstr "Extremadura"
+
+#: contrib/localflavor/es/es_regions.py:16
+msgid "Galicia"
+msgstr "Galiza"
+
+#: contrib/localflavor/es/es_regions.py:19
+msgid "Region of Murcia"
+msgstr "Região de Múrcia"
+
+#: contrib/localflavor/es/es_regions.py:20
+msgid "Foral Community of Navarre"
+msgstr "Comunidade Foral de Navarra"
+
+#: contrib/localflavor/es/es_regions.py:21
+msgid "Valencian Community"
+msgstr "Comunidade Valenciana"
+
+#: contrib/localflavor/es/forms.py:19
+msgid "Enter a valid postal code in the range and format 01XXX - 52XXX."
+msgstr "Informe um código postal válido no intervalo e formato 01XXX - 52XXX."
+
+#: contrib/localflavor/es/forms.py:39
+msgid ""
+"Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or "
+"9XXXXXXXX."
+msgstr ""
+"Informe um número de telefone válido em um destes formatos 6XXXXXXXX, "
+"8XXXXXXXX ou 9XXXXXXXX."
+
+#: contrib/localflavor/es/forms.py:66
+msgid "Please enter a valid NIF, NIE, or CIF."
+msgstr "Por favor, informe um NIF, NIE OU CIF válido."
+
+#: contrib/localflavor/es/forms.py:67
+msgid "Please enter a valid NIF or NIE."
+msgstr "Por favor, informe um NIF ou FIE válido."
+
+#: contrib/localflavor/es/forms.py:68
+msgid "Invalid checksum for NIF."
+msgstr "O NIF é incorreto."
+
+#: contrib/localflavor/es/forms.py:69
+msgid "Invalid checksum for NIE."
+msgstr "O NIE é incorreto."
+
+#: contrib/localflavor/es/forms.py:70
+msgid "Invalid checksum for CIF."
+msgstr "O CIF é incorreto."
+
+#: contrib/localflavor/es/forms.py:142
+msgid ""
+"Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX."
+msgstr ""
+"Por favor, informe um número de conta bancária válida no formato XXXX-XXXX-"
+"XX-XXXXXXXXXX."
+
+#: contrib/localflavor/es/forms.py:143
+msgid "Invalid checksum for bank account number."
+msgstr "Número de conta bancária incorreto."
+
+#: contrib/localflavor/fi/forms.py:28
+msgid "Enter a valid Finnish social security number."
+msgstr "Informe um número de seguro social Finlandês válido."
+
+#: contrib/localflavor/in_/forms.py:14
+msgid "Enter a zip code in the format XXXXXXX."
+msgstr "Informe um código postal no formato XXXXXXX."
+
+#: contrib/localflavor/is_/forms.py:17
+msgid ""
+"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr "Informe um número de identificação islandês válido."
+
+#: contrib/localflavor/is_/forms.py:18
+msgid "The Icelandic identification number is not valid."
+msgstr "O número de identificação islandês não é válido."
+
+#: contrib/localflavor/it/forms.py:14
+msgid "Enter a valid zip code."
+msgstr "Informe um código postal válido."
+
+#: contrib/localflavor/it/forms.py:43
+msgid "Enter a valid Social Security number."
+msgstr "Informe um número de Segurança Social válido."
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr "Informe um número IVA válido."
+
+#: contrib/localflavor/jp/forms.py:17
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "Informe um código postal no formato XXXXXXX ou XXX-XXXX."
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:12
+msgid "Aguascalientes"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:13
+msgid "Baja California"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:14
+msgid "Baja California Sur"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:15
+msgid "Campeche"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:16
+msgid "Chihuahua"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:17
+msgid "Chiapas"
+msgstr "Chiapas"
+
+#: contrib/localflavor/mx/mx_states.py:18
+msgid "Coahuila"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:19
+msgid "Colima"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:20
+msgid "Distrito Federal"
+msgstr "Distrito Federal"
+
+#: contrib/localflavor/mx/mx_states.py:21
+msgid "Durango"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:22
+msgid "Guerrero"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:23
+msgid "Guanajuato"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:24
+msgid "Hidalgo"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:25
+msgid "Jalisco"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:26
+msgid "Estado de México"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:27
+msgid "Michoacán"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:28
+msgid "Morelos"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:29
+msgid "Nayarit"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:30
+msgid "Nuevo León"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:31
+msgid "Oaxaca"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:32
+msgid "Puebla"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:33
+msgid "Querétaro"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:34
+msgid "Quintana Roo"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:35
+msgid "Sinaloa"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:36
+msgid "San Luis Potosí"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:37
+msgid "Sonora"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:38
+msgid "Tabasco"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:39
+msgid "Tamaulipas"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:40
+msgid "Tlaxcala"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:41
+msgid "Veracruz"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:42
+msgid "Yucatán"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:43
+msgid "Zacatecas"
+msgstr ""
+
+#: contrib/localflavor/nl/forms.py:21
+msgid "Enter a valid postal code"
+msgstr "Informe um código postal válido."
+
+#: contrib/localflavor/nl/forms.py:52
+msgid "Enter a valid phone number"
+msgstr "Informe um número de telefone válido."
+
+#: contrib/localflavor/nl/forms.py:78
+msgid "Enter a valid SoFi number"
+msgstr "Informe um número SoFi válido."
+
+#: contrib/localflavor/nl/nl_provinces.py:4
+msgid "Drente"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:5
+msgid "Flevoland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:6
+msgid "Friesland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:7
+msgid "Gelderland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:8
+msgid "Groningen"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:9
+msgid "Limburg"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:10
+msgid "Noord-Brabant"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:11
+msgid "Noord-Holland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:12
+msgid "Overijssel"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:13
+msgid "Utrecht"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:14
+msgid "Zeeland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:15
+msgid "Zuid-Holland"
+msgstr ""
+
+#: contrib/localflavor/no/forms.py:33
+msgid "Enter a valid Norwegian social security number."
+msgstr "Informe um número de segurança social norueguês válido."
+
+#: contrib/localflavor/pe/forms.py:24
+msgid "This field requires 8 digits."
+msgstr "Este campo requer 8 dígitos."
+
+#: contrib/localflavor/pe/forms.py:52
+msgid "This field requires 11 digits."
+msgstr "Este campo requer 11 dígitos."
+
+#: contrib/localflavor/pl/forms.py:39
+msgid "National Identification Number consists of 11 digits."
+msgstr "O Número de Identificação Nacional consistem de 11 dígitos."
+
+#: contrib/localflavor/pl/forms.py:40
+msgid "Wrong checksum for the National Identification Number."
+msgstr "Número de Identificação Nacional incorreto."
+
+#: contrib/localflavor/pl/forms.py:72
+msgid ""
+"Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX."
+msgstr ""
+"Informe um número de imposto (NIP) no formato XXX-XXX-XX-XX or XX-XX-XXX-XXX."
+
+#: contrib/localflavor/pl/forms.py:73
+msgid "Wrong checksum for the Tax Number (NIP)."
+msgstr "O Número de Identificação Tributária (NIP) é incorreto."
+
+#: contrib/localflavor/pl/forms.py:112
+msgid "National Business Register Number (REGON) consists of 7 or 9 digits."
+msgstr ""
+"O Número Nacional de Registro de Negócios (REGON) consiste em 7 ou 9 dígitos."
+
+#: contrib/localflavor/pl/forms.py:113
+msgid "Wrong checksum for the National Business Register Number (REGON)."
+msgstr "O Número Nacional de Registro de Negócios (REGON) é incorreto."
+
+#: contrib/localflavor/pl/forms.py:156
+msgid "Enter a postal code in the format XX-XXX."
+msgstr "Informe um código postal válido no formato XX-XXX."
+
+#: contrib/localflavor/pl/pl_voivodeships.py:8
+msgid "Lower Silesia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:9
+msgid "Kuyavia-Pomerania"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:10
+msgid "Lublin"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:11
+msgid "Lubusz"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:12
+msgid "Lodz"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:13
+msgid "Lesser Poland"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:14
+msgid "Masovia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:15
+msgid "Opole"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:16
+msgid "Subcarpatia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:17
+msgid "Podlasie"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:18
+msgid "Pomerania"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:19
+msgid "Silesia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:20
+msgid "Swietokrzyskie"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:21
+msgid "Warmia-Masuria"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:22
+msgid "Greater Poland"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:23
+msgid "West Pomerania"
+msgstr ""
+
+#: contrib/localflavor/sk/forms.py:30
+msgid "Enter a postal code in the format XXXXX or XXX XX."
+msgstr "Informe um código postal no formato XXXXX ou XXX XX."
+
+#: contrib/localflavor/sk/sk_districts.py:8
+msgid "Banska Bystrica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:9
+msgid "Banska Stiavnica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:10
+msgid "Bardejov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:11
+msgid "Banovce nad Bebravou"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:12
+msgid "Brezno"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:13
+msgid "Bratislava I"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:14
+msgid "Bratislava II"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:15
+msgid "Bratislava III"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:16
+msgid "Bratislava IV"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:17
+msgid "Bratislava V"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:18
+msgid "Bytca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:19
+msgid "Cadca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:20
+msgid "Detva"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:21
+msgid "Dolny Kubin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:22
+msgid "Dunajska Streda"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:23
+msgid "Galanta"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:24
+msgid "Gelnica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:25
+msgid "Hlohovec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:26
+msgid "Humenne"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:27
+msgid "Ilava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:28
+msgid "Kezmarok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:29
+msgid "Komarno"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:30
+msgid "Kosice I"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:31
+msgid "Kosice II"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:32
+msgid "Kosice III"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:33
+msgid "Kosice IV"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:34
+msgid "Kosice - okolie"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:35
+msgid "Krupina"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:36
+msgid "Kysucke Nove Mesto"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:37
+msgid "Levice"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:38
+msgid "Levoca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:39
+msgid "Liptovsky Mikulas"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:40
+msgid "Lucenec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:41
+msgid "Malacky"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:42
+msgid "Martin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:43
+msgid "Medzilaborce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:44
+msgid "Michalovce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:45
+msgid "Myjava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:46
+msgid "Namestovo"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:47
+msgid "Nitra"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:48
+msgid "Nove Mesto nad Vahom"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:49
+msgid "Nove Zamky"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:50
+msgid "Partizanske"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:51
+msgid "Pezinok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:52
+msgid "Piestany"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:53
+msgid "Poltar"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:54
+msgid "Poprad"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:55
+msgid "Povazska Bystrica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:56
+msgid "Presov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:57
+msgid "Prievidza"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:58
+msgid "Puchov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:59
+msgid "Revuca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:60
+msgid "Rimavska Sobota"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:61
+msgid "Roznava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:62
+msgid "Ruzomberok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:63
+msgid "Sabinov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:64
+msgid "Senec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:65
+msgid "Senica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:66
+msgid "Skalica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:67
+msgid "Snina"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:68
+msgid "Sobrance"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:69
+msgid "Spisska Nova Ves"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:70
+msgid "Stara Lubovna"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:71
+msgid "Stropkov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:72
+msgid "Svidnik"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:73
+msgid "Sala"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:74
+msgid "Topolcany"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:75
+msgid "Trebisov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:76
+msgid "Trencin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:77
+msgid "Trnava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:78
+msgid "Turcianske Teplice"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:79
+msgid "Tvrdosin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:80
+msgid "Velky Krtis"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:81
+msgid "Vranov nad Toplou"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:82
+msgid "Zlate Moravce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:83
+msgid "Zvolen"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:84
+msgid "Zarnovica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:85
+msgid "Ziar nad Hronom"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:86
+msgid "Zilina"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:8
+msgid "Banska Bystrica region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:9
+msgid "Bratislava region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:10
+msgid "Kosice region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:11
+msgid "Nitra region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:12
+msgid "Presov region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:13
+msgid "Trencin region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:14
+msgid "Trnava region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:15
+msgid "Zilina region"
+msgstr ""
+
+#: contrib/localflavor/uk/forms.py:21
+msgid "Enter a valid postcode."
+msgstr "Informe um código postal válido."
+
+#: contrib/localflavor/uk/uk_regions.py:11
+msgid "Bedfordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:12
+msgid "Buckinghamshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:14
+msgid "Cheshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:15
+msgid "Cornwall and Isles of Scilly"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:16
+msgid "Cumbria"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:17
+msgid "Derbyshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:18
+msgid "Devon"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:19
+msgid "Dorset"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:20
+msgid "Durham"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:21
+msgid "East Sussex"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:22
+msgid "Essex"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:23
+msgid "Gloucestershire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:24
+msgid "Greater London"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:25
+msgid "Greater Manchester"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:26
+msgid "Hampshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:27
+msgid "Hertfordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:28
+msgid "Kent"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:29
+msgid "Lancashire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:30
+msgid "Leicestershire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:31
+msgid "Lincolnshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:32
+msgid "Merseyside"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:33
+msgid "Norfolk"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:34
+msgid "North Yorkshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:35
+msgid "Northamptonshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:36
+msgid "Northumberland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:37
+msgid "Nottinghamshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:38
+msgid "Oxfordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:39
+msgid "Shropshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:40
+msgid "Somerset"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:41
+msgid "South Yorkshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:42
+msgid "Staffordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:43
+msgid "Suffolk"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:44
+msgid "Surrey"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:45
+msgid "Tyne and Wear"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:46
+msgid "Warwickshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:47
+msgid "West Midlands"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:48
+msgid "West Sussex"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:49
+msgid "West Yorkshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:50
+msgid "Wiltshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:51
+msgid "Worcestershire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:55
+msgid "County Antrim"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:56
+msgid "County Armagh"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:57
+msgid "County Down"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:58
+msgid "County Fermanagh"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:59
+msgid "County Londonderry"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:60
+msgid "County Tyrone"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:64
+msgid "Clwyd"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:65
+msgid "Dyfed"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:66
+msgid "Gwent"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:67
+msgid "Gwynedd"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:68
+msgid "Mid Glamorgan"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:69
+msgid "Powys"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:70
+msgid "South Glamorgan"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:71
+msgid "West Glamorgan"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:75
+msgid "Borders"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:76
+msgid "Central Scotland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:77
+msgid "Dumfries and Galloway"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:78
+msgid "Fife"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:79
+msgid "Grampian"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:80
+msgid "Highland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:81
+msgid "Lothian"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:82
+msgid "Orkney Islands"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:83
+msgid "Shetland Islands"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:84
+msgid "Strathclyde"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:85
+msgid "Tayside"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:86
+msgid "Western Isles"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:90
+msgid "England"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:91
+msgid "Northern Ireland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:92
+msgid "Scotland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:93
+msgid "Wales"
+msgstr ""
+
+#: contrib/localflavor/us/forms.py:16
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "Informe um código postal no formato XXXXX ou XXXXX-XXXX."
+
+#: contrib/localflavor/us/forms.py:54
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr ""
+"Informe um número de Seguro Social dos EUA válido no formato XXX-XX-XXXX."
+
+#: contrib/localflavor/za/forms.py:20
+msgid "Enter a valid South African ID number"
+msgstr "Informe um ID sul-africado válido."
+
+#: contrib/localflavor/za/forms.py:54
+msgid "Enter a valid South African postal code"
+msgstr "Informe um código postal sul-africado válido."
+
+#: contrib/localflavor/za/za_provinces.py:4
+msgid "Eastern Cape"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:5
+msgid "Free State"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:6
+msgid "Gauteng"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:7
+msgid "KwaZulu-Natal"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:8
+msgid "Limpopo"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:9
+msgid "Mpumalanga"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:10
+msgid "Northern Cape"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:11
+msgid "North West"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:12
+msgid "Western Cape"
+msgstr ""
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "redirecionar de"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Isso deve ser um caminho absoluto, excluindo o nome de domínio. Exemplo: '/"
+"eventos/busca/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "redirecionar para"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Isto pode ser um caminho absoluto (como acima) ou uma URL completa, "
+"começando com 'http://'."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "redirecionar"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "redirecionamentos"
+
+#: contrib/sessions/models.py:41
+msgid "session key"
+msgstr "chave da sessão"
+
+#: contrib/sessions/models.py:42
+msgid "session data"
+msgstr "dados da sessão"
+
+#: contrib/sessions/models.py:43
+msgid "expire date"
+msgstr "data de expiração"
+
+#: contrib/sessions/models.py:48
+msgid "session"
+msgstr "sessão"
+
+#: contrib/sessions/models.py:49
+msgid "sessions"
+msgstr "sessões"
+
+#: contrib/sites/models.py:32
+msgid "domain name"
+msgstr "nome do domínio"
+
+#: contrib/sites/models.py:33
+msgid "display name"
+msgstr "nome para exibição"
+
+#: contrib/sites/models.py:37
+msgid "site"
+msgstr "site"
+
+#: contrib/sites/models.py:38
+msgid "sites"
+msgstr "sites"
+
+#: core/validators.py:72
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Este valor deve conter apenas letras, números e sublinhados (_)."
+
+#: core/validators.py:76
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Este valor deve conter apenas letras, números, sublinhados (_), travessões "
+"ou barras (/)."
+
+#: core/validators.py:80
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr ""
+"Este valor deve conter apenas letras, números, sublinhados (_) ou hífens."
+
+#: core/validators.py:84
+msgid "Uppercase letters are not allowed here."
+msgstr "Letras em maiúsculo não são permitidas aqui."
+
+#: core/validators.py:88
+msgid "Lowercase letters are not allowed here."
+msgstr "Letras em minúsculo não são permitidas aqui."
+
+#: core/validators.py:95
+msgid "Enter only digits separated by commas."
+msgstr "Informe apenas dígitos separados por vírgulas."
+
+#: core/validators.py:107
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Informe endereços de email válidos separados por vírgulas."
+
+#: core/validators.py:111
+msgid "Please enter a valid IP address."
+msgstr "Informe um endereço IP válido."
+
+#: core/validators.py:115
+msgid "Empty values are not allowed here."
+msgstr "Valores em branco não são permitidos."
+
+#: core/validators.py:119
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Caracteres não numéricos não são permitidos."
+
+#: core/validators.py:123
+msgid "This value can't be comprised solely of digits."
+msgstr "Este valor não pode conter apenas dígitos."
+
+#: core/validators.py:128 newforms/fields.py:152
+msgid "Enter a whole number."
+msgstr "Informe um número completo."
+
+#: core/validators.py:132
+msgid "Only alphabetical characters are allowed here."
+msgstr "Apenas caracteres do alfabeto são permitidos aqui."
+
+#: core/validators.py:147
+msgid "Year must be 1900 or later."
+msgstr "O ano deve ser superior a 1900"
+
+#: core/validators.py:151
+#, python-format
+msgid "Invalid date: %s"
+msgstr "Data inválida: %s"
+
+#: core/validators.py:156 db/models/fields/__init__.py:527
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Informe uma data válida no formato AAAA-MM-DD."
+
+#: core/validators.py:161
+msgid "Enter a valid time in HH:MM format."
+msgstr "Informe uma hora válida no formato HH:MM."
+
+#: core/validators.py:165 db/models/fields/__init__.py:604
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Informe uma data/hora válida no formato AAAA-MM-DD HH:MM."
+
+#: core/validators.py:170 newforms/fields.py:403
+msgid "Enter a valid e-mail address."
+msgstr "Informe um endereço de email válido."
+
+#: core/validators.py:182 core/validators.py:474 newforms/fields.py:433
+#: oldforms/__init__.py:687
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Nenhum arquivo enviado. Verifique o tipo de codificação do formulário."
+
+#: core/validators.py:193 newforms/fields.py:459
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Envie uma imagem válida. O arquivo enviado não é uma imagem ou está "
+"corrompido."
+
+#: core/validators.py:200
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "A URL %s não aponta para uma imagem válida."
+
+#: core/validators.py:204
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Números de telefone devem estar no formato XXX-XXX-XXXX.\"%s\" é inválido."
+
+#: core/validators.py:212
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "A URL %s não aponta para um vídeo QuickTime válido."
+
+#: core/validators.py:216
+msgid "A valid URL is required."
+msgstr "Uma URL válida é exigida."
+
+#: core/validators.py:230
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"HTML válido é exigido. Os erros específicos são:\n"
+"%s"
+
+#: core/validators.py:237
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "XML mal formado: %s"
+
+#: core/validators.py:254
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "URL inválida: %s"
+
+#: core/validators.py:259 core/validators.py:261
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "A URL %s é um link quebrado."
+
+#: core/validators.py:267
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Informe uma abreviação válida de estado dos E.U.A."
+
+#: core/validators.py:281
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Olha sua boca! A palavra %s não é permitida aqui."
+msgstr[1] "Olha sua boca! As palavras %s não são permitidas aqui."
+
+#: core/validators.py:288
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Este campo deve casar com o campo '%s'."
+
+#: core/validators.py:307
+msgid "Please enter something for at least one field."
+msgstr "Informe algo em pelo menos um campo."
+
+#: core/validators.py:316 core/validators.py:327
+msgid "Please enter both fields or leave them both empty."
+msgstr "Informe ambos os campos ou deixe ambos vazios."
+
+#: core/validators.py:335
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Este campo deve ser informado se o campo %(field)s for %(value)s."
+
+#: core/validators.py:348
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Este campo deve ser dado se o campo %(field)s não for %(value)s."
+
+#: core/validators.py:367
+msgid "Duplicate values are not allowed."
+msgstr "Valores duplicados não são permitidos."
+
+#: core/validators.py:382
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Este valor deve estar entre %(lower)s e %(upper)s."
+
+#: core/validators.py:384
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Este valor deve ser no mínimo %s."
+
+#: core/validators.py:386
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Este valor não deve ser maior que %s."
+
+#: core/validators.py:427
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Este valor deve ser uma potência de %s."
+
+#: core/validators.py:437
+msgid "Please enter a valid decimal number."
+msgstr "Informe um número decimal válido."
+
+#: core/validators.py:444
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Por favor entre com um número decimal com no máximo %s dígito."
+msgstr[1] "Por favor entre com um número decimal com no máximo %s dígitos."
+
+#: core/validators.py:447
+#, python-format
+msgid ""
+"Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural ""
+"Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] ""
+"Por favor informe um número decimal com a parte inteira de no máximo %s "
+"digito."
+msgstr[1] ""
+"Por favor informe um número decimal com a parte inteira de no máximo %s "
+"digitos."
+
+#: core/validators.py:450
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "Por favor informe um número decimal com no máximo %s casa decimal."
+msgstr[1] ""
+"Por favor informe um número decimal com no máximo %s casas decimais."
+
+#: core/validators.py:458
+msgid "Please enter a valid floating point number."
+msgstr "Informe um número de ponto flutuante válido."
+
+#: core/validators.py:467
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Verifique se o arquivo enviado tem pelo menos %s bytes."
+
+#: core/validators.py:468
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Verifique se o arquivo enviado tem no máximo %s bytes."
+
+#: core/validators.py:485
+msgid "The format for this field is wrong."
+msgstr "O formato deste campo está errado."
+
+#: core/validators.py:500
+msgid "This field is invalid."
+msgstr "Este campo é inválido."
+
+#: core/validators.py:536
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Não foi possível receber dados de %s."
+
+#: core/validators.py:539
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"A URL %(url)s retornou um cabeçalho '%(contenttype)s' de Content-Type "
+"inválido."
+
+#: core/validators.py:572
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Por favor, feche a tag %(tag)s na linha %(line)s. (A linha começa com \"%"
+"(start)s\".)"
+
+#: core/validators.py:576
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Algum texto começando na linha %(line)s não é permitido no contexto. (Linha "
+"começa com \"%(start)s\".)"
+
+#: core/validators.py:581
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"%(attr)s\" na linha %(line)s não é um atributo válido. (Linha começa com "
+"\"%(start)s\".)"
+
+#: core/validators.py:586
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\" na linha %(line)s é uma tag inválida. (Linha começa com \"%"
+"(start)s\".)"
+
+#: core/validators.py:590
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Uma tag na linha %(line)s não apresenta um ou mais atributos exigidos.(Linha "
+"começa com \"%(start)s\".)"
+
+#: core/validators.py:595
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"O atributo \"%(attr)s\" na linha %(line)s tem um valor inválido. (Linha "
+"começa com \"%(start)s\".)"
+
+#: db/models/manipulators.py:308
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(object)s com este %(type)s já existe para o %(field)s dado."
+
+#: db/models/fields/__init__.py:52
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s com este %(fieldname)s já existe."
+
+#: db/models/fields/__init__.py:161 db/models/fields/__init__.py:327
+#: db/models/fields/__init__.py:759 db/models/fields/__init__.py:770
+#: newforms/fields.py:46 oldforms/__init__.py:374
+msgid "This field is required."
+msgstr "Este campo é requerido."
+
+#: db/models/fields/__init__.py:427
+msgid "This value must be an integer."
+msgstr "Este valor deve ser um inteiro."
+
+#: db/models/fields/__init__.py:466
+msgid "This value must be either True or False."
+msgstr "Este valor deve ser True ou False."
+
+#: db/models/fields/__init__.py:490
+msgid "This field cannot be null."
+msgstr "Este campo não pode ser nulo."
+
+#: db/models/fields/__init__.py:668
+msgid "This value must be a decimal number."
+msgstr "Este valor deve ser um número decimal."
+
+#: db/models/fields/__init__.py:779
+msgid "Enter a valid filename."
+msgstr "Informe um nome de arquivo válido."
+
+#: db/models/fields/__init__.py:960
+msgid "This value must be either None, True or False."
+msgstr "Este valor deve ser None, True ou False."
+
+#: db/models/fields/related.py:93
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Por favor informe um %s válido."
+
+#: db/models/fields/related.py:701
+msgid "Separate multiple IDs with commas."
+msgstr "Separe IDs múltiplos com vírgulas."
+
+#: db/models/fields/related.py:703
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+" Mantenha pressionado \"Control\", ou \"Command\" no Mac para selecionar "
+"mais de uma opção."
+
+#: db/models/fields/related.py:750
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+"Por favor, informe IDs válidos para %(self)s. O valor %(value)r é inválido."
+msgstr[1] ""
+"Por favor, informe IDs válidos para %(self)s. Os valores %(value)r são "
+"inválidos."
+
+#: newforms/fields.py:47
+msgid "Enter a valid value."
+msgstr "Informe um valor válido."
+
+#: newforms/fields.py:124
+#, python-format
+msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+msgstr ""
+"Certifique-se de que o valor tenha no máximo %(max)d caracteres (ele possui %"
+"(length)d)."
+
+#: newforms/fields.py:125
+#, python-format
+msgid "Ensure this value has at least %(min)d characters (it has %(length)d)."
+msgstr ""
+"Certifique-se de que o valor tenha no mínimo %(min)d caracteres (ele possui %"
+"(length)d)."
+
+#: newforms/fields.py:153 newforms/fields.py:182 newforms/fields.py:211
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Certifique-se que este valor seja menor ou igual a %s."
+
+#: newforms/fields.py:154 newforms/fields.py:183 newforms/fields.py:212
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Certifique-se que este valor seja maior ou igual a %s."
+
+#: newforms/fields.py:181 newforms/fields.py:210
+msgid "Enter a number."
+msgstr "Informe um número."
+
+#: newforms/fields.py:213
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr "Certifique-se de que não tenha mais de %s dígitos no total."
+
+#: newforms/fields.py:214
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr "Certifique-se de que não tenha mais de %s casa decimais."
+
+#: newforms/fields.py:215
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr ""
+"Certifique-se de que não tenha mais de %s dígitos antes do ponto decimal."
+
+#: newforms/fields.py:263 newforms/fields.py:751
+msgid "Enter a valid date."
+msgstr "Informe uma data válida."
+
+#: newforms/fields.py:296 newforms/fields.py:752
+msgid "Enter a valid time."
+msgstr "Informe uma hora válida."
+
+#: newforms/fields.py:335
+msgid "Enter a valid date/time."
+msgstr "Informe uma data/hora válida."
+
+#: newforms/fields.py:434
+msgid "No file was submitted."
+msgstr "Não foi enviado nenhum arquivo."
+
+#: newforms/fields.py:435 oldforms/__init__.py:689
+msgid "The submitted file is empty."
+msgstr "O arquivo enviado está vazio."
+
+#: newforms/fields.py:497
+msgid "Enter a valid URL."
+msgstr "Informe uma URL válida."
+
+#: newforms/fields.py:498
+msgid "This URL appears to be a broken link."
+msgstr "A URL %s aparenta ser um link quebrado."
+
+#: newforms/fields.py:560 newforms/models.py:299
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Faça uma escolha válida. Sua escolha não é uma das disponíveis."
+
+#: newforms/fields.py:599
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "Faça uma escolha válida. %(value)s não está disponível."
+
+#: newforms/fields.py:600 newforms/fields.py:662 newforms/models.py:371
+msgid "Enter a list of values."
+msgstr "Informe uma lista de valores."
+
+#: newforms/fields.py:780
+msgid "Enter a valid IPv4 address."
+msgstr "Informe um endereço IPv4 válido."
+
+#: newforms/models.py:372
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Faça uma escolha válida. %s não está disponível."
+
+#: oldforms/__init__.py:409
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Certifique-se de que seu texto tenha menos que %s caractere."
+msgstr[1] "Certifique-se de que seu texto tenha menos que %s caracteres."
+
+#: oldforms/__init__.py:414
+msgid "Line breaks are not allowed here."
+msgstr "Não são permitidas quebras de linha aqui."
+
+#: oldforms/__init__.py:512 oldforms/__init__.py:586 oldforms/__init__.py:625
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Selecione uma escolha válida; '%(data)s' não está em %(choices)s."
+
+#: oldforms/__init__.py:745
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Informe um número inteiro entre -32.768 e 32.767"
+
+#: oldforms/__init__.py:755
+msgid "Enter a positive number."
+msgstr "Informe um número positivo"
+
+#: oldforms/__init__.py:765
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Informe um número inteiro entre 0 e 32.767."
+
+#: template/defaultfilters.py:698
+msgid "yes,no,maybe"
+msgstr "sim,não,talvez"
+
+#: template/defaultfilters.py:729
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d byte"
+msgstr[1] "%(size)d bytes"
+
+#: template/defaultfilters.py:731
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f KB"
+
+#: template/defaultfilters.py:733
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: template/defaultfilters.py:734
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#: utils/dateformat.py:41
+msgid "p.m."
+msgstr "p.m."
+
+#: utils/dateformat.py:42
+msgid "a.m."
+msgstr "a.m."
+
+#: utils/dateformat.py:47
+msgid "PM"
+msgstr "PM"
+
+#: utils/dateformat.py:48
+msgid "AM"
+msgstr "AM"
+
+#: utils/dateformat.py:97
+msgid "midnight"
+msgstr "meia noite"
+
+#: utils/dateformat.py:99
+msgid "noon"
+msgstr "meio dia"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Segunda-feira"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Terça-feira"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Quarta-feira"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Quinta-feira"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Sexta-feira"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Sábado"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Domingo"
+
+#: utils/dates.py:10
+msgid "Mon"
+msgstr "Seg"
+
+#: utils/dates.py:10
+msgid "Tue"
+msgstr "Ter"
+
+#: utils/dates.py:10
+msgid "Wed"
+msgstr "Qua"
+
+#: utils/dates.py:10
+msgid "Thu"
+msgstr "Qui"
+
+#: utils/dates.py:10
+msgid "Fri"
+msgstr "Sex"
+
+#: utils/dates.py:11
+msgid "Sat"
+msgstr "Sab"
+
+#: utils/dates.py:11
+msgid "Sun"
+msgstr "Dom"
+
+#: utils/dates.py:18
+msgid "January"
+msgstr "Janeiro"
+
+#: utils/dates.py:18
+msgid "February"
+msgstr "Fevereiro"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "March"
+msgstr "Março"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "April"
+msgstr "Abril"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "May"
+msgstr "Maio"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "June"
+msgstr "Junho"
+
+#: utils/dates.py:19 utils/dates.py:31
+msgid "July"
+msgstr "Julho"
+
+#: utils/dates.py:19
+msgid "August"
+msgstr "Agosto"
+
+#: utils/dates.py:19
+msgid "September"
+msgstr "Setembro"
+
+#: utils/dates.py:19
+msgid "October"
+msgstr "Outubro"
+
+#: utils/dates.py:19
+msgid "November"
+msgstr "Novembro"
+
+#: utils/dates.py:20
+msgid "December"
+msgstr "Dezembro"
+
+#: utils/dates.py:23
+msgid "jan"
+msgstr "jan"
+
+#: utils/dates.py:23
+msgid "feb"
+msgstr "fev"
+
+#: utils/dates.py:23
+msgid "mar"
+msgstr "mar"
+
+#: utils/dates.py:23
+msgid "apr"
+msgstr "abr"
+
+#: utils/dates.py:23
+msgid "may"
+msgstr "mai"
+
+#: utils/dates.py:23
+msgid "jun"
+msgstr "jun"
+
+#: utils/dates.py:24
+msgid "jul"
+msgstr "jul"
+
+#: utils/dates.py:24
+msgid "aug"
+msgstr "ago"
+
+#: utils/dates.py:24
+msgid "sep"
+msgstr "set"
+
+#: utils/dates.py:24
+msgid "oct"
+msgstr "out"
+
+#: utils/dates.py:24
+msgid "nov"
+msgstr "nov"
+
+#: utils/dates.py:24
+msgid "dec"
+msgstr "dez"
+
+#: utils/dates.py:31
+msgid "Jan."
+msgstr "Jan."
+
+#: utils/dates.py:31
+msgid "Feb."
+msgstr "Fev."
+
+#: utils/dates.py:32
+msgid "Aug."
+msgstr "Ago."
+
+#: utils/dates.py:32
+msgid "Sept."
+msgstr "Set."
+
+#: utils/dates.py:32
+msgid "Oct."
+msgstr "Out."
+
+#: utils/dates.py:32
+msgid "Nov."
+msgstr "Nov."
+
+#: utils/dates.py:32
+msgid "Dec."
+msgstr "Dez."
+
+#: utils/text.py:127
+msgid "or"
+msgstr "ou"
+
+#: utils/timesince.py:21
+msgid "year"
+msgid_plural "years"
+msgstr[0] "ano"
+msgstr[1] "anos"
+
+#: utils/timesince.py:22
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mês"
+msgstr[1] "meses"
+
+#: utils/timesince.py:23
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "semana"
+msgstr[1] "semanas"
+
+#: utils/timesince.py:24
+msgid "day"
+msgid_plural "days"
+msgstr[0] "dia"
+msgstr[1] "dias"
+
+#: utils/timesince.py:25
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "hora"
+msgstr[1] "horas"
+
+#: utils/timesince.py:26
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuto"
+msgstr[1] "minutos"
+
+#: utils/timesince.py:46
+msgid "minutes"
+msgstr "minutos"
+
+#: utils/timesince.py:51
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr "%(number)d %(type)s"
+
+#: utils/timesince.py:57
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ", %(number)d %(type)s"
+
+#: utils/translation/trans_real.py:403
+msgid "DATE_FORMAT"
+msgstr ""
+
+#: utils/translation/trans_real.py:404
+msgid "DATETIME_FORMAT"
+msgstr ""
+
+#: utils/translation/trans_real.py:405
+msgid "TIME_FORMAT"
+msgstr ""
+
+#: utils/translation/trans_real.py:421
+msgid "YEAR_MONTH_FORMAT"
+msgstr ""
+
+#: utils/translation/trans_real.py:422
+msgid "MONTH_DAY_FORMAT"
+msgstr ""
+
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "O(A) %(verbose_name)s foi criado com sucesso."
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "O(A) %(verbose_name)s foi atualizado com sucesso."
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "O(A) %(verbose_name)s foi excluído."
diff --git a/webapp/django/conf/locale/pt_BR/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/pt_BR/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..7aaab11
--- /dev/null
+++ b/webapp/django/conf/locale/pt_BR/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/pt_BR/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/pt_BR/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..0fe9f17
--- /dev/null
+++ b/webapp/django/conf/locale/pt_BR/LC_MESSAGES/djangojs.po
@@ -0,0 +1,115 @@
+# Português do Brasil translation of django.
+# Copyright (C) 2006 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-12-09 11:51+0100\n"
+"PO-Revision-Date: 2008-08-01 12:27-0300\n"
+"Last-Translator: Rafael Jamur <rjamur@gmail.com>\n"
+"Language-Team: Grupo de Localização para o Português <django-l10n-portuguese@googlegroups.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "%s Disponíveis"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Escolher todos"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Adicionar"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Remover"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "%s escolhido(s)"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Selecione sua(s) escolha(s) e clique "
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Limpar tudo"
+
+#: contrib/admin/media/js/dateparse.js:26
+#: contrib/admin/media/js/calendar.js:24
+msgid "January February March April May June July August September October November December"
+msgstr "Janeiro Fevereiro Março Abril Maio Junho Julho Agosto Setembro Outubro Novembro Dezembro"
+
+#: contrib/admin/media/js/dateparse.js:27
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Domingo Segunda Terça Quarta Quinta Sexta Sábado"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "D S T Q Q S S"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "Agora"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "Relógio"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "Escolha uma hora"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "Meia-noite"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "6 da manhã"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "Meio-dia"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "Hoje"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "Calendário"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "Ontem"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "Amanhã"
+
+#: contrib/admin/media/js/admin/CollapsedFieldSets:34
+#: contrib/admin/media/js/admin/CollapsedFieldSets:72
+msgid "Show"
+msgstr "Mostrar"
+
+#: contrib/admin/media/js/admin/CollapsedFieldSets:63
+msgid "Hide"
+msgstr "Esconder"
+
diff --git a/webapp/django/conf/locale/ro/LC_MESSAGES/django.mo b/webapp/django/conf/locale/ro/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..c4ca6e6
--- /dev/null
+++ b/webapp/django/conf/locale/ro/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/ro/LC_MESSAGES/django.po b/webapp/django/conf/locale/ro/LC_MESSAGES/django.po
new file mode 100644
index 0000000..cdbe7a4
--- /dev/null
+++ b/webapp/django/conf/locale/ro/LC_MESSAGES/django.po
@@ -0,0 +1,4261 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-04-25 14:44+0300\n"
+"PO-Revision-Date: 2008-04-25 21:44+0200\n"
+"Last-Translator: \n"
+"Language-Team: Romanian <ro@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: .\conf\global_settings.py:39
+msgid "Arabic"
+msgstr "Araba"
+
+#: .\conf\global_settings.py:40
+msgid "Bengali"
+msgstr "Bengaleza"
+
+#: .\conf\global_settings.py:41
+msgid "Bulgarian"
+msgstr "Bulgara"
+
+#: .\conf\global_settings.py:42
+msgid "Catalan"
+msgstr "Catalana"
+
+#: .\conf\global_settings.py:43
+msgid "Czech"
+msgstr "Cehă"
+
+#: .\conf\global_settings.py:44
+msgid "Welsh"
+msgstr "Galeza"
+
+#: .\conf\global_settings.py:45
+msgid "Danish"
+msgstr "Daneza"
+
+#: .\conf\global_settings.py:46
+msgid "German"
+msgstr "Germană"
+
+#: .\conf\global_settings.py:47
+msgid "Greek"
+msgstr "Greaca"
+
+#: .\conf\global_settings.py:48
+msgid "English"
+msgstr "Engleză"
+
+#: .\conf\global_settings.py:49
+msgid "Spanish"
+msgstr "Spaniolă"
+
+#: .\conf\global_settings.py:50
+msgid "Argentinean Spanish"
+msgstr "Spaniola argentiniana"
+
+#: .\conf\global_settings.py:51
+msgid "Basque"
+msgstr "Basca"
+
+#: .\conf\global_settings.py:52
+msgid "Persian"
+msgstr "Persana"
+
+#: .\conf\global_settings.py:53
+msgid "Finnish"
+msgstr "Finlandeza"
+
+#: .\conf\global_settings.py:54
+msgid "French"
+msgstr "Franceză"
+
+#: .\conf\global_settings.py:55
+msgid "Irish"
+msgstr "Irlandeza"
+
+#: .\conf\global_settings.py:56
+msgid "Galician"
+msgstr "Galiciană"
+
+#: .\conf\global_settings.py:57
+msgid "Hungarian"
+msgstr "Ungara"
+
+#: .\conf\global_settings.py:58
+msgid "Hebrew"
+msgstr "Ebraica"
+
+#: .\conf\global_settings.py:59
+msgid "Croatian"
+msgstr "Croata"
+
+#: .\conf\global_settings.py:60
+msgid "Icelandic"
+msgstr "Islandeza"
+
+#: .\conf\global_settings.py:61
+msgid "Italian"
+msgstr "Italiană"
+
+#: .\conf\global_settings.py:62
+msgid "Japanese"
+msgstr "Japoneza"
+
+#: .\conf\global_settings.py:63
+msgid "Georgian"
+msgstr "Georgiana"
+
+#: .\conf\global_settings.py:64
+msgid "Korean"
+msgstr "Koreana"
+
+#: .\conf\global_settings.py:65
+msgid "Khmer"
+msgstr "Khmera"
+
+#: .\conf\global_settings.py:66
+msgid "Kannada"
+msgstr "Limba kannada"
+
+#: .\conf\global_settings.py:67
+msgid "Latvian"
+msgstr "Letona"
+
+#: .\conf\global_settings.py:68
+msgid "Macedonian"
+msgstr "Macedoneana"
+
+#: .\conf\global_settings.py:69
+msgid "Dutch"
+msgstr "Olandeza"
+
+#: .\conf\global_settings.py:70
+msgid "Norwegian"
+msgstr "Norvegiană"
+
+#: .\conf\global_settings.py:71
+msgid "Polish"
+msgstr "Poloneza"
+
+#: .\conf\global_settings.py:72
+msgid "Portugese"
+msgstr "Portugheza"
+
+#: .\conf\global_settings.py:73
+msgid "Brazilian Portuguese"
+msgstr "Portugheza braziliana"
+
+#: .\conf\global_settings.py:74
+msgid "Romanian"
+msgstr "Romana"
+
+#: .\conf\global_settings.py:75
+msgid "Russian"
+msgstr "Rusă"
+
+#: .\conf\global_settings.py:76
+msgid "Slovak"
+msgstr "Slovaca"
+
+#: .\conf\global_settings.py:77
+msgid "Slovenian"
+msgstr "Slovena"
+
+#: .\conf\global_settings.py:78
+msgid "Serbian"
+msgstr "Sîrbă"
+
+#: .\conf\global_settings.py:79
+msgid "Swedish"
+msgstr "Suedeza"
+
+#: .\conf\global_settings.py:80
+msgid "Tamil"
+msgstr "Limba tamila"
+
+#: .\conf\global_settings.py:81
+msgid "Telugu"
+msgstr "Limba telugu"
+
+#: .\conf\global_settings.py:82
+msgid "Turkish"
+msgstr "Turca"
+
+#: .\conf\global_settings.py:83
+msgid "Ukrainian"
+msgstr "Ucraineana"
+
+#: .\conf\global_settings.py:84
+msgid "Simplified Chinese"
+msgstr "Chineză simplificată"
+
+#: .\conf\global_settings.py:85
+msgid "Traditional Chinese"
+msgstr "Chineza traditionala"
+
+#: .\contrib\admin\filterspecs.py:44
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Dupa %s:</h3>\n"
+"<ul>\n"
+
+#: .\contrib\admin\filterspecs.py:74
+#: .\contrib\admin\filterspecs.py:92
+#: .\contrib\admin\filterspecs.py:147
+#: .\contrib\admin\filterspecs.py:173
+msgid "All"
+msgstr "tot"
+
+#: .\contrib\admin\filterspecs.py:113
+msgid "Any date"
+msgstr "orice data"
+
+#: .\contrib\admin\filterspecs.py:114
+msgid "Today"
+msgstr "Astazi"
+
+#: .\contrib\admin\filterspecs.py:117
+msgid "Past 7 days"
+msgstr "Ultimele 7 zile"
+
+#: .\contrib\admin\filterspecs.py:119
+msgid "This month"
+msgstr "Luna aceasta"
+
+#: .\contrib\admin\filterspecs.py:121
+msgid "This year"
+msgstr "Anul acesta"
+
+#: .\contrib\admin\filterspecs.py:147
+#: .\newforms\widgets.py:231
+#: .\oldforms\__init__.py:592
+msgid "Yes"
+msgstr "Da"
+
+#: .\contrib\admin\filterspecs.py:147
+#: .\newforms\widgets.py:231
+#: .\oldforms\__init__.py:592
+msgid "No"
+msgstr "Nu"
+
+#: .\contrib\admin\filterspecs.py:154
+#: .\newforms\widgets.py:231
+#: .\oldforms\__init__.py:592
+msgid "Unknown"
+msgstr "Necunoscut"
+
+#: .\contrib\admin\models.py:18
+msgid "action time"
+msgstr "timp acţiune"
+
+#: .\contrib\admin\models.py:21
+msgid "object id"
+msgstr "id obiect"
+
+#: .\contrib\admin\models.py:22
+msgid "object repr"
+msgstr "repr obiect"
+
+#: .\contrib\admin\models.py:23
+msgid "action flag"
+msgstr "steguleţ acţiune"
+
+#: .\contrib\admin\models.py:24
+msgid "change message"
+msgstr "schimbă mesaj"
+
+#: .\contrib\admin\models.py:27
+msgid "log entry"
+msgstr "intrare log"
+
+#: .\contrib\admin\models.py:28
+msgid "log entries"
+msgstr "intrări log"
+
+#: .\contrib\admin\templates\admin\404.html.py:4
+#: .\contrib\admin\templates\admin\404.html.py:8
+msgid "Page not found"
+msgstr "Pagină inexistentă"
+
+#: .\contrib\admin\templates\admin\404.html.py:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Ne pare rău, dar pagina cerută nu există."
+
+#: .\contrib\admin\templates\admin\500.html.py:4
+#: .\contrib\admin\templates\admin\base.html.py:37
+#: .\contrib\admin\templates\admin\change_form.html.py:12
+#: .\contrib\admin\templates\admin\change_list.html.py:5
+#: .\contrib\admin\templates\admin\delete_confirmation.html.py:5
+#: .\contrib\admin\templates\admin\invalid_setup.html.py:4
+#: .\contrib\admin\templates\admin\object_history.html.py:4
+#: .\contrib\admin\templates\admin\auth\user\change_password.html.py:11
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:3
+#: .\contrib\admin\templates\registration\logged_out.html.py:4
+#: .\contrib\admin\templates\registration\password_change_done.html.py:3
+#: .\contrib\admin\templates\registration\password_change_form.html.py:3
+#: .\contrib\admin\templates\registration\password_reset_done.html.py:4
+#: .\contrib\admin\templates\registration\password_reset_form.html.py:4
+msgid "Home"
+msgstr "Acasă"
+
+#: .\contrib\admin\templates\admin\500.html.py:4
+msgid "Server error"
+msgstr "Eroare de server"
+
+#: .\contrib\admin\templates\admin\500.html.py:6
+msgid "Server error (500)"
+msgstr "Eroare de server (500)"
+
+#: .\contrib\admin\templates\admin\500.html.py:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Eroare server <em>(500)</em>"
+
+#: .\contrib\admin\templates\admin\500.html.py:10
+msgid "There's been an error. It's been reported to the site administrators via e-mail and should be fixed shortly. Thanks for your patience."
+msgstr "A apărut o eroare. Este raportată către administrator via emailşi va fi fixată în scurt timp. Mulţumim pentru înţelegere."
+
+#: .\contrib\admin\templates\admin\base.html.py:26
+msgid "Welcome,"
+msgstr "Bine ai venit,"
+
+#: .\contrib\admin\templates\admin\base.html.py:28
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:3
+msgid "Documentation"
+msgstr "Documentatie"
+
+#: .\contrib\admin\templates\admin\base.html.py:29
+#: .\contrib\admin\templates\admin\auth\user\change_password.html.py:14
+#: .\contrib\admin\templates\admin\auth\user\change_password.html.py:45
+msgid "Change password"
+msgstr "Schimbă parola"
+
+#: .\contrib\admin\templates\admin\base.html.py:30
+#: .\contrib\comments\templates\comments\form.html.py:6
+msgid "Log out"
+msgstr "Deautentificare"
+
+#: .\contrib\admin\templates\admin\base_site.html.py:4
+msgid "Django site admin"
+msgstr "Administrare sit Django"
+
+#: .\contrib\admin\templates\admin\base_site.html.py:7
+msgid "Django administration"
+msgstr "Administrare Django"
+
+#: .\contrib\admin\templates\admin\change_form.html.py:14
+#: .\contrib\admin\templates\admin\index.html.py:28
+msgid "Add"
+msgstr "Adaugă"
+
+#: .\contrib\admin\templates\admin\change_form.html.py:20
+#: .\contrib\admin\templates\admin\object_history.html.py:4
+msgid "History"
+msgstr "Istoric"
+
+#: .\contrib\admin\templates\admin\change_form.html.py:21
+msgid "View on site"
+msgstr "Vizualizeaza pe site"
+
+#: .\contrib\admin\templates\admin\change_form.html.py:31
+#: .\contrib\admin\templates\admin\auth\user\change_password.html.py:23
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Va rugam sa corectati eroarea de mai jos"
+msgstr[1] "Va rugam sa corectati erorile de mai jos"
+
+#: .\contrib\admin\templates\admin\change_form.html.py:49
+msgid "Ordering"
+msgstr "Ordonate dupa"
+
+#: .\contrib\admin\templates\admin\change_form.html.py:52
+msgid "Order:"
+msgstr "Ordonare:"
+
+#: .\contrib\admin\templates\admin\change_list.html.py:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "Adaugă %(name)s"
+
+#: .\contrib\admin\templates\admin\delete_confirmation.html.py:8
+#: .\contrib\admin\templates\admin\submit_line.html.py:3
+msgid "Delete"
+msgstr "Sterge"
+
+#: .\contrib\admin\templates\admin\delete_confirmation.html.py:13
+#, python-format
+msgid "Deleting the %(object_name)s '%(escaped_object)s' would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:"
+msgstr "Ştergînd %(object_name)s '%(escaped_object)s' va avea ca rezultat ştergerea şi a obiectelor ce au legătură, dar contul tău nu are permisiunea de a şterge următoarele tipuri de obiecte:"
+
+#: .\contrib\admin\templates\admin\delete_confirmation.html.py:20
+#, python-format
+msgid "Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? All of the following related items will be deleted:"
+msgstr "Eşti sigur că vrei să ştergi %(object_name)s \"%(escaped_object)s\"? Următoarele componente asociate vor fi şterse:"
+
+#: .\contrib\admin\templates\admin\delete_confirmation.html.py:25
+msgid "Yes, I'm sure"
+msgstr "Da, sînt sigur"
+
+#: .\contrib\admin\templates\admin\filter.html.py:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "Dupa %(filter_title)s "
+
+#: .\contrib\admin\templates\admin\filters.html.py:4
+msgid "Filter"
+msgstr "Filtru"
+
+#: .\contrib\admin\templates\admin\index.html.py:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Modele disponibile in applicatia %(name)s"
+
+#: .\contrib\admin\templates\admin\index.html.py:18
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: .\contrib\admin\templates\admin\index.html.py:34
+msgid "Change"
+msgstr "Schimbă"
+
+#: .\contrib\admin\templates\admin\index.html.py:44
+msgid "You don't have permission to edit anything."
+msgstr "Nu ai drepturi de editare."
+
+#: .\contrib\admin\templates\admin\index.html.py:52
+msgid "Recent Actions"
+msgstr "Acţiuni Recente"
+
+#: .\contrib\admin\templates\admin\index.html.py:53
+msgid "My Actions"
+msgstr "Acţiunile Mele"
+
+#: .\contrib\admin\templates\admin\index.html.py:57
+msgid "None available"
+msgstr "Indisponibil"
+
+#: .\contrib\admin\templates\admin\invalid_setup.html.py:8
+msgid "Something's wrong with your database installation. Make sure the appropriate database tables have been created, and make sure the database is readable by the appropriate user."
+msgstr "Exista o problema cu baza de date. Verificati daca tabelele necesare din baza de date au fost create si verificati daca baza de date poate fi citita de utilizatorul potrivit."
+
+#: .\contrib\admin\templates\admin\login.html.py:17
+#: .\contrib\comments\templates\comments\form.html.py:6
+#: .\contrib\comments\templates\comments\form.html.py:8
+msgid "Username:"
+msgstr "Utilizator:"
+
+#: .\contrib\admin\templates\admin\login.html.py:20
+#: .\contrib\comments\templates\comments\form.html.py:8
+msgid "Password:"
+msgstr "Parola:"
+
+#: .\contrib\admin\templates\admin\login.html.py:25
+#: .\contrib\admin\views\decorators.py:31
+msgid "Log in"
+msgstr "Login"
+
+#: .\contrib\admin\templates\admin\object_history.html.py:17
+msgid "Date/time"
+msgstr "Dată/oră"
+
+#: .\contrib\admin\templates\admin\object_history.html.py:18
+msgid "User"
+msgstr "Utilizator"
+
+#: .\contrib\admin\templates\admin\object_history.html.py:19
+msgid "Action"
+msgstr "Acţiune"
+
+#: .\contrib\admin\templates\admin\object_history.html.py:25
+msgid "DATE_WITH_TIME_FULL"
+msgstr "N j, Y, P"
+
+#: .\contrib\admin\templates\admin\object_history.html.py:35
+msgid "This object doesn't have a change history. It probably wasn't added via this admin site."
+msgstr "Acest obiect nu are un istoric al schimbărilor. Probabil nu a fost adăugat prinintermediul acestui sit de administrare."
+
+#: .\contrib\admin\templates\admin\pagination.html.py:10
+msgid "Show all"
+msgstr "Arata tot/toate"
+
+#: .\contrib\admin\templates\admin\search_form.html.py:8
+msgid "Go"
+msgstr "Start"
+
+#: .\contrib\admin\templates\admin\search_form.html.py:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "Un rezultat"
+msgstr[1] "%(counter)s rezultate"
+
+#: .\contrib\admin\templates\admin\search_form.html.py:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s total"
+
+#: .\contrib\admin\templates\admin\submit_line.html.py:4
+msgid "Save as new"
+msgstr "Salvati ca nou"
+
+#: .\contrib\admin\templates\admin\submit_line.html.py:5
+msgid "Save and add another"
+msgstr "Salvati si adaugati altul"
+
+#: .\contrib\admin\templates\admin\submit_line.html.py:6
+msgid "Save and continue editing"
+msgstr "Salvati si continuati"
+
+#: .\contrib\admin\templates\admin\submit_line.html.py:7
+msgid "Save"
+msgstr "Salveaza"
+
+#: .\contrib\admin\templates\admin\auth\user\add_form.html.py:6
+msgid "First, enter a username and password. Then, you'll be able to edit more user options."
+msgstr "Intai introduceti un nume de utilizator si o parola. Apoi veti putea modifica mai multe optiuni de utilizator."
+
+#: .\contrib\admin\templates\admin\auth\user\add_form.html.py:12
+msgid "Username"
+msgstr "Utilizator"
+
+#: .\contrib\admin\templates\admin\auth\user\add_form.html.py:18
+#: .\contrib\admin\templates\admin\auth\user\change_password.html.py:33
+msgid "Password"
+msgstr "Parola"
+
+#: .\contrib\admin\templates\admin\auth\user\add_form.html.py:23
+#: .\contrib\admin\templates\admin\auth\user\change_password.html.py:38
+msgid "Password (again)"
+msgstr "Parola (repeta)"
+
+#: .\contrib\admin\templates\admin\auth\user\add_form.html.py:24
+#: .\contrib\admin\templates\admin\auth\user\change_password.html.py:39
+msgid "Enter the same password as above, for verification."
+msgstr "Introduceti parola din nou pentru verificare."
+
+#: .\contrib\admin\templates\admin\auth\user\change_password.html.py:27
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Introduceti o parola noua pentru utilizatorul <strong>%(username)s</strong>."
+
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:3
+msgid "Bookmarklets"
+msgstr ""
+
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:4
+msgid "Documentation bookmarklets"
+msgstr ""
+
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:8
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:18
+msgid "Documentation for this page"
+msgstr "Documentatie pentru aceasta pagina"
+
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:19
+msgid "Jumps you from any page to the documentation for the view that generates that page."
+msgstr "Te trimite de la orice pagina la documentatia pentru view-ul care genereaza acea pagina."
+
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:21
+msgid "Show object ID"
+msgstr "Arata ID-ul obiectului"
+
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:22
+msgid "Shows the content-type and unique ID for pages that represent a single object."
+msgstr "Arata tipul de continut si ID-ul unic pentru paginile care reprezinta un singur obiect."
+
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:24
+msgid "Edit this object (current window)"
+msgstr "Modifica acest obiect (in aceasta fereastra)"
+
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:25
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "Sare la pagina de administrare pentru pagini care reprezinta un singur obiect."
+
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:27
+msgid "Edit this object (new window)"
+msgstr "Modifica acest obiect (intr-o fereastra noua)"
+
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:28
+msgid "As above, but opens the admin page in a new window."
+msgstr "La fel ca deasupra, dar deschide pagina de administrare intr-o fereastra noua"
+
+#: .\contrib\admin\templates\registration\logged_out.html.py:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Mulţumesc pentru petrecerea folositoare a timpului cu saitul astăzi."
+
+#: .\contrib\admin\templates\registration\logged_out.html.py:10
+msgid "Log in again"
+msgstr "Relogare"
+
+#: .\contrib\admin\templates\registration\password_change_done.html.py:3
+#: .\contrib\admin\templates\registration\password_change_form.html.py:3
+#: .\contrib\admin\templates\registration\password_change_form.html.py:5
+#: .\contrib\admin\templates\registration\password_change_form.html.py:9
+msgid "Password change"
+msgstr "Schimbă parola"
+
+#: .\contrib\admin\templates\registration\password_change_done.html.py:5
+#: .\contrib\admin\templates\registration\password_change_done.html.py:9
+msgid "Password change successful"
+msgstr "Schimbare reuşită a parolei"
+
+#: .\contrib\admin\templates\registration\password_change_done.html.py:11
+msgid "Your password was changed."
+msgstr "Parola a fost schimbată."
+
+#: .\contrib\admin\templates\registration\password_change_form.html.py:11
+msgid "Please enter your old password, for security's sake, and then enter your new password twice so we can verify you typed it in correctly."
+msgstr "Introdu te rog vechea parolă, pentru motive de siguranţă, şi apoi tastează noua parolă de două ori aşa încît putem verifica dacă ai tastat corect."
+
+#: .\contrib\admin\templates\registration\password_change_form.html.py:16
+msgid "Old password:"
+msgstr "Vechea parolă:"
+
+#: .\contrib\admin\templates\registration\password_change_form.html.py:18
+msgid "New password:"
+msgstr "Noua parolă:"
+
+#: .\contrib\admin\templates\registration\password_change_form.html.py:20
+msgid "Confirm password:"
+msgstr "Confirmă parola:"
+
+#: .\contrib\admin\templates\registration\password_change_form.html.py:22
+msgid "Change my password"
+msgstr "Schimbă-mi parola"
+
+#: .\contrib\admin\templates\registration\password_reset_done.html.py:4
+#: .\contrib\admin\templates\registration\password_reset_form.html.py:4
+#: .\contrib\admin\templates\registration\password_reset_form.html.py:6
+#: .\contrib\admin\templates\registration\password_reset_form.html.py:10
+msgid "Password reset"
+msgstr "Resetează parola"
+
+#: .\contrib\admin\templates\registration\password_reset_done.html.py:6
+#: .\contrib\admin\templates\registration\password_reset_done.html.py:10
+msgid "Password reset successful"
+msgstr "Parola resetată cu succes"
+
+#: .\contrib\admin\templates\registration\password_reset_done.html.py:12
+msgid "We've e-mailed a new password to the e-mail address you submitted. You should be receiving it shortly."
+msgstr "Am trimis o nouă parolă prin email la adresa furnizată. Ar trebuisă o primeşti în scurt timp."
+
+#: .\contrib\admin\templates\registration\password_reset_email.html.py:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Ai primit acest email pentru că ai cerut o resetare a parolei"
+
+#: .\contrib\admin\templates\registration\password_reset_email.html.py:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "pentru contul tău la %(site_name)s"
+
+#: .\contrib\admin\templates\registration\password_reset_email.html.py:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Noua ta parolă este: %(new_password)s"
+
+#: .\contrib\admin\templates\registration\password_reset_email.html.py:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Poţi schmiba această parolă vizitînd această pagină:"
+
+#: .\contrib\admin\templates\registration\password_reset_email.html.py:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Numele tău utilizator, în caz că ai uitat:"
+
+#: .\contrib\admin\templates\registration\password_reset_email.html.py:13
+msgid "Thanks for using our site!"
+msgstr "Mulţumesc pentru folosirea saitului nostru!"
+
+#: .\contrib\admin\templates\registration\password_reset_email.html.py:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Echipa %(site_name)s"
+
+#: .\contrib\admin\templates\registration\password_reset_form.html.py:12
+msgid "Forgotten your password? Enter your e-mail address below, and we'll reset your password and e-mail the new one to you."
+msgstr "Ai uitat parola? Introdu adresa de email mai jos, iar noi vom reseta parola şi-ţi vom trimite una nouă prin email."
+
+#: .\contrib\admin\templates\registration\password_reset_form.html.py:16
+msgid "E-mail address:"
+msgstr "Adresa email:"
+
+#: .\contrib\admin\templates\registration\password_reset_form.html.py:16
+msgid "Reset my password"
+msgstr "Resetează-mi parola"
+
+#: .\contrib\admin\templates\widget\date_time.html.py:3
+msgid "Date:"
+msgstr "Data:"
+
+#: .\contrib\admin\templates\widget\date_time.html.py:4
+msgid "Time:"
+msgstr "Ora:"
+
+#: .\contrib\admin\templates\widget\file.html.py:2
+msgid "Currently:"
+msgstr "Current:"
+
+#: .\contrib\admin\templates\widget\file.html.py:3
+msgid "Change:"
+msgstr "Schimbă:"
+
+#: .\contrib\admin\templatetags\admin_list.py:257
+msgid "All dates"
+msgstr "Toate datele"
+
+#: .\contrib\admin\views\auth.py:20
+#: .\contrib\admin\views\main.py:267
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" a fost inserat cu succes."
+
+#: .\contrib\admin\views\auth.py:25
+#: .\contrib\admin\views\main.py:271
+#: .\contrib\admin\views\main.py:356
+msgid "You may edit it again below."
+msgstr "Va puteti edita datele din nou mai jos."
+
+#: .\contrib\admin\views\auth.py:31
+msgid "Add user"
+msgstr "Adaugă utilizator"
+
+#: .\contrib\admin\views\auth.py:58
+msgid "Password changed successfully."
+msgstr "Schimbare reuşită a parolei"
+
+#: .\contrib\admin\views\auth.py:65
+#, python-format
+msgid "Change password: %s"
+msgstr "Schimbă parola: %s"
+
+#: .\contrib\admin\views\decorators.py:17
+#: .\contrib\auth\forms.py:60
+msgid "Please enter a correct username and password. Note that both fields are case-sensitive."
+msgstr "Va rugam sa introduceti username-ul si parola corecta. Aveti grija deoarececasutele sunt case sensitive."
+
+#: .\contrib\admin\views\decorators.py:69
+msgid "Please log in again, because your session has expired. Don't worry: Your submission has been saved."
+msgstr "Va rugam sa va inregistrati din nou, deoarece sesiunea a expirat. Nu va faceti griji datele au fost salvate."
+
+#: .\contrib\admin\views\decorators.py:76
+msgid "Looks like your browser isn't configured to accept cookies. Please enable cookies, reload this page, and try again."
+msgstr "Se pare ca browserul dumneavostra nu este configurat sa accepte cookies. Va rugam sa va setati browserul sa accepte cookies, dati un reload la pagina si incercati din nou."
+
+#: .\contrib\admin\views\decorators.py:90
+msgid "Usernames cannot contain the '@' character."
+msgstr "Username-ul nu are voie sa contina caracterul '@'."
+
+#: .\contrib\admin\views\decorators.py:92
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "Adresa ta de e-mail nu este numele tau de utilizator. Incearca '%s' in schimb."
+
+#: .\contrib\admin\views\doc.py:48
+#: .\contrib\admin\views\doc.py:50
+#: .\contrib\admin\views\doc.py:52
+msgid "tag:"
+msgstr "tag:"
+
+#: .\contrib\admin\views\doc.py:79
+#: .\contrib\admin\views\doc.py:81
+#: .\contrib\admin\views\doc.py:83
+msgid "filter:"
+msgstr "filtru:"
+
+#: .\contrib\admin\views\doc.py:137
+#: .\contrib\admin\views\doc.py:139
+#: .\contrib\admin\views\doc.py:141
+msgid "view:"
+msgstr "view:"
+
+#: .\contrib\admin\views\doc.py:166
+#, python-format
+msgid "App %r not found"
+msgstr "Applicatia %r inexistenta"
+
+#: .\contrib\admin\views\doc.py:173
+#, python-format
+msgid "Model %(name)r not found in app %(label)r"
+msgstr "Modelul %(name)r nu a fost gasit in aplicatia %(label)r"
+
+#: .\contrib\admin\views\doc.py:185
+#, python-format
+msgid "the related `%(label)s.%(type)s` object"
+msgstr "obiectul `%(label)s.%(type)s` asociat"
+
+#: .\contrib\admin\views\doc.py:185
+#: .\contrib\admin\views\doc.py:207
+#: .\contrib\admin\views\doc.py:221
+#: .\contrib\admin\views\doc.py:226
+msgid "model:"
+msgstr "model:"
+
+#: .\contrib\admin\views\doc.py:216
+#, python-format
+msgid "related `%(label)s.%(name)s` objects"
+msgstr "obiectele `%(label)s.%(name)s` asociate"
+
+#: .\contrib\admin\views\doc.py:221
+#, python-format
+msgid "all %s"
+msgstr "toate %s"
+
+#: .\contrib\admin\views\doc.py:226
+#, python-format
+msgid "number of %s"
+msgstr "numarul de %s"
+
+#: .\contrib\admin\views\doc.py:231
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Campuri in %s obiecte"
+
+#: .\contrib\admin\views\doc.py:293
+#: .\contrib\admin\views\doc.py:304
+#: .\contrib\admin\views\doc.py:306
+#: .\contrib\admin\views\doc.py:312
+#: .\contrib\admin\views\doc.py:313
+#: .\contrib\admin\views\doc.py:315
+msgid "Integer"
+msgstr "Intreg"
+
+#: .\contrib\admin\views\doc.py:294
+msgid "Boolean (Either True or False)"
+msgstr "Boolean (ori adevarat ori fals)"
+
+#: .\contrib\admin\views\doc.py:295
+#: .\contrib\admin\views\doc.py:314
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Sir de caractere (pana la %(max_length)s caractere)"
+
+#: .\contrib\admin\views\doc.py:296
+msgid "Comma-separated integers"
+msgstr "Numere intregi separate de virgule"
+
+#: .\contrib\admin\views\doc.py:297
+msgid "Date (without time)"
+msgstr "Data (fara ora)"
+
+#: .\contrib\admin\views\doc.py:298
+msgid "Date (with time)"
+msgstr "Data (cu ora)"
+
+#: .\contrib\admin\views\doc.py:299
+msgid "Decimal number"
+msgstr "Numar zecimal"
+
+#: .\contrib\admin\views\doc.py:300
+msgid "E-mail address"
+msgstr "Adresa email"
+
+#: .\contrib\admin\views\doc.py:301
+#: .\contrib\admin\views\doc.py:302
+#: .\contrib\admin\views\doc.py:305
+msgid "File path"
+msgstr "Calea fisierului"
+
+#: .\contrib\admin\views\doc.py:303
+msgid "Floating point number"
+msgstr "Numar cu virgula"
+
+#: .\contrib\admin\views\doc.py:307
+#: .\contrib\comments\models.py:89
+msgid "IP address"
+msgstr "adresa ip"
+
+#: .\contrib\admin\views\doc.py:309
+msgid "Boolean (Either True, False or None)"
+msgstr "Boolean (adevarat, fals sau nici una)"
+
+#: .\contrib\admin\views\doc.py:310
+msgid "Relation to parent model"
+msgstr "Relatia cu un model parinte"
+
+#: .\contrib\admin\views\doc.py:311
+msgid "Phone number"
+msgstr "Numar de telefon"
+
+#: .\contrib\admin\views\doc.py:316
+msgid "Text"
+msgstr "Text"
+
+#: .\contrib\admin\views\doc.py:317
+msgid "Time"
+msgstr "Timp"
+
+#: .\contrib\admin\views\doc.py:318
+#: .\contrib\flatpages\models.py:8
+msgid "URL"
+msgstr "URL"
+
+#: .\contrib\admin\views\doc.py:319
+msgid "U.S. state (two uppercase letters)"
+msgstr "Stat SUA (doua litere mari)"
+
+#: .\contrib\admin\views\doc.py:320
+msgid "XML text"
+msgstr "Text XML"
+
+#: .\contrib\admin\views\doc.py:346
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s nu pare a fi un obiect urlpattern"
+
+#: .\contrib\admin\views\main.py:233
+msgid "Site administration"
+msgstr "Administrare site"
+
+#: .\contrib\admin\views\main.py:280
+#: .\contrib\admin\views\main.py:365
+#, python-format
+msgid "You may add another %s below."
+msgstr "Mai puteti adauga un alt %s mai jos."
+
+#: .\contrib\admin\views\main.py:298
+#, python-format
+msgid "Add %s"
+msgstr "Adaugă %s"
+
+#: .\contrib\admin\views\main.py:344
+#, python-format
+msgid "Added %s."
+msgstr "Adaugat %s."
+
+#: .\contrib\admin\views\main.py:344
+#: .\contrib\admin\views\main.py:346
+#: .\contrib\admin\views\main.py:348
+#: .\core\validators.py:283
+#: .\db\models\manipulators.py:309
+msgid "and"
+msgstr "si"
+
+#: .\contrib\admin\views\main.py:346
+#, python-format
+msgid "Changed %s."
+msgstr "Schimbă %s."
+
+#: .\contrib\admin\views\main.py:348
+#, python-format
+msgid "Deleted %s."
+msgstr "Am sters %s."
+
+#: .\contrib\admin\views\main.py:351
+msgid "No fields changed."
+msgstr "Nu s-a facut nicio schimbare."
+
+#: .\contrib\admin\views\main.py:354
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" au fost modificate cu succes."
+
+#: .\contrib\admin\views\main.py:362
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" au fost adaugate cu succes. Le puteti edita mai jos."
+
+#: .\contrib\admin\views\main.py:400
+#, python-format
+msgid "Change %s"
+msgstr "Schimbă %s"
+
+#: .\contrib\admin\views\main.py:487
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Unul sau mai multe %(fieldname)s in %(name)s: %(obj)s"
+
+#: .\contrib\admin\views\main.py:492
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Unul sau mai multe %(fieldname)s in %(name)s:"
+
+#: .\contrib\admin\views\main.py:524
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" au fost sterse cu succes."
+
+#: .\contrib\admin\views\main.py:527
+msgid "Are you sure?"
+msgstr "Sunteti sigur?"
+
+#: .\contrib\admin\views\main.py:549
+#, python-format
+msgid "Change history: %s"
+msgstr "Schimbari facute: %s"
+
+#: .\contrib\admin\views\main.py:583
+#, python-format
+msgid "Select %s"
+msgstr "Selecteaza %s"
+
+#: .\contrib\admin\views\main.py:583
+#, python-format
+msgid "Select %s to change"
+msgstr "Selecteaza %s pentru schimbare"
+
+#: .\contrib\admin\views\main.py:784
+msgid "Database error"
+msgstr "Erroare de baza de date"
+
+#: .\contrib\auth\forms.py:17
+#: .\contrib\auth\forms.py:138
+msgid "The two password fields didn't match."
+msgstr "Cele doua campuri pentru parole nu au coincis."
+
+#: .\contrib\auth\forms.py:25
+msgid "A user with that username already exists."
+msgstr "Un utilizator cu acest nume de utilizator exista deja,"
+
+#: .\contrib\auth\forms.py:53
+msgid "Your Web browser doesn't appear to have cookies enabled. Cookies are required for logging in."
+msgstr "Se pare ca browserul dumneavoastra nu suporta cookies. Aveti nevoie de un browser care suporta cookies ca sa va logati."
+
+#: .\contrib\auth\forms.py:62
+msgid "This account is inactive."
+msgstr "Acest cont este inactiv."
+
+#: .\contrib\auth\forms.py:84
+msgid "That e-mail address doesn't have an associated user account. Are you sure you've registered?"
+msgstr "Acea adresa de e-mail nu are un nume de utilizator asociat. Sunteti sigur ca v-ati inregistrat?"
+
+#: .\contrib\auth\forms.py:107
+#, python-format
+msgid "Password reset on %s"
+msgstr "Parola resetata pe %s"
+
+#: .\contrib\auth\forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "Cele doua campuri 'parola noua' nu au coincis."
+
+#: .\contrib\auth\forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Parola veche a dumneavoastra a fost introdusa incorect. Va rugam introduceti-o din nou."
+
+#: .\contrib\auth\models.py:73
+#: .\contrib\auth\models.py:93
+msgid "name"
+msgstr "nume"
+
+#: .\contrib\auth\models.py:75
+msgid "codename"
+msgstr "nume cod"
+
+#: .\contrib\auth\models.py:78
+msgid "permission"
+msgstr "permisiune"
+
+#: .\contrib\auth\models.py:79
+#: .\contrib\auth\models.py:94
+msgid "permissions"
+msgstr "permisiuni"
+
+#: .\contrib\auth\models.py:97
+msgid "group"
+msgstr "grup"
+
+#: .\contrib\auth\models.py:98
+#: .\contrib\auth\models.py:141
+msgid "groups"
+msgstr "grupuri"
+
+#: .\contrib\auth\models.py:131
+msgid "username"
+msgstr "nume utilizator"
+
+#: .\contrib\auth\models.py:131
+msgid "Required. 30 characters or fewer. Alphanumeric characters only (letters, digits and underscores)."
+msgstr "Necesar. 30 de caractere sau mai putin. Doar caractere alfanumerice (litere, cifre, liniute de subliniere)."
+
+#: .\contrib\auth\models.py:132
+msgid "first name"
+msgstr "Prenume"
+
+#: .\contrib\auth\models.py:133
+msgid "last name"
+msgstr "Nume"
+
+#: .\contrib\auth\models.py:134
+msgid "e-mail address"
+msgstr "adresa email"
+
+#: .\contrib\auth\models.py:135
+msgid "password"
+msgstr "parola"
+
+#: .\contrib\auth\models.py:135
+msgid "Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change password form</a>."
+msgstr "Folositi '[algo]$[salt]$[hexdigest]' sau folositi <a href=\"password/\">formularul de schimbare a parolei</a>."
+
+#: .\contrib\auth\models.py:136
+msgid "staff status"
+msgstr "stare staff"
+
+#: .\contrib\auth\models.py:136
+msgid "Designates whether the user can log into this admin site."
+msgstr "Decide cînd utilizatorul se poate loga în acest sit de adminstrare."
+
+#: .\contrib\auth\models.py:137
+msgid "active"
+msgstr "activ"
+
+#: .\contrib\auth\models.py:137
+msgid "Designates whether this user should be treated as active. Unselect this instead of deleting accounts."
+msgstr "Indica daca acest user va fi tratat ca activ sau nu. Deselecteaza-l in loc de a sterge conturi."
+
+#: .\contrib\auth\models.py:138
+msgid "superuser status"
+msgstr "stare superutilizator"
+
+#: .\contrib\auth\models.py:138
+msgid "Designates that this user has all permissions without explicitly assigning them."
+msgstr "Indica daca acest user are toate permisiile fara a le selecta explicit."
+
+#: .\contrib\auth\models.py:139
+msgid "last login"
+msgstr "ultima logare"
+
+#: .\contrib\auth\models.py:140
+msgid "date joined"
+msgstr "data aderării"
+
+#: .\contrib\auth\models.py:142
+msgid "In addition to the permissions manually assigned, this user will also get all permissions granted to each group he/she is in."
+msgstr "Suplimentar permisiunilor manual alocate, acest utilizator va primi toate permisiunile alocate fiecărui grup din care el/ea face parte."
+
+#: .\contrib\auth\models.py:143
+msgid "user permissions"
+msgstr "permisiuni utilizator"
+
+#: .\contrib\auth\models.py:147
+msgid "user"
+msgstr "utilizator"
+
+#: .\contrib\auth\models.py:148
+msgid "users"
+msgstr "utilizatori"
+
+#: .\contrib\auth\models.py:154
+msgid "Personal info"
+msgstr "Informaţii personale"
+
+#: .\contrib\auth\models.py:155
+msgid "Permissions"
+msgstr "Permisiuni"
+
+#: .\contrib\auth\models.py:156
+msgid "Important dates"
+msgstr "Date importante"
+
+#: .\contrib\auth\models.py:157
+msgid "Groups"
+msgstr "Grupuri"
+
+#: .\contrib\auth\models.py:316
+msgid "message"
+msgstr "mesaj"
+
+#: .\contrib\auth\views.py:47
+msgid "Logged out"
+msgstr "Deautentificat"
+
+#: .\contrib\comments\models.py:71
+#: .\contrib\comments\models.py:176
+msgid "object ID"
+msgstr "id obiect"
+
+#: .\contrib\comments\models.py:72
+msgid "headline"
+msgstr "titlu"
+
+#: .\contrib\comments\models.py:73
+#: .\contrib\comments\models.py:95
+#: .\contrib\comments\models.py:177
+msgid "comment"
+msgstr "comentariu"
+
+#: .\contrib\comments\models.py:74
+msgid "rating #1"
+msgstr "rating #1"
+
+#: .\contrib\comments\models.py:75
+msgid "rating #2"
+msgstr "rating #2"
+
+#: .\contrib\comments\models.py:76
+msgid "rating #3"
+msgstr "rating #3"
+
+#: .\contrib\comments\models.py:77
+msgid "rating #4"
+msgstr "rating #4"
+
+#: .\contrib\comments\models.py:78
+msgid "rating #5"
+msgstr "rating #5"
+
+#: .\contrib\comments\models.py:79
+msgid "rating #6"
+msgstr "rating #6"
+
+#: .\contrib\comments\models.py:80
+msgid "rating #7"
+msgstr "rating #7"
+
+#: .\contrib\comments\models.py:81
+msgid "rating #8"
+msgstr "rating #8"
+
+#: .\contrib\comments\models.py:86
+msgid "is valid rating"
+msgstr "este rating valid"
+
+#: .\contrib\comments\models.py:87
+#: .\contrib\comments\models.py:179
+msgid "date/time submitted"
+msgstr "data/ora crearii"
+
+#: .\contrib\comments\models.py:88
+#: .\contrib\comments\models.py:180
+msgid "is public"
+msgstr "public"
+
+#: .\contrib\comments\models.py:90
+msgid "is removed"
+msgstr "sters"
+
+#: .\contrib\comments\models.py:90
+msgid "Check this box if the comment is inappropriate. A \"This comment has been removed\" message will be displayed instead."
+msgstr "Bifeaza aceasta casuta daca comentariul nu este adecvat. Un mesaj de tipul \"Acest comentariu a fost sters\" va fi afisat in schimb."
+
+#: .\contrib\comments\models.py:96
+msgid "comments"
+msgstr "comentarii"
+
+#: .\contrib\comments\models.py:140
+#: .\contrib\comments\models.py:222
+msgid "Content object"
+msgstr "Obiect-referinta"
+
+#: .\contrib\comments\models.py:168
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Postat de %(user)s la %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: .\contrib\comments\models.py:178
+msgid "person's name"
+msgstr "numele persoanei"
+
+#: .\contrib\comments\models.py:181
+msgid "ip address"
+msgstr "adresa ip"
+
+#: .\contrib\comments\models.py:183
+msgid "approved by staff"
+msgstr "aprobat de echipa"
+
+#: .\contrib\comments\models.py:187
+msgid "free comment"
+msgstr "permite comentariu fara inregistrare"
+
+#: .\contrib\comments\models.py:188
+msgid "free comments"
+msgstr "permite comentarii fara inregistrare"
+
+#: .\contrib\comments\models.py:250
+msgid "score"
+msgstr "punctaj"
+
+#: .\contrib\comments\models.py:251
+msgid "score date"
+msgstr "data punctajului"
+
+#: .\contrib\comments\models.py:255
+#, fuzzy
+msgid "karma score"
+msgstr "punctaj karmic"
+
+#: .\contrib\comments\models.py:256
+#, fuzzy
+msgid "karma scores"
+msgstr "punctaje karmice"
+
+#: .\contrib\comments\models.py:260
+#, fuzzy, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "Punctaj %(score)d atribuit de catre %(user)s"
+
+#: .\contrib\comments\models.py:277
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Acest comentariu a fost marcat de %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: .\contrib\comments\models.py:285
+msgid "flag date"
+msgstr "data marcarii"
+
+#: .\contrib\comments\models.py:289
+#, fuzzy
+msgid "user flag"
+msgstr "stegulet de utilizator"
+
+#: .\contrib\comments\models.py:290
+#, fuzzy
+msgid "user flags"
+msgstr "stegulete de utilizatori"
+
+#: .\contrib\comments\models.py:294
+#, python-format
+msgid "Flag by %r"
+msgstr "Marcajul lui %r"
+
+#: .\contrib\comments\models.py:300
+msgid "deletion date"
+msgstr "data stergerii"
+
+#: .\contrib\comments\models.py:303
+msgid "moderator deletion"
+msgstr "sters de moderator"
+
+#: .\contrib\comments\models.py:304
+msgid "moderator deletions"
+msgstr "sterse de moderator"
+
+#: .\contrib\comments\models.py:308
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Sters de moderatorul %r"
+
+#: .\contrib\comments\templates\comments\form.html.py:8
+msgid "Forgotten your password?"
+msgstr "Ai uitat parola?"
+
+#: .\contrib\comments\templates\comments\form.html.py:12
+msgid "Ratings"
+msgstr "Ratinguri"
+
+#: .\contrib\comments\templates\comments\form.html.py:12
+#: .\contrib\comments\templates\comments\form.html.py:23
+msgid "Required"
+msgstr "Necesar"
+
+#: .\contrib\comments\templates\comments\form.html.py:12
+#: .\contrib\comments\templates\comments\form.html.py:23
+msgid "Optional"
+msgstr "Optional"
+
+#: .\contrib\comments\templates\comments\form.html.py:23
+msgid "Post a photo"
+msgstr "Adauga o poza"
+
+#: .\contrib\comments\templates\comments\form.html.py:28
+#: .\contrib\comments\templates\comments\freeform.html.py:5
+msgid "Comment:"
+msgstr "Comentariu:"
+
+#: .\contrib\comments\templates\comments\form.html.py:35
+#: .\contrib\comments\templates\comments\freeform.html.py:10
+msgid "Preview comment"
+msgstr "Previzualizare comentariu"
+
+#: .\contrib\comments\templates\comments\freeform.html.py:4
+msgid "Your name:"
+msgstr "numele dumneavoastra"
+
+#: .\contrib\comments\views\comments.py:28
+msgid "This rating is required because you've entered at least one other rating."
+msgstr "Acest rating este necesar deoarece ai introdus cel putin un alt rating."
+
+#: .\contrib\comments\views\comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Acest comentariu a fost postat de un utilizator care a postat mai putin de %(count)s comentariu:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Acest comentariu a fost postat de un utilizator care a postat mai putin de %(count)s comentarii:\n"
+"\n"
+"%(text)s"
+
+#: .\contrib\comments\views\comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Acest comentariu a fost postat de un utilizator neordonat:\n"
+"\n"
+"%(text)s"
+
+#: .\contrib\comments\views\comments.py:190
+#: .\contrib\comments\views\comments.py:283
+msgid "Only POSTs are allowed"
+msgstr "Doar postarile sunt permise"
+
+#: .\contrib\comments\views\comments.py:194
+#: .\contrib\comments\views\comments.py:287
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Unul sau mai multe campuri necesare nu a fost completat"
+
+#: .\contrib\comments\views\comments.py:198
+#: .\contrib\comments\views\comments.py:289
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Cineva a modificat formularul de comentarii (incalcare a securitatii)"
+
+#: .\contrib\comments\views\comments.py:208
+#: .\contrib\comments\views\comments.py:295
+msgid "The comment form had an invalid 'target' parameter -- the object ID was invalid"
+msgstr "Formularul de comentariu a avut un parametru 'tinta' invalid -- ID-ul obiectului a fost invalid"
+
+#: .\contrib\comments\views\comments.py:259
+#: .\contrib\comments\views\comments.py:324
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "Formularul de comentariu nu specifica nici 'previzualizare' nici 'postare'"
+
+#: .\contrib\comments\views\karma.py:21
+msgid "Anonymous users cannot vote"
+msgstr "Utilizatorii anonimi nu pot vota"
+
+#: .\contrib\comments\views\karma.py:25
+msgid "Invalid comment ID"
+msgstr "Comentariu cu ID invalid"
+
+#: .\contrib\comments\views\karma.py:27
+msgid "No voting for yourself"
+msgstr "Nu poti vota pentru tine"
+
+#: .\contrib\contenttypes\models.py:67
+#, fuzzy
+msgid "python model class name"
+msgstr "nume clasa model python"
+
+#: .\contrib\contenttypes\models.py:71
+msgid "content type"
+msgstr "tip conţinut"
+
+#: .\contrib\contenttypes\models.py:72
+msgid "content types"
+msgstr "tipuri conţinute"
+
+#: .\contrib\flatpages\models.py:9
+msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr "Exemplu: '/about/contact'. Asiguraţi-vă că aveţi slash-uri la început şi la sfîrşit."
+
+#: .\contrib\flatpages\models.py:10
+msgid "title"
+msgstr "titlu"
+
+#: .\contrib\flatpages\models.py:11
+msgid "content"
+msgstr "conţinut"
+
+#: .\contrib\flatpages\models.py:12
+msgid "enable comments"
+msgstr "permite comentarii"
+
+#: .\contrib\flatpages\models.py:13
+msgid "template name"
+msgstr "nume şablon"
+
+#: .\contrib\flatpages\models.py:14
+msgid "Example: 'flatpages/contact_page.html'. If this isn't provided, the system will use 'flatpages/default.html'."
+msgstr "Exemplu: 'flatpages/contact_page.html'. Dacă aceasta nu există, sistemul va folosi 'flatpages/default.html'."
+
+#: .\contrib\flatpages\models.py:15
+msgid "registration required"
+msgstr "necesită înregistrare"
+
+#: .\contrib\flatpages\models.py:15
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Dacă aceasta este bifată, numai utilizatorii logaţi vor putea vedea pagina."
+
+#: .\contrib\flatpages\models.py:20
+msgid "flat page"
+msgstr "pagina plată"
+
+#: .\contrib\flatpages\models.py:21
+msgid "flat pages"
+msgstr "pagini plate"
+
+#: .\contrib\flatpages\models.py:27
+msgid "Advanced options"
+msgstr "Optiuni avansate"
+
+#: .\contrib\humanize\templatetags\humanize.py:19
+msgid "th"
+msgstr "ul"
+
+#: .\contrib\humanize\templatetags\humanize.py:19
+msgid "st"
+msgstr "ul"
+
+#: .\contrib\humanize\templatetags\humanize.py:19
+msgid "nd"
+msgstr "lea"
+
+#: .\contrib\humanize\templatetags\humanize.py:19
+msgid "rd"
+msgstr "lea"
+
+#: .\contrib\humanize\templatetags\humanize.py:51
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f milion"
+msgstr[1] "%(value).1f milioane"
+
+#: .\contrib\humanize\templatetags\humanize.py:54
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f miliard"
+msgstr[1] "%(value).1f miliarde"
+
+#: .\contrib\humanize\templatetags\humanize.py:57
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f mie de miliarde"
+msgstr[1] "%(value).1f mii de miliarde"
+
+#: .\contrib\humanize\templatetags\humanize.py:73
+msgid "one"
+msgstr "unu"
+
+#: .\contrib\humanize\templatetags\humanize.py:73
+msgid "two"
+msgstr "doi"
+
+#: .\contrib\humanize\templatetags\humanize.py:73
+msgid "three"
+msgstr "trei"
+
+#: .\contrib\humanize\templatetags\humanize.py:73
+msgid "four"
+msgstr "patry"
+
+#: .\contrib\humanize\templatetags\humanize.py:73
+msgid "five"
+msgstr "cinci"
+
+#: .\contrib\humanize\templatetags\humanize.py:73
+msgid "six"
+msgstr "sase"
+
+#: .\contrib\humanize\templatetags\humanize.py:73
+msgid "seven"
+msgstr "sapte"
+
+#: .\contrib\humanize\templatetags\humanize.py:73
+msgid "eight"
+msgstr "opt"
+
+#: .\contrib\humanize\templatetags\humanize.py:73
+msgid "nine"
+msgstr "noua"
+
+#: .\contrib\humanize\templatetags\humanize.py:93
+msgid "today"
+msgstr "astazi"
+
+#: .\contrib\humanize\templatetags\humanize.py:95
+msgid "tomorrow"
+msgstr "maine"
+
+#: .\contrib\humanize\templatetags\humanize.py:97
+msgid "yesterday"
+msgstr "ieri"
+
+#: .\contrib\localflavor\ar\forms.py:27
+msgid "Enter a postal code in the format NNNN or ANNNNAAA."
+msgstr "Introduceti un cod postal valid de forma NNNN sau ANNNNAAA."
+
+#: .\contrib\localflavor\ar\forms.py:49
+#: .\contrib\localflavor\br\forms.py:96
+#: .\contrib\localflavor\br\forms.py:135
+#: .\contrib\localflavor\pe\forms.py:23
+#: .\contrib\localflavor\pe\forms.py:51
+msgid "This field requires only numbers."
+msgstr "Acest camp accepta doar numere."
+
+#: .\contrib\localflavor\ar\forms.py:50
+msgid "This field requires 7 or 8 digits."
+msgstr "Acest camp are nevoie de 7 sau 8 cifre."
+
+#: .\contrib\localflavor\ar\forms.py:79
+msgid "Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format."
+msgstr "Introduceti un CUIT valid de forma XX-XXXXXXXX-X sau XXXXXXXXXXXX."
+
+#: .\contrib\localflavor\ar\forms.py:80
+msgid "Invalid CUIT."
+msgstr "CUIT invalid."
+
+#: .\contrib\localflavor\au\forms.py:16
+msgid "Enter a 4 digit post code."
+msgstr "Introduceti un cod postal de 4 cifre."
+
+#: .\contrib\localflavor\br\forms.py:21
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Adaugati un cod postal de forma XXXXX-XXX."
+
+#: .\contrib\localflavor\br\forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "Numerele de telefon trebuie să fie in format XXX-XXX-XXXX."
+
+#: .\contrib\localflavor\br\forms.py:58
+msgid "Select a valid brazilian state. That state is not one of the available states."
+msgstr "Selectati un stat brazilian valid. Acest stat nu se afla printre statele disponibile."
+
+#: .\contrib\localflavor\br\forms.py:94
+msgid "Invalid CPF number."
+msgstr "Numar CPF invalid."
+
+#: .\contrib\localflavor\br\forms.py:95
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr "Acest camp are nevoie de cel mult 11 cifre sau 14 caractere."
+
+#: .\contrib\localflavor\br\forms.py:134
+msgid "Invalid CNPJ number."
+msgstr "Numar CNPJ invalid."
+
+#: .\contrib\localflavor\br\forms.py:136
+msgid "This field requires at least 14 digits"
+msgstr "Acest camd are nevoie de cel putin 14 cifre."
+
+#: .\contrib\localflavor\ca\forms.py:17
+msgid "Enter a postal code in the format XXX XXX."
+msgstr "Introduceti un cod postal de forma XXX XXX."
+
+#: .\contrib\localflavor\ca\forms.py:88
+msgid "Enter a valid Canadian Social Insurance number in XXX-XXX-XXX format."
+msgstr "Introduceti un numar canadia de asigurare sociala valid de forma XXX-XXX-XXX."
+
+#: .\contrib\localflavor\ch\ch_states.py:5
+msgid "Aargau"
+msgstr "Aargau"
+
+#: .\contrib\localflavor\ch\ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr "Appenzell Innerrhoden"
+
+#: .\contrib\localflavor\ch\ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr "Appenzell Ausserrhoden"
+
+#: .\contrib\localflavor\ch\ch_states.py:8
+msgid "Basel-Stadt"
+msgstr "Basel-Stadt"
+
+#: .\contrib\localflavor\ch\ch_states.py:9
+msgid "Basel-Land"
+msgstr "Basel-Land"
+
+#: .\contrib\localflavor\ch\ch_states.py:10
+msgid "Berne"
+msgstr "Berna"
+
+#: .\contrib\localflavor\ch\ch_states.py:11
+msgid "Fribourg"
+msgstr "Fribourg"
+
+#: .\contrib\localflavor\ch\ch_states.py:12
+msgid "Geneva"
+msgstr "Geneva"
+
+#: .\contrib\localflavor\ch\ch_states.py:13
+msgid "Glarus"
+msgstr "Glarus"
+
+#: .\contrib\localflavor\ch\ch_states.py:14
+msgid "Graubuenden"
+msgstr "Graubuenden"
+
+#: .\contrib\localflavor\ch\ch_states.py:15
+msgid "Jura"
+msgstr "Jura"
+
+#: .\contrib\localflavor\ch\ch_states.py:16
+msgid "Lucerne"
+msgstr "Lucerna"
+
+#: .\contrib\localflavor\ch\ch_states.py:17
+msgid "Neuchatel"
+msgstr "Neuchatel"
+
+#: .\contrib\localflavor\ch\ch_states.py:18
+msgid "Nidwalden"
+msgstr "Nidwalden"
+
+#: .\contrib\localflavor\ch\ch_states.py:19
+msgid "Obwalden"
+msgstr "Obwalden"
+
+#: .\contrib\localflavor\ch\ch_states.py:20
+msgid "Schaffhausen"
+msgstr "Schaffhausen"
+
+#: .\contrib\localflavor\ch\ch_states.py:21
+msgid "Schwyz"
+msgstr "Schwyz"
+
+#: .\contrib\localflavor\ch\ch_states.py:22
+msgid "Solothurn"
+msgstr "Solothurn"
+
+#: .\contrib\localflavor\ch\ch_states.py:23
+msgid "St. Gallen"
+msgstr "St. Gallen"
+
+#: .\contrib\localflavor\ch\ch_states.py:24
+msgid "Thurgau"
+msgstr "JoiTurgovia"
+
+#: .\contrib\localflavor\ch\ch_states.py:25
+msgid "Ticino"
+msgstr "Ticino"
+
+#: .\contrib\localflavor\ch\ch_states.py:26
+msgid "Uri"
+msgstr "Uri"
+
+#: .\contrib\localflavor\ch\ch_states.py:27
+msgid "Valais"
+msgstr "Valais"
+
+#: .\contrib\localflavor\ch\ch_states.py:28
+msgid "Vaud"
+msgstr "Vaud"
+
+#: .\contrib\localflavor\ch\ch_states.py:29
+msgid "Zug"
+msgstr "Zug"
+
+#: .\contrib\localflavor\ch\ch_states.py:30
+msgid "Zurich"
+msgstr "Zurich"
+
+#: .\contrib\localflavor\ch\forms.py:16
+#: .\contrib\localflavor\no\forms.py:12
+msgid "Enter a zip code in the format XXXX."
+msgstr "Introduceti un cod postal de forma XXXX."
+
+#: .\contrib\localflavor\ch\forms.py:64
+msgid "Enter a valid Swiss identity or passport card number in X1234567<0 or 1234567890 format."
+msgstr "Introduceti un numar elvetian de identitate sau pasaport, valid, de forma X1234567<0 sau 1234567890."
+
+#: .\contrib\localflavor\cl\forms.py:29
+msgid "Enter a valid Chilean RUT."
+msgstr "Introduceti RUT chilian valid."
+
+#: .\contrib\localflavor\cl\forms.py:30
+msgid "Enter a valid Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr "Introduceti un RUT chilian valid. Formatul este XX.XXX.XXX-X."
+
+#: .\contrib\localflavor\cl\forms.py:31
+msgid "The Chilean RUT is not valid."
+msgstr "RUT-ul chilean nu este valid."
+
+#: .\contrib\localflavor\de\de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr "Baden-Wuerttemberg"
+
+#: .\contrib\localflavor\de\de_states.py:6
+msgid "Bavaria"
+msgstr "Bavaria"
+
+#: .\contrib\localflavor\de\de_states.py:7
+msgid "Berlin"
+msgstr "Berlin"
+
+#: .\contrib\localflavor\de\de_states.py:8
+msgid "Brandenburg"
+msgstr "Brandenburg"
+
+#: .\contrib\localflavor\de\de_states.py:9
+msgid "Bremen"
+msgstr "Bremen"
+
+#: .\contrib\localflavor\de\de_states.py:10
+msgid "Hamburg"
+msgstr "Hamburg"
+
+#: .\contrib\localflavor\de\de_states.py:11
+msgid "Hessen"
+msgstr "Hessa"
+
+#: .\contrib\localflavor\de\de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr "Mecklenburg-Pomerania Inferioara"
+
+#: .\contrib\localflavor\de\de_states.py:13
+msgid "Lower Saxony"
+msgstr "Saxonia Inferioara"
+
+#: .\contrib\localflavor\de\de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr "Renania de Nord-Westfalia"
+
+#: .\contrib\localflavor\de\de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr "Renanina-Palatinat"
+
+#: .\contrib\localflavor\de\de_states.py:16
+msgid "Saarland"
+msgstr "Saarland"
+
+#: .\contrib\localflavor\de\de_states.py:17
+msgid "Saxony"
+msgstr "Saxonia"
+
+#: .\contrib\localflavor\de\de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr "Saxonia-Anhalt"
+
+#: .\contrib\localflavor\de\de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr "Schleswig-Holstein"
+
+#: .\contrib\localflavor\de\de_states.py:20
+msgid "Thuringia"
+msgstr "Turingia"
+
+#: .\contrib\localflavor\de\forms.py:14
+#: .\contrib\localflavor\fi\forms.py:12
+#: .\contrib\localflavor\fr\forms.py:15
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Introduceti un cod postal de forma XXXXX."
+
+#: .\contrib\localflavor\de\forms.py:41
+msgid "Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X format."
+msgstr "Introduceti un numar german de identitate valid, de forma XXXXXXXXXXX-XXXXXXX-XXXXXXX-X."
+
+#: .\contrib\localflavor\es\es_provinces.py:5
+msgid "Arava"
+msgstr "Arava"
+
+#: .\contrib\localflavor\es\es_provinces.py:6
+msgid "Albacete"
+msgstr "Albacete"
+
+#: .\contrib\localflavor\es\es_provinces.py:7
+msgid "Alacant"
+msgstr "Alacant"
+
+#: .\contrib\localflavor\es\es_provinces.py:8
+msgid "Almeria"
+msgstr "Almeria"
+
+#: .\contrib\localflavor\es\es_provinces.py:9
+msgid "Avila"
+msgstr "Avila"
+
+#: .\contrib\localflavor\es\es_provinces.py:10
+msgid "Badajoz"
+msgstr "Badajoz"
+
+#: .\contrib\localflavor\es\es_provinces.py:11
+msgid "Illes Balears"
+msgstr "Insulele Baleare"
+
+#: .\contrib\localflavor\es\es_provinces.py:12
+msgid "Barcelona"
+msgstr "Barcelona"
+
+#: .\contrib\localflavor\es\es_provinces.py:13
+msgid "Burgos"
+msgstr "Burgos"
+
+#: .\contrib\localflavor\es\es_provinces.py:14
+msgid "Caceres"
+msgstr "Caceres"
+
+#: .\contrib\localflavor\es\es_provinces.py:15
+msgid "Cadiz"
+msgstr "Cadiz"
+
+#: .\contrib\localflavor\es\es_provinces.py:16
+msgid "Castello"
+msgstr "Castello"
+
+#: .\contrib\localflavor\es\es_provinces.py:17
+msgid "Ciudad Real"
+msgstr "Ciudad Real"
+
+#: .\contrib\localflavor\es\es_provinces.py:18
+msgid "Cordoba"
+msgstr "Cordoba"
+
+#: .\contrib\localflavor\es\es_provinces.py:19
+msgid "A Coruna"
+msgstr "A Coruna"
+
+#: .\contrib\localflavor\es\es_provinces.py:20
+msgid "Cuenca"
+msgstr "Cuenca"
+
+#: .\contrib\localflavor\es\es_provinces.py:21
+msgid "Girona"
+msgstr "Girona"
+
+#: .\contrib\localflavor\es\es_provinces.py:22
+msgid "Granada"
+msgstr "Granada"
+
+#: .\contrib\localflavor\es\es_provinces.py:23
+msgid "Guadalajara"
+msgstr "Guadalajara"
+
+#: .\contrib\localflavor\es\es_provinces.py:24
+msgid "Guipuzkoa"
+msgstr "Guipuzkoa"
+
+#: .\contrib\localflavor\es\es_provinces.py:25
+msgid "Huelva"
+msgstr "Huelva"
+
+#: .\contrib\localflavor\es\es_provinces.py:26
+msgid "Huesca"
+msgstr "Huesca"
+
+#: .\contrib\localflavor\es\es_provinces.py:27
+msgid "Jaen"
+msgstr "Jaen"
+
+#: .\contrib\localflavor\es\es_provinces.py:28
+msgid "Leon"
+msgstr "Leon"
+
+#: .\contrib\localflavor\es\es_provinces.py:29
+msgid "Lleida"
+msgstr "Lleida"
+
+#: .\contrib\localflavor\es\es_provinces.py:30
+#: .\contrib\localflavor\es\es_regions.py:17
+msgid "La Rioja"
+msgstr "La Rioja"
+
+#: .\contrib\localflavor\es\es_provinces.py:31
+msgid "Lugo"
+msgstr "Lugo"
+
+#: .\contrib\localflavor\es\es_provinces.py:32
+#: .\contrib\localflavor\es\es_regions.py:18
+msgid "Madrid"
+msgstr "Madrid"
+
+#: .\contrib\localflavor\es\es_provinces.py:33
+msgid "Malaga"
+msgstr "Malaga"
+
+#: .\contrib\localflavor\es\es_provinces.py:34
+msgid "Murcia"
+msgstr "Murcia"
+
+#: .\contrib\localflavor\es\es_provinces.py:35
+msgid "Navarre"
+msgstr "Navarra"
+
+#: .\contrib\localflavor\es\es_provinces.py:36
+msgid "Ourense"
+msgstr "Ourense"
+
+#: .\contrib\localflavor\es\es_provinces.py:37
+msgid "Asturias"
+msgstr "Asturias"
+
+#: .\contrib\localflavor\es\es_provinces.py:38
+msgid "Palencia"
+msgstr "Palencia"
+
+#: .\contrib\localflavor\es\es_provinces.py:39
+msgid "Las Palmas"
+msgstr "Las Palmas"
+
+#: .\contrib\localflavor\es\es_provinces.py:40
+msgid "Pontevedra"
+msgstr "Pontevedra"
+
+#: .\contrib\localflavor\es\es_provinces.py:41
+msgid "Salamanca"
+msgstr "Salamanca"
+
+#: .\contrib\localflavor\es\es_provinces.py:42
+msgid "Santa Cruz de Tenerife"
+msgstr "Santa Cruz de Tenerife"
+
+#: .\contrib\localflavor\es\es_provinces.py:43
+#: .\contrib\localflavor\es\es_regions.py:11
+msgid "Cantabria"
+msgstr "Cantabria"
+
+#: .\contrib\localflavor\es\es_provinces.py:44
+msgid "Segovia"
+msgstr "Segovia"
+
+#: .\contrib\localflavor\es\es_provinces.py:45
+msgid "Seville"
+msgstr "Sevilia"
+
+#: .\contrib\localflavor\es\es_provinces.py:46
+msgid "Soria"
+msgstr "Soria"
+
+#: .\contrib\localflavor\es\es_provinces.py:47
+msgid "Tarragona"
+msgstr "Tarragona"
+
+#: .\contrib\localflavor\es\es_provinces.py:48
+msgid "Teruel"
+msgstr "Teruel"
+
+#: .\contrib\localflavor\es\es_provinces.py:49
+msgid "Toledo"
+msgstr "Toledo"
+
+#: .\contrib\localflavor\es\es_provinces.py:50
+msgid "Valencia"
+msgstr "Valencia"
+
+#: .\contrib\localflavor\es\es_provinces.py:51
+msgid "Valladolid"
+msgstr "Valladolid"
+
+#: .\contrib\localflavor\es\es_provinces.py:52
+msgid "Bizkaia"
+msgstr "Bizkaia"
+
+#: .\contrib\localflavor\es\es_provinces.py:53
+msgid "Zamora"
+msgstr "Zamora"
+
+#: .\contrib\localflavor\es\es_provinces.py:54
+msgid "Zaragoza"
+msgstr "Zaragoza"
+
+#: .\contrib\localflavor\es\es_provinces.py:55
+msgid "Ceuta"
+msgstr "Ceuta"
+
+#: .\contrib\localflavor\es\es_provinces.py:56
+msgid "Melilla"
+msgstr "Melilla"
+
+#: .\contrib\localflavor\es\es_regions.py:5
+msgid "Andalusia"
+msgstr "Andalusia"
+
+#: .\contrib\localflavor\es\es_regions.py:6
+msgid "Aragon"
+msgstr "Aragon"
+
+#: .\contrib\localflavor\es\es_regions.py:7
+msgid "Principality of Asturias"
+msgstr "Principatul Asturiei"
+
+#: .\contrib\localflavor\es\es_regions.py:8
+msgid "Balearic Islands"
+msgstr "Insulele Baleare"
+
+#: .\contrib\localflavor\es\es_regions.py:9
+msgid "Basque Country"
+msgstr "Tara Bascilor"
+
+#: .\contrib\localflavor\es\es_regions.py:10
+msgid "Canary Islands"
+msgstr "Insulele Canare"
+
+#: .\contrib\localflavor\es\es_regions.py:12
+msgid "Castile-La Mancha"
+msgstr "Castile-La Mancha"
+
+#: .\contrib\localflavor\es\es_regions.py:13
+msgid "Castile and Leon"
+msgstr "Castilia si Leon"
+
+#: .\contrib\localflavor\es\es_regions.py:14
+msgid "Catalonia"
+msgstr "Catalonia"
+
+#: .\contrib\localflavor\es\es_regions.py:15
+msgid "Extremadura"
+msgstr "Extremadura"
+
+#: .\contrib\localflavor\es\es_regions.py:16
+msgid "Galicia"
+msgstr "Galicia"
+
+#: .\contrib\localflavor\es\es_regions.py:19
+msgid "Region of Murcia"
+msgstr "Regiunea Murcia"
+
+#: .\contrib\localflavor\es\es_regions.py:20
+msgid "Foral Community of Navarre"
+msgstr "Comunitatea Forala Navara"
+
+#: .\contrib\localflavor\es\es_regions.py:21
+msgid "Valencian Community"
+msgstr "Comunitatea Valencia"
+
+#: .\contrib\localflavor\es\forms.py:19
+msgid "Enter a valid postal code in the range and format 01XXX - 52XXX."
+msgstr "Introduceti un cod postal valid in intervalul si de forma 01XXX - 52XXX."
+
+#: .\contrib\localflavor\es\forms.py:39
+msgid "Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or 9XXXXXXXX."
+msgstr "Introduceti un numa de telefon valid intr-unul dintre formatele 6XXXXXXXX, 8XXXXXXXX sau 9XXXXXXXX."
+
+#: .\contrib\localflavor\es\forms.py:66
+msgid "Please enter a valid NIF, NIE, or CIF."
+msgstr "Introduceţi vă rog un NIF, NIE sau CIF valid."
+
+#: .\contrib\localflavor\es\forms.py:67
+msgid "Please enter a valid NIF or NIE."
+msgstr "Introduceti va rog un NIF sau NIE valid."
+
+#: .\contrib\localflavor\es\forms.py:68
+msgid "Invalid checksum for NIF."
+msgstr "Suma de control invalda pentru NIF."
+
+#: .\contrib\localflavor\es\forms.py:69
+msgid "Invalid checksum for NIE."
+msgstr "Suma de control invalida pentru NIE."
+
+#: .\contrib\localflavor\es\forms.py:70
+msgid "Invalid checksum for CIF."
+msgstr "Suma de control invalida pentru CIF."
+
+#: .\contrib\localflavor\es\forms.py:142
+msgid "Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX."
+msgstr "Introduceti un numar de cont bancar valid de forma XXXX-XXXX-XX-XXXXXXXXXX."
+
+#: .\contrib\localflavor\es\forms.py:143
+msgid "Invalid checksum for bank account number."
+msgstr "Suma de control invalida pentru numarul de cont bancar."
+
+#: .\contrib\localflavor\fi\forms.py:28
+msgid "Enter a valid Finnish social security number."
+msgstr "Introduceti un numar finlandez de securitate sociala valid."
+
+#: .\contrib\localflavor\in_\forms.py:14
+msgid "Enter a zip code in the format XXXXXXX."
+msgstr "Introduceti un cod postal de forma XXXXXXX."
+
+#: .\contrib\localflavor\is_\forms.py:17
+msgid "Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr "Introduceti un numa islandez de autentificare valid. Formatul este XXXXXX-XXXX."
+
+#: .\contrib\localflavor\is_\forms.py:18
+msgid "The Icelandic identification number is not valid."
+msgstr "Numarul islandez de identificare nu este valid."
+
+#: .\contrib\localflavor\it\forms.py:14
+msgid "Enter a valid zip code."
+msgstr "Introduceti un cod postal valid."
+
+#: .\contrib\localflavor\it\forms.py:43
+msgid "Enter a valid Social Security number."
+msgstr "Introduceti un numar de securitate sociala valid."
+
+#: .\contrib\localflavor\it\forms.py:68
+msgid "Enter a valid VAT number."
+msgstr "Introduceti un numar VAT valid."
+
+#: .\contrib\localflavor\jp\forms.py:17
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "Introduceti un cod postal de forma XXXXXXX sau XXX-XXXX."
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr "Hokkaido"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:5
+msgid "Aomori"
+msgstr "Aomori"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:6
+msgid "Iwate"
+msgstr "Iwate"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:7
+msgid "Miyagi"
+msgstr "Miyagi"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:8
+msgid "Akita"
+msgstr "Akita"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:9
+msgid "Yamagata"
+msgstr "Yamagata"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:10
+msgid "Fukushima"
+msgstr "Fukushima"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr "Ibaraki"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:12
+msgid "Tochigi"
+msgstr "Tochigi"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:13
+msgid "Gunma"
+msgstr "Gunma"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:14
+msgid "Saitama"
+msgstr "Saitama"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:15
+msgid "Chiba"
+msgstr "Chiba"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:16
+msgid "Tokyo"
+msgstr "Tokyo"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr "Kanagawa"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr "Yamanashi"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:19
+msgid "Nagano"
+msgstr "Nagano"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:20
+msgid "Niigata"
+msgstr "Niigata"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:21
+msgid "Toyama"
+msgstr "Toyama"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr "Ishikawa"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:23
+msgid "Fukui"
+msgstr "Fukui"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:24
+msgid "Gifu"
+msgstr "Gifu"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr "Shizuoka"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:26
+msgid "Aichi"
+msgstr "Aichi"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:27
+msgid "Mie"
+msgstr "Mie"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:28
+msgid "Shiga"
+msgstr "Shiga"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:29
+msgid "Kyoto"
+msgstr "Kyoto"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:30
+msgid "Osaka"
+msgstr "Osaka"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:31
+msgid "Hyogo"
+msgstr "Hyogo"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:32
+msgid "Nara"
+msgstr "Nara"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:33
+msgid "Wakayama"
+msgstr "Wakayama"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:34
+msgid "Tottori"
+msgstr "Tottori"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:35
+msgid "Shimane"
+msgstr "Shimane"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:36
+msgid "Okayama"
+msgstr "Okayama"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr "Hiroshima"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr "Yamaguchi"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:39
+msgid "Tokushima"
+msgstr "Tokushima"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:40
+msgid "Kagawa"
+msgstr "Kagawa"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:41
+msgid "Ehime"
+msgstr "Ehime"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:42
+msgid "Kochi"
+msgstr "Kochi"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr "Fukuoka"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:44
+msgid "Saga"
+msgstr "Saga"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr "Nagasaki"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr "Kumamoto"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:47
+msgid "Oita"
+msgstr "Oita"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr "Miyazaki"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr "Kagoshima"
+
+#: .\contrib\localflavor\jp\jp_prefectures.py:50
+msgid "Okinawa"
+msgstr "Okinawa"
+
+#: .\contrib\localflavor\mx\mx_states.py:12
+msgid "Aguascalientes"
+msgstr "Aguascalientes"
+
+#: .\contrib\localflavor\mx\mx_states.py:13
+msgid "Baja California"
+msgstr "Baja California"
+
+#: .\contrib\localflavor\mx\mx_states.py:14
+msgid "Baja California Sur"
+msgstr "Baja California Sur"
+
+#: .\contrib\localflavor\mx\mx_states.py:15
+msgid "Campeche"
+msgstr "Campeche"
+
+#: .\contrib\localflavor\mx\mx_states.py:16
+msgid "Chihuahua"
+msgstr "Chihuahua"
+
+#: .\contrib\localflavor\mx\mx_states.py:17
+msgid "Chiapas"
+msgstr "Chiapas"
+
+#: .\contrib\localflavor\mx\mx_states.py:18
+msgid "Coahuila"
+msgstr "Coahuila"
+
+#: .\contrib\localflavor\mx\mx_states.py:19
+msgid "Colima"
+msgstr "Colima"
+
+#: .\contrib\localflavor\mx\mx_states.py:20
+msgid "Distrito Federal"
+msgstr "Districtul Federal"
+
+#: .\contrib\localflavor\mx\mx_states.py:21
+msgid "Durango"
+msgstr "Durango"
+
+#: .\contrib\localflavor\mx\mx_states.py:22
+msgid "Guerrero"
+msgstr "Guerrero"
+
+#: .\contrib\localflavor\mx\mx_states.py:23
+msgid "Guanajuato"
+msgstr "Guanajuato"
+
+#: .\contrib\localflavor\mx\mx_states.py:24
+msgid "Hidalgo"
+msgstr "Hidalgo"
+
+#: .\contrib\localflavor\mx\mx_states.py:25
+msgid "Jalisco"
+msgstr "Jalisco"
+
+#: .\contrib\localflavor\mx\mx_states.py:26
+msgid "Estado de México"
+msgstr "Statul Mexico"
+
+#: .\contrib\localflavor\mx\mx_states.py:27
+msgid "Michoacán"
+msgstr "Michoacán"
+
+#: .\contrib\localflavor\mx\mx_states.py:28
+msgid "Morelos"
+msgstr "Morelos"
+
+#: .\contrib\localflavor\mx\mx_states.py:29
+msgid "Nayarit"
+msgstr "Nayarit"
+
+#: .\contrib\localflavor\mx\mx_states.py:30
+msgid "Nuevo León"
+msgstr "Nuevo León"
+
+#: .\contrib\localflavor\mx\mx_states.py:31
+msgid "Oaxaca"
+msgstr "Oaxaca"
+
+#: .\contrib\localflavor\mx\mx_states.py:32
+msgid "Puebla"
+msgstr "Puebla"
+
+#: .\contrib\localflavor\mx\mx_states.py:33
+msgid "Querétaro"
+msgstr "Querétaro"
+
+#: .\contrib\localflavor\mx\mx_states.py:34
+msgid "Quintana Roo"
+msgstr "Quintana Roo"
+
+#: .\contrib\localflavor\mx\mx_states.py:35
+msgid "Sinaloa"
+msgstr "Sinaloa"
+
+#: .\contrib\localflavor\mx\mx_states.py:36
+msgid "San Luis Potosí"
+msgstr "San Luis Potosí"
+
+#: .\contrib\localflavor\mx\mx_states.py:37
+msgid "Sonora"
+msgstr "Sonora"
+
+#: .\contrib\localflavor\mx\mx_states.py:38
+msgid "Tabasco"
+msgstr "Tabasco"
+
+#: .\contrib\localflavor\mx\mx_states.py:39
+msgid "Tamaulipas"
+msgstr "Tamaulipas"
+
+#: .\contrib\localflavor\mx\mx_states.py:40
+msgid "Tlaxcala"
+msgstr "Tlaxcala"
+
+#: .\contrib\localflavor\mx\mx_states.py:41
+msgid "Veracruz"
+msgstr "Veracruz"
+
+#: .\contrib\localflavor\mx\mx_states.py:42
+msgid "Yucatán"
+msgstr "Yucatan"
+
+#: .\contrib\localflavor\mx\mx_states.py:43
+msgid "Zacatecas"
+msgstr "Zacatecas"
+
+#: .\contrib\localflavor\nl\forms.py:21
+msgid "Enter a valid postal code"
+msgstr "Introduceti un cod postal valid"
+
+#: .\contrib\localflavor\nl\forms.py:52
+msgid "Enter a valid phone number"
+msgstr "Introduceţi un număr îde telefon valid"
+
+#: .\contrib\localflavor\nl\forms.py:78
+msgid "Enter a valid SoFi number"
+msgstr "Introduceti un numar SoFi valid"
+
+#: .\contrib\localflavor\nl\nl_provinces.py:4
+msgid "Drente"
+msgstr "Drente"
+
+#: .\contrib\localflavor\nl\nl_provinces.py:5
+msgid "Flevoland"
+msgstr "Flevoland"
+
+#: .\contrib\localflavor\nl\nl_provinces.py:6
+msgid "Friesland"
+msgstr "Frizia"
+
+#: .\contrib\localflavor\nl\nl_provinces.py:7
+msgid "Gelderland"
+msgstr "Gelderland"
+
+#: .\contrib\localflavor\nl\nl_provinces.py:8
+msgid "Groningen"
+msgstr "Groningen"
+
+#: .\contrib\localflavor\nl\nl_provinces.py:9
+msgid "Limburg"
+msgstr "Limburg"
+
+#: .\contrib\localflavor\nl\nl_provinces.py:10
+msgid "Noord-Brabant"
+msgstr "Brabantul de Nord"
+
+#: .\contrib\localflavor\nl\nl_provinces.py:11
+msgid "Noord-Holland"
+msgstr "Olanda de Nord"
+
+#: .\contrib\localflavor\nl\nl_provinces.py:12
+msgid "Overijssel"
+msgstr "Overijssel"
+
+#: .\contrib\localflavor\nl\nl_provinces.py:13
+msgid "Utrecht"
+msgstr "Utrecht"
+
+#: .\contrib\localflavor\nl\nl_provinces.py:14
+msgid "Zeeland"
+msgstr "Zeelanda"
+
+#: .\contrib\localflavor\nl\nl_provinces.py:15
+msgid "Zuid-Holland"
+msgstr "Olanda de Sud"
+
+#: .\contrib\localflavor\no\forms.py:33
+msgid "Enter a valid Norwegian social security number."
+msgstr "Introduceti un numar norvegian de securitate sociala valid."
+
+#: .\contrib\localflavor\pe\forms.py:24
+msgid "This field requires 8 digits."
+msgstr "Acest camp are nevoie de 8 cifre."
+
+#: .\contrib\localflavor\pe\forms.py:52
+msgid "This field requires 11 digits."
+msgstr "Acest camp are nevoie de 11 cifre."
+
+#: .\contrib\localflavor\pl\forms.py:39
+msgid "National Identification Number consists of 11 digits."
+msgstr "Numarul National de Identificare contine 11 cifre."
+
+#: .\contrib\localflavor\pl\forms.py:40
+msgid "Wrong checksum for the National Identification Number."
+msgstr "Suma de control gresita pentru Numarul National de Identificare."
+
+#: .\contrib\localflavor\pl\forms.py:72
+msgid "Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX."
+msgstr "Introduceti un numar de taxa(NIP) de forma XXX-XXX-XX-XX sau XX-XX-XXX-XXX."
+
+#: .\contrib\localflavor\pl\forms.py:73
+msgid "Wrong checksum for the Tax Number (NIP)."
+msgstr "Suma de control gresita pentru Numarul de Taxa (NIP)."
+
+#: .\contrib\localflavor\pl\forms.py:112
+msgid "National Business Register Number (REGON) consists of 7 or 9 digits."
+msgstr "Numarul National din Registrul pentru Afaceri (REGON) contine 7 sau 9 cifre."
+
+#: .\contrib\localflavor\pl\forms.py:113
+msgid "Wrong checksum for the National Business Register Number (REGON)."
+msgstr "Suma de control gresita pentru Numarul National din Registrul pentru Afaceri (REGON)."
+
+#: .\contrib\localflavor\pl\forms.py:156
+msgid "Enter a postal code in the format XX-XXX."
+msgstr "Introduceti un cod postal de forma XX-XXX."
+
+#: .\contrib\localflavor\pl\pl_voivodeships.py:8
+msgid "Lower Silesia"
+msgstr "Silezia Inferioara"
+
+#: .\contrib\localflavor\pl\pl_voivodeships.py:9
+msgid "Kuyavia-Pomerania"
+msgstr "Kuyavia-Pomerania"
+
+#: .\contrib\localflavor\pl\pl_voivodeships.py:10
+msgid "Lublin"
+msgstr "Lublin"
+
+#: .\contrib\localflavor\pl\pl_voivodeships.py:11
+msgid "Lubusz"
+msgstr "Lubusz"
+
+#: .\contrib\localflavor\pl\pl_voivodeships.py:12
+msgid "Lodz"
+msgstr "Lodz"
+
+#: .\contrib\localflavor\pl\pl_voivodeships.py:13
+msgid "Lesser Poland"
+msgstr "Polonia Mica"
+
+#: .\contrib\localflavor\pl\pl_voivodeships.py:14
+msgid "Masovia"
+msgstr "Masovia"
+
+#: .\contrib\localflavor\pl\pl_voivodeships.py:15
+msgid "Opole"
+msgstr "Opole"
+
+#: .\contrib\localflavor\pl\pl_voivodeships.py:16
+msgid "Subcarpatia"
+msgstr "Podcarpatia"
+
+#: .\contrib\localflavor\pl\pl_voivodeships.py:17
+msgid "Podlasie"
+msgstr "Podlasie"
+
+#: .\contrib\localflavor\pl\pl_voivodeships.py:18
+msgid "Pomerania"
+msgstr "Pomerania"
+
+#: .\contrib\localflavor\pl\pl_voivodeships.py:19
+msgid "Silesia"
+msgstr "Silezia"
+
+#: .\contrib\localflavor\pl\pl_voivodeships.py:20
+msgid "Swietokrzyskie"
+msgstr "Swietokrzyskie"
+
+#: .\contrib\localflavor\pl\pl_voivodeships.py:21
+msgid "Warmia-Masuria"
+msgstr "Warmia-Masuria"
+
+#: .\contrib\localflavor\pl\pl_voivodeships.py:22
+msgid "Greater Poland"
+msgstr "Polonia Mare"
+
+#: .\contrib\localflavor\pl\pl_voivodeships.py:23
+msgid "West Pomerania"
+msgstr "Pomerania Occidentala"
+
+#: .\contrib\localflavor\sk\forms.py:30
+msgid "Enter a postal code in the format XXXXX or XXX XX."
+msgstr "Introduceti un cod postal de forma XXXXX or XXX XX."
+
+#: .\contrib\localflavor\sk\sk_districts.py:8
+msgid "Banska Bystrica"
+msgstr "Banska Bystrica"
+
+#: .\contrib\localflavor\sk\sk_districts.py:9
+msgid "Banska Stiavnica"
+msgstr "Banska Stiavnica"
+
+#: .\contrib\localflavor\sk\sk_districts.py:10
+msgid "Bardejov"
+msgstr "Bardejov"
+
+#: .\contrib\localflavor\sk\sk_districts.py:11
+msgid "Banovce nad Bebravou"
+msgstr "Banovce nad Bebravou"
+
+#: .\contrib\localflavor\sk\sk_districts.py:12
+msgid "Brezno"
+msgstr "Brezno"
+
+#: .\contrib\localflavor\sk\sk_districts.py:13
+msgid "Bratislava I"
+msgstr "Bratislava I"
+
+#: .\contrib\localflavor\sk\sk_districts.py:14
+msgid "Bratislava II"
+msgstr "Bratislava II"
+
+#: .\contrib\localflavor\sk\sk_districts.py:15
+msgid "Bratislava III"
+msgstr "Bratislava III"
+
+#: .\contrib\localflavor\sk\sk_districts.py:16
+msgid "Bratislava IV"
+msgstr "Bratislava IV"
+
+#: .\contrib\localflavor\sk\sk_districts.py:17
+msgid "Bratislava V"
+msgstr "Bratislava V"
+
+#: .\contrib\localflavor\sk\sk_districts.py:18
+msgid "Bytca"
+msgstr "Bytca"
+
+#: .\contrib\localflavor\sk\sk_districts.py:19
+msgid "Cadca"
+msgstr "Cadca"
+
+#: .\contrib\localflavor\sk\sk_districts.py:20
+msgid "Detva"
+msgstr "Detva"
+
+#: .\contrib\localflavor\sk\sk_districts.py:21
+msgid "Dolny Kubin"
+msgstr "Dolny Kubin"
+
+#: .\contrib\localflavor\sk\sk_districts.py:22
+msgid "Dunajska Streda"
+msgstr "Dunajska Streda"
+
+#: .\contrib\localflavor\sk\sk_districts.py:23
+msgid "Galanta"
+msgstr "Galanta"
+
+#: .\contrib\localflavor\sk\sk_districts.py:24
+msgid "Gelnica"
+msgstr "Gelnica"
+
+#: .\contrib\localflavor\sk\sk_districts.py:25
+msgid "Hlohovec"
+msgstr "Hlohovec"
+
+#: .\contrib\localflavor\sk\sk_districts.py:26
+msgid "Humenne"
+msgstr "Humenne"
+
+#: .\contrib\localflavor\sk\sk_districts.py:27
+msgid "Ilava"
+msgstr "Ilava"
+
+#: .\contrib\localflavor\sk\sk_districts.py:28
+msgid "Kezmarok"
+msgstr "Kezmarok"
+
+#: .\contrib\localflavor\sk\sk_districts.py:29
+msgid "Komarno"
+msgstr "Komarno"
+
+#: .\contrib\localflavor\sk\sk_districts.py:30
+msgid "Kosice I"
+msgstr "Kosice I"
+
+#: .\contrib\localflavor\sk\sk_districts.py:31
+msgid "Kosice II"
+msgstr "Kosice II"
+
+#: .\contrib\localflavor\sk\sk_districts.py:32
+msgid "Kosice III"
+msgstr "Kosice III"
+
+#: .\contrib\localflavor\sk\sk_districts.py:33
+msgid "Kosice IV"
+msgstr "Kosice IV"
+
+#: .\contrib\localflavor\sk\sk_districts.py:34
+msgid "Kosice - okolie"
+msgstr "Kosice - okolie"
+
+#: .\contrib\localflavor\sk\sk_districts.py:35
+msgid "Krupina"
+msgstr "Krupina"
+
+#: .\contrib\localflavor\sk\sk_districts.py:36
+msgid "Kysucke Nove Mesto"
+msgstr "Kysucke Nove Mesto"
+
+#: .\contrib\localflavor\sk\sk_districts.py:37
+msgid "Levice"
+msgstr "Levice"
+
+#: .\contrib\localflavor\sk\sk_districts.py:38
+msgid "Levoca"
+msgstr "Levoca"
+
+#: .\contrib\localflavor\sk\sk_districts.py:39
+msgid "Liptovsky Mikulas"
+msgstr "Liptovsky Mikulas"
+
+#: .\contrib\localflavor\sk\sk_districts.py:40
+msgid "Lucenec"
+msgstr "Lucenec"
+
+#: .\contrib\localflavor\sk\sk_districts.py:41
+msgid "Malacky"
+msgstr "Malacky"
+
+#: .\contrib\localflavor\sk\sk_districts.py:42
+msgid "Martin"
+msgstr "Martin"
+
+#: .\contrib\localflavor\sk\sk_districts.py:43
+msgid "Medzilaborce"
+msgstr "Medzilaborce"
+
+#: .\contrib\localflavor\sk\sk_districts.py:44
+msgid "Michalovce"
+msgstr "Michalovce"
+
+#: .\contrib\localflavor\sk\sk_districts.py:45
+msgid "Myjava"
+msgstr "Myjava"
+
+#: .\contrib\localflavor\sk\sk_districts.py:46
+msgid "Namestovo"
+msgstr "Namestovo"
+
+#: .\contrib\localflavor\sk\sk_districts.py:47
+msgid "Nitra"
+msgstr "Nitra"
+
+#: .\contrib\localflavor\sk\sk_districts.py:48
+msgid "Nove Mesto nad Vahom"
+msgstr "Nove Mesto nad Vahom"
+
+#: .\contrib\localflavor\sk\sk_districts.py:49
+msgid "Nove Zamky"
+msgstr "Nove Zamky"
+
+#: .\contrib\localflavor\sk\sk_districts.py:50
+msgid "Partizanske"
+msgstr "Partizanske"
+
+#: .\contrib\localflavor\sk\sk_districts.py:51
+msgid "Pezinok"
+msgstr "Pezinok"
+
+#: .\contrib\localflavor\sk\sk_districts.py:52
+msgid "Piestany"
+msgstr "Piestany"
+
+#: .\contrib\localflavor\sk\sk_districts.py:53
+msgid "Poltar"
+msgstr "Poltar"
+
+#: .\contrib\localflavor\sk\sk_districts.py:54
+msgid "Poprad"
+msgstr "Poprad"
+
+#: .\contrib\localflavor\sk\sk_districts.py:55
+msgid "Povazska Bystrica"
+msgstr "Povazska Bystrica"
+
+#: .\contrib\localflavor\sk\sk_districts.py:56
+msgid "Presov"
+msgstr "Presov"
+
+#: .\contrib\localflavor\sk\sk_districts.py:57
+msgid "Prievidza"
+msgstr "Prievidza"
+
+#: .\contrib\localflavor\sk\sk_districts.py:58
+msgid "Puchov"
+msgstr "Puchov"
+
+#: .\contrib\localflavor\sk\sk_districts.py:59
+msgid "Revuca"
+msgstr "Revuca"
+
+#: .\contrib\localflavor\sk\sk_districts.py:60
+msgid "Rimavska Sobota"
+msgstr "Rimavska Sobota"
+
+#: .\contrib\localflavor\sk\sk_districts.py:61
+msgid "Roznava"
+msgstr "Roznava"
+
+#: .\contrib\localflavor\sk\sk_districts.py:62
+msgid "Ruzomberok"
+msgstr "Ruzomberok"
+
+#: .\contrib\localflavor\sk\sk_districts.py:63
+msgid "Sabinov"
+msgstr "Sabinov"
+
+#: .\contrib\localflavor\sk\sk_districts.py:64
+msgid "Senec"
+msgstr "Senec"
+
+#: .\contrib\localflavor\sk\sk_districts.py:65
+msgid "Senica"
+msgstr "Senica"
+
+#: .\contrib\localflavor\sk\sk_districts.py:66
+msgid "Skalica"
+msgstr "Skalica"
+
+#: .\contrib\localflavor\sk\sk_districts.py:67
+msgid "Snina"
+msgstr "Snina"
+
+#: .\contrib\localflavor\sk\sk_districts.py:68
+msgid "Sobrance"
+msgstr "Sobrance"
+
+#: .\contrib\localflavor\sk\sk_districts.py:69
+msgid "Spisska Nova Ves"
+msgstr "Spisska Nova Ves"
+
+#: .\contrib\localflavor\sk\sk_districts.py:70
+msgid "Stara Lubovna"
+msgstr "Stara Lubovna"
+
+#: .\contrib\localflavor\sk\sk_districts.py:71
+msgid "Stropkov"
+msgstr "Stropkov"
+
+#: .\contrib\localflavor\sk\sk_districts.py:72
+msgid "Svidnik"
+msgstr "Svidnik"
+
+#: .\contrib\localflavor\sk\sk_districts.py:73
+msgid "Sala"
+msgstr "Sala"
+
+#: .\contrib\localflavor\sk\sk_districts.py:74
+msgid "Topolcany"
+msgstr "Topolcany"
+
+#: .\contrib\localflavor\sk\sk_districts.py:75
+msgid "Trebisov"
+msgstr "Trebisov"
+
+#: .\contrib\localflavor\sk\sk_districts.py:76
+msgid "Trencin"
+msgstr "Trencin"
+
+#: .\contrib\localflavor\sk\sk_districts.py:77
+msgid "Trnava"
+msgstr "Trnava"
+
+#: .\contrib\localflavor\sk\sk_districts.py:78
+msgid "Turcianske Teplice"
+msgstr "Turcianske Teplice"
+
+#: .\contrib\localflavor\sk\sk_districts.py:79
+msgid "Tvrdosin"
+msgstr "Tvrdosin"
+
+#: .\contrib\localflavor\sk\sk_districts.py:80
+msgid "Velky Krtis"
+msgstr "Velky Krtis"
+
+#: .\contrib\localflavor\sk\sk_districts.py:81
+msgid "Vranov nad Toplou"
+msgstr "Vranov nad Toplou"
+
+#: .\contrib\localflavor\sk\sk_districts.py:82
+msgid "Zlate Moravce"
+msgstr "Zlate Moravce"
+
+#: .\contrib\localflavor\sk\sk_districts.py:83
+msgid "Zvolen"
+msgstr "Zvolen"
+
+#: .\contrib\localflavor\sk\sk_districts.py:84
+msgid "Zarnovica"
+msgstr "Zarnovica"
+
+#: .\contrib\localflavor\sk\sk_districts.py:85
+msgid "Ziar nad Hronom"
+msgstr "Ziar nad Hronom"
+
+#: .\contrib\localflavor\sk\sk_districts.py:86
+msgid "Zilina"
+msgstr "Zilina"
+
+#: .\contrib\localflavor\sk\sk_regions.py:8
+msgid "Banska Bystrica region"
+msgstr "Banska Bystrica region"
+
+#: .\contrib\localflavor\sk\sk_regions.py:9
+msgid "Bratislava region"
+msgstr "Regiunea Bratislava"
+
+#: .\contrib\localflavor\sk\sk_regions.py:10
+msgid "Kosice region"
+msgstr "Regiunea Kosice"
+
+#: .\contrib\localflavor\sk\sk_regions.py:11
+msgid "Nitra region"
+msgstr "Regiunea Nitra"
+
+#: .\contrib\localflavor\sk\sk_regions.py:12
+msgid "Presov region"
+msgstr "Regiunea Presov"
+
+#: .\contrib\localflavor\sk\sk_regions.py:13
+msgid "Trencin region"
+msgstr "Regiunea Trencin"
+
+#: .\contrib\localflavor\sk\sk_regions.py:14
+msgid "Trnava region"
+msgstr "Regiunea Trnava"
+
+#: .\contrib\localflavor\sk\sk_regions.py:15
+msgid "Zilina region"
+msgstr "Regiunea Zilina"
+
+#: .\contrib\localflavor\uk\forms.py:21
+msgid "Enter a valid postcode."
+msgstr "Introduceti un cod postal valid."
+
+#: .\contrib\localflavor\uk\uk_regions.py:11
+msgid "Bedfordshire"
+msgstr "Bedfordshire"
+
+#: .\contrib\localflavor\uk\uk_regions.py:12
+msgid "Buckinghamshire"
+msgstr "Buckinghamshire"
+
+#: .\contrib\localflavor\uk\uk_regions.py:14
+msgid "Cheshire"
+msgstr "Cheshire"
+
+#: .\contrib\localflavor\uk\uk_regions.py:15
+msgid "Cornwall and Isles of Scilly"
+msgstr "Cornwall si Insulele Scilly"
+
+#: .\contrib\localflavor\uk\uk_regions.py:16
+msgid "Cumbria"
+msgstr "Cumbria"
+
+#: .\contrib\localflavor\uk\uk_regions.py:17
+msgid "Derbyshire"
+msgstr "Derbyshire"
+
+#: .\contrib\localflavor\uk\uk_regions.py:18
+msgid "Devon"
+msgstr "Devon"
+
+#: .\contrib\localflavor\uk\uk_regions.py:19
+msgid "Dorset"
+msgstr "Dorset"
+
+#: .\contrib\localflavor\uk\uk_regions.py:20
+msgid "Durham"
+msgstr "Durham"
+
+#: .\contrib\localflavor\uk\uk_regions.py:21
+msgid "East Sussex"
+msgstr "East Sussex"
+
+#: .\contrib\localflavor\uk\uk_regions.py:22
+msgid "Essex"
+msgstr "Essex"
+
+#: .\contrib\localflavor\uk\uk_regions.py:23
+msgid "Gloucestershire"
+msgstr "Gloucestershire"
+
+#: .\contrib\localflavor\uk\uk_regions.py:24
+msgid "Greater London"
+msgstr "Londra Mare"
+
+#: .\contrib\localflavor\uk\uk_regions.py:25
+msgid "Greater Manchester"
+msgstr "Greater Manchester"
+
+#: .\contrib\localflavor\uk\uk_regions.py:26
+msgid "Hampshire"
+msgstr "Hampshire"
+
+#: .\contrib\localflavor\uk\uk_regions.py:27
+msgid "Hertfordshire"
+msgstr "Hertfordshire"
+
+#: .\contrib\localflavor\uk\uk_regions.py:28
+msgid "Kent"
+msgstr "Kent"
+
+#: .\contrib\localflavor\uk\uk_regions.py:29
+msgid "Lancashire"
+msgstr "Lancashire"
+
+#: .\contrib\localflavor\uk\uk_regions.py:30
+msgid "Leicestershire"
+msgstr "Leicestershire"
+
+#: .\contrib\localflavor\uk\uk_regions.py:31
+msgid "Lincolnshire"
+msgstr "Lincolnshire"
+
+#: .\contrib\localflavor\uk\uk_regions.py:32
+msgid "Merseyside"
+msgstr "Merseyside"
+
+#: .\contrib\localflavor\uk\uk_regions.py:33
+msgid "Norfolk"
+msgstr "Norfolk"
+
+#: .\contrib\localflavor\uk\uk_regions.py:34
+msgid "North Yorkshire"
+msgstr "North Yorkshire"
+
+#: .\contrib\localflavor\uk\uk_regions.py:35
+msgid "Northamptonshire"
+msgstr "Northamptonshire"
+
+#: .\contrib\localflavor\uk\uk_regions.py:36
+msgid "Northumberland"
+msgstr "Northumberland"
+
+#: .\contrib\localflavor\uk\uk_regions.py:37
+msgid "Nottinghamshire"
+msgstr "Nottinghamshire"
+
+#: .\contrib\localflavor\uk\uk_regions.py:38
+msgid "Oxfordshire"
+msgstr "Oxfordshire"
+
+#: .\contrib\localflavor\uk\uk_regions.py:39
+msgid "Shropshire"
+msgstr "Shropshire"
+
+#: .\contrib\localflavor\uk\uk_regions.py:40
+msgid "Somerset"
+msgstr "Somerset"
+
+#: .\contrib\localflavor\uk\uk_regions.py:41
+msgid "South Yorkshire"
+msgstr "South Yorkshire"
+
+#: .\contrib\localflavor\uk\uk_regions.py:42
+msgid "Staffordshire"
+msgstr "Staffordshire"
+
+#: .\contrib\localflavor\uk\uk_regions.py:43
+msgid "Suffolk"
+msgstr "Suffolk"
+
+#: .\contrib\localflavor\uk\uk_regions.py:44
+msgid "Surrey"
+msgstr "Surrey"
+
+#: .\contrib\localflavor\uk\uk_regions.py:45
+msgid "Tyne and Wear"
+msgstr "Tyne si Wear"
+
+#: .\contrib\localflavor\uk\uk_regions.py:46
+msgid "Warwickshire"
+msgstr "Warwickshire"
+
+#: .\contrib\localflavor\uk\uk_regions.py:47
+msgid "West Midlands"
+msgstr "West Midlands"
+
+#: .\contrib\localflavor\uk\uk_regions.py:48
+msgid "West Sussex"
+msgstr "West Sussex"
+
+#: .\contrib\localflavor\uk\uk_regions.py:49
+msgid "West Yorkshire"
+msgstr "West Yorkshire"
+
+#: .\contrib\localflavor\uk\uk_regions.py:50
+msgid "Wiltshire"
+msgstr "Wiltshire"
+
+#: .\contrib\localflavor\uk\uk_regions.py:51
+msgid "Worcestershire"
+msgstr "Worcestershire"
+
+#: .\contrib\localflavor\uk\uk_regions.py:55
+msgid "County Antrim"
+msgstr "Comitatul Antrim"
+
+#: .\contrib\localflavor\uk\uk_regions.py:56
+msgid "County Armagh"
+msgstr "Comitatul Armagh"
+
+#: .\contrib\localflavor\uk\uk_regions.py:57
+msgid "County Down"
+msgstr "Comitatul Down"
+
+#: .\contrib\localflavor\uk\uk_regions.py:58
+msgid "County Fermanagh"
+msgstr "Comitatul Fermanagh"
+
+#: .\contrib\localflavor\uk\uk_regions.py:59
+msgid "County Londonderry"
+msgstr "Comitatul Londonderry"
+
+#: .\contrib\localflavor\uk\uk_regions.py:60
+msgid "County Tyrone"
+msgstr "Comitatul Tyrone"
+
+#: .\contrib\localflavor\uk\uk_regions.py:64
+msgid "Clwyd"
+msgstr "Clwyd"
+
+#: .\contrib\localflavor\uk\uk_regions.py:65
+msgid "Dyfed"
+msgstr "Dyfed"
+
+#: .\contrib\localflavor\uk\uk_regions.py:66
+msgid "Gwent"
+msgstr "Gwent"
+
+#: .\contrib\localflavor\uk\uk_regions.py:67
+msgid "Gwynedd"
+msgstr "Gwynedd"
+
+#: .\contrib\localflavor\uk\uk_regions.py:68
+msgid "Mid Glamorgan"
+msgstr "Mid Glamorgan"
+
+#: .\contrib\localflavor\uk\uk_regions.py:69
+msgid "Powys"
+msgstr "Powys"
+
+#: .\contrib\localflavor\uk\uk_regions.py:70
+msgid "South Glamorgan"
+msgstr "South Glamorgan"
+
+#: .\contrib\localflavor\uk\uk_regions.py:71
+msgid "West Glamorgan"
+msgstr "West Glamorgan"
+
+#: .\contrib\localflavor\uk\uk_regions.py:75
+msgid "Borders"
+msgstr "Borders"
+
+#: .\contrib\localflavor\uk\uk_regions.py:76
+msgid "Central Scotland"
+msgstr "Central Scotland"
+
+#: .\contrib\localflavor\uk\uk_regions.py:77
+msgid "Dumfries and Galloway"
+msgstr "Dumfries si Galloway"
+
+#: .\contrib\localflavor\uk\uk_regions.py:78
+msgid "Fife"
+msgstr "Fife"
+
+#: .\contrib\localflavor\uk\uk_regions.py:79
+msgid "Grampian"
+msgstr "Grampian"
+
+#: .\contrib\localflavor\uk\uk_regions.py:80
+msgid "Highland"
+msgstr "Highland"
+
+#: .\contrib\localflavor\uk\uk_regions.py:81
+msgid "Lothian"
+msgstr "Lothian"
+
+#: .\contrib\localflavor\uk\uk_regions.py:82
+msgid "Orkney Islands"
+msgstr "Orkney Islands"
+
+#: .\contrib\localflavor\uk\uk_regions.py:83
+msgid "Shetland Islands"
+msgstr "Shetland Islands"
+
+#: .\contrib\localflavor\uk\uk_regions.py:84
+msgid "Strathclyde"
+msgstr "Strathclyde"
+
+#: .\contrib\localflavor\uk\uk_regions.py:85
+msgid "Tayside"
+msgstr "Tayside"
+
+#: .\contrib\localflavor\uk\uk_regions.py:86
+msgid "Western Isles"
+msgstr "Western Isles"
+
+#: .\contrib\localflavor\uk\uk_regions.py:90
+msgid "England"
+msgstr "Anglia"
+
+#: .\contrib\localflavor\uk\uk_regions.py:91
+msgid "Northern Ireland"
+msgstr "Irlanda de Nord"
+
+#: .\contrib\localflavor\uk\uk_regions.py:92
+msgid "Scotland"
+msgstr "Scotia"
+
+#: .\contrib\localflavor\uk\uk_regions.py:93
+msgid "Wales"
+msgstr "Tara Galilor"
+
+#: .\contrib\localflavor\us\forms.py:16
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "Introduceti un cod postal de forma XXXXX or XXXXX-XXXX."
+
+#: .\contrib\localflavor\us\forms.py:54
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr "Introduceti un numar SUA de Securitate Sociala de forma XXX-XX-XXXX format."
+
+#: .\contrib\localflavor\za\forms.py:20
+msgid "Enter a valid South African ID number"
+msgstr "Introduceti un ID sud african valid"
+
+#: .\contrib\localflavor\za\forms.py:54
+msgid "Enter a valid South African postal code"
+msgstr "Introduceti un cod postal sud african valid"
+
+#: .\contrib\localflavor\za\za_provinces.py:4
+msgid "Eastern Cape"
+msgstr "Eastern Cape"
+
+#: .\contrib\localflavor\za\za_provinces.py:5
+msgid "Free State"
+msgstr "Free State"
+
+#: .\contrib\localflavor\za\za_provinces.py:6
+msgid "Gauteng"
+msgstr "Gauteng"
+
+#: .\contrib\localflavor\za\za_provinces.py:7
+msgid "KwaZulu-Natal"
+msgstr "KwaZulu-Natal"
+
+#: .\contrib\localflavor\za\za_provinces.py:8
+msgid "Limpopo"
+msgstr "Limpopo"
+
+#: .\contrib\localflavor\za\za_provinces.py:9
+msgid "Mpumalanga"
+msgstr "Mpumalanga"
+
+#: .\contrib\localflavor\za\za_provinces.py:10
+msgid "Northern Cape"
+msgstr "Northern Cape"
+
+#: .\contrib\localflavor\za\za_provinces.py:11
+msgid "North West"
+msgstr "North West"
+
+#: .\contrib\localflavor\za\za_provinces.py:12
+msgid "Western Cape"
+msgstr "Western Cape"
+
+#: .\contrib\redirects\models.py:7
+msgid "redirect from"
+msgstr "redirectat de la "
+
+#: .\contrib\redirects\models.py:8
+msgid "This should be an absolute path, excluding the domain name. Example: '/events/search/'."
+msgstr "Aceasta ar trebui să fie o cale absolută, excluzînd numele de domeniu. Exemplu: '/evenimente/cautare/'."
+
+#: .\contrib\redirects\models.py:9
+msgid "redirect to"
+msgstr "redirectat la"
+
+#: .\contrib\redirects\models.py:10
+msgid "This can be either an absolute path (as above) or a full URL starting with 'http://'."
+msgstr "Aceasta poate fi o cale absolută (ca mai sus) sau un URL începînd cu 'http://'."
+
+#: .\contrib\redirects\models.py:13
+msgid "redirect"
+msgstr "redirectare"
+
+#: .\contrib\redirects\models.py:14
+msgid "redirects"
+msgstr "redictări"
+
+#: .\contrib\sessions\models.py:41
+msgid "session key"
+msgstr "cheie sesiune"
+
+#: .\contrib\sessions\models.py:42
+msgid "session data"
+msgstr "date sesiune"
+
+#: .\contrib\sessions\models.py:43
+msgid "expire date"
+msgstr "data expirare"
+
+#: .\contrib\sessions\models.py:48
+msgid "session"
+msgstr "sesiune"
+
+#: .\contrib\sessions\models.py:49
+msgid "sessions"
+msgstr "sesiuni"
+
+#: .\contrib\sites\models.py:32
+msgid "domain name"
+msgstr "nume domeniu"
+
+#: .\contrib\sites\models.py:33
+msgid "display name"
+msgstr "nume afişat"
+
+#: .\contrib\sites\models.py:37
+msgid "site"
+msgstr "sit"
+
+#: .\contrib\sites\models.py:38
+msgid "sites"
+msgstr "sit"
+
+#: .\core\validators.py:72
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Această valoare trebuie să conţină numai litere, numere şi liniuţe de subliniere."
+
+#: .\core\validators.py:76
+msgid "This value must contain only letters, numbers, underscores, dashes or slashes."
+msgstr "Această valoare trebuie să conţină numai litere, numere, liniuţe de subliniere, slash-uri si dash-uri."
+
+#: .\core\validators.py:80
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "Această valoare trebuie să conţină numai litere, numere, liniuţe de subliniere şi liniute."
+
+#: .\core\validators.py:84
+msgid "Uppercase letters are not allowed here."
+msgstr "Literele mari nu sînt permise aici."
+
+#: .\core\validators.py:88
+msgid "Lowercase letters are not allowed here."
+msgstr "Literele mici nu sînt permise aici."
+
+#: .\core\validators.py:95
+msgid "Enter only digits separated by commas."
+msgstr "Introduceţi numai numere separate de virgule."
+
+#: .\core\validators.py:107
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Introduceţi adrese de email valide separate de virgule."
+
+#: .\core\validators.py:111
+msgid "Please enter a valid IP address."
+msgstr "Introduceţi vă rog o adresă IP validă."
+
+#: .\core\validators.py:115
+msgid "Empty values are not allowed here."
+msgstr "Valorile vide nu sînt permise aici."
+
+#: .\core\validators.py:119
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Caracterele ne-numerice nu sînt permise aici."
+
+#: .\core\validators.py:123
+msgid "This value can't be comprised solely of digits."
+msgstr "Această valoare nu poate conţîne numai cifre."
+
+#: .\core\validators.py:128
+#: .\newforms\fields.py:152
+msgid "Enter a whole number."
+msgstr "Introduceţi un număr întreg."
+
+#: .\core\validators.py:132
+msgid "Only alphabetical characters are allowed here."
+msgstr "Numai caractere alfabetice sînt permise aici."
+
+#: .\core\validators.py:147
+msgid "Year must be 1900 or later."
+msgstr "Anul trebuie sa fie 1900 sau posterior."
+
+#: .\core\validators.py:151
+#, python-format
+msgid "Invalid date: %s"
+msgstr "Data invalida: %s"
+
+#: .\core\validators.py:156
+#: .\db\models\fields\__init__.py:527
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Introduceţi o dată validă in format: AAAA-LL-ZZ."
+
+#: .\core\validators.py:161
+msgid "Enter a valid time in HH:MM format."
+msgstr "Introduceţi o oră în format OO:MM."
+
+#: .\core\validators.py:165
+#: .\db\models\fields\__init__.py:604
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Introduceţi o dată/oră validă în format AAAA-LL-ZZ OO:MM."
+
+#: .\core\validators.py:170
+#: .\newforms\fields.py:403
+msgid "Enter a valid e-mail address."
+msgstr "Introduceţi o adresă de email validă."
+
+#: .\core\validators.py:182
+#: .\core\validators.py:474
+#: .\newforms\fields.py:433
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Nici un fisier nu a fost trimis. Verifica tipul fisierului."
+
+#: .\core\validators.py:193
+#: .\newforms\fields.py:459
+msgid "Upload a valid image. The file you uploaded was either not an image or a corrupted image."
+msgstr "Încărcaţi o imagine validă. Fişierul încărcat nu era o imagine sau era o imagine coruptă."
+
+#: .\core\validators.py:200
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "URL-ul %s nu pointează către o imagine validă."
+
+#: .\core\validators.py:204
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "Numerele de telefon trebuie să fie in format XXX-XXX-XXXX. \"%s\" e invalid."
+
+#: .\core\validators.py:212
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "URL-ul %s nu pointează către o imagine video QuickTime validă."
+
+#: .\core\validators.py:216
+msgid "A valid URL is required."
+msgstr "E necesar un URL valid."
+
+#: .\core\validators.py:230
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"E necesar cod HTML valid. Erorile specifice sînt:\n"
+"%s"
+
+#: .\core\validators.py:237
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Format XML invalid: %s"
+
+#: .\core\validators.py:254
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "URL invalid: %s"
+
+#: .\core\validators.py:259
+#: .\core\validators.py:261
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "URL-ul %s e invalid."
+
+#: .\core\validators.py:267
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Introduceţi o abreviere validă în U.S."
+
+#: .\core\validators.py:281
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Îngrijiţi-vă limbajul! Cuvîntul %s nu este permis aici."
+msgstr[1] "Îngrijiţi-vă limbajul! Cuvintele %s nu sînt permise aici."
+
+#: .\core\validators.py:288
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Acest camp trebuie sa fie identic cu '%s'."
+
+#: .\core\validators.py:307
+msgid "Please enter something for at least one field."
+msgstr "Va rog completati cel putin un camp."
+
+#: .\core\validators.py:316
+#: .\core\validators.py:327
+msgid "Please enter both fields or leave them both empty."
+msgstr "Vă rog comletaţi ambele cîmpuri sau lăsaţi-le goale pe ambele."
+
+#: .\core\validators.py:335
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Acest cîmp e necesar dacă %(field)s este %(value)s"
+
+#: .\core\validators.py:348
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Acest cîmp e necesar dacă %(field)s nu este %(value)s"
+
+#: .\core\validators.py:367
+msgid "Duplicate values are not allowed."
+msgstr "Valorile duplicate nu sînt permise."
+
+#: .\core\validators.py:382
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Aceasta valoare trebuie sa fie cuprinsa intre %(lower)s si %(upper)s."
+
+#: .\core\validators.py:384
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Această valoare trebuie să fie cel putin %s."
+
+#: .\core\validators.py:386
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Această valoare trebuie să nu fie mai mult de %s."
+
+#: .\core\validators.py:427
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Această valoare trebuie să fie o putere a lui %s."
+
+#: .\core\validators.py:437
+msgid "Please enter a valid decimal number."
+msgstr "Vă rog introduceţi un număr zecimal valid."
+
+#: .\core\validators.py:444
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural "Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Vă rog introduceţi un număr zecimal valid cu cel mult %s cifră."
+msgstr[1] "Vă rog introduceţi un număr zecimal valid cu cel mult %s cifre."
+
+#: .\core\validators.py:447
+#, python-format
+msgid "Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural "Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] "Vă rog introduceţi un număr zecimal valid cu partea intreaga cel mult %s cifră."
+msgstr[1] "Vă rog introduceţi un număr zecimal valid cu partea intreaga cel mult %s cifre."
+
+#: .\core\validators.py:450
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural "Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "Vă rog introduceţi un număr zecimal valid cu cel mult %s zecimală."
+msgstr[1] "Vă rog introduceţi un număr zecimal valid cu cel mult %s zecimale."
+
+#: .\core\validators.py:458
+msgid "Please enter a valid floating point number."
+msgstr "Vă rog introduceţi un număr cu virgula valid."
+
+#: .\core\validators.py:467
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Asigură-te că fişierul încărcact are cel puţin %s octeţi."
+
+#: .\core\validators.py:468
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Asigură-te că fişierul încărcact are cel mult %s octeţi."
+
+#: .\core\validators.py:485
+msgid "The format for this field is wrong."
+msgstr "Formatul acestui cîmp este invalid."
+
+#: .\core\validators.py:500
+msgid "This field is invalid."
+msgstr "Cîmpul este invalid."
+
+#: .\core\validators.py:536
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Nu pot prelua nimic de la %s."
+
+#: .\core\validators.py:539
+#, python-format
+msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "URL-ul %(url)s a returnat un header Content-Type invalid '%(contenttype)s'."
+
+#: .\core\validators.py:572
+#, python-format
+msgid "Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with \"%(start)s\".)"
+msgstr "Te rog închide tagurile %(tag)s din linia %(line)s. ( Linia începe cu \"%(start)s\".)"
+
+#: .\core\validators.py:576
+#, python-format
+msgid "Some text starting on line %(line)s is not allowed in that context. (Line starts with \"%(start)s\".)"
+msgstr "Textul începînd cu linia %(line)s nu e permis în acest context. (Linia începînd cu \"%(start)s\".)"
+
+#: .\core\validators.py:581
+#, python-format
+msgid "\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%(start)s\".)"
+msgstr "\"%(attr)s\" în linia %(line)s e un atribut invalid. (Linia începînd cu \"%(start)s\".)"
+
+#: .\core\validators.py:586
+#, python-format
+msgid "\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%(start)s\".)"
+msgstr "\"<%(tag)s>\" în linia %(line)s este un tag invalid. (Linia începe cu \"%(start)s\"."
+
+#: .\core\validators.py:590
+#, python-format
+msgid "A tag on line %(line)s is missing one or more required attributes. (Line starts with \"%(start)s\".)"
+msgstr "Unui tag din linia %(line)s îi lipseşte unul sau mai multe atribute. (Linia începe cu \"%(start)s\".)"
+
+#: .\core\validators.py:595
+#, python-format
+msgid "The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line starts with \"%(start)s\".)"
+msgstr "Atributul \"%(attr)s\" din linia %(line)s are o valoare invalidă. ( Linia începe cu \"%(start)s\".)"
+
+#: .\db\models\manipulators.py:308
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(object)s de acest tip %(type)s exista deja pentru %(field)s dat."
+
+#: .\db\models\fields\__init__.py:52
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s cu acest %(fieldname)s exista deja."
+
+#: .\db\models\fields\__init__.py:161
+#: .\db\models\fields\__init__.py:327
+#: .\db\models\fields\__init__.py:759
+#: .\db\models\fields\__init__.py:770
+#: .\newforms\fields.py:46
+#: .\oldforms\__init__.py:374
+msgid "This field is required."
+msgstr "Campul acesta trebuie completat obligatoriu."
+
+#: .\db\models\fields\__init__.py:427
+msgid "This value must be an integer."
+msgstr "Această valoare trebuie să fie un numar intreg"
+
+#: .\db\models\fields\__init__.py:466
+msgid "This value must be either True or False."
+msgstr "Această valoare trebuie să fie ori falsa ori adevarata"
+
+#: .\db\models\fields\__init__.py:490
+msgid "This field cannot be null."
+msgstr "Cîmpul nu poate fi gol"
+
+#: .\db\models\fields\__init__.py:668
+msgid "This value must be a decimal number."
+msgstr "Această valoare trebuie să fie un numar zecimal."
+
+#: .\db\models\fields\__init__.py:779
+msgid "Enter a valid filename."
+msgstr "Introduceti un nume de fisier valid."
+
+#: .\db\models\fields\__init__.py:960
+msgid "This value must be either None, True or False."
+msgstr "Această valoare trebuie să fie falsa, adevarata sau nici una."
+
+#: .\db\models\fields\related.py:93
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Introduceti va rog un %s valid."
+
+#: .\db\models\fields\related.py:701
+msgid "Separate multiple IDs with commas."
+msgstr "Separă ID-urile multiple cu virgulă."
+
+#: .\db\models\fields\related.py:703
+msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr " Ţine apăsat \"Control\", sau \"Command\" pe un Mac, pentru a selectie multipla."
+
+#: .\db\models\fields\related.py:750
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural "Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "Introduceti un ID valid pentru %(self)s. Valoarea %(value)r nu este valida."
+msgstr[1] "Introduceti ID-uri valide pentru %(self)s. Valorile %(value)r nu sunt valide."
+
+#: .\newforms\fields.py:47
+msgid "Enter a valid value."
+msgstr "Introduceti o valoare valida."
+
+#: .\newforms\fields.py:124
+#, python-format
+msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+msgstr "Asigurati-va ca aceasta valoare are cel mult %(max)d caractere (are %(length)d)."
+
+#: .\newforms\fields.py:125
+#, python-format
+msgid "Ensure this value has at least %(min)d characters (it has %(length)d)."
+msgstr "Asigurati-va ca aceasta valoare are cel putin %(min)d caractere (are %(length)d)."
+
+#: .\newforms\fields.py:153
+#: .\newforms\fields.py:182
+#: .\newforms\fields.py:211
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Asigurati-va ca aceasta valoare este mai mica sau egala cu %s."
+
+#: .\newforms\fields.py:154
+#: .\newforms\fields.py:183
+#: .\newforms\fields.py:212
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Asigurati-va ca aceasta valoare este mai mare sau egala cu %s."
+
+#: .\newforms\fields.py:181
+#: .\newforms\fields.py:210
+msgid "Enter a number."
+msgstr "Introduceţi un număr."
+
+#: .\newforms\fields.py:213
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr "Asigurati-va ca nu exista mai mult de %s cifre in total."
+
+#: .\newforms\fields.py:214
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr "Asigurati-va ca nu exista mai mult de %s spatii zecimale."
+
+#: .\newforms\fields.py:215
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr "Asigurati-va ca nu exista mai mult de %s cifre inainte de virgula."
+
+#: .\newforms\fields.py:263
+#: .\newforms\fields.py:751
+msgid "Enter a valid date."
+msgstr "Introduceti o data valida."
+
+#: .\newforms\fields.py:296
+#: .\newforms\fields.py:752
+msgid "Enter a valid time."
+msgstr "Introduceti o ora valida."
+
+#: .\newforms\fields.py:335
+msgid "Enter a valid date/time."
+msgstr "Introduceti o data/ora valida."
+
+#: .\newforms\fields.py:434
+msgid "No file was submitted."
+msgstr "Nici un fisier nu a fost trimis."
+
+#: .\newforms\fields.py:435
+#: .\oldforms\__init__.py:689
+msgid "The submitted file is empty."
+msgstr "Fisierul uploadat este gol"
+
+#: .\newforms\fields.py:497
+msgid "Enter a valid URL."
+msgstr "Introduceti un URL valid."
+
+#: .\newforms\fields.py:498
+msgid "This URL appears to be a broken link."
+msgstr "URL-ul e invalid."
+
+#: .\newforms\fields.py:560
+#: .\newforms\models.py:299
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Selectati o optiune valida. Aceasta optiune nu face parte din optiunile disponibile."
+
+#: .\newforms\fields.py:599
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "Selectati o optiune valida. %(value)s nu face parte din optiunile disponibile."
+
+#: .\newforms\fields.py:600
+#: .\newforms\fields.py:662
+#: .\newforms\models.py:371
+msgid "Enter a list of values."
+msgstr "Introduceti o lista de valori."
+
+#: .\newforms\fields.py:780
+msgid "Enter a valid IPv4 address."
+msgstr "Introduceţi o adresă IPv4 valida."
+
+#: .\newforms\models.py:372
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Selectati o optiune valida. %s nu face parte din optiunile disponibile."
+
+#: .\oldforms\__init__.py:409
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Asigurati-va ca textul dumneavoastra are mai putin de %s caracter."
+msgstr[1] "Asigurati-va ca textul dumneavoastra are mai putin de %s caractere."
+
+#: .\oldforms\__init__.py:414
+msgid "Line breaks are not allowed here."
+msgstr "Randurile noi nu sînt permise aici."
+
+#: .\oldforms\__init__.py:512
+#: .\oldforms\__init__.py:586
+#: .\oldforms\__init__.py:625
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Selectati o optiune valida. '%(data)s' nu face parte din %(choices)s."
+
+#: .\oldforms\__init__.py:745
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Introduceţi un număr întreg cu valoare intre -32,768 si 32,767."
+
+#: .\oldforms\__init__.py:755
+msgid "Enter a positive number."
+msgstr "Introduceţi un număr pozitiv."
+
+#: .\oldforms\__init__.py:765
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Introduceţi un număr întreg cu valoare intre 0 si 32,767."
+
+#: .\template\defaultfilters.py:698
+msgid "yes,no,maybe"
+msgstr "da,nu,poate"
+
+#: .\template\defaultfilters.py:729
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d byte"
+msgstr[1] "%(size)d bytes"
+
+#: .\template\defaultfilters.py:731
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f KB"
+
+#: .\template\defaultfilters.py:733
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: .\template\defaultfilters.py:734
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#: .\utils\dateformat.py:41
+msgid "p.m."
+msgstr "p.m."
+
+#: .\utils\dateformat.py:42
+msgid "a.m."
+msgstr "a.m."
+
+#: .\utils\dateformat.py:47
+msgid "PM"
+msgstr "PM"
+
+#: .\utils\dateformat.py:48
+msgid "AM"
+msgstr "AM"
+
+#: .\utils\dateformat.py:97
+msgid "midnight"
+msgstr "miezul noptii"
+
+#: .\utils\dateformat.py:99
+msgid "noon"
+msgstr "amiaza"
+
+#: .\utils\dates.py:6
+msgid "Monday"
+msgstr "Luni"
+
+#: .\utils\dates.py:6
+msgid "Tuesday"
+msgstr "Marţi"
+
+#: .\utils\dates.py:6
+msgid "Wednesday"
+msgstr "Miercuri"
+
+#: .\utils\dates.py:6
+msgid "Thursday"
+msgstr "Joi"
+
+#: .\utils\dates.py:6
+msgid "Friday"
+msgstr "Vineri"
+
+#: .\utils\dates.py:7
+msgid "Saturday"
+msgstr "Sîmbătă"
+
+#: .\utils\dates.py:7
+msgid "Sunday"
+msgstr "Duminică"
+
+#: .\utils\dates.py:10
+msgid "Mon"
+msgstr "Lun"
+
+#: .\utils\dates.py:10
+msgid "Tue"
+msgstr "Mar"
+
+#: .\utils\dates.py:10
+msgid "Wed"
+msgstr "Mie"
+
+#: .\utils\dates.py:10
+msgid "Thu"
+msgstr "Joi"
+
+#: .\utils\dates.py:10
+msgid "Fri"
+msgstr "Vin"
+
+#: .\utils\dates.py:11
+msgid "Sat"
+msgstr "Sam"
+
+#: .\utils\dates.py:11
+msgid "Sun"
+msgstr "Dum"
+
+#: .\utils\dates.py:18
+msgid "January"
+msgstr "Ianuarie"
+
+#: .\utils\dates.py:18
+msgid "February"
+msgstr "Februarie"
+
+#: .\utils\dates.py:18
+#: .\utils\dates.py:31
+msgid "March"
+msgstr "Martie"
+
+#: .\utils\dates.py:18
+#: .\utils\dates.py:31
+msgid "April"
+msgstr "Aprilie"
+
+#: .\utils\dates.py:18
+#: .\utils\dates.py:31
+msgid "May"
+msgstr "Mai"
+
+#: .\utils\dates.py:18
+#: .\utils\dates.py:31
+msgid "June"
+msgstr "Iunie"
+
+#: .\utils\dates.py:19
+#: .\utils\dates.py:31
+msgid "July"
+msgstr "Iulie"
+
+#: .\utils\dates.py:19
+msgid "August"
+msgstr "August"
+
+#: .\utils\dates.py:19
+msgid "September"
+msgstr "Septembrie"
+
+#: .\utils\dates.py:19
+msgid "October"
+msgstr "Octombrie"
+
+#: .\utils\dates.py:19
+msgid "November"
+msgstr "Noiembrie"
+
+#: .\utils\dates.py:20
+msgid "December"
+msgstr "Decembrie"
+
+#: .\utils\dates.py:23
+msgid "jan"
+msgstr "ian"
+
+#: .\utils\dates.py:23
+msgid "feb"
+msgstr "feb"
+
+#: .\utils\dates.py:23
+msgid "mar"
+msgstr "mar"
+
+#: .\utils\dates.py:23
+msgid "apr"
+msgstr "apr"
+
+#: .\utils\dates.py:23
+msgid "may"
+msgstr "mai"
+
+#: .\utils\dates.py:23
+msgid "jun"
+msgstr "iun"
+
+#: .\utils\dates.py:24
+msgid "jul"
+msgstr "iul"
+
+#: .\utils\dates.py:24
+msgid "aug"
+msgstr "aug"
+
+#: .\utils\dates.py:24
+msgid "sep"
+msgstr "sep"
+
+#: .\utils\dates.py:24
+msgid "oct"
+msgstr "oct"
+
+#: .\utils\dates.py:24
+msgid "nov"
+msgstr "noi"
+
+#: .\utils\dates.py:24
+msgid "dec"
+msgstr "dec"
+
+#: .\utils\dates.py:31
+msgid "Jan."
+msgstr "Ian."
+
+#: .\utils\dates.py:31
+msgid "Feb."
+msgstr "Feb."
+
+#: .\utils\dates.py:32
+msgid "Aug."
+msgstr "Aug."
+
+#: .\utils\dates.py:32
+msgid "Sept."
+msgstr "Sept."
+
+#: .\utils\dates.py:32
+msgid "Oct."
+msgstr "Oct"
+
+#: .\utils\dates.py:32
+msgid "Nov."
+msgstr "Noi."
+
+#: .\utils\dates.py:32
+msgid "Dec."
+msgstr "Dec."
+
+#: .\utils\text.py:127
+msgid "or"
+msgstr "sau"
+
+#: .\utils\timesince.py:21
+msgid "year"
+msgid_plural "years"
+msgstr[0] "an"
+msgstr[1] "ani"
+
+#: .\utils\timesince.py:22
+msgid "month"
+msgid_plural "months"
+msgstr[0] "luna"
+msgstr[1] "luni"
+
+#: .\utils\timesince.py:23
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "saptamana"
+msgstr[1] "saptamani"
+
+#: .\utils\timesince.py:24
+msgid "day"
+msgid_plural "days"
+msgstr[0] "zi"
+msgstr[1] "zile"
+
+#: .\utils\timesince.py:25
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "ora"
+msgstr[1] "ore"
+
+#: .\utils\timesince.py:26
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minut"
+msgstr[1] "minute"
+
+#: .\utils\timesince.py:46
+msgid "minutes"
+msgstr "minute"
+
+#: .\utils\timesince.py:51
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr "%(number)d %(type)s"
+
+#: .\utils\timesince.py:57
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ", %(number)d %(type)s"
+
+#: .\utils\translation\trans_real.py:403
+msgid "DATE_FORMAT"
+msgstr "j N Y"
+
+#: .\utils\translation\trans_real.py:404
+msgid "DATETIME_FORMAT"
+msgstr "j N Y, H:i:s"
+
+#: .\utils\translation\trans_real.py:405
+msgid "TIME_FORMAT"
+msgstr "H:i:s"
+
+#: .\utils\translation\trans_real.py:421
+msgid "YEAR_MONTH_FORMAT"
+msgstr "F Y"
+
+#: .\utils\translation\trans_real.py:422
+msgid "MONTH_DAY_FORMAT"
+msgstr "j F"
+
+#: .\views\generic\create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "%(verbose_name)s a fost creat cu succes."
+
+#: .\views\generic\create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "%(verbose_name)s a fost actualizat cu succes."
+
+#: .\views\generic\create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "%(verbose_name)s a fost sters."
+
+#~ msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+#~ msgstr "Ai <a href=\"/password_reset/\">uitat parola</a>?"
+#~ msgid "Use '[algo]$[salt]$[hexdigest]'"
+#~ msgstr "Foloseste '[algo]$[salt]$[hexdigest]'"
+
+#, fuzzy
+#~ msgid "Comments"
+#~ msgstr "permite comentarii"
+#~ msgid "label"
+#~ msgstr "etichetă"
+#~ msgid "package"
+#~ msgstr "pachet"
+#~ msgid "packages"
+#~ msgstr "pachete"
+
+#, fuzzy
+#~ msgid "count"
+#~ msgstr "conţinut"
+
diff --git a/webapp/django/conf/locale/ro/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/ro/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..0e594fa
--- /dev/null
+++ b/webapp/django/conf/locale/ro/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/ro/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/ro/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..7c91fb2
--- /dev/null
+++ b/webapp/django/conf/locale/ro/LC_MESSAGES/djangojs.po
@@ -0,0 +1,116 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-28 17:36+1000\n"
+"PO-Revision-Date: 2008-04-25 21:57+0200\n"
+"Last-Translator: \n"
+"Language-Team: Romanian <ro@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, fuzzy, perl-format
+msgid "Available %s"
+msgstr "%s disponibil"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Alege toate"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Adauga"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Sterge"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "%s ales"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Selectati-va alegera(ile) si dati click "
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Elibereaza toate"
+
+#: contrib/admin/media/js/dateparse.js:32
+#: contrib/admin/media/js/calendar.js:24
+msgid "January February March April May June July August September October November December"
+msgstr "Ianuarie Februare Martie Aprilie Mai Iunie Iulie August Septembrie Octombrie Noiembrie Decembrie"
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Duminica Luni Marti Miercuri Joi Vinery Sambata"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "D L M M J V S"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Now"
+msgstr "Acum"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
+msgid "Clock"
+msgstr "Ceas"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
+msgid "Choose a time"
+msgstr "Alege o ora"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "Midnight"
+msgstr "Miezul noptii"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "6 a.m."
+msgstr "6 a.m."
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
+msgid "Noon"
+msgstr "Amiaza"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
+msgid "Cancel"
+msgstr "Anuleaza"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
+msgid "Today"
+msgstr "Astazi"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
+msgid "Calendar"
+msgstr "Calendar"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
+msgid "Yesterday"
+msgstr "Ieri"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
+msgid "Tomorrow"
+msgstr "Maine"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr "Arata"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr "Ascunde"
+
diff --git a/webapp/django/conf/locale/ru/LC_MESSAGES/django.mo b/webapp/django/conf/locale/ru/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..69aa8b8
--- /dev/null
+++ b/webapp/django/conf/locale/ru/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/ru/LC_MESSAGES/django.po b/webapp/django/conf/locale/ru/LC_MESSAGES/django.po
new file mode 100644
index 0000000..46f3fab
--- /dev/null
+++ b/webapp/django/conf/locale/ru/LC_MESSAGES/django.po
@@ -0,0 +1,3029 @@
+# Translation of django.po to russian.
+# Copyright (C) 2005 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-05-04 16:07+1300\n"
+"PO-Revision-Date: 2006-09-07 15:28+0300\n"
+"Last-Translator: Vasiliy Stavenko <stavenko@gmail.com>\n"
+"Language-Team: Dialcom Services <greg@dial.com.ru>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
+"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Poedit-Language: Russian\n"
+"X-Poedit-Country: RUSSIAN FEDERATION\n"
+"X-Poedit-SourceCharset: utf-8\n"
+
+#: oldforms/__init__.py:357 db/models/fields/__init__.py:117
+#: db/models/fields/__init__.py:274 db/models/fields/__init__.py:615
+#: db/models/fields/__init__.py:626 newforms/models.py:178
+#: newforms/fields.py:80 newforms/fields.py:378 newforms/fields.py:454
+#: newforms/fields.py:465
+msgid "This field is required."
+msgstr "Обязательное поле."
+
+#: oldforms/__init__.py:392
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Убедитесь, что длина вашего текста меньше %s символа."
+msgstr[1] "Убедитесь, что длина вашего текста меньше %s символов."
+msgstr[2] "Убедитесь, что длина вашего текста меньше %s символов."
+
+#: oldforms/__init__.py:397
+msgid "Line breaks are not allowed here."
+msgstr "Переносы строк здесь не допускаются."
+
+#: oldforms/__init__.py:498 oldforms/__init__.py:571 oldforms/__init__.py:610
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Выберите корректный вариант; '%(data)s' нет в %(choices)s."
+
+#: oldforms/__init__.py:577 newforms/widgets.py:180
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "Неизвестно"
+
+#: oldforms/__init__.py:577 newforms/widgets.py:180
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Да"
+
+#: oldforms/__init__.py:577 newforms/widgets.py:180
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "Нет"
+
+#: oldforms/__init__.py:672 core/validators.py:174 core/validators.py:445
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Не получен файл. Проверьте кодирование формы (encoding)."
+
+#: oldforms/__init__.py:674
+msgid "The submitted file is empty."
+msgstr "Указанный файл пуст."
+
+#: oldforms/__init__.py:730
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Введите целое число в диапазоне от -32768 до 32767."
+
+#: oldforms/__init__.py:740
+msgid "Enter a positive number."
+msgstr "Введите положительное число."
+
+#: oldforms/__init__.py:750
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Введите целое число в диапазоне от 0 до 32767."
+
+#: db/models/manipulators.py:307
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(object)s с типом %(type)s уже существует для данного %(field)s."
+
+#: db/models/manipulators.py:308 contrib/admin/views/main.py:335
+#: contrib/admin/views/main.py:337 contrib/admin/views/main.py:339
+msgid "and"
+msgstr "и"
+
+#: db/models/fields/__init__.py:42
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s с %(fieldname)s уже существует."
+
+#: db/models/fields/__init__.py:369
+msgid "This value must be an integer."
+msgstr "Это значение должно быть целым числом."
+
+#: db/models/fields/__init__.py:404
+msgid "This value must be either True or False."
+msgstr "Значение должно либо True, либо False."
+
+#: db/models/fields/__init__.py:425
+msgid "This field cannot be null."
+msgstr "Это поле не может быть нулевым."
+
+#: db/models/fields/__init__.py:462 core/validators.py:148
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Вводите правильную дату в формате YYYY-MM-DD."
+
+#: db/models/fields/__init__.py:531 core/validators.py:157
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Введите правильные дату/время в формате YYYY-MM-DD HH:MM."
+
+#: db/models/fields/__init__.py:635
+msgid "Enter a valid filename."
+msgstr "Укажите правильное имя файла."
+
+#: db/models/fields/__init__.py:756
+#, fuzzy
+msgid "This value must be either None, True or False."
+msgstr "Значение должно либо True, либо False."
+
+#: db/models/fields/related.py:53
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Пожалуйста, введите правильный %s."
+
+#: db/models/fields/related.py:642
+msgid "Separate multiple IDs with commas."
+msgstr "Несколько значений ID разделите запятыми."
+
+#: db/models/fields/related.py:644
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Удерживайте \"Control\" (или \"Command\" на Mac) для выбора нескольких."
+
+#: db/models/fields/related.py:691
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+"Пожалуйста, введите корректный ID для %(self)s. Значение %(value)r "
+"недопустимо."
+msgstr[1] ""
+"Пожалуйста, введите корректные ID для %(self)s. Значения %(value)r "
+"недопустимы."
+msgstr[2] ""
+"Пожалуйста, введите корректные ID для %(self)s. Значения %(value)r "
+"недопустимы."
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "Арабский"
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "Бенгальский"
+
+#: conf/global_settings.py:41
+msgid "Catalan"
+msgstr "Каталанский"
+
+#: conf/global_settings.py:42
+msgid "Czech"
+msgstr "Чешский"
+
+#: conf/global_settings.py:43
+msgid "Welsh"
+msgstr "Уэльский"
+
+#: conf/global_settings.py:44
+msgid "Danish"
+msgstr "Датский"
+
+#: conf/global_settings.py:45
+msgid "German"
+msgstr "Немецкий"
+
+#: conf/global_settings.py:46
+msgid "Greek"
+msgstr "Греческий"
+
+#: conf/global_settings.py:47
+msgid "English"
+msgstr "Английский"
+
+#: conf/global_settings.py:48
+msgid "Spanish"
+msgstr "Испанский"
+
+#: conf/global_settings.py:49
+msgid "Argentinean Spanish"
+msgstr "Аргентинский испанский"
+
+#: conf/global_settings.py:50
+msgid "Finnish"
+msgstr "Финский"
+
+#: conf/global_settings.py:51
+msgid "French"
+msgstr "Французский"
+
+#: conf/global_settings.py:52
+msgid "Galician"
+msgstr "Галльский"
+
+#: conf/global_settings.py:53
+msgid "Hungarian"
+msgstr "Венгерский"
+
+#: conf/global_settings.py:54
+msgid "Hebrew"
+msgstr "Иврит"
+
+#: conf/global_settings.py:55
+msgid "Icelandic"
+msgstr "Исландский"
+
+#: conf/global_settings.py:56
+msgid "Italian"
+msgstr "Итальянский"
+
+#: conf/global_settings.py:57
+msgid "Japanese"
+msgstr "Японский"
+
+#: conf/global_settings.py:58
+msgid "Korean"
+msgstr "Корейский"
+
+#: conf/global_settings.py:59
+msgid "Kannada"
+msgstr "Каннада"
+
+#: conf/global_settings.py:60
+msgid "Latvian"
+msgstr "Латвийский"
+
+#: conf/global_settings.py:61
+msgid "Macedonian"
+msgstr "Македоский"
+
+#: conf/global_settings.py:62
+msgid "Dutch"
+msgstr "Голландский"
+
+#: conf/global_settings.py:63
+msgid "Norwegian"
+msgstr "Норвежский"
+
+#: conf/global_settings.py:64
+msgid "Polish"
+msgstr "Польский"
+
+#: conf/global_settings.py:65
+msgid "Portugese"
+msgstr "Португальский"
+
+#: conf/global_settings.py:66
+msgid "Brazilian"
+msgstr "Бразильский"
+
+#: conf/global_settings.py:67
+msgid "Romanian"
+msgstr "Румынский"
+
+#: conf/global_settings.py:68
+msgid "Russian"
+msgstr "Русский"
+
+#: conf/global_settings.py:69
+msgid "Slovak"
+msgstr "Словацкий"
+
+#: conf/global_settings.py:70
+msgid "Slovenian"
+msgstr "Словенский"
+
+#: conf/global_settings.py:71
+msgid "Serbian"
+msgstr "Сербский"
+
+#: conf/global_settings.py:72
+msgid "Swedish"
+msgstr "Шведский"
+
+#: conf/global_settings.py:73
+msgid "Tamil"
+msgstr "Тамиль"
+
+#: conf/global_settings.py:74
+msgid "Telugu"
+msgstr "Телугу"
+
+#: conf/global_settings.py:75
+msgid "Turkish"
+msgstr "Турецкий"
+
+#: conf/global_settings.py:76
+msgid "Ukrainian"
+msgstr "Украинский"
+
+#: conf/global_settings.py:77
+msgid "Simplified Chinese"
+msgstr "Упрощенный китайский"
+
+#: conf/global_settings.py:78
+msgid "Traditional Chinese"
+msgstr "Традиционный китайский"
+
+#: core/validators.py:64
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Значение должно состоять только из букв, цифр и знаков подчеркивания."
+
+#: core/validators.py:68
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Значение должно состоять только из букв, цифр, знаков подчеркивания, тире "
+"или наклонной черты вправо."
+
+#: core/validators.py:72
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr ""
+"Значение должно состоять только из букв, цифр, знаков подчеркивания "
+"или тире."
+
+#: core/validators.py:76
+msgid "Uppercase letters are not allowed here."
+msgstr "Заглавные буквы недопустимы."
+
+#: core/validators.py:80
+msgid "Lowercase letters are not allowed here."
+msgstr "Строчные буквы здесь недопустимы."
+
+#: core/validators.py:87
+msgid "Enter only digits separated by commas."
+msgstr "Введите цифры, разделённые запятыми."
+
+#: core/validators.py:99
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Введите правильные адреса электронной почты, разделённые запятыми."
+
+#: core/validators.py:103
+msgid "Please enter a valid IP address."
+msgstr "Пожалуйста, введите правильный IP-адрес."
+
+#: core/validators.py:107
+msgid "Empty values are not allowed here."
+msgstr "Пустое значение здесь недопустимо."
+
+#: core/validators.py:111
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Нецифровые символы здесь недопустимы."
+
+#: core/validators.py:115
+msgid "This value can't be comprised solely of digits."
+msgstr "Это значение не может быть составлено только из цифр."
+
+#: core/validators.py:120 newforms/fields.py:128
+msgid "Enter a whole number."
+msgstr "Введите целое число."
+
+#: core/validators.py:124
+msgid "Only alphabetical characters are allowed here."
+msgstr "Здесь разрешены только алфавитные символы."
+
+#: core/validators.py:139
+msgid "Year must be 1900 or later."
+msgstr "Год должен быть больше или равен 1900"
+
+#: core/validators.py:143
+msgid "Invalid date: %s"
+msgstr "неправильная дата: %s"
+
+#: core/validators.py:153
+msgid "Enter a valid time in HH:MM format."
+msgstr "Введите правильное время в формате HH:MM."
+
+#: core/validators.py:162 newforms/fields.py:273
+msgid "Enter a valid e-mail address."
+msgstr "Укажите правильный адрес электронной почты."
+
+#: core/validators.py:178
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Загрузите реальное изображение. Файл, который вы загрузили, не является "
+"изображением или был поврежден."
+
+#: core/validators.py:185
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "URL %s не указывает на реальное изображение."
+
+#: core/validators.py:189
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "Телефонные номера должен быть в формате XXX-XXX-XXXX. \"%s\" неверен."
+
+#: core/validators.py:197
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "URL %s не указывает на реальное видео QuickTime."
+
+#: core/validators.py:201
+msgid "A valid URL is required."
+msgstr "Правильный URL обязателен."
+
+#: core/validators.py:215
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Правильный HTML обязателен. Специфичные ошибки:\n"
+"%s"
+
+#: core/validators.py:222
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Неверный формат XML: %s"
+
+#: core/validators.py:239
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Неверный URL: %s"
+
+#: core/validators.py:244 core/validators.py:246
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "URL %s - сломанная ссылка."
+
+#: core/validators.py:252
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Введите правильную аббревиатуру штата США."
+
+#: core/validators.py:266
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Следите за своими словами! Слово %s здесь запрещено."
+msgstr[1] "Следите за своими словами! Слова %s здесь запрещены."
+msgstr[2] "Следите за своими словами! Слова %s здесь запрещены."
+
+#: core/validators.py:273
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Это поле должно совпадать с полем '%s'."
+
+#: core/validators.py:292
+msgid "Please enter something for at least one field."
+msgstr "Пожалуйста, заполните хотя бы одно поле."
+
+#: core/validators.py:301 core/validators.py:312
+msgid "Please enter both fields or leave them both empty."
+msgstr "Пожалуйста, заполните оба поля или оставьте их оба пустыми."
+
+#: core/validators.py:320
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Это поле должно быть заполнено, если %(field)s равно %(value)s"
+
+#: core/validators.py:333
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Это поле должно быть заполнено, если %(field)s не равно %(value)s"
+
+#: core/validators.py:352
+msgid "Duplicate values are not allowed."
+msgstr "Двойные значения запрещены."
+
+#: core/validators.py:367
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Это значение должно быть больше %(lower)s и меньше %(upper)s."
+
+#: core/validators.py:369
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Это значение должно быть не меньше %s."
+
+#: core/validators.py:371
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Это значение не должно быть больше %s."
+
+#: core/validators.py:407
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Это значение должно быть степенью %s."
+
+#: core/validators.py:418
+msgid "Please enter a valid decimal number."
+msgstr "Пожалуйста, введите корректное десятичное число."
+
+#: core/validators.py:422
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] ""
+"Пожалуйста, введите корректное десятичное число максимально с %s знаком."
+msgstr[1] ""
+"Пожалуйста, введите корректное десятичное число максимально с %s знаками."
+msgstr[2] ""
+"Пожалуйста, введите корректное десятичное число максимально с %s знаками."
+
+#: core/validators.py:425
+#, python-format
+msgid ""
+"Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural ""
+"Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] ""
+"Пожалуйста, введите корректное десятичное число с целой частью из  %s знака."
+msgstr[1] ""
+"Пожалуйста, введите корректное десятичное число с целой частью из %s знаков."
+msgstr[2] ""
+"Пожалуйста, введите корректное десятичное число с целой частью из %s знаков."
+
+#: core/validators.py:428
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] ""
+"Пожалуйста, введите корректное десятичное число максимально с %s знаком "
+"после запятой."
+msgstr[1] ""
+"Пожалуйста, введите корректное десятичное число максимально с %s знаками "
+"после запятой."
+msgstr[2] ""
+"Пожалуйста, введите корректное десятичное число максимально с %s знаками "
+"после запятой."
+
+#: core/validators.py:438
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Убедитесь, что загруженный файл не меньше %s байт."
+
+#: core/validators.py:439
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Убедитесь, что загруженный файл не больше %s байт."
+
+#: core/validators.py:456
+msgid "The format for this field is wrong."
+msgstr "Формат этого поля неверен."
+
+#: core/validators.py:471
+msgid "This field is invalid."
+msgstr "Это поле неверно."
+
+#: core/validators.py:507
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Невозможно получить ничего с %s."
+
+#: core/validators.py:510
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "URL %(url)s вернул неверный заголовок Content-Type '%(contenttype)s'."
+
+#: core/validators.py:543
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Пожалуйста, закройте незакрытый тэг %(tag)s на строке %(line)s. (Строка "
+"начинается с \"%(start)s\".)"
+
+#: core/validators.py:547
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Что-то из текста, начинающегося на строке %(line)s, недопустимо в том "
+"контексте. (Строка начинается с \"%(start)s\".)"
+
+#: core/validators.py:552
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"%(attr)s\" на строке %(line)s - неправильный атрибут. (Строка начинается с "
+"\"%(start)s\".)"
+
+#: core/validators.py:557
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\" на строке %(line)s - неправильный тег. (Строка начинается с \"%"
+"(start)s\".)"
+
+#: core/validators.py:561
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"В теге на строке %(line)s не хватает одного или более обязательных "
+"атрибутов. (Строка начинается с \"%(start)s\".)"
+
+#: core/validators.py:566
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Атрибут \"%(attr)s\" на строке %(line)s имеет недопустимое значение. (Строка "
+"начинается с \"%(start)s\".)"
+
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "Объект %(verbose_name)s был успешно создан."
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "Объект %(verbose_name)s был успешно изменен."
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "Объект %(verbose_name)s был успешно удален."
+
+#: newforms/models.py:165 newforms/fields.py:366
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Выберите корректный вариант. Вашего варианта нет среди допустимых"
+
+#: newforms/models.py:182 newforms/fields.py:382 newforms/fields.py:458
+msgid "Enter a list of values."
+msgstr "Укажите список занчений."
+
+#: newforms/models.py:188 newforms/fields.py:391
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Выберите корректный вариант.  %s нет среди допустимых значений."
+
+#: newforms/fields.py:103 newforms/fields.py:258
+#, python-format
+msgid "Ensure this value has at most %d characters."
+msgstr "Убедитесь, что значение содержит менее %d символов."
+
+#: newforms/fields.py:105 newforms/fields.py:260
+#, python-format
+msgid "Ensure this value has at least %d characters."
+msgstr "Убедитесь, что значение содержит более %d символов."
+
+#: newforms/fields.py:130
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Убедитесь что это значение меньше или равно %s."
+
+#: newforms/fields.py:132
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Убедитесь что это значение больше или равно %s"
+
+#: newforms/fields.py:166
+msgid "Enter a valid date."
+msgstr "Укажите дату  правильно."
+
+#: newforms/fields.py:194
+msgid "Enter a valid time."
+msgstr "Укажите время  правильно."
+
+#: newforms/fields.py:230
+msgid "Enter a valid date/time."
+msgstr "Укажите дату и время  правильно."
+
+#: newforms/fields.py:244
+msgid "Enter a valid value."
+msgstr "Укажите значение правильно"
+
+#: newforms/fields.py:291 newforms/fields.py:313
+msgid "Enter a valid URL."
+msgstr "Укажите правильный URL"
+
+#: newforms/fields.py:315
+msgid "This URL appears to be a broken link."
+msgstr "Этот URL похоже сломанная ссылка."
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "th"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "st"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "nd"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "rd"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:47
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f миллион"
+msgstr[1] "%(value).1f миллиона"
+msgstr[2] "%(value).1f миллионов"
+
+#: contrib/humanize/templatetags/humanize.py:50
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f миллиард"
+msgstr[1] "%(value).1f миллиарда"
+msgstr[2] "%(value).1f миллиардов"
+
+#: contrib/humanize/templatetags/humanize.py:53
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f триллион"
+msgstr[1] "%(value).1f триллиона"
+msgstr[2] "%(value).1f триллионов"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "one"
+msgstr "один"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "two"
+msgstr "два"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "three"
+msgstr "три"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "four"
+msgstr "четыре"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "five"
+msgstr "пять"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "six"
+msgstr "шесть"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "seven"
+msgstr "семь"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "eight"
+msgstr "восемь"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "nine"
+msgstr "девять"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "Перенаправить от"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Это должен быть абсолютный путь без доменного имени. Пример: '/events/"
+"search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "Перенаправить на"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Это должен быть абсолютный путь (как выше) или полный URL, начинающийся с "
+"'http://'."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "Перенаправление"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "Перенаправления"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "ID объекта"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "Заголовок"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "Комментарий"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "рейтинг №1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "рейтинг №2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "рейтинг №3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "рейтинг №4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "рейтинг №5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "рейтинг №6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "рейтинг №7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "рейтинг №8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "Допустимый рейтинг"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "Дата/время добавления"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "Публичный"
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:304
+msgid "IP address"
+msgstr "IP-адрес"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "Удален"
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Отметьте, если комментарий нежелателен. Сообщение \"Этот комментарий был "
+"удалён\" будет показано взамен."
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "Комментарии"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "Объект содержимого"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Добавил %(user)s %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "Имя человека"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "IP-адрес:"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "Одобрено администрацией"
+
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "Свободный комментарий"
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "Свободные комментарии"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "Счёт"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "Время счёта"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "Кармический счёт"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "Кармические счета"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d рейтинг пользователя %(user)s"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Этот комментарий был отмечен пользователем %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "Дата отметки"
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "Отметка пользователя"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "Отметки пользователя"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "Отмечен %r"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "Дата удаления"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "Удаление модератором"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "Удаления модератором"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Удаления модератора %r"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Анонимный пользователь не может голосовать"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "Неверный ID комментария"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "Нельзя голосовать за себя"
+
+#: contrib/comments/views/comments.py:27
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr ""
+"Этот рейтинг обязателен, так как вы уже ввели как минимум еще один рейтинг."
+
+#: contrib/comments/views/comments.py:111
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Этот комментарий сделан пользователем, который отправил меньше %(count)s "
+"комментария:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Этот комментарий сделан пользователем, который отправил меньше %(count)s "
+"комментариев:\n"
+"\n"
+"%(text)s"
+msgstr[2] ""
+"Этот комментарий сделан пользователем, который отправил меньше %(count)s "
+"комментариев:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:116
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Коментарий был добавлен недоверенным пользователем:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:188
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Разрешены только POSTы"
+
+#: contrib/comments/views/comments.py:192
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Одно или больше обязательных полей не были заполнены"
+
+#: contrib/comments/views/comments.py:196
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Кто-то вмешался в форму комментария (нарушение безопасности)"
+
+#: contrib/comments/views/comments.py:206
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"Форма комментария имела неверный параметр 'target' -- ID объекта неверен"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "Форма комментария не предоставила ни 'предпросмотр', ни 'отправить'"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Имя пользователя:"
+
+#: contrib/comments/templates/comments/freeform.html:5
+#: contrib/comments/templates/comments/form.html:28
+msgid "Comment:"
+msgstr "Комментарий:"
+
+#: contrib/comments/templates/comments/freeform.html:10
+#: contrib/comments/templates/comments/form.html:35
+msgid "Preview comment"
+msgstr "Предпросмотр комментария"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "Имя:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr "Выход"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Пароль:"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Забыли свой пароль?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Рейтинги"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Обязательное"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Необязательное"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Добавить фотографию"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "Доменное имя"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "Выводимое имя"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "Сайт"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "Сайты"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>По %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169
+msgid "All"
+msgstr "Все"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "За любую дату"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "Сегодня"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "Последние 7 дней"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "В этом месяце"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "В этом году"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "Время действия"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "id обьекта"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "Представление обьекта"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "Отметка действия"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "Изменить сообщение"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "Журнальная запись"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "Журнальные записи"
+
+#: contrib/admin/templatetags/admin_list.py:247
+msgid "All dates"
+msgstr "Все даты"
+
+#: contrib/admin/views/decorators.py:10 contrib/auth/forms.py:60
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Пожалуйста, введите верные имя пользователя и пароль. Помните, оба поля "
+"чувствительны к регистру."
+
+#: contrib/admin/views/decorators.py:24
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Вход"
+
+#: contrib/admin/views/decorators.py:62
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Пожалуйста, войдите снова, поскольку ваша сессия устарела. Не беспокойтесь: "
+"введенные вами данные сохранены."
+
+#: contrib/admin/views/decorators.py:69
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Похоже, ваш броузер не настроен на прием cookies. Пожалуйства, включите "
+"cookie, перезагрузите страницу и попытайтесь снова."
+
+#: contrib/admin/views/decorators.py:83
+msgid "Usernames cannot contain the '@' character."
+msgstr "Имя пользователя не может включать символ '@'."
+
+#: contrib/admin/views/decorators.py:85
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr ""
+"Ваш адрес электронной почты не является вашим именем пользователя. "
+"Попробуйте '%s' взамен."
+
+#: contrib/admin/views/auth.py:19 contrib/admin/views/main.py:257
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" был успешно добавлен."
+
+#: contrib/admin/views/auth.py:24 contrib/admin/views/main.py:261
+#: contrib/admin/views/main.py:347
+msgid "You may edit it again below."
+msgstr "Ниже можно снова редактировать его"
+
+#: contrib/admin/views/auth.py:30
+msgid "Add user"
+msgstr "Добавить пользователя"
+
+#: contrib/admin/views/auth.py:57
+msgid "Password changed successfully."
+msgstr "Пароль успешно обновлен"
+
+#: contrib/admin/views/auth.py:64
+msgid "Change password: %s"
+msgstr "Изменение пароля: %s"
+
+#: contrib/admin/views/main.py:223
+msgid "Site administration"
+msgstr "Администрирование сайта"
+
+#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356
+#, python-format
+msgid "You may add another %s below."
+msgstr "Вы можете добавить %s внизу."
+
+#: contrib/admin/views/main.py:289
+#, python-format
+msgid "Add %s"
+msgstr "Добавить %s"
+
+#: contrib/admin/views/main.py:335
+#, python-format
+msgid "Added %s."
+msgstr "Добавлен %s."
+
+#: contrib/admin/views/main.py:337
+#, python-format
+msgid "Changed %s."
+msgstr "Изменен %s."
+
+#: contrib/admin/views/main.py:339
+#, python-format
+msgid "Deleted %s."
+msgstr "Удален %s."
+
+#: contrib/admin/views/main.py:342
+msgid "No fields changed."
+msgstr "Ни одно поле не изменено."
+
+#: contrib/admin/views/main.py:345
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" был успешно изменен."
+
+#: contrib/admin/views/main.py:353
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s\" был успешно добавлен. Ниже можно снова редактировать "
+"его."
+
+#: contrib/admin/views/main.py:391
+#, python-format
+msgid "Change %s"
+msgstr "Изменить %s"
+
+#: contrib/admin/views/main.py:476
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Один или более  %(fieldname)s в %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:481
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Один или более %(fieldname)s в %(name)s:"
+
+#: contrib/admin/views/main.py:514
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" был успешно удален."
+
+#: contrib/admin/views/main.py:517
+msgid "Are you sure?"
+msgstr "Вы уверены?"
+
+#: contrib/admin/views/main.py:539
+#, python-format
+msgid "Change history: %s"
+msgstr "История изменений: %s"
+
+#: contrib/admin/views/main.py:573
+#, python-format
+msgid "Select %s"
+msgstr "Выберите %s"
+
+#: contrib/admin/views/main.py:573
+msgid "Select %s to change"
+msgstr "Выберите %s для изменения"
+
+#: contrib/admin/views/main.py:768
+msgid "Database error"
+msgstr "Ошибка базы данных"
+
+#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48
+#: contrib/admin/views/doc.py:50
+msgid "tag:"
+msgstr "Тэг:"
+
+#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79
+#: contrib/admin/views/doc.py:81
+msgid "filter:"
+msgstr "Фильтр:"
+
+#: contrib/admin/views/doc.py:135 contrib/admin/views/doc.py:137
+#: contrib/admin/views/doc.py:139
+msgid "view:"
+msgstr "view:"
+
+#: contrib/admin/views/doc.py:164
+#, python-format
+msgid "App %r not found"
+msgstr "Приложение %r не найдено"
+
+#: contrib/admin/views/doc.py:171
+msgid "Model %(name)r not found in app %(label)r"
+msgstr "Модель %(name) не найдена в приложении %(label)r"
+
+#: contrib/admin/views/doc.py:183
+#, python-format
+msgid "the related `%(label)s.%(type)s` object"
+msgstr "зависимый `%(label)s.%(type)s` объект"
+
+#: contrib/admin/views/doc.py:183 contrib/admin/views/doc.py:205
+#: contrib/admin/views/doc.py:219 contrib/admin/views/doc.py:224
+msgid "model:"
+msgstr "модель:"
+
+#: contrib/admin/views/doc.py:214
+#, python-format
+msgid "related `%(label)s.%(name)s` objects"
+msgstr "зависимые `%(label)s.%(name)s` объекты"
+
+#: contrib/admin/views/doc.py:219
+msgid "all %s"
+msgstr "все %s"
+
+#: contrib/admin/views/doc.py:224
+#, python-format
+msgid "number of %s"
+msgstr "количество %s"
+
+#: contrib/admin/views/doc.py:229
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Поля для %s объектов"
+
+#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:301
+#: contrib/admin/views/doc.py:303 contrib/admin/views/doc.py:309
+#: contrib/admin/views/doc.py:310 contrib/admin/views/doc.py:312
+msgid "Integer"
+msgstr "Целое"
+
+#: contrib/admin/views/doc.py:292
+msgid "Boolean (Either True or False)"
+msgstr "Логическое (True или False)"
+
+#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:311
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "Строка (до %(maxlength)s символов)"
+
+#: contrib/admin/views/doc.py:294
+msgid "Comma-separated integers"
+msgstr "Целые, разделенные запятыми"
+
+#: contrib/admin/views/doc.py:295
+msgid "Date (without time)"
+msgstr "Дата (без указания времени)"
+
+#: contrib/admin/views/doc.py:296
+msgid "Date (with time)"
+msgstr "Дата (с указанием времени)"
+
+#: contrib/admin/views/doc.py:297
+msgid "E-mail address"
+msgstr "Адрес электронной почты"
+
+#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:299
+#: contrib/admin/views/doc.py:302
+msgid "File path"
+msgstr "Путь к файлу"
+
+#: contrib/admin/views/doc.py:300
+msgid "Decimal number"
+msgstr "Десятичное число"
+
+#: contrib/admin/views/doc.py:306
+msgid "Boolean (Either True, False or None)"
+msgstr "Логическое (True, False или None)"
+
+#: contrib/admin/views/doc.py:307
+msgid "Relation to parent model"
+msgstr "Связь с родительской моделью"
+
+#: contrib/admin/views/doc.py:308
+msgid "Phone number"
+msgstr "Номер телефона"
+
+#: contrib/admin/views/doc.py:313
+msgid "Text"
+msgstr "Текст"
+
+#: contrib/admin/views/doc.py:314
+msgid "Time"
+msgstr "Время"
+
+#: contrib/admin/views/doc.py:315 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:316
+msgid "U.S. state (two uppercase letters)"
+msgstr "Штат США (две заглавные буквы)"
+
+#: contrib/admin/views/doc.py:317
+msgid "XML text"
+msgstr "Текст XML"
+
+#: contrib/admin/views/doc.py:343
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s не похож на объект urlpattern"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Современно:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Изменить:"
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Дата:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Время:"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Документация"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin/auth/user/change_password.html:15
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "Изменение пароля"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/auth/user/change_password.html:12
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Начало"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "History"
+msgstr "История"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Дата/время"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Пользователь"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Действие"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "j N Y H:i"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Данный обьект не имеет истории изменений. Возможно, он был добавлен не через "
+"данный административный сайт."
+
+#: contrib/admin/templates/admin/change_list.html:12
+#, python-format
+msgid "Add %(name)s"
+msgstr "Добавить %(name)s"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " По %(filter_title)s "
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Ошибка сервера"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Ошибка сервера (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Ошибка сервера <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Произошла ошибка. Отчет об ошибке отправлен администраторам сайта по "
+"электронной почте, ошибка должна быть вскоре исправлена. Благодарим вас на "
+"терпение и помощь."
+
+#: contrib/admin/templates/admin/invalid_setup.html:8
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Неправильно настроена ваша даза данных. Убедитесь в том что соответсвующие  "
+"таблицы базы данных были созданы, а также в что что база данных читаема для "
+"соответсвующим пользователем."
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Вперёд"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 результат"
+msgstr[1] "%(counter)s результата"
+msgstr[2] "%(counter)s результатов"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s всего"
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Показать всё"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Административный сайт Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Администрирование Django"
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "Фильтр"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Страница не найдена"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "К сожалению, запрашиваемая вами страница не найдена."
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Модели доступны в приложении %(name)s."
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "Добавить"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Изменить"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Недостаточно прав для редактирования."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Последние действия"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Мои действия"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Недоступно"
+
+#: contrib/admin/templates/admin/change_form.html:22
+msgid "View on site"
+msgstr "Смотреть сайт"
+
+#: contrib/admin/templates/admin/change_form.html:32
+#: contrib/admin/templates/admin/auth/user/change_password.html:24
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Пожалуйста, исправьте ошибку ниже."
+msgstr[1] "Пожалуйста, исправьте ошибки ниже."
+msgstr[2] "Пожалуйста, исправьте ошибки ниже."
+
+#: contrib/admin/templates/admin/change_form.html:50
+msgid "Ordering"
+msgstr "Очерёдность"
+
+#: contrib/admin/templates/admin/change_form.html:53
+msgid "Order:"
+msgstr "Порядок:"
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "Добро пожаловать,"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Удалить"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#,  python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Удаление %(object_name)s '%(escaped_object)s' приведет к удалению  "
+"связанных объектов, но ваша учетная запись не имеет прав для удаления "
+"следующих типов объектов:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#,  python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Вы уверены, что хотите удалить %(object_name)s \"%(escaped_object)s\"? Все следующие "
+"связанные объекты также будут удалены:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Да, я уверен"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Сохранить как новое"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Сохранить и добавить другое"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Сохранить и продолжить редактирование"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Сохранить"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:28
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Введите новый пароль для пользователя <strong>%(username)s</strong>"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:34
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+msgid "Password"
+msgstr "Пароль"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+msgid "Password (again)"
+msgstr "Пароль (еще раз)"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+msgid "Enter the same password as above, for verification."
+msgstr "Введите тот же пароль что и сверху, для верификации"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Сначала введите имя пользователя и пароль. Затем вы сможете "
+"редактировать больше опций"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "Имя"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Изменение пароля"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Пароль успешно обновлен"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Ваш пароль был изменен."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Сброс пароля"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"Забыли пароль? Введите свой адрес электронной почты ниже, мы очистим ваш "
+"старый пароль и вышлем вам по e-mail новый."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Адрес электронной почты:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Очистка пароля"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Благодарим за проведенное вами сегодня время на этом сайте."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Повторный вход"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Успешная очистка пароля"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"Мы отправили новый пароль по указанному вами адресу электронной почты. "
+"Вскоре вы его получите."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"В целях безопасности, пожалуйста, введите свой старый пароль, затем - новый "
+"пароль дважды, с тем, чтобы мы могли убедиться в правильности написания."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Старый пароль:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Новый пароль:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Подтвердите пароль:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Изменение пароля"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Вы получили это сообщение, потому что была запрошена очистка пароля"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "Для вашей учетной записи на %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Ваш новый пароль: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Вы всегда можете изменить этот пароль, перейдя на страницу:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Ваше имя, на случай если вы его забыли:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Спасибо за посещение нашего сайта!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Команда сайта %(site_name)s"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Закладки"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "Закладки документации"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">Для установки закладок перетащите ссылку к себе на панель\n"
+"закладок или щелкните правой кнопкой мыши по ссылке и добавьте ее в "
+"закладки. Теперь у вас есть возможность\n"
+"выбрать закладку с любой страницы сайта. Обратите внимание: некоторые из "
+"этих\n"
+"закладок требуют, чтобы вы просматривали сайт с компьютера, определенного\n"
+"как \"внутренний\" (уточните у своего системного администратора, если не "
+"уверены, является ли\n"
+"ваш компьютер \"внутренним\").</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Документация по данной странице"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+"Перенаправляет вас с любой страницы к документации view, который генерирует "
+"эту страницу."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Показать ID обьекта"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Показывает тип наполнения и уникальный ID для страниц, представляющих один "
+"объект."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Редактировать данный обьект (в текущем окне)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+"Перейдет на административную страницу для страниц, представляющих один "
+"объект."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Редактировать данный обьект (в новом окне)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "То же что и выше, но откроет административную страницу в новом окне."
+
+#: contrib/contenttypes/models.py:36
+msgid "python model class name"
+msgstr "имя класса python модуля"
+
+#: contrib/contenttypes/models.py:39
+msgid "content type"
+msgstr "Тип содержимого"
+
+#: contrib/contenttypes/models.py:40
+msgid "content types"
+msgstr "Типы содержимого"
+
+#: contrib/auth/views.py:40
+msgid "Logged out"
+msgstr "Не авторизован"
+
+#: contrib/auth/models.py:44 contrib/auth/models.py:64
+msgid "name"
+msgstr "Имя"
+
+#: contrib/auth/models.py:46
+msgid "codename"
+msgstr "Кодовое название"
+
+#: contrib/auth/models.py:49
+msgid "permission"
+msgstr "Право"
+
+#: contrib/auth/models.py:50 contrib/auth/models.py:65
+msgid "permissions"
+msgstr "Права"
+
+#: contrib/auth/models.py:68
+msgid "group"
+msgstr "Группа"
+
+#: contrib/auth/models.py:69 contrib/auth/models.py:109
+msgid "groups"
+msgstr "Группы"
+
+#: contrib/auth/models.py:99
+msgid "username"
+msgstr "Имя пользователя"
+
+#: contrib/auth/models.py:99
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr ""
+"Необходимое поле. 30  символов или менее. Используйте только цифры, буквы "
+"и нижнее подчеркивание."
+
+#: contrib/auth/models.py:100
+msgid "first name"
+msgstr "Имя"
+
+#: contrib/auth/models.py:101
+msgid "last name"
+msgstr "Фамилия"
+
+#: contrib/auth/models.py:102
+msgid "e-mail address"
+msgstr "Адрес электронной почты"
+
+#: contrib/auth/models.py:103
+msgid "password"
+msgstr "Пароль"
+
+#: contrib/auth/models.py:103
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"Используйте '[algo]$[salt]$[hexdigest]' или <a href=\"password/\">change "
+"форма смены пароля</a>."
+
+#: contrib/auth/models.py:104
+msgid "staff status"
+msgstr "Статус персонала"
+
+#: contrib/auth/models.py:104
+msgid "Designates whether the user can log into this admin site."
+msgstr "Отметьте, если пользователь может входить в админ. часть сайта."
+
+#: contrib/auth/models.py:105
+msgid "active"
+msgstr "Активный"
+
+#: contrib/auth/models.py:105
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"Отметьте, если пользователь может входить в админ. часть сайта. Убирайте эту "
+"отметку вместо удаления аккаунта."
+
+#: contrib/auth/models.py:106
+msgid "superuser status"
+msgstr "Статус суперпользователя"
+
+#: contrib/auth/models.py:106
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr "Указывает, что пользователь имеет все права без явного их назначения"
+
+#: contrib/auth/models.py:107
+msgid "last login"
+msgstr "Последний вход"
+
+#: contrib/auth/models.py:108
+msgid "date joined"
+msgstr "Дата регистрации"
+
+#: contrib/auth/models.py:110
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"В добавление к правам, присвоенным вручную, этот пользователь получит все "
+"права групп, к которым он принадлежит."
+
+#: contrib/auth/models.py:111
+msgid "user permissions"
+msgstr "права пользователя"
+
+#: contrib/auth/models.py:115
+msgid "user"
+msgstr "Пользователь"
+
+#: contrib/auth/models.py:116
+msgid "users"
+msgstr "Пользователи"
+
+#: contrib/auth/models.py:122
+msgid "Personal info"
+msgstr "Персональная информация"
+
+#: contrib/auth/models.py:123
+msgid "Permissions"
+msgstr "Права"
+
+#: contrib/auth/models.py:124
+msgid "Important dates"
+msgstr "Важные даты"
+
+#: contrib/auth/models.py:125
+msgid "Groups"
+msgstr "Группы"
+
+#: contrib/auth/models.py:269
+msgid "message"
+msgstr "Сообщение"
+
+#: contrib/auth/models.py:282
+msgid "AnonymousUser"
+msgstr "Анонимный пользователь"
+
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr "Два поля с паролями не соответствуют"
+
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr "Пользователь с этим именем уже существует."
+
+#: contrib/auth/forms.py:53
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr "У вашего браузера не включены cookies. Cookies необходимы для входа."
+
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "Это учетная запись не активна"
+
+#: contrib/auth/forms.py:85
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr ""
+"Этот адрес электронной почты не связан ни с одной учетной записью. Вы уверены "
+"что вы зарегистрированы?"
+
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "Два поля 'Новый пароль' не одинаковы."
+
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Ваш старый пароль введен неправильно. пожалуйста введите правильно."
+
+#: contrib/localflavor/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
+msgstr "Укажите почтовый код. Необходим пробел между двумя частями почтового кода"
+
+#: contrib/localflavor/br/forms.py:18
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Введите Zip код в формате XXXXX-XXX."
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "Телефонные номера должен быть в формате XX-XXXX-XXXX. "
+
+#: contrib/localflavor/br/forms.py:72
+msgid "This field requires only numbers."
+msgstr "Это поле требует только числа."
+
+#: contrib/localflavor/br/forms.py:74
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr "Это поле требует 11 цифр или 14 символов."
+
+#: contrib/localflavor/br/forms.py:84
+msgid "Invalid CPF number."
+msgstr "неправильный CPF номер"
+
+#: contrib/localflavor/br/forms.py:106
+msgid "This field requires at least 14 digits"
+msgstr "Это поле требует не меньше 14 цифр."
+
+#: contrib/localflavor/br/forms.py:116
+msgid "Invalid CNPJ number."
+msgstr "Неправильный CNPJ номер."
+
+#: contrib/localflavor/fr/forms.py:17 contrib/localflavor/de/forms.py:16
+#: contrib/localflavor/fi/forms.py:14
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Укажите zip код в формате XXXXX."
+
+#: contrib/localflavor/jp/forms.py:21
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "Укажите почтовый код в формате XXXXXXX или XXX-XXXX."
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr "Хоккаидо"
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr "Аомори"
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr "Иватэ"
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr "Мияги"
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr "Акита"
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr "Ямагата"
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr "Фукушима"
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr "Ибакари"
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr "Точиги"
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr "Гунма"
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr "Сайтама"
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr "Чиба"
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr "Токио"
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr "Канагава"
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr "Яманаши"
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr "Нагано"
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr "Ниигата"
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr "Тояма"
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr "Ишикава"
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr "Фукуй"
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr "Гифу"
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr "Шизуока"
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr "Айчи"
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr "Ми"
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr "Шига"
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr "Киото"
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr "Осака"
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr "Хиого"
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr "Нара"
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr "Вакаяма"
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr "Тоттори"
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr "Шимане"
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr "Окаяма"
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr "Хиросима"
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr "Ямагучи"
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr "Токушима"
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr "Кагава"
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr "Ехиме"
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr "Кочи"
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr "Фукуока"
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr "Сага"
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr "Нагасаки"
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr "Миязаки"
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Кагосима"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr "Окинава"
+
+#: contrib/localflavor/au/forms.py:18
+msgid "Enter a 4 digit post code."
+msgstr "Укажите 4 цифровой почтовый код."
+
+#: contrib/localflavor/us/forms.py:18
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr ""
+
+#: contrib/localflavor/us/forms.py:51
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:7
+#, fuzzy
+msgid "Berlin"
+msgstr "Бразильский"
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:10
+#, fuzzy
+msgid "Hamburg"
+msgstr "авг"
+
+#: contrib/localflavor/de/de_states.py:11
+#, fuzzy
+msgid "Hessen"
+msgstr "Сообщение"
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr ""
+
+#: contrib/localflavor/de/forms.py:60
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr ""
+
+#: contrib/localflavor/it/forms.py:16
+msgid "Enter a valid zip code."
+msgstr "Укажите правильный zip код"
+
+#: contrib/localflavor/it/forms.py:41
+#, fuzzy
+msgid "Enter a valid Social Security number."
+msgstr "Укажите правильное имя файла."
+
+#: contrib/localflavor/it/forms.py:68
+#, fuzzy
+msgid "Enter a valid VAT number."
+msgstr "Укажите правильное имя файла."
+
+#: contrib/localflavor/no/forms.py:15 contrib/localflavor/ch/forms.py:18
+#, fuzzy
+msgid "Enter a zip code in the format XXXX."
+msgstr "Введите правильное время в формате HH:MM."
+
+#: contrib/localflavor/no/forms.py:36
+#, fuzzy
+msgid "Enter a valid Norwegian social security number."
+msgstr "Пожалуйста, введите корректное десятичное число."
+
+#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:45
+#, fuzzy
+msgid "Enter a valid Finnish social security number."
+msgstr "Укажите правильное имя файла."
+
+#: contrib/localflavor/is_/forms.py:16
+msgid ""
+"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr "Укажите правильный исландский идентификатор. Формат XXXXXX-XXXX"
+
+#: contrib/localflavor/is_/forms.py:30
+msgid "The Icelandic identification number is not valid."
+msgstr "Исландский идентификационный номер не правилен"
+
+#: contrib/localflavor/cl/forms.py:21
+msgid "Enter valid a Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr ""
+
+#: contrib/localflavor/cl/forms.py:26
+#, fuzzy
+msgid "Enter valid a Chilean RUT"
+msgstr "Укажите правильное имя файла."
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:10
+#, fuzzy
+msgid "Berne"
+msgstr "Имя пользователя"
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:13
+#, fuzzy
+msgid "Glarus"
+msgstr "Группы"
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:16
+#, fuzzy
+msgid "Lucerne"
+msgstr "Имя пользователя"
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:24
+#, fuzzy
+msgid "Thurgau"
+msgstr "Четверг"
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:29
+#, fuzzy
+msgid "Zug"
+msgstr "авг"
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr ""
+
+#: contrib/localflavor/ch/forms.py:90
+msgid ""
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
+msgstr ""
+
+#: contrib/sessions/models.py:68
+msgid "session key"
+msgstr "Ключ сессии"
+
+#: contrib/sessions/models.py:69
+msgid "session data"
+msgstr "Данные сессии"
+
+#: contrib/sessions/models.py:70
+msgid "expire date"
+msgstr "Дата окончания"
+
+#: contrib/sessions/models.py:74
+msgid "session"
+msgstr "Сессия"
+
+#: contrib/sessions/models.py:75
+msgid "sessions"
+msgstr "Сессии"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Пример: '/about/contact/'. Убедитесь что вставили завершающий слэш."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "Заголовок"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "Содержимое"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "Активировать комментарии"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "Имя шаблона"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"Пример: 'flatpages/contact_page'. Если этот файл не присутствует, система "
+"будет использовать 'flatpages/default.html'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "Регистрация обязательна"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Если отмечено, только вошедшие пользователи смогут видеть страницу."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "Простая страница"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "Простые страницы"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Понедельник"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Вторник"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Среда"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Четверг"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Пятница"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Суббота"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Воскресенье"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Январь"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Февраль"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "Март"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "Апрель"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "Май"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "Июнь"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "Июль"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "Август"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "Сентябрь"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Октябрь"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "Ноябрь"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "Декабрь"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr "янв"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "фев"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "мар"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "апр"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "май"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "июнь"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "июль"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "авг"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "сен"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "окт"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "нояб"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "дек"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "янв."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "фев."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "авг."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "сен."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "окт."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "нояб."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "дек."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "год"
+msgstr[1] "года"
+msgstr[2] "лет"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "месяц"
+msgstr[1] "месяца"
+msgstr[2] "месяцев"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "неделя"
+msgstr[1] "недели"
+msgstr[2] "недель"
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "день"
+msgstr[1] "дня"
+msgstr[2] "дней"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "час"
+msgstr[1] "часа"
+msgstr[2] "часов"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "минута"
+msgstr[1] "минуты"
+msgstr[2] "минут"
+
+#: utils/timesince.py:40
+#, python-format
+msgid "%d milliseconds"
+msgstr "%d милисекунд"
+
+#: utils/timesince.py:41
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr ""
+
+#: utils/timesince.py:47
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ""
+
+#: utils/dateformat.py:40
+msgid "p.m."
+msgstr ""
+
+#: utils/dateformat.py:41
+msgid "a.m."
+msgstr ""
+
+#: utils/dateformat.py:46
+msgid "PM"
+msgstr ""
+
+#: utils/dateformat.py:47
+msgid "AM"
+msgstr ""
+
+#: utils/dateformat.py:95
+msgid "midnight"
+msgstr "полночь"
+
+#: utils/dateformat.py:97
+msgid "noon"
+msgstr "полдень"
+
+#: utils/translation/trans_real.py:358
+msgid "DATE_FORMAT"
+msgstr "d.m.Y"
+
+#: utils/translation/trans_real.py:359
+msgid "DATETIME_FORMAT"
+msgstr "d.m.Y H:i"
+
+#: utils/translation/trans_real.py:360
+msgid "TIME_FORMAT"
+msgstr "H:i"
+
+#: utils/translation/trans_real.py:376
+msgid "YEAR_MONTH_FORMAT"
+msgstr "d.m.Y"
+
+#: utils/translation/trans_real.py:377
+msgid "MONTH_DAY_FORMAT"
+msgstr "d.m.Y"
+
+#: template/defaultfilters.py:491
+msgid "yes,no,maybe"
+msgstr "да,нет,может быть"
+
+#: template/defaultfilters.py:520
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d байт"
+msgstr[1] "%(size)d байта"
+msgstr[2] "%(size)d байт"
+
+#: template/defaultfilters.py:522
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f Кб"
+
+#: template/defaultfilters.py:524
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f Мб"
+
+#: template/defaultfilters.py:525
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f Гб"
+
+#~ msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+#~ msgstr "Вы <a href=\"/password_reset/\">забыли пароль</a>?"
+
+#~ msgid "Use '[algo]$[salt]$[hexdigest]'"
+#~ msgstr "Используйте '[algo]$[salt]$[hexdigest]'"
+
+#: contrib/auth/forms.py:18
+msgid "Password confirmation"
+msgstr "Подтверждение пароля"
diff --git a/webapp/django/conf/locale/ru/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/ru/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..a57a57e
--- /dev/null
+++ b/webapp/django/conf/locale/ru/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/ru/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/ru/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..2e032c2
--- /dev/null
+++ b/webapp/django/conf/locale/ru/LC_MESSAGES/djangojs.po
@@ -0,0 +1,111 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-03-01 17:11+0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "Доступные %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Выбрать все"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Добавить"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Удалить"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Выбранные %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Выберите и нажмите "
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Очистить всё"
+
+#: contrib/admin/media/js/dateparse.js:26
+#: contrib/admin/media/js/calendar.js:24
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Январь Февраль Март Апрель Май Июнь Июль Август Сентябрь Октябрь Ноябрь "
+"Декабрь"
+
+#: contrib/admin/media/js/dateparse.js:27
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Воскресенье Понедельник Вторник Среда Четверг Пятница Суббота"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "В П В С Ч П С"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "Сейчас"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "Часы"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "Выберите время"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "Полночь"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "6 часов"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "Полдень"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "Отмена"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "Сегодня"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "Календарь"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "Вчера"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "Завтра"
diff --git a/webapp/django/conf/locale/sk/LC_MESSAGES/django.mo b/webapp/django/conf/locale/sk/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..b52cb26
--- /dev/null
+++ b/webapp/django/conf/locale/sk/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/sk/LC_MESSAGES/django.po b/webapp/django/conf/locale/sk/LC_MESSAGES/django.po
new file mode 100644
index 0000000..1e5bf89
--- /dev/null
+++ b/webapp/django/conf/locale/sk/LC_MESSAGES/django.po
@@ -0,0 +1,3385 @@
+# translation of django.po to Slovak
+#
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-07-24 09:56-0400\n"
+"PO-Revision-Date: 2007-06-22 20:54-0400\n"
+"Last-Translator: Vlado <vlado@labath.org>\n"
+"Language-Team: Slovak <sk@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: oldforms/__init__.py:369 db/models/fields/__init__.py:152
+#: db/models/fields/__init__.py:309 db/models/fields/__init__.py:706
+#: db/models/fields/__init__.py:717 newforms/models.py:187
+#: newforms/fields.py:92 newforms/fields.py:440 newforms/fields.py:516
+#: newforms/fields.py:527
+msgid "This field is required."
+msgstr "Toto pole je povinné."
+
+#: oldforms/__init__.py:404
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Uisite sa, že text je kratší ako %s znak."
+msgstr[1] "Uisite sa, že text je kratší ako %s znakov."
+
+#: oldforms/__init__.py:409
+msgid "Line breaks are not allowed here."
+msgstr "Zalomenia riadkov nie sú povolené."
+
+#: oldforms/__init__.py:507 oldforms/__init__.py:581 oldforms/__init__.py:620
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Vyberte platnú možnosť; '%(data)s' nie je v %(choices)s."
+
+#: oldforms/__init__.py:587 newforms/widgets.py:181
+#: contrib/admin/filterspecs.py:152
+msgid "Unknown"
+msgstr "Neznámy"
+
+#: oldforms/__init__.py:587 newforms/widgets.py:181
+#: contrib/admin/filterspecs.py:145
+msgid "Yes"
+msgstr "Áno"
+
+#: oldforms/__init__.py:587 newforms/widgets.py:181
+#: contrib/admin/filterspecs.py:145
+msgid "No"
+msgstr "Nie"
+
+#: oldforms/__init__.py:682 core/validators.py:181 core/validators.py:461
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+"Súbor nebol odoslaný. Skontrolujte atribút 'enctype' encoding vo formulári."
+
+#: oldforms/__init__.py:684
+msgid "The submitted file is empty."
+msgstr "Odoslaný súbor je prázdný."
+
+#: oldforms/__init__.py:740
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Zadajte celé číslo s hodnotou medzi -32768 a 32767."
+
+#: oldforms/__init__.py:750
+msgid "Enter a positive number."
+msgstr "Zadajte celé kladné číslo."
+
+#: oldforms/__init__.py:760
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Zadajte celé číslo s hodnotou medzi 0 a 32767."
+
+#: db/models/manipulators.py:309
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(object)s s %(type)s už existuje pre prvok  %(field)s."
+
+#: db/models/manipulators.py:310 contrib/admin/views/main.py:342
+#: contrib/admin/views/main.py:344 contrib/admin/views/main.py:346
+msgid "and"
+msgstr "a"
+
+#: db/models/fields/__init__.py:48
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s s %(fieldname)s už existuje."
+
+#: db/models/fields/__init__.py:404
+msgid "This value must be an integer."
+msgstr "Táto hodnota musí byť celé číslo."
+
+#: db/models/fields/__init__.py:439
+msgid "This value must be either True or False."
+msgstr "Táto hodnota musí byť True alebo False."
+
+#: db/models/fields/__init__.py:460
+msgid "This field cannot be null."
+msgstr "Toto pole nemôže obsahovať null."
+
+#: db/models/fields/__init__.py:494 core/validators.py:155
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Zadajte platný dátum vo formáte RRRR-MM-DD."
+
+#: db/models/fields/__init__.py:563 core/validators.py:164
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Zadajte platný dátum a čas vo formáte RRRR-MM-DD HH:MM."
+
+#: db/models/fields/__init__.py:623
+msgid "This value must be a decimal number."
+msgstr "Táto hodnota musí byť desiatkove číslo."
+
+#: db/models/fields/__init__.py:726
+msgid "Enter a valid filename."
+msgstr "Zadajte platný názov súboru."
+
+#: db/models/fields/__init__.py:851
+msgid "This value must be either None, True or False."
+msgstr "Táto hodnota musí byť buď None, True alebo False."
+
+#: db/models/fields/related.py:55
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Prosím, zadajte platné %s."
+
+#: db/models/fields/related.py:661
+msgid "Separate multiple IDs with commas."
+msgstr "Oddeľte viacnásobné ID čiarkami."
+
+#: db/models/fields/related.py:663
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Ak chcete vybrať viacero možností, podržte \"Control\" alebo \"Command\" na "
+"Mac-u."
+
+#: db/models/fields/related.py:710
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "Prosím, vložte platné %(self)s ID. Hodnota %(value)r je neplatná."
+msgstr[1] ""
+"Prosím, vložte platné %(self)s ID-čka. Hodnoty %(value)r sú neplatné."
+
+#: conf/global_settings.py:38
+msgid "Arabic"
+msgstr "Arabsky"
+
+#: conf/global_settings.py:39
+msgid "Bengali"
+msgstr "Bengálsky"
+
+#: conf/global_settings.py:40
+msgid "Bulgarian"
+msgstr "Bulharský"
+
+#: conf/global_settings.py:41
+msgid "Catalan"
+msgstr "Katalánsky"
+
+#: conf/global_settings.py:42
+msgid "Czech"
+msgstr "Česky"
+
+#: conf/global_settings.py:43
+msgid "Welsh"
+msgstr "Welšsky"
+
+#: conf/global_settings.py:44
+msgid "Danish"
+msgstr "Dánsky"
+
+#: conf/global_settings.py:45
+msgid "German"
+msgstr "Nemecky"
+
+#: conf/global_settings.py:46
+msgid "Greek"
+msgstr "Grécky"
+
+#: conf/global_settings.py:47
+msgid "English"
+msgstr "Anglicky"
+
+#: conf/global_settings.py:48
+msgid "Spanish"
+msgstr "Španielsky"
+
+#: conf/global_settings.py:49
+msgid "Argentinean Spanish"
+msgstr "Argentínska španielčina"
+
+#: conf/global_settings.py:50
+msgid "Persian"
+msgstr "Perzský"
+
+#: conf/global_settings.py:51
+msgid "Finnish"
+msgstr "Fínsky"
+
+#: conf/global_settings.py:52
+msgid "French"
+msgstr "Francúzsky"
+
+#: conf/global_settings.py:53
+msgid "Galician"
+msgstr "Galicijsky"
+
+#: conf/global_settings.py:54
+msgid "Hungarian"
+msgstr "Maďarsky"
+
+#: conf/global_settings.py:55
+msgid "Hebrew"
+msgstr "Hebrejsky"
+
+#: conf/global_settings.py:56
+msgid "Icelandic"
+msgstr "Islandsky"
+
+#: conf/global_settings.py:57
+msgid "Italian"
+msgstr "Taliansky"
+
+#: conf/global_settings.py:58
+msgid "Japanese"
+msgstr "Japonsky"
+
+#: conf/global_settings.py:59
+msgid "Korean"
+msgstr "Korejský"
+
+#: conf/global_settings.py:60
+msgid "Kannada"
+msgstr "Kannada"
+
+#: conf/global_settings.py:61
+msgid "Latvian"
+msgstr "Lotyšsky"
+
+#: conf/global_settings.py:62
+msgid "Macedonian"
+msgstr "Mecedónsky"
+
+#: conf/global_settings.py:63
+msgid "Dutch"
+msgstr "Holandsky"
+
+#: conf/global_settings.py:64
+msgid "Norwegian"
+msgstr "Nórsky"
+
+#: conf/global_settings.py:65
+msgid "Polish"
+msgstr "Poľsky"
+
+#: conf/global_settings.py:66
+msgid "Portugese"
+msgstr "Portugalsky"
+
+#: conf/global_settings.py:67
+msgid "Brazilian"
+msgstr "Brazílsky"
+
+#: conf/global_settings.py:68
+msgid "Romanian"
+msgstr "Rumunsky"
+
+#: conf/global_settings.py:69
+msgid "Russian"
+msgstr "Rusky"
+
+#: conf/global_settings.py:70
+msgid "Slovak"
+msgstr "Slovensky"
+
+#: conf/global_settings.py:71
+msgid "Slovenian"
+msgstr "Slovinsky"
+
+#: conf/global_settings.py:72
+msgid "Serbian"
+msgstr "Srbsky"
+
+#: conf/global_settings.py:73
+msgid "Swedish"
+msgstr "Švédsky"
+
+#: conf/global_settings.py:74
+msgid "Tamil"
+msgstr "Tamilsky"
+
+#: conf/global_settings.py:75
+msgid "Telugu"
+msgstr "Telugu"
+
+#: conf/global_settings.py:76
+msgid "Turkish"
+msgstr "Turecky"
+
+#: conf/global_settings.py:77
+msgid "Ukrainian"
+msgstr "Ukrajinsky"
+
+#: conf/global_settings.py:78
+msgid "Simplified Chinese"
+msgstr "Čínsky (zjednodušene)"
+
+#: conf/global_settings.py:79
+msgid "Traditional Chinese"
+msgstr "Čínsky (tradične)"
+
+#: core/validators.py:71
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Táto hodnota môže obsahovať len písmená, číslice a podčiarkovníky."
+
+#: core/validators.py:75
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Táto hodnota môže obsahovať len písmena, číslice, podčiarkovniky, pomlčky a "
+"lomítka."
+
+#: core/validators.py:79
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr ""
+"Táto hodnota môže obsahovať len písmená, číslice, počiarkovníky a pomlčky."
+
+#: core/validators.py:83
+msgid "Uppercase letters are not allowed here."
+msgstr "Veľké písmená nie sú povolené."
+
+#: core/validators.py:87
+msgid "Lowercase letters are not allowed here."
+msgstr "Malé písmena nie sú povolené."
+
+#: core/validators.py:94
+msgid "Enter only digits separated by commas."
+msgstr "Zadávajte len číslice oddelené čiarkami."
+
+#: core/validators.py:106
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Zadajte platné e-mailové adresy oddelené čiarkami."
+
+#: core/validators.py:110
+msgid "Please enter a valid IP address."
+msgstr "Prosím, zadajte platnú IP adresu."
+
+#: core/validators.py:114
+msgid "Empty values are not allowed here."
+msgstr "Prázdne hodnoty tu nie sú povolené."
+
+#: core/validators.py:118
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Iné ako numerické znaky tu nie sú povolené."
+
+#: core/validators.py:122
+msgid "This value can't be comprised solely of digits."
+msgstr "Táto hodnota nemôže byť čisto numerická."
+
+#: core/validators.py:127 newforms/fields.py:141
+msgid "Enter a whole number."
+msgstr "Zadajte celé číslo."
+
+#: core/validators.py:131
+msgid "Only alphabetical characters are allowed here."
+msgstr "Tu sú povolené len alfanumerické znaky."
+
+#: core/validators.py:146
+msgid "Year must be 1900 or later."
+msgstr "Rok musí byť 1900 alebo neskôr."
+
+#: core/validators.py:150
+#, python-format
+msgid "Invalid date: %s"
+msgstr "Neplatný dátum: %s"
+
+#: core/validators.py:160
+msgid "Enter a valid time in HH:MM format."
+msgstr "Zadajte platný čas vo formáte HH:MM."
+
+#: core/validators.py:169 newforms/fields.py:335
+msgid "Enter a valid e-mail address."
+msgstr "Zadajte platnú e-mailovú adresu."
+
+#: core/validators.py:185
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Nahrajte platný obrázok. Súbor, ktorý ste odoslali nebol obrázkový formát "
+"alebo bol poškodený."
+
+#: core/validators.py:192
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "URL %s neodkazuje na platný obrázok."
+
+#: core/validators.py:196
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Telefónne číslo musí mať formát XXX-XXX-XXXX. Číslo \"%s\" je neplatné."
+
+#: core/validators.py:204
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "URL %s neodkazuje na platné QuickTime video."
+
+#: core/validators.py:208
+msgid "A valid URL is required."
+msgstr "Je požadovaná platná adresa URL."
+
+#: core/validators.py:222
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"HTML kód musí zodpovedať špecifikácii. Zistené chyby sú:\n"
+"%s"
+
+#: core/validators.py:229
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Chybné XML nezodpovedajúce definícii: %s"
+
+#: core/validators.py:246
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Neplatná adresa URL: %s"
+
+#: core/validators.py:251 core/validators.py:253
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "Odkaz na URL %s je neplatný."
+
+#: core/validators.py:259
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Zadajte platnú skratku štátu USA."
+
+#: core/validators.py:273
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Vyjadrujte sa slušne! Slovo %s tu nie je dovolené použivať."
+msgstr[1] "Vyjadrujte sa slušne! Slová %s tu nie je dovolené použivať."
+
+#: core/validators.py:280
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Toto pole sa musí zhodovať s poľom '%s'. "
+
+#: core/validators.py:299
+msgid "Please enter something for at least one field."
+msgstr "Prosím, vyplňte aspoň jedno pole."
+
+#: core/validators.py:308 core/validators.py:319
+msgid "Please enter both fields or leave them both empty."
+msgstr "Prosím, vyplňte buď obidve polia, alebo ich nechajte prázdne."
+
+#: core/validators.py:327
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Toto pole musí byť vyplnené ak, %(field)s je %(value)s"
+
+#: core/validators.py:340
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Toto pole musí byť vyplnené, ak %(field)s nie je %(value)s"
+
+#: core/validators.py:359
+msgid "Duplicate values are not allowed."
+msgstr "Duplicitné hodnoty nie sú povolené."
+
+#: core/validators.py:374
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Táto hodnota musí byť medzi %(lower)s a %(upper)s."
+
+#: core/validators.py:376
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Táto hodnota musí byť prinajmenšom %s."
+
+#: core/validators.py:378
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Táto hodnota musí byť väčšia ako %s."
+
+#: core/validators.py:414
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Táto hodnota musí byť mocninou  %s."
+
+#: core/validators.py:424
+msgid "Please enter a valid decimal number."
+msgstr "Prosím, vložte platné desatinné číslo. "
+
+#: core/validators.py:431
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Prosím, vložte platné desatinné číslo. "
+msgstr[1] "Prosím, vložte platné desatinné čísla. "
+
+#: core/validators.py:434
+#, python-format
+msgid ""
+"Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural ""
+"Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] "Prosím vlož platné desatinné číslo s najviac %s číslicou. "
+msgstr[1] "Prosím vlož platné desatinné číslo s najviac %s číslicami."
+
+#: core/validators.py:437
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] ""
+"Prosím, vložte platné desatinné číslo s najviac %s desatinným miestom. "
+msgstr[1] ""
+"Prosím, vložte platné desatinné číslo s najviac %s desatinnými miestamy. "
+
+#: core/validators.py:445
+msgid "Please enter a valid floating point number."
+msgstr "Prosím, vložte platné  číslo s pohyblivou desatinnou čiarkou. "
+
+#: core/validators.py:454
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Uistite sa, že posielaný súbor nemá menej ako %s bajtov."
+
+#: core/validators.py:455
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Uistite sa, že posielaný súbor nemá viac ako %s bajtov."
+
+#: core/validators.py:472
+msgid "The format for this field is wrong."
+msgstr "Formát pre toto pole je chybný."
+
+#: core/validators.py:487
+msgid "This field is invalid."
+msgstr "Toto pole nie je platné."
+
+#: core/validators.py:523
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Z %s nič neprišlo."
+
+#: core/validators.py:526
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"Adresa URL %(url)s vrátila v hlavičke neplatný Content-Type '%(contenttype)"
+"s'."
+
+#: core/validators.py:559
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Prosím, uzatvorte tag %(tag)s na riadku %(line)s. (Riadok začína s \"%(start)"
+"s\".)"
+
+#: core/validators.py:563
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Text začínajúci na riadku %(line)s nie je povolený v tomto kontexte. (Riadok "
+"začína s \"%(start)s\".)"
+
+#: core/validators.py:568
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"%(attr)s\" na riadku %(line)s je neplatný atribút. (Riadok začína s \"%"
+"(start)s\".)"
+
+#: core/validators.py:573
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\" na riadku %(line)s je neplatný tag. (Riadok začína s \"%(start)"
+"s\".)"
+
+#: core/validators.py:577
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"V tagu na riadku %(line)s chýba jeden alebo viac atribútov. (Riadok začína s "
+"\"%(start)s\".)"
+
+#: core/validators.py:582
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Atribút \"%(attr)s\" na riadku %(line)s má neplatnú hodnotu. (Riadok začína "
+"s \"%(start)s\".)"
+
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "Objekt %(verbose_name)s bol úspešne vytvorený."
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "Objekt %(verbose_name)s bol úspešne zmenený."
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "Objekt %(verbose_name)s bol zmazaný."
+
+#: newforms/models.py:174 newforms/fields.py:428
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Vyberte platnú možnosť. Vybraná položka nepatrí medzi platné možnosti."
+
+#: newforms/models.py:191 newforms/fields.py:444 newforms/fields.py:520
+msgid "Enter a list of values."
+msgstr "Vložte zoznam hodnôt."
+
+#: newforms/models.py:197 newforms/fields.py:450
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Vyberte platnú možnost. %s nepatrí medzi dostupné možnosti."
+
+#: newforms/fields.py:116
+msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+msgstr "Uistite sa, že hodnota má najviac %d znakov( teraz má %(length)d)."
+
+#: newforms/fields.py:118
+msgid "Ensure this value has at least %(min)d characters (it has %(length)d)."
+msgstr "Uistite sa, že zadaná hodnota nemá menej ako %d znakov ( teraz má %(length)d)."
+
+#: newforms/fields.py:143 newforms/fields.py:166 newforms/fields.py:196
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Uistite sa, že táto hodnota je menšia alebo rovná %s."
+
+#: newforms/fields.py:145 newforms/fields.py:168 newforms/fields.py:198
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Uistite sa, že hodnota je väčšia alebo rovná %s."
+
+#: newforms/fields.py:164 newforms/fields.py:191
+msgid "Enter a number."
+msgstr "Zadajte číslo."
+
+#: newforms/fields.py:200
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr "Zabezpečte aby výraz nemal  celkom viac ako %s číslic ."
+
+#: newforms/fields.py:202
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr "Zabezpečte aby nebolo viac ako %s desatinných miest."
+
+#: newforms/fields.py:204
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr "Zabezpečte aby nebolo viac ako %s číslic pred desatinnou bodkou."
+
+#: newforms/fields.py:237 newforms/fields.py:560
+msgid "Enter a valid date."
+msgstr "Zadajte platný dátum."
+
+#: newforms/fields.py:264 newforms/fields.py:562
+msgid "Enter a valid time."
+msgstr "Zadajte platný čas."
+
+#: newforms/fields.py:300
+msgid "Enter a valid date/time."
+msgstr "Zadajte platný dátum a čas."
+
+#: newforms/fields.py:313
+msgid "Enter a valid value."
+msgstr "Zadajte platnú hodnotu."
+
+#: newforms/fields.py:353 newforms/fields.py:375
+msgid "Enter a valid URL."
+msgstr "Zadajte platnú adresu URL."
+
+#: newforms/fields.py:377
+msgid "This URL appears to be a broken link."
+msgstr "Odkaz na URL neexistuje."
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "th"
+msgstr "th"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "st"
+msgstr "st"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "nd"
+msgstr "nd"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "rd"
+msgstr "rd"
+
+#: contrib/humanize/templatetags/humanize.py:47
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f milión"
+msgstr[1] "%(value).1f milión"
+
+#: contrib/humanize/templatetags/humanize.py:50
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f miliarda"
+msgstr[1] "%(value).1f miliarda"
+
+#: contrib/humanize/templatetags/humanize.py:53
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f bilión"
+msgstr[1] "%(value).1f bilión"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "one"
+msgstr "jeden"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "two"
+msgstr "dva"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "three"
+msgstr "tri"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "four"
+msgstr "štyri"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "five"
+msgstr "päť"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "six"
+msgstr "šesť"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "seven"
+msgstr "sedem"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "eight"
+msgstr "osem"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "nine"
+msgstr "deväť"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "presmerovať z"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Tu by sa mala použiť absolútna cesta bez názvu domény. Napríklad: '/events/"
+"search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "presmerovať na "
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Tu môže byť buď absolútna cesta (ako je uvedené vyššie) alebo úplná adresa "
+"URL začínajúca s 'http://'."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "presmerovanie"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "presmerovania"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "ID objektu"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "nadpis"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "komentár"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "hodnotenie #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "hodnotenie #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "hodnotenie #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "hodnotenie #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "hodnotenie #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "hodnotenie #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "hodnotenie #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "hodnotenie #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "je platné hodnotenie"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "dátum a čas odoslania"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "je verejný"
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:306
+msgid "IP address"
+msgstr "IP adresa"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "je vymazaný"
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Zaškrtnite toto pole, ak je komentár nevhodný. Správa \"Tento komenár bol "
+"zmazaný\" sa bude zobrazovať namiesto neho."
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "komentáre"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "Obsah objektu"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Pridaný užívateľom %(user)s dňa %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "meno osoby"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "ip adresa"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "schválený  zamestnancom"
+
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "voľný komentár"
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "voľné komentáre"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "stav skóre"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "dátum stavu skóre"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "karma"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "karma"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d od hodnotiteľa %(user)s"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Tento komentár bol označený užívateľom  %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "označený dátum"
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "uživateľský príznak"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "užívateľské príznaky"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr " %r návestie"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "dátum zmazania"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "zmazania moderátorom"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "Zmazané moderátorom"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Zmazanané moderátorom %r"
+
+#: contrib/comments/views/karma.py:20
+msgid "Anonymous users cannot vote"
+msgstr "Hlasovať môžu len prihlásení užívatelia"
+
+#: contrib/comments/views/karma.py:24
+msgid "Invalid comment ID"
+msgstr "Chybné ID komentára"
+
+#: contrib/comments/views/karma.py:26
+msgid "No voting for yourself"
+msgstr "Nemôžete hlasovať za samého seba"
+
+#: contrib/comments/views/comments.py:28
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr "Toto hlasovanie je nevyhnutné, lebo súvisí s predchádzjúcou voľbou."
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Tento komentár je od užívateľa, ktorý  poslal menej ako  %(count)s "
+"príspevok\n"
+"%(text)s"
+msgstr[1] ""
+"Tento komentár je od užívateľa, ktorý poslal menej ako  %(count)s "
+"príspevkov .\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Tento komentár je od užívateľa, ktorý sa rád vyjadruje v náznakoch:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:281
+msgid "Only POSTs are allowed"
+msgstr "Dovolené sú len POST"
+
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:285
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Jedno alebo viac povinných polí nebolo vložených"
+
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:287
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr ""
+"Niekto sa pokúšal manipulovať s formulárom komentára (porušenie bezpečnosti)"
+
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:293
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"Formulár komentára ma chybný 'target' parameter  -- ID objektu je neplatné"
+
+#: contrib/comments/views/comments.py:258
+#: contrib/comments/views/comments.py:322
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr ""
+"Formulár komentára neobsahuje ani jednu z možností 'náhľad' alebo 'odoslať'."
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Tvoje meno:"
+
+#: contrib/comments/templates/comments/freeform.html:5
+#: contrib/comments/templates/comments/form.html:28
+msgid "Comment:"
+msgstr "Komentár:"
+
+#: contrib/comments/templates/comments/freeform.html:10
+#: contrib/comments/templates/comments/form.html:35
+msgid "Preview comment"
+msgstr "Náhľad komentára"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "Meno:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr "Odhlásenie"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Heslo:"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Zabudli ste heslo?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Hodnotenia"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Požadované"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Nepovinné"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Pošli foto"
+
+#: contrib/sites/models.py:15
+msgid "domain name"
+msgstr "názov domény"
+
+#: contrib/sites/models.py:16
+msgid "display name"
+msgstr "zobrazené meno"
+
+#: contrib/sites/models.py:20
+msgid "site"
+msgstr "web"
+
+#: contrib/sites/models.py:21
+msgid "sites"
+msgstr "weby"
+
+#: contrib/admin/filterspecs.py:42
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Od %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:72 contrib/admin/filterspecs.py:90
+#: contrib/admin/filterspecs.py:145 contrib/admin/filterspecs.py:171
+msgid "All"
+msgstr "Všetko"
+
+#: contrib/admin/filterspecs.py:111
+msgid "Any date"
+msgstr "Lubovoľný  dátum"
+
+#: contrib/admin/filterspecs.py:112
+msgid "Today"
+msgstr "Dnes"
+
+#: contrib/admin/filterspecs.py:115
+msgid "Past 7 days"
+msgstr "Posledných 7 dní"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This month"
+msgstr "Tento mesiac"
+
+#: contrib/admin/filterspecs.py:119
+msgid "This year"
+msgstr "Tento rok"
+
+#: contrib/admin/models.py:17
+msgid "action time"
+msgstr "čas udalosti"
+
+#: contrib/admin/models.py:20
+msgid "object id"
+msgstr "id objektu"
+
+#: contrib/admin/models.py:21
+msgid "object repr"
+msgstr "objekt repr"
+
+#: contrib/admin/models.py:22
+msgid "action flag"
+msgstr "príznak udalosti"
+
+#: contrib/admin/models.py:23
+msgid "change message"
+msgstr "zmeniť zprávu"
+
+#: contrib/admin/models.py:26
+msgid "log entry"
+msgstr "záznam priebehu"
+
+#: contrib/admin/models.py:27
+msgid "log entries"
+msgstr "záznamy priebehu"
+
+#: contrib/admin/templatetags/admin_list.py:254
+msgid "All dates"
+msgstr "Všetky dátumy"
+
+#: contrib/admin/views/decorators.py:10 contrib/auth/forms.py:60
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Prosím, zadajte užívateľské meno a heslo. Rešpektujte  malé a veľké písmená."
+
+#: contrib/admin/views/decorators.py:24
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Prihlásenie"
+
+#: contrib/admin/views/decorators.py:62
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Vaša session vypršala. Prosím, príhlaste sa znovu. Nemusíte sa obávať, vaše "
+"údaje boli uchované."
+
+#: contrib/admin/views/decorators.py:69
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Vyzerá to tak, že váš prehliadač nemá povolené cookies. Prosím, povoľte si "
+"cookies a skúste znova načítať stránku."
+
+#: contrib/admin/views/decorators.py:83
+msgid "Usernames cannot contain the '@' character."
+msgstr "Užívateľské meno nemože obsahovať znak '@'."
+
+#: contrib/admin/views/decorators.py:85
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr ""
+"Vaša e-mailová adresa nie je užívateľským menom. Skúste použiť meno '%s'."
+
+#: contrib/admin/views/auth.py:20 contrib/admin/views/main.py:264
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Objekt  %(name)s \"%(obj)s\" bol úspešne pridaný."
+
+#: contrib/admin/views/auth.py:25 contrib/admin/views/main.py:268
+#: contrib/admin/views/main.py:354
+msgid "You may edit it again below."
+msgstr "Môžete pokračovať v zmenách."
+
+#: contrib/admin/views/auth.py:31
+msgid "Add user"
+msgstr "Pridať užívateľa"
+
+#: contrib/admin/views/auth.py:58
+msgid "Password changed successfully."
+msgstr "Heslo bolo úspešne zmenené."
+
+#: contrib/admin/views/auth.py:65
+#, python-format
+msgid "Change password: %s"
+msgstr "Zmeniť heslo: %s"
+
+#: contrib/admin/views/main.py:230
+msgid "Site administration"
+msgstr "Administrácia"
+
+#: contrib/admin/views/main.py:278 contrib/admin/views/main.py:363
+#, python-format
+msgid "You may add another %s below."
+msgstr "Môžete pokračovať v pridávaní ďaľších %s."
+
+#: contrib/admin/views/main.py:296
+#, python-format
+msgid "Add %s"
+msgstr "Pridaj %s"
+
+#: contrib/admin/views/main.py:342
+#, python-format
+msgid "Added %s."
+msgstr "Bol pridaný %s."
+
+#: contrib/admin/views/main.py:344
+#, python-format
+msgid "Changed %s."
+msgstr "Bol zmenený %s"
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "Deleted %s."
+msgstr "Bol vymazaný %s."
+
+#: contrib/admin/views/main.py:349
+msgid "No fields changed."
+msgstr "Polia neboli zmenené."
+
+#: contrib/admin/views/main.py:352
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Objekt %(name)s \"%(obj)s\" boli úspešne zmenený."
+
+#: contrib/admin/views/main.py:360
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"Objekt %(name)s \"%(obj)s\" bol úspešne zmenený. Ďalšie zmeny môžeš urobiť "
+"zase nižšie."
+
+#: contrib/admin/views/main.py:398
+#, python-format
+msgid "Change %s"
+msgstr "Zmeniť %s"
+
+#: contrib/admin/views/main.py:483
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Jeden alebo viac %(fieldname)s v %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:488
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Jeden alebo viac %(fieldname)s v %(name)s:"
+
+#: contrib/admin/views/main.py:520
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Objekt %(name)s \"%(obj)s\" bol úspešne vymazaný."
+
+#: contrib/admin/views/main.py:523
+msgid "Are you sure?"
+msgstr "Ste si istý?"
+
+#: contrib/admin/views/main.py:545
+#, python-format
+msgid "Change history: %s"
+msgstr "Zmeniť históriu: %s"
+
+#: contrib/admin/views/main.py:579
+#, python-format
+msgid "Select %s"
+msgstr "Výber %s"
+
+#: contrib/admin/views/main.py:579
+#, python-format
+msgid "Select %s to change"
+msgstr "Ktorý %s sa má zmeniť?"
+
+#: contrib/admin/views/main.py:780
+msgid "Database error"
+msgstr "Chyba databázy"
+
+#: contrib/admin/views/doc.py:47 contrib/admin/views/doc.py:49
+#: contrib/admin/views/doc.py:51
+msgid "tag:"
+msgstr "označovač:"
+
+#: contrib/admin/views/doc.py:78 contrib/admin/views/doc.py:80
+#: contrib/admin/views/doc.py:82
+msgid "filter:"
+msgstr ""
+
+#: contrib/admin/views/doc.py:136 contrib/admin/views/doc.py:138
+#: contrib/admin/views/doc.py:140
+msgid "view:"
+msgstr "prehľad:"
+
+#: contrib/admin/views/doc.py:165
+#, python-format
+msgid "App %r not found"
+msgstr "Aplikáciu %r sa nepodarilo nájsť."
+
+#: contrib/admin/views/doc.py:172
+#, python-format
+msgid "Model %(name)r not found in app %(label)r"
+msgstr "Model %(name)r sa nenachádza v aplikácii %(label)r"
+
+#: contrib/admin/views/doc.py:184
+#, python-format
+msgid "the related `%(label)s.%(type)s` object"
+msgstr "Prepojenie na objekt `%(label)s.%(type)s`"
+
+#: contrib/admin/views/doc.py:184 contrib/admin/views/doc.py:206
+#: contrib/admin/views/doc.py:220 contrib/admin/views/doc.py:225
+msgid "model:"
+msgstr ""
+
+#: contrib/admin/views/doc.py:215
+#, python-format
+msgid "related `%(label)s.%(name)s` objects"
+msgstr "súvisiace objekty `%(label)s.%(name)s`"
+
+#: contrib/admin/views/doc.py:220
+#, python-format
+msgid "all %s"
+msgstr "všetky %s"
+
+#: contrib/admin/views/doc.py:225
+#, python-format
+msgid "number of %s"
+msgstr "počet %s"
+
+#: contrib/admin/views/doc.py:230
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Polia objektu %s"
+
+#: contrib/admin/views/doc.py:292 contrib/admin/views/doc.py:303
+#: contrib/admin/views/doc.py:305 contrib/admin/views/doc.py:311
+#: contrib/admin/views/doc.py:312 contrib/admin/views/doc.py:314
+msgid "Integer"
+msgstr "Celé číslo"
+
+#: contrib/admin/views/doc.py:293
+msgid "Boolean (Either True or False)"
+msgstr "Logická hodnota (True alebo False)"
+
+#: contrib/admin/views/doc.py:294 contrib/admin/views/doc.py:313
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "Dĺžka reťazca (maximálne do %(maxlength)s znakov)"
+
+#: contrib/admin/views/doc.py:295
+msgid "Comma-separated integers"
+msgstr "Celé čísla oddelené čiarkou"
+
+#: contrib/admin/views/doc.py:296
+msgid "Date (without time)"
+msgstr "Dátum (bez času)"
+
+#: contrib/admin/views/doc.py:297
+msgid "Date (with time)"
+msgstr "Dátum (a čas)"
+
+#: contrib/admin/views/doc.py:298
+msgid "Decimal number"
+msgstr "Desatinné číslo"
+
+#: contrib/admin/views/doc.py:299
+msgid "E-mail address"
+msgstr "E-mailová adresa"
+
+#: contrib/admin/views/doc.py:300 contrib/admin/views/doc.py:301
+#: contrib/admin/views/doc.py:304
+msgid "File path"
+msgstr "Cesta k súboru"
+
+#: contrib/admin/views/doc.py:302
+msgid "Floating point number"
+msgstr "Císlo s pohyblivou čiarkou"
+
+#: contrib/admin/views/doc.py:308
+msgid "Boolean (Either True, False or None)"
+msgstr "Logická hodnota (True, False alebo None)"
+
+#: contrib/admin/views/doc.py:309
+msgid "Relation to parent model"
+msgstr "Má vzťah k nadradenému modelu"
+
+#: contrib/admin/views/doc.py:310
+msgid "Phone number"
+msgstr "Číslo telefónu"
+
+#: contrib/admin/views/doc.py:315
+msgid "Text"
+msgstr "Text"
+
+#: contrib/admin/views/doc.py:316
+msgid "Time"
+msgstr "Čas"
+
+#: contrib/admin/views/doc.py:317 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:318
+msgid "U.S. state (two uppercase letters)"
+msgstr "Štát USA (dve veľké písmena)"
+
+#: contrib/admin/views/doc.py:319
+msgid "XML text"
+msgstr "XML text"
+
+#: contrib/admin/views/doc.py:345
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s nie je urlpattern objekt"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Aktuálne:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Zmeniť:"
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Dátum:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Čas:"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Dokumentácia"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin/auth/user/change_password.html:15
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "Zmeniť heslo"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/auth/user/change_password.html:12
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Začiatok"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "History"
+msgstr "História"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Dátum a čas"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Uživateľ"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Udalosť"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "DATE_WITH_TIME_FULL"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Tento object nemá históriu vykonaných zmien. Možno nebol pridaný "
+"prostredníctvom tohoto administračného rozhrania."
+
+#: contrib/admin/templates/admin/change_list.html:12
+#, python-format
+msgid "Add %(name)s"
+msgstr "Pridať %(name)s"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "Podľa %(filter_title)s "
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Chyba servera"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Chyba servera (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Chyba servera <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Vznikla neočakávaná chyba. Prostredníctvom e-mailu bol o nej informovaný "
+"správca a dá sa predpokladať, že bude v krátkej dobe odstránená. Ďakujeme za "
+"pochopenie."
+
+#: contrib/admin/templates/admin/invalid_setup.html:8
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"S inštaláciou alebo nastavením vašej databázy nie je niečo v poriadku. "
+"Uistite sa, že ste vytvorili potrebné databázové tabuľky. Taktiež "
+"skontrolujte, či má systémový užívateľ, pod ktorým beží aplikácia, právo na "
+"prístup k databáze a čítanie súborov databázy."
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Choď"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 výsledok"
+msgstr[1] "%(counter)s výsledkov"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s spolu"
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Zobraziť všetky"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django administrácia"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Administrácia Django"
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "Filter"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Stránka nebola nájdená"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Ľutujeme, ale požadovaná stránka nebola nájdená."
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Modely dostupné v aplikácii %(name)s."
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "Pridať"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Zmeniť"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Nemáte právo na vykonávanie zmien."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Posledné udalosti"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Moje udalosti"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Nedostupné"
+
+#: contrib/admin/templates/admin/change_form.html:22
+msgid "View on site"
+msgstr "Pozrieť na stránke"
+
+#: contrib/admin/templates/admin/change_form.html:32
+#: contrib/admin/templates/admin/auth/user/change_password.html:24
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Prosím, opravte chybu uvedenú nižšie."
+msgstr[1] "Prosím, opravte chyby uvedené nižšie."
+
+#: contrib/admin/templates/admin/change_form.html:50
+msgid "Ordering"
+msgstr "Radenie"
+
+#: contrib/admin/templates/admin/change_form.html:53
+msgid "Order:"
+msgstr "Poradie:"
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "Vitajte,"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Vymazať"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Zmazanie objektu %(object_name)s '%(escaped_object)s' by spôsobilo zmazanie "
+"súvisiacich objektov, avšak vaše užívateľské práva vám neumožňujú zmazať "
+"nasledujúce typy objektov:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Ste si istý, že chcete zmazať objekt %(object_name)s \"%(escaped_object)s\"? "
+"Zmazané budú aj všetky tieto súvisiace objekty:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Áno, som si istý"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Uložiť ako nový"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Uložiť a pridať ďaľší"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Uložiť a pokračovať v zmenách"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Uložiť"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:28
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Zadajte nové heslo pre užívateľa <strong>%(username)s</strong>."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:34
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+msgid "Password"
+msgstr "Heslo"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+msgid "Password (again)"
+msgstr "Heslo (potvrdiť)"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+msgid "Enter the same password as above, for verification."
+msgstr "Znova zadajte heslo kvôli overeniu."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Najskôr zadajte užívateľské meno a heslo. Neskôr budete môcť upraviť ostatné "
+"užívateľské nastavnia."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "Užívateľské meno"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Zmena heslo"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Heslo bolo úspešne zmenené"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Vaše heslo bolo zmenené."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Obnovenie hesla"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"Zabudli ste svoje heslo? Zadajte svoju e-mailovú adresu, na ktorú vám bude "
+"zaslané nové heslo."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "E-mailová adresa:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Obnova môjho hesla"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Ďakujeme vám, za čas strávený na našich stránkach."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Prihlásiť sa znovu"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Heslo bolo úspešne obnovené"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"Bolo vám zaslané nové heslo na uvedenú adresu. Mali by ste ho obdržať v "
+"najbližšej dobe."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Z bezpečnostných dôvodov zadajte najskôr staré heslo a potom dva krát nové "
+"heslo, tak aby sa mohlo overiť, či nevznikol preklep."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Staré heslo:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Nové heslo:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Potvrdenie hesla:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Zmeň svoje heslo"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Dostali ste túto správu, lebo ste si vyžiadali obnovu hesla."
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "pre váš užívateľský účet na %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Vaše nové heslo je: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Heslo si kľudne môžete zmeniť na tejto stránke:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Vaše užívateľské meno, pre prípad, že ste zabudli:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Ďakujeme vám, že využívate služby našej stránky!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Tím %(site_name)s"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Záložky"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "Dokumentácia záložiek"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">Ak chete nainštalovať záložky, pretiahnite linku do vášho "
+"panela so záložkami\n"
+"alebo kliknite pravým tlačidlom myši na linku a pridajte ju do svojich "
+"záložiek.\n"
+"Následne môžete záložky použiť na stránkach. Všimnite si, že použitie "
+"niektorých záložiek vyžaduje, aby bol váš počítač pridaný do zoznamu "
+"INTERNAL_IPS. Ak nie ste si istý, že ste v tomto zozname, oslovte vášho "
+"administrátora.</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Dokumentácia k tejto stránke"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+"Skočte z ľubovoľnej stránky do dokumentácie, kde je popísané, ako sa táto "
+"stránka generuje."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Zobraziť ID objektu."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr "Zobrazuje content-type a ID stránok, ktoré reprezentujú jediný objekt."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Editácia tohoto objektu (v aktuálnom okne)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "Skočiť na stránku admina, ktorá reprezentuje tento jeden objekt."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Editácia tohoto objektu (v novom okne)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "To isté ako predtým, akurát otvorí administračnú stránku v novom okne."
+
+#: contrib/contenttypes/models.py:37
+msgid "python model class name"
+msgstr "pythonové meno triedy modelu"
+
+#: contrib/contenttypes/models.py:40
+msgid "content type"
+msgstr "typ obsahu"
+
+#: contrib/contenttypes/models.py:41
+msgid "content types"
+msgstr "typy obsahu"
+
+#: contrib/auth/views.py:41
+msgid "Logged out"
+msgstr "Odhlásený"
+
+#: contrib/auth/models.py:51 contrib/auth/models.py:71
+msgid "name"
+msgstr "meno"
+
+#: contrib/auth/models.py:53
+msgid "codename"
+msgstr "codename"
+
+#: contrib/auth/models.py:56
+msgid "permission"
+msgstr "povolenie"
+
+#: contrib/auth/models.py:57 contrib/auth/models.py:72
+msgid "permissions"
+msgstr "práva"
+
+#: contrib/auth/models.py:75
+msgid "group"
+msgstr "skupina"
+
+#: contrib/auth/models.py:76 contrib/auth/models.py:116
+msgid "groups"
+msgstr "skupiny"
+
+#: contrib/auth/models.py:106
+msgid "username"
+msgstr "užívateľské meno"
+
+#: contrib/auth/models.py:106
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr ""
+"Povinná položka s dĺžkou 30 znakov alebo menej. Povolené sú len "
+"alfanumerické znaky (písmená, čísla a podtržník)."
+
+#: contrib/auth/models.py:107
+msgid "first name"
+msgstr "krstné meno"
+
+#: contrib/auth/models.py:108
+msgid "last name"
+msgstr "priezvisko"
+
+#: contrib/auth/models.py:109
+msgid "e-mail address"
+msgstr "e-mailová adresa"
+
+#: contrib/auth/models.py:110
+msgid "password"
+msgstr "heslo"
+
+#: contrib/auth/models.py:110
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"Použite '[algo]$[salt]$[hexdigest]' alebo <a href=\"password/\">formulár na "
+"zmenu hesla</a>."
+
+#: contrib/auth/models.py:111
+msgid "staff status"
+msgstr "zamestnanec"
+
+#: contrib/auth/models.py:111
+msgid "Designates whether the user can log into this admin site."
+msgstr ""
+"Určuje, či má užívateľ oprávnenie prihlásiť sa do administračnej časti."
+
+#: contrib/auth/models.py:112
+msgid "active"
+msgstr "aktívny"
+
+#: contrib/auth/models.py:112
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"Určuje, či je účet aktívny. Odškrtnite, ak chcete deaktivovať užívateľský "
+"účet."
+
+#: contrib/auth/models.py:113
+msgid "superuser status"
+msgstr "superužívateľ"
+
+#: contrib/auth/models.py:113
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr ""
+"Určuje, či užívateľ získava automaticky všetky práva aj bez priameho "
+"priradenia."
+
+#: contrib/auth/models.py:114
+msgid "last login"
+msgstr "naposledy prihlásený"
+
+#: contrib/auth/models.py:115
+msgid "date joined"
+msgstr "dátum registrácie"
+
+#: contrib/auth/models.py:117
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"Okrem ručne zadaných práv bude mať užívateľ aj všetky práva prislúchajúce "
+"skupinám, v ktorých sa nachádza."
+
+#: contrib/auth/models.py:118
+msgid "user permissions"
+msgstr "užívateľské práva"
+
+#: contrib/auth/models.py:122
+msgid "user"
+msgstr "uživateľ"
+
+#: contrib/auth/models.py:123
+msgid "users"
+msgstr "užívatelia"
+
+#: contrib/auth/models.py:129
+msgid "Personal info"
+msgstr "Osobné údaje"
+
+#: contrib/auth/models.py:130
+msgid "Permissions"
+msgstr "Práva"
+
+#: contrib/auth/models.py:131
+msgid "Important dates"
+msgstr "Dôležité dátumy"
+
+#: contrib/auth/models.py:132
+msgid "Groups"
+msgstr "Skupiny"
+
+#: contrib/auth/models.py:274
+msgid "message"
+msgstr "správa"
+
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr "Pole hesla a jeho potvrdenie sa nezhodujú."
+
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr "Užívateľ s týmto užívateľským menom už existuje."
+
+#: contrib/auth/forms.py:53
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"Váš prehliadač nemá povolené cookies. Cookies sú potrebné pre úspešné "
+"prihlásenie."
+
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "Účet je deaktivovaný."
+
+#: contrib/auth/forms.py:84
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr ""
+"K danej e-mailovej adrese neexistuje užívateľský účet. Ste si istý, že ste "
+"sa zaregistrovali?"
+
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "Pole nového hesla a jeho potvrdenie sa nezhodujú."
+
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Vaše staré heslo nebolo zadané správne. Prosím, zadajte heslo znova."
+
+#: contrib/localflavor/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
+msgstr ""
+"Zadajte britský poštový kód (PSČ). Medzera medzi dvomi časťami kódu je "
+"povinná."
+
+#: contrib/localflavor/br/forms.py:18
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Vložte poštové smerovacie číslo v tvare XXXXX-XXX."
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "Telefónne číslo musí mať formát XX-XXXX-XXXX. "
+
+#: contrib/localflavor/br/forms.py:72
+msgid "This field requires only numbers."
+msgstr "Toto pole je môže obsahovať len čísla."
+
+#: contrib/localflavor/br/forms.py:74
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr "Toto pole môže mať najviac 11 čisiel  alebo 14 písmen."
+
+#: contrib/localflavor/br/forms.py:84
+msgid "Invalid CPF number."
+msgstr "Chybné CPF číslo."
+
+#: contrib/localflavor/br/forms.py:106
+msgid "This field requires at least 14 digits"
+msgstr "Toto pole vyžaduje minimale 14 číslic."
+
+#: contrib/localflavor/br/forms.py:116
+msgid "Invalid CNPJ number."
+msgstr "Chybné CNJP číslo."
+
+#: contrib/localflavor/au/forms.py:18
+msgid "Enter a 4 digit post code."
+msgstr "Vložte 4 čísla poštového smerovacieho čísla."
+
+#: contrib/localflavor/fr/forms.py:17 contrib/localflavor/de/forms.py:16
+#: contrib/localflavor/fi/forms.py:14
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Vložte poštové smerovacie číslo v tvare XXXXX."
+
+#: contrib/localflavor/us/forms.py:18
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "Zadajte americký poštový kód (ZIP) vo formáte XXXXX alebo XXXXX-XXXX."
+
+#: contrib/localflavor/us/forms.py:51
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr "Vložte platné U.S. číslo sociálneho poistenia vo formáte XXX-XX-XXXX."
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr "Bavórsko"
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr "Berlín"
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr ""
+
+#: contrib/localflavor/de/forms.py:60
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr ""
+
+#: contrib/localflavor/jp/forms.py:21
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "Zadajte poštové smerovacie číslo v tvare XXXXXXX alebo XXX-XXXX."
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr ""
+
+#: contrib/localflavor/ch/forms.py:18 contrib/localflavor/no/forms.py:14
+msgid "Enter a zip code in the format XXXX."
+msgstr "Vložte poštové smerovacie číslo v tvare XXXX."
+
+#: contrib/localflavor/ch/forms.py:90
+msgid ""
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
+msgstr ""
+
+#: contrib/localflavor/is_/forms.py:17
+msgid ""
+"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr "Zadajte platné Islanské číslo v tvare XXXXXX-XXXX."
+
+#: contrib/localflavor/is_/forms.py:31
+msgid "The Icelandic identification number is not valid."
+msgstr ""
+
+#: contrib/localflavor/it/forms.py:16
+msgid "Enter a valid zip code."
+msgstr "Zadajte platné poštové smerovacie číslo."
+
+#: contrib/localflavor/it/forms.py:41
+msgid "Enter a valid Social Security number."
+msgstr "Vložte platné číslo sociálneho poistenia ."
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr "Zadajte platné VAT číslo."
+
+#: contrib/localflavor/no/forms.py:35
+msgid "Enter a valid Norwegian social security number."
+msgstr ""
+"Vložte platné nórske číslo sociálneho poistenia (social security number)."
+
+#: contrib/localflavor/sk/sk_regions.py:8
+msgid "Banska Bystrica region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:9
+msgid "Bratislava region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:10
+msgid "Kosice region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:11
+msgid "Nitra region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:12
+msgid "Presov region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:13
+msgid "Trencin region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:14
+msgid "Trnava region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:15
+msgid "Zilina region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:8
+msgid "Banska Bystrica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:9
+msgid "Banska Stiavnica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:10
+msgid "Bardejov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:11
+msgid "Banovce nad Bebravou"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:12
+msgid "Brezno"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:13
+msgid "Bratislava I"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:14
+msgid "Bratislava II"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:15
+msgid "Bratislava III"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:16
+msgid "Bratislava IV"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:17
+msgid "Bratislava V"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:18
+msgid "Bytca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:19
+msgid "Cadca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:20
+msgid "Detva"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:21
+msgid "Dolny Kubin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:22
+msgid "Dunajska Streda"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:23
+msgid "Galanta"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:24
+msgid "Gelnica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:25
+msgid "Hlohovec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:26
+msgid "Humenne"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:27
+msgid "Ilava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:28
+msgid "Kezmarok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:29
+msgid "Komarno"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:30
+msgid "Kosice I"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:31
+msgid "Kosice II"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:32
+msgid "Kosice III"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:33
+msgid "Kosice IV"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:34
+msgid "Kosice - okolie"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:35
+msgid "Krupina"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:36
+msgid "Kysucke Nove Mesto"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:37
+msgid "Levice"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:38
+msgid "Levoca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:39
+msgid "Liptovsky Mikulas"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:40
+msgid "Lucenec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:41
+msgid "Malacky"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:42
+msgid "Martin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:43
+msgid "Medzilaborce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:44
+msgid "Michalovce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:45
+msgid "Myjava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:46
+msgid "Namestovo"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:47
+msgid "Nitra"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:48
+msgid "Nove Mesto nad Vahom"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:49
+msgid "Nove Zamky"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:50
+msgid "Partizanske"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:51
+msgid "Pezinok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:52
+msgid "Piestany"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:53
+msgid "Poltar"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:54
+msgid "Poprad"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:55
+msgid "Povazska Bystrica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:56
+msgid "Presov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:57
+msgid "Prievidza"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:58
+msgid "Puchov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:59
+msgid "Revuca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:60
+msgid "Rimavska Sobota"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:61
+msgid "Roznava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:62
+msgid "Ruzomberok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:63
+msgid "Sabinov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:64
+msgid "Senec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:65
+msgid "Senica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:66
+msgid "Skalica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:67
+msgid "Snina"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:68
+msgid "Sobrance"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:69
+msgid "Spisska Nova Ves"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:70
+msgid "Stara Lubovna"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:71
+msgid "Stropkov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:72
+msgid "Svidnik"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:73
+msgid "Sala"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:74
+msgid "Topolcany"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:75
+msgid "Trebisov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:76
+msgid "Trencin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:77
+msgid "Trnava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:78
+msgid "Turcianske Teplice"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:79
+msgid "Tvrdosin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:80
+msgid "Velky Krtis"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:81
+msgid "Vranov nad Toplou"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:82
+msgid "Zlate Moravce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:83
+msgid "Zvolen"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:84
+msgid "Zarnovica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:85
+msgid "Ziar nad Hronom"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:86
+msgid "Zilina"
+msgstr ""
+
+#: contrib/localflavor/sk/forms.py:32
+msgid "Enter a postal code in the format XXXXX or XXX XX."
+msgstr "Zadajte poštové smerovacie číslo v tvare XXXXX alebo XXX-XX."
+
+#: contrib/localflavor/cl/forms.py:32
+msgid "Enter valid a Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr ""
+
+#: contrib/localflavor/cl/forms.py:37
+msgid "Enter valid a Chilean RUT"
+msgstr ""
+
+#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:45
+msgid "Enter a valid Finnish social security number."
+msgstr ""
+"Vložte platné fínske číslo sociálneho poistenia (social security number)."
+
+#: contrib/sessions/models.py:68
+msgid "session key"
+msgstr "kľúč session"
+
+#: contrib/sessions/models.py:69
+msgid "session data"
+msgstr "údaje session"
+
+#: contrib/sessions/models.py:70
+msgid "expire date"
+msgstr "dátum vypršania platnosti"
+
+#: contrib/sessions/models.py:74
+msgid "session"
+msgstr "session"
+
+#: contrib/sessions/models.py:75
+msgid "sessions"
+msgstr "sessions"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Príklad: '/about/contact/'. Uistite sa, že adresa obsahuje na začiatku a na "
+"konci.lomítka."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "názov"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "obsah"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "povoliť komentáre"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "názov šablóny"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"Príklad: 'flatpages/contact_page'. Ak táto šablóna neexistuje, systém "
+"použije  'flatpages/default'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "je vyžadovaná registrácia"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Ak je zaškrtnuté, tak sa stránka zobrazí len prihlásenému užívateľovi."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "statická stránka"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "statické stránky"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Pondelok"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Utorok"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Streda"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Štvrtok"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Piatok"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Sobota"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Nedeľa"
+
+#: utils/dates.py:10
+msgid "Mon"
+msgstr ""
+
+#: utils/dates.py:10
+msgid "Tue"
+msgstr ""
+
+#: utils/dates.py:10
+msgid "Wed"
+msgstr ""
+
+#: utils/dates.py:10
+msgid "Thu"
+msgstr ""
+
+#: utils/dates.py:10
+msgid "Fri"
+msgstr ""
+
+#: utils/dates.py:11
+msgid "Sat"
+msgstr ""
+
+#: utils/dates.py:11
+msgid "Sun"
+msgstr ""
+
+#: utils/dates.py:18
+msgid "January"
+msgstr "Január"
+
+#: utils/dates.py:18
+msgid "February"
+msgstr "Február"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "March"
+msgstr "Marec"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "April"
+msgstr "Apríl"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "May"
+msgstr "Máj"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "June"
+msgstr "Jún"
+
+#: utils/dates.py:19 utils/dates.py:31
+msgid "July"
+msgstr "Júl"
+
+#: utils/dates.py:19
+msgid "August"
+msgstr "August"
+
+#: utils/dates.py:19
+msgid "September"
+msgstr "September"
+
+#: utils/dates.py:19
+msgid "October"
+msgstr "Október"
+
+#: utils/dates.py:19
+msgid "November"
+msgstr "November"
+
+#: utils/dates.py:20
+msgid "December"
+msgstr "December"
+
+#: utils/dates.py:23
+msgid "jan"
+msgstr "jan"
+
+#: utils/dates.py:23
+msgid "feb"
+msgstr "feb"
+
+#: utils/dates.py:23
+msgid "mar"
+msgstr "mar"
+
+#: utils/dates.py:23
+msgid "apr"
+msgstr "apr"
+
+#: utils/dates.py:23
+msgid "may"
+msgstr "máj"
+
+#: utils/dates.py:23
+msgid "jun"
+msgstr "jún"
+
+#: utils/dates.py:24
+msgid "jul"
+msgstr "júl"
+
+#: utils/dates.py:24
+msgid "aug"
+msgstr "aug"
+
+#: utils/dates.py:24
+msgid "sep"
+msgstr "sep"
+
+#: utils/dates.py:24
+msgid "oct"
+msgstr "okt"
+
+#: utils/dates.py:24
+msgid "nov"
+msgstr "nov"
+
+#: utils/dates.py:24
+msgid "dec"
+msgstr "dec"
+
+#: utils/dates.py:31
+msgid "Jan."
+msgstr "Jan."
+
+#: utils/dates.py:31
+msgid "Feb."
+msgstr "Feb."
+
+#: utils/dates.py:32
+msgid "Aug."
+msgstr "Aug."
+
+#: utils/dates.py:32
+msgid "Sept."
+msgstr "Sept."
+
+#: utils/dates.py:32
+msgid "Oct."
+msgstr "Okt."
+
+#: utils/dates.py:32
+msgid "Nov."
+msgstr "Nov."
+
+#: utils/dates.py:32
+msgid "Dec."
+msgstr "Dec."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "rok"
+msgstr[1] "roky"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mesiac"
+msgstr[1] "mesiacov"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "týždeň"
+msgstr[1] "týždňov"
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "deň"
+msgstr[1] "dni"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "hodina"
+msgstr[1] "hodín"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minúta"
+msgstr[1] "minúty"
+
+#: utils/timesince.py:39
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr ""
+
+#: utils/timesince.py:45
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ""
+
+#: utils/dateformat.py:41
+msgid "p.m."
+msgstr "p.m."
+
+#: utils/dateformat.py:42
+msgid "a.m."
+msgstr "a.m."
+
+#: utils/dateformat.py:47
+msgid "PM"
+msgstr ""
+
+#: utils/dateformat.py:48
+msgid "AM"
+msgstr ""
+
+#: utils/dateformat.py:97
+msgid "midnight"
+msgstr "polnoc"
+
+#: utils/dateformat.py:99
+msgid "noon"
+msgstr "poludnie"
+
+#: utils/translation/trans_real.py:391
+msgid "DATE_FORMAT"
+msgstr ""
+
+#: utils/translation/trans_real.py:392
+msgid "DATETIME_FORMAT"
+msgstr ""
+
+#: utils/translation/trans_real.py:393
+msgid "TIME_FORMAT"
+msgstr ""
+
+#: utils/translation/trans_real.py:409
+msgid "YEAR_MONTH_FORMAT"
+msgstr ""
+
+#: utils/translation/trans_real.py:410
+msgid "MONTH_DAY_FORMAT"
+msgstr ""
+
+#: template/defaultfilters.py:485
+msgid "yes,no,maybe"
+msgstr "áno,nie,možno"
+
+#: template/defaultfilters.py:514
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: template/defaultfilters.py:516
+#, python-format
+msgid "%.1f KB"
+msgstr ""
+
+#: template/defaultfilters.py:518
+#, python-format
+msgid "%.1f MB"
+msgstr ""
+
+#: template/defaultfilters.py:519
+#, python-format
+msgid "%.1f GB"
+msgstr ""
+
+#~ msgid "AnonymousUser"
+#~ msgstr "Neregistrovaný užívateľ"
diff --git a/webapp/django/conf/locale/sk/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/sk/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..0682827
--- /dev/null
+++ b/webapp/django/conf/locale/sk/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/sk/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/sk/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..d65ac78
--- /dev/null
+++ b/webapp/django/conf/locale/sk/LC_MESSAGES/djangojs.po
@@ -0,0 +1,116 @@
+# 
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-04-01 19:21+0200\n"
+"PO-Revision-Date: 2007-04-03 21:48+0200\n"
+"Last-Translator:  <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "Možný %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Vybrať všetko"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Pridať"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Vymazať"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Vybrané %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Vyberte položku a kliknite"
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Odstrániť vybrané"
+
+#: contrib/admin/media/js/dateparse.js:32
+#: contrib/admin/media/js/calendar.js:24
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Január Február Marec Apríl Máj Jún Júl August September Október November "
+"December"
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Nedeľa Pondelok Utorok Streda Štvrtok Piatok Sobota"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "N P U S Š P S"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr "Zobraziť"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr "Skryť"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Now"
+msgstr "Práve teraz"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
+msgid "Clock"
+msgstr "Hodiny"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
+msgid "Choose a time"
+msgstr "Vybrať čas"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "Midnight"
+msgstr "Polnoc"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "6 a.m."
+msgstr "6 ráno"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
+msgid "Noon"
+msgstr "Poludnie"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
+msgid "Cancel"
+msgstr "Zrušiť"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
+msgid "Today"
+msgstr "Dnes"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
+msgid "Calendar"
+msgstr "Kalendár"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
+msgid "Yesterday"
+msgstr "Včera"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
+msgid "Tomorrow"
+msgstr "Zajtra"
+
diff --git a/webapp/django/conf/locale/sl/LC_MESSAGES/django.mo b/webapp/django/conf/locale/sl/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..e7865e4
--- /dev/null
+++ b/webapp/django/conf/locale/sl/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/sl/LC_MESSAGES/django.po b/webapp/django/conf/locale/sl/LC_MESSAGES/django.po
new file mode 100644
index 0000000..2796ddb
--- /dev/null
+++ b/webapp/django/conf/locale/sl/LC_MESSAGES/django.po
@@ -0,0 +1,2967 @@
+# translation of django.po to Slovenian
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-07-02 13:55+0200\n"
+"PO-Revision-Date: 2007-07-02 14:47+0100\n"
+"Last-Translator: Gasper Koren <skrat@owca.info>\n"
+"Language-Team: Slovenian <lugos-slo@lugos.si>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.2\n"
+"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n"
+
+#: db/models/manipulators.py:307
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(object)s s tem %(type)s že obstaja za dane %(field)s."
+
+#: db/models/manipulators.py:308
+#: contrib/admin/views/main.py:340
+#: contrib/admin/views/main.py:342
+#: contrib/admin/views/main.py:344
+msgid "and"
+msgstr "in"
+
+#: db/models/fields/related.py:54
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Prosimo, vnesite veljaven %s."
+
+#: db/models/fields/related.py:640
+msgid "Separate multiple IDs with commas."
+msgstr "Več ID-jev ločite z vejicami."
+
+#: db/models/fields/related.py:642
+msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "Držite \"Control\" (ali \"Command\" na Mac-u), za izbiro več kot enega."
+
+#: db/models/fields/related.py:689
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural "Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "Prosimo, vnesite veljavne %(self)s ID-e. Vrednost %(value)r ni veljavna."
+msgstr[1] "Prosimo, vnesite veljavne %(self)s ID-je. Vrednosti %(value)r nista veljavni."
+msgstr[2] "Prosimo, vnesite veljavne %(self)s ID-je. Vrednosti %(value)r niso veljavne."
+msgstr[3] "Prosimo, vnesite veljavne %(self)s ID-je. Vrednosti %(value)r niso veljavne."
+
+#: db/models/fields/__init__.py:46
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s s tem %(fieldname)s že obstaja."
+
+#: db/models/fields/__init__.py:126
+#: db/models/fields/__init__.py:283
+#: db/models/fields/__init__.py:680
+#: db/models/fields/__init__.py:691
+#: oldforms/__init__.py:357
+#: newforms/fields.py:87
+#: newforms/fields.py:444
+#: newforms/fields.py:523
+#: newforms/fields.py:534
+#: newforms/models.py:185
+msgid "This field is required."
+msgstr "To polje je obvezno"
+
+#: db/models/fields/__init__.py:378
+msgid "This value must be an integer."
+msgstr "Ta vrednost mora biti celo število."
+
+#: db/models/fields/__init__.py:413
+msgid "This value must be either True or False."
+msgstr "Ta vrednost mora biti \"True\" ali \"False\"."
+
+#: db/models/fields/__init__.py:434
+msgid "This field cannot be null."
+msgstr "To polje ne more biti prazno."
+
+#: db/models/fields/__init__.py:468
+#: core/validators.py:149
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Vnesite veljavni datum v zapisu YYYY-MM-DD (leto-mesec-dan)."
+
+#: db/models/fields/__init__.py:537
+#: core/validators.py:158
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Vnesite veljavni datum/čas v zapisu YYYY-MM-DD HH:MM (leto-mesec-dan ura:minuta)"
+
+#: db/models/fields/__init__.py:597
+msgid "This value must be a decimal number."
+msgstr "Ta vrednost mora biti decimalno število."
+
+#: db/models/fields/__init__.py:700
+msgid "Enter a valid filename."
+msgstr "Vnesite veljavno ime datoteke."
+
+#: db/models/fields/__init__.py:825
+msgid "This value must be either None, True or False."
+msgstr "Ta vrednost mora biti None, True ali False."
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "Arabščina"
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "Bengalski"
+
+#: conf/global_settings.py:41
+msgid "Bulgarian"
+msgstr "Bolgarščina"
+
+#: conf/global_settings.py:42
+msgid "Catalan"
+msgstr "Katalonščina"
+
+#: conf/global_settings.py:43
+msgid "Czech"
+msgstr "Češki"
+
+#: conf/global_settings.py:44
+msgid "Welsh"
+msgstr "Valežanski"
+
+#: conf/global_settings.py:45
+msgid "Danish"
+msgstr "Danski"
+
+#: conf/global_settings.py:46
+msgid "German"
+msgstr "Nemški"
+
+#: conf/global_settings.py:47
+msgid "Greek"
+msgstr "Grški"
+
+#: conf/global_settings.py:48
+msgid "English"
+msgstr "Angleški"
+
+#: conf/global_settings.py:49
+msgid "Spanish"
+msgstr "Španski"
+
+#: conf/global_settings.py:50
+msgid "Argentinean Spanish"
+msgstr "Španščina (Argentina)"
+
+#: conf/global_settings.py:51
+msgid "Persian"
+msgstr "Perzijščina"
+
+#: conf/global_settings.py:52
+msgid "Finnish"
+msgstr "Finščina"
+
+#: conf/global_settings.py:53
+msgid "French"
+msgstr "Francoski"
+
+#: conf/global_settings.py:54
+msgid "Galician"
+msgstr "Galičanski"
+
+#: conf/global_settings.py:55
+msgid "Hungarian"
+msgstr "Madžarski"
+
+#: conf/global_settings.py:56
+msgid "Hebrew"
+msgstr "Hebrejski"
+
+#: conf/global_settings.py:57
+msgid "Icelandic"
+msgstr "Islandski"
+
+#: conf/global_settings.py:58
+msgid "Italian"
+msgstr "Italijanski"
+
+#: conf/global_settings.py:59
+msgid "Japanese"
+msgstr "Japonski"
+
+#: conf/global_settings.py:60
+msgid "Korean"
+msgstr "Korejščina"
+
+#: conf/global_settings.py:61
+msgid "Kannada"
+msgstr "Kanareščina"
+
+#: conf/global_settings.py:62
+msgid "Latvian"
+msgstr "Latvijščina"
+
+#: conf/global_settings.py:63
+msgid "Macedonian"
+msgstr "Makedonščina"
+
+#: conf/global_settings.py:64
+msgid "Dutch"
+msgstr "Nizozemski"
+
+#: conf/global_settings.py:65
+msgid "Norwegian"
+msgstr "Norveški"
+
+#: conf/global_settings.py:66
+msgid "Polish"
+msgstr "Poljščina"
+
+#: conf/global_settings.py:67
+msgid "Portugese"
+msgstr "Portugalščina"
+
+#: conf/global_settings.py:68
+msgid "Brazilian"
+msgstr "Brazilski"
+
+#: conf/global_settings.py:69
+msgid "Romanian"
+msgstr "Romunski"
+
+#: conf/global_settings.py:70
+msgid "Russian"
+msgstr "Ruski"
+
+#: conf/global_settings.py:71
+msgid "Slovak"
+msgstr "Slovaški"
+
+#: conf/global_settings.py:72
+msgid "Slovenian"
+msgstr "Slovenski"
+
+#: conf/global_settings.py:73
+msgid "Serbian"
+msgstr "Srbski"
+
+#: conf/global_settings.py:74
+msgid "Swedish"
+msgstr "Švedski"
+
+#: conf/global_settings.py:75
+msgid "Tamil"
+msgstr "Tamilščina"
+
+#: conf/global_settings.py:76
+msgid "Telugu"
+msgstr "Teluščina"
+
+#: conf/global_settings.py:77
+msgid "Turkish"
+msgstr "Turščina"
+
+#: conf/global_settings.py:78
+msgid "Ukrainian"
+msgstr "Ukrajinski"
+
+#: conf/global_settings.py:79
+msgid "Simplified Chinese"
+msgstr "Poenostavljeni kitajski"
+
+#: conf/global_settings.py:80
+msgid "Traditional Chinese"
+msgstr "Tradicionalni kitajski"
+
+#: core/validators.py:65
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Ta vrednost mora vsebovati le črke, števila in podčrtaje (_)."
+
+#: core/validators.py:69
+msgid "This value must contain only letters, numbers, underscores, dashes or slashes."
+msgstr "Ta vrednost mora vsebovati le črke, števila, podčrtaje, poševnice ali pomišljaje."
+
+#: core/validators.py:73
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "Ta vrednost mora vsebovati le črke, števila, podčrtaje ali pomišljaje."
+
+#: core/validators.py:77
+msgid "Uppercase letters are not allowed here."
+msgstr "Velike tiskane črke niso dovoljene."
+
+#: core/validators.py:81
+msgid "Lowercase letters are not allowed here."
+msgstr "Majhne tiskane črke niso dovoljene."
+
+#: core/validators.py:88
+msgid "Enter only digits separated by commas."
+msgstr "Vnesite samo števila, ločena z vejicami."
+
+#: core/validators.py:100
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Vnesite veljavne e-mail naslove, ločene z vejicami."
+
+#: core/validators.py:104
+msgid "Please enter a valid IP address."
+msgstr "Prosimo, vnesite veljavni IP naslov."
+
+#: core/validators.py:108
+msgid "Empty values are not allowed here."
+msgstr "Prazne vrednosti tu niso dovoljene."
+
+#: core/validators.py:112
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Nenumerični znaki tukaj niso dovoljne."
+
+#: core/validators.py:116
+msgid "This value can't be comprised solely of digits."
+msgstr "Ta vrednost ne sme vsebovati le števk."
+
+#: core/validators.py:121
+#: newforms/fields.py:135
+msgid "Enter a whole number."
+msgstr "Vnesite celo število."
+
+#: core/validators.py:125
+msgid "Only alphabetical characters are allowed here."
+msgstr "Tukaj so dovoljene samo črke."
+
+#: core/validators.py:140
+msgid "Year must be 1900 or later."
+msgstr "Leto mora biti 1900 ali kasnejše."
+
+#: core/validators.py:144
+#, python-format
+msgid "Invalid date: %s"
+msgstr "Nepravilen datum: %s"
+
+#: core/validators.py:154
+msgid "Enter a valid time in HH:MM format."
+msgstr "Vnesite veljavni čas v zapisu HH:MM (ura:minuta)."
+
+#: core/validators.py:163
+#: newforms/fields.py:339
+msgid "Enter a valid e-mail address."
+msgstr "Vnesite veljaven e-mail."
+
+#: core/validators.py:175
+#: core/validators.py:453
+#: oldforms/__init__.py:672
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Datoteka ni bila poslana. Preveite nabor znakov v formi."
+
+#: core/validators.py:179
+msgid "Upload a valid image. The file you uploaded was either not an image or a corrupted image."
+msgstr "Naložite veljavno sliko. Naložena datoteka ni bila slika ali pa je bila le-ta okvarjena."
+
+#: core/validators.py:186
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "URL %s ne kaže na veljavno sliko."
+
+#: core/validators.py:190
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "Telefonska številka mora biti v zapisu XXX-XXX-XXXX. \"%s\" ni vredu."
+
+#: core/validators.py:198
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "URL %s ne kaže na veljavni QuickTime video."
+
+#: core/validators.py:202
+msgid "A valid URL is required."
+msgstr "Potreben je veljaven URL naslov."
+
+#: core/validators.py:216
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Potreben je veljaven HTML. Trenutni ima sledeče napake:\n"
+"%s"
+
+#: core/validators.py:223
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Nepravilen XML: %s"
+
+#: core/validators.py:240
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Neveljaven URL naslov: %s"
+
+#: core/validators.py:245
+#: core/validators.py:247
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "URL povezava %s ne deluje."
+
+#: core/validators.py:253
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Vnesi veljavno okrajšavo za ameriško zvezno državo."
+
+#: core/validators.py:267
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Pazite na jezik! Beseda %s tu ni dovoljena."
+msgstr[1] "Pazite na jezik! Besedi %s tu nista dovoljeni."
+msgstr[2] "Pazite na jezik! Besede %s tu niso dovoljene."
+msgstr[3] "Pazite na jezik! Besede %s tu niso dovoljene."
+
+#: core/validators.py:274
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "To polje mora ustrezati polju '%s'."
+
+#: core/validators.py:293
+msgid "Please enter something for at least one field."
+msgstr "Prosim, vnesite nekaj v vsaj eno izmed polj."
+
+#: core/validators.py:302
+#: core/validators.py:313
+msgid "Please enter both fields or leave them both empty."
+msgstr "Prosimo, izpolnite obe polji ali pa pustite obe prazni."
+
+#: core/validators.py:321
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "To polje mora biti podano, če je %(field)s %(value)s"
+
+#: core/validators.py:334
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "To polje mora biti podano, če ni %(field)s %(value)s"
+
+#: core/validators.py:353
+msgid "Duplicate values are not allowed."
+msgstr "Podvojitve niso dovoljene."
+
+#: core/validators.py:368
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Ta vrednost mora biti med %(lower)s in %(upper)s."
+
+#: core/validators.py:370
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Ta vrednost mora biti vsaj %s."
+
+#: core/validators.py:372
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Ta vrednost mora biti manjša od %s."
+
+#: core/validators.py:408
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Ta vrednost mora biti potenca od %s."
+
+#: core/validators.py:417
+msgid "Please enter a valid decimal number."
+msgstr "Prosim vnesite veljavno decimalno število."
+
+#: core/validators.py:423
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural "Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Prosimo, vnesite veljavno decimalno število z največ %s števko."
+msgstr[1] "Prosimo, vnesite veljavno decimalno število z največ %s števkama."
+msgstr[2] "Prosimo, vnesite veljavno decimalno število z največ %s števkami."
+msgstr[3] "Prosimo, vnesite veljavno decimalno število z največ %s števkami."
+
+#: core/validators.py:426
+#, python-format
+msgid "Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural "Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] "Prosimo, vnesite veljavno decimalno število s celim številom z največ %s števko."
+msgstr[1] "PProsimo, vnesite veljavno decimalno število s celim številom z največ %s števkama."
+msgstr[2] "Prosimo, vnesite veljavno decimalno število s celim številom z največ %s števkami."
+msgstr[3] "Prosimo, vnesite veljavno decimalno število s celim številom z največ %s števkami."
+
+#: core/validators.py:429
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural "Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "Prosimo, vnesite veljavno decimalno število z največ %s decimalnim mestom."
+msgstr[1] "Prosimo, vnesite veljavno decimalno število z največ %s decimalnima mestoma."
+msgstr[2] "Prosimo, vnesite veljavno decimalno število z največ %s decimalnimi mesti."
+msgstr[3] "Prosimo, vnesite veljavno decimalno število z največ %s decimalnimi mesti."
+
+#: core/validators.py:437
+msgid "Please enter a valid floating point number."
+msgstr "Prosim vnesite veljavno decimalno število."
+
+#: core/validators.py:446
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Prosimo, poskrbite, da bo naložena datoteka velika vsaj %s bajtov."
+
+#: core/validators.py:447
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Poskrbite, da bo naložena datoteka velika največ %s bajtov."
+
+#: core/validators.py:464
+msgid "The format for this field is wrong."
+msgstr "Format za to polje je napačen."
+
+#: core/validators.py:479
+msgid "This field is invalid."
+msgstr "To polje ni veljavno."
+
+#: core/validators.py:515
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Iz %s nisem mogel pridobiti ničesar."
+
+#: core/validators.py:518
+#, python-format
+msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "URL %(url)s je vrnil neveljavni Content-Type '%(contenttype)s'."
+
+#: core/validators.py:551
+#, python-format
+msgid "Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with \"%(start)s\".)"
+msgstr "Prosimo, zaprite %(tag)s oznako v vrstici %(line)s. (Vrstica se začne z \"%(start)s\".)"
+
+#: core/validators.py:555
+#, python-format
+msgid "Some text starting on line %(line)s is not allowed in that context. (Line starts with \"%(start)s\".)"
+msgstr "Tekst z začetka vrstice %(line)s ni dovoljen v tem kontekstu. (Vrstica se začne z \"%(start)s\".)"
+
+#: core/validators.py:560
+#, python-format
+msgid "\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%(start)s\".)"
+msgstr "\"%(attr)s\" v vrstici %(line)s je neveljaven atribut. (Vrstica se začne z \"%(start)s\".)"
+
+#: core/validators.py:565
+#, python-format
+msgid "\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%(start)s\".)"
+msgstr "\"<%(tag)s>\" v vrstici %(line)s je neveljavna oznaka. (Vrstica se začne z \"%(start)s\".)"
+
+#: core/validators.py:569
+#, python-format
+msgid "A tag on line %(line)s is missing one or more required attributes. (Line starts with \"%(start)s\".)"
+msgstr "Oznaki v vrstici %(line)s manjka eden ali več zahtevanih parametrov. (Vrstica se začne z \"%(start)s\".)"
+
+#: core/validators.py:574
+#, python-format
+msgid "The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line starts with \"%(start)s\".)"
+msgstr "Parameter \"%(attr)s\" v vrstici %(line)s vsebuje neveljavno vrednost. (Vrstica se začne z \"%(start)s\".)"
+
+#: contrib/auth/forms.py:17
+#: contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr "Gesli se ne ujemata."
+
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr "Uporabnik s tem uporabniškim imenom že obstaja."
+
+#: contrib/auth/forms.py:53
+msgid "Your Web browser doesn't appear to have cookies enabled. Cookies are required for logging in."
+msgstr "Izgleda, da vaš brskalnik nima omogočenih piškotkov. Piškotki so potrebni za prijavo."
+
+#: contrib/auth/forms.py:60
+#: contrib/admin/views/decorators.py:10
+msgid "Please enter a correct username and password. Note that both fields are case-sensitive."
+msgstr "Prosimo, vnesite veljavno uporabniško ime in geslo. Opomba: obe polji upoštevata velikost črk."
+
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "Ta uporabniški račun ni aktiven."
+
+#: contrib/auth/forms.py:84
+msgid "That e-mail address doesn't have an associated user account. Are you sure you've registered?"
+msgstr "Tega e-mail naslova ni mogoče pripisati nobenemu uporabniku. Ali ste prepričani, da ste registrirani?"
+
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "Vrednosti v poljih 'novo geslo' se ne ujemata."
+
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Vaše staro geslo ni pravilno. Prosim, poskusite ponovno."
+
+#: contrib/auth/models.py:49
+#: contrib/auth/models.py:69
+msgid "name"
+msgstr "ime"
+
+#: contrib/auth/models.py:51
+msgid "codename"
+msgstr "kodno ime"
+
+#: contrib/auth/models.py:54
+msgid "permission"
+msgstr "dovoljenje"
+
+#: contrib/auth/models.py:55
+#: contrib/auth/models.py:70
+msgid "permissions"
+msgstr "dovoljenja"
+
+#: contrib/auth/models.py:73
+msgid "group"
+msgstr "skupina"
+
+#: contrib/auth/models.py:74
+#: contrib/auth/models.py:114
+msgid "groups"
+msgstr "skupine"
+
+#: contrib/auth/models.py:104
+msgid "username"
+msgstr "uporabniško ime"
+
+#: contrib/auth/models.py:104
+msgid "Required. 30 characters or fewer. Alphanumeric characters only (letters, digits and underscores)."
+msgstr "Zahtevano. 30 znakov ali manj. Samo alfanumerični znaki (črke, števke un opdčrtaji)."
+
+#: contrib/auth/models.py:105
+msgid "first name"
+msgstr "ime"
+
+#: contrib/auth/models.py:106
+msgid "last name"
+msgstr "priimek"
+
+#: contrib/auth/models.py:107
+msgid "e-mail address"
+msgstr "e-mail naslov"
+
+#: contrib/auth/models.py:108
+msgid "password"
+msgstr "geslo"
+
+#: contrib/auth/models.py:108
+msgid "Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change password form</a>."
+msgstr "Uporabite '[algo]$[salt]$[hexdigest]' ali <a href=\"password/\">obrazec za spremembo gesla</a>."
+
+#: contrib/auth/models.py:109
+msgid "staff status"
+msgstr "status osebja"
+
+#: contrib/auth/models.py:109
+msgid "Designates whether the user can log into this admin site."
+msgstr "Določi, če se sme uporabnik prijaviti v to administracijsko stran."
+
+#: contrib/auth/models.py:110
+msgid "active"
+msgstr "aktiven"
+
+#: contrib/auth/models.py:110
+msgid "Designates whether this user can log into the Django admin. Unselect this instead of deleting accounts."
+msgstr "Določi, če se sme uporabnik prijaviti v Django admin. Odstranite to možnost namesto da brišete račune."
+
+#: contrib/auth/models.py:111
+msgid "superuser status"
+msgstr "status superuporabnika"
+
+#: contrib/auth/models.py:111
+msgid "Designates that this user has all permissions without explicitly assigning them."
+msgstr "Uporabnik bo imel vse pravice brez posamičnega dodeljevanja pravic."
+
+#: contrib/auth/models.py:112
+msgid "last login"
+msgstr "zadnja prijava"
+
+#: contrib/auth/models.py:113
+msgid "date joined"
+msgstr "član od"
+
+#: contrib/auth/models.py:115
+msgid "In addition to the permissions manually assigned, this user will also get all permissions granted to each group he/she is in."
+msgstr "Poleg ročno določenih dovoljenj bo ta uporabnik dobil tudi vsa dovoljenja, ki pripadajo skupinam, katerih član je."
+
+#: contrib/auth/models.py:116
+msgid "user permissions"
+msgstr "uporabniška dovoljenja"
+
+#: contrib/auth/models.py:120
+msgid "user"
+msgstr "uporabnik"
+
+#: contrib/auth/models.py:121
+msgid "users"
+msgstr "uporabniki"
+
+#: contrib/auth/models.py:127
+msgid "Personal info"
+msgstr "Osebni podatki"
+
+#: contrib/auth/models.py:128
+msgid "Permissions"
+msgstr "Dovoljenja"
+
+#: contrib/auth/models.py:129
+msgid "Important dates"
+msgstr "Pomembni datumi"
+
+#: contrib/auth/models.py:130
+msgid "Groups"
+msgstr "Skupine"
+
+#: contrib/auth/models.py:272
+msgid "message"
+msgstr "sporočilo"
+
+#: contrib/auth/models.py:285
+msgid "AnonymousUser"
+msgstr "AnonimniUporabnik"
+
+#: contrib/auth/views.py:40
+msgid "Logged out"
+msgstr "Odjavljen"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "čas dejanja"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "id objekta"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "predstavitev objekta"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "zastavica dejanja"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "spremeni sporočilo"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "vnos v dnevniku"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "vnosi v dnevniku"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Avtor: %s</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:70
+#: contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143
+#: contrib/admin/filterspecs.py:169
+msgid "All"
+msgstr "Vse"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "Kadarkoli"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "Danes"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "Zadnjih 7 dni"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "Ta mesec"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "Letos"
+
+#: contrib/admin/filterspecs.py:143
+#: oldforms/__init__.py:577
+#: newforms/widgets.py:181
+msgid "Yes"
+msgstr "Da"
+
+#: contrib/admin/filterspecs.py:143
+#: oldforms/__init__.py:577
+#: newforms/widgets.py:181
+msgid "No"
+msgstr "Ne"
+
+#: contrib/admin/filterspecs.py:150
+#: oldforms/__init__.py:577
+#: newforms/widgets.py:181
+msgid "Unknown"
+msgstr "Neznano"
+
+#: contrib/admin/views/decorators.py:24
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Prijavite se"
+
+#: contrib/admin/views/decorators.py:62
+msgid "Please log in again, because your session has expired. Don't worry: Your submission has been saved."
+msgstr "Vaša seja je pretekla; prosimo da se ponovno prijavite. Brez skrbi, vaše objave so varno shranjene."
+
+#: contrib/admin/views/decorators.py:69
+msgid "Looks like your browser isn't configured to accept cookies. Please enable cookies, reload this page, and try again."
+msgstr "Izgleda, da vaš brskalnik nima podpore za piškotke. Prosimo, vključite piškotke, osvežite stran in poskusite še enkrat."
+
+#: contrib/admin/views/decorators.py:83
+msgid "Usernames cannot contain the '@' character."
+msgstr "Uporabniška imena ne smejo vsebovati znaka '@'."
+
+#: contrib/admin/views/decorators.py:85
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "Vaš e-main naslov ni vaše uporabniško ime. Poskusite uporabiti '%s'."
+
+#: contrib/admin/views/main.py:228
+msgid "Site administration"
+msgstr "Administracija strani"
+
+#: contrib/admin/views/main.py:262
+#: contrib/admin/views/auth.py:19
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" je bil uspešno dodan."
+
+#: contrib/admin/views/main.py:266
+#: contrib/admin/views/main.py:352
+#: contrib/admin/views/auth.py:24
+msgid "You may edit it again below."
+msgstr "Vsebino lahko znova uredite spodaj."
+
+#: contrib/admin/views/main.py:276
+#: contrib/admin/views/main.py:361
+#, python-format
+msgid "You may add another %s below."
+msgstr "Spodaj lahko dodate še en %s."
+
+#: contrib/admin/views/main.py:294
+#, python-format
+msgid "Add %s"
+msgstr "Dodaj %s"
+
+#: contrib/admin/views/main.py:340
+#, python-format
+msgid "Added %s."
+msgstr "Dodan %s."
+
+#: contrib/admin/views/main.py:342
+#, python-format
+msgid "Changed %s."
+msgstr "Spremenjen %s."
+
+#: contrib/admin/views/main.py:344
+#, python-format
+msgid "Deleted %s."
+msgstr "Izbrisn %s."
+
+#: contrib/admin/views/main.py:347
+msgid "No fields changed."
+msgstr "Nobeno polje ni bilo spremenjeno."
+
+#: contrib/admin/views/main.py:350
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" je bil uspešno spremenjeno."
+
+#: contrib/admin/views/main.py:358
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" je bil uspešno dodano. Ponovno ga lahko urejdite spodaj."
+
+#: contrib/admin/views/main.py:396
+#, python-format
+msgid "Change %s"
+msgstr "Spremeni %s"
+
+#: contrib/admin/views/main.py:481
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Eden ali več %(fieldname)s v %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:486
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Eden ali več %(fieldname)s v %(name)s:"
+
+#: contrib/admin/views/main.py:518
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" je bilo uspešno izbrisan."
+
+#: contrib/admin/views/main.py:521
+msgid "Are you sure?"
+msgstr "Ste prepričani?"
+
+#: contrib/admin/views/main.py:543
+#, python-format
+msgid "Change history: %s"
+msgstr "Zgodovina sprememb: %s"
+
+#: contrib/admin/views/main.py:577
+#, python-format
+msgid "Select %s"
+msgstr "Izberite %s"
+
+#: contrib/admin/views/main.py:577
+#, python-format
+msgid "Select %s to change"
+msgstr "Izberite %s, ki ga želite spremeniti"
+
+#: contrib/admin/views/main.py:772
+msgid "Database error"
+msgstr "Napaka baze podatkov"
+
+#: contrib/admin/views/doc.py:46
+#: contrib/admin/views/doc.py:48
+#: contrib/admin/views/doc.py:50
+msgid "tag:"
+msgstr "značka:"
+
+#: contrib/admin/views/doc.py:77
+#: contrib/admin/views/doc.py:79
+#: contrib/admin/views/doc.py:81
+msgid "filter:"
+msgstr "filter:"
+
+#: contrib/admin/views/doc.py:135
+#: contrib/admin/views/doc.py:137
+#: contrib/admin/views/doc.py:139
+msgid "view:"
+msgstr "pogled:"
+
+#: contrib/admin/views/doc.py:164
+#, python-format
+msgid "App %r not found"
+msgstr "Aplikacije %r ni mogoče najti"
+
+#: contrib/admin/views/doc.py:171
+#, python-format
+msgid "Model %(name)r not found in app %(label)r"
+msgstr "Modela %(name)r ni v aplikaciji %(label)r"
+
+#: contrib/admin/views/doc.py:183
+#, python-format
+msgid "the related `%(label)s.%(type)s` object"
+msgstr "povezani `%(label)s.%(type)s` objekti"
+
+#: contrib/admin/views/doc.py:183
+#: contrib/admin/views/doc.py:205
+#: contrib/admin/views/doc.py:219
+#: contrib/admin/views/doc.py:224
+msgid "model:"
+msgstr "model:"
+
+#: contrib/admin/views/doc.py:214
+#, python-format
+msgid "related `%(label)s.%(name)s` objects"
+msgstr "povezani `%(label)s.%(name)s` objekti"
+
+#: contrib/admin/views/doc.py:219
+#, python-format
+msgid "all %s"
+msgstr "vse %s"
+
+#: contrib/admin/views/doc.py:224
+#, python-format
+msgid "number of %s"
+msgstr "števolo %s"
+
+#: contrib/admin/views/doc.py:229
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Polja na %s objektih"
+
+#: contrib/admin/views/doc.py:291
+#: contrib/admin/views/doc.py:302
+#: contrib/admin/views/doc.py:304
+#: contrib/admin/views/doc.py:310
+#: contrib/admin/views/doc.py:311
+#: contrib/admin/views/doc.py:313
+msgid "Integer"
+msgstr "Celo število (integer)"
+
+#: contrib/admin/views/doc.py:292
+msgid "Boolean (Either True or False)"
+msgstr "Boolean (True ali False)"
+
+#: contrib/admin/views/doc.py:293
+#: contrib/admin/views/doc.py:312
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "Niz (vse do %(maxlength)s)"
+
+#: contrib/admin/views/doc.py:294
+msgid "Comma-separated integers"
+msgstr "Z vejico ločena cela števila (integer)"
+
+#: contrib/admin/views/doc.py:295
+msgid "Date (without time)"
+msgstr "Datum (brez ure)"
+
+#: contrib/admin/views/doc.py:296
+msgid "Date (with time)"
+msgstr "Datum (z uro)"
+
+#: contrib/admin/views/doc.py:297
+msgid "Decimal number"
+msgstr "Decimalno število"
+
+#: contrib/admin/views/doc.py:298
+msgid "E-mail address"
+msgstr "E-mail naslov"
+
+#: contrib/admin/views/doc.py:299
+#: contrib/admin/views/doc.py:300
+#: contrib/admin/views/doc.py:303
+msgid "File path"
+msgstr "Pot do datoteke"
+
+#: contrib/admin/views/doc.py:301
+msgid "Floating point number"
+msgstr "Decimalno število"
+
+#: contrib/admin/views/doc.py:305
+#: contrib/comments/models.py:85
+msgid "IP address"
+msgstr "IP naslov"
+
+#: contrib/admin/views/doc.py:307
+msgid "Boolean (Either True, False or None)"
+msgstr "Boolean (True, False ali None)"
+
+#: contrib/admin/views/doc.py:308
+msgid "Relation to parent model"
+msgstr "Razmerje s starševskim modelom"
+
+#: contrib/admin/views/doc.py:309
+msgid "Phone number"
+msgstr "Telefonska številka"
+
+#: contrib/admin/views/doc.py:314
+msgid "Text"
+msgstr "Besedilo"
+
+#: contrib/admin/views/doc.py:315
+msgid "Time"
+msgstr "Čas"
+
+#: contrib/admin/views/doc.py:316
+#: contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL (spletni naslov)"
+
+#: contrib/admin/views/doc.py:317
+msgid "U.S. state (two uppercase letters)"
+msgstr "Koda ameriške zvezne države (dve veliki črki)"
+
+#: contrib/admin/views/doc.py:318
+msgid "XML text"
+msgstr "XML besedilo"
+
+#: contrib/admin/views/doc.py:344
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s ne izgleda veljaven urlpattern objekt"
+
+#: contrib/admin/views/auth.py:30
+msgid "Add user"
+msgstr "Dodaj uporabnika"
+
+#: contrib/admin/views/auth.py:57
+msgid "Password changed successfully."
+msgstr "Geslo je bilo uspešno spremenjeno"
+
+#: contrib/admin/views/auth.py:64
+#, python-format
+msgid "Change password: %s"
+msgstr "Spremeni geslo: %s"
+
+#: contrib/admin/templatetags/admin_list.py:249
+msgid "All dates"
+msgstr "Vsi datumi"
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Prikaži vse"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+msgid "Documentation"
+msgstr "Dokumentacija"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin/auth/user/change_password.html:15
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+msgid "Change password"
+msgstr "Spremeni geslo"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/comments/templates/comments/form.html:6
+msgid "Log out"
+msgstr "Odjava"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/auth/user/change_password.html:12
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+msgid "Home"
+msgstr "Domov"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Izbriši"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid "Deleting the %(object_name)s '%(escaped_object)s' would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:"
+msgstr "Izbris %(object_name)s '%(escaped_object)s' bi pomenil izbris povezanih objektov, vendar nimate dovoljenja za izbris naslednjih tipov objektov:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid "Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? All of the following related items will be deleted:"
+msgstr "Ste prepričani, da želite izbrisati %(object_name)s \"%(escaped_object)s\"? Vsi naslednji povezani elementi bodo izbrisani:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Ja, sem prepričan"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Strani ni mogoče najti"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Opravičujemo se, a zahtevane strani ni mogoče najti."
+
+#: contrib/admin/templates/admin/change_form.html:15
+#: contrib/admin/templates/admin/index.html:28
+msgid "Add"
+msgstr "Dodaj"
+
+#: contrib/admin/templates/admin/change_form.html:21
+#: contrib/admin/templates/admin/object_history.html:5
+msgid "History"
+msgstr "Zgodovina"
+
+#: contrib/admin/templates/admin/change_form.html:22
+msgid "View on site"
+msgstr "Poglej na strani"
+
+#: contrib/admin/templates/admin/change_form.html:32
+#: contrib/admin/templates/admin/auth/user/change_password.html:24
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Prosimo, odpravite sledečo napako."
+msgstr[1] "Prosimo, odpravite sledeči napaki."
+msgstr[2] "Prosimo, odpravite sledeče napake."
+msgstr[3] "Prosimo, odpravite sledeče napake."
+
+#: contrib/admin/templates/admin/change_form.html:50
+msgid "Ordering"
+msgstr "Razvrščanje"
+
+#: contrib/admin/templates/admin/change_form.html:53
+msgid "Order:"
+msgstr "Razvrsti:"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "Po %(filter_title)s "
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Shrani kot novo"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Shrani in dodaj še eno"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Shrani in nadaljuj z urejanjem"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Shrani"
+
+#: contrib/admin/templates/admin/change_list.html:12
+#, python-format
+msgid "Add %(name)s"
+msgstr "Dodaj %(name)s"
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Modeli na voljo v %(name)s aplikaciji"
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Spremeni"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Nimate dovoljenja za urejanje česar koli."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Zadnja dejanja"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Moja dejanja"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Ni na voljo"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Vmesnik za administracijo Django strani"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django administracija"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Datum/čas"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Uporabnik"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Dejanje"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "N j, Y, H:i"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid "This object doesn't have a change history. It probably wasn't added via this admin site."
+msgstr "Ta objekt nima zgodovine sprememb. Verjetno ni bil dodan preko te strani za administracijo."
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Napaka strežnika"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Napaka strežnika (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Napaka strežnika <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid "There's been an error. It's been reported to the site administrators via e-mail and should be fixed shortly. Thanks for your patience."
+msgstr "Prišlo je do nepričakovane napake. Administrator je preko e-pošte prejel obvestilo o napaki in jo bo v kratkem odpravil. Hvala za potrpljenje."
+
+#: contrib/admin/templates/admin/invalid_setup.html:8
+msgid "Something's wrong with your database installation. Make sure the appropriate database tables have been created, and make sure the database is readable by the appropriate user."
+msgstr "Nekaj je narobe z namestitvijo vaše podatkovne baze. Preverite, da so bile ustvarjene prave tabele v podatkovni bazi in da je dostop do branja baze omogočen pravemu uporabniku."
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Pojdi"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "%(counter)s rezultat"
+msgstr[1] "%(counter)s rezultata"
+msgstr[2] "%(counter)s rezultati"
+msgstr[3] "%(counter)s rezultatov"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s skupno"
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "Filter"
+
+#: contrib/admin/templates/admin/login.html:17
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+msgid "Username:"
+msgstr "Uporabniško ime:"
+
+#: contrib/admin/templates/admin/login.html:20
+#: contrib/comments/templates/comments/form.html:8
+msgid "Password:"
+msgstr "Geslo:"
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "Dobrodošli,"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid "First, enter a username and password. Then, you'll be able to edit more user options."
+msgstr "Najprej vpišite uporabniško ime in geslo, nato boste lahko urejali druge lastnosti uporabnika."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "Uporabniško ime"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+#: contrib/admin/templates/admin/auth/user/change_password.html:34
+msgid "Password"
+msgstr "Geslo"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+msgid "Password (again)"
+msgstr "Geslo (ponovno)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+msgid "Enter the same password as above, for verification."
+msgstr "Za preverjanje vpišite enako geslo kot zgoraj."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:28
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Vpišite novo geslo za uporabnika <strong>%(username)s</strong>."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Zaznamkice"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "Dokumentacijske zaznamkice"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">Za inštalacijo zaznamkic povlečite povezavo v orodno vrstico\n"
+"z zaznamki, ali kliknite z desno miškino tipko na povezavo in jo dodajte med zaznamke. Zdaj lahko izberete zaznamkico s katerekoli strani tega spletnega mesta. Opomba: nekatere izmed teh strani lahko gledate le z računalnika, ki je označen kot \"notranji\" (v kolikor niste prepričani, če je vaš računalnik označen kot \"notranji\" se obrnite na sistemskega administratorja).</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Dokumentacija te strani"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid "Jumps you from any page to the documentation for the view that generates that page."
+msgstr "Skok na stran z dokumentacijo za pogled (view), ki generira trenutno stran."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Pokaži ID objekta"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid "Shows the content-type and unique ID for pages that represent a single object."
+msgstr "Pokaže content-type in unikatni ID za strani, ki predstavljajo en objekt."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Uredi objekt (v trenutnem oknu)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "Skok na administracijsko stran za vse strani, ki predstavljajo en objekt."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Uredi ta objekt (v novem oknu)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "Kot zgoraj, le da odpre administracijsko stran v novem oknu."
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Datum:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Ura:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Trenutno:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Sprememba:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Ponastavitev gesla"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid "Forgotten your password? Enter your e-mail address below, and we'll reset your password and e-mail the new one to you."
+msgstr "Ste pozabili geslo? Vnesite vaš e-mail naslov in poslali vam bomo novo geslo."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Naslov e-pošte:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Ponastavi moje geslo"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Ta e-mail ste dobili, ker ste zahtevali ponastavitev gesla"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "za vaš uporabniški račun na %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Vaše novo geslo je: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Geslo lahko spremenite z obiskom strani:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Vaše uporabniško ime (za vsak primer):"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Hvala, ker uporabljate našo stran!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Ekipa strani %(site_name)s"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Hvala, ker ste si danes vzeli nekaj časa za to spletno stran."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Ponovna prijava"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Ponastavitev gesla je uspela"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid "We've e-mailed a new password to the e-mail address you submitted. You should be receiving it shortly."
+msgstr "Po e-pošti smo vam poslali novo geslo. Morali bi ga prejeti v kratkem"
+
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:4
+msgid "Password change"
+msgstr "Sprememba gesla"
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid "Please enter your old password, for security's sake, and then enter your new password twice so we can verify you typed it in correctly."
+msgstr "Prosim, vnesite vaše staro geslo (zaradi varnosti) in nato še dvakrat novo (da preverimo, da se niste zatipkali)"
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Staro geslo:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Novo geslo:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Potrditev gesla:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Spremeni moje geslo"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Sprememba gesla je uspela"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Vaše geslo je bilo spremenjeno."
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "domena"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "prikazno ime"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "stran"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "strani"
+
+#: contrib/humanize/templatetags/humanize.py:17
+#, fuzzy
+msgid "th"
+msgstr "th"
+
+#: contrib/humanize/templatetags/humanize.py:17
+#, fuzzy
+msgid "st"
+msgstr "st"
+
+#: contrib/humanize/templatetags/humanize.py:17
+#, fuzzy
+msgid "nd"
+msgstr "nd"
+
+#: contrib/humanize/templatetags/humanize.py:17
+#, fuzzy
+msgid "rd"
+msgstr "rd"
+
+#: contrib/humanize/templatetags/humanize.py:47
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f milijon"
+msgstr[1] "%(value).1f milijona"
+msgstr[2] "%(value).1f milijoni"
+msgstr[3] "%(value).1f milijonov"
+
+#: contrib/humanize/templatetags/humanize.py:50
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f bilijon"
+msgstr[1] "%(value).1f bilijona"
+msgstr[2] "%(value).1f bilijoni"
+msgstr[3] "%(value).1f bilijonov"
+
+#: contrib/humanize/templatetags/humanize.py:53
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f triljon"
+msgstr[1] "%(value).1f triljona"
+msgstr[2] "%(value).1f triljoni"
+msgstr[3] "%(value).1f triljonov"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "one"
+msgstr "ena"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "two"
+msgstr "dva"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "three"
+msgstr "tri"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "four"
+msgstr "štiri"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "five"
+msgstr "pet"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "six"
+msgstr "šest"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "seven"
+msgstr "sedem"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "eight"
+msgstr "osem"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "nine"
+msgstr "devet"
+
+#: contrib/flatpages/models.py:8
+msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr "Primer: '/about/contact/'. Preverite ali vsebuje / (poševnico) na začetku in koncu vnosa."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "naslov"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "vsebina"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "omogoči komentarje"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "ime predloge"
+
+#: contrib/flatpages/models.py:13
+msgid "Example: 'flatpages/contact_page.html'. If this isn't provided, the system will use 'flatpages/default.html'."
+msgstr "Primer: 'flatpages/contact_page.html'. Če to polje ni izpolnjeno, bo sistem uporabil 'flatpages/default.html'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "obvezna registracija"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Če je to polje izbrano, si bodo to stran lahko ogledali le prijavljeni uporabniki."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "enostavna stran"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "enostavne strani"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "preusmeritev iz"
+
+#: contrib/redirects/models.py:8
+msgid "This should be an absolute path, excluding the domain name. Example: '/events/search/'."
+msgstr "Ta pot mora biti absolutna, brez imena domene. Primer: '/events/search'"
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "preusmeri na"
+
+#: contrib/redirects/models.py:10
+msgid "This can be either an absolute path (as above) or a full URL starting with 'http://'."
+msgstr "To je lahko absolutna pot (kot zgoraj) ali popoln URL naslov (ki se začne s 'http://')"
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "preusmeritev"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "preusmeritve"
+
+#: contrib/comments/models.py:67
+#: contrib/comments/models.py:166
+msgid "object ID"
+msgstr "ID objekta"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "naslov"
+
+#: contrib/comments/models.py:69
+#: contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "komentar"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "rating #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "rating #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "rating #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "rating #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "rating #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "rating #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "rating #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "rating #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "je veljavni rating"
+
+#: contrib/comments/models.py:83
+#: contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "datum/čas vnosa"
+
+#: contrib/comments/models.py:84
+#: contrib/comments/models.py:170
+msgid "is public"
+msgstr "je javno"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "je odstranjen/-a"
+
+#: contrib/comments/models.py:86
+msgid "Check this box if the comment is inappropriate. A \"This comment has been removed\" message will be displayed instead."
+msgstr "Odkljukaj, če je komentar neprimeren. Namesto komentarja bo vidno obvestilo \"Ta komentar je bil odstranjen\"."
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "komentarji"
+
+#: contrib/comments/models.py:131
+#: contrib/comments/models.py:207
+msgid "Content object"
+msgstr "Objekt z vsebino"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Poslal uporabnik %(user)s ob %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "ime osebe"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "ip naslov"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "osebje je potrdilo"
+
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "anonimen komentar"
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "anonimni komentarji"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "ocena"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "datum ocene"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "karma točke"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "karma točke"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "oceno %(score)d podelil %(user)s"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Komentar je z zastavico označil %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "datum označitve (zastavice)"
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "uporabniška zastavica"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "uporabniške zastavice"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "Avtor zastavice je %r"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "datum izbrisa"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "izbris s strani moderatorja"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "izbrisi s strani moderatorja"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Izbris opravil moderator %r"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Anonimni uporabniki ne morejo glasovati"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "Neveljavni ID komentarja"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "Ni mogoče glasovati zase"
+
+#: contrib/comments/views/comments.py:27
+msgid "This rating is required because you've entered at least one other rating."
+msgstr "To oceno moraš podati, ker si podal vsaj še eno drugo oceno."
+
+#: contrib/comments/views/comments.py:111
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Ta komentar je poslal uporabnik, ki je do zdaj poslal manj kot %(count)s komentarjev:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Ta komentar je poslal uporabnik, ki je do zdaj poslal manj kot %(count)s komentarja:\n"
+"\n"
+"%(text)s"
+msgstr[2] ""
+"Ta komentar je poslal uporabnik, ki je do zdaj poslal manj kot %(count)s komentarje:\n"
+"\n"
+"%(text)s"
+msgstr[3] ""
+"Ta komentar je poslal uporabnik, ki je do zdaj poslal manj kot %(count)s komentarjev:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:116
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Ta komentar je poslal sumljiv uporabnik:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:188
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Dovoljena je le POST metoda"
+
+#: contrib/comments/views/comments.py:192
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Eno ali več obveznih polj ni vpisanih"
+
+#: contrib/comments/views/comments.py:196
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Nekdo se je poigraval z obrazcem za komentarje (varnostna kršitev)"
+
+#: contrib/comments/views/comments.py:206
+#: contrib/comments/views/comments.py:292
+msgid "The comment form had an invalid 'target' parameter -- the object ID was invalid"
+msgstr "Obrazec s komentarji ima neveljavni parameter 'target' -- ID objekta je neveljaven."
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "Obrazec s komentarji ni podal niti 'preview' niti 'post' akcije."
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Ste pozabili geslo?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Ocene"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Obvezno"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Neobvezno"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Objavi sliko"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Komentar:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Predogled komentarja"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Vaše ime:"
+
+#: contrib/localflavor/au/forms.py:18
+msgid "Enter a 4 digit post code."
+msgstr "Vnesite 4-mestno poštno številko."
+
+#: contrib/localflavor/br/forms.py:18
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Vnesite poštno številko v zapisu XXXXX-XXX."
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "Telefonska številka mora biti v zapisu XX-XXXX-XXXX."
+
+#: contrib/localflavor/br/forms.py:72
+msgid "This field requires only numbers."
+msgstr "To polje lahko vsebuje samo številke."
+
+#: contrib/localflavor/br/forms.py:74
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr "To polje zahteva največ 11 števk ali 14 znakov."
+
+#: contrib/localflavor/br/forms.py:84
+msgid "Invalid CPF number."
+msgstr "Nepravilna CPF številka."
+
+#: contrib/localflavor/br/forms.py:106
+msgid "This field requires at least 14 digits"
+msgstr "To polje mora vsebovati vsaj 14 števk."
+
+#: contrib/localflavor/br/forms.py:116
+msgid "Invalid CNPJ number."
+msgstr "Nepravilna CNPJ številka."
+
+#: contrib/localflavor/ch/forms.py:18
+#: contrib/localflavor/no/forms.py:15
+msgid "Enter a zip code in the format XXXX."
+msgstr "Vnesite veljavno poštno številko v obliki XXXX."
+
+#: contrib/localflavor/ch/forms.py:90
+msgid "Enter a valid Swiss identity or passport card number in X1234567<0 or 1234567890 format."
+msgstr "Vpišite veljavno številko švicarske osebne izkaznice ali potenga lista v zapisu X1234567<0 ali 1234567890"
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr "Aargau"
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr "Appenzell Innerrhoden"
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr "Appenzell Ausserrhoden"
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr "Basel (mesto)"
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr "Basel (dežela)"
+
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr "Berne"
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr "Fribourg"
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr "Ženeva"
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr "Glarus"
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr "Graubuenden"
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr "Jura"
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr "Lucerne"
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr "Neuchatel"
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr "Nidwalden"
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr "Obwalden"
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr "Schaffhausen"
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr "Schwyz"
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr "Solothurn"
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr "St. Gallen"
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr "Thurgau"
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr "Ticino"
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr "Uri"
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr "Valais"
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr "Vaud"
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr "Zug"
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr "Zurich"
+
+#: contrib/localflavor/cl/forms.py:21
+msgid "Enter valid a Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr "Vpišite veljaven čilenski RUT v zapisu XX.XXX.XXX-X."
+
+#: contrib/localflavor/cl/forms.py:26
+msgid "Enter valid a Chilean RUT"
+msgstr "Vnesite veljaven čilski RUT"
+
+#: contrib/localflavor/de/forms.py:16
+#: contrib/localflavor/fi/forms.py:14
+#: contrib/localflavor/fr/forms.py:17
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Vnesite veljavno poštno številko v obliki XXXXX."
+
+#: contrib/localflavor/de/forms.py:60
+msgid "Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X format."
+msgstr "Vpišite veljavno številko nemške osebne izkaznice v zapisu XXXXXXXXXXX-XXXXXXX-XXXXXXX-X."
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr "Baden-Wuerttemberg"
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr "Bavarska"
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr "Berlin"
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr "Brandenburg"
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr "Bremen"
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr "Hamburg"
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr "Hessen"
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr "Mecklenburg-Western Pomerania"
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr "Lower Saxony"
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr "Severno porenje - Westfalija"
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr "Rhineland-Palatinate"
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr "Posarje"
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr "Saxony"
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr "Saška-Anhalt"
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr "Schleswig-Holstein"
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr "Thuringia"
+
+#: contrib/localflavor/fi/forms.py:40
+#: contrib/localflavor/fi/forms.py:45
+msgid "Enter a valid Finnish social security number."
+msgstr "Vnesite veljavno številko finskega socialnega zavarovanja."
+
+#: contrib/localflavor/it/forms.py:16
+msgid "Enter a valid zip code."
+msgstr "Vnesite veljavno poštno številko."
+
+#: contrib/localflavor/it/forms.py:41
+msgid "Enter a valid Social Security number."
+msgstr "Vnesite veljavno številko socialnega zavarovanja."
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr "Vnesite veljavno davčno (VAT) številko."
+
+#: contrib/localflavor/jp/forms.py:21
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "Vpišite poštno številko v zapisu XXXXXXX or XXX-XXXX."
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr "Hokaido"
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr "Aomori"
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr "Iwate"
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr "Miyagi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr "Akita"
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr "Jamagata"
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr "Fukushima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr "Ibaraki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr "Točigi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr "Gunma"
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr "Saitama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr "Čiba"
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr "Tokio"
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr "Kanagawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr "Jamanaši"
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr "Nagano"
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr "Niigata"
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr "Toyama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr "Išikava"
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr "Fukui"
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr "Gifu"
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr "Šizuoka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr "Aichi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr "Mie"
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr "Šiga"
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr "Kjoto"
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr "Osaka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr "Hjogo"
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr "Nara"
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr "Vakajama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr "Tottori"
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr "Šimane"
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr "Okajama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr "Hirošima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr "Jamaguči"
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr "Tokušima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr "Kagawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr "Ehime"
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr "Koči"
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr "Fukuoka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr "Saga"
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr "Nagasaki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr "Kumamoto"
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr "Oita"
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr "Miyazaki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr "Kagošima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr "Okinava"
+
+#: contrib/localflavor/no/forms.py:36
+msgid "Enter a valid Norwegian social security number."
+msgstr "Vnesite veljavno številko norveškega socialnega zavarovanja."
+
+#: contrib/localflavor/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
+msgstr "Vpišite poštno številko. Med dvema deloma poštne številke je obvezen presledek."
+
+#: contrib/localflavor/us/forms.py:18
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "Vnesite poštno številko v zapisu XXXXX ali XXXXX-XXXX."
+
+#: contrib/localflavor/us/forms.py:51
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr "Vpišite veljavno številko ameriškega socialnega zavarovanja v zapisu XXX-XX-XXXX."
+
+#: contrib/localflavor/is_/forms.py:16
+msgid "Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr "Vpišite pravilno islandsko identifikacijsko številko v zapisu XXXXXX-XXXX."
+
+#: contrib/localflavor/is_/forms.py:30
+msgid "The Icelandic identification number is not valid."
+msgstr "Islandska identifikacijska številka ni pravilna."
+
+#: contrib/sessions/models.py:68
+msgid "session key"
+msgstr "ključ seje"
+
+#: contrib/sessions/models.py:69
+msgid "session data"
+msgstr "podatki seje"
+
+#: contrib/sessions/models.py:70
+msgid "expire date"
+msgstr "čaz izteka"
+
+#: contrib/sessions/models.py:74
+msgid "session"
+msgstr "seja"
+
+#: contrib/sessions/models.py:75
+msgid "sessions"
+msgstr "seje"
+
+#: contrib/contenttypes/models.py:36
+msgid "python model class name"
+msgstr "python ime razreda modela"
+
+#: contrib/contenttypes/models.py:39
+msgid "content type"
+msgstr "tip vsebine"
+
+#: contrib/contenttypes/models.py:40
+msgid "content types"
+msgstr "tipi vsebine"
+
+#: oldforms/__init__.py:392
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Poskrbite, da bo tekst krajši od %s znaka."
+msgstr[1] "Poskrbite, da bo tekst krajši od %s znakov."
+msgstr[2] "Poskrbite, da bo tekst krajši od %s znakov."
+msgstr[3] "Poskrbite, da bo tekst krajši od %s znakov."
+
+#: oldforms/__init__.py:397
+msgid "Line breaks are not allowed here."
+msgstr "Prelomi vrstice tu niso dovoljeni."
+
+#: oldforms/__init__.py:498
+#: oldforms/__init__.py:571
+#: oldforms/__init__.py:610
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Izberite veljavno možnost; '%(data)s' ni v %(choices)s."
+
+#: oldforms/__init__.py:674
+msgid "The submitted file is empty."
+msgstr "Poslana datoteka je prazna."
+
+#: oldforms/__init__.py:730
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Vnesite celo število med -32.768 in 32.767."
+
+#: oldforms/__init__.py:740
+msgid "Enter a positive number."
+msgstr "Vnesite pozitivno število."
+
+#: oldforms/__init__.py:750
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Vnesite celo število med 0 in 32.767."
+
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "%(verbose_name)s je bil uspešno ustvarjen."
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "%(verbose_name)s je bil uspešno posodobljen."
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "%(verbose_name)s je bil uspešno izbrisan."
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "ponedeljek"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "torek"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "sreda"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "četrtek"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "petek"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "sobota"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "nedelja"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "januar"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "februar"
+
+#: utils/dates.py:14
+#: utils/dates.py:27
+msgid "March"
+msgstr "marec"
+
+#: utils/dates.py:14
+#: utils/dates.py:27
+msgid "April"
+msgstr "april"
+
+#: utils/dates.py:14
+#: utils/dates.py:27
+msgid "May"
+msgstr "maj"
+
+#: utils/dates.py:14
+#: utils/dates.py:27
+msgid "June"
+msgstr "junij"
+
+#: utils/dates.py:15
+#: utils/dates.py:27
+msgid "July"
+msgstr "julij"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "avgust"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "september"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "oktober"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "november"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "december"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr "jan"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "feb"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "mar"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "apr"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "maj"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "jun"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "jul"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "avg"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "sep"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "okt"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "nov"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "dec"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "jan."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "feb."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "avg."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "sep."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "okt."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "nov."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "dec."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "leto"
+msgstr[1] "leti"
+msgstr[2] "leta"
+msgstr[3] "let"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mesec"
+msgstr[1] "meseca"
+msgstr[2] "meseci"
+msgstr[3] "mesecev"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "teden"
+msgstr[1] "tedna"
+msgstr[2] "tedni"
+msgstr[3] "tednov"
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "dan"
+msgstr[1] "dneva"
+msgstr[2] "dnevi"
+msgstr[3] "dni"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "ura"
+msgstr[1] "uri"
+msgstr[2] "ure"
+msgstr[3] "ur"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuta"
+msgstr[1] "minuti"
+msgstr[2] "minute"
+msgstr[3] "minut"
+
+#: utils/timesince.py:40
+#, python-format
+msgid "%d milliseconds"
+msgstr "%d milisekund"
+
+#: utils/timesince.py:41
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr "%(number)d %(type)s"
+
+#: utils/timesince.py:47
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ", %(number)d %(type)s"
+
+#: utils/dateformat.py:40
+msgid "p.m."
+msgstr "p.m."
+
+#: utils/dateformat.py:41
+msgid "a.m."
+msgstr "a.m."
+
+#: utils/dateformat.py:46
+msgid "PM"
+msgstr "PM"
+
+#: utils/dateformat.py:47
+msgid "AM"
+msgstr "AM"
+
+#: utils/dateformat.py:95
+msgid "midnight"
+msgstr "polnoč"
+
+#: utils/dateformat.py:97
+msgid "noon"
+msgstr "poldne"
+
+#: utils/translation/trans_real.py:358
+msgid "DATE_FORMAT"
+msgstr "N j, Y"
+
+#: utils/translation/trans_real.py:359
+msgid "DATETIME_FORMAT"
+msgstr "N j, Y, P"
+
+#: utils/translation/trans_real.py:360
+msgid "TIME_FORMAT"
+msgstr "P"
+
+#: utils/translation/trans_real.py:376
+msgid "YEAR_MONTH_FORMAT"
+msgstr "YEAR_MONTH_FORMAT"
+
+#: utils/translation/trans_real.py:377
+msgid "MONTH_DAY_FORMAT"
+msgstr "MONTH_DAY_FORMAT"
+
+#: template/defaultfilters.py:491
+msgid "yes,no,maybe"
+msgstr "da,ne,morda"
+
+#: template/defaultfilters.py:520
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d bajt"
+msgstr[1] "%(size)d bajta"
+msgstr[2] "%(size)d bajti"
+msgstr[3] "%(size)d bajtov"
+
+#: template/defaultfilters.py:522
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f KB"
+
+#: template/defaultfilters.py:524
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: template/defaultfilters.py:525
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#: newforms/fields.py:110
+#: newforms/fields.py:324
+#, python-format
+msgid "Ensure this value has at most %d characters."
+msgstr "Poskrbite, da bo imela ta vrednost največ %d znakov."
+
+#: newforms/fields.py:112
+#: newforms/fields.py:326
+#, python-format
+msgid "Ensure this value has at least %d characters."
+msgstr "Poskrbite, da bo imela ta vrednost vsaj %d znakov."
+
+#: newforms/fields.py:137
+#: newforms/fields.py:160
+#: newforms/fields.py:192
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Poskrbite, da bo imela ta vrednost manj manj kot ali natanko %s znakov."
+
+#: newforms/fields.py:139
+#: newforms/fields.py:162
+#: newforms/fields.py:194
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Poskrbite, da bo ta vrednost večja ali kvečjemu enaka %s."
+
+#: newforms/fields.py:158
+#: newforms/fields.py:186
+msgid "Enter a number."
+msgstr "Vnesite število."
+
+#: newforms/fields.py:196
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr "Poskrbite, da skupno ne bo več kot %s števil."
+
+#: newforms/fields.py:198
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr "Poskrbite, da skupno ne bo več kot %s decimalnih mest."
+
+#: newforms/fields.py:200
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr "Poskrbite, da ne bo več kot %s števil pred decimalno piko."
+
+#: newforms/fields.py:233
+#: newforms/fields.py:567
+msgid "Enter a valid date."
+msgstr "Vnesite veljaven datum."
+
+#: newforms/fields.py:260
+#: newforms/fields.py:569
+msgid "Enter a valid time."
+msgstr "Vnesite veljaven čas."
+
+#: newforms/fields.py:296
+msgid "Enter a valid date/time."
+msgstr "Vnesite veljaven datum/čas."
+
+#: newforms/fields.py:310
+msgid "Enter a valid value."
+msgstr "Vnesite veljavno vrednost."
+
+#: newforms/fields.py:357
+#: newforms/fields.py:379
+msgid "Enter a valid URL."
+msgstr "Vnesite veljavne URL naslov."
+
+#: newforms/fields.py:381
+msgid "This URL appears to be a broken link."
+msgstr "Izgleda, da povezava na ta URL ne deluje."
+
+#: newforms/fields.py:432
+#: newforms/models.py:172
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Izberite veljavno možnost. Te možnosti ni med možnimi izbirami."
+
+#: newforms/fields.py:448
+#: newforms/fields.py:527
+#: newforms/models.py:189
+msgid "Enter a list of values."
+msgstr "Vnesite seznam vrednosti."
+
+#: newforms/fields.py:457
+#: newforms/models.py:195
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Izberite veljavno možnost. %s ni med možnimi izbirami."
+
+#~ msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+#~ msgstr "Ste <a href=\"/password_reset/\">pozabili geslo</a>?"
+#~ msgid "Use '[algo]$[salt]$[hexdigest]'"
+#~ msgstr "Uporabi '[algo]$[salt]$[hexdigest]'"
+#~ msgid "Comment"
+#~ msgstr "Komentar"
+#~ msgid "Comments"
+#~ msgstr "Komentarji"
+#~ msgid "String (up to 50)"
+#~ msgstr "Niz (do 50 znakov)"
+#~ msgid "label"
+#~ msgstr "oznaka"
+#~ msgid "package"
+#~ msgstr "paket"
+#~ msgid "packages"
+#~ msgstr "paketi"
+#~ msgid "Slovene"
+#~ msgstr "Slovensko"
+
diff --git a/webapp/django/conf/locale/sl/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/sl/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..14d7ffe
--- /dev/null
+++ b/webapp/django/conf/locale/sl/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/sl/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/sl/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..8ad259a
--- /dev/null
+++ b/webapp/django/conf/locale/sl/LC_MESSAGES/djangojs.po
@@ -0,0 +1,116 @@
+# Copyright (C) 2007
+# This file is distributed under the same license as the PACKAGE package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-07-02 13:55+0200\n"
+"PO-Revision-Date: 2007-07-02 13:56+0100\n"
+"Last-Translator: Gasper Koren <skrat@owca.info>\n"
+"Language-Team: SLOVENIAN <lugos-slo@lugos.si>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Slovenian\n"
+"X-Poedit-Country: SLOVENIA\n"
+
+#: contrib/admin/media/js/calendar.js:24
+#: contrib/admin/media/js/dateparse.js:32
+msgid "January February March April May June July August September October November December"
+msgstr "Januar Februar Marec April Maj Junij Julij Avgust September Oktober November December"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "N P T S Č P S"
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Nedelja Ponedeljek Torek Sreda Četrtek Petek Sobota"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "Možne %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Izberi vse"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Dodaj"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Odstrani"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Izberite %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Izberite in kliknite"
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Izbriši vse"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Now"
+msgstr "Sedaj"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
+msgid "Clock"
+msgstr "URA"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
+msgid "Choose a time"
+msgstr "Izberite čas"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "Midnight"
+msgstr "Polnoč"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "6 a.m."
+msgstr "Ob 6h"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
+msgid "Noon"
+msgstr "Opoldne"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
+msgid "Cancel"
+msgstr "Prekliči"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
+msgid "Today"
+msgstr "Danes"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
+msgid "Calendar"
+msgstr "Koledar"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
+msgid "Yesterday"
+msgstr "Včeraj"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
+msgid "Tomorrow"
+msgstr "Jutri"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr "Prikaži"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr "Skrij"
+
diff --git a/webapp/django/conf/locale/sr/LC_MESSAGES/django.mo b/webapp/django/conf/locale/sr/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..89e36aa
--- /dev/null
+++ b/webapp/django/conf/locale/sr/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/sr/LC_MESSAGES/django.po b/webapp/django/conf/locale/sr/LC_MESSAGES/django.po
new file mode 100644
index 0000000..b893452
--- /dev/null
+++ b/webapp/django/conf/locale/sr/LC_MESSAGES/django.po
@@ -0,0 +1,4504 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-07-29 12:06+0200\n"
+"PO-Revision-Date: 2008-07-29 12:52+0100\n"
+"Last-Translator: Nebojsa Djordjevic <djnesh@gmail.com>\n"
+"Language-Team: Nesh <djnesh@gmail.com> & Petar <petar.maric@gmail.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Poedit-Country: YUGOSLAVIA\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"X-Poedit-Basepath: ../../../../\n"
+"X-Poedit-Language: Serbian\n"
+
+#: conf/global_settings.py:44
+msgid "Arabic"
+msgstr "Arapski"
+
+#: conf/global_settings.py:45
+msgid "Bengali"
+msgstr "Bengalski"
+
+#: conf/global_settings.py:46
+msgid "Bulgarian"
+msgstr "Bugarski"
+
+#: conf/global_settings.py:47
+#, fuzzy
+msgid "Catalan"
+msgstr "Italijanski"
+
+#: conf/global_settings.py:48
+msgid "Czech"
+msgstr "Češki"
+
+#: conf/global_settings.py:49
+msgid "Welsh"
+msgstr "Welšski"
+
+#: conf/global_settings.py:50
+msgid "Danish"
+msgstr "Danski"
+
+#: conf/global_settings.py:51
+msgid "German"
+msgstr "Nemački"
+
+#: conf/global_settings.py:52
+msgid "Greek"
+msgstr "Grčki"
+
+#: conf/global_settings.py:53
+msgid "English"
+msgstr "Engleski"
+
+#: conf/global_settings.py:54
+msgid "Spanish"
+msgstr "Španski"
+
+#: conf/global_settings.py:55
+#, fuzzy
+msgid "Estonian"
+msgstr "Rumunski"
+
+#: conf/global_settings.py:56
+msgid "Argentinean Spanish"
+msgstr "Španski (Argentina)"
+
+#: conf/global_settings.py:57
+msgid "Basque"
+msgstr "Baskijski"
+
+#: conf/global_settings.py:58
+msgid "Persian"
+msgstr "Persijski"
+
+#: conf/global_settings.py:59
+msgid "Finnish"
+msgstr "Finski"
+
+#: conf/global_settings.py:60
+msgid "French"
+msgstr "Francuski"
+
+#: conf/global_settings.py:61
+msgid "Irish"
+msgstr "Irski"
+
+#: conf/global_settings.py:62
+msgid "Galician"
+msgstr "Galski"
+
+#: conf/global_settings.py:63
+msgid "Hungarian"
+msgstr "Mađarski"
+
+#: conf/global_settings.py:64
+msgid "Hebrew"
+msgstr "Hebrejski"
+
+#: conf/global_settings.py:65
+msgid "Croatian"
+msgstr "Hrvatski"
+
+#: conf/global_settings.py:66
+msgid "Icelandic"
+msgstr "Islandski"
+
+#: conf/global_settings.py:67
+msgid "Italian"
+msgstr "Italijanski"
+
+#: conf/global_settings.py:68
+msgid "Japanese"
+msgstr "Japanski"
+
+#: conf/global_settings.py:69
+#, fuzzy
+msgid "Georgian"
+msgstr "Nemački"
+
+#: conf/global_settings.py:70
+#, fuzzy
+msgid "Korean"
+msgstr "Norveški"
+
+#: conf/global_settings.py:71
+msgid "Khmer"
+msgstr "Kmerski"
+
+# wtf?
+#: conf/global_settings.py:72
+#, fuzzy
+msgid "Kannada"
+msgstr ""
+
+#: conf/global_settings.py:73
+msgid "Latvian"
+msgstr "Latvijski"
+
+#: conf/global_settings.py:74
+msgid "Lithuanian"
+msgstr "Litvanijski"
+
+#: conf/global_settings.py:75
+msgid "Macedonian"
+msgstr "Makedonski"
+
+#: conf/global_settings.py:76
+msgid "Dutch"
+msgstr "Holandski"
+
+#: conf/global_settings.py:77
+msgid "Norwegian"
+msgstr "Norveški"
+
+#: conf/global_settings.py:78
+msgid "Polish"
+msgstr "Poljski"
+
+#: conf/global_settings.py:79
+msgid "Portugese"
+msgstr "Portugalski"
+
+#: conf/global_settings.py:80
+#, fuzzy
+msgid "Brazilian Portuguese"
+msgstr "Brazilski"
+
+#: conf/global_settings.py:81
+msgid "Romanian"
+msgstr "Rumunski"
+
+#: conf/global_settings.py:82
+msgid "Russian"
+msgstr "Ruski"
+
+#: conf/global_settings.py:83
+msgid "Slovak"
+msgstr "Slovački"
+
+#: conf/global_settings.py:84
+msgid "Slovenian"
+msgstr "Slovenački"
+
+#: conf/global_settings.py:85
+msgid "Serbian"
+msgstr "Srpski"
+
+#: conf/global_settings.py:86
+msgid "Swedish"
+msgstr "Švedski"
+
+#: conf/global_settings.py:87
+#, fuzzy
+msgid "Tamil"
+msgstr ""
+
+#: conf/global_settings.py:88
+#, fuzzy
+msgid "Telugu"
+msgstr ""
+
+#: conf/global_settings.py:89
+msgid "Turkish"
+msgstr "Turski"
+
+#: conf/global_settings.py:90
+msgid "Ukrainian"
+msgstr "Ukrajinski"
+
+#: conf/global_settings.py:91
+msgid "Simplified Chinese"
+msgstr "Kineski (pojednostavljen)"
+
+#: conf/global_settings.py:92
+msgid "Traditional Chinese"
+msgstr "Tradicionalni Kineski"
+
+#: contrib/admin/filterspecs.py:44
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Po %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:74
+#: contrib/admin/filterspecs.py:92
+#: contrib/admin/filterspecs.py:147
+#: contrib/admin/filterspecs.py:173
+msgid "All"
+msgstr "Sve"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Any date"
+msgstr "Bilo koji datum"
+
+#: contrib/admin/filterspecs.py:114
+msgid "Today"
+msgstr "Danas"
+
+#: contrib/admin/filterspecs.py:117
+msgid "Past 7 days"
+msgstr "U zadnjih 7 dana"
+
+#: contrib/admin/filterspecs.py:119
+msgid "This month"
+msgstr "Ovoga meseca"
+
+#: contrib/admin/filterspecs.py:121
+msgid "This year"
+msgstr "Ove godine"
+
+#: contrib/admin/filterspecs.py:147
+#: forms/widgets.py:379
+#: oldforms/__init__.py:592
+msgid "Yes"
+msgstr "Da"
+
+#: contrib/admin/filterspecs.py:147
+#: forms/widgets.py:379
+#: oldforms/__init__.py:592
+msgid "No"
+msgstr "Ne"
+
+#: contrib/admin/filterspecs.py:154
+#: forms/widgets.py:379
+#: oldforms/__init__.py:592
+msgid "Unknown"
+msgstr "Nepoznato"
+
+#: contrib/admin/models.py:19
+msgid "action time"
+msgstr "vreme aktivnosti"
+
+#: contrib/admin/models.py:22
+msgid "object id"
+msgstr "id objekta"
+
+#: contrib/admin/models.py:23
+msgid "object repr"
+msgstr "opis objekta"
+
+#: contrib/admin/models.py:24
+msgid "action flag"
+msgstr "oznaka aktivnosti"
+
+#: contrib/admin/models.py:25
+msgid "change message"
+msgstr "opis izmene"
+
+#: contrib/admin/models.py:28
+msgid "log entry"
+msgstr "unos u dnevniku izmena"
+
+#: contrib/admin/models.py:29
+msgid "log entries"
+msgstr "unosi u dnevniku izmena"
+
+#: contrib/admin/options.py:161
+#: contrib/admin/options.py:180
+msgid "None"
+msgstr "None"
+
+#: contrib/admin/options.py:347
+#: contrib/auth/admin.py:37
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Uspešno dodat %(name)s \"%(obj)s\"."
+
+#: contrib/admin/options.py:351
+#: contrib/admin/options.py:419
+#: contrib/auth/admin.py:42
+msgid "You may edit it again below."
+msgstr "Možete ga ponovo izmeniti."
+
+#: contrib/admin/options.py:361
+#: contrib/admin/options.py:428
+#, python-format
+msgid "You may add another %s below."
+msgstr "Možete dodati još jedan %s."
+
+#: contrib/admin/options.py:395
+#, python-format
+msgid "Changed %s."
+msgstr "Izmenjen %s."
+
+#: contrib/admin/options.py:395
+#: contrib/admin/options.py:405
+#: core/validators.py:279
+#: db/models/manipulators.py:305
+msgid "and"
+msgstr "i"
+
+#: contrib/admin/options.py:400
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Dodato %(name)s \"%(object)s\"."
+
+#: contrib/admin/options.py:404
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Promenjeno %(list)s za %(name)s \"%(object)s\"."
+
+#: contrib/admin/options.py:409
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Obrisano %(name)s \"%(object)s\"."
+
+#: contrib/admin/options.py:414
+msgid "No fields changed."
+msgstr "Nijedno polje nije izmenjeno."
+
+#: contrib/admin/options.py:417
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Uspešno izmenjen: %(name)s \"%(obj)s\"."
+
+#: contrib/admin/options.py:425
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" je uspešno dodat. Možete ga ponovo izmeniti."
+
+#: contrib/admin/options.py:506
+#, python-format
+msgid "Add %s"
+msgstr "Dodajte %s"
+
+#: contrib/admin/options.py:568
+#, python-format
+msgid "Change %s"
+msgstr "Izmeni %s"
+
+#: contrib/admin/options.py:598
+msgid "Database error"
+msgstr "Greška u bazi podataka"
+
+#: contrib/admin/options.py:647
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Uspešno obrisan: %(name)s \"%(obj)s\"."
+
+#: contrib/admin/options.py:653
+msgid "Are you sure?"
+msgstr "Da li ste sigurni?"
+
+#: contrib/admin/options.py:680
+#, python-format
+msgid "Change history: %s"
+msgstr "Istorija izmena: %s"
+
+#: contrib/admin/sites.py:18
+#: contrib/admin/views/decorators.py:16
+#: contrib/auth/forms.py:70
+#: contrib/comments/views/comments.py:56
+msgid "Please enter a correct username and password. Note that both fields are case-sensitive."
+msgstr "Unesite ispravno korisničko ime i šifru. Napomena: oba polja prave razliku između velikih i malih slova."
+
+#: contrib/admin/sites.py:233
+#: contrib/admin/views/decorators.py:68
+msgid "Please log in again, because your session has expired. Don't worry: Your submission has been saved."
+msgstr "Ponovo se prijavite pošto je vaša sesija istekla. Ne brinite, vaši podaci su sačuvani."
+
+#: contrib/admin/sites.py:240
+#: contrib/admin/views/decorators.py:75
+msgid "Looks like your browser isn't configured to accept cookies. Please enable cookies, reload this page, and try again."
+msgstr "Vaš internet čitač nije prihvatio \"cookie\". Nakon aktiviranja odgovarajuće opcije ponovo učitajte stranu."
+
+#: contrib/admin/sites.py:254
+#: contrib/admin/sites.py:260
+#: contrib/admin/views/decorators.py:92
+msgid "Usernames cannot contain the '@' character."
+msgstr "Korisnička imena ne mogu sadržati karakter '@'."
+
+#: contrib/admin/sites.py:257
+#: contrib/admin/views/decorators.py:88
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "Vaše korisničko ime nije data e-mail adresa. Pokušajte sa '%s'."
+
+#: contrib/admin/sites.py:325
+msgid "Site administration"
+msgstr "Administracija sajta"
+
+#: contrib/admin/sites.py:347
+#: contrib/admin/templates/admin/login.html:27
+#: contrib/admin/views/decorators.py:30
+msgid "Log in"
+msgstr "Prijavite se"
+
+#: contrib/admin/util.py:126
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Jedno ili više %(fieldname)s u %(name)s: %(obj)s"
+
+#: contrib/admin/util.py:131
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Jedan ili više %(fieldname)s u %(name)s:"
+
+#: contrib/admin/widgets.py:65
+msgid "Date:"
+msgstr "Datum:"
+
+#: contrib/admin/widgets.py:65
+msgid "Time:"
+msgstr "Vreme:"
+
+#: contrib/admin/widgets.py:89
+msgid "Currently:"
+msgstr "Trenutno:"
+
+#: contrib/admin/widgets.py:89
+msgid "Change:"
+msgstr "Izmenite:"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Strana nije pronađena"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Tražena strana ne postoji."
+
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/change_form.html:17
+#: contrib/admin/templates/admin/change_list.html:8
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/auth/user/change_password.html:10
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+msgid "Home"
+msgstr "Početna strana"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Greška na serveru"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Greška na serveru (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Greška na serveru <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid "There's been an error. It's been reported to the site administrators via e-mail and should be fixed shortly. Thanks for your patience."
+msgstr "Dogodila se greška koja je prijavljena administratorima."
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "Dobrodošli,"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+msgid "Documentation"
+msgstr "Dokumentacija"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:13
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+msgid "Change password"
+msgstr "Izmenite lozinku"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/comments/templates/comments/form.html:6
+msgid "Log out"
+msgstr "Odjavite se"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django administracija sajta"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django administracija"
+
+#: contrib/admin/templates/admin/change_form.html:19
+#: contrib/admin/templates/admin/index.html:29
+msgid "Add"
+msgstr "Dodajte"
+
+#: contrib/admin/templates/admin/change_form.html:26
+#: contrib/admin/templates/admin/object_history.html:5
+msgid "History"
+msgstr "Istorija"
+
+#: contrib/admin/templates/admin/change_form.html:27
+msgid "View on site"
+msgstr "Pogledaj na sajtu"
+
+#: contrib/admin/templates/admin/change_form.html:37
+#: contrib/admin/templates/admin/auth/user/change_password.html:22
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Ispravite dole navedenu grešku."
+msgstr[1] "Ispravite dole navedene greške."
+msgstr[2] "Ispravite dole navedene greške."
+
+#: contrib/admin/templates/admin/change_list.html:16
+#, python-format
+msgid "Add %(name)s"
+msgstr "Dodajte %(name)s"
+
+#: contrib/admin/templates/admin/change_list.html:26
+msgid "Filter"
+msgstr "Filter"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+#: contrib/admin/templates/admin/edit_inline/tabular.html:15
+msgid "Delete"
+msgstr "Obrišite"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:15
+#, python-format
+msgid "Deleting the %(object_name)s '%(escaped_object)s' would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:"
+msgstr "Brisanjem %(object_name)s  '%(escaped_object)s' došlo bi do brisanja pridruženih objekata, ali nemate prava da brišete sledeće objekte:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:22
+#, python-format
+msgid "Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? All of the following related items will be deleted:"
+msgstr "Da li ste sigurni da želite da obrišete %(object_name)s \"%(escaped_object)s\"? Takođe će biti obrisani sledeći pridruženi objekti:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:27
+msgid "Yes, I'm sure"
+msgstr "Da, siguran sam"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Po %(filter_title)s"
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Dostupni modeli u aplikaciji %(name)s."
+
+#: contrib/admin/templates/admin/index.html:19
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:35
+msgid "Change"
+msgstr "Izmenite"
+
+#: contrib/admin/templates/admin/index.html:45
+msgid "You don't have permission to edit anything."
+msgstr "Nemate prava da vršite izmene."
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "Recent Actions"
+msgstr "Poslednje aktivnosti"
+
+#: contrib/admin/templates/admin/index.html:54
+msgid "My Actions"
+msgstr "Moje aktivnosti"
+
+#: contrib/admin/templates/admin/index.html:58
+msgid "None available"
+msgstr "Bez aktivnosti"
+
+#: contrib/admin/templates/admin/invalid_setup.html:7
+msgid "Something's wrong with your database installation. Make sure the appropriate database tables have been created, and make sure the database is readable by the appropriate user."
+msgstr "Nešto nije u redu sa vašom istalacijom baze podataka. Proverite da li su sve tabele kreirane i čitljive od strane definisanog korisnika."
+
+#: contrib/admin/templates/admin/login.html:19
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+msgid "Username:"
+msgstr "Korisničko ime:"
+
+#: contrib/admin/templates/admin/login.html:22
+#: contrib/comments/templates/comments/form.html:8
+msgid "Password:"
+msgstr "Lozinka:"
+
+#: contrib/admin/templates/admin/object_history.html:16
+msgid "Date/time"
+msgstr "Datum/vreme"
+
+#: contrib/admin/templates/admin/object_history.html:17
+msgid "User"
+msgstr "Korisnik"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Action"
+msgstr "Aktivnost"
+
+#: contrib/admin/templates/admin/object_history.html:24
+msgid "DATE_WITH_TIME_FULL"
+msgstr "j. N Y, H:i"
+
+#: contrib/admin/templates/admin/object_history.html:32
+msgid "This object doesn't have a change history. It probably wasn't added via this admin site."
+msgstr "Ovaj objekat nema istoriju promena. Najverovatnije nije dodat korišćenjem administracije sajta."
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Prikaži sve"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Nađi"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 rezultat"
+msgstr[1] "%(counter)s rezultata"
+msgstr[2] "%(counter)s rezultata"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s ukupno"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Snimite kao novi"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Snimite i dodaj još jedan"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Snimite i nastavite sa izmenama"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Snimite"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid "First, enter a username and password. Then, you'll be able to edit more user options."
+msgstr "Prvo unesite korisničko ime i lozinku da bi ste mogli menjati ostale opcije za korisnika."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:13
+#: contrib/auth/forms.py:12
+#: contrib/auth/forms.py:49
+msgid "Username"
+msgstr "Korisničko ime"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:20
+#: contrib/admin/templates/admin/auth/user/change_password.html:33
+#: contrib/auth/forms.py:15
+#: contrib/auth/forms.py:50
+#: contrib/auth/forms.py:166
+msgid "Password"
+msgstr "Lozinka"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:26
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+#: contrib/auth/forms.py:167
+msgid "Password (again)"
+msgstr "Lozinka (ponovo)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:27
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+msgid "Enter the same password as above, for verification."
+msgstr "Zbog provere, ponovite lozinku."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:26
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Unesite novu lozinku za korisnika <strong>%(username)s</strong>."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Bookmarklets"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+msgid "Documentation bookmarklets"
+msgstr "Dokumentacioni \"bookmarklets\""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:8
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">Da bi ste instalirali \"bookmarklet\", odvucite link u vaše \"bookmark\"-e, ili kliknite desnim tasterom i dodajte ga. Sada možete da izaberete \"bookmark\" sa bilo koje strane na sajtu. Napomena: pristup nekima od strana mora biti sa kompjutera čija je IP adresa označena kao \"internal\" (kontaktirajte sistem administratora ako niste sigurni da li je vaš IP označen kao \"internal\").</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:18
+msgid "Documentation for this page"
+msgstr "Dokumentacija za ovu stranu"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Jumps you from any page to the documentation for the view that generates that page."
+msgstr "Skače sa bilo koje strane na stranu sa dokumentacijom za \"view\" koji generiše tu stranu."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:21
+msgid "Show object ID"
+msgstr "Prikažite ID objekta"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Shows the content-type and unique ID for pages that represent a single object."
+msgstr "Prikazuje \"content-type\" i jedinstveni ID strane koje predstavlja jedan objekt."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:24
+msgid "Edit this object (current window)"
+msgstr "Izmena objekta (u aktivnom prozoru)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "Skače na admin stranu za strane koje predstavljaju objekt."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:27
+msgid "Edit this object (new window)"
+msgstr "Izmeni objekat (novi prozor)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "As above, but opens the admin page in a new window."
+msgstr "Kao iznad, samo otvara admin stranu u novom prozoru."
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Hvala Vam na poseti."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Prijavite se ponovo"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Izmenite lozinku"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Lozinka je uspešno izmenjena"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Vaša lozinka je izmenjena."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid "Please enter your old password, for security's sake, and then enter your new password twice so we can verify you typed it in correctly."
+msgstr "Unesite staru lozinku, nakon toga unesite novu lozinku dva puta, radi provere ispravnosti unosa."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Stara lozinka:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Nova lozinka:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Potvrdite novu lozinku:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Izmenite moju lozinku"
+
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+msgid "Password reset"
+msgstr "Resetovanje lozinke"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Vaša lozinka je uspešno resetovana"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid "We've e-mailed a new password to the e-mail address you submitted. You should be receiving it shortly."
+msgstr "Nova lozinka vam je poslata na zadatu e-mail adresu. E-mail bi trebao da stigne u narednih nekoliko minuta."
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Primili ste ovaj e-mail jer ste zatražili resetovanje lozinke"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "za vaš korisnički nalog na %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Vaša nova lozinka je: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Lozinku možete izmeniti na sledećoj strani:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Vaše korisničko ime, u slučaju da ste zaboravili:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Hvala Vam na poseti!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s tim"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid "Forgotten your password? Enter your e-mail address below, and we'll reset your password and e-mail the new one to you."
+msgstr "Zaboravili ste svoju lozinku? Unesite vašu e-mail adresu i dobićete novu lozinku na dati e-mail."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "E-mail adresa:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Resetujte moju lozinku"
+
+#: contrib/admin/templatetags/admin_list.py:257
+msgid "All dates"
+msgstr "Svi datumi"
+
+#: contrib/admin/views/main.py:65
+#, python-format
+msgid "Select %s"
+msgstr "Izaberite %s"
+
+#: contrib/admin/views/main.py:65
+#, python-format
+msgid "Select %s to change"
+msgstr "Izaberite %s za izmenu"
+
+#: contrib/admindocs/views.py:53
+#: contrib/admindocs/views.py:55
+#: contrib/admindocs/views.py:57
+msgid "tag:"
+msgstr ""
+
+#: contrib/admindocs/views.py:87
+#: contrib/admindocs/views.py:89
+#: contrib/admindocs/views.py:91
+msgid "filter:"
+msgstr ""
+
+#: contrib/admindocs/views.py:153
+#: contrib/admindocs/views.py:155
+#: contrib/admindocs/views.py:157
+msgid "view:"
+msgstr ""
+
+#: contrib/admindocs/views.py:187
+#, python-format
+msgid "App %r not found"
+msgstr "Aplikacija %r nije nađena"
+
+#: contrib/admindocs/views.py:194
+#, python-format
+msgid "Model %(model_name)r not found in app %(app_label)r"
+msgstr "Model %(model_name)r nije nađen u aplikaciji %(app_label)r"
+
+#: contrib/admindocs/views.py:206
+#, python-format
+msgid "the related `%(app_label)s.%(data_type)s` object"
+msgstr "povezani `%(app_label)s.%(data_type)s` objekti"
+
+#: contrib/admindocs/views.py:206
+#: contrib/admindocs/views.py:228
+#: contrib/admindocs/views.py:242
+#: contrib/admindocs/views.py:247
+msgid "model:"
+msgstr ""
+
+#: contrib/admindocs/views.py:237
+#, python-format
+msgid "related `%(app_label)s.%(object_name)s` objects"
+msgstr "povezani `%(app_label)s.%(object_name)s` objekti"
+
+#: contrib/admindocs/views.py:242
+#, python-format
+msgid "all %s"
+msgstr "svi %s"
+
+#: contrib/admindocs/views.py:247
+#, python-format
+msgid "number of %s"
+msgstr "broj %s"
+
+#: contrib/admindocs/views.py:253
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Polja u %s objekata"
+
+#: contrib/admindocs/views.py:317
+#: contrib/admindocs/views.py:328
+#: contrib/admindocs/views.py:330
+#: contrib/admindocs/views.py:336
+#: contrib/admindocs/views.py:337
+#: contrib/admindocs/views.py:339
+msgid "Integer"
+msgstr "Ceo broj"
+
+#: contrib/admindocs/views.py:318
+msgid "Boolean (Either True or False)"
+msgstr "Logička vrednost (Tačno ili Netačno)"
+
+#: contrib/admindocs/views.py:319
+#: contrib/admindocs/views.py:338
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Niz karaktera (maksimalno %(max_length)s karaktera)"
+
+#: contrib/admindocs/views.py:320
+msgid "Comma-separated integers"
+msgstr "Brojevi razdvojeni zarezima"
+
+#: contrib/admindocs/views.py:321
+msgid "Date (without time)"
+msgstr "Datum (bez vremena)"
+
+#: contrib/admindocs/views.py:322
+msgid "Date (with time)"
+msgstr "Datum (sa vremenom)"
+
+#: contrib/admindocs/views.py:323
+msgid "Decimal number"
+msgstr "Decimalni broj"
+
+#: contrib/admindocs/views.py:324
+msgid "E-mail address"
+msgstr "E-mail adresa"
+
+#: contrib/admindocs/views.py:325
+#: contrib/admindocs/views.py:326
+#: contrib/admindocs/views.py:329
+msgid "File path"
+msgstr "Putanja do datoteke"
+
+#: contrib/admindocs/views.py:327
+msgid "Floating point number"
+msgstr ""
+
+#: contrib/admindocs/views.py:331
+#: contrib/comments/models.py:89
+msgid "IP address"
+msgstr "IP adresa"
+
+#: contrib/admindocs/views.py:333
+msgid "Boolean (Either True, False or None)"
+msgstr "Logička vrednost (Tačno, Netačno ili prazno)"
+
+#: contrib/admindocs/views.py:334
+msgid "Relation to parent model"
+msgstr "Relacija ka nadređenom objektu"
+
+#: contrib/admindocs/views.py:335
+msgid "Phone number"
+msgstr "Telefonski broj"
+
+#: contrib/admindocs/views.py:340
+msgid "Text"
+msgstr "Tekst"
+
+#: contrib/admindocs/views.py:341
+msgid "Time"
+msgstr "Vreme"
+
+#: contrib/admindocs/views.py:342
+#: contrib/flatpages/models.py:8
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admindocs/views.py:343
+msgid "U.S. state (two uppercase letters)"
+msgstr "U.S. država (dva VELIKA slova)"
+
+#: contrib/admindocs/views.py:344
+msgid "XML text"
+msgstr "XML tekst"
+
+#: contrib/admindocs/views.py:370
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s nije urlpattern objekt"
+
+#: contrib/auth/admin.py:17
+msgid "Personal info"
+msgstr "Lične informacije"
+
+#: contrib/auth/admin.py:18
+msgid "Permissions"
+msgstr "Dozvole"
+
+#: contrib/auth/admin.py:19
+msgid "Important dates"
+msgstr "Važni datumi"
+
+#: contrib/auth/admin.py:20
+msgid "Groups"
+msgstr "Grupe"
+
+#: contrib/auth/admin.py:47
+msgid "Add user"
+msgstr "Dodajte korisnika"
+
+#: contrib/auth/forms.py:13
+#: contrib/auth/models.py:134
+msgid "Required. 30 characters or fewer. Alphanumeric characters only (letters, digits and underscores)."
+msgstr "Obavezno. 30 ili manje karaktera. Samo slova, brojevi i donja crta \"_\"."
+
+# nesh: Ovo je opis za stari SlugField
+#: contrib/auth/forms.py:14
+#: core/validators.py:72
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Ovo polje može sadržati samo slova, brojeve i donju crtu (_)."
+
+#: contrib/auth/forms.py:16
+msgid "Password confirmation"
+msgstr "Potvrdite lozinku"
+
+#: contrib/auth/forms.py:28
+msgid "A user with that username already exists."
+msgstr "Korisnik već postoji."
+
+#: contrib/auth/forms.py:34
+#: contrib/auth/forms.py:153
+#: contrib/auth/forms.py:178
+msgid "The two password fields didn't match."
+msgstr "Polja za lozinku nisu ista."
+
+#: contrib/auth/forms.py:72
+#: contrib/comments/views/comments.py:58
+msgid "This account is inactive."
+msgstr "Neaktivni nalog."
+
+#: contrib/auth/forms.py:77
+#: contrib/comments/views/comments.py:49
+msgid "Your Web browser doesn't appear to have cookies enabled. Cookies are required for logging in."
+msgstr "Vaš internet čitač nije prihvatio \"cookie\". \"Cookie\" podrška je potrebna da bi ste mogli da se prijavite."
+
+#: contrib/auth/forms.py:90
+msgid "E-mail"
+msgstr "E-mail"
+
+#: contrib/auth/forms.py:99
+msgid "That e-mail address doesn't have an associated user account. Are you sure you've registered?"
+msgstr "Ova e-mail adresa nije povezana sa nijednim korisničkim nalogom. Da li ste sigurni da ste registrovani?"
+
+#: contrib/auth/forms.py:124
+#, python-format
+msgid "Password reset on %s"
+msgstr "Resetovanje lozinke za %s"
+
+#: contrib/auth/forms.py:131
+msgid "Old password"
+msgstr "Stara lozinka"
+
+#: contrib/auth/forms.py:132
+msgid "New password"
+msgstr "Nova lozinka"
+
+#: contrib/auth/forms.py:133
+msgid "New password confirmation"
+msgstr "Potvrda nove lozinke"
+
+#: contrib/auth/forms.py:145
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Pogrešna stara lozinka. Unesite je ponovo."
+
+#: contrib/auth/models.py:73
+#: contrib/auth/models.py:93
+msgid "name"
+msgstr "ime"
+
+#: contrib/auth/models.py:75
+msgid "codename"
+msgstr "šifra dozvole"
+
+#: contrib/auth/models.py:78
+msgid "permission"
+msgstr "dozvola"
+
+#: contrib/auth/models.py:79
+#: contrib/auth/models.py:94
+msgid "permissions"
+msgstr "dozvole"
+
+#: contrib/auth/models.py:97
+msgid "group"
+msgstr "grupa"
+
+#: contrib/auth/models.py:98
+#: contrib/auth/models.py:144
+msgid "groups"
+msgstr "grupe"
+
+#: contrib/auth/models.py:134
+msgid "username"
+msgstr "korisničko ime"
+
+#: contrib/auth/models.py:135
+msgid "first name"
+msgstr "ime"
+
+#: contrib/auth/models.py:136
+msgid "last name"
+msgstr "prezime"
+
+#: contrib/auth/models.py:137
+msgid "e-mail address"
+msgstr "e-mail adresa"
+
+#: contrib/auth/models.py:138
+msgid "password"
+msgstr "lozinka"
+
+#: contrib/auth/models.py:138
+msgid "Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change password form</a>."
+msgstr "Koristite '[algo]$[salt]$[hexdigest]' ili <a href=\"password/\">promeni lozinku</a>."
+
+#: contrib/auth/models.py:139
+msgid "staff status"
+msgstr "dozvoljen pristup administraciji sajta"
+
+#: contrib/auth/models.py:139
+msgid "Designates whether the user can log into this admin site."
+msgstr "Da li korisnik ima pristup administratorskom delu sajta."
+
+#: contrib/auth/models.py:140
+msgid "active"
+msgstr "aktivan"
+
+#: contrib/auth/models.py:140
+msgid "Designates whether this user should be treated as active. Unselect this instead of deleting accounts."
+msgstr "Označava aktivne korisnike. Koristite umesto brisanja naloga."
+
+#: contrib/auth/models.py:141
+msgid "superuser status"
+msgstr "da li je korisnik administrator"
+
+#: contrib/auth/models.py:141
+msgid "Designates that this user has all permissions without explicitly assigning them."
+msgstr "Označava korisnike koji imaju sva prava."
+
+#: contrib/auth/models.py:142
+msgid "last login"
+msgstr "vreme poslednje posete"
+
+#: contrib/auth/models.py:143
+msgid "date joined"
+msgstr "datum otvaranja naloga"
+
+#: contrib/auth/models.py:145
+msgid "In addition to the permissions manually assigned, this user will also get all permissions granted to each group he/she is in."
+msgstr "Uz ručno dodata prava, korisnik će dobiti sva prava iz grupa kojima pripada."
+
+#: contrib/auth/models.py:146
+msgid "user permissions"
+msgstr "korisničke dozvole"
+
+#: contrib/auth/models.py:150
+msgid "user"
+msgstr "korisnik"
+
+#: contrib/auth/models.py:151
+msgid "users"
+msgstr "korisnici"
+
+#: contrib/auth/models.py:306
+msgid "message"
+msgstr "poruka"
+
+#: contrib/auth/views.py:49
+msgid "Logged out"
+msgstr "Odjavljeni ste"
+
+#: contrib/auth/views.py:116
+msgid "Password changed successfully."
+msgstr "Lozinka je uspešno izmenjena."
+
+#: contrib/auth/views.py:122
+#, python-format
+msgid "Change password: %s"
+msgstr "Izmenite lozinku: %s"
+
+#: contrib/comments/models.py:71
+#: contrib/comments/models.py:164
+msgid "object ID"
+msgstr "ID objekta"
+
+#: contrib/comments/models.py:72
+msgid "headline"
+msgstr "naslov"
+
+#: contrib/comments/models.py:73
+#: contrib/comments/models.py:95
+#: contrib/comments/models.py:165
+msgid "comment"
+msgstr "komentar"
+
+#: contrib/comments/models.py:74
+msgid "rating #1"
+msgstr "ocena #1"
+
+#: contrib/comments/models.py:75
+msgid "rating #2"
+msgstr "ocena #2"
+
+#: contrib/comments/models.py:76
+msgid "rating #3"
+msgstr "ocena #3"
+
+#: contrib/comments/models.py:77
+msgid "rating #4"
+msgstr "ocena #4"
+
+#: contrib/comments/models.py:78
+msgid "rating #5"
+msgstr "ocena #5"
+
+#: contrib/comments/models.py:79
+msgid "rating #6"
+msgstr "ocena #6"
+
+#: contrib/comments/models.py:80
+msgid "rating #7"
+msgstr "ocena #7"
+
+#: contrib/comments/models.py:81
+msgid "rating #8"
+msgstr "ocena #8"
+
+#: contrib/comments/models.py:86
+msgid "is valid rating"
+msgstr "da li je ocena validna"
+
+#: contrib/comments/models.py:87
+#: contrib/comments/models.py:167
+msgid "date/time submitted"
+msgstr "datum/vreme slanja"
+
+#: contrib/comments/models.py:88
+#: contrib/comments/models.py:168
+msgid "is public"
+msgstr "da li je javni"
+
+#: contrib/comments/models.py:90
+msgid "is removed"
+msgstr "da li je obrisan"
+
+#: contrib/comments/models.py:90
+msgid "Check this box if the comment is inappropriate. A \"This comment has been removed\" message will be displayed instead."
+msgstr "Izaberite ako je komentar neodgovarajući. Biće ispisano \"Ovaj komentar je obrisan\" umesto teksta komentara."
+
+#: contrib/comments/models.py:96
+msgid "comments"
+msgstr "komentari"
+
+#: contrib/comments/models.py:128
+#: contrib/comments/models.py:199
+msgid "Content object"
+msgstr "Objekat sa sadržajem"
+
+#: contrib/comments/models.py:156
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Poslao %(user)s dana %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:166
+msgid "person's name"
+msgstr "ime"
+
+#: contrib/comments/models.py:169
+msgid "ip address"
+msgstr "ip adresa"
+
+#: contrib/comments/models.py:171
+msgid "approved by staff"
+msgstr "odobreno od strane moderatora"
+
+#: contrib/comments/models.py:175
+msgid "free comment"
+msgstr "slobodan komentar"
+
+#: contrib/comments/models.py:176
+msgid "free comments"
+msgstr "slobodni komentari"
+
+#: contrib/comments/models.py:227
+msgid "score"
+msgstr "rezultat"
+
+#: contrib/comments/models.py:228
+msgid "score date"
+msgstr "datum rezultata"
+
+#: contrib/comments/models.py:232
+msgid "karma score"
+msgstr "\"karma\" rezultat"
+
+#: contrib/comments/models.py:233
+msgid "karma scores"
+msgstr "\"karma\" rezultati"
+
+#: contrib/comments/models.py:237
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "Ocena %(score)d od strane %(user)s"
+
+#: contrib/comments/models.py:254
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Ovaj komentar je označen od %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:262
+msgid "flag date"
+msgstr "datum označavanja"
+
+#: contrib/comments/models.py:266
+msgid "user flag"
+msgstr "korisnička oznaka"
+
+#: contrib/comments/models.py:267
+msgid "user flags"
+msgstr "korisničke oznake"
+
+#: contrib/comments/models.py:271
+#, python-format
+msgid "Flag by %r"
+msgstr "%r je označio"
+
+#: contrib/comments/models.py:277
+msgid "deletion date"
+msgstr "datum brisanja"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "brisanje od strane moderatora"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "brisanja od strane moderatora"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Obrisao moderator %r"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Zaboravili ste lozinku?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Ocene"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Obavezan unos"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Opcioni unos"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Pošaljite sliku"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Komentar:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Pregled komentara"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Vaše ime:"
+
+# nesh: grrrrr, ala je rogobatno
+# petar: malo sam ga izmenio da bude jasniji
+#: contrib/comments/views/comments.py:76
+msgid "This rating is required because you've entered at least one other rating."
+msgstr "Ova ocena je obavezna pošto ste uneli bar jednu ocenu."
+
+#: contrib/comments/views/comments.py:160
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Ovaj komentar je poslat od korisnika koji je poslao manje od %(count)s komentara:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Ovaj komentar je poslat od korisnika koji je poslao manje od %(count)s komentara:\n"
+"\n"
+"%(text)s"
+msgstr[2] ""
+"Ovaj komentar je poslat od korisnika koji je poslao manje od %(count)s komentara:\n"
+"\n"
+"%(text)s"
+
+# nesh: skethcy???
+# petar: Pojma nemam sta im to znaci
+#: contrib/comments/views/comments.py:165
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Komentar je poslat od strane \"sketchy\" korisnika:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:238
+#: contrib/comments/views/comments.py:331
+msgid "Only POSTs are allowed"
+msgstr "Jedino je POST dozvoljen"
+
+#: contrib/comments/views/comments.py:242
+#: contrib/comments/views/comments.py:335
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Jedno ili više obaveznih polja nije poslato"
+
+#: contrib/comments/views/comments.py:246
+#: contrib/comments/views/comments.py:337
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Neko je menjao formu za komentare (povreda sigurnosti)"
+
+#: contrib/comments/views/comments.py:256
+#: contrib/comments/views/comments.py:343
+msgid "The comment form had an invalid 'target' parameter -- the object ID was invalid"
+msgstr "Forma komentara ima neispravni 'target' parametar -- ID objekta je neispravan"
+
+#: contrib/comments/views/comments.py:307
+#: contrib/comments/views/comments.py:372
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "Ovaj komentar nije koristio ni 'preview' ni 'post'"
+
+#: contrib/comments/views/karma.py:21
+msgid "Anonymous users cannot vote"
+msgstr "Anonimni korisnici ne mogu da glasaju"
+
+#: contrib/comments/views/karma.py:25
+msgid "Invalid comment ID"
+msgstr "Neispravan ID komentara"
+
+#: contrib/comments/views/karma.py:27
+msgid "No voting for yourself"
+msgstr "Ne možete glasati sami za sebe"
+
+#: contrib/contenttypes/models.py:67
+msgid "python model class name"
+msgstr "naziv python modula"
+
+#: contrib/contenttypes/models.py:71
+msgid "content type"
+msgstr "tip sadržaja"
+
+#: contrib/contenttypes/models.py:72
+msgid "content types"
+msgstr "tipovi sadržaja"
+
+#: contrib/flatpages/admin.py:9
+msgid "Advanced options"
+msgstr "Napredne opcije"
+
+#: contrib/flatpages/models.py:9
+msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr "Primer: '/o-nama/kontakt/'. Proverite da li ste uneli '/' na početku i na kraju."
+
+#: contrib/flatpages/models.py:10
+msgid "title"
+msgstr "naslov"
+
+#: contrib/flatpages/models.py:11
+msgid "content"
+msgstr "sadržaj"
+
+#: contrib/flatpages/models.py:12
+msgid "enable comments"
+msgstr "omogućite komentare"
+
+#: contrib/flatpages/models.py:13
+msgid "template name"
+msgstr "naziv templejta"
+
+#: contrib/flatpages/models.py:14
+msgid "Example: 'flatpages/contact_page.html'. If this isn't provided, the system will use 'flatpages/default.html'."
+msgstr "Primer: 'flatpages/kontakt-stranica.html'. Ako ne zadate sistem će koristiti 'flatpages/default.html'."
+
+#: contrib/flatpages/models.py:15
+msgid "registration required"
+msgstr "samo za registrovane korisnike"
+
+#: contrib/flatpages/models.py:15
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Ako izaberete ovu opciju samo prijavljeni korisnici će imati pristup datoj strani."
+
+#: contrib/flatpages/models.py:20
+msgid "flat page"
+msgstr "statična strana"
+
+#: contrib/flatpages/models.py:21
+msgid "flat pages"
+msgstr "statične strane"
+
+# th/rd se ne koriste kod nas
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "th"
+msgstr ""
+
+# vidi "th"
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "st"
+msgstr ""
+
+# vidi "th"
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "nd"
+msgstr ""
+
+# vidi "th"
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "rd"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:51
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f milion"
+msgstr[1] "%(value).1f miliona"
+msgstr[2] "%(value).1f miliona"
+
+#: contrib/humanize/templatetags/humanize.py:54
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f milijarda"
+msgstr[1] "%(value).1f milijarde"
+msgstr[2] "%(value).1f milijardi"
+
+#: contrib/humanize/templatetags/humanize.py:57
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f bilion"
+msgstr[1] "%(value).1f biliona"
+msgstr[2] "%(value).1f biliona"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "one"
+msgstr "jedan"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "two"
+msgstr "dva"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "three"
+msgstr "tri"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "four"
+msgstr "četiri"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "five"
+msgstr "pet"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "six"
+msgstr "šest"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "seven"
+msgstr "sedam"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "eight"
+msgstr "osam"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "nine"
+msgstr "devet"
+
+#: contrib/humanize/templatetags/humanize.py:93
+msgid "today"
+msgstr "danas"
+
+#: contrib/humanize/templatetags/humanize.py:95
+msgid "tomorrow"
+msgstr "sutra"
+
+#: contrib/humanize/templatetags/humanize.py:97
+msgid "yesterday"
+msgstr "juče"
+
+#: contrib/localflavor/ar/forms.py:27
+msgid "Enter a postal code in the format NNNN or ANNNNAAA."
+msgstr ""
+
+#: contrib/localflavor/ar/forms.py:49
+#: contrib/localflavor/br/forms.py:96
+#: contrib/localflavor/br/forms.py:135
+#: contrib/localflavor/pe/forms.py:23
+#: contrib/localflavor/pe/forms.py:51
+msgid "This field requires only numbers."
+msgstr "U ovo polje se mogu uneti samo brojevi."
+
+#: contrib/localflavor/ar/forms.py:50
+msgid "This field requires 7 or 8 digits."
+msgstr "Morate unete 7 ili 8 cifara."
+
+#: contrib/localflavor/ar/forms.py:79
+msgid "Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format."
+msgstr ""
+
+#: contrib/localflavor/ar/forms.py:80
+#, fuzzy
+msgid "Invalid CUIT."
+msgstr "Neispravan URL: %s"
+
+#: contrib/localflavor/at/at_states.py:5
+msgid "Burgenland"
+msgstr ""
+
+#: contrib/localflavor/at/at_states.py:6
+msgid "Carinthia"
+msgstr ""
+
+#: contrib/localflavor/at/at_states.py:7
+msgid "Lower Austria"
+msgstr ""
+
+#: contrib/localflavor/at/at_states.py:8
+msgid "Upper Austria"
+msgstr ""
+
+#: contrib/localflavor/at/at_states.py:9
+msgid "Salzburg"
+msgstr ""
+
+#: contrib/localflavor/at/at_states.py:10
+#, fuzzy
+msgid "Styria"
+msgstr "Srpski"
+
+#: contrib/localflavor/at/at_states.py:11
+msgid "Tyrol"
+msgstr ""
+
+#: contrib/localflavor/at/at_states.py:12
+msgid "Vorarlberg"
+msgstr ""
+
+#: contrib/localflavor/at/at_states.py:13
+msgid "Vienna"
+msgstr ""
+
+#: contrib/localflavor/at/forms.py:20
+#: contrib/localflavor/ch/forms.py:16
+#: contrib/localflavor/no/forms.py:12
+#, fuzzy
+msgid "Enter a zip code in the format XXXX."
+msgstr "Unesite ispravno vreme u HH:MM formatu."
+
+#: contrib/localflavor/at/forms.py:48
+msgid "Enter a valid Austrian Social Security Number in XXXX XXXXXX format."
+msgstr ""
+
+#: contrib/localflavor/au/forms.py:16
+msgid "Enter a 4 digit post code."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:21
+#, fuzzy
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Unesite ispravno vreme u HH:MM formatu."
+
+# nesh: tel. brojevi su u američkom formatu, ovo se ionako neće koristiti u i18n delu
+#: contrib/localflavor/br/forms.py:30
+#, fuzzy
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "Telefonski brojevi moraju biti u formatu XXX-XXX-XXXX. \"%s\" je neispravan."
+
+#: contrib/localflavor/br/forms.py:58
+msgid "Select a valid brazilian state. That state is not one of the available states."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:94
+msgid "Invalid CPF number."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:95
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:134
+msgid "Invalid CNPJ number."
+msgstr ""
+
+#: contrib/localflavor/br/forms.py:136
+#, fuzzy
+msgid "This field requires at least 14 digits"
+msgstr "Obavezno polje."
+
+#: contrib/localflavor/ca/forms.py:17
+#, fuzzy
+msgid "Enter a postal code in the format XXX XXX."
+msgstr "Unesite ispravno vreme u HH:MM formatu."
+
+#: contrib/localflavor/ca/forms.py:88
+msgid "Enter a valid Canadian Social Insurance number in XXX-XXX-XXX format."
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:10
+#, fuzzy
+msgid "Berne"
+msgstr "korisničko ime"
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:13
+#, fuzzy
+msgid "Glarus"
+msgstr "Grupe"
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:16
+#, fuzzy
+msgid "Lucerne"
+msgstr "korisničko ime"
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:24
+#, fuzzy
+msgid "Thurgau"
+msgstr "Četvrtak"
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr ""
+
+#: contrib/localflavor/ch/ch_states.py:29
+#, fuzzy
+msgid "Zug"
+msgstr "avg"
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr ""
+
+#: contrib/localflavor/ch/forms.py:64
+msgid "Enter a valid Swiss identity or passport card number in X1234567<0 or 1234567890 format."
+msgstr ""
+
+#: contrib/localflavor/cl/forms.py:29
+#, fuzzy
+msgid "Enter a valid Chilean RUT."
+msgstr "Unesite ispravno ime fajla."
+
+#: contrib/localflavor/cl/forms.py:30
+msgid "Enter a valid Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr ""
+
+#: contrib/localflavor/cl/forms.py:31
+#, fuzzy
+msgid "The Chilean RUT is not valid."
+msgstr "Neispravno polje."
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:7
+#, fuzzy
+msgid "Berlin"
+msgstr "Brazilski"
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:11
+#, fuzzy
+msgid "Hessen"
+msgstr "poruka"
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr ""
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr ""
+
+#: contrib/localflavor/de/forms.py:14
+#: contrib/localflavor/fi/forms.py:12
+#: contrib/localflavor/fr/forms.py:15
+#, fuzzy
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Unesite ispravno vreme u HH:MM formatu."
+
+#: contrib/localflavor/de/forms.py:41
+msgid "Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X format."
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:5
+msgid "Arava"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:6
+msgid "Albacete"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:7
+msgid "Alacant"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:8
+msgid "Almeria"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:9
+msgid "Avila"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:10
+msgid "Badajoz"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:11
+msgid "Illes Balears"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:12
+msgid "Barcelona"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:13
+msgid "Burgos"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:14
+msgid "Caceres"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:15
+msgid "Cadiz"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:16
+msgid "Castello"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:17
+msgid "Ciudad Real"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:18
+msgid "Cordoba"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:19
+msgid "A Coruna"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:20
+msgid "Cuenca"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:21
+msgid "Girona"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:22
+#, fuzzy
+msgid "Granada"
+msgstr "Nemački"
+
+#: contrib/localflavor/es/es_provinces.py:23
+msgid "Guadalajara"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:24
+msgid "Guipuzkoa"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:25
+msgid "Huelva"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:26
+#, fuzzy
+msgid "Huesca"
+msgstr "Utorak"
+
+#: contrib/localflavor/es/es_provinces.py:27
+#, fuzzy
+msgid "Jaen"
+msgstr "Jan."
+
+#: contrib/localflavor/es/es_provinces.py:28
+msgid "Leon"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:29
+msgid "Lleida"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:30
+#: contrib/localflavor/es/es_regions.py:17
+msgid "La Rioja"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:31
+msgid "Lugo"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:32
+#: contrib/localflavor/es/es_regions.py:18
+msgid "Madrid"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:33
+msgid "Malaga"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:34
+msgid "Murcia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:35
+msgid "Navarre"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:36
+msgid "Ourense"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:37
+msgid "Asturias"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:38
+#, fuzzy
+msgid "Palencia"
+msgstr "Galski"
+
+#: contrib/localflavor/es/es_provinces.py:39
+msgid "Las Palmas"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:40
+msgid "Pontevedra"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:41
+msgid "Salamanca"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:42
+msgid "Santa Cruz de Tenerife"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:43
+#: contrib/localflavor/es/es_regions.py:11
+msgid "Cantabria"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:44
+#, fuzzy
+msgid "Segovia"
+msgstr "Slovenački"
+
+#: contrib/localflavor/es/es_provinces.py:45
+msgid "Seville"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:46
+#, fuzzy
+msgid "Soria"
+msgstr "Srpski"
+
+#: contrib/localflavor/es/es_provinces.py:47
+msgid "Tarragona"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:48
+msgid "Teruel"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:49
+msgid "Toledo"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:50
+#, fuzzy
+msgid "Valencia"
+msgstr "Galski"
+
+#: contrib/localflavor/es/es_provinces.py:51
+msgid "Valladolid"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:52
+msgid "Bizkaia"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:53
+msgid "Zamora"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:54
+msgid "Zaragoza"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:55
+msgid "Ceuta"
+msgstr ""
+
+#: contrib/localflavor/es/es_provinces.py:56
+msgid "Melilla"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:5
+msgid "Andalusia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:6
+msgid "Aragon"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:7
+msgid "Principality of Asturias"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:8
+msgid "Balearic Islands"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:9
+msgid "Basque Country"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:10
+msgid "Canary Islands"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:12
+msgid "Castile-La Mancha"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:13
+msgid "Castile and Leon"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:14
+#, fuzzy
+msgid "Catalonia"
+msgstr "Italijanski"
+
+#: contrib/localflavor/es/es_regions.py:15
+msgid "Extremadura"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:16
+#, fuzzy
+msgid "Galicia"
+msgstr "Galski"
+
+#: contrib/localflavor/es/es_regions.py:19
+msgid "Region of Murcia"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:20
+msgid "Foral Community of Navarre"
+msgstr ""
+
+#: contrib/localflavor/es/es_regions.py:21
+msgid "Valencian Community"
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:19
+msgid "Enter a valid postal code in the range and format 01XXX - 52XXX."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:39
+msgid "Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or 9XXXXXXXX."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:66
+#, fuzzy
+msgid "Please enter a valid NIF, NIE, or CIF."
+msgstr "Unesite ispravnu IP adresu."
+
+#: contrib/localflavor/es/forms.py:67
+#, fuzzy
+msgid "Please enter a valid NIF or NIE."
+msgstr "Unesite ispravan %s."
+
+#: contrib/localflavor/es/forms.py:68
+msgid "Invalid checksum for NIF."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:69
+msgid "Invalid checksum for NIE."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:70
+msgid "Invalid checksum for CIF."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:142
+msgid "Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX."
+msgstr ""
+
+#: contrib/localflavor/es/forms.py:143
+msgid "Invalid checksum for bank account number."
+msgstr ""
+
+#: contrib/localflavor/fi/forms.py:28
+#, fuzzy
+msgid "Enter a valid Finnish social security number."
+msgstr "Unesite ispravno ime fajla."
+
+#: contrib/localflavor/in_/forms.py:14
+#, fuzzy
+msgid "Enter a zip code in the format XXXXXXX."
+msgstr "Unesite ispravno vreme u HH:MM formatu."
+
+#: contrib/localflavor/is_/forms.py:17
+msgid "Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr ""
+
+#: contrib/localflavor/is_/forms.py:18
+msgid "The Icelandic identification number is not valid."
+msgstr ""
+
+#: contrib/localflavor/it/forms.py:14
+#, fuzzy
+msgid "Enter a valid zip code."
+msgstr "Unesite ispravno ime fajla."
+
+#: contrib/localflavor/it/forms.py:43
+#, fuzzy
+msgid "Enter a valid Social Security number."
+msgstr "Unesite ispravno ime fajla."
+
+#: contrib/localflavor/it/forms.py:68
+#, fuzzy
+msgid "Enter a valid VAT number."
+msgstr "Unesite ispravno ime fajla."
+
+#: contrib/localflavor/jp/forms.py:17
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+#, fuzzy
+msgid "Shimane"
+msgstr "Izmenite"
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+#, fuzzy
+msgid "Ehime"
+msgstr "Vreme"
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr ""
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:12
+msgid "Aguascalientes"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:13
+msgid "Baja California"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:14
+msgid "Baja California Sur"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:15
+#, fuzzy
+msgid "Campeche"
+msgstr "Češki"
+
+#: contrib/localflavor/mx/mx_states.py:16
+msgid "Chihuahua"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:17
+msgid "Chiapas"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:18
+msgid "Coahuila"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:19
+msgid "Colima"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:20
+msgid "Distrito Federal"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:21
+msgid "Durango"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:22
+msgid "Guerrero"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:23
+msgid "Guanajuato"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:24
+msgid "Hidalgo"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:25
+msgid "Jalisco"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:26
+msgid "Estado de México"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:27
+msgid "Michoacán"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:28
+msgid "Morelos"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:29
+msgid "Nayarit"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:30
+msgid "Nuevo León"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:31
+msgid "Oaxaca"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:32
+msgid "Puebla"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:33
+msgid "Querétaro"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:34
+msgid "Quintana Roo"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:35
+#, fuzzy
+msgid "Sinaloa"
+msgstr "Slovački"
+
+#: contrib/localflavor/mx/mx_states.py:36
+msgid "San Luis Potosí"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:37
+msgid "Sonora"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:38
+msgid "Tabasco"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:39
+msgid "Tamaulipas"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:40
+msgid "Tlaxcala"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:41
+msgid "Veracruz"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:42
+msgid "Yucatán"
+msgstr ""
+
+#: contrib/localflavor/mx/mx_states.py:43
+msgid "Zacatecas"
+msgstr ""
+
+#: contrib/localflavor/nl/forms.py:21
+#, fuzzy
+msgid "Enter a valid postal code"
+msgstr "Unesite ispravnu e-mail adresu."
+
+#: contrib/localflavor/nl/forms.py:52
+#, fuzzy
+msgid "Enter a valid phone number"
+msgstr "Unesite celi broj."
+
+#: contrib/localflavor/nl/forms.py:78
+#, fuzzy
+msgid "Enter a valid SoFi number"
+msgstr "Unesite ispravno ime fajla."
+
+#: contrib/localflavor/nl/nl_provinces.py:4
+#, fuzzy
+msgid "Drente"
+msgstr "Obrišite"
+
+#: contrib/localflavor/nl/nl_provinces.py:5
+msgid "Flevoland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:6
+msgid "Friesland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:7
+#, fuzzy
+msgid "Gelderland"
+msgstr "Nemački"
+
+#: contrib/localflavor/nl/nl_provinces.py:8
+msgid "Groningen"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:9
+msgid "Limburg"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:10
+msgid "Noord-Brabant"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:11
+msgid "Noord-Holland"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:12
+msgid "Overijssel"
+msgstr ""
+
+#: contrib/localflavor/nl/nl_provinces.py:13
+#, fuzzy
+msgid "Utrecht"
+msgstr "Francuski"
+
+#: contrib/localflavor/nl/nl_provinces.py:14
+#, fuzzy
+msgid "Zeeland"
+msgstr "Islandski"
+
+#: contrib/localflavor/nl/nl_provinces.py:15
+msgid "Zuid-Holland"
+msgstr ""
+
+#: contrib/localflavor/no/forms.py:33
+#, fuzzy
+msgid "Enter a valid Norwegian social security number."
+msgstr "Unesite ispravan decimalni broj."
+
+#: contrib/localflavor/pe/forms.py:24
+#, fuzzy
+msgid "This field requires 8 digits."
+msgstr "Obavezno polje."
+
+#: contrib/localflavor/pe/forms.py:52
+#, fuzzy
+msgid "This field requires 11 digits."
+msgstr "Obavezno polje."
+
+#: contrib/localflavor/pl/forms.py:39
+msgid "National Identification Number consists of 11 digits."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:40
+msgid "Wrong checksum for the National Identification Number."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:72
+msgid "Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:73
+msgid "Wrong checksum for the Tax Number (NIP)."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:112
+msgid "National Business Register Number (REGON) consists of 7 or 9 digits."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:113
+msgid "Wrong checksum for the National Business Register Number (REGON)."
+msgstr ""
+
+#: contrib/localflavor/pl/forms.py:156
+#, fuzzy
+msgid "Enter a postal code in the format XX-XXX."
+msgstr "Unesite ispravno vreme u HH:MM formatu."
+
+#: contrib/localflavor/pl/pl_voivodeships.py:8
+msgid "Lower Silesia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:9
+msgid "Kuyavia-Pomerania"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:10
+msgid "Lublin"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:11
+msgid "Lubusz"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:12
+msgid "Lodz"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:13
+msgid "Lesser Poland"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:14
+msgid "Masovia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:15
+#, fuzzy
+msgid "Opole"
+msgstr "Opcioni unos"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:16
+msgid "Subcarpatia"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:17
+msgid "Podlasie"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:18
+#, fuzzy
+msgid "Pomerania"
+msgstr "Rumunski"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:19
+#, fuzzy
+msgid "Silesia"
+msgstr "Slovenački"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:20
+msgid "Swietokrzyskie"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:21
+msgid "Warmia-Masuria"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:22
+msgid "Greater Poland"
+msgstr ""
+
+#: contrib/localflavor/pl/pl_voivodeships.py:23
+msgid "West Pomerania"
+msgstr ""
+
+#: contrib/localflavor/ro/forms.py:19
+#, fuzzy
+msgid "Enter a valid CIF."
+msgstr "Unesite ispravno ime fajla."
+
+#: contrib/localflavor/ro/forms.py:56
+#, fuzzy
+msgid "Enter a valid CNP."
+msgstr "Unesite ispravno ime fajla."
+
+#: contrib/localflavor/ro/forms.py:141
+msgid "Enter a valid IBAN in ROXX-XXXX-XXXX-XXXX-XXXX-XXXX format"
+msgstr ""
+
+# nesh: tel. brojevi su u američkom formatu, ovo se ionako neće koristiti u i18n delu
+#: contrib/localflavor/ro/forms.py:171
+#, fuzzy
+msgid "Phone numbers must be in XXXX-XXXXXX format."
+msgstr "Telefonski brojevi moraju biti u formatu XXX-XXX-XXXX. \"%s\" je neispravan."
+
+#: contrib/localflavor/ro/forms.py:194
+#, fuzzy
+msgid "Enter a valid postal code in the format XXXXXX"
+msgstr "Unesite ispravno vreme u HH:MM formatu."
+
+#: contrib/localflavor/sk/forms.py:30
+msgid "Enter a postal code in the format XXXXX or XXX XX."
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:8
+msgid "Banska Bystrica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:9
+msgid "Banska Stiavnica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:10
+msgid "Bardejov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:11
+msgid "Banovce nad Bebravou"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:12
+msgid "Brezno"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:13
+msgid "Bratislava I"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:14
+msgid "Bratislava II"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:15
+msgid "Bratislava III"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:16
+msgid "Bratislava IV"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:17
+msgid "Bratislava V"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:18
+msgid "Bytca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:19
+msgid "Cadca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:20
+msgid "Detva"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:21
+msgid "Dolny Kubin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:22
+msgid "Dunajska Streda"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:23
+#, fuzzy
+msgid "Galanta"
+msgstr "Galski"
+
+#: contrib/localflavor/sk/sk_districts.py:24
+#, fuzzy
+msgid "Gelnica"
+msgstr "Galski"
+
+#: contrib/localflavor/sk/sk_districts.py:25
+msgid "Hlohovec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:26
+msgid "Humenne"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:27
+msgid "Ilava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:28
+msgid "Kezmarok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:29
+msgid "Komarno"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:30
+msgid "Kosice I"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:31
+msgid "Kosice II"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:32
+msgid "Kosice III"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:33
+msgid "Kosice IV"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:34
+msgid "Kosice - okolie"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:35
+msgid "Krupina"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:36
+msgid "Kysucke Nove Mesto"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:37
+msgid "Levice"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:38
+msgid "Levoca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:39
+msgid "Liptovsky Mikulas"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:40
+msgid "Lucenec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:41
+msgid "Malacky"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:42
+#, fuzzy
+msgid "Martin"
+msgstr "Ocene"
+
+#: contrib/localflavor/sk/sk_districts.py:43
+msgid "Medzilaborce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:44
+msgid "Michalovce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:45
+msgid "Myjava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:46
+msgid "Namestovo"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:47
+msgid "Nitra"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:48
+msgid "Nove Mesto nad Vahom"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:49
+msgid "Nove Zamky"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:50
+msgid "Partizanske"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:51
+msgid "Pezinok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:52
+msgid "Piestany"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:53
+msgid "Poltar"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:54
+msgid "Poprad"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:55
+msgid "Povazska Bystrica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:56
+msgid "Presov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:57
+msgid "Prievidza"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:58
+msgid "Puchov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:59
+msgid "Revuca"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:60
+msgid "Rimavska Sobota"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:61
+msgid "Roznava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:62
+msgid "Ruzomberok"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:63
+msgid "Sabinov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:64
+msgid "Senec"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:65
+#, fuzzy
+msgid "Senica"
+msgstr "Slovenački"
+
+#: contrib/localflavor/sk/sk_districts.py:66
+#, fuzzy
+msgid "Skalica"
+msgstr "Galski"
+
+#: contrib/localflavor/sk/sk_districts.py:67
+msgid "Snina"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:68
+msgid "Sobrance"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:69
+msgid "Spisska Nova Ves"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:70
+msgid "Stara Lubovna"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:71
+msgid "Stropkov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:72
+msgid "Svidnik"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:73
+msgid "Sala"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:74
+msgid "Topolcany"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:75
+msgid "Trebisov"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:76
+#, fuzzy
+msgid "Trencin"
+msgstr "Francuski"
+
+#: contrib/localflavor/sk/sk_districts.py:77
+msgid "Trnava"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:78
+msgid "Turcianske Teplice"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:79
+msgid "Tvrdosin"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:80
+msgid "Velky Krtis"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:81
+msgid "Vranov nad Toplou"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:82
+msgid "Zlate Moravce"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:83
+msgid "Zvolen"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:84
+msgid "Zarnovica"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:85
+msgid "Ziar nad Hronom"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_districts.py:86
+msgid "Zilina"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:8
+msgid "Banska Bystrica region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:9
+msgid "Bratislava region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:10
+msgid "Kosice region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:11
+msgid "Nitra region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:12
+msgid "Presov region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:13
+msgid "Trencin region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:14
+msgid "Trnava region"
+msgstr ""
+
+#: contrib/localflavor/sk/sk_regions.py:15
+msgid "Zilina region"
+msgstr ""
+
+#: contrib/localflavor/uk/forms.py:21
+#, fuzzy
+msgid "Enter a valid postcode."
+msgstr "Unesite ispravno ime fajla."
+
+#: contrib/localflavor/uk/uk_regions.py:11
+msgid "Bedfordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:12
+msgid "Buckinghamshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:14
+msgid "Cheshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:15
+msgid "Cornwall and Isles of Scilly"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:16
+msgid "Cumbria"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:17
+msgid "Derbyshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:18
+msgid "Devon"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:19
+msgid "Dorset"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:20
+msgid "Durham"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:21
+msgid "East Sussex"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:22
+msgid "Essex"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:23
+msgid "Gloucestershire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:24
+msgid "Greater London"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:25
+msgid "Greater Manchester"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:26
+msgid "Hampshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:27
+msgid "Hertfordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:28
+msgid "Kent"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:29
+msgid "Lancashire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:30
+msgid "Leicestershire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:31
+msgid "Lincolnshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:32
+msgid "Merseyside"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:33
+msgid "Norfolk"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:34
+msgid "North Yorkshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:35
+msgid "Northamptonshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:36
+msgid "Northumberland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:37
+msgid "Nottinghamshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:38
+msgid "Oxfordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:39
+msgid "Shropshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:40
+msgid "Somerset"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:41
+msgid "South Yorkshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:42
+msgid "Staffordshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:43
+msgid "Suffolk"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:44
+#, fuzzy
+msgid "Surrey"
+msgstr "Trenutno:"
+
+#: contrib/localflavor/uk/uk_regions.py:45
+msgid "Tyne and Wear"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:46
+msgid "Warwickshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:47
+msgid "West Midlands"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:48
+msgid "West Sussex"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:49
+msgid "West Yorkshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:50
+msgid "Wiltshire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:51
+msgid "Worcestershire"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:55
+msgid "County Antrim"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:56
+msgid "County Armagh"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:57
+msgid "County Down"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:58
+msgid "County Fermanagh"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:59
+msgid "County Londonderry"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:60
+msgid "County Tyrone"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:64
+msgid "Clwyd"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:65
+msgid "Dyfed"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:66
+msgid "Gwent"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:67
+msgid "Gwynedd"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:68
+msgid "Mid Glamorgan"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:69
+msgid "Powys"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:70
+msgid "South Glamorgan"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:71
+msgid "West Glamorgan"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:75
+#, fuzzy
+msgid "Borders"
+msgstr "Red:"
+
+#: contrib/localflavor/uk/uk_regions.py:76
+msgid "Central Scotland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:77
+msgid "Dumfries and Galloway"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:78
+msgid "Fife"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:79
+#, fuzzy
+msgid "Grampian"
+msgstr "Nemački"
+
+#: contrib/localflavor/uk/uk_regions.py:80
+msgid "Highland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:81
+#, fuzzy
+msgid "Lothian"
+msgstr "Prijavite se"
+
+#: contrib/localflavor/uk/uk_regions.py:82
+msgid "Orkney Islands"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:83
+msgid "Shetland Islands"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:84
+msgid "Strathclyde"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:85
+msgid "Tayside"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:86
+msgid "Western Isles"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:90
+msgid "England"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:91
+msgid "Northern Ireland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:92
+msgid "Scotland"
+msgstr ""
+
+#: contrib/localflavor/uk/uk_regions.py:93
+msgid "Wales"
+msgstr ""
+
+#: contrib/localflavor/us/forms.py:16
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr ""
+
+#: contrib/localflavor/us/forms.py:54
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr ""
+
+#: contrib/localflavor/za/forms.py:20
+#, fuzzy
+msgid "Enter a valid South African ID number"
+msgstr "Unesite ispravno ime fajla."
+
+#: contrib/localflavor/za/forms.py:54
+#, fuzzy
+msgid "Enter a valid South African postal code"
+msgstr "Unesite ispravno ime fajla."
+
+#: contrib/localflavor/za/za_provinces.py:4
+msgid "Eastern Cape"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:5
+msgid "Free State"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:6
+msgid "Gauteng"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:7
+msgid "KwaZulu-Natal"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:8
+msgid "Limpopo"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:9
+msgid "Mpumalanga"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:10
+msgid "Northern Cape"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:11
+msgid "North West"
+msgstr ""
+
+#: contrib/localflavor/za/za_provinces.py:12
+msgid "Western Cape"
+msgstr ""
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "preusmeri od"
+
+#: contrib/redirects/models.py:8
+msgid "This should be an absolute path, excluding the domain name. Example: '/events/search/'."
+msgstr "Unesite apsolutnu putanju bez imena domena. Primer: '/dogadjaji/pretraga/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "preusmeri ka"
+
+#: contrib/redirects/models.py:10
+msgid "This can be either an absolute path (as above) or a full URL starting with 'http://'."
+msgstr "Može biti apsolutna putanja (kao gore) ili puni URL koji počinje sa 'http://'."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "Preusmeravanje"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "Preusmeravanja"
+
+#: contrib/sessions/models.py:45
+msgid "session key"
+msgstr "ključ sesije"
+
+#: contrib/sessions/models.py:47
+msgid "session data"
+msgstr "podaci sesije"
+
+#: contrib/sessions/models.py:48
+msgid "expire date"
+msgstr "datum prestanka važenja sesije"
+
+#: contrib/sessions/models.py:53
+msgid "session"
+msgstr "sesija"
+
+#: contrib/sessions/models.py:54
+msgid "sessions"
+msgstr "sesije"
+
+#: contrib/sites/models.py:32
+msgid "domain name"
+msgstr "ime domena"
+
+#: contrib/sites/models.py:33
+msgid "display name"
+msgstr "naziv"
+
+#: contrib/sites/models.py:38
+msgid "site"
+msgstr "sajt"
+
+#: contrib/sites/models.py:39
+msgid "sites"
+msgstr "sajtovi"
+
+#: core/validators.py:76
+msgid "This value must contain only letters, numbers, underscores, dashes or slashes."
+msgstr "Ovo polje može sadržati samo slova, brojeve, donju crtu (_), crtu (-) i kose crte."
+
+#: core/validators.py:80
+#, fuzzy
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "Ovo polje može sadržati samo slova, brojeve, donju crtu (_), crtu (-) i kose crte."
+
+#: core/validators.py:84
+msgid "Uppercase letters are not allowed here."
+msgstr "Velika slova nisu dozvoljena."
+
+#: core/validators.py:88
+msgid "Lowercase letters are not allowed here."
+msgstr "Mala slova nisu dozvoljena."
+
+#: core/validators.py:95
+msgid "Enter only digits separated by commas."
+msgstr "Unesite brojeve razdvojene zarezima."
+
+#: core/validators.py:107
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Unesite ispravne e-mail adrese razdvojene zarezima."
+
+#: core/validators.py:111
+msgid "Please enter a valid IP address."
+msgstr "Unesite ispravnu IP adresu."
+
+#: core/validators.py:115
+msgid "Empty values are not allowed here."
+msgstr "Prazne vrednosti nisu dozvoljene."
+
+#: core/validators.py:119
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Ovde možete uneti samo brojeve."
+
+#: core/validators.py:123
+msgid "This value can't be comprised solely of digits."
+msgstr "Podatak se ne može sastojati samo od brojeva."
+
+#: core/validators.py:128
+#: forms/fields.py:158
+msgid "Enter a whole number."
+msgstr "Unesite celi broj."
+
+#: core/validators.py:132
+msgid "Only alphabetical characters are allowed here."
+msgstr "Ovde možete koristiti samo slova."
+
+#: core/validators.py:147
+#, python-format
+msgid "Invalid date: %s"
+msgstr "Neispravan datum: %s"
+
+#: core/validators.py:152
+#: db/models/fields/__init__.py:574
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Unesite ispravan datum u YYYY-MM-DD formatu."
+
+#: core/validators.py:157
+msgid "Enter a valid time in HH:MM format."
+msgstr "Unesite ispravno vreme u HH:MM formatu."
+
+#: core/validators.py:161
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Unesite ispravan datum i vreme u YYYY-MM-DD HH:MM formatu."
+
+#: core/validators.py:166
+#: forms/fields.py:409
+msgid "Enter a valid e-mail address."
+msgstr "Unesite ispravnu e-mail adresu."
+
+#: core/validators.py:178
+#: core/validators.py:470
+#: forms/fields.py:427
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Fajl nije poslat, proverite tip enkoding form-a."
+
+#: core/validators.py:189
+#: forms/fields.py:467
+msgid "Upload a valid image. The file you uploaded was either not an image or a corrupted image."
+msgstr "Pošaljite ispravnu sliku. Fajl koji ste poslali ili nije slika ili je sam fajl oštećen."
+
+#: core/validators.py:196
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "URL %s ne pokazuje na ispravnu sliku"
+
+# nesh: tel. brojevi su u američkom formatu, ovo se ionako neće koristiti u i18n delu
+#: core/validators.py:200
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "Telefonski brojevi moraju biti u formatu XXX-XXX-XXXX. \"%s\" je neispravan."
+
+#: core/validators.py:208
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "URL %s ne pokazuje na ispravni QuickTime video fajl."
+
+#: core/validators.py:212
+msgid "A valid URL is required."
+msgstr "Unesite ispravan URL."
+
+#: core/validators.py:226
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Unesite ispravan HTML. Greške su:\n"
+"%s"
+
+#: core/validators.py:233
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Neispravan XML: %s"
+
+#: core/validators.py:250
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Neispravan URL: %s"
+
+#: core/validators.py:255
+#: core/validators.py:257
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "URL %s je neispravan link."
+
+# nesh: Ni ovo nije interesantno za i18n
+#: core/validators.py:263
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Unesite ispravnu skraćenicu za U.S. državu."
+
+#: core/validators.py:277
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Pripazi na jezik! %s reč nije ovde dozvoljena."
+msgstr[1] "Pripazi na jezik! %s reči nisu ovde dozvoljene."
+msgstr[2] "Pripazi na jezik! %s reči nisu ovde dozvoljene."
+
+#: core/validators.py:284
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Ovo polje mora biti jednako sa poljem '%s'."
+
+#: core/validators.py:303
+msgid "Please enter something for at least one field."
+msgstr "Morate popuniti barem jedno polje."
+
+#: core/validators.py:312
+#: core/validators.py:323
+msgid "Please enter both fields or leave them both empty."
+msgstr "Popunite oba polja ili oba ostavite prazna."
+
+#: core/validators.py:331
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Ovo polje mora biti uneto ako polje %(field)s ima vrednost %(value)s"
+
+#: core/validators.py:344
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Ovo polje mora biti uneto ako polje %(field)s nema vrednost %(value)s"
+
+#: core/validators.py:363
+msgid "Duplicate values are not allowed."
+msgstr "Duple vrednosti nisu dozvoljene."
+
+#: core/validators.py:378
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Vrednost mora biti između %(lower)s i %(upper)s."
+
+#: core/validators.py:380
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Vrednost mora biti najmanje %s."
+
+#: core/validators.py:382
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Vrednost ne sme biti veća od %s."
+
+#: core/validators.py:423
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Vrednost mora biti stepena %s."
+
+#: core/validators.py:433
+msgid "Please enter a valid decimal number."
+msgstr "Unesite ispravan decimalni broj."
+
+#: core/validators.py:440
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural "Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Unesite ispravan decimalni broj sa %s cifrom."
+msgstr[1] "Unesite ispravan decimalni broj sa %s cifre."
+msgstr[2] "Unesite ispravan decimalni broj sa %s cifara."
+
+#: core/validators.py:443
+#, python-format
+msgid "Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural "Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] "Unesite ispravan decimalni broj sa celim delom od najviše %s cifre."
+msgstr[1] "Unesite ispravan decimalni broj sa celim delom od najviše %s cifre."
+msgstr[2] "Unesite ispravan decimalni broj sa celim delom od najviše %s cifara."
+
+#: core/validators.py:446
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural "Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "Unesite decimalni broj sa najviše %s decimalnim mestom."
+msgstr[1] "Unesite decimalni broj sa najviše %s decimalna mesta."
+msgstr[2] "Unesite decimalni broj sa najviše %s decimalnih mesta."
+
+#: core/validators.py:454
+msgid "Please enter a valid floating point number."
+msgstr "Unesite ispravan decimalni broj."
+
+#: core/validators.py:463
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Veličina fajla mora biti najmanje %s bajtova."
+
+#: core/validators.py:464
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Veličina fajla mora biti najviše %s bajtova."
+
+#: core/validators.py:481
+msgid "The format for this field is wrong."
+msgstr "Pogrešan format polja."
+
+#: core/validators.py:496
+msgid "This field is invalid."
+msgstr "Neispravno polje."
+
+#: core/validators.py:532
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Ništa nije moglo da se skine sa URL-a %s."
+
+#: core/validators.py:535
+#, python-format
+msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "Sa URL-a %(url)s se vratio pogrešan Content-Type header '%(contenttype)s'."
+
+#: core/validators.py:568
+#, python-format
+msgid "Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with \"%(start)s\".)"
+msgstr "Zatvorite nezatvoren tag \"%(tag)s\" iz reda %(line)s. (Red počinje sa \"%(start)s\".)"
+
+#: core/validators.py:572
+#, python-format
+msgid "Some text starting on line %(line)s is not allowed in that context. (Line starts with \"%(start)s\".)"
+msgstr "Tekst koji počinje u redu %(line)s nije dozvoljen u ovom kontekstu. (Red počinje sa \"%(start)s\".)"
+
+#: core/validators.py:577
+#, python-format
+msgid "\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%(start)s\".)"
+msgstr "Atribut \"%(attr)s\" u red %(line)s je neispravan. (Red počinje sa \"%(start)s\".)"
+
+#: core/validators.py:582
+#, python-format
+msgid "\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%(start)s\".)"
+msgstr "Tag \"<%(tag)s>\" u redu %(line)s je neispravan. (Red počinje \"%(start)s\".)"
+
+#: core/validators.py:586
+#, python-format
+msgid "A tag on line %(line)s is missing one or more required attributes. (Line starts with \"%(start)s\".)"
+msgstr "Tag-u u redu %(line)s nedostaje jedan ili više atributa. (Red počinje sa \"%(start)s\".)"
+
+#: core/validators.py:591
+#, python-format
+msgid "The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line starts with \"%(start)s\".)"
+msgstr "Atribut \"%(attr)s\" u redu %(line)s ima neispravnu vrednost. (Red počinje sa \"%(start)s\".)"
+
+#: db/models/manipulators.py:304
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(object)s sa ovim tipom %(type)s već postoji za polje %(field)s."
+
+#: db/models/fields/__init__.py:47
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s sa ovim %(fieldname)s već postoji."
+
+#: db/models/fields/__init__.py:175
+#: db/models/fields/__init__.py:348
+#: db/models/fields/__init__.py:797
+#: db/models/fields/__init__.py:808
+#: forms/fields.py:52
+#: oldforms/__init__.py:374
+msgid "This field is required."
+msgstr "Obavezno polje."
+
+#: db/models/fields/__init__.py:462
+msgid "This value must be an integer."
+msgstr "Vrednost mora biti celi broj."
+
+#: db/models/fields/__init__.py:508
+msgid "This value must be either True or False."
+msgstr "Vrednost mora biti True ili False."
+
+#: db/models/fields/__init__.py:537
+msgid "This field cannot be null."
+msgstr "Polje ne može sadržati praznu vrednost."
+
+#: db/models/fields/__init__.py:639
+#: db/models/fields/__init__.py:656
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM[ss[.uuuuuu]] format."
+msgstr "Unesite ispravan datum i vreme u YYYY-MM-DD HH:MM[ss[.uuuuuu]] formatu."
+
+#: db/models/fields/__init__.py:712
+msgid "This value must be a decimal number."
+msgstr "Vrednost mora biti decimalni broj."
+
+#: db/models/fields/__init__.py:817
+msgid "Enter a valid filename."
+msgstr "Unesite ispravno ime fajla."
+
+#: db/models/fields/__init__.py:1018
+msgid "This value must be either None, True or False."
+msgstr "Vrednost mora biti None, True ili False."
+
+#: db/models/fields/__init__.py:1133
+#: db/models/fields/__init__.py:1146
+msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format."
+msgstr "Unesite ispravno vreme u HH:MM[:ss[.uuuuuu]]  formatu."
+
+#: db/models/fields/related.py:93
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Unesite ispravan %s."
+
+#: db/models/fields/related.py:730
+msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "Koristite \"Ctrl\" (PC) ili \"Jabuku\" (Mek) da bi ste selektovali više stavki."
+
+#: db/models/fields/related.py:774
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural "Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "Unesite validne %(self)s ID-ove. Vrednost %(value)r je neispravna."
+msgstr[1] "Unesite validne %(self)s ID-ove. Vrednost %(value)r je neispravna."
+msgstr[2] "Unesite validne %(self)s ID-ove. Vrednost %(value)r je neispravna."
+
+#: forms/fields.py:53
+msgid "Enter a valid value."
+msgstr "Unesite ispravnu vrednost."
+
+#: forms/fields.py:130
+#, python-format
+msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+msgstr "Proverite dužinu, maksimum je %(max)d karaktera (dobijeno %(length)d)."
+
+#: forms/fields.py:131
+#, python-format
+msgid "Ensure this value has at least %(min)d characters (it has %(length)d)."
+msgstr "Proverite dužinu, minimum je %(min)d karaktera (dobijeno %(length)d)."
+
+#: forms/fields.py:159
+#: forms/fields.py:188
+#: forms/fields.py:217
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Vrednost mora biti manja ili jednaka %s."
+
+#: forms/fields.py:160
+#: forms/fields.py:189
+#: forms/fields.py:218
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Proverite da li je vrednost veća ili jednaka %s."
+
+#: forms/fields.py:187
+#: forms/fields.py:216
+msgid "Enter a number."
+msgstr "Unesite broj."
+
+#: forms/fields.py:219
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr "Proverite da nema više od %s cifara."
+
+#: forms/fields.py:220
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr "Proverite da nema više od %s decimalnih mesta."
+
+#: forms/fields.py:221
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr "Proverite da nema više od %s cifara u celom delu."
+
+#: forms/fields.py:269
+#: forms/fields.py:799
+msgid "Enter a valid date."
+msgstr "Unesite ispravan datum."
+
+#: forms/fields.py:302
+#: forms/fields.py:800
+msgid "Enter a valid time."
+msgstr "Unesite ispravno vreme."
+
+#: forms/fields.py:341
+msgid "Enter a valid date/time."
+msgstr "Unesite ispravan datum i vreme."
+
+#: forms/fields.py:428
+msgid "No file was submitted."
+msgstr "Fajl nije poslat."
+
+#: forms/fields.py:429
+#: oldforms/__init__.py:693
+msgid "The submitted file is empty."
+msgstr "Poslati fajl je prazan."
+
+#: forms/fields.py:528
+msgid "Enter a valid URL."
+msgstr "Unesite ispravan URL."
+
+#: forms/fields.py:529
+msgid "This URL appears to be a broken link."
+msgstr "URL je neispravan link."
+
+#: forms/fields.py:597
+#: forms/fields.py:648
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr "Izaberite validnu opciju. %(value)s nije među njima."
+
+#: forms/fields.py:649
+#: forms/fields.py:710
+#: forms/models.py:581
+msgid "Enter a list of values."
+msgstr "Unesite listu vrednosti."
+
+#: forms/fields.py:828
+msgid "Enter a valid IPv4 address."
+msgstr "Unesite IPv4 adresu."
+
+#: forms/models.py:514
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Izaberite validnu opciju. Izabrana opcija nije validna."
+
+#: forms/models.py:582
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Izaberite validnu opciju. Opcija %s nije validna."
+
+#: oldforms/__init__.py:409
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Tekst mora imati manje od %s slova."
+msgstr[1] "Tekst mora imati manje od %s slova."
+msgstr[2] "Tekst mora imati manje od %s slova."
+
+#: oldforms/__init__.py:414
+msgid "Line breaks are not allowed here."
+msgstr "Novi redovi ovde nisu dozvoljeni."
+
+#: oldforms/__init__.py:512
+#: oldforms/__init__.py:586
+#: oldforms/__init__.py:625
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Izaberite validnu opciju: '%(data)s' nije u %(choices)s."
+
+#: oldforms/__init__.py:754
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Unesite celi broj između -32,768 i 32,767."
+
+#: oldforms/__init__.py:764
+msgid "Enter a positive number."
+msgstr "Unesite pozitivan broj."
+
+#: oldforms/__init__.py:774
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Unesite celi broj između 0 i 32,767."
+
+#: template/defaultfilters.py:698
+msgid "yes,no,maybe"
+msgstr "da,ne,možda"
+
+#: template/defaultfilters.py:729
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d bajt"
+msgstr[1] "%(size)d bajta"
+msgstr[2] "%(size)d bajtova"
+
+#: template/defaultfilters.py:731
+#, python-format
+msgid "%.1f KB"
+msgstr ""
+
+#: template/defaultfilters.py:733
+#, python-format
+msgid "%.1f MB"
+msgstr ""
+
+#: template/defaultfilters.py:734
+#, python-format
+msgid "%.1f GB"
+msgstr ""
+
+#: utils/dateformat.py:41
+msgid "p.m."
+msgstr "popodne"
+
+#: utils/dateformat.py:42
+msgid "a.m."
+msgstr "prepodne"
+
+#: utils/dateformat.py:47
+msgid "PM"
+msgstr "popodne"
+
+#: utils/dateformat.py:48
+msgid "AM"
+msgstr "prepodne"
+
+#: utils/dateformat.py:97
+msgid "midnight"
+msgstr "ponoć"
+
+#: utils/dateformat.py:99
+msgid "noon"
+msgstr "podne"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Ponedeljak"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Utorak"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Sreda"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Četvrtak"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Petak"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Subota"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Nedelja"
+
+#: utils/dates.py:10
+msgid "Mon"
+msgstr "Pon"
+
+#: utils/dates.py:10
+msgid "Tue"
+msgstr "Uto"
+
+#: utils/dates.py:10
+msgid "Wed"
+msgstr "Sre"
+
+#: utils/dates.py:10
+msgid "Thu"
+msgstr "Čet"
+
+#: utils/dates.py:10
+msgid "Fri"
+msgstr "Pet"
+
+#: utils/dates.py:11
+msgid "Sat"
+msgstr "Sub"
+
+#: utils/dates.py:11
+msgid "Sun"
+msgstr "Ned"
+
+#: utils/dates.py:18
+msgid "January"
+msgstr "Januar"
+
+#: utils/dates.py:18
+msgid "February"
+msgstr "Februar"
+
+#: utils/dates.py:18
+#: utils/dates.py:31
+msgid "March"
+msgstr "Mart"
+
+#: utils/dates.py:18
+#: utils/dates.py:31
+msgid "April"
+msgstr "April"
+
+#: utils/dates.py:18
+#: utils/dates.py:31
+msgid "May"
+msgstr "Maj"
+
+#: utils/dates.py:18
+#: utils/dates.py:31
+msgid "June"
+msgstr "Jun"
+
+#: utils/dates.py:19
+#: utils/dates.py:31
+msgid "July"
+msgstr "Jul"
+
+#: utils/dates.py:19
+msgid "August"
+msgstr "Avgust"
+
+#: utils/dates.py:19
+msgid "September"
+msgstr "Septembar"
+
+#: utils/dates.py:19
+msgid "October"
+msgstr "Oktobar"
+
+#: utils/dates.py:19
+msgid "November"
+msgstr "Novembar"
+
+#: utils/dates.py:20
+msgid "December"
+msgstr "Decembar"
+
+#: utils/dates.py:23
+msgid "jan"
+msgstr "jan"
+
+#: utils/dates.py:23
+msgid "feb"
+msgstr "feb"
+
+#: utils/dates.py:23
+msgid "mar"
+msgstr "mar"
+
+#: utils/dates.py:23
+msgid "apr"
+msgstr "apr"
+
+#: utils/dates.py:23
+msgid "may"
+msgstr "maj"
+
+#: utils/dates.py:23
+msgid "jun"
+msgstr "jun"
+
+#: utils/dates.py:24
+msgid "jul"
+msgstr "jul"
+
+#: utils/dates.py:24
+msgid "aug"
+msgstr "avg"
+
+#: utils/dates.py:24
+msgid "sep"
+msgstr "sep"
+
+#: utils/dates.py:24
+msgid "oct"
+msgstr "okt"
+
+#: utils/dates.py:24
+msgid "nov"
+msgstr "nov"
+
+#: utils/dates.py:24
+msgid "dec"
+msgstr "dec"
+
+#: utils/dates.py:31
+msgid "Jan."
+msgstr "Jan."
+
+#: utils/dates.py:31
+msgid "Feb."
+msgstr "Feb."
+
+#: utils/dates.py:32
+msgid "Aug."
+msgstr "Avg."
+
+#: utils/dates.py:32
+msgid "Sept."
+msgstr "Sept."
+
+#: utils/dates.py:32
+msgid "Oct."
+msgstr "Okt."
+
+#: utils/dates.py:32
+msgid "Nov."
+msgstr "Nov."
+
+#: utils/dates.py:32
+msgid "Dec."
+msgstr "Dec."
+
+#: utils/text.py:128
+msgid "or"
+msgstr "ili"
+
+#: utils/timesince.py:21
+msgid "year"
+msgid_plural "years"
+msgstr[0] "godina"
+msgstr[1] "godine"
+msgstr[2] "godina"
+
+#: utils/timesince.py:22
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mesec"
+msgstr[1] "meseca"
+msgstr[2] "meseci"
+
+#: utils/timesince.py:23
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "nedelja"
+msgstr[1] "nedelje"
+msgstr[2] "nedelja"
+
+#: utils/timesince.py:24
+msgid "day"
+msgid_plural "days"
+msgstr[0] "dan"
+msgstr[1] "dana"
+msgstr[2] "dana"
+
+#: utils/timesince.py:25
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "sat"
+msgstr[1] "sata"
+msgstr[2] "sati"
+
+#: utils/timesince.py:26
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minut"
+msgstr[1] "munuta"
+msgstr[2] "minuta"
+
+#: utils/timesince.py:46
+msgid "minutes"
+msgstr "minuta"
+
+#: utils/timesince.py:51
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr "%(type)s: %(number)d"
+
+#: utils/timesince.py:57
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ", %(type)s: %(number)d"
+
+#: utils/translation/trans_real.py:401
+msgid "DATE_FORMAT"
+msgstr "D, d.m.Y."
+
+#: utils/translation/trans_real.py:402
+msgid "DATETIME_FORMAT"
+msgstr "d.m.Y. H:i:s"
+
+#: utils/translation/trans_real.py:403
+msgid "TIME_FORMAT"
+msgstr "H:i:s"
+
+#: utils/translation/trans_real.py:419
+msgid "YEAR_MONTH_FORMAT"
+msgstr "m.Y."
+
+#: utils/translation/trans_real.py:420
+msgid "MONTH_DAY_FORMAT"
+msgstr "d.m."
+
+#: views/generic/create_update.py:129
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "%(verbose_name)s uspešno kreiran."
+
+#: views/generic/create_update.py:172
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "%(verbose_name)s uspešno promenjen."
+
+#: views/generic/create_update.py:214
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "%(verbose_name)s je obrisan."
+
+#~ msgid "Added %s."
+#~ msgstr "Dodat %s"
+#~ msgid "Deleted %s."
+#~ msgstr "Obrisan %s."
+#~ msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+#~ msgstr ""
+#~ "Da li ste <a href=\"/password_reset/\">zaboravili vašu lozinku?</a>?"
+#~ msgid "Ordering"
+#~ msgstr "Redosled"
+#~ msgid "Use '[algo]$[salt]$[hexdigest]'"
+#~ msgstr "Koristite '[algo]$[salt]$[hexdigest]'"
+#~ msgid "Separate multiple IDs with commas."
+#~ msgstr "Odvojite višestruke ID-ove zarezima."
+#~ msgid "Comment"
+#~ msgstr "Komentar"
+#~ msgid "Comments"
+#~ msgstr "Komentari"
+#~ msgid "String (up to 50)"
+#~ msgstr "Niz karaktera (maksimalno 50 karaktera)"
+#~ msgid "label"
+#~ msgstr "labela"
+#~ msgid "package"
+#~ msgstr "paket"
+#~ msgid "packages"
+#~ msgstr "paketi"
+#~ msgid "Error in Template"
+#~ msgstr "Greška u templejtu"
+#~ msgid ""
+#~ "\n"
+#~ "In template %(name)s, error at line %(line)s:\n"
+#~ msgstr ""
+#~ "\n"
+#~ "U templejtu %(name)s, greška u redu %(line)s:\n"
+
+#, fuzzy
+#~ msgid "count"
+#~ msgstr "sadržaj"
+
diff --git a/webapp/django/conf/locale/sr/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/sr/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..1de8977
--- /dev/null
+++ b/webapp/django/conf/locale/sr/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/sr/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/sr/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..c1338be
--- /dev/null
+++ b/webapp/django/conf/locale/sr/LC_MESSAGES/djangojs.po
@@ -0,0 +1,120 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-07-29 12:07+0200\n"
+"PO-Revision-Date: 2008-07-29 12:53+0100\n"
+"Last-Translator: Nebojsa Djordjevic <djnesh@gmail.com>\n"
+"Language-Team: Nesh <djnesh@gmail.com> & Petar <petar.maric@gmail.com> <sr@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Country: YUGOSLAVIA\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Poedit-Language: Serbian\n"
+"X-Poedit-SourceCharset: utf-8\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "Dostupno %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Izaberite sve"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Dodajte"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Izbacite"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Izabrano %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Izaberite potrebno i kliknite"
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Obrišite sve"
+
+#: contrib/admin/media/js/calendar.js:24
+#: contrib/admin/media/js/dateparse.js:32
+msgid "January February March April May June July August September October November December"
+msgstr "Januar Februar Mart April Maj Jun Jul Avgust Septembar Oktobar Novembar Decembar"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "N P U S Č P S"
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Nedelja Ponedeljak Utorak Sreda Četvrtak Petak Subota"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr "Prikaži"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr "Sakrij"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Now"
+msgstr "Sada"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
+msgid "Clock"
+msgstr "Sat"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
+msgid "Choose a time"
+msgstr "Izaberite vreme"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "Midnight"
+msgstr "Ponoć"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "6 a.m."
+msgstr "6 sati"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
+msgid "Noon"
+msgstr "Podne"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
+msgid "Cancel"
+msgstr "Poništi"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
+msgid "Today"
+msgstr "Danas"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
+msgid "Calendar"
+msgstr "Kalendar"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
+msgid "Yesterday"
+msgstr "Juče"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
+msgid "Tomorrow"
+msgstr "Sutra"
+
diff --git a/webapp/django/conf/locale/sv/LC_MESSAGES/django.mo b/webapp/django/conf/locale/sv/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..b4870c7
--- /dev/null
+++ b/webapp/django/conf/locale/sv/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/sv/LC_MESSAGES/django.po b/webapp/django/conf/locale/sv/LC_MESSAGES/django.po
new file mode 100644
index 0000000..3d0a437
--- /dev/null
+++ b/webapp/django/conf/locale/sv/LC_MESSAGES/django.po
@@ -0,0 +1,4570 @@
+# Swedish translation of Django
+# Copyright (C) 2005-2007
+# This file is distributed under the same license as the Django package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-08-19 01:28+0200\n"
+"PO-Revision-Date: 2008-05-26 11:15+0200\n"
+"Last-Translator: Ludvig Ericson <ludvig.ericson@gmail.com>\n"
+"Language-Team: Django I18N <Django-I18N@googlegroups.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms:  nplurals=2; plural=(n != 1);\n"
+"X-Poedit-Language: Swedish\n"
+"X-Poedit-Country: SWEDEN\n"
+
+#: conf/global_settings.py:44
+msgid "Arabic"
+msgstr "Arabiska"
+
+#: conf/global_settings.py:45
+msgid "Bengali"
+msgstr "Bengaliska"
+
+#: conf/global_settings.py:46
+msgid "Bulgarian"
+msgstr "Bulgariska"
+
+#: conf/global_settings.py:47
+msgid "Catalan"
+msgstr "Katalanska"
+
+#: conf/global_settings.py:48
+msgid "Czech"
+msgstr "Tjeckiska"
+
+#: conf/global_settings.py:49
+msgid "Welsh"
+msgstr "Walesiska"
+
+#: conf/global_settings.py:50
+msgid "Danish"
+msgstr "Danska"
+
+#: conf/global_settings.py:51
+msgid "German"
+msgstr "Tyska"
+
+#: conf/global_settings.py:52
+msgid "Greek"
+msgstr "Grekiska"
+
+#: conf/global_settings.py:53
+msgid "English"
+msgstr "Engelska"
+
+#: conf/global_settings.py:54
+msgid "Spanish"
+msgstr "Spanska"
+
+#: conf/global_settings.py:55
+msgid "Estonian"
+msgstr "Estländska"
+
+#: conf/global_settings.py:56
+msgid "Argentinean Spanish"
+msgstr "Argentisk Spanska"
+
+#: conf/global_settings.py:57
+msgid "Basque"
+msgstr "Baskiska"
+
+#: conf/global_settings.py:58
+msgid "Persian"
+msgstr "Persiska"
+
+#: conf/global_settings.py:59
+msgid "Finnish"
+msgstr "Finska"
+
+#: conf/global_settings.py:60
+msgid "French"
+msgstr "Franska"
+
+#: conf/global_settings.py:61
+msgid "Irish"
+msgstr "Irländska"
+
+#: conf/global_settings.py:62
+msgid "Galician"
+msgstr "Galisiska"
+
+#: conf/global_settings.py:63
+msgid "Hungarian"
+msgstr "Ungerska"
+
+#: conf/global_settings.py:64
+msgid "Hebrew"
+msgstr "Hebreiska"
+
+#: conf/global_settings.py:65
+msgid "Croatian"
+msgstr "Kroatiska"
+
+#: conf/global_settings.py:66
+msgid "Icelandic"
+msgstr "Isländska"
+
+#: conf/global_settings.py:67
+msgid "Italian"
+msgstr "Italienska"
+
+#: conf/global_settings.py:68
+msgid "Japanese"
+msgstr "Japanska"
+
+#: conf/global_settings.py:69
+msgid "Georgian"
+msgstr "Georgiska"
+
+#: conf/global_settings.py:70
+msgid "Korean"
+msgstr "Koreanska"
+
+#: conf/global_settings.py:71
+msgid "Khmer"
+msgstr "Khmer"
+
+#: conf/global_settings.py:72
+msgid "Kannada"
+msgstr "Kannada"
+
+#: conf/global_settings.py:73
+msgid "Latvian"
+msgstr "Lettiska"
+
+#: conf/global_settings.py:74
+msgid "Lithuanian"
+msgstr "Lettiska"
+
+#: conf/global_settings.py:75
+msgid "Macedonian"
+msgstr "Makedonska"
+
+#: conf/global_settings.py:76
+msgid "Dutch"
+msgstr "Holländska"
+
+#: conf/global_settings.py:77
+msgid "Norwegian"
+msgstr "Norska"
+
+#: conf/global_settings.py:78
+msgid "Polish"
+msgstr "Polska"
+
+#: conf/global_settings.py:79
+msgid "Portugese"
+msgstr "Portugisiska"
+
+#: conf/global_settings.py:80
+msgid "Brazilian Portuguese"
+msgstr "Brasiliensk portugisiska"
+
+#: conf/global_settings.py:81
+msgid "Romanian"
+msgstr "Rumänska"
+
+#: conf/global_settings.py:82
+msgid "Russian"
+msgstr "Ryska"
+
+#: conf/global_settings.py:83
+msgid "Slovak"
+msgstr "Slovakiska"
+
+#: conf/global_settings.py:84
+msgid "Slovenian"
+msgstr "Slovenska"
+
+#: conf/global_settings.py:85
+msgid "Serbian"
+msgstr "Serbiska"
+
+#: conf/global_settings.py:86
+msgid "Swedish"
+msgstr "Svenska"
+
+#: conf/global_settings.py:87
+msgid "Tamil"
+msgstr "Tamilska"
+
+#: conf/global_settings.py:88
+msgid "Telugu"
+msgstr "Telugu"
+
+#: conf/global_settings.py:89
+msgid "Turkish"
+msgstr "Turkiska"
+
+#: conf/global_settings.py:90
+msgid "Ukrainian"
+msgstr "Ukrainska"
+
+#: conf/global_settings.py:91
+msgid "Simplified Chinese"
+msgstr "Förenklad Kinesiska"
+
+#: conf/global_settings.py:92
+msgid "Traditional Chinese"
+msgstr "Traditionell Kinesiska"
+
+#: contrib/admin/filterspecs.py:44
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Av %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:74 contrib/admin/filterspecs.py:92
+#: contrib/admin/filterspecs.py:147 contrib/admin/filterspecs.py:173
+msgid "All"
+msgstr "Alla"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Any date"
+msgstr "Alla datum"
+
+#: contrib/admin/filterspecs.py:114
+msgid "Today"
+msgstr "Idag"
+
+#: contrib/admin/filterspecs.py:117
+msgid "Past 7 days"
+msgstr "Senaste 7 dagarna"
+
+#: contrib/admin/filterspecs.py:119
+msgid "This month"
+msgstr "Denna månad"
+
+#: contrib/admin/filterspecs.py:121
+msgid "This year"
+msgstr "Detta år"
+
+#: contrib/admin/filterspecs.py:147 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "Yes"
+msgstr "Ja"
+
+#: contrib/admin/filterspecs.py:147 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "No"
+msgstr "Nej"
+
+#: contrib/admin/filterspecs.py:154 forms/widgets.py:379
+#: oldforms/__init__.py:588
+msgid "Unknown"
+msgstr "Okänt"
+
+#: contrib/admin/models.py:19
+msgid "action time"
+msgstr "händelsetid"
+
+#: contrib/admin/models.py:22
+msgid "object id"
+msgstr "objektets id"
+
+#: contrib/admin/models.py:23
+msgid "object repr"
+msgstr "objektets beskrivning"
+
+#: contrib/admin/models.py:24
+msgid "action flag"
+msgstr "händelseflagga"
+
+#: contrib/admin/models.py:25
+msgid "change message"
+msgstr "ändra meddelande"
+
+#: contrib/admin/models.py:28
+msgid "log entry"
+msgstr "loggpost"
+
+#: contrib/admin/models.py:29
+msgid "log entries"
+msgstr "loggposter"
+
+#: contrib/admin/options.py:56 contrib/admin/options.py:115
+msgid "None"
+msgstr "Inget"
+
+#: contrib/admin/options.py:326
+#, python-format
+msgid "Changed %s."
+msgstr "Ändrade %s."
+
+#: contrib/admin/options.py:326 contrib/admin/options.py:336
+#: core/validators.py:279 db/models/manipulators.py:305
+msgid "and"
+msgstr "och"
+
+#: contrib/admin/options.py:331
+#, python-format
+msgid "Added %(name)s \"%(object)s\"."
+msgstr "Lade till %(name)s \"%(object)s\"."
+
+#: contrib/admin/options.py:335
+#, python-format
+msgid "Changed %(list)s for %(name)s \"%(object)s\"."
+msgstr "Ändrade %(list)s på %(name)s \"%(object)s\"."
+
+#: contrib/admin/options.py:340
+#, python-format
+msgid "Deleted %(name)s \"%(object)s\"."
+msgstr "Tog bort %(name)s \"%(object)s\"."
+
+#: contrib/admin/options.py:344
+msgid "No fields changed."
+msgstr "Inga fält ändrade."
+
+#: contrib/admin/options.py:405 contrib/auth/admin.py:50
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" lades till."
+
+#: contrib/admin/options.py:409 contrib/admin/options.py:442
+#: contrib/auth/admin.py:55
+msgid "You may edit it again below."
+msgstr "Du kan ändra det igen nedanför."
+
+#: contrib/admin/options.py:419 contrib/admin/options.py:452
+#, python-format
+msgid "You may add another %s below."
+msgstr "Du kan lägga till ytterligare %s nedanför."
+
+#: contrib/admin/options.py:440
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" ändrades."
+
+#: contrib/admin/options.py:448
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s\" lades till. Du kan redigera objektet igen nedanför."
+
+#: contrib/admin/options.py:514
+#, python-format
+msgid "Add %s"
+msgstr "Lägg till %s"
+
+#: contrib/admin/options.py:591
+#, python-format
+msgid "Change %s"
+msgstr "Ändra %s"
+
+#: contrib/admin/options.py:622
+msgid "Database error"
+msgstr "Databasfel"
+
+#: contrib/admin/options.py:671
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" togs bort."
+
+#: contrib/admin/options.py:678
+msgid "Are you sure?"
+msgstr "Är du säker?"
+
+#: contrib/admin/options.py:705
+#, python-format
+msgid "Change history: %s"
+msgstr "Ändringshistorik: %s"
+
+#: contrib/admin/sites.py:18 contrib/admin/views/decorators.py:16
+#: contrib/auth/forms.py:72 contrib/comments/views/comments.py:56
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Var god ange ett korrekt användarnamn och lösenord. Tänk på att skilja "
+"mellan gemener och versaler."
+
+#: contrib/admin/sites.py:238 contrib/admin/views/decorators.py:68
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Du måste logga in igen eftersom din session har förfallit. Oroa dig inte: "
+"Din data har sparats."
+
+#: contrib/admin/sites.py:245 contrib/admin/views/decorators.py:75
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Det verkar som att din webläsare inte är konfigurerad att acceptera cookies. "
+"Aktivera cookies, ladda om denna sida och försök igen."
+
+#: contrib/admin/sites.py:259 contrib/admin/sites.py:265
+#: contrib/admin/views/decorators.py:92
+msgid "Usernames cannot contain the '@' character."
+msgstr "Användarnamn får inte innehålla '@'-tecknet."
+
+#: contrib/admin/sites.py:262 contrib/admin/views/decorators.py:88
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "Din e-postadress är inte ditt användarnamn. Försök med '%s' istället."
+
+#: contrib/admin/sites.py:330
+msgid "Site administration"
+msgstr "Webbplatsadministration"
+
+#: contrib/admin/sites.py:352 contrib/admin/templates/admin/login.html:27
+#: contrib/admin/templates/registration/password_reset_complete.html:14
+#: contrib/admin/views/decorators.py:30
+msgid "Log in"
+msgstr "Logga in"
+
+#: contrib/admin/util.py:138
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Ett eller flera %(fieldname)s i %(name)s: %(obj)s"
+
+#: contrib/admin/util.py:143
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Ett eller flera %(fieldname)s i %(name)s:"
+
+#: contrib/admin/widgets.py:65
+msgid "Date:"
+msgstr "Datum:"
+
+#: contrib/admin/widgets.py:65
+msgid "Time:"
+msgstr "Tid:"
+
+#: contrib/admin/widgets.py:89
+msgid "Currently:"
+msgstr "Aktuell:"
+
+#: contrib/admin/widgets.py:89
+msgid "Change:"
+msgstr "Ändra:"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Sidan kunde inte hittas"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Vi beklagar men den begärda sidan hittades inte."
+
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/change_form.html:17
+#: contrib/admin/templates/admin/change_list.html:8
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/auth/user/change_password.html:10
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_reset_complete.html:4
+#: contrib/admin/templates/registration/password_reset_confirm.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Hem"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Serverfel"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Serverfel (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Serverfel <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Ett fel har uppstått. Administratören har meddelats via e-post och felet bör "
+"vara åtgärdat inom kort. Tack för visat tålamod."
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "Välkommen,"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Dokumentation"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:13
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+msgid "Change password"
+msgstr "Ändra lösenord"
+
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/comments/templates/comments/form.html:6
+msgid "Log out"
+msgstr "Logga ut"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django webbplatsadministration"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django-administration"
+
+#: contrib/admin/templates/admin/change_form.html:19
+#: contrib/admin/templates/admin/index.html:29
+msgid "Add"
+msgstr "Lägg till"
+
+#: contrib/admin/templates/admin/change_form.html:26
+#: contrib/admin/templates/admin/object_history.html:5
+msgid "History"
+msgstr "Historik"
+
+#: contrib/admin/templates/admin/change_form.html:27
+msgid "View on site"
+msgstr "Visa på webbplats"
+
+#: contrib/admin/templates/admin/change_form.html:37
+#: contrib/admin/templates/admin/auth/user/change_password.html:22
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Rätta till felet nedan."
+msgstr[1] "Rätta till felen nedan."
+
+#: contrib/admin/templates/admin/change_list.html:16
+#, python-format
+msgid "Add %(name)s"
+msgstr "Lägg till %(name)s"
+
+#: contrib/admin/templates/admin/change_list.html:26
+msgid "Filter"
+msgstr "Filter"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+#: contrib/admin/templates/admin/edit_inline/tabular.html:15
+msgid "Delete"
+msgstr "Ta bort"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:15
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"Att ta bort %(object_name)s '%(escaped_object)s' skulle innebära att "
+"relaterade objekt togs bort, men ditt konto har inte rättigheter att ta bort "
+"följande objekttyper:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:22
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"Är du säker på att du vill ta bort %(object_name)s \"%(escaped_object)s\"? "
+"Följande relaterade objekt kommer att tas bort:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:27
+msgid "Yes, I'm sure"
+msgstr "Ja, jag är säker"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " Av %(filter_title)s "
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Modeller tillgängliga i applikationen %(name)s."
+
+#: contrib/admin/templates/admin/index.html:19
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:35
+msgid "Change"
+msgstr "Ändra"
+
+#: contrib/admin/templates/admin/index.html:45
+msgid "You don't have permission to edit anything."
+msgstr "Du har inte rättigheter att redigera något."
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "Recent Actions"
+msgstr "Senaste Händelser"
+
+#: contrib/admin/templates/admin/index.html:54
+msgid "My Actions"
+msgstr "Mina händelser"
+
+#: contrib/admin/templates/admin/index.html:58
+msgid "None available"
+msgstr "Inga tillgängliga"
+
+#: contrib/admin/templates/admin/invalid_setup.html:7
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Någonting är fel med din databasinstallation. Se till att de rätta "
+"databastabellerna har skapats och att databasen är läsbar av rätt användare."
+
+#: contrib/admin/templates/admin/login.html:19
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+msgid "Username:"
+msgstr "Användarnamn:"
+
+#: contrib/admin/templates/admin/login.html:22
+#: contrib/comments/templates/comments/form.html:8
+msgid "Password:"
+msgstr "Lösenord:"
+
+#: contrib/admin/templates/admin/object_history.html:16
+msgid "Date/time"
+msgstr "Datum tid"
+
+#: contrib/admin/templates/admin/object_history.html:17
+msgid "User"
+msgstr "Användare"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Action"
+msgstr "Händelse"
+
+#: contrib/admin/templates/admin/object_history.html:24
+msgid "DATE_WITH_TIME_FULL"
+msgstr "Y-m-d H:i:s"
+
+#: contrib/admin/templates/admin/object_history.html:32
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Detta objekt har ingen ändringshistorik. Det lades antagligen inte till via "
+"denna administrationssida."
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Visa alla"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Sök"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 resultat"
+msgstr[1] "%(counter)s resultat"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s totalt"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Spara som ny"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Spara och lägg till ny"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Spara och fortsätt redigera"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Spara"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Ange först ett användarnamn och ett lösenord. Efter det kommer du att få "
+"fler användaralternativ."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:13
+#: contrib/auth/forms.py:14 contrib/auth/forms.py:51
+msgid "Username"
+msgstr "Användarnamn"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:20
+#: contrib/admin/templates/admin/auth/user/change_password.html:33
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:52 contrib/auth/forms.py:176
+msgid "Password"
+msgstr "Lösenord"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:26
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+#: contrib/auth/forms.py:177
+msgid "Password (again)"
+msgstr "Lösenord (igen)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:27
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+msgid "Enter the same password as above, for verification."
+msgstr "Fyll i samma lösenord som ovan för verifiering."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:26
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "Ange nytt lösenord för användare <strong>%(username)s</strong>."
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Tack för att du spenderade lite kvalitetstid med webbplatsen idag."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Logga in igen"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Ändra lösenord"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Lösenordet ändrades"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Ditt lösenord har ändrats."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Var god fyll i ditt gamla lösenord för säkerhets skull och skriv sedan in "
+"ditt nya lösenord två gånger så vi kan kontrollera att du skrev det rätt."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Gammalt lösenord:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+#: contrib/admin/templates/registration/password_reset_confirm.html:18
+msgid "New password:"
+msgstr "Nytt lösenord:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+#: contrib/admin/templates/registration/password_reset_confirm.html:20
+msgid "Confirm password:"
+msgstr "Bekräfta lösenord:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+#: contrib/admin/templates/registration/password_reset_confirm.html:21
+msgid "Change my password"
+msgstr "Ändra mitt lösenord"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:4
+#: contrib/admin/templates/registration/password_reset_confirm.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+msgid "Password reset"
+msgstr "Nollställ lösenord"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:6
+#: contrib/admin/templates/registration/password_reset_complete.html:10
+msgid "Password reset complete"
+msgstr "Nollställning av lösenord klar"
+
+#: contrib/admin/templates/registration/password_reset_complete.html:12
+msgid "Your password has been set.  You may go ahead and log in now."
+msgstr "Ditt lösenord har ändrats.  Du kan nu logga in."
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:4
+msgid "Password reset confirmation"
+msgstr "Bekräftelse av lösenordsnollställning"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:12
+msgid "Enter new password"
+msgstr "Fyll i lösenord"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:14
+msgid ""
+"Please enter your new password twice so we can verify you typed it in "
+"correctly."
+msgstr ""
+"Var god fyll i ditt nya lösenord två gånger så vi kan kontrollera att du "
+"skrev det rätt."
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:26
+msgid "Password reset unsuccessful"
+msgstr "Lösenordsnollställning misslyckad"
+
+#: contrib/admin/templates/registration/password_reset_confirm.html:28
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used.  Please request a new password reset."
+msgstr ""
+"Länken för lösenordsnollställning var felaktig, möjligen därför att den "
+"redan använts.  Var god skicka en ny nollställningsförfrågan."
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Lösenordsnollställning lyckades"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed you instructions for setting your password to the e-mail "
+"address you submitted. You should be receiving it shortly."
+msgstr ""
+"Vi har skickat ett e-postmeddelande med instruktioner för att ändra ditt "
+"lösenord till den e-postaddress du angivit. Det bör anlända inom kort."
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr ""
+"Du får detta e-postbrev eftersom du bad om att få lösenordet nollställt"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "för ditt användarkonto på %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+msgid "Please go to the following page and choose a new password:"
+msgstr "Var god gå till följande sida och välj ett nytt lösenord:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:9
+msgid "Your username, in case you've forgotten:"
+msgstr "Ditt användarnamn (i fall du skulle ha glömt det):"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Thanks for using our site!"
+msgstr "Tack för att du använder vår webbplats!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s-teamet"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll e-mail "
+"instructions for setting a new one."
+msgstr ""
+"Glömt ditt lösenord? Fyll i din e-postadress nedan så skickar vi ett e-"
+"postmeddelande med instruktioner för hur du ställer in ett nytt."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "E-postadress:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Nollställ mitt lösenord"
+
+#: contrib/admin/templatetags/admin_list.py:284
+msgid "All dates"
+msgstr "Alla datum"
+
+#: contrib/admin/views/main.py:65
+#, python-format
+msgid "Select %s"
+msgstr "Välj %s"
+
+#: contrib/admin/views/main.py:65
+#, python-format
+msgid "Select %s to change"
+msgstr "Välj %s att ändra"
+
+#: contrib/admin/views/template.py:36 contrib/sites/models.py:38
+msgid "site"
+msgstr "webbplats"
+
+#: contrib/admin/views/template.py:38
+msgid "template"
+msgstr "mall"
+
+#: contrib/admindocs/views.py:53 contrib/admindocs/views.py:55
+#: contrib/admindocs/views.py:57
+msgid "tag:"
+msgstr "tagg:"
+
+#: contrib/admindocs/views.py:87 contrib/admindocs/views.py:89
+#: contrib/admindocs/views.py:91
+msgid "filter:"
+msgstr "filter:"
+
+#: contrib/admindocs/views.py:153 contrib/admindocs/views.py:155
+#: contrib/admindocs/views.py:157
+msgid "view:"
+msgstr "vy:"
+
+#: contrib/admindocs/views.py:187
+#, python-format
+msgid "App %r not found"
+msgstr "Applikation %r hittades inte"
+
+#: contrib/admindocs/views.py:194
+#, python-format
+msgid "Model %(model_name)r not found in app %(app_label)r"
+msgstr "Modell %(model_name)r hittades inte i applikation %(app_label)r"
+
+#: contrib/admindocs/views.py:206
+#, python-format
+msgid "the related `%(app_label)s.%(data_type)s` object"
+msgstr "det relaterade `%(app_label)s.%(data_type)s`-objektet"
+
+#: contrib/admindocs/views.py:206 contrib/admindocs/views.py:228
+#: contrib/admindocs/views.py:242 contrib/admindocs/views.py:247
+msgid "model:"
+msgstr "modell:"
+
+#: contrib/admindocs/views.py:237
+#, python-format
+msgid "related `%(app_label)s.%(object_name)s` objects"
+msgstr "relaterade `%(app_label)s.%(object_name)s`-objekt"
+
+#: contrib/admindocs/views.py:242
+#, python-format
+msgid "all %s"
+msgstr "alla %s"
+
+#: contrib/admindocs/views.py:247
+#, python-format
+msgid "number of %s"
+msgstr "antal %s"
+
+#: contrib/admindocs/views.py:253
+#, python-format
+msgid "Fields on %s objects"
+msgstr "Fält på %s objekt"
+
+#: contrib/admindocs/views.py:317 contrib/admindocs/views.py:328
+#: contrib/admindocs/views.py:330 contrib/admindocs/views.py:336
+#: contrib/admindocs/views.py:337 contrib/admindocs/views.py:339
+msgid "Integer"
+msgstr "Heltal"
+
+#: contrib/admindocs/views.py:318
+msgid "Boolean (Either True or False)"
+msgstr "Boolesk (antingen True eller False)"
+
+#: contrib/admindocs/views.py:319 contrib/admindocs/views.py:338
+#, python-format
+msgid "String (up to %(max_length)s)"
+msgstr "Sträng (upp till %(max_length)s)"
+
+#: contrib/admindocs/views.py:320
+msgid "Comma-separated integers"
+msgstr "Komma-separerade heltal"
+
+#: contrib/admindocs/views.py:321
+msgid "Date (without time)"
+msgstr "Datum (utan tid)"
+
+#: contrib/admindocs/views.py:322
+msgid "Date (with time)"
+msgstr "Datum (med tid)"
+
+#: contrib/admindocs/views.py:323
+msgid "Decimal number"
+msgstr "Decimaltal"
+
+#: contrib/admindocs/views.py:324
+msgid "E-mail address"
+msgstr "E-postadress"
+
+#: contrib/admindocs/views.py:325 contrib/admindocs/views.py:326
+#: contrib/admindocs/views.py:329
+msgid "File path"
+msgstr "Sökväg till fil"
+
+#: contrib/admindocs/views.py:327
+msgid "Floating point number"
+msgstr "Flyttal"
+
+#: contrib/admindocs/views.py:331 contrib/comments/models.py:89
+msgid "IP address"
+msgstr "IP-adress"
+
+#: contrib/admindocs/views.py:333
+msgid "Boolean (Either True, False or None)"
+msgstr "Boolesk (antingen True, False eller None)"
+
+#: contrib/admindocs/views.py:334
+msgid "Relation to parent model"
+msgstr "Relation till förälder-modell"
+
+#: contrib/admindocs/views.py:335
+msgid "Phone number"
+msgstr "Telefonnummer"
+
+#: contrib/admindocs/views.py:340
+msgid "Text"
+msgstr "Text"
+
+#: contrib/admindocs/views.py:341
+msgid "Time"
+msgstr "Tid"
+
+#: contrib/admindocs/views.py:342 contrib/flatpages/admin.py:8
+#: contrib/flatpages/models.py:8
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admindocs/views.py:343
+msgid "U.S. state (two uppercase letters)"
+msgstr "Delstat i USA (två versaler)"
+
+#: contrib/admindocs/views.py:344
+msgid "XML text"
+msgstr "XML-text"
+
+#: contrib/admindocs/views.py:370
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s verkar inte vara ett urlpattern-objekt"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Smarta bokmärken"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:4
+msgid "Documentation bookmarklets"
+msgstr "Smarta bokmärken för dokumentation"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:8
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">För att installera smarta bokmärken, dra länken till din\n"
+"verktygsrad med bokmärken, eller högerklicka på länken och lägg till den\n"
+"till dina bokmärken. Nu kan du välja det smarta bokmärket från alla sidor\n"
+"på webbplatsen. Observera att några av dessa smarta bokmärken kräver att du "
+"besöker\n"
+"sidan från en dator som är \"intern\" (kontakta din systemadministratör\n"
+"om du inte är säker på om din dator är \"intern\").</p>\n"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:18
+msgid "Documentation for this page"
+msgstr "Dokumentation för denna sida"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:19
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+"Förflyttar dig från valfri sida till dokumentationen för vyn som genererar "
+"den sidan."
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:21
+msgid "Show object ID"
+msgstr "Visa objektets ID"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:22
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Visa innehållstypen och det unika ID-numret för sidor som representerar ett "
+"enskilt objekt."
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:24
+msgid "Edit this object (current window)"
+msgstr "Redigera detta objekt (aktuellt fönster)"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:25
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+"Hoppar till administrationssidan för sidor som representerar ett enskilt "
+"objekt."
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:27
+msgid "Edit this object (new window)"
+msgstr "Redigera detta objekt (nytt fönster)"
+
+#: contrib/admindocs/templates/admin_doc/bookmarklets.html:28
+msgid "As above, but opens the admin page in a new window."
+msgstr "Som ovan, men öppnar administrationssidan i ett nytt fönster."
+
+#: contrib/auth/admin.py:21
+msgid "Personal info"
+msgstr "Personlig information"
+
+#: contrib/auth/admin.py:22
+msgid "Permissions"
+msgstr "Rättigheter"
+
+#: contrib/auth/admin.py:23
+msgid "Important dates"
+msgstr "Viktiga datum"
+
+#: contrib/auth/admin.py:24
+msgid "Groups"
+msgstr "Grupper"
+
+#: contrib/auth/admin.py:60
+msgid "Add user"
+msgstr "Lägg till användare"
+
+#: contrib/auth/admin.py:85
+msgid "Password changed successfully."
+msgstr "Lösenordet ändrades."
+
+#: contrib/auth/admin.py:91
+#, python-format
+msgid "Change password: %s"
+msgstr "Ändra lösenord: %s"
+
+#: contrib/auth/forms.py:15 contrib/auth/models.py:137
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr ""
+"Obligatorisk. 30 tecken eller färre. Endast bokstäver, siffror eller "
+"understreck."
+
+#: contrib/auth/forms.py:16 core/validators.py:72
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Detta värde får endast innehålla bokstäver, siffror och understreck."
+
+#: contrib/auth/forms.py:18
+msgid "Password confirmation"
+msgstr "Lösenordsbekräftelse"
+
+#: contrib/auth/forms.py:30
+msgid "A user with that username already exists."
+msgstr "En användare med det användarnamnet finns redan."
+
+#: contrib/auth/forms.py:36 contrib/auth/forms.py:146
+#: contrib/auth/forms.py:188
+msgid "The two password fields didn't match."
+msgstr "De två lösenordsfälten stämde inte överens."
+
+#: contrib/auth/forms.py:74 contrib/comments/views/comments.py:58
+msgid "This account is inactive."
+msgstr "Detta konto är inaktivt."
+
+#: contrib/auth/forms.py:79 contrib/comments/views/comments.py:49
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"Din webbläsare verkar inte tillåta cookies. Cookies behövs för att kunna "
+"logga in."
+
+#: contrib/auth/forms.py:92
+msgid "E-mail"
+msgstr "E-postadress"
+
+#: contrib/auth/forms.py:101
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr ""
+"Den e-postadressen är inte associerad med något användarkonto. Är du säker "
+"på att du har registrerat dig?"
+
+#: contrib/auth/forms.py:126
+#, python-format
+msgid "Password reset on %s"
+msgstr "Lösenord nollställt för %s"
+
+#: contrib/auth/forms.py:134
+msgid "New password"
+msgstr "Nytt lösenord"
+
+#: contrib/auth/forms.py:135
+msgid "New password confirmation"
+msgstr "Bekräfta nytt lösenord"
+
+#: contrib/auth/forms.py:160
+msgid "Old password"
+msgstr "Gammalt lösenord"
+
+#: contrib/auth/forms.py:168
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Ditt gamla lösenord var felaktigt ifyllt. Var vänlig fyll i det igen."
+
+#: contrib/auth/models.py:73 contrib/auth/models.py:96
+msgid "name"
+msgstr "namn"
+
+#: contrib/auth/models.py:75
+msgid "codename"
+msgstr "kodnamn"
+
+#: contrib/auth/models.py:78
+msgid "permission"
+msgstr "rättighet"
+
+#: contrib/auth/models.py:79 contrib/auth/models.py:97
+msgid "permissions"
+msgstr "rättigheter"
+
+#: contrib/auth/models.py:100
+msgid "group"
+msgstr "grupp"
+
+#: contrib/auth/models.py:101 contrib/auth/models.py:147
+msgid "groups"
+msgstr "grupper"
+
+#: contrib/auth/models.py:137
+msgid "username"
+msgstr "användarnamn"
+
+#: contrib/auth/models.py:138
+msgid "first name"
+msgstr "förnamn"
+
+#: contrib/auth/models.py:139
+msgid "last name"
+msgstr "efternamn"
+
+#: contrib/auth/models.py:140
+msgid "e-mail address"
+msgstr "e-postadress"
+
+#: contrib/auth/models.py:141
+msgid "password"
+msgstr "lösenord"
+
+#: contrib/auth/models.py:141
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"Använd '[algo]$[salt]$[hexdigest]' eller använd <a href=\"password/\">Ändra "
+"lösenord-formuläret</a>."
+
+#: contrib/auth/models.py:142
+msgid "staff status"
+msgstr "personalstatus"
+
+#: contrib/auth/models.py:142
+msgid "Designates whether the user can log into this admin site."
+msgstr "Avgör om användaren kan logga in på denna adminsida."
+
+#: contrib/auth/models.py:143
+msgid "active"
+msgstr "aktiv"
+
+#: contrib/auth/models.py:143
+msgid ""
+"Designates whether this user should be treated as active. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"Anger om användaren skall betraktas som aktiv. Avmarkera detta istället för "
+"att ta bort konton."
+
+#: contrib/auth/models.py:144
+msgid "superuser status"
+msgstr "superanvändare"
+
+#: contrib/auth/models.py:144
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr ""
+"Anger att denna användare har alla rättigheter utan att uttryckligen "
+"tilldela dem."
+
+#: contrib/auth/models.py:145
+msgid "last login"
+msgstr "senaste inloggning"
+
+#: contrib/auth/models.py:146
+msgid "date joined"
+msgstr "registreringsdatum"
+
+#: contrib/auth/models.py:148
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"Förutom de rättigheterna som utdelas manuellt så kommer användaren dessutom "
+"få samma rättigheter som de grupper där han/hon är medlem."
+
+#: contrib/auth/models.py:149
+msgid "user permissions"
+msgstr "användarättigheter"
+
+#: contrib/auth/models.py:153
+msgid "user"
+msgstr "användare"
+
+#: contrib/auth/models.py:154
+msgid "users"
+msgstr "användare"
+
+#: contrib/auth/models.py:309
+msgid "message"
+msgstr "meddelande"
+
+#: contrib/auth/views.py:50
+msgid "Logged out"
+msgstr "Utloggad"
+
+#: contrib/comments/models.py:71 contrib/comments/models.py:164
+msgid "object ID"
+msgstr "objektets ID"
+
+#: contrib/comments/models.py:72
+msgid "headline"
+msgstr "rubrik"
+
+#: contrib/comments/models.py:73 contrib/comments/models.py:95
+#: contrib/comments/models.py:165
+msgid "comment"
+msgstr "kommentar"
+
+#: contrib/comments/models.py:74
+msgid "rating #1"
+msgstr "betyg #1"
+
+#: contrib/comments/models.py:75
+msgid "rating #2"
+msgstr "betyg #2"
+
+#: contrib/comments/models.py:76
+msgid "rating #3"
+msgstr "betyg #3"
+
+#: contrib/comments/models.py:77
+msgid "rating #4"
+msgstr "betyg #4"
+
+#: contrib/comments/models.py:78
+msgid "rating #5"
+msgstr "betyg #5"
+
+#: contrib/comments/models.py:79
+msgid "rating #6"
+msgstr "betyg #6"
+
+#: contrib/comments/models.py:80
+msgid "rating #7"
+msgstr "betyg #7"
+
+#: contrib/comments/models.py:81
+msgid "rating #8"
+msgstr "betyg #8"
+
+#: contrib/comments/models.py:86
+msgid "is valid rating"
+msgstr "är ett giltigt betyg"
+
+#: contrib/comments/models.py:87 contrib/comments/models.py:167
+msgid "date/time submitted"
+msgstr "skickat datum/tid"
+
+#: contrib/comments/models.py:88 contrib/comments/models.py:168
+msgid "is public"
+msgstr "är offentlig"
+
+#: contrib/comments/models.py:90
+msgid "is removed"
+msgstr "är borttaget"
+
+#: contrib/comments/models.py:90
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Bocka för denna ruta om kommentaren är olämplig. Ett \"Denna kommentar har "
+"tagits bort\"-meddelande kommer visas istället."
+
+#: contrib/comments/models.py:96
+msgid "comments"
+msgstr "kommentarer"
+
+#: contrib/comments/models.py:128 contrib/comments/models.py:199
+msgid "Content object"
+msgstr "Innehållsobjekt"
+
+#: contrib/comments/models.py:156
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Inlagt av %(user)s %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:166
+msgid "person's name"
+msgstr "personens namn"
+
+#: contrib/comments/models.py:169
+msgid "ip address"
+msgstr "IP-adress"
+
+#: contrib/comments/models.py:171
+msgid "approved by staff"
+msgstr "godkänd av personal"
+
+#: contrib/comments/models.py:175
+msgid "free comment"
+msgstr "fri kommentar"
+
+#: contrib/comments/models.py:176
+msgid "free comments"
+msgstr "fria kommentarer"
+
+#: contrib/comments/models.py:227
+msgid "score"
+msgstr "poäng"
+
+#: contrib/comments/models.py:228
+msgid "score date"
+msgstr "poäng tilldelad"
+
+#: contrib/comments/models.py:232
+msgid "karma score"
+msgstr "karmapoäng"
+
+#: contrib/comments/models.py:233
+msgid "karma scores"
+msgstr "karmapoäng"
+
+#: contrib/comments/models.py:237
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "Betyg %(score)d av %(user)s"
+
+#: contrib/comments/models.py:254
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Denna kommentar flaggades av %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:262
+msgid "flag date"
+msgstr "flaggdatum"
+
+#: contrib/comments/models.py:266
+msgid "user flag"
+msgstr "användarflagga"
+
+#: contrib/comments/models.py:267
+msgid "user flags"
+msgstr "användarflaggor"
+
+#: contrib/comments/models.py:271
+#, python-format
+msgid "Flag by %r"
+msgstr "Flaggad av %r"
+
+#: contrib/comments/models.py:277
+msgid "deletion date"
+msgstr "borttagningsdatum"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "borttaget av moderator"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "borttagna av moderator"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Borttaget av moderator %r"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Glömt ditt lösenord?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Betyg"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Obligatorisk"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Valfri"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Lägg till foto"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Kommentar:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Förhandsgranska kommentar"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Ditt namn:"
+
+#: contrib/comments/views/comments.py:76
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr "Detta betyg krävs eftersom du har fyllt i minst ett annat betyg."
+
+#: contrib/comments/views/comments.py:160
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Denna kommentar postades av en användare som har postat färre än %(count)s "
+"kommentar:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Denna kommentar postades av en användare som har postat färre än %(count)s "
+"kommentarer:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:165
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Denna kommentar postades av en oseriös användare:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:238
+#: contrib/comments/views/comments.py:331
+msgid "Only POSTs are allowed"
+msgstr "Endast POST är tillåtet"
+
+#: contrib/comments/views/comments.py:242
+#: contrib/comments/views/comments.py:335
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Ett eller flera av de obligatoriska fälten skickades inte"
+
+#: contrib/comments/views/comments.py:246
+#: contrib/comments/views/comments.py:337
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Någon har manipulerat kommentarformuläret (säkerhetsintrång)"
+
+#: contrib/comments/views/comments.py:256
+#: contrib/comments/views/comments.py:343
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"Kommentarformuläret hade en ogiltig 'target'-parameter -- objektets ID var "
+"ogiltigt"
+
+#: contrib/comments/views/comments.py:307
+#: contrib/comments/views/comments.py:372
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr ""
+"Kommentarformuläret tillhandahöll varken 'förhandsgranska' eller 'post'"
+
+#: contrib/comments/views/karma.py:21
+msgid "Anonymous users cannot vote"
+msgstr "Anonyma användare får inte rösta"
+
+#: contrib/comments/views/karma.py:25
+msgid "Invalid comment ID"
+msgstr "Ogiltigt kommentar-ID"
+
+#: contrib/comments/views/karma.py:27
+msgid "No voting for yourself"
+msgstr "Du får inte rösta på dig själv"
+
+#: contrib/contenttypes/models.py:67
+msgid "python model class name"
+msgstr "python klassnamn för modell"
+
+#: contrib/contenttypes/models.py:71
+msgid "content type"
+msgstr "innehålls typ"
+
+#: contrib/contenttypes/models.py:72
+msgid "content types"
+msgstr "innehålls typer"
+
+#: contrib/flatpages/admin.py:9
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Exempel: '/om/kontakt/'. Se till att ha inledande och avslutande snedstreck."
+
+#: contrib/flatpages/admin.py:11 core/validators.py:76
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Detta värde får endast innehålla bokstäver, siffror, understreck, "
+"bindestreck eller snedstreck."
+
+#: contrib/flatpages/admin.py:22
+msgid "Advanced options"
+msgstr "Avancerade inställningar"
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "titel"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "innehåll"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "aktivera kommentarer"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "mallnamn"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"Exempel: 'sidor/kontaktsida.html'. Om detta inte fylls i kommer systemet att "
+"använda 'flatpages/default.html'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "registrering krävs"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Om detta bockas för kommer endast inloggade användare kunna se sidan."
+
+#: contrib/flatpages/models.py:19
+msgid "flat page"
+msgstr "statisk sida"
+
+#: contrib/flatpages/models.py:20
+msgid "flat pages"
+msgstr "statiska sidor"
+
+#: contrib/gis/forms/fields.py:10
+msgid "No geometry value provided."
+msgstr "Inget geometriskt värde angivet."
+
+#: contrib/gis/forms/fields.py:11
+msgid "Invalid Geometry value."
+msgstr "Ogiltigt Geometri-värde."
+
+#: contrib/gis/forms/fields.py:12
+msgid "Invalid Geometry type."
+msgstr "Ogiltig Geometri-typ"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "th"
+msgstr ":a"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "st"
+msgstr ":a"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "nd"
+msgstr ":e"
+
+#: contrib/humanize/templatetags/humanize.py:19
+msgid "rd"
+msgstr ":e"
+
+#: contrib/humanize/templatetags/humanize.py:51
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f miljon"
+msgstr[1] "%(value).1f miljoner"
+
+#: contrib/humanize/templatetags/humanize.py:54
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value)1.f miljard"
+msgstr[1] "%(value)1.f miljarder"
+
+#: contrib/humanize/templatetags/humanize.py:57
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value)1.f biljon"
+msgstr[1] "%(value)1.f biljoner"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "one"
+msgstr "ett"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "two"
+msgstr "två"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "three"
+msgstr "tre"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "four"
+msgstr "fyra"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "five"
+msgstr "fem"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "six"
+msgstr "sex"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "seven"
+msgstr "sju"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "eight"
+msgstr "åtta"
+
+#: contrib/humanize/templatetags/humanize.py:73
+msgid "nine"
+msgstr "nio"
+
+#: contrib/humanize/templatetags/humanize.py:93
+msgid "today"
+msgstr "idag"
+
+#: contrib/humanize/templatetags/humanize.py:95
+msgid "tomorrow"
+msgstr "imorgon"
+
+#: contrib/humanize/templatetags/humanize.py:97
+msgid "yesterday"
+msgstr "igår"
+
+#: contrib/localflavor/ar/forms.py:27
+msgid "Enter a postal code in the format NNNN or ANNNNAAA."
+msgstr "Fyll i ett postnummer med formatet NNNN eller ANNNNAAA."
+
+#: contrib/localflavor/ar/forms.py:49 contrib/localflavor/br/forms.py:96
+#: contrib/localflavor/br/forms.py:135 contrib/localflavor/pe/forms.py:23
+#: contrib/localflavor/pe/forms.py:51
+msgid "This field requires only numbers."
+msgstr "Detta fält kräver enbart siffror."
+
+#: contrib/localflavor/ar/forms.py:50
+msgid "This field requires 7 or 8 digits."
+msgstr "Detta fält kräver 7 eller 8 sifrror."
+
+#: contrib/localflavor/ar/forms.py:79
+msgid "Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format."
+msgstr "Fyll i ett giltigt CUIT med formatet XX-XXXXXXXX-X eller XXXXXXXXXXXX."
+
+#: contrib/localflavor/ar/forms.py:80
+msgid "Invalid CUIT."
+msgstr "Felaktigt CUIT."
+
+#: contrib/localflavor/at/at_states.py:5
+msgid "Burgenland"
+msgstr "Burgenland"
+
+#: contrib/localflavor/at/at_states.py:6
+msgid "Carinthia"
+msgstr "Kärnten"
+
+#: contrib/localflavor/at/at_states.py:7
+msgid "Lower Austria"
+msgstr "Niederösterreich"
+
+#: contrib/localflavor/at/at_states.py:8
+msgid "Upper Austria"
+msgstr "Oberösterreich"
+
+#: contrib/localflavor/at/at_states.py:9
+msgid "Salzburg"
+msgstr "Salzburg"
+
+#: contrib/localflavor/at/at_states.py:10
+msgid "Styria"
+msgstr "Steiermark"
+
+#: contrib/localflavor/at/at_states.py:11
+msgid "Tyrol"
+msgstr "Tyrolen"
+
+#: contrib/localflavor/at/at_states.py:12
+msgid "Vorarlberg"
+msgstr "Vorarlberg"
+
+#: contrib/localflavor/at/at_states.py:13
+msgid "Vienna"
+msgstr "Wien"
+
+#: contrib/localflavor/at/forms.py:20 contrib/localflavor/ch/forms.py:16
+#: contrib/localflavor/no/forms.py:12
+msgid "Enter a zip code in the format XXXX."
+msgstr "Fyll i postnummer med formatet XXXX."
+
+#: contrib/localflavor/at/forms.py:48
+msgid "Enter a valid Austrian Social Security Number in XXXX XXXXXX format."
+msgstr "Fyll i ett giltigt Österrikiskt personnummer i formatet XXXX XXXXXX."
+
+#: contrib/localflavor/au/forms.py:16
+msgid "Enter a 4 digit post code."
+msgstr "Fyll i ett fyrsiffrigt postnummer."
+
+#: contrib/localflavor/br/forms.py:21
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "Fyll i ett postnummer med formatet XXXXX-XXX."
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "Telefonnummer måste vara i formatet XX-XXXX-XXXX."
+
+#: contrib/localflavor/br/forms.py:58
+msgid ""
+"Select a valid brazilian state. That state is not one of the available "
+"states."
+msgstr ""
+"Välj ett giltigt alternativ. Det valet finns inte bland tillgängliga "
+"alternativ."
+
+#: contrib/localflavor/br/forms.py:94
+msgid "Invalid CPF number."
+msgstr "Ogiltigt CPF-nummer."
+
+#: contrib/localflavor/br/forms.py:95
+msgid "This field requires at most 11 digits or 14 characters."
+msgstr "Detta fält kräver högst 11 siffror eller 14 bokstäver."
+
+#: contrib/localflavor/br/forms.py:134
+msgid "Invalid CNPJ number."
+msgstr "Ogiltigt CNPJ-nummer."
+
+#: contrib/localflavor/br/forms.py:136
+msgid "This field requires at least 14 digits"
+msgstr "Detta fält kräver minst 14 sifrror"
+
+#: contrib/localflavor/ca/forms.py:17
+msgid "Enter a postal code in the format XXX XXX."
+msgstr "Fyll i ett postnummer med formatet XXX XXX."
+
+#: contrib/localflavor/ca/forms.py:88
+msgid "Enter a valid Canadian Social Insurance number in XXX-XXX-XXX format."
+msgstr ""
+"Fyll i ett giltigt Kanadensiskt \"social insurance number\" med formatet XXX-"
+"XXX-XXX."
+
+#: contrib/localflavor/ch/ch_states.py:5
+msgid "Aargau"
+msgstr "Aargau"
+
+#: contrib/localflavor/ch/ch_states.py:6
+msgid "Appenzell Innerrhoden"
+msgstr "Appenzell Innerrhoden"
+
+#: contrib/localflavor/ch/ch_states.py:7
+msgid "Appenzell Ausserrhoden"
+msgstr "Appenzell Ausserrhoden"
+
+#: contrib/localflavor/ch/ch_states.py:8
+msgid "Basel-Stadt"
+msgstr "Basel-Stadt"
+
+#: contrib/localflavor/ch/ch_states.py:9
+msgid "Basel-Land"
+msgstr "Basel-Landschaft"
+
+#: contrib/localflavor/ch/ch_states.py:10
+msgid "Berne"
+msgstr "Bern"
+
+#: contrib/localflavor/ch/ch_states.py:11
+msgid "Fribourg"
+msgstr "Fribourg"
+
+#: contrib/localflavor/ch/ch_states.py:12
+msgid "Geneva"
+msgstr "Genève"
+
+#: contrib/localflavor/ch/ch_states.py:13
+msgid "Glarus"
+msgstr "Glarus"
+
+#: contrib/localflavor/ch/ch_states.py:14
+msgid "Graubuenden"
+msgstr "Graubünden"
+
+#: contrib/localflavor/ch/ch_states.py:15
+msgid "Jura"
+msgstr "Jura"
+
+#: contrib/localflavor/ch/ch_states.py:16
+msgid "Lucerne"
+msgstr "Luzern"
+
+#: contrib/localflavor/ch/ch_states.py:17
+msgid "Neuchatel"
+msgstr "Neuchâtel"
+
+#: contrib/localflavor/ch/ch_states.py:18
+msgid "Nidwalden"
+msgstr "Nidwalden"
+
+#: contrib/localflavor/ch/ch_states.py:19
+msgid "Obwalden"
+msgstr "Obwalden"
+
+#: contrib/localflavor/ch/ch_states.py:20
+msgid "Schaffhausen"
+msgstr "Schaffhausen"
+
+#: contrib/localflavor/ch/ch_states.py:21
+msgid "Schwyz"
+msgstr "Schwyz"
+
+#: contrib/localflavor/ch/ch_states.py:22
+msgid "Solothurn"
+msgstr "Solothurn"
+
+#: contrib/localflavor/ch/ch_states.py:23
+msgid "St. Gallen"
+msgstr "Sankt Gallen"
+
+#: contrib/localflavor/ch/ch_states.py:24
+msgid "Thurgau"
+msgstr "Thurgau"
+
+#: contrib/localflavor/ch/ch_states.py:25
+msgid "Ticino"
+msgstr "Ticino"
+
+#: contrib/localflavor/ch/ch_states.py:26
+msgid "Uri"
+msgstr "Uri"
+
+#: contrib/localflavor/ch/ch_states.py:27
+msgid "Valais"
+msgstr "Valais"
+
+#: contrib/localflavor/ch/ch_states.py:28
+msgid "Vaud"
+msgstr "Vaud"
+
+#: contrib/localflavor/ch/ch_states.py:29
+msgid "Zug"
+msgstr "Zug"
+
+#: contrib/localflavor/ch/ch_states.py:30
+msgid "Zurich"
+msgstr "Zürich"
+
+#: contrib/localflavor/ch/forms.py:64
+msgid ""
+"Enter a valid Swiss identity or passport card number in X1234567<0 or "
+"1234567890 format."
+msgstr ""
+"Fyll i ett giltigt Schweiziskt ID- eller passkortnummer med formatet "
+"X1234567<0 eller 1234567890."
+
+#: contrib/localflavor/cl/forms.py:29
+msgid "Enter a valid Chilean RUT."
+msgstr "Fyll i ett giltigt chilenskt RUT"
+
+#: contrib/localflavor/cl/forms.py:30
+msgid "Enter a valid Chilean RUT. The format is XX.XXX.XXX-X."
+msgstr "Fyll i ett giltigt chilenskt RUT. Formatet är XX.XXX.XXX-X."
+
+#: contrib/localflavor/cl/forms.py:31
+msgid "The Chilean RUT is not valid."
+msgstr "Det chilenska RUT:et var inte giltigt."
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr "Baden-Württemberg"
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr "Bayern"
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr "Berlin"
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr "Brandenburg"
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr "Bremen"
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr "Hamburg"
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr "Hessen"
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr "Mecklenburg-Vorpommern"
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr "Nedre Sachsen"
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr "Nordrhein-Westfalen"
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr "Rhenlandet"
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr "Saarland"
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr "Sachsen"
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr "Sachsen-Anhalt"
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr "Schleswig-Holstein"
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr "Thüringen"
+
+#: contrib/localflavor/de/forms.py:14 contrib/localflavor/fi/forms.py:12
+#: contrib/localflavor/fr/forms.py:15
+msgid "Enter a zip code in the format XXXXX."
+msgstr "Fyll i ett postnummer med formatet XXXXX."
+
+#: contrib/localflavor/de/forms.py:41
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format."
+msgstr ""
+"Fyll i ett giltigt tyskt ID-kortnummer med formatet XXXXXXXXXXX-XXXXXXX-"
+"XXXXXXX-X."
+
+#: contrib/localflavor/es/es_provinces.py:5
+msgid "Arava"
+msgstr "Arava"
+
+#: contrib/localflavor/es/es_provinces.py:6
+msgid "Albacete"
+msgstr "Albacete"
+
+#: contrib/localflavor/es/es_provinces.py:7
+msgid "Alacant"
+msgstr "Alacant"
+
+#: contrib/localflavor/es/es_provinces.py:8
+msgid "Almeria"
+msgstr "AlmeriaAlmería"
+
+#: contrib/localflavor/es/es_provinces.py:9
+msgid "Avila"
+msgstr "Ávila"
+
+#: contrib/localflavor/es/es_provinces.py:10
+msgid "Badajoz"
+msgstr "Badajoz"
+
+#: contrib/localflavor/es/es_provinces.py:11
+msgid "Illes Balears"
+msgstr "Illes Balears"
+
+#: contrib/localflavor/es/es_provinces.py:12
+msgid "Barcelona"
+msgstr "Barcelona"
+
+#: contrib/localflavor/es/es_provinces.py:13
+msgid "Burgos"
+msgstr "Burgos"
+
+#: contrib/localflavor/es/es_provinces.py:14
+msgid "Caceres"
+msgstr "Cáceres"
+
+#: contrib/localflavor/es/es_provinces.py:15
+msgid "Cadiz"
+msgstr "Cádiz"
+
+#: contrib/localflavor/es/es_provinces.py:16
+msgid "Castello"
+msgstr "Castellón"
+
+#: contrib/localflavor/es/es_provinces.py:17
+msgid "Ciudad Real"
+msgstr "Ciudad Real"
+
+#: contrib/localflavor/es/es_provinces.py:18
+msgid "Cordoba"
+msgstr "Córdoba"
+
+#: contrib/localflavor/es/es_provinces.py:19
+msgid "A Coruna"
+msgstr "A Coruña"
+
+#: contrib/localflavor/es/es_provinces.py:20
+msgid "Cuenca"
+msgstr "Cuenca"
+
+#: contrib/localflavor/es/es_provinces.py:21
+msgid "Girona"
+msgstr "Girona"
+
+#: contrib/localflavor/es/es_provinces.py:22
+msgid "Granada"
+msgstr "Granada"
+
+#: contrib/localflavor/es/es_provinces.py:23
+msgid "Guadalajara"
+msgstr "Guadalajara"
+
+#: contrib/localflavor/es/es_provinces.py:24
+msgid "Guipuzkoa"
+msgstr "Guipuzkoa"
+
+#: contrib/localflavor/es/es_provinces.py:25
+msgid "Huelva"
+msgstr "Huelva"
+
+#: contrib/localflavor/es/es_provinces.py:26
+msgid "Huesca"
+msgstr "Huesca"
+
+#: contrib/localflavor/es/es_provinces.py:27
+msgid "Jaen"
+msgstr "Jaén"
+
+#: contrib/localflavor/es/es_provinces.py:28
+msgid "Leon"
+msgstr "León"
+
+#: contrib/localflavor/es/es_provinces.py:29
+msgid "Lleida"
+msgstr "Lleida"
+
+#: contrib/localflavor/es/es_provinces.py:30
+#: contrib/localflavor/es/es_regions.py:17
+msgid "La Rioja"
+msgstr "La Rioja"
+
+#: contrib/localflavor/es/es_provinces.py:31
+msgid "Lugo"
+msgstr "Lugo"
+
+#: contrib/localflavor/es/es_provinces.py:32
+#: contrib/localflavor/es/es_regions.py:18
+msgid "Madrid"
+msgstr "Madrid"
+
+#: contrib/localflavor/es/es_provinces.py:33
+msgid "Malaga"
+msgstr "Málaga"
+
+#: contrib/localflavor/es/es_provinces.py:34
+msgid "Murcia"
+msgstr "Murcia"
+
+#: contrib/localflavor/es/es_provinces.py:35
+msgid "Navarre"
+msgstr "Navarra"
+
+#: contrib/localflavor/es/es_provinces.py:36
+msgid "Ourense"
+msgstr "Ourense"
+
+#: contrib/localflavor/es/es_provinces.py:37
+msgid "Asturias"
+msgstr "Asturien"
+
+#: contrib/localflavor/es/es_provinces.py:38
+msgid "Palencia"
+msgstr "Palencia"
+
+#: contrib/localflavor/es/es_provinces.py:39
+msgid "Las Palmas"
+msgstr "Las Palmas"
+
+#: contrib/localflavor/es/es_provinces.py:40
+msgid "Pontevedra"
+msgstr "Pontevedra"
+
+#: contrib/localflavor/es/es_provinces.py:41
+msgid "Salamanca"
+msgstr "Salamanca"
+
+#: contrib/localflavor/es/es_provinces.py:42
+msgid "Santa Cruz de Tenerife"
+msgstr "Santa Cruz de Tenerife"
+
+#: contrib/localflavor/es/es_provinces.py:43
+#: contrib/localflavor/es/es_regions.py:11
+msgid "Cantabria"
+msgstr "Kantabrien"
+
+#: contrib/localflavor/es/es_provinces.py:44
+msgid "Segovia"
+msgstr "Segovia"
+
+#: contrib/localflavor/es/es_provinces.py:45
+msgid "Seville"
+msgstr "Sevilla"
+
+#: contrib/localflavor/es/es_provinces.py:46
+msgid "Soria"
+msgstr "Soria"
+
+#: contrib/localflavor/es/es_provinces.py:47
+msgid "Tarragona"
+msgstr "Tarragona"
+
+#: contrib/localflavor/es/es_provinces.py:48
+msgid "Teruel"
+msgstr "Teruel"
+
+#: contrib/localflavor/es/es_provinces.py:49
+msgid "Toledo"
+msgstr "Toledo"
+
+#: contrib/localflavor/es/es_provinces.py:50
+msgid "Valencia"
+msgstr "Valencia"
+
+#: contrib/localflavor/es/es_provinces.py:51
+msgid "Valladolid"
+msgstr "Valladolid"
+
+#: contrib/localflavor/es/es_provinces.py:52
+msgid "Bizkaia"
+msgstr "Biscaya"
+
+#: contrib/localflavor/es/es_provinces.py:53
+msgid "Zamora"
+msgstr "Zamora"
+
+#: contrib/localflavor/es/es_provinces.py:54
+msgid "Zaragoza"
+msgstr "Zaragoza"
+
+#: contrib/localflavor/es/es_provinces.py:55
+msgid "Ceuta"
+msgstr "Ceuta"
+
+#: contrib/localflavor/es/es_provinces.py:56
+msgid "Melilla"
+msgstr "Melilla"
+
+#: contrib/localflavor/es/es_regions.py:5
+msgid "Andalusia"
+msgstr "Andalusien"
+
+#: contrib/localflavor/es/es_regions.py:6
+msgid "Aragon"
+msgstr "Aragonien"
+
+#: contrib/localflavor/es/es_regions.py:7
+msgid "Principality of Asturias"
+msgstr "Asturien"
+
+#: contrib/localflavor/es/es_regions.py:8
+msgid "Balearic Islands"
+msgstr "Balearerna"
+
+#: contrib/localflavor/es/es_regions.py:9
+msgid "Basque Country"
+msgstr "Baskien"
+
+#: contrib/localflavor/es/es_regions.py:10
+msgid "Canary Islands"
+msgstr "Kanarieöarna"
+
+#: contrib/localflavor/es/es_regions.py:12
+msgid "Castile-La Mancha"
+msgstr "Kastilien-La Mancha"
+
+#: contrib/localflavor/es/es_regions.py:13
+msgid "Castile and Leon"
+msgstr "Kastilien och Leon"
+
+#: contrib/localflavor/es/es_regions.py:14
+msgid "Catalonia"
+msgstr "Katalonien"
+
+#: contrib/localflavor/es/es_regions.py:15
+msgid "Extremadura"
+msgstr "Extremadura"
+
+#: contrib/localflavor/es/es_regions.py:16
+msgid "Galicia"
+msgstr "Galicien"
+
+#: contrib/localflavor/es/es_regions.py:19
+msgid "Region of Murcia"
+msgstr "Murciaregionen"
+
+#: contrib/localflavor/es/es_regions.py:20
+msgid "Foral Community of Navarre"
+msgstr "Navarra"
+
+#: contrib/localflavor/es/es_regions.py:21
+msgid "Valencian Community"
+msgstr "Valenciaregionen"
+
+#: contrib/localflavor/es/forms.py:19
+msgid "Enter a valid postal code in the range and format 01XXX - 52XXX."
+msgstr "Fyll i ett giltigt postnummer i serien och med formatet 01XXX - 52XXX."
+
+#: contrib/localflavor/es/forms.py:39
+msgid ""
+"Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or "
+"9XXXXXXXX."
+msgstr ""
+"Fyll i ett giltigt telefonnummer med ett av formaten: 6XXXXXXXX, 8XXXXXXXX "
+"eller 9XXXXXXXX."
+
+#: contrib/localflavor/es/forms.py:66
+msgid "Please enter a valid NIF, NIE, or CIF."
+msgstr "Var god fyll i en giltig NIF, NIE, eller CIF."
+
+#: contrib/localflavor/es/forms.py:67
+msgid "Please enter a valid NIF or NIE."
+msgstr "Var god fyll i giltigt NIF eller NIE."
+
+#: contrib/localflavor/es/forms.py:68
+msgid "Invalid checksum for NIF."
+msgstr "Ogiltig kontrollsumma för NIF."
+
+#: contrib/localflavor/es/forms.py:69
+msgid "Invalid checksum for NIE."
+msgstr "Ogiltig kontrollsumma för NIE."
+
+#: contrib/localflavor/es/forms.py:70
+msgid "Invalid checksum for CIF."
+msgstr "Ogiltig kontrollsumma för CIF."
+
+#: contrib/localflavor/es/forms.py:142
+msgid ""
+"Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX."
+msgstr ""
+"Var god fyll i ett giltigt bankkontonummer i XXXX-XXXX-XX-XXXXXXXXXX-format."
+
+#: contrib/localflavor/es/forms.py:143
+msgid "Invalid checksum for bank account number."
+msgstr "Ogiltig kontrollsumma för bankkontonummer."
+
+#: contrib/localflavor/fi/forms.py:28
+msgid "Enter a valid Finnish social security number."
+msgstr "Fyll i ett giltigt finskt personnummer."
+
+#: contrib/localflavor/in_/forms.py:14
+msgid "Enter a zip code in the format XXXXXXX."
+msgstr "Fyll i ett postnummer med formatet XXXXXXX."
+
+#: contrib/localflavor/is_/forms.py:17
+msgid ""
+"Enter a valid Icelandic identification number. The format is XXXXXX-XXXX."
+msgstr "Fyll i ett giltigt isländskt personnummer. Formatet är XXXXXX-XXXX."
+
+#: contrib/localflavor/is_/forms.py:18
+msgid "The Icelandic identification number is not valid."
+msgstr "Det isländska personnumret är inte giltigt."
+
+#: contrib/localflavor/it/forms.py:14
+msgid "Enter a valid zip code."
+msgstr "Fyll i ett giltigt postnummer."
+
+#: contrib/localflavor/it/forms.py:43
+msgid "Enter a valid Social Security number."
+msgstr "Fyll i ett giltigt personnummer."
+
+#: contrib/localflavor/it/forms.py:68
+msgid "Enter a valid VAT number."
+msgstr "Fyll i ett giltigt VAT-nummer."
+
+#: contrib/localflavor/jp/forms.py:17
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "Fyll i ett postnummer med formatet XXXXXXX eller XXX-XXXX."
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr "Hokkaido"
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr "Aomori"
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr "Iwate"
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr "Miyagi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr "Akita"
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr "Yamagata"
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr "Fukushima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr "Ibaraki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr "Tochigi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr "Gunma"
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr "Saitama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr "Chiba"
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr "Tokyo"
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr "Kanagawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr "Yamanashi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr "Nagano"
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr "Niigata"
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr "Toyama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr "Ischikawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr "Fukui"
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr "Gifu"
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr "Shizuoka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr "Aichi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr "Mie"
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr "Shiga"
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr "Kyoto"
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr "Osaka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr "Hyogo"
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr "Nara"
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr "Wakayama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr "Tottori"
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr "Shimane"
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr "Okayama"
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr "Hiroshima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr "Yamaguchi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr "Tokushima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr "Kagawa"
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr "Ehime"
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr "Kochi"
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr "Fukuoka"
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr "Saga"
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr "Nagasaki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr "Kuamoto"
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr "Oita"
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr "Miyazaki"
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr "kagoshima"
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr "Okinawa"
+
+#: contrib/localflavor/mx/mx_states.py:12
+msgid "Aguascalientes"
+msgstr "Aguascalientes"
+
+#: contrib/localflavor/mx/mx_states.py:13
+msgid "Baja California"
+msgstr "Baja California"
+
+#: contrib/localflavor/mx/mx_states.py:14
+msgid "Baja California Sur"
+msgstr "Baja California Sur"
+
+#: contrib/localflavor/mx/mx_states.py:15
+msgid "Campeche"
+msgstr "Campeche"
+
+#: contrib/localflavor/mx/mx_states.py:16
+msgid "Chihuahua"
+msgstr "Chihuahua"
+
+#: contrib/localflavor/mx/mx_states.py:17
+msgid "Chiapas"
+msgstr "Chiapas"
+
+#: contrib/localflavor/mx/mx_states.py:18
+msgid "Coahuila"
+msgstr "Coahuila"
+
+#: contrib/localflavor/mx/mx_states.py:19
+msgid "Colima"
+msgstr "Colima"
+
+#: contrib/localflavor/mx/mx_states.py:20
+msgid "Distrito Federal"
+msgstr "Distrito Federal"
+
+#: contrib/localflavor/mx/mx_states.py:21
+msgid "Durango"
+msgstr "Durango"
+
+#: contrib/localflavor/mx/mx_states.py:22
+msgid "Guerrero"
+msgstr "Guerrero"
+
+#: contrib/localflavor/mx/mx_states.py:23
+msgid "Guanajuato"
+msgstr "Guanajuato"
+
+#: contrib/localflavor/mx/mx_states.py:24
+msgid "Hidalgo"
+msgstr "Hidalgo"
+
+#: contrib/localflavor/mx/mx_states.py:25
+msgid "Jalisco"
+msgstr "Jalisco"
+
+#: contrib/localflavor/mx/mx_states.py:26
+msgid "Estado de México"
+msgstr "Mexikanska staten"
+
+#: contrib/localflavor/mx/mx_states.py:27
+msgid "Michoacán"
+msgstr "Michoacán"
+
+#: contrib/localflavor/mx/mx_states.py:28
+msgid "Morelos"
+msgstr "Morelos"
+
+#: contrib/localflavor/mx/mx_states.py:29
+msgid "Nayarit"
+msgstr "Nayarit"
+
+#: contrib/localflavor/mx/mx_states.py:30
+msgid "Nuevo León"
+msgstr "Nuevo León"
+
+#: contrib/localflavor/mx/mx_states.py:31
+msgid "Oaxaca"
+msgstr "Oaxaca"
+
+#: contrib/localflavor/mx/mx_states.py:32
+msgid "Puebla"
+msgstr "Puebla"
+
+#: contrib/localflavor/mx/mx_states.py:33
+msgid "Querétaro"
+msgstr "Querétaro"
+
+#: contrib/localflavor/mx/mx_states.py:34
+msgid "Quintana Roo"
+msgstr "Quintana Roo"
+
+#: contrib/localflavor/mx/mx_states.py:35
+msgid "Sinaloa"
+msgstr "Sinaloa"
+
+#: contrib/localflavor/mx/mx_states.py:36
+msgid "San Luis Potosí"
+msgstr "San Luis Potosí"
+
+#: contrib/localflavor/mx/mx_states.py:37
+msgid "Sonora"
+msgstr "Sonora"
+
+#: contrib/localflavor/mx/mx_states.py:38
+msgid "Tabasco"
+msgstr "Tabasco"
+
+#: contrib/localflavor/mx/mx_states.py:39
+msgid "Tamaulipas"
+msgstr "Tamaulipas"
+
+#: contrib/localflavor/mx/mx_states.py:40
+msgid "Tlaxcala"
+msgstr "Tlaxcala"
+
+#: contrib/localflavor/mx/mx_states.py:41
+msgid "Veracruz"
+msgstr "Veracruz"
+
+#: contrib/localflavor/mx/mx_states.py:42
+msgid "Yucatán"
+msgstr "Yucatán"
+
+#: contrib/localflavor/mx/mx_states.py:43
+msgid "Zacatecas"
+msgstr "Zacatecas"
+
+#: contrib/localflavor/nl/forms.py:21
+msgid "Enter a valid postal code"
+msgstr "Fyll i ett giltigt postnummer."
+
+#: contrib/localflavor/nl/forms.py:52
+msgid "Enter a valid phone number"
+msgstr "Fyll i ett giltigt telefonnummer."
+
+#: contrib/localflavor/nl/forms.py:78
+msgid "Enter a valid SoFi number"
+msgstr "Fyll i ett giltigt SoFi-nummer."
+
+#: contrib/localflavor/nl/nl_provinces.py:4
+msgid "Drente"
+msgstr "Drente"
+
+#: contrib/localflavor/nl/nl_provinces.py:5
+msgid "Flevoland"
+msgstr "Flevoland"
+
+#: contrib/localflavor/nl/nl_provinces.py:6
+msgid "Friesland"
+msgstr "Friesland"
+
+#: contrib/localflavor/nl/nl_provinces.py:7
+msgid "Gelderland"
+msgstr "Gelderland"
+
+#: contrib/localflavor/nl/nl_provinces.py:8
+msgid "Groningen"
+msgstr "Groningen"
+
+#: contrib/localflavor/nl/nl_provinces.py:9
+msgid "Limburg"
+msgstr "Limburg"
+
+#: contrib/localflavor/nl/nl_provinces.py:10
+msgid "Noord-Brabant"
+msgstr "Noord-Brabant"
+
+#: contrib/localflavor/nl/nl_provinces.py:11
+msgid "Noord-Holland"
+msgstr "Noord-Holland"
+
+#: contrib/localflavor/nl/nl_provinces.py:12
+msgid "Overijssel"
+msgstr "Overijssel"
+
+#: contrib/localflavor/nl/nl_provinces.py:13
+msgid "Utrecht"
+msgstr "Utrecht"
+
+#: contrib/localflavor/nl/nl_provinces.py:14
+msgid "Zeeland"
+msgstr "Zeeland"
+
+#: contrib/localflavor/nl/nl_provinces.py:15
+msgid "Zuid-Holland"
+msgstr "Zuid-Holland"
+
+#: contrib/localflavor/no/forms.py:33
+msgid "Enter a valid Norwegian social security number."
+msgstr "Fyll i ett giltigt norskt personnummer."
+
+#: contrib/localflavor/pe/forms.py:24
+msgid "This field requires 8 digits."
+msgstr "Detta fält kräver 8 sifrror."
+
+#: contrib/localflavor/pe/forms.py:52
+msgid "This field requires 11 digits."
+msgstr "Detta fält kräver 11 sifrror."
+
+#: contrib/localflavor/pl/forms.py:38
+msgid "National Identification Number consists of 11 digits."
+msgstr "\"National Identification Number\" består av 11 siffror."
+
+#: contrib/localflavor/pl/forms.py:39
+msgid "Wrong checksum for the National Identification Number."
+msgstr "Fel kontrollsumma för \"National Identification Number\""
+
+#: contrib/localflavor/pl/forms.py:71
+msgid ""
+"Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX."
+msgstr ""
+"Fyll i ett skattenummer (NIP) med formatet XXX-XXX-XX-XX eller XX-XX-XXX-XXX."
+
+#: contrib/localflavor/pl/forms.py:72
+msgid "Wrong checksum for the Tax Number (NIP)."
+msgstr "Fel kontrollsumma för skattenumret (NIP)."
+
+#: contrib/localflavor/pl/forms.py:111
+msgid "National Business Register Number (REGON) consists of 7 or 9 digits."
+msgstr ""
+"\"National Business Register Number\" (REGON) består av 7 eller 9 siffror."
+
+#: contrib/localflavor/pl/forms.py:112
+msgid "Wrong checksum for the National Business Register Number (REGON)."
+msgstr "Fel kontrollsumma för \"National Business Register Number\" (REGON)."
+
+#: contrib/localflavor/pl/forms.py:155
+msgid "Enter a postal code in the format XX-XXX."
+msgstr "Fyll i ett postnummer med formatet XX-XXX."
+
+#: contrib/localflavor/pl/pl_voivodeships.py:8
+msgid "Lower Silesia"
+msgstr "Lower Silesia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:9
+msgid "Kuyavia-Pomerania"
+msgstr "Kuyavia-Pomerania"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:10
+msgid "Lublin"
+msgstr "Lublin"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:11
+msgid "Lubusz"
+msgstr "Lubusz"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:12
+msgid "Lodz"
+msgstr "Lodz"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:13
+msgid "Lesser Poland"
+msgstr "Lesser Poland"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:14
+msgid "Masovia"
+msgstr "Masovia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:15
+msgid "Opole"
+msgstr "Opole"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:16
+msgid "Subcarpatia"
+msgstr "Subcarpatia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:17
+msgid "Podlasie"
+msgstr "Podlasie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:18
+msgid "Pomerania"
+msgstr "Pomerania"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:19
+msgid "Silesia"
+msgstr "Silesia"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:20
+msgid "Swietokrzyskie"
+msgstr "Swietokrzyskie"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:21
+msgid "Warmia-Masuria"
+msgstr "Warmia-Masuria"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:22
+msgid "Greater Poland"
+msgstr "Greater Poland"
+
+#: contrib/localflavor/pl/pl_voivodeships.py:23
+msgid "West Pomerania"
+msgstr "West Pomerania"
+
+#: contrib/localflavor/ro/forms.py:19
+msgid "Enter a valid CIF."
+msgstr "Fyll i ett giltigt CIF."
+
+#: contrib/localflavor/ro/forms.py:56
+msgid "Enter a valid CNP."
+msgstr "Fyll i ett giltigt CNP."
+
+#: contrib/localflavor/ro/forms.py:141
+msgid "Enter a valid IBAN in ROXX-XXXX-XXXX-XXXX-XXXX-XXXX format"
+msgstr "Fyll i ett giltigt IBAN med formatet ROXX-XXXX-XXXX-XXXX-XXXX-XXXX."
+
+#: contrib/localflavor/ro/forms.py:171
+msgid "Phone numbers must be in XXXX-XXXXXX format."
+msgstr "Telefonnummer måste vara i formatet XXXX-XXXXXX."
+
+#: contrib/localflavor/ro/forms.py:194
+msgid "Enter a valid postal code in the format XXXXXX"
+msgstr "Fyll i ett postnummer med formatet XXX XXX."
+
+#: contrib/localflavor/sk/forms.py:30
+msgid "Enter a postal code in the format XXXXX or XXX XX."
+msgstr "Fyll i ett postnummer med formatet XXXXX eller XXX XX."
+
+#: contrib/localflavor/sk/sk_districts.py:8
+msgid "Banska Bystrica"
+msgstr "Banska Bystrica"
+
+#: contrib/localflavor/sk/sk_districts.py:9
+msgid "Banska Stiavnica"
+msgstr "Banska Stiavnica"
+
+#: contrib/localflavor/sk/sk_districts.py:10
+msgid "Bardejov"
+msgstr "Bardejov"
+
+#: contrib/localflavor/sk/sk_districts.py:11
+msgid "Banovce nad Bebravou"
+msgstr "Banovce nad Bebravou"
+
+#: contrib/localflavor/sk/sk_districts.py:12
+msgid "Brezno"
+msgstr "Brezno"
+
+#: contrib/localflavor/sk/sk_districts.py:13
+msgid "Bratislava I"
+msgstr "Bratislava I"
+
+#: contrib/localflavor/sk/sk_districts.py:14
+msgid "Bratislava II"
+msgstr "Bratislava II"
+
+#: contrib/localflavor/sk/sk_districts.py:15
+msgid "Bratislava III"
+msgstr "Bratislava III"
+
+#: contrib/localflavor/sk/sk_districts.py:16
+msgid "Bratislava IV"
+msgstr "Bratislava IV"
+
+#: contrib/localflavor/sk/sk_districts.py:17
+msgid "Bratislava V"
+msgstr "Bratislava V"
+
+#: contrib/localflavor/sk/sk_districts.py:18
+msgid "Bytca"
+msgstr "Bytca"
+
+#: contrib/localflavor/sk/sk_districts.py:19
+msgid "Cadca"
+msgstr "Cadca"
+
+#: contrib/localflavor/sk/sk_districts.py:20
+msgid "Detva"
+msgstr "Detva"
+
+#: contrib/localflavor/sk/sk_districts.py:21
+msgid "Dolny Kubin"
+msgstr "Dolny Kubin"
+
+#: contrib/localflavor/sk/sk_districts.py:22
+msgid "Dunajska Streda"
+msgstr "Dunajska Streda"
+
+#: contrib/localflavor/sk/sk_districts.py:23
+msgid "Galanta"
+msgstr "Galanta"
+
+#: contrib/localflavor/sk/sk_districts.py:24
+msgid "Gelnica"
+msgstr "Gelnica"
+
+#: contrib/localflavor/sk/sk_districts.py:25
+msgid "Hlohovec"
+msgstr "Hlohovec"
+
+#: contrib/localflavor/sk/sk_districts.py:26
+msgid "Humenne"
+msgstr "Humenne"
+
+#: contrib/localflavor/sk/sk_districts.py:27
+msgid "Ilava"
+msgstr "Ilava"
+
+#: contrib/localflavor/sk/sk_districts.py:28
+msgid "Kezmarok"
+msgstr "Kezmarok"
+
+#: contrib/localflavor/sk/sk_districts.py:29
+msgid "Komarno"
+msgstr "Komarno"
+
+#: contrib/localflavor/sk/sk_districts.py:30
+msgid "Kosice I"
+msgstr "Kosice I"
+
+#: contrib/localflavor/sk/sk_districts.py:31
+msgid "Kosice II"
+msgstr "Kosice II"
+
+#: contrib/localflavor/sk/sk_districts.py:32
+msgid "Kosice III"
+msgstr "Kosice III"
+
+#: contrib/localflavor/sk/sk_districts.py:33
+msgid "Kosice IV"
+msgstr "Kosice IV"
+
+#: contrib/localflavor/sk/sk_districts.py:34
+msgid "Kosice - okolie"
+msgstr "Kosice - okolie"
+
+#: contrib/localflavor/sk/sk_districts.py:35
+msgid "Krupina"
+msgstr "Krupina"
+
+#: contrib/localflavor/sk/sk_districts.py:36
+msgid "Kysucke Nove Mesto"
+msgstr "Kysucke Nove Mesto"
+
+#: contrib/localflavor/sk/sk_districts.py:37
+msgid "Levice"
+msgstr "Levice"
+
+#: contrib/localflavor/sk/sk_districts.py:38
+msgid "Levoca"
+msgstr "Levoca"
+
+#: contrib/localflavor/sk/sk_districts.py:39
+msgid "Liptovsky Mikulas"
+msgstr "Liptovsky Mikulas"
+
+#: contrib/localflavor/sk/sk_districts.py:40
+msgid "Lucenec"
+msgstr "Lucenec"
+
+#: contrib/localflavor/sk/sk_districts.py:41
+msgid "Malacky"
+msgstr "Malacky"
+
+#: contrib/localflavor/sk/sk_districts.py:42
+msgid "Martin"
+msgstr "Martin"
+
+#: contrib/localflavor/sk/sk_districts.py:43
+msgid "Medzilaborce"
+msgstr "Medzilaborce"
+
+#: contrib/localflavor/sk/sk_districts.py:44
+msgid "Michalovce"
+msgstr "Michalovce"
+
+#: contrib/localflavor/sk/sk_districts.py:45
+msgid "Myjava"
+msgstr "Myjava"
+
+#: contrib/localflavor/sk/sk_districts.py:46
+msgid "Namestovo"
+msgstr "Namestovo"
+
+#: contrib/localflavor/sk/sk_districts.py:47
+msgid "Nitra"
+msgstr "Nitra"
+
+#: contrib/localflavor/sk/sk_districts.py:48
+msgid "Nove Mesto nad Vahom"
+msgstr "Nove Mesto nad Vahom"
+
+#: contrib/localflavor/sk/sk_districts.py:49
+msgid "Nove Zamky"
+msgstr "Nove Zamky"
+
+#: contrib/localflavor/sk/sk_districts.py:50
+msgid "Partizanske"
+msgstr "Partizanske"
+
+#: contrib/localflavor/sk/sk_districts.py:51
+msgid "Pezinok"
+msgstr "Pezinok"
+
+#: contrib/localflavor/sk/sk_districts.py:52
+msgid "Piestany"
+msgstr "Piestany"
+
+#: contrib/localflavor/sk/sk_districts.py:53
+msgid "Poltar"
+msgstr "Poltar"
+
+#: contrib/localflavor/sk/sk_districts.py:54
+msgid "Poprad"
+msgstr "Poprad"
+
+#: contrib/localflavor/sk/sk_districts.py:55
+msgid "Povazska Bystrica"
+msgstr "Povazska Bystrica"
+
+#: contrib/localflavor/sk/sk_districts.py:56
+msgid "Presov"
+msgstr "Presov"
+
+#: contrib/localflavor/sk/sk_districts.py:57
+msgid "Prievidza"
+msgstr "Prievidza"
+
+#: contrib/localflavor/sk/sk_districts.py:58
+msgid "Puchov"
+msgstr "Puchov"
+
+#: contrib/localflavor/sk/sk_districts.py:59
+msgid "Revuca"
+msgstr "Revuca"
+
+#: contrib/localflavor/sk/sk_districts.py:60
+msgid "Rimavska Sobota"
+msgstr "Rimavska Sobota"
+
+#: contrib/localflavor/sk/sk_districts.py:61
+msgid "Roznava"
+msgstr "Roznava"
+
+#: contrib/localflavor/sk/sk_districts.py:62
+msgid "Ruzomberok"
+msgstr "Ruzomberok"
+
+#: contrib/localflavor/sk/sk_districts.py:63
+msgid "Sabinov"
+msgstr "Sabinov"
+
+#: contrib/localflavor/sk/sk_districts.py:64
+msgid "Senec"
+msgstr "Senec"
+
+#: contrib/localflavor/sk/sk_districts.py:65
+msgid "Senica"
+msgstr "Senica"
+
+#: contrib/localflavor/sk/sk_districts.py:66
+msgid "Skalica"
+msgstr "Skalica"
+
+#: contrib/localflavor/sk/sk_districts.py:67
+msgid "Snina"
+msgstr "Snina"
+
+#: contrib/localflavor/sk/sk_districts.py:68
+msgid "Sobrance"
+msgstr "Sobrance"
+
+#: contrib/localflavor/sk/sk_districts.py:69
+msgid "Spisska Nova Ves"
+msgstr "Spisska Nova Ves"
+
+#: contrib/localflavor/sk/sk_districts.py:70
+msgid "Stara Lubovna"
+msgstr "Stara Lubovna"
+
+#: contrib/localflavor/sk/sk_districts.py:71
+msgid "Stropkov"
+msgstr "Stropkov"
+
+#: contrib/localflavor/sk/sk_districts.py:72
+msgid "Svidnik"
+msgstr "Svidnik"
+
+#: contrib/localflavor/sk/sk_districts.py:73
+msgid "Sala"
+msgstr "Sala"
+
+#: contrib/localflavor/sk/sk_districts.py:74
+msgid "Topolcany"
+msgstr "Topolcany"
+
+#: contrib/localflavor/sk/sk_districts.py:75
+msgid "Trebisov"
+msgstr "Trebisov"
+
+#: contrib/localflavor/sk/sk_districts.py:76
+msgid "Trencin"
+msgstr "Trencin"
+
+#: contrib/localflavor/sk/sk_districts.py:77
+msgid "Trnava"
+msgstr "Trnava"
+
+#: contrib/localflavor/sk/sk_districts.py:78
+msgid "Turcianske Teplice"
+msgstr "Turcianske Teplice"
+
+#: contrib/localflavor/sk/sk_districts.py:79
+msgid "Tvrdosin"
+msgstr "Tvrdosin"
+
+#: contrib/localflavor/sk/sk_districts.py:80
+msgid "Velky Krtis"
+msgstr "Velky Krtis"
+
+#: contrib/localflavor/sk/sk_districts.py:81
+msgid "Vranov nad Toplou"
+msgstr "Vranov nad Toplou"
+
+#: contrib/localflavor/sk/sk_districts.py:82
+msgid "Zlate Moravce"
+msgstr "Zlate Moravce"
+
+#: contrib/localflavor/sk/sk_districts.py:83
+msgid "Zvolen"
+msgstr "Zvolen"
+
+#: contrib/localflavor/sk/sk_districts.py:84
+msgid "Zarnovica"
+msgstr "Zarnovica"
+
+#: contrib/localflavor/sk/sk_districts.py:85
+msgid "Ziar nad Hronom"
+msgstr "Ziar nad Hronom"
+
+#: contrib/localflavor/sk/sk_districts.py:86
+msgid "Zilina"
+msgstr "Zilina"
+
+#: contrib/localflavor/sk/sk_regions.py:8
+msgid "Banska Bystrica region"
+msgstr "Banska Bystrica-regionen"
+
+#: contrib/localflavor/sk/sk_regions.py:9
+msgid "Bratislava region"
+msgstr "Bratislava-regionen"
+
+#: contrib/localflavor/sk/sk_regions.py:10
+msgid "Kosice region"
+msgstr "Kosice-regionen"
+
+#: contrib/localflavor/sk/sk_regions.py:11
+msgid "Nitra region"
+msgstr "Nitra-regionen"
+
+#: contrib/localflavor/sk/sk_regions.py:12
+msgid "Presov region"
+msgstr "Presov-regionen"
+
+#: contrib/localflavor/sk/sk_regions.py:13
+msgid "Trencin region"
+msgstr "Trencin-regionen"
+
+#: contrib/localflavor/sk/sk_regions.py:14
+msgid "Trnava region"
+msgstr "Trnava-regionen"
+
+#: contrib/localflavor/sk/sk_regions.py:15
+msgid "Zilina region"
+msgstr "Zilina-regionen"
+
+#: contrib/localflavor/uk/forms.py:21
+msgid "Enter a valid postcode."
+msgstr "Fyll i ett giltigt postnummer."
+
+#: contrib/localflavor/uk/uk_regions.py:11
+msgid "Bedfordshire"
+msgstr "Bedfordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:12
+msgid "Buckinghamshire"
+msgstr "Buckinghamshire"
+
+#: contrib/localflavor/uk/uk_regions.py:14
+msgid "Cheshire"
+msgstr "Cheshire"
+
+#: contrib/localflavor/uk/uk_regions.py:15
+msgid "Cornwall and Isles of Scilly"
+msgstr "Cornwall and Isles of Scilly"
+
+#: contrib/localflavor/uk/uk_regions.py:16
+msgid "Cumbria"
+msgstr "Cumbria"
+
+#: contrib/localflavor/uk/uk_regions.py:17
+msgid "Derbyshire"
+msgstr "Derbyshire"
+
+#: contrib/localflavor/uk/uk_regions.py:18
+msgid "Devon"
+msgstr "Devon"
+
+#: contrib/localflavor/uk/uk_regions.py:19
+msgid "Dorset"
+msgstr "Dorset"
+
+#: contrib/localflavor/uk/uk_regions.py:20
+msgid "Durham"
+msgstr "Durham"
+
+#: contrib/localflavor/uk/uk_regions.py:21
+msgid "East Sussex"
+msgstr "East Sussex"
+
+#: contrib/localflavor/uk/uk_regions.py:22
+msgid "Essex"
+msgstr "Essex"
+
+#: contrib/localflavor/uk/uk_regions.py:23
+msgid "Gloucestershire"
+msgstr "Gloucestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:24
+msgid "Greater London"
+msgstr "Greater London"
+
+#: contrib/localflavor/uk/uk_regions.py:25
+msgid "Greater Manchester"
+msgstr "Greater Manchester"
+
+#: contrib/localflavor/uk/uk_regions.py:26
+msgid "Hampshire"
+msgstr "Hampshire"
+
+#: contrib/localflavor/uk/uk_regions.py:27
+msgid "Hertfordshire"
+msgstr "Hertfordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:28
+msgid "Kent"
+msgstr "Kent"
+
+#: contrib/localflavor/uk/uk_regions.py:29
+msgid "Lancashire"
+msgstr "Lancashire"
+
+#: contrib/localflavor/uk/uk_regions.py:30
+msgid "Leicestershire"
+msgstr "Leicestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:31
+msgid "Lincolnshire"
+msgstr "Lincolnshire"
+
+#: contrib/localflavor/uk/uk_regions.py:32
+msgid "Merseyside"
+msgstr "Merseyside"
+
+#: contrib/localflavor/uk/uk_regions.py:33
+msgid "Norfolk"
+msgstr "Norfolk"
+
+#: contrib/localflavor/uk/uk_regions.py:34
+msgid "North Yorkshire"
+msgstr "North Yorkshire"
+
+#: contrib/localflavor/uk/uk_regions.py:35
+msgid "Northamptonshire"
+msgstr "Northamptonshire"
+
+#: contrib/localflavor/uk/uk_regions.py:36
+msgid "Northumberland"
+msgstr "Northumberland"
+
+#: contrib/localflavor/uk/uk_regions.py:37
+msgid "Nottinghamshire"
+msgstr "Nottinghamshire"
+
+#: contrib/localflavor/uk/uk_regions.py:38
+msgid "Oxfordshire"
+msgstr "Oxfordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:39
+msgid "Shropshire"
+msgstr "Shropshire"
+
+#: contrib/localflavor/uk/uk_regions.py:40
+msgid "Somerset"
+msgstr "Somerset"
+
+#: contrib/localflavor/uk/uk_regions.py:41
+msgid "South Yorkshire"
+msgstr "South Yorkshire"
+
+#: contrib/localflavor/uk/uk_regions.py:42
+msgid "Staffordshire"
+msgstr "Staffordshire"
+
+#: contrib/localflavor/uk/uk_regions.py:43
+msgid "Suffolk"
+msgstr "Suffolk"
+
+#: contrib/localflavor/uk/uk_regions.py:44
+msgid "Surrey"
+msgstr "Surrey"
+
+#: contrib/localflavor/uk/uk_regions.py:45
+msgid "Tyne and Wear"
+msgstr "Tyne and Wear"
+
+#: contrib/localflavor/uk/uk_regions.py:46
+msgid "Warwickshire"
+msgstr "Warwickshire"
+
+#: contrib/localflavor/uk/uk_regions.py:47
+msgid "West Midlands"
+msgstr "West Midlands"
+
+#: contrib/localflavor/uk/uk_regions.py:48
+msgid "West Sussex"
+msgstr "West Sussex"
+
+#: contrib/localflavor/uk/uk_regions.py:49
+msgid "West Yorkshire"
+msgstr "West Yorkshire"
+
+#: contrib/localflavor/uk/uk_regions.py:50
+msgid "Wiltshire"
+msgstr "Wiltshire"
+
+#: contrib/localflavor/uk/uk_regions.py:51
+msgid "Worcestershire"
+msgstr "Worcestershire"
+
+#: contrib/localflavor/uk/uk_regions.py:55
+msgid "County Antrim"
+msgstr "County Antrim"
+
+#: contrib/localflavor/uk/uk_regions.py:56
+msgid "County Armagh"
+msgstr "County Armagh"
+
+#: contrib/localflavor/uk/uk_regions.py:57
+msgid "County Down"
+msgstr "County Down"
+
+#: contrib/localflavor/uk/uk_regions.py:58
+msgid "County Fermanagh"
+msgstr "County Fermanagh"
+
+#: contrib/localflavor/uk/uk_regions.py:59
+msgid "County Londonderry"
+msgstr "County Londonderry"
+
+#: contrib/localflavor/uk/uk_regions.py:60
+msgid "County Tyrone"
+msgstr "County Tyrone"
+
+#: contrib/localflavor/uk/uk_regions.py:64
+msgid "Clwyd"
+msgstr "Clwyd"
+
+#: contrib/localflavor/uk/uk_regions.py:65
+msgid "Dyfed"
+msgstr "Dyfed"
+
+#: contrib/localflavor/uk/uk_regions.py:66
+msgid "Gwent"
+msgstr "Gwent"
+
+#: contrib/localflavor/uk/uk_regions.py:67
+msgid "Gwynedd"
+msgstr "Gwynedd"
+
+#: contrib/localflavor/uk/uk_regions.py:68
+msgid "Mid Glamorgan"
+msgstr "Mid Glamorgan"
+
+#: contrib/localflavor/uk/uk_regions.py:69
+msgid "Powys"
+msgstr "Powys"
+
+#: contrib/localflavor/uk/uk_regions.py:70
+msgid "South Glamorgan"
+msgstr "South Glamorgan"
+
+#: contrib/localflavor/uk/uk_regions.py:71
+msgid "West Glamorgan"
+msgstr "West Glamorgan"
+
+#: contrib/localflavor/uk/uk_regions.py:75
+msgid "Borders"
+msgstr "Borders"
+
+#: contrib/localflavor/uk/uk_regions.py:76
+msgid "Central Scotland"
+msgstr "Central Scotland"
+
+#: contrib/localflavor/uk/uk_regions.py:77
+msgid "Dumfries and Galloway"
+msgstr "Dumfries and Galloway"
+
+#: contrib/localflavor/uk/uk_regions.py:78
+msgid "Fife"
+msgstr "Fife"
+
+#: contrib/localflavor/uk/uk_regions.py:79
+msgid "Grampian"
+msgstr "Grampian"
+
+#: contrib/localflavor/uk/uk_regions.py:80
+msgid "Highland"
+msgstr "Highland"
+
+#: contrib/localflavor/uk/uk_regions.py:81
+msgid "Lothian"
+msgstr "Lothian"
+
+#: contrib/localflavor/uk/uk_regions.py:82
+msgid "Orkney Islands"
+msgstr "Orkney Islands"
+
+#: contrib/localflavor/uk/uk_regions.py:83
+msgid "Shetland Islands"
+msgstr "Shetland Islands"
+
+#: contrib/localflavor/uk/uk_regions.py:84
+msgid "Strathclyde"
+msgstr "Strathclyde"
+
+#: contrib/localflavor/uk/uk_regions.py:85
+msgid "Tayside"
+msgstr "Tayside"
+
+#: contrib/localflavor/uk/uk_regions.py:86
+msgid "Western Isles"
+msgstr "Western Isles"
+
+#: contrib/localflavor/uk/uk_regions.py:90
+msgid "England"
+msgstr "England"
+
+#: contrib/localflavor/uk/uk_regions.py:91
+msgid "Northern Ireland"
+msgstr "Nordirland"
+
+#: contrib/localflavor/uk/uk_regions.py:92
+msgid "Scotland"
+msgstr "Scotland"
+
+#: contrib/localflavor/uk/uk_regions.py:93
+msgid "Wales"
+msgstr "Wales"
+
+#: contrib/localflavor/us/forms.py:16
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "Fyll i ett postnummer med formatet XXXXX eller XXXXX-XXXX."
+
+#: contrib/localflavor/us/forms.py:54
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr "Fyll i ett giltigt amerikanskt personnummer i formatet XXX-XX-XXXX."
+
+#: contrib/localflavor/za/forms.py:20
+msgid "Enter a valid South African ID number"
+msgstr "Fyll i ett giltigt Sydafrikanskt ID-nummer."
+
+#: contrib/localflavor/za/forms.py:54
+msgid "Enter a valid South African postal code"
+msgstr "Fyll i ett giltigt Afrikanskt postnummer."
+
+#: contrib/localflavor/za/za_provinces.py:4
+msgid "Eastern Cape"
+msgstr "Eastern Cape"
+
+#: contrib/localflavor/za/za_provinces.py:5
+msgid "Free State"
+msgstr "Free State"
+
+#: contrib/localflavor/za/za_provinces.py:6
+msgid "Gauteng"
+msgstr "Gauteng"
+
+#: contrib/localflavor/za/za_provinces.py:7
+msgid "KwaZulu-Natal"
+msgstr "KwaZulu-Natal"
+
+#: contrib/localflavor/za/za_provinces.py:8
+msgid "Limpopo"
+msgstr "Limpopo"
+
+#: contrib/localflavor/za/za_provinces.py:9
+msgid "Mpumalanga"
+msgstr "Mpumalanga"
+
+#: contrib/localflavor/za/za_provinces.py:10
+msgid "Northern Cape"
+msgstr "Northern Cape"
+
+#: contrib/localflavor/za/za_provinces.py:11
+msgid "North West"
+msgstr "North West"
+
+#: contrib/localflavor/za/za_provinces.py:12
+msgid "Western Cape"
+msgstr "Western Cape"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "omdirigera från"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Detta bör vara en absolut sökväg utan domännamnet. Exempel: '/handelser/"
+"sok/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "omdirigera till"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Detta kan vara antingen en absolut sökväg (som ovan) eller en fullständig "
+"URL som börjar med 'http://'."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "omdirigera"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "omdirigeringar"
+
+#: contrib/sessions/models.py:45
+msgid "session key"
+msgstr "sessionsnyckel"
+
+#: contrib/sessions/models.py:47
+msgid "session data"
+msgstr "sessionsdata"
+
+#: contrib/sessions/models.py:48
+msgid "expire date"
+msgstr "utgångsdatum"
+
+#: contrib/sessions/models.py:53
+msgid "session"
+msgstr "session"
+
+#: contrib/sessions/models.py:54
+msgid "sessions"
+msgstr "sessioner"
+
+#: contrib/sites/models.py:32
+msgid "domain name"
+msgstr "domännamn"
+
+#: contrib/sites/models.py:33
+msgid "display name"
+msgstr "visningsnamn"
+
+#: contrib/sites/models.py:39
+msgid "sites"
+msgstr "webbplatser"
+
+#: core/validators.py:80
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr ""
+"Detta värde får endast innehålla bokstäver, siffror, understreck eller "
+"bindestreck."
+
+#: core/validators.py:84
+msgid "Uppercase letters are not allowed here."
+msgstr "Versaler är inte tillåtna här."
+
+#: core/validators.py:88
+msgid "Lowercase letters are not allowed here."
+msgstr "Gemener är inte tillåtna här."
+
+#: core/validators.py:95
+msgid "Enter only digits separated by commas."
+msgstr "Fyll enbart i siffror separerade med kommatecken."
+
+#: core/validators.py:107
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Fyll i giltiga e-postadresser separerade med kommatecken."
+
+#: core/validators.py:111
+msgid "Please enter a valid IP address."
+msgstr "Var god fyll i en giltig IP-adress."
+
+#: core/validators.py:115
+msgid "Empty values are not allowed here."
+msgstr "Tomma värden är inte tillåtna här."
+
+#: core/validators.py:119
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Icke-numeriska tecken är inte tillåtna här."
+
+#: core/validators.py:123
+msgid "This value can't be comprised solely of digits."
+msgstr "Detta värde kan inte enbart bestå av siffror."
+
+#: core/validators.py:128 forms/fields.py:161
+msgid "Enter a whole number."
+msgstr "Fyll i ett heltal."
+
+#: core/validators.py:132
+msgid "Only alphabetical characters are allowed here."
+msgstr "Endast bokstäver är tillåtna här."
+
+#: core/validators.py:147
+#, python-format
+msgid "Invalid date: %s"
+msgstr "Ogiltigt datum: %s"
+
+#: core/validators.py:152 db/models/fields/__init__.py:546
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Fyll i ett giltigt datum med formatet ÅÅÅÅ-MM-DD."
+
+#: core/validators.py:157
+msgid "Enter a valid time in HH:MM format."
+msgstr "Fyll i ett giltigt klockslag med formatet TT:MM."
+
+#: core/validators.py:161
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Fyll i en giltig tidpunkt med formatet ÅÅÅÅ-MM-DD TT:MM."
+
+#: core/validators.py:166 forms/fields.py:422
+msgid "Enter a valid e-mail address."
+msgstr "Fyll i en giltig e-postadress."
+
+#: core/validators.py:178 core/validators.py:470 forms/fields.py:440
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Ingen fil skickades. Kontrollera kodningnstypen i formuläret."
+
+#: core/validators.py:189 forms/fields.py:471
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Ladda upp en giltig bild. Filen du laddade upp var antingen ingen bild eller "
+"en korrupt bild."
+
+#: core/validators.py:196
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "URL:en %s pekar inte på en giltig bild."
+
+#: core/validators.py:200
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Telefonnummer måste vara angivna med formatet XXX-XXX-XXXX. \"%s\" är "
+"ogiltigt."
+
+#: core/validators.py:208
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "URL:en %s pekar inte på en giltig QuickTime-video."
+
+#: core/validators.py:212
+msgid "A valid URL is required."
+msgstr "En giltig URL krävs."
+
+#: core/validators.py:226
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Giltig HTML krävs. Specifika fel är:\n"
+"%s"
+
+#: core/validators.py:233
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Felaktigt formaterad XML: %s"
+
+#: core/validators.py:250
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Felaktig URL: %s"
+
+#: core/validators.py:255 core/validators.py:257
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "URL:en %s är en trasig länk."
+
+#: core/validators.py:263
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Fyll i en giltig förkortning för en amerikansk delstat."
+
+#: core/validators.py:277
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Akta din tunga! Ordet %s är inte tillåtet här."
+msgstr[1] "Akta din tunga! Orden %s är inte tillåtna här."
+
+#: core/validators.py:284
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Detta fält måste matcha fältet '%s'."
+
+#: core/validators.py:303
+msgid "Please enter something for at least one field."
+msgstr "Var god fyll i minst ett fält."
+
+#: core/validators.py:312 core/validators.py:323
+msgid "Please enter both fields or leave them both empty."
+msgstr "Fyll antingen i båda fälten eller lämna båda tomma."
+
+#: core/validators.py:331
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Detta fält måste anges om %(field)s är %(value)s"
+
+#: core/validators.py:344
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Detta fält måste anges om %(field)s inte är %(value)s"
+
+#: core/validators.py:363
+msgid "Duplicate values are not allowed."
+msgstr "Dubbletter är inte tillåtna."
+
+#: core/validators.py:378
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Detta värde måste vara mellan %(lower)s och %(upper)s."
+
+#: core/validators.py:380
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Detta värde måste vara minst %s."
+
+#: core/validators.py:382
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "Detta värde får inte vara mer än %s."
+
+#: core/validators.py:423
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Detta värde måste vara en potens av %s."
+
+#: core/validators.py:433
+msgid "Please enter a valid decimal number."
+msgstr "Fyll i ett giltigt decimaltal."
+
+#: core/validators.py:440
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Fyll i ett giltigt decimaltal med som mest %s siffra totalt."
+msgstr[1] "Fyll i ett giltigt decimaltal med som mest %s siffror totalt."
+
+#: core/validators.py:443
+#, python-format
+msgid ""
+"Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural ""
+"Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] ""
+"Fyll i ett giltigt decimaltal med en heltalsdel med som mest %s siffra."
+msgstr[1] ""
+"Fyll i ett giltigt decimaltal med en heltalsdel med som mest %s siffror."
+
+#: core/validators.py:446
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "Fyll i ett giltigt decimaltal med som mest %s decimal."
+msgstr[1] "Fyll i ett giltigt decimaltal med som mest %s decimaler."
+
+#: core/validators.py:454
+msgid "Please enter a valid floating point number."
+msgstr "Fyll i ett giltigt flyttal."
+
+#: core/validators.py:463
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Se till att filen du laddade upp är minst %s byte stor."
+
+#: core/validators.py:464
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Se till att filen du laddade upp är som mest %s byte stor."
+
+#: core/validators.py:481
+msgid "The format for this field is wrong."
+msgstr "Formatet för detta fält är fel."
+
+#: core/validators.py:496
+msgid "This field is invalid."
+msgstr "Detta fält är ogiltigt."
+
+#: core/validators.py:532
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Kunde inte hämta något från %s."
+
+#: core/validators.py:535
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"URL:en %(url)s returnerade den ogiltiga Content-Type headern '%(contenttype)"
+"s'."
+
+#: core/validators.py:568
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Var god avsluta den oavslutade taggen %(tag)s på rad %(line)s. (Raden börjar "
+"med \"%(start)s\".)"
+
+#: core/validators.py:572
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"En del text som börjar på rad %(line)s är inte tillåten i det sammanhanget. "
+"(Raden börjar med \"%(start)s\".)"
+
+#: core/validators.py:577
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"%(attr)s\" på rad %(line)s är ett ogiltigt attribut. (Raden börjar med \"%"
+"(start)s\".)"
+
+#: core/validators.py:582
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\" på rad %(line)s är en ogiltig tagg. (Raden börjar med \"%"
+"(start)s\".)"
+
+#: core/validators.py:586
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"En tagg på rad %(line)s saknar en eller flera obligatoriska attribut. (Raden "
+"börjar med \"%(start)s\".)"
+
+#: core/validators.py:591
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Attributet \"%(attr)s\" på rad %(line)s har ett ogiltigt värde. (Raden "
+"börjar med \"%(start)s\".)"
+
+#: db/models/manipulators.py:304
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(object)s med typen %(type)s finns redan för %(field)s."
+
+#: db/models/fields/__init__.py:46
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s med detta %(fieldname)s finns redan."
+
+#: db/models/fields/__init__.py:320 db/models/fields/files.py:168
+#: db/models/fields/files.py:179 forms/fields.py:52 oldforms/__init__.py:370
+msgid "This field is required."
+msgstr "Detta fält måste fyllas i."
+
+#: db/models/fields/__init__.py:434
+msgid "This value must be an integer."
+msgstr "Detta värde måste vara ett heltal."
+
+#: db/models/fields/__init__.py:480
+msgid "This value must be either True or False."
+msgstr "Detta värde måste vara antingen True eller False."
+
+#: db/models/fields/__init__.py:509
+msgid "This field cannot be null."
+msgstr "Detta fält får inte vara null."
+
+#: db/models/fields/__init__.py:611 db/models/fields/__init__.py:628
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format."
+msgstr "Fyll i en giltig tidpunkt med formatet ÅÅÅÅ-MM-DD TT:MM[:ss[.uuuuuu]]."
+
+#: db/models/fields/__init__.py:684
+msgid "This value must be a decimal number."
+msgstr "Detta värde måste vara ett decimaltal."
+
+#: db/models/fields/__init__.py:825
+msgid "This value must be either None, True or False."
+msgstr "Detta värde måste vara antingen None, True eller False."
+
+#: db/models/fields/__init__.py:937 db/models/fields/__init__.py:950
+msgid "Enter a valid time in HH:MM[:ss[.uuuuuu]] format."
+msgstr "Fyll i ett giltigt klockslag med formatet TT:MM[:ss[.uuuuuu]]."
+
+#: db/models/fields/files.py:188
+msgid "Enter a valid filename."
+msgstr "Fyll i ett giltigt filnamn."
+
+#: db/models/fields/related.py:92
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Var god fyll i giltig %s."
+
+#: db/models/fields/related.py:776
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Håll ner \"Control\" eller \"Command\" på en Mac för att välja fler än en."
+
+#: db/models/fields/related.py:856
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+"Var god och fyll giltiga %(self)s ID-nummer. Värdet %(value)r är ogiltigt."
+msgstr[1] ""
+"Var god och fyll giltiga %(self)s ID-nummer. Värdena %(value)r är ogiltiga."
+
+#: forms/fields.py:53
+msgid "Enter a valid value."
+msgstr "Fyll i ett giltigt värde."
+
+#: forms/fields.py:133
+#, python-format
+msgid "Ensure this value has at most %(max)d characters (it has %(length)d)."
+msgstr ""
+"Kontrollera att detta värde har högst %(max)d tecken (det har %(length)d)."
+
+#: forms/fields.py:134
+#, python-format
+msgid "Ensure this value has at least %(min)d characters (it has %(length)d)."
+msgstr ""
+"Kontrollera att detta värde har minst %(min)d tecken (det har %(length)d)."
+
+#: forms/fields.py:162 forms/fields.py:191 forms/fields.py:220
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "Kontrollera att detta värde är mindre eller lika med %s."
+
+#: forms/fields.py:163 forms/fields.py:192 forms/fields.py:221
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "Kontrollera att detta värde är mer eller lika med %s."
+
+#: forms/fields.py:190 forms/fields.py:219
+msgid "Enter a number."
+msgstr "Fyll i ett tal."
+
+#: forms/fields.py:222
+#, python-format
+msgid "Ensure that there are no more than %s digits in total."
+msgstr "Kontrollera att det inte finns mer än totalt %s siffror."
+
+#: forms/fields.py:223
+#, python-format
+msgid "Ensure that there are no more than %s decimal places."
+msgstr "Kontrollera att det inte finns mer än %s decimaler."
+
+#: forms/fields.py:224
+#, python-format
+msgid "Ensure that there are no more than %s digits before the decimal point."
+msgstr "Kontrollera att det inte finns mer än %s siffror före decimaltecknet."
+
+#: forms/fields.py:282 forms/fields.py:803
+msgid "Enter a valid date."
+msgstr "Fyll i ett giltigt datum."
+
+#: forms/fields.py:315 forms/fields.py:804
+msgid "Enter a valid time."
+msgstr "Fyll i en giltig tid."
+
+#: forms/fields.py:354
+msgid "Enter a valid date/time."
+msgstr "Fyll i ett giltigt datum/tid."
+
+#: forms/fields.py:441
+msgid "No file was submitted."
+msgstr "Ingen fil skickades."
+
+#: forms/fields.py:442 oldforms/__init__.py:689
+msgid "The submitted file is empty."
+msgstr "Den skickade filen är tom."
+
+#: forms/fields.py:532
+msgid "Enter a valid URL."
+msgstr "Fyll i en giltig URL."
+
+#: forms/fields.py:533
+msgid "This URL appears to be a broken link."
+msgstr "Denna URL verkar vara en trasig länk."
+
+#: forms/fields.py:601 forms/fields.py:652
+#, python-format
+msgid "Select a valid choice. %(value)s is not one of the available choices."
+msgstr ""
+"Välj ett giltigt alternativ. %(value)s finns inte bland tillgängliga "
+"alternativ."
+
+#: forms/fields.py:653 forms/fields.py:714 forms/models.py:528
+msgid "Enter a list of values."
+msgstr "Fyll i en lista med värden."
+
+#: forms/fields.py:832
+msgid "Enter a valid IPv4 address."
+msgstr "Fyll i en giltig IPv4 adress."
+
+#: forms/models.py:461
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr ""
+"Välj ett giltigt alternativ. Det valet finns inte bland tillgängliga "
+"alternativ."
+
+#: forms/models.py:529
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr ""
+"Välj ett giltigt alternativ. %s finns inte bland tillgängliga alternativ."
+
+#: oldforms/__init__.py:405
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Se till att din text är kortare än %s tecken."
+msgstr[1] "Se till att din text är kortare än %s tecken."
+
+#: oldforms/__init__.py:410
+msgid "Line breaks are not allowed here."
+msgstr "Radbrytningar är inte tillåtna här."
+
+#: oldforms/__init__.py:508 oldforms/__init__.py:582 oldforms/__init__.py:621
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Välj ett giltigt alternativ; '%(data)s' finns inte bland %(choices)s."
+
+#: oldforms/__init__.py:750
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Fyll i ett heltal mellan -32768 och 32767."
+
+#: oldforms/__init__.py:760
+msgid "Enter a positive number."
+msgstr "Fyll i ett positivt tal."
+
+#: oldforms/__init__.py:770
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Fyll i ett heltal mellan 0 och 32767."
+
+#: template/defaultfilters.py:698
+msgid "yes,no,maybe"
+msgstr "ja,nej,kanske"
+
+#: template/defaultfilters.py:729
+#, python-format
+msgid "%(size)d byte"
+msgid_plural "%(size)d bytes"
+msgstr[0] "%(size)d byte"
+msgstr[1] "%(size)d byte"
+
+#: template/defaultfilters.py:731
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f KB"
+
+#: template/defaultfilters.py:733
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: template/defaultfilters.py:734
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#: utils/dateformat.py:41
+msgid "p.m."
+msgstr "e.m."
+
+#: utils/dateformat.py:42
+msgid "a.m."
+msgstr "f.m."
+
+#: utils/dateformat.py:47
+msgid "PM"
+msgstr "FM"
+
+#: utils/dateformat.py:48
+msgid "AM"
+msgstr "EM"
+
+#: utils/dateformat.py:97
+msgid "midnight"
+msgstr "midnatt"
+
+#: utils/dateformat.py:99
+msgid "noon"
+msgstr "middag"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Måndag"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Tisdag"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Onsdag"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Torsdag"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Fredag"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Lördag"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Söndag"
+
+#: utils/dates.py:10
+msgid "Mon"
+msgstr "Mån"
+
+#: utils/dates.py:10
+msgid "Tue"
+msgstr "Tis"
+
+#: utils/dates.py:10
+msgid "Wed"
+msgstr "Ons"
+
+#: utils/dates.py:10
+msgid "Thu"
+msgstr "Tors"
+
+#: utils/dates.py:10
+msgid "Fri"
+msgstr "Fre"
+
+#: utils/dates.py:11
+msgid "Sat"
+msgstr "Lör"
+
+#: utils/dates.py:11
+msgid "Sun"
+msgstr "Sön"
+
+#: utils/dates.py:18
+msgid "January"
+msgstr "Januari"
+
+#: utils/dates.py:18
+msgid "February"
+msgstr "Februari"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "March"
+msgstr "Mars"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "April"
+msgstr "April"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "May"
+msgstr "Maj"
+
+#: utils/dates.py:18 utils/dates.py:31
+msgid "June"
+msgstr "Juni"
+
+#: utils/dates.py:19 utils/dates.py:31
+msgid "July"
+msgstr "Juli"
+
+#: utils/dates.py:19
+msgid "August"
+msgstr "Augusti"
+
+#: utils/dates.py:19
+msgid "September"
+msgstr "September"
+
+#: utils/dates.py:19
+msgid "October"
+msgstr "Oktober"
+
+#: utils/dates.py:19
+msgid "November"
+msgstr "November"
+
+#: utils/dates.py:20
+msgid "December"
+msgstr "December"
+
+#: utils/dates.py:23
+msgid "jan"
+msgstr "jan"
+
+#: utils/dates.py:23
+msgid "feb"
+msgstr "feb"
+
+#: utils/dates.py:23
+msgid "mar"
+msgstr "mar"
+
+#: utils/dates.py:23
+msgid "apr"
+msgstr "apr"
+
+#: utils/dates.py:23
+msgid "may"
+msgstr "maj"
+
+#: utils/dates.py:23
+msgid "jun"
+msgstr "jun"
+
+#: utils/dates.py:24
+msgid "jul"
+msgstr "jul"
+
+#: utils/dates.py:24
+msgid "aug"
+msgstr "aug"
+
+#: utils/dates.py:24
+msgid "sep"
+msgstr "sep"
+
+#: utils/dates.py:24
+msgid "oct"
+msgstr "okt"
+
+#: utils/dates.py:24
+msgid "nov"
+msgstr "nov"
+
+#: utils/dates.py:24
+msgid "dec"
+msgstr "dec"
+
+#: utils/dates.py:31
+msgid "Jan."
+msgstr "Jan."
+
+#: utils/dates.py:31
+msgid "Feb."
+msgstr "Feb."
+
+#: utils/dates.py:32
+msgid "Aug."
+msgstr "Aug."
+
+#: utils/dates.py:32
+msgid "Sept."
+msgstr "Sept."
+
+#: utils/dates.py:32
+msgid "Oct."
+msgstr "Okt."
+
+#: utils/dates.py:32
+msgid "Nov."
+msgstr "Nov."
+
+#: utils/dates.py:32
+msgid "Dec."
+msgstr "Dec."
+
+#: utils/text.py:128
+msgid "or"
+msgstr "eller"
+
+#: utils/timesince.py:21
+msgid "year"
+msgid_plural "years"
+msgstr[0] "år"
+msgstr[1] "år"
+
+#: utils/timesince.py:22
+msgid "month"
+msgid_plural "months"
+msgstr[0] "månad"
+msgstr[1] "månader"
+
+#: utils/timesince.py:23
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "vecka"
+msgstr[1] "veckor"
+
+#: utils/timesince.py:24
+msgid "day"
+msgid_plural "days"
+msgstr[0] "dag"
+msgstr[1] "dagar"
+
+#: utils/timesince.py:25
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "timme"
+msgstr[1] "timmar"
+
+#: utils/timesince.py:26
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minut"
+msgstr[1] "minuter"
+
+#: utils/timesince.py:46
+msgid "minutes"
+msgstr "minuter"
+
+#: utils/timesince.py:51
+#, python-format
+msgid "%(number)d %(type)s"
+msgstr "%(number)d %(type)s"
+
+#: utils/timesince.py:57
+#, python-format
+msgid ", %(number)d %(type)s"
+msgstr ", %(number)d %(type)s"
+
+#: utils/translation/trans_real.py:401
+msgid "DATE_FORMAT"
+msgstr "Y-m-d"
+
+#: utils/translation/trans_real.py:402
+msgid "DATETIME_FORMAT"
+msgstr "Y-m-d H:i"
+
+#: utils/translation/trans_real.py:403
+msgid "TIME_FORMAT"
+msgstr "H:i"
+
+#: utils/translation/trans_real.py:419
+msgid "YEAR_MONTH_FORMAT"
+msgstr "F Y"
+
+#: utils/translation/trans_real.py:420
+msgid "MONTH_DAY_FORMAT"
+msgstr "j F"
+
+#: views/generic/create_update.py:114
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "%(verbose_name)s skapades."
+
+#: views/generic/create_update.py:156
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "%(verbose_name)s uppdaterades."
+
+#: views/generic/create_update.py:198
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "%(verbose_name)s togs bort."
+
+#~ msgid "Your new password is: %(new_password)s"
+#~ msgstr "Ditt nya lösenord är: %(new_password)s"
+
+#~ msgid "Feel free to change this password by going to this page:"
+#~ msgstr ""
+#~ "Du är välkommen att ändra detta lösenord genom att gå till denna sida:"
+
+#~ msgid "Ordering"
+#~ msgstr "Sortering"
+
+#~ msgid "Order:"
+#~ msgstr "Sortera:"
+
+#~ msgid "Added %s."
+#~ msgstr "Lade till %s."
+
+#~ msgid "Deleted %s."
+#~ msgstr "Tog bort %s."
+
+#~ msgid "The two 'new password' fields didn't match."
+#~ msgstr "De två 'nytt lösenord'-fälten stämde inte överens."
+
+#~ msgid "Year must be 1900 or later."
+#~ msgstr "Årtal måste vara 1900 eller senare."
+
+#~ msgid "Separate multiple IDs with commas."
+#~ msgstr "Separera flera ID-nummer med kommatecken."
+
+#~ msgid "Brazilian"
+#~ msgstr "Brasilianska"
+
+#~ msgid "Gaeilge"
+#~ msgstr "Gaeliska"
diff --git a/webapp/django/conf/locale/sv/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/sv/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..d931eb9
--- /dev/null
+++ b/webapp/django/conf/locale/sv/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/sv/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/sv/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..73ad0b5
--- /dev/null
+++ b/webapp/django/conf/locale/sv/LC_MESSAGES/djangojs.po
@@ -0,0 +1,121 @@
+# Swedish translation of Django
+# Copyright (C) 2005
+# This file is distributed under the same license as the Django package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-08-19 01:28+0200\n"
+"PO-Revision-Date: 2008-02-01 15:32+0100\n"
+"Last-Translator: Ludvig Ericson <ludvig.ericson@gmail.com>\n"
+"Language-Team: Django I18N <Django-I18N@googlegroups.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms:  nplurals=2; plural=(n != 1);\n"
+"X-Poedit-Language: Swedish\n"
+"X-Poedit-Country: SWEDEN\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "Tillgängliga %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Markera alla"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Lägg till"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Ta bort"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Valda %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Gör dina val och klicka på "
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Ta bort alla"
+
+#: contrib/admin/media/js/calendar.js:24
+#: contrib/admin/media/js/dateparse.js:32
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Januari Februari Mars April Maj Juni Juli Augusti September Oktober November "
+"December"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "S M T O T F L"
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Söndag Måndag Tisdag Onsdag Torsdag Fredag Lördag"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr "Visa"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr "Göm"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Now"
+msgstr "Nu"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
+msgid "Clock"
+msgstr "Klocka"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
+msgid "Choose a time"
+msgstr "Välj en tidpunkt"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "Midnight"
+msgstr "Midnatt"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "6 a.m."
+msgstr "06:00"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
+msgid "Noon"
+msgstr "Middag"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
+msgid "Cancel"
+msgstr "Avbryt"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
+msgid "Today"
+msgstr "I dag"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
+msgid "Calendar"
+msgstr "Kalender"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
+msgid "Yesterday"
+msgstr "I går"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
+msgid "Tomorrow"
+msgstr "I morgon"
diff --git a/webapp/django/conf/locale/ta/LC_MESSAGES/django.mo b/webapp/django/conf/locale/ta/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..ea0fab5
--- /dev/null
+++ b/webapp/django/conf/locale/ta/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/ta/LC_MESSAGES/django.po b/webapp/django/conf/locale/ta/LC_MESSAGES/django.po
new file mode 100644
index 0000000..6833255
--- /dev/null
+++ b/webapp/django/conf/locale/ta/LC_MESSAGES/django.po
@@ -0,0 +1,2136 @@
+# translation of django-new.po to tamil
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# PONNUSAMY.A <ponnusamy.simpleman@gmail.com>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-09-25 15:43+0200\n"
+"PO-Revision-Date: 2007-03-15 16:48+0530\n"
+"Last-Translator: PONNUSAMY <ponnusamy.simpleman@gmail.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language-Team: tamil <tamilinix@yahoogroups.com>\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=2; plural=n>1;"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "அடையாளம்"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "தலையங்கம்"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "குறிப்பு"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "#1 தரவரிசை"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "#2 தரவரிசை"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "#3 தரவரிசை"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "#4 தரவரிசை"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "#5 தரவரிசை"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "#6 தரவரிசை"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "#7 தரவரிசை"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "#8 தரவரிசை"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "அங்கீகரிக்கப்பட்ட தரவரிசை"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "தேதி/நேரம் சமர்ப்பிக்கப்பட்டுள்ளது"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "பொதுவானது"
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:304
+msgid "IP address"
+msgstr "IP விலாசம்"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "நீக்கபட்டது"
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr "குறிப்பு சரியாக இல்லையென்றால் இந்த பெட்டியில் குறியிடவும். இதற்கு பதிலாக \"இந்த குறிப்பு நீக்கபட்டது\" காண்பிக்கபடும்."
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "குறிப்பு"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "பொருள் அடக்க object"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"%(user)s ஆல் %(date)s இல் அளிக்கப்பட்டது \n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "நபரின் பெயர்"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "ip விலாசம்"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "பணியாளர்களால் அனுமதிக்கப்பட்டது"
+
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "சுதந்தரமான குறிப்பு"
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "சுதந்தரமான குறிப்புகள்"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "மதிப்பீடு "
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "மதிப்பீட்டு தேதி"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "கர்மா மதிப்பீடு"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "கர்மா மதிப்பீடு"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(user)s ஈட்டய %(score)d "
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"இந்த குறிப்பு %(user)s ஆல் குறிக்கபட்டது:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "குறியின் தேதி"
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "பயனாளர் குறி"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "பயனாளர் குறிகள்"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "%r ஆல் குறிக்கப்பட்டது"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "நீக்கப்பட்ட தேதி"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "மட்டொறுத்தால் நீக்கப்பட்டது"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "மட்டொறுத்தர்களால் நீக்கப்பட்டது"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "மட்டொறுத்தால் நீக்கப்பட்டது %r"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "அடையாளம் இல்லாத பயனாளறால் வாக்களிக்க முடியாது"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "செல்லாத குறிப்பு ID"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "உங்களை நீங்களே தேர்வு செய்து கொள்ள முடியாது"
+
+#: contrib/comments/views/comments.py:27
+msgid "This rating is required because you've entered at least one other rating."
+msgstr "இந்த தரவரிசை தேவைப்படுகிறது ஏனெனில் மற்றொரு தரவரிசை அளிக்கப்பட்டு விட்டதால்"
+
+#: contrib/comments/views/comments.py:111
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"இந்த குறிப்பானது குறைவாக அளித்த பயனாளரால் %(count)s "
+"அளிக்கப்பட்டது:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"இந்த குறிப்பானது குறைவாக அளித்த பயனாளர்களால் %(count)s"
+" அளிக்கப்பட்டது:\n"
+"\n"
+"%(text)s"
+
+
+#: contrib/comments/views/comments.py:116
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"முழுமையான விவரங்களை அளிக்காத பயனாளரால் கொடுக்கப்பட்டது:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:188
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "POSTகளுக்கு மட்டும் அனுமதி உண்டு"
+
+#: contrib/comments/views/comments.py:192
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "ஒன்று அல்லது ஒன்றிற்கு மேற்ப்பட்ட புலங்கள் சமற்பிக்கப்படவில்லை"
+
+#: contrib/comments/views/comments.py:196
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "எவறோ குறிப்புறையைச்  சேதப்படுத்திவிட்டர்கள் (பாதுகாப்பு மீறல்)"
+
+#: contrib/comments/views/comments.py:206
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr "குறிப்புறை படிவத்தில் முறையான இலக்கு அளவுருக்கவில்லை -- object ID முறையானதாக இல்லை"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "குறிப்பு படிவம் முன்னோட்டம் அல்லது பிற்பட்டதை வழங்குவது இல்லை"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "பயனர் பெயர்:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr "வெளியேறு"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "கடவுச்சொல்:"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "கடவுச்சொல்லை மறந்துவிட்டீரா?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "விகிதம்"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "தேவைப்படுகிறது"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "விருப்பத்தேர்வு"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "புகைப்படத்தை அனுப்பு"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "விவரம்:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "குறிப்பை முன்னேற்றமிடு"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "உங்கள் பெயர்:"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3> %s ஆல்:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169
+msgid "All"
+msgstr "அனைத்தும்"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "எந்த தேதியும்"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "இன்று"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "கடந்த 7 நாட்களில்"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "இந்த மாதம்"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "இந்த வருடம்"
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "ஆம்"
+
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "இல்லை"
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "தெரியாத"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "செயல் நேரம்"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "பொருள் அடையாளம்"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "பொருள் உருவகித்தம்"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "செயர்குறி"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "செய்தியை மாற்று"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "புகுபதிவு உள்ளீடு"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "புகுபதிவு உள்ளீடுகள்"
+
+#: contrib/admin/templatetags/admin_list.py:230
+msgid "All dates"
+msgstr "அனைத்து தேதியும்"
+
+#: contrib/admin/views/decorators.py:10 contrib/auth/forms.py:59
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr "தயவுசெய்து சரியான பயனர்ப்பெயர் மற்றும் கடவுச்சொல்லை உள்ளிடவும். இரண்டும் எழுத்துவகையைச் சார்ந்தது."
+
+#: contrib/admin/views/decorators.py:24
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "உள்ளே போ"
+
+#: contrib/admin/views/decorators.py:62
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr "தயவுசெய்து மறுபடியும் புகுபதிவு செய்க. ஏனென்றால் காலம் முடிவடைந்தது. கவலை படவேண்டாம்: உங்களுடைய அனுப்புதல் சேமிக்கப்பட்டுள்ளது."
+
+#: contrib/admin/views/decorators.py:69
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr "உங்களுடைய உலாவி தற்கால நிரல்களை அமதிக்காதவாறு உள்ளமைக்கப் பட்டவாறு தெரிகிறது. தயவுசெய்து தற்காலிக நிரலை செயல்பட செய்து, பக்கத்தை மறுபடி உள் வாங்கவும். "
+
+#: contrib/admin/views/decorators.py:83
+msgid "Usernames cannot contain the '@' character."
+msgstr "பயனர் பெயர் '@' குறியீட்டை கொண்டிருக்க முடியாது."
+
+#: contrib/admin/views/decorators.py:85
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "உங்கள் மின் அஞ்சல் முகவரி உங்கள் பயனர் பெயராக இல்லை. '%s'யை முயற்சி செய்யவும்."
+
+#: contrib/admin/views/main.py:223
+msgid "Site administration"
+msgstr "இணைய மேலான்மை"
+
+#: contrib/admin/views/main.py:257 contrib/admin/views/auth.py:17
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" வெற்றிகரமாகச் சேர்க்கப்பட்டது."
+
+#: contrib/admin/views/main.py:261 contrib/admin/views/main.py:347
+#: contrib/admin/views/auth.py:22
+msgid "You may edit it again below."
+msgstr "நீங்கள் மறுபடியும் தொகுக்க முடியும். "
+
+#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356
+#, python-format
+msgid "You may add another %s below."
+msgstr "நீங்கள் மற்ற %s யை கீழே சேர்க்க முடியும்."
+
+#: contrib/admin/views/main.py:289
+#, python-format
+msgid "Add %s"
+msgstr "%s யை சேர்க்க"
+
+#: contrib/admin/views/main.py:335
+#, python-format
+msgid "Added %s."
+msgstr "%s சேர்க்கப்பட்டுள்ளது."
+
+#: contrib/admin/views/main.py:335 contrib/admin/views/main.py:337
+#: contrib/admin/views/main.py:339
+msgid "and"
+msgstr "மற்றும்"
+
+#: contrib/admin/views/main.py:337
+#, python-format
+msgid "Changed %s."
+msgstr "%s மாற்றபட்டுள்ளது."
+
+#: contrib/admin/views/main.py:339
+#, python-format
+msgid "Deleted %s."
+msgstr "%s அழிக்கப்பட்டது."
+
+#: contrib/admin/views/main.py:342
+msgid "No fields changed."
+msgstr "எந்த புலமும் மாறவில்லை."
+
+#: contrib/admin/views/main.py:345
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" வெற்றிகரமாக மாற்றப்பட்டது."
+
+#: contrib/admin/views/main.py:353
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" வெற்றிகரமாக சேர்க்கப்பட்டுள்ளது. நீங்கள் கீழே தொகுக்க முடியும்."
+
+#: contrib/admin/views/main.py:391
+#, python-format
+msgid "Change %s"
+msgstr "%s யை மாற்று"
+
+#: contrib/admin/views/main.py:473
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "%(name)s ல் உள்ள %(fieldname)s: %(obj)s"
+
+#: contrib/admin/views/main.py:478
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "%(name)s ல் உள்ள %(fieldname)s:"
+
+#: contrib/admin/views/main.py:511
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" வெற்றிகரமாக அழிக்கப்பட்டுள்ளது."
+
+#: contrib/admin/views/main.py:514
+msgid "Are you sure?"
+msgstr "உறுதியாக சொல்கிறீர்களா?"
+
+#: contrib/admin/views/main.py:536
+#, python-format
+msgid "Change history: %s"
+msgstr "வரலாற்றை மாற்று: %s"
+
+#: contrib/admin/views/main.py:570
+#, python-format
+msgid "Select %s"
+msgstr "%s யை தேர்ந்தெடு"
+
+#: contrib/admin/views/main.py:570
+#, python-format
+msgid "Select %s to change"
+msgstr "%s யை மாற்ற தேர்ந்தெடு"
+
+#: contrib/admin/views/main.py:758
+msgid "Database error"
+msgstr "தகவல்சேமிப்பு  பிழை"
+
+#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48
+#: contrib/admin/views/doc.py:50
+msgid "tag:"
+msgstr "ஒட்டு:"
+
+#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79
+#: contrib/admin/views/doc.py:81
+msgid "filter:"
+msgstr "வடிகட்டி:"
+
+#: contrib/admin/views/doc.py:135 contrib/admin/views/doc.py:137
+#: contrib/admin/views/doc.py:139
+msgid "view:"
+msgstr "நோற்றமிடு:"
+
+#: contrib/admin/views/doc.py:164
+#, python-format
+msgid "App %r not found"
+msgstr "பக்கம் %r இல்லை"
+
+#: contrib/admin/views/doc.py:171
+#, python-format
+msgid "Model %r not found in app %r"
+msgstr "மாதரி %r பக்கம் %rல் இல்லை "
+
+#: contrib/admin/views/doc.py:183
+#, python-format
+msgid "the related `%s.%s` object"
+msgstr "சம்மந்தப்பட்ட '%s.%s' பொருள்"
+
+#: contrib/admin/views/doc.py:183 contrib/admin/views/doc.py:205
+#: contrib/admin/views/doc.py:219 contrib/admin/views/doc.py:224
+msgid "model:"
+msgstr "மாதிரி:"
+
+#: contrib/admin/views/doc.py:214
+#, python-format
+msgid "related `%s.%s` objects"
+msgstr "மாதரி %s பக்கம் %s ல் இல்லை"
+
+#: contrib/admin/views/doc.py:219
+#, python-format
+msgid "all %s"
+msgstr "அனைத்து %s "
+
+#: contrib/admin/views/doc.py:224
+#, python-format
+msgid "number of %s"
+msgstr "எண்ணிக்கை %s"
+
+#: contrib/admin/views/doc.py:229
+#, python-format
+msgid "Fields on %s objects"
+msgstr "புலத்தின் %s பொருள்"
+
+#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:301
+#: contrib/admin/views/doc.py:303 contrib/admin/views/doc.py:309
+#: contrib/admin/views/doc.py:310 contrib/admin/views/doc.py:312
+msgid "Integer"
+msgstr "முழு எண்"
+
+#: contrib/admin/views/doc.py:292
+msgid "Boolean (Either True or False)"
+msgstr "பூலியன் (சரி அல்லது தவறு)"
+
+#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:311
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "உரை (%(maxlength)s வரைக்கும்)"
+
+#: contrib/admin/views/doc.py:294
+msgid "Comma-separated integers"
+msgstr "கமாவாள் பிரிக்கப்பட்ட முழு எண்"
+
+#: contrib/admin/views/doc.py:295
+msgid "Date (without time)"
+msgstr "தேதி (நேரமில்லாமல்)"
+
+#: contrib/admin/views/doc.py:296
+msgid "Date (with time)"
+msgstr "தேதி (நேரமுடன்)"
+
+#: contrib/admin/views/doc.py:297
+msgid "E-mail address"
+msgstr "மின் அஞ்சல்"
+
+#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:299
+#: contrib/admin/views/doc.py:302
+msgid "File path"
+msgstr "கோப்புப் பாதை"
+
+#: contrib/admin/views/doc.py:300
+msgid "Decimal number"
+msgstr "தசம எண்கள்"
+
+#: contrib/admin/views/doc.py:306
+msgid "Boolean (Either True, False or None)"
+msgstr "இலக்கு முறை (சரி, தவறு அல்லது ஒன்றும் இல்லை)"
+
+#: contrib/admin/views/doc.py:307
+msgid "Relation to parent model"
+msgstr "ஆதி மாதிரிக்கு தொடர்புடையது"
+
+#: contrib/admin/views/doc.py:308
+msgid "Phone number"
+msgstr "தொலைபேசி எண்"
+
+#: contrib/admin/views/doc.py:313
+msgid "Text"
+msgstr "உரை"
+
+#: contrib/admin/views/doc.py:314
+msgid "Time"
+msgstr "நேரம்"
+
+#: contrib/admin/views/doc.py:315 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:316
+msgid "U.S. state (two uppercase letters)"
+msgstr "U.S. மாநிலம் (இரண்டு மேல் எழுத்துவகை எழுத்து"
+
+#: contrib/admin/views/doc.py:317
+msgid "XML text"
+msgstr "XML உரை"
+
+#: contrib/admin/views/doc.py:343
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s -ல் urlpattern தோன்றுவதில்லை"
+
+#: contrib/admin/views/auth.py:28
+msgid "Add user"
+msgstr "புதிய பயனர்"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "ஆவனமாக்கம்"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "கடவுச்சொல்லை மாற்று"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "வீடு"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+msgid "History"
+msgstr "வரலாறு"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "தேதி/நேரம் "
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "பயனர்"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "செயல்"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "தேதியும் முழு நேரமும்"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"இந்த பொருள் மாற்று வரலாற்றில் இல்லை"
+"ஒரு வேளை நிர்வாகத்தளத்தின் மூலம் சேர்க்கப்படாமலிருக்கலாம்"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "டிஜாங்ஙோ தள நிர்வாகி"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "டிஜாங்ஙோ நிர்வாகம் "
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "சேவகன் பிழை"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "சேவையகம் தவறு(500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "சேவையகம் பிழை<em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"தவறு ஏற்பட்டுள்ளது"
+"வலைத்தள நிர்வாகிக்கு மின்னஞ்சல் அனுப்பப்பட்டுள்ளது. விரைவில் சரி செய்யப்படும். உங்களது பொறுமைக்கு நன்றி"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "பக்கத்தைக் காணவில்லை"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "நீங்கள் விரும்பிய பக்கத்தை காண இயலவில்லை,அதற்காக நாங்கள் வருந்துகிறோம்."
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "செயலியில் கிடைக்கக் கூடிய  %(name)s  மாதிரிகள்"
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "சேர்க்க"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "மாற்றுக"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "உங்களுக்கு மாற்றுவதற்குரிய உரிமையில்லை"
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "தற்போதைய செயல்கள்"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "எனது செயல்கள்"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "எதுவும் கிடைக்கவில்லை"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s சேர்க்க"
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "நீங்கள் தங்களது கடவுச்சொல்லை  <a href=\"/password_reset/\"> மறந்து விட்டீர்களா?"
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "நல்வரவு,"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "நீக்குக"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr "நீக்கும் '%(escaped_object)s' ஆனது %(object_name)s தொடர்புடைய மற்றவற்றையும் நீக்கும். ஆனால்  அதை நீக்குவதற்குரிய  உரிமை  உங்களுக்கு  இல்லை"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"நீங்கள் இந்த \"%(escaped_object)s\" %(object_name)s நீக்குவதில் நிச்சயமா?"
+"தொடர்புடைய மற்றவையும் நீக்கப்படும். "
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "ஆம், எனக்கு உறுதி"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr "%(filter_title)s ஆல்"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "செல்"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 விடை"
+msgstr[1] "%(counter)s விடைகள்"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s மொத்தம்"
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "எல்லாவற்றையும் காட்டு"
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "வடிகட்டி"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "தளத்தில் பார்"
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "கீழே உள்ள தவறுயைத் திருத்துக"
+msgstr[1] "கீழே உள்ள தவறுகளைத் திருத்துக"
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr "வரிசைப்படுத்துதல்"
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr "வரிசைப்படுத்து:"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "புதியதாக சேமி"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "சேமித்து இன்னுமொன்றைச் சேர்"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "சேமித்து மாற்றத்தை தொடருக"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "சேமிக்க"
+
+#: contrib/admin/templates/admin/invalid_setup.html:8
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr "உங்களுடைய தகவல்சேமிப்பகத்தை  நிறுவுவதில் சில தவறுகள் உள்ளது. அதற்கு இணையான தகவல்சேமிப்பு அட்டவணையை" "தயாரிக்கவும். மேலும் பயனர் படிக்கும்  படியான தகவல்சேமிப்பகத்தை உருவாக்கவும்."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr "முதலில்,பயனர்ப்பெயர் மற்றும் கடவுச்சொல்லை உள்ளிடவும்.அதன் பிறகு தான் நீங்கள் உங்கள் பெயரின் விவரங்களை திருத்த முடியும்"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "பயனர்ப்பெயர்"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+msgid "Password"
+msgstr "கடவுச்சொல்"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+msgid "Password (again)"
+msgstr "கடவுச்சொல்(மறுபடியும்)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+msgid "Enter the same password as above, for verification."
+msgstr "மேலே அதே கடவுச்சொல்லை உள்ளிடவும், சரிபார்ப்பதற்காக ."
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "கடவுச்சொல் மாற்று"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "வெற்றிகரமாக கடவுச்சொல் மாற்றபட்டது"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "உங்களுடைய கடவுச்சொல் மாற்றபட்டது"
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "கடவுச்சொல்லை மாற்றியமை"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"கடவுச்சொல்லை மறந்துவிட்டீரா? உங்களது மின்னஞ்சல்  முகவரியை உள்ளிடுக,அதன் பிறகு உங்கள் கடவுச்சொல்"
+" மாற்றியமைக்கப்பட்டு உங்களது மின்னஞ்சல்  முகவரிக்கு அனுப்பப்படும்"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "மின்அஞ்சல் முகவரி:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "எனது கடவுச்சொல்லை மாற்றியமை"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "வலைத்தளத்தில் உங்களது பொன்னான நேரத்தை செலவழித்தமைக்கு மிகுந்த நன்றி"
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "மீண்டும் உள்ளே பதிவு செய்யவும்"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "கடவுச்சொல் மாற்றியமைத்தல் வெற்றி"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"கடவுச்சொல்லை  மறந்து விட்டால் உங்களது மின்னஞ்சல்  முகவரியை உள்ளிடுக புதிய கடவுச்சொல்  "
+"உங்களது மின்னஞ்சல்  முகவரிக்கு அனுப்பப்பட்டுள்ளது. விரைவில் அது உங்களுக்கு கிடைக்கும்"
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr "பாதுகாப்பு காரணங்களுக்காக , முதலில் உங்களது பழைய கடவுச்சொல்லை உள்ளிடுக. அதன் பிறகு புதிய கடவுச்சொல்லை இரு முறை உள்ளிடுக.  இது உங்களது உள்ளிடுதலை சரிபார்க்க உதவும். "
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "பழைய கடவுச்சொல் :"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "புதிய கடவுச்சொல்:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "கடவுச்சொலின் மாற்றத்தை உறுதிப்படுத்து:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "கடவுச் சொல்லை மாற்றவும்"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "கடவுச்சொல்லை மாற்றியமைக்க நீங்கள் கேட்டதனால் உங்களுக்கு இந்த மின்னஞ்சல் அனுப்பப்பட்டுள்ளது"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "%(site_name)s -இல் உள்ள உங்களது பயனாளர் கணக்கு"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "உங்களது  புதிய  கடவுச்சொல் : %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "கடவுச்சொல்லை மாற்றியமைக்க நீங்கள் இந்த பக்கத்திற்கு தாராளமாக போகலாம்."
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "உங்களது பயனாளர் பெயர், நீங்கள் மறந்திருந்தால்:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "எங்களது வலைத்தளத்தை பயன் படுத்தியதற்கு மிகுந்த நன்றி"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "இந்த %(site_name)s -இன்  குழு"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "புத்தகக்குறிகள்"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "ஆவணமாக்கக் குறியீடுகள்"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\"> புத்தக குறியீடுகளை நிறுவ இந்த இணைப்பினை புத்தகக்குறியீட்டுப் \n"
+"பட்டைக்கு இழுக்கவும். அல்லது வலது கிளிக் செய்து புத்தகக்குறியீடுகளில் சேர்க்கவும். \n"
+" இனி தளத்தில் எந்தப் பக்கத்தில் இருந்தும் புத்தகக்குறியீட்டினை தேர்வுசெய்ய முடியும். \n"
+" நீங்கள் இந்த தளத்தை  \"internal\" என  குறிக்கப்பட்ட கணிணியில் இருந்து மட்டுமே \n"
+" ஒருசில புத்தகக்குறிகளை செயல்படுத்தமுடியும்\n "
+" உங்களுக்கு, கணிணி  \"internal\" என உறுதி செய்ய கணிணிமேளாலரை அணுகவும்.</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "இந்த பக்கத்திற்கான ஆவணம்"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr "எந்த ஒரு பக்கத்திலிருந்தும் ஆவணப்பக்கத்தை பார்வையிடுதல், அந்த பக்கத்தை உருவாக்குகிறது."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "object ID-ஐ காட்டு"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr "ஒரே object-ஐ குறிக்கும் பக்கங்களின் பொருளடக்க வகை மற்றும் unique ID-ஐ   காட்டுகிறது."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "இதை திருத்துக (தற்போதைய சாளரம்)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "ஒரே object-ஐ குறிக்கும் பக்கங்களைக் காண மேலாளர் பக்கத்திற்கு செல்க."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "இதை திருத்துக. (புதிய சாளரம்)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "மேளாலர் பக்கத்தை முன்பு கண்டதுபோல், ஆனால் புதிய சாளரத்தில் திறக்கிறது."
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "தேதி:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "நேரம்:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "தற்போது:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "மாற்று:"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "லிருந்து திசைமாற்று"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"இது ஒரு முழுமையான பாதையாக இருக்கவேண்டும். "
+"இணையத்தளப்பெயராக இருக்கக்கூடாது. உதாரணம்:'/"
+"events/search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "திரும்ப அனுப்பு"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr "இது முழுமையான பாதையாக (மேலே உள்ளது போல) அல்லது  \"http\"//\" என தொடங்கும் வலை  முகவரியாக இருக்கலாம்."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "திரும்ப அனுப்பு"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "திரும்ப அனுப்புகிறது. "
+
+#: contrib/flatpages/models.py:8
+msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr "உதாரணம்: '/about/contact/'. முன்னும் பின்னும் '/' உள்ளதை உறுதி செய்க."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "தலைப்பு"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "பொருளடக்கம்"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "விமர்சனங்களை செயலாக்கு"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "வார்ப்புரு பெயர்"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr "உதாரணம்  'flatpages/contact_page'. இது இல்லையெனில் 'flatpages/default' என்பதே பயன்படுத்தப்படும்.ப்படும்."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "முன்பதிவு தேவை"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "இது தெரிவு செய்யப்பட்டிருந்தால், உள்நுழைந்த பயனர்கள் மட்டுமே இந்தப் பக்கத்தை பார்க்க முடியும்."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "எளிய பக்கம்"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "எளிய பக்கங்கள்"
+
+#: contrib/auth/views.py:39
+msgid "Logged out"
+msgstr "வெளியே வந்துவீட்டீர்"
+
+#: contrib/auth/models.py:38 contrib/auth/models.py:57
+msgid "name"
+msgstr "பெயர்"
+
+#: contrib/auth/models.py:40
+msgid "codename"
+msgstr "குறிமுறை பெயர்"
+
+#: contrib/auth/models.py:42
+msgid "permission"
+msgstr "அனுமதி"
+
+#: contrib/auth/models.py:43 contrib/auth/models.py:58
+msgid "permissions"
+msgstr "அனுமதிகள்"
+
+#: contrib/auth/models.py:60
+msgid "group"
+msgstr "குழு"
+
+#: contrib/auth/models.py:61 contrib/auth/models.py:100
+msgid "groups"
+msgstr "குழுக்கள்"
+
+#: contrib/auth/models.py:90
+msgid "username"
+msgstr "பயனர் பெயர்"
+
+#: contrib/auth/models.py:90
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr "தேவை. 30 எழுத்துகள் அல்லது கொஞ்சம். அகர வரிசை எழுத்துக்கள் மட்டுமே ( எழுத்துகள்,எண்கள்,அன்டர்ஸ்கோர்). "
+
+#: contrib/auth/models.py:91
+msgid "first name"
+msgstr "முதல் பெயர்"
+
+#: contrib/auth/models.py:92
+msgid "last name"
+msgstr "கடைசி பெயர்"
+
+#: contrib/auth/models.py:93
+msgid "e-mail address"
+msgstr "மின்னஞ்சல் முகவரி"
+
+#: contrib/auth/models.py:94
+msgid "password"
+msgstr "கடவுச்சொல்"
+
+#: contrib/auth/models.py:94
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr "பயன்படுத்து '[algo]$[salt]$[hexdigest]'"
+
+#: contrib/auth/models.py:95
+msgid "staff status"
+msgstr "பணியாளர் நிலை"
+
+#: contrib/auth/models.py:95
+msgid "Designates whether the user can log into this admin site."
+msgstr "பயனர், 'மேலாளலர்' பக்கத்தில் நுழைவதை முடிவு செய்கிறது"
+
+#: contrib/auth/models.py:96
+msgid "active"
+msgstr "செயல்படும்"
+
+#: contrib/auth/models.py:96
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"பயனர்,டிஜாங்ஙோ 'மேலாளலர்' பக்கத்தில் நுழைவதை முடிவு செய்கிறது . இதை தேர்வு செய்யப்படாத கணக்கு உடனடியாக"
+"அழிக்கப்படும்"
+
+#: contrib/auth/models.py:97
+msgid "superuser status"
+msgstr "மேலாளர் இருப்பு நிலை"
+
+#: contrib/auth/models.py:97
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr "இந்த பயனருக்கு எல்லா அங்கீகாரங்களும் வழங்கப்படவில்லை."
+
+#: contrib/auth/models.py:98
+msgid "last login"
+msgstr "கடைசி உள்நுழைவு"
+
+#: contrib/auth/models.py:99
+msgid "date joined"
+msgstr "சேர்ந்த தேதி"
+
+#: contrib/auth/models.py:101
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr "பயனர் தனது அனுமதிகளோடு ,தான் உள்ள குழுவினது அனுமதிகளையும் பெறுவார்."
+
+#: contrib/auth/models.py:102
+msgid "user permissions"
+msgstr "பயனர் அனுமதிகள்"
+
+#: contrib/auth/models.py:105
+msgid "user"
+msgstr "பயனர்"
+
+#: contrib/auth/models.py:106
+msgid "users"
+msgstr "பயனர்கள்"
+
+#: contrib/auth/models.py:111
+msgid "Personal info"
+msgstr "தனிப்பட்ட விவரம்"
+
+#: contrib/auth/models.py:112
+msgid "Permissions"
+msgstr "அனுமதிகள்"
+
+#: contrib/auth/models.py:113
+msgid "Important dates"
+msgstr "முக்கியமான தேதிகள்"
+
+#: contrib/auth/models.py:114
+msgid "Groups"
+msgstr "குழுக்கள்"
+
+#: contrib/auth/models.py:256
+msgid "message"
+msgstr "செய்தி"
+
+#: contrib/auth/forms.py:52
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr " உங்கள் இணைய உலாவியில்  குக்கிகள்  செயலாக்கம் பெறவில்லை. உள்நுழைவதற்கு குக்கிகள் அவசியம்."
+
+#: contrib/auth/forms.py:61
+msgid "This account is inactive."
+msgstr "இந்த கணக்கு செயல்பட துவங்கவில்லை"
+
+#: contrib/contenttypes/models.py:20
+msgid "python model class name"
+msgstr "python model class name"
+
+#: contrib/contenttypes/models.py:23
+msgid "content type"
+msgstr "பொருளடக்க வகை"
+
+#: contrib/contenttypes/models.py:24
+msgid "content types"
+msgstr "பொருளடக்க வகைகள்"
+
+#: contrib/sessions/models.py:51
+msgid "session key"
+msgstr "அமர்வு குறியீ"
+
+#: contrib/sessions/models.py:52
+msgid "session data"
+msgstr "அமர்வு தகவல்"
+
+#: contrib/sessions/models.py:53
+msgid "expire date"
+msgstr "காலாவதியாகும் தேதி"
+
+#: contrib/sessions/models.py:57
+msgid "session"
+msgstr "அமர்வு"
+
+#: contrib/sessions/models.py:58
+msgid "sessions"
+msgstr "அமர்வுகள்"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "களப் பெயர்"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "காட்டும்  பெயர்"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "வலைத்தளம்"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "வலைத்தளங்கள்"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "திங்கள்"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "செவ்வாய்"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "புதன்"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "வியாழன்"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "வெள்ளி"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "சனி"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "ஞாயிறு"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "ஜனவரி"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "பிப்ரவரி"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "மார்ச்"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "ஏப்ரல்"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "மே"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "ஜூன்"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "ஜூலை"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "ஆகஸ்டு"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "செப்டம்பர்"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "அக்டோபர்"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "நவம்பர்"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "டிசம்பர்"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr "ஜன"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "பிப்"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "மார்"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "ஏப்"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "மே"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "ஜூன்"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "ஜூலை"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "ஆக"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "செப்"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "அக்"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "நவ"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "டிச"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "ஜன."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "பிப்."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "ஆக."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "செப்."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "அக்."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "நவ."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "டிச."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "வருடம்"
+msgstr[1] "வருடங்கள்"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "மாதம்"
+msgstr[1] "மாதங்கள்"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "வாரம்"
+msgstr[1] "வாரங்கள்"
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "நாள்"
+msgstr[1] "நாட்கள்"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "மணி"
+msgstr[1] "மணி"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "நிமிடம்"
+msgstr[1] "நிமிடங்கள்"
+
+#: utils/translation/trans_real.py:362
+msgid "DATE_FORMAT"
+msgstr "தேதி_முறை"
+
+#: utils/translation/trans_real.py:363
+msgid "DATETIME_FORMAT"
+msgstr "தேதிநேரம்_முறை"
+
+#: utils/translation/trans_real.py:364
+msgid "TIME_FORMAT"
+msgstr "நேரம்_முறை"
+
+#: utils/translation/trans_real.py:380
+msgid "YEAR_MONTH_FORMAT"
+msgstr "வருடம்_மாதம்_முறை"
+
+#: utils/translation/trans_real.py:381
+msgid "MONTH_DAY_FORMAT"
+msgstr "மாதம்_நாள்_முறை"
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "அரபிக்"
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "பெங்காலி"
+
+#: conf/global_settings.py:41
+msgid "Czech"
+msgstr "செக்"
+
+#: conf/global_settings.py:42
+msgid "Welsh"
+msgstr "வெல்ஸ்"
+
+#: conf/global_settings.py:43
+msgid "Danish"
+msgstr "டேனிஷ்"
+
+#: conf/global_settings.py:44
+msgid "German"
+msgstr "ஜெர்மன்"
+
+#: conf/global_settings.py:45
+msgid "Greek"
+msgstr "கிரேக்கம்"
+
+#: conf/global_settings.py:46
+msgid "English"
+msgstr "ஆங்கிலம்"
+
+#: conf/global_settings.py:47
+msgid "Spanish"
+msgstr "ஸ்பானிஷ்"
+
+#: conf/global_settings.py:48
+msgid "Argentinean Spanish"
+msgstr "அர்ஜெண்டியன் ஸ்பானிஷ் "
+
+#: conf/global_settings.py:49
+msgid "Finnish"
+msgstr "பீனீஷ்"
+
+#: conf/global_settings.py:50
+msgid "French"
+msgstr "ப்ரென்சு"
+
+#: conf/global_settings.py:51
+msgid "Galician"
+msgstr "கலீஷீயன்"
+
+#: conf/global_settings.py:52
+msgid "Hungarian"
+msgstr "ஹங்கேரியன்"
+
+#: conf/global_settings.py:53
+msgid "Hebrew"
+msgstr "ஹீப்ரு"
+
+#: conf/global_settings.py:54
+msgid "Icelandic"
+msgstr "ஐஸ்லான்டிக்"
+
+#: conf/global_settings.py:55
+msgid "Italian"
+msgstr "இத்தாலியன்"
+
+#: conf/global_settings.py:56
+msgid "Japanese"
+msgstr "ஜப்பானிய"
+
+#: conf/global_settings.py:57
+msgid "Dutch"
+msgstr "டச்சு"
+
+#: conf/global_settings.py:58
+msgid "Norwegian"
+msgstr "நார்வீசியன்"
+
+#: conf/global_settings.py:59
+msgid "Brazilian"
+msgstr "பிரேசிலியன்"
+
+#: conf/global_settings.py:60
+msgid "Romanian"
+msgstr "ரோமானியன்"
+
+#: conf/global_settings.py:61
+msgid "Russian"
+msgstr "ரஷ்யன்"
+
+#: conf/global_settings.py:62
+msgid "Slovak"
+msgstr "சுலோவாக்"
+
+#: conf/global_settings.py:63
+msgid "Slovenian"
+msgstr "ஸ்லோவேனியன்"
+
+#: conf/global_settings.py:64
+msgid "Serbian"
+msgstr "செர்பியன்"
+
+#: conf/global_settings.py:65
+msgid "Swedish"
+msgstr "சுவிடிஷ்"
+
+#: conf/global_settings.py:66
+msgid "Tamil"
+msgstr "தமிழ்"
+
+#: conf/global_settings.py:67
+msgid "Turkish"
+msgstr "துருக்கிஷ்"
+
+#: conf/global_settings.py:68
+msgid "Ukrainian"
+msgstr "உக்ரேனியன்"
+
+#: conf/global_settings.py:69
+msgid "Simplified Chinese"
+msgstr "எளிய சீன மொழி"
+
+#: conf/global_settings.py:70
+msgid "Traditional Chinese"
+msgstr "மரபு சீன மொழி"
+
+#: core/validators.py:63
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "இந்த மதிப்பு எழுத்துகள், எண்கள் மேலும் அன்டர்ஸ்கோர் உள்ளடக்க வேண்டும். "
+
+#: core/validators.py:67
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr "இந்த மதிப்பு எழுத்துகள், எண்கள், அன்டர்ஸ்கோர், டஷ் அல்லது சலஷ் மற்றும் உள்ளடக்க வேண்டும்"
+
+#: core/validators.py:71
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "இந்த மதிப்பு எழுத்துகள், எண்கள், அன்டர்ஸ்கோர் டஷ் அல்லது கைப்பன் மற்றும் உள்ளடக்க வேண்டும்"
+
+#: core/validators.py:75
+msgid "Uppercase letters are not allowed here."
+msgstr "பெரிய எழுத்துகளுக்கு இங்கு அனுமதி இல்லை"
+
+#: core/validators.py:79
+msgid "Lowercase letters are not allowed here."
+msgstr "சிறிய எழுத்துகளுக்கு இங்கு அனுமதி இல்லை"
+
+#: core/validators.py:86
+msgid "Enter only digits separated by commas."
+msgstr "இங்கு எண்களை மட்டுமே எழுதவும் காமவாள் தனிமைபடுத்தவும் "
+
+#: core/validators.py:98
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "காற்புள்ளிகளால் தனிமைப்படுத்திய முறையான e முகவரிகள் மட்டும் எழுதவும்"
+
+#: core/validators.py:102
+msgid "Please enter a valid IP address."
+msgstr "தயவு செய்து முறையான ஐ.பி முகவரி மட்டும் எழுதவும்"
+
+#: core/validators.py:106
+msgid "Empty values are not allowed here."
+msgstr "காலியான மதிப்புக்கள் அனுமதி இல்லை"
+
+#: core/validators.py:110
+msgid "Non-numeric characters aren't allowed here."
+msgstr "எண் வடிவமில்லாத எழுத்துக்கள் அனுமதி இல்லை"
+
+#: core/validators.py:114
+msgid "This value can't be comprised solely of digits."
+msgstr "இந்த மதிப்பு இலக்கங்கள் மட்டுமே கொண்டதாக இருக்க கூடாது"
+
+#: core/validators.py:119
+msgid "Enter a whole number."
+msgstr "முழு எண் மட்டுமே எழுதவும்"
+
+#: core/validators.py:123
+msgid "Only alphabetical characters are allowed here."
+msgstr "அகர வரிசை எழுத்துக்கள் மட்டுமே அனுமதி உன்டு"
+
+#: core/validators.py:138
+msgid "Year must be 1900 or later."
+msgstr "வருடம் கண்டிப்பாக 1900 அல்லது அதற்கு மேல்"
+
+#: core/validators.py:142
+#, python-format
+msgid "Invalid date: %s."
+msgstr "முறையல்லாத தேதி: %s"
+
+#: core/validators.py:146 db/models/fields/__init__.py:415
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "வவவவ-மாமா-நாநா என்ற அமைப்பில் உள்ள முறையான தேதி மட்டுமே எழுதவும்"
+
+#: core/validators.py:151
+msgid "Enter a valid time in HH:MM format."
+msgstr "மம-நிநி என்ற அமைப்பில் உள்ள முறையான நேரம் மட்டுமே எழுதவும்"
+
+#: core/validators.py:155 db/models/fields/__init__.py:477
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "வவவவ-மாமா-நாநா மம-நிநி என்ற அமைப்பில் உள்ள முறையான தேதி/நேரம் மட்டுமே எழுதவும்"
+
+#: core/validators.py:160
+msgid "Enter a valid e-mail address."
+msgstr "முறையான e முகவரிகள் மட்டும் எழுதவும்"
+
+#: core/validators.py:172 core/validators.py:401 forms/__init__.py:661
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "அந்த பக்கத்தின் encoding வகையைப் பரிசோதிக்க.கோப்பு சமர்பிக்கப் பட்டவில்லை "
+
+#: core/validators.py:176
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr "முறையான படம் மட்டுமே பதிவேற்றம் செய்யவும். நீங்கள் பதிவேற்றம் செய்த கோப்பு படம் அள்ளாத அல்லது கெட்டுப்போன கோப்பாகும்"
+
+#: core/validators.py:183
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "%s என்ற இணையதள முகவரி சரியான படத்தைச் சுட்டவில்லை"
+
+#: core/validators.py:187
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "தொலைபேசி எண்கள் XXX-XXX-XXXX என்ற அமைப்பில் இருக்க வேண்டும். \"%s\" என்பது முறையள்ள"
+
+#: core/validators.py:195
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "%s என்ற இணையதள முகவரி முறையான குயிக் டைம் படக்காட்சியைச் சுட்டவில்லை"
+
+#: core/validators.py:199
+msgid "A valid URL is required."
+msgstr "முறையான இணையதள முகவரி தேவை"
+
+#: core/validators.py:213
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"முறையான இணையதள முகவரி தேவை. குறிப்பிடத்தக்கத் தவறுகளாவன:\n"
+"%s"
+
+#: core/validators.py:220
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "முறைப்படுத்தப்படாத XML: %s"
+
+#: core/validators.py:230
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "முறைப்படுத்தப்படாத இணையதள முகவறி: %s"
+
+#: core/validators.py:234 core/validators.py:236
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "%s என்ற இணையதள முகவரி உடைந்துள்ளது"
+
+#: core/validators.py:242
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "முறையான U.S மாநில பெயர் சுருக்கம் எழுதவும்"
+
+#: core/validators.py:256
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "வார்த்தைகளை அளன்து பேசுங்கள்! %s என்ற வார்த்தை இங்கு அனுமதி இல்லை"
+msgstr[1] "வார்த்தைகளை அளந்து பேசுங்கள்! %s என்ற வார்த்தைகள் இங்கு அனுமதி இல்லை"
+
+#: core/validators.py:263
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "இந்த புலம் %s என்ற புலத்துடன் ஒத்திறுக்க வேண்டும்"
+
+#: core/validators.py:282
+msgid "Please enter something for at least one field."
+msgstr "தயவு செய்து ஒரு புலத்திலாவது ஏதாவது எழுதவும்"
+
+#: core/validators.py:291 core/validators.py:302
+msgid "Please enter both fields or leave them both empty."
+msgstr "தயவு செய்து இரு புலங்கலையும் நிரப்பவும் அல்லது இரண்டையும் காலியாக விடவும்"
+
+#: core/validators.py:309
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "%(field)s, %(value)s ஆக இருந்தால் இந்த புலம் இருக்க வேண்டும்"
+
+#: core/validators.py:321
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "%(field)s, %(value)s ஆக இல்லை என்றால் இந்த புலம் இருக்க வேண்டும்"
+
+#: core/validators.py:340
+msgid "Duplicate values are not allowed."
+msgstr "போலியான மதிப்புகள் அனுமதி இல்லை"
+
+#: core/validators.py:363
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "இந்த மதிப்பு %s இன் அடுக்காக இருக்க வேன்டும்"
+
+#: core/validators.py:374
+msgid "Please enter a valid decimal number."
+msgstr "தயவுசெய்து முறையான பதின்ம எண்ணை நுழைக்கவும்"
+
+#: core/validators.py:378
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural "Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "தயவுசெய்து முறையான பதின்ம எண்களுடன் %s மொத்த இலக்கத்தை நுழைக்கவும்"
+msgstr[1] "தயவுசெய்து முறையான பதின்ம எண்களுடன் %s மொத்த இலக்கங்களையும் நுழைக்கவும்"
+
+#: core/validators.py:381
+#, python-format
+msgid "Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural "Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] "அதிகபட்சம் %s எண்ணை உள்ள பதின்ம எண்ணை நுழை."
+msgstr[1] "அதிகபட்சம் %s எண்கள் உள்ள பதின்ம எண்ணை நுழை."
+
+#: core/validators.py:384
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural "Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "அதிகபட்சம் %s புள்ளி இடம் உள்ள பதின்ம எண்ணை  நுழை"
+msgstr[1] "அதிகபட்சம் %s புள்ளி இடங்கள் உள்ள பதின்ம எண்ணை  நுழை"
+
+#: core/validators.py:394
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "மேல்ஏற்று செய்யப்பட்ட கோப்பு குறைந்தபட்சம்  %s  பைட்டுகள் உள்ளனவா என சரி பார்க்கவும்"
+
+#: core/validators.py:395
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "மேல்ஏற்று செய்யப்பட்ட கோப்பு அதிகபட்சம்  %s  பைட்டுகள் உள்ளனவா என சரி பார்க்கவும்."
+
+#: core/validators.py:412
+msgid "The format for this field is wrong."
+msgstr "புலனுடைய அமைப்பு தவறு"
+
+#: core/validators.py:427
+msgid "This field is invalid."
+msgstr "இந்த புலம் செல்லாது.ள"
+
+#: core/validators.py:463
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "%s இருந்து எதுவும் எடுக்க முடியவில்லை"
+
+#: core/validators.py:466
+#, python-format
+msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "வலைமனை %(url)s என்பது செல்லாத உள்ளடக்க-வகை தலைப்பான  '%(contenttype)s' ஐ திருப்பி தந்துள்ளது."
+
+#: core/validators.py:499
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr "%(line)s கோடு லிருந்து மூடாத %(tag)s டாகை மூடு. ( வரி,\"%(start)s\"வுடன் துவங்குகின்றது)"
+
+#: core/validators.py:503
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr "வரி %(line)s இல் உள்ள  சில உரைகள் இருப்பதற்கு அனுமதி இல்லை.( வரி,\"%(start)s\"வுடன் துவங்குகின்றது)"
+
+#: core/validators.py:508
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr "வரி %(line)s இல் உள்ள  \"%(attr)s\" என்பது தவறான பண்பாகும.( வரி,\"%(start)s\"வுடன் துவங்குகின்றது)"
+
+#: core/validators.py:513
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr "வரி %(line)s இல் உள்ள \"<%(tag)s>\" என்பது தவறான ஒட்டாகும் .( வரி,\"%(start)s\"வுடன் துவங்குகின்றது)"
+
+#: core/validators.py:517
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr "வரி %(line)s இல் உள்ள ஒட்டு இன பண்புகள்  தேவைப்படுகின்றன.(வரி,\"%(start)s\" வுடன் துவங்குகின்றது)"
+
+#: core/validators.py:522
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr "வரி %(line)s இல் உள்ள \"%(attr)s\"  பண்பின் மதிப்பு தவறானது.(வரி \"%(start)s\" இருந்து ஆரம்பம்)"
+
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "%(verbose_name)s வெற்றிகரமாக சேர்க்கப்பட்டு விட்டது"
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "%(verbose_name)s வெற்றிகரமாக மாற்றபட்டு விட்டது"
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "%(verbose_name)s நீக்கப்பட்டுள்ளது"
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(type)s உடன் உள்ள %(object)s ஏற்கனவே %(field)s கொடுக்கப்பட்டு  உள்ளது"
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(fieldname)s உடன் உள்ள %(optname)s ஏற்கனவே உள்ளது"
+
+#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:551 db/models/fields/__init__.py:562
+#: forms/__init__.py:346
+msgid "This field is required."
+msgstr "இந்த  புலத்தில் மதிப்பு தேவை"
+
+#: db/models/fields/__init__.py:340
+msgid "This value must be an integer."
+msgstr "இந்த மதிப்பு முழுவெண்ணாக இருக்க வேண்டும"
+
+#: db/models/fields/__init__.py:372
+msgid "This value must be either True or False."
+msgstr "இந்த மதிப்பு சரி அல்லது தவறாக இருக்க வேண்டும்"
+
+#: db/models/fields/__init__.py:388
+msgid "This field cannot be null."
+msgstr "இந்த புலம் காலியாக இருக்கக் கூடாது"
+
+#: db/models/fields/__init__.py:571
+msgid "Enter a valid filename."
+msgstr "முறையான கோப்புப் பெயரை எழுதவும்"
+
+#: db/models/fields/related.py:51
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "தயவு செய்து முறையான %s எழுதவும்"
+
+#: db/models/fields/related.py:618
+msgid "Separate multiple IDs with commas."
+msgstr "பன்மையிலுள்ள அடையாளங்களை காற்புள்ளிகளால் பிரிக்கவும்"
+
+#: db/models/fields/related.py:620
+msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "Mac இல், ஒன்றுக்கு மேற்பட்டவற்றை தேர்வு செய்ய \"Control\" அல்லது \"Command\" ஐ அழுத்தவும்"
+
+#: db/models/fields/related.py:664
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural "Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "தயவு செய்து முறையான %(self)s அடையாளங்களை எழுதவும். %(value)r என்ற மதிப்பு முறையானதல்ல."
+msgstr[1] "தயவு செய்து முறையான %(self)s அடையாளங்களை எழுதவும். %(value)r என்ற மதிப்புகள் முறையானதல்ல."
+
+#: forms/__init__.py:381
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "உங்கள் உரை %s ஐ விட குறைவான எழுத்து உடையது என்று உறுதி செய்து கொள்ளுங்கள்"
+msgstr[1] "உங்கள் உரை %s ஐ விட குறைவான எழுத்துகள் உடையது என்று உறுதி செய்து கொள்ளுங்கள்"
+
+#: forms/__init__.py:386
+msgid "Line breaks are not allowed here."
+msgstr "வரி உடைவுகள் அனுமதி இல்லை"
+
+#: forms/__init__.py:487 forms/__init__.py:560 forms/__init__.py:599
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "முறையான விருப்பத்தைத் தேர்வு செய்யவும்; '%(data)s என்பது %(choices)s இல் இல்லை"
+
+#: forms/__init__.py:663
+msgid "The submitted file is empty."
+msgstr "சமர்பிக்கப் பட்ட கோப்புக் காலியாக உள்ளது"
+
+#: forms/__init__.py:719
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "-32,768 மற்றும் 32,767 க்கு நடுவில் ஒரு முழு எண்ணை எழுதவும்"
+
+#: forms/__init__.py:729
+msgid "Enter a positive number."
+msgstr "ஒரு நேர்க்குறி எண்ணை எழுதவும்"
+
+#: forms/__init__.py:739
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "0 மற்றும் 32,767 க்கு நடுவில் ஒரு முழு எண்ணை எழுதவும்"
+
+#: template/defaultfilters.py:401
+msgid "yes,no,maybe"
+msgstr "ஆம், இல்லை, இருக்கலாம்"
+
diff --git a/webapp/django/conf/locale/ta/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/ta/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..b78b610
--- /dev/null
+++ b/webapp/django/conf/locale/ta/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/ta/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/ta/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..f60e945
--- /dev/null
+++ b/webapp/django/conf/locale/ta/LC_MESSAGES/djangojs.po
@@ -0,0 +1,112 @@
+# translation of djangojs.po to tamil
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# PONNUSAMY.A <ponnusamy.simpleman@gmail.com>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-12-09 11:51+0100\n"
+"PO-Revision-Date: 2007-03-14 16:40+0530\n"
+"Last-Translator: PONNUSAMY <ponnusamy.simpleman@gmail.com>\n"
+"Language-Team: tamil <tamilinix@yahoogroups.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "%s இருக்கிறதா "
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "எல்லாவற்றையும் தேர்ந்த்தெடுக்க"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "சேர்க்க"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "அழிக்க"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "%s தேர்ந்த்தெடுக்கப்பட்ட"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "தேவையானவற்றை தேர்ந்த்தெடுத்து கிளிக் செய்க"
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "எல்லாவற்றையும் அழிக்க "
+
+#: contrib/admin/media/js/dateparse.js:26
+#: contrib/admin/media/js/calendar.js:24
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"ஜனவரி பிப்ரவரி மார்ச் ஏப்ரல் மே ஜூன் ஜூலை ஆகஸ்டு செப்டம்பர் அக்டோபர் நவம்பர் "
+"டிசம்பர்"
+
+#: contrib/admin/media/js/dateparse.js:27
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "ஞாயிறு திங்கள் செவ்வாய் புதன்  வியாழன் வெள்ளி சனி "
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "ஞா தி செ பு வி வெ ச"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "இப்பொழுது "
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "கடிகாரம் "
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "ஒரு நேரத்தை தேர்ந்த்தெடுக்க  "
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "நடு இரவு "
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "காலை 6 மணி  "
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "மதியம் "
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "வேண்டாம் "
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "இன்று "
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "நாள்காட்டி  "
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "நேற்று "
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "நாளை"
+
diff --git a/webapp/django/conf/locale/te/LC_MESSAGES/django.mo b/webapp/django/conf/locale/te/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..1541b23
--- /dev/null
+++ b/webapp/django/conf/locale/te/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/te/LC_MESSAGES/django.po b/webapp/django/conf/locale/te/LC_MESSAGES/django.po
new file mode 100644
index 0000000..f0bb7a6
--- /dev/null
+++ b/webapp/django/conf/locale/te/LC_MESSAGES/django.po
@@ -0,0 +1,2109 @@
+# translation of django.po to Telugu
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-09-25 15:43+0200\n"
+"PO-Revision-Date: 2007-05-19 12:44+0530\n"
+"Last-Translator: pavithran <pavithran.s@gmail.com>\n"
+"Language-Team: Telugu <indlinux-telugu@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=2; plural=n>1;"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "వస్తువు ఐడి"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "ముఖ్య అంశం"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "వ్యాఖ్యానము"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "రేటింగ్ #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "రేటింగ్ #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "రేటింగ్ #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "రేటింగ్ #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "రేటింగ్ #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "రేటింగ్ #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "రేటింగ్ #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "రేటింగ్ #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "సరైన  రేటింగ్"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "తేది /వేళ సమర్పించినది"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "బహిరంగమయినది"
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:304
+msgid "IP address"
+msgstr "ఐపి అడ్రస్"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "తీసివేయబడినది"
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr " ఈ వ్యాఖ్యానము సరిగ్గా లేదని తోచినచో ఈ  డబ్బా ని చెక్ చేయండి "
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "వ్యాఖ్యానములు"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "వస్తువు లోనిది"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "వ్యక్తి పేరు"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "ఐపి అడ్రస్"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr " అధికారుల చేత ఆమోదించబడినది"
+
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "నిరాటంకమైన వ్యాఖ్యానము"
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "నిరాటంకము గావ్యాఖ్యానములు"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "స్కొర్"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "స్కొర్  తేది"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "కర్మ  స్కొర్"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "కర్మ  స్కొరులు"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d కి     %(user)s  రేటింగ్"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"%(user)s చేత చేయబడ్డ  వ్యాఖ్యానములు:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "ఫ్లాగ్ తేది "
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "యూజర్ ఫ్లాగ్"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "యూజర్ ఫ్లాగులు"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "%r యొక్క ఫ్లాగ్"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "తీసివేసిన  తారీఖు"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "మొదరేటర్  చేత తీసివేయబడినది "
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "మొదరేటర్  చేత తీసివేయబడినవి"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "మొదరేటర్ తీసివేసిన %r"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "అపరిచిత  యూజర్లు వోటు వేయలేరు"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "సరికాని  వ్యాఖ్యానము ఐడి"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "మీకు వోటు హక్కు లేదు"
+
+#: contrib/comments/views/comments.py:27
+msgid "This rating is required because you've entered at least one other rating."
+msgstr "ఈ రేటింగ్ అవసరం  ఎం దుకంటే మీరు ఒక్కసారైన రేటింగ్ ఇచ్చారు"
+
+#: contrib/comments/views/comments.py:111
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"ఈ  వ్యాఖ్యానము చేసిన యూజర్  %(count)s లు కన్న తక్కువ  సమర్పించాడు  "
+"వ్యాఖ్యానము:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"ఈ  వ్యాఖ్యానము చేసిన యూజర్  %(count)s లు కన్న తక్కువ  సమర్పించాడు"
+"వ్యాఖ్యానములు:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:116
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"ఈ  వ్యాఖ్యానము స్కెచి  యూజర్ చేసాడు  :\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:188
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "ఇక్కడ సమర్పణలు మాత్రమే అంగీకరిస్తాము"
+
+#: contrib/comments/views/comments.py:192
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "ఒకటి కాని ,అంత కన్నఎక్కువ ఫీల్డస్  సమర్పించలేదు"
+
+#: contrib/comments/views/comments.py:196
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "ఎవరో వ్యాఖ్యానము ఫార్మ్ ని గెలికారు (భద్రత కి భంగం) "
+
+#: contrib/comments/views/comments.py:206
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"వ్యాఖ్యానము ఫార్మ్ లో  చెల్లని  'టార్గెట్ ' పారామీటర్ , ఆ వస్తువు ఐడి "
+"చెల్లదు"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "వ్యాఖ్యానము ఫార్మ్ లో 'ప్రివ్యీవ్'  కాని 'పోస్ట్'  ఇవ్వలేదు "
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "యూజర్ పేరు"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr "లాగ్ ఔట్"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "పాస్ వర్డ్"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "పాస్ వర్డ్ మర్చిపోయారా?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "రేటింగులు"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "అవసరము"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "మీ ఇష్టం"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "ఫొటొ  పెట్టండి"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "వ్యాఖ్యానము"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "వ్యాఖ్యానము ని ప్రివ్యీవ్ చేయండి"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "మీ పేరు"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3> %s తో:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169
+msgid "All"
+msgstr "అన్నీ"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "ఏ రోజైన"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "ఈ రోజు"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "గత  7 రోజుల గా"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "ఈ నెల"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "ఈ  సంవత్సరము"
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "అవును"
+
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "కాదు"
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "తెలియనది"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "పని సమయము "
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "వస్తువు"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "వస్తువు"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "పని ఫ్లాగ్"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "సందేశము ని మార్చంది"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "లాగ్ ఎంట్రీ"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "లాగ్ ఎంట్రీలు"
+
+#: contrib/admin/templatetags/admin_list.py:230
+msgid "All dates"
+msgstr "అన్నీ  రోజులు"
+
+#: contrib/admin/views/decorators.py:10 contrib/auth/forms.py:59
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr "దయచేసి సరైన  యూజర్ పేరు పాస్ వర్డ్ ఇవ్వండి"
+
+#: contrib/admin/views/decorators.py:24
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "లాగ్ ఇన్"
+
+#: contrib/admin/views/decorators.py:62
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr "దయచేసి మళ్ళీ  లాగ్ ఇన్ అవ్వండి ఎందుకంటే మీ సేస్సన్  ముగిసింది . బాధపడకండి మీ సమర్పన దాచిపెట్టాము"
+
+#: contrib/admin/views/decorators.py:69
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr "మీ  బ్రౌజర్ పై కుకీస్ అంగీకరించేటట్లు చేయలేదు . దయ చేసి  కుకీస్ ఎనేబల్ చేసి ,మళ్ళీ ట్రై చేయండి"
+
+#: contrib/admin/views/decorators.py:83
+msgid "Usernames cannot contain the '@' character."
+msgstr "యూజర్ పేరు లో  '@' అక్షరము ఉందకూడడు"
+
+#: contrib/admin/views/decorators.py:85
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "మీ ఈ మెయిల్ అడ్రస్   మీ యూజర్ పేరు కాదు . '%s' ఇచ్చి చూడండి "
+
+#: contrib/admin/views/main.py:223
+msgid "Site administration"
+msgstr "సైట్ నిర్వాహన"
+
+#: contrib/admin/views/main.py:257 contrib/admin/views/auth.py:17
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\"జయప్రదంగా కలపబడ్డడి"
+
+#: contrib/admin/views/main.py:261 contrib/admin/views/main.py:347
+#: contrib/admin/views/auth.py:22
+msgid "You may edit it again below."
+msgstr "మీరు  మళ్ళీ దీనినీ  క్రింద మార్చవచ్చు"
+
+#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356
+#, python-format
+msgid "You may add another %s below."
+msgstr "మీరు ఇంకొక   %s ని  క్రింద జత చేయొచ్చు"
+
+#: contrib/admin/views/main.py:289
+#, python-format
+msgid "Add %s"
+msgstr "%s ని జత చేయండి "
+
+#: contrib/admin/views/main.py:335
+#, python-format
+msgid "Added %s."
+msgstr "%s కలపబడ్డడి"
+
+#: contrib/admin/views/main.py:335 contrib/admin/views/main.py:337
+#: contrib/admin/views/main.py:339
+msgid "and"
+msgstr "ఇంకా"
+
+#: contrib/admin/views/main.py:337
+#, python-format
+msgid "Changed %s."
+msgstr " %s మార్చబడిండి"
+
+#: contrib/admin/views/main.py:339
+#, python-format
+msgid "Deleted %s."
+msgstr "%s తీసివేయబడ్డడి"
+
+#: contrib/admin/views/main.py:342
+msgid "No fields changed."
+msgstr "ఫీల్డ్స్  ఏమి మార్చబడలేదు"
+
+#: contrib/admin/views/main.py:345
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" జయప్రదంగా మార్చబడిండి"
+
+#: contrib/admin/views/main.py:353
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" జయప్రదంగా కలపబడ్డడి  .మీరు  మళ్ళీ దీనినీ  క్రింద మార్చవచ్చు"
+
+#: contrib/admin/views/main.py:391
+#, python-format
+msgid "Change %s"
+msgstr "%s ని మార్చంది"
+
+#: contrib/admin/views/main.py:473
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "ఒకటి కాని ,అంత కన్నఎక్కువ  %(name)s లో  %(fieldname)s  : %(obj)s "
+
+#: contrib/admin/views/main.py:478
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "ఒకటి కాని ,అంత కన్నఎక్కువ   %(name)s లో  %(fieldname)s"
+
+#: contrib/admin/views/main.py:511
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\"జయప్రదంగా తీసివేయబడ్డడి"
+
+#: contrib/admin/views/main.py:514
+msgid "Are you sure?"
+msgstr "మీరు కచ్చితంగా ఉన్నారా?"
+
+#: contrib/admin/views/main.py:536
+#, python-format
+msgid "Change history: %s"
+msgstr "మార్చబడిన పురాణము: %s"
+
+#: contrib/admin/views/main.py:570
+#, python-format
+msgid "Select %s"
+msgstr "%s ని ఎన్నుకోండి"
+
+#: contrib/admin/views/main.py:570
+#, python-format
+msgid "Select %s to change"
+msgstr "%s ని మార్చటానికి  ఎన్నుకోండి"
+
+#: contrib/admin/views/main.py:758
+msgid "Database error"
+msgstr "డాటాబేస్ ఎర్రర్ "
+
+#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48
+#: contrib/admin/views/doc.py:50
+msgid "tag:"
+msgstr "టాగ్"
+
+#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79
+#: contrib/admin/views/doc.py:81
+msgid "filter:"
+msgstr "ఫిల్టర్"
+
+#: contrib/admin/views/doc.py:135 contrib/admin/views/doc.py:137
+#: contrib/admin/views/doc.py:139
+msgid "view:"
+msgstr "చూడు:"
+
+#: contrib/admin/views/doc.py:164
+#, python-format
+msgid "App %r not found"
+msgstr "%rఎప్ప్ దొరకలేడు"
+
+#: contrib/admin/views/doc.py:171
+#, python-format
+msgid "Model %r not found in app %r"
+msgstr "%r ఎప్ప్  లో %r మొడల్ దొరకలేడు"
+
+#: contrib/admin/views/doc.py:183
+#, python-format
+msgid "the related `%s.%s` object"
+msgstr "సంబంధించిన `%s.%s` వస్తువు "
+
+#: contrib/admin/views/doc.py:183 contrib/admin/views/doc.py:205
+#: contrib/admin/views/doc.py:219 contrib/admin/views/doc.py:224
+msgid "model:"
+msgstr "మొడల్:"
+
+#: contrib/admin/views/doc.py:214
+#, python-format
+msgid "related `%s.%s` objects"
+msgstr "సంబంధించిన  `%s.%s` వస్తువులు"
+
+#: contrib/admin/views/doc.py:219
+#, python-format
+msgid "all %s"
+msgstr "ఆన్నీ  %s"
+
+#: contrib/admin/views/doc.py:224
+#, python-format
+msgid "number of %s"
+msgstr ""
+
+#: contrib/admin/views/doc.py:229
+#, python-format
+msgid "Fields on %s objects"
+msgstr "%s వస్తువులలో ఫీల్డ్స్   "
+
+#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:301
+#: contrib/admin/views/doc.py:303 contrib/admin/views/doc.py:309
+#: contrib/admin/views/doc.py:310 contrib/admin/views/doc.py:312
+msgid "Integer"
+msgstr "అంకె"
+
+#: contrib/admin/views/doc.py:292
+msgid "Boolean (Either True or False)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:311
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:294
+msgid "Comma-separated integers"
+msgstr "కామా  తో విడడీసిన  సంఖ్య"
+
+#: contrib/admin/views/doc.py:295
+msgid "Date (without time)"
+msgstr "తేది (సమయం లేకుండా)"
+
+#: contrib/admin/views/doc.py:296
+msgid "Date (with time)"
+msgstr "తేది (సమయం తో)"
+
+#: contrib/admin/views/doc.py:297
+msgid "E-mail address"
+msgstr "ఈ మెయిల్  అడ్రస్  "
+
+#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:299
+#: contrib/admin/views/doc.py:302
+msgid "File path"
+msgstr "ఫైల్   పాత్"
+
+#: contrib/admin/views/doc.py:300
+msgid "Decimal number"
+msgstr ""
+
+#: contrib/admin/views/doc.py:306
+msgid "Boolean (Either True, False or None)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:307
+msgid "Relation to parent model"
+msgstr "పేరంట్ మొడల్ యొక్క రిలేషన్ "
+
+#: contrib/admin/views/doc.py:308
+msgid "Phone number"
+msgstr "ఫోన్ నంబరు"
+
+#: contrib/admin/views/doc.py:313
+msgid "Text"
+msgstr "టెక్స్ట"
+
+#: contrib/admin/views/doc.py:314
+msgid "Time"
+msgstr "వేళ"
+
+#: contrib/admin/views/doc.py:315 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr ""
+
+#: contrib/admin/views/doc.py:316
+msgid "U.S. state (two uppercase letters)"
+msgstr "అమెరికా రాజ్యము"
+
+#: contrib/admin/views/doc.py:317
+msgid "XML text"
+msgstr "ఎక్స్  ఎమ్   ఎల్"
+
+#: contrib/admin/views/doc.py:343
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr ""
+
+#: contrib/admin/views/auth.py:28
+msgid "Add user"
+msgstr "యూజర్ ని జత చేయండి"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "పాస్ వర్డ్ మార్చుకోండి"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "ఇల్లు"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+msgid "History"
+msgstr "పురాణము"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "తేది/వేళ"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "యూజర్"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "పని"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "డ్జాంగొ యొక్క నిర్వాహనదారులు"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "డ్జాంగొ నిర్వాహన"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "సర్వర్ తప్పు"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "సర్వర్ తప్పు (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "సర్వర్ తప్పు <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr "తప్పు  జరిగిండి .  దానిని  నిర్వాహనాధికారులు కి ఈ మెయిల్  చేయబడ్డడి,మీ ఓపిక కి ధన్యవాదములు"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "పేజి  దొరకలేదు"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "క్షమించండి మీరు కోరిన పేజి దొరకలేడు"
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "మొడల్ లు %(name)s లో  దొరికే అప్ప్లికేషన్"
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "జత చేయి"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "మార్చు"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "మీకు ఏది మార్చటానికి అధికారము లేదు"
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "ఈ మధ్య చేసిన పనులు"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "నా పనులు"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "ఏమి  దొరకలేదు"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s జత చేయు"
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "మీరు<a href=\"/password_reset/\">పాస్ వర్డ మర్చిపోయారా? "
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "సుస్వాగతం"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "తీసివేయి"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "అవును "
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr ""
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "వెళ్లు"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr ""
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "అన్నీ చూడండి"
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "సైట్ లో చూడండి"
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "క్రింద ఉన్న తప్పు  సరిదిద్దుకోండి"
+msgstr[1] "క్రింద ఉన్న తప్పులు  సరిదిద్దుకోండి"
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr ""
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "కొత్త దాని లా దాచు"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "దాచి కొత్త దానిని కలపండి"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "దాచి  మార్చుటా ఉందండి"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "దాచు"
+
+#: contrib/admin/templates/admin/invalid_setup.html:8
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "యూజర్ పేరు"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+msgid "Password"
+msgstr "పాస్ వర్డ్"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+msgid "Password (again)"
+msgstr "పాస్ వర్డ్ (మళ్ళీ)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+msgid "Enter the same password as above, for verification."
+msgstr "ఇందాక పాస్ వర్డ్ మళ్ళీ ఇవ్వండి పరిశీలన కోసము"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "పాస్ వర్డ్ మార్పు"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "పాస్ వర్డ్ మార్పు జయప్రదమైండి "
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "మీ    పాస్ వర్డ్  మార్చబడిండి"
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "పాస్ వర్డ్ రీసెట్"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr "పాస్ వర్డ్ మర్చిపోయారా? మీ ఈ మెయిల్ అడ్రస్ ఇవ్వండి , మీ  పాస్ వర్డ్ రీసెట్ చేసి మీకు  కొత్తది ఈ మెయిల్ చేస్తాము "
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "ఈ మెయిల్ అడ్రస్"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "నా పాస్ వర్డ్ రీసెట్ చేయండి"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr ""
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "మళ్ళీ లాగ్ ఇన్ అవ్వండి"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "పాస్ వర్డ్ రీసెట్  జయప్రదమైండి"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr "మీరు ఇచ్చిన ఈ మెయిల్ అడ్రస్  కి  కొత్త  పాస్ వర్డ్ ఈ మెయిల్ చేసాము.మీరు తొందర లో దానిని అందుకుంటారు ."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr "దయచేసి  రక్షన కోసము, మీ పాత  పాస్ వర్డ్  ఇవ్వండి  ,  కొత్త పాస్ వర్డ్  రెండు సార్లు ఇవ్వండి , ఎం దుకంటే మీరు తప్పు ఇస్తే  సరిచేయటానికి "
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "పాత  పాస్ వర్డ్ "
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "కొత్త పాస్ వర్డ్"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "పాస్ వర్డ్ పక్కా చేయండి"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "నా పాస్ వర్డ్ మార్చండి"
+
+#: contrib/admin/templates/registration/password_reset_.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "మీరు ఈ ఈ మెయిల్ అందుకున్నారు,   ఎందుకంటే పాస్ వర్డ్ రీసెట్ కోసము కోరారు"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "మీ  కొత్త పాస్ వర్డ్ : %(new_password)s "
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "నిస్సందేహము గా ఈ పేజి క్ కి వెళ్ళి పాస్ వర్డ్  మార్చుకోండి "
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "మీ యూజర్ పేరు, ఒక వేళ మర్చిపోయి ఉంటే "
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "మా సైట్  వాడినందుకు ధన్యవాదములు!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "వస్తువు ఇడి చూడండి"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "వస్తువు ని మార్చండి (ప్రస్తుత విండొ)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "వస్తువు ని మార్చండి(కొత్త విండొ) "
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr ""
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "తారీఖు"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "వేళ:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "ఇప్పుడు"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "మార్చు"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr ""
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr ""
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr ""
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr ""
+
+#: contrib/flatpages/models.py:8
+msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "పట్టము"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr ""
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr ""
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr ""
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr "Example: 'flatpages/contact_page.html'.ఇది ఇవ్వకపోతే సిస్టం " " 'flatpages/default.html' ని వాడుకుంటడి"
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "నమొదు చేయటము అవసరం"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "ఇది చెక్ చేసి ఉంటే కేవలం లాగ్గడ్ ఇన్ యూజర్లు పేజి చూడలేస్తారు"
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr ""
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr ""
+
+#: contrib/auth/views.py:39
+msgid "Logged out"
+msgstr "లాగ్గడ్ ఔట్"
+
+#: contrib/auth/models.py:38 contrib/auth/models.py:57
+msgid "name"
+msgstr "పేరు"
+
+#: contrib/auth/models.py:40
+msgid "codename"
+msgstr ""
+
+#: contrib/auth/models.py:42
+msgid "permission"
+msgstr "అనుమతి"
+
+#: contrib/auth/models.py:43 contrib/auth/models.py:58
+msgid "permissions"
+msgstr "అనుమతులు"
+
+#: contrib/auth/models.py:60
+msgid "group"
+msgstr "గుంపు"
+
+#: contrib/auth/models.py:61 contrib/auth/models.py:100
+msgid "groups"
+msgstr "గుంపులు"
+
+#: contrib/auth/models.py:90
+msgid "username"
+msgstr "యూజర్ పేరు"
+
+#: contrib/auth/models.py:90
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr ""
+
+#: contrib/auth/models.py:91
+msgid "first name"
+msgstr "పేరు"
+
+#: contrib/auth/models.py:92
+msgid "last name"
+msgstr "ఇంటి పేరు"
+
+#: contrib/auth/models.py:93
+msgid "e-mail address"
+msgstr "ఈ మెయిల్  అడ్రస్"
+
+#: contrib/auth/models.py:94
+msgid "password"
+msgstr "పాస్ వర్డ్"
+
+#: contrib/auth/models.py:94
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr ""
+
+#: contrib/auth/models.py:95
+msgid "staff status"
+msgstr "ఉద్యోగస్తుల  స్థితి"
+
+#: contrib/auth/models.py:95
+msgid "Designates whether the user can log into this admin site."
+msgstr ""
+
+#: contrib/auth/models.py:96
+msgid "active"
+msgstr "చురుకు గా"
+
+#: contrib/auth/models.py:96
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+
+#: contrib/auth/models.py:97
+msgid "superuser status"
+msgstr ""
+
+#: contrib/auth/models.py:97
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr ""
+
+#: contrib/auth/models.py:98
+msgid "last login"
+msgstr "గత లాగిన్"
+
+#: contrib/auth/models.py:99
+msgid "date joined"
+msgstr "చేరిన తారీఖు"
+
+#: contrib/auth/models.py:101
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+
+#: contrib/auth/models.py:102
+msgid "user permissions"
+msgstr "యూజర్  అనుమతులు"
+
+#: contrib/auth/models.py:105
+msgid "user"
+msgstr "యూజర్"
+
+#: contrib/auth/models.py:106
+msgid "users"
+msgstr "యూజర్లు"
+
+#: contrib/auth/models.py:111
+msgid "Personal info"
+msgstr "పర్సనల్ సమాచారం  "
+
+#: contrib/auth/models.py:112
+msgid "Permissions"
+msgstr "అనుమతులు"
+
+#: contrib/auth/models.py:113
+msgid "Important dates"
+msgstr "ముఖ్యమైన తారీఖులు"
+
+#: contrib/auth/models.py:114
+msgid "Groups"
+msgstr "గుంపులు"
+
+#: contrib/auth/models.py:256
+msgid "message"
+msgstr "సమాచారం"
+
+#: contrib/auth/forms.py:52
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+
+#: contrib/auth/forms.py:61
+msgid "This account is inactive."
+msgstr ""
+
+#: contrib/contenttypes/models.py:20
+msgid "python model class name"
+msgstr "పైతాన్ మొడల్ క్లాస్  పేరు"
+
+#: contrib/contenttypes/models.py:23
+msgid "content type"
+msgstr ""
+
+#: contrib/contenttypes/models.py:24
+msgid "content types"
+msgstr ""
+
+#: contrib/sessions/models.py:51
+msgid "session key"
+msgstr ""
+
+#: contrib/sessions/models.py:52
+msgid "session data"
+msgstr ""
+
+#: contrib/sessions/models.py:53
+msgid "expire date"
+msgstr ""
+
+#: contrib/sessions/models.py:57
+msgid "session"
+msgstr ""
+
+#: contrib/sessions/models.py:58
+msgid "sessions"
+msgstr ""
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr ""
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "కనిపిచ్చే పేరు"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "సైట్"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "సైట్లు"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "సోమవారము"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "మంగళవారము"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "బుధవారము"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "గురువారము"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "శుక్రవారము"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "శనివారము"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "ఆదివారము"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "జాన్వరి "
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "ఫిబ్రవరి"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "మార్చి"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "ఎప్రిల్"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "మే"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "జూను"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "జులై"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "ఆగష్టు"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "సెప్టెంబర్"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "అక్టోబర్"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "నవంబర్"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "డిసెంబర్"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr "జాన్"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "ఫిబ్"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "మార్"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "ఎప్ర్"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "మే"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "జూన్"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "జుల్"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "ఆగ్"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "సెప్"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "అక్ట్"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "నవ్"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "డిస్"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "జాన్"
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "ఫిబ్"
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "ఆగ్"
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "సెప్"
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "అక్ట్"
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "నవ్"
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "డిస్"
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "సంవత్సరం"
+msgstr[1] "సంవత్సరాలు"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "నెల"
+msgstr[1] "నెలలు"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "వారం"
+msgstr[1] "వారాలు"
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "రోజు"
+msgstr[1] "రోజులు"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "గంటలు"
+msgstr[1] "గంట"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "నిముషం"
+msgstr[1] "నిముషాలు"
+
+#: utils/translation/trans_real.py:362
+msgid "DATE_FORMAT"
+msgstr ""
+
+#: utils/translation/trans_real.py:363
+msgid "DATETIME_FORMAT"
+msgstr ""
+
+#: utils/translation/trans_real.py:364
+msgid "TIME_FORMAT"
+msgstr ""
+
+#: utils/translation/trans_real.py:380
+msgid "YEAR_MONTH_FORMAT"
+msgstr ""
+
+#: utils/translation/trans_real.py:381
+msgid "MONTH_DAY_FORMAT"
+msgstr ""
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "ఆరబిక్"
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "బెంగాలి"
+
+#: conf/global_settings.py:41
+msgid "Czech"
+msgstr "క్జెఖ్"
+
+#: conf/global_settings.py:42
+msgid "Welsh"
+msgstr "వెల్శ్"
+
+#: conf/global_settings.py:43
+msgid "Danish"
+msgstr "డానిశ్"
+
+#: conf/global_settings.py:44
+msgid "German"
+msgstr "జెర్మన్"
+
+#: conf/global_settings.py:45
+msgid "Greek"
+msgstr "గ్రీక్"
+
+#: conf/global_settings.py:46
+msgid "English"
+msgstr "ఆంగ్లము"
+
+#: conf/global_settings.py:47
+msgid "Spanish"
+msgstr "స్పానిష్"
+
+#: conf/global_settings.py:48
+msgid "Argentinean Spanish"
+msgstr "అర్జంటీనా స్పానిష్"
+
+#: conf/global_settings.py:49
+msgid "Finnish"
+msgstr "ఫీన్నిష్"
+
+#: conf/global_settings.py:50
+msgid "French"
+msgstr "ఫ్రెంచ్"
+
+#: conf/global_settings.py:51
+msgid "Galician"
+msgstr "గలిసియన్"
+
+#: conf/global_settings.py:52
+msgid "Hungarian"
+msgstr "హంగారియన్"
+
+#: conf/global_settings.py:53
+msgid "Hebrew"
+msgstr "హెబ్రివ్"
+
+#: conf/global_settings.py:54
+msgid "Icelandic"
+msgstr "ఐస్ లాండిక్"
+
+#: conf/global_settings.py:55
+msgid "Italian"
+msgstr "ఇటాలియవ్"
+
+#: conf/global_settings.py:56
+msgid "Japanese"
+msgstr "జపనీస్"
+
+#: conf/global_settings.py:57
+msgid "Dutch"
+msgstr "డట్చ్"
+
+#: conf/global_settings.py:58
+msgid "Norwegian"
+msgstr "నార్వీజియన్"
+
+#: conf/global_settings.py:59
+msgid "Brazilian"
+msgstr "బ్రజీలియన్"
+
+#: conf/global_settings.py:60
+msgid "Romanian"
+msgstr "రొమానియన్"
+
+#: conf/global_settings.py:61
+msgid "Russian"
+msgstr "రస్సెన్"
+
+#: conf/global_settings.py:62
+msgid "Slovak"
+msgstr "స్లొవాక్"
+
+#: conf/global_settings.py:63
+msgid "Slovenian"
+msgstr "స్లొవానియన్"
+
+#: conf/global_settings.py:64
+msgid "Serbian"
+msgstr "సెర్బియన్"
+
+#: conf/global_settings.py:65
+msgid "Swedish"
+msgstr "స్వీడిష్"
+
+#: conf/global_settings.py:66
+msgid "Tamil"
+msgstr "తమిళ్"
+
+#: conf/global_settings.py:67
+msgid "Turkish"
+msgstr "టర్కిశ్"
+
+#: conf/global_settings.py:68
+msgid "Ukrainian"
+msgstr "యుక్రానియన్"
+
+#: conf/global_settings.py:69
+msgid "Simplified Chinese"
+msgstr "వాడుక చైనీస్"
+
+#: conf/global_settings.py:70
+msgid "Traditional Chinese"
+msgstr "గ్రాంధిక  చైనీస్"
+
+#: core/validators.py:63
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "ఈ విలువ   లో అక్షరాలు, అంకెలు ఇంకా అండర్ స్కోర్లు ఉందాలి"
+
+#: core/validators.py:67
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr "ఈ విలువ   లో అక్షరాలు, అంకెలు , అండర్ స్కోర్లు ,డాష్ లు లేక స్లాష్ లు ఉందాలి"
+
+#: core/validators.py:71
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "ఈ విలువ   లో అక్షరాలు, అంకెలు , అండర్ స్కోర్లు  లేక హైఫన్లు  ఉందాలి"
+
+#: core/validators.py:75
+msgid "Uppercase letters are not allowed here."
+msgstr ""
+
+#: core/validators.py:79
+msgid "Lowercase letters are not allowed here."
+msgstr ""
+
+#: core/validators.py:86
+msgid "Enter only digits separated by commas."
+msgstr "కామాల తో అంకెలు విడడీసి ఇవ్వండి "
+
+#: core/validators.py:98
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "కామాల తో విడతీసి  సరైన ఈ మెయిల్  అడ్రస్ ఇవ్వండి"
+
+#: core/validators.py:102
+msgid "Please enter a valid IP address."
+msgstr "దయచేసి సరైన ఐపి అడ్రస్ ఇవ్వండి "
+
+#: core/validators.py:106
+msgid "Empty values are not allowed here."
+msgstr "ఇక్కడ కాళీ విలువలు అనుమతించబడవు "
+
+#: core/validators.py:110
+msgid "Non-numeric characters aren't allowed here."
+msgstr "అంకెలు కాని చిహ్నాలు అనుమతించబడవు"
+
+#: core/validators.py:114
+msgid "This value can't be comprised solely of digits."
+msgstr "ఈ విలువ లో ఉట్టి మాత్రమే ఉందకూడడు"
+
+#: core/validators.py:119
+msgid "Enter a whole number."
+msgstr "పూర్ణ సంఖ్య ఇవ్వండి"
+
+#: core/validators.py:123
+msgid "Only alphabetical characters are allowed here."
+msgstr "అక్షరాలు  అయిన చిహ్నాలు మాత్రమే  అనుమతించబడతాయి "
+
+#: core/validators.py:138
+msgid "Year must be 1900 or later."
+msgstr "సంవత్సరము 1900 లేక దాని తరువాత అయ్యి ఉందాలి "
+
+#: core/validators.py:142
+#, python-format
+msgid "Invalid date: %s."
+msgstr "సరికాని తారీఖు : %s."
+
+#: core/validators.py:146 db/models/fields/__init__.py:415
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr ""
+
+#: core/validators.py:151
+msgid "Enter a valid time in HH:MM format."
+msgstr ""
+
+#: core/validators.py:155 db/models/fields/__init__.py:477
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr ""
+
+#: core/validators.py:160
+msgid "Enter a valid e-mail address."
+msgstr "సరైన ఈ మెయిల్  అడ్రస్ ఇవ్వండి"
+
+#: core/validators.py:172 core/validators.py:401 forms/__init__.py:661
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr ""
+
+#: core/validators.py:176
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+
+#: core/validators.py:183
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr ""
+
+#: core/validators.py:187
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+
+#: core/validators.py:195
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr ""
+
+#: core/validators.py:199
+msgid "A valid URL is required."
+msgstr "సరైన  URL కావాలి"
+
+#: core/validators.py:213
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"సరైన  HTML ఇవ్వండి .ప్రత్యేకమైన తప్పులు :\n"
+"%s"
+
+#: core/validators.py:220
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr ""
+
+#: core/validators.py:230
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "సరికాని  URL: %s"
+
+#: core/validators.py:234 core/validators.py:236
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr ""
+
+#: core/validators.py:242
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "దయచేసి  సరైన అగ్ర రాజ్య  సంక్షేపము చేసిన  రాష్ట్రము పేరు ఇవ్వండి"
+
+#: core/validators.py:256
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:263
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "ఈ ఫీల్డ్  '%s' ఫీల్డ్ కి సరి తూగాలి"
+
+#: core/validators.py:282
+msgid "Please enter something for at least one field."
+msgstr "దయచేసి ఏదో  ఒకటి  ఏదో ఒక ఫీల్డ్ కి ఇవ్వండి "
+
+#: core/validators.py:291 core/validators.py:302
+msgid "Please enter both fields or leave them both empty."
+msgstr "దయచేసి రెండు ఫీల్డ్లలు ఇవ్వండి  లేకపోతే రెండు కాళీ గా వదిలేయండి   "
+
+#: core/validators.py:309
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "%(field)s %(value)s ఐతే ఈ ఫీల్డ్  ఇవ్వాలి  "
+
+#: core/validators.py:321
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "%(field)s %(value)s అవ్వకపోతే ఈ ఫీల్డ్  ఇవ్వాలి "
+
+#: core/validators.py:340
+msgid "Duplicate values are not allowed."
+msgstr "నకలీ విలువలు ఇక్కడ అనుమతించబడవు"
+
+#: core/validators.py:363
+#, python-format
+msgid "This value must be a power of %s."
+msgstr ""
+
+#: core/validators.py:374
+msgid "Please enter a valid decimal number."
+msgstr ""
+
+#: core/validators.py:378
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural "Please enter a valid decimal number with at most %s total digits."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:381
+#, python-format
+msgid "Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural "Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:384
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural "Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:394
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr ""
+
+#: core/validators.py:395
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr ""
+
+#: core/validators.py:412
+msgid "The format for this field is wrong."
+msgstr "ఈ ఫీల్డ్  ఫోర్మాట్ తప్పు"
+
+#: core/validators.py:427
+msgid "This field is invalid."
+msgstr "ఈ ఫీల్డ్ సరి కానిది"
+
+#: core/validators.py:463
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "%s నించి  ఏమి  రాబట్టలేము"
+
+#: core/validators.py:466
+#, python-format
+msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+
+#: core/validators.py:499
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:503
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:508
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+
+#: core/validators.py:513
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+
+#: core/validators.py:517
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:522
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "%(verbose_name)s జయప్రదంగా తయారయింది"
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "%(verbose_name)s జయప్రదంగా  @@"
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "%(verbose_name)s తీసివేయబడినది"
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(field)s లో %(object)s తో  %(type)s  ఉన్నాయి"
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s తో %(fieldname)s ముందే ఉన్నాయి ."
+
+#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:551 db/models/fields/__init__.py:562
+#: forms/__init__.py:346
+msgid "This field is required."
+msgstr "ఈ ఫీల్డ్ అవసరము"
+
+#: db/models/fields/__init__.py:340
+msgid "This value must be an integer."
+msgstr "ఈ  విలువ  లో  ఉందాలి"
+
+#: db/models/fields/__init__.py:372
+msgid "This value must be either True or False."
+msgstr "ఈ  విలువ  తప్పైన ఒప్పైన  ఉందాలి"
+
+#: db/models/fields/__init__.py:388
+msgid "This field cannot be null."
+msgstr "ఈ ఫీల్డ్ కాళీగా ఉందకూడడు      "
+
+#: db/models/fields/__init__.py:571
+msgid "Enter a valid filename."
+msgstr "దయచేసి సరైన దస్త్రం పేరు ఇవ్వండి."
+
+#: db/models/fields/related.py:51
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "దయచేసి సరైన %sఇవ్వండి."
+
+#: db/models/fields/related.py:618
+msgid "Separate multiple IDs with commas."
+msgstr "గుంపు    గా ఉన్న ఐడిల ను కామా తో విడడీయంది"
+
+#: db/models/fields/related.py:620
+msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "\"Control\" కాని  \"Command\" మాక్ లో  నొక్కి ఉంచండి  , ఒకటి కన్న ఎక్కువ ఎన్నుకోవటానికి"
+
+#: db/models/fields/related.py:664
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural "Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "దయచేసి సరైన  %(self)s ఐడిలు ఇవ్వండి.  "
+msgstr[1] ""
+
+#: forms/__init__.py:381
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "మీరు  ఇచ్చిన టెక్స్ట %s ఆక్షరము కన్న తక్కువ ఉందాలి"
+msgstr[1] "మీరు  ఇచ్చిన టెక్స్ట %s ఆక్షరములు కన్న తక్కువ ఉందాలి"
+
+#: forms/__init__.py:386
+msgid "Line breaks are not allowed here."
+msgstr "లైన్  బ్రేక్స్  కి ఇక్కడ  ఆనుమతి లేదు"
+
+#: forms/__init__.py:487 forms/__init__.py:560 forms/__init__.py:599
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "సరైనది ఎంచుకోండి;  %(choices)s లో  '%(data)s' లేవు  "
+
+#: forms/__init__.py:663
+msgid "The submitted file is empty."
+msgstr "మీరు సమర్పించిన  ఫైల్ కాళీగా ఉంది "
+
+#: forms/__init__.py:719
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr " -32,768 ఇంకా  32,767 మధ్యలో  ఒక    ఆంకె ఇవ్వండి"
+
+#: forms/__init__.py:729
+msgid "Enter a positive number."
+msgstr "ఒక    ధన సంఖ్య ఇవ్వండి"
+
+#: forms/__init__.py:739
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "0 ఇంకా  32,767 మధ్యలో  ఒక    పూర్ ఇవ్వండి"
+
+#: template/defaultfilters.py:401
+msgid "yes,no,maybe"
+msgstr "అవును, కాదు , ఏమొ"
+
diff --git a/webapp/django/conf/locale/te/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/te/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..b8df70d
--- /dev/null
+++ b/webapp/django/conf/locale/te/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/te/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/te/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..16f5f9f
--- /dev/null
+++ b/webapp/django/conf/locale/te/LC_MESSAGES/djangojs.po
@@ -0,0 +1,110 @@
+# translation of djangojs.po to Telugu
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# pavithran <pavithran.s@gmail.com>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-12-09 11:51+0100\n"
+"PO-Revision-Date: 2007-03-06 16:08+0530\n"
+"Last-Translator: pavithran <pavithran.s@gmail.com>\n"
+"Language-Team: Telugu <indlinux-telugu@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "ఆందుబాతులోఉన్న %s "
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "అన్నీ ఎన్నుకోండి"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "ఙత చేయి"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "తీసివేయండి"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "ఎన్నుకున్న %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "మీ ఇష్టాలు ఎన్నుకోండి"
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "అన్ని తీసివేయు"
+
+#: contrib/admin/media/js/dateparse.js:26
+#: contrib/admin/media/js/calendar.js:24
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr "ఙాన్వరి ఫిబ్రవరి మార్చి ఎప్రిల్ మే ఙూను ఙులై ఆగష్టు సెప్టెంబర్ అక్టోబర్ నవంబర్ డిసెంబర్"
+
+#: contrib/admin/media/js/dateparse.js:27
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "ఆదివారము సోమవారము మంగళవారము బుధవారము గురువారము శుక్రవారము శనివారము"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "ఆ సో మం భు గు శు శ"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "ఇప్పుడు"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "గడియారము"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "ఒక సమయము ఎన్నుకోండి"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "ఆర్ధరాత్రి"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "6"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "మధ్యాహ్నము"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "రద్దు చేయు"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "ఈనాడు"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "కాలెండర్"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "నిన్న"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "రేపు"
+
diff --git a/webapp/django/conf/locale/tr/LC_MESSAGES/django.mo b/webapp/django/conf/locale/tr/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..bb3b1af
--- /dev/null
+++ b/webapp/django/conf/locale/tr/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/tr/LC_MESSAGES/django.po b/webapp/django/conf/locale/tr/LC_MESSAGES/django.po
new file mode 100644
index 0000000..224cc7f
--- /dev/null
+++ b/webapp/django/conf/locale/tr/LC_MESSAGES/django.po
@@ -0,0 +1,2473 @@
+# translation of django.po to Turkish
+# This file is distributed under the same license as the Django package.
+# 
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-03-14 01:38+0200\n"
+"PO-Revision-Date: 2008-07-02 23:37+0200\n"
+"Last-Translator: Can Burak Çilingir <canburak@cs.bilgi.edu.tr>\n"
+"Language-Team: Turkish <bahadir@pardus.org.tr>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: oldforms/__init__.py:357 db/models/fields/__init__.py:116
+#: db/models/fields/__init__.py:273 db/models/fields/__init__.py:609
+#: db/models/fields/__init__.py:620 newforms/models.py:177
+#: newforms/fields.py:78 newforms/fields.py:374 newforms/fields.py:450
+#: newforms/fields.py:461
+msgid "This field is required."
+msgstr "Bu alan gerekli."
+
+#: oldforms/__init__.py:392
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Metnin %s karakterden az olmasına dikkat edin."
+msgstr[1] "Metnin %s karakterden az olmasına dikkat edin."
+
+#: oldforms/__init__.py:397
+msgid "Line breaks are not allowed here."
+msgstr "Burada birden fazla satır olamaz."
+
+#: oldforms/__init__.py:498 oldforms/__init__.py:571 oldforms/__init__.py:610
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr ""
+"Geçerli bir seçimde bulunun; %(choices)s değerleri içinde '%(data)s' yok."
+
+#: oldforms/__init__.py:577 newforms/widgets.py:170
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "Bilinmiyor"
+
+#: oldforms/__init__.py:577 newforms/widgets.py:170
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Evet"
+
+#: oldforms/__init__.py:577 newforms/widgets.py:170
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "Hayır"
+
+#: oldforms/__init__.py:672 core/validators.py:174 core/validators.py:445
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "Dosya gönderilmedi. Formdaki kodlama türünü kontrol edin."
+
+#: oldforms/__init__.py:674
+msgid "The submitted file is empty."
+msgstr "Gönderilen dosya boş."
+
+#: oldforms/__init__.py:730
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "-32,768 ve 32,767 arası bir sayı girin."
+
+#: oldforms/__init__.py:740
+msgid "Enter a positive number."
+msgstr "Pozitif tamsayı girin."
+
+#: oldforms/__init__.py:750
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "0 ve 32,767 arası bir sayı girin."
+
+#: db/models/manipulators.py:307
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(type)s ve %(field)s değerine sahip %(object)s kaydı zaten var."
+
+#: db/models/manipulators.py:308 contrib/admin/views/main.py:335
+#: contrib/admin/views/main.py:337 contrib/admin/views/main.py:339
+msgid "and"
+msgstr "ve"
+
+#: db/models/fields/__init__.py:42
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(fieldname)s için %(optname)s değeri zaten seçilmiş."
+
+#: db/models/fields/__init__.py:366
+msgid "This value must be an integer."
+msgstr "Bu değer tamsayı olmalı."
+
+#: db/models/fields/__init__.py:401
+msgid "This value must be either True or False."
+msgstr "Bu değer True ya da False olabilir."
+
+#: db/models/fields/__init__.py:422
+msgid "This field cannot be null."
+msgstr "Bu alan boş bırakılamaz."
+
+#: db/models/fields/__init__.py:456 core/validators.py:148
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "YYYY-AA-GG formatında tarih girin."
+
+#: db/models/fields/__init__.py:525 core/validators.py:157
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "YYYY-AA-GG SS:DD formatında tarih girin."
+
+#: db/models/fields/__init__.py:629
+msgid "Enter a valid filename."
+msgstr "Geçerli bir dosya adı girin."
+
+#: db/models/fields/__init__.py:750
+msgid "This value must be either None, True or False."
+msgstr "Bu değer None, True ya da False olabilir."
+
+#: db/models/fields/related.py:53
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Lütfen geçerli bir %s girin."
+
+#: db/models/fields/related.py:642
+msgid "Separate multiple IDs with commas."
+msgstr "Birden fazla numarayı virgül ile ayırın."
+
+#: db/models/fields/related.py:644
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"\"Ctrl\" ve Mac'de \"Command\" tuşunu basılı tutarak birden fazla seçimde "
+"bulunabilirsiniz."
+
+#: db/models/fields/related.py:691
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+"Lütfen geçerli bir %(self)s numarası girin. %(value)r değeri geçersiz."
+msgstr[1] ""
+"Lütfen geçerli %(self)s numaraları girin. %(value)r değerleri geçersiz."
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "Arapça"
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "Bengali Dili"
+
+#: conf/global_settings.py:41
+msgid "Catalan"
+msgstr "Katalanca"
+
+#: conf/global_settings.py:42
+msgid "Czech"
+msgstr "Çekçe"
+
+#: conf/global_settings.py:43
+msgid "Welsh"
+msgstr "Galce"
+
+#: conf/global_settings.py:44
+msgid "Danish"
+msgstr "Danca"
+
+#: conf/global_settings.py:45
+msgid "German"
+msgstr "Almanca"
+
+#: conf/global_settings.py:46
+msgid "Greek"
+msgstr "Yunanca"
+
+#: conf/global_settings.py:47
+msgid "English"
+msgstr "İngilizce"
+
+#: conf/global_settings.py:48
+msgid "Spanish"
+msgstr "İspanyolca"
+
+#: conf/global_settings.py:49
+msgid "Argentinean Spanish"
+msgstr "Arjantin İspanyolcası"
+
+#: conf/global_settings.py:50
+msgid "Finnish"
+msgstr "Fince"
+
+#: conf/global_settings.py:51
+msgid "French"
+msgstr "Fransızca"
+
+#: conf/global_settings.py:52
+msgid "Galician"
+msgstr "Galler Dili"
+
+#: conf/global_settings.py:53
+msgid "Hungarian"
+msgstr "Macarca"
+
+#: conf/global_settings.py:54
+msgid "Hebrew"
+msgstr "İbranice"
+
+#: conf/global_settings.py:55
+msgid "Icelandic"
+msgstr "İzlanda dili"
+
+#: conf/global_settings.py:56
+msgid "Italian"
+msgstr "İtalyanca"
+
+#: conf/global_settings.py:57
+msgid "Japanese"
+msgstr "Japonca"
+
+#: conf/global_settings.py:58
+msgid "Kannada"
+msgstr "Kannada Dili"
+
+#: conf/global_settings.py:59
+msgid "Latvian"
+msgstr "Leton Dili"
+
+#: conf/global_settings.py:60
+msgid "Macedonian"
+msgstr "Makedonca"
+
+#: conf/global_settings.py:61
+msgid "Dutch"
+msgstr "Flamanca"
+
+#: conf/global_settings.py:62
+msgid "Norwegian"
+msgstr "Norveç Dili"
+
+#: conf/global_settings.py:63
+msgid "Polish"
+msgstr "Lehçe"
+
+#: conf/global_settings.py:64
+msgid "Brazilian"
+msgstr "Brezilya Dili"
+
+#: conf/global_settings.py:65
+msgid "Romanian"
+msgstr "Romence"
+
+#: conf/global_settings.py:66
+msgid "Russian"
+msgstr "Rusça"
+
+#: conf/global_settings.py:67
+msgid "Slovak"
+msgstr "Slovakça"
+
+#: conf/global_settings.py:68
+msgid "Slovenian"
+msgstr "Slovence"
+
+#: conf/global_settings.py:69
+msgid "Serbian"
+msgstr "Sırpça"
+
+#: conf/global_settings.py:70
+msgid "Swedish"
+msgstr "İsveççe"
+
+#: conf/global_settings.py:71
+msgid "Tamil"
+msgstr "Tamilce"
+
+#: conf/global_settings.py:72
+msgid "Telugu"
+msgstr "Telugu Dili"
+
+#: conf/global_settings.py:73
+msgid "Turkish"
+msgstr "Türkçe"
+
+#: conf/global_settings.py:74
+msgid "Ukrainian"
+msgstr "Ukraynaca"
+
+#: conf/global_settings.py:75
+msgid "Simplified Chinese"
+msgstr "Basiteştirilmiş Çince"
+
+#: conf/global_settings.py:76
+msgid "Traditional Chinese"
+msgstr "Gelenelsek Çince"
+
+#: core/validators.py:64
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Bu değer sadece karakter, rakam ve altçizgiden oluşabilir."
+
+#: core/validators.py:68
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Bu değer sadece harf, rakam, altçizgi, bölü ve ters bölüden oluşabilir."
+
+#: core/validators.py:72
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "Bu değer sadece harf, rakam, altçizgi veya çizgiden oluşabilir."
+
+#: core/validators.py:76
+msgid "Uppercase letters are not allowed here."
+msgstr "Burada büyük harf kullanılamaz."
+
+#: core/validators.py:80
+msgid "Lowercase letters are not allowed here."
+msgstr "Burada küçük harf kullanılamaz."
+
+#: core/validators.py:87
+msgid "Enter only digits separated by commas."
+msgstr "Sadece virgülle ayrılmış sayılar girin."
+
+#: core/validators.py:99
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Virgülle ayrılmış geçerli e-posta adresleri girin."
+
+#: core/validators.py:103
+msgid "Please enter a valid IP address."
+msgstr "Lütfen geçerli bir IP adresi girin."
+
+#: core/validators.py:107
+msgid "Empty values are not allowed here."
+msgstr "Burada boş değer kullanılamaz."
+
+#: core/validators.py:111
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Burada numerik olmayan karakterler kullanılamaz."
+
+#: core/validators.py:115
+msgid "This value can't be comprised solely of digits."
+msgstr "Bu alanda sadece rakam kullanılamaz."
+
+#: core/validators.py:120 newforms/fields.py:126
+msgid "Enter a whole number."
+msgstr "Sayı girin."
+
+#: core/validators.py:124
+msgid "Only alphabetical characters are allowed here."
+msgstr "Burada sadece alfabetik karakterler kullanılabilir."
+
+#: core/validators.py:139
+msgid "Year must be 1900 or later."
+msgstr "Yıl 1900 ya da sonrası olabilir."
+
+#: core/validators.py:143
+#, python-format
+msgid "Invalid date: %s"
+msgstr "Geçersiz tarih: %s"
+
+#: core/validators.py:153
+msgid "Enter a valid time in HH:MM format."
+msgstr "SS:DD formatında geçerli bir saat girin."
+
+#: core/validators.py:162 newforms/fields.py:269
+msgid "Enter a valid e-mail address."
+msgstr "Geçerli bir e-posta adresi girin."
+
+#: core/validators.py:178
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Geçerli bir resim girin. Gönderdiğiniz dosya resim değil, ya da bozuk bir "
+"dosya."
+
+#: core/validators.py:185
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "%s adresi geçerli bir resme işaret etmiyor."
+
+#: core/validators.py:189
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "Telefon numarası XXX-XXX-XXXX formatında olmalı. \"%s\" geçersiz."
+
+#: core/validators.py:197
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "%s adresi geçerli bir QuickTime dosyasına işaret etmiyor."
+
+#: core/validators.py:201
+msgid "A valid URL is required."
+msgstr "Geçerli bir URL gerekli."
+
+#: core/validators.py:215
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Metnin geçerli bir HTML kodu olması gerekir. Hatalar:\n"
+"%s"
+
+#: core/validators.py:222
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Geçersiz XML kodu: %s"
+
+#: core/validators.py:239
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Geçersiz adres: %s"
+
+#: core/validators.py:244 core/validators.py:246
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "%s kırık bir link."
+
+#: core/validators.py:252
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Geçerli bir şehir kodu girin."
+
+#: core/validators.py:266
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Söylediğinize dikkat edin! %s kelimesi burada kullanılamaz."
+msgstr[1] "Söylediğinize dikkat edin! %s kelimeleri burada kullanılamaz."
+
+#: core/validators.py:273
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Bu alan '%s' ile alanı ile uyuşmalı."
+
+#: core/validators.py:292
+msgid "Please enter something for at least one field."
+msgstr "Lütfen en az bir alana giriş yapın."
+
+#: core/validators.py:301 core/validators.py:312
+msgid "Please enter both fields or leave them both empty."
+msgstr "Lütfen tüm alanları doldurun ya da hepsini boş bırakın."
+
+#: core/validators.py:320
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Bu alan %(field)s alanı %(value)s değerine sahipse doldurulmalı."
+
+#: core/validators.py:333
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Bu alan %(field)s alanı %(value)s değerine sahip değilse doldurulmalı."
+
+#: core/validators.py:352
+msgid "Duplicate values are not allowed."
+msgstr "Tekrarlanan değerler kabul edilmez."
+
+#: core/validators.py:367
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "Bu değer %(lower)s ve %(upper)s arasında olabilir."
+
+#: core/validators.py:369
+#, python-format
+msgid "This value must be at least %s."
+msgstr "Bu değer en az %s olabilir."
+
+#: core/validators.py:371
+#, python-format
+msgid "This value must be no more than %s."
+msgstr ""
+
+#: core/validators.py:407
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Bu değer %s ya da kuvvetleri olabilir."
+
+#: core/validators.py:418
+msgid "Please enter a valid decimal number."
+msgstr "Lütfen geçerli bir ondalık sayı girin."
+
+#: core/validators.py:422
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Lütfen en fazla %s basamaklı bir ondalık sayı girin."
+msgstr[1] "Lütfen en fazla %s basamaklı bir ondalık sayı girin."
+
+#: core/validators.py:425
+#, python-format
+msgid ""
+"Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural ""
+"Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] "Lütfen tamsayı kısmı en fazla %s basamaklı bir ondalık sayı girin."
+msgstr[1] "Lütfen tamsayı kısmı en fazla %s basamaklı bir ondalık sayı girin."
+
+#: core/validators.py:428
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] ""
+"Lütfen ondalıklı kısmı en fazla %s basamaklı bir ondalık sayı girin."
+msgstr[1] ""
+"Lütfen ondalıklı kısmı en fazla %s basamaklı bir ondalık sayı girin."
+
+#: core/validators.py:438
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Gönderdiğiniz dosyanın en az %s byte uzunlukta olduğundan emin olun."
+
+#: core/validators.py:439
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Gönderdiğiniz dosyanın en fazl %s byte uzunlukta olduğundan emin olun."
+
+#: core/validators.py:456
+msgid "The format for this field is wrong."
+msgstr "Bu alandaki veri formatı hatalı."
+
+#: core/validators.py:471
+msgid "This field is invalid."
+msgstr "Alan geçersiz."
+
+#: core/validators.py:507
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "%s içinden hiçbirşey aktarılamıyor."
+
+#: core/validators.py:510
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "%(url)s adresi geçersiz içerik türü (%(contenttype)s) gönderdi."
+
+#: core/validators.py:543
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Lütfen %(line)s. satırdaki kapatılmayan %(tag)s etiketini kapatın. (Satır, "
+"\"%(start)s\" ile başlıyor.)"
+
+#: core/validators.py:547
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"%(line)s. satırda başlayan bazı kelimeler içerik olarak kabul edilmiyor. "
+"(Satır, \"%(start)s\" ile başlıyor.)"
+
+#: core/validators.py:552
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"%(line)s. satırdaki \"%(attr)s\" özelliği geçersiz. (Satır, \"%(start)s\" "
+"ile başlıyor.)"
+
+#: core/validators.py:557
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"%(line)s. satırdaki \"<%(tag)s>\" etiketi geçersiz. (Satır, \"%(start)s\" "
+"ile başlıyor.)"
+
+#: core/validators.py:561
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"%(line)s. satırdaki bir etiket eksik ya da eklenmesi gereken özellikleri "
+"var. (Satır, \"%(start)s\" ile başlıyor.)"
+
+#: core/validators.py:566
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"%(line)s. satırdaki \"%(attr)s\" özelliği geçersiz bir değere sahip. (Satır, "
+"\"%(start)s\" ile başlıyor.)"
+
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "%(verbose_name)s başarıyla yaratıldı."
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "%(verbose_name)s başarıyla güncellendi."
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "%(verbose_name)s silindi."
+
+#: newforms/models.py:164 newforms/fields.py:360
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "Geçerli bir seçimde bulunun; seçiminiz mevcut değerlerden birisi değil."
+
+#: newforms/models.py:181 newforms/fields.py:378 newforms/fields.py:454
+msgid "Enter a list of values."
+msgstr "Değer listesi giriniz."
+
+#: newforms/models.py:187 newforms/fields.py:387
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "Geçerli bir seçimde bulunun; %s mevcut değerlerden biri değil."
+
+#: newforms/fields.py:101 newforms/fields.py:254
+#, python-format
+msgid "Ensure this value has at most %d characters."
+msgstr "Bu değer en fazla %d karakter olabilir."
+
+#: newforms/fields.py:103 newforms/fields.py:256
+#, python-format
+msgid "Ensure this value has at least %d characters."
+msgstr "Bu değer en az %d arakter olabilir."
+
+#: newforms/fields.py:128
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr ""
+
+#: newforms/fields.py:130
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr ""
+
+#: newforms/fields.py:163
+msgid "Enter a valid date."
+msgstr "Geçerli bir tarih girin."
+
+#: newforms/fields.py:190
+msgid "Enter a valid time."
+msgstr "Geçerli bir zaman giriniz."
+
+#: newforms/fields.py:226
+msgid "Enter a valid date/time."
+msgstr "Geçerli bir tarih/zaman giriniz."
+
+#: newforms/fields.py:240
+msgid "Enter a valid value."
+msgstr "Geçerli bir değer girin."
+
+#: newforms/fields.py:287 newforms/fields.py:309
+msgid "Enter a valid URL."
+msgstr "Geçerli bir URL girin."
+
+#: newforms/fields.py:311
+msgid "This URL appears to be a broken link."
+msgstr "Bu URL kırık bir link gibi duruyor."
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "th"
+msgstr "."
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "st"
+msgstr "."
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "nd"
+msgstr "."
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "rd"
+msgstr "."
+
+#: contrib/humanize/templatetags/humanize.py:47
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f milyon"
+msgstr[1] "%(value).1f milyon"
+
+#: contrib/humanize/templatetags/humanize.py:50
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f milyar"
+msgstr[1] "%(value).1f milyar"
+
+#: contrib/humanize/templatetags/humanize.py:53
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f trilyon"
+msgstr[1] "%(value).1f trilyon"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "one"
+msgstr "bir"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "two"
+msgstr "iki"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "three"
+msgstr "üç"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "four"
+msgstr "dört"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "five"
+msgstr "beş"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "six"
+msgstr "altı"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "seven"
+msgstr "yedi"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "eight"
+msgstr "sekiz"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "nine"
+msgstr "dokuz"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "eski adres"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Buraya tam dosya yolu, alan adı kullanılmadan yazılmalı. Örnek: '/events/"
+"search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "yeni adres"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Buraya tam dosya yolu (yukarıdaki gibi), ya da 'http://' ile başlayan tam "
+"adres yazılmalı."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "yönlendirme"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "yönlendirmeler"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "nesne no"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "başlık"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "yorum"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "reyting 1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "reyting 2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "reyting 3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "reyting 4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "reyting 5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "reyting 6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "reyting 7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "reyting 8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "geçerli reyting"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "gönderim tarihi/saati"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "görünürlük"
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:304
+msgid "IP address"
+msgstr "IP adresi"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "silinmiş"
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Yorum uygunsuz ise bu işareti kaldırın. \"Yorum silindi\" uyarısı "
+"görüntülenecek."
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "yorumlar"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "İçerik nesnesi"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"%(date)s tarihinde %(user)s göndermiş:\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "isim"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "ip adresi"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "yönetici onayı"
+
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "serbest yorum"
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "serbest yorumlar"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "puan"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "puan tarihi"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "karma puanı"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "karma puanları"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(user)s tarafından %(score)d puan"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Bu yorum %(user)s tarafından işaretlenmiş:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "işaretleme tarihi"
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "kullanıcı işareti"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "kullanıcı işaretleri"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "%r tarafından işaret"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "silme tarihi"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "yönetici tarafından silinme"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "yönetici tarafından silinme"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "%s tarafından silme işlemi"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Kayıtsız kullanıcılar oy veremez"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "Geçersiz yorum numarası"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "Kendinize oy veremezsiniz"
+
+#: contrib/comments/views/comments.py:27
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr "Reyting gerekli, çünkü en az bir reyting tanımladınız."
+
+#: contrib/comments/views/comments.py:111
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Bu yorum, %(count)s yorumdan daha az gönderide bulunmuş bir kullanıcıya "
+"ait:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Bu yorum, %(count)s yorumdan daha az gönderide bulunmuş bir kullanıcıya "
+"ait:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:116
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Bu yorum kusurlu bir kullanıcı tarafından gönderildi:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:188
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Sadece POST yapılabilir"
+
+#: contrib/comments/views/comments.py:192
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Bir ya da daha fazla gerekli alan doldurulmadı"
+
+#: contrib/comments/views/comments.py:196
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr ""
+"Birisi yorum gönderme formunu kötüye kullanmaya çalıştı (güvenlik ihlali)"
+
+#: contrib/comments/views/comments.py:206
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"Bu yorumun geçersiz bir 'hedef' parametresi var -- nesne narası geçersiz"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "Yorum görüntülememe mi yoksa gönderme amaçlı mı belirsiz"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "Kullanıcı:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+msgid "Log out"
+msgstr "Çık"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Parola:"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "Parolanızı mı unuttunuz?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Reytingler"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Gerekli"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Opsiyonel"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Resim gönder"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Yorum:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "Yorumu görüntüle"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "İsminiz:"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "alan adı"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "görülen isim"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "site"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "siteler"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>%s nesnesine göre:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169
+msgid "All"
+msgstr "Tümü"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "Herhangi bir tarih"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "Bugün"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "7 gün içinde"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "Bu ay"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "Bu yıl"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "işlem zamanı"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "nesne no"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "nesne kodu"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "işlem adı"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "mesajı değiştir"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "girişi kaydet"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "girişleri kaydet"
+
+#: contrib/admin/templatetags/admin_list.py:247
+msgid "All dates"
+msgstr "Tüm tarihler"
+
+#: contrib/admin/views/auth.py:19 contrib/admin/views/main.py:257
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "\"%(obj)s\" isimli %(name)s eklendi."
+
+#: contrib/admin/views/auth.py:24 contrib/admin/views/main.py:261
+#: contrib/admin/views/main.py:347
+msgid "You may edit it again below."
+msgstr "Tekrar düzenleyebilirsiniz."
+
+#: contrib/admin/views/auth.py:30
+msgid "Add user"
+msgstr "Kullanıcı ekle"
+
+#: contrib/admin/views/auth.py:57
+msgid "Password changed successfully."
+msgstr "Parola başarı ile değiştirildi."
+
+#: contrib/admin/views/auth.py:64
+#, python-format
+msgid "Change password: %s"
+msgstr "Parola değiştir: %s"
+
+#: contrib/admin/views/main.py:223
+msgid "Site administration"
+msgstr "Site yönetimi"
+
+#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356
+#, python-format
+msgid "You may add another %s below."
+msgstr "Yeni bir %s ekleyebilirsiniz."
+
+#: contrib/admin/views/main.py:289
+#, python-format
+msgid "Add %s"
+msgstr "%s ekle"
+
+#: contrib/admin/views/main.py:335
+#, python-format
+msgid "Added %s."
+msgstr "%s eklendi."
+
+#: contrib/admin/views/main.py:337
+#, python-format
+msgid "Changed %s."
+msgstr "%s değiştirildi."
+
+#: contrib/admin/views/main.py:339
+#, python-format
+msgid "Deleted %s."
+msgstr "%s silindi."
+
+#: contrib/admin/views/main.py:342
+msgid "No fields changed."
+msgstr "Hiçbir alan değiştirilmedi."
+
+#: contrib/admin/views/main.py:345
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "\"%(obj)s\" isimli %(name)s değiştirildi."
+
+#: contrib/admin/views/main.py:353
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"\"%(obj)s\" isimli %(name)s eklendi. Aşağıda tekrar düzenleyebilirsiniz."
+
+#: contrib/admin/views/main.py:391
+#, python-format
+msgid "Change %s"
+msgstr "%s değiştir"
+
+#: contrib/admin/views/main.py:476
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "%(name)s içinde bir ya da daha fazla %(fieldname)s: %(obj)s"
+
+#: contrib/admin/views/main.py:481
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "%(name)s içinde bir ya da daha fazla %(fieldname)s:"
+
+#: contrib/admin/views/main.py:514
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "\"%(obj)s\" isimli %(name)s silindi."
+
+#: contrib/admin/views/main.py:517
+msgid "Are you sure?"
+msgstr "Emin misiniz?"
+
+#: contrib/admin/views/main.py:539
+#, python-format
+msgid "Change history: %s"
+msgstr "%s için değişiklik geçmişi:"
+
+#: contrib/admin/views/main.py:573
+#, python-format
+msgid "Select %s"
+msgstr "%s seç"
+
+#: contrib/admin/views/main.py:573
+#, python-format
+msgid "Select %s to change"
+msgstr "Değiştirilecek %s nesnesini seçin"
+
+#: contrib/admin/views/main.py:768
+msgid "Database error"
+msgstr "Veritabanı hatası"
+
+#: contrib/admin/views/decorators.py:10 contrib/auth/forms.py:60
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Lütfen geçerli bir kullanıcı adı ve parola girin. Tüm alanlar büyük/küçük "
+"harf duyarlıdır."
+
+#: contrib/admin/views/decorators.py:24
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Giriş yap"
+
+#: contrib/admin/views/decorators.py:62
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Oturumunuzun süresi geçti. Lütfen tekrar giriş yapın. Endişe etmeyin, "
+"gönderiniz kayıt edildi."
+
+#: contrib/admin/views/decorators.py:69
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Görünüşe göre tarayıcınız çerezleri kabul etmiyor. Çerez kullanımını aktif "
+"hale getirin ve sayfayı yeniden yükleyin."
+
+#: contrib/admin/views/decorators.py:83
+msgid "Usernames cannot contain the '@' character."
+msgstr "Kullanıcı isminde '@' karakteri bulunamaz."
+
+#: contrib/admin/views/decorators.py:85
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "E-posta adresiniz kullanıcı adınız değil. '%s' kullanın."
+
+#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48
+#: contrib/admin/views/doc.py:50
+msgid "tag:"
+msgstr "etiket:"
+
+#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79
+#: contrib/admin/views/doc.py:81
+msgid "filter:"
+msgstr "filtre:"
+
+#: contrib/admin/views/doc.py:135 contrib/admin/views/doc.py:137
+#: contrib/admin/views/doc.py:139
+msgid "view:"
+msgstr "view:"
+
+#: contrib/admin/views/doc.py:164
+#, python-format
+msgid "App %r not found"
+msgstr "%r uygulaması bulunamadı"
+
+#: contrib/admin/views/doc.py:171
+#, python-format
+msgid "Model %(name)r not found in app %(label)r"
+msgstr "%(name)r modeli %(label)r uygulamasında bulunamadı"
+
+#: contrib/admin/views/doc.py:183
+#, python-format
+msgid "the related `%(label)s.%(type)s` object"
+msgstr "ilgili `%(label)s.%(type)s` nesnesi"
+
+#: contrib/admin/views/doc.py:183 contrib/admin/views/doc.py:205
+#: contrib/admin/views/doc.py:219 contrib/admin/views/doc.py:224
+msgid "model:"
+msgstr "model:"
+
+#: contrib/admin/views/doc.py:214
+#, python-format
+msgid "related `%(label)s.%(name)s` objects"
+msgstr "ilgili `%(label)s.%(name)s` nesneleri"
+
+#: contrib/admin/views/doc.py:219
+#, python-format
+msgid "all %s"
+msgstr "tüm %s"
+
+#: contrib/admin/views/doc.py:224
+#, python-format
+msgid "number of %s"
+msgstr "%s sayısı"
+
+#: contrib/admin/views/doc.py:229
+#, python-format
+msgid "Fields on %s objects"
+msgstr "%s nesnesindeki alanlar"
+
+#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:301
+#: contrib/admin/views/doc.py:303 contrib/admin/views/doc.py:309
+#: contrib/admin/views/doc.py:310 contrib/admin/views/doc.py:312
+msgid "Integer"
+msgstr "Tamsayı"
+
+#: contrib/admin/views/doc.py:292
+msgid "Boolean (Either True or False)"
+msgstr "Mantıksal (True ya da False)"
+
+#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:311
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "Karakter disizi (en fazla %(maxlength)s)"
+
+#: contrib/admin/views/doc.py:294
+msgid "Comma-separated integers"
+msgstr "Virgülle ayrılmış tamsayılar"
+
+#: contrib/admin/views/doc.py:295
+msgid "Date (without time)"
+msgstr "Tarih (saat yok)"
+
+#: contrib/admin/views/doc.py:296
+msgid "Date (with time)"
+msgstr "Tarih (saat var)"
+
+#: contrib/admin/views/doc.py:297
+msgid "E-mail address"
+msgstr "E-posta adresi"
+
+#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:299
+#: contrib/admin/views/doc.py:302
+msgid "File path"
+msgstr "Dosya yolu"
+
+#: contrib/admin/views/doc.py:300
+msgid "Decimal number"
+msgstr "Ondalık sayı:"
+
+#: contrib/admin/views/doc.py:306
+msgid "Boolean (Either True, False or None)"
+msgstr "Mantıksal (True, False, ya da None)"
+
+#: contrib/admin/views/doc.py:307
+msgid "Relation to parent model"
+msgstr "Ana modelle ilişki"
+
+#: contrib/admin/views/doc.py:308
+msgid "Phone number"
+msgstr "Telefon numarası"
+
+#: contrib/admin/views/doc.py:313
+msgid "Text"
+msgstr "Metin"
+
+#: contrib/admin/views/doc.py:314
+msgid "Time"
+msgstr "Saat"
+
+#: contrib/admin/views/doc.py:315 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:316
+msgid "U.S. state (two uppercase letters)"
+msgstr "Şehir Kodu (iki karakter)"
+
+#: contrib/admin/views/doc.py:317
+msgid "XML text"
+msgstr "XML metni"
+
+#: contrib/admin/views/doc.py:343
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s geçerli vir adres kalıbı değil"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Şimdiki:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Değiştir:"
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Tarih:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Saat:"
+
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Dokümantasyon"
+
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin/auth/user/change_password.html:15
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+msgid "Change password"
+msgstr "Parola değiştir"
+
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/auth/user/change_password.html:12
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Anasayfa"
+
+#: contrib/admin/templates/admin/change_list.html:12
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s Ekle"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " %(filter_title)s nesnesine göre "
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "History"
+msgstr "Geçmiş"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Tarih/saat"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Kullanıcı"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "İşlem"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "DATE_WITH_TIME_FULL"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Bu nesnenin işlem geçmişi yok. Muhtemelen yönetici sayfası dışında bir "
+"yerden eklendi."
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Git"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 sonuç"
+msgstr[1] "%(counter)s sonuç"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "toplam %(full_result_count)s"
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Tümünü göster"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django site yöneticisi"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django yönetimi"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Sunucu hatası"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Sunucu hatası (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Sunucu Hatası <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Bir hata oluştu. Hata, e-psota ile site yöneticisine bildirildi ve kısa süre "
+"içinde çözülecktir. Sabrınız için teşekkürler."
+
+#: contrib/admin/templates/admin/invalid_setup.html:8
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"Veritabanı kurulumu ile ilgili bir problem var. İlgili veritabanı "
+"tablolarının kurulu olduğundan ve veritabanının ilgili kullanıcı tarafından "
+"okunabilir olduğundan emin olun."
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "%(name)s uygulamasındaki modeller."
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "Ekle"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Değiştir"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "İşlem yapmaya yetkiniz yok."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Geçmiş İşlemler"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "İşlemlerim"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Hiç yok"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Sayfa bulunamadı"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Üzgünüm, aradığınız sayfa bulunamadı."
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "Filtrele"
+
+#: contrib/admin/templates/admin/change_form.html:22
+msgid "View on site"
+msgstr "Sitede görüntüle"
+
+#: contrib/admin/templates/admin/change_form.html:32
+#: contrib/admin/templates/admin/auth/user/change_password.html:24
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Lütfen aşağıdaki hatayı düzeltin."
+msgstr[1] "Lütfen aşağıdaki hataları düzeltin."
+
+#: contrib/admin/templates/admin/change_form.html:50
+msgid "Ordering"
+msgstr "Sıralama:"
+
+#: contrib/admin/templates/admin/change_form.html:53
+msgid "Order:"
+msgstr "Sıra:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Sil"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+"following types of objects:"
+msgstr ""
+"'%(escaped_object)s' isimli %(object_name)s nesnesini silmek, bağlantılı "
+"nesnelerin silinmesini gerektiriyor, ancak aşağıdaki nesneleri silme "
+"yetkiniz yok."
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"\"%(escaped_object)s\" isimli %(object_name)s nesnesini silmek "
+"istediğinizdenemin misiniz? Aşağıdaki bağlantılı öğeler silinecek:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Evet, eminim"
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "Hoşgeldin,"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Yeni olarak kaydet"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Kaydet ve yeni bir tane ekle"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Kaydet ve düzenlemeye devam et"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Kaydet"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:28
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "<strong>%(username)s</strong> için yeni parola girin."
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:34
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+msgid "Password"
+msgstr "Parola"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+msgid "Password (again)"
+msgstr "Parola (tekrar)"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+msgid "Enter the same password as above, for verification."
+msgstr "Onaylamak için, yukarıdaki parolanın aynısını girin."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr ""
+"Önce bir kullanıcı adı ve parola girin. Daha sonra daha fazla bilgi "
+"girebilirsiniz."
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "Kullanıcı"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Parola değişimi"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Parola değişimi başarılı"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Parolanız değiştirildi."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Parolayı sıfırla"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"Parolanızı mı unuttunuz? E-posta adresinizi aşağıya girin, parolanızı "
+"sıfırlayalım ve e-posta adresinize gönderelim."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "E-posta adresi:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Parolamı sıfırla"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Web sitesinde zaman geçirdiğiniz için teşekkür ederiz."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Tekrar giriş yap"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Parola sıfırlandı."
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"Yeni şifreniz, e-posta adresinize gönderildi, kısa süre içinde size "
+"ulaşacaktır."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Güvenliğiniz için, lütfen eski parolanızı girin, sonra da yeni şifrenizi iki "
+"kere girin ve böylece doğru yazdığınızdan emin olun."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Eski parola:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Yeni parola:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Parolayı onayla:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Parolamı değiştir"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Bu e-postayı aldınız çünkü "
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr ""
+"%(site_name)s adresindeki kullanıcı hesabınız için parola sıfırlama "
+"talebinde bulundunuz."
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Yeni parolanız: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Parolanızı değiştirmek için bu adrese gidebilirsiniz:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Unutma ihtimaline karşı, kullanıcı adınız:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Teşekkürler!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s Ekibi"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Kısayollar"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "Doküman kısayolları"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">Kısayolları kullanabilmek için, bağlantıyı tarayıcınızdaki "
+"araç çubuğuna sürükleyin, ya da sağ tıklayıp sık kullanılan adresler "
+"listenize ekleyin. Bazı kısayollar, uygulamayı çalıştıran sunucu ile aynı "
+"adreste bulunan istemciler tarafından kullanılabilir.</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Bu sayfa için dokümantasyon"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr "Sizi, bu sayfayı üreten betiğin dokümantasyonuna yönlendirir."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Nesne numarasını göster"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Tek bir nesneyi temsil eden sayfaların içerik türünü ve numarasını gösterir."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Nesneyi düzenle (aynı pencerede)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "Tek bir nesneyi temsil eden sayfaların yönetim sayfasını gösterir."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Nesneyi düzenle (yeni pencerede)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "Yukarıdaki gibi, ancak yönetim sayfasını yeni bir pencerede açar."
+
+#: contrib/contenttypes/models.py:36
+msgid "python model class name"
+msgstr "python model sınıfı"
+
+#: contrib/contenttypes/models.py:39
+msgid "content type"
+msgstr "içerik türü"
+
+#: contrib/contenttypes/models.py:40
+msgid "content types"
+msgstr "içerik türleri"
+
+#: contrib/auth/views.py:39
+msgid "Logged out"
+msgstr "Çıkış yapıldı"
+
+#: contrib/auth/models.py:38 contrib/auth/models.py:57
+msgid "name"
+msgstr "isim"
+
+#: contrib/auth/models.py:40
+msgid "codename"
+msgstr "takma ad"
+
+#: contrib/auth/models.py:42
+msgid "permission"
+msgstr "izin"
+
+#: contrib/auth/models.py:43 contrib/auth/models.py:58
+msgid "permissions"
+msgstr "izinler"
+
+#: contrib/auth/models.py:60
+msgid "group"
+msgstr "grup"
+
+#: contrib/auth/models.py:61 contrib/auth/models.py:100
+msgid "groups"
+msgstr "gruplar"
+
+#: contrib/auth/models.py:90
+msgid "username"
+msgstr "kullanıcı adı"
+
+#: contrib/auth/models.py:90
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr ""
+"Gerekli. 30 karakter ya da da az olmalı. Alfanumerik (harf, rakam ve alt "
+"çizgi) karakterler kullanılabilir."
+
+#: contrib/auth/models.py:91
+msgid "first name"
+msgstr "isim"
+
+#: contrib/auth/models.py:92
+msgid "last name"
+msgstr "soyisim"
+
+#: contrib/auth/models.py:93
+msgid "e-mail address"
+msgstr "e-posta adresi"
+
+#: contrib/auth/models.py:94
+msgid "password"
+msgstr "parola"
+
+#: contrib/auth/models.py:94
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr ""
+"'[algo]$[salt]$[hexdigest]' yazın ya da <a href=\"password/\">parola\n"
+"değiştir formunu kullanın</a>."
+
+#: contrib/auth/models.py:95
+msgid "staff status"
+msgstr "yönetici modu"
+
+#: contrib/auth/models.py:95
+msgid "Designates whether the user can log into this admin site."
+msgstr "Kullanıcının yönetici sayfasına girip giremeyeceğini belirler."
+
+#: contrib/auth/models.py:96
+msgid "active"
+msgstr "aktif"
+
+#: contrib/auth/models.py:96
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"Kullanıcının Django yönetim sayfasına girip giremeyeceğini belirler. "
+"Kullanıcı hesabı silmek yerine işareti kaldırın."
+
+#: contrib/auth/models.py:97
+msgid "superuser status"
+msgstr "süper kullanıcı modu"
+
+#: contrib/auth/models.py:97
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr ""
+"Kullanıcının tek tek hak atamasına gerek kalmadan tüm haklara sahip olup "
+"olamayacağını belirler."
+
+#: contrib/auth/models.py:98
+msgid "last login"
+msgstr "son ziyaret"
+
+#: contrib/auth/models.py:99
+msgid "date joined"
+msgstr "kayıt tarihi"
+
+#: contrib/auth/models.py:101
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"Özel olarak atanmış hakların yanı sıra, kullanıcının üyesi olduğu grupların "
+"hakları alır."
+
+#: contrib/auth/models.py:102
+msgid "user permissions"
+msgstr "kullanıcı izinleri"
+
+#: contrib/auth/models.py:105
+msgid "user"
+msgstr "kullanıcı"
+
+#: contrib/auth/models.py:106
+msgid "users"
+msgstr "kullanıcılar"
+
+#: contrib/auth/models.py:111
+msgid "Personal info"
+msgstr "Kişisel bilgiler"
+
+#: contrib/auth/models.py:112
+msgid "Permissions"
+msgstr "İzinler"
+
+#: contrib/auth/models.py:113
+msgid "Important dates"
+msgstr "Önemli tarihler"
+
+#: contrib/auth/models.py:114
+msgid "Groups"
+msgstr "Gruplar"
+
+#: contrib/auth/models.py:258
+msgid "message"
+msgstr "mesaj"
+
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr "İki parola alanı uyuşmuyor."
+
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr "Bu isimde bir kullanıcı zaten var."
+
+#: contrib/auth/forms.py:53
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"Web tarayıcınızın çerezleri desteklemediği görülüyor. Çerezler giriş için "
+"gerekli."
+
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "Bu hesap aktif değil."
+
+#: contrib/auth/forms.py:85
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr ""
+"Bu e-posta hesabıyla ilişkili kullanıcı bulunmuyor. Kayıtlı olduğunuzdan "
+"emin misiniz?"
+
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "İki parola alanı uyuşmuyor."
+
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Eski parolanız hatalı. Lütfen tekrar girin."
+
+#: contrib/localflavor/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
+msgstr "Posta kodu girin. Posta kodunun iki kısmı arasında bir boşluk bırakın."
+
+#: contrib/localflavor/usa/forms.py:17
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "XXXXX ya da XXXXX-XXXX biçiminde bir posta kodu yazın."
+
+#: contrib/sessions/models.py:51
+msgid "session key"
+msgstr "oturum anahtarı"
+
+#: contrib/sessions/models.py:52
+msgid "session data"
+msgstr "oturum bilgisi"
+
+#: contrib/sessions/models.py:53
+msgid "expire date"
+msgstr "bitiş tarihi"
+
+#: contrib/sessions/models.py:57
+msgid "session"
+msgstr "oturum"
+
+#: contrib/sessions/models.py:58
+msgid "sessions"
+msgstr "oturumlar"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Örnek: '/about/contact/'. Başında ve sonunda bölü işareti olduğundan emin "
+"olun."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "başlık"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "içerik"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "yorumlara izin ver"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "şablon adı"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr ""
+"Örnek: 'flatpages/contact_page.html'. Eğer birşey yazılmazsa, sistem "
+"otomatik olarak 'flatpages/default.html' kullanacak."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "kayıt gerekli"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Bu seçili ise, sadece kayıtlı kullanıcılar sayfayı görüntüleyebilir."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "düz sayfa"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "düz sayfalar"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Pazartesi"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Salı"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Çarşamba"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Perşembe"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Cuma"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Cumartesi"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Pazar"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Ocak"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Şubat"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "Mart"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "Nisan"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "Mayıs"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "Haziran"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "Temmuz"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "Ağustos"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "Eylül"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Ekim"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "Kasım"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "Aralık"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr "oca"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "şub"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "mar"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "nis"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "may"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "haz"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "tem"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "ağu"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "eyl"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "eki"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "kas"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "ara"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Oca."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Şub."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Ağu."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Eyl."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Eki."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "Kas."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Ara."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "yıl"
+msgstr[1] "yıl"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "ay"
+msgstr[1] "ay"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "hafta"
+msgstr[1] "hafta"
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "gün"
+msgstr[1] "gün"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "saat"
+msgstr[1] "saat"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "dakika"
+msgstr[1] "dakika"
+
+#: utils/dateformat.py:40
+msgid "p.m."
+msgstr "ö.s."
+
+#: utils/dateformat.py:41
+msgid "a.m."
+msgstr "ö.ö."
+
+#: utils/dateformat.py:46
+msgid "PM"
+msgstr "ÖS"
+
+#: utils/dateformat.py:47
+msgid "AM"
+msgstr "ÖÖ"
+
+#: utils/dateformat.py:95
+msgid "midnight"
+msgstr "gece yarısı"
+
+#: utils/dateformat.py:97
+msgid "noon"
+msgstr "öğlen"
+
+#: utils/translation/trans_real.py:362
+msgid "DATE_FORMAT"
+msgstr "DATE_FORMAT"
+
+#: utils/translation/trans_real.py:363
+msgid "DATETIME_FORMAT"
+msgstr "DATETIME_FORMAT"
+
+#: utils/translation/trans_real.py:364
+msgid "TIME_FORMAT"
+msgstr "TIME_FORMAT"
+
+#: utils/translation/trans_real.py:380
+msgid "YEAR_MONTH_FORMAT"
+msgstr "YEAR_MONTH_FORMAT"
+
+#: utils/translation/trans_real.py:381
+msgid "MONTH_DAY_FORMAT"
+msgstr "MONTH_DAY_FORMAT"
+
+#: template/defaultfilters.py:491
+msgid "yes,no,maybe"
+msgstr "evet,hayır,olabilir"
+
+#~ msgid ""
+#~ "Please enter a different %s. The one you entered is already being used "
+#~ "for %s."
+#~ msgstr ""
+#~ "Lütfen farklı bir %s girin. Girdiğiniz, %s tarihinde bir kez kullanılmış."
+
+#~ msgid "Use '[algo]$[salt]$[hexdigest]'"
+#~ msgstr "'[algo]$[salt]$[hexdigest]' formatında"
+
+#~ msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+#~ msgstr "<a href=\"/password_reset/\">Şifrenizi mi unuttunuz?</a>"
+
+#: contrib/auth/forms.py:107
+#, python-format
+msgid "Password reset on %s"
+msgstr "%s sitesindeki hesabınızın parolasının sıfırlanması"
diff --git a/webapp/django/conf/locale/tr/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/tr/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..1748dfa
--- /dev/null
+++ b/webapp/django/conf/locale/tr/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/tr/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/tr/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..cae1933
--- /dev/null
+++ b/webapp/django/conf/locale/tr/LC_MESSAGES/djangojs.po
@@ -0,0 +1,112 @@
+# This file is distributed under the same license as the Django package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-09-30 01:31+0300\n"
+"PO-Revision-Date: 2006-09-30 01:31+0300\n"
+"Last-Translator: Bahadır Kandemir <bahadir@pardus.org.tr>\n"
+"Language-Team: Bahadır Kandemir <bahadir@pardus.org.tr>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "Mevcut %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Hepsini seç"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Ekle"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Kaldır"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Seçilen %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Seçiminizi yapın ve tıklayın "
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Hepsini temizle"
+
+#: contrib/admin/media/js/dateparse.js:26
+#: contrib/admin/media/js/calendar.js:24
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr "Ocak Şubat Mart Nisan Mayıs Haziran Temmuz Ağustos Eylül Ekim Kasım "
+"Aralık"
+
+#: contrib/admin/media/js/dateparse.js:27
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Pazar Pazartesi Salı Çarşamba Perşembe Cuma Cumartesi"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "P P S Ç P C C"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "Şimdi"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "Saat"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "Saat seçin"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "Geceyarısı"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "Sabah 6"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "Öğle"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "İptal"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "Bugün"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "Takvim"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "Dün"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "Yarın"
+
+msgid "Show"
+msgstr "Göster"
+
+msgid "Hide"
+msgstr "Gizle"
diff --git a/webapp/django/conf/locale/uk/LC_MESSAGES/django.mo b/webapp/django/conf/locale/uk/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..b6b4962
--- /dev/null
+++ b/webapp/django/conf/locale/uk/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/uk/LC_MESSAGES/django.po b/webapp/django/conf/locale/uk/LC_MESSAGES/django.po
new file mode 100644
index 0000000..3b24145
--- /dev/null
+++ b/webapp/django/conf/locale/uk/LC_MESSAGES/django.po
@@ -0,0 +1,1970 @@
+# Django, ukrainian translation.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Denis Kuzmichyov <kuzmichyov@gmail.com>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-05-16 10:13+0200\n"
+"PO-Revision-Date: 2006-03-20 21:18+0300\n"
+"Last-Translator: Denis Kuzmichyov <kuzmichyov@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr ""
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr ""
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "коментар"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "рейтінг #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "рейтінг #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "рейтінг #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "рейтінг #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "рейтінг #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "рейтінг #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "рейтінг #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "рейтінг #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr ""
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "дата/час додання"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "публічний"
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289
+msgid "IP address"
+msgstr "IP адреса"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "видалений"
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+
+#: contrib/comments/models.py:91
+#, fuzzy
+msgid "comments"
+msgstr "коментар"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr ""
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Додав %(user)s %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "Ім'я людини"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "ip адреса"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "схвалено адміністрацією"
+
+#: contrib/comments/models.py:176
+#, fuzzy
+msgid "free comment"
+msgstr "Вільний коментар"
+
+#: contrib/comments/models.py:177
+#, fuzzy
+msgid "free comments"
+msgstr "Вільні коментарі"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "рахунок"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr ""
+
+#: contrib/comments/models.py:237
+#, fuzzy
+msgid "karma score"
+msgstr "рахунок"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr ""
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr ""
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr ""
+
+#: contrib/comments/models.py:268
+#, fuzzy
+msgid "user flag"
+msgstr "Ознака користувача"
+
+#: contrib/comments/models.py:269
+#, fuzzy
+msgid "user flags"
+msgstr "Ознаки користувача"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr ""
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "Дата видалення"
+
+#: contrib/comments/models.py:280
+#, fuzzy
+msgid "moderator deletion"
+msgstr "Видалено модератором"
+
+#: contrib/comments/models.py:281
+#, fuzzy
+msgid "moderator deletions"
+msgstr "Видалено модератором"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr ""
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Анонімний користувач не може голосувати"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "Невірний ID коментарю"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "Не можна голосувати за себе"
+
+#: contrib/comments/views/comments.py:28
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr ""
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Цей коментар доданий користувачем, який додав меньше ніж %(count)s коментаря"
+msgstr[1] ""
+"Цей коментар доданий користувачем, який додав меньше ніж %(count)s коментарів"
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Тільки POST'и дозволені"
+
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Одне або більше обов'язкових полів не було заповнено"
+
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr ""
+
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"Форма для коментарів мала невірний параметр 'target' -- ID об'єкту був "
+"невірний"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "Форма для коментарів не надавала ані 'переглянути', ні 'додати'"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "Ім'я:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Пароль:"
+
+#: contrib/comments/templates/comments/form.html:6
+#, fuzzy
+msgid "Forgotten your password?"
+msgstr "Змінити мій пароль"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr "Вийти"
+
+#: contrib/comments/templates/comments/form.html:12
+#, fuzzy
+msgid "Ratings"
+msgstr "рейтінг #1"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:27
+#: contrib/comments/templates/comments/freeform.html:5
+#, fuzzy
+msgid "Comment:"
+msgstr "Коментар"
+
+#: contrib/comments/templates/comments/form.html:32
+#: contrib/comments/templates/comments/freeform.html:9
+#, fuzzy
+msgid "Preview comment"
+msgstr "Вільний коментар"
+
+#: contrib/comments/templates/comments/freeform.html:4
+#, fuzzy
+msgid "Your name:"
+msgstr "Ім'я користувача"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143
+msgid "All"
+msgstr "Всі"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "Будь-яка дата"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "Сьогодні"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "Останні 7 днів"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "Цього місяця"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "Цього року"
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Так"
+
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "Ні"
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr ""
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "час дії"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "id об'єкту"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr ""
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "прапор дії"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "змінити повідомлення"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr ""
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr ""
+
+#: contrib/admin/templatetags/admin_list.py:228
+msgid "All dates"
+msgstr "Всі дати"
+
+#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36
+#: contrib/auth/forms.py:41
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+
+#: contrib/admin/views/decorators.py:23
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Увійти"
+
+#: contrib/admin/views/decorators.py:61
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Будь ласка, ввійдіть знову, ваша сесія скінчилася. Не хвилюйтеся: все що ви "
+"додавали збережено."
+
+#: contrib/admin/views/decorators.py:68
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Здається ваш броузер не сконфігурований приймати cookies. Будьласка "
+"увімкнить cookies, перезавантажте цю старінку і спробуйте знову"
+
+#: contrib/admin/views/decorators.py:82
+msgid "Usernames cannot contain the '@' character."
+msgstr "Ім'я не може містити '@' символ"
+
+#: contrib/admin/views/decorators.py:84
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr ""
+"Ваша e-mail адреса не є вашим ім'ям користувача. Замість спробуйте '%s'"
+
+#: contrib/admin/views/main.py:226
+msgid "Site administration"
+msgstr "Адміністрування сайта"
+
+#: contrib/admin/views/main.py:260
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" було додано успішно."
+
+#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
+msgid "You may edit it again below."
+msgstr "Ви можете редагувати це знову внизу."
+
+#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#, python-format
+msgid "You may add another %s below."
+msgstr "Ви можете додати інший %s внизу."
+
+#: contrib/admin/views/main.py:290
+#, python-format
+msgid "Add %s"
+msgstr "Додати %s"
+
+#: contrib/admin/views/main.py:336
+#, python-format
+msgid "Added %s."
+msgstr "Додано %s."
+
+#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:340
+msgid "and"
+msgstr "та"
+
+#: contrib/admin/views/main.py:338
+#, python-format
+msgid "Changed %s."
+msgstr "Змінено %s."
+
+#: contrib/admin/views/main.py:340
+#, python-format
+msgid "Deleted %s."
+msgstr "Видалено %s."
+
+#: contrib/admin/views/main.py:343
+msgid "No fields changed."
+msgstr "Поля не змінені."
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" був успішно змінений."
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s\"  був успішно доданий. Ви модете редагувати його знову "
+"внизу."
+
+#: contrib/admin/views/main.py:392
+#, python-format
+msgid "Change %s"
+msgstr "Змінити %s"
+
+#: contrib/admin/views/main.py:470
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Одне або більше %(fieldname)s у %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:475
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Одне або більше %(fieldname)s у %(name)s:"
+
+#: contrib/admin/views/main.py:508
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" був видалений успышно."
+
+#: contrib/admin/views/main.py:511
+msgid "Are you sure?"
+msgstr "Ви упевнені?"
+
+#: contrib/admin/views/main.py:533
+#, python-format
+msgid "Change history: %s"
+msgstr "Історія змін: %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s"
+msgstr "Вибрати %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s to change"
+msgstr "Виберіть %s щоб змінити"
+
+#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286
+#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297
+msgid "Integer"
+msgstr "Ціле"
+
+#: contrib/admin/views/doc.py:278
+msgid "Boolean (Either True or False)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "Рядок (до %(maxlength)s символів)"
+
+#: contrib/admin/views/doc.py:280
+msgid "Comma-separated integers"
+msgstr "Цілі розділені комою"
+
+#: contrib/admin/views/doc.py:281
+msgid "Date (without time)"
+msgstr "Дата (без часу)"
+
+#: contrib/admin/views/doc.py:282
+msgid "Date (with time)"
+msgstr "Дата (з часом)"
+
+#: contrib/admin/views/doc.py:283
+msgid "E-mail address"
+msgstr "E-mail адреса"
+
+#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
+msgid "File path"
+msgstr ""
+
+#: contrib/admin/views/doc.py:285
+msgid "Decimal number"
+msgstr "Десяткове число"
+
+#: contrib/admin/views/doc.py:291
+msgid "Boolean (Either True, False or None)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:292
+msgid "Relation to parent model"
+msgstr "Відношення до батьківської моделі"
+
+#: contrib/admin/views/doc.py:293
+msgid "Phone number"
+msgstr "Телефонний номер"
+
+#: contrib/admin/views/doc.py:298
+msgid "Text"
+msgstr "Текст"
+
+#: contrib/admin/views/doc.py:299
+msgid "Time"
+msgstr "Час"
+
+#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr ""
+
+#: contrib/admin/views/doc.py:301
+msgid "U.S. state (two uppercase letters)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:302
+msgid "XML text"
+msgstr "текст XML"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Документація"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "Змінити пароль"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Домівка"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+msgid "History"
+msgstr "Історія"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Дата/час"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Користувач"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Дія"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "N j, Y, P"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Цей об'єкт немає історії змін. Напевно він був доданий не через сайт "
+"адміністрування."
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django сайт адміністрування"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django адміністрування"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Помилка сервера"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Помилка сервера (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Помилка сервера <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Відбулася помилка. Її було повідомлено адміністраторам сайту e-mail'ом і "
+"вона повинна бути незабаром виправлена. Дякуємо за ваше терпіння."
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Сторінка не знайдена"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Ми шкодуємо, але сторінка яку ви запросили не знайдена."
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "Додати"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Змінити"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "У вас немає дозволу редагувати будь-що"
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Недавні дії"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Мої дії"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "Додати %(name)s"
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "<a href=\"/password_reset/\">Забули ваш пароль</a>?"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "Вітаємо,"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Видалити"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(object)s' would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Видалення %(object_name)s '%(object)s' призводить до видалення пов'язаних "
+"об'єктів, але ваш рахунок не має дозволу видаляти наступні типи об'єктів:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
+"the following related items will be deleted:"
+msgstr ""
+"Ви впевнені що хочете видалити %(object_name)s \"%(object)s\"? Всі наступні "
+"пов'язані записи будуть видалені:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Так, я впевнений"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(title)s "
+msgstr "За %(title)s"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Уперед"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "Дивитися на сайті"
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Будь ласка, виправте помилку, що зазначена нижче"
+msgstr[1] "Будь ласка, виправте помилки, що зазначені нижче"
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr ""
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Зберегти як нове"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Зберегти і додати інше"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Зберегти і продовжити редагування"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Зберегти"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Зміна пароля"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Зміна паролю успішна"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Ваш пароль було змінено."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Пароль перевстановлено"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"Забули свій пароль? Введить свою e-mail адресу і ми перевстановимо ваш "
+"пароль і надішлемо вам новий поштою."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "E-mail адреса:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Перевстановіть мій пароль"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Дякуємо за проведений вами час із сайтом сьогодні."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Увійти знову"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Пароль перевстановлено успішно"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"Ми надіслали новий пароль поштою на адресу, яку ви вказали. Незабаром ви "
+"повинні його отримати."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Будь ласка введить ваш старий пароль, задля беспекі, та потім введить ваш "
+"новий пароль двічі, щоб ми могли перевірити що ви ввели його коректно"
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Старий пароль:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Новий пароль:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Підтвердіть пароль:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Змінити мій пароль"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Ви отримали цього листа, тому що запросили перевстановлення паролю"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "для вашого рахунку користувача на сайті %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Ваш новий пароль: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Ви можете вільно змінити цей пароль, перейшовши до цієї сторінки:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "У разі, якщо ви забули, ваше им'я:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Дякуємо за користування нашим сайтом."
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "команда %(site_name)s "
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Документіця для цієї сторінки"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Показати ID об'єкту"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Показує content-type та унікальний ID для сторінок, які являють собою єдиний "
+"об'єкт"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Редагувати цей об'єкт (поточне вікно)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Редагувати цей об'єкт (нове вікно)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "Як і вище, але відкриває сторінку адміністрування у новому вікні."
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Дата:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Час:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Зараз:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr ""
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr ""
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Це повинно бути абсолютний шлях, виключаючи ім'я домену. Приклад: '/events/"
+"search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr ""
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Це може бути або абсолютний шлях (як вище), або повний URL, який починається "
+"з 'http://'."
+
+#: contrib/redirects/models.py:12
+msgid "redirect"
+msgstr ""
+
+#: contrib/redirects/models.py:13
+msgid "redirects"
+msgstr ""
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Приклад: '/about/contact/'. Переконайтеся у наявності слешу на початку та у "
+"кінці."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "заголовок"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "зміст"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "ввімкнути коментарі"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "ім'я шаблона"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
+"use 'flatpages/default'."
+msgstr ""
+"Приклад: 'flatpages/contact_page'. Якщо це не надано, система буда "
+"використовувати 'flatpages/default'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "потрібна регістрація"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+"Якщо тут відзначено, тільки користувачи, що увійшли будуть мати змогу "
+"переглядати цю сторінку."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr ""
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "прості сторінки"
+
+#: contrib/auth/models.py:13 contrib/auth/models.py:26
+msgid "name"
+msgstr "ім'я"
+
+#: contrib/auth/models.py:15
+msgid "codename"
+msgstr ""
+
+#: contrib/auth/models.py:17
+#, fuzzy
+msgid "permission"
+msgstr "Дозвіл"
+
+#: contrib/auth/models.py:18 contrib/auth/models.py:27
+#, fuzzy
+msgid "permissions"
+msgstr "Дозвіл"
+
+#: contrib/auth/models.py:29
+#, fuzzy
+msgid "group"
+msgstr "Група"
+
+#: contrib/auth/models.py:30 contrib/auth/models.py:65
+#, fuzzy
+msgid "groups"
+msgstr "Групи"
+
+#: contrib/auth/models.py:55
+msgid "username"
+msgstr "Ім'я користувача"
+
+#: contrib/auth/models.py:56
+msgid "first name"
+msgstr "ім'я"
+
+#: contrib/auth/models.py:57
+msgid "last name"
+msgstr "прізвище"
+
+#: contrib/auth/models.py:58
+msgid "e-mail address"
+msgstr "e-mail адреса"
+
+#: contrib/auth/models.py:59
+msgid "password"
+msgstr "пароль"
+
+#: contrib/auth/models.py:59
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr ""
+
+#: contrib/auth/models.py:60
+msgid "staff status"
+msgstr "статус персоналу"
+
+#: contrib/auth/models.py:60
+msgid "Designates whether the user can log into this admin site."
+msgstr "Визначає, чи може користувач увійти до цього сайту адміністрування."
+
+#: contrib/auth/models.py:61
+msgid "active"
+msgstr "активний"
+
+#: contrib/auth/models.py:62
+msgid "superuser status"
+msgstr "статус суперкористувача"
+
+#: contrib/auth/models.py:63
+msgid "last login"
+msgstr "Останній вхід"
+
+#: contrib/auth/models.py:64
+msgid "date joined"
+msgstr "дата приєднання"
+
+#: contrib/auth/models.py:66
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"На додаток до прав які призначені вручну, цей користувач також отримує усі "
+"права, які має група в якій він є."
+
+#: contrib/auth/models.py:67
+#, fuzzy
+msgid "user permissions"
+msgstr "Дозвіл"
+
+#: contrib/auth/models.py:70
+#, fuzzy
+msgid "user"
+msgstr "Користувач"
+
+#: contrib/auth/models.py:71
+#, fuzzy
+msgid "users"
+msgstr "Користувачі"
+
+#: contrib/auth/models.py:76
+msgid "Personal info"
+msgstr "Персональна інформація"
+
+#: contrib/auth/models.py:77
+msgid "Permissions"
+msgstr "Дозвіл"
+
+#: contrib/auth/models.py:78
+msgid "Important dates"
+msgstr "Важливі дати"
+
+#: contrib/auth/models.py:79
+msgid "Groups"
+msgstr "Групи"
+
+#: contrib/auth/models.py:219
+#, fuzzy
+msgid "message"
+msgstr "Повідомлення"
+
+#: contrib/auth/forms.py:30
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+
+#: contrib/contenttypes/models.py:25
+msgid "python model class name"
+msgstr ""
+
+#: contrib/contenttypes/models.py:28
+msgid "content type"
+msgstr ""
+
+#: contrib/contenttypes/models.py:29
+msgid "content types"
+msgstr ""
+
+#: contrib/sessions/models.py:35
+msgid "session key"
+msgstr ""
+
+#: contrib/sessions/models.py:36
+msgid "session data"
+msgstr ""
+
+#: contrib/sessions/models.py:37
+msgid "expire date"
+msgstr ""
+
+#: contrib/sessions/models.py:41
+msgid "session"
+msgstr "сесія"
+
+#: contrib/sessions/models.py:42
+msgid "sessions"
+msgstr "сесії"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "доменне ім'я"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr ""
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "сайт"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "сайти"
+
+#: utils/translation.py:360
+msgid "DATE_FORMAT"
+msgstr "N j, Y"
+
+#: utils/translation.py:361
+msgid "DATETIME_FORMAT"
+msgstr "N j, Y, P"
+
+#: utils/translation.py:362
+msgid "TIME_FORMAT"
+msgstr "P"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Понеділок"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Вівторок"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Середа"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Четвер"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "П'ятниця"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Субота"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Неділя"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Січень"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Лютий"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "Березень"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "Квітень"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "Травень"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "Червень"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "Липень"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "Серпень"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "Вересень"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Жовтень"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "Листопад"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "Грудень"
+
+#: utils/dates.py:19
+#, fuzzy
+msgid "jan"
+msgstr "та"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr ""
+
+#: utils/dates.py:19
+#, fuzzy
+msgid "may"
+msgstr "день"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr ""
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Січ."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Лют."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Сер."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Вер."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Жов."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "Лис."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Груд."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "рік"
+msgstr[1] "рокі(в)"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "місяць"
+msgstr[1] "місяці(в)"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "день"
+msgstr[1] "дні(в)"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "година"
+msgstr[1] "годин(и)"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "хвилина"
+msgstr[1] "хвилин(и)"
+
+#: conf/global_settings.py:37
+msgid "Bengali"
+msgstr "Бенгалська"
+
+#: conf/global_settings.py:38
+msgid "Czech"
+msgstr "Чеська"
+
+#: conf/global_settings.py:39
+msgid "Welsh"
+msgstr "Валлійська"
+
+#: conf/global_settings.py:40
+msgid "Danish"
+msgstr "Датська"
+
+#: conf/global_settings.py:41
+msgid "German"
+msgstr "Німецька"
+
+#: conf/global_settings.py:42
+msgid "Greek"
+msgstr ""
+
+#: conf/global_settings.py:43
+msgid "English"
+msgstr "Англійська"
+
+#: conf/global_settings.py:44
+msgid "Spanish"
+msgstr "Іспанська"
+
+#: conf/global_settings.py:45
+msgid "French"
+msgstr "Французька"
+
+#: conf/global_settings.py:46
+msgid "Galician"
+msgstr ""
+
+#: conf/global_settings.py:47
+msgid "Hungarian"
+msgstr ""
+
+#: conf/global_settings.py:48
+msgid "Hebrew"
+msgstr ""
+
+#: conf/global_settings.py:49
+msgid "Icelandic"
+msgstr "Ісландська"
+
+#: conf/global_settings.py:50
+msgid "Italian"
+msgstr "Італійська"
+
+#: conf/global_settings.py:51
+msgid "Japanese"
+msgstr "Японська"
+
+#: conf/global_settings.py:52
+msgid "Dutch"
+msgstr ""
+
+#: conf/global_settings.py:53
+msgid "Norwegian"
+msgstr "Норвезька"
+
+#: conf/global_settings.py:54
+msgid "Brazilian"
+msgstr "Бразильска"
+
+#: conf/global_settings.py:55
+msgid "Romanian"
+msgstr "Румунська"
+
+#: conf/global_settings.py:56
+msgid "Russian"
+msgstr "Російська"
+
+#: conf/global_settings.py:57
+msgid "Slovak"
+msgstr "Словацька"
+
+#: conf/global_settings.py:58
+#, fuzzy
+msgid "Slovenian"
+msgstr "Словацька"
+
+#: conf/global_settings.py:59
+msgid "Serbian"
+msgstr "Сербська"
+
+#: conf/global_settings.py:60
+msgid "Swedish"
+msgstr "Шведська"
+
+#: conf/global_settings.py:61
+#, fuzzy
+msgid "Ukrainian"
+msgstr "Бразильска"
+
+#: conf/global_settings.py:62
+msgid "Simplified Chinese"
+msgstr "Китайська спрощена"
+
+#: conf/global_settings.py:63
+msgid "Traditional Chinese"
+msgstr "Китайська традиційна"
+
+#: core/validators.py:60
+msgid "This value must contain only letters, numbers and underscores."
+msgstr ""
+"Це значення може містити тільки літери, числа та символи підкреслювання"
+
+#: core/validators.py:64
+#, fuzzy
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Це значення може містити тільки літери, числа, символи підкреслювання та "
+"слеші."
+
+#: core/validators.py:72
+msgid "Uppercase letters are not allowed here."
+msgstr "Літери у верхньому регістрі тут неприпустимі."
+
+#: core/validators.py:76
+msgid "Lowercase letters are not allowed here."
+msgstr "Літери у нижньому регістрі тут неприпустимі."
+
+#: core/validators.py:83
+msgid "Enter only digits separated by commas."
+msgstr "Уведіть тільки цифри розділені комами."
+
+#: core/validators.py:95
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Уведіть коректні e-mail адреси, розділені комами."
+
+#: core/validators.py:99
+msgid "Please enter a valid IP address."
+msgstr "Будь ласка уведіть коректу IP адресу."
+
+#: core/validators.py:103
+msgid "Empty values are not allowed here."
+msgstr "Порожні значенні тут не дозволені."
+
+#: core/validators.py:107
+msgid "Non-numeric characters aren't allowed here."
+msgstr ""
+
+#: core/validators.py:111
+msgid "This value can't be comprised solely of digits."
+msgstr ""
+
+#: core/validators.py:116
+msgid "Enter a whole number."
+msgstr "Уведіть ціле число."
+
+#: core/validators.py:120
+msgid "Only alphabetical characters are allowed here."
+msgstr "Тільки алфавітні символи дозволені тут."
+
+#: core/validators.py:124
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Уведіть коректну дату у форматі РРРР-ММ-ДД."
+
+#: core/validators.py:128
+msgid "Enter a valid time in HH:MM format."
+msgstr "Уведіть коректий час у форматі ГГ:ХХ."
+
+#: core/validators.py:132 db/models/fields/__init__.py:468
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr ""
+
+#: core/validators.py:136
+msgid "Enter a valid e-mail address."
+msgstr "Уведіть коректну e-mail адресу."
+
+#: core/validators.py:148
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Завантажте коректний малюнок. Файл який ви завантажили був або не малюнок, "
+"або малюнок, який є зіпсованим."
+
+#: core/validators.py:155
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "URL %s не вказує на коректний малюнок."
+
+#: core/validators.py:159
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Телефонні номери мають бути у форматі XXX-XXX-XXXX. \"%s\" не є коректним."
+
+#: core/validators.py:167
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "URL %s не вказує на коректне відео у форматі QuickTime."
+
+#: core/validators.py:171
+msgid "A valid URL is required."
+msgstr ""
+
+#: core/validators.py:185
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+
+#: core/validators.py:192
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Погано сформований XML: %s"
+
+#: core/validators.py:202
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Невірний URL: %s"
+
+#: core/validators.py:206 core/validators.py:208
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "URL %s є пошкодженим посиланням."
+
+#: core/validators.py:214
+msgid "Enter a valid U.S. state abbreviation."
+msgstr ""
+
+#: core/validators.py:229
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:236
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr ""
+
+#: core/validators.py:255
+msgid "Please enter something for at least one field."
+msgstr ""
+
+#: core/validators.py:264 core/validators.py:275
+msgid "Please enter both fields or leave them both empty."
+msgstr ""
+
+#: core/validators.py:282
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr ""
+
+#: core/validators.py:294
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr ""
+
+#: core/validators.py:313
+msgid "Duplicate values are not allowed."
+msgstr ""
+
+#: core/validators.py:336
+#, python-format
+msgid "This value must be a power of %s."
+msgstr ""
+
+#: core/validators.py:347
+msgid "Please enter a valid decimal number."
+msgstr ""
+
+#: core/validators.py:349
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:352
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:362
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr ""
+
+#: core/validators.py:363
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr ""
+
+#: core/validators.py:376
+msgid "The format for this field is wrong."
+msgstr ""
+
+#: core/validators.py:391
+msgid "This field is invalid."
+msgstr ""
+
+#: core/validators.py:426
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr ""
+
+#: core/validators.py:429
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+
+#: core/validators.py:462
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:466
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:471
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+
+#: core/validators.py:476
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+
+#: core/validators.py:480
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:485
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr ""
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr ""
+
+#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
+#: forms/__init__.py:346
+msgid "This field is required."
+msgstr "Це поле обов'язкове."
+
+#: db/models/fields/__init__.py:337
+msgid "This value must be an integer."
+msgstr ""
+
+#: db/models/fields/__init__.py:369
+msgid "This value must be either True or False."
+msgstr ""
+
+#: db/models/fields/__init__.py:385
+#, fuzzy
+msgid "This field cannot be null."
+msgstr "Це поле обов'язкове."
+
+#: db/models/fields/__init__.py:562
+msgid "Enter a valid filename."
+msgstr ""
+
+#: db/models/fields/related.py:43
+#, python-format
+msgid "Please enter a valid %s."
+msgstr ""
+
+#: db/models/fields/related.py:579
+msgid "Separate multiple IDs with commas."
+msgstr ""
+
+#: db/models/fields/related.py:581
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+#: db/models/fields/related.py:625
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+msgstr[1] ""
+
+#: forms/__init__.py:380
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Переконайтеся, що ваш текст меньше, ніж %s символ"
+msgstr[1] "Переконайтеся, що ваш текст меньше, ніж %s символів"
+
+#: forms/__init__.py:385
+msgid "Line breaks are not allowed here."
+msgstr "Символи нового рядку не дозволені тут."
+
+#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Зробить коректний вибір; '%(data)s' немає у %(choices)s."
+
+#: forms/__init__.py:645
+msgid "The submitted file is empty."
+msgstr "Переданий файл порожній."
+
+#: forms/__init__.py:699
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Уведіть ціле число між -32,768 та 32,768."
+
+#: forms/__init__.py:708
+msgid "Enter a positive number."
+msgstr "Уведіть позитивне число."
+
+#: forms/__init__.py:717
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Уведіть ціле число між 0 та 32,767."
+
+#: template/defaultfilters.py:379
+msgid "yes,no,maybe"
+msgstr "так,ні,можливо"
+
+#~ msgid "Comments"
+#~ msgstr "Коментарі"
+
+#~ msgid "String (up to 50)"
+#~ msgstr "Рядок (до 50 символів)"
+
+#~ msgid "label"
+#~ msgstr "мітка"
+
+#~ msgid "package"
+#~ msgstr "пакунок"
+
+#~ msgid "packages"
+#~ msgstr "пакунки"
diff --git a/webapp/django/conf/locale/uk/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/uk/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..fae1fdc
--- /dev/null
+++ b/webapp/django/conf/locale/uk/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/uk/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/uk/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..120d08d
--- /dev/null
+++ b/webapp/django/conf/locale/uk/LC_MESSAGES/djangojs.po
@@ -0,0 +1,118 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-28 17:36+1000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr ""
+
+#: contrib/admin/media/js/dateparse.js:32
+#: contrib/admin/media/js/calendar.js:24
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr ""
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Now"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
+msgid "Clock"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
+msgid "Choose a time"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "Midnight"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "6 a.m."
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
+msgid "Noon"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
+msgid "Cancel"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
+msgid "Today"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
+msgid "Calendar"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
+msgid "Yesterday"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
+msgid "Tomorrow"
+msgstr ""
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr ""
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr ""
diff --git a/webapp/django/conf/locale/zh_CN/LC_MESSAGES/django.mo b/webapp/django/conf/locale/zh_CN/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..55e77f8
--- /dev/null
+++ b/webapp/django/conf/locale/zh_CN/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/zh_CN/LC_MESSAGES/django.po b/webapp/django/conf/locale/zh_CN/LC_MESSAGES/django.po
new file mode 100644
index 0000000..fda4954
--- /dev/null
+++ b/webapp/django/conf/locale/zh_CN/LC_MESSAGES/django.po
@@ -0,0 +1,2636 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-05-16 10:10+0200\n"
+"PO-Revision-Date: 2008-04-10 11:57+0800\n"
+"Last-Translator: hutuworm <hutuworm@gmail.com>\n"
+"Language-Team: Simplified Chinese <limodou@gmail.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Chinese\n"
+"X-Poedit-Country: CHINA\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: db/models/manipulators.py:307
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "带有这个 %(type)s 的 %(object)s 对于给定的 %(field)s 已经存在了。"
+
+#: db/models/manipulators.py:308
+#: contrib/admin/views/main.py:335
+#: contrib/admin/views/main.py:337
+#: contrib/admin/views/main.py:339
+msgid "and"
+msgstr "和"
+
+#: db/models/fields/related.py:53
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "请输入一个有效的 %s 。"
+
+#: db/models/fields/related.py:642
+msgid "Separate multiple IDs with commas."
+msgstr "用逗号分隔多个ID。"
+
+#: db/models/fields/related.py:644
+msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "按下 \"Control\",或者在Mac上按 \"Command\" 来选择多个值。"
+
+#: db/models/fields/related.py:691
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural "Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "请输入有效的 %(self)s ID。值 %(value)r 无效。"
+
+#: db/models/fields/__init__.py:42
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s 带有 %(fieldname)s 已经存在。"
+
+#: db/models/fields/__init__.py:117
+#: db/models/fields/__init__.py:274
+#: db/models/fields/__init__.py:610
+#: db/models/fields/__init__.py:621
+#: oldforms/__init__.py:357
+#: newforms/fields.py:80
+#: newforms/fields.py:376
+#: newforms/fields.py:452
+#: newforms/fields.py:463
+#: newforms/models.py:178
+msgid "This field is required."
+msgstr "这个字段是必填项。"
+
+#: db/models/fields/__init__.py:367
+msgid "This value must be an integer."
+msgstr "这个值必须是一个整数。"
+
+#: db/models/fields/__init__.py:402
+msgid "This value must be either True or False."
+msgstr "这个值必须是 True 或 False。"
+
+#: db/models/fields/__init__.py:423
+msgid "This field cannot be null."
+msgstr "这个值不能为 null。"
+
+#: db/models/fields/__init__.py:457
+#: core/validators.py:148
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "输入一个 YYYY-MM-DD 格式的有效日期。"
+
+#: db/models/fields/__init__.py:526
+#: core/validators.py:157
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "输入一个 YYYY-MM-DD HH:MM 格式的有效日期/时间。"
+
+#: db/models/fields/__init__.py:630
+msgid "Enter a valid filename."
+msgstr "输入一个有效的文件名。"
+
+#: db/models/fields/__init__.py:751
+msgid "This value must be either None, True or False."
+msgstr "这个值必须是 None, True 或 False。"
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "阿拉伯语"
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "孟加拉语"
+
+#: conf/global_settings.py:41
+msgid "Catalan"
+msgstr "加泰罗尼亚语"
+
+#: conf/global_settings.py:42
+msgid "Czech"
+msgstr "捷克语"
+
+#: conf/global_settings.py:43
+msgid "Welsh"
+msgstr "威尔士语"
+
+#: conf/global_settings.py:44
+msgid "Danish"
+msgstr "丹麦语"
+
+#: conf/global_settings.py:45
+msgid "German"
+msgstr "德语"
+
+#: conf/global_settings.py:46
+msgid "Greek"
+msgstr "希腊语"
+
+#: conf/global_settings.py:47
+msgid "English"
+msgstr "英语"
+
+#: conf/global_settings.py:48
+msgid "Spanish"
+msgstr "西班牙语"
+
+#: conf/global_settings.py:49
+msgid "Argentinean Spanish"
+msgstr "阿根廷的西班牙语"
+
+#: conf/global_settings.py:50
+msgid "Finnish"
+msgstr "芬兰语"
+
+#: conf/global_settings.py:51
+msgid "French"
+msgstr "法语"
+
+#: conf/global_settings.py:52
+msgid "Galician"
+msgstr "加利西亚语"
+
+#: conf/global_settings.py:53
+msgid "Hungarian"
+msgstr "匈牙利语"
+
+#: conf/global_settings.py:54
+msgid "Hebrew"
+msgstr "希伯来语"
+
+#: conf/global_settings.py:55
+msgid "Icelandic"
+msgstr "冰岛语"
+
+#: conf/global_settings.py:56
+msgid "Italian"
+msgstr "意大利语"
+
+#: conf/global_settings.py:57
+msgid "Japanese"
+msgstr "日语"
+
+#: conf/global_settings.py:58
+msgid "Kannada"
+msgstr "埃纳德语"
+
+#: conf/global_settings.py:59
+msgid "Latvian"
+msgstr "拉脱维亚语"
+
+#: conf/global_settings.py:60
+msgid "Macedonian"
+msgstr "马其顿语"
+
+#: conf/global_settings.py:61
+msgid "Dutch"
+msgstr "荷兰语"
+
+#: conf/global_settings.py:62
+msgid "Norwegian"
+msgstr "挪威语"
+
+#: conf/global_settings.py:63
+msgid "Polish"
+msgstr "波兰语"
+
+#: conf/global_settings.py:64
+msgid "Portugese"
+msgstr "葡萄牙语"
+
+#: conf/global_settings.py:65
+msgid "Brazilian"
+msgstr "巴西语"
+
+#: conf/global_settings.py:66
+msgid "Romanian"
+msgstr "罗马尼亚语"
+
+#: conf/global_settings.py:67
+msgid "Russian"
+msgstr "俄语"
+
+#: conf/global_settings.py:68
+msgid "Slovak"
+msgstr "斯洛伐克语"
+
+#: conf/global_settings.py:69
+msgid "Slovenian"
+msgstr "斯洛文尼亚语"
+
+#: conf/global_settings.py:70
+msgid "Serbian"
+msgstr "塞尔维亚语"
+
+#: conf/global_settings.py:71
+msgid "Swedish"
+msgstr "瑞典语"
+
+#: conf/global_settings.py:72
+msgid "Tamil"
+msgstr "泰米尔语"
+
+#: conf/global_settings.py:73
+msgid "Telugu"
+msgstr "泰卢固语"
+
+#: conf/global_settings.py:74
+msgid "Turkish"
+msgstr "土耳其语"
+
+#: conf/global_settings.py:75
+msgid "Ukrainian"
+msgstr "乌克兰语"
+
+#: conf/global_settings.py:76
+msgid "Simplified Chinese"
+msgstr "简体中文"
+
+#: conf/global_settings.py:77
+msgid "Traditional Chinese"
+msgstr "正体中文"
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "年"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "月"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "周"
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "天"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "小时"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "分钟"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "星期一"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "星期二"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "星期三"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "星期四"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "星期五"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "星期六"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "星期日"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "一月"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "二月"
+
+#: utils/dates.py:14
+#: utils/dates.py:27
+msgid "March"
+msgstr "三月"
+
+#: utils/dates.py:14
+#: utils/dates.py:27
+msgid "April"
+msgstr "四月"
+
+#: utils/dates.py:14
+#: utils/dates.py:27
+msgid "May"
+msgstr "五月"
+
+#: utils/dates.py:14
+#: utils/dates.py:27
+msgid "June"
+msgstr "六月"
+
+#: utils/dates.py:15
+#: utils/dates.py:27
+msgid "July"
+msgstr "七月"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "八月"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "九月"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "十月"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "十一月"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "十二月"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr "一月"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "二月"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "三月"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "四月"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "五月"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "六月"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "七月"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "八月"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "九月"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "十月"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "十一月"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "十二月"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "一月"
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "二月"
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "八月"
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "九月"
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "十月"
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "十一月"
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "十二月"
+
+#: utils/dateformat.py:40
+msgid "p.m."
+msgstr "p.m."
+
+#: utils/dateformat.py:41
+msgid "a.m."
+msgstr "a.m."
+
+#: utils/dateformat.py:46
+msgid "PM"
+msgstr "PM"
+
+#: utils/dateformat.py:47
+msgid "AM"
+msgstr "AM"
+
+#: utils/dateformat.py:95
+msgid "midnight"
+msgstr "午夜"
+
+#: utils/dateformat.py:97
+msgid "noon"
+msgstr "中午"
+
+#: utils/translation/trans_real.py:358
+msgid "DATE_FORMAT"
+msgstr "DATE_FORMAT"
+
+#: utils/translation/trans_real.py:359
+msgid "DATETIME_FORMAT"
+msgstr "DATETIME_FORMAT"
+
+#: utils/translation/trans_real.py:360
+msgid "TIME_FORMAT"
+msgstr "TIME_FORMAT"
+
+#: utils/translation/trans_real.py:376
+msgid "YEAR_MONTH_FORMAT"
+msgstr "YEAR_MONTH_FORMAT"
+
+#: utils/translation/trans_real.py:377
+msgid "MONTH_DAY_FORMAT"
+msgstr "MONTH_DAY_FORMAT"
+
+#: oldforms/__init__.py:392
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "确保你输入的文本少于 %s 个字符。"
+
+#: oldforms/__init__.py:397
+msgid "Line breaks are not allowed here."
+msgstr "这里不允许换行符。"
+
+#: oldforms/__init__.py:498
+#: oldforms/__init__.py:571
+#: oldforms/__init__.py:610
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "选择一个有效的选项: '%(data)s' 不在 %(choices)s 中。"
+
+#: oldforms/__init__.py:577
+#: contrib/admin/filterspecs.py:150
+#: newforms/widgets.py:174
+msgid "Unknown"
+msgstr "未知"
+
+#: oldforms/__init__.py:577
+#: contrib/admin/filterspecs.py:143
+#: newforms/widgets.py:174
+msgid "Yes"
+msgstr "是"
+
+#: oldforms/__init__.py:577
+#: contrib/admin/filterspecs.py:143
+#: newforms/widgets.py:174
+msgid "No"
+msgstr "否"
+
+#: oldforms/__init__.py:672
+#: core/validators.py:174
+#: core/validators.py:445
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "未提交文件。请检查表单的编码类型。"
+
+#: oldforms/__init__.py:674
+msgid "The submitted file is empty."
+msgstr "所提交的是空文件。"
+
+#: oldforms/__init__.py:730
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "输入在 -32,768 与 32,767 之间的一个整数。"
+
+#: oldforms/__init__.py:740
+msgid "Enter a positive number."
+msgstr "输入正整数。"
+
+#: oldforms/__init__.py:750
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "输入在 0 到 32,767 之间的一个整数。"
+
+#: contrib/localflavor/no/forms.py:15
+msgid "Enter a zip code in the format XXXX."
+msgstr "以 XXXX 的格式输入一个邮政编码。"
+
+#: contrib/localflavor/no/forms.py:36
+msgid "Enter a valid Norwegian social security number."
+msgstr "请输入一个有效的挪威社会保障号码。"
+
+#: contrib/localflavor/it/forms.py:14
+#: contrib/localflavor/fr/forms.py:17
+#: contrib/localflavor/fi/forms.py:14
+#: contrib/localflavor/de/forms.py:16
+msgid "Enter a zip code in the format XXXXX."
+msgstr "以 XXXXX 的格式输入一个邮政编码。"
+
+#: contrib/localflavor/jp/forms.py:21
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "以 XXXXXXX 或 XXX-XXXX 的格式输入一个邮政编码。"
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr "北海道"
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr "青森"
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr "岩手"
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr "宫城"
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr "秋田"
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr "山形"
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr "福岛"
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr "茨城"
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr "枥木"
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr "群马"
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr "埼玉"
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr "千叶"
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr "东京"
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr "神奈川"
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr "山梨"
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr "长野"
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr "新舄"
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr "富山"
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr "石川"
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr "福井"
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr "岐阜"
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr "静冈"
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr "爱知"
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr "三重"
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr "滋贺"
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr "京都"
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr "大坂"
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr "兵库"
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr "奈良"
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr "和歌山"
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr "鸟取"
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr "岛根"
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr "冈山"
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr "广岛"
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr "山口"
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr "德岛"
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr "香川"
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr "爱媛"
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr "高知"
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr "福冈"
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr "佐贺"
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr "长崎"
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr "熊本"
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr "大分"
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr "宫崎"
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr "鹿儿岛"
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr "冲绳岛"
+
+#: contrib/localflavor/br/forms.py:18
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "以 XXXXX-XXX 的格式输入一个邮政编码。"
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "电话号码必须为 XXX-XXX-XXXX 格式。"
+
+#: contrib/localflavor/fi/forms.py:40
+#: contrib/localflavor/fi/forms.py:46
+msgid "Enter a valid Finnish social security number."
+msgstr "输入一个有效的芬兰社会保障号码。"
+
+#: contrib/localflavor/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
+msgstr "输入一个邮政编码。前后两个部分之间必须有一个空格。"
+
+#: contrib/localflavor/de/forms.py:63
+msgid "Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X format"
+msgstr "以 XXXXXXXXXXX-XXXXXXX-XXXXXXX-X 的格式输入一个有效的德国身份证号码。"
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr "巴登符腾堡州"
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr "巴伐利亚"
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr "柏林"
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr "勃兰登堡"
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr "不来梅"
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr "汉堡"
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr "黑森州"
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr "梅克伦堡-西部米拉尼亚"
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr "下萨克森"
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr "北莱茵-威斯特法伦州"
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr "莱茵河法耳茨地区"
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr "萨尔州"
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr "萨克森"
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr "萨克森-安哈尔特"
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr "石勒苏益格-荷尔斯泰因"
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr "图林根州"
+
+#: contrib/localflavor/usa/forms.py:18
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "以 XXXXX 或 XXXXX-XXX 的格式输入一个邮政编码。"
+
+#: contrib/localflavor/usa/forms.py:51
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr "以 XXX-XX-XXXX 的格式输入一个有效的美国社会保障号码。"
+
+#: contrib/sessions/models.py:68
+msgid "session key"
+msgstr "会话密钥"
+
+#: contrib/sessions/models.py:69
+msgid "session data"
+msgstr "会话数据"
+
+#: contrib/sessions/models.py:70
+msgid "expire date"
+msgstr "过期时间"
+
+#: contrib/sessions/models.py:74
+msgid "session"
+msgstr "会话"
+
+#: contrib/sessions/models.py:75
+msgid "sessions"
+msgstr "会话"
+
+#: contrib/auth/forms.py:17
+#: contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr "两个口令字段不一致。"
+
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr "已存在一位使用该名字的用户。"
+
+#: contrib/auth/forms.py:53
+msgid "Your Web browser doesn't appear to have cookies enabled. Cookies are required for logging in."
+msgstr "你的浏览器好象不允许使用cookie。登录需要使用cookie。"
+
+#: contrib/auth/forms.py:60
+#: contrib/admin/views/decorators.py:10
+msgid "Please enter a correct username and password. Note that both fields are case-sensitive."
+msgstr "请输入正确的用户名和口令。请注意两者都是大小写敏感的。"
+
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "该帐号未激活。"
+
+#: contrib/auth/forms.py:85
+msgid "That e-mail address doesn't have an associated user account. Are you sure you've registered?"
+msgstr "该电子邮件地址没有关联任何用户帐号。你确定已经注册过了?"
+
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "两个'新口令'字段不一致。"
+
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "你的旧口令不正确。请重新输入。"
+
+#: contrib/auth/views.py:39
+msgid "Logged out"
+msgstr "退出登录"
+
+#: contrib/auth/models.py:38
+#: contrib/auth/models.py:57
+msgid "name"
+msgstr "名称"
+
+#: contrib/auth/models.py:40
+msgid "codename"
+msgstr "代码名称"
+
+#: contrib/auth/models.py:42
+msgid "permission"
+msgstr "权限"
+
+#: contrib/auth/models.py:43
+#: contrib/auth/models.py:58
+msgid "permissions"
+msgstr "权限"
+
+#: contrib/auth/models.py:60
+msgid "group"
+msgstr "组"
+
+#: contrib/auth/models.py:61
+#: contrib/auth/models.py:100
+msgid "groups"
+msgstr "组"
+
+#: contrib/auth/models.py:90
+msgid "username"
+msgstr "用户名"
+
+#: contrib/auth/models.py:90
+msgid "Required. 30 characters or fewer. Alphanumeric characters only (letters, digits and underscores)."
+msgstr "必填。不多于30个字符。只能用字母数字(字母、数字和下横线)"
+
+#: contrib/auth/models.py:91
+msgid "first name"
+msgstr "名字"
+
+#: contrib/auth/models.py:92
+msgid "last name"
+msgstr "姓氏"
+
+#: contrib/auth/models.py:93
+msgid "e-mail address"
+msgstr "e-mail 地址"
+
+#: contrib/auth/models.py:94
+msgid "password"
+msgstr "口令"
+
+#: contrib/auth/models.py:94
+msgid "Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change password form</a>."
+msgstr "使用 '[algo]$[salt]$[hexdigest]' 或使用 <a href=\"password/\">修改密码表单</a>"
+
+#: contrib/auth/models.py:95
+msgid "staff status"
+msgstr "职员状态"
+
+#: contrib/auth/models.py:95
+msgid "Designates whether the user can log into this admin site."
+msgstr "指明用户是否可以登录到这个管理站点。"
+
+#: contrib/auth/models.py:96
+msgid "active"
+msgstr "有效"
+
+#: contrib/auth/models.py:96
+msgid "Designates whether this user can log into the Django admin. Unselect this instead of deleting accounts."
+msgstr "指明用户是否可以登录到这个管理站点。以反选代替删除帐号。"
+
+#: contrib/auth/models.py:97
+msgid "superuser status"
+msgstr "超级用户状态"
+
+#: contrib/auth/models.py:97
+msgid "Designates that this user has all permissions without explicitly assigning them."
+msgstr "指明用户是否可以登录到这个管理站点。"
+
+#: contrib/auth/models.py:98
+msgid "last login"
+msgstr "上次登录"
+
+#: contrib/auth/models.py:99
+msgid "date joined"
+msgstr "加入日期"
+
+#: contrib/auth/models.py:101
+msgid "In addition to the permissions manually assigned, this user will also get all permissions granted to each group he/she is in."
+msgstr "除了手工设置权限以外,用户也会从其所在组获得赋予该组的所有权限。"
+
+#: contrib/auth/models.py:102
+msgid "user permissions"
+msgstr "用户权限"
+
+#: contrib/auth/models.py:105
+msgid "user"
+msgstr "用户"
+
+#: contrib/auth/models.py:106
+msgid "users"
+msgstr "用户"
+
+#: contrib/auth/models.py:111
+msgid "Personal info"
+msgstr "个人信息"
+
+#: contrib/auth/models.py:112
+msgid "Permissions"
+msgstr "权限"
+
+#: contrib/auth/models.py:113
+msgid "Important dates"
+msgstr "重要日期"
+
+#: contrib/auth/models.py:114
+msgid "Groups"
+msgstr "组"
+
+#: contrib/auth/models.py:258
+msgid "message"
+msgstr "消息"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "th"
+msgstr "th"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "st"
+msgstr "st"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "nd"
+msgstr "nd"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "rd"
+msgstr "rd"
+
+#: contrib/humanize/templatetags/humanize.py:47
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f 百万"
+
+#: contrib/humanize/templatetags/humanize.py:50
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f 十亿"
+
+#: contrib/humanize/templatetags/humanize.py:53
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f 万亿"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "one"
+msgstr "一"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "two"
+msgstr "二"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "three"
+msgstr "三"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "four"
+msgstr "四"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "five"
+msgstr "五"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "six"
+msgstr "六"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "seven"
+msgstr "七"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "eight"
+msgstr "八"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "nine"
+msgstr "九"
+
+#: contrib/contenttypes/models.py:36
+msgid "python model class name"
+msgstr "python 模型类名"
+
+#: contrib/contenttypes/models.py:39
+msgid "content type"
+msgstr "内容类型"
+
+#: contrib/contenttypes/models.py:40
+msgid "content types"
+msgstr "内容类型"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "重定向自"
+
+#: contrib/redirects/models.py:8
+msgid "This should be an absolute path, excluding the domain name. Example: '/events/search/'."
+msgstr "应该是一个绝对路径,不包括域名。例如:'/events/search/'。"
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "重定向到"
+
+#: contrib/redirects/models.py:10
+msgid "This can be either an absolute path (as above) or a full URL starting with 'http://'."
+msgstr "可以是绝对路径(同上)或以'http://'起始的全URL。"
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "重定向"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "重定向"
+
+#: contrib/flatpages/models.py:7
+#: contrib/admin/views/doc.py:315
+msgid "URL"
+msgstr "URL"
+
+#: contrib/flatpages/models.py:8
+msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr "例如:'/about/contact/'。请确保前导和结尾的斜杠。"
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "标题"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "内容"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "允许评论"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "模板名称"
+
+#: contrib/flatpages/models.py:13
+msgid "Example: 'flatpages/contact_page.html'. If this isn't provided, the system will use 'flatpages/default.html'."
+msgstr "例如:'flatpages/contact_page.html'。若未提供,系统将使用'flatpages/default.html'。"
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "请先注册"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "如果被选中,仅登录用户才可以查看此页。"
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "简单页面"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "简单页面"
+
+#: contrib/comments/models.py:67
+#: contrib/comments/models.py:166
+msgid "object ID"
+msgstr "对象ID"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "大字标题"
+
+#: contrib/comments/models.py:69
+#: contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "评论"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "等级 #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "等级 #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "等级 #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "等级 #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "等级 #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "等级 #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "等级 #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "等级 #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "是有效等级"
+
+#: contrib/comments/models.py:83
+#: contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "日期/时间已提交"
+
+#: contrib/comments/models.py:84
+#: contrib/comments/models.py:170
+msgid "is public"
+msgstr "公开"
+
+#: contrib/comments/models.py:85
+#: contrib/admin/views/doc.py:304
+msgid "IP address"
+msgstr "IP 地址"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "已删除"
+
+#: contrib/comments/models.py:86
+msgid "Check this box if the comment is inappropriate. A \"This comment has been removed\" message will be displayed instead."
+msgstr "若评论内容不妥,则选中这个检查框。该评论将被一条\"此评论已经被删除\"的消息所替换。"
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "评论"
+
+#: contrib/comments/models.py:131
+#: contrib/comments/models.py:207
+msgid "Content object"
+msgstr "内容对象"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"由 %(user)s 在 %(date)s 张贴\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "人名"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "IP 地址"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "由团队批准"
+
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "自由评论"
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "自由评论"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "得分"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "得分日期"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "Karma 得分"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "Karma 得分"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "被 %(user)s 评为 %(score)d"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"此评论由 %(user)s 标记:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "标记日期"
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "用户标志"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "用户标志"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "由 %r 标记"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "删除日期"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "管理员删除"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "管理员删除"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "被管理员 %r 删除"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "用户名:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+msgid "Log out"
+msgstr "注销"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "口令:"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "忘记了你的口令?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "等级"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "必须的"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "可选的"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "上传一张照片"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "评论:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "预览评论"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "你的名字:"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "匿名用户不能投票"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "无效评论ID"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "不能给自已投票"
+
+#: contrib/comments/views/comments.py:27
+msgid "This rating is required because you've entered at least one other rating."
+msgstr "该等级必填,因为你已经输入了至少一个等级。"
+
+#: contrib/comments/views/comments.py:111
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"此评论由一个发表过少于 %(count)s 条评论的用户张贴:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:116
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"此评论由一个粗率的用户张贴:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:188
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "只允许 POST"
+
+#: contrib/comments/views/comments.py:192
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "一个或多个必填字段没有提交"
+
+#: contrib/comments/views/comments.py:196
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "有人通过评论表单篡改(安全侵害)"
+
+#: contrib/comments/views/comments.py:206
+#: contrib/comments/views/comments.py:292
+msgid "The comment form had an invalid 'target' parameter -- the object ID was invalid"
+msgstr "评论表单有一个无效的 'target' 参数 -- 对象 ID 无效"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "评论表单无法提供 '预览' 或 '张贴' 功能"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "域名"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "显示名称"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "站点"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "站点"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>以 %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:70
+#: contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143
+#: contrib/admin/filterspecs.py:169
+msgid "All"
+msgstr "全部"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "任意日期"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "今天"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "前7天"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "本月"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "今年"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "动作时间"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "对象id"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "对象表示"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "动作标志"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "修改消息"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "日志记录"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "日志记录"
+
+#: contrib/admin/templatetags/admin_list.py:247
+msgid "All dates"
+msgstr "所有日期"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/auth/user/change_password.html:12
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+msgid "Home"
+msgstr "首页"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+msgid "Documentation"
+msgstr "文档"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "书签"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin/auth/user/change_password.html:15
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+msgid "Change password"
+msgstr "修改口令"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "文档书签"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">为了安装书签,将链接拖到你的书签工具条,\n"
+"或者鼠标右击链接,添加到你的书签中。现在你可以从这个站\n"
+"点的任何页面选择书签。注意,其中某些书签要求你在一台\n"
+"被指定为\"内部\"的计算机上查看(如果不确定你的计算机\n"
+"是否为\"内部\"的,不妨跟你的系统管理员沟通一下)。</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "关于本页面的文档"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid "Jumps you from any page to the documentation for the view that generates that page."
+msgstr "从任何页面跳转到生成该页面的view文档。"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "显示对象 ID"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid "Shows the content-type and unique ID for pages that represent a single object."
+msgstr "为那些展现单个对象的页面,显示 content-type 和唯一ID。"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "编辑该对象(当前窗口)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "跳转到用于展现单个对象的页面的管理页。"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "编辑该对象(新窗口)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "同上,但在新窗口中打开管理页面。"
+
+#: contrib/admin/templates/admin/submit_line.html:3
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+msgid "Delete"
+msgstr "删除"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "保存为新的"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "保存并增加另一个"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "保存并继续编辑"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "保存"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "服务器错误"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "服务器错误(500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "服务器错误 <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid "There's been an error. It's been reported to the site administrators via e-mail and should be fixed shortly. Thanks for your patience."
+msgstr "发生了一个错误。它已经通过电子邮件报告给站点管理员了,而且应该很快会得到解决。感谢您的耐心。"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " 以 %(filter_title)s"
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "过滤器"
+
+#: contrib/admin/templates/admin/invalid_setup.html:8
+msgid "Something's wrong with your database installation. Make sure the appropriate database tables have been created, and make sure the database is readable by the appropriate user."
+msgstr "你的数据库安装有误。确保已经创建了相应的数据库表,并确保数据库可被相关的用户读取。"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "执行"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 条结果"
+msgstr[1] "%(counter)s 条结果"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "总共 %(full_result_count)s"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "History"
+msgstr "历史"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "日期/时间"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "用户"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "动作"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "DATE_WITH_TIME_FULL"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid "This object doesn't have a change history. It probably wasn't added via this admin site."
+msgstr "该对象没有变更历史记录。可能从未通过这个管理站点添加。"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid "Deleting the %(object_name)s '%(escaped_object)s' would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:"
+msgstr "删除 %(object_name)s  '%(escaped_object)s' 会导致删除相关的对象,但你的帐号无权删除下列类型的对象:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid "Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? All of the following related items will be deleted:"
+msgstr "你确认想要删除 %(object_name)s \"%(escaped_object)s\"? 下列所有相关的项目都将被删除:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "是的,我确定"
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "显示全部"
+
+#: contrib/admin/templates/admin/change_list.html:12
+#, python-format
+msgid "Add %(name)s"
+msgstr "增加 %(name)s"
+
+#: contrib/admin/templates/admin/change_form.html:15
+#: contrib/admin/templates/admin/index.html:28
+msgid "Add"
+msgstr "增加"
+
+#: contrib/admin/templates/admin/change_form.html:22
+msgid "View on site"
+msgstr "在站点上查看"
+
+#: contrib/admin/templates/admin/change_form.html:32
+#: contrib/admin/templates/admin/auth/user/change_password.html:24
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "请修正下面的错误。"
+
+#: contrib/admin/templates/admin/change_form.html:50
+msgid "Ordering"
+msgstr "排序中"
+
+#: contrib/admin/templates/admin/change_form.html:53
+msgid "Order:"
+msgstr "排序:"
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "欢迎,"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "页面没有找到"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "很报歉,请求页面无法找到。"
+
+#: contrib/admin/templates/admin/login.html:25
+#: contrib/admin/views/decorators.py:24
+msgid "Log in"
+msgstr "登录"
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "模型在 %(name)s 应用中可用。"
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "修改"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "你无权修改任何东西。"
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "最近动作"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "我的动作"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "无可用的"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django 站点管理员"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django 管理"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid "First, enter a username and password. Then, you'll be able to edit more user options."
+msgstr "首先,输入一个用户名和口令。然后,你就可以编辑更多的用户选项。"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "用户名"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+#: contrib/admin/templates/admin/auth/user/change_password.html:34
+msgid "Password"
+msgstr "口令"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+msgid "Password (again)"
+msgstr "口令(重复)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+msgid "Enter the same password as above, for verification."
+msgstr "为了校验,输入与上面相同的口令。"
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:28
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr "为用户<strong>%(username)s</strong>输入一个新的口令。"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "当前:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "改动:"
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "日期:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "时间:"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "感谢您今天在本站花费了一些宝贵时间。"
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "重新登录"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "之所以收到这封邮件,是因为你请求了口令重设"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "在 %(site_name)s 你的用户帐号"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "你的新口令是: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "到这个页面可以自由地修改口令:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "你的用户名,如果已忘记的话:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "感谢使用我们的站点!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s 团队"
+
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+msgid "Password reset"
+msgstr "口令重设"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "口令重设成功"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid "We've e-mailed a new password to the e-mail address you submitted. You should be receiving it shortly."
+msgstr "我们已经按你所提交的邮箱地址发送了一个新的口令。你应该很快就能收到这封邮件。"
+
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:4
+msgid "Password change"
+msgstr "口令修改"
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid "Please enter your old password, for security's sake, and then enter your new password twice so we can verify you typed it in correctly."
+msgstr "请输入你的旧口令,为了安全起见,接着要输入两遍新口令,以便我们校验你输入的是否正确。"
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "旧口令:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "新口令:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "确认口令:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "修改我的口令"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "口令修改成功"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "你的口令已修改。"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid "Forgotten your password? Enter your e-mail address below, and we'll reset your password and e-mail the new one to you."
+msgstr "忘记了你的口令?请在下面输入你的 e-mail 地址,我们将重设你的口令并将新口令通过邮件发送给你。"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "E-mail 地址:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "重设我的口令"
+
+#: contrib/admin/views/main.py:223
+msgid "Site administration"
+msgstr "站点管理"
+
+#: contrib/admin/views/main.py:257
+#: contrib/admin/views/auth.py:19
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" 添加成功。"
+
+#: contrib/admin/views/main.py:261
+#: contrib/admin/views/main.py:347
+#: contrib/admin/views/auth.py:24
+msgid "You may edit it again below."
+msgstr "你可以在下面再次编辑它。"
+
+#: contrib/admin/views/main.py:271
+#: contrib/admin/views/main.py:356
+#, python-format
+msgid "You may add another %s below."
+msgstr "你可以在下面增加另一个 %s 。"
+
+#: contrib/admin/views/main.py:289
+#, python-format
+msgid "Add %s"
+msgstr "增加 %s"
+
+#: contrib/admin/views/main.py:335
+#, python-format
+msgid "Added %s."
+msgstr "%s 已增加。"
+
+#: contrib/admin/views/main.py:337
+#, python-format
+msgid "Changed %s."
+msgstr "已修改 %s 。"
+
+#: contrib/admin/views/main.py:339
+#, python-format
+msgid "Deleted %s."
+msgstr "%s 已删除。"
+
+#: contrib/admin/views/main.py:342
+msgid "No fields changed."
+msgstr "没有字段被修改。"
+
+#: contrib/admin/views/main.py:345
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" 修改成功。"
+
+#: contrib/admin/views/main.py:353
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" 添加成功。你可以在下面再次编辑它。"
+
+#: contrib/admin/views/main.py:391
+#, python-format
+msgid "Change %s"
+msgstr "修改 %s"
+
+#: contrib/admin/views/main.py:476
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "一个或多个 %(fieldname)s 在 %(name)s 中: %(obj)s"
+
+#: contrib/admin/views/main.py:481
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "一个或多个 %(fieldname)s 在 %(name)s 中:"
+
+#: contrib/admin/views/main.py:514
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" 删除成功。"
+
+#: contrib/admin/views/main.py:517
+msgid "Are you sure?"
+msgstr "你确认吗?"
+
+#: contrib/admin/views/main.py:539
+#, python-format
+msgid "Change history: %s"
+msgstr "变更历史: %s"
+
+#: contrib/admin/views/main.py:573
+#, python-format
+msgid "Select %s"
+msgstr "选择 %s"
+
+#: contrib/admin/views/main.py:573
+#, python-format
+msgid "Select %s to change"
+msgstr "选择 %s 来修改"
+
+#: contrib/admin/views/main.py:768
+msgid "Database error"
+msgstr "数据库错误"
+
+#: contrib/admin/views/decorators.py:62
+msgid "Please log in again, because your session has expired. Don't worry: Your submission has been saved."
+msgstr "请重新登录,因为你的会话已经过期。不用担心:你的提交已保存。"
+
+#: contrib/admin/views/decorators.py:69
+msgid "Looks like your browser isn't configured to accept cookies. Please enable cookies, reload this page, and try again."
+msgstr "似乎你的浏览器没有配置为接受 cookie 。请允许 cookie,重新装入本页面,再试一次。"
+
+#: contrib/admin/views/decorators.py:83
+msgid "Usernames cannot contain the '@' character."
+msgstr "用户名不能包含 '@' 字符。"
+
+#: contrib/admin/views/decorators.py:85
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "你的 e-mail 地址不是你的用户名。换 '%s' 试试。"
+
+#: contrib/admin/views/doc.py:46
+#: contrib/admin/views/doc.py:48
+#: contrib/admin/views/doc.py:50
+msgid "tag:"
+msgstr "标签:"
+
+#: contrib/admin/views/doc.py:77
+#: contrib/admin/views/doc.py:79
+#: contrib/admin/views/doc.py:81
+msgid "filter:"
+msgstr "过滤器:"
+
+#: contrib/admin/views/doc.py:135
+#: contrib/admin/views/doc.py:137
+#: contrib/admin/views/doc.py:139
+msgid "view:"
+msgstr "视图:"
+
+#: contrib/admin/views/doc.py:164
+#, python-format
+msgid "App %r not found"
+msgstr "应用 %r 没有找到"
+
+#: contrib/admin/views/doc.py:171
+#, python-format
+msgid "Model %(name)r not found in app %(label)r"
+msgstr "在应用 %(label)r 里找不到模型 %(name)r"
+
+#: contrib/admin/views/doc.py:183
+#, python-format
+msgid "the related `%(label)s.%(type)s` object"
+msgstr "相关的 `%(label)s.%(type)s` 对象"
+
+#: contrib/admin/views/doc.py:183
+#: contrib/admin/views/doc.py:205
+#: contrib/admin/views/doc.py:219
+#: contrib/admin/views/doc.py:224
+msgid "model:"
+msgstr "模型:"
+
+#: contrib/admin/views/doc.py:214
+#, python-format
+msgid "related `%(label)s.%(name)s` objects"
+msgstr "相关的 `%(label)s.%(name)s` 对象"
+
+#: contrib/admin/views/doc.py:219
+#, python-format
+msgid "all %s"
+msgstr "所有 %s"
+
+#: contrib/admin/views/doc.py:224
+#, python-format
+msgid "number of %s"
+msgstr "%s 的数量"
+
+#: contrib/admin/views/doc.py:229
+#, python-format
+msgid "Fields on %s objects"
+msgstr "%s 对象的字段"
+
+#: contrib/admin/views/doc.py:291
+#: contrib/admin/views/doc.py:301
+#: contrib/admin/views/doc.py:303
+#: contrib/admin/views/doc.py:309
+#: contrib/admin/views/doc.py:310
+#: contrib/admin/views/doc.py:312
+msgid "Integer"
+msgstr "整数"
+
+#: contrib/admin/views/doc.py:292
+msgid "Boolean (Either True or False)"
+msgstr "布尔(True或False)"
+
+#: contrib/admin/views/doc.py:293
+#: contrib/admin/views/doc.py:311
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "字符串(最长 %(maxlength)s)"
+
+#: contrib/admin/views/doc.py:294
+msgid "Comma-separated integers"
+msgstr "逗号分隔的整数"
+
+#: contrib/admin/views/doc.py:295
+msgid "Date (without time)"
+msgstr "日期(无时间)"
+
+#: contrib/admin/views/doc.py:296
+msgid "Date (with time)"
+msgstr "日期(带时间)"
+
+#: contrib/admin/views/doc.py:297
+msgid "E-mail address"
+msgstr "E-mail 地址"
+
+#: contrib/admin/views/doc.py:298
+#: contrib/admin/views/doc.py:299
+#: contrib/admin/views/doc.py:302
+msgid "File path"
+msgstr "文件路径"
+
+#: contrib/admin/views/doc.py:300
+msgid "Decimal number"
+msgstr "小数"
+
+#: contrib/admin/views/doc.py:306
+msgid "Boolean (Either True, False or None)"
+msgstr "布尔值(True, False或None)"
+
+#: contrib/admin/views/doc.py:307
+msgid "Relation to parent model"
+msgstr "与父模型的关系"
+
+#: contrib/admin/views/doc.py:308
+msgid "Phone number"
+msgstr "电话号码"
+
+#: contrib/admin/views/doc.py:313
+msgid "Text"
+msgstr "文本"
+
+#: contrib/admin/views/doc.py:314
+msgid "Time"
+msgstr "时间"
+
+#: contrib/admin/views/doc.py:316
+msgid "U.S. state (two uppercase letters)"
+msgstr "美国州名(两个大写字母)"
+
+#: contrib/admin/views/doc.py:317
+msgid "XML text"
+msgstr "XML 文本"
+
+#: contrib/admin/views/doc.py:343
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s 似乎不是一个 urlpattern 对象"
+
+#: contrib/admin/views/auth.py:30
+msgid "Add user"
+msgstr "新增用户"
+
+#: contrib/admin/views/auth.py:57
+msgid "Password changed successfully."
+msgstr "口令修改成功。"
+
+#: contrib/admin/views/auth.py:64
+#, python-format
+msgid "Change password: %s"
+msgstr "修改口令:%s"
+
+#: newforms/fields.py:103
+#: newforms/fields.py:256
+#, python-format
+msgid "Ensure this value has at most %d characters."
+msgstr "确保你输入的文本至多 %d 个字符。"
+
+#: newforms/fields.py:105
+#: newforms/fields.py:258
+#, python-format
+msgid "Ensure this value has at least %d characters."
+msgstr "确保你输入的文本至少 %d 个字符。"
+
+#: newforms/fields.py:128
+#: core/validators.py:120
+msgid "Enter a whole number."
+msgstr "输入整数。"
+
+#: newforms/fields.py:130
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "这个值必须小于或等于 %s。"
+
+#: newforms/fields.py:132
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "这个值必须小于或等于 %s。"
+
+#: newforms/fields.py:165
+msgid "Enter a valid date."
+msgstr "输入一个有效的日期。"
+
+#: newforms/fields.py:192
+msgid "Enter a valid time."
+msgstr "输入一个有效的时间。"
+
+#: newforms/fields.py:228
+msgid "Enter a valid date/time."
+msgstr "输入一个有效的日期/时间。"
+
+#: newforms/fields.py:242
+msgid "Enter a valid value."
+msgstr "输入一个有效的值。"
+
+#: newforms/fields.py:271
+#: core/validators.py:162
+msgid "Enter a valid e-mail address."
+msgstr "输入一个有效的 e-mail 地址。"
+
+#: newforms/fields.py:289
+#: newforms/fields.py:311
+msgid "Enter a valid URL."
+msgstr "输入一个有效的 URL。"
+
+#: newforms/fields.py:313
+msgid "This URL appears to be a broken link."
+msgstr "URL %s 似乎是一个已损坏的链接。"
+
+#: newforms/fields.py:362
+#: newforms/models.py:165
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "选择一个有效的选项: 该选择不在可用的选项中。"
+
+#: newforms/fields.py:380
+#: newforms/fields.py:456
+#: newforms/models.py:182
+msgid "Enter a list of values."
+msgstr "输入一系列值。"
+
+#: newforms/fields.py:389
+#: newforms/models.py:188
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "选择一个有效的选项: '%s' 不在可用的选项中。"
+
+#: template/defaultfilters.py:491
+msgid "yes,no,maybe"
+msgstr "是、否、也许"
+
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "%(verbose_name)s 创建成功。"
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "%(verbose_name)s 更新成功。"
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "%(verbose_name)s 已被删除。"
+
+#: core/validators.py:64
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "该值只能包含字母、数字和下划线。"
+
+#: core/validators.py:68
+msgid "This value must contain only letters, numbers, underscores, dashes or slashes."
+msgstr "该值只能包含字母、数字、下划线、反斜线和斜线。"
+
+#: core/validators.py:72
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "该值只能包含字母、数字和下划线。"
+
+#: core/validators.py:76
+msgid "Uppercase letters are not allowed here."
+msgstr "这里不允许大写字母。"
+
+#: core/validators.py:80
+msgid "Lowercase letters are not allowed here."
+msgstr "这里不允许小写字母。"
+
+#: core/validators.py:87
+msgid "Enter only digits separated by commas."
+msgstr "只能输入用逗号分隔的数字。"
+
+#: core/validators.py:99
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "输入用逗号分隔的有效 e-mail 地址。"
+
+#: core/validators.py:103
+msgid "Please enter a valid IP address."
+msgstr "请输入一个有效的 IP 地址。"
+
+#: core/validators.py:107
+msgid "Empty values are not allowed here."
+msgstr "这里不允许输入空值。"
+
+#: core/validators.py:111
+msgid "Non-numeric characters aren't allowed here."
+msgstr "这里不允许非数字字符。"
+
+#: core/validators.py:115
+msgid "This value can't be comprised solely of digits."
+msgstr "该值不能全部由数字组成。"
+
+#: core/validators.py:124
+msgid "Only alphabetical characters are allowed here."
+msgstr "这里只允许字母。"
+
+#: core/validators.py:139
+msgid "Year must be 1900 or later."
+msgstr "年份必须为1900之后。"
+
+#: core/validators.py:143
+#, python-format
+msgid "Invalid date: %s"
+msgstr "无效日期: %s"
+
+#: core/validators.py:153
+msgid "Enter a valid time in HH:MM format."
+msgstr "输入一个 HH:MM 格式的有效时间。"
+
+#: core/validators.py:178
+msgid "Upload a valid image. The file you uploaded was either not an image or a corrupted image."
+msgstr "请上传一张有效的图片。您所上传的文件不是图片或者是已损坏的图片。"
+
+#: core/validators.py:185
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "URL %s 所指向的并非有效图片。"
+
+#: core/validators.py:189
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "电话号码必须为 XXX-XXX-XXXX 格式。\"%s\"是无效的。"
+
+#: core/validators.py:197
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "URL %s 所指向的并非有效 QuickTime 视频。"
+
+#: core/validators.py:201
+msgid "A valid URL is required."
+msgstr "需要一个有效的 URL。"
+
+#: core/validators.py:215
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"需要有效的 HTML。详细的错误是:\n"
+"%s"
+
+#: core/validators.py:222
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "格式错误的 XML: %s"
+
+#: core/validators.py:239
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "无效 URL: %s"
+
+#: core/validators.py:244
+#: core/validators.py:246
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "URL %s 是一个损坏的链接。"
+
+#: core/validators.py:252
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "输入一个有效的美国州名缩写。"
+
+#: core/validators.py:266
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "注意言论!%s 不允许在这里出现。"
+
+#: core/validators.py:273
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "这个字段必须与 '%s' 字段相匹配。"
+
+#: core/validators.py:292
+msgid "Please enter something for at least one field."
+msgstr "请至少在一个字段上输入些什么。"
+
+#: core/validators.py:301
+#: core/validators.py:312
+msgid "Please enter both fields or leave them both empty."
+msgstr "请输入两个字段或者两个字段都空着。"
+
+#: core/validators.py:320
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "如果 %(field)s 是 %(value)s 时这个字段必须给出"
+
+#: core/validators.py:333
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "如果 %(field)s 不是 %(value)s 时这个字段必须给出"
+
+#: core/validators.py:352
+msgid "Duplicate values are not allowed."
+msgstr "不允许重复值。"
+
+#: core/validators.py:367
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "这个值必须介于 %(lower)s 和 %(upper)s 之间。"
+
+#: core/validators.py:369
+#, python-format
+msgid "This value must be at least %s."
+msgstr "这个值必须至少为 %s"
+
+#: core/validators.py:371
+#, python-format
+msgid "This value must be no more than %s."
+msgstr "这个值不能大于 %s 。"
+
+#: core/validators.py:407
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "这个值必须是 %s 的乘方。"
+
+#: core/validators.py:418
+msgid "Please enter a valid decimal number."
+msgstr "请输入一个有效的小数。"
+
+#: core/validators.py:422
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural "Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "请输入一个有效的小数,最多 %s 个数字。 "
+
+#: core/validators.py:425
+#, python-format
+msgid "Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural "Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] "请输入一个有效的小数,最多 %s 个数字。"
+
+#: core/validators.py:428
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural "Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "请输入一个有效的小数,最多 %s 个小数位。 "
+
+#: core/validators.py:438
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "请确保你上传的文件至少 %s 字节大。"
+
+#: core/validators.py:439
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "请确保你上传的文件至多 %s 字节大。"
+
+#: core/validators.py:456
+msgid "The format for this field is wrong."
+msgstr "该字段的格式不正确。"
+
+#: core/validators.py:471
+msgid "This field is invalid."
+msgstr "该字段无效。"
+
+#: core/validators.py:507
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "不能从 %s 得到任何东西。"
+
+#: core/validators.py:510
+#, python-format
+msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "URL %(url)s 返回了无效的 Content-Type 头 '%(contenttype)s'。"
+
+#: core/validators.py:543
+#, python-format
+msgid "Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with \"%(start)s\".)"
+msgstr "请关闭还处于打开状态的 %(tag)s 标签从第 %(line)s 行。(行开始于 \"%(start)s\"。)"
+
+#: core/validators.py:547
+#, python-format
+msgid "Some text starting on line %(line)s is not allowed in that context. (Line starts with \"%(start)s\".)"
+msgstr "从 %(line)s 行开始的一些文本,不允许出现在上下文中。(行开始于 \"%(start)s\"。)"
+
+#: core/validators.py:552
+#, python-format
+msgid "\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%(start)s\".)"
+msgstr "在 %(line)s 行的\"%(attr)s\"是无效的属性。(行开始于 \"%(start)s\"。)"
+
+#: core/validators.py:557
+#, python-format
+msgid "\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%(start)s\".)"
+msgstr "在 %(line)s 行的\"<%(tag)s>\"是无效的标签。(行开始于 \"%(start)s\"。)"
+
+#: core/validators.py:561
+#, python-format
+msgid "A tag on line %(line)s is missing one or more required attributes. (Line starts with \"%(start)s\".)"
+msgstr "在行 %(line)s 的标签少了一个或多个必填的属性。(行开始于 \"%(start)s\"。)"
+
+#: core/validators.py:566
+#, python-format
+msgid "The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line starts with \"%(start)s\".)"
+msgstr "在行 %(line)s 的\"%(attr)s\"属性有一个无效的值。(行开始于 \"%(start)s\"。)"
+
diff --git a/webapp/django/conf/locale/zh_CN/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/zh_CN/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..6d1bcc1
--- /dev/null
+++ b/webapp/django/conf/locale/zh_CN/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/zh_CN/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/zh_CN/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..46b3ed4
--- /dev/null
+++ b/webapp/django/conf/locale/zh_CN/LC_MESSAGES/djangojs.po
@@ -0,0 +1,105 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-03-21 18:43+0800\n"
+"PO-Revision-Date: 2006-09-25 08:35+0800\n"
+"Last-Translator: limodou <limodou@gmail.com>\n"
+"Language-Team: limodou <limodou@gmail.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+msgid "Available %s"
+msgstr "可用 %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "全选"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "增加"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "删除"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+msgid "Chosen %s"
+msgstr "选中的 %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "选择并点击 "
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "清除全部"
+
+#: contrib/admin/media/js/dateparse.js:32
+#: contrib/admin/media/js/calendar.js:24
+msgid "January February March April May June July August September October November December"
+msgstr "一月 二月 三月 四月 五月 六月 七月 八月 九月 十月 十一月 十二月"
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "星期日 星期一 星期二 星期三 星期四 星期五 星期六"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "日 一 二 三 四 五 六"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "现在"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "时钟"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "选择一个时间"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "午夜"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "上午6点"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "正午"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "取消"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "今天"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "日历"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "昨天"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "明天"
+
diff --git a/webapp/django/conf/locale/zh_TW/LC_MESSAGES/django.mo b/webapp/django/conf/locale/zh_TW/LC_MESSAGES/django.mo
new file mode 100644
index 0000000..e3dfa52
--- /dev/null
+++ b/webapp/django/conf/locale/zh_TW/LC_MESSAGES/django.mo
Binary files differ
diff --git a/webapp/django/conf/locale/zh_TW/LC_MESSAGES/django.po b/webapp/django/conf/locale/zh_TW/LC_MESSAGES/django.po
new file mode 100644
index 0000000..1109545
--- /dev/null
+++ b/webapp/django/conf/locale/zh_TW/LC_MESSAGES/django.po
@@ -0,0 +1,2690 @@
+# zh_TW translation for Django.
+# Copyright (C) 2005-2007
+# This file is distributed under the same license as the Django package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-05-16 10:13+0200\n"
+"PO-Revision-Date: 2007-04-05 01:32+1000\n"
+"Last-Translator: terryh <terryh.tp@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: db/models/manipulators.py:307
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "含有 %(type)s 的 %(object)s 對給予的 %(field)s 已經存在了。"
+
+#: db/models/manipulators.py:308 contrib/admin/views/main.py:335
+#: contrib/admin/views/main.py:337 contrib/admin/views/main.py:339
+msgid "and"
+msgstr "和"
+
+#: db/models/fields/related.py:53
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "請輸入正確的 %s。"
+
+#: db/models/fields/related.py:642
+msgid "Separate multiple IDs with commas."
+msgstr "用逗點分隔IDs"
+
+#: db/models/fields/related.py:644
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "按住 \"Control\", 或者在 Mac 上按 \"Command\", 以選取更多值"
+
+#: db/models/fields/related.py:691
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "請輸入有效的 %(self)s ID。輸入值 %(value)r 是錯誤的。"
+msgstr[1] ""
+
+#: db/models/fields/__init__.py:42
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s 有 %(fieldname)s 已經存在。"
+
+#: db/models/fields/__init__.py:117 db/models/fields/__init__.py:274
+#: db/models/fields/__init__.py:610 db/models/fields/__init__.py:621
+#: oldforms/__init__.py:357 newforms/fields.py:80 newforms/fields.py:376
+#: newforms/fields.py:452 newforms/fields.py:463 newforms/models.py:178
+msgid "This field is required."
+msgstr "這個欄位是必須的。"
+
+#: db/models/fields/__init__.py:367
+msgid "This value must be an integer."
+msgstr "這個值必須是整數。"
+
+#: db/models/fields/__init__.py:402
+msgid "This value must be either True or False."
+msgstr "這個值必須是 True 或 False。"
+
+#: db/models/fields/__init__.py:423
+msgid "This field cannot be null."
+msgstr "這個值不能是 null。"
+
+#: db/models/fields/__init__.py:457 core/validators.py:148
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "輸入一個 YYYY-MM-DD 格式的有效日期。"
+
+#: db/models/fields/__init__.py:526 core/validators.py:157
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "輸入一個 YYYY-MM-DD HH:MM 格式的有效日期/時間。"
+
+#: db/models/fields/__init__.py:630
+msgid "Enter a valid filename."
+msgstr "輸入一個有效的檔名。"
+
+#: db/models/fields/__init__.py:751
+msgid "This value must be either None, True or False."
+msgstr "這個值必須是 None, True 或 False。"
+
+#: conf/global_settings.py:39
+msgid "Arabic"
+msgstr "阿拉伯語"
+
+#: conf/global_settings.py:40
+msgid "Bengali"
+msgstr "孟加拉語"
+
+#: conf/global_settings.py:41
+msgid "Catalan"
+msgstr "嘉泰羅尼亞語"
+
+#: conf/global_settings.py:42
+msgid "Czech"
+msgstr "捷克語"
+
+#: conf/global_settings.py:43
+msgid "Welsh"
+msgstr "威爾斯語"
+
+#: conf/global_settings.py:44
+msgid "Danish"
+msgstr "丹麥語"
+
+#: conf/global_settings.py:45
+msgid "German"
+msgstr "德語"
+
+#: conf/global_settings.py:46
+msgid "Greek"
+msgstr "希臘語"
+
+#: conf/global_settings.py:47
+msgid "English"
+msgstr "英語"
+
+#: conf/global_settings.py:48
+msgid "Spanish"
+msgstr "西班牙語"
+
+#: conf/global_settings.py:49
+msgid "Argentinean Spanish"
+msgstr "阿根廷的西班牙語"
+
+#: conf/global_settings.py:50
+msgid "Finnish"
+msgstr "芬蘭語"
+
+#: conf/global_settings.py:51
+msgid "French"
+msgstr "法語"
+
+#: conf/global_settings.py:52
+msgid "Galician"
+msgstr "加里西亞語"
+
+#: conf/global_settings.py:53
+msgid "Hungarian"
+msgstr "匈牙利語"
+
+#: conf/global_settings.py:54
+msgid "Hebrew"
+msgstr "希伯來語"
+
+#: conf/global_settings.py:55
+msgid "Icelandic"
+msgstr "冰島語"
+
+#: conf/global_settings.py:56
+msgid "Italian"
+msgstr "義大利語"
+
+#: conf/global_settings.py:57
+msgid "Japanese"
+msgstr "日語"
+
+#: conf/global_settings.py:58
+msgid "Kannada"
+msgstr "坎那達語"
+
+#: conf/global_settings.py:59
+msgid "Latvian"
+msgstr "拉脫維亞語"
+
+#: conf/global_settings.py:60
+msgid "Macedonian"
+msgstr "馬其頓語"
+
+#: conf/global_settings.py:61
+msgid "Dutch"
+msgstr "荷蘭語"
+
+#: conf/global_settings.py:62
+msgid "Norwegian"
+msgstr "挪威語"
+
+#: conf/global_settings.py:63
+msgid "Polish"
+msgstr "波蘭嶼"
+
+#: conf/global_settings.py:64
+msgid "Portugese"
+msgstr "葡萄牙語"
+
+#: conf/global_settings.py:65
+msgid "Brazilian"
+msgstr "巴西語"
+
+#: conf/global_settings.py:66
+msgid "Romanian"
+msgstr "羅馬尼亞語"
+
+#: conf/global_settings.py:67
+msgid "Russian"
+msgstr "俄語"
+
+#: conf/global_settings.py:68
+msgid "Slovak"
+msgstr "斯洛伐克語"
+
+#: conf/global_settings.py:69
+msgid "Slovenian"
+msgstr "斯洛維尼亞語"
+
+#: conf/global_settings.py:70
+msgid "Serbian"
+msgstr "塞爾維亞語"
+
+#: conf/global_settings.py:71
+msgid "Swedish"
+msgstr "瑞典語"
+
+#: conf/global_settings.py:72
+msgid "Tamil"
+msgstr "坦米爾語"
+
+#: conf/global_settings.py:73
+msgid "Telugu"
+msgstr "泰盧固語"
+
+#: conf/global_settings.py:74
+msgid "Turkish"
+msgstr "土耳其語"
+
+#: conf/global_settings.py:75
+msgid "Ukrainian"
+msgstr "烏克蘭語"
+
+#: conf/global_settings.py:76
+msgid "Simplified Chinese"
+msgstr "簡體中文"
+
+#: conf/global_settings.py:77
+msgid "Traditional Chinese"
+msgstr "繁體中文"
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "年"
+msgstr[1] ""
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "月"
+msgstr[1] ""
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "週"
+msgstr[1] ""
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "天"
+msgstr[1] ""
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "小時"
+msgstr[1] ""
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "分鐘"
+msgstr[1] ""
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "星期一"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "星期二"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "星期三"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "星期四"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "星期五"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "星期六"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "星期日"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "一月"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "二月"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "三月"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "四月"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "五月"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "六月"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "七月"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "八月"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "九月"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "十月"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "十一月"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "十二月"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr "一月"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "二月"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "三月"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "四月"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "五月"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "六月"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "七月"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "八月"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "九月"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "十月"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "十一月"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "十二月"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "一月"
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "二月"
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "八月"
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "九月"
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "十月"
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "十一月"
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "十二月"
+
+#: utils/dateformat.py:40
+msgid "p.m."
+msgstr ""
+
+#: utils/dateformat.py:41
+msgid "a.m."
+msgstr ""
+
+#: utils/dateformat.py:46
+msgid "PM"
+msgstr ""
+
+
+#: utils/dateformat.py:47
+msgid "AM"
+msgstr ""
+
+#: utils/dateformat.py:95
+msgid "midnight"
+msgstr "午夜"
+
+#: utils/dateformat.py:97
+msgid "noon"
+msgstr "中午"
+
+#: utils/translation/trans_real.py:358
+msgid "DATE_FORMAT"
+msgstr "N j, Y"
+
+#: utils/translation/trans_real.py:359
+msgid "DATETIME_FORMAT"
+msgstr "N j, Y, P"
+
+#: utils/translation/trans_real.py:360
+msgid "TIME_FORMAT"
+msgstr "P"
+
+
+#: utils/translation/trans_real.py:376
+msgid "YEAR_MONTH_FORMAT"
+msgstr "F Y"
+
+#: utils/translation/trans_real.py:377
+msgid "MONTH_DAY_FORMAT"
+
+msgstr "F j"
+
+#: oldforms/__init__.py:392
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "確定你輸入的文字少於 %s 個字。"
+msgstr[1] ""
+
+#: oldforms/__init__.py:397
+msgid "Line breaks are not allowed here."
+msgstr "這裡不允許斷行"
+
+#: oldforms/__init__.py:498 oldforms/__init__.py:571 oldforms/__init__.py:610
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "選擇一個有效的選項: '%(data)s' 不在 %(choices)s 中。"
+
+#: oldforms/__init__.py:577 contrib/admin/filterspecs.py:150
+#: newforms/widgets.py:174
+msgid "Unknown"
+msgstr "未知"
+
+#: oldforms/__init__.py:577 contrib/admin/filterspecs.py:143
+#: newforms/widgets.py:174
+msgid "Yes"
+msgstr "是"
+
+#: oldforms/__init__.py:577 contrib/admin/filterspecs.py:143
+#: newforms/widgets.py:174
+msgid "No"
+msgstr "否"
+
+#: oldforms/__init__.py:672 core/validators.py:174 core/validators.py:445
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "没有檔案被提交。請檢查表單的編碼類型。"
+
+#: oldforms/__init__.py:674
+msgid "The submitted file is empty."
+msgstr "提交的檔案是空的。"
+
+#: oldforms/__init__.py:730
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "輸入 -32,768 到 32,768 之間的一個整數。"
+
+#: oldforms/__init__.py:740
+msgid "Enter a positive number."
+msgstr "輸入正整數。"
+
+#: oldforms/__init__.py:750
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "輸入 0 到 32,768 之間的一個整數。"
+
+#: contrib/localflavor/no/forms.py:15
+msgid "Enter a zip code in the format XXXX."
+msgstr "用 XXXX 的格式輸入郵遞區號。"
+
+#: contrib/localflavor/no/forms.py:36
+msgid "Enter a valid Norwegian social security number."
+msgstr "請輸入一個有效的挪威身份證號碼。"
+
+#: contrib/localflavor/it/forms.py:14 contrib/localflavor/fr/forms.py:17
+#: contrib/localflavor/fi/forms.py:14 contrib/localflavor/de/forms.py:16
+msgid "Enter a zip code in the format XXXXX."
+msgstr "用 XXXXX 的格式輸入郵遞區號。"
+
+#: contrib/localflavor/jp/forms.py:21
+msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX."
+msgstr "用 XXXXXXX 或 XXX-XXXX 的格式輸入郵遞區號。"
+
+#: contrib/localflavor/jp/jp_prefectures.py:4
+msgid "Hokkaido"
+msgstr "北海道"
+
+#: contrib/localflavor/jp/jp_prefectures.py:5
+msgid "Aomori"
+msgstr "青森"
+
+#: contrib/localflavor/jp/jp_prefectures.py:6
+msgid "Iwate"
+msgstr "岩手"
+
+#: contrib/localflavor/jp/jp_prefectures.py:7
+msgid "Miyagi"
+msgstr "宮城縣"
+
+#: contrib/localflavor/jp/jp_prefectures.py:8
+msgid "Akita"
+msgstr "秋田"
+
+#: contrib/localflavor/jp/jp_prefectures.py:9
+msgid "Yamagata"
+msgstr "山形"
+
+#: contrib/localflavor/jp/jp_prefectures.py:10
+msgid "Fukushima"
+msgstr "福島"
+
+#: contrib/localflavor/jp/jp_prefectures.py:11
+msgid "Ibaraki"
+msgstr "茨城"
+
+#: contrib/localflavor/jp/jp_prefectures.py:12
+msgid "Tochigi"
+msgstr "櫪木"
+
+#: contrib/localflavor/jp/jp_prefectures.py:13
+msgid "Gunma"
+msgstr "群馬"
+
+#: contrib/localflavor/jp/jp_prefectures.py:14
+msgid "Saitama"
+msgstr "埼玉"
+
+#: contrib/localflavor/jp/jp_prefectures.py:15
+msgid "Chiba"
+msgstr "千葉"
+
+#: contrib/localflavor/jp/jp_prefectures.py:16
+msgid "Tokyo"
+msgstr "東京"
+
+#: contrib/localflavor/jp/jp_prefectures.py:17
+msgid "Kanagawa"
+msgstr "神奈川"
+
+#: contrib/localflavor/jp/jp_prefectures.py:18
+msgid "Yamanashi"
+msgstr "山梨"
+
+#: contrib/localflavor/jp/jp_prefectures.py:19
+msgid "Nagano"
+msgstr "長野"
+
+#: contrib/localflavor/jp/jp_prefectures.py:20
+msgid "Niigata"
+msgstr "新瀉"
+
+#: contrib/localflavor/jp/jp_prefectures.py:21
+msgid "Toyama"
+msgstr "富山"
+
+#: contrib/localflavor/jp/jp_prefectures.py:22
+msgid "Ishikawa"
+msgstr "石川"
+
+#: contrib/localflavor/jp/jp_prefectures.py:23
+msgid "Fukui"
+msgstr "福井"
+
+#: contrib/localflavor/jp/jp_prefectures.py:24
+msgid "Gifu"
+msgstr "岐阜"
+
+#: contrib/localflavor/jp/jp_prefectures.py:25
+msgid "Shizuoka"
+msgstr "靜岡"
+
+#: contrib/localflavor/jp/jp_prefectures.py:26
+msgid "Aichi"
+msgstr "愛知"
+
+#: contrib/localflavor/jp/jp_prefectures.py:27
+msgid "Mie"
+msgstr "三重"
+
+#: contrib/localflavor/jp/jp_prefectures.py:28
+msgid "Shiga"
+msgstr "滋賀"
+
+#: contrib/localflavor/jp/jp_prefectures.py:29
+msgid "Kyoto"
+msgstr "京都"
+
+#: contrib/localflavor/jp/jp_prefectures.py:30
+msgid "Osaka"
+msgstr "大阪"
+
+#: contrib/localflavor/jp/jp_prefectures.py:31
+msgid "Hyogo"
+msgstr "兵庫"
+
+#: contrib/localflavor/jp/jp_prefectures.py:32
+msgid "Nara"
+msgstr "奈良"
+
+#: contrib/localflavor/jp/jp_prefectures.py:33
+msgid "Wakayama"
+msgstr "和歌山"
+
+#: contrib/localflavor/jp/jp_prefectures.py:34
+msgid "Tottori"
+msgstr "鳥取"
+
+#: contrib/localflavor/jp/jp_prefectures.py:35
+msgid "Shimane"
+msgstr "島根"
+
+#: contrib/localflavor/jp/jp_prefectures.py:36
+msgid "Okayama"
+msgstr "岡山"
+
+#: contrib/localflavor/jp/jp_prefectures.py:37
+msgid "Hiroshima"
+msgstr "廣島"
+
+#: contrib/localflavor/jp/jp_prefectures.py:38
+msgid "Yamaguchi"
+msgstr "山口"
+
+#: contrib/localflavor/jp/jp_prefectures.py:39
+msgid "Tokushima"
+msgstr "德島"
+
+#: contrib/localflavor/jp/jp_prefectures.py:40
+msgid "Kagawa"
+msgstr "香川"
+
+#: contrib/localflavor/jp/jp_prefectures.py:41
+msgid "Ehime"
+msgstr "愛媛縣"
+
+#: contrib/localflavor/jp/jp_prefectures.py:42
+msgid "Kochi"
+msgstr "高知"
+
+#: contrib/localflavor/jp/jp_prefectures.py:43
+msgid "Fukuoka"
+msgstr "福岡"
+
+#: contrib/localflavor/jp/jp_prefectures.py:44
+msgid "Saga"
+msgstr "左賀"
+
+#: contrib/localflavor/jp/jp_prefectures.py:45
+msgid "Nagasaki"
+msgstr "長崎"
+
+#: contrib/localflavor/jp/jp_prefectures.py:46
+msgid "Kumamoto"
+msgstr "熊本"
+
+#: contrib/localflavor/jp/jp_prefectures.py:47
+msgid "Oita"
+msgstr "大分"
+
+#: contrib/localflavor/jp/jp_prefectures.py:48
+msgid "Miyazaki"
+msgstr "宫崎"
+
+#: contrib/localflavor/jp/jp_prefectures.py:49
+msgid "Kagoshima"
+msgstr "鹿兒島"
+
+#: contrib/localflavor/jp/jp_prefectures.py:50
+msgid "Okinawa"
+msgstr "琉球"
+
+#: contrib/localflavor/br/forms.py:18
+msgid "Enter a zip code in the format XXXXX-XXX."
+msgstr "用 XXXXX-XXX 的格式輸入郵遞區號。"
+
+#: contrib/localflavor/br/forms.py:30
+msgid "Phone numbers must be in XX-XXXX-XXXX format."
+msgstr "電話號碼必須是 XX-XXXX-XXXX 格式。"
+
+#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:46
+msgid "Enter a valid Finnish social security number."
+msgstr "請輸入一個有效的芬蘭身份證號碼。"
+
+#: contrib/localflavor/uk/forms.py:18
+msgid "Enter a postcode. A space is required between the two postcode parts."
+msgstr "輸入郵政區號。兩組的必須要有空格"
+
+#: contrib/localflavor/de/forms.py:63
+msgid ""
+"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X "
+"format"
+msgstr ""
+"以 XXXXXXXXXXX-XXXXXXX-XXXXXXX-X 的格式輸入一個有效的德國身份證號碼。"
+
+
+#: contrib/localflavor/de/de_states.py:5
+msgid "Baden-Wuerttemberg"
+msgstr "巴登符騰堡"
+
+#: contrib/localflavor/de/de_states.py:6
+msgid "Bavaria"
+msgstr "巴伐利亞"
+
+#: contrib/localflavor/de/de_states.py:7
+msgid "Berlin"
+msgstr "柏林"
+
+#: contrib/localflavor/de/de_states.py:8
+msgid "Brandenburg"
+msgstr "勃蘭登堡"
+
+#: contrib/localflavor/de/de_states.py:9
+msgid "Bremen"
+msgstr "布萊梅"
+
+#: contrib/localflavor/de/de_states.py:10
+msgid "Hamburg"
+msgstr "漢堡"
+
+#: contrib/localflavor/de/de_states.py:11
+msgid "Hessen"
+msgstr "黑森"
+
+#: contrib/localflavor/de/de_states.py:12
+msgid "Mecklenburg-Western Pomerania"
+msgstr "梅克倫堡-前波莫瑞"
+
+#: contrib/localflavor/de/de_states.py:13
+msgid "Lower Saxony"
+msgstr "下薩克森"
+
+#: contrib/localflavor/de/de_states.py:14
+msgid "North Rhine-Westphalia"
+msgstr "北萊茵-威斯特法倫"
+
+#: contrib/localflavor/de/de_states.py:15
+msgid "Rhineland-Palatinate"
+msgstr "萊茵蘭-普法爾茨"
+
+#: contrib/localflavor/de/de_states.py:16
+msgid "Saarland"
+msgstr "薩爾蘭"
+
+#: contrib/localflavor/de/de_states.py:17
+msgid "Saxony"
+msgstr "薩克森"
+
+#: contrib/localflavor/de/de_states.py:18
+msgid "Saxony-Anhalt"
+msgstr "薩克森-安哈爾特"
+
+#: contrib/localflavor/de/de_states.py:19
+msgid "Schleswig-Holstein"
+msgstr "石勒蘇益格-荷爾斯泰因"
+
+#: contrib/localflavor/de/de_states.py:20
+msgid "Thuringia"
+msgstr "圖林根"
+
+#: contrib/localflavor/usa/forms.py:18
+msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX."
+msgstr "以 XXXXX 或 XXXXX-XXX 的格式輸入一個郵遞區號。"
+
+#: contrib/localflavor/usa/forms.py:51
+msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format."
+msgstr "以 XXX-XX-XXXX 的格式輸入一有效的美国身份證字號。"
+
+#: contrib/sessions/models.py:68
+msgid "session key"
+msgstr "session 鍵值"
+
+#: contrib/sessions/models.py:69
+msgid "session data"
+msgstr "session 資料"
+
+#: contrib/sessions/models.py:70
+msgid "expire date"
+msgstr "到期日期"
+
+#: contrib/sessions/models.py:74
+msgid "session"
+msgstr "session"
+
+#: contrib/sessions/models.py:75
+msgid "sessions"
+msgstr "sessions"
+
+#: contrib/auth/forms.py:17 contrib/auth/forms.py:138
+msgid "The two password fields didn't match."
+msgstr "兩個密碼欄位不同。"
+
+#: contrib/auth/forms.py:25
+msgid "A user with that username already exists."
+msgstr "一個相同名稱的使用者已經存在。"
+
+#: contrib/auth/forms.py:53
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr "你的Web瀏覽器好象不允許使用cookie。登入時需要使用cookie。"
+
+#: contrib/auth/forms.py:60 contrib/admin/views/decorators.py:10
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr "請輸入有效的使用者名稱與密碼。請注意兩個欄位都有分大小寫"
+
+#: contrib/auth/forms.py:62
+msgid "This account is inactive."
+msgstr "這個帳戶未啟用"
+
+#: contrib/auth/forms.py:85
+msgid ""
+"That e-mail address doesn't have an associated user account. Are you sure "
+"you've registered?"
+msgstr "這個電子郵件地址没有和任何用户帳號有關聯。你確定你已經註冊了?"
+
+#: contrib/auth/forms.py:117
+msgid "The two 'new password' fields didn't match."
+msgstr "兩個'新密碼'欄位不一致"
+
+#: contrib/auth/forms.py:124
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "你的舊密碼不正確。請重新輸入。"
+
+#: contrib/auth/views.py:39
+msgid "Logged out"
+msgstr "登出"
+
+#: contrib/auth/models.py:38 contrib/auth/models.py:57
+msgid "name"
+msgstr "名稱"
+
+#: contrib/auth/models.py:40
+msgid "codename"
+msgstr "代碼"
+
+#: contrib/auth/models.py:42
+msgid "permission"
+msgstr "權限"
+
+#: contrib/auth/models.py:43 contrib/auth/models.py:58
+msgid "permissions"
+msgstr "權限"
+
+#: contrib/auth/models.py:60
+msgid "group"
+msgstr "群組"
+
+#: contrib/auth/models.py:61 contrib/auth/models.py:100
+msgid "groups"
+msgstr "群組"
+
+#: contrib/auth/models.py:90
+msgid "username"
+msgstr "使用者名稱"
+
+#: contrib/auth/models.py:90
+msgid ""
+"Required. 30 characters or fewer. Alphanumeric characters only (letters, "
+"digits and underscores)."
+msgstr "必須。不超過30。只能用能字母數字與底線(字母、數字和底線)。"
+
+#: contrib/auth/models.py:91
+msgid "first name"
+msgstr "名字"
+
+#: contrib/auth/models.py:92
+msgid "last name"
+msgstr "姓氏"
+
+#: contrib/auth/models.py:93
+msgid "e-mail address"
+msgstr "電子郵件地址"
+
+#: contrib/auth/models.py:94
+msgid "password"
+msgstr "密碼"
+
+#: contrib/auth/models.py:94
+msgid ""
+"Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change "
+"password form</a>."
+msgstr "使用 '[algo]$[salt]$[hexdigest]' 或是 <a href=\"password/\">修改密碼表單</a>."
+
+#: contrib/auth/models.py:95
+msgid "staff status"
+msgstr "工作人員狀態"
+
+#: contrib/auth/models.py:95
+msgid "Designates whether the user can log into this admin site."
+msgstr "指定是否使用者可以登入此管理網站。"
+
+#: contrib/auth/models.py:96
+msgid "active"
+msgstr "活動中"
+
+#: contrib/auth/models.py:96
+msgid ""
+"Designates whether this user can log into the Django admin. Unselect this "
+"instead of deleting accounts."
+msgstr "指定是否使用者可以登入此管理網站。用取消選擇來取代刪除帳號。"
+
+#: contrib/auth/models.py:97
+msgid "superuser status"
+msgstr "超級使用者狀態"
+
+#: contrib/auth/models.py:97
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr "指定是否使用者可以登入到這個管理網站"
+
+#: contrib/auth/models.py:98
+msgid "last login"
+msgstr "上次登入"
+
+#: contrib/auth/models.py:99
+msgid "date joined"
+msgstr "加入日期"
+
+#: contrib/auth/models.py:101
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr "除了手動指定的權限之外,這個使用者也會得到其群組擁有的所有權限。"
+
+#: contrib/auth/models.py:102
+msgid "user permissions"
+msgstr "使用者權限"
+
+#: contrib/auth/models.py:105
+msgid "user"
+msgstr "使用者"
+
+#: contrib/auth/models.py:106
+msgid "users"
+msgstr "使用者"
+
+#: contrib/auth/models.py:111
+msgid "Personal info"
+msgstr "個人資訊"
+
+#: contrib/auth/models.py:112
+msgid "Permissions"
+msgstr "權限"
+
+#: contrib/auth/models.py:113
+msgid "Important dates"
+msgstr "重要日期"
+
+#: contrib/auth/models.py:114
+msgid "Groups"
+msgstr "群組"
+
+#: contrib/auth/models.py:258
+msgid "message"
+msgstr "訊息"
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "th"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "st"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "nd"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:17
+msgid "rd"
+msgstr ""
+
+#: contrib/humanize/templatetags/humanize.py:47
+#, python-format
+msgid "%(value).1f million"
+msgid_plural "%(value).1f million"
+msgstr[0] "%(value).1f 百萬"
+msgstr[1] ""
+
+#: contrib/humanize/templatetags/humanize.py:50
+#, python-format
+msgid "%(value).1f billion"
+msgid_plural "%(value).1f billion"
+msgstr[0] "%(value).1f 十億"
+msgstr[1] ""
+
+#: contrib/humanize/templatetags/humanize.py:53
+#, python-format
+msgid "%(value).1f trillion"
+msgid_plural "%(value).1f trillion"
+msgstr[0] "%(value).1f 兆"
+msgstr[1] ""
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "one"
+msgstr "一"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "two"
+msgstr "二"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "three"
+msgstr "三"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "four"
+msgstr "四"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "five"
+msgstr "五"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "six"
+msgstr "六"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "seven"
+msgstr "七"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "eight"
+msgstr "八"
+
+#: contrib/humanize/templatetags/humanize.py:68
+msgid "nine"
+msgstr "九"
+
+#: contrib/contenttypes/models.py:36
+msgid "python model class name"
+msgstr "python模組名稱"
+
+#: contrib/contenttypes/models.py:39
+msgid "content type"
+msgstr "內容類型"
+
+#: contrib/contenttypes/models.py:40
+msgid "content types"
+msgstr "內容類型"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "重導向自"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr "應該是一個絕對路徑,不包括網域。例如:'/events/search/'。"
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "重導向到"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr "此可為一絕對路徑 (如上) 或一個以 'http://' 開頭的完整 URL。"
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "重導向"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "重導向"
+
+#: contrib/flatpages/models.py:7 contrib/admin/views/doc.py:315
+msgid "URL"
+msgstr "URL"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr "例如: '/about/contact/'。開頭與結束都一定要有斜線。"
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "標題"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "內容"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "啟用評論"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "模板名稱"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
+"will use 'flatpages/default.html'."
+msgstr "例如: 'flatpages/contact_page'。如果沒有提供它,系統會使用 'flatpages/default.html'。"
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "需要註冊"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "如果此項被選取,則只有登入的使用者可以檢視頁面。"
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "簡平頁面"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "簡平頁面"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "物件 ID"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "頭條"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "評論"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "等級 #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "等級 #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "等級 #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "等級 #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "等級 #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "等級 #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "等級 #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "等級 #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "是有效的等級"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "日期/時間已發送"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "是公開的"
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289
+msgid "IP address"
+msgstr "IP 位址"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "已移除"
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr "如果此評論不恰當則選取這個方塊,其將以 \"此評論已被移除\" 訊息取代。"
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "評論"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "內容物件"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"由 %(user)s 在 %(date)s 張貼\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "人名"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "ip 位址"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "由工作人員核准"
+
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "自由評論"
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "自由評論"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "分數"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "分數日期"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "Karma 分數"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "Karma 分數"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "被 %(user)s 定級為 %(score)d "
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"此評論被 %(user)s 標識:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "標識日期"
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "使用者旗標"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "使用者旗標"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "被 %r 標識"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "刪除日期"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "仲裁刪除"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "仲裁刪除"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "由 %r 仲裁刪除"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+msgid "Log out"
+msgstr "登出"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "密碼"
+
+#: contrib/comments/templates/comments/form.html:8
+msgid "Forgotten your password?"
+msgstr "忘記密碼"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "等級"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "必須的"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "可選的"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "上傳一張照片"
+
+#: contrib/comments/templates/comments/form.html:28
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "評論:"
+
+#: contrib/comments/templates/comments/form.html:35
+#: contrib/comments/templates/comments/freeform.html:10
+msgid "Preview comment"
+msgstr "評論預覽"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "你的名字:"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "匿名使用者不可投票"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "無效的評論 ID"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "不能投票給你自己"
+
+#: contrib/comments/views/comments.py:27
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr "此等級被要求是因為你至少輸入了一個其它的等級。"
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"此評論由一個發表數少於 %(count)s 則評論的使用者張貼:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:116
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"此評論由一個膚淺的使用者張貼:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:188
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "只允許張貼"
+
+#: contrib/comments/views/comments.py:192
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "一個或多個所需的欄位沒有送出"
+
+#: contrib/comments/views/comments.py:196
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "有人篡改了評論表單 (違反保全)"
+
+#: contrib/comments/views/comments.py:206
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr "此評論表單有一個無效的 'target' 參數 -- 物件 ID 是無效的"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "評論表格無法提供 '預覽' 或 '張貼' 功能"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "網域名稱"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "顯示名稱"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "網站"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "網站"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>由 %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169
+msgid "All"
+msgstr "全部"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "任何日期"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "今天"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "過去 7 天"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "本月"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "今年"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "動作時間"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "物件 id"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "物件 repr"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "動作旗標"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "變更訊息"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "紀錄項目"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "紀錄項目"
+
+#: contrib/admin/templatetags/admin_list.py:247
+msgid "All dates"
+msgstr "所有日期"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/base.html:30
+#: contrib/admin/templates/admin/auth/user/change_password.html:12
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+msgid "Home"
+msgstr "首頁"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+msgid "Documentation"
+msgstr "文件"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "書籤"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:25
+#: contrib/admin/templates/admin/auth/user/change_password.html:9
+#: contrib/admin/templates/admin/auth/user/change_password.html:15
+#: contrib/admin/templates/admin/auth/user/change_password.html:46
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+msgid "Change password"
+msgstr "變更密碼"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "文件 bookmarklets"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">要安裝 bookmarklet,把連結拖進你的書籤工具列,或右擊該連結"
+"後新增到你的書籤裡。現在你可以從網站的任何頁面來選擇 bookmarklet。注意其中某"
+"些 bookmarklet 要求你必須是從被稱為 \"內部\" 的電腦來檢視網站的 (如果你不確定"
+"你的電腦是否在 \"內部\",那就和你的系統管理員談談)。</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "本頁面的文件"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr "讓你跳到用來產生該頁面之檢視的任何一頁文件。"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "顯示物件 ID"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr "顯示用來表示單一物件的頁面 content-type 與唯一 ID。"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "編輯此物件 (目前視窗)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "跳到用來表示單一物件的管理頁面。"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "編輯此物件 (新視窗)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "如上,但在新視窗裡開啟管理頁面。"
+
+#: contrib/admin/templates/admin/submit_line.html:3
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+msgid "Delete"
+msgstr "刪除"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "儲存為新的"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "儲存並新增另一個"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "儲存並繼續編輯"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "儲存"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "伺服器錯誤"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "伺服器錯誤 (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "伺服器錯誤 <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr "存在一個錯誤。它已經透過電子郵件回報給網站管理員了,並且應該很快被改正。謝謝你的關心。"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(filter_title)s "
+msgstr " 由 %(filter_title)s"
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "過濾器"
+
+#: contrib/admin/templates/admin/invalid_setup.html:8
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr "你的資料庫安裝有錯誤。確定資料庫表格已經建立,並確定資料庫可被合適的使用者讀取。"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "去"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "1 則结果"
+msgstr[1] "%(counter)s 則结果"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "總共 %(full_result_count)s"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:21
+
+msgid "History"
+msgstr "歷史"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "日期/時間"
+
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "使用者"
+
+#: contrib/admin/templates/admin/object_history.html:20
+
+msgid "Action"
+msgstr "動作"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "N j, Y, P"
+
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr "這個物件沒有變更的歷史。它可能不是透過這個管理網站新增的。"
+
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
+"related objects, but your account doesn't have permission to delete the "
+
+"following types of objects:"
+msgstr ""
+"刪除 %(object_name)s '%(escaped_object)s' 會把相關的物件也刪除,不過你的帳號並沒有刪"
+"除以下型態物件的權限:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+
+"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
+"All of the following related items will be deleted:"
+msgstr ""
+"你確定想要刪除 %(object_name)s \"%(escaped_object)s\"?以下所有的相關項目都會被刪除:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "是的,我確定"
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "顯示全部"
+
+#: contrib/admin/templates/admin/change_list.html:12
+#, python-format
+msgid "Add %(name)s"
+msgstr "新增 %(name)s"
+
+#: contrib/admin/templates/admin/change_form.html:15
+#: contrib/admin/templates/admin/index.html:28
+msgid "Add"
+msgstr "新增"
+
+#: contrib/admin/templates/admin/change_form.html:22
+msgid "View on site"
+msgstr "在網站上檢視"
+
+#: contrib/admin/templates/admin/change_form.html:32
+#: contrib/admin/templates/admin/auth/user/change_password.html:24
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "请更正下面的錯誤。"
+
+#: contrib/admin/templates/admin/change_form.html:50
+msgid "Ordering"
+msgstr "排序中"
+
+#: contrib/admin/templates/admin/change_form.html:53
+msgid "Order:"
+msgstr "排序:"
+
+#: contrib/admin/templates/admin/base.html:25
+msgid "Welcome,"
+msgstr "歡迎"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "頁面沒有找到"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "很抱歉,請求的頁面無法找到。"
+
+#: contrib/admin/templates/admin/login.html:25
+#: contrib/admin/views/decorators.py:24
+msgid "Log in"
+msgstr "登入"
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "在 %(name)s 應用中模形可用。"
+
+#: contrib/admin/templates/admin/index.html:18
+#, python-format
+msgid "%(name)s"
+msgstr "%(name)s"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "變更"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "你沒有編輯任何東西的權限。"
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "最近的動作"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "我的動作"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "沒有可用的"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django 網站管理"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django 管理"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:6
+msgid ""
+"First, enter a username and password. Then, you'll be able to edit more user "
+"options."
+msgstr "首先,輸入一個使用者名稱和密碼。然後你可以編輯更多使用者選項。"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:12
+msgid "Username"
+msgstr "使用者名稱"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:18
+#: contrib/admin/templates/admin/auth/user/change_password.html:34
+msgid "Password"
+msgstr "密碼"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:23
+#: contrib/admin/templates/admin/auth/user/change_password.html:39
+msgid "Password (again)"
+msgstr "密碼(重複)"
+
+#: contrib/admin/templates/admin/auth/user/add_form.html:24
+#: contrib/admin/templates/admin/auth/user/change_password.html:40
+msgid "Enter the same password as above, for verification."
+msgstr ""
+
+#: contrib/admin/templates/admin/auth/user/change_password.html:28
+#, python-format
+msgid "Enter a new password for the user <strong>%(username)s</strong>."
+msgstr ""
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "目前"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "修改"
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "日期"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "時間"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "感謝你今天花了重要的時間留在本網站。"
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "再次登入"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "因為你要求重設密碼,所以收到了這封電子郵件"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "你在 %(site_name)s 裡的使用者帳號"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "你的新密碼是: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "放心地到此頁面變更密碼:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "你的使用者名稱,萬一你已經忘記的話:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "感謝使用本網站!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s 團隊"
+
+
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+msgid "Password reset"
+msgstr "密碼重設"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "密碼成功地重設"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr "我們已經把新的密碼寄到你送出的電子郵件地址。你應該不久就能收到。"
+
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:4
+msgid "Password change"
+msgstr "密碼變更"
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr "為了安全上的考慮,請輸入你的舊密碼,再輸入新密碼兩次,讓我們核驗你已正確地輸入。"
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "舊密碼"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "新密碼"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "確認密碼"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "變更我的密碼"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "密碼成功地變更"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "你的密碼已變更。"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr "忘記你的密碼了?在下面輸入你的電子郵件地址,我們就會重設你的密碼並把新的用電"
+"子郵件寄給你。"
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "電子郵件地址:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "重設我的密碼"
+
+#: contrib/admin/views/main.py:223
+msgid "Site administration"
+msgstr "網站管理"
+
+#: contrib/admin/views/main.py:257 contrib/admin/views/auth.py:19
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" 已成功變更。"
+
+#: contrib/admin/views/main.py:261 contrib/admin/views/main.py:347
+#: contrib/admin/views/auth.py:24
+msgid "You may edit it again below."
+msgstr "你可以在下面再編輯一次。"
+
+#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356
+#, python-format
+msgid "You may add another %s below."
+msgstr "你可以在下面新增另一個 %s。"
+
+#: contrib/admin/views/main.py:289
+#, python-format
+msgid "Add %s"
+msgstr "新增 %s"
+
+#: contrib/admin/views/main.py:335
+#, python-format
+msgid "Added %s."
+msgstr "%s 已新增。"
+
+#: contrib/admin/views/main.py:337
+#, python-format
+msgid "Changed %s."
+msgstr "%s 已變更。"
+
+#: contrib/admin/views/main.py:339
+#, python-format
+msgid "Deleted %s."
+msgstr "%s 已删除。"
+
+#: contrib/admin/views/main.py:342
+msgid "No fields changed."
+msgstr "沒有欄位被變更。"
+
+#: contrib/admin/views/main.py:345
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr ""
+
+#: contrib/admin/views/main.py:353
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" 已成功變更。"
+
+#: contrib/admin/views/main.py:391
+#, python-format
+msgid "Change %s"
+msgstr "變更 %s"
+
+#: contrib/admin/views/main.py:476
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "在 %(name)s: 裡的一個或多個 %(fieldname)s %(obj)s"
+
+#: contrib/admin/views/main.py:481
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "在 %(name)s 裡的一個或多個 %(fieldname)s:"
+
+#: contrib/admin/views/main.py:514
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" 已成功刪除。"
+
+#: contrib/admin/views/main.py:517
+msgid "Are you sure?"
+msgstr "你確定?"
+
+#: contrib/admin/views/main.py:539
+#, python-format
+msgid "Change history: %s"
+msgstr "變更歷史: %s"
+
+#: contrib/admin/views/main.py:573
+#, python-format
+msgid "Select %s"
+msgstr "選擇 %s"
+
+#: contrib/admin/views/main.py:573
+#, python-format
+msgid "Select %s to change"
+msgstr "選擇 %s 來變更"
+
+#: contrib/admin/views/main.py:768
+msgid "Database error"
+msgstr "資料庫錯誤"
+
+#: contrib/admin/views/decorators.py:62
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr "請再登入一次,因為你的 session 已經到期。不必擔心: 你的提交已被儲存。"
+
+#: contrib/admin/views/decorators.py:69
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr "看起來你的瀏覽器沒有設定成允許 cookie。請啟用 cookie、重新載入此頁,然後再試一次"
+
+#: contrib/admin/views/decorators.py:83
+msgid "Usernames cannot contain the '@' character."
+msgstr "使用者名稱不能包含 '@' 字元。"
+
+#: contrib/admin/views/decorators.py:85
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "你的電子郵件地址不是你的使用者名稱。試著改用 '%s'。"
+
+#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48
+#: contrib/admin/views/doc.py:50
+msgid "tag:"
+msgstr "標籤:"
+
+#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79
+#: contrib/admin/views/doc.py:81
+msgid "filter:"
+msgstr "過濾器:"
+
+#: contrib/admin/views/doc.py:135 contrib/admin/views/doc.py:137
+#: contrib/admin/views/doc.py:139
+msgid "view:"
+msgstr "視圖:"
+
+#: contrib/admin/views/doc.py:164
+#, python-format
+msgid "App %r not found"
+msgstr "應用程式 %r 没有找到"
+
+#: contrib/admin/views/doc.py:171
+#, python-format
+msgid "Model %(name)r not found in app %(label)r"
+msgstr "在應用程式 %(label)r 裡找不到模型 %(name)r"
+
+#: contrib/admin/views/doc.py:183
+#, python-format
+msgid "the related `%(label)s.%(type)s` object"
+msgstr "相關的 `%(label)s.%(type)s` 物件"
+
+#: contrib/admin/views/doc.py:183 contrib/admin/views/doc.py:205
+#: contrib/admin/views/doc.py:219 contrib/admin/views/doc.py:224
+msgid "model:"
+msgstr "模型:"
+
+#: contrib/admin/views/doc.py:214
+#, python-format
+msgid "related `%(label)s.%(name)s` objects"
+msgstr "相關的 `%(label)s.%(name)s` 物件"
+
+#: contrib/admin/views/doc.py:219
+#, python-format
+msgid "all %s"
+msgstr "所有 %s"
+
+#: contrib/admin/views/doc.py:224
+#, python-format
+msgid "number of %s"
+msgstr "%s 的数量"
+
+#: contrib/admin/views/doc.py:229
+#, python-format
+msgid "Fields on %s objects"
+msgstr "%s 物件的欄位"
+
+#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:301
+#: contrib/admin/views/doc.py:303 contrib/admin/views/doc.py:309
+#: contrib/admin/views/doc.py:310 contrib/admin/views/doc.py:312
+msgid "Integer"
+msgstr "整數"
+
+#: contrib/admin/views/doc.py:292
+msgid "Boolean (Either True or False)"
+msgstr "布林值 (True 或 False)"
+
+#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:311
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "字串(最長 %(maxlength)s)"
+
+#: contrib/admin/views/doc.py:294
+msgid "Comma-separated integers"
+msgstr "逗號分隔的整數"
+
+#: contrib/admin/views/doc.py:295
+msgid "Date (without time)"
+msgstr "日期 (不包括時間)"
+
+#: contrib/admin/views/doc.py:296
+msgid "Date (with time)"
+msgstr "日期 (包括時間)"
+
+#: contrib/admin/views/doc.py:297
+msgid "E-mail address"
+msgstr "電子郵件地址"
+
+#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:299
+#: contrib/admin/views/doc.py:302
+msgid "File path"
+msgstr "檔案路徑"
+
+#: contrib/admin/views/doc.py:300
+msgid "Decimal number"
+msgstr "小數"
+
+#: contrib/admin/views/doc.py:306
+msgid "Boolean (Either True, False or None)"
+msgstr "布林值 (True, False 或 None)"
+
+#: contrib/admin/views/doc.py:307
+msgid "Relation to parent model"
+msgstr "與父模型的關係"
+
+#: contrib/admin/views/doc.py:308
+msgid "Phone number"
+msgstr "電話號碼"
+
+#: contrib/admin/views/doc.py:313
+msgid "Text"
+msgstr "文字"
+
+#: contrib/admin/views/doc.py:314
+msgid "Time"
+msgstr "時間"
+
+#: contrib/admin/views/doc.py:316
+msgid "U.S. state (two uppercase letters)"
+msgstr "美國州名 (兩個大寫字母)"
+
+#: contrib/admin/views/doc.py:317
+msgid "XML text"
+msgstr "XML 文件"
+
+#: contrib/admin/views/doc.py:343
+#, python-format
+msgid "%s does not appear to be a urlpattern object"
+msgstr "%s 似乎不是一個 urlpattern 物件"
+
+#: contrib/admin/views/auth.py:30
+msgid "Add user"
+msgstr "增加使用者"
+
+#: contrib/admin/views/auth.py:57
+msgid "Password changed successfully."
+msgstr ""
+
+#: contrib/admin/views/auth.py:64
+#, python-format
+msgid "Change password: %s"
+msgstr "密碼變更: %s"
+
+#: newforms/fields.py:103 newforms/fields.py:256
+#, python-format
+msgid "Ensure this value has at most %d characters."
+msgstr "確定你輸入的值最多有 %d 字。"
+
+#: newforms/fields.py:105 newforms/fields.py:258
+#, python-format
+msgid "Ensure this value has at least %d characters."
+msgstr "確定你輸入的值最少有 %d 字。"
+
+#: newforms/fields.py:128 core/validators.py:120
+msgid "Enter a whole number."
+msgstr "輸入整數"
+
+#: newforms/fields.py:130
+#, python-format
+msgid "Ensure this value is less than or equal to %s."
+msgstr "這個值必须小於或等於 %s。"
+
+#: newforms/fields.py:132
+#, python-format
+msgid "Ensure this value is greater than or equal to %s."
+msgstr "這個值必须大於或等於 %s。"
+
+#: newforms/fields.py:165
+msgid "Enter a valid date."
+msgstr "輸入有效的日期"
+
+#: newforms/fields.py:192
+msgid "Enter a valid time."
+msgstr "輸入有效的時間"
+
+#: newforms/fields.py:228
+msgid "Enter a valid date/time."
+msgstr "輸入有效的日期/時間"
+
+#: newforms/fields.py:242
+msgid "Enter a valid value."
+msgstr "輸入有效的值"
+
+#: newforms/fields.py:271 core/validators.py:162
+msgid "Enter a valid e-mail address."
+msgstr "輸入有效的電子郵件地址。"
+
+#: newforms/fields.py:289 newforms/fields.py:311
+msgid "Enter a valid URL."
+msgstr "輸入有效的URL"
+
+#: newforms/fields.py:313
+msgid "This URL appears to be a broken link."
+msgstr "URL似乎是是斷掉的連結。"
+
+#: newforms/fields.py:362 newforms/models.py:165
+msgid "Select a valid choice. That choice is not one of the available choices."
+msgstr "選擇有效的選項: 此選擇不在可用的选项中。"
+
+#: newforms/fields.py:380 newforms/fields.py:456 newforms/models.py:182
+msgid "Enter a list of values."
+msgstr "輸入一個列表的值"
+
+#: newforms/fields.py:389 newforms/models.py:188
+#, python-format
+msgid "Select a valid choice. %s is not one of the available choices."
+msgstr "選擇一個有效的選項: '%s' 不在可用的選項中。"
+
+#: template/defaultfilters.py:491
+msgid "yes,no,maybe"
+msgstr "是、否、也許"
+
+#: views/generic/create_update.py:43
+#, python-format
+msgid "The %(verbose_name)s was created successfully."
+msgstr "%(verbose_name)s 新增成功。"
+
+#: views/generic/create_update.py:117
+#, python-format
+msgid "The %(verbose_name)s was updated successfully."
+msgstr "%(verbose_name)s 變更成功。"
+
+#: views/generic/create_update.py:184
+#, python-format
+msgid "The %(verbose_name)s was deleted."
+msgstr "%(verbose_name)s 已被删除。"
+
+#: core/validators.py:64
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "此值僅能包含字母、數字與底線。"
+
+#: core/validators.py:68
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr "此值僅能包含字母、數字、底線與斜線。"
+
+#: core/validators.py:72
+msgid "This value must contain only letters, numbers, underscores or hyphens."
+msgstr "此值僅能包含字母、數字、底線與連字號"
+
+#: core/validators.py:76
+msgid "Uppercase letters are not allowed here."
+msgstr "此處不允許大寫字母。"
+
+#: core/validators.py:80
+msgid "Lowercase letters are not allowed here."
+msgstr "此處不允許小寫字母。"
+
+#: core/validators.py:87
+msgid "Enter only digits separated by commas."
+msgstr "輸入以逗號分隔的數字。"
+
+#: core/validators.py:99
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "輸入以逗號分隔的有效電子郵件地址。"
+
+#: core/validators.py:103
+msgid "Please enter a valid IP address."
+msgstr "請輸入有效的 IP 位址。"
+
+#: core/validators.py:107
+msgid "Empty values are not allowed here."
+msgstr "此處不允許空值。"
+
+#: core/validators.py:111
+msgid "Non-numeric characters aren't allowed here."
+msgstr "此處不允許非數字字元。"
+
+#: core/validators.py:115
+msgid "This value can't be comprised solely of digits."
+msgstr "此值不能只以數字組成。"
+
+#: core/validators.py:124
+msgid "Only alphabetical characters are allowed here."
+msgstr "此處只允許字母。"
+
+#: core/validators.py:139
+msgid "Year must be 1900 or later."
+msgstr "年份必須是1900或之後"
+
+#: core/validators.py:143
+#, python-format
+msgid "Invalid date: %s"
+msgstr ""
+
+#: core/validators.py:153
+msgid "Enter a valid time in HH:MM format."
+
+msgstr "輸入 HH:MM 有效的時間格式。"
+
+#: core/validators.py:178
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr "上傳一個有效的影像。你上傳的檔案不是影像,否則就是壞掉的圖。"
+
+#: core/validators.py:185
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "URL %s 不是指向一個有效的圖片。"
+
+#: core/validators.py:189
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "電話號碼必須是 XXX-XXX-XXXX 格式。\"%s\" 無效。"
+
+#: core/validators.py:197
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+
+msgstr "URL %s 未指向有效的 QuickTime 視像。"
+
+#: core/validators.py:201
+msgid "A valid URL is required."
+msgstr "必須是有效的 URL。"
+
+
+#: core/validators.py:215
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"必須是有效的 HTML。具體的錯誤是:\n"
+"%s"
+
+#: core/validators.py:222
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "排列錯誤的 XML: %s"
+
+#: core/validators.py:239
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "無效的 URL: %s"
+
+#: core/validators.py:244 core/validators.py:246
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "URL %s 是斷掉的連結。"
+
+#: core/validators.py:252
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "輸入有效的 U.S. 州名簡稱。"
+
+#: core/validators.py:266
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "看住你的嘴!此處不允許 %s 這樣的字眼。"
+msgstr[1] ""
+
+#: core/validators.py:273
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "此欄位必須符合 '%s' 欄位。"
+
+#: core/validators.py:292
+msgid "Please enter something for at least one field."
+msgstr "請在至少一個欄位裡進行輸入。"
+
+#: core/validators.py:301 core/validators.py:312
+msgid "Please enter both fields or leave them both empty."
+msgstr "請輸入兩個欄位或全部留空。"
+
+#: core/validators.py:320
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "如果 %(field)s 是 %(value)s 則此欄位必須給定。"
+
+#: core/validators.py:333
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "如果 %(field)s 不是 %(value)s 則此欄位必須給定。"
+
+#: core/validators.py:352
+msgid "Duplicate values are not allowed."
+msgstr "不允許重複值。"
+
+#: core/validators.py:367
+#, python-format
+msgid "This value must be between %(lower)s and %(upper)s."
+msgstr "這個值必須介於 %(lower)s 和 %(upper)s 之間。"
+
+#: core/validators.py:369
+#, python-format
+msgid "This value must be at least %s."
+msgstr "這個值需要至少為 %s 。"
+
+#: core/validators.py:371
+#, python-format
+
+msgid "This value must be no more than %s."
+msgstr "這個值不能大於 %s 。"
+
+#: core/validators.py:407
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "此值必須是 %s 的乘方。"
+
+#: core/validators.py:418
+msgid "Please enter a valid decimal number."
+msgstr "請輸入有效的小數。"
+
+#: core/validators.py:422
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "請輸入最長 %s 位的有效小數。"
+msgstr[1] "請輸入最長 %s 位的有效小數。"
+
+#: core/validators.py:425
+#, python-format
+msgid ""
+"Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural ""
+"Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] "請輸入最長 %s 位的有效小數。"
+msgstr[1] "請輸入最長 %s 位的有效小數。"
+
+
+#: core/validators.py:428
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "請輸入小數最長 %s 位的有效小數。"
+msgstr[1] "請輸入小數最長 %s 位的有效小數。"
+
+#: core/validators.py:438
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "確定你上傳的檔案至少有 %s 位元組。"
+
+#: core/validators.py:439
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "確定你上傳的檔案最多是 %s 位元組。"
+
+#: core/validators.py:456
+msgid "The format for this field is wrong."
+msgstr "此欄位的格式錯誤。"
+
+#: core/validators.py:471
+msgid "This field is invalid."
+msgstr "此欄位錯誤"
+
+#: core/validators.py:507
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "無法從 %s 取得任何東西。"
+
+#: core/validators.py:510
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "URL %(url)s 傳回了無效的 Content-Type 標頭 '%(contenttype)s'。"
+
+#: core/validators.py:543
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"請將第 %(line)s 行開始未封閉的 %(tag)s 標籤封閉起來 (行開始於 \"%(start)s"
+"\")。"
+
+#: core/validators.py:547
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr "該內容不允許某些從第 %(line)s 開始的文字 (行開始於 \"%(start)s\")。"
+
+#: core/validators.py:552
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"第 \"%(line)s\" 的 \"%(attr)s\" 是無效的屬性 (行開始於 \"%(start)s\")。"
+
+#: core/validators.py:557
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr "第 %(line)s 行的 \"<%(tag)s>\" 是無效的標籤 (行開始於 \"%(start)s\")。"
+
+#: core/validators.py:561
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"第 %(line)s 有一個標籤缺少了一個或更多必需的屬性 (行開始於 \"%(start)s\")。"
+
+#: core/validators.py:566
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr "第 \"%(line)s\" 的 \"%(attr)s\" 屬性是無效的值 (行開始於 \"%(start)s\")。"
diff --git a/webapp/django/conf/locale/zh_TW/LC_MESSAGES/djangojs.mo b/webapp/django/conf/locale/zh_TW/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..fae1fdc
--- /dev/null
+++ b/webapp/django/conf/locale/zh_TW/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/webapp/django/conf/locale/zh_TW/LC_MESSAGES/djangojs.po b/webapp/django/conf/locale/zh_TW/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..120d08d
--- /dev/null
+++ b/webapp/django/conf/locale/zh_TW/LC_MESSAGES/djangojs.po
@@ -0,0 +1,118 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-28 17:36+1000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr ""
+
+#: contrib/admin/media/js/dateparse.js:32
+#: contrib/admin/media/js/calendar.js:24
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr ""
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:47
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Now"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:51
+msgid "Clock"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:78
+msgid "Choose a time"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "Midnight"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "6 a.m."
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:84
+msgid "Noon"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:88
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
+msgid "Cancel"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:128
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:177
+msgid "Today"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:132
+msgid "Calendar"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:175
+msgid "Yesterday"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
+msgid "Tomorrow"
+msgstr ""
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr ""
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr ""
diff --git a/webapp/django/conf/project_template/__init__.py b/webapp/django/conf/project_template/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/conf/project_template/__init__.py
diff --git a/webapp/django/conf/project_template/manage.py b/webapp/django/conf/project_template/manage.py
new file mode 100755
index 0000000..5e78ea9
--- /dev/null
+++ b/webapp/django/conf/project_template/manage.py
@@ -0,0 +1,11 @@
+#!/usr/bin/env python
+from django.core.management import execute_manager
+try:
+    import settings # Assumed to be in the same directory.
+except ImportError:
+    import sys
+    sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__)
+    sys.exit(1)
+
+if __name__ == "__main__":
+    execute_manager(settings)
diff --git a/webapp/django/conf/project_template/settings.py b/webapp/django/conf/project_template/settings.py
new file mode 100644
index 0000000..bbf005d
--- /dev/null
+++ b/webapp/django/conf/project_template/settings.py
@@ -0,0 +1,79 @@
+# Django settings for {{ project_name }} project.
+
+DEBUG = True
+TEMPLATE_DEBUG = DEBUG
+
+ADMINS = (
+    # ('Your Name', 'your_email@domain.com'),
+)
+
+MANAGERS = ADMINS
+
+DATABASE_ENGINE = ''           # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
+DATABASE_NAME = ''             # Or path to database file if using sqlite3.
+DATABASE_USER = ''             # Not used with sqlite3.
+DATABASE_PASSWORD = ''         # Not used with sqlite3.
+DATABASE_HOST = ''             # Set to empty string for localhost. Not used with sqlite3.
+DATABASE_PORT = ''             # Set to empty string for default. Not used with sqlite3.
+
+# Local time zone for this installation. Choices can be found here:
+# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
+# although not all choices may be available on all operating systems.
+# If running in a Windows environment this must be set to the same as your
+# system time zone.
+TIME_ZONE = 'America/Chicago'
+
+# Language code for this installation. All choices can be found here:
+# http://www.i18nguy.com/unicode/language-identifiers.html
+LANGUAGE_CODE = 'en-us'
+
+SITE_ID = 1
+
+# If you set this to False, Django will make some optimizations so as not
+# to load the internationalization machinery.
+USE_I18N = True
+
+# Absolute path to the directory that holds media.
+# Example: "/home/media/media.lawrence.com/"
+MEDIA_ROOT = ''
+
+# URL that handles the media served from MEDIA_ROOT. Make sure to use a
+# trailing slash if there is a path component (optional in other cases).
+# Examples: "http://media.lawrence.com", "http://example.com/media/"
+MEDIA_URL = ''
+
+# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
+# trailing slash.
+# Examples: "http://foo.com/media/", "/media/".
+ADMIN_MEDIA_PREFIX = '/media/'
+
+# Make this unique, and don't share it with anybody.
+SECRET_KEY = ''
+
+# List of callables that know how to import templates from various sources.
+TEMPLATE_LOADERS = (
+    'django.template.loaders.filesystem.load_template_source',
+    'django.template.loaders.app_directories.load_template_source',
+#     'django.template.loaders.eggs.load_template_source',
+)
+
+MIDDLEWARE_CLASSES = (
+    'django.middleware.common.CommonMiddleware',
+    'django.contrib.sessions.middleware.SessionMiddleware',
+    'django.contrib.auth.middleware.AuthenticationMiddleware',
+)
+
+ROOT_URLCONF = '{{ project_name }}.urls'
+
+TEMPLATE_DIRS = (
+    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
+    # Always use forward slashes, even on Windows.
+    # Don't forget to use absolute paths, not relative paths.
+)
+
+INSTALLED_APPS = (
+    'django.contrib.auth',
+    'django.contrib.contenttypes',
+    'django.contrib.sessions',
+    'django.contrib.sites',
+)
diff --git a/webapp/django/conf/project_template/urls.py b/webapp/django/conf/project_template/urls.py
new file mode 100644
index 0000000..7c9fab9
--- /dev/null
+++ b/webapp/django/conf/project_template/urls.py
@@ -0,0 +1,16 @@
+from django.conf.urls.defaults import *
+
+# Uncomment the next two lines to enable the admin:
+# from django.contrib import admin
+# admin.autodiscover()
+
+urlpatterns = patterns('',
+    # Example:
+    # (r'^{{ project_name }}/', include('{{ project_name }}.foo.urls')),
+
+    # Uncomment the next line to enable admin documentation:
+    # (r'^admin/doc/', include('django.contrib.admindocs.urls')),
+
+    # Uncomment the next line to enable the admin:
+    # (r'^admin/(.*)', admin.site.root),
+)
diff --git a/webapp/django/conf/urls/__init__.py b/webapp/django/conf/urls/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/conf/urls/__init__.py
diff --git a/webapp/django/conf/urls/defaults.py b/webapp/django/conf/urls/defaults.py
new file mode 100644
index 0000000..26cdd3e
--- /dev/null
+++ b/webapp/django/conf/urls/defaults.py
@@ -0,0 +1,32 @@
+from django.core.urlresolvers import RegexURLPattern, RegexURLResolver
+from django.core.exceptions import ImproperlyConfigured
+
+__all__ = ['handler404', 'handler500', 'include', 'patterns', 'url']
+
+handler404 = 'django.views.defaults.page_not_found'
+handler500 = 'django.views.defaults.server_error'
+
+include = lambda urlconf_module: [urlconf_module]
+
+def patterns(prefix, *args):
+    pattern_list = []
+    for t in args:
+        if isinstance(t, (list, tuple)):
+            t = url(prefix=prefix, *t)
+        elif isinstance(t, RegexURLPattern):
+            t.add_prefix(prefix)
+        pattern_list.append(t)
+    return pattern_list
+
+def url(regex, view, kwargs=None, name=None, prefix=''):
+    if type(view) == list:
+        # For include(...) processing.
+        return RegexURLResolver(regex, view[0], kwargs)
+    else:
+        if isinstance(view, basestring):
+            if not view:
+                raise ImproperlyConfigured('Empty URL pattern view name not permitted (for pattern %r)' % regex)
+            if prefix:
+                view = prefix + '.' + view
+        return RegexURLPattern(regex, view, kwargs, name)
+
diff --git a/webapp/django/conf/urls/i18n.py b/webapp/django/conf/urls/i18n.py
new file mode 100644
index 0000000..00e2d60
--- /dev/null
+++ b/webapp/django/conf/urls/i18n.py
@@ -0,0 +1,5 @@
+from django.conf.urls.defaults import *
+
+urlpatterns = patterns('',
+    (r'^setlang/$', 'django.views.i18n.set_language'),
+)
diff --git a/webapp/django/conf/urls/shortcut.py b/webapp/django/conf/urls/shortcut.py
new file mode 100644
index 0000000..135f3be
--- /dev/null
+++ b/webapp/django/conf/urls/shortcut.py
@@ -0,0 +1,5 @@
+from django.conf.urls.defaults import *
+
+urlpatterns = patterns('django.views',
+    (r'^(?P<content_type_id>\d+)/(?P<object_id>.*)/$', 'defaults.shortcut'),
+)
diff --git a/webapp/django/contrib/__init__.py b/webapp/django/contrib/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/__init__.py
diff --git a/webapp/django/contrib/admin/__init__.py b/webapp/django/contrib/admin/__init__.py
new file mode 100644
index 0000000..704dc58
--- /dev/null
+++ b/webapp/django/contrib/admin/__init__.py
@@ -0,0 +1,19 @@
+from django.contrib.admin.options import ModelAdmin, HORIZONTAL, VERTICAL
+from django.contrib.admin.options import StackedInline, TabularInline
+from django.contrib.admin.sites import AdminSite, site
+
+def autodiscover():
+    """
+    Auto-discover INSTALLED_APPS admin.py modules and fail silently when 
+    not present. This forces an import on them to register any admin bits they
+    may want.
+    """
+    import imp
+    from django.conf import settings
+    for app in settings.INSTALLED_APPS:
+        try:
+            imp.find_module("admin", __import__(app, {}, {}, [app.split(".")[-1]]).__path__)
+        except ImportError:
+            # there is no app admin.py, skip it
+            continue
+        __import__("%s.admin" % app)
diff --git a/webapp/django/contrib/admin/filterspecs.py b/webapp/django/contrib/admin/filterspecs.py
new file mode 100644
index 0000000..d6a4a0b
--- /dev/null
+++ b/webapp/django/contrib/admin/filterspecs.py
@@ -0,0 +1,179 @@
+"""
+FilterSpec encapsulates the logic for displaying filters in the Django admin.
+Filters are specified in models with the "list_filter" option.
+
+Each filter subclass knows how to display a filter for a field that passes a
+certain test -- e.g. being a DateField or ForeignKey.
+"""
+
+from django.db import models
+from django.utils.encoding import smart_unicode, iri_to_uri
+from django.utils.translation import ugettext as _
+from django.utils.html import escape
+from django.utils.safestring import mark_safe
+import datetime
+
+class FilterSpec(object):
+    filter_specs = []
+    def __init__(self, f, request, params, model, model_admin):
+        self.field = f
+        self.params = params
+
+    def register(cls, test, factory):
+        cls.filter_specs.append((test, factory))
+    register = classmethod(register)
+
+    def create(cls, f, request, params, model, model_admin):
+        for test, factory in cls.filter_specs:
+            if test(f):
+                return factory(f, request, params, model, model_admin)
+    create = classmethod(create)
+
+    def has_output(self):
+        return True
+
+    def choices(self, cl):
+        raise NotImplementedError()
+
+    def title(self):
+        return self.field.verbose_name
+
+    def output(self, cl):
+        t = []
+        if self.has_output():
+            t.append(_(u'<h3>By %s:</h3>\n<ul>\n') % escape(self.title()))
+
+            for choice in self.choices(cl):
+                t.append(u'<li%s><a href="%s">%s</a></li>\n' % \
+                    ((choice['selected'] and ' class="selected"' or ''),
+                     iri_to_uri(choice['query_string']),
+                     choice['display']))
+            t.append('</ul>\n\n')
+        return mark_safe("".join(t))
+
+class RelatedFilterSpec(FilterSpec):
+    def __init__(self, f, request, params, model, model_admin):
+        super(RelatedFilterSpec, self).__init__(f, request, params, model, model_admin)
+        if isinstance(f, models.ManyToManyField):
+            self.lookup_title = f.rel.to._meta.verbose_name
+        else:
+            self.lookup_title = f.verbose_name
+        self.lookup_kwarg = '%s__%s__exact' % (f.name, f.rel.to._meta.pk.name)
+        self.lookup_val = request.GET.get(self.lookup_kwarg, None)
+        self.lookup_choices = f.rel.to._default_manager.all()
+
+    def has_output(self):
+        return len(self.lookup_choices) > 1
+
+    def title(self):
+        return self.lookup_title
+
+    def choices(self, cl):
+        yield {'selected': self.lookup_val is None,
+               'query_string': cl.get_query_string({}, [self.lookup_kwarg]),
+               'display': _('All')}
+        for val in self.lookup_choices:
+            pk_val = getattr(val, self.field.rel.to._meta.pk.attname)
+            yield {'selected': self.lookup_val == smart_unicode(pk_val),
+                   'query_string': cl.get_query_string({self.lookup_kwarg: pk_val}),
+                   'display': val}
+
+FilterSpec.register(lambda f: bool(f.rel), RelatedFilterSpec)
+
+class ChoicesFilterSpec(FilterSpec):
+    def __init__(self, f, request, params, model, model_admin):
+        super(ChoicesFilterSpec, self).__init__(f, request, params, model, model_admin)
+        self.lookup_kwarg = '%s__exact' % f.name
+        self.lookup_val = request.GET.get(self.lookup_kwarg, None)
+
+    def choices(self, cl):
+        yield {'selected': self.lookup_val is None,
+               'query_string': cl.get_query_string({}, [self.lookup_kwarg]),
+               'display': _('All')}
+        for k, v in self.field.choices:
+            yield {'selected': smart_unicode(k) == self.lookup_val,
+                    'query_string': cl.get_query_string({self.lookup_kwarg: k}),
+                    'display': v}
+
+FilterSpec.register(lambda f: bool(f.choices), ChoicesFilterSpec)
+
+class DateFieldFilterSpec(FilterSpec):
+    def __init__(self, f, request, params, model, model_admin):
+        super(DateFieldFilterSpec, self).__init__(f, request, params, model, model_admin)
+
+        self.field_generic = '%s__' % self.field.name
+
+        self.date_params = dict([(k, v) for k, v in params.items() if k.startswith(self.field_generic)])
+
+        today = datetime.date.today()
+        one_week_ago = today - datetime.timedelta(days=7)
+        today_str = isinstance(self.field, models.DateTimeField) and today.strftime('%Y-%m-%d 23:59:59') or today.strftime('%Y-%m-%d')
+
+        self.links = (
+            (_('Any date'), {}),
+            (_('Today'), {'%s__year' % self.field.name: str(today.year),
+                       '%s__month' % self.field.name: str(today.month),
+                       '%s__day' % self.field.name: str(today.day)}),
+            (_('Past 7 days'), {'%s__gte' % self.field.name: one_week_ago.strftime('%Y-%m-%d'),
+                             '%s__lte' % f.name: today_str}),
+            (_('This month'), {'%s__year' % self.field.name: str(today.year),
+                             '%s__month' % f.name: str(today.month)}),
+            (_('This year'), {'%s__year' % self.field.name: str(today.year)})
+        )
+
+    def title(self):
+        return self.field.verbose_name
+
+    def choices(self, cl):
+        for title, param_dict in self.links:
+            yield {'selected': self.date_params == param_dict,
+                   'query_string': cl.get_query_string(param_dict, [self.field_generic]),
+                   'display': title}
+
+FilterSpec.register(lambda f: isinstance(f, models.DateField), DateFieldFilterSpec)
+
+class BooleanFieldFilterSpec(FilterSpec):
+    def __init__(self, f, request, params, model, model_admin):
+        super(BooleanFieldFilterSpec, self).__init__(f, request, params, model, model_admin)
+        self.lookup_kwarg = '%s__exact' % f.name
+        self.lookup_kwarg2 = '%s__isnull' % f.name
+        self.lookup_val = request.GET.get(self.lookup_kwarg, None)
+        self.lookup_val2 = request.GET.get(self.lookup_kwarg2, None)
+
+    def title(self):
+        return self.field.verbose_name
+
+    def choices(self, cl):
+        for k, v in ((_('All'), None), (_('Yes'), '1'), (_('No'), '0')):
+            yield {'selected': self.lookup_val == v and not self.lookup_val2,
+                   'query_string': cl.get_query_string({self.lookup_kwarg: v}, [self.lookup_kwarg2]),
+                   'display': k}
+        if isinstance(self.field, models.NullBooleanField):
+            yield {'selected': self.lookup_val2 == 'True',
+                   'query_string': cl.get_query_string({self.lookup_kwarg2: 'True'}, [self.lookup_kwarg]),
+                   'display': _('Unknown')}
+
+FilterSpec.register(lambda f: isinstance(f, models.BooleanField) or isinstance(f, models.NullBooleanField), BooleanFieldFilterSpec)
+
+# This should be registered last, because it's a last resort. For example,
+# if a field is eligible to use the BooleanFieldFilterSpec, that'd be much
+# more appropriate, and the AllValuesFilterSpec won't get used for it.
+class AllValuesFilterSpec(FilterSpec):
+    def __init__(self, f, request, params, model, model_admin):
+        super(AllValuesFilterSpec, self).__init__(f, request, params, model, model_admin)
+        self.lookup_val = request.GET.get(f.name, None)
+        self.lookup_choices = model_admin.queryset(request).distinct().order_by(f.name).values(f.name)
+
+    def title(self):
+        return self.field.verbose_name
+
+    def choices(self, cl):
+        yield {'selected': self.lookup_val is None,
+               'query_string': cl.get_query_string({}, [self.field.name]),
+               'display': _('All')}
+        for val in self.lookup_choices:
+            val = smart_unicode(val[self.field.name])
+            yield {'selected': self.lookup_val == val,
+                   'query_string': cl.get_query_string({self.field.name: val}),
+                   'display': val}
+FilterSpec.register(lambda f: True, AllValuesFilterSpec)
diff --git a/webapp/django/contrib/admin/helpers.py b/webapp/django/contrib/admin/helpers.py
new file mode 100644
index 0000000..ba49f8b
--- /dev/null
+++ b/webapp/django/contrib/admin/helpers.py
@@ -0,0 +1,141 @@
+
+from django import forms
+from django.conf import settings
+from django.utils.html import escape
+from django.utils.safestring import mark_safe
+from django.utils.encoding import force_unicode
+from django.contrib.admin.util import flatten_fieldsets
+
+class AdminForm(object):
+    def __init__(self, form, fieldsets, prepopulated_fields):
+        self.form, self.fieldsets = form, fieldsets
+        self.prepopulated_fields = [{
+            'field': form[field_name],
+            'dependencies': [form[f] for f in dependencies]
+        } for field_name, dependencies in prepopulated_fields.items()]
+
+    def __iter__(self):
+        for name, options in self.fieldsets:
+            yield Fieldset(self.form, name, **options)
+
+    def first_field(self):
+        for bf in self.form:
+            return bf
+
+    def _media(self):
+        media = self.form.media
+        for fs in self:
+            media = media + fs.media
+        return media
+    media = property(_media)
+
+class Fieldset(object):
+    def __init__(self, form, name=None, fields=(), classes=(), description=None):
+        self.form = form
+        self.name, self.fields = name, fields
+        self.classes = u' '.join(classes)
+        self.description = description
+
+    def _media(self):
+        if 'collapse' in self.classes:
+            return forms.Media(js=['%sjs/admin/CollapsedFieldsets.js' % settings.ADMIN_MEDIA_PREFIX])
+        return forms.Media()
+    media = property(_media)
+
+    def __iter__(self):
+        for field in self.fields:
+            yield Fieldline(self.form, field)
+
+class Fieldline(object):
+    def __init__(self, form, field):
+        self.form = form # A django.forms.Form instance
+        if isinstance(field, basestring):
+            self.fields = [field]
+        else:
+            self.fields = field
+
+    def __iter__(self):
+        for i, field in enumerate(self.fields):
+            yield AdminField(self.form, field, is_first=(i == 0))
+
+    def errors(self):
+        return mark_safe(u'\n'.join([self.form[f].errors.as_ul() for f in self.fields]).strip('\n'))
+
+class AdminField(object):
+    def __init__(self, form, field, is_first):
+        self.field = form[field] # A django.forms.BoundField instance
+        self.is_first = is_first # Whether this field is first on the line
+        self.is_checkbox = isinstance(self.field.field.widget, forms.CheckboxInput)
+
+    def label_tag(self):
+        classes = []
+        if self.is_checkbox:
+            classes.append(u'vCheckboxLabel')
+            contents = force_unicode(escape(self.field.label))
+        else:
+            contents = force_unicode(escape(self.field.label)) + u':'
+        if self.field.field.required:
+            classes.append(u'required')
+        if not self.is_first:
+            classes.append(u'inline')
+        attrs = classes and {'class': u' '.join(classes)} or {}
+        return self.field.label_tag(contents=contents, attrs=attrs)
+
+class InlineAdminFormSet(object):
+    """
+    A wrapper around an inline formset for use in the admin system.
+    """
+    def __init__(self, inline, formset, fieldsets):
+        self.opts = inline
+        self.formset = formset
+        self.fieldsets = fieldsets
+
+    def __iter__(self):
+        for form, original in zip(self.formset.initial_forms, self.formset.get_queryset()):
+            yield InlineAdminForm(self.formset, form, self.fieldsets, self.opts.prepopulated_fields, original)
+        for form in self.formset.extra_forms:
+            yield InlineAdminForm(self.formset, form, self.fieldsets, self.opts.prepopulated_fields, None)
+
+    def fields(self):
+        for field_name in flatten_fieldsets(self.fieldsets):
+            yield self.formset.form.base_fields[field_name]
+
+    def _media(self):
+        media = self.opts.media + self.formset.media
+        for fs in self:
+            media = media + fs.media
+        return media
+    media = property(_media)
+
+class InlineAdminForm(AdminForm):
+    """
+    A wrapper around an inline form for use in the admin system.
+    """
+    def __init__(self, formset, form, fieldsets, prepopulated_fields, original):
+        self.formset = formset
+        self.original = original
+        self.show_url = original and hasattr(original, 'get_absolute_url')
+        super(InlineAdminForm, self).__init__(form, fieldsets, prepopulated_fields)
+
+    def pk_field(self):
+        return AdminField(self.form, self.formset._pk_field_name, False)
+
+    def deletion_field(self):
+        from django.forms.formsets import DELETION_FIELD_NAME
+        return AdminField(self.form, DELETION_FIELD_NAME, False)
+
+    def ordering_field(self):
+        from django.forms.formsets import ORDERING_FIELD_NAME
+        return AdminField(self.form, ORDERING_FIELD_NAME, False)
+
+class AdminErrorList(forms.util.ErrorList):
+    """
+    Stores all errors for the form/formsets in an add/change stage view.
+    """
+    def __init__(self, form, inline_formsets):
+        if form.is_bound:
+            self.extend(form.errors.values())
+            for inline_formset in inline_formsets:
+                self.extend(inline_formset.non_form_errors())
+                for errors_in_inline_form in inline_formset.errors:
+                    self.extend(errors_in_inline_form.values())
diff --git a/webapp/django/contrib/admin/media/css/base.css b/webapp/django/contrib/admin/media/css/base.css
new file mode 100644
index 0000000..9760d67
--- /dev/null
+++ b/webapp/django/contrib/admin/media/css/base.css
@@ -0,0 +1,14 @@
+/*
+    DJANGO Admin
+    by Wilson Miner wilson@lawrence.com
+*/
+
+/* Block IE 5 */
+@import "null.css?\"\{";
+
+/* Import other styles */
+@import url('global.css');
+@import url('layout.css');
+
+/* Import patch for IE 6 Windows */
+/*\*/ @import "patch-iewin.css"; /**/
diff --git a/webapp/django/contrib/admin/media/css/changelists.css b/webapp/django/contrib/admin/media/css/changelists.css
new file mode 100644
index 0000000..4834be4
--- /dev/null
+++ b/webapp/django/contrib/admin/media/css/changelists.css
@@ -0,0 +1,50 @@
+@import url('base.css');
+
+/* CHANGELISTS */
+#changelist { position:relative; width:100%; }
+#changelist table { width:100%; }
+.change-list .filtered table { border-right:1px solid #ddd;  }
+.change-list .filtered { min-height:400px; }
+.change-list .filtered { background:white url(../img/admin/changelist-bg.gif) top right repeat-y !important; }
+.change-list .filtered table, .change-list .filtered .paginator, .filtered #toolbar, .filtered div.xfull { margin-right:160px !important; width:auto !important; }
+.change-list .filtered table tbody th { padding-right:1em; }
+#changelist .toplinks { border-bottom:1px solid #ccc !important; }
+#changelist .paginator { color:#666; border-top:1px solid #eee; border-bottom:1px solid #eee; background:white url(../img/admin/nav-bg.gif) 0 180% repeat-x; overflow:hidden; }
+.change-list .filtered .paginator { border-right:1px solid #ddd; }
+
+/*  CHANGELIST TABLES  */
+#changelist table thead th { white-space:nowrap; }
+#changelist table tbody td { border-left: 1px solid #ddd; }
+#changelist table tfoot { color: #666; }
+
+/*  TOOLBAR  */
+#changelist #toolbar { padding:3px; border-bottom:1px solid #ddd; background:#e1e1e1 url(../img/admin/nav-bg.gif) top left repeat-x; color:#666; }
+#changelist #toolbar form input { font-size:11px; padding:1px 2px; }
+#changelist #toolbar form #searchbar { padding:2px; }
+#changelist #changelist-search img { vertical-align:middle; }
+
+/*  FILTER COLUMN  */
+#changelist-filter { position:absolute; top:0; right:0; z-index:1000; width:160px; border-left:1px solid #ddd; background:#efefef; margin:0; }
+#changelist-filter h2 { font-size:11px; padding:2px 5px; border-bottom:1px solid #ddd; }
+#changelist-filter h3 { font-size:12px; margin-bottom:0; }
+#changelist-filter ul { padding-left:0;margin-left:10px; }
+#changelist-filter li { list-style-type:none; margin-left:0; padding-left:0; }
+#changelist-filter a { color:#999; }
+#changelist-filter a:hover { color:#036; }
+#changelist-filter li.selected { border-left:5px solid #ccc; padding-left:5px;margin-left:-10px; }
+#changelist-filter li.selected a { color:#5b80b2 !important; }
+
+/*  DATE DRILLDOWN  */
+.change-list ul.toplinks { display:block; background:white url(../img/admin/nav-bg-reverse.gif) 0 -10px repeat-x; border-top:1px solid white; float:left;  padding:0 !important;  margin:0 !important; width:100%; }
+.change-list ul.toplinks li { float: left; width: 9em; padding:3px 6px; font-weight: bold; list-style-type:none; }
+.change-list ul.toplinks .date-back a { color:#999; }
+.change-list ul.toplinks .date-back a:hover { color:#036; }
+
+/* PAGINATOR */
+.paginator { font-size:11px; padding-top:10px; padding-bottom:10px; line-height:22px; margin:0; border-top:1px solid #ddd; }
+.paginator a:link, .paginator a:visited { padding:2px 6px; border:solid 1px #ccc; background:white; text-decoration:none; }
+.paginator a.showall { padding:0 !important; border:none !important; }
+.paginator a.showall:hover { color:#036 !important; background:transparent !important; }
+.paginator .end { border-width:2px !important; margin-right:6px; }
+.paginator .this-page { padding:2px 6px; font-weight:bold; font-size:13px; vertical-align:top; }
+.paginator a:hover { color:white; background:#5b80b2; border-color:#036; }
diff --git a/webapp/django/contrib/admin/media/css/dashboard.css b/webapp/django/contrib/admin/media/css/dashboard.css
new file mode 100644
index 0000000..d277973
--- /dev/null
+++ b/webapp/django/contrib/admin/media/css/dashboard.css
@@ -0,0 +1,10 @@
+@import url('base.css');
+
+/* DASHBOARD */
+.dashboard .module table th { width:100%; }
+.dashboard .module table td { white-space:nowrap; }
+.dashboard .module table td a { display:block; padding-right:.6em; }
+
+/*  RECENT ACTIONS MODULE  */
+.module ul.actionlist { margin-left:0; }
+ul.actionlist li { list-style-type:none; }
\ No newline at end of file
diff --git a/webapp/django/contrib/admin/media/css/forms.css b/webapp/django/contrib/admin/media/css/forms.css
new file mode 100644
index 0000000..234a21b
--- /dev/null
+++ b/webapp/django/contrib/admin/media/css/forms.css
@@ -0,0 +1,83 @@
+@import url('base.css');
+@import url('widgets.css');
+
+/* FORM ROWS */
+.form-row { overflow:hidden; padding:8px 12px; font-size:11px; border-bottom:1px solid #eee; }
+.form-row img, .form-row input { vertical-align:middle; }
+form .form-row p { padding-left:0; font-size:11px; }
+
+/* FORM LABELS */
+form h4 { margin:0 !important; padding:0 !important; border:none !important; }
+label { font-weight:normal !important; color:#666; font-size:12px; }
+label.inline { margin-left:20px; }
+.required label, label.required { font-weight:bold !important; color:#333 !important; }
+
+/* RADIO BUTTONS */
+form ul.radiolist li { list-style-type:none; }
+form ul.radiolist label { float:none; display:inline; }
+form ul.inline { margin-left:0; padding:0; }
+form ul.inline li { float:left; padding-right:7px; }
+
+/* ALIGNED FIELDSETS */
+.aligned label { display:block; padding:0 1em 3px 0; float:left; width:8em; }
+.aligned label.inline { display:inline; float:none; }
+.colMS .aligned .vLargeTextField, .colMS .aligned .vXMLLargeTextField { width:350px; }
+form .aligned p, form .aligned ul { margin-left:7em; padding-left:30px; }
+form .aligned table p { margin-left:0; padding-left:0; }
+form .aligned p.help { padding-left:38px; }
+.aligned .vCheckboxLabel { float:none !important; display:inline; padding-left:4px; }
+.colM .aligned .vLargeTextField, .colM .aligned .vXMLLargeTextField { width:610px; }
+.checkbox-row p.help { margin-left:0; padding-left:0 !important; }
+
+/* WIDE FIELDSETS */
+.wide label { width:15em !important; }
+form .wide p { margin-left:15em; }
+form .wide p.help { padding-left:38px; }
+.colM fieldset.wide .vLargeTextField, .colM fieldset.wide .vXMLLargeTextField { width:450px; }
+
+/* COLLAPSED FIELDSETS */
+fieldset.collapsed * { display:none; }
+fieldset.collapsed h2, fieldset.collapsed { display:block !important; }
+fieldset.collapsed h2 { background-image:url(../img/admin/nav-bg.gif); background-position:bottom left; color:#999; }
+fieldset.collapsed .collapse-toggle { padding:3px 5px !important; background:transparent; display:inline !important;}
+
+/* MONOSPACE TEXTAREAS */
+fieldset.monospace textarea { font-family:"Bitstream Vera Sans Mono",Monaco,"Courier New",Courier,monospace; }
+
+/* SUBMIT ROW */
+.submit-row { padding:5px 7px; text-align:right; background:white url(../img/admin/nav-bg.gif) 0 100% repeat-x; border:1px solid #ccc; margin:5px 0; }
+.submit-row input { margin:0 0 0 5px; }
+.submit-row p { margin-top:0.3em; }
+.submit-row .deletelink { background:url(../img/admin/icon_deletelink.gif) 0 50% no-repeat; padding-left:14px; }
+
+/* CUSTOM FORM FIELDS */
+.vSelectMultipleField { vertical-align:top !important; }
+.vCheckboxField { border:none; }
+.vDateField, .vTimeField { margin-right:2px; }
+.vURLField { width:30em; }
+.vLargeTextField, .vXMLLargeTextField { width:48em; }
+.flatpages-flatpage #id_content { height:40.2em; }
+.module table .vPositiveSmallIntegerField { width:2.2em; }
+.vTextField { width:20em; }
+.vIntegerField { width:5em; }
+
+/* x unsorted */
+.inline-group {padding:0; border:1px solid #ccc; margin:10px 0;}
+.inline-group .aligned label { width: 7em; }
+
+.inline-related {position:relative;}
+.inline-related h3 {margin: 0; color:#666; padding:3px 5px; font-size:11px; background:#e1e1e1 url(../img/admin/nav-bg.gif) top left repeat-x; border-bottom:1px solid #ddd;}
+.inline-related h3 span.delete {padding-left:20px; position:absolute; top:2px; right:10px;}
+.inline-related h3 span.delete label {margin-left:2px; font-size: 11px;}
+.inline-related fieldset {margin: 0; background:#fff; border: none; }
+.inline-related fieldset.module h3 { margin:0; padding:2px 5px 3px 5px; font-size:11px; text-align:left; font-weight:bold; background:#bcd; color:#fff; }
+.inline-related.tabular fieldset.module table {width:100%;}
+.last-related fieldset {border: none;}
+
+.inline-group .tabular tr.has_original td {padding-top:2em;}
+.inline-group .tabular tr td.original { padding:2px 0 0 0; width:0; _position:relative; }
+.inline-group .tabular th.original {width:0px; padding:0;}
+.inline-group .tabular td.original p {position:absolute; left:0; height:1.1em; padding:2px 7px; overflow:hidden; font-size:9px; font-weight:bold; color:#666; _width:700px;     }
+.inline-group ul.tools {padding:0; margin: 0; list-style:none;}
+.inline-group ul.tools li {display:inline; padding:0 5px;}
+.inline-group ul.tools a.add {background:url(../img/admin/icon_addlink.gif) 0 50% no-repeat; padding-left:14px;}
\ No newline at end of file
diff --git a/webapp/django/contrib/admin/media/css/global.css b/webapp/django/contrib/admin/media/css/global.css
new file mode 100644
index 0000000..fc2ab73
--- /dev/null
+++ b/webapp/django/contrib/admin/media/css/global.css
@@ -0,0 +1,142 @@
+body { margin:0; padding:0; font-size:12px; font-family:"Lucida Grande","DejaVu Sans","Bitstream Vera Sans",Verdana,Arial,sans-serif; color:#333; background:#fff; }
+
+/* LINKS */
+a:link, a:visited { color: #5b80b2; text-decoration:none; }
+a:hover { color: #036; }
+a img { border:none; }
+a.section:link, a.section:visited { color: white; text-decoration:none; }
+
+/* GLOBAL DEFAULTS */
+p, ol, ul, dl { margin:.2em 0 .8em 0; }
+p { padding:0; line-height:140%; }
+
+h1,h2,h3,h4,h5 { font-weight:bold; }
+h1 { font-size:18px; color:#666; padding:0 6px 0 0; margin:0 0 .2em 0; }
+h2 { font-size:16px; margin:1em 0 .5em 0; }
+h2.subhead { font-weight:normal;margin-top:0; }
+h3 { font-size:14px; margin:.8em 0 .3em 0; color:#666; font-weight:bold; }
+h4 { font-size:12px; margin:1em 0 .8em 0; padding-bottom:3px; }
+h5 { font-size:10px; margin:1.5em 0 .5em 0; color:#666; text-transform:uppercase; letter-spacing:1px; }
+
+ul li { list-style-type:square; padding:1px 0; }
+ul.plainlist { margin-left:0 !important; }
+ul.plainlist li { list-style-type:none; }
+li ul { margin-bottom:0; }
+li, dt, dd { font-size:11px; line-height:14px; }
+dt { font-weight:bold; margin-top:4px; }
+dd { margin-left:0; }
+
+form { margin:0; padding:0; }
+fieldset { margin:0; padding:0; }
+
+blockquote { font-size:11px; color:#777; margin-left:2px; padding-left:10px; border-left:5px solid #ddd; }
+code, pre { font-family:"Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace; background:inherit; color:#666; font-size:11px; }
+pre.literal-block { margin:10px; background:#eee; padding:6px 8px; }
+code strong { color:#930; }
+hr { clear:both; color:#eee; background-color:#eee; height:1px; border:none; margin:0; padding:0; font-size:1px; line-height:1px; }
+
+/* TEXT STYLES & MODIFIERS */
+.small { font-size:11px; }
+.tiny { font-size:10px; }
+p.tiny { margin-top:-2px; }
+.mini { font-size:9px; }
+p.mini { margin-top:-3px; }
+.help, p.help { font-size:10px !important; color:#999; }
+p img, h1 img, h2 img, h3 img, h4 img, td img { vertical-align:middle; }
+.quiet, a.quiet:link, a.quiet:visited { color:#999 !important;font-weight:normal !important; }
+.quiet strong { font-weight:bold !important; }
+.float-right { float:right; }
+.float-left { float:left; }
+.clear { clear:both; }
+.align-left { text-align:left; }
+.align-right { text-align:right; }
+.example { margin:10px 0; padding:5px 10px; background:#efefef; }
+.nowrap { white-space:nowrap; }
+
+/* TABLES */
+table { border-collapse:collapse; border-color:#ccc; }
+td, th { font-size:11px; line-height:13px; border-bottom:1px solid #eee; vertical-align:top; padding:5px; font-family:"Lucida Grande", Verdana, Arial, sans-serif; }
+th { text-align:left; font-size:12px; font-weight:bold; }
+thead th, 
+tfoot td { color:#666; padding:2px 5px; font-size:11px; background:#e1e1e1 url(../img/admin/nav-bg.gif) top left repeat-x; border-left:1px solid #ddd; border-bottom:1px solid #ddd; }
+tfoot td { border-bottom:none; border-top:1px solid #ddd; }
+thead th:first-child, 
+tfoot td:first-child { border-left:none !important; }
+thead th.optional { font-weight:normal !important; }
+fieldset table { border-right:1px solid #eee; }
+tr.row-label td { font-size:9px; padding-top:2px; padding-bottom:0; border-bottom:none; color:#666; margin-top:-1px; }
+tr.alt { background:#f6f6f6; }
+.row1 { background:#EDF3FE; }
+.row2 { background:white; }
+
+/* SORTABLE TABLES */
+thead th a:link, thead th a:visited { color:#666; display:block; }
+table thead th.sorted { background-position:bottom left !important; }
+table thead th.sorted a { padding-right:13px; }
+table thead th.ascending a { background:url(../img/admin/arrow-down.gif) right .4em no-repeat; }
+table thead th.descending a { background:url(../img/admin/arrow-up.gif) right .4em no-repeat; }
+
+/* ORDERABLE TABLES */
+table.orderable tbody tr td:hover { cursor:move; }
+table.orderable tbody tr td:first-child { padding-left:14px; background-image:url(../img/admin/nav-bg-grabber.gif); background-repeat:repeat-y; }
+table.orderable-initalized .order-cell, body>tr>td.order-cell { display:none; }
+
+/* FORM DEFAULTS */
+input, textarea, select { margin:2px 0; padding:2px 3px; vertical-align:middle; font-family:"Lucida Grande", Verdana, Arial, sans-serif; font-weight:normal; font-size:11px; }
+textarea { vertical-align:top !important; }
+input[type=text], input[type=password], textarea, select, .vTextField { border:1px solid #ccc; }
+
+/*  FORM BUTTONS  */
+input[type=submit], input[type=button], .submit-row input { background:white url(../img/admin/nav-bg.gif) bottom repeat-x; padding:3px; color:black; border:1px solid #bbb; border-color:#ddd #aaa #aaa #ddd; }
+input[type=submit]:active, input[type=button]:active { background-image:url(../img/admin/nav-bg-reverse.gif); background-position:top; }
+input[type=submit].default, .submit-row input.default { border:2px solid #5b80b2; background:#7CA0C7 url(../img/admin/default-bg.gif) bottom repeat-x; font-weight:bold; color:white; float:right; }
+input[type=submit].default:active { background-image:url(../img/admin/default-bg-reverse.gif); background-position:top; }
+
+/* MODULES */
+.module { border:1px solid #ccc; margin-bottom:5px; background:white; }
+.module p, .module ul, .module h3, .module h4, .module dl, .module pre { padding-left:10px; padding-right:10px; }
+.module blockquote { margin-left:12px; }
+.module ul, .module ol { margin-left:1.5em; }
+.module h3 { margin-top:.6em; }
+.module h2, .module caption, .inline-group h2 { margin:0; padding:2px 5px 3px 5px; font-size:11px; text-align:left; font-weight:bold; background:#7CA0C7 url(../img/admin/default-bg.gif) top left repeat-x; color:white; }
+.module table { border-collapse: collapse; }
+
+/* MESSAGES & ERRORS */
+ul.messagelist { padding:0 0 5px 0; margin:0; }
+ul.messagelist li { font-size:12px; display:block; padding:4px 5px 4px 25px; margin:0 0 3px 0; border-bottom:1px solid #ddd; color:#666; background:#ffc url(../img/admin/icon_success.gif) 5px .3em no-repeat; }
+.errornote { font-size:12px !important; display:block; padding:4px 5px 4px 25px; margin:0 0 3px 0; border:1px solid red; color:red;background:#ffc url(../img/admin/icon_error.gif) 5px .3em no-repeat; }
+ul.errorlist { margin:0 !important; padding:0 !important; }
+.errorlist li { font-size:12px !important; display:block; padding:4px 5px 4px 25px; margin:0 0 3px 0; border:1px solid red; color:white; background:red url(../img/admin/icon_alert.gif) 5px .3em no-repeat; }
+td ul.errorlist { margin:0 !important; padding:0 !important; }
+td ul.errorlist li { margin:0 !important; }
+.error { background:#ffc; }
+.error input, .error select { border:1px solid red; }
+div.system-message { background: #ffc; margin: 10px; padding: 6px 8px; font-size: .8em; }
+div.system-message p.system-message-title { padding:4px 5px 4px 25px; margin:0; color:red; background:#ffc url(../img/admin/icon_error.gif) 5px .3em no-repeat; }
+.description { font-size:12px; padding:5px 0 0 12px; }
+
+/* BREADCRUMBS */
+div.breadcrumbs { background:white url(../img/admin/nav-bg-reverse.gif) 0 -10px repeat-x; padding:2px 8px 3px 8px; font-size:11px;  color:#999;  border-top:1px solid white; border-bottom:1px solid #ccc; text-align:left; }
+
+/* ACTION ICONS */
+.addlink { padding-left:12px; background:url(../img/admin/icon_addlink.gif) 0 .2em no-repeat; }
+.changelink { padding-left:12px; background:url(../img/admin/icon_changelink.gif) 0 .2em no-repeat; }
+.deletelink { padding-left:12px; background:url(../img/admin/icon_deletelink.gif) 0 .25em no-repeat; }
+a.deletelink:link, a.deletelink:visited { color:#CC3434; }
+a.deletelink:hover { color:#993333; }
+
+/* OBJECT TOOLS */
+.object-tools { font-size:10px; font-weight:bold; font-family:Arial,Helvetica,sans-serif; padding-left:0; float:right; position:relative; margin-top:-2.4em; margin-bottom:-2em; }
+.form-row .object-tools { margin-top:5px; margin-bottom:5px; float:none; height:2em; padding-left:3.5em; }
+.object-tools li { display:block; float:left; background:url(../img/admin/tool-left.gif) 0 0 no-repeat; padding:0 0 0 8px; margin-left:2px; height:16px; }
+.object-tools li:hover { background:url(../img/admin/tool-left_over.gif) 0 0 no-repeat; }
+.object-tools a:link, .object-tools a:visited { display:block; float:left; color:white; padding:.1em 14px .1em 8px; height:14px; background:#999 url(../img/admin/tool-right.gif) 100% 0 no-repeat; }
+.object-tools a:hover, .object-tools li:hover a { background:#5b80b2 url(../img/admin/tool-right_over.gif) 100% 0 no-repeat; }
+.object-tools a.viewsitelink, .object-tools a.golink { background:#999 url(../img/admin/tooltag-arrowright.gif) top right no-repeat; padding-right:28px; }
+.object-tools a.viewsitelink:hover, .object-tools a.golink:hover { background:#5b80b2 url(../img/admin/tooltag-arrowright_over.gif) top right no-repeat; }
+.object-tools a.addlink { background:#999 url(../img/admin/tooltag-add.gif) top right no-repeat; padding-right:28px; }
+.object-tools a.addlink:hover { background:#5b80b2 url(../img/admin/tooltag-add_over.gif) top right no-repeat; }
+
+/* OBJECT HISTORY */
+table#change-history { width:100%; }
+table#change-history tbody th { width:16em; }
diff --git a/webapp/django/contrib/admin/media/css/layout.css b/webapp/django/contrib/admin/media/css/layout.css
new file mode 100644
index 0000000..17c5286
--- /dev/null
+++ b/webapp/django/contrib/admin/media/css/layout.css
@@ -0,0 +1,29 @@
+/* PAGE STRUCTURE */
+#container { position:relative; width:100%; min-width:760px; padding:0; }
+#content { margin:10px 15px; }
+#header { width:100%; }
+#content-main { float:left; width:100%; }
+#content-related { float:right; width:18em; position:relative; margin-right:-19em; }
+#footer { clear:both; padding:10px; }
+
+/*  COLUMN TYPES  */
+.colMS { margin-right:20em !important; }
+.colSM { margin-left:20em !important; }
+.colSM #content-related { float:left; margin-right:0; margin-left:-19em; }
+.colSM #content-main { float:right; }
+.popup .colM { width:95%; }
+.subcol { float:left; width:46%; margin-right:15px; }
+.dashboard #content { width:500px; }
+
+/*  HEADER  */
+#header { background:#417690; color:#ffc; overflow:hidden; }
+#header a:link, #header a:visited { color:white; }
+#header a:hover { text-decoration:underline; }
+#branding h1 { padding:0 10px; font-size:18px; margin:8px 0; font-weight:normal; color:#f4f379; }
+#branding h2 { padding:0 10px; font-size:14px; margin:-8px 0 8px 0; font-weight:normal; color:#ffc; }
+#user-tools { position:absolute; top:0; right:0; padding:1.2em 10px; font-size:11px; text-align:right; }
+
+/* SIDEBAR */
+#content-related h3 { font-size:12px; color:#666; margin-bottom:3px; }
+#content-related h4 { font-size:11px; }
+#content-related .module h2 { background:#eee url(../img/admin/nav-bg.gif) bottom left repeat-x; color:#666; }
\ No newline at end of file
diff --git a/webapp/django/contrib/admin/media/css/login.css b/webapp/django/contrib/admin/media/css/login.css
new file mode 100644
index 0000000..f904957
--- /dev/null
+++ b/webapp/django/contrib/admin/media/css/login.css
@@ -0,0 +1,13 @@
+@import url('base.css');
+@import url('layout.css');
+
+/* LOGIN FORM */
+body.login { background:#eee; }
+.login #container { background:white; border:1px solid #ccc; width:28em; min-width:300px; margin-left:auto; margin-right:auto; margin-top:100px; }
+.login #content-main { width:100%; }
+.login form { margin-top:1em; }
+.login .form-row { padding:4px 0; float:left; width:100%; }
+.login .form-row label { float:left; width:9em; padding-right:0.5em; line-height:2em; text-align:right; font-size:1em; color:#333; }
+.login .form-row #id_username, .login .form-row #id_password { width:14em; }
+.login span.help { font-size:10px; display:block; }
+.login .submit-row { clear:both; padding:1em 0 0 9.4em; }
\ No newline at end of file
diff --git a/webapp/django/contrib/admin/media/css/null.css b/webapp/django/contrib/admin/media/css/null.css
new file mode 100644
index 0000000..1a93f22
--- /dev/null
+++ b/webapp/django/contrib/admin/media/css/null.css
@@ -0,0 +1 @@
+/* Nothing to see here. Dummy file to feed to the high pass filter which hides CSS from IE5/win. Details: http://tantek.com/CSS/Examples/highpass.html */
\ No newline at end of file
diff --git a/webapp/django/contrib/admin/media/css/patch-iewin.css b/webapp/django/contrib/admin/media/css/patch-iewin.css
new file mode 100644
index 0000000..2de1305
--- /dev/null
+++ b/webapp/django/contrib/admin/media/css/patch-iewin.css
@@ -0,0 +1,8 @@
+* html #container { position:static; } /* keep header from flowing off the page */
+* html .colMS #content-related { margin-right:0; margin-left:10px; position:static; } /* put the right sidebars back on the page */
+* html .colSM #content-related { margin-right:10px; margin-left:-115px; position:static; } /* put the left sidebars back on the page */
+* html .form-row { height:1%; }
+* html .dashboard #content { width:768px; } /* proper fixed width for dashboard in IE6 */
+* html .dashboard #content-main { width:535px; } /* proper fixed width for dashboard in IE6 */
+* html #changelist-filter ul { margin-right:-10px; } /* fix right margin for changelist filters in IE6 */
+* html .change-list .filtered { height:400px; } /* IE ignores min-height, but treats height as if it were min-height */
\ No newline at end of file
diff --git a/webapp/django/contrib/admin/media/css/rtl.css b/webapp/django/contrib/admin/media/css/rtl.css
new file mode 100644
index 0000000..900ddbd
--- /dev/null
+++ b/webapp/django/contrib/admin/media/css/rtl.css
@@ -0,0 +1,51 @@
+body { direction: rtl; }
+
+/* login styles */
+
+.login .form-row { float:right; }
+.login .form-row label { float:right; padding-left:0.5em; padding-right:0; text-align:left;}
+.login .submit-row { clear:both; padding:1em 9.4em 0 0; }
+
+
+/* global styles */
+th { text-align: right; }
+.module h2, .module caption { text-align: right; }
+.addlink, .changelink { padding-left:0px; padding-right:12px; background-position:100% 0.2em; }
+.deletelink { padding-left:0px; padding-right:12px; background-position:100% 0.25em; }
+.object-tools { float:left; }
+
+
+/* layout styles */
+#user-tools { right:auto; left:0; text-align:left; }
+div.breadcrumbs { text-align:right; }
+#content-main { float:right;}
+#content-related { float:left; margin-left:-19em; margin-right:auto;}
+.colMS { margin-left:20em !important; margin-right:10px !important;}
+
+/* dashboard styles */
+.dashboard .module table td a { padding-left:.6em; padding-right:12px; }
+
+/* changelists styles */
+.change-list .filtered { background:white url(../img/admin/changelist-bg_rtl.gif) top left repeat-y !important; }
+.change-list .filtered table { border-left:1px solid #ddd; border-right:0px none; }
+#changelist-filter { right:auto; left:0; border-left:0px none; border-right:1px solid #ddd;}
+.change-list .filtered table, .change-list .filtered .paginator, .filtered #toolbar, .filtered div.xfull { margin-right:0px !important; margin-left:160px !important; }
+#changelist-filter li.selected { border-left:0px none; padding-left:0px; margin-left:0; border-right:5px solid #ccc; padding-right:5px;margin-right:-10px; }
+
+/* form styles */
+.aligned label { padding:0 0 3px 1em;  float:right; }
+.submit-row { text-align: left }
+.vDateField, .vTimeField { margin-left:2px; }
+form ul.inline li { float:right; padding-right:0; padding-left:7px; }
+input[type=submit].default, .submit-row input.default { float:left; }
+
+/* widget styles */
+.calendarnav-previous { top:0; left:auto; right:0; }
+.calendarnav-next { top:0; right:auto; left:0;}
+.calendar caption, .calendarbox h2 { text-align:center; }
+
+.selector { float: right;}
+.selector .selector-filter { text-align: right;}
+
+/* x unsorted */
+.inline-related h2 { text-align:right }
diff --git a/webapp/django/contrib/admin/media/css/widgets.css b/webapp/django/contrib/admin/media/css/widgets.css
new file mode 100644
index 0000000..67d9662
--- /dev/null
+++ b/webapp/django/contrib/admin/media/css/widgets.css
@@ -0,0 +1,101 @@
+/* SELECTOR (FILTER INTERFACE) */
+.selector { width:580px; float:left; }
+.selector select { width:270px; height:17.2em; }
+.selector-available, .selector-chosen { float:left; width:270px; text-align:center; margin-bottom:5px; }
+.selector-available h2, .selector-chosen h2 { border:1px solid #ccc; }
+.selector .selector-available h2 { background:white url(../img/admin/nav-bg.gif) bottom left repeat-x; color:#666; }
+.selector .selector-filter { background:white; border:1px solid #ccc; border-width:0 1px; padding:3px; color:#999; font-size:10px; margin:0; text-align:left; }
+.selector .selector-chosen .selector-filter { padding:4px 5px; }
+.selector .selector-available input { width:230px; }
+.selector ul.selector-chooser { float:left; width:22px; height:50px; background:url(../img/admin/chooser-bg.gif) top center no-repeat; margin:8em 3px 0 3px; padding:0; }
+.selector-chooser li { margin:0; padding:3px; list-style-type:none; }
+.selector select { margin-bottom:5px; margin-top:0; }
+.selector-add, .selector-remove { width:16px; height:16px; display:block; text-indent:-3000px; }
+.selector-add { background:url(../img/admin/selector-add.gif) top center no-repeat; margin-bottom:2px; }
+.selector-remove { background:url(../img/admin/selector-remove.gif) top center no-repeat; }
+a.selector-chooseall, a.selector-clearall { display:block; width:6em; text-align:left; margin-left:auto; margin-right:auto; font-weight:bold; color:#666;  padding:3px 0 3px 18px; }
+a.selector-chooseall:hover, a.selector-clearall:hover { color:#036; }
+a.selector-chooseall { width:7em; background:url(../img/admin/selector-addall.gif) left center no-repeat; }
+a.selector-clearall { background:url(../img/admin/selector-removeall.gif) left center no-repeat; }
+
+/* STACKED SELECTORS */
+.stacked { float:left; width:500px; }
+.stacked select { width:480px; height:10.1em; }
+.stacked .selector-available, .stacked .selector-chosen { width:480px; }
+.stacked .selector-available { margin-bottom:0; }
+.stacked .selector-available input { width:442px; }
+.stacked ul.selector-chooser { height:22px; width:50px; margin:0 0 3px 40%; background:url(../img/admin/chooser_stacked-bg.gif) top center no-repeat; }
+.stacked .selector-chooser li { float:left; padding:3px 3px 3px 5px; }
+.stacked .selector-chooseall, .stacked .selector-clearall { display:none; }
+.stacked .selector-add { background-image:url(../img/admin/selector_stacked-add.gif); }
+.stacked .selector-remove { background-image:url(../img/admin/selector_stacked-remove.gif); }
+
+/* DATE AND TIME */
+p.datetime { line-height:20px; margin:0; padding:0; color:#666; font-size:11px; font-weight:bold; }
+.datetime span { font-size:11px; color:#ccc; font-weight:normal; white-space:nowrap; }
+.vDateField { margin-left:4px; }
+table p.datetime { font-size:10px; margin-left:0; padding-left:0; }
+
+/* FILE UPLOADS */
+p.file-upload { line-height:20px; margin:0; padding:0; color:#666; font-size:11px; font-weight:bold; }
+.file-upload a { font-weight:normal; }
+.file-upload .deletelink { margin-left:5px; }
+
+/* CALENDARS & CLOCKS */
+.calendarbox, .clockbox { margin:5px auto; font-size:11px; width:16em; text-align:center; background:white; position:relative; }
+.clockbox { width:auto; }
+.calendar { margin:0; padding: 0; }
+.calendar table { margin:0; padding:0; border-collapse:collapse; background:white; width:99%; }
+.calendar caption, .calendarbox h2 { margin: 0; font-size:11px; text-align:center; border-top:none; }
+.calendar th { font-size:10px; color:#666; padding:2px 3px; text-align:center; background:#e1e1e1 url(../img/admin/nav-bg.gif) 0 50% repeat-x; border-bottom:1px solid #ddd; }
+.calendar td { font-size:11px; text-align: center; padding: 0; border-top:1px solid #eee; border-bottom:none; }
+.calendar td.selected a { background: #C9DBED; }
+.calendar td.nonday { background:#efefef; }
+.calendar td.today a { background:#ffc; }
+.calendar td a, .timelist a { display: block; font-weight:bold; padding:4px; text-decoration: none; color:#444; }
+.calendar td a:hover, .timelist a:hover { background: #5b80b2; color:white; }
+.calendar td a:active, .timelist a:active { background: #036; color:white; }
+.calendarnav { font-size:10px; text-align: center; color:#ccc; margin:0; padding:1px 3px; }
+.calendarnav a:link, #calendarnav a:visited, #calendarnav a:hover { color: #999; }
+.calendar-shortcuts { background:white; font-size:10px; line-height:11px; border-top:1px solid #eee; padding:3px 0 4px; color:#ccc; }
+.calendarbox .calendarnav-previous, .calendarbox .calendarnav-next { display:block; position:absolute; font-weight:bold; font-size:12px; background:#C9DBED url(../img/admin/default-bg.gif) bottom left repeat-x; padding:1px 4px 2px 4px; color:white; }
+.calendarnav-previous:hover, .calendarnav-next:hover { background:#036; }
+.calendarnav-previous { top:0; left:0; }
+.calendarnav-next { top:0; right:0; }
+.calendar-cancel { margin:0 !important; padding:0; font-size:10px; background:#e1e1e1 url(../img/admin/nav-bg.gif) 0 50% repeat-x;  border-top:1px solid #ddd; }
+.calendar-cancel a { padding:2px; color:#999; }
+ul.timelist, .timelist li { list-style-type:none; margin:0; padding:0; }
+.timelist a { padding:2px; }
+
+/* INLINE ORDERER */
+ul.orderer {  position:relative; padding:0 !important; margin:0 !important; list-style-type:none; }
+ul.orderer li { list-style-type:none; display:block; padding:0; margin:0; border:1px solid #bbb; border-width:0 1px 1px 0; white-space:nowrap; overflow:hidden; background:#e2e2e2 url(../img/admin/nav-bg-grabber.gif) repeat-y; }
+ul.orderer li:hover { cursor:move; background-color:#ddd; }
+ul.orderer li a.selector { margin-left:12px; overflow:hidden; width:83%; font-size:10px !important; padding:0.6em 0; }
+ul.orderer li a:link, ul.orderer li a:visited { color:#333; }
+ul.orderer li .inline-deletelink { position:absolute; right:4px; margin-top:0.6em; }
+ul.orderer li.selected { background-color:#f8f8f8; border-right-color:#f8f8f8; }
+ul.orderer li.deleted { background:#bbb url(../img/admin/deleted-overlay.gif); }
+ul.orderer li.deleted a:link, ul.orderer li.deleted a:visited { color:#888; }
+ul.orderer li.deleted .inline-deletelink { background-image:url(../img/admin/inline-restore.png);  }
+ul.orderer li.deleted:hover, ul.orderer li.deleted a.selector:hover { cursor:default; }
+
+/* EDIT INLINE */
+.inline-deletelink { display:block; text-indent:-9999px; background:transparent url(../img/admin/inline-delete.png) no-repeat; width:15px; height:15px; margin:0.4em 0; border: 0px none; }
+.inline-deletelink:hover { background-position:-15px 0; cursor:pointer; }
+.editinline button.addlink { border: 0px none; color: #5b80b2; font-size: 100%; cursor: pointer; }
+.editinline button.addlink:hover { color: #036; cursor: pointer; }
+.editinline table .help { text-align:right; float:right; padding-left:2em; }
+.editinline tfoot .addlink { white-space:nowrap; }
+.editinline table thead th:last-child { border-left:none; }
+.editinline tr.deleted { background:#ddd url(../img/admin/deleted-overlay.gif); }
+.editinline tr.deleted .inline-deletelink { background-image:url(../img/admin/inline-restore.png); }
+.editinline tr.deleted td:hover { cursor:default; }
+.editinline tr.deleted td:first-child { background-image:none !important; }
+
+/* EDIT INLINE - STACKED */
+.editinline-stacked { min-width:758px; }
+.editinline-stacked .inline-object { margin-left:210px; background:white; }
+.editinline-stacked .inline-source { float:left; width:200px; background:#f8f8f8;  }
+.editinline-stacked .inline-splitter { float:left; width:9px; background:#f8f8f8 url(../img/admin/inline-splitter-bg.gif) 50% 50% no-repeat; border-right:1px solid #ccc; }
+.editinline-stacked .controls { clear:both; background:#e1e1e1 url(../img/admin/nav-bg.gif) top left repeat-x; padding:3px 4px; font-size:11px; border-top:1px solid #ddd; }
\ No newline at end of file
diff --git a/webapp/django/contrib/admin/media/img/admin/arrow-down.gif b/webapp/django/contrib/admin/media/img/admin/arrow-down.gif
new file mode 100644
index 0000000..a967b9f
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/arrow-down.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/arrow-up.gif b/webapp/django/contrib/admin/media/img/admin/arrow-up.gif
new file mode 100644
index 0000000..3fe4851
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/arrow-up.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/changelist-bg.gif b/webapp/django/contrib/admin/media/img/admin/changelist-bg.gif
new file mode 100644
index 0000000..7f46994
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/changelist-bg.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/changelist-bg_rtl.gif b/webapp/django/contrib/admin/media/img/admin/changelist-bg_rtl.gif
new file mode 100644
index 0000000..2379712
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/changelist-bg_rtl.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/chooser-bg.gif b/webapp/django/contrib/admin/media/img/admin/chooser-bg.gif
new file mode 100644
index 0000000..30e83c2
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/chooser-bg.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/chooser_stacked-bg.gif b/webapp/django/contrib/admin/media/img/admin/chooser_stacked-bg.gif
new file mode 100644
index 0000000..5d104b6
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/chooser_stacked-bg.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/default-bg-reverse.gif b/webapp/django/contrib/admin/media/img/admin/default-bg-reverse.gif
new file mode 100644
index 0000000..0873281
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/default-bg-reverse.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/default-bg.gif b/webapp/django/contrib/admin/media/img/admin/default-bg.gif
new file mode 100644
index 0000000..003aeca
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/default-bg.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/deleted-overlay.gif b/webapp/django/contrib/admin/media/img/admin/deleted-overlay.gif
new file mode 100644
index 0000000..dc3828f
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/deleted-overlay.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/icon-no.gif b/webapp/django/contrib/admin/media/img/admin/icon-no.gif
new file mode 100644
index 0000000..1b4ee58
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/icon-no.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/icon-unknown.gif b/webapp/django/contrib/admin/media/img/admin/icon-unknown.gif
new file mode 100644
index 0000000..cfd2b02
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/icon-unknown.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/icon-yes.gif b/webapp/django/contrib/admin/media/img/admin/icon-yes.gif
new file mode 100644
index 0000000..7399282
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/icon-yes.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/icon_addlink.gif b/webapp/django/contrib/admin/media/img/admin/icon_addlink.gif
new file mode 100644
index 0000000..ee70e1a
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/icon_addlink.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/icon_alert.gif b/webapp/django/contrib/admin/media/img/admin/icon_alert.gif
new file mode 100644
index 0000000..a1dde26
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/icon_alert.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/icon_calendar.gif b/webapp/django/contrib/admin/media/img/admin/icon_calendar.gif
new file mode 100644
index 0000000..7587b30
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/icon_calendar.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/icon_changelink.gif b/webapp/django/contrib/admin/media/img/admin/icon_changelink.gif
new file mode 100644
index 0000000..e1b9afd
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/icon_changelink.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/icon_clock.gif b/webapp/django/contrib/admin/media/img/admin/icon_clock.gif
new file mode 100644
index 0000000..ff2d57e
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/icon_clock.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/icon_deletelink.gif b/webapp/django/contrib/admin/media/img/admin/icon_deletelink.gif
new file mode 100644
index 0000000..72523e3
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/icon_deletelink.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/icon_error.gif b/webapp/django/contrib/admin/media/img/admin/icon_error.gif
new file mode 100644
index 0000000..3730a00
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/icon_error.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/icon_searchbox.png b/webapp/django/contrib/admin/media/img/admin/icon_searchbox.png
new file mode 100644
index 0000000..8ab579e
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/icon_searchbox.png
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/icon_success.gif b/webapp/django/contrib/admin/media/img/admin/icon_success.gif
new file mode 100644
index 0000000..5cf90a1
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/icon_success.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/inline-delete-8bit.png b/webapp/django/contrib/admin/media/img/admin/inline-delete-8bit.png
new file mode 100644
index 0000000..95caf59
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/inline-delete-8bit.png
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/inline-delete.png b/webapp/django/contrib/admin/media/img/admin/inline-delete.png
new file mode 100644
index 0000000..d59bcd2
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/inline-delete.png
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/inline-restore-8bit.png b/webapp/django/contrib/admin/media/img/admin/inline-restore-8bit.png
new file mode 100644
index 0000000..e087c8e
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/inline-restore-8bit.png
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/inline-restore.png b/webapp/django/contrib/admin/media/img/admin/inline-restore.png
new file mode 100644
index 0000000..efdd92a
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/inline-restore.png
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/inline-splitter-bg.gif b/webapp/django/contrib/admin/media/img/admin/inline-splitter-bg.gif
new file mode 100644
index 0000000..32ac5b3
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/inline-splitter-bg.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/nav-bg-grabber.gif b/webapp/django/contrib/admin/media/img/admin/nav-bg-grabber.gif
new file mode 100644
index 0000000..0a784fa
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/nav-bg-grabber.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/nav-bg-reverse.gif b/webapp/django/contrib/admin/media/img/admin/nav-bg-reverse.gif
new file mode 100644
index 0000000..f11029f
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/nav-bg-reverse.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/nav-bg.gif b/webapp/django/contrib/admin/media/img/admin/nav-bg.gif
new file mode 100644
index 0000000..f8402b8
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/nav-bg.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/selector-add.gif b/webapp/django/contrib/admin/media/img/admin/selector-add.gif
new file mode 100644
index 0000000..50132d1
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/selector-add.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/selector-addall.gif b/webapp/django/contrib/admin/media/img/admin/selector-addall.gif
new file mode 100644
index 0000000..d6e7c63
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/selector-addall.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/selector-remove.gif b/webapp/django/contrib/admin/media/img/admin/selector-remove.gif
new file mode 100644
index 0000000..2b9b0a2
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/selector-remove.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/selector-removeall.gif b/webapp/django/contrib/admin/media/img/admin/selector-removeall.gif
new file mode 100644
index 0000000..5a44219
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/selector-removeall.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/selector-search.gif b/webapp/django/contrib/admin/media/img/admin/selector-search.gif
new file mode 100644
index 0000000..6d5f4c7
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/selector-search.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/selector_stacked-add.gif b/webapp/django/contrib/admin/media/img/admin/selector_stacked-add.gif
new file mode 100644
index 0000000..7426169
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/selector_stacked-add.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/selector_stacked-remove.gif b/webapp/django/contrib/admin/media/img/admin/selector_stacked-remove.gif
new file mode 100644
index 0000000..60412ce
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/selector_stacked-remove.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/tool-left.gif b/webapp/django/contrib/admin/media/img/admin/tool-left.gif
new file mode 100644
index 0000000..011490f
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/tool-left.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/tool-left_over.gif b/webapp/django/contrib/admin/media/img/admin/tool-left_over.gif
new file mode 100644
index 0000000..937e07b
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/tool-left_over.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/tool-right.gif b/webapp/django/contrib/admin/media/img/admin/tool-right.gif
new file mode 100644
index 0000000..cdc140c
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/tool-right.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/tool-right_over.gif b/webapp/django/contrib/admin/media/img/admin/tool-right_over.gif
new file mode 100644
index 0000000..4db977e
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/tool-right_over.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/tooltag-add.gif b/webapp/django/contrib/admin/media/img/admin/tooltag-add.gif
new file mode 100644
index 0000000..8b53d49
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/tooltag-add.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/tooltag-add_over.gif b/webapp/django/contrib/admin/media/img/admin/tooltag-add_over.gif
new file mode 100644
index 0000000..bfc52f1
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/tooltag-add_over.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/tooltag-arrowright.gif b/webapp/django/contrib/admin/media/img/admin/tooltag-arrowright.gif
new file mode 100644
index 0000000..cdaaae7
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/tooltag-arrowright.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/admin/tooltag-arrowright_over.gif b/webapp/django/contrib/admin/media/img/admin/tooltag-arrowright_over.gif
new file mode 100644
index 0000000..7163189
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/admin/tooltag-arrowright_over.gif
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/gis/move_vertex_off.png b/webapp/django/contrib/admin/media/img/gis/move_vertex_off.png
new file mode 100644
index 0000000..296b2e2
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/gis/move_vertex_off.png
Binary files differ
diff --git a/webapp/django/contrib/admin/media/img/gis/move_vertex_on.png b/webapp/django/contrib/admin/media/img/gis/move_vertex_on.png
new file mode 100644
index 0000000..21f4758
--- /dev/null
+++ b/webapp/django/contrib/admin/media/img/gis/move_vertex_on.png
Binary files differ
diff --git a/webapp/django/contrib/admin/media/js/SelectBox.js b/webapp/django/contrib/admin/media/js/SelectBox.js
new file mode 100644
index 0000000..f28c861
--- /dev/null
+++ b/webapp/django/contrib/admin/media/js/SelectBox.js
@@ -0,0 +1,111 @@
+var SelectBox = {
+    cache: new Object(),
+    init: function(id) {
+        var box = document.getElementById(id);
+        var node;
+        SelectBox.cache[id] = new Array();
+        var cache = SelectBox.cache[id];
+        for (var i = 0; (node = box.options[i]); i++) {
+            cache.push({value: node.value, text: node.text, displayed: 1});
+        }
+    },
+    redisplay: function(id) {
+        // Repopulate HTML select box from cache
+        var box = document.getElementById(id);
+        box.options.length = 0; // clear all options
+        for (var i = 0, j = SelectBox.cache[id].length; i < j; i++) {
+            var node = SelectBox.cache[id][i];
+            if (node.displayed) {
+                box.options[box.options.length] = new Option(node.text, node.value, false, false);
+            }
+        }
+    },
+    filter: function(id, text) {
+        // Redisplay the HTML select box, displaying only the choices containing ALL
+        // the words in text. (It's an AND search.)
+        var tokens = text.toLowerCase().split(/\s+/);
+        var node, token;
+        for (var i = 0; (node = SelectBox.cache[id][i]); i++) {
+            node.displayed = 1;
+            for (var j = 0; (token = tokens[j]); j++) {
+                if (node.text.toLowerCase().indexOf(token) == -1) {
+                    node.displayed = 0;
+                }
+            }
+        }
+        SelectBox.redisplay(id);
+    },
+    delete_from_cache: function(id, value) {
+        var node, delete_index = null;
+        for (var i = 0; (node = SelectBox.cache[id][i]); i++) {
+            if (node.value == value) {
+                delete_index = i;
+                break;
+            }
+        }
+        var j = SelectBox.cache[id].length - 1;
+        for (var i = delete_index; i < j; i++) {
+            SelectBox.cache[id][i] = SelectBox.cache[id][i+1];
+        }
+        SelectBox.cache[id].length--;
+    },
+    add_to_cache: function(id, option) {
+        SelectBox.cache[id].push({value: option.value, text: option.text, displayed: 1});
+    },
+    cache_contains: function(id, value) {
+        // Check if an item is contained in the cache
+        var node;
+        for (var i = 0; (node = SelectBox.cache[id][i]); i++) {
+            if (node.value == value) {
+                return true;
+            }
+        }
+        return false;
+    },
+    move: function(from, to) {
+        var from_box = document.getElementById(from);
+        var to_box = document.getElementById(to);
+        var option;
+        for (var i = 0; (option = from_box.options[i]); i++) {
+            if (option.selected && SelectBox.cache_contains(from, option.value)) {
+                SelectBox.add_to_cache(to, {value: option.value, text: option.text, displayed: 1});
+                SelectBox.delete_from_cache(from, option.value);
+            }
+        }
+        SelectBox.redisplay(from);
+        SelectBox.redisplay(to);
+    },
+    move_all: function(from, to) {
+        var from_box = document.getElementById(from);
+        var to_box = document.getElementById(to);
+        var option;
+        for (var i = 0; (option = from_box.options[i]); i++) {
+            if (SelectBox.cache_contains(from, option.value)) {
+                SelectBox.add_to_cache(to, {value: option.value, text: option.text, displayed: 1});
+                SelectBox.delete_from_cache(from, option.value);
+            }
+        }
+        SelectBox.redisplay(from);
+        SelectBox.redisplay(to);
+    },
+    sort: function(id) {
+        SelectBox.cache[id].sort( function(a, b) {
+            a = a.text.toLowerCase();
+            b = b.text.toLowerCase();
+            try {
+                if (a > b) return 1;
+                if (a < b) return -1;
+            }
+            catch (e) {
+                // silently fail on IE 'unknown' exception
+            }
+            return 0;
+        } );
+    },
+    select_all: function(id) {
+        var box = document.getElementById(id);
+        for (var i = 0; i < box.options.length; i++) {
+            box.options[i].selected = 'selected';
+        }
+    }
+}
diff --git a/webapp/django/contrib/admin/media/js/SelectFilter2.js b/webapp/django/contrib/admin/media/js/SelectFilter2.js
new file mode 100644
index 0000000..db946a6
--- /dev/null
+++ b/webapp/django/contrib/admin/media/js/SelectFilter2.js
@@ -0,0 +1,113 @@
+/*
+SelectFilter2 - Turns a multiple-select box into a filter interface.
+
+Different than SelectFilter because this is coupled to the admin framework.
+
+Requires core.js, SelectBox.js and addevent.js.
+*/
+
+function findForm(node) {
+    // returns the node of the form containing the given node
+    if (node.tagName.toLowerCase() != 'form') {
+        return findForm(node.parentNode);
+    }
+    return node;
+}
+
+var SelectFilter = {
+    init: function(field_id, field_name, is_stacked, admin_media_prefix) {
+        var from_box = document.getElementById(field_id);
+        from_box.id += '_from'; // change its ID
+        from_box.className = 'filtered';
+
+        // Remove <p class="info">, because it just gets in the way.
+        var ps = from_box.parentNode.getElementsByTagName('p');
+        for (var i=0; i<ps.length; i++) {
+            from_box.parentNode.removeChild(ps[i]);
+        }
+
+        // <div class="selector"> or <div class="selector stacked">
+        var selector_div = quickElement('div', from_box.parentNode);
+        selector_div.className = is_stacked ? 'selector stacked' : 'selector';
+
+        // <div class="selector-available">
+        var selector_available = quickElement('div', selector_div, '');
+        selector_available.className = 'selector-available';
+        quickElement('h2', selector_available, interpolate(gettext('Available %s'), [field_name]));
+        var filter_p = quickElement('p', selector_available, '');
+        filter_p.className = 'selector-filter';
+        quickElement('img', filter_p, '', 'src', admin_media_prefix + 'img/admin/selector-search.gif');
+        filter_p.appendChild(document.createTextNode(' '));
+        var filter_input = quickElement('input', filter_p, '', 'type', 'text');
+        filter_input.id = field_id + '_input';
+        selector_available.appendChild(from_box);
+        var choose_all = quickElement('a', selector_available, gettext('Choose all'), 'href', 'javascript: (function(){ SelectBox.move_all("' + field_id + '_from", "' + field_id + '_to"); })()');
+        choose_all.className = 'selector-chooseall';
+
+        // <ul class="selector-chooser">
+        var selector_chooser = quickElement('ul', selector_div, '');
+        selector_chooser.className = 'selector-chooser';
+        var add_link = quickElement('a', quickElement('li', selector_chooser, ''), gettext('Add'), 'href', 'javascript: (function(){ SelectBox.move("' + field_id + '_from","' + field_id + '_to");})()');
+        add_link.className = 'selector-add';
+        var remove_link = quickElement('a', quickElement('li', selector_chooser, ''), gettext('Remove'), 'href', 'javascript: (function(){ SelectBox.move("' + field_id + '_to","' + field_id + '_from");})()');
+        remove_link.className = 'selector-remove';
+
+        // <div class="selector-chosen">
+        var selector_chosen = quickElement('div', selector_div, '');
+        selector_chosen.className = 'selector-chosen';
+        quickElement('h2', selector_chosen, interpolate(gettext('Chosen %s'), [field_name]));
+        var selector_filter = quickElement('p', selector_chosen, gettext('Select your choice(s) and click '));
+        selector_filter.className = 'selector-filter';
+        quickElement('img', selector_filter, '', 'src', admin_media_prefix + (is_stacked ? 'img/admin/selector_stacked-add.gif':'img/admin/selector-add.gif'), 'alt', 'Add');
+        var to_box = quickElement('select', selector_chosen, '', 'id', field_id + '_to', 'multiple', 'multiple', 'size', from_box.size, 'name', from_box.getAttribute('name'));
+        to_box.className = 'filtered';
+        var clear_all = quickElement('a', selector_chosen, gettext('Clear all'), 'href', 'javascript: (function() { SelectBox.move_all("' + field_id + '_to", "' + field_id + '_from");})()');
+        clear_all.className = 'selector-clearall';
+
+        from_box.setAttribute('name', from_box.getAttribute('name') + '_old');
+
+        // Set up the JavaScript event handlers for the select box filter interface
+        addEvent(filter_input, 'keyup', function(e) { SelectFilter.filter_key_up(e, field_id); });
+        addEvent(filter_input, 'keydown', function(e) { SelectFilter.filter_key_down(e, field_id); });
+        addEvent(from_box, 'dblclick', function() { SelectBox.move(field_id + '_from', field_id + '_to'); });
+        addEvent(to_box, 'dblclick', function() { SelectBox.move(field_id + '_to', field_id + '_from'); });
+        addEvent(findForm(from_box), 'submit', function() { SelectBox.select_all(field_id + '_to'); });
+        SelectBox.init(field_id + '_from');
+        SelectBox.init(field_id + '_to');
+        // Move selected from_box options to to_box
+        SelectBox.move(field_id + '_from', field_id + '_to');
+    },
+    filter_key_up: function(event, field_id) {
+        from = document.getElementById(field_id + '_from');
+        // don't submit form if user pressed Enter
+        if ((event.which && event.which == 13) || (event.keyCode && event.keyCode == 13)) {
+            from.selectedIndex = 0;
+            SelectBox.move(field_id + '_from', field_id + '_to');
+            from.selectedIndex = 0;
+            return false;
+        }
+        var temp = from.selectedIndex;
+        SelectBox.filter(field_id + '_from', document.getElementById(field_id + '_input').value);
+        from.selectedIndex = temp;
+        return true;
+    },
+    filter_key_down: function(event, field_id) {
+        from = document.getElementById(field_id + '_from');
+        // right arrow -- move across
+        if ((event.which && event.which == 39) || (event.keyCode && event.keyCode == 39)) {
+            var old_index = from.selectedIndex;
+            SelectBox.move(field_id + '_from', field_id + '_to');
+            from.selectedIndex = (old_index == from.length) ? from.length - 1 : old_index;
+            return false;
+        }
+        // down arrow -- wrap around
+        if ((event.which && event.which == 40) || (event.keyCode && event.keyCode == 40)) {
+            from.selectedIndex = (from.length == from.selectedIndex + 1) ? 0 : from.selectedIndex + 1;
+        }
+        // up arrow -- wrap around
+        if ((event.which && event.which == 38) || (event.keyCode && event.keyCode == 38)) {
+            from.selectedIndex = (from.selectedIndex == 0) ? from.length - 1 : from.selectedIndex - 1;
+        }
+        return true;
+    }
+}
diff --git a/webapp/django/contrib/admin/media/js/admin/CollapsedFieldsets.js b/webapp/django/contrib/admin/media/js/admin/CollapsedFieldsets.js
new file mode 100644
index 0000000..d66bec0
--- /dev/null
+++ b/webapp/django/contrib/admin/media/js/admin/CollapsedFieldsets.js
@@ -0,0 +1,85 @@
+// Finds all fieldsets with class="collapse", collapses them, and gives each
+// one a "Show" link that uncollapses it. The "Show" link becomes a "Hide"
+// link when the fieldset is visible.
+
+function findForm(node) {
+    // returns the node of the form containing the given node
+    if (node.tagName.toLowerCase() != 'form') {
+        return findForm(node.parentNode);
+    }
+    return node;
+}
+
+var CollapsedFieldsets = {
+    collapse_re: /\bcollapse\b/,   // Class of fieldsets that should be dealt with.
+    collapsed_re: /\bcollapsed\b/, // Class that fieldsets get when they're hidden.
+    collapsed_class: 'collapsed',
+    init: function() {
+        var fieldsets = document.getElementsByTagName('fieldset');
+        var collapsed_seen = false;
+        for (var i = 0, fs; fs = fieldsets[i]; i++) {
+            // Collapse this fieldset if it has the correct class, and if it
+            // doesn't have any errors. (Collapsing shouldn't apply in the case
+            // of error messages.)
+            if (fs.className.match(CollapsedFieldsets.collapse_re) && !CollapsedFieldsets.fieldset_has_errors(fs)) {
+                collapsed_seen = true;
+                // Give it an additional class, used by CSS to hide it.
+                fs.className += ' ' + CollapsedFieldsets.collapsed_class;
+                // (<a id="fieldsetcollapser3" class="collapse-toggle" href="#">Show</a>)
+                var collapse_link = document.createElement('a');
+                collapse_link.className = 'collapse-toggle';
+                collapse_link.id = 'fieldsetcollapser' + i;
+                collapse_link.onclick = new Function('CollapsedFieldsets.show('+i+'); return false;');
+                collapse_link.href = '#';
+                collapse_link.innerHTML = gettext('Show');
+                var h2 = fs.getElementsByTagName('h2')[0];
+                h2.appendChild(document.createTextNode(' ('));
+                h2.appendChild(collapse_link);
+                h2.appendChild(document.createTextNode(')'));
+            }
+        }
+        if (collapsed_seen) {
+            // Expand all collapsed fieldsets when form is submitted.
+            addEvent(findForm(document.getElementsByTagName('fieldset')[0]), 'submit', function() { CollapsedFieldsets.uncollapse_all(); });
+        }
+    },
+    fieldset_has_errors: function(fs) {
+        // Returns true if any fields in the fieldset have validation errors.
+        var divs = fs.getElementsByTagName('div');
+        for (var i=0; i<divs.length; i++) {
+            if (divs[i].className.match(/\berrors\b/)) {
+                return true;
+            }
+        }
+        return false;
+    },
+    show: function(fieldset_index) {
+        var fs = document.getElementsByTagName('fieldset')[fieldset_index];
+        // Remove the class name that causes the "display: none".
+        fs.className = fs.className.replace(CollapsedFieldsets.collapsed_re, '');
+        // Toggle the "Show" link to a "Hide" link
+        var collapse_link = document.getElementById('fieldsetcollapser' + fieldset_index);
+        collapse_link.onclick = new Function('CollapsedFieldsets.hide('+fieldset_index+'); return false;');
+        collapse_link.innerHTML = gettext('Hide');
+    },
+    hide: function(fieldset_index) {
+        var fs = document.getElementsByTagName('fieldset')[fieldset_index];
+        // Add the class name that causes the "display: none".
+        fs.className += ' ' + CollapsedFieldsets.collapsed_class;
+        // Toggle the "Hide" link to a "Show" link
+        var collapse_link = document.getElementById('fieldsetcollapser' + fieldset_index);
+        collapse_link.onclick = new Function('CollapsedFieldsets.show('+fieldset_index+'); return false;');
+        collapse_link.innerHTML = gettext('Show');
+    },
+
+    uncollapse_all: function() {
+        var fieldsets = document.getElementsByTagName('fieldset');
+        for (var i=0; i<fieldsets.length; i++) {
+            if (fieldsets[i].className.match(CollapsedFieldsets.collapsed_re)) {
+                CollapsedFieldsets.show(i);
+            }
+        }
+    }
+}
+
+addEvent(window, 'load', CollapsedFieldsets.init);
diff --git a/webapp/django/contrib/admin/media/js/admin/DateTimeShortcuts.js b/webapp/django/contrib/admin/media/js/admin/DateTimeShortcuts.js
new file mode 100644
index 0000000..f57f97e
--- /dev/null
+++ b/webapp/django/contrib/admin/media/js/admin/DateTimeShortcuts.js
@@ -0,0 +1,254 @@
+// Inserts shortcut buttons after all of the following:
+//     <input type="text" class="vDateField">
+//     <input type="text" class="vTimeField">
+
+var DateTimeShortcuts = {
+    calendars: [],
+    calendarInputs: [],
+    clockInputs: [],
+    calendarDivName1: 'calendarbox', // name of calendar <div> that gets toggled
+    calendarDivName2: 'calendarin',  // name of <div> that contains calendar
+    calendarLinkName: 'calendarlink',// name of the link that is used to toggle
+    clockDivName: 'clockbox',        // name of clock <div> that gets toggled
+    clockLinkName: 'clocklink',      // name of the link that is used to toggle
+    admin_media_prefix: '',
+    init: function() {
+        // Deduce admin_media_prefix by looking at the <script>s in the
+        // current document and finding the URL of *this* module.
+        var scripts = document.getElementsByTagName('script');
+        for (var i=0; i<scripts.length; i++) {
+            if (scripts[i].src.match(/DateTimeShortcuts/)) {
+                var idx = scripts[i].src.indexOf('js/admin/DateTimeShortcuts');
+                DateTimeShortcuts.admin_media_prefix = scripts[i].src.substring(0, idx);
+                break;
+            }
+        }
+
+        var inputs = document.getElementsByTagName('input');
+        for (i=0; i<inputs.length; i++) {
+            var inp = inputs[i];
+            if (inp.getAttribute('type') == 'text' && inp.className.match(/vTimeField/)) {
+                DateTimeShortcuts.addClock(inp);
+            }
+            else if (inp.getAttribute('type') == 'text' && inp.className.match(/vDateField/)) {
+                DateTimeShortcuts.addCalendar(inp);
+            }
+        }
+    },
+    // Add clock widget to a given field
+    addClock: function(inp) {
+        var num = DateTimeShortcuts.clockInputs.length;
+        DateTimeShortcuts.clockInputs[num] = inp;
+
+        // Shortcut links (clock icon and "Now" link)
+        var shortcuts_span = document.createElement('span');
+        inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling);
+        var now_link = document.createElement('a');
+        now_link.setAttribute('href', "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", new Date().getHourMinuteSecond());");
+        now_link.appendChild(document.createTextNode(gettext('Now')));
+        var clock_link = document.createElement('a');
+        clock_link.setAttribute('href', 'javascript:DateTimeShortcuts.openClock(' + num + ');');
+        clock_link.id = DateTimeShortcuts.clockLinkName + num;
+        quickElement('img', clock_link, '', 'src', DateTimeShortcuts.admin_media_prefix + 'img/admin/icon_clock.gif', 'alt', gettext('Clock'));
+        shortcuts_span.appendChild(document.createTextNode('\240'));
+        shortcuts_span.appendChild(now_link);
+        shortcuts_span.appendChild(document.createTextNode('\240|\240'));
+        shortcuts_span.appendChild(clock_link);
+
+        // Create clock link div
+        //
+        // Markup looks like:
+        // <div id="clockbox1" class="clockbox module">
+        //     <h2>Choose a time</h2>
+        //     <ul class="timelist">
+        //         <li><a href="#">Now</a></li>
+        //         <li><a href="#">Midnight</a></li>
+        //         <li><a href="#">6 a.m.</a></li>
+        //         <li><a href="#">Noon</a></li>
+        //     </ul>
+        //     <p class="calendar-cancel"><a href="#">Cancel</a></p>
+        // </div>
+
+        var clock_box = document.createElement('div');
+        clock_box.style.display = 'none';
+        clock_box.style.position = 'absolute';
+        clock_box.className = 'clockbox module';
+        clock_box.setAttribute('id', DateTimeShortcuts.clockDivName + num);
+        document.body.appendChild(clock_box);
+        addEvent(clock_box, 'click', DateTimeShortcuts.cancelEventPropagation);
+
+        quickElement('h2', clock_box, gettext('Choose a time'));
+        time_list = quickElement('ul', clock_box, '');
+        time_list.className = 'timelist';
+        quickElement("a", quickElement("li", time_list, ""), gettext("Now"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", new Date().getHourMinuteSecond());")
+        quickElement("a", quickElement("li", time_list, ""), gettext("Midnight"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", '00:00:00');")
+        quickElement("a", quickElement("li", time_list, ""), gettext("6 a.m."), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", '06:00:00');")
+        quickElement("a", quickElement("li", time_list, ""), gettext("Noon"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", '12:00:00');")
+
+        cancel_p = quickElement('p', clock_box, '');
+        cancel_p.className = 'calendar-cancel';
+        quickElement('a', cancel_p, gettext('Cancel'), 'href', 'javascript:DateTimeShortcuts.dismissClock(' + num + ');');
+    },
+    openClock: function(num) {
+        var clock_box = document.getElementById(DateTimeShortcuts.clockDivName+num)
+        var clock_link = document.getElementById(DateTimeShortcuts.clockLinkName+num)
+    
+        // Recalculate the clockbox position
+        // is it left-to-right or right-to-left layout ?
+        if (getStyle(document.body,'direction')!='rtl') {
+            clock_box.style.left = findPosX(clock_link) + 17 + 'px';
+        }
+        else {
+            // since style's width is in em, it'd be tough to calculate
+            // px value of it. let's use an estimated px for now
+            // TODO: IE returns wrong value for findPosX when in rtl mode
+            //       (it returns as it was left aligned), needs to be fixed.
+            clock_box.style.left = findPosX(clock_link) - 110 + 'px';
+        }
+        clock_box.style.top = findPosY(clock_link) - 30 + 'px';
+    
+        // Show the clock box
+        clock_box.style.display = 'block';
+        addEvent(window, 'click', function() { DateTimeShortcuts.dismissClock(num); return true; });
+    },
+    dismissClock: function(num) {
+       document.getElementById(DateTimeShortcuts.clockDivName + num).style.display = 'none';
+       window.onclick = null;
+    },
+    handleClockQuicklink: function(num, val) {
+       DateTimeShortcuts.clockInputs[num].value = val;
+       DateTimeShortcuts.dismissClock(num);
+    },
+    // Add calendar widget to a given field.
+    addCalendar: function(inp) {
+        var num = DateTimeShortcuts.calendars.length;
+
+        DateTimeShortcuts.calendarInputs[num] = inp;
+
+        // Shortcut links (calendar icon and "Today" link)
+        var shortcuts_span = document.createElement('span');
+        inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling);
+        var today_link = document.createElement('a');
+        today_link.setAttribute('href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', 0);');
+        today_link.appendChild(document.createTextNode(gettext('Today')));
+        var cal_link = document.createElement('a');
+        cal_link.setAttribute('href', 'javascript:DateTimeShortcuts.openCalendar(' + num + ');');
+        cal_link.id = DateTimeShortcuts.calendarLinkName + num;
+        quickElement('img', cal_link, '', 'src', DateTimeShortcuts.admin_media_prefix + 'img/admin/icon_calendar.gif', 'alt', gettext('Calendar'));
+        shortcuts_span.appendChild(document.createTextNode('\240'));
+        shortcuts_span.appendChild(today_link);
+        shortcuts_span.appendChild(document.createTextNode('\240|\240'));
+        shortcuts_span.appendChild(cal_link);
+
+        // Create calendarbox div.
+        //
+        // Markup looks like:
+        //
+        // <div id="calendarbox3" class="calendarbox module">
+        //     <h2>
+        //           <a href="#" class="link-previous">&lsaquo;</a>
+        //           <a href="#" class="link-next">&rsaquo;</a> February 2003
+        //     </h2>
+        //     <div class="calendar" id="calendarin3">
+        //         <!-- (cal) -->
+        //     </div>
+        //     <div class="calendar-shortcuts">
+        //          <a href="#">Yesterday</a> | <a href="#">Today</a> | <a href="#">Tomorrow</a>
+        //     </div>
+        //     <p class="calendar-cancel"><a href="#">Cancel</a></p>
+        // </div>
+        var cal_box = document.createElement('div');
+        cal_box.style.display = 'none';
+        cal_box.style.position = 'absolute';
+        cal_box.className = 'calendarbox module';
+        cal_box.setAttribute('id', DateTimeShortcuts.calendarDivName1 + num);
+        document.body.appendChild(cal_box);
+        addEvent(cal_box, 'click', DateTimeShortcuts.cancelEventPropagation);
+
+        // next-prev links
+        var cal_nav = quickElement('div', cal_box, '');
+        var cal_nav_prev = quickElement('a', cal_nav, '<', 'href', 'javascript:DateTimeShortcuts.drawPrev('+num+');');
+        cal_nav_prev.className = 'calendarnav-previous';
+        var cal_nav_next = quickElement('a', cal_nav, '>', 'href', 'javascript:DateTimeShortcuts.drawNext('+num+');');
+        cal_nav_next.className = 'calendarnav-next';
+
+        // main box
+        var cal_main = quickElement('div', cal_box, '', 'id', DateTimeShortcuts.calendarDivName2 + num);
+        cal_main.className = 'calendar';
+        DateTimeShortcuts.calendars[num] = new Calendar(DateTimeShortcuts.calendarDivName2 + num, DateTimeShortcuts.handleCalendarCallback(num));
+        DateTimeShortcuts.calendars[num].drawCurrent();
+
+        // calendar shortcuts
+        var shortcuts = quickElement('div', cal_box, '');
+        shortcuts.className = 'calendar-shortcuts';
+        quickElement('a', shortcuts, gettext('Yesterday'), 'href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', -1);');
+        shortcuts.appendChild(document.createTextNode('\240|\240'));
+        quickElement('a', shortcuts, gettext('Today'), 'href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', 0);');
+        shortcuts.appendChild(document.createTextNode('\240|\240'));
+        quickElement('a', shortcuts, gettext('Tomorrow'), 'href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', +1);');
+
+        // cancel bar
+        var cancel_p = quickElement('p', cal_box, '');
+        cancel_p.className = 'calendar-cancel';
+        quickElement('a', cancel_p, gettext('Cancel'), 'href', 'javascript:DateTimeShortcuts.dismissCalendar(' + num + ');');
+    },
+    openCalendar: function(num) {
+        var cal_box = document.getElementById(DateTimeShortcuts.calendarDivName1+num)
+        var cal_link = document.getElementById(DateTimeShortcuts.calendarLinkName+num)
+	var inp = DateTimeShortcuts.calendarInputs[num];
+
+	// Determine if the current value in the input has a valid date.
+	// If so, draw the calendar with that date's year and month.
+	if (inp.value) {
+	    var date_parts = inp.value.split('-');
+	    var year = date_parts[0];
+	    var month = parseFloat(date_parts[1]);
+	    if (year.match(/\d\d\d\d/) && month >= 1 && month <= 12) {
+		DateTimeShortcuts.calendars[num].drawDate(month, year);
+	    }
+	}
+
+    
+        // Recalculate the clockbox position
+        // is it left-to-right or right-to-left layout ?
+        if (getStyle(document.body,'direction')!='rtl') {
+            cal_box.style.left = findPosX(cal_link) + 17 + 'px';
+        }
+        else {
+            // since style's width is in em, it'd be tough to calculate
+            // px value of it. let's use an estimated px for now
+            // TODO: IE returns wrong value for findPosX when in rtl mode
+            //       (it returns as it was left aligned), needs to be fixed.
+            cal_box.style.left = findPosX(cal_link) - 180 + 'px';
+        }
+        cal_box.style.top = findPosY(cal_link) - 75 + 'px';
+    
+        cal_box.style.display = 'block';
+        addEvent(window, 'click', function() { DateTimeShortcuts.dismissCalendar(num); return true; });
+    },
+    dismissCalendar: function(num) {
+        document.getElementById(DateTimeShortcuts.calendarDivName1+num).style.display = 'none';
+    },
+    drawPrev: function(num) {
+        DateTimeShortcuts.calendars[num].drawPreviousMonth();
+    },
+    drawNext: function(num) {
+        DateTimeShortcuts.calendars[num].drawNextMonth();
+    },
+    handleCalendarCallback: function(num) {
+        return "function(y, m, d) { DateTimeShortcuts.calendarInputs["+num+"].value = y+'-'+(m<10?'0':'')+m+'-'+(d<10?'0':'')+d; document.getElementById(DateTimeShortcuts.calendarDivName1+"+num+").style.display='none';}";
+    },
+    handleCalendarQuickLink: function(num, offset) {
+       var d = new Date();
+       d.setDate(d.getDate() + offset)
+       DateTimeShortcuts.calendarInputs[num].value = d.getISODate();
+       DateTimeShortcuts.dismissCalendar(num);
+    },
+    cancelEventPropagation: function(e) {
+        if (!e) e = window.event;
+        e.cancelBubble = true;
+        if (e.stopPropagation) e.stopPropagation();
+    }
+}
+
+addEvent(window, 'load', DateTimeShortcuts.init);
diff --git a/webapp/django/contrib/admin/media/js/admin/RelatedObjectLookups.js b/webapp/django/contrib/admin/media/js/admin/RelatedObjectLookups.js
new file mode 100644
index 0000000..ca578cc
--- /dev/null
+++ b/webapp/django/contrib/admin/media/js/admin/RelatedObjectLookups.js
@@ -0,0 +1,77 @@
+// Handles related-objects functionality: lookup link for raw_id_fields
+// and Add Another links.
+
+function html_unescape(text) {
+    // Unescape a string that was escaped using django.utils.html.escape.
+    text = text.replace(/&lt;/g, '<');
+    text = text.replace(/&gt;/g, '>');
+    text = text.replace(/&quot;/g, '"');
+    text = text.replace(/&#39;/g, "'");
+    text = text.replace(/&amp;/g, '&');
+    return text;
+}
+
+function showRelatedObjectLookupPopup(triggeringLink) {
+    var name = triggeringLink.id.replace(/^lookup_/, '');
+    // IE doesn't like periods in the window name, so convert temporarily.
+    name = name.replace(/\./g, '___');
+    var href;
+    if (triggeringLink.href.search(/\?/) >= 0) {
+        href = triggeringLink.href + '&pop=1';
+    } else {
+        href = triggeringLink.href + '?pop=1';
+    }
+    var win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes');
+    win.focus();
+    return false;
+}
+
+function dismissRelatedLookupPopup(win, chosenId) {
+    var name = win.name.replace(/___/g, '.');
+    var elem = document.getElementById(name);
+    if (elem.className.indexOf('vManyToManyRawIdAdminField') != -1 && elem.value) {
+        elem.value += ',' + chosenId;
+    } else {
+        document.getElementById(name).value = chosenId;
+    }
+    win.close();
+}
+
+function showAddAnotherPopup(triggeringLink) {
+    var name = triggeringLink.id.replace(/^add_/, '');
+    name = name.replace(/\./g, '___');
+    href = triggeringLink.href
+    if (href.indexOf('?') == -1) {
+        href += '?_popup=1';
+    } else {
+        href  += '&_popup=1';
+    }
+    var win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes');
+    win.focus();
+    return false;
+}
+
+function dismissAddAnotherPopup(win, newId, newRepr) {
+    // newId and newRepr are expected to have previously been escaped by
+    // django.utils.html.escape.
+    newId = html_unescape(newId);
+    newRepr = html_unescape(newRepr);
+    var name = win.name.replace(/___/g, '.');
+    var elem = document.getElementById(name);
+    if (elem) {
+        if (elem.nodeName == 'SELECT') {
+            var o = new Option(newRepr, newId);
+            elem.options[elem.options.length] = o;
+            o.selected = true;
+        } else if (elem.nodeName == 'INPUT') {
+            elem.value = newId;
+        }
+    } else {
+        var toId = name + "_to";
+        elem = document.getElementById(toId);
+        var o = new Option(newRepr, newId);
+        SelectBox.add_to_cache(toId, o);
+        SelectBox.redisplay(toId);
+    }
+    win.close();
+}
diff --git a/webapp/django/contrib/admin/media/js/admin/ordering.js b/webapp/django/contrib/admin/media/js/admin/ordering.js
new file mode 100644
index 0000000..53c42f3
--- /dev/null
+++ b/webapp/django/contrib/admin/media/js/admin/ordering.js
@@ -0,0 +1,137 @@
+addEvent(window, 'load', reorder_init);
+
+var lis;
+var top = 0;
+var left = 0;
+var height = 30;
+
+function reorder_init() {
+    lis = document.getElementsBySelector('ul#orderthese li');
+    var input = document.getElementsBySelector('input[name=order_]')[0];
+    setOrder(input.value.split(','));
+    input.disabled = true;
+    draw();
+    // Now initialise the dragging behaviour
+    var limit = (lis.length - 1) * height;
+    for (var i = 0; i < lis.length; i++) {
+        var li = lis[i];
+        var img = document.getElementById('handle'+li.id);
+        li.style.zIndex = 1;
+        Drag.init(img, li, left + 10, left + 10, top + 10, top + 10 + limit);
+        li.onDragStart = startDrag;
+        li.onDragEnd = endDrag;
+        img.style.cursor = 'move';
+    }
+}
+
+function submitOrderForm() {
+    var inputOrder = document.getElementsBySelector('input[name=order_]')[0];
+    inputOrder.value = getOrder();
+    inputOrder.disabled=false;
+}
+
+function startDrag() {
+    this.style.zIndex = '10';
+    this.className = 'dragging';
+}
+
+function endDrag(x, y) {
+    this.style.zIndex = '1';
+    this.className = '';
+    // Work out how far along it has been dropped, using x co-ordinate
+    var oldIndex = this.index;
+    var newIndex = Math.round((y - 10 - top) / height);
+    // 'Snap' to the correct position
+    this.style.top = (10 + top + newIndex * height) + 'px';
+    this.index = newIndex;
+    moveItem(oldIndex, newIndex);
+}
+
+function moveItem(oldIndex, newIndex) {
+    // Swaps two items, adjusts the index and left co-ord for all others
+    if (oldIndex == newIndex) {
+        return; // Nothing to swap;
+    }
+    var direction, lo, hi;
+    if (newIndex > oldIndex) {
+        lo = oldIndex;
+        hi = newIndex;
+        direction = -1;
+    } else {
+        direction = 1;
+        hi = oldIndex;
+        lo = newIndex;
+    }
+    var lis2 = new Array(); // We will build the new order in this array
+    for (var i = 0; i < lis.length; i++) {
+        if (i < lo || i > hi) {
+            // Position of items not between the indexes is unaffected
+            lis2[i] = lis[i];
+            continue;
+        } else if (i == newIndex) {
+            lis2[i] = lis[oldIndex];
+            continue;
+        } else {
+            // Item is between the two indexes - move it along 1
+            lis2[i] = lis[i - direction];
+        }
+    }
+    // Re-index everything
+    reIndex(lis2);
+    lis = lis2;
+    draw();
+//    document.getElementById('hiddenOrder').value = getOrder();
+    document.getElementsBySelector('input[name=order_]')[0].value = getOrder();
+}
+
+function reIndex(lis) {
+    for (var i = 0; i < lis.length; i++) {
+        lis[i].index = i;
+    }
+}
+
+function draw() {
+    for (var i = 0; i < lis.length; i++) {
+        var li = lis[i];
+        li.index = i;
+        li.style.position = 'absolute';
+        li.style.left = (10 + left) + 'px';
+        li.style.top = (10 + top + (i * height)) + 'px';
+    }
+}
+
+function getOrder() {
+    var order = new Array(lis.length);
+    for (var i = 0; i < lis.length; i++) {
+        order[i] = lis[i].id.substring(1, 100);
+    }
+    return order.join(',');
+}
+
+function setOrder(id_list) {
+    /* Set the current order to match the lsit of IDs */
+    var temp_lis = new Array();
+    for (var i = 0; i < id_list.length; i++) {
+        var id = 'p' + id_list[i];
+        temp_lis[temp_lis.length] = document.getElementById(id);
+    }
+    reIndex(temp_lis);
+    lis = temp_lis;
+    draw();
+}
+
+function addEvent(elm, evType, fn, useCapture)
+// addEvent and removeEvent
+// cross-browser event handling for IE5+,  NS6 and Mozilla
+// By Scott Andrew
+{
+  if (elm.addEventListener){
+    elm.addEventListener(evType, fn, useCapture);
+    return true;
+  } else if (elm.attachEvent){
+    var r = elm.attachEvent("on"+evType, fn);
+    return r;
+  } else {
+    elm['on'+evType] = fn;
+  }
+}
diff --git a/webapp/django/contrib/admin/media/js/calendar.js b/webapp/django/contrib/admin/media/js/calendar.js
new file mode 100644
index 0000000..9035176
--- /dev/null
+++ b/webapp/django/contrib/admin/media/js/calendar.js
@@ -0,0 +1,143 @@
+/*
+calendar.js - Calendar functions by Adrian Holovaty
+*/
+
+function removeChildren(a) { // "a" is reference to an object
+    while (a.hasChildNodes()) a.removeChild(a.lastChild);
+}
+
+// quickElement(tagType, parentReference, textInChildNode, [, attribute, attributeValue ...]);
+function quickElement() {
+    var obj = document.createElement(arguments[0]);
+    if (arguments[2] != '' && arguments[2] != null) {
+        var textNode = document.createTextNode(arguments[2]);
+        obj.appendChild(textNode);
+    }
+    var len = arguments.length;
+    for (var i = 3; i < len; i += 2) {
+        obj.setAttribute(arguments[i], arguments[i+1]);
+    }
+    arguments[1].appendChild(obj);
+    return obj;
+}
+
+// CalendarNamespace -- Provides a collection of HTML calendar-related helper functions
+var CalendarNamespace = {
+    monthsOfYear: gettext('January February March April May June July August September October November December').split(' '),
+    daysOfWeek: gettext('S M T W T F S').split(' '),
+    isLeapYear: function(year) {
+        return (((year % 4)==0) && ((year % 100)!=0) || ((year % 400)==0));
+    },
+    getDaysInMonth: function(month,year) {
+        var days;
+        if (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12) {
+            days = 31;
+        }
+        else if (month==4 || month==6 || month==9 || month==11) {
+            days = 30;
+        }
+        else if (month==2 && CalendarNamespace.isLeapYear(year)) {
+            days = 29;
+        }
+        else {
+            days = 28;
+        }
+        return days;
+    },
+    draw: function(month, year, div_id, callback) { // month = 1-12, year = 1-9999
+        month = parseInt(month);
+        year = parseInt(year);
+        var calDiv = document.getElementById(div_id);
+        removeChildren(calDiv);
+        var calTable = document.createElement('table');
+        quickElement('caption', calTable, CalendarNamespace.monthsOfYear[month-1] + ' ' + year);
+        var tableBody = quickElement('tbody', calTable);
+
+        // Draw days-of-week header
+        var tableRow = quickElement('tr', tableBody);
+        for (var i = 0; i < 7; i++) {
+            quickElement('th', tableRow, CalendarNamespace.daysOfWeek[i]);
+        }
+
+        var startingPos = new Date(year, month-1, 1).getDay();
+        var days = CalendarNamespace.getDaysInMonth(month, year);
+
+        // Draw blanks before first of month
+        tableRow = quickElement('tr', tableBody);
+        for (var i = 0; i < startingPos; i++) {
+            var _cell = quickElement('td', tableRow, ' ');
+            _cell.style.backgroundColor = '#f3f3f3';
+        }
+
+        // Draw days of month
+        var currentDay = 1;
+        for (var i = startingPos; currentDay <= days; i++) {
+            if (i%7 == 0 && currentDay != 1) {
+                tableRow = quickElement('tr', tableBody);
+            }
+            var cell = quickElement('td', tableRow, '');
+            quickElement('a', cell, currentDay, 'href', 'javascript:void(' + callback + '('+year+','+month+','+currentDay+'));');
+            currentDay++;
+        }
+
+        // Draw blanks after end of month (optional, but makes for valid code)
+        while (tableRow.childNodes.length < 7) {
+            var _cell = quickElement('td', tableRow, ' ');
+            _cell.style.backgroundColor = '#f3f3f3';
+        }
+
+        calDiv.appendChild(calTable);
+    }
+}
+
+// Calendar -- A calendar instance
+function Calendar(div_id, callback) {
+    // div_id (string) is the ID of the element in which the calendar will
+    //     be displayed
+    // callback (string) is the name of a JavaScript function that will be
+    //     called with the parameters (year, month, day) when a day in the
+    //     calendar is clicked
+    this.div_id = div_id;
+    this.callback = callback;
+    this.today = new Date();
+    this.currentMonth = this.today.getMonth() + 1;
+    this.currentYear = this.today.getFullYear();
+}
+Calendar.prototype = {
+    drawCurrent: function() {
+        CalendarNamespace.draw(this.currentMonth, this.currentYear, this.div_id, this.callback);
+    },
+    drawDate: function(month, year) {
+        this.currentMonth = month;
+        this.currentYear = year;
+        this.drawCurrent();
+    },
+    drawPreviousMonth: function() {
+        if (this.currentMonth == 1) {
+            this.currentMonth = 12;
+            this.currentYear--;
+        }
+        else {
+            this.currentMonth--;
+        }
+        this.drawCurrent();
+    },
+    drawNextMonth: function() {
+        if (this.currentMonth == 12) {
+            this.currentMonth = 1;
+            this.currentYear++;
+        }
+        else {
+            this.currentMonth++;
+        }
+        this.drawCurrent();
+    },
+    drawPreviousYear: function() {
+        this.currentYear--;
+        this.drawCurrent();
+    },
+    drawNextYear: function() {
+        this.currentYear++;
+        this.drawCurrent();
+    }
+}
diff --git a/webapp/django/contrib/admin/media/js/core.js b/webapp/django/contrib/admin/media/js/core.js
new file mode 100644
index 0000000..c8d0db6
--- /dev/null
+++ b/webapp/django/contrib/admin/media/js/core.js
@@ -0,0 +1,176 @@
+// Core javascript helper functions
+
+// basic browser identification & version
+var isOpera = (navigator.userAgent.indexOf("Opera")>=0) && parseFloat(navigator.appVersion);
+var isIE = ((document.all) && (!isOpera)) && parseFloat(navigator.appVersion.split("MSIE ")[1].split(";")[0]);
+
+// Cross-browser event handlers.
+function addEvent(obj, evType, fn) {
+    if (obj.addEventListener) {
+        obj.addEventListener(evType, fn, false);
+        return true;
+    } else if (obj.attachEvent) {
+        var r = obj.attachEvent("on" + evType, fn);
+        return r;
+    } else {
+        return false;
+    }
+}
+
+function removeEvent(obj, evType, fn) {
+    if (obj.removeEventListener) {
+        obj.removeEventListener(evType, fn, false);
+        return true;
+    } else if (obj.detachEvent) {
+        obj.detachEvent("on" + evType, fn);
+        return true;
+    } else {
+        return false;
+    }
+}
+
+// quickElement(tagType, parentReference, textInChildNode, [, attribute, attributeValue ...]);
+function quickElement() {
+    var obj = document.createElement(arguments[0]);
+    if (arguments[2] != '' && arguments[2] != null) {
+        var textNode = document.createTextNode(arguments[2]);
+        obj.appendChild(textNode);
+    }
+    var len = arguments.length;
+    for (var i = 3; i < len; i += 2) {
+        obj.setAttribute(arguments[i], arguments[i+1]);
+    }
+    arguments[1].appendChild(obj);
+    return obj;
+}
+
+// ----------------------------------------------------------------------------
+// Cross-browser xmlhttp object
+// from http://jibbering.com/2002/4/httprequest.html
+// ----------------------------------------------------------------------------
+var xmlhttp;
+/*@cc_on @*/
+/*@if (@_jscript_version >= 5)
+    try {
+        xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
+    } catch (e) {
+        try {
+            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
+        } catch (E) {
+            xmlhttp = false;
+        }
+    }
+@else
+    xmlhttp = false;
+@end @*/
+if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
+  xmlhttp = new XMLHttpRequest();
+}
+
+// ----------------------------------------------------------------------------
+// Find-position functions by PPK
+// See http://www.quirksmode.org/js/findpos.html
+// ----------------------------------------------------------------------------
+function findPosX(obj) {
+    var curleft = 0;
+    if (obj.offsetParent) {
+        while (obj.offsetParent) {
+            curleft += obj.offsetLeft - ((isOpera) ? 0 : obj.scrollLeft);
+            obj = obj.offsetParent;
+        }
+        // IE offsetParent does not include the top-level 
+        if (isIE && obj.parentElement){
+            curleft += obj.offsetLeft - obj.scrollLeft;
+        }
+    } else if (obj.x) {
+        curleft += obj.x;
+    }
+    return curleft;
+}
+
+function findPosY(obj) {
+    var curtop = 0;
+    if (obj.offsetParent) {
+        while (obj.offsetParent) {
+            curtop += obj.offsetTop - ((isOpera) ? 0 : obj.scrollTop);
+            obj = obj.offsetParent;
+        }
+        // IE offsetParent does not include the top-level 
+        if (isIE && obj.parentElement){
+            curtop += obj.offsetTop - obj.scrollTop;
+        }
+    } else if (obj.y) {
+        curtop += obj.y;
+    }
+    return curtop;
+}
+
+//-----------------------------------------------------------------------------
+// Date object extensions
+// ----------------------------------------------------------------------------
+Date.prototype.getCorrectYear = function() {
+    // Date.getYear() is unreliable --
+    // see http://www.quirksmode.org/js/introdate.html#year
+    var y = this.getYear() % 100;
+    return (y < 38) ? y + 2000 : y + 1900;
+}
+
+Date.prototype.getTwoDigitMonth = function() {
+    return (this.getMonth() < 9) ? '0' + (this.getMonth()+1) : (this.getMonth()+1);
+}
+
+Date.prototype.getTwoDigitDate = function() {
+    return (this.getDate() < 10) ? '0' + this.getDate() : this.getDate();
+}
+
+Date.prototype.getTwoDigitHour = function() {
+    return (this.getHours() < 10) ? '0' + this.getHours() : this.getHours();
+}
+
+Date.prototype.getTwoDigitMinute = function() {
+    return (this.getMinutes() < 10) ? '0' + this.getMinutes() : this.getMinutes();
+}
+
+Date.prototype.getTwoDigitSecond = function() {
+    return (this.getSeconds() < 10) ? '0' + this.getSeconds() : this.getSeconds();
+}
+
+Date.prototype.getISODate = function() {
+    return this.getCorrectYear() + '-' + this.getTwoDigitMonth() + '-' + this.getTwoDigitDate();
+}
+
+Date.prototype.getHourMinute = function() {
+    return this.getTwoDigitHour() + ':' + this.getTwoDigitMinute();
+}
+
+Date.prototype.getHourMinuteSecond = function() {
+    return this.getTwoDigitHour() + ':' + this.getTwoDigitMinute() + ':' + this.getTwoDigitSecond();
+}
+
+// ----------------------------------------------------------------------------
+// String object extensions
+// ----------------------------------------------------------------------------
+String.prototype.pad_left = function(pad_length, pad_string) {
+    var new_string = this;
+    for (var i = 0; new_string.length < pad_length; i++) {
+        new_string = pad_string + new_string;
+    }
+    return new_string;
+}
+
+// ----------------------------------------------------------------------------
+// Get the computed style for and element
+// ----------------------------------------------------------------------------
+function getStyle(oElm, strCssRule){
+    var strValue = "";
+    if(document.defaultView && document.defaultView.getComputedStyle){
+        strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule);
+    }
+    else if(oElm.currentStyle){
+        strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1){
+            return p1.toUpperCase();
+        });
+        strValue = oElm.currentStyle[strCssRule];
+    }
+    return strValue;
+}
diff --git a/webapp/django/contrib/admin/media/js/dateparse.js b/webapp/django/contrib/admin/media/js/dateparse.js
new file mode 100644
index 0000000..e1c870e
--- /dev/null
+++ b/webapp/django/contrib/admin/media/js/dateparse.js
@@ -0,0 +1,233 @@
+/* 'Magic' date parsing, by Simon Willison (6th October 2003)
+   http://simon.incutio.com/archive/2003/10/06/betterDateInput
+   Adapted for 6newslawrence.com, 28th January 2004
+*/
+
+/* Finds the index of the first occurence of item in the array, or -1 if not found */
+if (typeof Array.prototype.indexOf == 'undefined') {
+    Array.prototype.indexOf = function(item) {
+        var len = this.length;
+        for (var i = 0; i < len; i++) {
+            if (this[i] == item) {
+                return i;
+            }
+        }
+        return -1;
+    };
+}
+/* Returns an array of items judged 'true' by the passed in test function */
+if (typeof Array.prototype.filter == 'undefined') {
+    Array.prototype.filter = function(test) {
+        var matches = [];
+        var len = this.length;
+        for (var i = 0; i < len; i++) {
+            if (test(this[i])) {
+                matches[matches.length] = this[i];
+            }
+        }
+        return matches;
+    };
+}
+
+var monthNames = gettext("January February March April May June July August September October November December").split(" ");
+var weekdayNames = gettext("Sunday Monday Tuesday Wednesday Thursday Friday Saturday").split(" ");
+
+/* Takes a string, returns the index of the month matching that string, throws
+   an error if 0 or more than 1 matches
+*/
+function parseMonth(month) {
+    var matches = monthNames.filter(function(item) { 
+        return new RegExp("^" + month, "i").test(item);
+    });
+    if (matches.length == 0) {
+        throw new Error("Invalid month string");
+    }
+    if (matches.length > 1) {
+        throw new Error("Ambiguous month");
+    }
+    return monthNames.indexOf(matches[0]);
+}
+/* Same as parseMonth but for days of the week */
+function parseWeekday(weekday) {
+    var matches = weekdayNames.filter(function(item) {
+        return new RegExp("^" + weekday, "i").test(item);
+    });
+    if (matches.length == 0) {
+        throw new Error("Invalid day string");
+    }
+    if (matches.length > 1) {
+        throw new Error("Ambiguous weekday");
+    }
+    return weekdayNames.indexOf(matches[0]);
+}
+
+/* Array of objects, each has 're', a regular expression and 'handler', a 
+   function for creating a date from something that matches the regular 
+   expression. Handlers may throw errors if string is unparseable. 
+*/
+var dateParsePatterns = [
+    // Today
+    {   re: /^tod/i,
+        handler: function() { 
+            return new Date();
+        } 
+    },
+    // Tomorrow
+    {   re: /^tom/i,
+        handler: function() {
+            var d = new Date(); 
+            d.setDate(d.getDate() + 1); 
+            return d;
+        }
+    },
+    // Yesterday
+    {   re: /^yes/i,
+        handler: function() {
+            var d = new Date();
+            d.setDate(d.getDate() - 1);
+            return d;
+        }
+    },
+    // 4th
+    {   re: /^(\d{1,2})(st|nd|rd|th)?$/i, 
+        handler: function(bits) {
+            var d = new Date();
+            d.setDate(parseInt(bits[1], 10));
+            return d;
+        }
+    },
+    // 4th Jan
+    {   re: /^(\d{1,2})(?:st|nd|rd|th)? (\w+)$/i, 
+        handler: function(bits) {
+            var d = new Date();
+            d.setDate(parseInt(bits[1], 10));
+            d.setMonth(parseMonth(bits[2]));
+            return d;
+        }
+    },
+    // 4th Jan 2003
+    {   re: /^(\d{1,2})(?:st|nd|rd|th)? (\w+),? (\d{4})$/i,
+        handler: function(bits) {
+            var d = new Date();
+            d.setDate(parseInt(bits[1], 10));
+            d.setMonth(parseMonth(bits[2]));
+            d.setYear(bits[3]);
+            return d;
+        }
+    },
+    // Jan 4th
+    {   re: /^(\w+) (\d{1,2})(?:st|nd|rd|th)?$/i, 
+        handler: function(bits) {
+            var d = new Date();
+            d.setDate(parseInt(bits[2], 10));
+            d.setMonth(parseMonth(bits[1]));
+            return d;
+        }
+    },
+    // Jan 4th 2003
+    {   re: /^(\w+) (\d{1,2})(?:st|nd|rd|th)?,? (\d{4})$/i,
+        handler: function(bits) {
+            var d = new Date();
+            d.setDate(parseInt(bits[2], 10));
+            d.setMonth(parseMonth(bits[1]));
+            d.setYear(bits[3]);
+            return d;
+        }
+    },
+    // next Tuesday - this is suspect due to weird meaning of "next"
+    {   re: /^next (\w+)$/i,
+        handler: function(bits) {
+            var d = new Date();
+            var day = d.getDay();
+            var newDay = parseWeekday(bits[1]);
+            var addDays = newDay - day;
+            if (newDay <= day) {
+                addDays += 7;
+            }
+            d.setDate(d.getDate() + addDays);
+            return d;
+        }
+    },
+    // last Tuesday
+    {   re: /^last (\w+)$/i,
+        handler: function(bits) {
+            throw new Error("Not yet implemented");
+        }
+    },
+    // mm/dd/yyyy (American style)
+    {   re: /(\d{1,2})\/(\d{1,2})\/(\d{4})/,
+        handler: function(bits) {
+            var d = new Date();
+            d.setYear(bits[3]);
+            d.setDate(parseInt(bits[2], 10));
+            d.setMonth(parseInt(bits[1], 10) - 1); // Because months indexed from 0
+            return d;
+        }
+    },
+    // yyyy-mm-dd (ISO style)
+    {   re: /(\d{4})-(\d{1,2})-(\d{1,2})/,
+        handler: function(bits) {
+            var d = new Date();
+            d.setYear(parseInt(bits[1]));
+            d.setMonth(parseInt(bits[2], 10) - 1);
+            d.setDate(parseInt(bits[3], 10));
+            return d;
+        }
+    },
+];
+
+function parseDateString(s) {
+    for (var i = 0; i < dateParsePatterns.length; i++) {
+        var re = dateParsePatterns[i].re;
+        var handler = dateParsePatterns[i].handler;
+        var bits = re.exec(s);
+        if (bits) {
+            return handler(bits);
+        }
+    }
+    throw new Error("Invalid date string");
+}
+
+function fmt00(x) {
+    // fmt00: Tags leading zero onto numbers 0 - 9.
+    // Particularly useful for displaying results from Date methods.
+    //
+    if (Math.abs(parseInt(x)) < 10){
+        x = "0"+ Math.abs(x);
+    }
+    return x;
+}
+
+function parseDateStringISO(s) {
+    try {
+        var d = parseDateString(s);
+        return d.getFullYear() + '-' + (fmt00(d.getMonth() + 1)) + '-' + fmt00(d.getDate())
+    }
+    catch (e) { return s; }
+}
+function magicDate(input) {
+    var messagespan = input.id + 'Msg';
+    try {
+        var d = parseDateString(input.value);
+        input.value = d.getFullYear() + '-' + (fmt00(d.getMonth() + 1)) + '-' + 
+            fmt00(d.getDate());
+        input.className = '';
+        // Human readable date
+        if (document.getElementById(messagespan)) {
+            document.getElementById(messagespan).firstChild.nodeValue = d.toDateString();
+            document.getElementById(messagespan).className = 'normal';
+        }
+    }
+    catch (e) {
+        input.className = 'error';
+        var message = e.message;
+        // Fix for IE6 bug
+        if (message.indexOf('is null or not an object') > -1) {
+            message = 'Invalid date string';
+        }
+        if (document.getElementById(messagespan)) {
+            document.getElementById(messagespan).firstChild.nodeValue = message;
+            document.getElementById(messagespan).className = 'error';
+        }
+    }
+}
diff --git a/webapp/django/contrib/admin/media/js/getElementsBySelector.js b/webapp/django/contrib/admin/media/js/getElementsBySelector.js
new file mode 100644
index 0000000..ae6d387
--- /dev/null
+++ b/webapp/django/contrib/admin/media/js/getElementsBySelector.js
@@ -0,0 +1,167 @@
+/* document.getElementsBySelector(selector)
+   - returns an array of element objects from the current document
+     matching the CSS selector. Selectors can contain element names, 
+     class names and ids and can be nested. For example:
+     
+       elements = document.getElementsBySelect('div#main p a.external')
+     
+     Will return an array of all 'a' elements with 'external' in their 
+     class attribute that are contained inside 'p' elements that are 
+     contained inside the 'div' element which has id="main"
+
+   New in version 0.4: Support for CSS2 and CSS3 attribute selectors:
+   See http://www.w3.org/TR/css3-selectors/#attribute-selectors
+
+   Version 0.4 - Simon Willison, March 25th 2003
+   -- Works in Phoenix 0.5, Mozilla 1.3, Opera 7, Internet Explorer 6, Internet Explorer 5 on Windows
+   -- Opera 7 fails 
+*/
+
+function getAllChildren(e) {
+  // Returns all children of element. Workaround required for IE5/Windows. Ugh.
+  return e.all ? e.all : e.getElementsByTagName('*');
+}
+
+document.getElementsBySelector = function(selector) {
+  // Attempt to fail gracefully in lesser browsers
+  if (!document.getElementsByTagName) {
+    return new Array();
+  }
+  // Split selector in to tokens
+  var tokens = selector.split(' ');
+  var currentContext = new Array(document);
+  for (var i = 0; i < tokens.length; i++) {
+    token = tokens[i].replace(/^\s+/,'').replace(/\s+$/,'');;
+    if (token.indexOf('#') > -1) {
+      // Token is an ID selector
+      var bits = token.split('#');
+      var tagName = bits[0];
+      var id = bits[1];
+      var element = document.getElementById(id);
+      if (tagName && element.nodeName.toLowerCase() != tagName) {
+        // tag with that ID not found, return false
+        return new Array();
+      }
+      // Set currentContext to contain just this element
+      currentContext = new Array(element);
+      continue; // Skip to next token
+    }
+    if (token.indexOf('.') > -1) {
+      // Token contains a class selector
+      var bits = token.split('.');
+      var tagName = bits[0];
+      var className = bits[1];
+      if (!tagName) {
+        tagName = '*';
+      }
+      // Get elements matching tag, filter them for class selector
+      var found = new Array;
+      var foundCount = 0;
+      for (var h = 0; h < currentContext.length; h++) {
+        var elements;
+        if (tagName == '*') {
+            elements = getAllChildren(currentContext[h]);
+        } else {
+            try {
+                elements = currentContext[h].getElementsByTagName(tagName);
+            }
+            catch(e) {
+                elements = [];
+            }
+        }
+        for (var j = 0; j < elements.length; j++) {
+          found[foundCount++] = elements[j];
+        }
+      }
+      currentContext = new Array;
+      var currentContextIndex = 0;
+      for (var k = 0; k < found.length; k++) {
+        if (found[k].className && found[k].className.match(new RegExp('\\b'+className+'\\b'))) {
+          currentContext[currentContextIndex++] = found[k];
+        }
+      }
+      continue; // Skip to next token
+    }
+    // Code to deal with attribute selectors
+    if (token.match(/^(\w*)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/)) {
+      var tagName = RegExp.$1;
+      var attrName = RegExp.$2;
+      var attrOperator = RegExp.$3;
+      var attrValue = RegExp.$4;
+      if (!tagName) {
+        tagName = '*';
+      }
+      // Grab all of the tagName elements within current context
+      var found = new Array;
+      var foundCount = 0;
+      for (var h = 0; h < currentContext.length; h++) {
+        var elements;
+        if (tagName == '*') {
+            elements = getAllChildren(currentContext[h]);
+        } else {
+            elements = currentContext[h].getElementsByTagName(tagName);
+        }
+        for (var j = 0; j < elements.length; j++) {
+          found[foundCount++] = elements[j];
+        }
+      }
+      currentContext = new Array;
+      var currentContextIndex = 0;
+      var checkFunction; // This function will be used to filter the elements
+      switch (attrOperator) {
+        case '=': // Equality
+          checkFunction = function(e) { return (e.getAttribute(attrName) == attrValue); };
+          break;
+        case '~': // Match one of space seperated words 
+          checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('\\b'+attrValue+'\\b'))); };
+          break;
+        case '|': // Match start with value followed by optional hyphen
+          checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('^'+attrValue+'-?'))); };
+          break;
+        case '^': // Match starts with value
+          checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) == 0); };
+          break;
+        case '$': // Match ends with value - fails with "Warning" in Opera 7
+          checkFunction = function(e) { return (e.getAttribute(attrName).lastIndexOf(attrValue) == e.getAttribute(attrName).length - attrValue.length); };
+          break;
+        case '*': // Match ends with value
+          checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) > -1); };
+          break;
+        default :
+          // Just test for existence of attribute
+          checkFunction = function(e) { return e.getAttribute(attrName); };
+      }
+      currentContext = new Array;
+      var currentContextIndex = 0;
+      for (var k = 0; k < found.length; k++) {
+        if (checkFunction(found[k])) {
+          currentContext[currentContextIndex++] = found[k];
+        }
+      }
+      // alert('Attribute Selector: '+tagName+' '+attrName+' '+attrOperator+' '+attrValue);
+      continue; // Skip to next token
+    }
+    // If we get here, token is JUST an element (not a class or ID selector)
+    tagName = token;
+    var found = new Array;
+    var foundCount = 0;
+    for (var h = 0; h < currentContext.length; h++) {
+      var elements = currentContext[h].getElementsByTagName(tagName);
+      for (var j = 0; j < elements.length; j++) {
+        found[foundCount++] = elements[j];
+      }
+    }
+    currentContext = found;
+  }
+  return currentContext;
+}
+
+/* That revolting regular expression explained 
+/^(\w+)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/
+  \---/  \---/\-------------/    \-------/
+    |      |         |               |
+    |      |         |           The value
+    |      |    ~,|,^,$,* or =
+    |   Attribute 
+   Tag
+*/
diff --git a/webapp/django/contrib/admin/media/js/timeparse.js b/webapp/django/contrib/admin/media/js/timeparse.js
new file mode 100644
index 0000000..882f41d
--- /dev/null
+++ b/webapp/django/contrib/admin/media/js/timeparse.js
@@ -0,0 +1,94 @@
+var timeParsePatterns = [
+    // 9
+    {   re: /^\d{1,2}$/i,
+        handler: function(bits) {
+            if (bits[0].length == 1) {
+                return '0' + bits[0] + ':00';
+            } else {
+                return bits[0] + ':00';
+            }
+        }
+    },
+    // 13:00
+    {   re: /^\d{2}[:.]\d{2}$/i,
+        handler: function(bits) {
+            return bits[0].replace('.', ':');
+        }
+    },
+    // 9:00
+    {   re: /^\d[:.]\d{2}$/i,
+        handler: function(bits) {
+            return '0' + bits[0].replace('.', ':');
+        }
+    },
+    // 3 am / 3 a.m. / 3am
+    {   re: /^(\d+)\s*([ap])(?:.?m.?)?$/i,
+        handler: function(bits) {
+            var hour = parseInt(bits[1]);
+            if (hour == 12) {
+                hour = 0;
+            }
+            if (bits[2].toLowerCase() == 'p') {
+                if (hour == 12) {
+                    hour = 0;
+                }
+                return (hour + 12) + ':00';
+            } else {
+                if (hour < 10) {
+                    return '0' + hour + ':00';
+                } else {
+                    return hour + ':00';
+                }
+            }
+        }
+    },
+    // 3.30 am / 3:15 a.m. / 3.00am
+    {   re: /^(\d+)[.:](\d{2})\s*([ap]).?m.?$/i,
+        handler: function(bits) {
+            var hour = parseInt(bits[1]);
+            var mins = parseInt(bits[2]);
+            if (mins < 10) {
+                mins = '0' + mins;
+            }
+            if (hour == 12) {
+                hour = 0;
+            }
+            if (bits[3].toLowerCase() == 'p') {
+                if (hour == 12) {
+                    hour = 0;
+                }
+                return (hour + 12) + ':' + mins;
+            } else {
+                if (hour < 10) {
+                    return '0' + hour + ':' + mins;
+                } else {
+                    return hour + ':' + mins;
+                }
+            }
+        }
+    },
+    // noon
+    {   re: /^no/i,
+        handler: function(bits) {
+            return '12:00';
+        }
+    },
+    // midnight
+    {   re: /^mid/i,
+        handler: function(bits) {
+            return '00:00';
+        }
+    }
+];
+
+function parseTimeString(s) {
+    for (var i = 0; i < timeParsePatterns.length; i++) {
+        var re = timeParsePatterns[i].re;
+        var handler = timeParsePatterns[i].handler;
+        var bits = re.exec(s);
+        if (bits) {
+            return handler(bits);
+        }
+    }
+    return s;
+}
diff --git a/webapp/django/contrib/admin/media/js/urlify.js b/webapp/django/contrib/admin/media/js/urlify.js
new file mode 100644
index 0000000..d8f2549
--- /dev/null
+++ b/webapp/django/contrib/admin/media/js/urlify.js
@@ -0,0 +1,140 @@
+var LATIN_MAP = {
+    'À': 'A', 'Á': 'A', 'Â': 'A', 'Ã': 'A', 'Ä': 'A', 'Å': 'A', 'Æ': 'AE', 'Ç':
+    'C', 'È': 'E', 'É': 'E', 'Ê': 'E', 'Ë': 'E', 'Ì': 'I', 'Í': 'I', 'Î': 'I',
+    'Ï': 'I', 'Ð': 'D', 'Ñ': 'N', 'Ò': 'O', 'Ó': 'O', 'Ô': 'O', 'Õ': 'O', 'Ö':
+    'O', 'Ő': 'O', 'Ø': 'O', 'Ù': 'U', 'Ú': 'U', 'Û': 'U', 'Ü': 'U', 'Ű': 'U',
+    'Ý': 'Y', 'Þ': 'TH', 'ß': 'ss', 'à':'a', 'á':'a', 'â': 'a', 'ã': 'a', 'ä':
+    'a', 'å': 'a', 'æ': 'ae', 'ç': 'c', 'è': 'e', 'é': 'e', 'ê': 'e', 'ë': 'e',
+    'ì': 'i', 'í': 'i', 'î': 'i', 'ï': 'i', 'ð': 'd', 'ñ': 'n', 'ò': 'o', 'ó':
+    'o', 'ô': 'o', 'õ': 'o', 'ö': 'o', 'ő': 'o', 'ø': 'o', 'ù': 'u', 'ú': 'u',
+    'û': 'u', 'ü': 'u', 'ű': 'u', 'ý': 'y', 'þ': 'th', 'ÿ': 'y'
+}
+var LATIN_SYMBOLS_MAP = {
+    '©':'(c)'
+}
+var GREEK_MAP = {
+    'α':'a', 'β':'b', 'γ':'g', 'δ':'d', 'ε':'e', 'ζ':'z', 'η':'h', 'θ':'8',
+    'ι':'i', 'κ':'k', 'λ':'l', 'μ':'m', 'ν':'n', 'ξ':'3', 'ο':'o', 'π':'p',
+    'ρ':'r', 'σ':'s', 'τ':'t', 'υ':'y', 'φ':'f', 'χ':'x', 'ψ':'ps', 'ω':'w',
+    'ά':'a', 'έ':'e', 'ί':'i', 'ό':'o', 'ύ':'y', 'ή':'h', 'ώ':'w', 'ς':'s',
+    'ϊ':'i', 'ΰ':'y', 'ϋ':'y', 'ΐ':'i',
+    'Α':'A', 'Β':'B', 'Γ':'G', 'Δ':'D', 'Ε':'E', 'Ζ':'Z', 'Η':'H', 'Θ':'8',
+    'Ι':'I', 'Κ':'K', 'Λ':'L', 'Μ':'M', 'Ν':'N', 'Ξ':'3', 'Ο':'O', 'Π':'P',
+    'Ρ':'R', 'Σ':'S', 'Τ':'T', 'Υ':'Y', 'Φ':'F', 'Χ':'X', 'Ψ':'PS', 'Ω':'W',
+    'Ά':'A', 'Έ':'E', 'Ί':'I', 'Ό':'O', 'Ύ':'Y', 'Ή':'H', 'Ώ':'W', 'Ϊ':'I',
+    'Ϋ':'Y'
+}
+var TURKISH_MAP = {
+    'ş':'s', 'Ş':'S', 'ı':'i', 'İ':'I', 'ç':'c', 'Ç':'C', 'ü':'u', 'Ü':'U',
+    'ö':'o', 'Ö':'O', 'ğ':'g', 'Ğ':'G'
+}
+var RUSSIAN_MAP = {
+    'а':'a', 'б':'b', 'в':'v', 'г':'g', 'д':'d', 'е':'e', 'ё':'yo', 'ж':'zh',
+    'з':'z', 'и':'i', 'й':'j', 'к':'k', 'л':'l', 'м':'m', 'н':'n', 'о':'o',
+    'п':'p', 'р':'r', 'с':'s', 'т':'t', 'у':'u', 'ф':'f', 'х':'h', 'ц':'c',
+    'ч':'ch', 'ш':'sh', 'щ':'sh', 'ъ':'', 'ы':'y', 'ь':'', 'э':'e', 'ю':'yu',
+    'я':'ya',
+    'А':'A', 'Б':'B', 'В':'V', 'Г':'G', 'Д':'D', 'Е':'E', 'Ё':'Yo', 'Ж':'Zh',
+    'З':'Z', 'И':'I', 'Й':'J', 'К':'K', 'Л':'L', 'М':'M', 'Н':'N', 'О':'O',
+    'П':'P', 'Р':'R', 'С':'S', 'Т':'T', 'У':'U', 'Ф':'F', 'Х':'H', 'Ц':'C',
+    'Ч':'Ch', 'Ш':'Sh', 'Щ':'Sh', 'Ъ':'', 'Ы':'Y', 'Ь':'', 'Э':'E', 'Ю':'Yu',
+    'Я':'Ya'
+}
+var UKRAINIAN_MAP = {
+    'Є':'Ye', 'І':'I', 'Ї':'Yi', 'Ґ':'G', 'є':'ye', 'і':'i', 'ї':'yi', 'ґ':'g'
+}
+var CZECH_MAP = {
+    'č':'c', 'ď':'d', 'ě':'e', 'ň': 'n', 'ř':'r', 'š':'s', 'ť':'t', 'ů':'u',
+    'ž':'z', 'Č':'C', 'Ď':'D', 'Ě':'E', 'Ň': 'N', 'Ř':'R', 'Š':'S', 'Ť':'T',
+    'Ů':'U', 'Ž':'Z'
+}
+
+var POLISH_MAP = {
+    'ą':'a', 'ć':'c', 'ę':'e', 'ł':'l', 'ń':'n', 'ó':'o', 'ś':'s', 'ź':'z',
+    'ż':'z', 'Ą':'A', 'Ć':'C', 'Ę':'e', 'Ł':'L', 'Ń':'N', 'Ó':'o', 'Ś':'S',
+    'Ź':'Z', 'Ż':'Z'
+}
+
+var LATVIAN_MAP = {
+    'ā':'a', 'č':'c', 'ē':'e', 'ģ':'g', 'ī':'i', 'ķ':'k', 'ļ':'l', 'ņ':'n',
+    'š':'s', 'ū':'u', 'ž':'z', 'Ā':'A', 'Č':'C', 'Ē':'E', 'Ģ':'G', 'Ī':'i',
+    'Ķ':'k', 'Ļ':'L', 'Ņ':'N', 'Š':'S', 'Ū':'u', 'Ž':'Z'
+}
+
+var ALL_DOWNCODE_MAPS=new Array()
+ALL_DOWNCODE_MAPS[0]=LATIN_MAP
+ALL_DOWNCODE_MAPS[1]=LATIN_SYMBOLS_MAP
+ALL_DOWNCODE_MAPS[2]=GREEK_MAP
+ALL_DOWNCODE_MAPS[3]=TURKISH_MAP
+ALL_DOWNCODE_MAPS[4]=RUSSIAN_MAP
+ALL_DOWNCODE_MAPS[5]=UKRAINIAN_MAP
+ALL_DOWNCODE_MAPS[6]=CZECH_MAP
+ALL_DOWNCODE_MAPS[7]=POLISH_MAP
+ALL_DOWNCODE_MAPS[8]=LATVIAN_MAP
+
+var Downcoder = new Object();
+Downcoder.Initialize = function()
+{
+    if (Downcoder.map) // already made
+        return ;
+    Downcoder.map ={}
+    Downcoder.chars = '' ;
+    for(var i in ALL_DOWNCODE_MAPS)
+    {
+        var lookup = ALL_DOWNCODE_MAPS[i]
+        for (var c in lookup)
+        {
+            Downcoder.map[c] = lookup[c] ;
+            Downcoder.chars += c ;
+        }
+     }
+    Downcoder.regex = new RegExp('[' + Downcoder.chars + ']|[^' + Downcoder.chars + ']+','g') ;
+}
+
+downcode= function( slug )
+{
+    Downcoder.Initialize() ;
+    var downcoded =""
+    var pieces = slug.match(Downcoder.regex);
+    if(pieces)
+    {
+        for (var i = 0 ; i < pieces.length ; i++)
+        {
+            if (pieces[i].length == 1)
+            {
+                var mapped = Downcoder.map[pieces[i]] ;
+                if (mapped != null)
+                {
+                    downcoded+=mapped;
+                    continue ;
+                }
+            }
+            downcoded+=pieces[i];
+        }
+    }
+    else
+    {
+        downcoded = slug;
+    }
+    return downcoded;
+}
+
+
+function URLify(s, num_chars) {
+    // changes, e.g., "Petty theft" to "petty_theft"
+    // remove all these words from the string before urlifying
+    s = downcode(s);
+    removelist = ["a", "an", "as", "at", "before", "but", "by", "for", "from",
+                  "is", "in", "into", "like", "of", "off", "on", "onto", "per",
+                  "since", "than", "the", "this", "that", "to", "up", "via",
+                  "with"];
+    r = new RegExp('\\b(' + removelist.join('|') + ')\\b', 'gi');
+    s = s.replace(r, '');
+    // if downcode doesn't hit, the char will be stripped here
+    s = s.replace(/[^-\w\s]/g, '');  // remove unneeded chars
+    s = s.replace(/^\s+|\s+$/g, ''); // trim leading/trailing spaces
+    s = s.replace(/[-\s]+/g, '-');   // convert spaces to hyphens
+    s = s.toLowerCase();             // convert to lowercase
+    return s.substring(0, num_chars);// trim to first num_chars chars
+}
+
diff --git a/webapp/django/contrib/admin/models.py b/webapp/django/contrib/admin/models.py
new file mode 100644
index 0000000..259884f
--- /dev/null
+++ b/webapp/django/contrib/admin/models.py
@@ -0,0 +1,54 @@
+from django.db import models
+from django.contrib.contenttypes.models import ContentType
+from django.contrib.auth.models import User
+from django.contrib.admin.util import quote
+from django.utils.translation import ugettext_lazy as _
+from django.utils.encoding import smart_unicode
+from django.utils.safestring import mark_safe
+
+ADDITION = 1
+CHANGE = 2
+DELETION = 3
+
+class LogEntryManager(models.Manager):
+    def log_action(self, user_id, content_type_id, object_id, object_repr, action_flag, change_message=''):
+        e = self.model(None, None, user_id, content_type_id, smart_unicode(object_id), object_repr[:200], action_flag, change_message)
+        e.save()
+
+class LogEntry(models.Model):
+    action_time = models.DateTimeField(_('action time'), auto_now=True)
+    user = models.ForeignKey(User)
+    content_type = models.ForeignKey(ContentType, blank=True, null=True)
+    object_id = models.TextField(_('object id'), blank=True, null=True)
+    object_repr = models.CharField(_('object repr'), max_length=200)
+    action_flag = models.PositiveSmallIntegerField(_('action flag'))
+    change_message = models.TextField(_('change message'), blank=True)
+    objects = LogEntryManager()
+    class Meta:
+        verbose_name = _('log entry')
+        verbose_name_plural = _('log entries')
+        db_table = 'django_admin_log'
+        ordering = ('-action_time',)
+
+    def __repr__(self):
+        return smart_unicode(self.action_time)
+
+    def is_addition(self):
+        return self.action_flag == ADDITION
+
+    def is_change(self):
+        return self.action_flag == CHANGE
+
+    def is_deletion(self):
+        return self.action_flag == DELETION
+
+    def get_edited_object(self):
+        "Returns the edited object represented by this log entry"
+        return self.content_type.get_object_for_this_type(pk=self.object_id)
+
+    def get_admin_url(self):
+        """
+        Returns the admin URL to edit the object represented by this log entry.
+        This is relative to the Django admin index page.
+        """
+        return mark_safe(u"%s/%s/%s/" % (self.content_type.app_label, self.content_type.model, quote(self.object_id)))
diff --git a/webapp/django/contrib/admin/options.py b/webapp/django/contrib/admin/options.py
new file mode 100644
index 0000000..1d00683
--- /dev/null
+++ b/webapp/django/contrib/admin/options.py
@@ -0,0 +1,790 @@
+from django import forms, template
+from django.forms.formsets import all_valid
+from django.forms.models import modelform_factory, inlineformset_factory
+from django.forms.models import BaseInlineFormSet
+from django.contrib.contenttypes.models import ContentType
+from django.contrib.admin import widgets
+from django.contrib.admin import helpers
+from django.contrib.admin.util import quote, unquote, flatten_fieldsets, get_deleted_objects
+from django.core.exceptions import PermissionDenied
+from django.db import models, transaction
+from django.http import Http404, HttpResponse, HttpResponseRedirect
+from django.shortcuts import get_object_or_404, render_to_response
+from django.utils.html import escape
+from django.utils.safestring import mark_safe
+from django.utils.text import capfirst, get_text_list
+from django.utils.translation import ugettext as _
+from django.utils.encoding import force_unicode
+try:
+    set
+except NameError:
+    from sets import Set as set     # Python 2.3 fallback
+
+HORIZONTAL, VERTICAL = 1, 2
+# returns the <ul> class for a given radio_admin field
+get_ul_class = lambda x: 'radiolist%s' % ((x == HORIZONTAL) and ' inline' or '')
+
+class IncorrectLookupParameters(Exception):
+    pass
+
+class BaseModelAdmin(object):
+    """Functionality common to both ModelAdmin and InlineAdmin."""
+    raw_id_fields = ()
+    fields = None
+    fieldsets = None
+    form = forms.ModelForm
+    filter_vertical = ()
+    filter_horizontal = ()
+    radio_fields = {}
+    prepopulated_fields = {}
+
+    def formfield_for_dbfield(self, db_field, **kwargs):
+        """
+        Hook for specifying the form Field instance for a given database Field
+        instance.
+
+        If kwargs are given, they're passed to the form Field's constructor.
+        """
+        
+        # If the field specifies choices, we don't need to look for special
+        # admin widgets - we just need to use a select widget of some kind.
+        if db_field.choices:
+            if db_field.name in self.radio_fields:
+                # If the field is named as a radio_field, use a RadioSelect
+                kwargs['widget'] = widgets.AdminRadioSelect(
+                    choices=db_field.get_choices(include_blank=db_field.blank,
+                        blank_choice=[('', _('None'))]),
+                    attrs={
+                        'class': get_ul_class(self.radio_fields[db_field.name]),
+                    }
+                )
+                return db_field.formfield(**kwargs)
+            else:
+                # Otherwise, use the default select widget.
+                return db_field.formfield(**kwargs)
+
+        # For DateTimeFields, use a special field and widget.
+        if isinstance(db_field, models.DateTimeField):
+            kwargs['form_class'] = forms.SplitDateTimeField
+            kwargs['widget'] = widgets.AdminSplitDateTime()
+            return db_field.formfield(**kwargs)
+
+        # For DateFields, add a custom CSS class.
+        if isinstance(db_field, models.DateField):
+            kwargs['widget'] = widgets.AdminDateWidget
+            return db_field.formfield(**kwargs)
+
+        # For TimeFields, add a custom CSS class.
+        if isinstance(db_field, models.TimeField):
+            kwargs['widget'] = widgets.AdminTimeWidget
+            return db_field.formfield(**kwargs)
+        
+        # For TextFields, add a custom CSS class.
+        if isinstance(db_field, models.TextField):
+            kwargs['widget'] = widgets.AdminTextareaWidget
+            return db_field.formfield(**kwargs)
+        
+        # For URLFields, add a custom CSS class.
+        if isinstance(db_field, models.URLField):
+            kwargs['widget'] = widgets.AdminURLFieldWidget
+            return db_field.formfield(**kwargs)
+        
+        # For IntegerFields, add a custom CSS class.
+        if isinstance(db_field, models.IntegerField):
+            kwargs['widget'] = widgets.AdminIntegerFieldWidget
+            return db_field.formfield(**kwargs)
+
+        # For TextInputs, add a custom CSS class.
+        if isinstance(db_field, models.CharField):
+            kwargs['widget'] = widgets.AdminTextInputWidget
+            return db_field.formfield(**kwargs)
+    
+        # For FileFields and ImageFields add a link to the current file.
+        if isinstance(db_field, models.ImageField) or isinstance(db_field, models.FileField):
+            kwargs['widget'] = widgets.AdminFileWidget
+            return db_field.formfield(**kwargs)
+
+        # For ForeignKey or ManyToManyFields, use a special widget.
+        if isinstance(db_field, (models.ForeignKey, models.ManyToManyField)):
+            if isinstance(db_field, models.ForeignKey) and db_field.name in self.raw_id_fields:
+                kwargs['widget'] = widgets.ForeignKeyRawIdWidget(db_field.rel)
+            elif isinstance(db_field, models.ForeignKey) and db_field.name in self.radio_fields:
+                kwargs['widget'] = widgets.AdminRadioSelect(attrs={
+                    'class': get_ul_class(self.radio_fields[db_field.name]),
+                })
+                kwargs['empty_label'] = db_field.blank and _('None') or None
+            else:
+                if isinstance(db_field, models.ManyToManyField):
+                    # If it uses an intermediary model, don't show field in admin.
+                    if db_field.rel.through is not None:
+                        return None
+                    elif db_field.name in self.raw_id_fields:
+                        kwargs['widget'] = widgets.ManyToManyRawIdWidget(db_field.rel)
+                        kwargs['help_text'] = ''
+                    elif db_field.name in (list(self.filter_vertical) + list(self.filter_horizontal)):
+                        kwargs['widget'] = widgets.FilteredSelectMultiple(db_field.verbose_name, (db_field.name in self.filter_vertical))
+            # Wrap the widget's render() method with a method that adds
+            # extra HTML to the end of the rendered output.
+            formfield = db_field.formfield(**kwargs)
+            # Don't wrap raw_id fields. Their add function is in the popup window.
+            if not db_field.name in self.raw_id_fields:
+                # formfield can be None if it came from a OneToOneField with
+                # parent_link=True
+                if formfield is not None:
+                    formfield.widget = widgets.RelatedFieldWidgetWrapper(formfield.widget, db_field.rel, self.admin_site)
+            return formfield
+
+        # For any other type of field, just call its formfield() method.
+        return db_field.formfield(**kwargs)
+
+    def _declared_fieldsets(self):
+        if self.fieldsets:
+            return self.fieldsets
+        elif self.fields:
+            return [(None, {'fields': self.fields})]
+        return None
+    declared_fieldsets = property(_declared_fieldsets)
+
+class ModelAdmin(BaseModelAdmin):
+    "Encapsulates all admin options and functionality for a given model."
+    __metaclass__ = forms.MediaDefiningClass
+
+    list_display = ('__str__',)
+    list_display_links = ()
+    list_filter = ()
+    list_select_related = False
+    list_per_page = 100
+    search_fields = ()
+    date_hierarchy = None
+    save_as = False
+    save_on_top = False
+    ordering = None
+    inlines = []
+
+    # Custom templates (designed to be over-ridden in subclasses)
+    change_form_template = None
+    change_list_template = None
+    delete_confirmation_template = None
+    object_history_template = None
+
+    def __init__(self, model, admin_site):
+        self.model = model
+        self.opts = model._meta
+        self.admin_site = admin_site
+        self.inline_instances = []
+        for inline_class in self.inlines:
+            inline_instance = inline_class(self.model, self.admin_site)
+            self.inline_instances.append(inline_instance)
+        super(ModelAdmin, self).__init__()
+
+    def __call__(self, request, url):
+        # Delegate to the appropriate method, based on the URL.
+        if url is None:
+            return self.changelist_view(request)
+        elif url.endswith('add'):
+            return self.add_view(request)
+        elif url.endswith('history'):
+            return self.history_view(request, unquote(url[:-8]))
+        elif url.endswith('delete'):
+            return self.delete_view(request, unquote(url[:-7]))
+        else:
+            return self.change_view(request, unquote(url))
+
+    def _media(self):
+        from django.conf import settings
+
+        js = ['js/core.js', 'js/admin/RelatedObjectLookups.js']
+        if self.prepopulated_fields:
+            js.append('js/urlify.js')
+        if self.opts.get_ordered_objects():
+            js.extend(['js/getElementsBySelector.js', 'js/dom-drag.js' , 'js/admin/ordering.js'])
+        if self.filter_vertical or self.filter_horizontal:
+            js.extend(['js/SelectBox.js' , 'js/SelectFilter2.js'])
+
+        return forms.Media(js=['%s%s' % (settings.ADMIN_MEDIA_PREFIX, url) for url in js])
+    media = property(_media)
+
+    def has_add_permission(self, request):
+        "Returns True if the given request has permission to add an object."
+        opts = self.opts
+        return request.user.has_perm(opts.app_label + '.' + opts.get_add_permission())
+
+    def has_change_permission(self, request, obj=None):
+        """
+        Returns True if the given request has permission to change the given
+        Django model instance.
+
+        If `obj` is None, this should return True if the given request has
+        permission to change *any* object of the given type.
+        """
+        opts = self.opts
+        return request.user.has_perm(opts.app_label + '.' + opts.get_change_permission())
+
+    def has_delete_permission(self, request, obj=None):
+        """
+        Returns True if the given request has permission to change the given
+        Django model instance.
+
+        If `obj` is None, this should return True if the given request has
+        permission to delete *any* object of the given type.
+        """
+        opts = self.opts
+        return request.user.has_perm(opts.app_label + '.' + opts.get_delete_permission())
+
+    def queryset(self, request):
+        """
+        Returns a QuerySet of all model instances that can be edited by the
+        admin site. This is used by changelist_view.
+        """
+        qs = self.model._default_manager.get_query_set()
+        # TODO: this should be handled by some parameter to the ChangeList.
+        ordering = self.ordering or () # otherwise we might try to *None, which is bad ;)
+        if ordering:
+            qs = qs.order_by(*ordering)
+        return qs
+
+    def get_fieldsets(self, request, obj=None):
+        "Hook for specifying fieldsets for the add form."
+        if self.declared_fieldsets:
+            return self.declared_fieldsets
+        form = self.get_form(request, obj)
+        return [(None, {'fields': form.base_fields.keys()})]
+
+    def get_form(self, request, obj=None, **kwargs):
+        """
+        Returns a Form class for use in the admin add view. This is used by
+        add_view and change_view.
+        """
+        if self.declared_fieldsets:
+            fields = flatten_fieldsets(self.declared_fieldsets)
+        else:
+            fields = None
+        defaults = {
+            "form": self.form,
+            "fields": fields,
+            "formfield_callback": self.formfield_for_dbfield,
+        }
+        defaults.update(kwargs)
+        return modelform_factory(self.model, **defaults)
+
+    def get_formsets(self, request, obj=None):
+        for inline in self.inline_instances:
+            yield inline.get_formset(request, obj)
+            
+    def log_addition(self, request, object):
+        """
+        Log that an object has been successfully added. 
+        
+        The default implementation creates an admin LogEntry object.
+        """
+        from django.contrib.admin.models import LogEntry, ADDITION
+        LogEntry.objects.log_action(
+            user_id         = request.user.pk, 
+            content_type_id = ContentType.objects.get_for_model(object).pk,
+            object_id       = object.pk,
+            object_repr     = force_unicode(object), 
+            action_flag     = ADDITION
+        )
+        
+    def log_change(self, request, object, message):
+        """
+        Log that an object has been successfully changed. 
+        
+        The default implementation creates an admin LogEntry object.
+        """
+        from django.contrib.admin.models import LogEntry, CHANGE
+        LogEntry.objects.log_action(
+            user_id         = request.user.pk, 
+            content_type_id = ContentType.objects.get_for_model(object).pk, 
+            object_id       = object.pk, 
+            object_repr     = force_unicode(object), 
+            action_flag     = CHANGE, 
+            change_message  = message
+        )
+        
+    def log_deletion(self, request, object, object_repr):
+        """
+        Log that an object has been successfully deleted. Note that since the
+        object is deleted, it might no longer be safe to call *any* methods
+        on the object, hence this method getting object_repr.
+        
+        The default implementation creates an admin LogEntry object.
+        """
+        from django.contrib.admin.models import LogEntry, DELETION
+        LogEntry.objects.log_action(
+            user_id         = request.user.id, 
+            content_type_id = ContentType.objects.get_for_model(self.model).pk, 
+            object_id       = object.pk, 
+            object_repr     = object_repr,
+            action_flag     = DELETION
+        )
+        
+    
+    def construct_change_message(self, request, form, formsets):
+        """
+        Construct a change message from a changed object.
+        """
+        change_message = []
+        if form.changed_data:
+            change_message.append(_('Changed %s.') % get_text_list(form.changed_data, _('and')))
+
+        if formsets:
+            for formset in formsets:
+                for added_object in formset.new_objects:
+                    change_message.append(_('Added %(name)s "%(object)s".')
+                                          % {'name': added_object._meta.verbose_name,
+                                             'object': added_object})
+                for changed_object, changed_fields in formset.changed_objects:
+                    change_message.append(_('Changed %(list)s for %(name)s "%(object)s".')
+                                          % {'list': get_text_list(changed_fields, _('and')),
+                                             'name': changed_object._meta.verbose_name,
+                                             'object': changed_object})
+                for deleted_object in formset.deleted_objects:
+                    change_message.append(_('Deleted %(name)s "%(object)s".')
+                                          % {'name': deleted_object._meta.verbose_name,
+                                             'object': deleted_object})
+        change_message = ' '.join(change_message)
+        return change_message or _('No fields changed.')
+    
+    def message_user(self, request, message):
+        """
+        Send a message to the user. The default implementation 
+        posts a message using the auth Message object.
+        """
+        request.user.message_set.create(message=message)
+
+    def save_form(self, request, form, change):
+        """
+        Given a ModelForm return an unsaved instance. ``change`` is True if
+        the object is being changed, and False if it's being added.
+        """
+        return form.save(commit=False)
+    
+    def save_model(self, request, obj, form, change):
+        """
+        Given a model instance save it to the database.
+        """
+        obj.save()
+
+    def save_formset(self, request, form, formset, change):
+        """
+        Given an inline formset save it to the database.
+        """
+        formset.save()
+
+    def render_change_form(self, request, context, add=False, change=False, form_url='', obj=None):
+        opts = self.model._meta
+        app_label = opts.app_label
+        ordered_objects = opts.get_ordered_objects()
+        context.update({
+            'add': add,
+            'change': change,
+            'has_add_permission': self.has_add_permission(request),
+            'has_change_permission': self.has_change_permission(request, obj),
+            'has_delete_permission': self.has_delete_permission(request, obj),
+            'has_file_field': True, # FIXME - this should check if form or formsets have a FileField,
+            'has_absolute_url': hasattr(self.model, 'get_absolute_url'),
+            'ordered_objects': ordered_objects,
+            'form_url': mark_safe(form_url),
+            'opts': opts,
+            'content_type_id': ContentType.objects.get_for_model(self.model).id,
+            'save_as': self.save_as,
+            'save_on_top': self.save_on_top,
+            'root_path': self.admin_site.root_path,
+        })
+        return render_to_response(self.change_form_template or [
+            "admin/%s/%s/change_form.html" % (app_label, opts.object_name.lower()),
+            "admin/%s/change_form.html" % app_label,
+            "admin/change_form.html"
+        ], context, context_instance=template.RequestContext(request))
+    
+    def response_add(self, request, obj, post_url_continue='../%s/'):
+        """
+        Determines the HttpResponse for the add_view stage.
+        """
+        opts = obj._meta
+        pk_value = obj._get_pk_val()
+        
+        msg = _('The %(name)s "%(obj)s" was added successfully.') % {'name': force_unicode(opts.verbose_name), 'obj': force_unicode(obj)}
+        # Here, we distinguish between different save types by checking for
+        # the presence of keys in request.POST.
+        if request.POST.has_key("_continue"):
+            self.message_user(request, msg + ' ' + _("You may edit it again below."))
+            if request.POST.has_key("_popup"):
+                post_url_continue += "?_popup=1"
+            return HttpResponseRedirect(post_url_continue % pk_value)
+        
+        if request.POST.has_key("_popup"):
+            return HttpResponse('<script type="text/javascript">opener.dismissAddAnotherPopup(window, "%s", "%s");</script>' % \
+                # escape() calls force_unicode.
+                (escape(pk_value), escape(obj)))
+        elif request.POST.has_key("_addanother"):
+            self.message_user(request, msg + ' ' + (_("You may add another %s below.") % force_unicode(opts.verbose_name)))
+            return HttpResponseRedirect(request.path)
+        else:
+            self.message_user(request, msg)
+
+            # Figure out where to redirect. If the user has change permission,
+            # redirect to the change-list page for this object. Otherwise,
+            # redirect to the admin index.
+            if self.has_change_permission(request, None):
+                post_url = '../'
+            else:
+                post_url = '../../../'
+            return HttpResponseRedirect(post_url)
+    
+    def response_change(self, request, obj):
+        """
+        Determines the HttpResponse for the change_view stage.
+        """
+        opts = obj._meta
+        pk_value = obj._get_pk_val()
+        
+        msg = _('The %(name)s "%(obj)s" was changed successfully.') % {'name': force_unicode(opts.verbose_name), 'obj': force_unicode(obj)}
+        if request.POST.has_key("_continue"):
+            self.message_user(request, msg + ' ' + _("You may edit it again below."))
+            if request.REQUEST.has_key('_popup'):
+                return HttpResponseRedirect(request.path + "?_popup=1")
+            else:
+                return HttpResponseRedirect(request.path)
+        elif request.POST.has_key("_saveasnew"):
+            msg = _('The %(name)s "%(obj)s" was added successfully. You may edit it again below.') % {'name': force_unicode(opts.verbose_name), 'obj': obj}
+            self.message_user(request, msg)
+            return HttpResponseRedirect("../%s/" % pk_value)
+        elif request.POST.has_key("_addanother"):
+            self.message_user(request, msg + ' ' + (_("You may add another %s below.") % force_unicode(opts.verbose_name)))
+            return HttpResponseRedirect("../add/")
+        else:
+            self.message_user(request, msg)
+            return HttpResponseRedirect("../")
+
+    def add_view(self, request, form_url='', extra_context=None):
+        "The 'add' admin view for this model."
+        model = self.model
+        opts = model._meta
+        app_label = opts.app_label
+
+        if not self.has_add_permission(request):
+            raise PermissionDenied
+
+        if self.has_change_permission(request, None):
+            # redirect to list view
+            post_url = '../'
+        else:
+            # Object list will give 'Permission Denied', so go back to admin home
+            post_url = '../../../'
+
+        ModelForm = self.get_form(request)
+        formsets = []
+        if request.method == 'POST':
+            form = ModelForm(request.POST, request.FILES)
+            if form.is_valid():
+                form_validated = True
+                new_object = self.save_form(request, form, change=False)
+            else:
+                form_validated = False
+                new_object = self.model()
+            for FormSet in self.get_formsets(request):
+                formset = FormSet(data=request.POST, files=request.FILES,
+                                  instance=new_object,
+                                  save_as_new=request.POST.has_key("_saveasnew"))
+                formsets.append(formset)
+            if all_valid(formsets) and form_validated:
+                self.save_model(request, new_object, form, change=False)
+                form.save_m2m()
+                for formset in formsets:
+                    self.save_formset(request, form, formset, change=False)
+                
+                self.log_addition(request, new_object)
+                return self.response_add(request, new_object)
+        else:
+            form = ModelForm(initial=dict(request.GET.items()))
+            for FormSet in self.get_formsets(request):
+                formset = FormSet(instance=self.model())
+                formsets.append(formset)
+
+        adminForm = helpers.AdminForm(form, list(self.get_fieldsets(request)), self.prepopulated_fields)
+        media = self.media + adminForm.media
+
+        inline_admin_formsets = []
+        for inline, formset in zip(self.inline_instances, formsets):
+            fieldsets = list(inline.get_fieldsets(request))
+            inline_admin_formset = helpers.InlineAdminFormSet(inline, formset, fieldsets)
+            inline_admin_formsets.append(inline_admin_formset)
+            media = media + inline_admin_formset.media
+
+        context = {
+            'title': _('Add %s') % force_unicode(opts.verbose_name),
+            'adminform': adminForm,
+            'is_popup': request.REQUEST.has_key('_popup'),
+            'show_delete': False,
+            'media': mark_safe(media),
+            'inline_admin_formsets': inline_admin_formsets,
+            'errors': helpers.AdminErrorList(form, formsets),
+            'root_path': self.admin_site.root_path,
+            'app_label': app_label,
+        }
+        context.update(extra_context or {})
+        return self.render_change_form(request, context, add=True)
+    add_view = transaction.commit_on_success(add_view)
+
+    def change_view(self, request, object_id, extra_context=None):
+        "The 'change' admin view for this model."
+        model = self.model
+        opts = model._meta
+        app_label = opts.app_label
+
+        try:
+            obj = model._default_manager.get(pk=object_id)
+        except model.DoesNotExist:
+            # Don't raise Http404 just yet, because we haven't checked
+            # permissions yet. We don't want an unauthenticated user to be able
+            # to determine whether a given object exists.
+            obj = None
+
+        if not self.has_change_permission(request, obj):
+            raise PermissionDenied
+
+        if obj is None:
+            raise Http404('%s object with primary key %r does not exist.' % (force_unicode(opts.verbose_name), escape(object_id)))
+
+        if request.POST and request.POST.has_key("_saveasnew"):
+            return self.add_view(request, form_url='../../add/')
+
+        ModelForm = self.get_form(request, obj)
+        formsets = []
+        if request.method == 'POST':
+            form = ModelForm(request.POST, request.FILES, instance=obj)
+            if form.is_valid():
+                form_validated = True
+                new_object = self.save_form(request, form, change=True)
+            else:
+                form_validated = False
+                new_object = obj
+            for FormSet in self.get_formsets(request, new_object):
+                formset = FormSet(request.POST, request.FILES,
+                                  instance=new_object)
+                formsets.append(formset)
+
+            if all_valid(formsets) and form_validated:
+                self.save_model(request, new_object, form, change=True)
+                form.save_m2m()
+                for formset in formsets:
+                    self.save_formset(request, form, formset, change=True)
+                
+                change_message = self.construct_change_message(request, form, formsets)
+                self.log_change(request, new_object, change_message)
+                return self.response_change(request, new_object)
+        else:
+            form = ModelForm(instance=obj)
+            for FormSet in self.get_formsets(request, obj):
+                formset = FormSet(instance=obj)
+                formsets.append(formset)
+
+        adminForm = helpers.AdminForm(form, self.get_fieldsets(request, obj), self.prepopulated_fields)
+        media = self.media + adminForm.media
+
+        inline_admin_formsets = []
+        for inline, formset in zip(self.inline_instances, formsets):
+            fieldsets = list(inline.get_fieldsets(request, obj))
+            inline_admin_formset = helpers.InlineAdminFormSet(inline, formset, fieldsets)
+            inline_admin_formsets.append(inline_admin_formset)
+            media = media + inline_admin_formset.media
+
+        context = {
+            'title': _('Change %s') % force_unicode(opts.verbose_name),
+            'adminform': adminForm,
+            'object_id': object_id,
+            'original': obj,
+            'is_popup': request.REQUEST.has_key('_popup'),
+            'media': mark_safe(media),
+            'inline_admin_formsets': inline_admin_formsets,
+            'errors': helpers.AdminErrorList(form, formsets),
+            'root_path': self.admin_site.root_path,
+            'app_label': app_label,
+        }
+        context.update(extra_context or {})
+        return self.render_change_form(request, context, change=True, obj=obj)
+    change_view = transaction.commit_on_success(change_view)
+
+    def changelist_view(self, request, extra_context=None):
+        "The 'change list' admin view for this model."
+        from django.contrib.admin.views.main import ChangeList, ERROR_FLAG
+        opts = self.model._meta
+        app_label = opts.app_label
+        if not self.has_change_permission(request, None):
+            raise PermissionDenied
+        try:
+            cl = ChangeList(request, self.model, self.list_display, self.list_display_links, self.list_filter,
+                self.date_hierarchy, self.search_fields, self.list_select_related, self.list_per_page, self)
+        except IncorrectLookupParameters:
+            # Wacky lookup parameters were given, so redirect to the main
+            # changelist page, without parameters, and pass an 'invalid=1'
+            # parameter via the query string. If wacky parameters were given and
+            # the 'invalid=1' parameter was already in the query string, something
+            # is screwed up with the database, so display an error page.
+            if ERROR_FLAG in request.GET.keys():
+                return render_to_response('admin/invalid_setup.html', {'title': _('Database error')})
+            return HttpResponseRedirect(request.path + '?' + ERROR_FLAG + '=1')
+
+        context = {
+            'title': cl.title,
+            'is_popup': cl.is_popup,
+            'cl': cl,
+            'has_add_permission': self.has_add_permission(request),
+            'root_path': self.admin_site.root_path,
+            'app_label': app_label,
+        }
+        context.update(extra_context or {})
+        return render_to_response(self.change_list_template or [
+            'admin/%s/%s/change_list.html' % (app_label, opts.object_name.lower()),
+            'admin/%s/change_list.html' % app_label,
+            'admin/change_list.html'
+        ], context, context_instance=template.RequestContext(request))
+
+    def delete_view(self, request, object_id, extra_context=None):
+        "The 'delete' admin view for this model."
+        opts = self.model._meta
+        app_label = opts.app_label
+
+        try:
+            obj = self.model._default_manager.get(pk=object_id)
+        except self.model.DoesNotExist:
+            # Don't raise Http404 just yet, because we haven't checked
+            # permissions yet. We don't want an unauthenticated user to be able
+            # to determine whether a given object exists.
+            obj = None
+
+        if not self.has_delete_permission(request, obj):
+            raise PermissionDenied
+
+        if obj is None:
+            raise Http404('%s object with primary key %r does not exist.' % (force_unicode(opts.verbose_name), escape(object_id)))
+
+        # Populate deleted_objects, a data structure of all related objects that
+        # will also be deleted.
+        deleted_objects = [mark_safe(u'%s: <a href="../../%s/">%s</a>' % (escape(force_unicode(capfirst(opts.verbose_name))), quote(object_id), escape(obj))), []]
+        perms_needed = set()
+        get_deleted_objects(deleted_objects, perms_needed, request.user, obj, opts, 1, self.admin_site)
+
+        if request.POST: # The user has already confirmed the deletion.
+            if perms_needed:
+                raise PermissionDenied
+            obj_display = str(obj)
+            obj.delete()
+            
+            self.log_deletion(request, obj, obj_display)
+            self.message_user(request, _('The %(name)s "%(obj)s" was deleted successfully.') % {'name': force_unicode(opts.verbose_name), 'obj': force_unicode(obj_display)})
+            
+            if not self.has_change_permission(request, None):
+                return HttpResponseRedirect("../../../../")
+            return HttpResponseRedirect("../../")
+
+        context = {
+            "title": _("Are you sure?"),
+            "object_name": force_unicode(opts.verbose_name),
+            "object": obj,
+            "deleted_objects": deleted_objects,
+            "perms_lacking": perms_needed,
+            "opts": opts,
+            "root_path": self.admin_site.root_path,
+            "app_label": app_label,
+        }
+        context.update(extra_context or {})
+        return render_to_response(self.delete_confirmation_template or [
+            "admin/%s/%s/delete_confirmation.html" % (app_label, opts.object_name.lower()),
+            "admin/%s/delete_confirmation.html" % app_label,
+            "admin/delete_confirmation.html"
+        ], context, context_instance=template.RequestContext(request))
+
+    def history_view(self, request, object_id, extra_context=None):
+        "The 'history' admin view for this model."
+        from django.contrib.admin.models import LogEntry
+        model = self.model
+        opts = model._meta
+        action_list = LogEntry.objects.filter(
+            object_id = object_id,
+            content_type__id__exact = ContentType.objects.get_for_model(model).id
+        ).select_related().order_by('action_time')
+        # If no history was found, see whether this object even exists.
+        obj = get_object_or_404(model, pk=object_id)
+        context = {
+            'title': _('Change history: %s') % force_unicode(obj),
+            'action_list': action_list,
+            'module_name': capfirst(force_unicode(opts.verbose_name_plural)),
+            'object': obj,
+            'root_path': self.admin_site.root_path,
+        }
+        context.update(extra_context or {})
+        return render_to_response(self.object_history_template or [
+            "admin/%s/%s/object_history.html" % (opts.app_label, opts.object_name.lower()),
+            "admin/%s/object_history.html" % opts.app_label,
+            "admin/object_history.html"
+        ], context, context_instance=template.RequestContext(request))
+
+class InlineModelAdmin(BaseModelAdmin):
+    """
+    Options for inline editing of ``model`` instances.
+
+    Provide ``name`` to specify the attribute name of the ``ForeignKey`` from
+    ``model`` to its parent. This is required if ``model`` has more than one
+    ``ForeignKey`` to its parent.
+    """
+    model = None
+    fk_name = None
+    formset = BaseInlineFormSet
+    extra = 3
+    max_num = 0
+    template = None
+    verbose_name = None
+    verbose_name_plural = None
+
+    def __init__(self, parent_model, admin_site):
+        self.admin_site = admin_site
+        self.parent_model = parent_model
+        self.opts = self.model._meta
+        super(InlineModelAdmin, self).__init__()
+        if self.verbose_name is None:
+            self.verbose_name = self.model._meta.verbose_name
+        if self.verbose_name_plural is None:
+            self.verbose_name_plural = self.model._meta.verbose_name_plural
+    
+    def _media(self):
+        from django.conf import settings
+        js = []
+        if self.prepopulated_fields:
+            js.append('js/urlify.js')
+        if self.filter_vertical or self.filter_horizontal:
+            js.extend(['js/SelectBox.js' , 'js/SelectFilter2.js'])
+        return forms.Media(js=['%s%s' % (settings.ADMIN_MEDIA_PREFIX, url) for url in js])
+    media = property(_media)
+
+    def get_formset(self, request, obj=None, **kwargs):
+        """Returns a BaseInlineFormSet class for use in admin add/change views."""
+        if self.declared_fieldsets:
+            fields = flatten_fieldsets(self.declared_fieldsets)
+        else:
+            fields = None
+        defaults = {
+            "form": self.form,
+            "formset": self.formset,
+            "fk_name": self.fk_name,
+            "fields": fields,
+            "formfield_callback": self.formfield_for_dbfield,
+            "extra": self.extra,
+            "max_num": self.max_num,
+        }
+        defaults.update(kwargs)
+        return inlineformset_factory(self.parent_model, self.model, **defaults)
+
+    def get_fieldsets(self, request, obj=None):
+        if self.declared_fieldsets:
+            return self.declared_fieldsets
+        form = self.get_formset(request).form
+        return [(None, {'fields': form.base_fields.keys()})]
+
+class StackedInline(InlineModelAdmin):
+    template = 'admin/edit_inline/stacked.html'
+
+class TabularInline(InlineModelAdmin):
+    template = 'admin/edit_inline/tabular.html'
diff --git a/webapp/django/contrib/admin/sites.py b/webapp/django/contrib/admin/sites.py
new file mode 100644
index 0000000..25ce375
--- /dev/null
+++ b/webapp/django/contrib/admin/sites.py
@@ -0,0 +1,413 @@
+import base64
+import cPickle as pickle
+import re
+
+from django import http, template
+from django.contrib.admin import ModelAdmin
+from django.contrib.auth import authenticate, login
+from django.db.models.base import ModelBase
+from django.core.exceptions import ImproperlyConfigured
+from django.shortcuts import render_to_response
+from django.utils.safestring import mark_safe
+from django.utils.text import capfirst
+from django.utils.translation import ugettext_lazy, ugettext as _
+from django.views.decorators.cache import never_cache
+from django.conf import settings
+from django.utils.hashcompat import md5_constructor
+
+ERROR_MESSAGE = ugettext_lazy("Please enter a correct username and password. Note that both fields are case-sensitive.")
+LOGIN_FORM_KEY = 'this_is_the_login_form'
+
+class AlreadyRegistered(Exception):
+    pass
+
+class NotRegistered(Exception):
+    pass
+
+def _encode_post_data(post_data):
+    pickled = pickle.dumps(post_data)
+    pickled_md5 = md5_constructor(pickled + settings.SECRET_KEY).hexdigest()
+    return base64.encodestring(pickled + pickled_md5)
+
+def _decode_post_data(encoded_data):
+    encoded_data = base64.decodestring(encoded_data)
+    pickled, tamper_check = encoded_data[:-32], encoded_data[-32:]
+    if md5_constructor(pickled + settings.SECRET_KEY).hexdigest() != tamper_check:
+        from django.core.exceptions import SuspiciousOperation
+        raise SuspiciousOperation, "User may have tampered with session cookie."
+    return pickle.loads(pickled)
+
+class AdminSite(object):
+    """
+    An AdminSite object encapsulates an instance of the Django admin application, ready
+    to be hooked in to your URLConf. Models are registered with the AdminSite using the
+    register() method, and the root() method can then be used as a Django view function
+    that presents a full admin interface for the collection of registered models.
+    """
+
+    index_template = None
+    login_template = None
+    app_index_template = None
+
+    def __init__(self):
+        self._registry = {} # model_class class -> admin_class instance
+
+    def register(self, model_or_iterable, admin_class=None, **options):
+        """
+        Registers the given model(s) with the given admin class.
+
+        The model(s) should be Model classes, not instances.
+
+        If an admin class isn't given, it will use ModelAdmin (the default
+        admin options). If keyword arguments are given -- e.g., list_display --
+        they'll be applied as options to the admin class.
+
+        If a model is already registered, this will raise AlreadyRegistered.
+        """
+        # Don't import the humongous validation code unless required
+        if admin_class and settings.DEBUG:
+            from django.contrib.admin.validation import validate
+        else:
+            validate = lambda model, adminclass: None
+
+        if not admin_class:
+            admin_class = ModelAdmin
+        if isinstance(model_or_iterable, ModelBase):
+            model_or_iterable = [model_or_iterable]
+        for model in model_or_iterable:
+            if model in self._registry:
+                raise AlreadyRegistered('The model %s is already registered' % model.__name__)
+
+            # If we got **options then dynamically construct a subclass of
+            # admin_class with those **options.
+            if options:
+                # For reasons I don't quite understand, without a __module__
+                # the created class appears to "live" in the wrong place,
+                # which causes issues later on.
+                options['__module__'] = __name__
+                admin_class = type("%sAdmin" % model.__name__, (admin_class,), options)
+
+            # Validate (which might be a no-op)
+            validate(admin_class, model)
+
+            # Instantiate the admin class to save in the registry
+            self._registry[model] = admin_class(model, self)
+
+    def unregister(self, model_or_iterable):
+        """
+        Unregisters the given model(s).
+
+        If a model isn't already registered, this will raise NotRegistered.
+        """
+        if isinstance(model_or_iterable, ModelBase):
+            model_or_iterable = [model_or_iterable]
+        for model in model_or_iterable:
+            if model not in self._registry:
+                raise NotRegistered('The model %s is not registered' % model.__name__)
+            del self._registry[model]
+
+    def has_permission(self, request):
+        """
+        Returns True if the given HttpRequest has permission to view
+        *at least one* page in the admin site.
+        """
+        return request.user.is_authenticated() and request.user.is_staff
+    
+    def check_dependencies(self):
+        """
+        Check that all things needed to run the admin have been correctly installed.
+
+        The default implementation checks that LogEntry, ContentType and the
+        auth context processor are installed.
+        """
+        from django.conf import settings
+        from django.contrib.admin.models import LogEntry
+        from django.contrib.contenttypes.models import ContentType
+
+        if not LogEntry._meta.installed:
+            raise ImproperlyConfigured("Put 'django.contrib.admin' in your INSTALLED_APPS setting in order to use the admin application.")
+        if not ContentType._meta.installed:
+            raise ImproperlyConfigured("Put 'django.contrib.contenttypes' in your INSTALLED_APPS setting in order to use the admin application.")
+        if 'django.core.context_processors.auth' not in settings.TEMPLATE_CONTEXT_PROCESSORS:
+            raise ImproperlyConfigured("Put 'django.core.context_processors.auth' in your TEMPLATE_CONTEXT_PROCESSORS setting in order to use the admin application.")
+
+    def root(self, request, url):
+        """
+        Handles main URL routing for the admin app.
+
+        `url` is the remainder of the URL -- e.g. 'comments/comment/'.
+        """
+        if request.method == 'GET' and not request.path.endswith('/'):
+            return http.HttpResponseRedirect(request.path + '/')
+        
+        if settings.DEBUG:
+            self.check_dependencies()
+
+        # Figure out the admin base URL path and stash it for later use
+        self.root_path = re.sub(re.escape(url) + '$', '', request.path)
+
+        url = url.rstrip('/') # Trim trailing slash, if it exists.
+
+        # The 'logout' view doesn't require that the person is logged in.
+        if url == 'logout':
+            return self.logout(request)
+
+        # Check permission to continue or display login form.
+        if not self.has_permission(request):
+            return self.login(request)
+
+        if url == '':
+            return self.index(request)
+        elif url == 'password_change':
+            return self.password_change(request)
+        elif url == 'password_change/done':
+            return self.password_change_done(request)
+        elif url == 'jsi18n':
+            return self.i18n_javascript(request)
+        # urls starting with 'r/' are for the "show in web" links
+        elif url.startswith('r/'):
+            from django.views.defaults import shortcut
+            return shortcut(request, *url.split('/')[1:])
+        else:
+            if '/' in url:
+                return self.model_page(request, *url.split('/', 2))
+            else:
+                return self.app_index(request, url)
+
+        raise http.Http404('The requested admin page does not exist.')
+
+    def model_page(self, request, app_label, model_name, rest_of_url=None):
+        """
+        Handles the model-specific functionality of the admin site, delegating
+        to the appropriate ModelAdmin class.
+        """
+        from django.db import models
+        model = models.get_model(app_label, model_name)
+        if model is None:
+            raise http.Http404("App %r, model %r, not found." % (app_label, model_name))
+        try:
+            admin_obj = self._registry[model]
+        except KeyError:
+            raise http.Http404("This model exists but has not been registered with the admin site.")
+        return admin_obj(request, rest_of_url)
+    model_page = never_cache(model_page)
+
+    def password_change(self, request):
+        """
+        Handles the "change password" task -- both form display and validation.
+        """
+        from django.contrib.auth.views import password_change
+        return password_change(request,
+            post_change_redirect='%spassword_change/done/' % self.root_path)
+
+    def password_change_done(self, request):
+        """
+        Displays the "success" page after a password change.
+        """
+        from django.contrib.auth.views import password_change_done
+        return password_change_done(request)
+
+    def i18n_javascript(self, request):
+        """
+        Displays the i18n JavaScript that the Django admin requires.
+
+        This takes into account the USE_I18N setting. If it's set to False, the
+        generated JavaScript will be leaner and faster.
+        """
+        if settings.USE_I18N:
+            from django.views.i18n import javascript_catalog
+        else:
+            from django.views.i18n import null_javascript_catalog as javascript_catalog
+        return javascript_catalog(request, packages='django.conf')
+
+    def logout(self, request):
+        """
+        Logs out the user for the given HttpRequest.
+
+        This should *not* assume the user is already logged in.
+        """
+        from django.contrib.auth.views import logout
+        return logout(request)
+    logout = never_cache(logout)
+
+    def login(self, request):
+        """
+        Displays the login form for the given HttpRequest.
+        """
+        from django.contrib.auth.models import User
+
+        # If this isn't already the login page, display it.
+        if not request.POST.has_key(LOGIN_FORM_KEY):
+            if request.POST:
+                message = _("Please log in again, because your session has expired. Don't worry: Your submission has been saved.")
+            else:
+                message = ""
+            return self.display_login_form(request, message)
+
+        # Check that the user accepts cookies.
+        if not request.session.test_cookie_worked():
+            message = _("Looks like your browser isn't configured to accept cookies. Please enable cookies, reload this page, and try again.")
+            return self.display_login_form(request, message)
+        else:
+            request.session.delete_test_cookie()
+
+        # Check the password.
+        username = request.POST.get('username', None)
+        password = request.POST.get('password', None)
+        user = authenticate(username=username, password=password)
+        if user is None:
+            message = ERROR_MESSAGE
+            if u'@' in username:
+                # Mistakenly entered e-mail address instead of username? Look it up.
+                try:
+                    user = User.objects.get(email=username)
+                except (User.DoesNotExist, User.MultipleObjectsReturned):
+                    message = _("Usernames cannot contain the '@' character.")
+                else:
+                    if user.check_password(password):
+                        message = _("Your e-mail address is not your username."
+                                    " Try '%s' instead.") % user.username
+                    else:
+                        message = _("Usernames cannot contain the '@' character.")
+            return self.display_login_form(request, message)
+
+        # The user data is correct; log in the user in and continue.
+        else:
+            if user.is_active and user.is_staff:
+                login(request, user)
+                if request.POST.has_key('post_data'):
+                    post_data = _decode_post_data(request.POST['post_data'])
+                    if post_data and not post_data.has_key(LOGIN_FORM_KEY):
+                        # overwrite request.POST with the saved post_data, and continue
+                        request.POST = post_data
+                        request.user = user
+                        return self.root(request, request.path.split(self.root_path)[-1])
+                    else:
+                        return http.HttpResponseRedirect(request.get_full_path())
+            else:
+                return self.display_login_form(request, ERROR_MESSAGE)
+    login = never_cache(login)
+
+    def index(self, request, extra_context=None):
+        """
+        Displays the main admin index page, which lists all of the installed
+        apps that have been registered in this site.
+        """
+        app_dict = {}
+        user = request.user
+        for model, model_admin in self._registry.items():
+            app_label = model._meta.app_label
+            has_module_perms = user.has_module_perms(app_label)
+
+            if has_module_perms:
+                perms = {
+                    'add': model_admin.has_add_permission(request),
+                    'change': model_admin.has_change_permission(request),
+                    'delete': model_admin.has_delete_permission(request),
+                }
+
+                # Check whether user has any perm for this module.
+                # If so, add the module to the model_list.
+                if True in perms.values():
+                    model_dict = {
+                        'name': capfirst(model._meta.verbose_name_plural),
+                        'admin_url': mark_safe('%s/%s/' % (app_label, model.__name__.lower())),
+                        'perms': perms,
+                    }
+                    if app_label in app_dict:
+                        app_dict[app_label]['models'].append(model_dict)
+                    else:
+                        app_dict[app_label] = {
+                            'name': app_label.title(),
+                            'app_url': app_label,
+                            'has_module_perms': has_module_perms,
+                            'models': [model_dict],
+                        }
+
+        # Sort the apps alphabetically.
+        app_list = app_dict.values()
+        app_list.sort(lambda x, y: cmp(x['name'], y['name']))
+
+        # Sort the models alphabetically within each app.
+        for app in app_list:
+            app['models'].sort(lambda x, y: cmp(x['name'], y['name']))
+
+        context = {
+            'title': _('Site administration'),
+            'app_list': app_list,
+            'root_path': self.root_path,
+        }
+        context.update(extra_context or {})
+        return render_to_response(self.index_template or 'admin/index.html', context,
+            context_instance=template.RequestContext(request)
+        )
+    index = never_cache(index)
+
+    def display_login_form(self, request, error_message='', extra_context=None):
+        request.session.set_test_cookie()
+        if request.POST and request.POST.has_key('post_data'):
+            # User has failed login BUT has previously saved post data.
+            post_data = request.POST['post_data']
+        elif request.POST:
+            # User's session must have expired; save their post data.
+            post_data = _encode_post_data(request.POST)
+        else:
+            post_data = _encode_post_data({})
+
+        context = {
+            'title': _('Log in'),
+            'app_path': request.get_full_path(),
+            'post_data': post_data,
+            'error_message': error_message,
+            'root_path': self.root_path,
+        }
+        context.update(extra_context or {})
+        return render_to_response(self.login_template or 'admin/login.html', context,
+            context_instance=template.RequestContext(request)
+        )
+        
+    def app_index(self, request, app_label, extra_context=None):
+        user = request.user
+        has_module_perms = user.has_module_perms(app_label)
+        app_dict = {}
+        for model, model_admin in self._registry.items():
+            if app_label == model._meta.app_label:
+                if has_module_perms:
+                    perms = {
+                        'add': user.has_perm("%s.%s" % (app_label, model._meta.get_add_permission())),
+                        'change': user.has_perm("%s.%s" % (app_label, model._meta.get_change_permission())),
+                        'delete': user.has_perm("%s.%s" % (app_label, model._meta.get_delete_permission())),
+                    }
+                    # Check whether user has any perm for this module.
+                    # If so, add the module to the model_list.
+                    if True in perms.values():
+                        model_dict = {
+                            'name': capfirst(model._meta.verbose_name_plural),
+                            'admin_url': '%s/' % model.__name__.lower(),
+                            'perms': perms,
+                        }
+                    if app_dict:
+                        app_dict['models'].append(model_dict),
+                    else:
+                        app_dict = {
+                            'name': app_label.title(),
+                            'app_url': '',
+                            'has_module_perms': has_module_perms,
+                            'models': [model_dict],
+                        }
+                    if not app_dict:
+                        raise http.Http404('The requested admin page does not exist.')
+        # Sort the models alphabetically within each app.
+        app_dict['models'].sort(lambda x, y: cmp(x['name'], y['name']))
+        context = {
+            'title': _('%s administration' % capfirst(app_label)),
+            'app_list': [app_dict]
+        }
+        context.update(extra_context or {})
+        return render_to_response(self.app_index_template or 'admin/app_index.html', context,
+            context_instance=template.RequestContext(request)
+        )
+
+# This global object represents the default admin site, for the common case.
+# You can instantiate AdminSite in your own code to create a custom admin site.
+site = AdminSite()
diff --git a/webapp/django/contrib/admin/templates/admin/404.html b/webapp/django/contrib/admin/templates/admin/404.html
new file mode 100644
index 0000000..9bf4293
--- /dev/null
+++ b/webapp/django/contrib/admin/templates/admin/404.html
@@ -0,0 +1,12 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+
+{% block title %}{% trans 'Page not found' %}{% endblock %}
+
+{% block content %}
+
+<h2>{% trans 'Page not found' %}</h2>
+
+<p>{% trans "We're sorry, but the requested page could not be found." %}</p>
+
+{% endblock %}
diff --git a/webapp/django/contrib/admin/templates/admin/500.html b/webapp/django/contrib/admin/templates/admin/500.html
new file mode 100644
index 0000000..b30e431
--- /dev/null
+++ b/webapp/django/contrib/admin/templates/admin/500.html
@@ -0,0 +1,12 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="/">{% trans "Home" %}</a> &rsaquo; {% trans "Server error" %}</div>{% endblock %}
+
+{% block title %}{% trans 'Server error (500)' %}{% endblock %}
+
+{% block content %}
+<h1>{% trans 'Server Error <em>(500)</em>' %}</h1>
+<p>{% trans "There's been an error. It's been reported to the site administrators via e-mail and should be fixed shortly. Thanks for your patience." %}</p>
+
+{% endblock %}
diff --git a/webapp/django/contrib/admin/templates/admin/app_index.html b/webapp/django/contrib/admin/templates/admin/app_index.html
new file mode 100644
index 0000000..120433d
--- /dev/null
+++ b/webapp/django/contrib/admin/templates/admin/app_index.html
@@ -0,0 +1,15 @@
+{% extends "admin/index.html" %} 
+{% load i18n %} 
+
+{% if not is_popup %}
+
+{% block breadcrumbs %}
+<div class="breadcrumbs"><a href="../">
+{% trans "Home" %}</a> &rsaquo; 
+{% for app in app_list %}
+{% blocktrans with app.name as name %}{{ name }}{% endblocktrans %}
+{% endfor %}</div>{% endblock %}
+
+{% endif %} 
+
+{% block sidebar %}{% endblock %}
\ No newline at end of file
diff --git a/webapp/django/contrib/admin/templates/admin/auth/user/add_form.html b/webapp/django/contrib/admin/templates/admin/auth/user/add_form.html
new file mode 100644
index 0000000..65824a6
--- /dev/null
+++ b/webapp/django/contrib/admin/templates/admin/auth/user/add_form.html
@@ -0,0 +1,33 @@
+{% extends "admin/change_form.html" %}
+{% load i18n %}
+
+{% block after_field_sets %}
+
+<p>{% trans "First, enter a username and password. Then, you'll be able to edit more user options." %}</p>
+
+<fieldset class="module aligned">
+
+<div class="form-row">
+  {{ form.username.errors }}
+  {# TODO: get required class on label_tag #}
+  <label for="id_username" class="required">{% trans 'Username' %}:</label> {{ form.username }}
+  <p class="help">{{ form.username.help_text }}</p>
+</div>
+
+<div class="form-row">
+  {{ form.password1.errors }}
+  {# TODO: get required class on label_tag #}
+  <label for="id_password1" class="required">{% trans 'Password' %}:</label> {{ form.password1 }}
+</div>
+
+<div class="form-row">
+  {{ form.password2.errors }}
+  {# TODO: get required class on label_tag #}
+  <label for="id_password2" class="required">{% trans 'Password (again)' %}:</label> {{ form.password2 }}
+  <p class="help">{% trans 'Enter the same password as above, for verification.' %}</p>
+</div>
+
+<script type="text/javascript">document.getElementById("id_username").focus();</script>
+
+</fieldset>
+{% endblock %}
diff --git a/webapp/django/contrib/admin/templates/admin/auth/user/change_password.html b/webapp/django/contrib/admin/templates/admin/auth/user/change_password.html
new file mode 100644
index 0000000..f1c4a8d
--- /dev/null
+++ b/webapp/django/contrib/admin/templates/admin/auth/user/change_password.html
@@ -0,0 +1,52 @@
+{% extends "admin/base_site.html" %}
+{% load i18n admin_modify adminmedia %}
+{% block extrahead %}{{ block.super }}
+<script type="text/javascript" src="../../../../jsi18n/"></script>
+{% endblock %}
+{% block stylesheet %}{% admin_media_prefix %}css/forms.css{% endblock %}
+{% block bodyclass %}{{ opts.app_label }}-{{ opts.object_name.lower }} change-form{% endblock %}
+{% block breadcrumbs %}{% if not is_popup %}
+<div class="breadcrumbs">
+     <a href="../../../../">{% trans "Home" %}</a> &rsaquo;
+     <a href="../../">{{ opts.verbose_name_plural|capfirst|escape }}</a> &rsaquo;
+     <a href="../">{{ original|truncatewords:"18"|escape }}</a> &rsaquo;
+     {% trans 'Change password' %}
+</div>
+{% endif %}{% endblock %}
+{% block content %}<div id="content-main">
+<form action="{{ form_url }}" method="post" id="{{ opts.module_name }}_form">{% block form_top %}{% endblock %}
+<div>
+{% if is_popup %}<input type="hidden" name="_popup" value="1" />{% endif %}
+{% if form.errors %}
+    <p class="errornote">
+    {% blocktrans count form.errors.items|length as counter %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktrans %}
+    </p>
+{% endif %}
+
+<p>{% blocktrans with original.username|escape as username %}Enter a new password for the user <strong>{{ username }}</strong>.{% endblocktrans %}</p>
+
+<fieldset class="module aligned">
+
+<div class="form-row">
+  {{ form.password1.errors }}
+  {# TODO: get required class on label_tag #}
+  <label for="id_password1" class="required">{% trans 'Password' %}:</label> {{ form.password1 }}
+</div>
+
+<div class="form-row">
+  {{ form.password2.errors }}
+  {# TODO: get required class on label_tag #}
+  <label for="id_password2" class="required">{% trans 'Password (again)' %}:</label> {{ form.password2 }}
+  <p class="help">{% trans 'Enter the same password as above, for verification.' %}</p>
+</div>
+
+</fieldset>
+
+<div class="submit-row">
+<input type="submit" value="{% trans 'Change password' %}" class="default" />
+</div>
+
+<script type="text/javascript">document.getElementById("id_password1").focus();</script>
+</div>
+</form></div>
+{% endblock %}
diff --git a/webapp/django/contrib/admin/templates/admin/base.html b/webapp/django/contrib/admin/templates/admin/base.html
new file mode 100644
index 0000000..479e18b
--- /dev/null
+++ b/webapp/django/contrib/admin/templates/admin/base.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="{{ LANGUAGE_CODE }}" xml:lang="{{ LANGUAGE_CODE }}" {% if LANGUAGE_BIDI %}dir="rtl"{% endif %}>
+<head>
+<title>{% block title %}{% endblock %}</title>
+<link rel="stylesheet" type="text/css" href="{% block stylesheet %}{% load adminmedia %}{% admin_media_prefix %}css/base.css{% endblock %}" />
+{% if LANGUAGE_BIDI %}<link rel="stylesheet" type="text/css" href="{% block stylesheet_rtl %}{% admin_media_prefix %}css/rtl.css{% endblock %}" />{% endif %}
+{% block extrastyle %}{% endblock %}
+{% block extrahead %}{% endblock %}
+{% block blockbots %}<meta name="robots" content="NONE,NOARCHIVE" />{% endblock %}
+</head>
+{% load i18n %}
+
+<body class="{% if is_popup %}popup {% endif %}{% block bodyclass %}{% endblock %}">
+
+<!-- Container -->
+<div id="container">
+
+    {% if not is_popup %}
+    <!-- Header -->
+    <div id="header">
+        <div id="branding">
+        {% block branding %}{% endblock %}
+        </div>
+        {% if user.is_authenticated and user.is_staff %}
+        <div id="user-tools">{% trans 'Welcome,' %} <strong>{% if user.first_name %}{{ user.first_name|escape }}{% else %}{{ user.username }}{% endif %}</strong>. {% block userlinks %}<a href="{{ root_path }}doc/">{% trans 'Documentation' %}</a> / <a href="{{ root_path }}password_change/">{% trans 'Change password' %}</a> / <a href="{{ root_path }}logout/">{% trans 'Log out' %}</a>{% endblock %}</div>
+        {% endif %}
+        {% block nav-global %}{% endblock %}
+    </div>
+    <!-- END Header -->
+    {% block breadcrumbs %}<div class="breadcrumbs"><a href="/">{% trans 'Home' %}</a>{% if title %} &rsaquo; {{ title|escape }}{% endif %}</div>{% endblock %}
+    {% endif %}
+
+        {% if messages %}
+        <ul class="messagelist">{% for message in messages %}<li>{{ message|escape }}</li>{% endfor %}</ul>
+        {% endif %}
+
+    <!-- Content -->
+    <div id="content" class="{% block coltype %}colM{% endblock %}">
+        {% block pretitle %}{% endblock %}
+        {% block content_title %}{% if title %}<h1>{{ title|escape }}</h1>{% endif %}{% endblock %}
+        {% block content %}
+        {% block object-tools %}{% endblock %}
+        {{ content }}
+        {% endblock %}
+        {% block sidebar %}{% endblock %}
+        <br class="clear" />
+    </div>
+    <!-- END Content -->
+
+    {% block footer %}<div id="footer"></div>{% endblock %}
+</div>
+<!-- END Container -->
+
+</body>
+</html>
diff --git a/webapp/django/contrib/admin/templates/admin/base_site.html b/webapp/django/contrib/admin/templates/admin/base_site.html
new file mode 100644
index 0000000..b867bd2
--- /dev/null
+++ b/webapp/django/contrib/admin/templates/admin/base_site.html
@@ -0,0 +1,10 @@
+{% extends "admin/base.html" %}
+{% load i18n %}
+
+{% block title %}{{ title }} | {% trans 'Django site admin' %}{% endblock %}
+
+{% block branding %}
+<h1 id="site-name">{% trans 'Django administration' %}</h1>
+{% endblock %}
+
+{% block nav-global %}{% endblock %}
diff --git a/webapp/django/contrib/admin/templates/admin/change_form.html b/webapp/django/contrib/admin/templates/admin/change_form.html
new file mode 100644
index 0000000..f367973
--- /dev/null
+++ b/webapp/django/contrib/admin/templates/admin/change_form.html
@@ -0,0 +1,66 @@
+{% extends "admin/base_site.html" %}
+{% load i18n admin_modify adminmedia %}
+
+{% block extrahead %}{{ block.super }}
+<script type="text/javascript" src="../../../jsi18n/"></script>
+{{ media }}
+{% endblock %}
+
+{% block stylesheet %}{% admin_media_prefix %}css/forms.css{% endblock %}
+
+{% block coltype %}{% if ordered_objects %}colMS{% else %}colM{% endif %}{% endblock %}
+
+{% block bodyclass %}{{ opts.app_label }}-{{ opts.object_name.lower }} change-form{% endblock %}
+
+{% block breadcrumbs %}{% if not is_popup %}
+<div class="breadcrumbs">
+     <a href="../../../">{% trans "Home" %}</a> &rsaquo;
+     <a href="../../">{{ app_label|capfirst|escape }}</a> &rsaquo; 
+     <a href="../">{{ opts.verbose_name_plural|capfirst }}</a> &rsaquo;
+     {% if add %}{% trans "Add" %} {{ opts.verbose_name }}{% else %}{{ original|truncatewords:"18" }}{% endif %}
+</div>
+{% endif %}{% endblock %}
+
+{% block content %}<div id="content-main">
+{% block object-tools %}
+{% if change %}{% if not is_popup %}
+  <ul class="object-tools"><li><a href="history/" class="historylink">{% trans "History" %}</a></li>
+  {% if has_absolute_url %}<li><a href="../../../r/{{ content_type_id }}/{{ object_id }}/" class="viewsitelink">{% trans "View on site" %}</a></li>{% endif%}
+  </ul>
+{% endif %}{% endif %}
+{% endblock %}
+<form {% if has_file_field %}enctype="multipart/form-data" {% endif %}action="{{ form_url }}" method="post" id="{{ opts.module_name }}_form">{% block form_top %}{% endblock %}
+<div>
+{% if is_popup %}<input type="hidden" name="_popup" value="1" />{% endif %}
+{% if save_on_top %}{% submit_row %}{% endif %}
+{% if errors %}
+    <p class="errornote">
+    {% blocktrans count errors.items|length as counter %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktrans %}
+    </p>
+    <ul class="errorlist">{% for error in adminform.form.non_field_errors %}<li>{{ error }}</li>{% endfor %}</ul>
+{% endif %}
+
+{% for fieldset in adminform %}
+  {% include "admin/includes/fieldset.html" %}
+{% endfor %}
+
+{% block after_field_sets %}{% endblock %}
+
+{% for inline_admin_formset in inline_admin_formsets %}
+    {% include inline_admin_formset.opts.template %}
+{% endfor %}
+
+{% block after_related_objects %}{% endblock %}
+
+{% submit_row %}
+
+{% if add %}
+   <script type="text/javascript">document.getElementById("{{ adminform.first_field.auto_id }}").focus();</script>
+{% endif %}
+
+{# JavaScript for prepopulated fields #}
+{% prepopulated_fields_js %}
+
+</div>
+</form></div>
+{% endblock %}
diff --git a/webapp/django/contrib/admin/templates/admin/change_list.html b/webapp/django/contrib/admin/templates/admin/change_list.html
new file mode 100644
index 0000000..b66f67e
--- /dev/null
+++ b/webapp/django/contrib/admin/templates/admin/change_list.html
@@ -0,0 +1,38 @@
+{% extends "admin/base_site.html" %}
+{% load adminmedia admin_list i18n %}
+
+{% block stylesheet %}{% admin_media_prefix %}css/changelists.css{% endblock %}
+
+{% block bodyclass %}change-list{% endblock %}
+
+{% if not is_popup %}{% block breadcrumbs %}<div class="breadcrumbs"><a href="../../">{% trans "Home" %}</a> &rsaquo; <a href="../">{{ app_label|capfirst|escape }}</a> &rsaquo; {{ cl.opts.verbose_name_plural|capfirst|escape }}</div>{% endblock %}{% endif %}
+
+{% block coltype %}flex{% endblock %}
+
+{% block content %}
+<div id="content-main">
+{% block object-tools %}
+{% if has_add_permission %}
+<ul class="object-tools"><li><a href="add/{% if is_popup %}?_popup=1{% endif %}" class="addlink">{% blocktrans with cl.opts.verbose_name|escape as name %}Add {{ name }}{% endblocktrans %}</a></li></ul>
+{% endif %}
+{% endblock %}
+<div class="module{% if cl.has_filters %} filtered{% endif %}" id="changelist">
+{% block search %}{% search_form cl %}{% endblock %}
+{% block date_hierarchy %}{% date_hierarchy cl %}{% endblock %}
+
+{% block filters %}
+{% if cl.has_filters %}
+<div id="changelist-filter">
+<h2>{% trans 'Filter' %}</h2>
+{% for spec in cl.filter_specs %}
+   {% admin_list_filter cl spec %}
+{% endfor %}
+</div>
+{% endif %}
+{% endblock %}
+
+{% block result_list %}{% result_list cl %}{% endblock %}
+{% block pagination %}{% pagination cl %}{% endblock %}
+</div>
+</div>
+{% endblock %}
diff --git a/webapp/django/contrib/admin/templates/admin/change_list_results.html b/webapp/django/contrib/admin/templates/admin/change_list_results.html
new file mode 100644
index 0000000..381dcb5
--- /dev/null
+++ b/webapp/django/contrib/admin/templates/admin/change_list_results.html
@@ -0,0 +1,17 @@
+{% if results %}
+<table cellspacing="0">
+<thead>
+<tr>
+{% for header in result_headers %}<th{{ header.class_attrib }}>
+{% if header.sortable %}<a href="{{ header.url }}">{% endif %}
+{{ header.text|capfirst }}
+{% if header.sortable %}</a>{% endif %}</th>{% endfor %}
+</tr>
+</thead>
+<tbody>
+{% for result in results %}
+<tr class="{% cycle 'row1' 'row2' %}">{% for item in result %}{{ item }}{% endfor %}</tr>
+{% endfor %}
+</tbody>
+</table>
+{% endif %}
diff --git a/webapp/django/contrib/admin/templates/admin/date_hierarchy.html b/webapp/django/contrib/admin/templates/admin/date_hierarchy.html
new file mode 100644
index 0000000..0058510
--- /dev/null
+++ b/webapp/django/contrib/admin/templates/admin/date_hierarchy.html
@@ -0,0 +1,10 @@
+{% if show %}
+<div class="xfull">
+<ul class="toplinks">
+{% if back %}<li class="date-back"><a href="{{ back.link }}">&lsaquo; {{ back.title }}</a></li>{% endif %}
+{% for choice in choices %}
+<li> {% if choice.link %}<a href="{{ choice.link }}">{% endif %}{{ choice.title }}{% if choice.link %}</a>{% endif %}</li>
+{% endfor %}
+</ul><br class="clear" />
+</div>
+{% endif %}
diff --git a/webapp/django/contrib/admin/templates/admin/delete_confirmation.html b/webapp/django/contrib/admin/templates/admin/delete_confirmation.html
new file mode 100644
index 0000000..2a6c4b4
--- /dev/null
+++ b/webapp/django/contrib/admin/templates/admin/delete_confirmation.html
@@ -0,0 +1,32 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+
+{% block breadcrumbs %}
+<div class="breadcrumbs">
+     <a href="../../../../">{% trans "Home" %}</a> &rsaquo;
+     <a href="../../../">{{ app_label|capfirst|escape }}</a> &rsaquo; 
+     <a href="../../">{{ opts.verbose_name_plural|capfirst }}</a> &rsaquo;
+     <a href="../">{{ object|escape|truncatewords:"18" }}</a> &rsaquo;
+     {% trans 'Delete' %}
+</div>
+{% endblock %}
+
+{% block content %}
+{% if perms_lacking %}
+    <p>{% blocktrans with object|escape as escaped_object %}Deleting the {{ object_name }} '{{ escaped_object }}' would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:{% endblocktrans %}</p>
+    <ul>
+    {% for obj in perms_lacking %}
+        <li>{{ obj }}</li>
+    {% endfor %}
+    </ul>
+{% else %}
+    <p>{% blocktrans with object|escape as escaped_object %}Are you sure you want to delete the {{ object_name }} "{{ escaped_object }}"? All of the following related items will be deleted:{% endblocktrans %}</p>
+    <ul>{{ deleted_objects|unordered_list }}</ul>
+    <form action="" method="post">
+    <div>
+    <input type="hidden" name="post" value="yes" />
+    <input type="submit" value="{% trans "Yes, I'm sure" %}" />
+    </div>
+    </form>
+{% endif %}
+{% endblock %}
diff --git a/webapp/django/contrib/admin/templates/admin/edit_inline/stacked.html b/webapp/django/contrib/admin/templates/admin/edit_inline/stacked.html
new file mode 100644
index 0000000..217791f
--- /dev/null
+++ b/webapp/django/contrib/admin/templates/admin/edit_inline/stacked.html
@@ -0,0 +1,26 @@
+{% load i18n %}
+<div class="inline-group">
+  <h2>{{ inline_admin_formset.opts.verbose_name_plural|title }}</h2>
+{{ inline_admin_formset.formset.management_form }}
+{{ inline_admin_formset.formset.non_form_errors }}
+
+{% for inline_admin_form in inline_admin_formset %}
+<div class="inline-related {% if forloop.last %}last-related{% endif %}">
+  <h3><b>{{ inline_admin_formset.opts.verbose_name|title }}:</b>&nbsp;{% if inline_admin_form.original %}{{ inline_admin_form.original }}{% else %} #{{ forloop.counter }}{% endif %}
+    {% if inline_admin_formset.formset.can_delete and inline_admin_form.original %}<span class="delete">{{ inline_admin_form.deletion_field.field }} {{ inline_admin_form.deletion_field.label_tag }}</span>{% endif %}
+  </h3>
+  {% if inline_admin_form.show_url %}
+  <p><a href="/r/{{ inline_admin_form.original.content_type_id }}/{{ inline_admin_form.original.id }}/">View on site</a></p>
+  {% endif %}
+
+  {% for fieldset in inline_admin_form %}
+    {% include "admin/includes/fieldset.html" %}
+  {% endfor %}
+  {{ inline_admin_form.pk_field.field }}
+</div>
+{% endfor %}
+
+{# <ul class="tools"> #}
+{#   <li><a class="add" href="">Add another {{ inline_admin_formset.opts.verbose_name|title }}</a></li> #}
+{# </ul> #}
+</div>
diff --git a/webapp/django/contrib/admin/templates/admin/edit_inline/tabular.html b/webapp/django/contrib/admin/templates/admin/edit_inline/tabular.html
new file mode 100644
index 0000000..f3fe378
--- /dev/null
+++ b/webapp/django/contrib/admin/templates/admin/edit_inline/tabular.html
@@ -0,0 +1,67 @@
+{% load i18n %}
+<div class="inline-group">
+  <div class="tabular inline-related {% if forloop.last %}last-related{% endif %}">
+{{ inline_admin_formset.formset.management_form }}
+<fieldset class="module">
+   <h2>{{ inline_admin_formset.opts.verbose_name_plural|capfirst|escape }}</h2>
+   {{ inline_admin_formset.formset.non_form_errors }}
+   <table>
+     <thead><tr>
+     {% for field in inline_admin_formset.fields %}
+       {% if not field.is_hidden %}
+         <th {% if forloop.first %}colspan="2"{% endif %}>{{ field.label|capfirst|escape }}</th>
+        {% endif %}
+     {% endfor %}
+     {% if inline_admin_formset.formset.can_delete %}<th>{% trans "Delete" %}?</th>{% endif %}
+     </tr></thead>
+   
+     {% for inline_admin_form in inline_admin_formset %}
+                   
+        <tr class="{% cycle row1,row2 %} {% if inline_admin_form.original or inline_admin_form.show_url %}has_original{% endif %}">
+
+        <td class="original">
+          {% if inline_admin_form.original or inline_admin_form.show_url %}<p>
+          {% if inline_admin_form.original %} {{ inline_admin_form.original }}{% endif %}
+          {% if inline_admin_form.show_url %}<a href="/r/{{ inline_admin_form.original.content_type_id }}/{{ inline_admin_form.original.id }}/">View on site</a>{% endif %}
+            </p>{% endif %}
+          {{ inline_admin_form.pk_field.field }}
+          {% spaceless %}
+          {% for fieldset in inline_admin_form %}
+            {% for line in fieldset %}
+              {% for field in line %}
+                {% if field.is_hidden %} {{ field.field }} {% endif %}
+              {% endfor %}
+            {% endfor %}
+          {% endfor %}
+          {% endspaceless %}
+        </td>
+
+        {% for fieldset in inline_admin_form %}
+          {% for line in fieldset %}
+            {% for field in line %}
+              <td class="{{ field.field.name }}">
+              {{ field.field.errors.as_ul }}
+              {{ field.field }}
+              </td>
+            {% endfor %}
+          {% endfor %}
+        {% endfor %}
+                
+        {% if inline_admin_formset.formset.can_delete %}
+          <td class="delete">{% if inline_admin_form.original %}{{ inline_admin_form.deletion_field.field }}{% endif %}</td>
+        {% endif %}
+        
+        </tr>
+
+     {% endfor %}
+   
+   </table>
+   
+</fieldset>
+  </div>
+  
+  {# <ul class="tools"> #}
+  {#   <li><a class="add" href="">Add another {{ inline_admin_formset.opts.verbose_name|title }}</a></li> #}
+  {# </ul> #}
+  
+</div>
diff --git a/webapp/django/contrib/admin/templates/admin/filter.html b/webapp/django/contrib/admin/templates/admin/filter.html
new file mode 100644
index 0000000..bcc64ac
--- /dev/null
+++ b/webapp/django/contrib/admin/templates/admin/filter.html
@@ -0,0 +1,8 @@
+{% load i18n %}
+<h3>{% blocktrans with title|escape as filter_title %} By {{ filter_title }} {% endblocktrans %}</h3>
+<ul>
+{% for choice in choices %}
+    <li{% if choice.selected %} class="selected"{% endif %}>
+    <a href="{{ choice.query_string|iriencode }}">{{ choice.display|escape }}</a></li>
+{% endfor %}
+</ul>
diff --git a/webapp/django/contrib/admin/templates/admin/includes/fieldset.html b/webapp/django/contrib/admin/templates/admin/includes/fieldset.html
new file mode 100644
index 0000000..27e54c7
--- /dev/null
+++ b/webapp/django/contrib/admin/templates/admin/includes/fieldset.html
@@ -0,0 +1,17 @@
+<fieldset class="module aligned {{ fieldset.classes }}">
+  {% if fieldset.name %}<h2>{{ fieldset.name }}</h2>{% endif %}
+  {% if fieldset.description %}<div class="description">{{ fieldset.description|safe }}</div>{% endif %}
+  {% for line in fieldset %}
+      <div class="form-row{% if line.errors %} errors{% endif %} {% for field in line %}{{ field.field.name }} {% endfor %} ">
+      {{ line.errors }}
+      {% for field in line %}
+          {% if field.is_checkbox %}
+              {{ field.field }}{{ field.label_tag }}
+          {% else %}
+              {{ field.label_tag }}{{ field.field }}
+          {% endif %}
+          {% if field.field.field.help_text %}<p class="help">{{ field.field.field.help_text|safe }}</p>{% endif %}
+      {% endfor %}
+      </div>
+  {% endfor %}
+</fieldset>
diff --git a/webapp/django/contrib/admin/templates/admin/index.html b/webapp/django/contrib/admin/templates/admin/index.html
new file mode 100644
index 0000000..ba0c381
--- /dev/null
+++ b/webapp/django/contrib/admin/templates/admin/index.html
@@ -0,0 +1,68 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+
+{% block stylesheet %}{% load adminmedia %}{% admin_media_prefix %}css/dashboard.css{% endblock %}
+
+{% block coltype %}colMS{% endblock %}
+
+{% block bodyclass %}dashboard{% endblock %}
+
+{% block breadcrumbs %}{% endblock %}
+
+{% block content %}
+<div id="content-main">
+
+{% if app_list %}
+    {% for app in app_list %}
+        <div class="module">
+        <table summary="{% blocktrans with app.name as name %}Models available in the {{ name }} application.{% endblocktrans %}">
+        <caption><a href="{{ app.app_url }}" class="section">{% blocktrans with app.name as name %}{{ name }}{% endblocktrans %}</a></caption>
+        {% for model in app.models %}
+            <tr>
+            {% if model.perms.change %}
+                <th scope="row"><a href="{{ model.admin_url }}">{{ model.name }}</a></th>
+            {% else %}
+                <th scope="row">{{ model.name }}</th>
+            {% endif %}
+
+            {% if model.perms.add %}
+                <td><a href="{{ model.admin_url }}add/" class="addlink">{% trans 'Add' %}</a></td>
+            {% else %}
+                <td>&nbsp;</td>
+            {% endif %}
+
+            {% if model.perms.change %}
+                <td><a href="{{ model.admin_url }}" class="changelink">{% trans 'Change' %}</a></td>
+            {% else %}
+                <td>&nbsp;</td>
+            {% endif %}
+            </tr>
+        {% endfor %}
+        </table>
+        </div>
+    {% endfor %}
+{% else %}
+    <p>{% trans "You don't have permission to edit anything." %}</p>
+{% endif %}
+</div>
+{% endblock %}
+
+{% block sidebar %}
+<div id="content-related">
+    <div class="module" id="recent-actions-module">
+        <h2>{% trans 'Recent Actions' %}</h2>
+        <h3>{% trans 'My Actions' %}</h3>
+            {% load log %}
+            {% get_admin_log 10 as admin_log for_user user %}
+            {% if not admin_log %}
+            <p>{% trans 'None available' %}</p>
+            {% else %}
+            <ul class="actionlist">
+            {% for entry in admin_log %}
+            <li class="{% if entry.is_addition %}addlink{% endif %}{% if entry.is_change %}changelink{% endif %}{% if entry.is_deletion %}deletelink{% endif %}">{% if not entry.is_deletion %}<a href="{{ entry.get_admin_url }}">{% endif %}{{ entry.object_repr|escape }}{% if not entry.is_deletion %}</a>{% endif %}<br /><span class="mini quiet">{% filter capfirst %}{% trans entry.content_type.name %}{% endfilter %}</span></li>
+            {% endfor %}
+            </ul>
+            {% endif %}
+    </div>
+</div>
+{% endblock %}
diff --git a/webapp/django/contrib/admin/templates/admin/invalid_setup.html b/webapp/django/contrib/admin/templates/admin/invalid_setup.html
new file mode 100644
index 0000000..f09b316
--- /dev/null
+++ b/webapp/django/contrib/admin/templates/admin/invalid_setup.html
@@ -0,0 +1,8 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="../../">{% trans 'Home' %}</a> &rsaquo; {{ title }}</div>{% endblock %}
+
+{% block content %}
+<p>{% trans "Something's wrong with your database installation. Make sure the appropriate database tables have been created, and make sure the database is readable by the appropriate user." %}</p>
+{% endblock %}
diff --git a/webapp/django/contrib/admin/templates/admin/login.html b/webapp/django/contrib/admin/templates/admin/login.html
new file mode 100644
index 0000000..5dd953b
--- /dev/null
+++ b/webapp/django/contrib/admin/templates/admin/login.html
@@ -0,0 +1,35 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+
+{% block stylesheet %}{% load adminmedia %}{% admin_media_prefix %}css/login.css{% endblock %}
+
+{% block bodyclass %}login{% endblock %}
+
+{% block content_title %}{% endblock %}
+
+{% block breadcrumbs %}{% endblock %}
+
+{% block content %}
+{% if error_message %}
+<p class="errornote">{{ error_message }}</p>
+{% endif %}
+<div id="content-main">
+<form action="{{ app_path }}" method="post" id="login-form">
+  <div class="form-row">
+    <label for="id_username">{% trans 'Username:' %}</label> <input type="text" name="username" id="id_username" />
+  </div>
+  <div class="form-row">
+    <label for="id_password">{% trans 'Password:' %}</label> <input type="password" name="password" id="id_password" />
+    <input type="hidden" name="this_is_the_login_form" value="1" />
+    <input type="hidden" name="post_data" value="{{ post_data }}" /> {#<span class="help">{% trans 'Have you <a href="/password_reset/">forgotten your password</a>?' %}</span>#}
+  </div>
+  <div class="submit-row">
+    <label>&nbsp;</label><input type="submit" value="{% trans 'Log in' %}" />
+  </div>
+</form>
+
+<script type="text/javascript">
+document.getElementById('id_username').focus()
+</script>
+</div>
+{% endblock %}
diff --git a/webapp/django/contrib/admin/templates/admin/object_history.html b/webapp/django/contrib/admin/templates/admin/object_history.html
new file mode 100644
index 0000000..c37012b
--- /dev/null
+++ b/webapp/django/contrib/admin/templates/admin/object_history.html
@@ -0,0 +1,36 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+
+{% block breadcrumbs %}
+<div class="breadcrumbs"><a href="../../../../">{% trans 'Home' %}</a> &rsaquo; <a href="../../">{{ module_name }}</a> &rsaquo; <a href="../">{{ object|truncatewords:"18" }}</a> &rsaquo; {% trans 'History' %}</div>
+{% endblock %}
+
+{% block content %}
+<div id="content-main">
+<div class="module">
+
+{% if action_list %}
+    <table id="change-history">
+        <thead>
+        <tr>
+            <th scope="col">{% trans 'Date/time' %}</th>
+            <th scope="col">{% trans 'User' %}</th>
+            <th scope="col">{% trans 'Action' %}</th>
+        </tr>
+        </thead>
+        <tbody>
+        {% for action in action_list %}
+        <tr>
+            <th scope="row">{{ action.action_time|date:_("DATETIME_FORMAT") }}</th>
+            <td>{{ action.user.username }}{% if action.user.first_name %} ({{ action.user.first_name }} {{ action.user.last_name }}){% endif %}</td>
+            <td>{{ action.change_message }}</td>
+        </tr>
+        {% endfor %}
+        </tbody>
+    </table>
+{% else %}
+    <p>{% trans "This object doesn't have a change history. It probably wasn't added via this admin site." %}</p>
+{% endif %}
+</div>
+</div>
+{% endblock %}
diff --git a/webapp/django/contrib/admin/templates/admin/pagination.html b/webapp/django/contrib/admin/templates/admin/pagination.html
new file mode 100644
index 0000000..0640a46
--- /dev/null
+++ b/webapp/django/contrib/admin/templates/admin/pagination.html
@@ -0,0 +1,11 @@
+{% load admin_list %}
+{% load i18n %}
+<p class="paginator">
+{% if pagination_required %}
+{% for i in page_range %}
+    {% paginator_number cl i %}
+{% endfor %}
+{% endif %}
+{{ cl.result_count }} {% ifequal cl.result_count 1 %}{{ cl.opts.verbose_name|escape }}{% else %}{{ cl.opts.verbose_name_plural }}{% endifequal %}
+{% if show_all_url %}&nbsp;&nbsp;<a href="{{ show_all_url }}" class="showall">{% trans 'Show all' %}</a>{% endif %}
+</p>
diff --git a/webapp/django/contrib/admin/templates/admin/prepopulated_fields_js.html b/webapp/django/contrib/admin/templates/admin/prepopulated_fields_js.html
new file mode 100644
index 0000000..e1cdb96
--- /dev/null
+++ b/webapp/django/contrib/admin/templates/admin/prepopulated_fields_js.html
@@ -0,0 +1,11 @@
+<script type="text/javascript">
+{% for field in prepopulated_fields %}
+    document.getElementById("{{ field.field.auto_id }}").onchange = function() { this._changed = true; };
+    {% for dependency in field.dependencies %}
+    document.getElementById("{{ dependency.auto_id }}").onkeyup = function() {
+        var e = document.getElementById("{{ field.field.auto_id }}");
+        if (!e._changed) { e.value = URLify({% for innerdep in field.dependencies %}document.getElementById("{{ innerdep.auto_id }}").value{% if not forloop.last %} + ' ' + {% endif %}{% endfor %}, {{ field.field.field.max_length|default_if_none:"50" }}); }
+    }
+    {% endfor %}
+{% endfor %}
+</script>
diff --git a/webapp/django/contrib/admin/templates/admin/search_form.html b/webapp/django/contrib/admin/templates/admin/search_form.html
new file mode 100644
index 0000000..b232aa9
--- /dev/null
+++ b/webapp/django/contrib/admin/templates/admin/search_form.html
@@ -0,0 +1,18 @@
+{% load adminmedia %}
+{% load i18n %}
+{% if cl.search_fields %}
+<div id="toolbar"><form id="changelist-search" action="" method="get">
+<div><!-- DIV needed for valid HTML -->
+<label for="searchbar"><img src="{% admin_media_prefix %}img/admin/icon_searchbox.png" alt="Search" /></label>
+<input type="text" size="40" name="{{ search_var }}" value="{{ cl.query|escape }}" id="searchbar" />
+<input type="submit" value="{% trans 'Go' %}" />
+{% if show_result_count %}
+    <span class="small quiet">{% blocktrans count cl.result_count as counter %}1 result{% plural %}{{ counter }} results{% endblocktrans %} (<a href="?{% if cl.is_popup %}pop=1{% endif %}">{% blocktrans with cl.full_result_count as full_result_count %}{{ full_result_count }} total{% endblocktrans %}</a>)</span>
+{% endif %}
+{% for pair in cl.params.items %}
+    {% ifnotequal pair.0 search_var %}<input type="hidden" name="{{ pair.0|escape }}" value="{{ pair.1|escape }}"/>{% endifnotequal %}
+{% endfor %}
+</div>
+</form></div>
+<script type="text/javascript">document.getElementById("searchbar").focus();</script>
+{% endif %}
diff --git a/webapp/django/contrib/admin/templates/admin/submit_line.html b/webapp/django/contrib/admin/templates/admin/submit_line.html
new file mode 100644
index 0000000..6eccbce
--- /dev/null
+++ b/webapp/django/contrib/admin/templates/admin/submit_line.html
@@ -0,0 +1,8 @@
+{% load i18n %}
+<div class="submit-row">
+{% if show_save %}<input type="submit" value="{% trans 'Save' %}" class="default" name="_save" {{ onclick_attrib }}/>{% endif %}
+{% if show_delete_link %}<p class="float-left"><a href="delete/" class="deletelink">{% trans "Delete" %}</a></p>{% endif %}
+{% if show_save_as_new %}<input type="submit" value="{% trans 'Save as new' %}" name="_saveasnew" {{ onclick_attrib }}/>{%endif%}
+{% if show_save_and_add_another %}<input type="submit" value="{% trans 'Save and add another' %}" name="_addanother" {{ onclick_attrib }} />{% endif %}
+{% if show_save_and_continue %}<input type="submit" value="{% trans 'Save and continue editing' %}" name="_continue" {{ onclick_attrib }}/>{% endif %}
+</div>
diff --git a/webapp/django/contrib/admin/templates/admin/template_validator.html b/webapp/django/contrib/admin/templates/admin/template_validator.html
new file mode 100644
index 0000000..5106143
--- /dev/null
+++ b/webapp/django/contrib/admin/templates/admin/template_validator.html
@@ -0,0 +1,31 @@
+{% extends "admin/base_site.html" %}
+
+{% block content %}
+
+<div id="content-main">
+
+<form action="" method="post">
+
+{% if form.errors %}
+<p class="errornote">Your template had {{ form.errors|length }} error{{ form.errors|pluralize }}:</p>
+{% endif %}
+
+<fieldset class="module aligned">
+<div class="form-row{% if form.errors.site %} error{% endif %} required">
+    {% if form.errors.site %}{{ form.errors.site }}{% endif %}
+    <h4><label for="id_site">{{ form.site.label }}:</label> {{ form.site }}</h4>
+</div>
+<div class="form-row{% if form.errors.template %} error{% endif %} required">
+    {% if form.errors.template %}{{ form.errors.template }}{% endif %}
+    <h4><label for="id_template">{{ form.template.label }}:</label> {{ form.template }}</h4>
+</div>
+</fieldset>
+
+<div class="submit-row">
+    <input type="submit" value="Check for errors" class="default" />
+</div>
+
+</form>
+</div>
+
+{% endblock %}
diff --git a/webapp/django/contrib/admin/templates/registration/logged_out.html b/webapp/django/contrib/admin/templates/registration/logged_out.html
new file mode 100644
index 0000000..d339ef0
--- /dev/null
+++ b/webapp/django/contrib/admin/templates/registration/logged_out.html
@@ -0,0 +1,12 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="../">{% trans 'Home' %}</a></div>{% endblock %}
+
+{% block content %}
+
+<p>{% trans "Thanks for spending some quality time with the Web site today." %}</p>
+
+<p><a href="../">{% trans 'Log in again' %}</a></p>
+
+{% endblock %}
diff --git a/webapp/django/contrib/admin/templates/registration/password_change_done.html b/webapp/django/contrib/admin/templates/registration/password_change_done.html
new file mode 100644
index 0000000..2525720
--- /dev/null
+++ b/webapp/django/contrib/admin/templates/registration/password_change_done.html
@@ -0,0 +1,14 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+{% block userlinks %}<a href="../../doc/">{% trans 'Documentation' %}</a> / {% trans 'Change password' %} / <a href="../../logout/">{% trans 'Log out' %}</a>{% endblock %}
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="../../">{% trans 'Home' %}</a> &rsaquo; {% trans 'Password change' %}</div>{% endblock %}
+
+{% block title %}{% trans 'Password change successful' %}{% endblock %}
+
+{% block content %}
+
+<h1>{% trans 'Password change successful' %}</h1>
+
+<p>{% trans 'Your password was changed.' %}</p>
+
+{% endblock %}
diff --git a/webapp/django/contrib/admin/templates/registration/password_change_form.html b/webapp/django/contrib/admin/templates/registration/password_change_form.html
new file mode 100644
index 0000000..4facc0e
--- /dev/null
+++ b/webapp/django/contrib/admin/templates/registration/password_change_form.html
@@ -0,0 +1,26 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+{% block userlinks %}<a href="../doc/">{% trans 'Documentation' %}</a> / {% trans 'Change password' %} / <a href="../logout/">{% trans 'Log out' %}</a>{% endblock %}
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="../">{% trans 'Home' %}</a> &rsaquo; {% trans 'Password change' %}</div>{% endblock %}
+
+{% block title %}{% trans 'Password change' %}{% endblock %}
+
+{% block content %}
+
+<h1>{% trans 'Password change' %}</h1>
+
+<p>{% trans "Please enter your old password, for security's sake, and then enter your new password twice so we can verify you typed it in correctly." %}</p>
+
+<form action="" method="post">
+
+{% if form.old_password.errors %}{{ form.old_password.errors }}{% endif %}
+<p class="aligned wide"><label for="id_old_password">{% trans 'Old password:' %}</label>{{ form.old_password }}</p>
+{% if form.new_password1.errors %}{{ form.new_password1.errors }}{% endif %}
+<p class="aligned wide"><label for="id_new_password1">{% trans 'New password:' %}</label>{{ form.new_password1 }}</p>
+{% if form.new_password2.errors %}{{ form.new_password2.errors }}{% endif %}
+<p class="aligned wide"><label for="id_new_password2">{% trans 'Confirm password:' %}</label>{{ form.new_password2 }}</p>
+
+<p><input type="submit" value="{% trans 'Change my password' %}" /></p>
+</form>
+
+{% endblock %}
diff --git a/webapp/django/contrib/admin/templates/registration/password_reset_complete.html b/webapp/django/contrib/admin/templates/registration/password_reset_complete.html
new file mode 100644
index 0000000..fceb167
--- /dev/null
+++ b/webapp/django/contrib/admin/templates/registration/password_reset_complete.html
@@ -0,0 +1,16 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="../../">{% trans 'Home' %}</a> &rsaquo; {% trans 'Password reset' %}</div>{% endblock %}
+
+{% block title %}{% trans 'Password reset complete' %}{% endblock %}
+
+{% block content %}
+
+<h1>{% trans 'Password reset complete' %}</h1>
+
+<p>{% trans "Your password has been set.  You may go ahead and log in now." %}</p>
+
+<p><a href="{{ login_url }}">{% trans 'Log in' %}</a></p>
+
+{% endblock %}
diff --git a/webapp/django/contrib/admin/templates/registration/password_reset_confirm.html b/webapp/django/contrib/admin/templates/registration/password_reset_confirm.html
new file mode 100644
index 0000000..9ba0e5a
--- /dev/null
+++ b/webapp/django/contrib/admin/templates/registration/password_reset_confirm.html
@@ -0,0 +1,32 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="../">{% trans 'Home' %}</a> &rsaquo; {% trans 'Password reset confirmation' %}</div>{% endblock %}
+
+{% block title %}{% trans 'Password reset' %}{% endblock %}
+
+{% block content %}
+
+{% if validlink %}
+
+<h1>{% trans 'Enter new password' %}</h1>
+
+<p>{% trans "Please enter your new password twice so we can verify you typed it in correctly." %}</p>
+
+<form action="" method="post">
+{% if form.new_password1.errors %}{{ form.new_password1.errors }}{% endif %}
+<p class="aligned wide"><label for="id_new_password1">{% trans 'New password:' %}</label>{{ form.new_password1 }}</p>
+{% if form.new_password2.errors %}{{ form.new_password2.errors }}{% endif %}
+<p class="aligned wide"><label for="id_new_password2">{% trans 'Confirm password:' %}</label>{{ form.new_password2 }}</p>
+<p><input type="submit" value="{% trans 'Change my password' %}" /></p>
+</form>
+
+{% else %}
+
+<h1>{% trans 'Password reset unsuccessful' %}</h1>
+
+<p>{% trans "The password reset link was invalid, possibly because it has already been used.  Please request a new password reset." %}
+
+{% endif %}
+
+{% endblock %}
diff --git a/webapp/django/contrib/admin/templates/registration/password_reset_done.html b/webapp/django/contrib/admin/templates/registration/password_reset_done.html
new file mode 100644
index 0000000..e223bdb
--- /dev/null
+++ b/webapp/django/contrib/admin/templates/registration/password_reset_done.html
@@ -0,0 +1,14 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="../">{% trans 'Home' %}</a> &rsaquo; {% trans 'Password reset' %}</div>{% endblock %}
+
+{% block title %}{% trans 'Password reset successful' %}{% endblock %}
+
+{% block content %}
+
+<h1>{% trans 'Password reset successful' %}</h1>
+
+<p>{% trans "We've e-mailed you instructions for setting your password to the e-mail address you submitted. You should be receiving it shortly." %}</p>
+
+{% endblock %}
diff --git a/webapp/django/contrib/admin/templates/registration/password_reset_email.html b/webapp/django/contrib/admin/templates/registration/password_reset_email.html
new file mode 100644
index 0000000..4e4bd6d
--- /dev/null
+++ b/webapp/django/contrib/admin/templates/registration/password_reset_email.html
@@ -0,0 +1,15 @@
+{% load i18n %}{% autoescape off %}
+{% trans "You're receiving this e-mail because you requested a password reset" %}
+{% blocktrans %}for your user account at {{ site_name }}{% endblocktrans %}.
+
+{% trans "Please go to the following page and choose a new password:" %}
+{% block reset_link %}
+{{ protocol }}://{{ domain }}{% url django.contrib.auth.views.password_reset_confirm uidb36=uid, token=token %}
+{% endblock %}
+{% trans "Your username, in case you've forgotten:" %} {{ user.username }}
+
+{% trans "Thanks for using our site!" %}
+
+{% blocktrans %}The {{ site_name }} team{% endblocktrans %}
+
+{% endautoescape %}
diff --git a/webapp/django/contrib/admin/templates/registration/password_reset_form.html b/webapp/django/contrib/admin/templates/registration/password_reset_form.html
new file mode 100644
index 0000000..4ecebc7
--- /dev/null
+++ b/webapp/django/contrib/admin/templates/registration/password_reset_form.html
@@ -0,0 +1,19 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="../">{% trans 'Home' %}</a> &rsaquo; {% trans 'Password reset' %}</div>{% endblock %}
+
+{% block title %}{% trans "Password reset" %}{% endblock %}
+
+{% block content %}
+
+<h1>{% trans "Password reset" %}</h1>
+
+<p>{% trans "Forgotten your password? Enter your e-mail address below, and we'll e-mail instructions for setting a new one." %}</p>
+
+<form action="" method="post">
+{% if form.email.errors %}{{ form.email.errors }}{% endif %}
+<p><label for="id_email">{% trans 'E-mail address:' %}</label> {{ form.email }} <input type="submit" value="{% trans 'Reset my password' %}" /></p>
+</form>
+
+{% endblock %}
diff --git a/webapp/django/contrib/admin/templatetags/__init__.py b/webapp/django/contrib/admin/templatetags/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/admin/templatetags/__init__.py
diff --git a/webapp/django/contrib/admin/templatetags/admin_list.py b/webapp/django/contrib/admin/templatetags/admin_list.py
new file mode 100644
index 0000000..cae33cc
--- /dev/null
+++ b/webapp/django/contrib/admin/templatetags/admin_list.py
@@ -0,0 +1,312 @@
+from django.conf import settings
+from django.contrib.admin.views.main import ALL_VAR, EMPTY_CHANGELIST_VALUE
+from django.contrib.admin.views.main import ORDER_VAR, ORDER_TYPE_VAR, PAGE_VAR, SEARCH_VAR
+from django.core.exceptions import ObjectDoesNotExist
+from django.db import models
+from django.utils import dateformat
+from django.utils.html import escape, conditional_escape
+from django.utils.text import capfirst
+from django.utils.safestring import mark_safe
+from django.utils.translation import get_date_formats, get_partial_date_formats, ugettext as _
+from django.utils.encoding import smart_unicode, smart_str, force_unicode
+from django.template import Library
+import datetime
+
+register = Library()
+
+DOT = '.'
+
+def paginator_number(cl,i):
+    if i == DOT:
+        return u'... '
+    elif i == cl.page_num:
+        return mark_safe(u'<span class="this-page">%d</span> ' % (i+1))
+    else:
+        return mark_safe(u'<a href="%s"%s>%d</a> ' % (cl.get_query_string({PAGE_VAR: i}), (i == cl.paginator.num_pages-1 and ' class="end"' or ''), i+1))
+paginator_number = register.simple_tag(paginator_number)
+
+def pagination(cl):
+    paginator, page_num = cl.paginator, cl.page_num
+
+    pagination_required = (not cl.show_all or not cl.can_show_all) and cl.multi_page
+    if not pagination_required:
+        page_range = []
+    else:
+        ON_EACH_SIDE = 3
+        ON_ENDS = 2
+
+        # If there are 10 or fewer pages, display links to every page.
+        # Otherwise, do some fancy
+        if paginator.num_pages <= 10:
+            page_range = range(paginator.num_pages)
+        else:
+            # Insert "smart" pagination links, so that there are always ON_ENDS
+            # links at either end of the list of pages, and there are always
+            # ON_EACH_SIDE links at either end of the "current page" link.
+            page_range = []
+            if page_num > (ON_EACH_SIDE + ON_ENDS):
+                page_range.extend(range(0, ON_EACH_SIDE - 1))
+                page_range.append(DOT)
+                page_range.extend(range(page_num - ON_EACH_SIDE, page_num + 1))
+            else:
+                page_range.extend(range(0, page_num + 1))
+            if page_num < (paginator.num_pages - ON_EACH_SIDE - ON_ENDS - 1):
+                page_range.extend(range(page_num + 1, page_num + ON_EACH_SIDE + 1))
+                page_range.append(DOT)
+                page_range.extend(range(paginator.num_pages - ON_ENDS, paginator.num_pages))
+            else:
+                page_range.extend(range(page_num + 1, paginator.num_pages))
+
+    need_show_all_link = cl.can_show_all and not cl.show_all and cl.multi_page
+    return {
+        'cl': cl,
+        'pagination_required': pagination_required,
+        'show_all_url': need_show_all_link and cl.get_query_string({ALL_VAR: ''}),
+        'page_range': page_range,
+        'ALL_VAR': ALL_VAR,
+        '1': 1,
+    }
+pagination = register.inclusion_tag('admin/pagination.html')(pagination)
+
+def result_headers(cl):
+    lookup_opts = cl.lookup_opts
+    
+    for i, field_name in enumerate(cl.list_display):
+        attr = None
+        try:
+            f = lookup_opts.get_field(field_name)
+            admin_order_field = None
+        except models.FieldDoesNotExist:
+            # For non-field list_display values, check for the function
+            # attribute "short_description". If that doesn't exist, fall back
+            # to the method name. And __str__ and __unicode__ are special-cases.
+            if field_name == '__unicode__':
+                header = force_unicode(lookup_opts.verbose_name)
+            elif field_name == '__str__':
+                header = smart_str(lookup_opts.verbose_name)
+            else:
+                if callable(field_name):
+                    attr = field_name # field_name can be a callable
+                else:
+                    try:
+                        attr = getattr(cl.model_admin, field_name)
+                    except AttributeError:
+                        try:
+                            attr = getattr(cl.model, field_name)
+                        except AttributeError:
+                            raise AttributeError, \
+                                "'%s' model or '%s' objects have no attribute '%s'" % \
+                                    (lookup_opts.object_name, cl.model_admin.__class__, field_name)
+                
+                try:
+                    header = attr.short_description
+                except AttributeError:
+                    if callable(field_name):
+                        header = field_name.__name__
+                    else:
+                        header = field_name
+                    header = header.replace('_', ' ')
+
+            # It is a non-field, but perhaps one that is sortable
+            admin_order_field = getattr(attr, "admin_order_field", None)
+            if not admin_order_field:
+                yield {"text": header}
+                continue
+
+            # So this _is_ a sortable non-field.  Go to the yield
+            # after the else clause.
+        else:
+            if isinstance(f.rel, models.ManyToOneRel) and f.null:
+                yield {"text": f.verbose_name}
+                continue
+            else:
+                header = f.verbose_name
+
+        th_classes = []
+        new_order_type = 'asc'
+        if field_name == cl.order_field or admin_order_field == cl.order_field:
+            th_classes.append('sorted %sending' % cl.order_type.lower())
+            new_order_type = {'asc': 'desc', 'desc': 'asc'}[cl.order_type.lower()]
+
+        yield {"text": header,
+               "sortable": True,
+               "url": cl.get_query_string({ORDER_VAR: i, ORDER_TYPE_VAR: new_order_type}),
+               "class_attrib": mark_safe(th_classes and ' class="%s"' % ' '.join(th_classes) or '')}
+
+def _boolean_icon(field_val):
+    BOOLEAN_MAPPING = {True: 'yes', False: 'no', None: 'unknown'}
+    return mark_safe(u'<img src="%simg/admin/icon-%s.gif" alt="%s" />' % (settings.ADMIN_MEDIA_PREFIX, BOOLEAN_MAPPING[field_val], field_val))
+
+def items_for_result(cl, result):
+    first = True
+    pk = cl.lookup_opts.pk.attname
+    for field_name in cl.list_display:
+        row_class = ''
+        try:
+            f = cl.lookup_opts.get_field(field_name)
+        except models.FieldDoesNotExist:
+            # For non-field list_display values, the value is either a method,
+            # property or returned via a callable.
+            try:
+                if callable(field_name):
+                    attr = field_name
+                    value = attr(result)
+                elif hasattr(cl.model_admin, field_name) and \
+                   not field_name == '__str__' and not field_name == '__unicode__':
+                    attr = getattr(cl.model_admin, field_name)
+                    value = attr(result)
+                else:
+                    attr = getattr(result, field_name)
+                    if callable(attr):
+                        value = attr()
+                    else:
+                        value = attr
+                allow_tags = getattr(attr, 'allow_tags', False)
+                boolean = getattr(attr, 'boolean', False)
+                if boolean:
+                    allow_tags = True
+                    result_repr = _boolean_icon(value)
+                else:
+                    result_repr = smart_unicode(value)
+            except (AttributeError, ObjectDoesNotExist):
+                result_repr = EMPTY_CHANGELIST_VALUE
+            else:
+                # Strip HTML tags in the resulting text, except if the
+                # function has an "allow_tags" attribute set to True.
+                if not allow_tags:
+                    result_repr = escape(result_repr)
+                else:
+                    result_repr = mark_safe(result_repr)
+        else:
+            field_val = getattr(result, f.attname)
+
+            if isinstance(f.rel, models.ManyToOneRel):
+                if field_val is not None:
+                    result_repr = escape(getattr(result, f.name))
+                else:
+                    result_repr = EMPTY_CHANGELIST_VALUE
+            # Dates and times are special: They're formatted in a certain way.
+            elif isinstance(f, models.DateField) or isinstance(f, models.TimeField):
+                if field_val:
+                    (date_format, datetime_format, time_format) = get_date_formats()
+                    if isinstance(f, models.DateTimeField):
+                        result_repr = capfirst(dateformat.format(field_val, datetime_format))
+                    elif isinstance(f, models.TimeField):
+                        result_repr = capfirst(dateformat.time_format(field_val, time_format))
+                    else:
+                        result_repr = capfirst(dateformat.format(field_val, date_format))
+                else:
+                    result_repr = EMPTY_CHANGELIST_VALUE
+                row_class = ' class="nowrap"'
+            # Booleans are special: We use images.
+            elif isinstance(f, models.BooleanField) or isinstance(f, models.NullBooleanField):
+                result_repr = _boolean_icon(field_val)
+            # DecimalFields are special: Zero-pad the decimals.
+            elif isinstance(f, models.DecimalField):
+                if field_val is not None:
+                    result_repr = ('%%.%sf' % f.decimal_places) % field_val
+                else:
+                    result_repr = EMPTY_CHANGELIST_VALUE
+            # Fields with choices are special: Use the representation
+            # of the choice.
+            elif f.choices:
+                result_repr = dict(f.choices).get(field_val, EMPTY_CHANGELIST_VALUE)
+            else:
+                result_repr = escape(field_val)
+        if force_unicode(result_repr) == '':
+            result_repr = mark_safe('&nbsp;')
+        # If list_display_links not defined, add the link tag to the first field
+        if (first and not cl.list_display_links) or field_name in cl.list_display_links:
+            table_tag = {True:'th', False:'td'}[first]
+            first = False
+            url = cl.url_for_result(result)
+            # Convert the pk to something that can be used in Javascript.
+            # Problem cases are long ints (23L) and non-ASCII strings.
+            result_id = repr(force_unicode(getattr(result, pk)))[1:]
+            yield mark_safe(u'<%s%s><a href="%s"%s>%s</a></%s>' % \
+                (table_tag, row_class, url, (cl.is_popup and ' onclick="opener.dismissRelatedLookupPopup(window, %s); return false;"' % result_id or ''), conditional_escape(result_repr), table_tag))
+        else:
+            yield mark_safe(u'<td%s>%s</td>' % (row_class, conditional_escape(result_repr)))
+
+def results(cl):
+    for res in cl.result_list:
+        yield list(items_for_result(cl,res))
+
+def result_list(cl):
+    return {'cl': cl,
+            'result_headers': list(result_headers(cl)),
+            'results': list(results(cl))}
+result_list = register.inclusion_tag("admin/change_list_results.html")(result_list)
+
+def date_hierarchy(cl):
+    if cl.date_hierarchy:
+        field_name = cl.date_hierarchy
+        year_field = '%s__year' % field_name
+        month_field = '%s__month' % field_name
+        day_field = '%s__day' % field_name
+        field_generic = '%s__' % field_name
+        year_lookup = cl.params.get(year_field)
+        month_lookup = cl.params.get(month_field)
+        day_lookup = cl.params.get(day_field)
+        year_month_format, month_day_format = get_partial_date_formats()
+
+        link = lambda d: mark_safe(cl.get_query_string(d, [field_generic]))
+
+        if year_lookup and month_lookup and day_lookup:
+            day = datetime.date(int(year_lookup), int(month_lookup), int(day_lookup))
+            return {
+                'show': True,
+                'back': {
+                    'link': link({year_field: year_lookup, month_field: month_lookup}),
+                    'title': dateformat.format(day, year_month_format)
+                },
+                'choices': [{'title': dateformat.format(day, month_day_format)}]
+            }
+        elif year_lookup and month_lookup:
+            days = cl.query_set.filter(**{year_field: year_lookup, month_field: month_lookup}).dates(field_name, 'day')
+            return {
+                'show': True,
+                'back': {
+                    'link': link({year_field: year_lookup}),
+                    'title': year_lookup
+                },
+                'choices': [{
+                    'link': link({year_field: year_lookup, month_field: month_lookup, day_field: day.day}),
+                    'title': dateformat.format(day, month_day_format)
+                } for day in days]
+            }
+        elif year_lookup:
+            months = cl.query_set.filter(**{year_field: year_lookup}).dates(field_name, 'month')
+            return {
+                'show' : True,
+                'back': {
+                    'link' : link({}),
+                    'title': _('All dates')
+                },
+                'choices': [{
+                    'link': link({year_field: year_lookup, month_field: month.month}),
+                    'title': dateformat.format(month, year_month_format)
+                } for month in months]
+            }
+        else:
+            years = cl.query_set.dates(field_name, 'year')
+            return {
+                'show': True,
+                'choices': [{
+                    'link': link({year_field: year.year}),
+                    'title': year.year
+                } for year in years]
+            }
+date_hierarchy = register.inclusion_tag('admin/date_hierarchy.html')(date_hierarchy)
+
+def search_form(cl):
+    return {
+        'cl': cl,
+        'show_result_count': cl.result_count != cl.full_result_count,
+        'search_var': SEARCH_VAR
+    }
+search_form = register.inclusion_tag('admin/search_form.html')(search_form)
+
+def admin_list_filter(cl, spec):
+    return {'title': spec.title(), 'choices' : list(spec.choices(cl))}
+admin_list_filter = register.inclusion_tag('admin/filter.html')(admin_list_filter)
diff --git a/webapp/django/contrib/admin/templatetags/admin_modify.py b/webapp/django/contrib/admin/templatetags/admin_modify.py
new file mode 100644
index 0000000..850127c
--- /dev/null
+++ b/webapp/django/contrib/admin/templatetags/admin_modify.py
@@ -0,0 +1,38 @@
+from django import template
+
+register = template.Library()
+
+def prepopulated_fields_js(context):
+    """
+    Creates a list of prepopulated_fields that should render Javascript for
+    the prepopulated fields for both the admin form and inlines.
+    """
+    prepopulated_fields = []
+    if context['add'] and 'adminform' in context:
+        prepopulated_fields.extend(context['adminform'].prepopulated_fields)
+    if 'inline_admin_formsets' in context:
+        for inline_admin_formset in context['inline_admin_formsets']:
+            for inline_admin_form in inline_admin_formset:
+                if inline_admin_form.original is None:
+                    prepopulated_fields.extend(inline_admin_form.prepopulated_fields)
+    context.update({'prepopulated_fields': prepopulated_fields})
+    return context
+prepopulated_fields_js = register.inclusion_tag('admin/prepopulated_fields_js.html', takes_context=True)(prepopulated_fields_js)
+
+def submit_row(context):
+    opts = context['opts']
+    change = context['change']
+    is_popup = context['is_popup']
+    save_as = context['save_as']
+    return {
+        'onclick_attrib': (opts.get_ordered_objects() and change
+                            and 'onclick="submitOrderForm();"' or ''),
+        'show_delete_link': (not is_popup and context['has_delete_permission']
+                              and (change or context['show_delete'])),
+        'show_save_as_new': not is_popup and change and save_as,
+        'show_save_and_add_another': context['has_add_permission'] and 
+                            not is_popup and (not save_as or context['add']),
+        'show_save_and_continue': not is_popup and context['has_change_permission'],
+        'show_save': True
+    }
+submit_row = register.inclusion_tag('admin/submit_line.html', takes_context=True)(submit_row)
diff --git a/webapp/django/contrib/admin/templatetags/adminmedia.py b/webapp/django/contrib/admin/templatetags/adminmedia.py
new file mode 100644
index 0000000..7786343
--- /dev/null
+++ b/webapp/django/contrib/admin/templatetags/adminmedia.py
@@ -0,0 +1,14 @@
+from django.template import Library
+
+register = Library()
+
+def admin_media_prefix():
+    """
+    Returns the string contained in the setting ADMIN_MEDIA_PREFIX.
+    """
+    try:
+        from django.conf import settings
+    except ImportError:
+        return ''
+    return settings.ADMIN_MEDIA_PREFIX
+admin_media_prefix = register.simple_tag(admin_media_prefix)
diff --git a/webapp/django/contrib/admin/templatetags/log.py b/webapp/django/contrib/admin/templatetags/log.py
new file mode 100644
index 0000000..8d52d2e
--- /dev/null
+++ b/webapp/django/contrib/admin/templatetags/log.py
@@ -0,0 +1,56 @@
+from django import template
+from django.contrib.admin.models import LogEntry
+
+register = template.Library()
+
+class AdminLogNode(template.Node):
+    def __init__(self, limit, varname, user):
+        self.limit, self.varname, self.user = limit, varname, user
+
+    def __repr__(self):
+        return "<GetAdminLog Node>"
+
+    def render(self, context):
+        if self.user is None:
+            context[self.varname] = LogEntry.objects.all().select_related()[:self.limit]
+        else:
+            if not self.user.isdigit():
+                self.user = context[self.user].id
+            context[self.varname] = LogEntry.objects.filter(user__id__exact=self.user).select_related()[:self.limit]
+        return ''
+
+class DoGetAdminLog:
+    """
+    Populates a template variable with the admin log for the given criteria.
+
+    Usage::
+
+        {% get_admin_log [limit] as [varname] for_user [context_var_containing_user_obj] %}
+
+    Examples::
+
+        {% get_admin_log 10 as admin_log for_user 23 %}
+        {% get_admin_log 10 as admin_log for_user user %}
+        {% get_admin_log 10 as admin_log %}
+
+    Note that ``context_var_containing_user_obj`` can be a hard-coded integer
+    (user ID) or the name of a template context variable containing the user
+    object whose ID you want.
+    """
+    def __init__(self, tag_name):
+        self.tag_name = tag_name
+
+    def __call__(self, parser, token):
+        tokens = token.contents.split()
+        if len(tokens) < 4:
+            raise template.TemplateSyntaxError, "'%s' statements require two arguments" % self.tag_name
+        if not tokens[1].isdigit():
+            raise template.TemplateSyntaxError, "First argument in '%s' must be an integer" % self.tag_name
+        if tokens[2] != 'as':
+            raise template.TemplateSyntaxError, "Second argument in '%s' must be 'as'" % self.tag_name
+        if len(tokens) > 4:
+            if tokens[4] != 'for_user':
+                raise template.TemplateSyntaxError, "Fourth argument in '%s' must be 'for_user'" % self.tag_name
+        return AdminLogNode(limit=tokens[1], varname=tokens[3], user=(len(tokens) > 5 and tokens[5] or None))
+
+register.tag('get_admin_log', DoGetAdminLog('get_admin_log'))
diff --git a/webapp/django/contrib/admin/util.py b/webapp/django/contrib/admin/util.py
new file mode 100644
index 0000000..c3f567d
--- /dev/null
+++ b/webapp/django/contrib/admin/util.py
@@ -0,0 +1,151 @@
+from django.core.exceptions import ObjectDoesNotExist
+from django.db import models
+from django.utils.html import escape
+from django.utils.safestring import mark_safe
+from django.utils.text import capfirst
+from django.utils.encoding import force_unicode
+from django.utils.translation import ugettext as _
+
+
+def quote(s):
+    """
+    Ensure that primary key values do not confuse the admin URLs by escaping
+    any '/', '_' and ':' characters. Similar to urllib.quote, except that the
+    quoting is slightly different so that it doesn't get automatically
+    unquoted by the Web browser.
+    """
+    if not isinstance(s, basestring):
+        return s
+    res = list(s)
+    for i in range(len(res)):
+        c = res[i]
+        if c in """:/_#?;@&=+$,"<>%\\""":
+            res[i] = '_%02X' % ord(c)
+    return ''.join(res)
+
+def unquote(s):
+    """
+    Undo the effects of quote(). Based heavily on urllib.unquote().
+    """
+    mychr = chr
+    myatoi = int
+    list = s.split('_')
+    res = [list[0]]
+    myappend = res.append
+    del list[0]
+    for item in list:
+        if item[1:2]:
+            try:
+                myappend(mychr(myatoi(item[:2], 16)) + item[2:])
+            except ValueError:
+                myappend('_' + item)
+        else:
+            myappend('_' + item)
+    return "".join(res)
+
+def flatten_fieldsets(fieldsets):
+    """Returns a list of field names from an admin fieldsets structure."""
+    field_names = []
+    for name, opts in fieldsets:
+        for field in opts['fields']:
+            # type checking feels dirty, but it seems like the best way here
+            if type(field) == tuple:
+                field_names.extend(field)
+            else:
+                field_names.append(field)
+    return field_names
+
+def _nest_help(obj, depth, val):
+    current = obj
+    for i in range(depth):
+        current = current[-1]
+    current.append(val)
+
+def get_deleted_objects(deleted_objects, perms_needed, user, obj, opts, current_depth, admin_site):
+    "Helper function that recursively populates deleted_objects."
+    nh = _nest_help # Bind to local variable for performance
+    if current_depth > 16:
+        return # Avoid recursing too deep.
+    opts_seen = []
+    for related in opts.get_all_related_objects():
+        has_admin = related.model in admin_site._registry
+        if related.opts in opts_seen:
+            continue
+        opts_seen.append(related.opts)
+        rel_opts_name = related.get_accessor_name()
+        if isinstance(related.field.rel, models.OneToOneRel):
+            try:
+                sub_obj = getattr(obj, rel_opts_name)
+            except ObjectDoesNotExist:
+                pass
+            else:
+                if has_admin:
+                    p = '%s.%s' % (related.opts.app_label, related.opts.get_delete_permission())
+                    if not user.has_perm(p):
+                        perms_needed.add(related.opts.verbose_name)
+                        # We don't care about populating deleted_objects now.
+                        continue
+                if related.field.rel.edit_inline or not has_admin:
+                    # Don't display link to edit, because it either has no
+                    # admin or is edited inline.
+                    nh(deleted_objects, current_depth, [mark_safe(u'%s: %s' % (force_unicode(capfirst(related.opts.verbose_name)), sub_obj)), []])
+                else:
+                    # Display a link to the admin page.
+                    nh(deleted_objects, current_depth, [mark_safe(u'%s: <a href="../../../../%s/%s/%s/">%s</a>' %
+                        (escape(force_unicode(capfirst(related.opts.verbose_name))),
+                            related.opts.app_label,
+                            related.opts.object_name.lower(),
+                            sub_obj._get_pk_val(), sub_obj)), []])
+                get_deleted_objects(deleted_objects, perms_needed, user, sub_obj, related.opts, current_depth+2, admin_site)
+        else:
+            has_related_objs = False
+            for sub_obj in getattr(obj, rel_opts_name).all():
+                has_related_objs = True
+                if related.field.rel.edit_inline or not has_admin:
+                    # Don't display link to edit, because it either has no
+                    # admin or is edited inline.
+                    nh(deleted_objects, current_depth, [u'%s: %s' % (force_unicode(capfirst(related.opts.verbose_name)), escape(sub_obj)), []])
+                else:
+                    # Display a link to the admin page.
+                    nh(deleted_objects, current_depth, [mark_safe(u'%s: <a href="../../../../%s/%s/%s/">%s</a>' % \
+                        (escape(force_unicode(capfirst(related.opts.verbose_name))), related.opts.app_label, related.opts.object_name.lower(), sub_obj._get_pk_val(), escape(sub_obj))), []])
+                get_deleted_objects(deleted_objects, perms_needed, user, sub_obj, related.opts, current_depth+2, admin_site)
+            # If there were related objects, and the user doesn't have
+            # permission to delete them, add the missing perm to perms_needed.
+            if has_admin and has_related_objs:
+                p = '%s.%s' % (related.opts.app_label, related.opts.get_delete_permission())
+                if not user.has_perm(p):
+                    perms_needed.add(related.opts.verbose_name)
+    for related in opts.get_all_related_many_to_many_objects():
+        has_admin = related.model in admin_site._registry
+        if related.opts in opts_seen:
+            continue
+        opts_seen.append(related.opts)
+        rel_opts_name = related.get_accessor_name()
+        has_related_objs = False
+
+        # related.get_accessor_name() could return None for symmetrical relationships
+        if rel_opts_name:
+            rel_objs = getattr(obj, rel_opts_name, None)
+            if rel_objs:
+                has_related_objs = True
+
+        if has_related_objs:
+            for sub_obj in rel_objs.all():
+                if related.field.rel.edit_inline or not has_admin:
+                    # Don't display link to edit, because it either has no
+                    # admin or is edited inline.
+                    nh(deleted_objects, current_depth, [_('One or more %(fieldname)s in %(name)s: %(obj)s') % \
+                        {'fieldname': force_unicode(related.field.verbose_name), 'name': force_unicode(related.opts.verbose_name), 'obj': escape(sub_obj)}, []])
+                else:
+                    # Display a link to the admin page.
+                    nh(deleted_objects, current_depth, [
+                        mark_safe((_('One or more %(fieldname)s in %(name)s:') % {'fieldname': escape(force_unicode(related.field.verbose_name)), 'name': escape(force_unicode(related.opts.verbose_name))}) + \
+                        (u' <a href="../../../../%s/%s/%s/">%s</a>' % \
+                            (related.opts.app_label, related.opts.module_name, sub_obj._get_pk_val(), escape(sub_obj)))), []])
+        # If there were related objects, and the user doesn't have
+        # permission to change them, add the missing perm to perms_needed.
+        if has_admin and has_related_objs:
+            p = u'%s.%s' % (related.opts.app_label, related.opts.get_change_permission())
+            if not user.has_perm(p):
+                perms_needed.add(related.opts.verbose_name)
diff --git a/webapp/django/contrib/admin/validation.py b/webapp/django/contrib/admin/validation.py
new file mode 100644
index 0000000..9b9cefa
--- /dev/null
+++ b/webapp/django/contrib/admin/validation.py
@@ -0,0 +1,298 @@
+try:
+    set
+except NameError:
+    from sets import Set as set   # Python 2.3 fallback
+
+from django.core.exceptions import ImproperlyConfigured
+from django.db import models
+from django.forms.models import BaseModelForm, BaseModelFormSet, fields_for_model
+from django.contrib.admin.options import flatten_fieldsets, BaseModelAdmin
+from django.contrib.admin.options import HORIZONTAL, VERTICAL
+
+def validate(cls, model):
+    """
+    Does basic ModelAdmin option validation. Calls custom validation
+    classmethod in the end if it is provided in cls. The signature of the
+    custom validation classmethod should be: def validate(cls, model).
+    """
+    opts = model._meta
+    _validate_base(cls, model)
+
+    # currying is expensive, use wrappers instead
+    def _check_istuplew(label, obj):
+        _check_istuple(cls, label, obj)
+
+    def _check_isdictw(label, obj):
+        _check_isdict(cls, label, obj)
+
+    def _check_field_existsw(label, field):
+        return _check_field_exists(cls, model, opts, label, field)
+
+    def _check_attr_existsw(label, field):
+        return _check_attr_exists(cls, model, opts, label, field)
+
+    # list_display
+    if hasattr(cls, 'list_display'):
+        _check_istuplew('list_display', cls.list_display)
+        for idx, field in enumerate(cls.list_display):
+            if not callable(field):
+                if not hasattr(cls, field):
+                    if not hasattr(model, field):
+                        try:
+                            opts.get_field(field)
+                        except models.FieldDoesNotExist:
+                            raise ImproperlyConfigured("%s.list_display[%d], %r is "
+                                "not a callable or an attribute of %r or found in the model %r."
+                                % (cls.__name__, idx, field, cls.__name__, model._meta.object_name))
+                        f = _check_attr_existsw("list_display[%d]" % idx, field)
+                        if isinstance(f, models.ManyToManyField):
+                            raise ImproperlyConfigured("`%s.list_display[%d]`, `%s` is a "
+                                "ManyToManyField which is not supported."
+                                % (cls.__name__, idx, field))
+
+    # list_display_links
+    if hasattr(cls, 'list_display_links'):
+        _check_istuplew('list_display_links', cls.list_display_links)
+        for idx, field in enumerate(cls.list_display_links):
+            _check_attr_existsw('list_display_links[%d]' % idx, field)
+            if field not in cls.list_display:
+                raise ImproperlyConfigured("`%s.list_display_links[%d]`"
+                        "refers to `%s` which is not defined in `list_display`."
+                        % (cls.__name__, idx, field))
+
+    # list_filter
+    if hasattr(cls, 'list_filter'):
+        _check_istuplew('list_filter', cls.list_filter)
+        for idx, field in enumerate(cls.list_filter):
+            _check_field_existsw('list_filter[%d]' % idx, field)
+
+    # list_per_page = 100
+    if hasattr(cls, 'list_per_page') and not isinstance(cls.list_per_page, int):
+        raise ImproperlyConfigured("`%s.list_per_page` should be a integer."
+                % cls.__name__)
+
+    # search_fields = ()
+    if hasattr(cls, 'search_fields'):
+        _check_istuplew('search_fields', cls.search_fields)
+        
+    # date_hierarchy = None
+    if cls.date_hierarchy:
+        f = _check_field_existsw('date_hierarchy', cls.date_hierarchy)
+        if not isinstance(f, (models.DateField, models.DateTimeField)):
+            raise ImproperlyConfigured("`%s.date_hierarchy is "
+                    "neither an instance of DateField nor DateTimeField."
+                    % cls.__name__)
+
+    # ordering = None
+    if cls.ordering:
+        _check_istuplew('ordering', cls.ordering)
+        for idx, field in enumerate(cls.ordering):
+            if field == '?' and len(cls.ordering) != 1:
+                raise ImproperlyConfigured("`%s.ordering` has the random "
+                        "ordering marker `?`, but contains other fields as "
+                        "well. Please either remove `?` or the other fields."
+                        % cls.__name__)
+            if field == '?':
+                continue
+            if field.startswith('-'):
+                field = field[1:]
+            # Skip ordering in the format field1__field2 (FIXME: checking
+            # this format would be nice, but it's a little fiddly).
+            if '__' in field:
+                continue
+            _check_field_existsw('ordering[%d]' % idx, field)
+
+    # list_select_related = False
+    # save_as = False
+    # save_on_top = False
+    for attr in ('list_select_related', 'save_as', 'save_on_top'):
+        if not isinstance(getattr(cls, attr), bool):
+            raise ImproperlyConfigured("`%s.%s` should be a boolean."
+                    % (cls.__name__, attr))
+
+    # inlines = []
+    if hasattr(cls, 'inlines'):
+        _check_istuplew('inlines', cls.inlines)
+        for idx, inline in enumerate(cls.inlines):
+            if not issubclass(inline, BaseModelAdmin):
+                raise ImproperlyConfigured("`%s.inlines[%d]` does not inherit "
+                        "from BaseModelAdmin." % (cls.__name__, idx))
+            if not inline.model:
+                raise ImproperlyConfigured("`model` is a required attribute "
+                        "of `%s.inlines[%d]`." % (cls.__name__, idx))
+            if not issubclass(inline.model, models.Model):
+                raise ImproperlyConfigured("`%s.inlines[%d].model` does not "
+                        "inherit from models.Model." % (cls.__name__, idx))
+            _validate_base(inline, inline.model)
+            _validate_inline(inline)
+            
+def _validate_inline(cls):
+    # model is already verified to exist and be a Model
+    if cls.fk_name: # default value is None
+        f = _check_field_exists(cls, cls.model, cls.model._meta,
+                'fk_name', cls.fk_name)
+        if not isinstance(f, models.ForeignKey):
+            raise ImproperlyConfigured("`%s.fk_name is not an instance of "
+                    "models.ForeignKey." % cls.__name__)
+    # extra = 3
+    # max_num = 0
+    for attr in ('extra', 'max_num'):
+        if not isinstance(getattr(cls, attr), int):
+            raise ImproperlyConfigured("`%s.%s` should be a integer."
+                    % (cls.__name__, attr))
+
+    # formset
+    if hasattr(cls, 'formset') and not issubclass(cls.formset, BaseModelFormSet):
+        raise ImproperlyConfigured("`%s.formset` does not inherit from "
+                "BaseModelFormSet." % cls.__name__)
+
+def _validate_base(cls, model):
+    opts = model._meta
+    # currying is expensive, use wrappers instead
+    def _check_istuplew(label, obj):
+        _check_istuple(cls, label, obj)
+
+    def _check_isdictw(label, obj):
+        _check_isdict(cls, label, obj)
+
+    def _check_field_existsw(label, field):
+        return _check_field_exists(cls, model, opts, label, field)
+    
+    def _check_form_field_existsw(label, field):
+        return _check_form_field_exists(cls, model, opts, label, field)
+
+    # raw_id_fields
+    if hasattr(cls, 'raw_id_fields'):
+        _check_istuplew('raw_id_fields', cls.raw_id_fields)
+        for idx, field in enumerate(cls.raw_id_fields):
+            f = _check_field_existsw('raw_id_fields', field)
+            if not isinstance(f, (models.ForeignKey, models.ManyToManyField)):
+                raise ImproperlyConfigured("`%s.raw_id_fields[%d]`, `%s` must "
+                        "be either a ForeignKey or ManyToManyField."
+                        % (cls.__name__, idx, field))
+
+    # fields
+    if cls.fields: # default value is None
+        _check_istuplew('fields', cls.fields)
+        for field in cls.fields:
+            _check_form_field_existsw('fields', field)
+        if cls.fieldsets:
+            raise ImproperlyConfigured('Both fieldsets and fields are specified in %s.' % cls.__name__)
+        if len(cls.fields) > len(set(cls.fields)):
+            raise ImproperlyConfigured('There are duplicate field(s) in %s.fields' % cls.__name__)
+
+    # fieldsets
+    if cls.fieldsets: # default value is None
+        _check_istuplew('fieldsets', cls.fieldsets)
+        for idx, fieldset in enumerate(cls.fieldsets):
+            _check_istuplew('fieldsets[%d]' % idx, fieldset)
+            if len(fieldset) != 2:
+                raise ImproperlyConfigured("`%s.fieldsets[%d]` does not "
+                        "have exactly two elements." % (cls.__name__, idx))
+            _check_isdictw('fieldsets[%d][1]' % idx, fieldset[1])
+            if 'fields' not in fieldset[1]:
+                raise ImproperlyConfigured("`fields` key is required in "
+                        "%s.fieldsets[%d][1] field options dict."
+                        % (cls.__name__, idx))
+        flattened_fieldsets = flatten_fieldsets(cls.fieldsets)
+        if len(flattened_fieldsets) > len(set(flattened_fieldsets)):
+            raise ImproperlyConfigured('There are duplicate field(s) in %s.fieldsets' % cls.__name__)
+        for field in flattened_fieldsets:
+            _check_form_field_existsw("fieldsets[%d][1]['fields']" % idx, field)
+
+    # form
+    if hasattr(cls, 'form') and not issubclass(cls.form, BaseModelForm):
+        raise ImproperlyConfigured("%s.form does not inherit from "
+                "BaseModelForm." % cls.__name__)
+
+    # filter_vertical
+    if hasattr(cls, 'filter_vertical'):
+        _check_istuplew('filter_vertical', cls.filter_vertical)
+        for idx, field in enumerate(cls.filter_vertical):
+            f = _check_field_existsw('filter_vertical', field)
+            if not isinstance(f, models.ManyToManyField):
+                raise ImproperlyConfigured("`%s.filter_vertical[%d]` must be "
+                    "a ManyToManyField." % (cls.__name__, idx))
+
+    # filter_horizontal
+    if hasattr(cls, 'filter_horizontal'):
+        _check_istuplew('filter_horizontal', cls.filter_horizontal)
+        for idx, field in enumerate(cls.filter_horizontal):
+            f = _check_field_existsw('filter_horizontal', field)
+            if not isinstance(f, models.ManyToManyField):
+                raise ImproperlyConfigured("`%s.filter_horizontal[%d]` must be "
+                    "a ManyToManyField." % (cls.__name__, idx))
+
+    # radio_fields
+    if hasattr(cls, 'radio_fields'):
+        _check_isdictw('radio_fields', cls.radio_fields)
+        for field, val in cls.radio_fields.items():
+            f = _check_field_existsw('radio_fields', field)
+            if not (isinstance(f, models.ForeignKey) or f.choices):
+                raise ImproperlyConfigured("`%s.radio_fields['%s']` "
+                        "is neither an instance of ForeignKey nor does "
+                        "have choices set." % (cls.__name__, field))
+            if not val in (HORIZONTAL, VERTICAL):
+                raise ImproperlyConfigured("`%s.radio_fields['%s']` "
+                        "is neither admin.HORIZONTAL nor admin.VERTICAL."
+                        % (cls.__name__, field))
+
+    # prepopulated_fields
+    if hasattr(cls, 'prepopulated_fields'):
+        _check_isdictw('prepopulated_fields', cls.prepopulated_fields)
+        for field, val in cls.prepopulated_fields.items():
+            f = _check_field_existsw('prepopulated_fields', field)
+            if isinstance(f, (models.DateTimeField, models.ForeignKey,
+                models.ManyToManyField)):
+                raise ImproperlyConfigured("`%s.prepopulated_fields['%s']` "
+                        "is either a DateTimeField, ForeignKey or "
+                        "ManyToManyField. This isn't allowed."
+                        % (cls.__name__, field))
+            _check_istuplew("prepopulated_fields['%s']" % field, val)
+            for idx, f in enumerate(val):
+                _check_field_existsw("prepopulated_fields['%s'][%d]"
+                        % (f, idx), f)
+
+def _check_istuple(cls, label, obj):
+    if not isinstance(obj, (list, tuple)):
+        raise ImproperlyConfigured("`%s.%s` must be a "
+                "list or tuple." % (cls.__name__, label))
+
+def _check_isdict(cls, label, obj):
+    if not isinstance(obj, dict):
+        raise ImproperlyConfigured("`%s.%s` must be a dictionary."
+                % (cls.__name__, label))
+
+def _check_field_exists(cls, model, opts, label, field):
+    try:
+        return opts.get_field(field)
+    except models.FieldDoesNotExist:
+        raise ImproperlyConfigured("`%s.%s` refers to "
+                "field `%s` that is missing from model `%s`."
+                % (cls.__name__, label, field, model.__name__))
+
+def _check_form_field_exists(cls, model, opts, label, field):
+    if hasattr(cls.form, 'base_fields'):
+        try:
+            cls.form.base_fields[field]
+        except KeyError:
+            raise ImproperlyConfigured("`%s.%s` refers to field `%s` that "
+                "is missing from the form." % (cls.__name__, label, field))
+    else:
+        fields = fields_for_model(model)
+        try:
+            fields[field]
+        except KeyError:
+            raise ImproperlyConfigured("`%s.%s` refers to field `%s` that "
+                "is missing from the form." % (cls.__name__, label, field))
+
+def _check_attr_exists(cls, model, opts, label, field):
+    try:
+        return opts.get_field(field)
+    except models.FieldDoesNotExist:
+        if not hasattr(model, field):
+            raise ImproperlyConfigured("`%s.%s` refers to "
+                    "`%s` that is neither a field, method or property "
+                    "of model `%s`."
+                    % (cls.__name__, label, field, model.__name__))
+        return getattr(model, field)
diff --git a/webapp/django/contrib/admin/views/__init__.py b/webapp/django/contrib/admin/views/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/admin/views/__init__.py
diff --git a/webapp/django/contrib/admin/views/decorators.py b/webapp/django/contrib/admin/views/decorators.py
new file mode 100644
index 0000000..f3c63ff
--- /dev/null
+++ b/webapp/django/contrib/admin/views/decorators.py
@@ -0,0 +1,114 @@
+import base64
+import cPickle as pickle
+try:
+    from functools import wraps
+except ImportError:
+    from django.utils.functional import wraps  # Python 2.3, 2.4 fallback.
+
+from django import http, template
+from django.conf import settings
+from django.contrib.auth.models import User
+from django.contrib.auth import authenticate, login
+from django.shortcuts import render_to_response
+from django.utils.translation import ugettext_lazy, ugettext as _
+from django.utils.hashcompat import md5_constructor
+
+ERROR_MESSAGE = ugettext_lazy("Please enter a correct username and password. Note that both fields are case-sensitive.")
+LOGIN_FORM_KEY = 'this_is_the_login_form'
+
+def _display_login_form(request, error_message=''):
+    request.session.set_test_cookie()
+    if request.POST and 'post_data' in request.POST:
+        # User has failed login BUT has previously saved post data.
+        post_data = request.POST['post_data']
+    elif request.POST:
+        # User's session must have expired; save their post data.
+        post_data = _encode_post_data(request.POST)
+    else:
+        post_data = _encode_post_data({})
+    return render_to_response('admin/login.html', {
+        'title': _('Log in'),
+        'app_path': request.get_full_path(),
+        'post_data': post_data,
+        'error_message': error_message
+    }, context_instance=template.RequestContext(request))
+
+def _encode_post_data(post_data):
+    pickled = pickle.dumps(post_data)
+    pickled_md5 = md5_constructor(pickled + settings.SECRET_KEY).hexdigest()
+    return base64.encodestring(pickled + pickled_md5)
+
+def _decode_post_data(encoded_data):
+    encoded_data = base64.decodestring(encoded_data)
+    pickled, tamper_check = encoded_data[:-32], encoded_data[-32:]
+    if md5_constructor(pickled + settings.SECRET_KEY).hexdigest() != tamper_check:
+        from django.core.exceptions import SuspiciousOperation
+        raise SuspiciousOperation, "User may have tampered with session cookie."
+    return pickle.loads(pickled)
+
+def staff_member_required(view_func):
+    """
+    Decorator for views that checks that the user is logged in and is a staff
+    member, displaying the login page if necessary.
+    """
+    def _checklogin(request, *args, **kwargs):
+        if request.user.is_authenticated() and request.user.is_staff:
+            # The user is valid. Continue to the admin page.
+            if 'post_data' in request.POST:
+                # User must have re-authenticated through a different window
+                # or tab.
+                request.POST = _decode_post_data(request.POST['post_data'])
+            return view_func(request, *args, **kwargs)
+
+        assert hasattr(request, 'session'), "The Django admin requires session middleware to be installed. Edit your MIDDLEWARE_CLASSES setting to insert 'django.contrib.sessions.middleware.SessionMiddleware'."
+
+        # If this isn't already the login page, display it.
+        if LOGIN_FORM_KEY not in request.POST:
+            if request.POST:
+                message = _("Please log in again, because your session has expired. Don't worry: Your submission has been saved.")
+            else:
+                message = ""
+            return _display_login_form(request, message)
+
+        # Check that the user accepts cookies.
+        if not request.session.test_cookie_worked():
+            message = _("Looks like your browser isn't configured to accept cookies. Please enable cookies, reload this page, and try again.")
+            return _display_login_form(request, message)
+        else:
+            request.session.delete_test_cookie()
+
+        # Check the password.
+        username = request.POST.get('username', None)
+        password = request.POST.get('password', None)
+        user = authenticate(username=username, password=password)
+        if user is None:
+            message = ERROR_MESSAGE
+            if '@' in username:
+                # Mistakenly entered e-mail address instead of username? Look it up.
+                users = list(User.objects.filter(email=username))
+                if len(users) == 1 and users[0].check_password(password):
+                    message = _("Your e-mail address is not your username. Try '%s' instead.") % users[0].username
+                else:
+                    # Either we cannot find the user, or if more than 1
+                    # we cannot guess which user is the correct one.
+                    message = _("Usernames cannot contain the '@' character.")
+            return _display_login_form(request, message)
+
+        # The user data is correct; log in the user in and continue.
+        else:
+            if user.is_active and user.is_staff:
+                login(request, user)
+                # TODO: set last_login with an event.
+                if 'post_data' in request.POST:
+                    post_data = _decode_post_data(request.POST['post_data'])
+                    if post_data and LOGIN_FORM_KEY not in post_data:
+                        # overwrite request.POST with the saved post_data, and continue
+                        request.POST = post_data
+                        request.user = user
+                        return view_func(request, *args, **kwargs)
+                    else:
+                        return http.HttpResponseRedirect(request.get_full_path())
+            else:
+                return _display_login_form(request, ERROR_MESSAGE)
+
+    return wraps(view_func)(_checklogin)
diff --git a/webapp/django/contrib/admin/views/main.py b/webapp/django/contrib/admin/views/main.py
new file mode 100644
index 0000000..50b0153
--- /dev/null
+++ b/webapp/django/contrib/admin/views/main.py
@@ -0,0 +1,233 @@
+from django.contrib.admin.filterspecs import FilterSpec
+from django.contrib.admin.options import IncorrectLookupParameters
+from django.contrib.admin.util import quote
+from django.core.paginator import Paginator, InvalidPage
+from django.db import models
+from django.db.models.query import QuerySet
+from django.utils.encoding import force_unicode, smart_str
+from django.utils.translation import ugettext
+from django.utils.http import urlencode
+import operator
+
+try:
+    set
+except NameError:
+    from sets import Set as set   # Python 2.3 fallback
+
+# The system will display a "Show all" link on the change list only if the
+# total result count is less than or equal to this setting.
+MAX_SHOW_ALL_ALLOWED = 200
+
+# Changelist settings
+ALL_VAR = 'all'
+ORDER_VAR = 'o'
+ORDER_TYPE_VAR = 'ot'
+PAGE_VAR = 'p'
+SEARCH_VAR = 'q'
+IS_POPUP_VAR = 'pop'
+ERROR_FLAG = 'e'
+
+# Text to display within change-list table cells if the value is blank.
+EMPTY_CHANGELIST_VALUE = '(None)'
+
+class ChangeList(object):
+    def __init__(self, request, model, list_display, list_display_links, list_filter, date_hierarchy, search_fields, list_select_related, list_per_page, model_admin):
+        self.model = model
+        self.opts = model._meta
+        self.lookup_opts = self.opts
+        self.root_query_set = model_admin.queryset(request)
+        self.list_display = list_display
+        self.list_display_links = list_display_links
+        self.list_filter = list_filter
+        self.date_hierarchy = date_hierarchy
+        self.search_fields = search_fields
+        self.list_select_related = list_select_related
+        self.list_per_page = list_per_page
+        self.model_admin = model_admin
+
+        # Get search parameters from the query string.
+        try:
+            self.page_num = int(request.GET.get(PAGE_VAR, 0))
+        except ValueError:
+            self.page_num = 0
+        self.show_all = ALL_VAR in request.GET
+        self.is_popup = IS_POPUP_VAR in request.GET
+        self.params = dict(request.GET.items())
+        if PAGE_VAR in self.params:
+            del self.params[PAGE_VAR]
+        if ERROR_FLAG in self.params:
+            del self.params[ERROR_FLAG]
+
+        self.order_field, self.order_type = self.get_ordering()
+        self.query = request.GET.get(SEARCH_VAR, '')
+        self.query_set = self.get_query_set()
+        self.get_results(request)
+        self.title = (self.is_popup and ugettext('Select %s') % force_unicode(self.opts.verbose_name) or ugettext('Select %s to change') % force_unicode(self.opts.verbose_name))
+        self.filter_specs, self.has_filters = self.get_filters(request)
+        self.pk_attname = self.lookup_opts.pk.attname
+
+    def get_filters(self, request):
+        filter_specs = []
+        if self.list_filter:
+            filter_fields = [self.lookup_opts.get_field(field_name) for field_name in self.list_filter]
+            for f in filter_fields:
+                spec = FilterSpec.create(f, request, self.params, self.model, self.model_admin)
+                if spec and spec.has_output():
+                    filter_specs.append(spec)
+        return filter_specs, bool(filter_specs)
+
+    def get_query_string(self, new_params=None, remove=None):
+        if new_params is None: new_params = {}
+        if remove is None: remove = []
+        p = self.params.copy()
+        for r in remove:
+            for k in p.keys():
+                if k.startswith(r):
+                    del p[k]
+        for k, v in new_params.items():
+            if v is None:
+                if k in p:
+                    del p[k]
+            else:
+                p[k] = v
+        return '?%s' % urlencode(p)
+
+    def get_results(self, request):
+        paginator = Paginator(self.query_set, self.list_per_page)
+        # Get the number of objects, with admin filters applied.
+        try:
+            result_count = paginator.count
+        # Naked except! Because we don't have any other way of validating
+        # "params". They might be invalid if the keyword arguments are
+        # incorrect, or if the values are not in the correct type (which would
+        # result in a database error).
+        except:
+            raise IncorrectLookupParameters
+
+        # Get the total number of objects, with no admin filters applied.
+        # Perform a slight optimization: Check to see whether any filters were
+        # given. If not, use paginator.hits to calculate the number of objects,
+        # because we've already done paginator.hits and the value is cached.
+        if not self.query_set.query.where:
+            full_result_count = result_count
+        else:
+            full_result_count = self.root_query_set.count()
+
+        can_show_all = result_count <= MAX_SHOW_ALL_ALLOWED
+        multi_page = result_count > self.list_per_page
+
+        # Get the list of objects to display on this page.
+        if (self.show_all and can_show_all) or not multi_page:
+            result_list = list(self.query_set)
+        else:
+            try:
+                result_list = paginator.page(self.page_num+1).object_list
+            except InvalidPage:
+                result_list = ()
+
+        self.result_count = result_count
+        self.full_result_count = full_result_count
+        self.result_list = result_list
+        self.can_show_all = can_show_all
+        self.multi_page = multi_page
+        self.paginator = paginator
+
+    def get_ordering(self):
+        lookup_opts, params = self.lookup_opts, self.params
+        # For ordering, first check the "ordering" parameter in the admin
+        # options, then check the object's default ordering. If neither of
+        # those exist, order descending by ID by default. Finally, look for
+        # manually-specified ordering from the query string.
+        ordering = self.model_admin.ordering or lookup_opts.ordering or ['-' + lookup_opts.pk.name]
+
+        if ordering[0].startswith('-'):
+            order_field, order_type = ordering[0][1:], 'desc'
+        else:
+            order_field, order_type = ordering[0], 'asc'
+        if ORDER_VAR in params:
+            try:
+                field_name = self.list_display[int(params[ORDER_VAR])]
+                try:
+                    f = lookup_opts.get_field(field_name)
+                except models.FieldDoesNotExist:
+                    # See whether field_name is a name of a non-field
+                    # that allows sorting.
+                    try:
+                        attr = getattr(self.model, field_name)
+                        order_field = attr.admin_order_field
+                    except AttributeError:
+                        pass
+                else:
+                    if not isinstance(f.rel, models.ManyToOneRel) or not f.null:
+                        order_field = f.name
+            except (IndexError, ValueError):
+                pass # Invalid ordering specified. Just use the default.
+        if ORDER_TYPE_VAR in params and params[ORDER_TYPE_VAR] in ('asc', 'desc'):
+            order_type = params[ORDER_TYPE_VAR]
+        return order_field, order_type
+
+    def get_query_set(self):
+        qs = self.root_query_set
+        lookup_params = self.params.copy() # a dictionary of the query string
+        for i in (ALL_VAR, ORDER_VAR, ORDER_TYPE_VAR, SEARCH_VAR, IS_POPUP_VAR):
+            if i in lookup_params:
+                del lookup_params[i]
+        for key, value in lookup_params.items():
+            if not isinstance(key, str):
+                # 'key' will be used as a keyword argument later, so Python
+                # requires it to be a string.
+                del lookup_params[key]
+                lookup_params[smart_str(key)] = value
+
+        # Apply lookup parameters from the query string.
+        qs = qs.filter(**lookup_params)
+
+        # Use select_related() if one of the list_display options is a field
+        # with a relationship.
+        if self.list_select_related:
+            qs = qs.select_related()
+        else:
+            for field_name in self.list_display:
+                try:
+                    f = self.lookup_opts.get_field(field_name)
+                except models.FieldDoesNotExist:
+                    pass
+                else:
+                    if isinstance(f.rel, models.ManyToOneRel):
+                        qs = qs.select_related()
+                        break
+
+        # Set ordering.
+        if self.order_field:
+            qs = qs.order_by('%s%s' % ((self.order_type == 'desc' and '-' or ''), self.order_field))
+
+        # Apply keyword searches.
+        def construct_search(field_name):
+            if field_name.startswith('^'):
+                return "%s__istartswith" % field_name[1:]
+            elif field_name.startswith('='):
+                return "%s__iexact" % field_name[1:]
+            elif field_name.startswith('@'):
+                return "%s__search" % field_name[1:]
+            else:
+                return "%s__icontains" % field_name
+
+        if self.search_fields and self.query:
+            for bit in self.query.split():
+                or_queries = [models.Q(**{construct_search(field_name): bit}) for field_name in self.search_fields]
+                other_qs = QuerySet(self.model)
+                other_qs.dup_select_related(qs)
+                other_qs = other_qs.filter(reduce(operator.or_, or_queries))
+                qs = qs & other_qs
+            for field_name in self.search_fields:
+                if '__' in field_name:
+                    qs = qs.distinct()
+                    break
+
+        if self.opts.one_to_one_field:
+            qs = qs.complex_filter(self.opts.one_to_one_field.rel.limit_choices_to)
+
+        return qs
+
+    def url_for_result(self, result):
+        return "%s/" % quote(getattr(result, self.pk_attname))
diff --git a/webapp/django/contrib/admin/views/template.py b/webapp/django/contrib/admin/views/template.py
new file mode 100644
index 0000000..de9320b
--- /dev/null
+++ b/webapp/django/contrib/admin/views/template.py
@@ -0,0 +1,77 @@
+from django import template, forms
+from django.contrib.admin.views.decorators import staff_member_required
+from django.template import loader
+from django.shortcuts import render_to_response
+from django.contrib.sites.models import Site
+from django.conf import settings
+from django.utils.translation import ugettext_lazy as _
+
+
+def template_validator(request):
+    """
+    Displays the template validator form, which finds and displays template
+    syntax errors.
+    """
+    # get a dict of {site_id : settings_module} for the validator
+    settings_modules = {}
+    for mod in settings.ADMIN_FOR:
+        settings_module = __import__(mod, {}, {}, [''])
+        settings_modules[settings_module.SITE_ID] = settings_module
+    site_list = Site.objects.in_bulk(settings_modules.keys()).values()
+    if request.POST:
+        form = TemplateValidatorForm(settings_modules, site_list,
+                                     data=request.POST)
+        if form.is_valid():
+            request.user.message_set.create(message='The template is valid.')
+    else:
+        form = TemplateValidatorForm(settings_modules, site_list)
+    return render_to_response('admin/template_validator.html', {
+        'title': 'Template validator',
+        'form': form,
+    }, context_instance=template.RequestContext(request))
+template_validator = staff_member_required(template_validator)
+
+
+class TemplateValidatorForm(forms.Form):
+    site = forms.ChoiceField(_('site'))
+    template = forms.CharField(
+        _('template'), widget=forms.Textarea({'rows': 25, 'cols': 80}))
+
+    def __init__(self, settings_modules, site_list, *args, **kwargs):
+        self.settings_modules = settings_modules
+        super(TemplateValidatorForm, self).__init__(*args, **kwargs)
+        self.fields['site'].choices = [(s.id, s.name) for s in site_list]
+
+    def clean_template(self):
+        # Get the settings module. If the site isn't set, we don't raise an
+        # error since the site field will.
+        try:
+            site_id = int(self.cleaned_data.get('site', None))
+        except (ValueError, TypeError):
+            return
+        settings_module = self.settings_modules.get(site_id, None)
+        if settings_module is None:
+            return
+
+        # So that inheritance works in the site's context, register a new
+        # function for "extends" that uses the site's TEMPLATE_DIRS instead.
+        def new_do_extends(parser, token):
+            node = loader.do_extends(parser, token)
+            node.template_dirs = settings_module.TEMPLATE_DIRS
+            return node
+        register = template.Library()
+        register.tag('extends', new_do_extends)
+        template.builtins.append(register)
+
+        # Now validate the template using the new TEMPLATE_DIRS, making sure to
+        # reset the extends function in any case.
+        error = None
+        template_string = self.cleaned_data['template']
+        try:
+            tmpl = loader.get_template_from_string(template_string)
+            tmpl.render(template.Context({}))
+        except template.TemplateSyntaxError, e:
+            error = e
+        template.builtins.remove(register)
+        if error:
+            raise forms.ValidationError, e.args
diff --git a/webapp/django/contrib/admin/widgets.py b/webapp/django/contrib/admin/widgets.py
new file mode 100644
index 0000000..2bfbc97
--- /dev/null
+++ b/webapp/django/contrib/admin/widgets.py
@@ -0,0 +1,238 @@
+"""
+Form Widget classes specific to the Django admin site.
+"""
+
+import copy
+
+from django import forms
+from django.forms.widgets import RadioFieldRenderer
+from django.forms.util import flatatt
+from django.utils.text import truncate_words
+from django.utils.translation import ugettext as _
+from django.utils.safestring import mark_safe
+from django.utils.encoding import force_unicode
+from django.conf import settings
+
+class FilteredSelectMultiple(forms.SelectMultiple):
+    """
+    A SelectMultiple with a JavaScript filter interface.
+
+    Note that the resulting JavaScript assumes that the SelectFilter2.js
+    library and its dependencies have been loaded in the HTML page.
+    """
+    def __init__(self, verbose_name, is_stacked, attrs=None, choices=()):
+        self.verbose_name = verbose_name
+        self.is_stacked = is_stacked
+        super(FilteredSelectMultiple, self).__init__(attrs, choices)
+
+    def render(self, name, value, attrs=None, choices=()):
+        output = [super(FilteredSelectMultiple, self).render(name, value, attrs, choices)]
+        output.append(u'<script type="text/javascript">addEvent(window, "load", function(e) {')
+        # TODO: "id_" is hard-coded here. This should instead use the correct
+        # API to determine the ID dynamically.
+        output.append(u'SelectFilter.init("id_%s", "%s", %s, "%s"); });</script>\n' % \
+            (name, self.verbose_name.replace('"', '\\"'), int(self.is_stacked), settings.ADMIN_MEDIA_PREFIX))
+        return mark_safe(u''.join(output))
+
+class AdminDateWidget(forms.TextInput):
+    class Media:
+        js = (settings.ADMIN_MEDIA_PREFIX + "js/calendar.js", 
+              settings.ADMIN_MEDIA_PREFIX + "js/admin/DateTimeShortcuts.js")
+        
+    def __init__(self, attrs={}):
+        super(AdminDateWidget, self).__init__(attrs={'class': 'vDateField', 'size': '10'})
+
+class AdminTimeWidget(forms.TextInput):
+    class Media:
+        js = (settings.ADMIN_MEDIA_PREFIX + "js/calendar.js", 
+              settings.ADMIN_MEDIA_PREFIX + "js/admin/DateTimeShortcuts.js")
+
+    def __init__(self, attrs={}):
+        super(AdminTimeWidget, self).__init__(attrs={'class': 'vTimeField', 'size': '8'})
+    
+class AdminSplitDateTime(forms.SplitDateTimeWidget):
+    """
+    A SplitDateTime Widget that has some admin-specific styling.
+    """
+    def __init__(self, attrs=None):
+        widgets = [AdminDateWidget, AdminTimeWidget]
+        # Note that we're calling MultiWidget, not SplitDateTimeWidget, because
+        # we want to define widgets.
+        forms.MultiWidget.__init__(self, widgets, attrs)
+
+    def format_output(self, rendered_widgets):
+        return mark_safe(u'<p class="datetime">%s %s<br />%s %s</p>' % \
+            (_('Date:'), rendered_widgets[0], _('Time:'), rendered_widgets[1]))
+
+class AdminRadioFieldRenderer(RadioFieldRenderer):
+    def render(self):
+        """Outputs a <ul> for this set of radio fields."""
+        return mark_safe(u'<ul%s>\n%s\n</ul>' % (
+            flatatt(self.attrs),
+            u'\n'.join([u'<li>%s</li>' % force_unicode(w) for w in self]))
+        )
+
+class AdminRadioSelect(forms.RadioSelect):
+    renderer = AdminRadioFieldRenderer
+
+class AdminFileWidget(forms.FileInput):
+    """
+    A FileField Widget that shows its current value if it has one.
+    """
+    def __init__(self, attrs={}):
+        super(AdminFileWidget, self).__init__(attrs)
+        
+    def render(self, name, value, attrs=None):
+        output = []
+        if value and hasattr(value, "url"):
+            output.append('%s <a target="_blank" href="%s">%s</a> <br />%s ' % \
+                (_('Currently:'), value.url, value, _('Change:')))
+        output.append(super(AdminFileWidget, self).render(name, value, attrs))
+        return mark_safe(u''.join(output))
+
+class ForeignKeyRawIdWidget(forms.TextInput):
+    """
+    A Widget for displaying ForeignKeys in the "raw_id" interface rather than
+    in a <select> box.
+    """
+    def __init__(self, rel, attrs=None):
+        self.rel = rel
+        super(ForeignKeyRawIdWidget, self).__init__(attrs)
+
+    def render(self, name, value, attrs=None):
+        related_url = '../../../%s/%s/' % (self.rel.to._meta.app_label, self.rel.to._meta.object_name.lower())
+        if self.rel.limit_choices_to:
+            url = '?' + '&amp;'.join(['%s=%s' % (k, v) for k, v in self.rel.limit_choices_to.items()])
+        else:
+            url = ''
+        if not attrs.has_key('class'):
+          attrs['class'] = 'vForeignKeyRawIdAdminField' # The JavaScript looks for this hook.
+        output = [super(ForeignKeyRawIdWidget, self).render(name, value, attrs)]
+        # TODO: "id_" is hard-coded here. This should instead use the correct
+        # API to determine the ID dynamically.
+        output.append('<a href="%s%s" class="related-lookup" id="lookup_id_%s" onclick="return showRelatedObjectLookupPopup(this);"> ' % \
+            (related_url, url, name))
+        output.append('<img src="%simg/admin/selector-search.gif" width="16" height="16" alt="Lookup" /></a>' % settings.ADMIN_MEDIA_PREFIX)
+        if value:
+            output.append(self.label_for_value(value))
+        return mark_safe(u''.join(output))
+    
+    def label_for_value(self, value):
+        return '&nbsp;<strong>%s</strong>' % \
+            truncate_words(self.rel.to.objects.get(pk=value), 14)
+            
+class ManyToManyRawIdWidget(ForeignKeyRawIdWidget):
+    """
+    A Widget for displaying ManyToMany ids in the "raw_id" interface rather than
+    in a <select multiple> box.
+    """
+    def __init__(self, rel, attrs=None):
+        super(ManyToManyRawIdWidget, self).__init__(rel, attrs)
+    
+    def render(self, name, value, attrs=None):
+        attrs['class'] = 'vManyToManyRawIdAdminField'
+        if value:
+            value = ','.join([str(v) for v in value])
+        else:
+            value = ''
+        return super(ManyToManyRawIdWidget, self).render(name, value, attrs)
+    
+    def label_for_value(self, value):
+        return ''
+
+    def value_from_datadict(self, data, files, name):
+        value = data.get(name, None)
+        if value and ',' in value:
+            return data[name].split(',')
+        if value:
+            return [value]
+        return None
+    
+    def _has_changed(self, initial, data):
+        if initial is None:
+            initial = []
+        if data is None:
+            data = []
+        if len(initial) != len(data):
+            return True
+        for pk1, pk2 in zip(initial, data):
+            if force_unicode(pk1) != force_unicode(pk2):
+                return True
+        return False
+
+class RelatedFieldWidgetWrapper(forms.Widget):
+    """
+    This class is a wrapper to a given widget to add the add icon for the
+    admin interface.
+    """
+    def __init__(self, widget, rel, admin_site):
+        self.is_hidden = widget.is_hidden
+        self.needs_multipart_form = widget.needs_multipart_form
+        self.attrs = widget.attrs
+        self.choices = widget.choices
+        self.widget = widget
+        self.rel = rel
+        # so we can check if the related object is registered with this AdminSite
+        self.admin_site = admin_site
+
+    def __deepcopy__(self, memo):
+        obj = copy.copy(self)
+        obj.widget = copy.deepcopy(self.widget, memo)
+        obj.attrs = self.widget.attrs
+        memo[id(self)] = obj
+        return obj
+
+    def render(self, name, value, *args, **kwargs):
+        rel_to = self.rel.to
+        related_url = '../../../%s/%s/' % (rel_to._meta.app_label, rel_to._meta.object_name.lower())
+        self.widget.choices = self.choices
+        output = [self.widget.render(name, value, *args, **kwargs)]
+        if rel_to in self.admin_site._registry: # If the related object has an admin interface:
+            # TODO: "id_" is hard-coded here. This should instead use the correct
+            # API to determine the ID dynamically.
+            output.append(u'<a href="%sadd/" class="add-another" id="add_id_%s" onclick="return showAddAnotherPopup(this);"> ' % \
+                (related_url, name))
+            output.append(u'<img src="%simg/admin/icon_addlink.gif" width="10" height="10" alt="Add Another"/></a>' % settings.ADMIN_MEDIA_PREFIX)
+        return mark_safe(u''.join(output))
+
+    def build_attrs(self, extra_attrs=None, **kwargs):
+        "Helper function for building an attribute dictionary."
+        self.attrs = self.widget.build_attrs(extra_attrs=None, **kwargs)
+        return self.attrs
+
+    def value_from_datadict(self, data, files, name):
+        return self.widget.value_from_datadict(data, files, name)
+
+    def _has_changed(self, initial, data):
+        return self.widget._has_changed(initial, data)
+
+    def id_for_label(self, id_):
+        return self.widget.id_for_label(id_)
+
+class AdminTextareaWidget(forms.Textarea):
+    def __init__(self, attrs=None):
+        final_attrs = {'class': 'vLargeTextField'}
+        if attrs is not None:
+            final_attrs.update(attrs)
+        super(AdminTextareaWidget, self).__init__(attrs=final_attrs)
+
+class AdminTextInputWidget(forms.TextInput):
+    def __init__(self, attrs=None):
+        final_attrs = {'class': 'vTextField'}
+        if attrs is not None:
+            final_attrs.update(attrs)
+        super(AdminTextInputWidget, self).__init__(attrs=final_attrs)
+
+class AdminURLFieldWidget(forms.TextInput):
+    def __init__(self, attrs=None):
+        final_attrs = {'class': 'vURLField'}
+        if attrs is not None:
+            final_attrs.update(attrs)
+        super(AdminURLFieldWidget, self).__init__(attrs=final_attrs)
+
+class AdminIntegerFieldWidget(forms.TextInput):
+    def __init__(self, attrs=None):
+        final_attrs = {'class': 'vIntegerField'}
+        if attrs is not None:
+            final_attrs.update(attrs)
+        super(AdminIntegerFieldWidget, self).__init__(attrs=final_attrs)
diff --git a/webapp/django/contrib/admindocs/__init__.py b/webapp/django/contrib/admindocs/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/admindocs/__init__.py
diff --git a/webapp/django/contrib/admindocs/templates/admin_doc/bookmarklets.html b/webapp/django/contrib/admindocs/templates/admin_doc/bookmarklets.html
new file mode 100644
index 0000000..6447529
--- /dev/null
+++ b/webapp/django/contrib/admindocs/templates/admin_doc/bookmarklets.html
@@ -0,0 +1,31 @@
+{% extends "admin/base_site.html" %}
+
+{% block breadcrumbs %}{% load i18n %}<div class="breadcrumbs"><a href="../../">{% trans "Home" %}</a> &rsaquo; <a href="../">{% trans "Documentation" %}</a> &rsaquo; {% trans "Bookmarklets" %}</div>{% endblock %}
+{% block title %}{% trans "Documentation bookmarklets" %}{% endblock %}
+
+{% block content %}
+
+{% blocktrans %}
+<p class="help">To install bookmarklets, drag the link to your bookmarks
+toolbar, or right-click the link and add it to your bookmarks. Now you can
+select the bookmarklet from any page in the site.  Note that some of these
+bookmarklets require you to be viewing the site from a computer designated
+as "internal" (talk to your system administrator if you aren't sure if
+your computer is "internal").</p>
+{% endblocktrans %}
+
+<div id="content-main">
+    <h3><a href="javascript:(function(){if(typeof ActiveXObject!='undefined'){x=new ActiveXObject('Microsoft.XMLHTTP')}else if(typeof XMLHttpRequest!='undefined'){x=new XMLHttpRequest()}else{return;}x.open('HEAD',location.href,false);x.send(null);try{view=x.getResponseHeader('x-view');}catch(e){alert('No view found for this page');return;}if(view=='undefined'){alert('No view found for this page');}document.location='{{ admin_url }}doc/views/'+view+'/';})()">{% trans "Documentation for this page" %}</a></h3>
+    <p>{% trans "Jumps you from any page to the documentation for the view that generates that page." %}</p>
+
+    <h3><a href="javascript:(function(){if(typeof ActiveXObject!='undefined'){x=new ActiveXObject('Microsoft.XMLHTTP')}else if(typeof XMLHttpRequest!='undefined'){x=new XMLHttpRequest()}else{return;}x.open('GET',location.href,false);x.send(null);try{type=x.getResponseHeader('x-object-type');id=x.getResponseHeader('x-object-id');}catch(e){type='(none)';id='(none)';}d=document;b=d.body;e=d.createElement('div');e.id='xxxhhh';s=e.style;s.position='absolute';s.left='10px';s.top='10px';s.font='10px monospace';s.border='1px black solid';s.padding='4px';s.backgroundColor='#eee';e.appendChild(d.createTextNode('Type: '+type));e.appendChild(d.createElement('br'));e.appendChild(d.createTextNode('ID: '+id));e.appendChild(d.createElement('br'));l=d.createElement('a');l.href='#';l.onclick=function(){b.removeChild(e);};l.appendChild(d.createTextNode('[close]'));l.style.textDecoration='none';e.appendChild(l);b.appendChild(e);})();">{% trans "Show object ID" %}</a></h3>
+    <p>{% trans "Shows the content-type and unique ID for pages that represent a single object." %}</p>
+
+    <h3><a href="javascript:(function(){if(typeof ActiveXObject!='undefined'){var x=new ActiveXObject('Microsoft.XMLHTTP')}else if(typeof XMLHttpRequest!='undefined'){var x=new XMLHttpRequest()}else{return;}x.open('GET',location.href,false);x.send(null);try{var type=x.getResponseHeader('x-object-type');var id=x.getResponseHeader('x-object-id');}catch(e){return;}document.location='{{ admin_url }}'+type.split('.').join('/')+'/'+id+'/';})()">{% trans "Edit this object (current window)" %}</a></h3>
+    <p>{% trans "Jumps to the admin page for pages that represent a single object." %}</p>
+
+    <h3><a href="javascript:(function(){if(typeof ActiveXObject!='undefined'){var x=new ActiveXObject('Microsoft.XMLHTTP')}else if(typeof XMLHttpRequest!='undefined'){var x=new XMLHttpRequest()}else{return;}x.open('GET',location.href,false);x.send(null);try{var type=x.getResponseHeader('x-object-type');var id=x.getResponseHeader('x-object-id');}catch(e){return;}window.open('{{ admin_url }}'+type.split('.').join('/')+'/'+id+'/');})()">{% trans "Edit this object (new window)" %}</a></h3>
+    <p>{% trans "As above, but opens the admin page in a new window." %}</p>
+</div>
+
+{% endblock %}
diff --git a/webapp/django/contrib/admindocs/templates/admin_doc/index.html b/webapp/django/contrib/admindocs/templates/admin_doc/index.html
new file mode 100644
index 0000000..242fc73
--- /dev/null
+++ b/webapp/django/contrib/admindocs/templates/admin_doc/index.html
@@ -0,0 +1,28 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="../">Home</a> &rsaquo; Documentation</div>{% endblock %}
+{% block title %}Documentation{% endblock %}
+
+{% block content %}
+
+<h1>Documentation</h1>
+
+<div id="content-main">
+  <h3><a href="tags/">Tags</a></h3>
+  <p>List of all the template tags and their functions.</p>
+
+  <h3><a href="filters/">Filters</a></h3>
+  <p>Filters are actions which can be applied to variables in a template to alter the output.</p>
+
+  <h3><a href="models/">Models</a></h3>
+  <p>Models are descriptions of all the objects in the system and their associated fields. Each model has a list of fields which can be accessed as template variables.</p>
+
+  <h3><a href="views/">Views</a></h3>
+  <p>Each page on the public site is generated by a view. The view defines which template is used to generate the page and which objects are available to that template.</p>
+
+    <h3><a href="bookmarklets/">Bookmarklets</a></h3>
+    <p>Tools for your browser to quickly access admin functionality.</p>
+</div>
+
+{% endblock %}
+
diff --git a/webapp/django/contrib/admindocs/templates/admin_doc/missing_docutils.html b/webapp/django/contrib/admindocs/templates/admin_doc/missing_docutils.html
new file mode 100644
index 0000000..97c9d47
--- /dev/null
+++ b/webapp/django/contrib/admindocs/templates/admin_doc/missing_docutils.html
@@ -0,0 +1,16 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="../">Home</a> &rsaquo; Documentation</div>{% endblock %}
+{% block title %}Please install docutils{% endblock %}
+
+{% block content %}
+
+<h1>Documentation</h1>
+
+<div id="content-main">
+  <h3>The admin documentation system requires Python's <a href="http://docutils.sf.net/">docutils</a> library.</h3>
+
+  <p>Please ask your administrators to install <a href="http://docutils.sf.net/">docutils</a>.</p>
+</div>
+
+{% endblock %}
diff --git a/webapp/django/contrib/admindocs/templates/admin_doc/model_detail.html b/webapp/django/contrib/admindocs/templates/admin_doc/model_detail.html
new file mode 100644
index 0000000..414397f
--- /dev/null
+++ b/webapp/django/contrib/admindocs/templates/admin_doc/model_detail.html
@@ -0,0 +1,46 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+{% block extrahead %}
+{{ block.super }}
+<style type="text/css">
+.module table { width:100%; }
+.module table p { padding: 0; margin: 0; }
+</style>
+{% endblock %}
+
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="../../../">Home</a> &rsaquo; <a href="../../">Documentation</a> &rsaquo; <a href="../">Models</a> &rsaquo; {{ name }}</div>{% endblock %}
+
+{% block title %}Model: {{ name }}{% endblock %}
+
+{% block content %}
+<div id="content-main">
+<h1>{{ summary }}</h1>
+
+{% if description %}
+  <p>{% filter linebreaksbr %}{% trans description %}{% endfilter %}</p>
+{% endif %}
+
+<div class="module">
+<table class="model">
+<thead>
+<tr>
+    <th>Field</th>
+    <th>Type</th>
+    <th>Description</th>
+</tr>
+</thead>
+<tbody>
+{% for field in fields|dictsort:"name" %}
+<tr>
+    <td>{{ field.name }}</td>
+    <td>{{ field.data_type }}</td>
+    <td>{% if field.verbose %}{{ field.verbose }}{% endif %}{% if field.help_text %} - {{ field.help_text|safe }}{% endif %}</td>
+</tr>
+{% endfor %}
+</tbody>
+</table>
+</div>
+
+<p class="small"><a href="../">&lsaquo; Back to Models Documentation</a></p>
+</div>
+{% endblock %}
diff --git a/webapp/django/contrib/admindocs/templates/admin_doc/model_index.html b/webapp/django/contrib/admindocs/templates/admin_doc/model_index.html
new file mode 100644
index 0000000..702fdff
--- /dev/null
+++ b/webapp/django/contrib/admindocs/templates/admin_doc/model_index.html
@@ -0,0 +1,44 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+{% block coltype %}colSM{% endblock %}
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="../../">Home</a> &rsaquo; <a href="../">Documentation</a> &rsaquo; Models</div>{% endblock %}
+
+{% block title %}Models{% endblock %}
+
+{% block content %}
+
+<h1>Model documentation</h1>
+
+{% regroup models by app_label as grouped_models %}
+
+<div id="content-main">
+{% for group in grouped_models %}
+<div class="module">
+<h2 id="{{ group.grouper }}">{{ group.grouper|capfirst }}</h2>
+
+<table class="xfull">
+{% for model in group.list %}
+<tr>
+<th><a href="{{ model.app_label }}.{{ model.object_name.lower }}/">{{ model.object_name }}</a></th>
+</tr>
+{% endfor %}
+</table>
+</div>
+{% endfor %}
+
+</div>
+{% endblock %}
+
+{% block sidebar %}
+<div id="content-related" class="sidebar">
+<div class="module">
+<h2>Model groups</h2>
+<ul>
+{% regroup models by app_label as grouped_models %}
+{% for group in grouped_models %}
+    <li><a href="#{{ group.grouper }}">{{ group.grouper|capfirst }}</a></li>
+{% endfor %}
+</ul>
+</div>
+</div>
+{% endblock %}
diff --git a/webapp/django/contrib/admindocs/templates/admin_doc/template_detail.html b/webapp/django/contrib/admindocs/templates/admin_doc/template_detail.html
new file mode 100644
index 0000000..a8b02bd
--- /dev/null
+++ b/webapp/django/contrib/admindocs/templates/admin_doc/template_detail.html
@@ -0,0 +1,21 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="../../../">Home</a> &rsaquo; <a href="../../">Documentation</a> &rsaquo; Templates &rsaquo; {{ name|escape }}</div>{% endblock %}
+
+{% block title %}Template: {{ name|escape }}{% endblock %}
+
+{% block content %}
+<h1>Template: "{{ name|escape }}"</h1>
+
+{% regroup templates|dictsort:"site_id" by site as templates_by_site %}
+{% for group in templates_by_site %}
+    <h2>Search path for template "{{ name|escape }}" on {{ group.grouper }}:</h2>
+    <ol>
+    {% for template in group.list|dictsort:"order" %}
+        <li><code>{{ template.file|escape }}</code>{% if not template.exists %} <em>(does not exist)</em>{% endif %}</li>
+    {% endfor %}
+    </ol>
+{% endfor %}
+
+<p class="small"><a href="../../">&lsaquo; Back to Documentation</a></p>
+{% endblock %}
diff --git a/webapp/django/contrib/admindocs/templates/admin_doc/template_filter_index.html b/webapp/django/contrib/admindocs/templates/admin_doc/template_filter_index.html
new file mode 100644
index 0000000..902396d
--- /dev/null
+++ b/webapp/django/contrib/admindocs/templates/admin_doc/template_filter_index.html
@@ -0,0 +1,47 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+{% block coltype %}colSM{% endblock %}
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="../../">Home</a> &rsaquo; <a href="../">Documentation</a> &rsaquo; filters</div>{% endblock %}
+{% block title %}Template filters{% endblock %}
+
+{% block content %}
+
+<h1>Template filter documentation</h1>
+
+<div id="content-main">
+{% regroup filters|dictsort:"library" by library as filter_libraries %}
+{% for library in filter_libraries %}
+<div class="module">
+    <h2>{% if library.grouper %}{{ library.grouper }}{% else %}Built-in filters{% endif %}</h2>
+    {% if library.grouper %}<p class="small quiet">To use these filters, put <code>{% templatetag openblock %} load {{ library.grouper }} {% templatetag closeblock %}</code> in your template before using the filter.</p><hr />{% endif %}
+    {% for filter in library.list|dictsort:"name" %}
+    <h3 id="{{ filter.name }}">{{ filter.name }}</h3>
+    <p>{{ filter.title }}</p>
+    <p>{{ filter.body }}</p>
+    {% if not forloop.last %}<hr />{% endif %}
+    {% endfor %}
+</div>
+{% endfor %}
+</div>
+
+{% endblock %}
+
+{% block sidebar %}
+
+<div id="content-related">
+
+{% regroup filters|dictsort:"library" by library as filter_libraries %}
+{% for library in filter_libraries %}
+<div class="module">
+    <h2>{% if library.grouper %}{{ library.grouper }}{% else %}Built-in filters{% endif %}</h2>
+    <ul>
+    {% for filter in library.list|dictsort:"name" %}
+        <li><a href="#{{ filter.name }}">{{ filter.name }}</a></li>
+    {% endfor %}
+    </ul>
+</div>
+{% endfor %}
+
+</div>
+
+{% endblock %}
diff --git a/webapp/django/contrib/admindocs/templates/admin_doc/template_tag_index.html b/webapp/django/contrib/admindocs/templates/admin_doc/template_tag_index.html
new file mode 100644
index 0000000..ea49529
--- /dev/null
+++ b/webapp/django/contrib/admindocs/templates/admin_doc/template_tag_index.html
@@ -0,0 +1,47 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+{% block coltype %}colSM{% endblock %}
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="../../">Home</a> &rsaquo; <a href="../">Documentation</a> &rsaquo; Tags</div>{% endblock %}
+{% block title %}Template tags{% endblock %}
+
+{% block content %}
+
+<h1>Template tag documentation</h1>
+
+<div id="content-main">
+{% regroup tags|dictsort:"library" by library as tag_libraries %}
+{% for library in tag_libraries %}
+<div class="module">
+    <h2>{% if library.grouper %}{{ library.grouper }}{% else %}Built-in tags{% endif %}</h2>
+    {% if library.grouper %}<p class="small quiet">To use these tags, put <code>{% templatetag openblock %} load {{ library.grouper }} {% templatetag closeblock %}</code> in your template before using the tag.</p><hr />{% endif %}
+    {% for tag in library.list|dictsort:"name" %}
+    <h3 id="{{ tag.name }}">{{ tag.name }}</h3>
+    <h4>{{ tag.title }}</h4>
+    <p>{{ tag.body }}</p>
+    {% if not forloop.last %}<hr />{% endif %}
+    {% endfor %}
+</div>
+{% endfor %}
+</div>
+
+{% endblock %}
+
+{% block sidebar %}
+
+<div id="content-related">
+
+{% regroup tags|dictsort:"library" by library as tag_libraries %}
+{% for library in tag_libraries %}
+<div class="module">
+    <h2>{% if library.grouper %}{{ library.grouper }}{% else %}Built-in tags{% endif %}</h2>
+    <ul>
+    {% for tag in library.list|dictsort:"name" %}
+        <li><a href="#{{ tag.name }}">{{ tag.name }}</a></li>
+    {% endfor %}
+    </ul>
+</div>
+{% endfor %}
+
+</div>
+
+{% endblock %}
diff --git a/webapp/django/contrib/admindocs/templates/admin_doc/view_detail.html b/webapp/django/contrib/admindocs/templates/admin_doc/view_detail.html
new file mode 100644
index 0000000..d7415ab
--- /dev/null
+++ b/webapp/django/contrib/admindocs/templates/admin_doc/view_detail.html
@@ -0,0 +1,25 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="../../../">Home</a> &rsaquo; <a href="../../">Documentation</a> &rsaquo; <a href="../">Views</a> &rsaquo; {{ name }}</div>{% endblock %}
+{% block title %}View: {{ name }}{% endblock %}
+
+{% block content %}
+
+<h1>{{ name }}</h1>
+
+<h2 class="subhead">{{ summary }}</h2>
+
+<p>{{ body }}</p>
+
+{% if meta.Context %}
+<h3>Context:</h3>
+<p>{{ meta.Context }}</p>
+{% endif %}
+
+{% if meta.Templates %}
+<h3>Templates:</h3>
+<p>{{ meta.Templates }}</p>
+{% endif %}
+
+<p class="small"><a href="../">&lsaquo; Back to Views Documentation</a></p>
+{% endblock %}
diff --git a/webapp/django/contrib/admindocs/templates/admin_doc/view_index.html b/webapp/django/contrib/admindocs/templates/admin_doc/view_index.html
new file mode 100644
index 0000000..4099005
--- /dev/null
+++ b/webapp/django/contrib/admindocs/templates/admin_doc/view_index.html
@@ -0,0 +1,43 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+{% block coltype %}colSM{% endblock %}
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="../../">Home</a> &rsaquo; <a href="../">Documentation</a> &rsaquo; Views</div>{% endblock %}
+{% block title %}Views{% endblock %}
+
+{% block content %}
+
+<h1>View documentation</h1>
+
+{% regroup views|dictsort:"site_id" by site as views_by_site %}
+
+<div id="content-related" class="sidebar">
+<div class="module">
+<h2>Jump to site</h2>
+<ul>
+    {% for site_views in views_by_site %}
+    <li><a href="#site{{ site_views.grouper.id }}">{{ site_views.grouper.name }}</a></li>
+    {% endfor %}
+</ul>
+</div>
+</div>
+
+<div id="content-main">
+
+{% for site_views in views_by_site %}
+<div class="module">
+<h2 id="site{{ site_views.grouper.id }}">Views by URL on {{ site_views.grouper.name }}</h2>
+
+{% for view in site_views.list|dictsort:"url" %}
+{% ifchanged %}
+<h3><a href="{{ view.module }}.{{ view.name }}/">{{ view.url|escape }}</a></h3>
+<p class="small quiet">View function: {{ view.module }}.{{ view.name }}</p>
+<p>{{ view.title }}</p>
+<hr />
+{% endifchanged %}
+{% endfor %}
+</div>
+{% endfor %}
+</div>
+{% endblock %}
+
+
diff --git a/webapp/django/contrib/admindocs/urls.py b/webapp/django/contrib/admindocs/urls.py
new file mode 100644
index 0000000..e7baa76
--- /dev/null
+++ b/webapp/django/contrib/admindocs/urls.py
@@ -0,0 +1,15 @@
+from django.conf.urls.defaults import *
+from django.contrib.admindocs import views
+
+urlpatterns = patterns('',
+    ('^$', views.doc_index),
+    ('^bookmarklets/$', views.bookmarklets),
+    ('^tags/$', views.template_tag_index),
+    ('^filters/$', views.template_filter_index),
+    ('^views/$', views.view_index),
+    ('^views/(?P<view>[^/]+)/$', views.view_detail),
+    ('^models/$', views.model_index),
+    ('^models/(?P<app_label>[^\.]+)\.(?P<model_name>[^/]+)/$', views.model_detail),
+#    ('^templates/$', views.template_index),
+    ('^templates/(?P<template>.*)/$', views.template_detail),
+)
diff --git a/webapp/django/contrib/admindocs/utils.py b/webapp/django/contrib/admindocs/utils.py
new file mode 100644
index 0000000..4a45a62
--- /dev/null
+++ b/webapp/django/contrib/admindocs/utils.py
@@ -0,0 +1,103 @@
+"Misc. utility functions/classes for admin documentation generator."
+
+import re
+from email.Parser import HeaderParser
+from email.Errors import HeaderParseError
+from django.utils.safestring import mark_safe
+try:
+    import docutils.core
+    import docutils.nodes
+    import docutils.parsers.rst.roles
+except ImportError:
+    docutils_is_available = False
+else:
+    docutils_is_available = True
+
+def trim_docstring(docstring):
+    """
+    Uniformly trims leading/trailing whitespace from docstrings.
+
+    Based on http://www.python.org/peps/pep-0257.html#handling-docstring-indentation
+    """
+    if not docstring or not docstring.strip():
+        return ''
+    # Convert tabs to spaces and split into lines
+    lines = docstring.expandtabs().splitlines()
+    indent = min([len(line) - len(line.lstrip()) for line in lines if line.lstrip()])
+    trimmed = [lines[0].lstrip()] + [line[indent:].rstrip() for line in lines[1:]]
+    return "\n".join(trimmed).strip()
+
+def parse_docstring(docstring):
+    """
+    Parse out the parts of a docstring.  Returns (title, body, metadata).
+    """
+    docstring = trim_docstring(docstring)
+    parts = re.split(r'\n{2,}', docstring)
+    title = parts[0]
+    if len(parts) == 1:
+        body = ''
+        metadata = {}
+    else:
+        parser = HeaderParser()
+        try:
+            metadata = parser.parsestr(parts[-1])
+        except HeaderParseError:
+            metadata = {}
+            body = "\n\n".join(parts[1:])
+        else:
+            metadata = dict(metadata.items())
+            if metadata:
+                body = "\n\n".join(parts[1:-1])
+            else:
+                body = "\n\n".join(parts[1:])
+    return title, body, metadata
+
+def parse_rst(text, default_reference_context, thing_being_parsed=None, link_base='../..'):
+    """
+    Convert the string from reST to an XHTML fragment.
+    """
+    overrides = {
+        'doctitle_xform' : True,
+        'inital_header_level' : 3,
+        "default_reference_context" : default_reference_context,
+        "link_base" : link_base,
+    }
+    if thing_being_parsed:
+        thing_being_parsed = "<%s>" % thing_being_parsed
+    parts = docutils.core.publish_parts(text, source_path=thing_being_parsed,
+                destination_path=None, writer_name='html',
+                settings_overrides=overrides)
+    return mark_safe(parts['fragment'])
+
+#
+# reST roles
+#
+ROLES = {
+    'model'    : '%s/models/%s/',
+    'view'     : '%s/views/%s/',
+    'template' : '%s/templates/%s/',
+    'filter'   : '%s/filters/#%s',
+    'tag'      : '%s/tags/#%s',
+}
+
+def create_reference_role(rolename, urlbase):
+    def _role(name, rawtext, text, lineno, inliner, options=None, content=None):
+        if options is None: options = {}
+        if content is None: content = []
+        node = docutils.nodes.reference(rawtext, text, refuri=(urlbase % (inliner.document.settings.link_base, text.lower())), **options)
+        return [node], []
+    docutils.parsers.rst.roles.register_canonical_role(rolename, _role)
+
+def default_reference_role(name, rawtext, text, lineno, inliner, options=None, content=None):
+    if options is None: options = {}
+    if content is None: content = []
+    context = inliner.document.settings.default_reference_context
+    node = docutils.nodes.reference(rawtext, text, refuri=(ROLES[context] % (inliner.document.settings.link_base, text.lower())), **options)
+    return [node], []
+
+if docutils_is_available:
+    docutils.parsers.rst.roles.register_canonical_role('cmsreference', default_reference_role)
+    docutils.parsers.rst.roles.DEFAULT_INTERPRETED_ROLE = 'cmsreference'
+
+    for name, urlbase in ROLES.items():
+        create_reference_role(name, urlbase)
diff --git a/webapp/django/contrib/admindocs/views.py b/webapp/django/contrib/admindocs/views.py
new file mode 100644
index 0000000..d6d263c
--- /dev/null
+++ b/webapp/django/contrib/admindocs/views.py
@@ -0,0 +1,392 @@
+from django import template, templatetags
+from django.template import RequestContext
+from django.conf import settings
+from django.contrib.admin.views.decorators import staff_member_required
+from django.db import models
+from django.shortcuts import render_to_response
+from django.core.exceptions import ImproperlyConfigured, ViewDoesNotExist
+from django.http import Http404
+from django.core import urlresolvers
+from django.contrib.admindocs import utils
+from django.contrib.sites.models import Site
+from django.utils.translation import ugettext as _
+from django.utils.safestring import mark_safe
+import inspect, os, re
+
+# Exclude methods starting with these strings from documentation
+MODEL_METHODS_EXCLUDE = ('_', 'add_', 'delete', 'save', 'set_')
+
+class GenericSite(object):
+    domain = 'example.com'
+    name = 'my site'
+
+def doc_index(request):
+    if not utils.docutils_is_available:
+        return missing_docutils_page(request)
+    root_path = re.sub(re.escape('doc/') + '$', '', request.path)
+    return render_to_response('admin_doc/index.html', {
+        'root_path': root_path,
+    }, context_instance=RequestContext(request))
+doc_index = staff_member_required(doc_index)
+
+def bookmarklets(request):
+    # Hack! This couples this view to the URL it lives at.
+    admin_root = request.path[:-len('doc/bookmarklets/')]
+    root_path = re.sub(re.escape('doc/bookmarklets/') + '$', '', request.path)
+    return render_to_response('admin_doc/bookmarklets.html', {
+        'root_path': root_path,
+        'admin_url': mark_safe("%s://%s%s" % (request.is_secure() and 'https' or 'http', request.get_host(), admin_root)),
+    }, context_instance=RequestContext(request))
+bookmarklets = staff_member_required(bookmarklets)
+
+def template_tag_index(request):
+    if not utils.docutils_is_available:
+        return missing_docutils_page(request)
+
+    load_all_installed_template_libraries()
+
+    tags = []
+    for module_name, library in template.libraries.items():
+        for tag_name, tag_func in library.tags.items():
+            title, body, metadata = utils.parse_docstring(tag_func.__doc__)
+            if title:
+                title = utils.parse_rst(title, 'tag', _('tag:') + tag_name)
+            if body:
+                body = utils.parse_rst(body, 'tag', _('tag:') + tag_name)
+            for key in metadata:
+                metadata[key] = utils.parse_rst(metadata[key], 'tag', _('tag:') + tag_name)
+            if library in template.builtins:
+                tag_library = None
+            else:
+                tag_library = module_name.split('.')[-1]
+            tags.append({
+                'name': tag_name,
+                'title': title,
+                'body': body,
+                'meta': metadata,
+                'library': tag_library,
+            })
+    root_path = re.sub(re.escape('doc/tags/') + '$', '', request.path)
+    return render_to_response('admin_doc/template_tag_index.html', {
+        'root_path': root_path,
+        'tags': tags
+    }, context_instance=RequestContext(request))
+template_tag_index = staff_member_required(template_tag_index)
+
+def template_filter_index(request):
+    if not utils.docutils_is_available:
+        return missing_docutils_page(request)
+
+    load_all_installed_template_libraries()
+
+    filters = []
+    for module_name, library in template.libraries.items():
+        for filter_name, filter_func in library.filters.items():
+            title, body, metadata = utils.parse_docstring(filter_func.__doc__)
+            if title:
+                title = utils.parse_rst(title, 'filter', _('filter:') + filter_name)
+            if body:
+                body = utils.parse_rst(body, 'filter', _('filter:') + filter_name)
+            for key in metadata:
+                metadata[key] = utils.parse_rst(metadata[key], 'filter', _('filter:') + filter_name)
+            if library in template.builtins:
+                tag_library = None
+            else:
+                tag_library = module_name.split('.')[-1]
+            filters.append({
+                'name': filter_name,
+                'title': title,
+                'body': body,
+                'meta': metadata,
+                'library': tag_library,
+            })
+    root_path = re.sub(re.escape('doc/filters/') + '$', '', request.path)
+    return render_to_response('admin_doc/template_filter_index.html', {
+        'root_path': root_path,
+        'filters': filters
+    }, context_instance=RequestContext(request))
+template_filter_index = staff_member_required(template_filter_index)
+
+def view_index(request):
+    if not utils.docutils_is_available:
+        return missing_docutils_page(request)
+
+    if settings.ADMIN_FOR:
+        settings_modules = [__import__(m, {}, {}, ['']) for m in settings.ADMIN_FOR]
+    else:
+        settings_modules = [settings]
+
+    views = []
+    for settings_mod in settings_modules:
+        urlconf = __import__(settings_mod.ROOT_URLCONF, {}, {}, [''])
+        view_functions = extract_views_from_urlpatterns(urlconf.urlpatterns)
+        if Site._meta.installed:
+            site_obj = Site.objects.get(pk=settings_mod.SITE_ID)
+        else:
+            site_obj = GenericSite()
+        for (func, regex) in view_functions:
+            views.append({
+                'name': func.__name__,
+                'module': func.__module__,
+                'site_id': settings_mod.SITE_ID,
+                'site': site_obj,
+                'url': simplify_regex(regex),
+            })
+    root_path = re.sub(re.escape('doc/views/') + '$', '', request.path)
+    return render_to_response('admin_doc/view_index.html', {
+        'root_path': root_path,
+        'views': views
+    }, context_instance=RequestContext(request))
+view_index = staff_member_required(view_index)
+
+def view_detail(request, view):
+    if not utils.docutils_is_available:
+        return missing_docutils_page(request)
+
+    mod, func = urlresolvers.get_mod_func(view)
+    try:
+        view_func = getattr(__import__(mod, {}, {}, ['']), func)
+    except (ImportError, AttributeError):
+        raise Http404
+    title, body, metadata = utils.parse_docstring(view_func.__doc__)
+    if title:
+        title = utils.parse_rst(title, 'view', _('view:') + view)
+    if body:
+        body = utils.parse_rst(body, 'view', _('view:') + view)
+    for key in metadata:
+        metadata[key] = utils.parse_rst(metadata[key], 'model', _('view:') + view)
+    root_path = re.sub(re.escape('doc/views/%s/' % view) + '$', '', request.path)
+    return render_to_response('admin_doc/view_detail.html', {
+        'root_path': root_path,
+        'name': view,
+        'summary': title,
+        'body': body,
+        'meta': metadata,
+    }, context_instance=RequestContext(request))
+view_detail = staff_member_required(view_detail)
+
+def model_index(request):
+    if not utils.docutils_is_available:
+        return missing_docutils_page(request)
+    m_list = [m._meta for m in models.get_models()]
+    root_path = re.sub(re.escape('doc/models/') + '$', '', request.path)
+    return render_to_response('admin_doc/model_index.html', {
+        'root_path': root_path,
+        'models': m_list
+    }, context_instance=RequestContext(request))
+model_index = staff_member_required(model_index)
+
+def model_detail(request, app_label, model_name):
+    if not utils.docutils_is_available:
+        return missing_docutils_page(request)
+        
+    # Get the model class.
+    try:
+        app_mod = models.get_app(app_label)
+    except ImproperlyConfigured:
+        raise Http404, _("App %r not found") % app_label
+    model = None
+    for m in models.get_models(app_mod):
+        if m._meta.object_name.lower() == model_name:
+            model = m
+            break
+    if model is None:
+        raise Http404, _("Model %(model_name)r not found in app %(app_label)r") % {'model_name': model_name, 'app_label': app_label}
+
+    opts = model._meta
+
+    # Gather fields/field descriptions.
+    fields = []
+    for field in opts.fields:
+        # ForeignKey is a special case since the field will actually be a
+        # descriptor that returns the other object
+        if isinstance(field, models.ForeignKey):
+            data_type = related_object_name = field.rel.to.__name__
+            app_label = field.rel.to._meta.app_label
+            verbose = utils.parse_rst((_("the related `%(app_label)s.%(data_type)s` object")  % {'app_label': app_label, 'data_type': data_type}), 'model', _('model:') + data_type)
+        else:
+            data_type = get_readable_field_data_type(field)
+            verbose = field.verbose_name
+        fields.append({
+            'name': field.name,
+            'data_type': data_type,
+            'verbose': verbose,
+            'help_text': field.help_text,
+        })
+
+    # Gather model methods.
+    for func_name, func in model.__dict__.items():
+        if (inspect.isfunction(func) and len(inspect.getargspec(func)[0]) == 1):
+            try:
+                for exclude in MODEL_METHODS_EXCLUDE:
+                    if func_name.startswith(exclude):
+                        raise StopIteration
+            except StopIteration:
+                continue
+            verbose = func.__doc__
+            if verbose:
+                verbose = utils.parse_rst(utils.trim_docstring(verbose), 'model', _('model:') + opts.module_name)
+            fields.append({
+                'name': func_name,
+                'data_type': get_return_data_type(func_name),
+                'verbose': verbose,
+            })
+
+    # Gather related objects
+    for rel in opts.get_all_related_objects():
+        verbose = _("related `%(app_label)s.%(object_name)s` objects") % {'app_label': rel.opts.app_label, 'object_name': rel.opts.object_name}
+        accessor = rel.get_accessor_name()
+        fields.append({
+            'name'      : "%s.all" % accessor,
+            'data_type' : 'List',
+            'verbose'   : utils.parse_rst(_("all %s") % verbose , 'model', _('model:') + opts.module_name),
+        })
+        fields.append({
+            'name'      : "%s.count" % accessor,
+            'data_type' : 'Integer',
+            'verbose'   : utils.parse_rst(_("number of %s") % verbose , 'model', _('model:') + opts.module_name),
+        })
+    root_path = re.sub(re.escape('doc/models/%s.%s/' % (app_label, model_name)) + '$', '', request.path)
+    return render_to_response('admin_doc/model_detail.html', {
+        'root_path': root_path,
+        'name': '%s.%s' % (opts.app_label, opts.object_name),
+        'summary': _("Fields on %s objects") % opts.object_name,
+        'description': model.__doc__,
+        'fields': fields,
+    }, context_instance=RequestContext(request))
+model_detail = staff_member_required(model_detail)
+
+def template_detail(request, template):
+    templates = []
+    for site_settings_module in settings.ADMIN_FOR:
+        settings_mod = __import__(site_settings_module, {}, {}, [''])
+        if Site._meta.installed:
+            site_obj = Site.objects.get(pk=settings_mod.SITE_ID)
+        else:
+            site_obj = GenericSite()
+        for dir in settings_mod.TEMPLATE_DIRS:
+            template_file = os.path.join(dir, "%s.html" % template)
+            templates.append({
+                'file': template_file,
+                'exists': os.path.exists(template_file),
+                'contents': lambda: os.path.exists(template_file) and open(template_file).read() or '',
+                'site_id': settings_mod.SITE_ID,
+                'site': site_obj,
+                'order': list(settings_mod.TEMPLATE_DIRS).index(dir),
+            })
+    root_path = re.sub(re.escape('doc/templates/%s/' % template) + '$', '', request.path)
+    return render_to_response('admin_doc/template_detail.html', {
+        'root_path': root_path,
+        'name': template,
+        'templates': templates,
+    }, context_instance=RequestContext(request))
+template_detail = staff_member_required(template_detail)
+
+####################
+# Helper functions #
+####################
+
+def missing_docutils_page(request):
+    """Display an error message for people without docutils"""
+    return render_to_response('admin_doc/missing_docutils.html')
+
+def load_all_installed_template_libraries():
+    # Load/register all template tag libraries from installed apps.
+    for e in templatetags.__path__:
+        libraries = [os.path.splitext(p)[0] for p in os.listdir(e) if p.endswith('.py') and p[0].isalpha()]
+        for library_name in libraries:
+            try:
+                lib = template.get_library("django.templatetags.%s" % library_name.split('.')[-1])
+            except template.InvalidTemplateLibrary:
+                pass
+
+def get_return_data_type(func_name):
+    """Return a somewhat-helpful data type given a function name"""
+    if func_name.startswith('get_'):
+        if func_name.endswith('_list'):
+            return 'List'
+        elif func_name.endswith('_count'):
+            return 'Integer'
+    return ''
+
+# Maps Field objects to their human-readable data types, as strings.
+# Column-type strings can contain format strings; they'll be interpolated
+# against the values of Field.__dict__ before being output.
+# If a column type is set to None, it won't be included in the output.
+DATA_TYPE_MAPPING = {
+    'AutoField'                 : _('Integer'),
+    'BooleanField'              : _('Boolean (Either True or False)'),
+    'CharField'                 : _('String (up to %(max_length)s)'),
+    'CommaSeparatedIntegerField': _('Comma-separated integers'),
+    'DateField'                 : _('Date (without time)'),
+    'DateTimeField'             : _('Date (with time)'),
+    'DecimalField'              : _('Decimal number'),
+    'EmailField'                : _('E-mail address'),
+    'FileField'                 : _('File path'),
+    'FilePathField'             : _('File path'),
+    'FloatField'                : _('Floating point number'),
+    'ForeignKey'                : _('Integer'),
+    'ImageField'                : _('File path'),
+    'IntegerField'              : _('Integer'),
+    'IPAddressField'            : _('IP address'),
+    'ManyToManyField'           : '',
+    'NullBooleanField'          : _('Boolean (Either True, False or None)'),
+    'OneToOneField'             : _('Relation to parent model'),
+    'PhoneNumberField'          : _('Phone number'),
+    'PositiveIntegerField'      : _('Integer'),
+    'PositiveSmallIntegerField' : _('Integer'),
+    'SlugField'                 : _('String (up to %(max_length)s)'),
+    'SmallIntegerField'         : _('Integer'),
+    'TextField'                 : _('Text'),
+    'TimeField'                 : _('Time'),
+    'URLField'                  : _('URL'),
+    'USStateField'              : _('U.S. state (two uppercase letters)'),
+    'XMLField'                  : _('XML text'),
+}
+
+def get_readable_field_data_type(field):
+    return DATA_TYPE_MAPPING[field.get_internal_type()] % field.__dict__
+
+def extract_views_from_urlpatterns(urlpatterns, base=''):
+    """
+    Return a list of views from a list of urlpatterns.
+
+    Each object in the returned list is a two-tuple: (view_func, regex)
+    """
+    views = []
+    for p in urlpatterns:
+        if hasattr(p, '_get_callback'):
+            try:
+                views.append((p._get_callback(), base + p.regex.pattern))
+            except ViewDoesNotExist:
+                continue
+        elif hasattr(p, '_get_url_patterns'):
+            try:
+                patterns = p.url_patterns
+            except ImportError:
+                continue
+            views.extend(extract_views_from_urlpatterns(patterns, base + p.regex.pattern))
+        else:
+            raise TypeError, _("%s does not appear to be a urlpattern object") % p
+    return views
+
+named_group_matcher = re.compile(r'\(\?P(<\w+>).+?\)')
+non_named_group_matcher = re.compile(r'\(.*?\)')
+
+def simplify_regex(pattern):
+    """
+    Clean up urlpattern regexes into something somewhat readable by Mere Humans:
+    turns something like "^(?P<sport_slug>\w+)/athletes/(?P<athlete_slug>\w+)/$"
+    into "<sport_slug>/athletes/<athlete_slug>/"
+    """
+    # handle named groups first
+    pattern = named_group_matcher.sub(lambda m: m.group(1), pattern)
+
+    # handle non-named groups
+    pattern = non_named_group_matcher.sub("<var>", pattern)
+
+    # clean up any outstanding regex-y characters.
+    pattern = pattern.replace('^', '').replace('$', '').replace('?', '').replace('//', '/').replace('\\', '')
+    if not pattern.startswith('/'):
+        pattern = '/' + pattern
+    return pattern
diff --git a/webapp/django/contrib/auth/__init__.py b/webapp/django/contrib/auth/__init__.py
new file mode 100644
index 0000000..87c2bc1
--- /dev/null
+++ b/webapp/django/contrib/auth/__init__.py
@@ -0,0 +1,89 @@
+import datetime
+from django.core.exceptions import ImproperlyConfigured
+
+SESSION_KEY = '_auth_user_id'
+BACKEND_SESSION_KEY = '_auth_user_backend'
+REDIRECT_FIELD_NAME = 'next'
+
+def load_backend(path):
+    i = path.rfind('.')
+    module, attr = path[:i], path[i+1:]
+    try:
+        mod = __import__(module, {}, {}, [attr])
+    except ImportError, e:
+        raise ImproperlyConfigured, 'Error importing authentication backend %s: "%s"' % (module, e)
+    except ValueError, e:
+        raise ImproperlyConfigured, 'Error importing authentication backends. Is AUTHENTICATION_BACKENDS a correctly defined list or tuple?'
+    try:
+        cls = getattr(mod, attr)
+    except AttributeError:
+        raise ImproperlyConfigured, 'Module "%s" does not define a "%s" authentication backend' % (module, attr)
+    return cls()
+
+def get_backends():
+    from django.conf import settings
+    backends = []
+    for backend_path in settings.AUTHENTICATION_BACKENDS:
+        backends.append(load_backend(backend_path))
+    return backends
+
+def authenticate(**credentials):
+    """
+    If the given credentials are valid, return a User object.
+    """
+    for backend in get_backends():
+        try:
+            user = backend.authenticate(**credentials)
+        except TypeError:
+            # This backend doesn't accept these credentials as arguments. Try the next one.
+            continue
+        if user is None:
+            continue
+        # Annotate the user object with the path of the backend.
+        user.backend = "%s.%s" % (backend.__module__, backend.__class__.__name__)
+        return user
+
+def login(request, user):
+    """
+    Persist a user id and a backend in the request. This way a user doesn't
+    have to reauthenticate on every request.
+    """
+    if user is None:
+        user = request.user
+    # TODO: It would be nice to support different login methods, like signed cookies.
+    user.last_login = datetime.datetime.now()
+    user.save()
+
+    if SESSION_KEY in request.session:
+        if request.session[SESSION_KEY] != user.id:
+            # To avoid reusing another user's session, create a new, empty
+            # session if the existing session corresponds to a different
+            # authenticated user.
+            request.session.flush()
+    else:
+        request.session.cycle_key()
+    request.session[SESSION_KEY] = user.id
+    request.session[BACKEND_SESSION_KEY] = user.backend
+    if hasattr(request, 'user'):
+        request.user = user
+
+def logout(request):
+    """
+    Removes the authenticated user's ID from the request and flushes their
+    session data.
+    """
+    request.session.flush()
+    if hasattr(request, 'user'):
+        from django.contrib.auth.models import AnonymousUser
+        request.user = AnonymousUser()
+
+def get_user(request):
+    from django.contrib.auth.models import AnonymousUser
+    try:
+        user_id = request.session[SESSION_KEY]
+        backend_path = request.session[BACKEND_SESSION_KEY]
+        backend = load_backend(backend_path)
+        user = backend.get_user(user_id) or AnonymousUser()
+    except KeyError:
+        user = AnonymousUser()
+    return user
diff --git a/webapp/django/contrib/auth/admin.py b/webapp/django/contrib/auth/admin.py
new file mode 100644
index 0000000..873d29f
--- /dev/null
+++ b/webapp/django/contrib/auth/admin.py
@@ -0,0 +1,111 @@
+
+from django.contrib.auth.models import User, Group
+from django.core.exceptions import PermissionDenied
+from django import template
+from django.shortcuts import render_to_response, get_object_or_404
+from django.template import RequestContext
+from django.utils.html import escape
+from django.http import HttpResponseRedirect
+from django.utils.translation import ugettext, ugettext_lazy as _
+from django.contrib.auth.forms import UserCreationForm, AdminPasswordChangeForm
+from django.contrib import admin
+
+class GroupAdmin(admin.ModelAdmin):
+    search_fields = ('name',)
+    ordering = ('name',)
+    filter_horizontal = ('permissions',)
+
+class UserAdmin(admin.ModelAdmin):
+    fieldsets = (
+        (None, {'fields': ('username', 'password')}),
+        (_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}),
+        (_('Permissions'), {'fields': ('is_staff', 'is_active', 'is_superuser', 'user_permissions')}),
+        (_('Important dates'), {'fields': ('last_login', 'date_joined')}),
+        (_('Groups'), {'fields': ('groups',)}),
+    )
+    add_form = UserCreationForm
+    change_password_form = AdminPasswordChangeForm
+    list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff')
+    list_filter = ('is_staff', 'is_superuser')
+    search_fields = ('username', 'first_name', 'last_name', 'email')
+    ordering = ('username',)
+    filter_horizontal = ('user_permissions',)
+
+    def __call__(self, request, url):
+        # this should not be here, but must be due to the way __call__ routes
+        # in ModelAdmin.
+        if url is None:
+            return self.changelist_view(request)
+        if url.endswith('password'):
+            return self.user_change_password(request, url.split('/')[0])
+        return super(UserAdmin, self).__call__(request, url)
+
+    def add_view(self, request):
+        if not self.has_change_permission(request):
+            raise PermissionDenied
+        if request.method == 'POST':
+            form = self.add_form(request.POST)
+            if form.is_valid():
+                new_user = form.save()
+                msg = _('The %(name)s "%(obj)s" was added successfully.') % {'name': 'user', 'obj': new_user}
+                self.log_addition(request, new_user)
+                if "_addanother" in request.POST:
+                    request.user.message_set.create(message=msg)
+                    return HttpResponseRedirect(request.path)
+                else:
+                    request.user.message_set.create(message=msg + ' ' + ugettext("You may edit it again below."))
+                    return HttpResponseRedirect('../%s/' % new_user.id)
+        else:
+            form = self.add_form()
+        return render_to_response('admin/auth/user/add_form.html', {
+            'title': _('Add user'),
+            'form': form,
+            'is_popup': '_popup' in request.REQUEST,
+            'add': True,
+            'change': False,
+            'has_add_permission': True,
+            'has_delete_permission': False,
+            'has_change_permission': True,
+            'has_file_field': False,
+            'has_absolute_url': False,
+            'auto_populated_fields': (),
+            'opts': self.model._meta,
+            'save_as': False,
+            'username_help_text': self.model._meta.get_field('username').help_text,
+            'root_path': self.admin_site.root_path,
+            'app_label': self.model._meta.app_label,            
+        }, context_instance=template.RequestContext(request))
+
+    def user_change_password(self, request, id):
+        if not request.user.has_perm('auth.change_user'):
+            raise PermissionDenied
+        user = get_object_or_404(self.model, pk=id)
+        if request.method == 'POST':
+            form = self.change_password_form(user, request.POST)
+            if form.is_valid():
+                new_user = form.save()
+                msg = ugettext('Password changed successfully.')
+                request.user.message_set.create(message=msg)
+                return HttpResponseRedirect('..')
+        else:
+            form = self.change_password_form(user)
+        return render_to_response('admin/auth/user/change_password.html', {
+            'title': _('Change password: %s') % escape(user.username),
+            'form': form,
+            'is_popup': '_popup' in request.REQUEST,
+            'add': True,
+            'change': False,
+            'has_delete_permission': False,
+            'has_change_permission': True,
+            'has_absolute_url': False,
+            'opts': self.model._meta,
+            'original': user,
+            'save_as': False,
+            'show_save': True,
+            'root_path': self.admin_site.root_path,
+        }, context_instance=RequestContext(request))
+
+
+admin.site.register(Group, GroupAdmin)
+admin.site.register(User, UserAdmin)
+
diff --git a/webapp/django/contrib/auth/backends.py b/webapp/django/contrib/auth/backends.py
new file mode 100644
index 0000000..bba883b
--- /dev/null
+++ b/webapp/django/contrib/auth/backends.py
@@ -0,0 +1,80 @@
+try:
+    set
+except NameError:
+    from sets import Set as set # Python 2.3 fallback
+
+from django.db import connection
+from django.contrib.auth.models import User
+
+
+class ModelBackend(object):
+    """
+    Authenticates against django.contrib.auth.models.User.
+    """
+    # TODO: Model, login attribute name and password attribute name should be
+    # configurable.
+    def authenticate(self, username=None, password=None):
+        try:
+            user = User.objects.get(username=username)
+            if user.check_password(password):
+                return user
+        except User.DoesNotExist:
+            return None
+
+    def get_group_permissions(self, user_obj):
+        """
+        Returns a set of permission strings that this user has through his/her
+        groups.
+        """
+        if not hasattr(user_obj, '_group_perm_cache'):
+            cursor = connection.cursor()
+            # The SQL below works out to the following, after DB quoting:
+            # cursor.execute("""
+            #     SELECT ct."app_label", p."codename"
+            #     FROM "auth_permission" p, "auth_group_permissions" gp, "auth_user_groups" ug, "django_content_type" ct
+            #     WHERE p."id" = gp."permission_id"
+            #         AND gp."group_id" = ug."group_id"
+            #         AND ct."id" = p."content_type_id"
+            #         AND ug."user_id" = %s, [self.id])
+            qn = connection.ops.quote_name
+            sql = """
+                SELECT ct.%s, p.%s
+                FROM %s p, %s gp, %s ug, %s ct
+                WHERE p.%s = gp.%s
+                    AND gp.%s = ug.%s
+                    AND ct.%s = p.%s
+                    AND ug.%s = %%s""" % (
+                qn('app_label'), qn('codename'),
+                qn('auth_permission'), qn('auth_group_permissions'),
+                qn('auth_user_groups'), qn('django_content_type'),
+                qn('id'), qn('permission_id'),
+                qn('group_id'), qn('group_id'),
+                qn('id'), qn('content_type_id'),
+                qn('user_id'),)
+            cursor.execute(sql, [user_obj.id])
+            user_obj._group_perm_cache = set(["%s.%s" % (row[0], row[1]) for row in cursor.fetchall()])
+        return user_obj._group_perm_cache
+
+    def get_all_permissions(self, user_obj):
+        if not hasattr(user_obj, '_perm_cache'):
+            user_obj._perm_cache = set([u"%s.%s" % (p.content_type.app_label, p.codename) for p in user_obj.user_permissions.select_related()])
+            user_obj._perm_cache.update(self.get_group_permissions(user_obj))
+        return user_obj._perm_cache
+
+    def has_perm(self, user_obj, perm):
+        return perm in self.get_all_permissions(user_obj)
+
+    def has_module_perms(self, user_obj, app_label):
+        """
+        Returns True if user_obj has any permissions in the given app_label.
+        """
+        for perm in self.get_all_permissions(user_obj):
+            if perm[:perm.index('.')] == app_label:
+                return True
+        return False
+
+    def get_user(self, user_id):
+        try:
+            return User.objects.get(pk=user_id)
+        except User.DoesNotExist:
+            return None
diff --git a/webapp/django/contrib/auth/create_superuser.py b/webapp/django/contrib/auth/create_superuser.py
new file mode 100644
index 0000000..7b58678
--- /dev/null
+++ b/webapp/django/contrib/auth/create_superuser.py
@@ -0,0 +1,8 @@
+"""
+Create a superuser from the command line. Deprecated; use manage.py
+createsuperuser instead.
+"""
+
+if __name__ == "__main__":
+    from django.core.management import call_command
+    call_command("createsuperuser")
diff --git a/webapp/django/contrib/auth/decorators.py b/webapp/django/contrib/auth/decorators.py
new file mode 100644
index 0000000..1371c62
--- /dev/null
+++ b/webapp/django/contrib/auth/decorators.py
@@ -0,0 +1,70 @@
+try:
+    from functools import update_wrapper
+except ImportError:
+    from django.utils.functional import update_wrapper  # Python 2.3, 2.4 fallback.
+
+from django.contrib.auth import REDIRECT_FIELD_NAME
+from django.http import HttpResponseRedirect
+from django.utils.http import urlquote
+
+def user_passes_test(test_func, login_url=None, redirect_field_name=REDIRECT_FIELD_NAME):
+    """
+    Decorator for views that checks that the user passes the given test,
+    redirecting to the log-in page if necessary. The test should be a callable
+    that takes the user object and returns True if the user passes.
+    """
+    def decorate(view_func):
+        return _CheckLogin(view_func, test_func, login_url, redirect_field_name)
+    return decorate
+
+def login_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME):
+    """
+    Decorator for views that checks that the user is logged in, redirecting
+    to the log-in page if necessary.
+    """
+    actual_decorator = user_passes_test(
+        lambda u: u.is_authenticated(),
+        redirect_field_name=redirect_field_name
+    )
+    if function:
+        return actual_decorator(function)
+    return actual_decorator
+
+def permission_required(perm, login_url=None):
+    """
+    Decorator for views that checks whether a user has a particular permission
+    enabled, redirecting to the log-in page if necessary.
+    """
+    return user_passes_test(lambda u: u.has_perm(perm), login_url=login_url)
+
+class _CheckLogin(object):
+    """
+    Class that checks that the user passes the given test, redirecting to
+    the log-in page if necessary. If the test is passed, the view function
+    is invoked. The test should be a callable that takes the user object
+    and returns True if the user passes.
+
+    We use a class here so that we can define __get__. This way, when a
+    _CheckLogin object is used as a method decorator, the view function
+    is properly bound to its instance.
+    """
+    def __init__(self, view_func, test_func, login_url=None, redirect_field_name=REDIRECT_FIELD_NAME):
+        if not login_url:
+            from django.conf import settings
+            login_url = settings.LOGIN_URL
+        self.view_func = view_func
+        self.test_func = test_func
+        self.login_url = login_url
+        self.redirect_field_name = redirect_field_name
+        update_wrapper(self, view_func)
+        
+    def __get__(self, obj, cls=None):
+        view_func = self.view_func.__get__(obj, cls)
+        return _CheckLogin(view_func, self.test_func, self.login_url, self.redirect_field_name)
+    
+    def __call__(self, request, *args, **kwargs):
+        if self.test_func(request.user):
+            return self.view_func(request, *args, **kwargs)
+        path = urlquote(request.get_full_path())
+        tup = self.login_url, self.redirect_field_name, path
+        return HttpResponseRedirect('%s?%s=%s' % tup)
diff --git a/webapp/django/contrib/auth/fixtures/authtestdata.json b/webapp/django/contrib/auth/fixtures/authtestdata.json
new file mode 100644
index 0000000..e0bdc24
--- /dev/null
+++ b/webapp/django/contrib/auth/fixtures/authtestdata.json
@@ -0,0 +1,56 @@
+[
+    {
+        "pk": "1", 
+        "model": "auth.user", 
+        "fields": {
+            "username": "testclient", 
+            "first_name": "Test", 
+            "last_name": "Client", 
+            "is_active": true, 
+            "is_superuser": false, 
+            "is_staff": false, 
+            "last_login": "2006-12-17 07:03:31", 
+            "groups": [], 
+            "user_permissions": [], 
+            "password": "sha1$6efc0$f93efe9fd7542f25a7be94871ea45aa95de57161", 
+            "email": "testclient@example.com", 
+            "date_joined": "2006-12-17 07:03:31"
+        }
+    },
+    {
+        "pk": "2", 
+        "model": "auth.user", 
+        "fields": {
+            "username": "inactive", 
+            "first_name": "Inactive", 
+            "last_name": "User", 
+            "is_active": false, 
+            "is_superuser": false, 
+            "is_staff": false, 
+            "last_login": "2006-12-17 07:03:31", 
+            "groups": [], 
+            "user_permissions": [], 
+            "password": "sha1$6efc0$f93efe9fd7542f25a7be94871ea45aa95de57161", 
+            "email": "testclient@example.com", 
+            "date_joined": "2006-12-17 07:03:31"
+        }
+    },
+    {
+        "pk": "3", 
+        "model": "auth.user", 
+        "fields": {
+            "username": "staff", 
+            "first_name": "Staff", 
+            "last_name": "Member", 
+            "is_active": true, 
+            "is_superuser": false, 
+            "is_staff": true, 
+            "last_login": "2006-12-17 07:03:31", 
+            "groups": [], 
+            "user_permissions": [], 
+            "password": "sha1$6efc0$f93efe9fd7542f25a7be94871ea45aa95de57161", 
+            "email": "staffmember@example.com", 
+            "date_joined": "2006-12-17 07:03:31"
+        }
+    }
+]
diff --git a/webapp/django/contrib/auth/forms.py b/webapp/django/contrib/auth/forms.py
new file mode 100644
index 0000000..1364786
--- /dev/null
+++ b/webapp/django/contrib/auth/forms.py
@@ -0,0 +1,198 @@
+from django.contrib.auth.models import User
+from django.contrib.auth import authenticate
+from django.contrib.auth.tokens import default_token_generator
+from django.contrib.sites.models import Site
+from django.template import Context, loader
+from django import forms
+from django.utils.translation import ugettext_lazy as _
+from django.utils.http import int_to_base36
+
+class UserCreationForm(forms.ModelForm):
+    """
+    A form that creates a user, with no privileges, from the given username and password.
+    """
+    username = forms.RegexField(label=_("Username"), max_length=30, regex=r'^\w+$',
+        help_text = _("Required. 30 characters or fewer. Alphanumeric characters only (letters, digits and underscores)."),
+        error_message = _("This value must contain only letters, numbers and underscores."))
+    password1 = forms.CharField(label=_("Password"), widget=forms.PasswordInput)
+    password2 = forms.CharField(label=_("Password confirmation"), widget=forms.PasswordInput)
+
+    class Meta:
+        model = User
+        fields = ("username",)
+
+    def clean_username(self):
+        username = self.cleaned_data["username"]
+        try:
+            User.objects.get(username=username)
+        except User.DoesNotExist:
+            return username
+        raise forms.ValidationError(_("A user with that username already exists."))
+
+    def clean_password2(self):
+        password1 = self.cleaned_data["password1"]
+        password2 = self.cleaned_data["password2"]
+        if password1 != password2:
+            raise forms.ValidationError(_("The two password fields didn't match."))
+        return password2
+
+    def save(self, commit=True):
+        user = super(UserCreationForm, self).save(commit=False)
+        user.set_password(self.cleaned_data["password1"])
+        if commit:
+            user.save()
+        return user
+
+class AuthenticationForm(forms.Form):
+    """
+    Base class for authenticating users. Extend this to get a form that accepts
+    username/password logins.
+    """
+    username = forms.CharField(label=_("Username"), max_length=30)
+    password = forms.CharField(label=_("Password"), widget=forms.PasswordInput)
+
+    def __init__(self, request=None, *args, **kwargs):
+        """
+        If request is passed in, the form will validate that cookies are
+        enabled. Note that the request (a HttpRequest object) must have set a
+        cookie with the key TEST_COOKIE_NAME and value TEST_COOKIE_VALUE before
+        running this validation.
+        """
+        self.request = request
+        self.user_cache = None
+        super(AuthenticationForm, self).__init__(*args, **kwargs)
+
+    def clean(self):
+        username = self.cleaned_data.get('username')
+        password = self.cleaned_data.get('password')
+
+        if username and password:
+            self.user_cache = authenticate(username=username, password=password)
+            if self.user_cache is None:
+                raise forms.ValidationError(_("Please enter a correct username and password. Note that both fields are case-sensitive."))
+            elif not self.user_cache.is_active:
+                raise forms.ValidationError(_("This account is inactive."))
+
+        # TODO: determine whether this should move to its own method.
+        if self.request:
+            if not self.request.session.test_cookie_worked():
+                raise forms.ValidationError(_("Your Web browser doesn't appear to have cookies enabled. Cookies are required for logging in."))
+
+        return self.cleaned_data
+
+    def get_user_id(self):
+        if self.user_cache:
+            return self.user_cache.id
+        return None
+
+    def get_user(self):
+        return self.user_cache
+
+class PasswordResetForm(forms.Form):
+    email = forms.EmailField(label=_("E-mail"), max_length=75)
+
+    def clean_email(self):
+        """
+        Validates that a user exists with the given e-mail address.
+        """
+        email = self.cleaned_data["email"]
+        self.users_cache = User.objects.filter(email__iexact=email)
+        if len(self.users_cache) == 0:
+            raise forms.ValidationError(_("That e-mail address doesn't have an associated user account. Are you sure you've registered?"))
+
+    def save(self, domain_override=None, email_template_name='registration/password_reset_email.html',
+             use_https=False, token_generator=default_token_generator):
+        """
+        Generates a one-use only link for resetting password and sends to the user
+        """
+        from django.core.mail import send_mail
+        for user in self.users_cache:
+            if not domain_override:
+                current_site = Site.objects.get_current()
+                site_name = current_site.name
+                domain = current_site.domain
+            else:
+                site_name = domain = domain_override
+            t = loader.get_template(email_template_name)
+            c = {
+                'email': user.email,
+                'domain': domain,
+                'site_name': site_name,
+                'uid': int_to_base36(user.id),
+                'user': user,
+                'token': token_generator.make_token(user),
+                'protocol': use_https and 'https' or 'http',
+            }
+            send_mail(_("Password reset on %s") % site_name,
+                t.render(Context(c)), None, [user.email])
+
+class SetPasswordForm(forms.Form):
+    """
+    A form that lets a user change set his/her password without
+    entering the old password
+    """
+    new_password1 = forms.CharField(label=_("New password"), widget=forms.PasswordInput)
+    new_password2 = forms.CharField(label=_("New password confirmation"), widget=forms.PasswordInput)
+
+    def __init__(self, user, *args, **kwargs):
+        self.user = user
+        super(SetPasswordForm, self).__init__(*args, **kwargs)
+
+    def clean_new_password2(self):
+        password1 = self.cleaned_data.get('new_password1')
+        password2 = self.cleaned_data.get('new_password2')
+        if password1 and password2:
+            if password1 != password2:
+                raise forms.ValidationError(_("The two password fields didn't match."))
+        return password2
+
+    def save(self, commit=True):
+        self.user.set_password(self.cleaned_data['new_password1'])
+        if commit:
+            self.user.save()
+        return self.user
+
+class PasswordChangeForm(SetPasswordForm):
+    """
+    A form that lets a user change his/her password by entering
+    their old password.
+    """
+    old_password = forms.CharField(label=_("Old password"), widget=forms.PasswordInput)
+
+    def clean_old_password(self):
+        """
+        Validates that the old_password field is correct.
+        """
+        old_password = self.cleaned_data["old_password"]
+        if not self.user.check_password(old_password):
+            raise forms.ValidationError(_("Your old password was entered incorrectly. Please enter it again."))
+        return old_password
+PasswordChangeForm.base_fields.keyOrder = ['old_password', 'new_password1', 'new_password2']
+
+class AdminPasswordChangeForm(forms.Form):
+    """
+    A form used to change the password of a user in the admin interface.
+    """
+    password1 = forms.CharField(label=_("Password"), widget=forms.PasswordInput)
+    password2 = forms.CharField(label=_("Password (again)"), widget=forms.PasswordInput)
+
+    def __init__(self, user, *args, **kwargs):
+        self.user = user
+        super(AdminPasswordChangeForm, self).__init__(*args, **kwargs)
+
+    def clean_password2(self):
+        password1 = self.cleaned_data.get('password1')
+        password2 = self.cleaned_data.get('password2')
+        if password1 and password2:
+            if password1 != password2:
+                raise forms.ValidationError(_("The two password fields didn't match."))
+        return password2
+
+    def save(self, commit=True):
+        """
+        Saves the new password.
+        """
+        self.user.set_password(self.cleaned_data["password1"])
+        if commit:
+            self.user.save()
+        return self.user
diff --git a/webapp/django/contrib/auth/handlers/__init__.py b/webapp/django/contrib/auth/handlers/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/auth/handlers/__init__.py
diff --git a/webapp/django/contrib/auth/handlers/modpython.py b/webapp/django/contrib/auth/handlers/modpython.py
new file mode 100644
index 0000000..de961fa
--- /dev/null
+++ b/webapp/django/contrib/auth/handlers/modpython.py
@@ -0,0 +1,56 @@
+from mod_python import apache
+import os
+
+def authenhandler(req, **kwargs):
+    """
+    Authentication handler that checks against Django's auth database.
+    """
+
+    # mod_python fakes the environ, and thus doesn't process SetEnv.  This fixes
+    # that so that the following import works
+    os.environ.update(req.subprocess_env)
+
+    # apache 2.2 requires a call to req.get_basic_auth_pw() before 
+    # req.user and friends are available.
+    req.get_basic_auth_pw()
+
+    # check for PythonOptions
+    _str_to_bool = lambda s: s.lower() in ('1', 'true', 'on', 'yes')
+
+    options = req.get_options()
+    permission_name = options.get('DjangoPermissionName', None)
+    staff_only = _str_to_bool(options.get('DjangoRequireStaffStatus', "on"))
+    superuser_only = _str_to_bool(options.get('DjangoRequireSuperuserStatus', "off"))
+    settings_module = options.get('DJANGO_SETTINGS_MODULE', None)
+    if settings_module:
+        os.environ['DJANGO_SETTINGS_MODULE'] = settings_module
+
+    from django.contrib.auth.models import User
+    from django import db
+    db.reset_queries()
+
+    # check that the username is valid
+    kwargs = {'username': req.user, 'is_active': True}
+    if staff_only:
+        kwargs['is_staff'] = True
+    if superuser_only:
+        kwargs['is_superuser'] = True
+    try:
+        try:
+            user = User.objects.get(**kwargs)
+        except User.DoesNotExist:
+            return apache.HTTP_UNAUTHORIZED
+    
+        # check the password and any permission given
+        if user.check_password(req.get_basic_auth_pw()):
+            if permission_name:
+                if user.has_perm(permission_name):
+                    return apache.OK
+                else:
+                    return apache.HTTP_UNAUTHORIZED
+            else:
+                return apache.OK
+        else:
+            return apache.HTTP_UNAUTHORIZED
+    finally:
+        db.connection.close()
diff --git a/webapp/django/contrib/auth/management/__init__.py b/webapp/django/contrib/auth/management/__init__.py
new file mode 100644
index 0000000..01fa524
--- /dev/null
+++ b/webapp/django/contrib/auth/management/__init__.py
@@ -0,0 +1,50 @@
+"""
+Creates permissions for all installed apps that need permissions.
+"""
+
+from django.db.models import get_models, signals
+from django.contrib.auth import models as auth_app
+
+def _get_permission_codename(action, opts):
+    return u'%s_%s' % (action, opts.object_name.lower())
+
+def _get_all_permissions(opts):
+    "Returns (codename, name) for all permissions in the given opts."
+    perms = []
+    for action in ('add', 'change', 'delete'):
+        perms.append((_get_permission_codename(action, opts), u'Can %s %s' % (action, opts.verbose_name_raw)))
+    return perms + list(opts.permissions)
+
+def create_permissions(app, created_models, verbosity, **kwargs):
+    from django.contrib.contenttypes.models import ContentType
+    from django.contrib.auth.models import Permission
+    app_models = get_models(app)
+    if not app_models:
+        return
+    for klass in app_models:
+        ctype = ContentType.objects.get_for_model(klass)
+        for codename, name in _get_all_permissions(klass._meta):
+            p, created = Permission.objects.get_or_create(codename=codename, content_type__pk=ctype.id,
+                defaults={'name': name, 'content_type': ctype})
+            if created and verbosity >= 2:
+                print "Adding permission '%s'" % p
+
+def create_superuser(app, created_models, verbosity, **kwargs):
+    from django.contrib.auth.models import User
+    from django.core.management import call_command
+    if User in created_models and kwargs.get('interactive', True):
+        msg = "\nYou just installed Django's auth system, which means you don't have " \
+                "any superusers defined.\nWould you like to create one now? (yes/no): "
+        confirm = raw_input(msg)
+        while 1:
+            if confirm not in ('yes', 'no'):
+                confirm = raw_input('Please enter either "yes" or "no": ')
+                continue
+            if confirm == 'yes':
+                call_command("createsuperuser", interactive=True)
+            break
+
+signals.post_syncdb.connect(create_permissions,
+    dispatch_uid = "django.contrib.auth.management.create_permissions")
+signals.post_syncdb.connect(create_superuser,
+    sender=auth_app, dispatch_uid = "django.contrib.auth.management.create_superuser")
diff --git a/webapp/django/contrib/auth/management/commands/__init__.py b/webapp/django/contrib/auth/management/commands/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/auth/management/commands/__init__.py
diff --git a/webapp/django/contrib/auth/management/commands/createsuperuser.py b/webapp/django/contrib/auth/management/commands/createsuperuser.py
new file mode 100644
index 0000000..91e39f7
--- /dev/null
+++ b/webapp/django/contrib/auth/management/commands/createsuperuser.py
@@ -0,0 +1,123 @@
+"""
+Management utility to create superusers.
+"""
+
+import getpass
+import os
+import re
+import sys
+from optparse import make_option
+from django.contrib.auth.models import User
+from django.core import validators
+from django.core.management.base import BaseCommand, CommandError
+
+RE_VALID_USERNAME = re.compile('\w+$')
+
+class Command(BaseCommand):
+    option_list = BaseCommand.option_list + (
+        make_option('--username', dest='username', default=None,
+            help='Specifies the username for the superuser.'),
+        make_option('--email', dest='email', default=None,
+            help='Specifies the email address for the superuser.'),
+        make_option('--noinput', action='store_false', dest='interactive', default=True,
+            help='Tells Django to NOT prompt the user for input of any kind. '    \
+                 'You must use --username and --email with --noinput, and '      \
+                 'superusers created with --noinput will not be able to log in '  \
+                 'until they\'re given a valid password.'),
+    )
+    help = 'Used to create a superuser.'
+
+    def handle(self, *args, **options):
+        username = options.get('username', None)
+        email = options.get('email', None)
+        interactive = options.get('interactive')
+        
+        # Do quick and dirty validation if --noinput
+        if not interactive:
+            if not username or not email:
+                raise CommandError("You must use --username and --email with --noinput.")
+            if not RE_VALID_USERNAME.match(username):
+                raise CommandError("Invalid username. Use only letters, digits, and underscores")
+            try:
+                validators.isValidEmail(email, None)
+            except validators.ValidationError:
+                raise CommandError("Invalid email address.")
+
+        password = ''
+
+        # Try to determine the current system user's username to use as a default.
+        try:
+            import pwd
+        except ImportError:
+            default_username = ''
+        else:
+            default_username = pwd.getpwuid(os.getuid())[0].replace(' ', '').lower()
+
+        # Determine whether the default username is taken, so we don't display
+        # it as an option.
+        if default_username:
+            try:
+                User.objects.get(username=default_username)
+            except User.DoesNotExist:
+                pass
+            else:
+                default_username = ''
+
+        # Prompt for username/email/password. Enclose this whole thing in a
+        # try/except to trap for a keyboard interrupt and exit gracefully.
+        if interactive:
+            try:
+            
+                # Get a username
+                while 1:
+                    if not username:
+                        input_msg = 'Username'
+                        if default_username:
+                            input_msg += ' (Leave blank to use %r)' % default_username
+                        username = raw_input(input_msg + ': ')
+                    if default_username and username == '':
+                        username = default_username
+                    if not RE_VALID_USERNAME.match(username):
+                        sys.stderr.write("Error: That username is invalid. Use only letters, digits and underscores.\n")
+                        username = None
+                        continue
+                    try:
+                        User.objects.get(username=username)
+                    except User.DoesNotExist:
+                        break
+                    else:
+                        sys.stderr.write("Error: That username is already taken.\n")
+                        username = None
+            
+                # Get an email
+                while 1:
+                    if not email:
+                        email = raw_input('E-mail address: ')
+                    try:
+                        validators.isValidEmail(email, None)
+                    except validators.ValidationError:
+                        sys.stderr.write("Error: That e-mail address is invalid.\n")
+                        email = None
+                    else:
+                        break
+            
+                # Get a password
+                while 1:
+                    if not password:
+                        password = getpass.getpass()
+                        password2 = getpass.getpass('Password (again): ')
+                        if password != password2:
+                            sys.stderr.write("Error: Your passwords didn't match.\n")
+                            password = None
+                            continue
+                    if password.strip() == '':
+                        sys.stderr.write("Error: Blank passwords aren't allowed.\n")
+                        password = None
+                        continue
+                    break
+            except KeyboardInterrupt:
+                sys.stderr.write("\nOperation cancelled.\n")
+                sys.exit(1)
+        
+        User.objects.create_superuser(username, email, password)
+        print "Superuser created successfully."
diff --git a/webapp/django/contrib/auth/middleware.py b/webapp/django/contrib/auth/middleware.py
new file mode 100644
index 0000000..42dc15a
--- /dev/null
+++ b/webapp/django/contrib/auth/middleware.py
@@ -0,0 +1,12 @@
+class LazyUser(object):
+    def __get__(self, request, obj_type=None):
+        if not hasattr(request, '_cached_user'):
+            from django.contrib.auth import get_user
+            request._cached_user = get_user(request)
+        return request._cached_user
+
+class AuthenticationMiddleware(object):
+    def process_request(self, request):
+        assert hasattr(request, 'session'), "The Django authentication middleware requires session middleware to be installed. Edit your MIDDLEWARE_CLASSES setting to insert 'django.contrib.sessions.middleware.SessionMiddleware'."
+        request.__class__.user = LazyUser()
+        return None
diff --git a/webapp/django/contrib/auth/models.py b/webapp/django/contrib/auth/models.py
new file mode 100644
index 0000000..1f0a038
--- /dev/null
+++ b/webapp/django/contrib/auth/models.py
@@ -0,0 +1,377 @@
+from django.contrib import auth
+from django.core import validators
+from django.core.exceptions import ImproperlyConfigured
+from django.db import models
+from django.db.models.manager import EmptyManager
+from django.contrib.contenttypes.models import ContentType
+from django.utils.encoding import smart_str
+from django.utils.translation import ugettext_lazy as _
+import datetime
+import urllib
+
+UNUSABLE_PASSWORD = '!' # This will never be a valid hash
+
+try:
+    set
+except NameError:
+    from sets import Set as set   # Python 2.3 fallback
+
+def get_hexdigest(algorithm, salt, raw_password):
+    """
+    Returns a string of the hexdigest of the given plaintext password and salt
+    using the given algorithm ('md5', 'sha1' or 'crypt').
+    """
+    raw_password, salt = smart_str(raw_password), smart_str(salt)
+    if algorithm == 'crypt':
+        try:
+            import crypt
+        except ImportError:
+            raise ValueError('"crypt" password algorithm not supported in this environment')
+        return crypt.crypt(raw_password, salt)
+    # The rest of the supported algorithms are supported by hashlib, but
+    # hashlib is only available in Python 2.5.
+    try:
+        import hashlib
+    except ImportError:
+        if algorithm == 'md5':
+            import md5
+            return md5.new(salt + raw_password).hexdigest()
+        elif algorithm == 'sha1':
+            import sha
+            return sha.new(salt + raw_password).hexdigest()
+    else:
+        if algorithm == 'md5':
+            return hashlib.md5(salt + raw_password).hexdigest()
+        elif algorithm == 'sha1':
+            return hashlib.sha1(salt + raw_password).hexdigest()
+    raise ValueError("Got unknown password algorithm type in password.")
+
+def check_password(raw_password, enc_password):
+    """
+    Returns a boolean of whether the raw_password was correct. Handles
+    encryption formats behind the scenes.
+    """
+    algo, salt, hsh = enc_password.split('$')
+    return hsh == get_hexdigest(algo, salt, raw_password)
+
+class SiteProfileNotAvailable(Exception):
+    pass
+
+class Permission(models.Model):
+    """The permissions system provides a way to assign permissions to specific users and groups of users.
+
+    The permission system is used by the Django admin site, but may also be useful in your own code. The Django admin site uses permissions as follows:
+
+        - The "add" permission limits the user's ability to view the "add" form and add an object.
+        - The "change" permission limits a user's ability to view the change list, view the "change" form and change an object.
+        - The "delete" permission limits the ability to delete an object.
+
+    Permissions are set globally per type of object, not per specific object instance. It is possible to say "Mary may change news stories," but it's not currently possible to say "Mary may change news stories, but only the ones she created herself" or "Mary may only change news stories that have a certain status or publication date."
+
+    Three basic permissions -- add, change and delete -- are automatically created for each Django model.
+    """
+    name = models.CharField(_('name'), max_length=50)
+    content_type = models.ForeignKey(ContentType)
+    codename = models.CharField(_('codename'), max_length=100)
+
+    class Meta:
+        verbose_name = _('permission')
+        verbose_name_plural = _('permissions')
+        unique_together = (('content_type', 'codename'),)
+        ordering = ('content_type__app_label', 'codename')
+
+    def __unicode__(self):
+        return u"%s | %s | %s" % (
+            unicode(self.content_type.app_label),
+            unicode(self.content_type),
+            unicode(self.name))
+
+class Group(models.Model):
+    """Groups are a generic way of categorizing users to apply permissions, or some other label, to those users. A user can belong to any number of groups.
+
+    A user in a group automatically has all the permissions granted to that group. For example, if the group Site editors has the permission can_edit_home_page, any user in that group will have that permission.
+
+    Beyond permissions, groups are a convenient way to categorize users to apply some label, or extended functionality, to them. For example, you could create a group 'Special users', and you could write code that would do special things to those users -- such as giving them access to a members-only portion of your site, or sending them members-only e-mail messages.
+    """
+    name = models.CharField(_('name'), max_length=80, unique=True)
+    permissions = models.ManyToManyField(Permission, verbose_name=_('permissions'), blank=True)
+
+    class Meta:
+        verbose_name = _('group')
+        verbose_name_plural = _('groups')
+
+    def __unicode__(self):
+        return self.name
+
+class UserManager(models.Manager):
+    def create_user(self, username, email, password=None):
+        "Creates and saves a User with the given username, e-mail and password."
+        now = datetime.datetime.now()
+        user = self.model(None, username, '', '', email.strip().lower(), 'placeholder', False, True, False, now, now)
+        if password:
+            user.set_password(password)
+        else:
+            user.set_unusable_password()
+        user.save()
+        return user
+
+    def create_superuser(self, username, email, password):
+        u = self.create_user(username, email, password)
+        u.is_staff = True
+        u.is_active = True
+        u.is_superuser = True
+        u.save()
+
+    def make_random_password(self, length=10, allowed_chars='abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789'):
+        "Generates a random password with the given length and given allowed_chars"
+        # Note that default value of allowed_chars does not have "I" or letters
+        # that look like it -- just to avoid confusion.
+        from random import choice
+        return ''.join([choice(allowed_chars) for i in range(length)])
+
+class User(models.Model):
+    """Users within the Django authentication system are represented by this model.
+
+    Username and password are required. Other fields are optional.
+    """
+    username = models.CharField(_('username'), max_length=30, unique=True, help_text=_("Required. 30 characters or fewer. Alphanumeric characters only (letters, digits and underscores)."))
+    first_name = models.CharField(_('first name'), max_length=30, blank=True)
+    last_name = models.CharField(_('last name'), max_length=30, blank=True)
+    email = models.EmailField(_('e-mail address'), blank=True)
+    password = models.CharField(_('password'), max_length=128, help_text=_("Use '[algo]$[salt]$[hexdigest]' or use the <a href=\"password/\">change password form</a>."))
+    is_staff = models.BooleanField(_('staff status'), default=False, help_text=_("Designates whether the user can log into this admin site."))
+    is_active = models.BooleanField(_('active'), default=True, help_text=_("Designates whether this user should be treated as active. Unselect this instead of deleting accounts."))
+    is_superuser = models.BooleanField(_('superuser status'), default=False, help_text=_("Designates that this user has all permissions without explicitly assigning them."))
+    last_login = models.DateTimeField(_('last login'), default=datetime.datetime.now)
+    date_joined = models.DateTimeField(_('date joined'), default=datetime.datetime.now)
+    groups = models.ManyToManyField(Group, verbose_name=_('groups'), blank=True,
+        help_text=_("In addition to the permissions manually assigned, this user will also get all permissions granted to each group he/she is in."))
+    user_permissions = models.ManyToManyField(Permission, verbose_name=_('user permissions'), blank=True)
+    objects = UserManager()
+
+    class Meta:
+        verbose_name = _('user')
+        verbose_name_plural = _('users')
+
+    def __unicode__(self):
+        return self.username
+
+    def get_absolute_url(self):
+        return "/users/%s/" % urllib.quote(smart_str(self.username))
+
+    def is_anonymous(self):
+        "Always returns False. This is a way of comparing User objects to anonymous users."
+        return False
+
+    def is_authenticated(self):
+        """Always return True. This is a way to tell if the user has been authenticated in templates.
+        """
+        return True
+
+    def get_full_name(self):
+        "Returns the first_name plus the last_name, with a space in between."
+        full_name = u'%s %s' % (self.first_name, self.last_name)
+        return full_name.strip()
+
+    def set_password(self, raw_password):
+        import random
+        algo = 'sha1'
+        salt = get_hexdigest(algo, str(random.random()), str(random.random()))[:5]
+        hsh = get_hexdigest(algo, salt, raw_password)
+        self.password = '%s$%s$%s' % (algo, salt, hsh)
+
+    def check_password(self, raw_password):
+        """
+        Returns a boolean of whether the raw_password was correct. Handles
+        encryption formats behind the scenes.
+        """
+        # Backwards-compatibility check. Older passwords won't include the
+        # algorithm or salt.
+        if '$' not in self.password:
+            is_correct = (self.password == get_hexdigest('md5', '', raw_password))
+            if is_correct:
+                # Convert the password to the new, more secure format.
+                self.set_password(raw_password)
+                self.save()
+            return is_correct
+        return check_password(raw_password, self.password)
+
+    def set_unusable_password(self):
+        # Sets a value that will never be a valid hash
+        self.password = UNUSABLE_PASSWORD
+
+    def has_usable_password(self):
+        return self.password != UNUSABLE_PASSWORD
+
+    def get_group_permissions(self):
+        """
+        Returns a list of permission strings that this user has through
+        his/her groups. This method queries all available auth backends.
+        """
+        permissions = set()
+        for backend in auth.get_backends():
+            if hasattr(backend, "get_group_permissions"):
+                permissions.update(backend.get_group_permissions(self))
+        return permissions
+
+    def get_all_permissions(self):
+        permissions = set()
+        for backend in auth.get_backends():
+            if hasattr(backend, "get_all_permissions"):
+                permissions.update(backend.get_all_permissions(self))
+        return permissions
+
+    def has_perm(self, perm):
+        """
+        Returns True if the user has the specified permission. This method
+        queries all available auth backends, but returns immediately if any
+        backend returns True. Thus, a user who has permission from a single
+        auth backend is assumed to have permission in general.
+        """
+        # Inactive users have no permissions.
+        if not self.is_active:
+            return False
+
+        # Superusers have all permissions.
+        if self.is_superuser:
+            return True
+
+        # Otherwise we need to check the backends.
+        for backend in auth.get_backends():
+            if hasattr(backend, "has_perm"):
+                if backend.has_perm(self, perm):
+                    return True
+        return False
+
+    def has_perms(self, perm_list):
+        """Returns True if the user has each of the specified permissions."""
+        for perm in perm_list:
+            if not self.has_perm(perm):
+                return False
+        return True
+
+    def has_module_perms(self, app_label):
+        """
+        Returns True if the user has any permissions in the given app
+        label. Uses pretty much the same logic as has_perm, above.
+        """
+        if not self.is_active:
+            return False
+
+        if self.is_superuser:
+            return True
+
+        for backend in auth.get_backends():
+            if hasattr(backend, "has_module_perms"):
+                if backend.has_module_perms(self, app_label):
+                    return True
+        return False
+
+    def get_and_delete_messages(self):
+        messages = []
+        for m in self.message_set.all():
+            messages.append(m.message)
+            m.delete()
+        return messages
+
+    def email_user(self, subject, message, from_email=None):
+        "Sends an e-mail to this User."
+        from django.core.mail import send_mail
+        send_mail(subject, message, from_email, [self.email])
+
+    def get_profile(self):
+        """
+        Returns site-specific profile for this user. Raises
+        SiteProfileNotAvailable if this site does not allow profiles.
+        """
+        if not hasattr(self, '_profile_cache'):
+            from django.conf import settings
+            if not settings.AUTH_PROFILE_MODULE:
+                raise SiteProfileNotAvailable
+            try:
+                app_label, model_name = settings.AUTH_PROFILE_MODULE.split('.')
+                model = models.get_model(app_label, model_name)
+                self._profile_cache = model._default_manager.get(user__id__exact=self.id)
+            except (ImportError, ImproperlyConfigured):
+                raise SiteProfileNotAvailable
+        return self._profile_cache
+
+class Message(models.Model):
+    """
+    The message system is a lightweight way to queue messages for given
+    users. A message is associated with a User instance (so it is only
+    applicable for registered users). There's no concept of expiration or
+    timestamps. Messages are created by the Django admin after successful
+    actions. For example, "The poll Foo was created successfully." is a
+    message.
+    """
+    user = models.ForeignKey(User)
+    message = models.TextField(_('message'))
+
+    def __unicode__(self):
+        return self.message
+
+class AnonymousUser(object):
+    id = None
+    username = ''
+    is_staff = False
+    is_active = False
+    is_superuser = False
+    _groups = EmptyManager()
+    _user_permissions = EmptyManager()
+
+    def __init__(self):
+        pass
+
+    def __unicode__(self):
+        return 'AnonymousUser'
+
+    def __str__(self):
+        return unicode(self).encode('utf-8')
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__)
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __hash__(self):
+        return 1 # instances always return the same hash value
+
+    def save(self):
+        raise NotImplementedError
+
+    def delete(self):
+        raise NotImplementedError
+
+    def set_password(self, raw_password):
+        raise NotImplementedError
+
+    def check_password(self, raw_password):
+        raise NotImplementedError
+
+    def _get_groups(self):
+        return self._groups
+    groups = property(_get_groups)
+
+    def _get_user_permissions(self):
+        return self._user_permissions
+    user_permissions = property(_get_user_permissions)
+
+    def has_perm(self, perm):
+        return False
+
+    def has_perms(self, perm_list):
+        return False
+
+    def has_module_perms(self, module):
+        return False
+
+    def get_and_delete_messages(self):
+        return []
+
+    def is_anonymous(self):
+        return True
+
+    def is_authenticated(self):
+        return False
diff --git a/webapp/django/contrib/auth/tests/__init__.py b/webapp/django/contrib/auth/tests/__init__.py
new file mode 100644
index 0000000..23cfbaf
--- /dev/null
+++ b/webapp/django/contrib/auth/tests/__init__.py
@@ -0,0 +1,14 @@
+from django.contrib.auth.tests.basic import BASIC_TESTS
+from django.contrib.auth.tests.views import PasswordResetTest, ChangePasswordTest
+from django.contrib.auth.tests.forms import FORM_TESTS
+from django.contrib.auth.tests.tokens import TOKEN_GENERATOR_TESTS
+
+# The password for the fixture data users is 'password'
+
+__test__ = {
+    'BASIC_TESTS': BASIC_TESTS,
+    'PASSWORDRESET_TESTS': PasswordResetTest,
+    'FORM_TESTS': FORM_TESTS,
+    'TOKEN_GENERATOR_TESTS': TOKEN_GENERATOR_TESTS,
+    'CHANGEPASSWORD_TESTS': ChangePasswordTest,
+}
diff --git a/webapp/django/contrib/auth/tests/basic.py b/webapp/django/contrib/auth/tests/basic.py
new file mode 100644
index 0000000..2071710
--- /dev/null
+++ b/webapp/django/contrib/auth/tests/basic.py
@@ -0,0 +1,56 @@
+
+BASIC_TESTS = """
+>>> from django.contrib.auth.models import User, AnonymousUser
+>>> u = User.objects.create_user('testuser', 'test@example.com', 'testpw')
+>>> u.has_usable_password()
+True
+>>> u.check_password('bad')
+False
+>>> u.check_password('testpw')
+True
+>>> u.set_unusable_password()
+>>> u.save()
+>>> u.check_password('testpw')
+False
+>>> u.has_usable_password()
+False
+>>> u2 = User.objects.create_user('testuser2', 'test2@example.com')
+>>> u2.has_usable_password()
+False
+
+>>> u.is_authenticated()
+True
+>>> u.is_staff
+False
+>>> u.is_active
+True
+
+>>> a = AnonymousUser()
+>>> a.is_authenticated()
+False
+>>> a.is_staff
+False
+>>> a.is_active
+False
+>>> a.groups.all()
+[]
+>>> a.user_permissions.all()
+[]
+
+#
+# Tests for createsuperuser management command.
+# It's nearly impossible to test the interactive mode -- a command test helper
+# would be needed (and *awesome*) -- so just test the non-interactive mode.
+# This covers most of the important validation, but not all.
+#
+>>> from django.core.management import call_command
+
+>>> call_command("createsuperuser", noinput=True, username="joe", email="joe@somewhere.org")
+Superuser created successfully.
+
+>>> u = User.objects.get(username="joe")
+>>> u.email
+u'joe@somewhere.org'
+>>> u.password
+u'!'
+"""
diff --git a/webapp/django/contrib/auth/tests/forms.py b/webapp/django/contrib/auth/tests/forms.py
new file mode 100644
index 0000000..01f4995
--- /dev/null
+++ b/webapp/django/contrib/auth/tests/forms.py
@@ -0,0 +1,166 @@
+
+FORM_TESTS = """
+>>> from django.contrib.auth.models import User
+>>> from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
+>>> from django.contrib.auth.forms import PasswordChangeForm, SetPasswordForm
+
+The user already exists.
+
+>>> user = User.objects.create_user("jsmith", "jsmith@example.com", "test123")
+>>> data = {
+...     'username': 'jsmith',
+...     'password1': 'test123',
+...     'password2': 'test123',
+... }
+>>> form = UserCreationForm(data)
+>>> form.is_valid()
+False
+>>> form["username"].errors
+[u'A user with that username already exists.']
+
+The username contains invalid data.
+
+>>> data = {
+...     'username': 'jsmith@example.com',
+...     'password1': 'test123',
+...     'password2': 'test123',
+... }
+>>> form = UserCreationForm(data)
+>>> form.is_valid()
+False
+>>> form["username"].errors
+[u'This value must contain only letters, numbers and underscores.']
+
+The verification password is incorrect.
+
+>>> data = {
+...     'username': 'jsmith2',
+...     'password1': 'test123',
+...     'password2': 'test',
+... }
+>>> form = UserCreationForm(data)
+>>> form.is_valid()
+False
+>>> form["password2"].errors
+[u"The two password fields didn't match."]
+
+The success case.
+
+>>> data = {
+...     'username': 'jsmith2',
+...     'password1': 'test123',
+...     'password2': 'test123',
+... }
+>>> form = UserCreationForm(data)
+>>> form.is_valid()
+True
+>>> form.save()
+<User: jsmith2>
+
+The user submits an invalid username.
+
+>>> data = {
+...     'username': 'jsmith_does_not_exist',
+...     'password': 'test123',
+... }
+
+>>> form = AuthenticationForm(None, data)
+>>> form.is_valid()
+False
+>>> form.non_field_errors()
+[u'Please enter a correct username and password. Note that both fields are case-sensitive.']
+
+The user is inactive.
+
+>>> data = {
+...     'username': 'jsmith',
+...     'password': 'test123',
+... }
+>>> user.is_active = False
+>>> user.save()
+>>> form = AuthenticationForm(None, data)
+>>> form.is_valid()
+False
+>>> form.non_field_errors()
+[u'This account is inactive.']
+
+>>> user.is_active = True
+>>> user.save()
+
+The success case
+
+>>> form = AuthenticationForm(None, data)
+>>> form.is_valid()
+True
+>>> form.non_field_errors()
+[]
+
+SetPasswordForm:
+
+The two new passwords do not match.
+
+>>> data = {
+...     'new_password1': 'abc123',
+...     'new_password2': 'abc',
+... }
+>>> form = SetPasswordForm(user, data)
+>>> form.is_valid()
+False
+>>> form["new_password2"].errors
+[u"The two password fields didn't match."]
+
+The success case.
+
+>>> data = {
+...     'new_password1': 'abc123',
+...     'new_password2': 'abc123',
+... }
+>>> form = SetPasswordForm(user, data)
+>>> form.is_valid()
+True
+
+PasswordChangeForm:
+
+The old password is incorrect.
+
+>>> data = {
+...     'old_password': 'test',
+...     'new_password1': 'abc123',
+...     'new_password2': 'abc123',
+... }
+>>> form = PasswordChangeForm(user, data)
+>>> form.is_valid()
+False
+>>> form["old_password"].errors
+[u'Your old password was entered incorrectly. Please enter it again.']
+
+The two new passwords do not match.
+
+>>> data = {
+...     'old_password': 'test123',
+...     'new_password1': 'abc123',
+...     'new_password2': 'abc',
+... }
+>>> form = PasswordChangeForm(user, data)
+>>> form.is_valid()
+False
+>>> form["new_password2"].errors
+[u"The two password fields didn't match."]
+
+The success case.
+
+>>> data = {
+...     'old_password': 'test123',
+...     'new_password1': 'abc123',
+...     'new_password2': 'abc123',
+... }
+>>> form = PasswordChangeForm(user, data)
+>>> form.is_valid()
+True
+
+Regression test - check the order of fields:
+
+>>> PasswordChangeForm(user, {}).fields.keys()
+['old_password', 'new_password1', 'new_password2']
+
+"""
diff --git a/webapp/django/contrib/auth/tests/templates/registration/login.html b/webapp/django/contrib/auth/tests/templates/registration/login.html
new file mode 100644
index 0000000..027da71
--- /dev/null
+++ b/webapp/django/contrib/auth/tests/templates/registration/login.html
@@ -0,0 +1 @@
+{{ form.as_ul }}
\ No newline at end of file
diff --git a/webapp/django/contrib/auth/tests/tokens.py b/webapp/django/contrib/auth/tests/tokens.py
new file mode 100644
index 0000000..6d3a964
--- /dev/null
+++ b/webapp/django/contrib/auth/tests/tokens.py
@@ -0,0 +1,29 @@
+TOKEN_GENERATOR_TESTS = """
+>>> from django.contrib.auth.models import User, AnonymousUser
+>>> from django.contrib.auth.tokens import PasswordResetTokenGenerator
+>>> from django.conf import settings
+>>> u = User.objects.create_user('tokentestuser', 'test2@example.com', 'testpw')
+>>> p0 = PasswordResetTokenGenerator()
+>>> tk1 = p0.make_token(u)
+>>> p0.check_token(u, tk1)
+True
+
+Tests to ensure we can use the token after n days, but no greater.
+Use a mocked version of PasswordResetTokenGenerator so we can change
+the value of 'today'
+
+>>> class Mocked(PasswordResetTokenGenerator):
+...     def __init__(self, today):
+...         self._today_val = today
+...     def _today(self):
+...         return self._today_val
+
+>>> from datetime import date, timedelta
+>>> p1 = Mocked(date.today() + timedelta(settings.PASSWORD_RESET_TIMEOUT_DAYS))
+>>> p1.check_token(u, tk1)
+True
+>>> p2 = Mocked(date.today() + timedelta(settings.PASSWORD_RESET_TIMEOUT_DAYS + 1))
+>>> p2.check_token(u, tk1)
+False
+
+"""
diff --git a/webapp/django/contrib/auth/tests/views.py b/webapp/django/contrib/auth/tests/views.py
new file mode 100644
index 0000000..acd0336
--- /dev/null
+++ b/webapp/django/contrib/auth/tests/views.py
@@ -0,0 +1,164 @@
+
+import os
+import re
+
+from django.conf import settings
+from django.contrib.auth.models import User
+from django.test import TestCase
+from django.core import mail
+
+class PasswordResetTest(TestCase):
+    fixtures = ['authtestdata.json']
+    urls = 'django.contrib.auth.urls'
+
+    def test_email_not_found(self):
+        "Error is raised if the provided email address isn't currently registered"
+        response = self.client.get('/password_reset/')
+        self.assertEquals(response.status_code, 200)
+        response = self.client.post('/password_reset/', {'email': 'not_a_real_email@email.com'})
+        self.assertContains(response, "That e-mail address doesn't have an associated user account")
+        self.assertEquals(len(mail.outbox), 0)
+
+    def test_email_found(self):
+        "Email is sent if a valid email address is provided for password reset"
+        response = self.client.post('/password_reset/', {'email': 'staffmember@example.com'})
+        self.assertEquals(response.status_code, 302)
+        self.assertEquals(len(mail.outbox), 1)
+        self.assert_("http://" in mail.outbox[0].body)
+
+    def _test_confirm_start(self):
+        # Start by creating the email
+        response = self.client.post('/password_reset/', {'email': 'staffmember@example.com'})
+        self.assertEquals(response.status_code, 302)
+        self.assertEquals(len(mail.outbox), 1)
+        return self._read_signup_email(mail.outbox[0])
+
+    def _read_signup_email(self, email):
+        urlmatch = re.search(r"https?://[^/]*(/.*reset/\S*)", email.body)
+        self.assert_(urlmatch is not None, "No URL found in sent email")
+        return urlmatch.group(), urlmatch.groups()[0]
+
+    def test_confirm_valid(self):
+        url, path = self._test_confirm_start()
+        response = self.client.get(path)
+        # redirect to a 'complete' page:
+        self.assertEquals(response.status_code, 200)
+        self.assert_("Please enter your new password" in response.content)
+
+    def test_confirm_invalid(self):
+        url, path = self._test_confirm_start()
+        # Lets munge the token in the path, but keep the same length,
+        # in case the URL conf will reject a different length
+        path = path[:-5] + ("0"*4) + path[-1]
+
+        response = self.client.get(path)
+        self.assertEquals(response.status_code, 200)
+        self.assert_("The password reset link was invalid" in response.content)
+
+    def test_confirm_invalid_post(self):
+        # Same as test_confirm_invalid, but trying
+        # to do a POST instead.
+        url, path = self._test_confirm_start()
+        path = path[:-5] + ("0"*4) + path[-1]
+
+        response = self.client.post(path, {'new_password1': 'anewpassword',
+                                           'new_password2':' anewpassword'})
+        # Check the password has not been changed
+        u = User.objects.get(email='staffmember@example.com')
+        self.assert_(not u.check_password("anewpassword"))
+
+    def test_confirm_complete(self):
+        url, path = self._test_confirm_start()
+        response = self.client.post(path, {'new_password1': 'anewpassword',
+                                           'new_password2': 'anewpassword'})
+        # It redirects us to a 'complete' page:
+        self.assertEquals(response.status_code, 302)
+        # Check the password has been changed
+        u = User.objects.get(email='staffmember@example.com')
+        self.assert_(u.check_password("anewpassword"))
+
+        # Check we can't use the link again
+        response = self.client.get(path)
+        self.assertEquals(response.status_code, 200)
+        self.assert_("The password reset link was invalid" in response.content)
+
+    def test_confirm_different_passwords(self):
+        url, path = self._test_confirm_start()
+        response = self.client.post(path, {'new_password1': 'anewpassword',
+                                           'new_password2':' x'})
+        self.assertEquals(response.status_code, 200)
+        self.assert_("The two password fields didn't match" in response.content)
+
+
+class ChangePasswordTest(TestCase):
+    fixtures = ['authtestdata.json']
+    urls = 'django.contrib.auth.urls'
+
+    def setUp(self):
+        self.old_TEMPLATE_DIRS = settings.TEMPLATE_DIRS
+        settings.TEMPLATE_DIRS = (
+            os.path.join(
+                os.path.dirname(__file__),
+                'templates'
+            )
+        ,)
+
+    def tearDown(self):
+        settings.TEMPLATE_DIRS = self.old_TEMPLATE_DIRS
+
+    def login(self, password='password'):
+        response = self.client.post('/login/', {
+            'username': 'testclient',
+            'password': password
+            }
+        )
+        self.assertEquals(response.status_code, 302)
+        self.assert_(response['Location'].endswith('/accounts/profile/'))
+
+    def fail_login(self, password='password'):
+        response = self.client.post('/login/', {
+            'username': 'testclient',
+            'password': password
+            }
+        )
+        self.assertEquals(response.status_code, 200)
+        self.assert_("Please enter a correct username and password. Note that both fields are case-sensitive." in response.content)
+
+    def logout(self):
+        response = self.client.get('/logout/')
+
+    def test_password_change_fails_with_invalid_old_password(self):
+        self.login()
+        response = self.client.post('/password_change/', {
+            'old_password': 'donuts',
+            'new_password1': 'password1',
+            'new_password2': 'password1',
+            }
+        )
+        self.assertEquals(response.status_code, 200)
+        self.assert_("Your old password was entered incorrectly. Please enter it again." in response.content)
+
+    def test_password_change_fails_with_mismatched_passwords(self):
+        self.login()
+        response = self.client.post('/password_change/', {
+            'old_password': 'password',
+            'new_password1': 'password1',
+            'new_password2': 'donuts',
+            }
+        )
+        self.assertEquals(response.status_code, 200)
+        self.assert_("The two password fields didn't match." in response.content)
+
+    def test_password_change_succeeds(self):
+        self.login()
+        response = self.client.post('/password_change/', {
+            'old_password': 'password',
+            'new_password1': 'password1',
+            'new_password2': 'password1',
+            }
+        )
+        self.assertEquals(response.status_code, 302)
+        self.assert_(response['Location'].endswith('/password_change/done/'))
+        self.fail_login()
+        self.login(password='password1')
+
diff --git a/webapp/django/contrib/auth/tokens.py b/webapp/django/contrib/auth/tokens.py
new file mode 100644
index 0000000..c9b3535
--- /dev/null
+++ b/webapp/django/contrib/auth/tokens.py
@@ -0,0 +1,66 @@
+from datetime import date
+from django.conf import settings
+from django.utils.http import int_to_base36, base36_to_int
+
+class PasswordResetTokenGenerator(object):
+    """
+    Stratgy object used to generate and check tokens for the password
+    reset mechanism.
+    """
+    def make_token(self, user):
+        """
+        Returns a token that can be used once to do a password reset
+        for the given user.
+        """
+        return self._make_token_with_timestamp(user, self._num_days(self._today()))
+
+    def check_token(self, user, token):
+        """
+        Check that a password reset token is correct for a given user.
+        """
+        # Parse the tokem
+        try:
+            ts_b36, hash = token.split("-")
+        except ValueError:
+            return False
+
+        try:
+            ts = base36_to_int(ts_b36)
+        except ValueError:
+            return False
+
+        # Check that the timestamp/uid has not been tampered with
+        if self._make_token_with_timestamp(user, ts) != token:
+            return False
+
+        # Check the timestamp is within limit
+        if (self._num_days(self._today()) - ts) > settings.PASSWORD_RESET_TIMEOUT_DAYS:
+            return False
+
+        return True
+
+    def _make_token_with_timestamp(self, user, timestamp):
+        # timestamp is number of days since 2001-1-1.  Converted to
+        # base 36, this gives us a 3 digit string until about 2121
+        ts_b36 = int_to_base36(timestamp)
+
+        # By hashing on the internal state of the user and using state
+        # that is sure to change (the password salt will change as soon as
+        # the password is set, at least for current Django auth, and
+        # last_login will also change), we produce a hash that will be
+        # invalid as soon as it is used.
+        # We limit the hash to 20 chars to keep URL short
+        from django.utils.hashcompat import sha_constructor
+        hash = sha_constructor(settings.SECRET_KEY + unicode(user.id) +
+                               user.password + unicode(user.last_login) +
+                               unicode(timestamp)).hexdigest()[::2]
+        return "%s-%s" % (ts_b36, hash)
+
+    def _num_days(self, dt):
+        return (dt - date(2001,1,1)).days
+
+    def _today(self):
+        # Used for mocking in tests
+        return date.today()
+
+default_token_generator = PasswordResetTokenGenerator()
diff --git a/webapp/django/contrib/auth/urls.py b/webapp/django/contrib/auth/urls.py
new file mode 100644
index 0000000..4f8a102
--- /dev/null
+++ b/webapp/django/contrib/auth/urls.py
@@ -0,0 +1,17 @@
+# These URLs are normally mapped to /admin/urls.py. This URLs file is 
+# provided as a convenience to those who want to deploy these URLs elsewhere.
+# This file is also used to provide a reliable view deployment for test purposes.
+
+from django.conf.urls.defaults import *
+
+urlpatterns = patterns('',
+    (r'^login/$', 'django.contrib.auth.views.login'),
+    (r'^logout/$', 'django.contrib.auth.views.logout'),
+    (r'^password_change/$', 'django.contrib.auth.views.password_change'),
+    (r'^password_change/done/$', 'django.contrib.auth.views.password_change_done'),
+    (r'^password_reset/$', 'django.contrib.auth.views.password_reset'),
+    (r'^password_reset/done/$', 'django.contrib.auth.views.password_reset_done'),
+    (r'^reset/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$', 'django.contrib.auth.views.password_reset_confirm'),
+    (r'^reset/done/$', 'django.contrib.auth.views.password_reset_complete'),
+)
+
diff --git a/webapp/django/contrib/auth/views.py b/webapp/django/contrib/auth/views.py
new file mode 100644
index 0000000..e1f0d43
--- /dev/null
+++ b/webapp/django/contrib/auth/views.py
@@ -0,0 +1,157 @@
+from django.conf import settings
+from django.contrib.auth import REDIRECT_FIELD_NAME
+from django.contrib.auth.decorators import login_required
+from django.contrib.auth.forms import AuthenticationForm
+from django.contrib.auth.forms import PasswordResetForm, SetPasswordForm, PasswordChangeForm
+from django.contrib.auth.tokens import default_token_generator
+from django.core.urlresolvers import reverse
+from django.shortcuts import render_to_response, get_object_or_404
+from django.contrib.sites.models import Site, RequestSite
+from django.http import HttpResponseRedirect, Http404
+from django.template import RequestContext
+from django.utils.http import urlquote, base36_to_int
+from django.utils.translation import ugettext as _
+from django.contrib.auth.models import User
+from django.views.decorators.cache import never_cache
+
+def login(request, template_name='registration/login.html', redirect_field_name=REDIRECT_FIELD_NAME):
+    "Displays the login form and handles the login action."
+    redirect_to = request.REQUEST.get(redirect_field_name, '')
+    if request.method == "POST":
+        form = AuthenticationForm(data=request.POST)
+        if form.is_valid():
+            # Light security check -- make sure redirect_to isn't garbage.
+            if not redirect_to or '//' in redirect_to or ' ' in redirect_to:
+                redirect_to = settings.LOGIN_REDIRECT_URL
+            from django.contrib.auth import login
+            login(request, form.get_user())
+            if request.session.test_cookie_worked():
+                request.session.delete_test_cookie()
+            return HttpResponseRedirect(redirect_to)
+    else:
+        form = AuthenticationForm(request)
+    request.session.set_test_cookie()
+    if Site._meta.installed:
+        current_site = Site.objects.get_current()
+    else:
+        current_site = RequestSite(request)
+    return render_to_response(template_name, {
+        'form': form,
+        redirect_field_name: redirect_to,
+        'site_name': current_site.name,
+    }, context_instance=RequestContext(request))
+login = never_cache(login)
+
+def logout(request, next_page=None, template_name='registration/logged_out.html'):
+    "Logs out the user and displays 'You are logged out' message."
+    from django.contrib.auth import logout
+    logout(request)
+    if next_page is None:
+        return render_to_response(template_name, {'title': _('Logged out')}, context_instance=RequestContext(request))
+    else:
+        # Redirect to this page until the session has been cleared.
+        return HttpResponseRedirect(next_page or request.path)
+
+def logout_then_login(request, login_url=None):
+    "Logs out the user if he is logged in. Then redirects to the log-in page."
+    if not login_url:
+        login_url = settings.LOGIN_URL
+    return logout(request, login_url)
+
+def redirect_to_login(next, login_url=None, redirect_field_name=REDIRECT_FIELD_NAME):
+    "Redirects the user to the login page, passing the given 'next' page"
+    if not login_url:
+        login_url = settings.LOGIN_URL
+    return HttpResponseRedirect('%s?%s=%s' % (login_url, urlquote(redirect_field_name), urlquote(next)))
+
+# 4 views for password reset:
+# - password_reset sends the mail
+# - password_reset_done shows a success message for the above
+# - password_reset_confirm checks the link the user clicked and 
+#   prompts for a new password
+# - password_reset_complete shows a success message for the above
+
+def password_reset(request, is_admin_site=False, template_name='registration/password_reset_form.html',
+        email_template_name='registration/password_reset_email.html',
+        password_reset_form=PasswordResetForm, token_generator=default_token_generator,
+        post_reset_redirect=None):
+    if post_reset_redirect is None:
+        post_reset_redirect = reverse('django.contrib.auth.views.password_reset_done')
+    if request.method == "POST":
+        form = password_reset_form(request.POST)
+        if form.is_valid():
+            opts = {}
+            opts['use_https'] = request.is_secure()
+            opts['token_generator'] = token_generator
+            if is_admin_site:
+                opts['domain_override'] = request.META['HTTP_HOST']
+            else:
+                opts['email_template_name'] = email_template_name
+                if not Site._meta.installed:
+                    opts['domain_override'] = RequestSite(request).domain
+            form.save(**opts)
+            return HttpResponseRedirect(post_reset_redirect)
+    else:
+        form = password_reset_form()
+    return render_to_response(template_name, {
+        'form': form,
+    }, context_instance=RequestContext(request))
+
+def password_reset_done(request, template_name='registration/password_reset_done.html'):
+    return render_to_response(template_name, context_instance=RequestContext(request))
+
+def password_reset_confirm(request, uidb36=None, token=None, template_name='registration/password_reset_confirm.html',
+                           token_generator=default_token_generator, set_password_form=SetPasswordForm,
+                           post_reset_redirect=None):
+    """
+    View that checks the hash in a password reset link and presents a
+    form for entering a new password.
+    """
+    assert uidb36 is not None and token is not None # checked by URLconf
+    if post_reset_redirect is None:
+        post_reset_redirect = reverse('django.contrib.auth.views.password_reset_complete')
+    try:
+        uid_int = base36_to_int(uidb36)
+    except ValueError:
+        raise Http404
+
+    user = get_object_or_404(User, id=uid_int)
+    context_instance = RequestContext(request)
+
+    if token_generator.check_token(user, token):
+        context_instance['validlink'] = True
+        if request.method == 'POST':
+            form = set_password_form(user, request.POST)
+            if form.is_valid():
+                form.save()
+                return HttpResponseRedirect(post_reset_redirect)
+        else:
+            form = set_password_form(None)
+    else:
+        context_instance['validlink'] = False
+        form = None
+    context_instance['form'] = form    
+    return render_to_response(template_name, context_instance=context_instance)
+
+def password_reset_complete(request, template_name='registration/password_reset_complete.html'):
+    return render_to_response(template_name, context_instance=RequestContext(request,
+                                                                             {'login_url': settings.LOGIN_URL}))
+
+def password_change(request, template_name='registration/password_change_form.html',
+                    post_change_redirect=None):
+    if post_change_redirect is None:
+        post_change_redirect = reverse('django.contrib.auth.views.password_change_done')
+    if request.method == "POST":
+        form = PasswordChangeForm(request.user, request.POST)
+        if form.is_valid():
+            form.save()
+            return HttpResponseRedirect(post_change_redirect)
+    else:
+        form = PasswordChangeForm(request.user)
+    return render_to_response(template_name, {
+        'form': form,
+    }, context_instance=RequestContext(request))
+password_change = login_required(password_change)
+
+def password_change_done(request, template_name='registration/password_change_done.html'):
+    return render_to_response(template_name, context_instance=RequestContext(request))
diff --git a/webapp/django/contrib/comments/__init__.py b/webapp/django/contrib/comments/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/comments/__init__.py
diff --git a/webapp/django/contrib/comments/admin.py b/webapp/django/contrib/comments/admin.py
new file mode 100644
index 0000000..81ecc69
--- /dev/null
+++ b/webapp/django/contrib/comments/admin.py
@@ -0,0 +1,30 @@
+from django.contrib import admin
+from django.contrib.comments.models import Comment, FreeComment
+
+
+class CommentAdmin(admin.ModelAdmin):
+    fieldsets = (
+        (None, {'fields': ('content_type', 'object_id', 'site')}),
+        ('Content', {'fields': ('user', 'headline', 'comment')}),
+        ('Ratings', {'fields': ('rating1', 'rating2', 'rating3', 'rating4', 'rating5', 'rating6', 'rating7', 'rating8', 'valid_rating')}),
+        ('Meta', {'fields': ('is_public', 'is_removed', 'ip_address')}),
+    )
+    list_display = ('user', 'submit_date', 'content_type', 'get_content_object')
+    list_filter = ('submit_date',)
+    date_hierarchy = 'submit_date'
+    search_fields = ('comment', 'user__username')
+    raw_id_fields = ('user',)
+
+class FreeCommentAdmin(admin.ModelAdmin):
+    fieldsets = (
+        (None, {'fields': ('content_type', 'object_id', 'site')}),
+        ('Content', {'fields': ('person_name', 'comment')}),
+        ('Meta', {'fields': ('is_public', 'ip_address', 'approved')}),
+    )
+    list_display = ('person_name', 'submit_date', 'content_type', 'get_content_object')
+    list_filter = ('submit_date',)
+    date_hierarchy = 'submit_date'
+    search_fields = ('comment', 'person_name')
+
+admin.site.register(Comment, CommentAdmin)
+admin.site.register(FreeComment, FreeCommentAdmin)
\ No newline at end of file
diff --git a/webapp/django/contrib/comments/feeds.py b/webapp/django/contrib/comments/feeds.py
new file mode 100644
index 0000000..901254f
--- /dev/null
+++ b/webapp/django/contrib/comments/feeds.py
@@ -0,0 +1,44 @@
+from django.conf import settings
+from django.contrib.comments.models import Comment, FreeComment
+from django.contrib.syndication.feeds import Feed
+from django.contrib.sites.models import Site
+
+class LatestFreeCommentsFeed(Feed):
+    """Feed of latest free comments on the current site."""
+
+    comments_class = FreeComment
+
+    def title(self):
+        if not hasattr(self, '_site'):
+            self._site = Site.objects.get_current()
+        return u"%s comments" % self._site.name
+
+    def link(self):
+        if not hasattr(self, '_site'):
+            self._site = Site.objects.get_current()
+        return "http://%s/" % (self._site.domain)
+
+    def description(self):
+        if not hasattr(self, '_site'):
+            self._site = Site.objects.get_current()
+        return u"Latest comments on %s" % self._site.name
+
+    def get_query_set(self):
+        return self.comments_class.objects.filter(site__pk=settings.SITE_ID, is_public=True)
+
+    def items(self):
+        return self.get_query_set()[:40]
+
+class LatestCommentsFeed(LatestFreeCommentsFeed):
+    """Feed of latest comments on the current site."""
+
+    comments_class = Comment
+
+    def get_query_set(self):
+        qs = super(LatestCommentsFeed, self).get_query_set()
+        qs = qs.filter(is_removed=False)
+        if settings.COMMENTS_BANNED_USERS_GROUP:
+            where = ['user_id NOT IN (SELECT user_id FROM auth_users_group WHERE group_id = %s)']
+            params = [settings.COMMENTS_BANNED_USERS_GROUP]
+            qs = qs.extra(where=where, params=params)
+        return qs
diff --git a/webapp/django/contrib/comments/models.py b/webapp/django/contrib/comments/models.py
new file mode 100644
index 0000000..fdf34c8
--- /dev/null
+++ b/webapp/django/contrib/comments/models.py
@@ -0,0 +1,286 @@
+import datetime
+
+from django.db import models
+from django.contrib.contenttypes.models import ContentType
+from django.contrib.sites.models import Site
+from django.contrib.auth.models import User
+from django.utils.translation import ugettext_lazy as _
+from django.conf import settings
+
+MIN_PHOTO_DIMENSION = 5
+MAX_PHOTO_DIMENSION = 1000
+
+# Option codes for comment-form hidden fields.
+PHOTOS_REQUIRED = 'pr'
+PHOTOS_OPTIONAL = 'pa'
+RATINGS_REQUIRED = 'rr'
+RATINGS_OPTIONAL = 'ra'
+IS_PUBLIC = 'ip'
+
+# What users get if they don't have any karma.
+DEFAULT_KARMA = 5
+KARMA_NEEDED_BEFORE_DISPLAYED = 3
+
+
+class CommentManager(models.Manager):
+    def get_security_hash(self, options, photo_options, rating_options, target):
+        """
+        Returns the MD5 hash of the given options (a comma-separated string such as
+        'pa,ra') and target (something like 'lcom.eventtimes:5157'). Used to
+        validate that submitted form options have not been tampered-with.
+        """
+        from django.utils.hashcompat import md5_constructor
+        return md5_constructor(options + photo_options + rating_options + target + settings.SECRET_KEY).hexdigest()
+
+    def get_rating_options(self, rating_string):
+        """
+        Given a rating_string, this returns a tuple of (rating_range, options).
+        >>> s = "scale:1-10|First_category|Second_category"
+        >>> Comment.objects.get_rating_options(s)
+        ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], ['First category', 'Second category'])
+        """
+        rating_range, options = rating_string.split('|', 1)
+        rating_range = range(int(rating_range[6:].split('-')[0]), int(rating_range[6:].split('-')[1])+1)
+        choices = [c.replace('_', ' ') for c in options.split('|')]
+        return rating_range, choices
+
+    def get_list_with_karma(self, **kwargs):
+        """
+        Returns a list of Comment objects matching the given lookup terms, with
+        _karma_total_good and _karma_total_bad filled.
+        """
+        extra_kwargs = {}
+        extra_kwargs.setdefault('select', {})
+        extra_kwargs['select']['_karma_total_good'] = 'SELECT COUNT(*) FROM comments_karmascore, comments_comment WHERE comments_karmascore.comment_id=comments_comment.id AND score=1'
+        extra_kwargs['select']['_karma_total_bad'] = 'SELECT COUNT(*) FROM comments_karmascore, comments_comment WHERE comments_karmascore.comment_id=comments_comment.id AND score=-1'
+        return self.filter(**kwargs).extra(**extra_kwargs)
+
+    def user_is_moderator(self, user):
+        if user.is_superuser:
+            return True
+        for g in user.groups.all():
+            if g.id == settings.COMMENTS_MODERATORS_GROUP:
+                return True
+        return False
+
+
+class Comment(models.Model):
+    """A comment by a registered user."""
+    user = models.ForeignKey(User)
+    content_type = models.ForeignKey(ContentType)
+    object_id = models.IntegerField(_('object ID'))
+    headline = models.CharField(_('headline'), max_length=255, blank=True)
+    comment = models.TextField(_('comment'), max_length=3000)
+    rating1 = models.PositiveSmallIntegerField(_('rating #1'), blank=True, null=True)
+    rating2 = models.PositiveSmallIntegerField(_('rating #2'), blank=True, null=True)
+    rating3 = models.PositiveSmallIntegerField(_('rating #3'), blank=True, null=True)
+    rating4 = models.PositiveSmallIntegerField(_('rating #4'), blank=True, null=True)
+    rating5 = models.PositiveSmallIntegerField(_('rating #5'), blank=True, null=True)
+    rating6 = models.PositiveSmallIntegerField(_('rating #6'), blank=True, null=True)
+    rating7 = models.PositiveSmallIntegerField(_('rating #7'), blank=True, null=True)
+    rating8 = models.PositiveSmallIntegerField(_('rating #8'), blank=True, null=True)
+    # This field designates whether to use this row's ratings in aggregate
+    # functions (summaries). We need this because people are allowed to post
+    # multiple reviews on the same thing, but the system will only use the
+    # latest one (with valid_rating=True) in tallying the reviews.
+    valid_rating = models.BooleanField(_('is valid rating'))
+    submit_date = models.DateTimeField(_('date/time submitted'), auto_now_add=True)
+    is_public = models.BooleanField(_('is public'))
+    ip_address = models.IPAddressField(_('IP address'), blank=True, null=True)
+    is_removed = models.BooleanField(_('is removed'), help_text=_('Check this box if the comment is inappropriate. A "This comment has been removed" message will be displayed instead.'))
+    site = models.ForeignKey(Site)
+    objects = CommentManager()
+
+    class Meta:
+        verbose_name = _('comment')
+        verbose_name_plural = _('comments')
+        ordering = ('-submit_date',)
+
+    def __unicode__(self):
+        return "%s: %s..." % (self.user.username, self.comment[:100])
+
+    def get_absolute_url(self):
+        try:
+            return self.get_content_object().get_absolute_url() + "#c" + str(self.id)
+        except AttributeError:
+            return ""
+
+    def get_crossdomain_url(self):
+        return "/r/%d/%d/" % (self.content_type_id, self.object_id)
+
+    def get_flag_url(self):
+        return "/comments/flag/%s/" % self.id
+
+    def get_deletion_url(self):
+        return "/comments/delete/%s/" % self.id
+
+    def get_content_object(self):
+        """
+        Returns the object that this comment is a comment on. Returns None if
+        the object no longer exists.
+        """
+        from django.core.exceptions import ObjectDoesNotExist
+        try:
+            return self.content_type.get_object_for_this_type(pk=self.object_id)
+        except ObjectDoesNotExist:
+            return None
+
+    get_content_object.short_description = _('Content object')
+
+    def _fill_karma_cache(self):
+        """Helper function that populates good/bad karma caches."""
+        good, bad = 0, 0
+        for k in self.karmascore_set:
+            if k.score == -1:
+                bad +=1
+            elif k.score == 1:
+                good +=1
+        self._karma_total_good, self._karma_total_bad = good, bad
+
+    def get_good_karma_total(self):
+        if not hasattr(self, "_karma_total_good"):
+            self._fill_karma_cache()
+        return self._karma_total_good
+
+    def get_bad_karma_total(self):
+        if not hasattr(self, "_karma_total_bad"):
+            self._fill_karma_cache()
+        return self._karma_total_bad
+
+    def get_karma_total(self):
+        if not hasattr(self, "_karma_total_good") or not hasattr(self, "_karma_total_bad"):
+            self._fill_karma_cache()
+        return self._karma_total_good + self._karma_total_bad
+
+    def get_as_text(self):
+        return _('Posted by %(user)s at %(date)s\n\n%(comment)s\n\nhttp://%(domain)s%(url)s') % \
+            {'user': self.user.username, 'date': self.submit_date,
+            'comment': self.comment, 'domain': self.site.domain, 'url': self.get_absolute_url()}
+
+
+class FreeComment(models.Model):
+    """A comment by a non-registered user."""
+    content_type = models.ForeignKey(ContentType)
+    object_id = models.IntegerField(_('object ID'))
+    comment = models.TextField(_('comment'), max_length=3000)
+    person_name = models.CharField(_("person's name"), max_length=50)
+    submit_date = models.DateTimeField(_('date/time submitted'), auto_now_add=True)
+    is_public = models.BooleanField(_('is public'))
+    ip_address = models.IPAddressField(_('ip address'))
+    # TODO: Change this to is_removed, like Comment
+    approved = models.BooleanField(_('approved by staff'))
+    site = models.ForeignKey(Site)
+
+    class Meta:
+        verbose_name = _('free comment')
+        verbose_name_plural = _('free comments')
+        ordering = ('-submit_date',)
+
+    def __unicode__(self):
+        return "%s: %s..." % (self.person_name, self.comment[:100])
+
+    def get_absolute_url(self):
+        try:
+            return self.get_content_object().get_absolute_url() + "#c" + str(self.id)
+        except AttributeError:
+            return ""
+
+    def get_content_object(self):
+        """
+        Returns the object that this comment is a comment on. Returns None if
+        the object no longer exists.
+        """
+        from django.core.exceptions import ObjectDoesNotExist
+        try:
+            return self.content_type.get_object_for_this_type(pk=self.object_id)
+        except ObjectDoesNotExist:
+            return None
+
+    get_content_object.short_description = _('Content object')
+
+
+class KarmaScoreManager(models.Manager):
+    def vote(self, user_id, comment_id, score):
+        try:
+            karma = self.get(comment__pk=comment_id, user__pk=user_id)
+        except self.model.DoesNotExist:
+            karma = self.model(None, user_id=user_id, comment_id=comment_id, score=score, scored_date=datetime.datetime.now())
+            karma.save()
+        else:
+            karma.score = score
+            karma.scored_date = datetime.datetime.now()
+            karma.save()
+
+    def get_pretty_score(self, score):
+        """
+        Given a score between -1 and 1 (inclusive), returns the same score on a
+        scale between 1 and 10 (inclusive), as an integer.
+        """
+        if score is None:
+            return DEFAULT_KARMA
+        return int(round((4.5 * score) + 5.5))
+
+
+class KarmaScore(models.Model):
+    user = models.ForeignKey(User)
+    comment = models.ForeignKey(Comment)
+    score = models.SmallIntegerField(_('score'), db_index=True)
+    scored_date = models.DateTimeField(_('score date'), auto_now=True)
+    objects = KarmaScoreManager()
+
+    class Meta:
+        verbose_name = _('karma score')
+        verbose_name_plural = _('karma scores')
+        unique_together = (('user', 'comment'),)
+
+    def __unicode__(self):
+        return _("%(score)d rating by %(user)s") % {'score': self.score, 'user': self.user}
+
+
+class UserFlagManager(models.Manager):
+    def flag(self, comment, user):
+        """
+        Flags the given comment by the given user. If the comment has already
+        been flagged by the user, or it was a comment posted by the user,
+        nothing happens.
+        """
+        if int(comment.user_id) == int(user.id):
+            return # A user can't flag his own comment. Fail silently.
+        try:
+            f = self.get(user__pk=user.id, comment__pk=comment.id)
+        except self.model.DoesNotExist:
+            from django.core.mail import mail_managers
+            f = self.model(None, user.id, comment.id, None)
+            message = _('This comment was flagged by %(user)s:\n\n%(text)s') % {'user': user.username, 'text': comment.get_as_text()}
+            mail_managers('Comment flagged', message, fail_silently=True)
+            f.save()
+
+
+class UserFlag(models.Model):
+    user = models.ForeignKey(User)
+    comment = models.ForeignKey(Comment)
+    flag_date = models.DateTimeField(_('flag date'), auto_now_add=True)
+    objects = UserFlagManager()
+
+    class Meta:
+        verbose_name = _('user flag')
+        verbose_name_plural = _('user flags')
+        unique_together = (('user', 'comment'),)
+
+    def __unicode__(self):
+        return _("Flag by %r") % self.user
+
+
+class ModeratorDeletion(models.Model):
+    user = models.ForeignKey(User, verbose_name='moderator')
+    comment = models.ForeignKey(Comment)
+    deletion_date = models.DateTimeField(_('deletion date'), auto_now_add=True)
+
+    class Meta:
+        verbose_name = _('moderator deletion')
+        verbose_name_plural = _('moderator deletions')
+        unique_together = (('user', 'comment'),)
+
+    def __unicode__(self):
+        return _("Moderator deletion by %r") % self.user
+        
\ No newline at end of file
diff --git a/webapp/django/contrib/comments/templates/comments/form.html b/webapp/django/contrib/comments/templates/comments/form.html
new file mode 100644
index 0000000..11eaa8d
--- /dev/null
+++ b/webapp/django/contrib/comments/templates/comments/form.html
@@ -0,0 +1,38 @@
+{% load i18n %}
+{% if display_form %}
+<form {% if photos_optional or photos_required %}enctype="multipart/form-data" {% endif %}action="/comments/post/" method="post">
+
+{% if user.is_authenticated %}
+<p>{% trans "Username:" %} <strong>{{ user.username }}</strong> (<a href="{{ logout_url }}">{% trans "Log out" %}</a>)</p>
+{% else %}
+<p><label for="id_username">{% trans "Username:" %}</label> <input type="text" name="username" id="id_username" /><br />{% trans "Password:" %} <input type="password" name="password" id="id_password" /> (<a href="/accounts/password_reset/">{% trans "Forgotten your password?" %}</a>)</p>
+{% endif %}
+
+{% if ratings_optional or ratings_required %}
+<p>{% trans "Ratings" %} ({% if ratings_required %}{% trans "Required" %}{% else %}{% trans "Optional" %}{% endif %}):</p>
+<table>
+<tr><th>&nbsp;</th>{% for value in rating_range %}<th>{{ value }}</th>{% endfor %}</tr>
+{% for rating in rating_choices %}
+<tr><th>{{ rating }}</th>{% for value in rating_range %}<th><input type="radio" name="rating{{ forloop.parentloop.counter }}" value="{{ value }}" /></th>{% endfor %}</tr>
+{% endfor %}
+</table>
+<input type="hidden" name="rating_options" value="{{ rating_options }}" />
+{% endif %}
+
+{% if photos_optional or photos_required %}
+<p><label for="id_photo">{% trans "Post a photo" %}</label> ({% if photos_required %}{% trans "Required" %}{% else %}{% trans "Optional" %}{% endif %}):
+<input type="file" name="photo" id="id_photo" /></p>
+<input type="hidden" name="photo_options" value="{{ photo_options }}" />
+{% endif %}
+
+<p><label for="id_comment">{% trans "Comment:" %}</label><br />
+<textarea name="comment" id="id_comment" rows="10" cols="60"></textarea></p>
+
+<p>
+<input type="hidden" name="options" value="{{ options }}" />
+<input type="hidden" name="target" value="{{ target }}" />
+<input type="hidden" name="gonzo" value="{{ hash }}" />
+<input type="submit" name="preview" value="{% trans "Preview comment" %}" />
+</p>
+</form>
+{% endif %}
diff --git a/webapp/django/contrib/comments/templates/comments/freeform.html b/webapp/django/contrib/comments/templates/comments/freeform.html
new file mode 100644
index 0000000..f0d00b9
--- /dev/null
+++ b/webapp/django/contrib/comments/templates/comments/freeform.html
@@ -0,0 +1,13 @@
+{% load i18n %}
+{% if display_form %}
+<form action="/comments/postfree/" method="post">
+<p><label for="id_person_name">{% trans "Your name:" %}</label> <input type="text" id="id_person_name" name="person_name" /></p>
+<p><label for="id_comment">{% trans "Comment:" %}</label><br /><textarea name="comment" id="id_comment" rows="10" cols="60"></textarea></p>
+<p>
+<input type="hidden" name="options" value="{{ options }}" />
+<input type="hidden" name="target" value="{{ target }}" />
+<input type="hidden" name="gonzo" value="{{ hash }}" />
+<input type="submit" name="preview" value="{% trans "Preview comment" %}" />
+</p>
+</form>
+{% endif %}
diff --git a/webapp/django/contrib/comments/templatetags/__init__.py b/webapp/django/contrib/comments/templatetags/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/comments/templatetags/__init__.py
diff --git a/webapp/django/contrib/comments/templatetags/comments.py b/webapp/django/contrib/comments/templatetags/comments.py
new file mode 100644
index 0000000..959cec4
--- /dev/null
+++ b/webapp/django/contrib/comments/templatetags/comments.py
@@ -0,0 +1,332 @@
+from django.contrib.comments.models import Comment, FreeComment
+from django.contrib.comments.models import PHOTOS_REQUIRED, PHOTOS_OPTIONAL, RATINGS_REQUIRED, RATINGS_OPTIONAL, IS_PUBLIC
+from django.contrib.comments.models import MIN_PHOTO_DIMENSION, MAX_PHOTO_DIMENSION
+from django import template
+from django.template import loader
+from django.core.exceptions import ObjectDoesNotExist
+from django.contrib.contenttypes.models import ContentType
+from django.utils.encoding import smart_str
+import re
+
+register = template.Library()
+
+COMMENT_FORM = 'comments/form.html'
+FREE_COMMENT_FORM = 'comments/freeform.html'
+
+class CommentFormNode(template.Node):
+    def __init__(self, content_type, obj_id_lookup_var, obj_id, free,
+        photos_optional=False, photos_required=False, photo_options='',
+        ratings_optional=False, ratings_required=False, rating_options='',
+        is_public=True):
+        self.content_type = content_type
+        if obj_id_lookup_var is not None:
+            obj_id_lookup_var = template.Variable(obj_id_lookup_var)
+        self.obj_id_lookup_var, self.obj_id, self.free = obj_id_lookup_var, obj_id, free
+        self.photos_optional, self.photos_required = photos_optional, photos_required
+        self.ratings_optional, self.ratings_required = ratings_optional, ratings_required
+        self.photo_options, self.rating_options = photo_options, rating_options
+        self.is_public = is_public
+
+    def render(self, context):
+        from django.conf import settings
+        from django.utils.text import normalize_newlines
+        import base64
+        context.push()
+        if self.obj_id_lookup_var is not None:
+            try:
+                self.obj_id = self.obj_id_lookup_var.resolve(context)
+            except template.VariableDoesNotExist:
+                return ''
+            # Validate that this object ID is valid for this content-type.
+            # We only have to do this validation if obj_id_lookup_var is provided,
+            # because do_comment_form() validates hard-coded object IDs.
+            try:
+                self.content_type.get_object_for_this_type(pk=self.obj_id)
+            except ObjectDoesNotExist:
+                context['display_form'] = False
+            else:
+                context['display_form'] = True
+        else:
+            context['display_form'] = True
+        context['target'] = '%s:%s' % (self.content_type.id, self.obj_id)
+        options = []
+        for var, abbr in (('photos_required', PHOTOS_REQUIRED),
+                          ('photos_optional', PHOTOS_OPTIONAL),
+                          ('ratings_required', RATINGS_REQUIRED),
+                          ('ratings_optional', RATINGS_OPTIONAL),
+                          ('is_public', IS_PUBLIC)):
+            context[var] = getattr(self, var)
+            if getattr(self, var):
+                options.append(abbr)
+        context['options'] = ','.join(options)
+        if self.free:
+            context['hash'] = Comment.objects.get_security_hash(context['options'], '', '', context['target'])
+            default_form = loader.get_template(FREE_COMMENT_FORM)
+        else:
+            context['photo_options'] = self.photo_options
+            context['rating_options'] = normalize_newlines(base64.encodestring(self.rating_options).strip())
+            if self.rating_options:
+                context['rating_range'], context['rating_choices'] = Comment.objects.get_rating_options(self.rating_options)
+            context['hash'] = Comment.objects.get_security_hash(context['options'], context['photo_options'], context['rating_options'], context['target'])
+            context['logout_url'] = settings.LOGOUT_URL
+            default_form = loader.get_template(COMMENT_FORM)
+        output = default_form.render(context)
+        context.pop()
+        return output
+
+class CommentCountNode(template.Node):
+    def __init__(self, package, module, context_var_name, obj_id, var_name, free):
+        self.package, self.module = package, module
+        if context_var_name is not None:
+            context_var_name = template.Variable(context_var_name)
+        self.context_var_name, self.obj_id = context_var_name, obj_id
+        self.var_name, self.free = var_name, free
+
+    def render(self, context):
+        from django.conf import settings
+        manager = self.free and FreeComment.objects or Comment.objects
+        if self.context_var_name is not None:
+            self.obj_id = self.context_var_name.resolve(context)
+        comment_count = manager.filter(object_id__exact=self.obj_id,
+            content_type__app_label__exact=self.package,
+            content_type__model__exact=self.module, site__id__exact=settings.SITE_ID).count()
+        context[self.var_name] = comment_count
+        return ''
+
+class CommentListNode(template.Node):
+    def __init__(self, package, module, context_var_name, obj_id, var_name, free, ordering, extra_kwargs=None):
+        self.package, self.module = package, module
+        if context_var_name is not None:
+            context_var_name = template.Variable(context_var_name)
+        self.context_var_name, self.obj_id = context_var_name, obj_id
+        self.var_name, self.free = var_name, free
+        self.ordering = ordering
+        self.extra_kwargs = extra_kwargs or {}
+
+    def render(self, context):
+        from django.conf import settings
+        get_list_function = self.free and FreeComment.objects.filter or Comment.objects.get_list_with_karma
+        if self.context_var_name is not None:
+            try:
+                self.obj_id = self.context_var_name.resolve(context)
+            except template.VariableDoesNotExist:
+                return ''
+        kwargs = {
+            'object_id__exact': self.obj_id,
+            'content_type__app_label__exact': self.package,
+            'content_type__model__exact': self.module,
+            'site__id__exact': settings.SITE_ID,
+        }
+        kwargs.update(self.extra_kwargs)
+        comment_list = get_list_function(**kwargs).order_by(self.ordering + 'submit_date').select_related()
+        if not self.free and settings.COMMENTS_BANNED_USERS_GROUP:
+            comment_list = comment_list.extra(select={'is_hidden': 'user_id IN (SELECT user_id FROM auth_user_groups WHERE group_id = %s)' % settings.COMMENTS_BANNED_USERS_GROUP})
+
+        if not self.free:
+            if 'user' in context and context['user'].is_authenticated():
+                user_id = context['user'].id
+                context['user_can_moderate_comments'] = Comment.objects.user_is_moderator(context['user'])
+            else:
+                user_id = None
+                context['user_can_moderate_comments'] = False
+            # Only display comments by banned users to those users themselves.
+            if settings.COMMENTS_BANNED_USERS_GROUP:
+                comment_list = [c for c in comment_list if not c.is_hidden or (user_id == c.user_id)]
+
+        context[self.var_name] = comment_list
+        return ''
+
+class DoCommentForm:
+    """
+    Displays a comment form for the given params.
+
+    Syntax::
+
+        {% comment_form for [pkg].[py_module_name] [context_var_containing_obj_id] with [list of options] %}
+
+    Example usage::
+
+        {% comment_form for lcom.eventtimes event.id with is_public yes photos_optional thumbs,200,400 ratings_optional scale:1-5|first_option|second_option %}
+
+    ``[context_var_containing_obj_id]`` can be a hard-coded integer or a variable containing the ID.
+    """
+    def __init__(self, free):
+        self.free = free
+
+    def __call__(self, parser, token):
+        tokens = token.contents.split()
+        if len(tokens) < 4:
+            raise template.TemplateSyntaxError, "%r tag requires at least 3 arguments" % tokens[0]
+        if tokens[1] != 'for':
+            raise template.TemplateSyntaxError, "Second argument in %r tag must be 'for'" % tokens[0]
+        try:
+            package, module = tokens[2].split('.')
+        except ValueError: # unpack list of wrong size
+            raise template.TemplateSyntaxError, "Third argument in %r tag must be in the format 'package.module'" % tokens[0]
+        try:
+            content_type = ContentType.objects.get(app_label__exact=package, model__exact=module)
+        except ContentType.DoesNotExist:
+            raise template.TemplateSyntaxError, "%r tag has invalid content-type '%s.%s'" % (tokens[0], package, module)
+        obj_id_lookup_var, obj_id = None, None
+        if tokens[3].isdigit():
+            obj_id = tokens[3]
+            try: # ensure the object ID is valid
+                content_type.get_object_for_this_type(pk=obj_id)
+            except ObjectDoesNotExist:
+                raise template.TemplateSyntaxError, "%r tag refers to %s object with ID %s, which doesn't exist" % (tokens[0], content_type.name, obj_id)
+        else:
+            obj_id_lookup_var = tokens[3]
+        kwargs = {}
+        if len(tokens) > 4:
+            if tokens[4] != 'with':
+                raise template.TemplateSyntaxError, "Fourth argument in %r tag must be 'with'" % tokens[0]
+            for option, args in zip(tokens[5::2], tokens[6::2]):
+                option = smart_str(option)
+                if option in ('photos_optional', 'photos_required') and not self.free:
+                    # VALIDATION ##############################################
+                    option_list = args.split(',')
+                    if len(option_list) % 3 != 0:
+                        raise template.TemplateSyntaxError, "Incorrect number of comma-separated arguments to %r tag" % tokens[0]
+                    for opt in option_list[::3]:
+                        if not opt.isalnum():
+                            raise template.TemplateSyntaxError, "Invalid photo directory name in %r tag: '%s'" % (tokens[0], opt)
+                    for opt in option_list[1::3] + option_list[2::3]:
+                        if not opt.isdigit() or not (MIN_PHOTO_DIMENSION <= int(opt) <= MAX_PHOTO_DIMENSION):
+                            raise template.TemplateSyntaxError, "Invalid photo dimension in %r tag: '%s'. Only values between %s and %s are allowed." % (tokens[0], opt, MIN_PHOTO_DIMENSION, MAX_PHOTO_DIMENSION)
+                    # VALIDATION ENDS #########################################
+                    kwargs[option] = True
+                    kwargs['photo_options'] = args
+                elif option in ('ratings_optional', 'ratings_required') and not self.free:
+                    # VALIDATION ##############################################
+                    if 2 < len(args.split('|')) > 9:
+                        raise template.TemplateSyntaxError, "Incorrect number of '%s' options in %r tag. Use between 2 and 8." % (option, tokens[0])
+                    if re.match('^scale:\d+\-\d+\:$', args.split('|')[0]):
+                        raise template.TemplateSyntaxError, "Invalid 'scale' in %r tag's '%s' options" % (tokens[0], option)
+                    # VALIDATION ENDS #########################################
+                    kwargs[option] = True
+                    kwargs['rating_options'] = args
+                elif option in ('is_public'):
+                    kwargs[option] = (args == 'true')
+                else:
+                    raise template.TemplateSyntaxError, "%r tag got invalid parameter '%s'" % (tokens[0], option)
+        return CommentFormNode(content_type, obj_id_lookup_var, obj_id, self.free, **kwargs)
+
+class DoCommentCount:
+    """
+    Gets comment count for the given params and populates the template context
+    with a variable containing that value, whose name is defined by the 'as'
+    clause.
+
+    Syntax::
+
+        {% get_comment_count for [pkg].[py_module_name] [context_var_containing_obj_id] as [varname]  %}
+
+    Example usage::
+
+        {% get_comment_count for lcom.eventtimes event.id as comment_count %}
+
+    Note: ``[context_var_containing_obj_id]`` can also be a hard-coded integer, like this::
+
+        {% get_comment_count for lcom.eventtimes 23 as comment_count %}
+    """
+    def __init__(self, free):
+        self.free = free
+
+    def __call__(self, parser, token):
+        tokens = token.contents.split()
+        # Now tokens is a list like this:
+        # ['get_comment_list', 'for', 'lcom.eventtimes', 'event.id', 'as', 'comment_list']
+        if len(tokens) != 6:
+            raise template.TemplateSyntaxError, "%r tag requires 5 arguments" % tokens[0]
+        if tokens[1] != 'for':
+            raise template.TemplateSyntaxError, "Second argument in %r tag must be 'for'" % tokens[0]
+        try:
+            package, module = tokens[2].split('.')
+        except ValueError: # unpack list of wrong size
+            raise template.TemplateSyntaxError, "Third argument in %r tag must be in the format 'package.module'" % tokens[0]
+        try:
+            content_type = ContentType.objects.get(app_label__exact=package, model__exact=module)
+        except ContentType.DoesNotExist:
+            raise template.TemplateSyntaxError, "%r tag has invalid content-type '%s.%s'" % (tokens[0], package, module)
+        var_name, obj_id = None, None
+        if tokens[3].isdigit():
+            obj_id = tokens[3]
+            try: # ensure the object ID is valid
+                content_type.get_object_for_this_type(pk=obj_id)
+            except ObjectDoesNotExist:
+                raise template.TemplateSyntaxError, "%r tag refers to %s object with ID %s, which doesn't exist" % (tokens[0], content_type.name, obj_id)
+        else:
+            var_name = tokens[3]
+        if tokens[4] != 'as':
+            raise template.TemplateSyntaxError, "Fourth argument in %r must be 'as'" % tokens[0]
+        return CommentCountNode(package, module, var_name, obj_id, tokens[5], self.free)
+
+class DoGetCommentList:
+    """
+    Gets comments for the given params and populates the template context with a
+    special comment_package variable, whose name is defined by the ``as``
+    clause.
+
+    Syntax::
+
+        {% get_comment_list for [pkg].[py_module_name] [context_var_containing_obj_id] as [varname] (reversed) %}
+
+    Example usage::
+
+        {% get_comment_list for lcom.eventtimes event.id as comment_list %}
+
+    Note: ``[context_var_containing_obj_id]`` can also be a hard-coded integer, like this::
+
+        {% get_comment_list for lcom.eventtimes 23 as comment_list %}
+
+    To get a list of comments in reverse order -- that is, most recent first --
+    pass ``reversed`` as the last param::
+
+        {% get_comment_list for lcom.eventtimes event.id as comment_list reversed %}
+    """
+    def __init__(self, free):
+        self.free = free
+
+    def __call__(self, parser, token):
+        tokens = token.contents.split()
+        # Now tokens is a list like this:
+        # ['get_comment_list', 'for', 'lcom.eventtimes', 'event.id', 'as', 'comment_list']
+        if not len(tokens) in (6, 7):
+            raise template.TemplateSyntaxError, "%r tag requires 5 or 6 arguments" % tokens[0]
+        if tokens[1] != 'for':
+            raise template.TemplateSyntaxError, "Second argument in %r tag must be 'for'" % tokens[0]
+        try:
+            package, module = tokens[2].split('.')
+        except ValueError: # unpack list of wrong size
+            raise template.TemplateSyntaxError, "Third argument in %r tag must be in the format 'package.module'" % tokens[0]
+        try:
+            content_type = ContentType.objects.get(app_label__exact=package,model__exact=module)
+        except ContentType.DoesNotExist:
+            raise template.TemplateSyntaxError, "%r tag has invalid content-type '%s.%s'" % (tokens[0], package, module)
+        var_name, obj_id = None, None
+        if tokens[3].isdigit():
+            obj_id = tokens[3]
+            try: # ensure the object ID is valid
+                content_type.get_object_for_this_type(pk=obj_id)
+            except ObjectDoesNotExist:
+                raise template.TemplateSyntaxError, "%r tag refers to %s object with ID %s, which doesn't exist" % (tokens[0], content_type.name, obj_id)
+        else:
+            var_name = tokens[3]
+        if tokens[4] != 'as':
+            raise template.TemplateSyntaxError, "Fourth argument in %r must be 'as'" % tokens[0]
+        if len(tokens) == 7:
+            if tokens[6] != 'reversed':
+                raise template.TemplateSyntaxError, "Final argument in %r must be 'reversed' if given" % tokens[0]
+            ordering = "-"
+        else:
+            ordering = ""
+        return CommentListNode(package, module, var_name, obj_id, tokens[5], self.free, ordering)
+
+# registration comments
+register.tag('get_comment_list', DoGetCommentList(False))
+register.tag('comment_form', DoCommentForm(False))
+register.tag('get_comment_count', DoCommentCount(False))
+# free comments
+register.tag('get_free_comment_list', DoGetCommentList(True))
+register.tag('free_comment_form', DoCommentForm(True))
+register.tag('get_free_comment_count', DoCommentCount(True))
diff --git a/webapp/django/contrib/comments/tests.py b/webapp/django/contrib/comments/tests.py
new file mode 100644
index 0000000..a8275de
--- /dev/null
+++ b/webapp/django/contrib/comments/tests.py
@@ -0,0 +1,13 @@
+# coding: utf-8
+
+r"""
+>>> from django.contrib.comments.models import Comment
+>>> from django.contrib.auth.models import User
+>>> u = User.objects.create_user('commenttestuser', 'commenttest@example.com', 'testpw')
+>>> c = Comment(user=u, comment=u'\xe2')
+>>> c
+<Comment: commenttestuser: â...>
+>>> print c
+commenttestuser: â...
+"""
+
diff --git a/webapp/django/contrib/comments/urls/__init__.py b/webapp/django/contrib/comments/urls/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/comments/urls/__init__.py
diff --git a/webapp/django/contrib/comments/urls/comments.py b/webapp/django/contrib/comments/urls/comments.py
new file mode 100644
index 0000000..bbb4c43
--- /dev/null
+++ b/webapp/django/contrib/comments/urls/comments.py
@@ -0,0 +1,12 @@
+from django.conf.urls.defaults import *
+
+urlpatterns = patterns('django.contrib.comments.views',
+    (r'^post/$', 'comments.post_comment'),
+    (r'^postfree/$', 'comments.post_free_comment'),
+    (r'^posted/$', 'comments.comment_was_posted'),
+    (r'^karma/vote/(?P<comment_id>\d+)/(?P<vote>up|down)/$', 'karma.vote'),
+    (r'^flag/(?P<comment_id>\d+)/$', 'userflags.flag'),
+    (r'^flag/(?P<comment_id>\d+)/done/$', 'userflags.flag_done'),
+    (r'^delete/(?P<comment_id>\d+)/$', 'userflags.delete'),
+    (r'^delete/(?P<comment_id>\d+)/done/$', 'userflags.delete_done'),
+)
diff --git a/webapp/django/contrib/comments/views/__init__.py b/webapp/django/contrib/comments/views/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/comments/views/__init__.py
diff --git a/webapp/django/contrib/comments/views/comments.py b/webapp/django/contrib/comments/views/comments.py
new file mode 100644
index 0000000..ba59cba
--- /dev/null
+++ b/webapp/django/contrib/comments/views/comments.py
@@ -0,0 +1,393 @@
+import base64
+import datetime
+
+from django.core import validators
+from django import oldforms
+from django.core.mail import mail_admins, mail_managers
+from django.http import Http404
+from django.core.exceptions import ObjectDoesNotExist
+from django.shortcuts import render_to_response
+from django.template import RequestContext
+from django.contrib.comments.models import Comment, FreeComment, RATINGS_REQUIRED, RATINGS_OPTIONAL, IS_PUBLIC
+from django.contrib.contenttypes.models import ContentType
+from django.contrib.auth import authenticate
+from django.http import HttpResponseRedirect
+from django.utils.text import normalize_newlines
+from django.conf import settings
+from django.utils.translation import ungettext, ugettext as _
+from django.utils.encoding import smart_unicode
+
+COMMENTS_PER_PAGE = 20
+
+# TODO: This is a copy of the manipulator-based form that used to live in
+# contrib.auth.forms.  It should be replaced with the newforms version that
+# has now been added to contrib.auth.forms when the comments app gets updated
+# for newforms.
+
+class AuthenticationForm(oldforms.Manipulator):
+    """
+    Base class for authenticating users. Extend this to get a form that accepts
+    username/password logins.
+    """
+    def __init__(self, request=None):
+        """
+        If request is passed in, the manipulator will validate that cookies are
+        enabled. Note that the request (a HttpRequest object) must have set a
+        cookie with the key TEST_COOKIE_NAME and value TEST_COOKIE_VALUE before
+        running this validator.
+        """
+        self.request = request
+        self.fields = [
+            oldforms.TextField(field_name="username", length=15, max_length=30, is_required=True,
+                validator_list=[self.isValidUser, self.hasCookiesEnabled]),
+            oldforms.PasswordField(field_name="password", length=15, max_length=30, is_required=True),
+        ]
+        self.user_cache = None
+
+    def hasCookiesEnabled(self, field_data, all_data):
+        if self.request and not self.request.session.test_cookie_worked():
+            raise validators.ValidationError, _("Your Web browser doesn't appear to have cookies enabled. Cookies are required for logging in.")
+
+    def isValidUser(self, field_data, all_data):
+        username = field_data
+        password = all_data.get('password', None)
+        self.user_cache = authenticate(username=username, password=password)
+        if self.user_cache is None:
+            raise validators.ValidationError, _("Please enter a correct username and password. Note that both fields are case-sensitive.")
+        elif not self.user_cache.is_active:
+            raise validators.ValidationError, _("This account is inactive.")
+
+    def get_user_id(self):
+        if self.user_cache:
+            return self.user_cache.id
+        return None
+
+    def get_user(self):
+        return self.user_cache
+
+class PublicCommentManipulator(AuthenticationForm):
+    "Manipulator that handles public registered comments"
+    def __init__(self, user, ratings_required, ratings_range, num_rating_choices):
+        AuthenticationForm.__init__(self)
+        self.ratings_range, self.num_rating_choices = ratings_range, num_rating_choices
+        choices = [(c, c) for c in ratings_range]
+        def get_validator_list(rating_num):
+            if rating_num <= num_rating_choices:
+                return [validators.RequiredIfOtherFieldsGiven(['rating%d' % i for i in range(1, 9) if i != rating_num], _("This rating is required because you've entered at least one other rating."))]
+            else:
+                return []
+        self.fields.extend([
+            oldforms.LargeTextField(field_name="comment", max_length=3000, is_required=True,
+                validator_list=[self.hasNoProfanities]),
+            oldforms.RadioSelectField(field_name="rating1", choices=choices,
+                is_required=ratings_required and num_rating_choices > 0,
+                validator_list=get_validator_list(1),
+            ),
+            oldforms.RadioSelectField(field_name="rating2", choices=choices,
+                is_required=ratings_required and num_rating_choices > 1,
+                validator_list=get_validator_list(2),
+            ),
+            oldforms.RadioSelectField(field_name="rating3", choices=choices,
+                is_required=ratings_required and num_rating_choices > 2,
+                validator_list=get_validator_list(3),
+            ),
+            oldforms.RadioSelectField(field_name="rating4", choices=choices,
+                is_required=ratings_required and num_rating_choices > 3,
+                validator_list=get_validator_list(4),
+            ),
+            oldforms.RadioSelectField(field_name="rating5", choices=choices,
+                is_required=ratings_required and num_rating_choices > 4,
+                validator_list=get_validator_list(5),
+            ),
+            oldforms.RadioSelectField(field_name="rating6", choices=choices,
+                is_required=ratings_required and num_rating_choices > 5,
+                validator_list=get_validator_list(6),
+            ),
+            oldforms.RadioSelectField(field_name="rating7", choices=choices,
+                is_required=ratings_required and num_rating_choices > 6,
+                validator_list=get_validator_list(7),
+            ),
+            oldforms.RadioSelectField(field_name="rating8", choices=choices,
+                is_required=ratings_required and num_rating_choices > 7,
+                validator_list=get_validator_list(8),
+            ),
+        ])
+        if user.is_authenticated():
+            self["username"].is_required = False
+            self["username"].validator_list = []
+            self["password"].is_required = False
+            self["password"].validator_list = []
+            self.user_cache = user
+
+    def hasNoProfanities(self, field_data, all_data):
+        if settings.COMMENTS_ALLOW_PROFANITIES:
+            return
+        return validators.hasNoProfanities(field_data, all_data)
+
+    def get_comment(self, new_data):
+        "Helper function"
+        return Comment(None, self.get_user_id(), new_data["content_type_id"],
+            new_data["object_id"], new_data.get("headline", "").strip(),
+            new_data["comment"].strip(), new_data.get("rating1", None),
+            new_data.get("rating2", None), new_data.get("rating3", None),
+            new_data.get("rating4", None), new_data.get("rating5", None),
+            new_data.get("rating6", None), new_data.get("rating7", None),
+            new_data.get("rating8", None), new_data.get("rating1", None) is not None,
+            datetime.datetime.now(), new_data["is_public"], new_data["ip_address"], False, settings.SITE_ID)
+
+    def save(self, new_data):
+        today = datetime.date.today()
+        c = self.get_comment(new_data)
+        for old in Comment.objects.filter(content_type__id__exact=new_data["content_type_id"],
+            object_id__exact=new_data["object_id"], user__id__exact=self.get_user_id()):
+            # Check that this comment isn't duplicate. (Sometimes people post
+            # comments twice by mistake.) If it is, fail silently by pretending
+            # the comment was posted successfully.
+            if old.submit_date.date() == today and old.comment == c.comment \
+                and old.rating1 == c.rating1 and old.rating2 == c.rating2 \
+                and old.rating3 == c.rating3 and old.rating4 == c.rating4 \
+                and old.rating5 == c.rating5 and old.rating6 == c.rating6 \
+                and old.rating7 == c.rating7 and old.rating8 == c.rating8:
+                return old
+            # If the user is leaving a rating, invalidate all old ratings.
+            if c.rating1 is not None:
+                old.valid_rating = False
+                old.save()
+        c.save()
+        # If the commentor has posted fewer than COMMENTS_FIRST_FEW comments,
+        # send the comment to the managers.
+        if self.user_cache.comment_set.count() <= settings.COMMENTS_FIRST_FEW:
+            message = ungettext('This comment was posted by a user who has posted fewer than %(count)s comment:\n\n%(text)s',
+                'This comment was posted by a user who has posted fewer than %(count)s comments:\n\n%(text)s', settings.COMMENTS_FIRST_FEW) % \
+                {'count': settings.COMMENTS_FIRST_FEW, 'text': c.get_as_text()}
+            mail_managers("Comment posted by rookie user", message)
+        if settings.COMMENTS_SKETCHY_USERS_GROUP and settings.COMMENTS_SKETCHY_USERS_GROUP in [g.id for g in self.user_cache.groups.all()]:
+            message = _('This comment was posted by a sketchy user:\n\n%(text)s') % {'text': c.get_as_text()}
+            mail_managers("Comment posted by sketchy user (%s)" % self.user_cache.username, c.get_as_text())
+        return c
+
+class PublicFreeCommentManipulator(oldforms.Manipulator):
+    "Manipulator that handles public free (unregistered) comments"
+    def __init__(self):
+        self.fields = (
+            oldforms.TextField(field_name="person_name", max_length=50, is_required=True,
+                validator_list=[self.hasNoProfanities]),
+            oldforms.LargeTextField(field_name="comment", max_length=3000, is_required=True,
+                validator_list=[self.hasNoProfanities]),
+        )
+
+    def hasNoProfanities(self, field_data, all_data):
+        if settings.COMMENTS_ALLOW_PROFANITIES:
+            return
+        return validators.hasNoProfanities(field_data, all_data)
+
+    def get_comment(self, new_data):
+        "Helper function"
+        return FreeComment(None, new_data["content_type_id"],
+            new_data["object_id"], new_data["comment"].strip(),
+            new_data["person_name"].strip(), datetime.datetime.now(), new_data["is_public"],
+            new_data["ip_address"], False, settings.SITE_ID)
+
+    def save(self, new_data):
+        today = datetime.date.today()
+        c = self.get_comment(new_data)
+        # Check that this comment isn't duplicate. (Sometimes people post
+        # comments twice by mistake.) If it is, fail silently by pretending
+        # the comment was posted successfully.
+        for old_comment in FreeComment.objects.filter(content_type__id__exact=new_data["content_type_id"],
+            object_id__exact=new_data["object_id"], person_name__exact=new_data["person_name"],
+            submit_date__year=today.year, submit_date__month=today.month,
+            submit_date__day=today.day):
+            if old_comment.comment == c.comment:
+                return old_comment
+        c.save()
+        return c
+
+def post_comment(request, extra_context=None, context_processors=None):
+    """
+    Post a comment
+
+    Redirects to the `comments.comments.comment_was_posted` view upon success.
+
+    Templates: `comment_preview`
+    Context:
+        comment
+            the comment being posted
+        comment_form
+            the comment form
+        options
+            comment options
+        target
+            comment target
+        hash
+            security hash (must be included in a posted form to succesfully
+            post a comment).
+        rating_options
+            comment ratings options
+        ratings_optional
+            are ratings optional?
+        ratings_required
+            are ratings required?
+        rating_range
+            range of ratings
+        rating_choices
+            choice of ratings
+    """
+    if extra_context is None: extra_context = {}
+    if not request.POST:
+        raise Http404, _("Only POSTs are allowed")
+    try:
+        options, target, security_hash = request.POST['options'], request.POST['target'], request.POST['gonzo']
+    except KeyError:
+        raise Http404, _("One or more of the required fields wasn't submitted")
+    photo_options = request.POST.get('photo_options', '')
+    rating_options = normalize_newlines(request.POST.get('rating_options', ''))
+    if Comment.objects.get_security_hash(options, photo_options, rating_options, target) != security_hash:
+        raise Http404, _("Somebody tampered with the comment form (security violation)")
+    # Now we can be assured the data is valid.
+    if rating_options:
+        rating_range, rating_choices = Comment.objects.get_rating_options(base64.decodestring(rating_options))
+    else:
+        rating_range, rating_choices = [], []
+    content_type_id, object_id = target.split(':') # target is something like '52:5157'
+    try:
+        obj = ContentType.objects.get(pk=content_type_id).get_object_for_this_type(pk=object_id)
+    except ObjectDoesNotExist:
+        raise Http404, _("The comment form had an invalid 'target' parameter -- the object ID was invalid")
+    option_list = options.split(',') # options is something like 'pa,ra'
+    new_data = request.POST.copy()
+    new_data['content_type_id'] = content_type_id
+    new_data['object_id'] = object_id
+    new_data['ip_address'] = request.META.get('REMOTE_ADDR')
+    new_data['is_public'] = IS_PUBLIC in option_list
+    manipulator = PublicCommentManipulator(request.user,
+        ratings_required=RATINGS_REQUIRED in option_list,
+        ratings_range=rating_range,
+        num_rating_choices=len(rating_choices))
+    errors = manipulator.get_validation_errors(new_data)
+    # If user gave correct username/password and wasn't already logged in, log them in
+    # so they don't have to enter a username/password again.
+    if manipulator.get_user() and not manipulator.get_user().is_authenticated() and 'password' in new_data and manipulator.get_user().check_password(new_data['password']):
+        from django.contrib.auth import login
+        login(request, manipulator.get_user())
+    if errors or 'preview' in request.POST:
+        class CommentFormWrapper(oldforms.FormWrapper):
+            def __init__(self, manipulator, new_data, errors, rating_choices):
+                oldforms.FormWrapper.__init__(self, manipulator, new_data, errors)
+                self.rating_choices = rating_choices
+            def ratings(self):
+                field_list = [self['rating%d' % (i+1)] for i in range(len(rating_choices))]
+                for i, f in enumerate(field_list):
+                    f.choice = rating_choices[i]
+                return field_list
+        comment = errors and '' or manipulator.get_comment(new_data)
+        comment_form = CommentFormWrapper(manipulator, new_data, errors, rating_choices)
+        return render_to_response('comments/preview.html', {
+            'comment': comment,
+            'comment_form': comment_form,
+            'options': options,
+            'target': target,
+            'hash': security_hash,
+            'rating_options': rating_options,
+            'ratings_optional': RATINGS_OPTIONAL in option_list,
+            'ratings_required': RATINGS_REQUIRED in option_list,
+            'rating_range': rating_range,
+            'rating_choices': rating_choices,
+        }, context_instance=RequestContext(request, extra_context, context_processors))
+    elif 'post' in request.POST:
+        # If the IP is banned, mail the admins, do NOT save the comment, and
+        # serve up the "Thanks for posting" page as if the comment WAS posted.
+        if request.META['REMOTE_ADDR'] in settings.BANNED_IPS:
+            mail_admins("Banned IP attempted to post comment", smart_unicode(request.POST) + "\n\n" + str(request.META))
+        else:
+            manipulator.do_html2python(new_data)
+            comment = manipulator.save(new_data)
+        return HttpResponseRedirect("../posted/?c=%s:%s" % (content_type_id, object_id))
+    else:
+        raise Http404, _("The comment form didn't provide either 'preview' or 'post'")
+
+def post_free_comment(request, extra_context=None, context_processors=None):
+    """
+    Post a free comment (not requiring a log in)
+
+    Redirects to `comments.comments.comment_was_posted` view on success.
+
+    Templates: `comment_free_preview`
+    Context:
+        comment
+            comment being posted
+        comment_form
+            comment form object
+        options
+            comment options
+        target
+            comment target
+        hash
+            security hash (must be included in a posted form to succesfully
+            post a comment).
+    """
+    if extra_context is None: extra_context = {}
+    if not request.POST:
+        raise Http404, _("Only POSTs are allowed")
+    try:
+        options, target, security_hash = request.POST['options'], request.POST['target'], request.POST['gonzo']
+    except KeyError:
+        raise Http404, _("One or more of the required fields wasn't submitted")
+    if Comment.objects.get_security_hash(options, '', '', target) != security_hash:
+        raise Http404, _("Somebody tampered with the comment form (security violation)")
+    content_type_id, object_id = target.split(':') # target is something like '52:5157'
+    content_type = ContentType.objects.get(pk=content_type_id)
+    try:
+        obj = content_type.get_object_for_this_type(pk=object_id)
+    except ObjectDoesNotExist:
+        raise Http404, _("The comment form had an invalid 'target' parameter -- the object ID was invalid")
+    option_list = options.split(',')
+    new_data = request.POST.copy()
+    new_data['content_type_id'] = content_type_id
+    new_data['object_id'] = object_id
+    new_data['ip_address'] = request.META['REMOTE_ADDR']
+    new_data['is_public'] = IS_PUBLIC in option_list
+    manipulator = PublicFreeCommentManipulator()
+    errors = manipulator.get_validation_errors(new_data)
+    if errors or 'preview' in request.POST:
+        comment = errors and '' or manipulator.get_comment(new_data)
+        return render_to_response('comments/free_preview.html', {
+            'comment': comment,
+            'comment_form': oldforms.FormWrapper(manipulator, new_data, errors),
+            'options': options,
+            'target': target,
+            'hash': security_hash,
+        }, context_instance=RequestContext(request, extra_context, context_processors))
+    elif 'post' in request.POST:
+        # If the IP is banned, mail the admins, do NOT save the comment, and
+        # serve up the "Thanks for posting" page as if the comment WAS posted.
+        if request.META['REMOTE_ADDR'] in settings.BANNED_IPS:
+            from django.core.mail import mail_admins
+            mail_admins("Practical joker", smart_unicode(request.POST) + "\n\n" + str(request.META))
+        else:
+            manipulator.do_html2python(new_data)
+            comment = manipulator.save(new_data)
+        return HttpResponseRedirect("../posted/?c=%s:%s" % (content_type_id, object_id))
+    else:
+        raise Http404, _("The comment form didn't provide either 'preview' or 'post'")
+
+def comment_was_posted(request, extra_context=None, context_processors=None):
+    """
+    Display "comment was posted" success page
+
+    Templates: `comment_posted`
+    Context:
+        object
+            The object the comment was posted on
+    """
+    if extra_context is None: extra_context = {}
+    obj = None
+    if 'c' in request.GET:
+        content_type_id, object_id = request.GET['c'].split(':')
+        try:
+            content_type = ContentType.objects.get(pk=content_type_id)
+            obj = content_type.get_object_for_this_type(pk=object_id)
+        except ObjectDoesNotExist:
+            pass
+    return render_to_response('comments/posted.html', {'object': obj},
+        context_instance=RequestContext(request, extra_context, context_processors))
diff --git a/webapp/django/contrib/comments/views/karma.py b/webapp/django/contrib/comments/views/karma.py
new file mode 100644
index 0000000..7c0e284
--- /dev/null
+++ b/webapp/django/contrib/comments/views/karma.py
@@ -0,0 +1,32 @@
+from django.http import Http404
+from django.shortcuts import render_to_response
+from django.template import RequestContext
+from django.contrib.comments.models import Comment, KarmaScore
+from django.utils.translation import ugettext as _
+
+def vote(request, comment_id, vote, extra_context=None, context_processors=None):
+    """
+    Rate a comment (+1 or -1)
+
+    Templates: `karma_vote_accepted`
+    Context:
+        comment
+            `comments.comments` object being rated
+    """
+    if extra_context is None: extra_context = {}
+    rating = {'up': 1, 'down': -1}.get(vote, False)
+    if not rating:
+        raise Http404, "Invalid vote"
+    if not request.user.is_authenticated():
+        raise Http404, _("Anonymous users cannot vote")
+    try:
+        comment = Comment.objects.get(pk=comment_id)
+    except Comment.DoesNotExist:
+        raise Http404, _("Invalid comment ID")
+    if comment.user.id == request.user.id:
+        raise Http404, _("No voting for yourself")
+    KarmaScore.objects.vote(request.user.id, comment_id, rating)
+    # Reload comment to ensure we have up to date karma count
+    comment = Comment.objects.get(pk=comment_id)
+    return render_to_response('comments/karma_vote_accepted.html', {'comment': comment},
+        context_instance=RequestContext(request, extra_context, context_processors))
diff --git a/webapp/django/contrib/comments/views/userflags.py b/webapp/django/contrib/comments/views/userflags.py
new file mode 100644
index 0000000..91518dc
--- /dev/null
+++ b/webapp/django/contrib/comments/views/userflags.py
@@ -0,0 +1,62 @@
+from django.shortcuts import render_to_response, get_object_or_404
+from django.template import RequestContext
+from django.http import Http404
+from django.contrib.comments.models import Comment, ModeratorDeletion, UserFlag
+from django.contrib.auth.decorators import login_required
+from django.http import HttpResponseRedirect
+from django.conf import settings
+
+def flag(request, comment_id, extra_context=None, context_processors=None):
+    """
+    Flags a comment. Confirmation on GET, action on POST.
+
+    Templates: `comments/flag_verify`, `comments/flag_done`
+    Context:
+        comment
+            the flagged `comments.comments` object
+    """
+    if extra_context is None: extra_context = {}
+    comment = get_object_or_404(Comment,pk=comment_id, site__id__exact=settings.SITE_ID)
+    if request.POST:
+        UserFlag.objects.flag(comment, request.user)
+        return HttpResponseRedirect('%sdone/' % request.path)
+    return render_to_response('comments/flag_verify.html', {'comment': comment},
+        context_instance=RequestContext(request, extra_context, context_processors))
+flag = login_required(flag)
+
+def flag_done(request, comment_id, extra_context=None, context_processors=None):
+    if extra_context is None: extra_context = {}
+    comment = get_object_or_404(Comment,pk=comment_id, site__id__exact=settings.SITE_ID)
+    return render_to_response('comments/flag_done.html', {'comment': comment},
+        context_instance=RequestContext(request, extra_context, context_processors))
+
+def delete(request, comment_id, extra_context=None, context_processors=None):
+    """
+    Deletes a comment. Confirmation on GET, action on POST.
+
+    Templates: `comments/delete_verify`, `comments/delete_done`
+    Context:
+        comment
+            the flagged `comments.comments` object
+    """
+    if extra_context is None: extra_context = {}
+    comment = get_object_or_404(Comment,pk=comment_id, site__id__exact=settings.SITE_ID)
+    if not Comment.objects.user_is_moderator(request.user):
+        raise Http404
+    if request.POST:
+        # If the comment has already been removed, silently fail.
+        if not comment.is_removed:
+            comment.is_removed = True
+            comment.save()
+            m = ModeratorDeletion(None, request.user.id, comment.id, None)
+            m.save()
+        return HttpResponseRedirect('%sdone/' % request.path)
+    return render_to_response('comments/delete_verify.html', {'comment': comment},
+        context_instance=RequestContext(request, extra_context, context_processors))
+delete = login_required(delete)
+
+def delete_done(request, comment_id, extra_context=None, context_processors=None):
+    if extra_context is None: extra_context = {}
+    comment = get_object_or_404(Comment,pk=comment_id, site__id__exact=settings.SITE_ID)
+    return render_to_response('comments/delete_done.html', {'comment': comment},
+        context_instance=RequestContext(request, extra_context, context_processors))
diff --git a/webapp/django/contrib/contenttypes/__init__.py b/webapp/django/contrib/contenttypes/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/contenttypes/__init__.py
diff --git a/webapp/django/contrib/contenttypes/generic.py b/webapp/django/contrib/contenttypes/generic.py
new file mode 100644
index 0000000..9c85af2
--- /dev/null
+++ b/webapp/django/contrib/contenttypes/generic.py
@@ -0,0 +1,388 @@
+"""
+Classes allowing "generic" relations through ContentType and object-id fields.
+"""
+
+from django import oldforms
+from django.core.exceptions import ObjectDoesNotExist
+from django.db import connection
+from django.db.models import signals
+from django.db import models
+from django.db.models.fields.related import RelatedField, Field, ManyToManyRel
+from django.db.models.loading import get_model
+from django.utils.functional import curry
+
+from django.forms import ModelForm
+from django.forms.models import BaseModelFormSet, modelformset_factory, save_instance
+from django.contrib.admin.options import InlineModelAdmin, flatten_fieldsets
+
+class GenericForeignKey(object):
+    """
+    Provides a generic relation to any object through content-type/object-id
+    fields.
+    """
+
+    def __init__(self, ct_field="content_type", fk_field="object_id"):
+        self.ct_field = ct_field
+        self.fk_field = fk_field
+
+    def contribute_to_class(self, cls, name):
+        # Make sure the fields exist (these raise FieldDoesNotExist,
+        # which is a fine error to raise here)
+        self.name = name
+        self.model = cls
+        self.cache_attr = "_%s_cache" % name
+
+        # For some reason I don't totally understand, using weakrefs here doesn't work.
+        signals.pre_init.connect(self.instance_pre_init, sender=cls, weak=False)
+
+        # Connect myself as the descriptor for this field
+        setattr(cls, name, self)
+
+    def instance_pre_init(self, signal, sender, args, kwargs, **_kwargs):
+        """
+        Handles initializing an object with the generic FK instaed of
+        content-type/object-id fields.
+        """
+        if self.name in kwargs:
+            value = kwargs.pop(self.name)
+            kwargs[self.ct_field] = self.get_content_type(obj=value)
+            kwargs[self.fk_field] = value._get_pk_val()
+
+    def get_content_type(self, obj=None, id=None):
+        # Convenience function using get_model avoids a circular import when
+        # using this model
+        ContentType = get_model("contenttypes", "contenttype")
+        if obj:
+            return ContentType.objects.get_for_model(obj)
+        elif id:
+            return ContentType.objects.get_for_id(id)
+        else:
+            # This should never happen. I love comments like this, don't you?
+            raise Exception("Impossible arguments to GFK.get_content_type!")
+
+    def __get__(self, instance, instance_type=None):
+        if instance is None:
+            raise AttributeError, u"%s must be accessed via instance" % self.name
+
+        try:
+            return getattr(instance, self.cache_attr)
+        except AttributeError:
+            rel_obj = None
+
+            # Make sure to use ContentType.objects.get_for_id() to ensure that
+            # lookups are cached (see ticket #5570). This takes more code than
+            # the naive ``getattr(instance, self.ct_field)``, but has better
+            # performance when dealing with GFKs in loops and such.
+            f = self.model._meta.get_field(self.ct_field)
+            ct_id = getattr(instance, f.get_attname(), None)
+            if ct_id:
+                ct = self.get_content_type(id=ct_id)
+                try:
+                    rel_obj = ct.get_object_for_this_type(pk=getattr(instance, self.fk_field))
+                except ObjectDoesNotExist:
+                    pass
+            setattr(instance, self.cache_attr, rel_obj)
+            return rel_obj
+
+    def __set__(self, instance, value):
+        if instance is None:
+            raise AttributeError, u"%s must be accessed via instance" % self.related.opts.object_name
+
+        ct = None
+        fk = None
+        if value is not None:
+            ct = self.get_content_type(obj=value)
+            fk = value._get_pk_val()
+
+        setattr(instance, self.ct_field, ct)
+        setattr(instance, self.fk_field, fk)
+        setattr(instance, self.cache_attr, value)
+
+class GenericRelation(RelatedField, Field):
+    """Provides an accessor to generic related objects (e.g. comments)"""
+
+    def __init__(self, to, **kwargs):
+        kwargs['verbose_name'] = kwargs.get('verbose_name', None)
+        kwargs['rel'] = GenericRel(to,
+                            related_name=kwargs.pop('related_name', None),
+                            limit_choices_to=kwargs.pop('limit_choices_to', None),
+                            symmetrical=kwargs.pop('symmetrical', True))
+
+        # By its very nature, a GenericRelation doesn't create a table.
+        self.creates_table = False
+
+        # Override content-type/object-id field names on the related class
+        self.object_id_field_name = kwargs.pop("object_id_field", "object_id")
+        self.content_type_field_name = kwargs.pop("content_type_field", "content_type")
+
+        kwargs['blank'] = True
+        kwargs['editable'] = False
+        kwargs['serialize'] = False
+        Field.__init__(self, **kwargs)
+
+    def get_manipulator_field_objs(self):
+        choices = self.get_choices_default()
+        return [curry(oldforms.SelectMultipleField, size=min(max(len(choices), 5), 15), choices=choices)]
+
+    def get_choices_default(self):
+        return Field.get_choices(self, include_blank=False)
+
+    def flatten_data(self, follow, obj = None):
+        new_data = {}
+        if obj:
+            instance_ids = [instance._get_pk_val() for instance in getattr(obj, self.name).all()]
+            new_data[self.name] = instance_ids
+        return new_data
+
+    def m2m_db_table(self):
+        return self.rel.to._meta.db_table
+
+    def m2m_column_name(self):
+        return self.object_id_field_name
+
+    def m2m_reverse_name(self):
+        return self.model._meta.pk.column
+
+    def contribute_to_class(self, cls, name):
+        super(GenericRelation, self).contribute_to_class(cls, name)
+
+        # Save a reference to which model this class is on for future use
+        self.model = cls
+
+        # Add the descriptor for the m2m relation
+        setattr(cls, self.name, ReverseGenericRelatedObjectsDescriptor(self))
+
+    def contribute_to_related_class(self, cls, related):
+        pass
+
+    def set_attributes_from_rel(self):
+        pass
+
+    def get_internal_type(self):
+        return "ManyToManyField"
+
+    def db_type(self):
+        # Since we're simulating a ManyToManyField, in effect, best return the
+        # same db_type as well.
+        return None
+
+class ReverseGenericRelatedObjectsDescriptor(object):
+    """
+    This class provides the functionality that makes the related-object
+    managers available as attributes on a model class, for fields that have
+    multiple "remote" values and have a GenericRelation defined in their model
+    (rather than having another model pointed *at* them). In the example
+    "article.publications", the publications attribute is a
+    ReverseGenericRelatedObjectsDescriptor instance.
+    """
+    def __init__(self, field):
+        self.field = field
+
+    def __get__(self, instance, instance_type=None):
+        if instance is None:
+            raise AttributeError, "Manager must be accessed via instance"
+
+        # This import is done here to avoid circular import importing this module
+        from django.contrib.contenttypes.models import ContentType
+
+        # Dynamically create a class that subclasses the related model's
+        # default manager.
+        rel_model = self.field.rel.to
+        superclass = rel_model._default_manager.__class__
+        RelatedManager = create_generic_related_manager(superclass)
+
+        qn = connection.ops.quote_name
+
+        manager = RelatedManager(
+            model = rel_model,
+            instance = instance,
+            symmetrical = (self.field.rel.symmetrical and instance.__class__ == rel_model),
+            join_table = qn(self.field.m2m_db_table()),
+            source_col_name = qn(self.field.m2m_column_name()),
+            target_col_name = qn(self.field.m2m_reverse_name()),
+            content_type = ContentType.objects.get_for_model(self.field.model),
+            content_type_field_name = self.field.content_type_field_name,
+            object_id_field_name = self.field.object_id_field_name
+        )
+
+        return manager
+
+    def __set__(self, instance, value):
+        if instance is None:
+            raise AttributeError, "Manager must be accessed via instance"
+
+        manager = self.__get__(instance)
+        manager.clear()
+        for obj in value:
+            manager.add(obj)
+
+def create_generic_related_manager(superclass):
+    """
+    Factory function for a manager that subclasses 'superclass' (which is a
+    Manager) and adds behavior for generic related objects.
+    """
+
+    class GenericRelatedObjectManager(superclass):
+        def __init__(self, model=None, core_filters=None, instance=None, symmetrical=None,
+                     join_table=None, source_col_name=None, target_col_name=None, content_type=None,
+                     content_type_field_name=None, object_id_field_name=None):
+
+            super(GenericRelatedObjectManager, self).__init__()
+            self.core_filters = core_filters or {}
+            self.model = model
+            self.content_type = content_type
+            self.symmetrical = symmetrical
+            self.instance = instance
+            self.join_table = join_table
+            self.join_table = model._meta.db_table
+            self.source_col_name = source_col_name
+            self.target_col_name = target_col_name
+            self.content_type_field_name = content_type_field_name
+            self.object_id_field_name = object_id_field_name
+            self.pk_val = self.instance._get_pk_val()
+
+        def get_query_set(self):
+            query = {
+                '%s__pk' % self.content_type_field_name : self.content_type.id,
+                '%s__exact' % self.object_id_field_name : self.pk_val,
+            }
+            return superclass.get_query_set(self).filter(**query)
+
+        def add(self, *objs):
+            for obj in objs:
+                setattr(obj, self.content_type_field_name, self.content_type)
+                setattr(obj, self.object_id_field_name, self.pk_val)
+                obj.save()
+        add.alters_data = True
+
+        def remove(self, *objs):
+            for obj in objs:
+                obj.delete()
+        remove.alters_data = True
+
+        def clear(self):
+            for obj in self.all():
+                obj.delete()
+        clear.alters_data = True
+
+        def create(self, **kwargs):
+            kwargs[self.content_type_field_name] = self.content_type
+            kwargs[self.object_id_field_name] = self.pk_val
+            obj = self.model(**kwargs)
+            obj.save()
+            return obj
+        create.alters_data = True
+
+    return GenericRelatedObjectManager
+
+class GenericRel(ManyToManyRel):
+    def __init__(self, to, related_name=None, limit_choices_to=None, symmetrical=True):
+        self.to = to
+        self.related_name = related_name
+        self.limit_choices_to = limit_choices_to or {}
+        self.edit_inline = False
+        self.symmetrical = symmetrical
+        self.multiple = True
+
+class BaseGenericInlineFormSet(BaseModelFormSet):
+    """
+    A formset for generic inline objects to a parent.
+    """
+    ct_field_name = "content_type"
+    ct_fk_field_name = "object_id"
+    
+    def __init__(self, data=None, files=None, instance=None, save_as_new=None):
+        opts = self.model._meta
+        self.instance = instance
+        self.rel_name = '-'.join((
+            opts.app_label, opts.object_name.lower(),
+            self.ct_field.name, self.ct_fk_field.name,
+        ))
+        super(BaseGenericInlineFormSet, self).__init__(
+            queryset=self.get_queryset(), data=data, files=files,
+            prefix=self.rel_name
+        )
+
+    def get_queryset(self):
+        # Avoid a circular import.
+        from django.contrib.contenttypes.models import ContentType
+        if self.instance is None:
+            return self.model._default_manager.empty()
+        return self.model._default_manager.filter(**{
+            self.ct_field.name: ContentType.objects.get_for_model(self.instance),
+            self.ct_fk_field.name: self.instance.pk,
+        })
+
+    def save_new(self, form, commit=True):
+        # Avoid a circular import.
+        from django.contrib.contenttypes.models import ContentType
+        kwargs = {
+            self.ct_field.get_attname(): ContentType.objects.get_for_model(self.instance).pk,
+            self.ct_fk_field.get_attname(): self.instance.pk,
+        }
+        new_obj = self.model(**kwargs)
+        return save_instance(form, new_obj, commit=commit)
+
+def generic_inlineformset_factory(model, form=ModelForm,
+                                  formset=BaseGenericInlineFormSet,
+                                  ct_field="content_type", fk_field="object_id",
+                                  fields=None, exclude=None,
+                                  extra=3, can_order=False, can_delete=True,
+                                  max_num=0,
+                                  formfield_callback=lambda f: f.formfield()):
+    """
+    Returns an ``GenericInlineFormSet`` for the given kwargs.
+
+    You must provide ``ct_field`` and ``object_id`` if they different from the
+    defaults ``content_type`` and ``object_id`` respectively.
+    """
+    opts = model._meta
+    # Avoid a circular import.
+    from django.contrib.contenttypes.models import ContentType
+    # if there is no field called `ct_field` let the exception propagate
+    ct_field = opts.get_field(ct_field)
+    if not isinstance(ct_field, models.ForeignKey) or ct_field.rel.to != ContentType:
+        raise Exception("fk_name '%s' is not a ForeignKey to ContentType" % ct_field)
+    fk_field = opts.get_field(fk_field) # let the exception propagate
+    if exclude is not None:
+        exclude.extend([ct_field.name, fk_field.name])
+    else:
+        exclude = [ct_field.name, fk_field.name]
+    FormSet = modelformset_factory(model, form=form,
+                                   formfield_callback=formfield_callback,
+                                   formset=formset,
+                                   extra=extra, can_delete=can_delete, can_order=can_order,
+                                   fields=fields, exclude=exclude, max_num=max_num)
+    FormSet.ct_field = ct_field
+    FormSet.ct_fk_field = fk_field
+    return FormSet
+
+class GenericInlineModelAdmin(InlineModelAdmin):
+    ct_field = "content_type"
+    ct_fk_field = "object_id"
+    formset = BaseGenericInlineFormSet
+
+    def get_formset(self, request, obj=None):
+        if self.declared_fieldsets:
+            fields = flatten_fieldsets(self.declared_fieldsets)
+        else:
+            fields = None
+        defaults = {
+            "ct_field": self.ct_field,
+            "fk_field": self.ct_fk_field,
+            "form": self.form,
+            "formfield_callback": self.formfield_for_dbfield,
+            "formset": self.formset,
+            "extra": self.extra,
+            "can_delete": True,
+            "can_order": False,
+            "fields": fields,
+        }
+        return generic_inlineformset_factory(self.model, **defaults)
+
+class GenericStackedInline(GenericInlineModelAdmin):
+    template = 'admin/edit_inline/stacked.html'
+
+class GenericTabularInline(GenericInlineModelAdmin):
+    template = 'admin/edit_inline/tabular.html'
+
diff --git a/webapp/django/contrib/contenttypes/management.py b/webapp/django/contrib/contenttypes/management.py
new file mode 100644
index 0000000..736e213
--- /dev/null
+++ b/webapp/django/contrib/contenttypes/management.py
@@ -0,0 +1,42 @@
+from django.contrib.contenttypes.models import ContentType
+from django.db.models import get_apps, get_models, signals
+from django.utils.encoding import smart_unicode
+
+def update_contenttypes(app, created_models, verbosity=2, **kwargs):
+    """
+    Creates content types for models in the given app, removing any model
+    entries that no longer have a matching model class.
+    """
+    ContentType.objects.clear_cache()
+    content_types = list(ContentType.objects.filter(app_label=app.__name__.split('.')[-2]))
+    app_models = get_models(app)
+    if not app_models:
+        return
+    for klass in app_models:
+        opts = klass._meta
+        try:
+            ct = ContentType.objects.get(app_label=opts.app_label,
+                                         model=opts.object_name.lower())
+            content_types.remove(ct)
+        except ContentType.DoesNotExist:
+            ct = ContentType(name=smart_unicode(opts.verbose_name_raw),
+                app_label=opts.app_label, model=opts.object_name.lower())
+            ct.save()
+            if verbosity >= 2:
+                print "Adding content type '%s | %s'" % (ct.app_label, ct.model)
+    # The presence of any remaining content types means the supplied app has an
+    # undefined model and can safely be removed, which cascades to also remove
+    # related permissions.
+    for ct in content_types:
+        if verbosity >= 2:
+            print "Deleting stale content type '%s | %s'" % (ct.app_label, ct.model)
+        ct.delete()
+
+def update_all_contenttypes(verbosity=2):
+    for app in get_apps():
+        update_contenttypes(app, None, verbosity)
+
+signals.post_syncdb.connect(update_contenttypes)
+
+if __name__ == "__main__":
+    update_all_contenttypes()
diff --git a/webapp/django/contrib/contenttypes/models.py b/webapp/django/contrib/contenttypes/models.py
new file mode 100644
index 0000000..4df1edc
--- /dev/null
+++ b/webapp/django/contrib/contenttypes/models.py
@@ -0,0 +1,92 @@
+from django.db import models
+from django.utils.translation import ugettext_lazy as _
+from django.utils.encoding import smart_unicode
+
+class ContentTypeManager(models.Manager):
+
+    # Cache to avoid re-looking up ContentType objects all over the place.
+    # This cache is shared by all the get_for_* methods.
+    _cache = {}
+    
+    def get_for_model(self, model):
+        """
+        Returns the ContentType object for a given model, creating the
+        ContentType if necessary. Lookups are cached so that subsequent lookups
+        for the same model don't hit the database.
+        """
+        opts = model._meta
+        key = (opts.app_label, opts.object_name.lower())
+        try:
+            ct = self.__class__._cache[key]
+        except KeyError:
+            # Load or create the ContentType entry. The smart_unicode() is 
+            # needed around opts.verbose_name_raw because name_raw might be a
+            # django.utils.functional.__proxy__ object.
+            ct, created = self.get_or_create(
+                app_label = opts.app_label,
+                model = opts.object_name.lower(), 
+                defaults = {'name': smart_unicode(opts.verbose_name_raw)},
+            )
+            self._add_to_cache(ct)
+            
+        return ct
+        
+    def get_for_id(self, id):
+        """
+        Lookup a ContentType by ID. Uses the same shared cache as get_for_model
+        (though ContentTypes are obviously not created on-the-fly by get_by_id).
+        """
+        try:
+            ct = self.__class__._cache[id]
+        except KeyError:
+            # This could raise a DoesNotExist; that's correct behavior and will
+            # make sure that only correct ctypes get stored in the cache dict.
+            ct = self.get(pk=id)
+            self._add_to_cache(ct)
+        return ct
+            
+    def clear_cache(self):
+        """
+        Clear out the content-type cache. This needs to happen during database
+        flushes to prevent caching of "stale" content type IDs (see
+        django.contrib.contenttypes.management.update_contenttypes for where
+        this gets called).
+        """
+        self.__class__._cache.clear()
+        
+    def _add_to_cache(self, ct):
+        """Insert a ContentType into the cache."""
+        model = ct.model_class()
+        key = (model._meta.app_label, model._meta.object_name.lower())
+        self.__class__._cache[key] = ct
+        self.__class__._cache[ct.id] = ct
+
+class ContentType(models.Model):
+    name = models.CharField(max_length=100)
+    app_label = models.CharField(max_length=100)
+    model = models.CharField(_('python model class name'), max_length=100)
+    objects = ContentTypeManager()
+    
+    class Meta:
+        verbose_name = _('content type')
+        verbose_name_plural = _('content types')
+        db_table = 'django_content_type'
+        ordering = ('name',)
+        unique_together = (('app_label', 'model'),)
+
+    def __unicode__(self):
+        return self.name
+
+    def model_class(self):
+        "Returns the Python model class for this type of content."
+        from django.db import models
+        return models.get_model(self.app_label, self.model)
+
+    def get_object_for_this_type(self, **kwargs):
+        """
+        Returns an object of this type for the keyword arguments given.
+        Basically, this is a proxy around this object_type's get_object() model
+        method. The ObjectNotExist exception, if thrown, will not be caught,
+        so code that calls this method should catch it.
+        """
+        return self.model_class()._default_manager.get(**kwargs)
diff --git a/webapp/django/contrib/contenttypes/tests.py b/webapp/django/contrib/contenttypes/tests.py
new file mode 100644
index 0000000..148edfc
--- /dev/null
+++ b/webapp/django/contrib/contenttypes/tests.py
@@ -0,0 +1,47 @@
+"""
+Make sure that the content type cache (see ContentTypeManager) works correctly.
+Lookups for a particular content type -- by model or by ID -- should hit the
+database only on the first lookup.
+
+First, let's make sure we're dealing with a blank slate (and that DEBUG is on so
+that queries get logged)::
+
+    >>> from django.conf import settings
+    >>> settings.DEBUG = True
+
+    >>> from django.contrib.contenttypes.models import ContentType
+    >>> ContentType.objects.clear_cache()
+
+    >>> from django import db
+    >>> db.reset_queries()
+    
+At this point, a lookup for a ContentType should hit the DB::
+
+    >>> ContentType.objects.get_for_model(ContentType)
+    <ContentType: content type>
+    
+    >>> len(db.connection.queries)
+    1
+
+A second hit, though, won't hit the DB, nor will a lookup by ID::
+
+    >>> ct = ContentType.objects.get_for_model(ContentType)
+    >>> len(db.connection.queries)
+    1
+    >>> ContentType.objects.get_for_id(ct.id)
+    <ContentType: content type>
+    >>> len(db.connection.queries)
+    1
+
+Once we clear the cache, another lookup will again hit the DB::
+
+    >>> ContentType.objects.clear_cache()
+    >>> ContentType.objects.get_for_model(ContentType)
+    <ContentType: content type>
+    >>> len(db.connection.queries)
+    2
+
+Don't forget to reset DEBUG!
+
+    >>> settings.DEBUG = False
+"""
\ No newline at end of file
diff --git a/webapp/django/contrib/csrf/__init__.py b/webapp/django/contrib/csrf/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/csrf/__init__.py
diff --git a/webapp/django/contrib/csrf/middleware.py b/webapp/django/contrib/csrf/middleware.py
new file mode 100644
index 0000000..24c1511
--- /dev/null
+++ b/webapp/django/contrib/csrf/middleware.py
@@ -0,0 +1,94 @@
+"""
+Cross Site Request Forgery Middleware.
+
+This module provides a middleware that implements protection
+against request forgeries from other sites.
+"""
+
+import re
+import itertools
+
+from django.conf import settings
+from django.http import HttpResponseForbidden
+from django.utils.hashcompat import md5_constructor
+from django.utils.safestring import mark_safe
+
+_ERROR_MSG = mark_safe('<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"><body><h1>403 Forbidden</h1><p>Cross Site Request Forgery detected. Request aborted.</p></body></html>')
+
+_POST_FORM_RE = \
+    re.compile(r'(<form\W[^>]*\bmethod=(\'|"|)POST(\'|"|)\b[^>]*>)', re.IGNORECASE)
+
+_HTML_TYPES = ('text/html', 'application/xhtml+xml')
+
+def _make_token(session_id):
+    return md5_constructor(settings.SECRET_KEY + session_id).hexdigest()
+
+class CsrfMiddleware(object):
+    """Django middleware that adds protection against Cross Site
+    Request Forgeries by adding hidden form fields to POST forms and
+    checking requests for the correct value.
+
+    In the list of middlewares, SessionMiddleware is required, and must come
+    after this middleware.  CsrfMiddleWare must come after compression
+    middleware.
+
+    If a session ID cookie is present, it is hashed with the SECRET_KEY
+    setting to create an authentication token.  This token is added to all
+    outgoing POST forms and is expected on all incoming POST requests that
+    have a session ID cookie.
+
+    If you are setting cookies directly, instead of using Django's session
+    framework, this middleware will not work.
+    """
+
+    def process_request(self, request):
+        if request.method == 'POST':
+            try:
+                session_id = request.COOKIES[settings.SESSION_COOKIE_NAME]
+            except KeyError:
+                # No session, no check required
+                return None
+
+            csrf_token = _make_token(session_id)
+            # check incoming token
+            try:
+                request_csrf_token = request.POST['csrfmiddlewaretoken']
+            except KeyError:
+                return HttpResponseForbidden(_ERROR_MSG)
+
+            if request_csrf_token != csrf_token:
+                return HttpResponseForbidden(_ERROR_MSG)
+
+        return None
+
+    def process_response(self, request, response):
+        csrf_token = None
+        try:
+            cookie = response.cookies[settings.SESSION_COOKIE_NAME]
+            csrf_token = _make_token(cookie.value)
+        except KeyError:
+            # No outgoing cookie to set session, but
+            # a session might already exist.
+            try:
+                session_id = request.COOKIES[settings.SESSION_COOKIE_NAME]
+                csrf_token = _make_token(session_id)
+            except KeyError:
+                # no incoming or outgoing cookie
+                pass
+
+        if csrf_token is not None and \
+                response['Content-Type'].split(';')[0] in _HTML_TYPES:
+
+            # ensure we don't add the 'id' attribute twice (HTML validity)
+            idattributes = itertools.chain(("id='csrfmiddlewaretoken'",),
+                                            itertools.repeat(''))
+            def add_csrf_field(match):
+                """Returns the matched <form> tag plus the added <input> element"""
+                return mark_safe(match.group() + "<div style='display:none;'>" + \
+                "<input type='hidden' " + idattributes.next() + \
+                " name='csrfmiddlewaretoken' value='" + csrf_token + \
+                "' /></div>")
+
+            # Modify any POST forms
+            response.content = _POST_FORM_RE.sub(add_csrf_field, response.content)
+        return response
diff --git a/webapp/django/contrib/databrowse/__init__.py b/webapp/django/contrib/databrowse/__init__.py
new file mode 100644
index 0000000..e2f48ac
--- /dev/null
+++ b/webapp/django/contrib/databrowse/__init__.py
@@ -0,0 +1 @@
+from django.contrib.databrowse.sites import DatabrowsePlugin, ModelDatabrowse, DatabrowseSite, site
diff --git a/webapp/django/contrib/databrowse/datastructures.py b/webapp/django/contrib/databrowse/datastructures.py
new file mode 100644
index 0000000..5fdbdbe
--- /dev/null
+++ b/webapp/django/contrib/databrowse/datastructures.py
@@ -0,0 +1,217 @@
+"""
+These classes are light wrappers around Django's database API that provide
+convenience functionality and permalink functions for the databrowse app.
+"""
+
+from django.db import models
+from django.utils import dateformat
+from django.utils.text import capfirst
+from django.utils.translation import get_date_formats
+from django.utils.encoding import smart_unicode, smart_str, iri_to_uri
+from django.utils.safestring import mark_safe
+from django.db.models.query import QuerySet
+
+EMPTY_VALUE = '(None)'
+DISPLAY_SIZE = 100
+
+class EasyModel(object):
+    def __init__(self, site, model):
+        self.site = site
+        self.model = model
+        self.model_list = site.registry.keys()
+        self.verbose_name = model._meta.verbose_name
+        self.verbose_name_plural = model._meta.verbose_name_plural
+
+    def __repr__(self):
+        return '<EasyModel for %s>' % smart_str(self.model._meta.object_name)
+
+    def model_databrowse(self):
+        "Returns the ModelDatabrowse class for this model."
+        return self.site.registry[self.model]
+
+    def url(self):
+        return mark_safe('%s%s/%s/' % (self.site.root_url, self.model._meta.app_label, self.model._meta.module_name))
+
+    def objects(self, **kwargs):
+        return self.get_query_set().filter(**kwargs)
+
+    def get_query_set(self):
+        easy_qs = self.model._default_manager.get_query_set()._clone(klass=EasyQuerySet)
+        easy_qs._easymodel = self
+        return easy_qs
+
+    def object_by_pk(self, pk):
+        return EasyInstance(self, self.model._default_manager.get(pk=pk))
+
+    def sample_objects(self):
+        for obj in self.model._default_manager.all()[:3]:
+            yield EasyInstance(self, obj)
+
+    def field(self, name):
+        try:
+            f = self.model._meta.get_field(name)
+        except models.FieldDoesNotExist:
+            return None
+        return EasyField(self, f)
+
+    def fields(self):
+        return [EasyField(self, f) for f in (self.model._meta.fields + self.model._meta.many_to_many)]
+
+class EasyField(object):
+    def __init__(self, easy_model, field):
+        self.model, self.field = easy_model, field
+
+    def __repr__(self):
+        return smart_str(u'<EasyField for %s.%s>' % (self.model.model._meta.object_name, self.field.name))
+
+    def choices(self):
+        for value, label in self.field.choices:
+            yield EasyChoice(self.model, self, value, label)
+
+    def url(self):
+        if self.field.choices:
+            return mark_safe('%s%s/%s/%s/' % (self.model.site.root_url, self.model.model._meta.app_label, self.model.model._meta.module_name, self.field.name))
+        elif self.field.rel:
+            return mark_safe('%s%s/%s/' % (self.model.site.root_url, self.model.model._meta.app_label, self.model.model._meta.module_name))
+
+class EasyChoice(object):
+    def __init__(self, easy_model, field, value, label):
+        self.model, self.field = easy_model, field
+        self.value, self.label = value, label
+
+    def __repr__(self):
+        return smart_str(u'<EasyChoice for %s.%s>' % (self.model.model._meta.object_name, self.field.name))
+
+    def url(self):
+        return mark_safe('%s%s/%s/%s/%s/' % (self.model.site.root_url, self.model.model._meta.app_label, self.model.model._meta.module_name, self.field.field.name, iri_to_uri(self.value)))
+
+class EasyInstance(object):
+    def __init__(self, easy_model, instance):
+        self.model, self.instance = easy_model, instance
+
+    def __repr__(self):
+        return smart_str(u'<EasyInstance for %s (%s)>' % (self.model.model._meta.object_name, self.instance._get_pk_val()))
+
+    def __unicode__(self):
+        val = smart_unicode(self.instance)
+        if len(val) > DISPLAY_SIZE:
+            return val[:DISPLAY_SIZE] + u'...'
+        return val
+
+    def __str__(self):
+        return self.__unicode__().encode('utf-8')
+
+    def pk(self):
+        return self.instance._get_pk_val()
+
+    def url(self):
+        return mark_safe('%s%s/%s/objects/%s/' % (self.model.site.root_url, self.model.model._meta.app_label, self.model.model._meta.module_name, iri_to_uri(self.pk())))
+
+    def fields(self):
+        """
+        Generator that yields EasyInstanceFields for each field in this
+        EasyInstance's model.
+        """
+        for f in self.model.model._meta.fields + self.model.model._meta.many_to_many:
+            yield EasyInstanceField(self.model, self, f)
+
+    def related_objects(self):
+        """
+        Generator that yields dictionaries of all models that have this
+        EasyInstance's model as a ForeignKey or ManyToManyField, along with
+        lists of related objects.
+        """
+        for rel_object in self.model.model._meta.get_all_related_objects() + self.model.model._meta.get_all_related_many_to_many_objects():
+            if rel_object.model not in self.model.model_list:
+                continue # Skip models that aren't in the model_list
+            em = EasyModel(self.model.site, rel_object.model)
+            yield {
+                'model': em,
+                'related_field': rel_object.field.verbose_name,
+                'object_list': [EasyInstance(em, i) for i in getattr(self.instance, rel_object.get_accessor_name()).all()],
+            }
+
+class EasyInstanceField(object):
+    def __init__(self, easy_model, instance, field):
+        self.model, self.field, self.instance = easy_model, field, instance
+        self.raw_value = getattr(instance.instance, field.name)
+
+    def __repr__(self):
+        return smart_str(u'<EasyInstanceField for %s.%s>' % (self.model.model._meta.object_name, self.field.name))
+
+    def values(self):
+        """
+        Returns a list of values for this field for this instance. It's a list
+        so we can accomodate many-to-many fields.
+        """
+        # This import is deliberately inside the function because it causes
+        # some settings to be imported, and we don't want to do that at the
+        # module level.
+        if self.field.rel:
+            if isinstance(self.field.rel, models.ManyToOneRel):
+                objs = getattr(self.instance.instance, self.field.name)
+            elif isinstance(self.field.rel, models.ManyToManyRel): # ManyToManyRel
+                return list(getattr(self.instance.instance, self.field.name).all())
+        elif self.field.choices:
+            objs = dict(self.field.choices).get(self.raw_value, EMPTY_VALUE)
+        elif isinstance(self.field, models.DateField) or isinstance(self.field, models.TimeField):
+            if self.raw_value:
+                date_format, datetime_format, time_format = get_date_formats()
+                if isinstance(self.field, models.DateTimeField):
+                    objs = capfirst(dateformat.format(self.raw_value, datetime_format))
+                elif isinstance(self.field, models.TimeField):
+                    objs = capfirst(dateformat.time_format(self.raw_value, time_format))
+                else:
+                    objs = capfirst(dateformat.format(self.raw_value, date_format))
+            else:
+                objs = EMPTY_VALUE
+        elif isinstance(self.field, models.BooleanField) or isinstance(self.field, models.NullBooleanField):
+            objs = {True: 'Yes', False: 'No', None: 'Unknown'}[self.raw_value]
+        else:
+            objs = self.raw_value
+        return [objs]
+
+    def urls(self):
+        "Returns a list of (value, URL) tuples."
+        # First, check the urls() method for each plugin.
+        plugin_urls = []
+        for plugin_name, plugin in self.model.model_databrowse().plugins.items():
+            urls = plugin.urls(plugin_name, self)
+            if urls is not None:
+                #plugin_urls.append(urls)
+                values = self.values()
+                return zip(self.values(), urls)
+        if self.field.rel:
+            m = EasyModel(self.model.site, self.field.rel.to)
+            if self.field.rel.to in self.model.model_list:
+                lst = []
+                for value in self.values():
+                    url = mark_safe('%s%s/%s/objects/%s/' % (self.model.site.root_url, m.model._meta.app_label, m.model._meta.module_name, iri_to_uri(value._get_pk_val())))
+                    lst.append((smart_unicode(value), url))
+            else:
+                lst = [(value, None) for value in self.values()]
+        elif self.field.choices:
+            lst = []
+            for value in self.values():
+                url = mark_safe('%s%s/%s/fields/%s/%s/' % (self.model.site.root_url, self.model.model._meta.app_label, self.model.model._meta.module_name, self.field.name, iri_to_uri(self.raw_value)))
+                lst.append((value, url))
+        elif isinstance(self.field, models.URLField):
+            val = self.values()[0]
+            lst = [(val, iri_to_uri(val))]
+        else:
+            lst = [(self.values()[0], None)]
+        return lst
+
+class EasyQuerySet(QuerySet):
+    """
+    When creating (or cloning to) an `EasyQuerySet`, make sure to set the
+    `_easymodel` variable to the related `EasyModel`.
+    """
+    def iterator(self, *args, **kwargs):
+        for obj in super(EasyQuerySet, self).iterator(*args, **kwargs):
+            yield EasyInstance(self._easymodel, obj)
+
+    def _clone(self, *args, **kwargs):
+        c = super(EasyQuerySet, self)._clone(*args, **kwargs)
+        c._easymodel = self._easymodel
+        return c
diff --git a/webapp/django/contrib/databrowse/plugins/__init__.py b/webapp/django/contrib/databrowse/plugins/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/databrowse/plugins/__init__.py
diff --git a/webapp/django/contrib/databrowse/plugins/calendars.py b/webapp/django/contrib/databrowse/plugins/calendars.py
new file mode 100644
index 0000000..ac2f522
--- /dev/null
+++ b/webapp/django/contrib/databrowse/plugins/calendars.py
@@ -0,0 +1,86 @@
+from django import http
+from django.db import models
+from django.contrib.databrowse.datastructures import EasyModel
+from django.contrib.databrowse.sites import DatabrowsePlugin
+from django.shortcuts import render_to_response
+from django.utils.text import capfirst
+from django.utils.encoding import force_unicode
+from django.utils.safestring import mark_safe
+from django.views.generic import date_based
+from django.utils import datetime_safe
+
+class CalendarPlugin(DatabrowsePlugin):
+    def __init__(self, field_names=None):
+        self.field_names = field_names
+
+    def field_dict(self, model):
+        """
+        Helper function that returns a dictionary of all DateFields or
+        DateTimeFields in the given model. If self.field_names is set, it takes
+        take that into account when building the dictionary.
+        """
+        if self.field_names is None:
+            return dict([(f.name, f) for f in model._meta.fields if isinstance(f, models.DateField)])
+        else:
+            return dict([(f.name, f) for f in model._meta.fields if isinstance(f, models.DateField) and f.name in self.field_names])
+
+    def model_index_html(self, request, model, site):
+        fields = self.field_dict(model)
+        if not fields:
+            return u''
+        return mark_safe(u'<p class="filter"><strong>View calendar by:</strong> %s</p>' % \
+            u', '.join(['<a href="calendars/%s/">%s</a>' % (f.name, force_unicode(capfirst(f.verbose_name))) for f in fields.values()]))
+
+    def urls(self, plugin_name, easy_instance_field):
+        if isinstance(easy_instance_field.field, models.DateField):
+            d = easy_instance_field.raw_value
+            return [mark_safe(u'%s%s/%s/%s/%s/%s/' % (
+                easy_instance_field.model.url(),
+                plugin_name, easy_instance_field.field.name,
+                d.year,
+                datetime_safe.new_date(d).strftime('%b').lower(),
+                d.day))]
+
+    def model_view(self, request, model_databrowse, url):
+        self.model, self.site = model_databrowse.model, model_databrowse.site
+        self.fields = self.field_dict(self.model)
+
+        # If the model has no DateFields, there's no point in going further.
+        if not self.fields:
+            raise http.Http404('The requested model has no calendars.')
+
+        if url is None:
+            return self.homepage_view(request)
+        url_bits = url.split('/')
+        if self.fields.has_key(url_bits[0]):
+            return self.calendar_view(request, self.fields[url_bits[0]], *url_bits[1:])
+
+        raise http.Http404('The requested page does not exist.')
+
+    def homepage_view(self, request):
+        easy_model = EasyModel(self.site, self.model)
+        field_list = self.fields.values()
+        field_list.sort(lambda x, y: cmp(x.verbose_name, y.verbose_name))
+        return render_to_response('databrowse/calendar_homepage.html', {'root_url': self.site.root_url, 'model': easy_model, 'field_list': field_list})
+
+    def calendar_view(self, request, field, year=None, month=None, day=None):
+        easy_model = EasyModel(self.site, self.model)
+        queryset = easy_model.get_query_set()
+        extra_context = {'root_url': self.site.root_url, 'model': easy_model, 'field': field}
+        if day is not None:
+            return date_based.archive_day(request, year, month, day, queryset, field.name,
+                template_name='databrowse/calendar_day.html', allow_empty=False, allow_future=True,
+                extra_context=extra_context)
+        elif month is not None:
+            return date_based.archive_month(request, year, month, queryset, field.name,
+                template_name='databrowse/calendar_month.html', allow_empty=False, allow_future=True,
+                extra_context=extra_context)
+        elif year is not None:
+            return date_based.archive_year(request, year, queryset, field.name,
+                template_name='databrowse/calendar_year.html', allow_empty=False, allow_future=True,
+                extra_context=extra_context)
+        else:
+            return date_based.archive_index(request, queryset, field.name,
+                template_name='databrowse/calendar_main.html', allow_empty=True, allow_future=True,
+                extra_context=extra_context)
+        assert False, ('%s, %s, %s, %s' % (field, year, month, day))
diff --git a/webapp/django/contrib/databrowse/plugins/fieldchoices.py b/webapp/django/contrib/databrowse/plugins/fieldchoices.py
new file mode 100644
index 0000000..8f77792
--- /dev/null
+++ b/webapp/django/contrib/databrowse/plugins/fieldchoices.py
@@ -0,0 +1,74 @@
+from django import http
+from django.db import models
+from django.contrib.databrowse.datastructures import EasyModel
+from django.contrib.databrowse.sites import DatabrowsePlugin
+from django.shortcuts import render_to_response
+from django.utils.text import capfirst
+from django.utils.encoding import smart_str, force_unicode
+from django.utils.safestring import mark_safe
+import urllib
+
+class FieldChoicePlugin(DatabrowsePlugin):
+    def __init__(self, field_filter=None):
+        # If field_filter is given, it should be a callable that takes a
+        # Django database Field instance and returns True if that field should
+        # be included. If field_filter is None, that all fields will be used.
+        self.field_filter = field_filter
+
+    def field_dict(self, model):
+        """
+        Helper function that returns a dictionary of all fields in the given
+        model. If self.field_filter is set, it only includes the fields that
+        match the filter.
+        """
+        if self.field_filter:
+            return dict([(f.name, f) for f in model._meta.fields if self.field_filter(f)])
+        else:
+            return dict([(f.name, f) for f in model._meta.fields if not f.rel and not f.primary_key and not f.unique and not isinstance(f, (models.AutoField, models.TextField))])
+
+    def model_index_html(self, request, model, site):
+        fields = self.field_dict(model)
+        if not fields:
+            return u''
+        return mark_safe(u'<p class="filter"><strong>View by:</strong> %s</p>' % \
+            u', '.join(['<a href="fields/%s/">%s</a>' % (f.name, force_unicode(capfirst(f.verbose_name))) for f in fields.values()]))
+
+    def urls(self, plugin_name, easy_instance_field):
+        if easy_instance_field.field in self.field_dict(easy_instance_field.model.model).values():
+            field_value = smart_str(easy_instance_field.raw_value)
+            return [mark_safe(u'%s%s/%s/%s/' % (
+                easy_instance_field.model.url(),
+                plugin_name, easy_instance_field.field.name,
+                urllib.quote(field_value, safe='')))]
+
+    def model_view(self, request, model_databrowse, url):
+        self.model, self.site = model_databrowse.model, model_databrowse.site
+        self.fields = self.field_dict(self.model)
+
+        # If the model has no fields with choices, there's no point in going
+        # further.
+        if not self.fields:
+            raise http.Http404('The requested model has no fields.')
+
+        if url is None:
+            return self.homepage_view(request)
+        url_bits = url.split('/', 1)
+        if self.fields.has_key(url_bits[0]):
+            return self.field_view(request, self.fields[url_bits[0]], *url_bits[1:])
+
+        raise http.Http404('The requested page does not exist.')
+
+    def homepage_view(self, request):
+        easy_model = EasyModel(self.site, self.model)
+        field_list = self.fields.values()
+        field_list.sort(lambda x, y: cmp(x.verbose_name, y.verbose_name))
+        return render_to_response('databrowse/fieldchoice_homepage.html', {'root_url': self.site.root_url, 'model': easy_model, 'field_list': field_list})
+
+    def field_view(self, request, field, value=None):
+        easy_model = EasyModel(self.site, self.model)
+        easy_field = easy_model.field(field.name)
+        if value is not None:
+            obj_list = easy_model.objects(**{field.name: value})
+            return render_to_response('databrowse/fieldchoice_detail.html', {'root_url': self.site.root_url, 'model': easy_model, 'field': easy_field, 'value': value, 'object_list': obj_list})
+        obj_list = [v[field.name] for v in self.model._default_manager.distinct().order_by(field.name).values(field.name)]
+        return render_to_response('databrowse/fieldchoice_list.html', {'root_url': self.site.root_url, 'model': easy_model, 'field': easy_field, 'object_list': obj_list})
diff --git a/webapp/django/contrib/databrowse/plugins/objects.py b/webapp/django/contrib/databrowse/plugins/objects.py
new file mode 100644
index 0000000..7326566
--- /dev/null
+++ b/webapp/django/contrib/databrowse/plugins/objects.py
@@ -0,0 +1,14 @@
+from django import http
+from django.contrib.databrowse.datastructures import EasyModel
+from django.contrib.databrowse.sites import DatabrowsePlugin
+from django.shortcuts import render_to_response
+import urlparse
+
+class ObjectDetailPlugin(DatabrowsePlugin):
+    def model_view(self, request, model_databrowse, url):
+        # If the object ID wasn't provided, redirect to the model page, which is one level up.
+        if url is None:
+            return http.HttpResponseRedirect(urlparse.urljoin(request.path, '../'))
+        easy_model = EasyModel(model_databrowse.site, model_databrowse.model)
+        obj = easy_model.object_by_pk(url)
+        return render_to_response('databrowse/object_detail.html', {'object': obj, 'root_url': model_databrowse.site.root_url})
diff --git a/webapp/django/contrib/databrowse/sites.py b/webapp/django/contrib/databrowse/sites.py
new file mode 100644
index 0000000..9ef35db
--- /dev/null
+++ b/webapp/django/contrib/databrowse/sites.py
@@ -0,0 +1,149 @@
+from django import http
+from django.db import models
+from django.contrib.databrowse.datastructures import EasyModel
+from django.shortcuts import render_to_response
+from django.utils.safestring import mark_safe
+
+class AlreadyRegistered(Exception):
+    pass
+
+class NotRegistered(Exception):
+    pass
+
+class DatabrowsePlugin(object):
+    def urls(self, plugin_name, easy_instance_field):
+        """
+        Given an EasyInstanceField object, returns a list of URLs for this
+        plugin's views of this object. These URLs should be absolute.
+
+        Returns None if the EasyInstanceField object doesn't get a
+        list of plugin-specific URLs.
+        """
+        return None
+
+    def model_index_html(self, request, model, site):
+        """
+        Returns a snippet of HTML to include on the model index page.
+        """
+        return ''
+
+    def model_view(self, request, model_databrowse, url):
+        """
+        Handles main URL routing for a plugin's model-specific pages.
+        """
+        raise NotImplementedError
+
+class ModelDatabrowse(object):
+    plugins = {}
+
+    def __init__(self, model, site):
+        self.model = model
+        self.site = site
+
+    def root(self, request, url):
+        """
+        Handles main URL routing for the databrowse app.
+
+        `url` is the remainder of the URL -- e.g. 'objects/3'.
+        """
+        # Delegate to the appropriate method, based on the URL.
+        if url is None:
+            return self.main_view(request)
+        try:
+            plugin_name, rest_of_url = url.split('/', 1)
+        except ValueError: # need more than 1 value to unpack
+            plugin_name, rest_of_url = url, None
+        try:
+            plugin = self.plugins[plugin_name]
+        except KeyError:
+            raise http.Http404('A plugin with the requested name does not exist.')
+        return plugin.model_view(request, self, rest_of_url)
+
+    def main_view(self, request):
+        easy_model = EasyModel(self.site, self.model)
+        html_snippets = mark_safe(u'\n'.join([p.model_index_html(request, self.model, self.site) for p in self.plugins.values()]))
+        return render_to_response('databrowse/model_detail.html', {
+            'model': easy_model,
+            'root_url': self.site.root_url,
+            'plugin_html': html_snippets,
+        })
+
+class DatabrowseSite(object):
+    def __init__(self):
+        self.registry = {} # model_class -> databrowse_class
+        self.root_url = None
+
+    def register(self, model_or_iterable, databrowse_class=None, **options):
+        """
+        Registers the given model(s) with the given databrowse site.
+
+        The model(s) should be Model classes, not instances.
+
+        If a databrowse class isn't given, it will use DefaultModelDatabrowse
+        (the default databrowse options).
+
+        If a model is already registered, this will raise AlreadyRegistered.
+        """
+        databrowse_class = databrowse_class or DefaultModelDatabrowse
+        if issubclass(model_or_iterable, models.Model):
+            model_or_iterable = [model_or_iterable]
+        for model in model_or_iterable:
+            if model in self.registry:
+                raise AlreadyRegistered('The model %s is already registered' % model.__class__.__name__)
+            self.registry[model] = databrowse_class
+
+    def unregister(self, model_or_iterable):
+        """
+        Unregisters the given model(s).
+
+        If a model isn't already registered, this will raise NotRegistered.
+        """
+        if issubclass(model_or_iterable, models.Model):
+            model_or_iterable = [model_or_iterable]
+        for model in model_or_iterable:
+            if model not in self.registry:
+                raise NotRegistered('The model %s is not registered' % model.__class__.__name__)
+            del self.registry[model]
+
+    def root(self, request, url):
+        """
+        Handles main URL routing for the databrowse app.
+
+        `url` is the remainder of the URL -- e.g. 'comments/comment/'.
+        """
+        self.root_url = request.path[:len(request.path) - len(url)]
+        url = url.rstrip('/') # Trim trailing slash, if it exists.
+
+        if url == '':
+            return self.index(request)
+        elif '/' in url:
+            return self.model_page(request, *url.split('/', 2))
+
+        raise http.Http404('The requested databrowse page does not exist.')
+
+    def index(self, request):
+        m_list = [EasyModel(self, m) for m in self.registry.keys()]
+        return render_to_response('databrowse/homepage.html', {'model_list': m_list, 'root_url': self.root_url})
+
+    def model_page(self, request, app_label, model_name, rest_of_url=None):
+        """
+        Handles the model-specific functionality of the databrowse site, delegating
+        to the appropriate ModelDatabrowse class.
+        """
+        model = models.get_model(app_label, model_name)
+        if model is None:
+            raise http.Http404("App %r, model %r, not found." % (app_label, model_name))
+        try:
+            databrowse_class = self.registry[model]
+        except KeyError:
+            raise http.Http404("This model exists but has not been registered with databrowse.")
+        return databrowse_class(model, self).root(request, rest_of_url)
+
+site = DatabrowseSite()
+
+from django.contrib.databrowse.plugins.calendars import CalendarPlugin
+from django.contrib.databrowse.plugins.objects import ObjectDetailPlugin
+from django.contrib.databrowse.plugins.fieldchoices import FieldChoicePlugin
+
+class DefaultModelDatabrowse(ModelDatabrowse):
+    plugins = {'objects': ObjectDetailPlugin(), 'calendars': CalendarPlugin(), 'fields': FieldChoicePlugin()}
diff --git a/webapp/django/contrib/databrowse/templates/databrowse/base.html b/webapp/django/contrib/databrowse/templates/databrowse/base.html
new file mode 100644
index 0000000..a341985
--- /dev/null
+++ b/webapp/django/contrib/databrowse/templates/databrowse/base.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="{{ LANGUAGE_CODE }}" xml:lang="{{ LANGUAGE_CODE }}" {% if LANGUAGE_BIDI %}dir="rtl"{% endif %}>
+<head>
+<title>{% block title %}{% endblock %}</title>
+{% block style %}
+<style type="text/css">
+* { margin:0; padding:0; }
+body { background:#eee; color:#333; font:76%/1.6 "Lucida Grande","Bitstream Vera Sans",Verdana,sans-serif; }
+a { color: #5b80b2; text-decoration:none; }
+a:hover { text-decoration:underline; }
+a img { border:none; }
+h1 { font-size:1.8em; color:#666; margin:0.4em 0 0.2em 0; }
+h2 { font-size:1.5em; color:#666; margin:1em 0 0.2em 0; }
+p { margin:0.5em 0 1em 0; }
+.odd { background-color:#EDF3FE; }
+.quiet { color:#666; }
+/* FILTERS */
+.filter { color:#999; font-size:0.9em; float:left; margin-bottom:10px; margin-right:20px; }
+.filter strong { color:#666; }
+/* OBJECT LISTS */
+.objectlist { clear:both; margin:0 -20px; color:#666; }
+.objectlist li a { display:block; padding:1em 20px; }
+.objectlist li a:hover { background:#5b80b2; color:#3B5572; color:#fff; text-decoration:none; }
+.related h2 { font-size: 1em; margin-bottom: 0.6em; }
+.related .objectlist li a { padding: 0.6em 20px; }
+.related .objectlist li.odd { background:#eee; }
+/* OBJECT DETAIL */
+.objectinfo { border-collapse:collapse; color:#666; margin:0 -20px; }
+.objectinfo td, .objectinfo th { padding:1em 20px; vertical-align:top; }
+.objectinfo td { width:100%; }
+.objectinfo th { text-align:left; white-space:nowrap; }
+/* MODEL GROUPS */
+.modelgroup { color:#999; font-size:0.9em; margin:0 -20px; }
+.modelgroup h2 { font-size:1.2em; margin:0; }
+.modelgroup h2 a { display: block; padding: 0.83em 20px; }
+.modelgroup h2 a:hover { text-decoration: none; color: #fff; }
+.modelgroup p { float:left; margin:-2.65em 0 0 14em; position:relative; }
+.modelgroup p a { white-space:nowrap; }
+.modelgroup a.more { color:#999; }
+.modelgroup:hover { background:#5b80b2; color:#becfe5; }
+.modelgroup:hover p a { color:#becfe5; }
+.modelgroup:hover a { color:#fff; }
+.modelgroup:hover a.more { color:#fff; }
+/* BREADCRUMBS */
+#breadcrumbs { padding:10px 0; color:#999; font-size:0.9em; }
+/* HEADER */
+#header a { display:block; background:#eee; color:#676868; padding:10px 20px; font-weight:bold; font-size:1em; text-decoration:none; border-bottom:1px solid #ddd; }
+#header a:hover { text-decoration:underline; }
+/* CONTENT */
+#content { background:#fff; border-bottom:1px solid #ddd; padding:0 20px; }
+</style>
+{% endblock %}
+{% block extrahead %}{% endblock %}
+</head>
+<body id="{% block bodyid %}page{% endblock %}">
+<div id="header"><a href="{{ root_url }}">{% block databrowse_title %}Databrowse{% endblock %}</a></div>
+<div id="content">
+{% block content %}{% endblock %}
+</div>
+</body>
+</html>
diff --git a/webapp/django/contrib/databrowse/templates/databrowse/base_site.html b/webapp/django/contrib/databrowse/templates/databrowse/base_site.html
new file mode 100644
index 0000000..b577ab8
--- /dev/null
+++ b/webapp/django/contrib/databrowse/templates/databrowse/base_site.html
@@ -0,0 +1 @@
+{% extends "databrowse/base.html" %}
diff --git a/webapp/django/contrib/databrowse/templates/databrowse/calendar_day.html b/webapp/django/contrib/databrowse/templates/databrowse/calendar_day.html
new file mode 100644
index 0000000..bbb62cc
--- /dev/null
+++ b/webapp/django/contrib/databrowse/templates/databrowse/calendar_day.html
@@ -0,0 +1,17 @@
+{% extends "databrowse/base_site.html" %}
+
+{% block title %}{{ model.verbose_name_plural|capfirst }} with {{ field.verbose_name }} {{ day|date:"F j, Y" }}{% endblock %}
+
+{% block content %}
+
+<div id="breadcrumbs"><a href="{{ root_url }}">Home</a> / <a href="{{ model.url }}">{{ model.verbose_name_plural|capfirst }}</a> / <a href="../../../../">Calendars</a> / <a href="../../../">By {{ field.verbose_name }}</a> / <a href="../../">{{ day.year }}</a> / <a href="../">{{ day|date:"F" }}</a> / {{ day.day }}</div>
+
+<h1>{{ object_list.count }} {% if object_list.count|pluralize %}{{ model.verbose_name_plural|escape }}{% else %}{{ model.verbose_name|escape }}{% endif %} with {{ field.verbose_name }} on {{ day|date:"F j, Y" }}</h1>
+
+<ul class="objectlist">
+{% for object in object_list %}
+<li class="{% cycle 'odd' 'even' %}"><a href="{{ object.url }}">{{ object|escape }}</a></li>
+{% endfor %}
+</ul>
+
+{% endblock %}
diff --git a/webapp/django/contrib/databrowse/templates/databrowse/calendar_homepage.html b/webapp/django/contrib/databrowse/templates/databrowse/calendar_homepage.html
new file mode 100644
index 0000000..85eb8af
--- /dev/null
+++ b/webapp/django/contrib/databrowse/templates/databrowse/calendar_homepage.html
@@ -0,0 +1,17 @@
+{% extends "databrowse/base_site.html" %}
+
+{% block title %}Calendars{% endblock %}
+
+{% block content %}
+
+<div id="breadcrumbs"><a href="{{ root_url }}">Home</a> / <a href="{{ model.url }}">{{ model.verbose_name_plural|capfirst }}</a> / Calendars</div>
+
+<h1>Calendars</h1>
+
+<ul class="objectlist">
+{% for field in field_list %}
+<li class="{% cycle 'odd' 'even' %}"><a href="{{ field.name }}/">{{ model.verbose_name_plural|capfirst }} by {{ field.verbose_name }}</a></li>
+{% endfor %}
+</ul>
+
+{% endblock %}
diff --git a/webapp/django/contrib/databrowse/templates/databrowse/calendar_main.html b/webapp/django/contrib/databrowse/templates/databrowse/calendar_main.html
new file mode 100644
index 0000000..b22a44d
--- /dev/null
+++ b/webapp/django/contrib/databrowse/templates/databrowse/calendar_main.html
@@ -0,0 +1,17 @@
+{% extends "databrowse/base_site.html" %}
+
+{% block title %}{{ field.verbose_name|capfirst }} calendar{% endblock %}
+
+{% block content %}
+
+<div id="breadcrumbs"><a href="{{ root_url }}">Home</a> / <a href="{{ model.url }}">{{ model.verbose_name_plural|capfirst }}</a> / <a href="../">Calendars</a> / By {{ field.verbose_name }}</div>
+
+<h1>{{ model.verbose_name_plural|capfirst }} by {{ field.verbose_name }}</h1>
+
+<ul class="objectlist">
+{% for year in date_list %}
+<li class="{% cycle 'odd' 'even' %}"><a href="{{ year.year }}/">{{ year.year }}</a></li>
+{% endfor %}
+</ul>
+
+{% endblock %}
diff --git a/webapp/django/contrib/databrowse/templates/databrowse/calendar_month.html b/webapp/django/contrib/databrowse/templates/databrowse/calendar_month.html
new file mode 100644
index 0000000..70b7deb
--- /dev/null
+++ b/webapp/django/contrib/databrowse/templates/databrowse/calendar_month.html
@@ -0,0 +1,17 @@
+{% extends "databrowse/base_site.html" %}
+
+{% block title %}{{ model.verbose_name_plural|capfirst }} with {{ field.verbose_name }} in {{ month|date:"F Y" }}{% endblock %}
+
+{% block content %}
+
+<div id="breadcrumbs"><a href="{{ root_url }}">Home</a> / <a href="{{ model.url }}">{{ model.verbose_name_plural|capfirst }}</a> / <a href="../../../">Calendars</a> / <a href="../../">By {{ field.verbose_name }}</a> / <a href="../">{{ month.year }}</a> / {{ month|date:"F" }}</div>
+
+<h1>{{ object_list.count }} {% if object_list.count|pluralize %}{{ model.verbose_name_plural|escape }}{% else %}{{ model.verbose_name|escape }}{% endif %} with {{ field.verbose_name }} on {{ day|date:"F Y" }}</h1>
+
+<ul class="objectlist">
+{% for object in object_list %}
+<li class="{% cycle 'odd' 'even' %}"><a href="{{ object.url }}">{{ object|escape }}</a></li>
+{% endfor %}
+</ul>
+
+{% endblock %}
diff --git a/webapp/django/contrib/databrowse/templates/databrowse/calendar_year.html b/webapp/django/contrib/databrowse/templates/databrowse/calendar_year.html
new file mode 100644
index 0000000..a6e6f53
--- /dev/null
+++ b/webapp/django/contrib/databrowse/templates/databrowse/calendar_year.html
@@ -0,0 +1,17 @@
+{% extends "databrowse/base_site.html" %}
+
+{% block title %}{{ model.verbose_name_plural|capfirst }} with {{ field.verbose_name }} in {{ year }}{% endblock %}
+
+{% block content %}
+
+<div id="breadcrumbs"><a href="{{ root_url }}">Home</a> / <a href="{{ model.url }}">{{ model.verbose_name_plural|capfirst }}</a> / <a href="../../">Calendars</a> / <a href="../">By {{ field.verbose_name }}</a> / {{ year }}</div>
+
+<h1>{{ model.verbose_name_plural|capfirst }} with {{ field.verbose_name }} in {{ year }}</h1>
+
+<ul class="objectlist">
+{% for month in date_list %}
+<li class="{% cycle 'odd' 'even' %}"><a href="{{ month|date:"M"|lower }}/">{{ month|date:"F" }}</a></li>
+{% endfor %}
+</ul>
+
+{% endblock %}
diff --git a/webapp/django/contrib/databrowse/templates/databrowse/choice_detail.html b/webapp/django/contrib/databrowse/templates/databrowse/choice_detail.html
new file mode 100644
index 0000000..6cb73e7
--- /dev/null
+++ b/webapp/django/contrib/databrowse/templates/databrowse/choice_detail.html
@@ -0,0 +1,17 @@
+{% extends "databrowse/base_site.html" %}
+
+{% block title %}{{ model.verbose_name_plural|capfirst }} by {{ field.field.verbose_name }}: {{ value|escape }}{% endblock %}
+
+{% block content %}
+
+<div id="breadcrumbs"><a href="{{ root_url }}">Home</a> / <a href="{{ model.url }}">{{ model.verbose_name_plural|capfirst }}</a> / <a href="{{ field.url }}">By {{ field.field.verbose_name }}</a> / {{ value|escape }}</div>
+
+<h1>{{ model.verbose_name_plural|capfirst }} by {{ field.field.verbose_name }}: {{ value|escape }}</h1>
+
+<ul class="objectlist">
+{% for object in object_list %}
+<li class="{% cycle 'odd' 'even' %}"><a href="{{ object.url }}">{{ object|escape }}</a></li>
+{% endfor %}
+</ul>
+
+{% endblock %}
diff --git a/webapp/django/contrib/databrowse/templates/databrowse/choice_list.html b/webapp/django/contrib/databrowse/templates/databrowse/choice_list.html
new file mode 100644
index 0000000..95cd88b
--- /dev/null
+++ b/webapp/django/contrib/databrowse/templates/databrowse/choice_list.html
@@ -0,0 +1,17 @@
+{% extends "databrowse/base_site.html" %}
+
+{% block title %}{{ model.verbose_name_plural|capfirst }} by {{ field.field.verbose_name }}{% endblock %}
+
+{% block content %}
+
+<div id="breadcrumbs"><a href="{{ root_url }}">Home</a> / <a href="{{ model.url }}">{{ model.verbose_name_plural|capfirst }}</a> / By {{ field.field.verbose_name }}</div>
+
+<h1>{{ model.verbose_name_plural|capfirst }} by {{ field.field.verbose_name }}</h1>
+
+<ul class="objectlist">
+{% for choice in field.choices %}
+<li class="{% cycle 'odd' 'even' %}"><a href="{{ choice.url }}">{{ choice.label|escape }}</a></li>
+{% endfor %}
+</ul>
+
+{% endblock %}
diff --git a/webapp/django/contrib/databrowse/templates/databrowse/fieldchoice_detail.html b/webapp/django/contrib/databrowse/templates/databrowse/fieldchoice_detail.html
new file mode 100644
index 0000000..7801f3f
--- /dev/null
+++ b/webapp/django/contrib/databrowse/templates/databrowse/fieldchoice_detail.html
@@ -0,0 +1,17 @@
+{% extends "databrowse/base_site.html" %}
+
+{% block title %}{{ model.verbose_name_plural|capfirst|escape }} with {{ field.field.verbose_name|escape }} {{ value|escape }}{% endblock %}
+
+{% block content %}
+
+<div id="breadcrumbs"><a href="{{ root_url }}">Home</a> / <a href="{{ model.url }}">{{ model.verbose_name_plural|capfirst }}</a> / <a href="../../">Fields</a> / <a href="../">By {{ field.field.verbose_name|escape }}</a> / {{ value|escape }}</div>
+
+<h1>{{ object_list.count }} {% if object_list.count|pluralize %}{{ model.verbose_name_plural|escape }}{% else %}{{ model.verbose_name|escape }}{% endif %} with {{ field.field.verbose_name|escape }} {{ value|escape }}</h1>
+
+<ul class="objectlist">
+{% for object in object_list %}
+<li class="{% cycle 'odd' 'even' %}"><a href="{{ object.url }}">{{ object|escape }}</a></li>
+{% endfor %}
+</ul>
+
+{% endblock %}
diff --git a/webapp/django/contrib/databrowse/templates/databrowse/fieldchoice_homepage.html b/webapp/django/contrib/databrowse/templates/databrowse/fieldchoice_homepage.html
new file mode 100644
index 0000000..3259824
--- /dev/null
+++ b/webapp/django/contrib/databrowse/templates/databrowse/fieldchoice_homepage.html
@@ -0,0 +1,17 @@
+{% extends "databrowse/base_site.html" %}
+
+{% block title %}Browsable fields in {{ model.verbose_name_plural|escape }}{% endblock %}
+
+{% block content %}
+
+<div id="breadcrumbs"><a href="{{ root_url }}">Home</a> / <a href="{{ model.url }}">{{ model.verbose_name_plural|capfirst }}</a> / Fields</div>
+
+<h1>Browsable fields in {{ model.verbose_name_plural }}</h1>
+
+<ul class="objectlist">
+{% for field in field_list %}
+<li class="{% cycle 'odd' 'even' %}"><a href="{{ field.name }}/">{{ model.verbose_name_plural|capfirst }} by {{ field.verbose_name }}</a></li>
+{% endfor %}
+</ul>
+
+{% endblock %}
diff --git a/webapp/django/contrib/databrowse/templates/databrowse/fieldchoice_list.html b/webapp/django/contrib/databrowse/templates/databrowse/fieldchoice_list.html
new file mode 100644
index 0000000..71b906d
--- /dev/null
+++ b/webapp/django/contrib/databrowse/templates/databrowse/fieldchoice_list.html
@@ -0,0 +1,17 @@
+{% extends "databrowse/base_site.html" %}
+
+{% block title %}{{ model.verbose_name_plural|capfirst|escape }} by {{ field.field.verbose_name|escape }}{% endblock %}
+
+{% block content %}
+
+<div id="breadcrumbs"><a href="{{ root_url }}">Home</a> / <a href="{{ model.url }}">{{ model.verbose_name_plural|capfirst }}</a> / <a href="../">Fields</a> / By {{ field.field.verbose_name|escape }}</div>
+
+<h1>{{ model.verbose_name_plural|capfirst|escape }} by {{ field.field.verbose_name|escape }}</h1>
+
+<ul class="objectlist">
+{% for object in object_list %}
+<li class="{% cycle 'odd' 'even' %}"><a href="{{ object|iriencode }}/">{{ object|escape }}</a></li>
+{% endfor %}
+</ul>
+
+{% endblock %}
diff --git a/webapp/django/contrib/databrowse/templates/databrowse/homepage.html b/webapp/django/contrib/databrowse/templates/databrowse/homepage.html
new file mode 100644
index 0000000..718e577
--- /dev/null
+++ b/webapp/django/contrib/databrowse/templates/databrowse/homepage.html
@@ -0,0 +1,21 @@
+{% extends "databrowse/base_site.html" %}
+
+{% block title %}Databrowse{% endblock %}
+
+{% block bodyid %}homepage{% endblock %}
+
+{% block content %}
+
+{% for model in model_list %}
+  <div class="modelgroup {% cycle 'even' 'odd' %}">
+	  <h2><a href="{{ model.url }}">{{ model.verbose_name_plural|capfirst }}</a></h2>
+		<p>
+		{% for object in model.sample_objects %}
+			<a href="{{ object.url }}">{{ object|escape }}</a>, 
+		{% endfor %}
+			<a class="more" href="{{ model.url }}">More &rarr;</a>
+		</p>
+  </div>
+{% endfor %}
+
+{% endblock %}
diff --git a/webapp/django/contrib/databrowse/templates/databrowse/model_detail.html b/webapp/django/contrib/databrowse/templates/databrowse/model_detail.html
new file mode 100644
index 0000000..b66bc09
--- /dev/null
+++ b/webapp/django/contrib/databrowse/templates/databrowse/model_detail.html
@@ -0,0 +1,19 @@
+{% extends "databrowse/base_site.html" %}
+
+{% block title %}{{ model.verbose_name_plural|capfirst }}{% endblock %}
+
+{% block content %}
+
+<div id="breadcrumbs"><a href="{{ root_url }}">Home</a> / {{ model.verbose_name_plural|capfirst }}</div>
+
+<h1>{{ model.objects.count }} {% if model.objects.count|pluralize %}{{ model.verbose_name_plural }}{% else %}{{ model.verbose_name }}{% endif %}</h1>
+
+{{ plugin_html }}
+
+<ul class="objectlist">
+{% for object in model.objects %}
+    <li class="{% cycle 'odd' 'even' %}"><a href="{{ object.url }}">{{ object|escape }}</a></li>
+{% endfor %}
+</ul>
+
+{% endblock %}
diff --git a/webapp/django/contrib/databrowse/templates/databrowse/object_detail.html b/webapp/django/contrib/databrowse/templates/databrowse/object_detail.html
new file mode 100644
index 0000000..7c1bd3e
--- /dev/null
+++ b/webapp/django/contrib/databrowse/templates/databrowse/object_detail.html
@@ -0,0 +1,41 @@
+{% extends "databrowse/base_site.html" %}
+
+{% block title %}{{ object.model.verbose_name|capfirst }}: {{ object }}{% endblock %}
+
+{% block content %}
+
+<div id="breadcrumbs"><a href="{{ root_url }}">Home</a> / <a href="{{ object.model.url }}">{{ object.model.verbose_name_plural|capfirst }}</a> / {{ object|escape }}</div>
+
+<h1>{{ object.model.verbose_name|capfirst }}: {{ object|escape }}</h1>
+
+<table class="objectinfo">
+{% for field in object.fields %}
+<tr class="{% cycle 'odd' 'even' %}">
+<th>{{ field.field.verbose_name|capfirst }}</th>
+<td>
+{% if field.urls %}
+{% for value, url in field.urls %}
+{% if url %}<a href="{{ url }}">{% endif %}{{ value|escape }}{% if url %}</a>{% endif %}{% if not forloop.last %}, {% endif %}
+{% endfor %}
+{% else %}None{% endif %}
+</td>
+</tr>
+{% endfor %}
+</table>
+
+{% for related_object in object.related_objects %}
+  <div class="related">
+  <h2>Appears in "{{ related_object.related_field }}" in the following {{ related_object.model.verbose_name_plural }}:</h2>
+  {% if related_object.object_list %}
+  <ul class="objectlist">
+    {% for object in related_object.object_list %}
+    <li class="{% cycle 'odd' 'even' %}"><a href="{{ object.url }}">{{ object|escape }}</a></li>
+    {% endfor %}
+  </ul>
+  {% else %}
+  <p class="quiet">(None)</p>
+  {% endif %}
+  </div>
+{% endfor %}
+
+{% endblock %}
diff --git a/webapp/django/contrib/databrowse/urls.py b/webapp/django/contrib/databrowse/urls.py
new file mode 100644
index 0000000..9b85d14
--- /dev/null
+++ b/webapp/django/contrib/databrowse/urls.py
@@ -0,0 +1,20 @@
+from django.conf.urls.defaults import *
+from django.contrib.databrowse import views
+
+# Note: The views in this URLconf all require a 'models' argument,
+# which is a list of model classes (*not* instances).
+
+urlpatterns = patterns('',
+    #(r'^$', views.homepage),
+    #(r'^([^/]+)/([^/]+)/$', views.model_detail),
+
+    (r'^([^/]+)/([^/]+)/fields/(\w+)/$', views.choice_list),
+    (r'^([^/]+)/([^/]+)/fields/(\w+)/(.*)/$', views.choice_detail),
+
+    #(r'^([^/]+)/([^/]+)/calendars/(\w+)/$', views.calendar_main),
+    #(r'^([^/]+)/([^/]+)/calendars/(\w+)/(\d{4})/$', views.calendar_year),
+    #(r'^([^/]+)/([^/]+)/calendars/(\w+)/(\d{4})/(\w{3})/$', views.calendar_month),
+    #(r'^([^/]+)/([^/]+)/calendars/(\w+)/(\d{4})/(\w{3})/(\d{1,2})/$', views.calendar_day),
+
+    #(r'^([^/]+)/([^/]+)/objects/(.*)/$', views.object_detail),
+)
diff --git a/webapp/django/contrib/databrowse/views.py b/webapp/django/contrib/databrowse/views.py
new file mode 100644
index 0000000..4543e95
--- /dev/null
+++ b/webapp/django/contrib/databrowse/views.py
@@ -0,0 +1,19 @@
+from django.http import Http404
+from django.shortcuts import render_to_response
+
+###########
+# CHOICES #
+###########
+
+def choice_list(request, app_label, module_name, field_name, models):
+    m, f = lookup_field(app_label, module_name, field_name, models)
+    return render_to_response('databrowse/choice_list.html', {'model': m, 'field': f})
+
+def choice_detail(request, app_label, module_name, field_name, field_val, models):
+    m, f = lookup_field(app_label, module_name, field_name, models)
+    try:
+        label = dict(f.field.choices)[field_val]
+    except KeyError:
+        raise Http404('Invalid choice value given')
+    obj_list = m.objects(**{f.field.name: field_val})
+    return render_to_response('databrowse/choice_detail.html', {'model': m, 'field': f, 'value': label, 'object_list': obj_list})
diff --git a/webapp/django/contrib/flatpages/README.TXT b/webapp/django/contrib/flatpages/README.TXT
new file mode 100644
index 0000000..d307137
--- /dev/null
+++ b/webapp/django/contrib/flatpages/README.TXT
@@ -0,0 +1,8 @@
+This is an optional add-on app, flatpages.
+
+For full documentation, see either of these:
+
+    * The file docs/flatpages.txt in the Django distribution
+    * http://www.djangoproject.com/documentation/flatpages/ on the Web
+
+Both have identical content.
diff --git a/webapp/django/contrib/flatpages/__init__.py b/webapp/django/contrib/flatpages/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/flatpages/__init__.py
diff --git a/webapp/django/contrib/flatpages/admin.py b/webapp/django/contrib/flatpages/admin.py
new file mode 100644
index 0000000..b6fdba3
--- /dev/null
+++ b/webapp/django/contrib/flatpages/admin.py
@@ -0,0 +1,28 @@
+from django import forms
+from django.contrib import admin
+from django.contrib.flatpages.models import FlatPage
+from django.utils.translation import ugettext_lazy as _
+
+
+class FlatpageForm(forms.ModelForm):
+    url = forms.RegexField(label=_("URL"), max_length=100, regex=r'^[-\w/]+$',
+        help_text = _("Example: '/about/contact/'. Make sure to have leading"
+                      " and trailing slashes."),
+        error_message = _("This value must contain only letters, numbers,"
+                          " underscores, dashes or slashes."))
+
+    class Meta:
+        model = FlatPage
+
+
+class FlatPageAdmin(admin.ModelAdmin):
+    form = FlatpageForm
+    fieldsets = (
+        (None, {'fields': ('url', 'title', 'content', 'sites')}),
+        (_('Advanced options'), {'classes': ('collapse',), 'fields': ('enable_comments', 'registration_required', 'template_name')}),
+    )
+    list_display = ('url', 'title')
+    list_filter = ('sites', 'enable_comments', 'registration_required')
+    search_fields = ('url', 'title')
+
+admin.site.register(FlatPage, FlatPageAdmin)
diff --git a/webapp/django/contrib/flatpages/middleware.py b/webapp/django/contrib/flatpages/middleware.py
new file mode 100644
index 0000000..fb98c39
--- /dev/null
+++ b/webapp/django/contrib/flatpages/middleware.py
@@ -0,0 +1,18 @@
+from django.contrib.flatpages.views import flatpage
+from django.http import Http404
+from django.conf import settings
+
+class FlatpageFallbackMiddleware(object):
+    def process_response(self, request, response):
+        if response.status_code != 404:
+            return response # No need to check for a flatpage for non-404 responses.
+        try:
+            return flatpage(request, request.path_info)
+        # Return the original response if any errors happened. Because this
+        # is a middleware, we can't assume the errors will be caught elsewhere.
+        except Http404:
+            return response
+        except:
+            if settings.DEBUG:
+                raise
+            return response
diff --git a/webapp/django/contrib/flatpages/models.py b/webapp/django/contrib/flatpages/models.py
new file mode 100644
index 0000000..02005dd
--- /dev/null
+++ b/webapp/django/contrib/flatpages/models.py
@@ -0,0 +1,27 @@
+from django.core import validators
+from django.db import models
+from django.contrib.sites.models import Site
+from django.utils.translation import ugettext_lazy as _
+
+
+class FlatPage(models.Model):
+    url = models.CharField(_('URL'), max_length=100, db_index=True)
+    title = models.CharField(_('title'), max_length=200)
+    content = models.TextField(_('content'), blank=True)
+    enable_comments = models.BooleanField(_('enable comments'))
+    template_name = models.CharField(_('template name'), max_length=70, blank=True,
+        help_text=_("Example: 'flatpages/contact_page.html'. If this isn't provided, the system will use 'flatpages/default.html'."))
+    registration_required = models.BooleanField(_('registration required'), help_text=_("If this is checked, only logged-in users will be able to view the page."))
+    sites = models.ManyToManyField(Site)
+
+    class Meta:
+        db_table = 'django_flatpage'
+        verbose_name = _('flat page')
+        verbose_name_plural = _('flat pages')
+        ordering = ('url',)
+
+    def __unicode__(self):
+        return u"%s -- %s" % (self.url, self.title)
+
+    def get_absolute_url(self):
+        return self.url
diff --git a/webapp/django/contrib/flatpages/urls.py b/webapp/django/contrib/flatpages/urls.py
new file mode 100644
index 0000000..4928930
--- /dev/null
+++ b/webapp/django/contrib/flatpages/urls.py
@@ -0,0 +1,5 @@
+from django.conf.urls.defaults import *
+
+urlpatterns = patterns('django.contrib.flatpages.views',
+    (r'^(?P<url>.*)$', 'flatpage'),
+)
diff --git a/webapp/django/contrib/flatpages/views.py b/webapp/django/contrib/flatpages/views.py
new file mode 100644
index 0000000..37d12c9
--- /dev/null
+++ b/webapp/django/contrib/flatpages/views.py
@@ -0,0 +1,48 @@
+from django.contrib.flatpages.models import FlatPage
+from django.template import loader, RequestContext
+from django.shortcuts import get_object_or_404
+from django.http import HttpResponse, HttpResponseRedirect
+from django.conf import settings
+from django.core.xheaders import populate_xheaders
+from django.utils.safestring import mark_safe
+
+DEFAULT_TEMPLATE = 'flatpages/default.html'
+
+def flatpage(request, url):
+    """
+    Flat page view.
+
+    Models: `flatpages.flatpages`
+    Templates: Uses the template defined by the ``template_name`` field,
+        or `flatpages/default.html` if template_name is not defined.
+    Context:
+        flatpage
+            `flatpages.flatpages` object
+    """
+    if not url.endswith('/') and settings.APPEND_SLASH:
+        return HttpResponseRedirect("%s/" % request.path)
+    if not url.startswith('/'):
+        url = "/" + url
+    f = get_object_or_404(FlatPage, url__exact=url, sites__id__exact=settings.SITE_ID)
+    # If registration is required for accessing this page, and the user isn't
+    # logged in, redirect to the login page.
+    if f.registration_required and not request.user.is_authenticated():
+        from django.contrib.auth.views import redirect_to_login
+        return redirect_to_login(request.path)
+    if f.template_name:
+        t = loader.select_template((f.template_name, DEFAULT_TEMPLATE))
+    else:
+        t = loader.get_template(DEFAULT_TEMPLATE)
+
+    # To avoid having to always use the "|safe" filter in flatpage templates,
+    # mark the title and content as already safe (since they are raw HTML
+    # content in the first place).
+    f.title = mark_safe(f.title)
+    f.content = mark_safe(f.content)
+
+    c = RequestContext(request, {
+        'flatpage': f,
+    })
+    response = HttpResponse(t.render(c))
+    populate_xheaders(request, response, FlatPage, f.id)
+    return response
diff --git a/webapp/django/contrib/formtools/__init__.py b/webapp/django/contrib/formtools/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/formtools/__init__.py
diff --git a/webapp/django/contrib/formtools/models.py b/webapp/django/contrib/formtools/models.py
new file mode 100644
index 0000000..13990e2
--- /dev/null
+++ b/webapp/django/contrib/formtools/models.py
@@ -0,0 +1 @@
+""" models.py (even empty) currently required by the runtests.py to enable unit tests """
diff --git a/webapp/django/contrib/formtools/preview.py b/webapp/django/contrib/formtools/preview.py
new file mode 100644
index 0000000..c56fdff
--- /dev/null
+++ b/webapp/django/contrib/formtools/preview.py
@@ -0,0 +1,126 @@
+"""
+Formtools Preview application.
+"""
+
+import cPickle as pickle
+
+from django.conf import settings
+from django.http import Http404
+from django.shortcuts import render_to_response
+from django.template.context import RequestContext
+from django.utils.hashcompat import md5_constructor
+
+AUTO_ID = 'formtools_%s' # Each form here uses this as its auto_id parameter.
+
+class FormPreview(object):
+    preview_template = 'formtools/preview.html'
+    form_template = 'formtools/form.html'
+
+    # METHODS SUBCLASSES SHOULDN'T OVERRIDE ###################################
+
+    def __init__(self, form):
+        # form should be a Form class, not an instance.
+        self.form, self.state = form, {}
+
+    def __call__(self, request, *args, **kwargs):
+        stage = {'1': 'preview', '2': 'post'}.get(request.POST.get(self.unused_name('stage')), 'preview')
+        self.parse_params(*args, **kwargs)
+        try:
+            method = getattr(self, stage + '_' + request.method.lower())
+        except AttributeError:
+            raise Http404
+        return method(request)
+
+    def unused_name(self, name):
+        """
+        Given a first-choice name, adds an underscore to the name until it
+        reaches a name that isn't claimed by any field in the form.
+
+        This is calculated rather than being hard-coded so that no field names
+        are off-limits for use in the form.
+        """
+        while 1:
+            try:
+                f = self.form.base_fields[name]
+            except KeyError:
+                break # This field name isn't being used by the form.
+            name += '_'
+        return name
+
+    def preview_get(self, request):
+        "Displays the form"
+        f = self.form(auto_id=AUTO_ID)
+        return render_to_response(self.form_template,
+            {'form': f, 'stage_field': self.unused_name('stage'), 'state': self.state},
+            context_instance=RequestContext(request))
+
+    def preview_post(self, request):
+        "Validates the POST data. If valid, displays the preview page. Else, redisplays form."
+        f = self.form(request.POST, auto_id=AUTO_ID)
+        context = {'form': f, 'stage_field': self.unused_name('stage'), 'state': self.state}
+        if f.is_valid():
+            context['hash_field'] = self.unused_name('hash')
+            context['hash_value'] = self.security_hash(request, f)
+            return render_to_response(self.preview_template, context, context_instance=RequestContext(request))
+        else:
+            return render_to_response(self.form_template, context, context_instance=RequestContext(request))
+
+    def post_post(self, request):
+        "Validates the POST data. If valid, calls done(). Else, redisplays form."
+        f = self.form(request.POST, auto_id=AUTO_ID)
+        if f.is_valid():
+            if self.security_hash(request, f) != request.POST.get(self.unused_name('hash')):
+                return self.failed_hash(request) # Security hash failed.
+            return self.done(request, f.cleaned_data)
+        else:
+            return render_to_response(self.form_template,
+                {'form': f, 'stage_field': self.unused_name('stage'), 'state': self.state},
+                context_instance=RequestContext(request))
+
+    # METHODS SUBCLASSES MIGHT OVERRIDE IF APPROPRIATE ########################
+
+    def parse_params(self, *args, **kwargs):
+        """
+        Given captured args and kwargs from the URLconf, saves something in
+        self.state and/or raises Http404 if necessary.
+
+        For example, this URLconf captures a user_id variable:
+
+            (r'^contact/(?P<user_id>\d{1,6})/$', MyFormPreview(MyForm)),
+
+        In this case, the kwargs variable in parse_params would be
+        {'user_id': 32} for a request to '/contact/32/'. You can use that
+        user_id to make sure it's a valid user and/or save it for later, for
+        use in done().
+        """
+        pass
+
+    def security_hash(self, request, form):
+        """
+        Calculates the security hash for the given Form instance.
+
+        This creates a list of the form field names/values in a deterministic
+        order, pickles the result with the SECRET_KEY setting and takes an md5
+        hash of that.
+
+        Subclasses may want to take into account request-specific information
+        such as the IP address.
+        """
+        data = [(bf.name, bf.data or '') for bf in form] + [settings.SECRET_KEY]
+        # Use HIGHEST_PROTOCOL because it's the most efficient. It requires
+        # Python 2.3, but Django requires 2.3 anyway, so that's OK.
+        pickled = pickle.dumps(data, pickle.HIGHEST_PROTOCOL)
+        return md5_constructor(pickled).hexdigest()
+
+    def failed_hash(self, request):
+        "Returns an HttpResponse in the case of an invalid security hash."
+        return self.preview_post(request)
+
+    # METHODS SUBCLASSES MUST OVERRIDE ########################################
+
+    def done(self, request, cleaned_data):
+        """
+        Does something with the cleaned_data and returns an
+        HttpResponseRedirect.
+        """
+        raise NotImplementedError('You must define a done() method on your %s subclass.' % self.__class__.__name__)
diff --git a/webapp/django/contrib/formtools/templates/formtools/form.html b/webapp/django/contrib/formtools/templates/formtools/form.html
new file mode 100644
index 0000000..194bbdd
--- /dev/null
+++ b/webapp/django/contrib/formtools/templates/formtools/form.html
@@ -0,0 +1,15 @@
+{% extends "base.html" %}
+
+{% block content %}
+
+{% if form.errors %}<h1>Please correct the following errors</h1>{% else %}<h1>Submit</h1>{% endif %}
+
+<form action="" method="post">
+<table>
+{{ form }}
+</table>
+<input type="hidden" name="{{ stage_field }}" value="1" />
+<p><input type="submit" value="Preview" /></p>
+</form>
+
+{% endblock %}
diff --git a/webapp/django/contrib/formtools/templates/formtools/preview.html b/webapp/django/contrib/formtools/templates/formtools/preview.html
new file mode 100644
index 0000000..9831157
--- /dev/null
+++ b/webapp/django/contrib/formtools/templates/formtools/preview.html
@@ -0,0 +1,36 @@
+{% extends "base.html" %}
+
+{% block content %}
+
+<h1>Preview your submission</h1>
+
+<table>
+{% for field in form %}
+<tr>
+<th>{{ field.label }}:</th>
+<td>{{ field.data|escape }}</td>
+</tr>
+{% endfor %}
+</table>
+
+<p>Security hash: {{ hash_value }}</p>
+
+<form action="" method="post">
+{% for field in form %}{{ field.as_hidden }}
+{% endfor %}
+<input type="hidden" name="{{ stage_field }}" value="2" />
+<input type="hidden" name="{{ hash_field }}" value="{{ hash_value }}" />
+<p><input type="submit" value="Submit" /></p>
+</form>
+
+<h1>Or edit it again</h1>
+
+<form action="" method="post">
+<table>
+{{ form }}
+</table>
+<input type="hidden" name="{{ stage_field }}" value="1" />
+<p><input type="submit" value="Preview" /></p>
+</form>
+
+{% endblock %}
diff --git a/webapp/django/contrib/formtools/test_urls.py b/webapp/django/contrib/formtools/test_urls.py
new file mode 100644
index 0000000..19dbbd1
--- /dev/null
+++ b/webapp/django/contrib/formtools/test_urls.py
@@ -0,0 +1,12 @@
+"""
+
+This is a urlconf to be loaded by tests.py. Add any urls needed
+for tests only.
+
+"""
+from django.conf.urls.defaults import *
+from django.contrib.formtools.tests import *
+
+urlpatterns = patterns('',
+                       (r'^test1/', TestFormPreview(TestForm)),
+                      )
diff --git a/webapp/django/contrib/formtools/tests.py b/webapp/django/contrib/formtools/tests.py
new file mode 100644
index 0000000..2ea0cc9
--- /dev/null
+++ b/webapp/django/contrib/formtools/tests.py
@@ -0,0 +1,87 @@
+from django import forms
+from django.contrib.formtools import preview
+from django import http
+from django.test import TestCase
+
+success_string = "Done was called!"
+test_data = {'field1': u'foo',
+             'field1_': u'asdf'}
+
+
+class TestFormPreview(preview.FormPreview):
+
+    def done(self, request, cleaned_data):
+        return http.HttpResponse(success_string)
+
+
+class TestForm(forms.Form):
+    field1 = forms.CharField()
+    field1_ = forms.CharField()
+
+
+class PreviewTests(TestCase):
+    urls = 'django.contrib.formtools.test_urls'
+
+    def setUp(self):
+        # Create a FormPreview instance to share between tests
+        self.preview = preview.FormPreview(TestForm)
+        input_template = '<input type="hidden" name="%s" value="%s" />'
+        self.input = input_template % (self.preview.unused_name('stage'), "%d")
+
+    def test_unused_name(self):
+        """
+        Verifies name mangling to get uniue field name.
+        """
+        self.assertEqual(self.preview.unused_name('field1'), 'field1__')
+
+    def test_form_get(self):
+        """
+        Test contrib.formtools.preview form retrieval.
+
+        Use the client library to see if we can sucessfully retrieve
+        the form (mostly testing the setup ROOT_URLCONF
+        process). Verify that an additional  hidden input field
+        is created to manage the stage.
+
+        """
+        response = self.client.get('/test1/')
+        stage = self.input % 1
+        self.assertContains(response, stage, 1)
+
+    def test_form_preview(self):
+        """
+        Test contrib.formtools.preview form preview rendering.
+
+        Use the client library to POST to the form to see if a preview
+        is returned.  If we do get a form back check that the hidden
+        value is correctly managing the state of the form.
+
+        """
+        # Pass strings for form submittal and add stage variable to
+        # show we previously saw first stage of the form.
+        test_data.update({'stage': 1})
+        response = self.client.post('/test1/', test_data)
+        # Check to confirm stage is set to 2 in output form.
+        stage = self.input % 2
+        self.assertContains(response, stage, 1)
+
+    def test_form_submit(self):
+        """
+        Test contrib.formtools.preview form submittal.
+
+        Use the client library to POST to the form with stage set to 3
+        to see if our forms done() method is called. Check first
+        without the security hash, verify failure, retry with security
+        hash and verify sucess.
+
+        """
+        # Pass strings for form submittal and add stage variable to
+        # show we previously saw first stage of the form.
+        test_data.update({'stage': 2})
+        response = self.client.post('/test1/', test_data)
+        self.failIfEqual(response.content, success_string)
+        hash = self.preview.security_hash(None, TestForm(test_data))
+        test_data.update({'hash': hash})
+        response = self.client.post('/test1/', test_data)
+        self.assertEqual(response.content, success_string)
+
diff --git a/webapp/django/contrib/formtools/wizard.py b/webapp/django/contrib/formtools/wizard.py
new file mode 100644
index 0000000..984b6e4
--- /dev/null
+++ b/webapp/django/contrib/formtools/wizard.py
@@ -0,0 +1,247 @@
+"""
+FormWizard class -- implements a multi-page form, validating between each
+step and storing the form's state as HTML hidden fields so that no state is
+stored on the server side.
+"""
+
+import cPickle as pickle
+
+from django import forms
+from django.conf import settings
+from django.http import Http404
+from django.shortcuts import render_to_response
+from django.template.context import RequestContext
+from django.utils.hashcompat import md5_constructor
+
+class FormWizard(object):
+    # Dictionary of extra template context variables.
+    extra_context = {}
+
+    # The HTML (and POST data) field name for the "step" variable.
+    step_field_name="wizard_step"
+
+    # METHODS SUBCLASSES SHOULDN'T OVERRIDE ###################################
+
+    def __init__(self, form_list, initial=None):
+        "form_list should be a list of Form classes (not instances)."
+        self.form_list = form_list[:]
+        self.initial = initial or {}
+        self.step = 0 # A zero-based counter keeping track of which step we're in.
+
+    def __repr__(self):
+        return "step: %d\nform_list: %s\ninitial_data: %s" % (self.step, self.form_list, self.initial)
+
+    def get_form(self, step, data=None):
+        "Helper method that returns the Form instance for the given step."
+        return self.form_list[step](data, prefix=self.prefix_for_step(step), initial=self.initial.get(step, None))
+
+    def num_steps(self):
+        "Helper method that returns the number of steps."
+        # You might think we should just set "self.form_list = len(form_list)"
+        # in __init__(), but this calculation needs to be dynamic, because some
+        # hook methods might alter self.form_list.
+        return len(self.form_list)
+
+    def __call__(self, request, *args, **kwargs):
+        """
+        Main method that does all the hard work, conforming to the Django view
+        interface.
+        """
+        if 'extra_context' in kwargs:
+            self.extra_context.update(kwargs['extra_context'])
+        current_step = self.determine_step(request, *args, **kwargs)
+        self.parse_params(request, *args, **kwargs)
+
+        # Sanity check.
+        if current_step >= self.num_steps():
+            raise Http404('Step %s does not exist' % current_step)
+
+        # For each previous step, verify the hash and process.
+        # TODO: Move "hash_%d" to a method to make it configurable.
+        for i in range(current_step):
+            form = self.get_form(i, request.POST)
+            if request.POST.get("hash_%d" % i, '') != self.security_hash(request, form):
+                return self.render_hash_failure(request, i)
+            self.process_step(request, form, i)
+
+        # Process the current step. If it's valid, go to the next step or call
+        # done(), depending on whether any steps remain.
+        if request.method == 'POST':
+            form = self.get_form(current_step, request.POST)
+        else:
+            form = self.get_form(current_step)
+        if form.is_valid():
+            self.process_step(request, form, current_step)
+            next_step = current_step + 1
+
+            # If this was the last step, validate all of the forms one more
+            # time, as a sanity check, and call done().
+            num = self.num_steps()
+            if next_step == num:
+                final_form_list = [self.get_form(i, request.POST) for i in range(num)]
+
+                # Validate all the forms. If any of them fail validation, that
+                # must mean the validator relied on some other input, such as
+                # an external Web site.
+                for i, f in enumerate(final_form_list):
+                    if not f.is_valid():
+                        return self.render_revalidation_failure(request, i, f)
+                return self.done(request, final_form_list)
+
+            # Otherwise, move along to the next step.
+            else:
+                form = self.get_form(next_step)
+                current_step = next_step
+
+        return self.render(form, request, current_step)
+
+    def render(self, form, request, step, context=None):
+        "Renders the given Form object, returning an HttpResponse."
+        old_data = request.POST
+        prev_fields = []
+        if old_data:
+            hidden = forms.HiddenInput()
+            # Collect all data from previous steps and render it as HTML hidden fields.
+            for i in range(step):
+                old_form = self.get_form(i, old_data)
+                hash_name = 'hash_%s' % i
+                prev_fields.extend([bf.as_hidden() for bf in old_form])
+                prev_fields.append(hidden.render(hash_name, old_data.get(hash_name, self.security_hash(request, old_form))))
+        return self.render_template(request, form, ''.join(prev_fields), step, context)
+
+    # METHODS SUBCLASSES MIGHT OVERRIDE IF APPROPRIATE ########################
+
+    def prefix_for_step(self, step):
+        "Given the step, returns a Form prefix to use."
+        return str(step)
+
+    def render_hash_failure(self, request, step):
+        """
+        Hook for rendering a template if a hash check failed.
+
+        step is the step that failed. Any previous step is guaranteed to be
+        valid.
+
+        This default implementation simply renders the form for the given step,
+        but subclasses may want to display an error message, etc.
+        """
+        return self.render(self.get_form(step), request, step, context={'wizard_error': 'We apologize, but your form has expired. Please continue filling out the form from this page.'})
+
+    def render_revalidation_failure(self, request, step, form):
+        """
+        Hook for rendering a template if final revalidation failed.
+
+        It is highly unlikely that this point would ever be reached, but See
+        the comment in __call__() for an explanation.
+        """
+        return self.render(form, request, step)
+
+    def security_hash(self, request, form):
+        """
+        Calculates the security hash for the given HttpRequest and Form instances.
+
+        This creates a list of the form field names/values in a deterministic
+        order, pickles the result with the SECRET_KEY setting and takes an md5
+        hash of that.
+
+        Subclasses may want to take into account request-specific information,
+        such as the IP address.
+        """
+        data = [(bf.name, bf.data or '') for bf in form] + [settings.SECRET_KEY]
+        # Use HIGHEST_PROTOCOL because it's the most efficient. It requires
+        # Python 2.3, but Django requires 2.3 anyway, so that's OK.
+        pickled = pickle.dumps(data, pickle.HIGHEST_PROTOCOL)
+        return md5_constructor(pickled).hexdigest()
+
+    def determine_step(self, request, *args, **kwargs):
+        """
+        Given the request object and whatever *args and **kwargs were passed to
+        __call__(), returns the current step (which is zero-based).
+
+        Note that the result should not be trusted. It may even be a completely
+        invalid number. It's not the job of this method to validate it.
+        """
+        if not request.POST:
+            return 0
+        try:
+            step = int(request.POST.get(self.step_field_name, 0))
+        except ValueError:
+            return 0
+        return step
+
+    def parse_params(self, request, *args, **kwargs):
+        """
+        Hook for setting some state, given the request object and whatever
+        *args and **kwargs were passed to __call__(), sets some state.
+
+        This is called at the beginning of __call__().
+        """
+        pass
+
+    def get_template(self, step):
+        """
+        Hook for specifying the name of the template to use for a given step.
+
+        Note that this can return a tuple of template names if you'd like to
+        use the template system's select_template() hook.
+        """
+        return 'forms/wizard.html'
+
+    def render_template(self, request, form, previous_fields, step, context=None):
+        """
+        Renders the template for the given step, returning an HttpResponse object.
+
+        Override this method if you want to add a custom context, return a
+        different MIME type, etc. If you only need to override the template
+        name, use get_template() instead.
+
+        The template will be rendered with the following context:
+            step_field -- The name of the hidden field containing the step.
+            step0      -- The current step (zero-based).
+            step       -- The current step (one-based).
+            step_count -- The total number of steps.
+            form       -- The Form instance for the current step (either empty
+                          or with errors).
+            previous_fields -- A string representing every previous data field,
+                          plus hashes for completed forms, all in the form of
+                          hidden fields. Note that you'll need to run this
+                          through the "safe" template filter, to prevent
+                          auto-escaping, because it's raw HTML.
+        """
+        context = context or {}
+        context.update(self.extra_context)
+        return render_to_response(self.get_template(self.step), dict(context,
+            step_field=self.step_field_name,
+            step0=step,
+            step=step + 1,
+            step_count=self.num_steps(),
+            form=form,
+            previous_fields=previous_fields
+        ), context_instance=RequestContext(request))
+
+    def process_step(self, request, form, step):
+        """
+        Hook for modifying the FormWizard's internal state, given a fully
+        validated Form object. The Form is guaranteed to have clean, valid
+        data.
+
+        This method should *not* modify any of that data. Rather, it might want
+        to set self.extra_context or dynamically alter self.form_list, based on
+        previously submitted forms.
+
+        Note that this method is called every time a page is rendered for *all*
+        submitted steps.
+        """
+        pass
+
+    # METHODS SUBCLASSES MUST OVERRIDE ########################################
+
+    def done(self, request, form_list):
+        """
+        Hook for doing something with the validated data. This is responsible
+        for the final processing.
+
+        form_list is a list of Form instances, each containing clean, valid
+        data.
+        """
+        raise NotImplementedError("Your %s class has not defined a done() method, which is required." % self.__class__.__name__)
diff --git a/webapp/django/contrib/gis/__init__.py b/webapp/django/contrib/gis/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/gis/__init__.py
diff --git a/webapp/django/contrib/gis/admin/__init__.py b/webapp/django/contrib/gis/admin/__init__.py
new file mode 100644
index 0000000..20315c5
--- /dev/null
+++ b/webapp/django/contrib/gis/admin/__init__.py
@@ -0,0 +1,12 @@
+# Getting the normal admin routines, classes, and `site` instance.
+from django.contrib.admin import autodiscover, site, StackedInline, TabularInline, HORIZONTAL, VERTICAL
+
+# Geographic admin options classes and widgets.
+from django.contrib.gis.admin.options import GeoModelAdmin
+from django.contrib.gis.admin.widgets import OpenLayersWidget
+
+try:
+    from django.contrib.gis.admin.options import OSMGeoAdmin
+    HAS_OSM = True
+except ImportError:
+    HAS_OSM = False
diff --git a/webapp/django/contrib/gis/admin/options.py b/webapp/django/contrib/gis/admin/options.py
new file mode 100644
index 0000000..71fb87b
--- /dev/null
+++ b/webapp/django/contrib/gis/admin/options.py
@@ -0,0 +1,128 @@
+from django.conf import settings
+from django.contrib.admin import ModelAdmin
+from django.contrib.gis.admin.widgets import OpenLayersWidget
+from django.contrib.gis.gdal import OGRGeomType
+from django.contrib.gis.db import models
+
+class GeoModelAdmin(ModelAdmin):
+    """
+    The administration options class for Geographic models. Map settings
+    may be overloaded from their defaults to create custom maps.
+    """
+    # The default map settings that may be overloaded -- still subject
+    # to API changes.
+    default_lon = 0
+    default_lat = 0
+    default_zoom = 4
+    display_wkt = False
+    display_srid = False
+    extra_js = []
+    num_zoom = 18
+    max_zoom = False
+    min_zoom = False
+    units = False
+    max_resolution = False
+    max_extent = False
+    modifiable = True
+    mouse_position = True
+    scale_text = True
+    layerswitcher = True
+    scrollable = True
+    admin_media_prefix = settings.ADMIN_MEDIA_PREFIX
+    map_width = 600
+    map_height = 400
+    map_srid = 4326
+    map_template = 'gis/admin/openlayers.html'
+    openlayers_url = 'http://openlayers.org/api/2.6/OpenLayers.js'
+    wms_url = 'http://labs.metacarta.com/wms/vmap0'
+    wms_layer = 'basic'
+    wms_name = 'OpenLayers WMS'
+    debug = False
+    widget = OpenLayersWidget
+
+    def _media(self):
+        "Injects OpenLayers JavaScript into the admin."
+        media = super(GeoModelAdmin, self)._media()
+        media.add_js([self.openlayers_url])
+        media.add_js(self.extra_js)
+        return media
+    media = property(_media)
+
+    def formfield_for_dbfield(self, db_field, **kwargs):
+        """
+        Overloaded from ModelAdmin so that an OpenLayersWidget is used
+        for viewing/editing GeometryFields.
+        """
+        if isinstance(db_field, models.GeometryField):
+            # Setting the widget with the newly defined widget.
+            kwargs['widget'] = self.get_map_widget(db_field)
+            return db_field.formfield(**kwargs)
+        else:
+            return super(GeoModelAdmin, self).formfield_for_dbfield(db_field, **kwargs)
+
+    def get_map_widget(self, db_field):
+        """
+        Returns a subclass of the OpenLayersWidget (or whatever was specified
+        in the `widget` attribute) using the settings from the attributes set 
+        in this class.
+        """
+        is_collection = db_field._geom in ('MULTIPOINT', 'MULTILINESTRING', 'MULTIPOLYGON', 'GEOMETRYCOLLECTION')
+        if is_collection:
+            if db_field._geom == 'GEOMETRYCOLLECTION': collection_type = 'Any'
+            else: collection_type = OGRGeomType(db_field._geom.replace('MULTI', ''))
+        else:
+            collection_type = 'None'
+
+        class OLMap(self.widget):
+            template = self.map_template
+            geom_type = db_field._geom
+            params = {'admin_media_prefix' : self.admin_media_prefix,
+                      'default_lon' : self.default_lon,
+                      'default_lat' : self.default_lat,
+                      'default_zoom' : self.default_zoom,
+                      'display_wkt' : self.debug or self.display_wkt,
+                      'geom_type' : OGRGeomType(db_field._geom),
+                      'field_name' : db_field.name,
+                      'is_collection' : is_collection,
+                      'scrollable' : self.scrollable,
+                      'layerswitcher' : self.layerswitcher,
+                      'collection_type' : collection_type,
+                      'is_linestring' : db_field._geom in ('LINESTRING', 'MULTILINESTRING'),
+                      'is_polygon' : db_field._geom in ('POLYGON', 'MULTIPOLYGON'),
+                      'is_point' : db_field._geom in ('POINT', 'MULTIPOINT'),
+                      'num_zoom' : self.num_zoom,
+                      'max_zoom' : self.max_zoom,
+                      'min_zoom' : self.min_zoom,
+                      'units' : self.units, #likely shoud get from object
+                      'max_resolution' : self.max_resolution,
+                      'max_extent' : self.max_extent,
+                      'modifiable' : self.modifiable,
+                      'mouse_position' : self.mouse_position,
+                      'scale_text' : self.scale_text,
+                      'map_width' : self.map_width,
+                      'map_height' : self.map_height,
+                      'srid' : self.map_srid,
+                      'display_srid' : self.display_srid,
+                      'wms_url' : self.wms_url,
+                      'wms_layer' : self.wms_layer,
+                      'wms_name' : self.wms_name,
+                      'debug' : self.debug,
+                      }
+        return OLMap
+
+# Using the Beta OSM in the admin requires the following:
+#  (1) The Google Maps Mercator projection needs to be added
+#      to your `spatial_ref_sys` table.  You'll need at least GDAL 1.5:
+#      >>> from django.contrib.gis.gdal import SpatialReference
+#      >>> from django.contrib.gis.utils import add_postgis_srs
+#      >>> add_postgis_srs(SpatialReference(900913)) # Adding the Google Projection 
+from django.contrib.gis import gdal
+if gdal.HAS_GDAL:
+    class OSMGeoAdmin(GeoModelAdmin):
+        map_template = 'gis/admin/osm.html'
+        extra_js = ['http://openstreetmap.org/openlayers/OpenStreetMap.js']
+        num_zoom = 20
+        map_srid = 900913
+        max_extent = '-20037508,-20037508,20037508,20037508'
+        max_resolution = 156543.0339
+        units = 'm'
diff --git a/webapp/django/contrib/gis/admin/widgets.py b/webapp/django/contrib/gis/admin/widgets.py
new file mode 100644
index 0000000..27abc8f
--- /dev/null
+++ b/webapp/django/contrib/gis/admin/widgets.py
@@ -0,0 +1,92 @@
+from django.contrib.gis.gdal import OGRException
+from django.contrib.gis.geos import GEOSGeometry, GEOSException
+from django.forms.widgets import Textarea
+from django.template.loader import render_to_string
+
+class OpenLayersWidget(Textarea):
+    """
+    Renders an OpenLayers map using the WKT of the geometry.
+    """
+    def render(self, name, value, attrs=None):
+        # Update the template parameters with any attributes passed in.
+        if attrs: self.params.update(attrs)
+
+        # Defaulting the WKT value to a blank string -- this
+        # will be tested in the JavaScript and the appropriate
+        # interfaace will be constructed.
+        self.params['wkt'] = ''
+
+        # If a string reaches here (via a validation error on another
+        # field) then just reconstruct the Geometry.
+        if isinstance(value, basestring):
+            try:
+                value = GEOSGeometry(value)
+            except (GEOSException, ValueError):
+                value = None
+
+        if value and value.geom_type.upper() != self.geom_type:
+            value = None
+
+        # Constructing the dictionary of the map options.
+        self.params['map_options'] = self.map_options()
+
+        # Constructing the JavaScript module name using the ID of
+        # the GeometryField (passed in via the `attrs` keyword).
+        self.params['module'] = 'geodjango_%s' % self.params['field_name']
+
+        if value:
+            # Transforming the geometry to the projection used on the
+            # OpenLayers map.
+            srid = self.params['srid']
+            if value.srid != srid: 
+                try:
+                    value.transform(srid)
+                    wkt = value.wkt
+                except OGRException:
+                    wkt = ''
+            else:
+                wkt = value.wkt
+               
+            # Setting the parameter WKT with that of the transformed
+            # geometry.
+            self.params['wkt'] = wkt
+
+        return render_to_string(self.template, self.params)
+    
+    def map_options(self):
+        "Builds the map options hash for the OpenLayers template."
+
+        # JavaScript construction utilities for the Bounds and Projection.
+        def ol_bounds(extent):
+            return 'new OpenLayers.Bounds(%s)' % str(extent)
+        def ol_projection(srid):
+            return 'new OpenLayers.Projection("EPSG:%s")' % srid
+
+        # An array of the parameter name, the name of their OpenLayers
+        # counterpart, and the type of variable they are.
+        map_types = [('srid', 'projection', 'srid'), 
+                     ('display_srid', 'displayProjection', 'srid'), 
+                     ('units', 'units', str),
+                     ('max_resolution', 'maxResolution', float),
+                     ('max_extent', 'maxExtent', 'bounds'),
+                     ('num_zoom', 'numZoomLevels', int),
+                     ('max_zoom', 'maxZoomLevels', int),
+                     ('min_zoom', 'minZoomLevel', int),
+                     ]
+
+        # Building the map options hash.
+        map_options = {}
+        for param_name, js_name, option_type in map_types:
+            if self.params.get(param_name, False):
+                if option_type == 'srid':
+                    value = ol_projection(self.params[param_name])
+                elif option_type == 'bounds':
+                    value = ol_bounds(self.params[param_name])
+                elif option_type in (float, int):
+                    value = self.params[param_name]
+                elif option_type in (str,):
+                    value = '"%s"' % self.params[param_name]
+                else:
+                    raise TypeError
+                map_options[js_name] = value
+        return map_options
diff --git a/webapp/django/contrib/gis/db/__init__.py b/webapp/django/contrib/gis/db/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/gis/db/__init__.py
diff --git a/webapp/django/contrib/gis/db/backend/__init__.py b/webapp/django/contrib/gis/db/backend/__init__.py
new file mode 100644
index 0000000..172c126
--- /dev/null
+++ b/webapp/django/contrib/gis/db/backend/__init__.py
@@ -0,0 +1,18 @@
+"""
+ This module provides the backend for spatial SQL construction with Django.
+
+ Specifically, this module will import the correct routines and modules
+ needed for GeoDjango to interface with the spatial database.
+"""
+from django.conf import settings
+from django.contrib.gis.db.backend.util import gqn
+
+# Retrieving the necessary settings from the backend.
+if settings.DATABASE_ENGINE == 'postgresql_psycopg2':
+    from django.contrib.gis.db.backend.postgis import create_spatial_db, get_geo_where_clause, SpatialBackend
+elif settings.DATABASE_ENGINE == 'oracle':
+    from django.contrib.gis.db.backend.oracle import create_spatial_db, get_geo_where_clause, SpatialBackend
+elif settings.DATABASE_ENGINE == 'mysql':
+    from django.contrib.gis.db.backend.mysql import create_spatial_db, get_geo_where_clause, SpatialBackend
+else:
+    raise NotImplementedError('No Geographic Backend exists for %s' % settings.DATABASE_ENGINE)
diff --git a/webapp/django/contrib/gis/db/backend/adaptor.py b/webapp/django/contrib/gis/db/backend/adaptor.py
new file mode 100644
index 0000000..b2397e6
--- /dev/null
+++ b/webapp/django/contrib/gis/db/backend/adaptor.py
@@ -0,0 +1,14 @@
+class WKTAdaptor(object):
+    """
+    This provides an adaptor for Geometries sent to the
+    MySQL and Oracle database backends.
+    """
+    def __init__(self, geom):
+        self.wkt = geom.wkt
+        self.srid = geom.srid
+
+    def __eq__(self, other):
+        return self.wkt == other.wkt and self.srid == other.srid 
+
+    def __str__(self):
+        return self.wkt
diff --git a/webapp/django/contrib/gis/db/backend/base.py b/webapp/django/contrib/gis/db/backend/base.py
new file mode 100644
index 0000000..d45ac7b
--- /dev/null
+++ b/webapp/django/contrib/gis/db/backend/base.py
@@ -0,0 +1,29 @@
+"""
+ This module holds the base `SpatialBackend` object, which is
+ instantiated by each spatial backend with the features it has.
+"""
+# TODO: Create a `Geometry` protocol and allow user to use
+# different Geometry objects -- for now we just use GEOSGeometry.
+from django.contrib.gis.geos import GEOSGeometry, GEOSException
+
+class BaseSpatialBackend(object):
+    Geometry = GEOSGeometry
+    GeometryException = GEOSException
+
+    def __init__(self, **kwargs):
+        kwargs.setdefault('distance_functions', {})
+        kwargs.setdefault('limited_where', {})
+        for k, v in kwargs.iteritems(): setattr(self, k, v)
+ 
+    def __getattr__(self, name):
+        """
+        All attributes of the spatial backend return False by default.
+        """
+        try:
+            return self.__dict__[name]
+        except KeyError:
+            return False
+            
+        
+        
+    
diff --git a/webapp/django/contrib/gis/db/backend/mysql/__init__.py b/webapp/django/contrib/gis/db/backend/mysql/__init__.py
new file mode 100644
index 0000000..0484e5f
--- /dev/null
+++ b/webapp/django/contrib/gis/db/backend/mysql/__init__.py
@@ -0,0 +1,13 @@
+__all__ = ['create_spatial_db', 'get_geo_where_clause', 'SpatialBackend']
+
+from django.contrib.gis.db.backend.base import BaseSpatialBackend
+from django.contrib.gis.db.backend.adaptor import WKTAdaptor
+from django.contrib.gis.db.backend.mysql.creation import create_spatial_db
+from django.contrib.gis.db.backend.mysql.field import MySQLGeoField
+from django.contrib.gis.db.backend.mysql.query import *
+
+SpatialBackend = BaseSpatialBackend(name='mysql', mysql=True,
+                                    gis_terms=MYSQL_GIS_TERMS,
+                                    select=GEOM_SELECT,
+                                    Adaptor=WKTAdaptor,
+                                    Field=MySQLGeoField)
diff --git a/webapp/django/contrib/gis/db/backend/mysql/creation.py b/webapp/django/contrib/gis/db/backend/mysql/creation.py
new file mode 100644
index 0000000..3da21a0
--- /dev/null
+++ b/webapp/django/contrib/gis/db/backend/mysql/creation.py
@@ -0,0 +1,5 @@
+
+def create_spatial_db(test=True, verbosity=1, autoclobber=False):
+    if not test: raise NotImplementedError('This uses `create_test_db` from test/utils.py')
+    from django.db import connection
+    connection.creation.create_test_db(verbosity, autoclobber)
diff --git a/webapp/django/contrib/gis/db/backend/mysql/field.py b/webapp/django/contrib/gis/db/backend/mysql/field.py
new file mode 100644
index 0000000..f3151f9
--- /dev/null
+++ b/webapp/django/contrib/gis/db/backend/mysql/field.py
@@ -0,0 +1,53 @@
+from django.db import connection
+from django.db.models.fields import Field # Django base Field class
+from django.contrib.gis.db.backend.mysql.query import GEOM_FROM_TEXT
+
+# Quotename & geographic quotename, respectively.
+qn = connection.ops.quote_name
+
+class MySQLGeoField(Field):
+    """
+    The backend-specific geographic field for MySQL.
+    """
+
+    def _geom_index(self, style, db_table):
+        """
+        Creates a spatial index for the geometry column.  If MyISAM tables are
+        used an R-Tree index is created, otherwise a B-Tree index is created. 
+        Thus, for best spatial performance, you should use MyISAM tables
+        (which do not support transactions).  For more information, see Ch. 
+        16.6.1 of the MySQL 5.0 documentation.
+        """
+
+        # Getting the index name.
+        idx_name = '%s_%s_id' % (db_table, self.column)
+        
+        sql = style.SQL_KEYWORD('CREATE SPATIAL INDEX ') + \
+              style.SQL_TABLE(qn(idx_name)) + \
+              style.SQL_KEYWORD(' ON ') + \
+              style.SQL_TABLE(qn(db_table)) + '(' + \
+              style.SQL_FIELD(qn(self.column)) + ');'
+        return sql
+
+    def _post_create_sql(self, style, db_table):
+        """
+        Returns SQL that will be executed after the model has been
+        created.
+        """
+        # Getting the geometric index for this Geometry column.
+        if self._index:
+            return (self._geom_index(style, db_table),)
+        else:
+            return ()
+
+    def db_type(self):
+        "The OpenGIS name is returned for the MySQL database column type."
+        return self._geom
+
+    def get_placeholder(self, value):
+        """
+        The placeholder here has to include MySQL's WKT constructor.  Because 
+        MySQL does not support spatial transformations, there is no need to 
+        modify the placeholder based on the contents of the given value.
+        """
+        return '%s(%%s)' % GEOM_FROM_TEXT
diff --git a/webapp/django/contrib/gis/db/backend/mysql/query.py b/webapp/django/contrib/gis/db/backend/mysql/query.py
new file mode 100644
index 0000000..2fa984f
--- /dev/null
+++ b/webapp/django/contrib/gis/db/backend/mysql/query.py
@@ -0,0 +1,59 @@
+"""
+ This module contains the spatial lookup types, and the `get_geo_where_clause`
+ routine for MySQL.
+
+ Please note that MySQL only supports bounding box queries, also
+ known as MBRs (Minimum Bounding Rectangles).  Moreover, spatial
+ indices may only be used on MyISAM tables -- if you need 
+ transactions, take a look at PostGIS.
+"""
+from django.db import connection
+qn = connection.ops.quote_name
+
+# To ease implementation, WKT is passed to/from MySQL.
+GEOM_FROM_TEXT = 'GeomFromText'
+GEOM_FROM_WKB = 'GeomFromWKB'
+GEOM_SELECT = 'AsText(%s)'
+
+# WARNING: MySQL is NOT compliant w/the OpenGIS specification and
+# _every_ one of these lookup types is on the _bounding box_ only.
+MYSQL_GIS_FUNCTIONS = {
+    'bbcontains' : 'MBRContains', # For consistency w/PostGIS API
+    'bboverlaps' : 'MBROverlaps', # .. ..
+    'contained' : 'MBRWithin',    # .. ..
+    'contains' : 'MBRContains',
+    'disjoint' : 'MBRDisjoint',
+    'equals' : 'MBREqual',
+    'exact' : 'MBREqual',
+    'intersects' : 'MBRIntersects',
+    'overlaps' : 'MBROverlaps',
+    'same_as' : 'MBREqual',
+    'touches' : 'MBRTouches',
+    'within' : 'MBRWithin',
+    }
+
+# This lookup type does not require a mapping.
+MISC_TERMS = ['isnull']
+
+# Assacceptable lookup types for Oracle spatial.
+MYSQL_GIS_TERMS  = MYSQL_GIS_FUNCTIONS.keys()
+MYSQL_GIS_TERMS += MISC_TERMS
+MYSQL_GIS_TERMS = dict((term, None) for term in MYSQL_GIS_TERMS) # Making dictionary 
+
+def get_geo_where_clause(table_alias, name, lookup_type, geo_annot):
+    "Returns the SQL WHERE clause for use in MySQL spatial SQL construction."
+    # Getting the quoted field as `geo_col`.
+    geo_col = '%s.%s' % (qn(table_alias), qn(name))
+
+    # See if a MySQL Geometry function matches the lookup type next
+    lookup_info = MYSQL_GIS_FUNCTIONS.get(lookup_type, False)
+    if lookup_info:
+        return "%s(%s, %%s)" % (lookup_info, geo_col)
+    
+    # Handling 'isnull' lookup type
+    # TODO: Is this needed because MySQL cannot handle NULL
+    # geometries in its spatial indices.
+    if lookup_type == 'isnull':
+        return "%s IS %sNULL" % (geo_col, (not geo_annot.value and 'NOT ' or ''))
+
+    raise TypeError("Got invalid lookup_type: %s" % repr(lookup_type))
diff --git a/webapp/django/contrib/gis/db/backend/oracle/__init__.py b/webapp/django/contrib/gis/db/backend/oracle/__init__.py
new file mode 100644
index 0000000..3eee56e
--- /dev/null
+++ b/webapp/django/contrib/gis/db/backend/oracle/__init__.py
@@ -0,0 +1,31 @@
+__all__ = ['create_spatial_db', 'get_geo_where_clause', 'SpatialBackend']
+
+from django.contrib.gis.db.backend.base import BaseSpatialBackend
+from django.contrib.gis.db.backend.oracle.adaptor import OracleSpatialAdaptor
+from django.contrib.gis.db.backend.oracle.creation import create_spatial_db
+from django.contrib.gis.db.backend.oracle.field import OracleSpatialField
+from django.contrib.gis.db.backend.oracle.query import *
+
+SpatialBackend = BaseSpatialBackend(name='oracle', oracle=True,
+                                    area=AREA,
+                                    centroid=CENTROID,
+                                    difference=DIFFERENCE,
+                                    distance=DISTANCE,
+                                    distance_functions=DISTANCE_FUNCTIONS,
+                                    gis_terms=ORACLE_SPATIAL_TERMS,
+                                    gml=ASGML,
+                                    intersection=INTERSECTION,
+                                    length=LENGTH,
+                                    limited_where = {'relate' : None},
+                                    num_geom=NUM_GEOM,
+                                    num_points=NUM_POINTS,
+                                    perimeter=LENGTH,
+                                    point_on_surface=POINT_ON_SURFACE,
+                                    select=GEOM_SELECT,
+                                    sym_difference=SYM_DIFFERENCE,
+                                    transform=TRANSFORM,
+                                    unionagg=UNIONAGG,
+                                    union=UNION,
+                                    Adaptor=OracleSpatialAdaptor,
+                                    Field=OracleSpatialField,
+                                    )
diff --git a/webapp/django/contrib/gis/db/backend/oracle/adaptor.py b/webapp/django/contrib/gis/db/backend/oracle/adaptor.py
new file mode 100644
index 0000000..95dc265
--- /dev/null
+++ b/webapp/django/contrib/gis/db/backend/oracle/adaptor.py
@@ -0,0 +1,5 @@
+from cx_Oracle import CLOB
+from django.contrib.gis.db.backend.adaptor import WKTAdaptor
+
+class OracleSpatialAdaptor(WKTAdaptor):
+    input_size = CLOB
diff --git a/webapp/django/contrib/gis/db/backend/oracle/creation.py b/webapp/django/contrib/gis/db/backend/oracle/creation.py
new file mode 100644
index 0000000..d9b53d2
--- /dev/null
+++ b/webapp/django/contrib/gis/db/backend/oracle/creation.py
@@ -0,0 +1,6 @@
+
+def create_spatial_db(test=True, verbosity=1, autoclobber=False):
+    "A wrapper over the Oracle `create_test_db` routine."
+    if not test: raise NotImplementedError('This uses `create_test_db` from db/backends/oracle/creation.py')
+    from django.db import connection
+    connection.creation.create_test_db(verbosity, autoclobber)
diff --git a/webapp/django/contrib/gis/db/backend/oracle/field.py b/webapp/django/contrib/gis/db/backend/oracle/field.py
new file mode 100644
index 0000000..22625f5
--- /dev/null
+++ b/webapp/django/contrib/gis/db/backend/oracle/field.py
@@ -0,0 +1,103 @@
+from django.db import connection
+from django.db.backends.util import truncate_name
+from django.db.models.fields import Field # Django base Field class
+from django.contrib.gis.db.backend.util import gqn
+from django.contrib.gis.db.backend.oracle.query import TRANSFORM
+
+# Quotename & geographic quotename, respectively.
+qn = connection.ops.quote_name
+
+class OracleSpatialField(Field):
+    """
+    The backend-specific geographic field for Oracle Spatial.
+    """
+
+    empty_strings_allowed = False
+
+    def __init__(self, extent=(-180.0, -90.0, 180.0, 90.0), tolerance=0.05, **kwargs):
+        """
+        Oracle Spatial backend needs to have the extent -- for projected coordinate
+        systems _you must define the extent manually_, since the coordinates are
+        for geodetic systems.  The `tolerance` keyword specifies the tolerance
+        for error (in meters), and defaults to 0.05 (5 centimeters).
+        """
+        # Oracle Spatial specific keyword arguments.
+        self._extent = extent
+        self._tolerance = tolerance
+        # Calling the Django field initialization.
+        super(OracleSpatialField, self).__init__(**kwargs)
+
+    def _add_geom(self, style, db_table):
+        """
+        Adds this geometry column into the Oracle USER_SDO_GEOM_METADATA
+        table.
+        """
+
+        # Checking the dimensions.
+        # TODO: Add support for 3D geometries.
+        if self._dim != 2:
+            raise Exception('3D geometries not yet supported on Oracle Spatial backend.')
+
+        # Constructing the SQL that will be used to insert information about
+        # the geometry column into the USER_GSDO_GEOM_METADATA table.
+        meta_sql = style.SQL_KEYWORD('INSERT INTO ') + \
+                   style.SQL_TABLE('USER_SDO_GEOM_METADATA') + \
+                   ' (%s, %s, %s, %s)\n  ' % tuple(map(qn, ['TABLE_NAME', 'COLUMN_NAME', 'DIMINFO', 'SRID'])) + \
+                   style.SQL_KEYWORD(' VALUES ') + '(\n    ' + \
+                   style.SQL_TABLE(gqn(db_table)) + ',\n    ' + \
+                   style.SQL_FIELD(gqn(self.column)) + ',\n    ' + \
+                   style.SQL_KEYWORD("MDSYS.SDO_DIM_ARRAY") + '(\n      ' + \
+                   style.SQL_KEYWORD("MDSYS.SDO_DIM_ELEMENT") + \
+                   ("('LONG', %s, %s, %s),\n      " % (self._extent[0], self._extent[2], self._tolerance)) + \
+                   style.SQL_KEYWORD("MDSYS.SDO_DIM_ELEMENT") + \
+                   ("('LAT', %s, %s, %s)\n    ),\n" % (self._extent[1], self._extent[3], self._tolerance)) + \
+                   '    %s\n  );' % self._srid
+        return meta_sql
+
+    def _geom_index(self, style, db_table):
+        "Creates an Oracle Geometry index (R-tree) for this geometry field."
+
+        # Getting the index name, Oracle doesn't allow object
+        # names > 30 characters.
+        idx_name = truncate_name('%s_%s_id' % (db_table, self.column), 30)
+        
+        sql = style.SQL_KEYWORD('CREATE INDEX ') + \
+              style.SQL_TABLE(qn(idx_name)) + \
+              style.SQL_KEYWORD(' ON ') + \
+              style.SQL_TABLE(qn(db_table)) + '(' + \
+              style.SQL_FIELD(qn(self.column)) + ') ' + \
+              style.SQL_KEYWORD('INDEXTYPE IS ') + \
+              style.SQL_TABLE('MDSYS.SPATIAL_INDEX') + ';'
+        return sql
+
+    def post_create_sql(self, style, db_table):
+        """
+        Returns SQL that will be executed after the model has been
+        created.
+        """
+        # Getting the meta geometry information.
+        post_sql = self._add_geom(style, db_table)
+
+        # Getting the geometric index for this Geometry column.
+        if self._index:
+            return (post_sql, self._geom_index(style, db_table))
+        else:
+            return (post_sql,)
+
+    def db_type(self):
+        "The Oracle geometric data type is MDSYS.SDO_GEOMETRY."
+        return 'MDSYS.SDO_GEOMETRY'
+        
+    def get_placeholder(self, value):
+        """
+        Provides a proper substitution value for Geometries that are not in the
+        SRID of the field.  Specifically, this routine will substitute in the
+        SDO_CS.TRANSFORM() function call.
+        """
+        if value is None:
+            return '%s'
+        elif value.srid != self._srid:
+            # Adding Transform() to the SQL placeholder.
+            return '%s(SDO_GEOMETRY(%%s, %s), %s)' % (TRANSFORM, value.srid, self._srid)
+        else:
+            return 'SDO_GEOMETRY(%%s, %s)' % self._srid
diff --git a/webapp/django/contrib/gis/db/backend/oracle/models.py b/webapp/django/contrib/gis/db/backend/oracle/models.py
new file mode 100644
index 0000000..c740b48
--- /dev/null
+++ b/webapp/django/contrib/gis/db/backend/oracle/models.py
@@ -0,0 +1,49 @@
+"""
+ The GeometryColumns and SpatialRefSys models for the Oracle spatial
+ backend.
+
+ It should be noted that Oracle Spatial does not have database tables
+ named according to the OGC standard, so the closest analogs are used.
+ For example, the `USER_SDO_GEOM_METADATA` is used for the GeometryColumns
+ model and the `SDO_COORD_REF_SYS` is used for the SpatialRefSys model.
+"""
+from django.db import models
+from django.contrib.gis.models import SpatialRefSysMixin
+
+class GeometryColumns(models.Model):
+    "Maps to the Oracle USER_SDO_GEOM_METADATA table."
+    table_name = models.CharField(max_length=32)
+    column_name = models.CharField(max_length=1024)
+    srid = models.IntegerField(primary_key=True)
+    # TODO: Add support for `diminfo` column (type MDSYS.SDO_DIM_ARRAY).
+    class Meta:
+        db_table = 'USER_SDO_GEOM_METADATA'
+
+    @classmethod
+    def table_name_col(cls):
+        return 'table_name'
+
+    def __unicode__(self):
+        return '%s - %s (SRID: %s)' % (self.table_name, self.column_name, self.srid)
+
+class SpatialRefSys(models.Model, SpatialRefSysMixin):
+    "Maps to the Oracle MDSYS.CS_SRS table."
+    cs_name = models.CharField(max_length=68)
+    srid = models.IntegerField(primary_key=True)
+    auth_srid = models.IntegerField()
+    auth_name = models.CharField(max_length=256)
+    wktext = models.CharField(max_length=2046)
+    #cs_bounds = models.GeometryField()
+
+    class Meta:
+        # TODO: Figure out way to have this be MDSYS.CS_SRS without
+        #  having django's quoting mess up the SQL.
+        db_table = 'CS_SRS'
+
+    @property
+    def wkt(self):
+        return self.wktext
+
+    @classmethod
+    def wkt_col(cls):
+        return 'wktext'
diff --git a/webapp/django/contrib/gis/db/backend/oracle/query.py b/webapp/django/contrib/gis/db/backend/oracle/query.py
new file mode 100644
index 0000000..dcf6f67
--- /dev/null
+++ b/webapp/django/contrib/gis/db/backend/oracle/query.py
@@ -0,0 +1,154 @@
+"""
+ This module contains the spatial lookup types, and the `get_geo_where_clause`
+ routine for Oracle Spatial.
+
+ Please note that WKT support is broken on the XE version, and thus
+ this backend will not work on such platforms.  Specifically, XE lacks 
+ support for an internal JVM, and Java libraries are required to use 
+ the WKT constructors.
+"""
+import re
+from decimal import Decimal
+from django.db import connection
+from django.contrib.gis.db.backend.util import SpatialFunction
+from django.contrib.gis.measure import Distance
+qn = connection.ops.quote_name
+
+# The GML, distance, transform, and union procedures.
+AREA = 'SDO_GEOM.SDO_AREA'
+ASGML = 'SDO_UTIL.TO_GMLGEOMETRY'
+CENTROID = 'SDO_GEOM.SDO_CENTROID'
+DIFFERENCE = 'SDO_GEOM.SDO_DIFFERENCE'
+DISTANCE = 'SDO_GEOM.SDO_DISTANCE'
+EXTENT = 'SDO_AGGR_MBR'
+INTERSECTION = 'SDO_GEOM.SDO_INTERSECTION'
+LENGTH = 'SDO_GEOM.SDO_LENGTH'
+NUM_GEOM = 'SDO_UTIL.GETNUMELEM'
+NUM_POINTS = 'SDO_UTIL.GETNUMVERTICES'
+POINT_ON_SURFACE = 'SDO_GEOM.SDO_POINTONSURFACE'
+SYM_DIFFERENCE = 'SDO_GEOM.SDO_XOR'
+TRANSFORM = 'SDO_CS.TRANSFORM'
+UNION = 'SDO_GEOM.SDO_UNION'
+UNIONAGG = 'SDO_AGGR_UNION'
+
+# We want to get SDO Geometries as WKT because it is much easier to 
+# instantiate GEOS proxies from WKT than SDO_GEOMETRY(...) strings.  
+# However, this adversely affects performance (i.e., Java is called 
+# to convert to WKT on every query).  If someone wishes to write a 
+# SDO_GEOMETRY(...) parser in Python, let me know =)
+GEOM_SELECT = 'SDO_UTIL.TO_WKTGEOMETRY(%s)'
+
+#### Classes used in constructing Oracle spatial SQL ####
+class SDOOperation(SpatialFunction):
+    "Base class for SDO* Oracle operations."
+    def __init__(self, func, **kwargs):
+        kwargs.setdefault('operator', '=')
+        kwargs.setdefault('result', 'TRUE')
+        kwargs.setdefault('end_subst', ") %s '%s'")
+        super(SDOOperation, self).__init__(func, **kwargs)
+
+class SDODistance(SpatialFunction):
+    "Class for Distance queries."
+    def __init__(self, op, tolerance=0.05):
+        super(SDODistance, self).__init__(DISTANCE, end_subst=', %s) %%s %%s' % tolerance, 
+                                          operator=op, result='%%s')
+
+class SDOGeomRelate(SpatialFunction):
+    "Class for using SDO_GEOM.RELATE."
+    def __init__(self, mask, tolerance=0.05):
+        # SDO_GEOM.RELATE(...) has a peculiar argument order: column, mask, geom, tolerance.
+        # Moreover, the runction result is the mask (e.g., 'DISJOINT' instead of 'TRUE').
+        end_subst = "%s%s) %s '%s'" % (', %%s, ', tolerance, '=', mask)
+        beg_subst = "%%s(%%s, '%s'" % mask 
+        super(SDOGeomRelate, self).__init__('SDO_GEOM.RELATE', beg_subst=beg_subst, end_subst=end_subst)
+
+class SDORelate(SpatialFunction):
+    "Class for using SDO_RELATE."
+    masks = 'TOUCH|OVERLAPBDYDISJOINT|OVERLAPBDYINTERSECT|EQUAL|INSIDE|COVEREDBY|CONTAINS|COVERS|ANYINTERACT|ON'
+    mask_regex = re.compile(r'^(%s)(\+(%s))*$' % (masks, masks), re.I)
+    def __init__(self, mask):
+        func = 'SDO_RELATE'
+        if not self.mask_regex.match(mask):
+            raise ValueError('Invalid %s mask: "%s"' % (func, mask))
+        super(SDORelate, self).__init__(func, end_subst=", 'mask=%s') = 'TRUE'" % mask)
+
+#### Lookup type mapping dictionaries of Oracle spatial operations ####
+
+# Valid distance types and substitutions
+dtypes = (Decimal, Distance, float, int, long)
+DISTANCE_FUNCTIONS = {
+    'distance_gt' : (SDODistance('>'), dtypes),
+    'distance_gte' : (SDODistance('>='), dtypes),
+    'distance_lt' : (SDODistance('<'), dtypes),
+    'distance_lte' : (SDODistance('<='), dtypes),
+    'dwithin' : (SDOOperation('SDO_WITHIN_DISTANCE', 
+                              beg_subst="%s(%s, %%s, 'distance=%%s'"), dtypes),
+    }
+
+ORACLE_GEOMETRY_FUNCTIONS = {
+    'contains' : SDOOperation('SDO_CONTAINS'),
+    'coveredby' : SDOOperation('SDO_COVEREDBY'),
+    'covers' : SDOOperation('SDO_COVERS'),
+    'disjoint' : SDOGeomRelate('DISJOINT'),
+    'intersects' : SDOOperation('SDO_OVERLAPBDYINTERSECT'), # TODO: Is this really the same as ST_Intersects()?
+    'equals' : SDOOperation('SDO_EQUAL'),
+    'exact' : SDOOperation('SDO_EQUAL'),
+    'overlaps' : SDOOperation('SDO_OVERLAPS'),
+    'same_as' : SDOOperation('SDO_EQUAL'),
+    'relate' : (SDORelate, basestring), # Oracle uses a different syntax, e.g., 'mask=inside+touch'
+    'touches' : SDOOperation('SDO_TOUCH'),
+    'within' : SDOOperation('SDO_INSIDE'),
+    }
+ORACLE_GEOMETRY_FUNCTIONS.update(DISTANCE_FUNCTIONS)
+
+# This lookup type does not require a mapping.
+MISC_TERMS = ['isnull']
+
+# Acceptable lookup types for Oracle spatial.
+ORACLE_SPATIAL_TERMS  = ORACLE_GEOMETRY_FUNCTIONS.keys()
+ORACLE_SPATIAL_TERMS += MISC_TERMS
+ORACLE_SPATIAL_TERMS = dict((term, None) for term in ORACLE_SPATIAL_TERMS) # Making dictionary for fast lookups
+
+#### The `get_geo_where_clause` function for Oracle ####
+def get_geo_where_clause(table_alias, name, lookup_type, geo_annot):
+    "Returns the SQL WHERE clause for use in Oracle spatial SQL construction."
+    # Getting the quoted table name as `geo_col`.
+    geo_col = '%s.%s' % (qn(table_alias), qn(name))
+
+    # See if a Oracle Geometry function matches the lookup type next
+    lookup_info = ORACLE_GEOMETRY_FUNCTIONS.get(lookup_type, False)
+    if lookup_info:
+        # Lookup types that are tuples take tuple arguments, e.g., 'relate' and 
+        # 'dwithin' lookup types.
+        if isinstance(lookup_info, tuple):
+            # First element of tuple is lookup type, second element is the type
+            # of the expected argument (e.g., str, float)
+            sdo_op, arg_type = lookup_info
+
+            # Ensuring that a tuple _value_ was passed in from the user
+            if not isinstance(geo_annot.value, tuple):
+                raise TypeError('Tuple required for `%s` lookup type.' % lookup_type)
+            if len(geo_annot.value) != 2: 
+                raise ValueError('2-element tuple required for %s lookup type.' % lookup_type)
+            
+            # Ensuring the argument type matches what we expect.
+            if not isinstance(geo_annot.value[1], arg_type):
+                raise TypeError('Argument type should be %s, got %s instead.' % (arg_type, type(geo_annot.value[1])))
+
+            if lookup_type == 'relate':
+                # The SDORelate class handles construction for these queries, 
+                # and verifies the mask argument.
+                return sdo_op(geo_annot.value[1]).as_sql(geo_col)
+            else:
+                # Otherwise, just call the `as_sql` method on the SDOOperation instance.
+                return sdo_op.as_sql(geo_col)
+        else:
+            # Lookup info is a SDOOperation instance, whose `as_sql` method returns
+            # the SQL necessary for the geometry function call. For example:  
+            #  SDO_CONTAINS("geoapp_country"."poly", SDO_GEOMTRY('POINT(5 23)', 4326)) = 'TRUE'
+            return lookup_info.as_sql(geo_col)
+    elif lookup_type == 'isnull':
+        # Handling 'isnull' lookup type
+        return "%s IS %sNULL" % (geo_col, (not geo_annot.value and 'NOT ' or ''))
+
+    raise TypeError("Got invalid lookup_type: %s" % repr(lookup_type))
diff --git a/webapp/django/contrib/gis/db/backend/postgis/__init__.py b/webapp/django/contrib/gis/db/backend/postgis/__init__.py
new file mode 100644
index 0000000..8a4d09e
--- /dev/null
+++ b/webapp/django/contrib/gis/db/backend/postgis/__init__.py
@@ -0,0 +1,42 @@
+__all__ = ['create_spatial_db', 'get_geo_where_clause', 'SpatialBackend']
+
+from django.contrib.gis.db.backend.base import BaseSpatialBackend
+from django.contrib.gis.db.backend.postgis.adaptor import PostGISAdaptor
+from django.contrib.gis.db.backend.postgis.creation import create_spatial_db
+from django.contrib.gis.db.backend.postgis.field import PostGISField
+from django.contrib.gis.db.backend.postgis.query import *
+
+SpatialBackend = BaseSpatialBackend(name='postgis', postgis=True,
+                                    area=AREA,
+                                    centroid=CENTROID,
+                                    difference=DIFFERENCE,
+                                    distance=DISTANCE,
+                                    distance_functions=DISTANCE_FUNCTIONS,
+                                    distance_sphere=DISTANCE_SPHERE,
+                                    distance_spheroid=DISTANCE_SPHEROID,
+                                    envelope=ENVELOPE,
+                                    extent=EXTENT,
+                                    gis_terms=POSTGIS_TERMS,
+                                    gml=ASGML,
+                                    intersection=INTERSECTION,
+                                    kml=ASKML,
+                                    length=LENGTH,
+                                    length_spheroid=LENGTH_SPHEROID,
+                                    make_line=MAKE_LINE,
+                                    mem_size=MEM_SIZE,
+                                    num_geom=NUM_GEOM,
+                                    num_points=NUM_POINTS,
+                                    perimeter=PERIMETER,
+                                    point_on_surface=POINT_ON_SURFACE,
+                                    scale=SCALE,
+                                    select=GEOM_SELECT,
+                                    svg=ASSVG,
+                                    sym_difference=SYM_DIFFERENCE,
+                                    transform=TRANSFORM,
+                                    translate=TRANSLATE,
+                                    union=UNION,
+                                    unionagg=UNIONAGG,
+                                    version=(MAJOR_VERSION, MINOR_VERSION1, MINOR_VERSION2),
+                                    Adaptor=PostGISAdaptor,
+                                    Field=PostGISField,
+                                    )
diff --git a/webapp/django/contrib/gis/db/backend/postgis/adaptor.py b/webapp/django/contrib/gis/db/backend/postgis/adaptor.py
new file mode 100644
index 0000000..c094a98
--- /dev/null
+++ b/webapp/django/contrib/gis/db/backend/postgis/adaptor.py
@@ -0,0 +1,33 @@
+"""
+ This object provides quoting for GEOS geometries into PostgreSQL/PostGIS.
+"""
+
+from django.contrib.gis.db.backend.postgis.query import GEOM_FROM_WKB
+from psycopg2 import Binary
+from psycopg2.extensions import ISQLQuote
+
+class PostGISAdaptor(object):
+    def __init__(self, geom):
+        "Initializes on the geometry."
+        # Getting the WKB (in string form, to allow easy pickling of
+        # the adaptor) and the SRID from the geometry.
+        self.wkb = str(geom.wkb)
+        self.srid = geom.srid
+
+    def __conform__(self, proto):
+        # Does the given protocol conform to what Psycopg2 expects?
+        if proto == ISQLQuote:
+            return self
+        else:
+            raise Exception('Error implementing psycopg2 protocol. Is psycopg2 installed?')
+
+    def __eq__(self, other):
+        return (self.wkb == other.wkb) and (self.srid == other.srid)
+
+    def __str__(self):
+        return self.getquoted()
+
+    def getquoted(self):
+        "Returns a properly quoted string for use in PostgreSQL/PostGIS."
+        # Want to use WKB, so wrap with psycopg2 Binary() to quote properly.
+        return "%s(%s, %s)" % (GEOM_FROM_WKB, Binary(self.wkb), self.srid or -1)
diff --git a/webapp/django/contrib/gis/db/backend/postgis/creation.py b/webapp/django/contrib/gis/db/backend/postgis/creation.py
new file mode 100644
index 0000000..44d9346
--- /dev/null
+++ b/webapp/django/contrib/gis/db/backend/postgis/creation.py
@@ -0,0 +1,224 @@
+import os, re, sys
+
+from django.conf import settings
+from django.core.management import call_command
+from django.db import connection
+from django.db.backends.creation import TEST_DATABASE_PREFIX
+
+def getstatusoutput(cmd):
+    "A simpler version of getstatusoutput that works on win32 platforms."
+    stdin, stdout, stderr = os.popen3(cmd)
+    output = stdout.read()
+    if output.endswith('\n'): output = output[:-1]
+    status = stdin.close()
+    return status, output
+
+def create_lang(db_name, verbosity=1):
+    "Sets up the pl/pgsql language on the given database."
+
+    # Getting the command-line options for the shell command
+    options = get_cmd_options(db_name)
+
+    # Constructing the 'createlang' command.
+    createlang_cmd = 'createlang %splpgsql' % options
+    if verbosity >= 1: print createlang_cmd
+
+    # Must have database super-user privileges to execute createlang -- it must
+    #  also be in your path.
+    status, output = getstatusoutput(createlang_cmd)
+
+    # Checking the status of the command, 0 => execution successful
+    if status:
+        raise Exception("Error executing 'plpgsql' command: %s\n" % output)
+
+def _create_with_cursor(db_name, verbosity=1, autoclobber=False):
+    "Creates database with psycopg2 cursor."
+
+    # Constructing the necessary SQL to create the database (the DATABASE_USER
+    #  must possess the privileges to create a database)
+    create_sql = 'CREATE DATABASE %s' % connection.ops.quote_name(db_name)
+    if settings.DATABASE_USER:
+        create_sql += ' OWNER %s' % settings.DATABASE_USER
+
+    cursor = connection.cursor()
+    connection.creation.set_autocommit()
+
+    try:
+        # Trying to create the database first.
+        cursor.execute(create_sql)
+        #print create_sql
+    except Exception, e:
+        # Drop and recreate, if necessary.
+        if not autoclobber:
+            confirm = raw_input("\nIt appears the database, %s, already exists. Type 'yes' to delete it, or 'no' to cancel: " % db_name)
+        if autoclobber or confirm == 'yes':
+            if verbosity >= 1: print 'Destroying old spatial database...'
+            drop_db(db_name)
+            if verbosity >= 1: print 'Creating new spatial database...'
+            cursor.execute(create_sql)
+        else:
+            raise Exception('Spatial Database Creation canceled.')
+
+created_regex = re.compile(r'^createdb: database creation failed: ERROR:  database ".+" already exists')
+def _create_with_shell(db_name, verbosity=1, autoclobber=False):
+    """
+    If no spatial database already exists, then using a cursor will not work.
+     Thus, a `createdb` command will be issued through the shell to bootstrap
+     creation of the spatial database.
+    """
+
+    # Getting the command-line options for the shell command
+    options = get_cmd_options(False)
+    create_cmd = 'createdb -O %s %s%s' % (settings.DATABASE_USER, options, db_name)
+    if verbosity >= 1: print create_cmd
+
+    # Attempting to create the database.
+    status, output = getstatusoutput(create_cmd)
+
+    if status:
+        if created_regex.match(output):
+            if not autoclobber:
+                confirm = raw_input("\nIt appears the database, %s, already exists. Type 'yes' to delete it, or 'no' to cancel: " % db_name)
+            if autoclobber or confirm == 'yes':
+                if verbosity >= 1: print 'Destroying old spatial database...'
+                drop_cmd = 'dropdb %s%s' % (options, db_name)
+                status, output = getstatusoutput(drop_cmd)
+                if status != 0:
+                    raise Exception('Could not drop database %s: %s' % (db_name, output))
+                if verbosity >= 1: print 'Creating new spatial database...'
+                status, output = getstatusoutput(create_cmd)
+                if status != 0:
+                    raise Exception('Could not create database after dropping: %s' % output)
+            else:
+                raise Exception('Spatial Database Creation canceled.')
+        else:
+            raise Exception('Unknown error occurred in creating database: %s' % output)
+
+def create_spatial_db(test=False, verbosity=1, autoclobber=False, interactive=False):
+    "Creates a spatial database based on the settings."
+
+    # Making sure we're using PostgreSQL and psycopg2
+    if settings.DATABASE_ENGINE != 'postgresql_psycopg2':
+        raise Exception('Spatial database creation only supported postgresql_psycopg2 platform.')
+
+    # Getting the spatial database name
+    if test:
+        db_name = get_spatial_db(test=True)
+        _create_with_cursor(db_name, verbosity=verbosity, autoclobber=autoclobber)
+    else:
+        db_name = get_spatial_db()
+        _create_with_shell(db_name, verbosity=verbosity, autoclobber=autoclobber)
+
+    # Creating the db language, does not need to be done on NT platforms
+    #  since the PostGIS installer enables this capability.
+    if os.name != 'nt':
+        create_lang(db_name, verbosity=verbosity)
+
+    # Now adding in the PostGIS routines.
+    load_postgis_sql(db_name, verbosity=verbosity)
+
+    if verbosity >= 1: print 'Creation of spatial database %s successful.' % db_name
+
+    # Closing the connection
+    connection.close()
+    settings.DATABASE_NAME = db_name
+
+    # Syncing the database
+    call_command('syncdb', verbosity=verbosity, interactive=interactive)
+
+def drop_db(db_name=False, test=False):
+    """
+    Drops the given database (defaults to what is returned from
+     get_spatial_db()). All exceptions are propagated up to the caller.
+    """
+    if not db_name: db_name = get_spatial_db(test=test)
+    cursor = connection.cursor()
+    cursor.execute('DROP DATABASE %s' % connection.ops.quote_name(db_name))
+
+def get_cmd_options(db_name):
+    "Obtains the command-line PostgreSQL connection options for shell commands."
+    # The db_name parameter is optional
+    options = ''
+    if db_name:
+        options += '-d %s ' % db_name
+    if settings.DATABASE_USER:
+        options += '-U %s ' % settings.DATABASE_USER
+    if settings.DATABASE_HOST:
+        options += '-h %s ' % settings.DATABASE_HOST
+    if settings.DATABASE_PORT:
+        options += '-p %s ' % settings.DATABASE_PORT
+    return options
+
+def get_spatial_db(test=False):
+    """
+    Returns the name of the spatial database.  The 'test' keyword may be set
+     to return the test spatial database name.
+    """
+    if test:
+        if settings.TEST_DATABASE_NAME:
+            test_db_name = settings.TEST_DATABASE_NAME
+        else:
+            test_db_name = TEST_DATABASE_PREFIX + settings.DATABASE_NAME
+        return test_db_name
+    else:
+        if not settings.DATABASE_NAME:
+            raise Exception('must configure DATABASE_NAME in settings.py')
+        return settings.DATABASE_NAME
+
+def load_postgis_sql(db_name, verbosity=1):
+    """
+    This routine loads up the PostGIS SQL files lwpostgis.sql and
+     spatial_ref_sys.sql.
+    """
+
+    # Getting the path to the PostGIS SQL
+    try:
+        # POSTGIS_SQL_PATH may be placed in settings to tell GeoDjango where the
+        #  PostGIS SQL files are located.  This is especially useful on Win32
+        #  platforms since the output of pg_config looks like "C:/PROGRA~1/..".
+        sql_path = settings.POSTGIS_SQL_PATH
+    except AttributeError:
+        status, sql_path = getstatusoutput('pg_config --sharedir')
+        if status:
+            sql_path = '/usr/local/share'
+
+    # The PostGIS SQL post-creation files.
+    lwpostgis_file = os.path.join(sql_path, 'lwpostgis.sql')
+    srefsys_file = os.path.join(sql_path, 'spatial_ref_sys.sql')
+    if not os.path.isfile(lwpostgis_file):
+        raise Exception('Could not find PostGIS function definitions in %s' % lwpostgis_file)
+    if not os.path.isfile(srefsys_file):
+        raise Exception('Could not find PostGIS spatial reference system definitions in %s' % srefsys_file)
+
+    # Getting the psql command-line options, and command format.
+    options = get_cmd_options(db_name)
+    cmd_fmt = 'psql %s-f "%%s"' % options
+
+    # Now trying to load up the PostGIS functions
+    cmd = cmd_fmt % lwpostgis_file
+    if verbosity >= 1: print cmd
+    status, output = getstatusoutput(cmd)
+    if status:
+        raise Exception('Error in loading PostGIS lwgeometry routines.')
+
+    # Now trying to load up the Spatial Reference System table
+    cmd = cmd_fmt % srefsys_file
+    if verbosity >= 1: print cmd
+    status, output = getstatusoutput(cmd)
+    if status:
+        raise Exception('Error in loading PostGIS spatial_ref_sys table.')
+
+    # Setting the permissions because on Windows platforms the owner
+    #  of the spatial_ref_sys and geometry_columns tables is always
+    #  the postgres user, regardless of how the db is created.
+    if os.name == 'nt': set_permissions(db_name)
+
+def set_permissions(db_name):
+    """
+    Sets the permissions on the given database to that of the user specified
+     in the settings.  Needed specifically for PostGIS on Win32 platforms.
+    """
+    cursor = connection.cursor()
+    user = settings.DATABASE_USER
+    cursor.execute('ALTER TABLE geometry_columns OWNER TO %s' % user)
+    cursor.execute('ALTER TABLE spatial_ref_sys OWNER TO %s' % user)
diff --git a/webapp/django/contrib/gis/db/backend/postgis/field.py b/webapp/django/contrib/gis/db/backend/postgis/field.py
new file mode 100644
index 0000000..9d6c0fa
--- /dev/null
+++ b/webapp/django/contrib/gis/db/backend/postgis/field.py
@@ -0,0 +1,95 @@
+from django.db import connection
+from django.db.models.fields import Field # Django base Field class
+from django.contrib.gis.db.backend.util import gqn
+from django.contrib.gis.db.backend.postgis.query import TRANSFORM
+
+# Quotename & geographic quotename, respectively
+qn = connection.ops.quote_name
+
+class PostGISField(Field):
+    """
+    The backend-specific geographic field for PostGIS.
+    """
+
+    def _add_geom(self, style, db_table):
+        """
+        Constructs the addition of the geometry to the table using the
+        AddGeometryColumn(...) PostGIS (and OGC standard) stored procedure.
+
+        Takes the style object (provides syntax highlighting) and the
+        database table as parameters.
+        """
+        sql = style.SQL_KEYWORD('SELECT ') + \
+              style.SQL_TABLE('AddGeometryColumn') + '(' + \
+              style.SQL_TABLE(gqn(db_table)) + ', ' + \
+              style.SQL_FIELD(gqn(self.column)) + ', ' + \
+              style.SQL_FIELD(str(self._srid)) + ', ' + \
+              style.SQL_COLTYPE(gqn(self._geom)) + ', ' + \
+              style.SQL_KEYWORD(str(self._dim)) + ');'
+
+        if not self.null:
+            # Add a NOT NULL constraint to the field
+            sql += '\n' + \
+                   style.SQL_KEYWORD('ALTER TABLE ') + \
+                   style.SQL_TABLE(qn(db_table)) + \
+                   style.SQL_KEYWORD(' ALTER ') + \
+                   style.SQL_FIELD(qn(self.column)) + \
+                   style.SQL_KEYWORD(' SET NOT NULL') + ';'
+        return sql
+    
+    def _geom_index(self, style, db_table,
+                    index_type='GIST', index_opts='GIST_GEOMETRY_OPS'):
+        "Creates a GiST index for this geometry field."
+        sql = style.SQL_KEYWORD('CREATE INDEX ') + \
+              style.SQL_TABLE(qn('%s_%s_id' % (db_table, self.column))) + \
+              style.SQL_KEYWORD(' ON ') + \
+              style.SQL_TABLE(qn(db_table)) + \
+              style.SQL_KEYWORD(' USING ') + \
+              style.SQL_COLTYPE(index_type) + ' ( ' + \
+              style.SQL_FIELD(qn(self.column)) + ' ' + \
+              style.SQL_KEYWORD(index_opts) + ' );'
+        return sql
+
+    def post_create_sql(self, style, db_table):
+        """
+        Returns SQL that will be executed after the model has been
+        created. Geometry columns must be added after creation with the
+        PostGIS AddGeometryColumn() function.
+        """
+
+        # Getting the AddGeometryColumn() SQL necessary to create a PostGIS
+        # geometry field.
+        post_sql = self._add_geom(style, db_table)
+
+        # If the user wants to index this data, then get the indexing SQL as well.
+        if self._index:
+            return (post_sql, self._geom_index(style, db_table))
+        else:
+            return (post_sql,)
+
+    def _post_delete_sql(self, style, db_table):
+        "Drops the geometry column."
+        sql = style.SQL_KEYWORD('SELECT ') + \
+            style.SQL_KEYWORD('DropGeometryColumn') + '(' + \
+            style.SQL_TABLE(gqn(db_table)) + ', ' + \
+            style.SQL_FIELD(gqn(self.column)) +  ');'
+        return sql
+
+    def db_type(self):
+        """
+        PostGIS geometry columns are added by stored procedures, should be
+        None.
+        """
+        return None
+
+    def get_placeholder(self, value):
+        """
+        Provides a proper substitution value for Geometries that are not in the
+        SRID of the field.  Specifically, this routine will substitute in the
+        ST_Transform() function call.
+        """
+        if value is None or value.srid == self._srid:
+            return '%s'
+        else:
+            # Adding Transform() to the SQL placeholder.
+            return '%s(%%s, %s)' % (TRANSFORM, self._srid)
diff --git a/webapp/django/contrib/gis/db/backend/postgis/management.py b/webapp/django/contrib/gis/db/backend/postgis/management.py
new file mode 100644
index 0000000..c1cb32a
--- /dev/null
+++ b/webapp/django/contrib/gis/db/backend/postgis/management.py
@@ -0,0 +1,54 @@
+"""
+  This utility module is for obtaining information about the PostGIS
+   installation.
+
+  See PostGIS docs at Ch. 6.2.1 for more information on these functions.
+"""
+import re
+
+def _get_postgis_func(func):
+    "Helper routine for calling PostGIS functions and returning their result."
+    from django.db import connection
+    cursor = connection.cursor()
+    cursor.execute('SELECT %s()' % func)
+    row = cursor.fetchone()
+    cursor.close()
+    return row[0]
+
+### PostGIS management functions ###
+def postgis_geos_version():
+    "Returns the version of the GEOS library used with PostGIS."
+    return _get_postgis_func('postgis_geos_version')
+
+def postgis_lib_version():
+    "Returns the version number of the PostGIS library used with PostgreSQL."
+    return _get_postgis_func('postgis_lib_version')
+
+def postgis_proj_version():
+    "Returns the version of the PROJ.4 library used with PostGIS."
+    return _get_postgis_func('postgis_proj_version')
+
+def postgis_version():
+    "Returns PostGIS version number and compile-time options."
+    return _get_postgis_func('postgis_version')
+
+def postgis_full_version():
+    "Returns PostGIS version number and compile-time options."
+    return _get_postgis_func('postgis_full_version')
+
+### Routines for parsing output of management functions. ###
+version_regex = re.compile('^(?P<major>\d)\.(?P<minor1>\d)\.(?P<minor2>\d+)')
+def postgis_version_tuple():
+    "Returns the PostGIS version as a tuple."
+
+    # Getting the PostGIS version
+    version = postgis_lib_version()
+    m = version_regex.match(version)
+    if m:
+        major = int(m.group('major'))
+        minor1 = int(m.group('minor1'))
+        minor2 = int(m.group('minor2'))
+    else:
+        raise Exception('Could not parse PostGIS version string: %s' % version)
+
+    return (version, major, minor1, minor2)
diff --git a/webapp/django/contrib/gis/db/backend/postgis/models.py b/webapp/django/contrib/gis/db/backend/postgis/models.py
new file mode 100644
index 0000000..e032da4
--- /dev/null
+++ b/webapp/django/contrib/gis/db/backend/postgis/models.py
@@ -0,0 +1,58 @@
+"""
+ The GeometryColumns and SpatialRefSys models for the PostGIS backend.
+"""
+from django.db import models
+from django.contrib.gis.models import SpatialRefSysMixin
+
+# Checking for the presence of GDAL (needed for the SpatialReference object)
+from django.contrib.gis.gdal import HAS_GDAL
+if HAS_GDAL:
+    from django.contrib.gis.gdal import SpatialReference
+
+class GeometryColumns(models.Model):
+    """
+    The 'geometry_columns' table from the PostGIS. See the PostGIS
+    documentation at Ch. 4.2.2.
+    """
+    f_table_catalog = models.CharField(max_length=256)
+    f_table_schema = models.CharField(max_length=256)
+    f_table_name = models.CharField(max_length=256)
+    f_geometry_column = models.CharField(max_length=256)
+    coord_dimension = models.IntegerField()
+    srid = models.IntegerField(primary_key=True)
+    type = models.CharField(max_length=30)
+
+    class Meta:
+        db_table = 'geometry_columns'
+
+    @classmethod
+    def table_name_col(cls):
+        "Class method for returning the table name column for this model."
+        return 'f_table_name'
+
+    def __unicode__(self):
+        return "%s.%s - %dD %s field (SRID: %d)" % \
+               (self.f_table_name, self.f_geometry_column,
+                self.coord_dimension, self.type, self.srid)
+
+class SpatialRefSys(models.Model, SpatialRefSysMixin):
+    """
+    The 'spatial_ref_sys' table from PostGIS. See the PostGIS
+    documentaiton at Ch. 4.2.1.
+    """
+    srid = models.IntegerField(primary_key=True)
+    auth_name = models.CharField(max_length=256)
+    auth_srid = models.IntegerField()
+    srtext = models.CharField(max_length=2048)
+    proj4text = models.CharField(max_length=2048)
+
+    class Meta:
+        db_table = 'spatial_ref_sys'
+
+    @property
+    def wkt(self):
+        return self.srtext
+
+    @classmethod
+    def wkt_col(cls):
+        return 'srtext'
diff --git a/webapp/django/contrib/gis/db/backend/postgis/query.py b/webapp/django/contrib/gis/db/backend/postgis/query.py
new file mode 100644
index 0000000..8780780
--- /dev/null
+++ b/webapp/django/contrib/gis/db/backend/postgis/query.py
@@ -0,0 +1,287 @@
+"""
+ This module contains the spatial lookup types, and the get_geo_where_clause()
+ routine for PostGIS.
+"""
+import re
+from decimal import Decimal
+from django.db import connection
+from django.contrib.gis.measure import Distance
+from django.contrib.gis.db.backend.postgis.management import postgis_version_tuple
+from django.contrib.gis.db.backend.util import SpatialOperation, SpatialFunction
+qn = connection.ops.quote_name
+
+# Getting the PostGIS version information
+POSTGIS_VERSION, MAJOR_VERSION, MINOR_VERSION1, MINOR_VERSION2 = postgis_version_tuple()
+
+# The supported PostGIS versions.
+#  TODO: Confirm tests with PostGIS versions 1.1.x -- should work.  
+#        Versions <= 1.0.x do not use GEOS C API, and will not be supported.
+if MAJOR_VERSION != 1 or (MAJOR_VERSION == 1 and MINOR_VERSION1 < 1):
+    raise Exception('PostGIS version %s not supported.' % POSTGIS_VERSION)
+
+# Versions of PostGIS >= 1.2.2 changed their naming convention to be
+#  'SQL-MM-centric' to conform with the ISO standard. Practically, this
+#  means that 'ST_' prefixes geometry function names.
+GEOM_FUNC_PREFIX = ''
+if MAJOR_VERSION >= 1:
+    if (MINOR_VERSION1 > 2 or
+        (MINOR_VERSION1 == 2 and MINOR_VERSION2 >= 2)):
+        GEOM_FUNC_PREFIX = 'ST_'
+
+    def get_func(func): return '%s%s' % (GEOM_FUNC_PREFIX, func)
+
+    # Custom selection not needed for PostGIS because GEOS geometries are
+    # instantiated directly from the HEXEWKB returned by default.  If
+    # WKT is needed for some reason in the future, this value may be changed,
+    # e.g,, 'AsText(%s)'.
+    GEOM_SELECT = None
+
+    # Functions used by the GeoManager & GeoQuerySet
+    AREA = get_func('Area')
+    ASKML = get_func('AsKML')
+    ASGML = get_func('AsGML')
+    ASSVG = get_func('AsSVG')
+    CENTROID = get_func('Centroid')
+    DIFFERENCE = get_func('Difference')
+    DISTANCE = get_func('Distance')
+    DISTANCE_SPHERE = get_func('distance_sphere')
+    DISTANCE_SPHEROID = get_func('distance_spheroid')
+    ENVELOPE = get_func('Envelope')
+    EXTENT = get_func('extent')
+    GEOM_FROM_TEXT = get_func('GeomFromText')
+    GEOM_FROM_WKB = get_func('GeomFromWKB')
+    INTERSECTION = get_func('Intersection')
+    LENGTH = get_func('Length')
+    LENGTH_SPHEROID = get_func('length_spheroid')
+    MAKE_LINE = get_func('MakeLine')
+    MEM_SIZE = get_func('mem_size')
+    NUM_GEOM = get_func('NumGeometries')
+    NUM_POINTS = get_func('npoints')
+    PERIMETER = get_func('Perimeter')
+    POINT_ON_SURFACE = get_func('PointOnSurface')
+    SCALE = get_func('Scale')
+    SYM_DIFFERENCE = get_func('SymDifference')
+    TRANSFORM = get_func('Transform')
+    TRANSLATE = get_func('Translate')
+
+    # Special cases for union and KML methods.
+    if MINOR_VERSION1 < 3:
+        UNIONAGG = 'GeomUnion'
+        UNION = 'Union'
+    else:
+        UNIONAGG = 'ST_Union'
+        UNION = 'ST_Union'
+
+    if MINOR_VERSION1 == 1:
+        ASKML = False
+else:
+    raise NotImplementedError('PostGIS versions < 1.0 are not supported.')
+
+#### Classes used in constructing PostGIS spatial SQL ####
+class PostGISOperator(SpatialOperation):
+    "For PostGIS operators (e.g. `&&`, `~`)."
+    def __init__(self, operator):
+        super(PostGISOperator, self).__init__(operator=operator, beg_subst='%s %s %%s')
+
+class PostGISFunction(SpatialFunction):
+    "For PostGIS function calls (e.g., `ST_Contains(table, geom)`)."
+    def __init__(self, function, **kwargs):
+        super(PostGISFunction, self).__init__(get_func(function), **kwargs)
+
+class PostGISFunctionParam(PostGISFunction):
+    "For PostGIS functions that take another parameter (e.g. DWithin, Relate)."
+    def __init__(self, func):
+        super(PostGISFunctionParam, self).__init__(func, end_subst=', %%s)')
+
+class PostGISDistance(PostGISFunction):
+    "For PostGIS distance operations."
+    dist_func = 'Distance'
+    def __init__(self, operator):
+        super(PostGISDistance, self).__init__(self.dist_func, end_subst=') %s %s', 
+                                              operator=operator, result='%%s')
+
+class PostGISSpheroidDistance(PostGISFunction):
+    "For PostGIS spherical distance operations (using the spheroid)."
+    dist_func = 'distance_spheroid'
+    def __init__(self, operator):
+        # An extra parameter in `end_subst` is needed for the spheroid string.
+        super(PostGISSpheroidDistance, self).__init__(self.dist_func, 
+                                                      beg_subst='%s(%s, %%s, %%s', 
+                                                      end_subst=') %s %s',
+                                                      operator=operator, result='%%s')
+
+class PostGISSphereDistance(PostGISFunction):
+    "For PostGIS spherical distance operations."
+    dist_func = 'distance_sphere'
+    def __init__(self, operator):
+        super(PostGISSphereDistance, self).__init__(self.dist_func, end_subst=') %s %s',
+                                                    operator=operator, result='%%s')
+                                                    
+class PostGISRelate(PostGISFunctionParam):
+    "For PostGIS Relate(<geom>, <pattern>) calls."
+    pattern_regex = re.compile(r'^[012TF\*]{9}$')
+    def __init__(self, pattern):
+        if not self.pattern_regex.match(pattern):
+            raise ValueError('Invalid intersection matrix pattern "%s".' % pattern)
+        super(PostGISRelate, self).__init__('Relate')
+
+#### Lookup type mapping dictionaries of PostGIS operations. ####
+
+# PostGIS-specific operators. The commented descriptions of these
+# operators come from Section 6.2.2 of the official PostGIS documentation.
+POSTGIS_OPERATORS = {
+    # The "&<" operator returns true if A's bounding box overlaps or
+    #  is to the left of B's bounding box.
+    'overlaps_left' : PostGISOperator('&<'),
+    # The "&>" operator returns true if A's bounding box overlaps or
+    #  is to the right of B's bounding box.
+    'overlaps_right' : PostGISOperator('&>'),
+    # The "<<" operator returns true if A's bounding box is strictly
+    #  to the left of B's bounding box.
+    'left' : PostGISOperator('<<'),
+    # The ">>" operator returns true if A's bounding box is strictly
+    #  to the right of B's bounding box.
+    'right' : PostGISOperator('>>'),
+    # The "&<|" operator returns true if A's bounding box overlaps or
+    #  is below B's bounding box.
+    'overlaps_below' : PostGISOperator('&<|'),
+    # The "|&>" operator returns true if A's bounding box overlaps or
+    #  is above B's bounding box.
+    'overlaps_above' : PostGISOperator('|&>'),
+    # The "<<|" operator returns true if A's bounding box is strictly
+    #  below B's bounding box.
+    'strictly_below' : PostGISOperator('<<|'),
+    # The "|>>" operator returns true if A's bounding box is strictly
+    # above B's bounding box.
+    'strictly_above' : PostGISOperator('|>>'),
+    # The "~=" operator is the "same as" operator. It tests actual
+    #  geometric equality of two features. So if A and B are the same feature,
+    #  vertex-by-vertex, the operator returns true.
+    'same_as' : PostGISOperator('~='),
+    'exact' : PostGISOperator('~='),
+    # The "@" operator returns true if A's bounding box is completely contained
+    #  by B's bounding box.
+    'contained' : PostGISOperator('@'),
+    # The "~" operator returns true if A's bounding box completely contains
+    #  by B's bounding box.
+    'bbcontains' : PostGISOperator('~'),
+    # The "&&" operator returns true if A's bounding box overlaps
+    #  B's bounding box.
+    'bboverlaps' : PostGISOperator('&&'),
+    }
+
+# For PostGIS >= 1.2.2 the following lookup types will do a bounding box query
+# first before calling the more computationally expensive GEOS routines (called
+# "inline index magic"):
+# 'touches', 'crosses', 'contains', 'intersects', 'within', 'overlaps', and
+# 'covers'.
+POSTGIS_GEOMETRY_FUNCTIONS = {
+    'equals' : PostGISFunction('Equals'),
+    'disjoint' : PostGISFunction('Disjoint'),
+    'touches' : PostGISFunction('Touches'),
+    'crosses' : PostGISFunction('Crosses'),
+    'within' : PostGISFunction('Within'),
+    'overlaps' : PostGISFunction('Overlaps'),
+    'contains' : PostGISFunction('Contains'),
+    'intersects' : PostGISFunction('Intersects'),
+    'relate' : (PostGISRelate, basestring),
+    }
+
+# Valid distance types and substitutions
+dtypes = (Decimal, Distance, float, int, long)
+def get_dist_ops(operator):
+    "Returns operations for both regular and spherical distances."
+    return (PostGISDistance(operator), PostGISSphereDistance(operator), PostGISSpheroidDistance(operator))
+DISTANCE_FUNCTIONS = {
+    'distance_gt' : (get_dist_ops('>'), dtypes),
+    'distance_gte' : (get_dist_ops('>='), dtypes),
+    'distance_lt' : (get_dist_ops('<'), dtypes),
+    'distance_lte' : (get_dist_ops('<='), dtypes),
+    }
+
+if GEOM_FUNC_PREFIX == 'ST_':
+    # The ST_DWithin, ST_CoveredBy, and ST_Covers routines become available in 1.2.2+
+    POSTGIS_GEOMETRY_FUNCTIONS.update(
+        {'coveredby' : PostGISFunction('CoveredBy'),
+         'covers' : PostGISFunction('Covers'),
+         })
+    DISTANCE_FUNCTIONS['dwithin'] = (PostGISFunctionParam('DWithin'), dtypes)
+
+# Distance functions are a part of PostGIS geometry functions.
+POSTGIS_GEOMETRY_FUNCTIONS.update(DISTANCE_FUNCTIONS)
+
+# Any other lookup types that do not require a mapping.
+MISC_TERMS = ['isnull']
+
+# These are the PostGIS-customized QUERY_TERMS -- a list of the lookup types
+#  allowed for geographic queries.
+POSTGIS_TERMS = POSTGIS_OPERATORS.keys() # Getting the operators first
+POSTGIS_TERMS += POSTGIS_GEOMETRY_FUNCTIONS.keys() # Adding on the Geometry Functions
+POSTGIS_TERMS += MISC_TERMS # Adding any other miscellaneous terms (e.g., 'isnull')
+POSTGIS_TERMS = dict((term, None) for term in POSTGIS_TERMS) # Making a dictionary for fast lookups
+
+# For checking tuple parameters -- not very pretty but gets job done.
+def exactly_two(val): return val == 2
+def two_to_three(val): return val >= 2 and val <=3
+def num_params(lookup_type, val):
+    if lookup_type in DISTANCE_FUNCTIONS and lookup_type != 'dwithin': return two_to_three(val)
+    else: return exactly_two(val)
+
+#### The `get_geo_where_clause` function for PostGIS. ####
+def get_geo_where_clause(table_alias, name, lookup_type, geo_annot):
+    "Returns the SQL WHERE clause for use in PostGIS SQL construction."
+    # Getting the quoted field as `geo_col`.
+    geo_col = '%s.%s' % (qn(table_alias), qn(name))
+    if lookup_type in POSTGIS_OPERATORS:
+        # See if a PostGIS operator matches the lookup type.
+        return POSTGIS_OPERATORS[lookup_type].as_sql(geo_col)
+    elif lookup_type in POSTGIS_GEOMETRY_FUNCTIONS:
+        # See if a PostGIS geometry function matches the lookup type.
+        tmp = POSTGIS_GEOMETRY_FUNCTIONS[lookup_type]
+
+        # Lookup types that are tuples take tuple arguments, e.g., 'relate' and 
+        # distance lookups.
+        if isinstance(tmp, tuple):
+            # First element of tuple is the PostGISOperation instance, and the
+            # second element is either the type or a tuple of acceptable types
+            # that may passed in as further parameters for the lookup type.
+            op, arg_type = tmp
+
+            # Ensuring that a tuple _value_ was passed in from the user
+            if not isinstance(geo_annot.value, (tuple, list)): 
+                raise TypeError('Tuple required for `%s` lookup type.' % lookup_type)
+           
+            # Number of valid tuple parameters depends on the lookup type.
+            nparams = len(geo_annot.value)
+            if not num_params(lookup_type, nparams):
+                raise ValueError('Incorrect number of parameters given for `%s` lookup type.' % lookup_type)
+            
+            # Ensuring the argument type matches what we expect.
+            if not isinstance(geo_annot.value[1], arg_type):
+                raise TypeError('Argument type should be %s, got %s instead.' % (arg_type, type(geo_annot.value[1])))
+
+            # For lookup type `relate`, the op instance is not yet created (has
+            # to be instantiated here to check the pattern parameter).
+            if lookup_type == 'relate': 
+                op = op(geo_annot.value[1])
+            elif lookup_type in DISTANCE_FUNCTIONS and lookup_type != 'dwithin':
+                if geo_annot.geodetic:
+                    # Geodetic distances are only availble from Points to PointFields.
+                    if geo_annot.geom_type != 'POINT':
+                        raise TypeError('PostGIS spherical operations are only valid on PointFields.')
+                    if geo_annot.value[0].geom_typeid != 0:
+                        raise TypeError('PostGIS geometry distance parameter is required to be of type Point.')
+                    # Setting up the geodetic operation appropriately.
+                    if nparams == 3 and geo_annot.value[2] == 'spheroid': op = op[2]
+                    else: op = op[1]
+                else:
+                    op = op[0]
+        else:
+            op = tmp
+        # Calling the `as_sql` function on the operation instance.
+        return op.as_sql(geo_col)
+    elif lookup_type == 'isnull':
+        # Handling 'isnull' lookup type
+        return "%s IS %sNULL" % (geo_col, (not geo_annot.value and 'NOT ' or ''))
+
+    raise TypeError("Got invalid lookup_type: %s" % repr(lookup_type))
diff --git a/webapp/django/contrib/gis/db/backend/util.py b/webapp/django/contrib/gis/db/backend/util.py
new file mode 100644
index 0000000..a19dd97
--- /dev/null
+++ b/webapp/django/contrib/gis/db/backend/util.py
@@ -0,0 +1,52 @@
+from types import UnicodeType
+
+def gqn(val):
+    """
+    The geographic quote name function; used for quoting tables and 
+    geometries (they use single rather than the double quotes of the
+    backend quotename function).
+    """
+    if isinstance(val, basestring):
+        if isinstance(val, UnicodeType): val = val.encode('ascii')
+        return "'%s'" % val
+    else:
+        return str(val)
+
+class SpatialOperation(object):
+    """
+    Base class for generating spatial SQL.
+    """
+    def __init__(self, function='', operator='', result='', beg_subst='', end_subst=''):
+        self.function = function
+        self.operator = operator
+        self.result = result
+        self.beg_subst = beg_subst
+        try:
+            # Try and put the operator and result into to the
+            # end substitution.
+            self.end_subst = end_subst % (operator, result)
+        except TypeError:
+            self.end_subst = end_subst
+
+    @property
+    def sql_subst(self):
+        return ''.join([self.beg_subst, self.end_subst])
+
+    def as_sql(self, geo_col):
+        return self.sql_subst % self.params(geo_col)
+
+    def params(self, geo_col):
+        return (geo_col, self.operator)
+
+class SpatialFunction(SpatialOperation):
+    """
+    Base class for generating spatial SQL related to a function.
+    """
+    def __init__(self, func, beg_subst='%s(%s, %%s', end_subst=')', result='', operator=''):
+        # Getting the function prefix.
+        kwargs = {'function' : func, 'operator' : operator, 'result' : result,
+                  'beg_subst' : beg_subst, 'end_subst' : end_subst,}
+        super(SpatialFunction, self).__init__(**kwargs)
+
+    def params(self, geo_col):
+        return (self.function, geo_col)
diff --git a/webapp/django/contrib/gis/db/models/__init__.py b/webapp/django/contrib/gis/db/models/__init__.py
new file mode 100644
index 0000000..02a2c53
--- /dev/null
+++ b/webapp/django/contrib/gis/db/models/__init__.py
@@ -0,0 +1,17 @@
+# Want to get everything from the 'normal' models package.
+from django.db.models import *
+
+# The GeoManager
+from django.contrib.gis.db.models.manager import GeoManager
+
+# The GeoQ object
+from django.contrib.gis.db.models.query import GeoQ
+
+# The geographic-enabled fields.
+from django.contrib.gis.db.models.fields import \
+     GeometryField, PointField, LineStringField, PolygonField, \
+     MultiPointField, MultiLineStringField, MultiPolygonField, \
+     GeometryCollectionField
+
+# The geographic mixin class.
+from mixin import GeoMixin
diff --git a/webapp/django/contrib/gis/db/models/fields/__init__.py b/webapp/django/contrib/gis/db/models/fields/__init__.py
new file mode 100644
index 0000000..a1dfa23
--- /dev/null
+++ b/webapp/django/contrib/gis/db/models/fields/__init__.py
@@ -0,0 +1,211 @@
+from django.contrib.gis import forms
+# Getting the SpatialBackend container and the geographic quoting method.
+from django.contrib.gis.db.backend import SpatialBackend, gqn
+# GeometryProxy, GEOS, and Distance imports.
+from django.contrib.gis.db.models.proxy import GeometryProxy
+from django.contrib.gis.measure import Distance
+# The `get_srid_info` function gets SRID information from the spatial
+# reference system table w/o using the ORM.
+from django.contrib.gis.models import get_srid_info
+
+#TODO: Flesh out widgets; consider adding support for OGR Geometry proxies.
+class GeometryField(SpatialBackend.Field):
+    "The base GIS field -- maps to the OpenGIS Specification Geometry type."
+
+    # The OpenGIS Geometry name.
+    _geom = 'GEOMETRY'
+
+    # Geodetic units.
+    geodetic_units = ('Decimal Degree', 'degree')
+
+    def __init__(self, verbose_name=None, srid=4326, spatial_index=True, dim=2, **kwargs):
+        """
+        The initialization function for geometry fields.  Takes the following
+        as keyword arguments:
+
+        srid:
+         The spatial reference system identifier, an OGC standard.
+         Defaults to 4326 (WGS84).
+
+        spatial_index:
+         Indicates whether to create a spatial index.  Defaults to True.
+         Set this instead of 'db_index' for geographic fields since index
+         creation is different for geometry columns.
+                  
+        dim:
+         The number of dimensions for this geometry.  Defaults to 2.
+        """
+
+        # Setting the index flag with the value of the `spatial_index` keyword.
+        self._index = spatial_index
+
+        # Setting the SRID and getting the units.  Unit information must be 
+        # easily available in the field instance for distance queries.
+        self._srid = srid
+        self._unit, self._unit_name, self._spheroid = get_srid_info(srid)
+
+        # Setting the dimension of the geometry field.
+        self._dim = dim
+        
+        # Setting the verbose_name keyword argument with the positional 
+        # first parameter, so this works like normal fields.
+        kwargs['verbose_name'] = verbose_name
+       
+        super(GeometryField, self).__init__(**kwargs) # Calling the parent initializtion function
+
+    ### Routines specific to GeometryField ###
+    @property
+    def geodetic(self):
+        """
+        Returns true if this field's SRID corresponds with a coordinate
+        system that uses non-projected units (e.g., latitude/longitude).
+        """
+        return self._unit_name in self.geodetic_units
+
+    def get_distance(self, dist_val, lookup_type):
+        """
+        Returns a distance number in units of the field.  For example, if 
+        `D(km=1)` was passed in and the units of the field were in meters,
+        then 1000 would be returned.
+        """
+        # Getting the distance parameter and any options.
+        if len(dist_val) == 1: dist, option = dist_val[0], None
+        else: dist, option = dist_val
+
+        if isinstance(dist, Distance):
+            if self.geodetic:
+                # Won't allow Distance objects w/DWithin lookups on PostGIS.
+                if SpatialBackend.postgis and lookup_type == 'dwithin':
+                    raise TypeError('Only numeric values of degree units are allowed on geographic DWithin queries.')
+                # Spherical distance calculation parameter should be in meters.
+                dist_param = dist.m
+            else:
+                dist_param = getattr(dist, Distance.unit_attname(self._unit_name))
+        else:
+            # Assuming the distance is in the units of the field.
+            dist_param = dist
+       
+        if SpatialBackend.postgis and self.geodetic and lookup_type != 'dwithin' and option == 'spheroid':
+            # On PostGIS, by default `ST_distance_sphere` is used; but if the 
+            # accuracy of `ST_distance_spheroid` is needed than the spheroid 
+            # needs to be passed to the SQL stored procedure.
+            return [gqn(self._spheroid), dist_param]
+        else:
+            return [dist_param]
+
+    def get_geometry(self, value):
+        """
+        Retrieves the geometry, setting the default SRID from the given
+        lookup parameters.
+        """
+        if isinstance(value, (tuple, list)): 
+            geom = value[0]
+        else:
+            geom = value
+
+        # When the input is not a GEOS geometry, attempt to construct one
+        # from the given string input.
+        if isinstance(geom, SpatialBackend.Geometry):
+            pass
+        elif isinstance(geom, basestring):
+            try:
+                geom = SpatialBackend.Geometry(geom)
+            except SpatialBackend.GeometryException:
+                raise ValueError('Could not create geometry from lookup value: %s' % str(value))
+        else:
+            raise TypeError('Cannot use parameter of `%s` type as lookup parameter.' % type(value))
+
+        # Assigning the SRID value.
+        geom.srid = self.get_srid(geom)
+        
+        return geom
+
+    def get_srid(self, geom):
+        """
+        Returns the default SRID for the given geometry, taking into account
+        the SRID set for the field.  For example, if the input geometry
+        has no SRID, then that of the field will be returned.
+        """
+        gsrid = geom.srid # SRID of given geometry.
+        if gsrid is None or self._srid == -1 or (gsrid == -1 and self._srid != -1):
+            return self._srid
+        else:
+            return gsrid
+
+    ### Routines overloaded from Field ###
+    def contribute_to_class(self, cls, name):
+        super(GeometryField, self).contribute_to_class(cls, name)
+        
+        # Setup for lazy-instantiated Geometry object.
+        setattr(cls, self.attname, GeometryProxy(SpatialBackend.Geometry, self))
+
+    def formfield(self, **kwargs):
+        defaults = {'form_class' : forms.GeometryField, 
+                    'geom_type' : self._geom,
+                    'null' : self.null,
+                    }
+        defaults.update(kwargs)
+        return super(GeometryField, self).formfield(**defaults)
+
+    def get_db_prep_lookup(self, lookup_type, value):
+        """
+        Returns the spatial WHERE clause and associated parameters for the
+        given lookup type and value.  The value will be prepared for database
+        lookup (e.g., spatial transformation SQL will be added if necessary).
+        """
+        if lookup_type in SpatialBackend.gis_terms:
+            # special case for isnull lookup
+            if lookup_type == 'isnull': return [], []
+
+            # Get the geometry with SRID; defaults SRID to that of the field
+            # if it is None.
+            geom = self.get_geometry(value)
+
+            # Getting the WHERE clause list and the associated params list. The params 
+            # list is populated with the Adaptor wrapping the Geometry for the 
+            # backend.  The WHERE clause list contains the placeholder for the adaptor
+            # (e.g. any transformation SQL).
+            where = [self.get_placeholder(geom)]
+            params = [SpatialBackend.Adaptor(geom)]
+
+            if isinstance(value, (tuple, list)):
+                if lookup_type in SpatialBackend.distance_functions:
+                    # Getting the distance parameter in the units of the field.
+                    where += self.get_distance(value[1:], lookup_type)
+                elif lookup_type in SpatialBackend.limited_where:
+                    pass
+                else:
+                    # Otherwise, making sure any other parameters are properly quoted.
+                    where += map(gqn, value[1:])
+            return where, params
+        else:
+            raise TypeError("Field has invalid lookup: %s" % lookup_type)
+
+    def get_db_prep_save(self, value):
+        "Prepares the value for saving in the database."
+        if value is None:
+            return None
+        else:
+            return SpatialBackend.Adaptor(self.get_geometry(value))
+
+# The OpenGIS Geometry Type Fields
+class PointField(GeometryField):
+    _geom = 'POINT'
+
+class LineStringField(GeometryField):
+    _geom = 'LINESTRING'
+
+class PolygonField(GeometryField):
+    _geom = 'POLYGON'
+
+class MultiPointField(GeometryField):
+    _geom = 'MULTIPOINT'
+
+class MultiLineStringField(GeometryField):
+    _geom = 'MULTILINESTRING'
+
+class MultiPolygonField(GeometryField):
+    _geom = 'MULTIPOLYGON'
+
+class GeometryCollectionField(GeometryField):
+    _geom = 'GEOMETRYCOLLECTION'
diff --git a/webapp/django/contrib/gis/db/models/manager.py b/webapp/django/contrib/gis/db/models/manager.py
new file mode 100644
index 0000000..602d112
--- /dev/null
+++ b/webapp/django/contrib/gis/db/models/manager.py
@@ -0,0 +1,82 @@
+from django.db.models.manager import Manager
+from django.contrib.gis.db.models.query import GeoQuerySet
+
+class GeoManager(Manager):
+    "Overrides Manager to return Geographic QuerySets."
+
+    # This manager should be used for queries on related fields
+    # so that geometry columns on Oracle and MySQL are selected
+    # properly.
+    use_for_related_fields = True
+
+    def get_query_set(self):
+        return GeoQuerySet(model=self.model)
+
+    def area(self, *args, **kwargs):
+        return self.get_query_set().area(*args, **kwargs)
+
+    def centroid(self, *args, **kwargs):
+        return self.get_query_set().centroid(*args, **kwargs)
+
+    def difference(self, *args, **kwargs):
+        return self.get_query_set().difference(*args, **kwargs)
+
+    def distance(self, *args, **kwargs):
+        return self.get_query_set().distance(*args, **kwargs)
+
+    def envelope(self, *args, **kwargs):
+        return self.get_query_set().envelope(*args, **kwargs)
+
+    def extent(self, *args, **kwargs):
+        return self.get_query_set().extent(*args, **kwargs)
+
+    def gml(self, *args, **kwargs):
+        return self.get_query_set().gml(*args, **kwargs)
+
+    def intersection(self, *args, **kwargs):
+        return self.get_query_set().intersection(*args, **kwargs)
+
+    def kml(self, *args, **kwargs):
+        return self.get_query_set().kml(*args, **kwargs)
+
+    def length(self, *args, **kwargs):
+        return self.get_query_set().length(*args, **kwargs)
+
+    def make_line(self, *args, **kwargs):
+        return self.get_query_set().make_line(*args, **kwargs)
+    
+    def mem_size(self, *args, **kwargs):
+        return self.get_query_set().mem_size(*args, **kwargs)
+
+    def num_geom(self, *args, **kwargs):
+        return self.get_query_set().num_geom(*args, **kwargs)
+
+    def num_points(self, *args, **kwargs):
+        return self.get_query_set().num_points(*args, **kwargs)
+
+    def perimeter(self, *args, **kwargs):
+        return self.get_query_set().perimeter(*args, **kwargs)
+
+    def point_on_surface(self, *args, **kwargs):
+        return self.get_query_set().point_on_surface(*args, **kwargs)
+
+    def scale(self, *args, **kwargs):
+        return self.get_query_set().scale(*args, **kwargs)
+
+    def svg(self, *args, **kwargs):
+        return self.get_query_set().svg(*args, **kwargs)
+
+    def sym_difference(self, *args, **kwargs):
+        return self.get_query_set().sym_difference(*args, **kwargs)
+
+    def transform(self, *args, **kwargs):
+        return self.get_query_set().transform(*args, **kwargs)
+
+    def translate(self, *args, **kwargs):
+        return self.get_query_set().translate(*args, **kwargs)
+
+    def union(self, *args, **kwargs):
+        return self.get_query_set().union(*args, **kwargs)
+
+    def unionagg(self, *args, **kwargs):
+        return self.get_query_set().unionagg(*args, **kwargs)
diff --git a/webapp/django/contrib/gis/db/models/mixin.py b/webapp/django/contrib/gis/db/models/mixin.py
new file mode 100644
index 0000000..475a053
--- /dev/null
+++ b/webapp/django/contrib/gis/db/models/mixin.py
@@ -0,0 +1,11 @@
+# Until model subclassing is a possibility, a mixin class is used to add
+# the necessary functions that may be contributed for geographic objects.
+class GeoMixin:
+    """
+    The Geographic Mixin class provides routines for geographic objects,
+    however, it is no longer necessary, since all of its previous functions 
+    may now be accessed via the GeometryProxy.  This mixin is only provided
+    for backwards-compatibility purposes, and will be eventually removed
+    (unless the need arises again).
+    """
+    pass
diff --git a/webapp/django/contrib/gis/db/models/proxy.py b/webapp/django/contrib/gis/db/models/proxy.py
new file mode 100644
index 0000000..34276a6
--- /dev/null
+++ b/webapp/django/contrib/gis/db/models/proxy.py
@@ -0,0 +1,62 @@
+"""
+ The GeometryProxy object, allows for lazy-geometries.  The proxy uses
+ Python descriptors for instantiating and setting Geometry objects
+ corresponding to geographic model fields.
+
+ Thanks to Robert Coup for providing this functionality (see #4322).
+"""
+
+from types import NoneType, StringType, UnicodeType
+
+class GeometryProxy(object): 
+    def __init__(self, klass, field): 
+        """
+        Proxy initializes on the given Geometry class (not an instance) and 
+        the GeometryField.
+        """
+        self._field = field 
+        self._klass = klass
+     
+    def __get__(self, obj, type=None): 
+        """
+        This accessor retrieves the geometry, initializing it using the geometry
+        class specified during initialization and the HEXEWKB value of the field.  
+        Currently, only GEOS or OGR geometries are supported.
+        """
+        # Getting the value of the field.
+        geom_value = obj.__dict__[self._field.attname] 
+        
+        if isinstance(geom_value, self._klass): 
+            geom = geom_value
+        elif (geom_value is None) or (geom_value==''):
+            geom = None
+        else: 
+            # Otherwise, a Geometry object is built using the field's contents,
+            # and the model's corresponding attribute is set.
+            geom = self._klass(geom_value)
+            setattr(obj, self._field.attname, geom) 
+        return geom 
+     
+    def __set__(self, obj, value):
+        """
+        This accessor sets the proxied geometry with the geometry class
+        specified during initialization.  Values of None, HEXEWKB, or WKT may
+        be used to set the geometry as well.
+        """
+        # The OGC Geometry type of the field.
+        gtype = self._field._geom
+        
+        # The geometry type must match that of the field -- unless the
+        # general GeometryField is used.
+        if isinstance(value, self._klass) and (str(value.geom_type).upper() == gtype or gtype == 'GEOMETRY'):
+            # Assigning the SRID to the geometry.
+            if value.srid is None: value.srid = self._field._srid
+        elif isinstance(value, (NoneType, StringType, UnicodeType)):
+            # Set with None, WKT, or HEX
+            pass
+        else:
+            raise TypeError('cannot set %s GeometryProxy with value of type: %s' % (obj.__class__.__name__, type(value)))
+
+        # Setting the objects dictionary with the value, and returning.
+        obj.__dict__[self._field.attname] = value 
+        return value 
diff --git a/webapp/django/contrib/gis/db/models/query.py b/webapp/django/contrib/gis/db/models/query.py
new file mode 100644
index 0000000..8efc720
--- /dev/null
+++ b/webapp/django/contrib/gis/db/models/query.py
@@ -0,0 +1,617 @@
+from django.core.exceptions import ImproperlyConfigured
+from django.db import connection
+from django.db.models.query import sql, QuerySet, Q
+
+from django.contrib.gis.db.backend import SpatialBackend
+from django.contrib.gis.db.models.fields import GeometryField, PointField
+from django.contrib.gis.db.models.sql import AreaField, DistanceField, GeomField, GeoQuery, GeoWhereNode
+from django.contrib.gis.measure import Area, Distance
+from django.contrib.gis.models import get_srid_info
+qn = connection.ops.quote_name
+
+# For backwards-compatibility; Q object should work just fine
+# after queryset-refactor.
+class GeoQ(Q): pass
+
+class GeomSQL(object):
+    "Simple wrapper object for geometric SQL."
+    def __init__(self, geo_sql):
+        self.sql = geo_sql
+    
+    def as_sql(self, *args, **kwargs):
+        return self.sql
+
+class GeoQuerySet(QuerySet):
+    "The Geographic QuerySet."
+
+    def __init__(self, model=None, query=None):
+        super(GeoQuerySet, self).__init__(model=model, query=query)
+        self.query = query or GeoQuery(self.model, connection)
+
+    def area(self, tolerance=0.05, **kwargs):
+        """
+        Returns the area of the geographic field in an `area` attribute on 
+        each element of this GeoQuerySet.
+        """
+        # Peforming setup here rather than in `_spatial_attribute` so that
+        # we can get the units for `AreaField`.
+        procedure_args, geo_field = self._spatial_setup('area', field_name=kwargs.get('field_name', None))
+        s = {'procedure_args' : procedure_args,
+             'geo_field' : geo_field,
+             'setup' : False,
+             }
+        if SpatialBackend.oracle:
+            s['procedure_fmt'] = '%(geo_col)s,%(tolerance)s'
+            s['procedure_args']['tolerance'] = tolerance
+            s['select_field'] = AreaField('sq_m') # Oracle returns area in units of meters.
+        elif SpatialBackend.postgis:
+            if not geo_field.geodetic:
+                # Getting the area units of the geographic field.
+                s['select_field'] = AreaField(Area.unit_attname(geo_field._unit_name))
+            else:
+                # TODO: Do we want to support raw number areas for geodetic fields?
+                raise Exception('Area on geodetic coordinate systems not supported.')
+        return self._spatial_attribute('area', s, **kwargs)
+
+    def centroid(self, **kwargs):
+        """
+        Returns the centroid of the geographic field in a `centroid`
+        attribute on each element of this GeoQuerySet.
+        """
+        return self._geom_attribute('centroid', **kwargs)
+
+    def difference(self, geom, **kwargs):
+        """
+        Returns the spatial difference of the geographic field in a `difference`
+        attribute on each element of this GeoQuerySet.
+        """
+        return self._geomset_attribute('difference', geom, **kwargs)
+
+    def distance(self, geom, **kwargs):
+        """
+        Returns the distance from the given geographic field name to the
+        given geometry in a `distance` attribute on each element of the
+        GeoQuerySet.
+
+        Keyword Arguments:
+         `spheroid`  => If the geometry field is geodetic and PostGIS is
+                        the spatial database, then the more accurate 
+                        spheroid calculation will be used instead of the
+                        quicker sphere calculation.
+                        
+         `tolerance` => Used only for Oracle. The tolerance is 
+                        in meters -- a default of 5 centimeters (0.05) 
+                        is used.
+        """
+        return self._distance_attribute('distance', geom, **kwargs)
+
+    def envelope(self, **kwargs):
+        """
+        Returns a Geometry representing the bounding box of the 
+        Geometry field in an `envelope` attribute on each element of
+        the GeoQuerySet. 
+        """
+        return self._geom_attribute('envelope', **kwargs)
+
+    def extent(self, **kwargs):
+        """
+        Returns the extent (aggregate) of the features in the GeoQuerySet.  The
+        extent will be returned as a 4-tuple, consisting of (xmin, ymin, xmax, ymax).
+        """
+        convert_extent = None
+        if SpatialBackend.postgis:
+            def convert_extent(box, geo_field):
+                # TODO: Parsing of BOX3D, Oracle support (patches welcome!)
+                # Box text will be something like "BOX(-90.0 30.0, -85.0 40.0)"; 
+                # parsing out and returning as a 4-tuple.
+                ll, ur = box[4:-1].split(',')
+                xmin, ymin = map(float, ll.split())
+                xmax, ymax = map(float, ur.split())
+                return (xmin, ymin, xmax, ymax)
+        elif SpatialBackend.oracle:
+            def convert_extent(wkt, geo_field):
+                raise NotImplementedError
+        return self._spatial_aggregate('extent', convert_func=convert_extent, **kwargs)
+
+    def gml(self, precision=8, version=2, **kwargs):
+        """
+        Returns GML representation of the given field in a `gml` attribute
+        on each element of the GeoQuerySet.
+        """
+        s = {'desc' : 'GML', 'procedure_args' : {'precision' : precision}}
+        if SpatialBackend.postgis:
+            # PostGIS AsGML() aggregate function parameter order depends on the 
+            # version -- uggh.
+            major, minor1, minor2 = SpatialBackend.version
+            if major >= 1 and (minor1 > 3 or (minor1 == 3 and minor2 > 1)):
+                procedure_fmt = '%(version)s,%(geo_col)s,%(precision)s'
+            else:
+                procedure_fmt = '%(geo_col)s,%(precision)s,%(version)s'
+            s['procedure_args'] = {'precision' : precision, 'version' : version}
+
+        return self._spatial_attribute('gml', s, **kwargs)
+
+    def intersection(self, geom, **kwargs):
+        """
+        Returns the spatial intersection of the Geometry field in
+        an `intersection` attribute on each element of this
+        GeoQuerySet.
+        """
+        return self._geomset_attribute('intersection', geom, **kwargs)
+
+    def kml(self, **kwargs):
+        """
+        Returns KML representation of the geometry field in a `kml`
+        attribute on each element of this GeoQuerySet.
+        """
+        s = {'desc' : 'KML',
+             'procedure_fmt' : '%(geo_col)s,%(precision)s',
+             'procedure_args' : {'precision' : kwargs.pop('precision', 8)},
+             }
+        return self._spatial_attribute('kml', s, **kwargs)
+
+    def length(self, **kwargs):
+        """
+        Returns the length of the geometry field as a `Distance` object
+        stored in a `length` attribute on each element of this GeoQuerySet.
+        """
+        return self._distance_attribute('length', None, **kwargs)
+
+    def make_line(self, **kwargs):
+        """
+        Creates a linestring from all of the PointField geometries in the
+        this GeoQuerySet and returns it.  This is a spatial aggregate
+        method, and thus returns a geometry rather than a GeoQuerySet.
+        """
+        kwargs['geo_field_type'] = PointField
+        kwargs['agg_field'] = GeometryField
+        return self._spatial_aggregate('make_line', **kwargs)
+
+    def mem_size(self, **kwargs):
+        """
+        Returns the memory size (number of bytes) that the geometry field takes
+        in a `mem_size` attribute  on each element of this GeoQuerySet.
+        """
+        return self._spatial_attribute('mem_size', {}, **kwargs)
+
+    def num_geom(self, **kwargs):
+        """
+        Returns the number of geometries if the field is a
+        GeometryCollection or Multi* Field in a `num_geom`
+        attribute on each element of this GeoQuerySet; otherwise
+        the sets with None.
+        """
+        return self._spatial_attribute('num_geom', {}, **kwargs)
+
+    def num_points(self, **kwargs):
+        """
+        Returns the number of points in the first linestring in the 
+        Geometry field in a `num_points` attribute on each element of
+        this GeoQuerySet; otherwise sets with None.
+        """
+        return self._spatial_attribute('num_points', {}, **kwargs)
+
+    def perimeter(self, **kwargs):
+        """
+        Returns the perimeter of the geometry field as a `Distance` object
+        stored in a `perimeter` attribute on each element of this GeoQuerySet.
+        """
+        return self._distance_attribute('perimeter', None, **kwargs)
+
+    def point_on_surface(self, **kwargs):
+        """
+        Returns a Point geometry guaranteed to lie on the surface of the
+        Geometry field in a `point_on_surface` attribute on each element
+        of this GeoQuerySet; otherwise sets with None.
+        """
+        return self._geom_attribute('point_on_surface', **kwargs)
+
+    def scale(self, x, y, z=0.0, **kwargs):
+        """
+        Scales the geometry to a new size by multiplying the ordinates
+        with the given x,y,z scale factors.
+        """
+        s = {'procedure_fmt' : '%(geo_col)s,%(x)s,%(y)s,%(z)s',
+             'procedure_args' : {'x' : x, 'y' : y, 'z' : z},
+             'select_field' : GeomField(),
+             }
+        return self._spatial_attribute('scale', s, **kwargs)
+
+    def svg(self, **kwargs):
+        """
+        Returns SVG representation of the geographic field in a `svg`
+        attribute on each element of this GeoQuerySet.
+        """
+        s = {'desc' : 'SVG',
+             'procedure_fmt' : '%(geo_col)s,%(rel)s,%(precision)s',
+             'procedure_args' : {'rel' : int(kwargs.pop('relative', 0)),
+                                 'precision' : kwargs.pop('precision', 8)},
+             }
+        return self._spatial_attribute('svg', s, **kwargs)
+
+    def sym_difference(self, geom, **kwargs):
+        """
+        Returns the symmetric difference of the geographic field in a 
+        `sym_difference` attribute on each element of this GeoQuerySet.
+        """
+        return self._geomset_attribute('sym_difference', geom, **kwargs)
+
+    def translate(self, x, y, z=0.0, **kwargs):
+        """
+        Translates the geometry to a new location using the given numeric
+        parameters as offsets.
+        """
+        s = {'procedure_fmt' : '%(geo_col)s,%(x)s,%(y)s,%(z)s',
+             'procedure_args' : {'x' : x, 'y' : y, 'z' : z},
+             'select_field' : GeomField(),
+             }
+        return self._spatial_attribute('translate', s, **kwargs)
+
+    def transform(self, srid=4326, **kwargs):
+        """
+        Transforms the given geometry field to the given SRID.  If no SRID is
+        provided, the transformation will default to using 4326 (WGS84).
+        """
+        if not isinstance(srid, (int, long)):
+            raise TypeError('An integer SRID must be provided.')
+        field_name = kwargs.get('field_name', None)
+        tmp, geo_field = self._spatial_setup('transform', field_name=field_name)
+
+        # Getting the selection SQL for the given geographic field.
+        field_col = self._geocol_select(geo_field, field_name)
+
+        # Why cascading substitutions? Because spatial backends like
+        # Oracle and MySQL already require a function call to convert to text, thus
+        # when there's also a transformation we need to cascade the substitutions.
+        # For example, 'SDO_UTIL.TO_WKTGEOMETRY(SDO_CS.TRANSFORM( ... )'
+        geo_col = self.query.custom_select.get(geo_field, field_col)
+        
+        # Setting the key for the field's column with the custom SELECT SQL to
+        # override the geometry column returned from the database.
+        custom_sel = '%s(%s, %s)' % (SpatialBackend.transform, geo_col, srid)
+        # TODO: Should we have this as an alias?
+        # custom_sel = '(%s(%s, %s)) AS %s' % (SpatialBackend.transform, geo_col, srid, qn(geo_field.name))
+        self.query.transformed_srid = srid # So other GeoQuerySet methods
+        self.query.custom_select[geo_field] = custom_sel
+        return self._clone()
+
+    def union(self, geom, **kwargs):
+        """
+        Returns the union of the geographic field with the given
+        Geometry in a `union` attribute on each element of this GeoQuerySet.
+        """
+        return self._geomset_attribute('union', geom, **kwargs)
+
+    def unionagg(self, **kwargs):
+        """
+        Performs an aggregate union on the given geometry field.  Returns
+        None if the GeoQuerySet is empty.  The `tolerance` keyword is for
+        Oracle backends only.
+        """
+        kwargs['agg_field'] = GeometryField
+        return self._spatial_aggregate('unionagg', **kwargs)
+
+    ### Private API -- Abstracted DRY routines. ###
+    def _spatial_setup(self, att, aggregate=False, desc=None, field_name=None, geo_field_type=None):
+        """
+        Performs set up for executing the spatial function.
+        """
+        # Does the spatial backend support this?
+        func = getattr(SpatialBackend, att, False)
+        if desc is None: desc = att
+        if not func: raise ImproperlyConfigured('%s stored procedure not available.' % desc)
+
+        # Initializing the procedure arguments. 
+        procedure_args = {'function' : func}
+        
+        # Is there a geographic field in the model to perform this 
+        # operation on?
+        geo_field = self.query._geo_field(field_name)
+        if not geo_field:
+            raise TypeError('%s output only available on GeometryFields.' % func)
+
+        # If the `geo_field_type` keyword was used, then enforce that 
+        # type limitation.
+        if not geo_field_type is None and not isinstance(geo_field, geo_field_type): 
+            raise TypeError('"%s" stored procedures may only be called on %ss.' % (func, geo_field_type.__name__)) 
+
+        # Setting the procedure args.
+        procedure_args['geo_col'] = self._geocol_select(geo_field, field_name, aggregate)
+
+        return procedure_args, geo_field
+
+    def _spatial_aggregate(self, att, field_name=None, 
+                           agg_field=None, convert_func=None, 
+                           geo_field_type=None, tolerance=0.0005):
+        """
+        DRY routine for calling aggregate spatial stored procedures and
+        returning their result to the caller of the function.
+        """
+        # Constructing the setup keyword arguments.
+        setup_kwargs = {'aggregate' : True,
+                        'field_name' : field_name,
+                        'geo_field_type' : geo_field_type,
+                        }
+        procedure_args, geo_field = self._spatial_setup(att, **setup_kwargs)
+        
+        if SpatialBackend.oracle:
+            procedure_args['tolerance'] = tolerance
+            # Adding in selection SQL for Oracle geometry columns.
+            if agg_field is GeometryField: 
+                agg_sql = '%s' % SpatialBackend.select
+            else: 
+                agg_sql = '%s'
+            agg_sql =  agg_sql % ('%(function)s(SDOAGGRTYPE(%(geo_col)s,%(tolerance)s))' % procedure_args)
+        else:
+            agg_sql = '%(function)s(%(geo_col)s)' % procedure_args
+
+        # Wrapping our selection SQL in `GeomSQL` to bypass quoting, and
+        # specifying the type of the aggregate field.
+        self.query.select = [GeomSQL(agg_sql)]
+        self.query.select_fields = [agg_field]
+
+        try:
+            # `asql` => not overriding `sql` module.
+            asql, params = self.query.as_sql()
+        except sql.datastructures.EmptyResultSet:
+            return None   
+
+        # Getting a cursor, executing the query, and extracting the returned
+        # value from the aggregate function.
+        cursor = connection.cursor()
+        cursor.execute(asql, params)
+        result = cursor.fetchone()[0]
+        
+        # If the `agg_field` is specified as a GeometryField, then autmatically
+        # set up the conversion function.
+        if agg_field is GeometryField and not callable(convert_func):
+            if SpatialBackend.postgis:
+                def convert_geom(hex, geo_field):
+                    if hex: return SpatialBackend.Geometry(hex)
+                    else: return None
+            elif SpatialBackend.oracle:
+                def convert_geom(clob, geo_field):
+                    if clob: return SpatialBackend.Geometry(clob.read(), geo_field._srid)
+                    else: return None
+            convert_func = convert_geom
+
+        # Returning the callback function evaluated on the result culled
+        # from the executed cursor.
+        if callable(convert_func):
+            return convert_func(result, geo_field)
+        else:
+            return result
+
+    def _spatial_attribute(self, att, settings, field_name=None, model_att=None):
+        """
+        DRY routine for calling a spatial stored procedure on a geometry column
+        and attaching its output as an attribute of the model.
+
+        Arguments:
+         att:
+          The name of the spatial attribute that holds the spatial
+          SQL function to call.
+
+         settings:
+          Dictonary of internal settings to customize for the spatial procedure. 
+
+        Public Keyword Arguments:
+
+         field_name:
+          The name of the geographic field to call the spatial
+          function on.  May also be a lookup to a geometry field
+          as part of a foreign key relation.
+
+         model_att:
+          The name of the model attribute to attach the output of
+          the spatial function to.
+        """
+        # Default settings.
+        settings.setdefault('desc', None)
+        settings.setdefault('geom_args', ())
+        settings.setdefault('geom_field', None)
+        settings.setdefault('procedure_args', {})
+        settings.setdefault('procedure_fmt', '%(geo_col)s')
+        settings.setdefault('select_params', [])
+
+        # Performing setup for the spatial column, unless told not to.
+        if settings.get('setup', True):
+            default_args, geo_field = self._spatial_setup(att, desc=settings['desc'], field_name=field_name)
+            for k, v in default_args.iteritems(): settings['procedure_args'].setdefault(k, v)
+        else:
+            geo_field = settings['geo_field']
+            
+        # The attribute to attach to the model.
+        if not isinstance(model_att, basestring): model_att = att
+
+        # Special handling for any argument that is a geometry.
+        for name in settings['geom_args']:
+            # Using the field's get_db_prep_lookup() to get any needed
+            # transformation SQL -- we pass in a 'dummy' `contains` lookup.
+            where, params = geo_field.get_db_prep_lookup('contains', settings['procedure_args'][name])
+            # Replacing the procedure format with that of any needed 
+            # transformation SQL.
+            old_fmt = '%%(%s)s' % name
+            new_fmt = where[0] % '%%s'
+            settings['procedure_fmt'] = settings['procedure_fmt'].replace(old_fmt, new_fmt)
+            settings['select_params'].extend(params)
+
+        # Getting the format for the stored procedure.
+        fmt = '%%(function)s(%s)' % settings['procedure_fmt']
+        
+        # If the result of this function needs to be converted.
+        if settings.get('select_field', False):
+            sel_fld = settings['select_field']
+            if isinstance(sel_fld, GeomField) and SpatialBackend.select:
+                self.query.custom_select[model_att] = SpatialBackend.select
+            self.query.extra_select_fields[model_att] = sel_fld
+
+        # Finally, setting the extra selection attribute with 
+        # the format string expanded with the stored procedure
+        # arguments.
+        return self.extra(select={model_att : fmt % settings['procedure_args']}, 
+                          select_params=settings['select_params'])
+
+    def _distance_attribute(self, func, geom=None, tolerance=0.05, spheroid=False, **kwargs):
+        """
+        DRY routine for GeoQuerySet distance attribute routines.
+        """
+        # Setting up the distance procedure arguments.
+        procedure_args, geo_field = self._spatial_setup(func, field_name=kwargs.get('field_name', None))
+
+        # If geodetic defaulting distance attribute to meters (Oracle and
+        # PostGIS spherical distances return meters).  Otherwise, use the
+        # units of the geometry field.
+        if geo_field.geodetic:
+            dist_att = 'm'
+        else:
+            dist_att = Distance.unit_attname(geo_field._unit_name)
+
+        # Shortcut booleans for what distance function we're using.
+        distance = func == 'distance'
+        length = func == 'length'
+        perimeter = func == 'perimeter'
+        if not (distance or length or perimeter): 
+            raise ValueError('Unknown distance function: %s' % func)
+
+        # The field's get_db_prep_lookup() is used to get any 
+        # extra distance parameters.  Here we set up the
+        # parameters that will be passed in to field's function.
+        lookup_params = [geom or 'POINT (0 0)', 0]
+
+        # If the spheroid calculation is desired, either by the `spheroid`
+        # keyword or wehn calculating the length of geodetic field, make
+        # sure the 'spheroid' distance setting string is passed in so we
+        # get the correct spatial stored procedure.            
+        if spheroid or (SpatialBackend.postgis and geo_field.geodetic and length): 
+            lookup_params.append('spheroid') 
+        where, params = geo_field.get_db_prep_lookup('distance_lte', lookup_params)
+
+        # The `geom_args` flag is set to true if a geometry parameter was 
+        # passed in.
+        geom_args = bool(geom)
+
+        if SpatialBackend.oracle:
+            if distance:
+                procedure_fmt = '%(geo_col)s,%(geom)s,%(tolerance)s'
+            elif length or perimeter:
+                procedure_fmt = '%(geo_col)s,%(tolerance)s'
+            procedure_args['tolerance'] = tolerance
+        else:
+            # Getting whether this field is in units of degrees since the field may have
+            # been transformed via the `transform` GeoQuerySet method.
+            if self.query.transformed_srid:
+                u, unit_name, s = get_srid_info(self.query.transformed_srid)
+                geodetic = unit_name in geo_field.geodetic_units
+            else:
+                geodetic = geo_field.geodetic
+            
+            if distance:
+                if self.query.transformed_srid:
+                    # Setting the `geom_args` flag to false because we want to handle
+                    # transformation SQL here, rather than the way done by default
+                    # (which will transform to the original SRID of the field rather
+                    #  than to what was transformed to).
+                    geom_args = False
+                    procedure_fmt = '%s(%%(geo_col)s, %s)' % (SpatialBackend.transform, self.query.transformed_srid)
+                    if geom.srid is None or geom.srid == self.query.transformed_srid:
+                        # If the geom parameter srid is None, it is assumed the coordinates 
+                        # are in the transformed units.  A placeholder is used for the
+                        # geometry parameter.
+                        procedure_fmt += ', %%s'
+                    else:
+                        # We need to transform the geom to the srid specified in `transform()`,
+                        # so wrapping the geometry placeholder in transformation SQL.
+                        procedure_fmt += ', %s(%%%%s, %s)' % (SpatialBackend.transform, self.query.transformed_srid)
+                else:
+                    # `transform()` was not used on this GeoQuerySet.
+                    procedure_fmt  = '%(geo_col)s,%(geom)s'
+
+                if geodetic:
+                    # Spherical distance calculation is needed (because the geographic
+                    # field is geodetic). However, the PostGIS ST_distance_sphere/spheroid() 
+                    # procedures may only do queries from point columns to point geometries
+                    # some error checking is required.
+                    if not isinstance(geo_field, PointField): 
+                        raise TypeError('Spherical distance calculation only supported on PointFields.')
+                    if not str(SpatialBackend.Geometry(buffer(params[0].wkb)).geom_type) == 'Point':
+                        raise TypeError('Spherical distance calculation only supported with Point Geometry parameters')
+                    # The `function` procedure argument needs to be set differently for
+                    # geodetic distance calculations.
+                    if spheroid:
+                        # Call to distance_spheroid() requires spheroid param as well.
+                        procedure_fmt += ',%(spheroid)s'
+                        procedure_args.update({'function' : SpatialBackend.distance_spheroid, 'spheroid' : where[1]})
+                    else:
+                        procedure_args.update({'function' : SpatialBackend.distance_sphere})
+            elif length or perimeter:
+                procedure_fmt = '%(geo_col)s'
+                if geodetic and length:
+                    # There's no `length_sphere`
+                    procedure_fmt += ',%(spheroid)s'
+                    procedure_args.update({'function' : SpatialBackend.length_spheroid, 'spheroid' : where[1]})
+
+        # Setting up the settings for `_spatial_attribute`.
+        s = {'select_field' : DistanceField(dist_att),
+             'setup' : False, 
+             'geo_field' : geo_field,
+             'procedure_args' : procedure_args,
+             'procedure_fmt' : procedure_fmt,
+             }
+        if geom_args: 
+            s['geom_args'] = ('geom',)
+            s['procedure_args']['geom'] = geom
+        elif geom:
+            # The geometry is passed in as a parameter because we handled
+            # transformation conditions in this routine.
+            s['select_params'] = [SpatialBackend.Adaptor(geom)]
+        return self._spatial_attribute(func, s, **kwargs)
+
+    def _geom_attribute(self, func, tolerance=0.05, **kwargs):
+        """
+        DRY routine for setting up a GeoQuerySet method that attaches a
+        Geometry attribute (e.g., `centroid`, `point_on_surface`).
+        """
+        s = {'select_field' : GeomField(),}
+        if SpatialBackend.oracle:
+            s['procedure_fmt'] = '%(geo_col)s,%(tolerance)s'
+            s['procedure_args'] = {'tolerance' : tolerance}
+        return self._spatial_attribute(func, s, **kwargs)
+                     
+    def _geomset_attribute(self, func, geom, tolerance=0.05, **kwargs):
+        """
+        DRY routine for setting up a GeoQuerySet method that attaches a
+        Geometry attribute and takes a Geoemtry parameter.  This is used
+        for geometry set-like operations (e.g., intersection, difference, 
+        union, sym_difference).
+        """
+        s = {'geom_args' : ('geom',),
+             'select_field' : GeomField(),
+             'procedure_fmt' : '%(geo_col)s,%(geom)s',
+             'procedure_args' : {'geom' : geom},
+            }
+        if SpatialBackend.oracle:
+            s['procedure_fmt'] += ',%(tolerance)s'
+            s['procedure_args']['tolerance'] = tolerance
+        return self._spatial_attribute(func, s, **kwargs)
+
+    def _geocol_select(self, geo_field, field_name, aggregate=False):
+        """
+        Helper routine for constructing the SQL to select the geographic
+        column.  Takes into account if the geographic field is in a
+        ForeignKey relation to the current model.
+        """
+        # If this is an aggregate spatial query, the flag needs to be
+        # set on the `GeoQuery` object of this queryset.
+        if aggregate: self.query.aggregate = True
+
+        # Is this operation going to be on a related geographic field?
+        if not geo_field in self.model._meta.fields:
+            # If so, it'll have to be added to the select related information
+            # (e.g., if 'location__point' was given as the field name).
+            self.query.add_select_related([field_name])
+            self.query.pre_sql_setup()
+            rel_table, rel_col = self.query.related_select_cols[self.query.related_select_fields.index(geo_field)]
+            return self.query._field_column(geo_field, rel_table)
+        else:
+            return self.query._field_column(geo_field)
diff --git a/webapp/django/contrib/gis/db/models/sql/__init__.py b/webapp/django/contrib/gis/db/models/sql/__init__.py
new file mode 100644
index 0000000..4a66b41
--- /dev/null
+++ b/webapp/django/contrib/gis/db/models/sql/__init__.py
@@ -0,0 +1,2 @@
+from django.contrib.gis.db.models.sql.query import AreaField, DistanceField, GeomField, GeoQuery
+from django.contrib.gis.db.models.sql.where import GeoWhereNode
diff --git a/webapp/django/contrib/gis/db/models/sql/query.py b/webapp/django/contrib/gis/db/models/sql/query.py
new file mode 100644
index 0000000..f3e9fb2
--- /dev/null
+++ b/webapp/django/contrib/gis/db/models/sql/query.py
@@ -0,0 +1,327 @@
+from itertools import izip
+from django.db.models.query import sql
+from django.db.models.fields import FieldDoesNotExist
+from django.db.models.fields.related import ForeignKey
+
+from django.contrib.gis.db.backend import SpatialBackend
+from django.contrib.gis.db.models.fields import GeometryField
+from django.contrib.gis.db.models.sql.where import GeoWhereNode
+from django.contrib.gis.measure import Area, Distance
+
+# Valid GIS query types.
+ALL_TERMS = sql.constants.QUERY_TERMS.copy()
+ALL_TERMS.update(SpatialBackend.gis_terms)
+
+class GeoQuery(sql.Query):
+    """
+    A single spatial SQL query.
+    """
+    # Overridding the valid query terms.
+    query_terms = ALL_TERMS
+
+    #### Methods overridden from the base Query class ####
+    def __init__(self, model, conn):
+        super(GeoQuery, self).__init__(model, conn, where=GeoWhereNode)
+        # The following attributes are customized for the GeoQuerySet.
+        # The GeoWhereNode and SpatialBackend classes contain backend-specific
+        # routines and functions.
+        self.aggregate = False
+        self.custom_select = {}
+        self.transformed_srid = None
+        self.extra_select_fields = {}
+
+    def clone(self, *args, **kwargs):
+        obj = super(GeoQuery, self).clone(*args, **kwargs)
+        # Customized selection dictionary and transformed srid flag have
+        # to also be added to obj.
+        obj.aggregate = self.aggregate
+        obj.custom_select = self.custom_select.copy()
+        obj.transformed_srid = self.transformed_srid
+        obj.extra_select_fields = self.extra_select_fields.copy()
+        return obj
+
+    def get_columns(self, with_aliases=False):
+        """
+        Return the list of columns to use in the select statement. If no
+        columns have been specified, returns all columns relating to fields in
+        the model.
+
+        If 'with_aliases' is true, any column names that are duplicated
+        (without the table names) are given unique aliases. This is needed in
+        some cases to avoid ambiguitity with nested queries.
+
+        This routine is overridden from Query to handle customized selection of 
+        geometry columns.
+        """
+        qn = self.quote_name_unless_alias
+        qn2 = self.connection.ops.quote_name
+        result = ['(%s) AS %s' % (self.get_extra_select_format(alias) % col[0], qn2(alias)) 
+                  for alias, col in self.extra_select.iteritems()]
+        aliases = set(self.extra_select.keys())
+        if with_aliases:
+            col_aliases = aliases.copy()
+        else:
+            col_aliases = set()
+        if self.select:
+            # This loop customized for GeoQuery.
+            for col, field in izip(self.select, self.select_fields):
+                if isinstance(col, (list, tuple)):
+                    r = self.get_field_select(field, col[0])
+                    if with_aliases and col[1] in col_aliases:
+                        c_alias = 'Col%d' % len(col_aliases)
+                        result.append('%s AS %s' % (r, c_alias))
+                        aliases.add(c_alias)
+                        col_aliases.add(c_alias)
+                    else:
+                        result.append(r)
+                        aliases.add(r)
+                        col_aliases.add(col[1])
+                else:
+                    result.append(col.as_sql(quote_func=qn))
+                    if hasattr(col, 'alias'):
+                        aliases.add(col.alias)
+                        col_aliases.add(col.alias)
+        elif self.default_cols:
+            cols, new_aliases = self.get_default_columns(with_aliases,
+                    col_aliases)
+            result.extend(cols)
+            aliases.update(new_aliases)
+        # This loop customized for GeoQuery.
+        if not self.aggregate:
+            for (table, col), field in izip(self.related_select_cols, self.related_select_fields):
+                r = self.get_field_select(field, table)
+                if with_aliases and col in col_aliases:
+                    c_alias = 'Col%d' % len(col_aliases)
+                    result.append('%s AS %s' % (r, c_alias))
+                    aliases.add(c_alias)
+                    col_aliases.add(c_alias)
+                else:
+                    result.append(r)
+                    aliases.add(r)
+                    col_aliases.add(col)
+
+        self._select_aliases = aliases
+        return result
+
+    def get_default_columns(self, with_aliases=False, col_aliases=None,
+                            start_alias=None, opts=None, as_pairs=False):
+        """
+        Computes the default columns for selecting every field in the base
+        model.
+
+        Returns a list of strings, quoted appropriately for use in SQL
+        directly, as well as a set of aliases used in the select statement.
+
+        This routine is overridden from Query to handle customized selection of 
+        geometry columns.
+        """
+        result = []
+        if opts is None:
+            opts = self.model._meta
+        if start_alias:
+            table_alias = start_alias
+        else:
+            table_alias = self.tables[0]
+        root_pk = self.model._meta.pk.column
+        seen = {None: table_alias}
+        aliases = set()
+        for field, model in opts.get_fields_with_model():
+            try:
+                alias = seen[model]
+            except KeyError:
+                alias = self.join((table_alias, model._meta.db_table,
+                        root_pk, model._meta.pk.column))
+                seen[model] = alias
+            if as_pairs:
+                result.append((alias, field.column))
+                continue
+            # This part of the function is customized for GeoQuery. We
+            # see if there was any custom selection specified in the
+            # dictionary, and set up the selection format appropriately.
+            field_sel = self.get_field_select(field, alias)
+            if with_aliases and field.column in col_aliases:
+                c_alias = 'Col%d' % len(col_aliases)
+                result.append('%s AS %s' % (field_sel, c_alias))
+                col_aliases.add(c_alias)
+                aliases.add(c_alias)
+            else:
+                r = field_sel
+                result.append(r)
+                aliases.add(r)
+                if with_aliases:
+                    col_aliases.add(field.column)
+        if as_pairs:
+            return result, None
+        return result, aliases
+
+    def get_ordering(self):
+        """
+        This routine is overridden to disable ordering for aggregate
+        spatial queries.
+        """
+        if not self.aggregate:
+            return super(GeoQuery, self).get_ordering()
+        else:
+            return ()
+
+    def resolve_columns(self, row, fields=()):
+        """
+        This routine is necessary so that distances and geometries returned
+        from extra selection SQL get resolved appropriately into Python 
+        objects.
+        """
+        values = []
+        aliases = self.extra_select.keys()
+        index_start = len(aliases)
+        values = [self.convert_values(v, self.extra_select_fields.get(a, None)) 
+                  for v, a in izip(row[:index_start], aliases)]
+        if SpatialBackend.oracle:
+            # This is what happens normally in Oracle's `resolve_columns`.
+            for value, field in izip(row[index_start:], fields):
+                values.append(self.convert_values(value, field))
+        else:
+            values.extend(row[index_start:])
+        return values
+
+    def convert_values(self, value, field):
+        """
+        Using the same routines that Oracle does we can convert our
+        extra selection objects into Geometry and Distance objects.
+        TODO: Laziness.
+        """
+        if SpatialBackend.oracle:
+            # Running through Oracle's first.
+            value = super(GeoQuery, self).convert_values(value, field)
+        if isinstance(field, DistanceField):
+            # Using the field's distance attribute, can instantiate
+            # `Distance` with the right context.
+            value = Distance(**{field.distance_att : value})
+        elif isinstance(field, AreaField):
+            value = Area(**{field.area_att : value})
+        elif isinstance(field, GeomField):
+            value = SpatialBackend.Geometry(value)
+        return value
+
+    #### Routines unique to GeoQuery ####
+    def get_extra_select_format(self, alias):
+        sel_fmt = '%s'
+        if alias in self.custom_select:
+            sel_fmt = sel_fmt % self.custom_select[alias]
+        return sel_fmt
+
+    def get_field_select(self, fld, alias=None):
+        """
+        Returns the SELECT SQL string for the given field.  Figures out
+        if any custom selection SQL is needed for the column  The `alias` 
+        keyword may be used to manually specify the database table where 
+        the column exists, if not in the model associated with this 
+        `GeoQuery`.
+        """
+        sel_fmt = self.get_select_format(fld)
+        if fld in self.custom_select:
+            field_sel = sel_fmt % self.custom_select[fld]
+        else:
+            field_sel = sel_fmt % self._field_column(fld, alias)
+        return field_sel
+
+    def get_select_format(self, fld):
+        """
+        Returns the selection format string, depending on the requirements
+        of the spatial backend.  For example, Oracle and MySQL require custom
+        selection formats in order to retrieve geometries in OGC WKT. For all
+        other fields a simple '%s' format string is returned.
+        """
+        if SpatialBackend.select and hasattr(fld, '_geom'):
+            # This allows operations to be done on fields in the SELECT,
+            # overriding their values -- used by the Oracle and MySQL
+            # spatial backends to get database values as WKT, and by the
+            # `transform` method.
+            sel_fmt = SpatialBackend.select
+
+            # Because WKT doesn't contain spatial reference information,
+            # the SRID is prefixed to the returned WKT to ensure that the
+            # transformed geometries have an SRID different than that of the
+            # field -- this is only used by `transform` for Oracle backends.
+            if self.transformed_srid and SpatialBackend.oracle:
+                sel_fmt = "'SRID=%d;'||%s" % (self.transformed_srid, sel_fmt)
+        else:
+            sel_fmt = '%s'
+        return sel_fmt
+
+    # Private API utilities, subject to change.
+    def _check_geo_field(self, model, name_param):
+        """
+        Recursive utility routine for checking the given name parameter
+        on the given model.  Initially, the name parameter is a string,
+        of the field on the given model e.g., 'point', 'the_geom'. 
+        Related model field strings like 'address__point', may also be 
+        used.
+
+        If a GeometryField exists according to the given name parameter 
+        it will be returned, otherwise returns False.
+        """
+        if isinstance(name_param, basestring):
+            # This takes into account the situation where the name is a 
+            # lookup to a related geographic field, e.g., 'address__point'.
+            name_param = name_param.split(sql.constants.LOOKUP_SEP)
+            name_param.reverse() # Reversing so list operates like a queue of related lookups.
+        elif not isinstance(name_param, list):
+            raise TypeError
+        try:
+            # Getting the name of the field for the model (by popping the first
+            # name from the `name_param` list created above).
+            fld, mod, direct, m2m = model._meta.get_field_by_name(name_param.pop())
+        except (FieldDoesNotExist, IndexError):
+            return False
+        # TODO: ManyToManyField?
+        if isinstance(fld, GeometryField): 
+            return fld # A-OK.
+        elif isinstance(fld, ForeignKey):
+            # ForeignKey encountered, return the output of this utility called
+            # on the _related_ model with the remaining name parameters.
+            return self._check_geo_field(fld.rel.to, name_param) # Recurse to check ForeignKey relation.
+        else:
+            return False
+
+    def _field_column(self, field, table_alias=None):
+        """
+        Helper function that returns the database column for the given field.
+        The table and column are returned (quoted) in the proper format, e.g.,
+        `"geoapp_city"."point"`.  If `table_alias` is not specified, the 
+        database table associated with the model of this `GeoQuery` will be
+        used.
+        """
+        if table_alias is None: table_alias = self.model._meta.db_table
+        return "%s.%s" % (self.quote_name_unless_alias(table_alias), 
+                          self.connection.ops.quote_name(field.column))
+
+    def _geo_field(self, field_name=None):
+        """
+        Returns the first Geometry field encountered; or specified via the
+        `field_name` keyword.  The `field_name` may be a string specifying
+        the geometry field on this GeoQuery's model, or a lookup string
+        to a geometry field via a ForeignKey relation.
+        """
+        if field_name is None:
+            # Incrementing until the first geographic field is found.
+            for fld in self.model._meta.fields:
+                if isinstance(fld, GeometryField): return fld
+            return False
+        else:
+            # Otherwise, check by the given field name -- which may be
+            # a lookup to a _related_ geographic field.
+            return self._check_geo_field(self.model, field_name)
+
+### Field Classes for `convert_values` ####
+class AreaField(object):
+    def __init__(self, area_att):
+        self.area_att = area_att
+
+class DistanceField(object):
+    def __init__(self, distance_att):
+        self.distance_att = distance_att
+
+# Rather than use GeometryField (which requires a SQL query
+# upon instantiation), use this lighter weight class.
+class GeomField(object): 
+    pass
diff --git a/webapp/django/contrib/gis/db/models/sql/where.py b/webapp/django/contrib/gis/db/models/sql/where.py
new file mode 100644
index 0000000..a1a28d9
--- /dev/null
+++ b/webapp/django/contrib/gis/db/models/sql/where.py
@@ -0,0 +1,64 @@
+import datetime
+from django.db.models.fields import Field
+from django.db.models.sql.where import WhereNode
+from django.contrib.gis.db.backend import get_geo_where_clause, SpatialBackend
+
+class GeoAnnotation(object):
+    """
+    The annotation used for GeometryFields; basically a placeholder
+    for metadata needed by the `get_geo_where_clause` of the spatial
+    backend.
+    """
+    def __init__(self, field, value, where):
+        self.geodetic = field.geodetic
+        self.geom_type = field._geom
+        self.value = value
+        self.where = tuple(where)
+
+class GeoWhereNode(WhereNode):
+    """
+    Used to represent the SQL where-clause for spatial databases --
+    these are tied to the GeoQuery class that created it.
+    """
+    def add(self, data, connector):
+        """
+        This is overridden from the regular WhereNode to handle the 
+        peculiarties of GeometryFields, because they need a special 
+        annotation object that contains the spatial metadata from the 
+        field to generate the spatial SQL.
+        """
+        if not isinstance(data, (list, tuple)):
+            return super(WhereNode, self).add(data, connector)
+        alias, col, field, lookup_type, value = data     
+        if not hasattr(field, "_geom"):
+            # Not a geographic field, so call `WhereNode.add`.
+            return super(GeoWhereNode, self).add(data, connector)
+        else:
+            # `GeometryField.get_db_prep_lookup` returns a where clause
+            # substitution array in addition to the parameters.
+            where, params = field.get_db_prep_lookup(lookup_type, value)
+
+            # The annotation will be a `GeoAnnotation` object that
+            # will contain the necessary geometry field metadata for
+            # the `get_geo_where_clause` to construct the appropriate
+            # spatial SQL when `make_atom` is called.
+            annotation = GeoAnnotation(field, value, where)
+            return super(WhereNode, self).add((alias, col, field.db_type(), lookup_type,
+                                               annotation, params), connector)
+
+    def make_atom(self, child, qn):
+        table_alias, name, db_type, lookup_type, value_annot, params = child
+ 
+        if isinstance(value_annot, GeoAnnotation):
+            if lookup_type in SpatialBackend.gis_terms:
+                # Getting the geographic where clause; substitution parameters
+                # will be populated in the GeoFieldSQL object returned by the
+                # GeometryField.
+                gwc = get_geo_where_clause(table_alias, name, lookup_type, value_annot)
+                return gwc % value_annot.where, params
+            else:
+                raise TypeError('Invalid lookup type: %r' % lookup_type)
+        else:
+            # If not a GeometryField, call the `make_atom` from the 
+            # base class.
+            return super(GeoWhereNode, self).make_atom(child, qn)
diff --git a/webapp/django/contrib/gis/feeds.py b/webapp/django/contrib/gis/feeds.py
new file mode 100644
index 0000000..4105ef7
--- /dev/null
+++ b/webapp/django/contrib/gis/feeds.py
@@ -0,0 +1,135 @@
+from django.contrib.syndication.feeds import Feed as BaseFeed, FeedDoesNotExist
+from django.utils.feedgenerator import Atom1Feed, Rss201rev2Feed
+
+class GeoFeedMixin(object):
+    """
+    This mixin provides the necessary routines for SyndicationFeed subclasses
+    to produce simple GeoRSS or W3C Geo elements.
+    """
+
+    def georss_coords(self, coords):
+        """
+        In GeoRSS coordinate pairs are ordered by lat/lon and separated by
+        a single white space.  Given a tuple of coordinates, this will return
+        a unicode GeoRSS representation.
+        """
+        return u' '.join([u'%f %f' % (coord[1], coord[0]) for coord in coords])
+
+    def add_georss_point(self, handler, coords, w3c_geo=False):
+        """
+        Adds a GeoRSS point with the given coords using the given handler.
+        Handles the differences between simple GeoRSS and the more pouplar
+        W3C Geo specification.
+        """
+        if w3c_geo:
+            lon, lat = coords[:2]
+            handler.addQuickElement(u'geo:lat', u'%f' % lat)
+            handler.addQuickElement(u'geo:lon', u'%f' % lon)
+        else:
+            handler.addQuickElement(u'georss:point', self.georss_coords((coords,)))
+
+    def add_georss_element(self, handler, item, w3c_geo=False):
+        """
+        This routine adds a GeoRSS XML element using the given item and handler.
+        """
+        # Getting the Geometry object.
+        geom = item.get('geometry', None)
+        if not geom is None:
+            if isinstance(geom, (list, tuple)):
+                # Special case if a tuple/list was passed in.  The tuple may be
+                # a point or a box
+                box_coords = None
+                if isinstance(geom[0], (list, tuple)):
+                    # Box: ( (X0, Y0), (X1, Y1) )
+                    if len(geom) == 2:
+                        box_coords = geom
+                    else:
+                        raise ValueError('Only should be two sets of coordinates.')
+                else:
+                    if len(geom) == 2:
+                        # Point: (X, Y)
+                        self.add_georss_point(handler, geom, w3c_geo=w3c_geo)
+                    elif len(geom) == 4:
+                        # Box: (X0, Y0, X1, Y1)
+                        box_coords = (geom[:2], geom[2:])
+                    else:
+                        raise ValueError('Only should be 2 or 4 numeric elements.')
+                # If a GeoRSS box was given via tuple.
+                if not box_coords is None:
+                    if w3c_geo: raise ValueError('Cannot use simple GeoRSS box in W3C Geo feeds.')
+                    handler.addQuickElement(u'georss:box', self.georss_coords(box_coords))
+            else:
+                # Getting the lower-case geometry type.
+                gtype = str(geom.geom_type).lower()
+                if gtype == 'point':
+                    self.add_georss_point(handler, geom.coords, w3c_geo=w3c_geo) 
+                else:
+                    if w3c_geo: raise ValueError('W3C Geo only supports Point geometries.')
+                    # For formatting consistent w/the GeoRSS simple standard:
+                    # http://georss.org/1.0#simple
+                    if gtype in ('linestring', 'linearring'):
+                        handler.addQuickElement(u'georss:line', self.georss_coords(geom.coords))
+                    elif gtype in ('polygon',):
+                        # Only support the exterior ring.
+                        handler.addQuickElement(u'georss:polygon', self.georss_coords(geom[0].coords))
+                    else:
+                        raise ValueError('Geometry type "%s" not supported.' % geom.geom_type)
+
+### SyndicationFeed subclasses ###
+class GeoRSSFeed(Rss201rev2Feed, GeoFeedMixin):
+    def rss_attributes(self):
+        attrs = super(GeoRSSFeed, self).rss_attributes()
+        attrs[u'xmlns:georss'] = u'http://www.georss.org/georss'
+        return attrs
+
+    def add_item_elements(self, handler, item):
+        super(GeoRSSFeed, self).add_item_elements(handler, item)
+        self.add_georss_element(handler, item)
+
+    def add_root_elements(self, handler):
+        super(GeoRSSFeed, self).add_root_elements(handler)
+        self.add_georss_element(handler, self.feed)
+
+class GeoAtom1Feed(Atom1Feed, GeoFeedMixin):
+    def root_attributes(self):
+        attrs = super(GeoAtom1Feed, self).root_attributes()
+        attrs[u'xmlns:georss'] = u'http://www.georss.org/georss'
+        return attrs
+
+    def add_item_elements(self, handler, item):
+        super(GeoAtom1Feed, self).add_item_elements(handler, item)
+        self.add_georss_element(handler, item)
+
+    def add_root_elements(self, handler):
+        super(GeoAtom1Feed, self).add_root_elements(handler)
+        self.add_georss_element(handler, self.feed)
+
+class W3CGeoFeed(Rss201rev2Feed, GeoFeedMixin):
+    def rss_attributes(self):
+        attrs = super(W3CGeoFeed, self).rss_attributes()
+        attrs[u'xmlns:geo'] = u'http://www.w3.org/2003/01/geo/wgs84_pos#'
+        return attrs
+
+    def add_item_elements(self, handler, item):
+        super(W3CGeoFeed, self).add_item_elements(handler, item)
+        self.add_georss_element(handler, item, w3c_geo=True)
+
+    def add_root_elements(self, handler):
+        super(W3CGeoFeed, self).add_root_elements(handler)
+        self.add_georss_element(handler, self.feed, w3c_geo=True)
+
+### Feed subclass ###
+class Feed(BaseFeed):
+    """
+    This is a subclass of the `Feed` from `django.contrib.syndication`.
+    This allows users to define a `geometry(obj)` and/or `item_geometry(item)`
+    methods on their own subclasses so that geo-referenced information may
+    placed in the feed.
+    """
+    feed_type = GeoRSSFeed
+
+    def feed_extra_kwargs(self, obj):
+        return {'geometry' : self.__get_dynamic_attr('geometry', obj)}
+
+    def item_extra_kwargs(self, item):
+        return {'geometry' : self.__get_dynamic_attr('item_geometry', item)}
diff --git a/webapp/django/contrib/gis/forms/__init__.py b/webapp/django/contrib/gis/forms/__init__.py
new file mode 100644
index 0000000..5441e60
--- /dev/null
+++ b/webapp/django/contrib/gis/forms/__init__.py
@@ -0,0 +1 @@
+from django.contrib.gis.forms.fields import GeometryField
diff --git a/webapp/django/contrib/gis/forms/fields.py b/webapp/django/contrib/gis/forms/fields.py
new file mode 100644
index 0000000..a65e76d
--- /dev/null
+++ b/webapp/django/contrib/gis/forms/fields.py
@@ -0,0 +1,37 @@
+from django import forms
+from django.contrib.gis.geos import GEOSGeometry, GEOSException
+from django.utils.translation import ugettext_lazy as _
+
+class GeometryField(forms.Field):
+    # By default a Textarea widget is used.
+    widget = forms.Textarea
+
+    default_error_messages = {
+        'no_geom' : _(u'No geometry value provided.'),
+        'invalid_geom' : _(u'Invalid Geometry value.'),
+        'invalid_geom_type' : _(u'Invalid Geometry type.'),
+    }
+    def __init__(self, **kwargs):
+        self.null = kwargs.pop('null')
+        self.geom_type = kwargs.pop('geom_type')
+        super(GeometryField, self).__init__(**kwargs)
+
+    def clean(self, value):
+        """
+        Validates that the input value can be converted to a Geometry
+        object (which is returned).  A ValidationError is raised if
+        the value cannot be instantiated as a Geometry.
+        """
+        if not value:
+            if self.null:
+                # The geometry column allows NULL, return None.
+                return None
+            else:
+                raise forms.ValidationError(self.error_messages['no_geom'])
+        try:
+            geom = GEOSGeometry(value)
+            if geom.geom_type.upper() != self.geom_type:
+                raise forms.ValidationError(self.error_messages['invalid_geom_type'])
+            return geom
+        except GEOSException:
+            raise forms.ValidationError(self.error_messages['invalid_geom'])
diff --git a/webapp/django/contrib/gis/gdal/LICENSE b/webapp/django/contrib/gis/gdal/LICENSE
new file mode 100644
index 0000000..4bd0bed
--- /dev/null
+++ b/webapp/django/contrib/gis/gdal/LICENSE
@@ -0,0 +1,28 @@
+Copyright (c) 2007, Justin Bronn
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice,
+       this list of conditions and the following disclaimer.
+
+    2. Redistributions in binary form must reproduce the above copyright
+       notice, this list of conditions and the following disclaimer in the
+       documentation and/or other materials provided with the distribution.
+
+    3. Neither the name of OGRGeometry nor the names of its contributors may be used
+       to endorse or promote products derived from this software without
+       specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
diff --git a/webapp/django/contrib/gis/gdal/__init__.py b/webapp/django/contrib/gis/gdal/__init__.py
new file mode 100644
index 0000000..b318850
--- /dev/null
+++ b/webapp/django/contrib/gis/gdal/__init__.py
@@ -0,0 +1,59 @@
+"""
+ This module houses ctypes interfaces for GDAL objects.  The following GDAL
+ objects are supported:
+
+ CoordTransform: Used for coordinate transformations from one spatial
+  reference system to another.
+
+ Driver: Wraps an OGR data source driver.
+  
+ DataSource: Wrapper for the OGR data source object, supports
+  OGR-supported data sources.
+
+ Envelope: A ctypes structure for bounding boxes (GDAL library
+  not required).
+
+ OGRGeometry: Layer for accessing OGR Geometry objects.
+
+ OGRGeomType: A class for representing the different OGR Geometry
+  types (GDAL library not required).
+
+ SpatialReference: Represents OSR Spatial Reference objects.
+
+ The GDAL library will be imported from the system path using the default  
+ library name for the current OS. The default library path may be overridden
+ by setting `GDAL_LIBRARY_PATH` in your settings with the path to the GDAL C 
+ library on your system.  
+
+ GDAL links to a large number of external libraries that consume RAM when 
+ loaded.  Thus, it may desirable to disable GDAL on systems with limited
+ RAM resources -- this may be accomplished by setting `GDAL_LIBRARY_PATH`
+ to a non-existant file location (e.g., `GDAL_LIBRARY_PATH='/null/path'`; 
+ setting to None/False/'' will not work as a string must be given).
+"""
+import sys
+
+# Attempting to import objects that depend on the GDAL library.  The
+# HAS_GDAL flag will be set to True if the library is present on
+# the system.
+try:
+    from django.contrib.gis.gdal.driver import Driver
+    from django.contrib.gis.gdal.datasource import DataSource
+    from django.contrib.gis.gdal.libgdal import gdal_version, gdal_full_version, gdal_release_date
+    from django.contrib.gis.gdal.srs import SpatialReference, CoordTransform
+    from django.contrib.gis.gdal.geometries import OGRGeometry, GEOJSON
+    HAS_GDAL = True
+except:
+    HAS_GDAL, GEOJSON = False, False
+
+# The envelope, error, and geomtype modules do not actually require the
+# GDAL library, but still nead at least Python 2.4 and ctypes.
+PYTHON23 = sys.version_info[0] == 2 and sys.version_info[1] == 3
+if not PYTHON23:
+    try:
+        from django.contrib.gis.gdal.envelope import Envelope
+        from django.contrib.gis.gdal.error import check_err, OGRException, OGRIndexError, SRSException
+        from django.contrib.gis.gdal.geomtype import OGRGeomType
+    except ImportError:
+        # No ctypes, but don't raise an exception.
+        pass
diff --git a/webapp/django/contrib/gis/gdal/datasource.py b/webapp/django/contrib/gis/gdal/datasource.py
new file mode 100644
index 0000000..02363a0
--- /dev/null
+++ b/webapp/django/contrib/gis/gdal/datasource.py
@@ -0,0 +1,138 @@
+"""
+ DataSource is a wrapper for the OGR Data Source object, which provides
+ an interface for reading vector geometry data from many different file
+ formats (including ESRI shapefiles).
+
+ When instantiating a DataSource object, use the filename of a
+ GDAL-supported data source.  For example, a SHP file or a
+ TIGER/Line file from the government.
+
+ The ds_driver keyword is used internally when a ctypes pointer
+ is passed in directly.
+
+ Example:
+  ds = DataSource('/home/foo/bar.shp')
+  for layer in ds:
+      for feature in layer:
+          # Getting the geometry for the feature.
+          g = feature.geom
+
+          # Getting the 'description' field for the feature.
+          desc = feature['description']
+
+          # We can also increment through all of the fields
+          #  attached to this feature.
+          for field in feature:
+              # Get the name of the field (e.g. 'description')
+              nm = field.name
+
+              # Get the type (integer) of the field, e.g. 0 => OFTInteger
+              t = field.type
+
+              # Returns the value the field; OFTIntegers return ints,
+              #  OFTReal returns floats, all else returns string.
+              val = field.value
+"""
+# ctypes prerequisites.
+from ctypes import byref, c_void_p
+
+# The GDAL C library, OGR exceptions, and the Layer object.
+from django.contrib.gis.gdal.driver import Driver
+from django.contrib.gis.gdal.error import OGRException, OGRIndexError
+from django.contrib.gis.gdal.layer import Layer
+
+# Getting the ctypes prototypes for the DataSource.
+from django.contrib.gis.gdal.prototypes.ds import \
+    destroy_ds, get_driver_count, register_all, open_ds, release_ds, \
+    get_ds_name, get_layer, get_layer_count, get_layer_by_name
+
+# For more information, see the OGR C API source code:
+#  http://www.gdal.org/ogr/ogr__api_8h.html
+#
+# The OGR_DS_* routines are relevant here.
+class DataSource(object):
+    "Wraps an OGR Data Source object."
+
+    #### Python 'magic' routines ####
+    def __init__(self, ds_input, ds_driver=False, write=False):
+
+        # DataSource pointer is initially NULL.
+        self._ptr = None
+
+        # The write flag.
+        if write:
+            self._write = 1
+        else:
+            self._write = 0
+
+        # Registering all the drivers, this needs to be done
+        #  _before_ we try to open up a data source.
+        if not get_driver_count(): register_all()
+
+        if isinstance(ds_input, basestring):
+            # The data source driver is a void pointer.
+            ds_driver = c_void_p()
+            try:
+                # OGROpen will auto-detect the data source type.
+                ds = open_ds(ds_input, self._write, byref(ds_driver))
+            except OGRException:
+                # Making the error message more clear rather than something
+                # like "Invalid pointer returned from OGROpen".
+                raise OGRException('Could not open the datasource at "%s"' % ds_input)
+        elif isinstance(ds_input, c_void_p) and isinstance(ds_driver, c_void_p):
+            ds = ds_input
+        else:
+            raise OGRException('Invalid data source input type: %s' % type(ds_input))
+
+        if bool(ds):
+            self._ptr = ds
+            self._driver = Driver(ds_driver)
+        else:
+            # Raise an exception if the returned pointer is NULL 
+            raise OGRException('Invalid data source file "%s"' % ds_input)
+
+    def __del__(self):
+        "Destroys this DataStructure object."
+        if self._ptr: destroy_ds(self._ptr)
+
+    def __iter__(self):
+        "Allows for iteration over the layers in a data source."
+        for i in xrange(self.layer_count):
+            yield self[i]
+
+    def __getitem__(self, index):
+        "Allows use of the index [] operator to get a layer at the index."
+        if isinstance(index, basestring):
+            l = get_layer_by_name(self._ptr, index)
+            if not l: raise OGRIndexError('invalid OGR Layer name given: "%s"' % index)
+        elif isinstance(index, int):
+            if index < 0 or index >= self.layer_count:
+                raise OGRIndexError('index out of range')
+            l = get_layer(self._ptr, index)
+        else:
+            raise TypeError('Invalid index type: %s' % type(index))
+        return Layer(l)
+        
+    def __len__(self):
+        "Returns the number of layers within the data source."
+        return self.layer_count
+
+    def __str__(self):
+        "Returns OGR GetName and Driver for the Data Source."
+        return '%s (%s)' % (self.name, str(self.driver))
+
+    #### DataSource Properties ####
+    @property
+    def driver(self):
+        "Returns the Driver object for this Data Source."
+        return self._driver
+        
+    @property
+    def layer_count(self):
+        "Returns the number of layers in the data source."
+        return get_layer_count(self._ptr)
+
+    @property
+    def name(self):
+        "Returns the name of the data source."
+        return get_ds_name(self._ptr)
diff --git a/webapp/django/contrib/gis/gdal/driver.py b/webapp/django/contrib/gis/gdal/driver.py
new file mode 100644
index 0000000..2d5b3df
--- /dev/null
+++ b/webapp/django/contrib/gis/gdal/driver.py
@@ -0,0 +1,66 @@
+# prerequisites imports 
+from ctypes import c_void_p
+from django.contrib.gis.gdal.error import OGRException
+from django.contrib.gis.gdal.prototypes.ds import \
+    get_driver, get_driver_by_name, get_driver_count, get_driver_name, register_all
+
+# For more information, see the OGR C API source code:
+#  http://www.gdal.org/ogr/ogr__api_8h.html
+#
+# The OGR_Dr_* routines are relevant here.
+class Driver(object):
+    "Wraps an OGR Data Source Driver."
+
+    # Case-insensitive aliases for OGR Drivers.
+    _alias = {'esri' : 'ESRI Shapefile',
+              'shp' : 'ESRI Shapefile',
+              'shape' : 'ESRI Shapefile',
+              'tiger' : 'TIGER',
+              'tiger/line' : 'TIGER',
+              }
+                
+    def __init__(self, dr_input):
+        "Initializes an OGR driver on either a string or integer input."
+
+        if isinstance(dr_input, basestring):
+            # If a string name of the driver was passed in
+            self._ptr = None # Initially NULL
+            self._register()
+
+            # Checking the alias dictionary (case-insensitive) to see if an alias
+            #  exists for the given driver.
+            if dr_input.lower() in self._alias:
+                name = self._alias[dr_input.lower()]
+            else:
+                name = dr_input
+
+            # Attempting to get the OGR driver by the string name.
+            dr = get_driver_by_name(name)
+        elif isinstance(dr_input, int):
+            self._register()
+            dr = get_driver(dr_input)
+        elif isinstance(dr_input, c_void_p):
+            dr = dr_input
+        else:
+            raise OGRException('Unrecognized input type for OGR Driver: %s' % str(type(dr_input)))
+
+        # Making sure we get a valid pointer to the OGR Driver
+        if not dr:
+            raise OGRException('Could not initialize OGR Driver on input: %s' % str(dr_input))
+        self._ptr = dr
+
+    def __str__(self):
+        "Returns the string name of the OGR Driver."
+        return get_driver_name(self._ptr)
+
+    def _register(self):
+        "Attempts to register all the data source drivers."
+        # Only register all if the driver count is 0 (or else all drivers
+        # will be registered over and over again)
+        if not self.driver_count: register_all()
+                    
+    # Driver properties
+    @property
+    def driver_count(self):
+        "Returns the number of OGR data source drivers registered."
+        return get_driver_count()
diff --git a/webapp/django/contrib/gis/gdal/envelope.py b/webapp/django/contrib/gis/gdal/envelope.py
new file mode 100644
index 0000000..971f06d
--- /dev/null
+++ b/webapp/django/contrib/gis/gdal/envelope.py
@@ -0,0 +1,134 @@
+"""
+ The GDAL/OGR library uses an Envelope structure to hold the bounding
+ box information for a geometry.  The envelope (bounding box) contains
+ two pairs of coordinates, one for the lower left coordinate and one
+ for the upper right coordinate:
+
+                           +----------o Upper right; (max_x, max_y)
+                           |          |
+                           |          |
+                           |          |
+ Lower left (min_x, min_y) o----------+
+"""
+from ctypes import Structure, c_double
+from types import TupleType, ListType
+from django.contrib.gis.gdal.error import OGRException
+
+# The OGR definition of an Envelope is a C structure containing four doubles.
+#  See the 'ogr_core.h' source file for more information:
+#   http://www.gdal.org/ogr/ogr__core_8h-source.html
+class OGREnvelope(Structure):
+    "Represents the OGREnvelope C Structure."
+    _fields_ = [("MinX", c_double),
+                ("MaxX", c_double),
+                ("MinY", c_double),
+                ("MaxY", c_double),
+                ]
+
+class Envelope(object):
+    """
+    The Envelope object is a C structure that contains the minimum and
+    maximum X, Y coordinates for a rectangle bounding box.  The naming
+    of the variables is compatible with the OGR Envelope structure.
+    """
+
+    def __init__(self, *args):
+        """
+        The initialization function may take an OGREnvelope structure, 4-element
+        tuple or list, or 4 individual arguments.
+        """
+        
+        if len(args) == 1:
+            if isinstance(args[0], OGREnvelope):
+                # OGREnvelope (a ctypes Structure) was passed in.
+                self._envelope = args[0]
+            elif isinstance(args[0], (TupleType, ListType)):
+                # A tuple was passed in.
+                if len(args[0]) != 4:
+                    raise OGRException('Incorrect number of tuple elements (%d).' % len(args[0]))
+                else:
+                    self._from_sequence(args[0])
+            else:
+                raise TypeError('Incorrect type of argument: %s' % str(type(args[0])))
+        elif len(args) == 4:
+            # Individiual parameters passed in.
+            #  Thanks to ww for the help
+            self._from_sequence(map(float, args))
+        else:
+            raise OGRException('Incorrect number (%d) of arguments.' % len(args))
+
+        # Checking the x,y coordinates
+        if self.min_x >= self.max_x:
+            raise OGRException('Envelope minimum X >= maximum X.')
+        if self.min_y >= self.max_y:
+            raise OGRException('Envelope minimum Y >= maximum Y.')
+
+    def __eq__(self, other):
+        """
+        Returns True if the envelopes are equivalent; can compare against
+        other Envelopes and 4-tuples.
+        """
+        if isinstance(other, Envelope):
+            return (self.min_x == other.min_x) and (self.min_y == other.min_y) and \
+                   (self.max_x == other.max_x) and (self.max_y == other.max_y)
+        elif isinstance(other, TupleType) and len(other) == 4:
+            return (self.min_x == other[0]) and (self.min_y == other[1]) and \
+                   (self.max_x == other[2]) and (self.max_y == other[3])
+        else:
+            raise OGRException('Equivalence testing only works with other Envelopes.')
+
+    def __str__(self):
+        "Returns a string representation of the tuple."
+        return str(self.tuple)
+
+    def _from_sequence(self, seq):
+        "Initializes the C OGR Envelope structure from the given sequence."
+        self._envelope = OGREnvelope()
+        self._envelope.MinX = seq[0]
+        self._envelope.MinY = seq[1]
+        self._envelope.MaxX = seq[2]
+        self._envelope.MaxY = seq[3]
+    
+    @property
+    def min_x(self):
+        "Returns the value of the minimum X coordinate."
+        return self._envelope.MinX
+
+    @property
+    def min_y(self):
+        "Returns the value of the minimum Y coordinate."
+        return self._envelope.MinY
+
+    @property
+    def max_x(self):
+        "Returns the value of the maximum X coordinate."
+        return self._envelope.MaxX
+
+    @property
+    def max_y(self):
+        "Returns the value of the maximum Y coordinate."
+        return self._envelope.MaxY
+
+    @property
+    def ur(self):
+        "Returns the upper-right coordinate."
+        return (self.max_x, self.max_y)
+
+    @property
+    def ll(self):
+        "Returns the lower-left coordinate."
+        return (self.min_x, self.min_y)
+
+    @property
+    def tuple(self):
+        "Returns a tuple representing the envelope."
+        return (self.min_x, self.min_y, self.max_x, self.max_y)
+
+    @property
+    def wkt(self):
+        "Returns WKT representing a Polygon for this envelope."
+        # TODO: Fix significant figures.
+        return 'POLYGON((%s %s,%s %s,%s %s,%s %s,%s %s))' % \
+               (self.min_x, self.min_y, self.min_x, self.max_y,
+                self.max_x, self.max_y, self.max_x, self.min_y,
+                self.min_x, self.min_y)
diff --git a/webapp/django/contrib/gis/gdal/error.py b/webapp/django/contrib/gis/gdal/error.py
new file mode 100644
index 0000000..4ec3f7e
--- /dev/null
+++ b/webapp/django/contrib/gis/gdal/error.py
@@ -0,0 +1,41 @@
+"""
+ This module houses the OGR & SRS Exception objects, and the
+ check_err() routine which checks the status code returned by
+ OGR methods.
+"""
+#### OGR & SRS Exceptions ####
+class OGRException(Exception): pass
+class SRSException(Exception): pass
+class OGRIndexError(OGRException, KeyError):
+    """
+    This exception is raised when an invalid index is encountered, and has
+    the 'silent_variable_feature' attribute set to true.  This ensures that
+    django's templates proceed to use the next lookup type gracefully when
+    an Exception is raised.  Fixes ticket #4740.
+    """
+    silent_variable_failure = True
+
+#### OGR error checking codes and routine ####
+
+# OGR Error Codes
+OGRERR_DICT = { 1 : (OGRException, 'Not enough data.'),
+                2 : (OGRException, 'Not enough memory.'),
+                3 : (OGRException, 'Unsupported geometry type.'),
+                4 : (OGRException, 'Unsupported operation.'),
+                5 : (OGRException, 'Corrupt data.'),
+                6 : (OGRException, 'OGR failure.'),
+                7 : (SRSException, 'Unsupported SRS.'),
+                8 : (OGRException, 'Invalid handle.'),
+                }
+OGRERR_NONE = 0
+
+def check_err(code):
+    "Checks the given OGRERR, and raises an exception where appropriate."
+    
+    if code == OGRERR_NONE:
+        return
+    elif code in OGRERR_DICT:
+        e, msg = OGRERR_DICT[code]
+        raise e, msg
+    else:
+        raise OGRException('Unknown error code: "%s"' % code)
diff --git a/webapp/django/contrib/gis/gdal/feature.py b/webapp/django/contrib/gis/gdal/feature.py
new file mode 100644
index 0000000..bc3857f
--- /dev/null
+++ b/webapp/django/contrib/gis/gdal/feature.py
@@ -0,0 +1,115 @@
+# The GDAL C library, OGR exception, and the Field object
+from django.contrib.gis.gdal.error import OGRException, OGRIndexError
+from django.contrib.gis.gdal.field import Field
+from django.contrib.gis.gdal.geometries import OGRGeometry, OGRGeomType
+from django.contrib.gis.gdal.srs import SpatialReference
+
+# ctypes function prototypes
+from django.contrib.gis.gdal.prototypes.ds import \
+    destroy_feature, feature_equal, get_fd_geom_type, get_feat_geom_ref, \
+    get_feat_name, get_feat_field_count, get_fid, get_field_defn, \
+    get_field_index, get_field_name
+from django.contrib.gis.gdal.prototypes.geom import clone_geom, get_geom_srs
+from django.contrib.gis.gdal.prototypes.srs import clone_srs
+
+# For more information, see the OGR C API source code:
+#  http://www.gdal.org/ogr/ogr__api_8h.html
+#
+# The OGR_F_* routines are relevant here.
+class Feature(object):
+    "A class that wraps an OGR Feature, needs to be instantiated from a Layer object."
+
+    #### Python 'magic' routines ####
+    def __init__(self, feat, fdefn):
+        "Initializes on the pointers for the feature and the layer definition."
+        self._ptr = None # Initially NULL
+        if not feat or not fdefn:
+            raise OGRException('Cannot create OGR Feature, invalid pointer given.')
+        self._ptr = feat
+        self._fdefn = fdefn
+
+    def __del__(self):
+        "Releases a reference to this object."
+        if self._ptr: destroy_feature(self._ptr)
+
+    def __getitem__(self, index):
+        """
+        Gets the Field object at the specified index, which may be either
+        an integer or the Field's string label.  Note that the Field object
+        is not the field's _value_ -- use the `get` method instead to 
+        retrieve the value (e.g. an integer) instead of a Field instance.
+        """
+        if isinstance(index, basestring):
+            i = self.index(index)
+        else:
+            if index < 0 or index > self.num_fields:
+                raise OGRIndexError('index out of range')
+            i = index
+        return Field(self._ptr, i)
+    
+    def __iter__(self):
+        "Iterates over each field in the Feature."
+        for i in xrange(self.num_fields):
+            yield self[i]
+
+    def __len__(self):
+        "Returns the count of fields in this feature."
+        return self.num_fields
+        
+    def __str__(self):
+        "The string name of the feature."
+        return 'Feature FID %d in Layer<%s>' % (self.fid, self.layer_name)
+
+    def __eq__(self, other):
+        "Does equivalence testing on the features."
+        return bool(feature_equal(self._ptr, other._ptr))
+
+    #### Feature Properties ####
+    @property
+    def fid(self):
+        "Returns the feature identifier."
+        return get_fid(self._ptr)
+        
+    @property
+    def layer_name(self):
+        "Returns the name of the layer for the feature."
+        return get_feat_name(self._fdefn)
+
+    @property
+    def num_fields(self):
+        "Returns the number of fields in the Feature."
+        return get_feat_field_count(self._ptr)
+
+    @property
+    def fields(self):
+        "Returns a list of fields in the Feature."
+        return [get_field_name(get_field_defn(self._fdefn, i)) 
+                for i in xrange(self.num_fields)]
+
+    @property
+    def geom(self):
+        "Returns the OGR Geometry for this Feature."
+        # Retrieving the geometry pointer for the feature.
+        geom_ptr = get_feat_geom_ref(self._ptr)
+        return OGRGeometry(clone_geom(geom_ptr))
+
+    @property
+    def geom_type(self):
+        "Returns the OGR Geometry Type for this Feture."
+        return OGRGeomType(get_fd_geom_type(self._fdefn))
+    
+    #### Feature Methods ####
+    def get(self, field):
+        """
+        Returns the value of the field, instead of an instance of the Field
+        object.  May take a string of the field name or a Field object as
+        parameters.
+        """
+        field_name = getattr(field, 'name', field)
+        return self[field_name].value
+
+    def index(self, field_name):
+        "Returns the index of the given field name."
+        i = get_field_index(self._ptr, field_name)
+        if i < 0: raise OGRIndexError('invalid OFT field name given: "%s"' % field_name)
+        return i
diff --git a/webapp/django/contrib/gis/gdal/field.py b/webapp/django/contrib/gis/gdal/field.py
new file mode 100644
index 0000000..ad1feb3
--- /dev/null
+++ b/webapp/django/contrib/gis/gdal/field.py
@@ -0,0 +1,179 @@
+from ctypes import byref, c_int
+from datetime import date, datetime, time
+from django.contrib.gis.gdal.error import OGRException
+from django.contrib.gis.gdal.prototypes.ds import \
+    get_feat_field_defn, get_field_as_datetime, get_field_as_double, \
+    get_field_as_integer, get_field_as_string, get_field_name, get_field_precision, \
+    get_field_type, get_field_type_name, get_field_width
+
+# For more information, see the OGR C API source code:
+#  http://www.gdal.org/ogr/ogr__api_8h.html
+#
+# The OGR_Fld_* routines are relevant here.
+class Field(object):
+    "A class that wraps an OGR Field, needs to be instantiated from a Feature object."
+
+    #### Python 'magic' routines ####
+    def __init__(self, feat, index):
+        """
+        Initializes on the feature pointer and the integer index of
+        the field within the feature.
+        """
+        # Setting the feature pointer and index.
+        self._feat = feat
+        self._index = index
+        
+        # Getting the pointer for this field.
+        fld = get_feat_field_defn(feat, index)
+        if not fld:
+            raise OGRException('Cannot create OGR Field, invalid pointer given.')
+        self._ptr = fld
+
+        # Setting the class depending upon the OGR Field Type (OFT)
+        self.__class__ = FIELD_CLASSES[self.type]
+
+        # OFTReal with no precision should be an OFTInteger.
+        if isinstance(self, OFTReal) and self.precision == 0:
+            self.__class__ = OFTInteger
+
+    def __str__(self):
+        "Returns the string representation of the Field."
+        return str(self.value).strip()
+
+    #### Field Methods ####
+    def as_double(self):
+        "Retrieves the Field's value as a double (float)."
+        return get_field_as_double(self._feat, self._index)
+
+    def as_int(self):
+        "Retrieves the Field's value as an integer."
+        return get_field_as_integer(self._feat, self._index)
+
+    def as_string(self):
+        "Retrieves the Field's value as a string."
+        return get_field_as_string(self._feat, self._index)
+
+    def as_datetime(self):
+        "Retrieves the Field's value as a tuple of date & time components."
+        yy, mm, dd, hh, mn, ss, tz = [c_int() for i in range(7)]
+        status = get_field_as_datetime(self._feat, self._index, byref(yy), byref(mm), byref(dd),
+                                       byref(hh), byref(mn), byref(ss), byref(tz))
+        if status:
+            return (yy, mm, dd, hh, mn, ss, tz)
+        else:
+            raise OGRException('Unable to retrieve date & time information from the field.')
+
+    #### Field Properties ####
+    @property
+    def name(self):
+        "Returns the name of this Field."
+        return get_field_name(self._ptr)
+
+    @property
+    def precision(self):
+        "Returns the precision of this Field."
+        return get_field_precision(self._ptr)
+
+    @property
+    def type(self):
+        "Returns the OGR type of this Field."
+        return get_field_type(self._ptr)
+
+    @property
+    def type_name(self):
+        "Return the OGR field type name for this Field."
+        return get_field_type_name(self.type)
+
+    @property
+    def value(self):
+        "Returns the value of this Field."
+        # Default is to get the field as a string.
+        return self.as_string()
+
+    @property
+    def width(self):
+        "Returns the width of this Field."
+        return get_field_width(self._ptr)
+
+### The Field sub-classes for each OGR Field type. ###
+class OFTInteger(Field):
+    @property
+    def value(self):
+        "Returns an integer contained in this field."
+        return self.as_int()
+
+    @property
+    def type(self):
+        """
+        GDAL uses OFTReals to represent OFTIntegers in created
+        shapefiles -- forcing the type here since the underlying field
+        type may actually be OFTReal.
+        """
+        return 0
+
+class OFTReal(Field):
+    @property
+    def value(self):
+        "Returns a float contained in this field."
+        return self.as_double()
+
+# String & Binary fields, just subclasses
+class OFTString(Field): pass
+class OFTWideString(Field): pass
+class OFTBinary(Field): pass
+
+# OFTDate, OFTTime, OFTDateTime fields.
+class OFTDate(Field):
+    @property
+    def value(self):
+        "Returns a Python `date` object for the OFTDate field."
+        yy, mm, dd, hh, mn, ss, tz = self.as_datetime()
+        try:
+            return date(yy.value, mm.value, dd.value)
+        except ValueError:
+            return None
+
+class OFTDateTime(Field):
+    @property
+    def value(self):
+        "Returns a Python `datetime` object for this OFTDateTime field."
+        yy, mm, dd, hh, mn, ss, tz = self.as_datetime()
+        # TODO: Adapt timezone information.
+        #  See http://lists.maptools.org/pipermail/gdal-dev/2006-February/007990.html
+        #  The `tz` variable has values of: 0=unknown, 1=localtime (ambiguous), 
+        #  100=GMT, 104=GMT+1, 80=GMT-5, etc.
+        try:
+            return datetime(yy.value, mm.value, dd.value, hh.value, mn.value, ss.value)
+        except ValueError:
+            return None
+
+class OFTTime(Field):
+    @property
+    def value(self):
+        "Returns a Python `time` object for this OFTTime field."
+        yy, mm, dd, hh, mn, ss, tz = self.as_datetime()
+        try:
+            return time(hh.value, mn.value, ss.value)
+        except ValueError:
+            return None
+
+# List fields are also just subclasses
+class OFTIntegerList(Field): pass
+class OFTRealList(Field): pass
+class OFTStringList(Field): pass
+class OFTWideStringList(Field): pass
+
+# Class mapping dictionary for OFT Types
+FIELD_CLASSES = { 0 : OFTInteger,
+                  1 : OFTIntegerList,
+                  2 : OFTReal,
+                  3 : OFTRealList,
+                  4 : OFTString,
+                  5 : OFTStringList,
+                  6 : OFTWideString,
+                  7 : OFTWideStringList,
+                  8 : OFTBinary,
+                  9 : OFTDate,
+                 10 : OFTTime,
+                 11 : OFTDateTime,
+                  }
diff --git a/webapp/django/contrib/gis/gdal/geometries.py b/webapp/django/contrib/gis/gdal/geometries.py
new file mode 100644
index 0000000..ee0ec17
--- /dev/null
+++ b/webapp/django/contrib/gis/gdal/geometries.py
@@ -0,0 +1,643 @@
+"""
+ The OGRGeometry is a wrapper for using the OGR Geometry class
+ (see http://www.gdal.org/ogr/classOGRGeometry.html).  OGRGeometry
+ may be instantiated when reading geometries from OGR Data Sources
+ (e.g. SHP files), or when given OGC WKT (a string).
+
+ While the 'full' API is not present yet, the API is "pythonic" unlike
+ the traditional and "next-generation" OGR Python bindings.  One major
+ advantage OGR Geometries have over their GEOS counterparts is support
+ for spatial reference systems and their transformation.
+
+ Example:
+  >>> from django.contrib.gis.gdal import OGRGeometry, OGRGeomType, SpatialReference
+  >>> wkt1, wkt2 = 'POINT(-90 30)', 'POLYGON((0 0, 5 0, 5 5, 0 5)'
+  >>> pnt = OGRGeometry(wkt1)
+  >>> print pnt
+  POINT (-90 30)
+  >>> mpnt = OGRGeometry(OGRGeomType('MultiPoint'), SpatialReference('WGS84'))
+  >>> mpnt.add(wkt1)
+  >>> mpnt.add(wkt1)
+  >>> print mpnt
+  MULTIPOINT (-90 30,-90 30)
+  >>> print mpnt.srs.name
+  WGS 84
+  >>> print mpnt.srs.proj
+  +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs
+  >>> mpnt.transform_to(SpatialReference('NAD27'))
+  >>> print mpnt.proj
+  +proj=longlat +ellps=clrk66 +datum=NAD27 +no_defs
+  >>> print mpnt
+  MULTIPOINT (-89.999930378602485 29.999797886557641,-89.999930378602485 29.999797886557641)
+  
+  The OGRGeomType class is to make it easy to specify an OGR geometry type:
+  >>> from django.contrib.gis.gdal import OGRGeomType
+  >>> gt1 = OGRGeomType(3) # Using an integer for the type
+  >>> gt2 = OGRGeomType('Polygon') # Using a string
+  >>> gt3 = OGRGeomType('POLYGON') # It's case-insensitive
+  >>> print gt1 == 3, gt1 == 'Polygon' # Equivalence works w/non-OGRGeomType objects
+  True
+"""
+# Python library requisites.
+import re, sys
+from binascii import a2b_hex
+from ctypes import byref, string_at, c_char_p, c_double, c_ubyte, c_void_p
+from types import UnicodeType
+
+# Getting GDAL prerequisites
+from django.contrib.gis.gdal.envelope import Envelope, OGREnvelope
+from django.contrib.gis.gdal.error import OGRException, OGRIndexError, SRSException
+from django.contrib.gis.gdal.geomtype import OGRGeomType
+from django.contrib.gis.gdal.srs import SpatialReference, CoordTransform
+
+# Getting the ctypes prototype functions that interface w/the GDAL C library.
+from django.contrib.gis.gdal.prototypes.geom import *
+from django.contrib.gis.gdal.prototypes.srs import clone_srs
+
+# For more information, see the OGR C API source code:
+#  http://www.gdal.org/ogr/ogr__api_8h.html
+#
+# The OGR_G_* routines are relevant here.
+
+# Regular expressions for recognizing HEXEWKB and WKT.
+hex_regex = re.compile(r'^[0-9A-F]+$', re.I)
+wkt_regex = re.compile(r'^(?P<type>POINT|LINESTRING|LINEARRING|POLYGON|MULTIPOINT|MULTILINESTRING|MULTIPOLYGON|GEOMETRYCOLLECTION)[ACEGIMLONPSRUTY\d,\.\-\(\) ]+$', re.I)
+json_regex = re.compile(r'^\{[\s\w,\-\.\"\'\:\[\]]+\}$')
+
+#### OGRGeometry Class ####
+class OGRGeometry(object):
+    "Generally encapsulates an OGR geometry."
+
+    def __init__(self, geom_input, srs=None):
+        "Initializes Geometry on either WKT or an OGR pointer as input."
+
+        self._ptr = c_void_p(None) # Initially NULL
+        str_instance = isinstance(geom_input, basestring)
+
+        # If HEX, unpack input to to a binary buffer.
+        if str_instance and hex_regex.match(geom_input):
+            geom_input = buffer(a2b_hex(geom_input.upper()))
+            str_instance = False
+
+        # Constructing the geometry, 
+        if str_instance:
+            # Checking if unicode
+            if isinstance(geom_input, UnicodeType):
+                # Encoding to ASCII, WKT or HEX doesn't need any more.
+                geo_input = geo_input.encode('ascii')
+
+            wkt_m = wkt_regex.match(geom_input)
+            json_m = json_regex.match(geom_input)
+            if wkt_m:
+                if wkt_m.group('type').upper() == 'LINEARRING':
+                    # OGR_G_CreateFromWkt doesn't work with LINEARRING WKT.
+                    #  See http://trac.osgeo.org/gdal/ticket/1992.
+                    g = create_geom(OGRGeomType(wkt_m.group('type')).num)
+                    import_wkt(g, byref(c_char_p(geom_input)))
+                else:
+                    g = from_wkt(byref(c_char_p(geom_input)), None, byref(c_void_p()))
+            elif json_m:
+                if GEOJSON:
+                    g = from_json(geom_input)
+                else:
+                    raise NotImplementedError('GeoJSON input only supported on GDAL 1.5+.')
+            else:
+                # Seeing if the input is a valid short-hand string
+                # (e.g., 'Point', 'POLYGON').
+                ogr_t = OGRGeomType(geom_input)
+                g = create_geom(OGRGeomType(geom_input).num)
+        elif isinstance(geom_input, buffer):
+            # WKB was passed in
+            g = from_wkb(str(geom_input), None, byref(c_void_p()), len(geom_input))
+        elif isinstance(geom_input, OGRGeomType):
+            # OGRGeomType was passed in, an empty geometry will be created.
+            g = create_geom(geom_input.num)
+        elif isinstance(geom_input, c_void_p):
+            # OGR pointer (c_void_p) was the input.
+            g = geom_input
+        else:
+            raise OGRException('Invalid input type for OGR Geometry construction: %s' % type(geom_input))
+
+        # Now checking the Geometry pointer before finishing initialization
+        # by setting the pointer for the object.
+        if not g:
+            raise OGRException('Cannot create OGR Geometry from input: %s' % str(geom_input))
+        self._ptr = g
+
+        # Assigning the SpatialReference object to the geometry, if valid.
+        if bool(srs): self.srs = srs
+
+        # Setting the class depending upon the OGR Geometry Type
+        self.__class__ = GEO_CLASSES[self.geom_type.num]
+
+    def __del__(self):
+        "Deletes this Geometry."
+        if self._ptr: destroy_geom(self._ptr)
+
+    ### Geometry set-like operations ###
+    # g = g1 | g2
+    def __or__(self, other):
+        "Returns the union of the two geometries."
+        return self.union(other)
+
+    # g = g1 & g2
+    def __and__(self, other):
+        "Returns the intersection of this Geometry and the other."
+        return self.intersection(other)
+
+    # g = g1 - g2
+    def __sub__(self, other):
+        "Return the difference this Geometry and the other."
+        return self.difference(other)
+
+    # g = g1 ^ g2
+    def __xor__(self, other):
+        "Return the symmetric difference of this Geometry and the other."
+        return self.sym_difference(other)
+
+    def __eq__(self, other):
+        "Is this Geometry equal to the other?"
+        return self.equals(other)
+
+    def __ne__(self, other):
+        "Tests for inequality."
+        return not self.equals(other)
+
+    def __str__(self):
+        "WKT is used for the string representation."
+        return self.wkt
+
+    #### Geometry Properties ####
+    @property
+    def dimension(self):
+        "Returns 0 for points, 1 for lines, and 2 for surfaces."
+        return get_dims(self._ptr)
+
+    @property
+    def coord_dim(self):
+        "Returns the coordinate dimension of the Geometry."
+        return get_coord_dims(self._ptr)
+
+    @property
+    def geom_count(self):
+        "The number of elements in this Geometry."
+        return get_geom_count(self._ptr)
+
+    @property
+    def point_count(self):
+        "Returns the number of Points in this Geometry."
+        return get_point_count(self._ptr)
+
+    @property
+    def num_points(self):
+        "Alias for `point_count` (same name method in GEOS API.)"
+        return self.point_count
+
+    @property
+    def num_coords(self):
+        "Alais for `point_count`."
+        return self.point_count
+
+    @property
+    def geom_type(self):
+        "Returns the Type for this Geometry."
+        try:
+            return OGRGeomType(get_geom_type(self._ptr))
+        except OGRException:
+            # VRT datasources return an invalid geometry type
+            # number, but a valid name -- we'll try that instead.
+            # See: http://trac.osgeo.org/gdal/ticket/2491
+            return OGRGeomType(get_geom_name(self._ptr))
+
+    @property
+    def geom_name(self):
+        "Returns the Name of this Geometry."
+        return get_geom_name(self._ptr)
+
+    @property
+    def area(self):
+        "Returns the area for a LinearRing, Polygon, or MultiPolygon; 0 otherwise."
+        return get_area(self._ptr)
+
+    @property
+    def envelope(self):
+        "Returns the envelope for this Geometry."
+        # TODO: Fix Envelope() for Point geometries.
+        return Envelope(get_envelope(self._ptr, byref(OGREnvelope())))
+
+    @property
+    def extent(self):
+        "Returns the envelope as a 4-tuple, instead of as an Envelope object."
+        return self.envelope.tuple
+
+    #### SpatialReference-related Properties ####
+    
+    # The SRS property
+    def get_srs(self):
+        "Returns the Spatial Reference for this Geometry."
+        try:
+            srs_ptr = get_geom_srs(self._ptr)
+            return SpatialReference(clone_srs(srs_ptr))
+        except SRSException:
+            return None
+
+    def set_srs(self, srs):
+        "Sets the SpatialReference for this geometry."
+        if isinstance(srs, SpatialReference):
+            srs_ptr = clone_srs(srs._ptr)
+        elif isinstance(srs, (int, long, basestring)):
+            sr = SpatialReference(srs)
+            srs_ptr = clone_srs(sr._ptr)
+        else:
+            raise TypeError('Cannot assign spatial reference with object of type: %s' % type(srs))
+        assign_srs(self._ptr, srs_ptr)
+
+    srs = property(get_srs, set_srs)
+
+    # The SRID property
+    def get_srid(self):
+        if self.srs: return self.srs.srid
+        else: return None
+
+    def set_srid(self, srid):
+        if isinstance(srid, (int, long)):
+            self.srs = srid
+        else:
+            raise TypeError('SRID must be set with an integer.')
+
+    srid = property(get_srid, set_srid)
+
+    #### Output Methods ####
+    @property
+    def geos(self):
+        "Returns a GEOSGeometry object from this OGRGeometry."
+        from django.contrib.gis.geos import GEOSGeometry
+        return GEOSGeometry(self.wkb, self.srid)
+
+    @property
+    def gml(self):
+        "Returns the GML representation of the Geometry."
+        return to_gml(self._ptr)
+
+    @property
+    def hex(self):
+        "Returns the hexadecimal representation of the WKB (a string)."
+        return str(self.wkb).encode('hex').upper()
+        #return b2a_hex(self.wkb).upper()
+
+    @property
+    def json(self):
+        if GEOJSON: 
+            return to_json(self._ptr)
+        else:
+            raise NotImplementedError('GeoJSON output only supported on GDAL 1.5+.')
+    geojson = json
+
+    @property
+    def wkb_size(self):
+        "Returns the size of the WKB buffer."
+        return get_wkbsize(self._ptr)
+
+    @property
+    def wkb(self):
+        "Returns the WKB representation of the Geometry."
+        if sys.byteorder == 'little':
+            byteorder = 1 # wkbNDR (from ogr_core.h)
+        else:
+            byteorder = 0 # wkbXDR
+        sz = self.wkb_size
+        # Creating the unsigned character buffer, and passing it in by reference.
+        buf = (c_ubyte * sz)()
+        wkb = to_wkb(self._ptr, byteorder, byref(buf))
+        # Returning a buffer of the string at the pointer.
+        return buffer(string_at(buf, sz))
+
+    @property
+    def wkt(self):
+        "Returns the WKT representation of the Geometry."
+        return to_wkt(self._ptr, byref(c_char_p()))
+    
+    #### Geometry Methods ####
+    def clone(self):
+        "Clones this OGR Geometry."
+        return OGRGeometry(clone_geom(self._ptr), self.srs)
+
+    def close_rings(self):
+        """
+        If there are any rings within this geometry that have not been
+        closed, this routine will do so by adding the starting point at the
+        end.
+        """
+        # Closing the open rings.
+        geom_close_rings(self._ptr)
+
+    def transform(self, coord_trans, clone=False):
+        """
+        Transforms this geometry to a different spatial reference system.
+        May take a CoordTransform object, a SpatialReference object, string
+        WKT or PROJ.4, and/or an integer SRID.  By default nothing is returned
+        and the geometry is transformed in-place.  However, if the `clone`
+        keyword is set, then a transformed clone of this geometry will be
+        returned.
+        """
+        if clone:
+            klone = self.clone()
+            klone.transform(coord_trans)
+            return klone
+        if isinstance(coord_trans, CoordTransform):
+            geom_transform(self._ptr, coord_trans._ptr)
+        elif isinstance(coord_trans, SpatialReference):
+            geom_transform_to(self._ptr, coord_trans._ptr)
+        elif isinstance(coord_trans, (int, long, basestring)):
+            sr = SpatialReference(coord_trans)
+            geom_transform_to(self._ptr, sr._ptr)
+        else:
+            raise TypeError('Transform only accepts CoordTransform, SpatialReference, string, and integer objects.')
+
+    def transform_to(self, srs):
+        "For backwards-compatibility."
+        self.transform(srs)
+
+    #### Topology Methods ####
+    def _topology(self, func, other):
+        """A generalized function for topology operations, takes a GDAL function and
+        the other geometry to perform the operation on."""
+        if not isinstance(other, OGRGeometry):
+            raise TypeError('Must use another OGRGeometry object for topology operations!')
+
+        # Returning the output of the given function with the other geometry's
+        # pointer.
+        return func(self._ptr, other._ptr)
+
+    def intersects(self, other):
+        "Returns True if this geometry intersects with the other."
+        return self._topology(ogr_intersects, other)
+    
+    def equals(self, other):
+        "Returns True if this geometry is equivalent to the other."
+        return self._topology(ogr_equals, other)
+
+    def disjoint(self, other):
+        "Returns True if this geometry and the other are spatially disjoint."
+        return self._topology(ogr_disjoint, other)
+
+    def touches(self, other):
+        "Returns True if this geometry touches the other."
+        return self._topology(ogr_touches, other)
+
+    def crosses(self, other):
+        "Returns True if this geometry crosses the other."
+        return self._topology(ogr_crosses, other)
+
+    def within(self, other):
+        "Returns True if this geometry is within the other."
+        return self._topology(ogr_within, other)
+
+    def contains(self, other):
+        "Returns True if this geometry contains the other."
+        return self._topology(ogr_contains, other)
+
+    def overlaps(self, other):
+        "Returns True if this geometry overlaps the other."
+        return self._topology(ogr_overlaps, other)
+
+    #### Geometry-generation Methods ####
+    def _geomgen(self, gen_func, other=None):
+        "A helper routine for the OGR routines that generate geometries."
+        if isinstance(other, OGRGeometry):
+            return OGRGeometry(gen_func(self._ptr, other._ptr), self.srs)
+        else:
+            return OGRGeometry(gen_func(self._ptr), self.srs)
+
+    @property
+    def boundary(self):
+        "Returns the boundary of this geometry."
+        return self._geomgen(get_boundary)
+
+    @property
+    def convex_hull(self):
+        """
+        Returns the smallest convex Polygon that contains all the points in 
+        this Geometry.
+        """
+        return self._geomgen(geom_convex_hull)
+
+    def difference(self, other):
+        """
+        Returns a new geometry consisting of the region which is the difference
+        of this geometry and the other.
+        """
+        return self._geomgen(geom_diff, other)
+
+    def intersection(self, other):
+        """
+        Returns a new geometry consisting of the region of intersection of this
+        geometry and the other.
+        """
+        return self._geomgen(geom_intersection, other)
+
+    def sym_difference(self, other):
+        """                                                                                                                                                
+        Returns a new geometry which is the symmetric difference of this
+        geometry and the other.
+        """
+        return self._geomgen(geom_sym_diff, other)
+
+    def union(self, other):
+        """
+        Returns a new geometry consisting of the region which is the union of
+        this geometry and the other.
+        """
+        return self._geomgen(geom_union, other)
+
+# The subclasses for OGR Geometry.
+class Point(OGRGeometry):
+
+    @property
+    def x(self):
+        "Returns the X coordinate for this Point."
+        return getx(self._ptr, 0)
+
+    @property
+    def y(self):
+        "Returns the Y coordinate for this Point."
+        return gety(self._ptr, 0)
+
+    @property
+    def z(self):
+        "Returns the Z coordinate for this Point."
+        if self.coord_dim == 3:
+            return getz(self._ptr, 0)
+
+    @property
+    def tuple(self):
+        "Returns the tuple of this point."
+        if self.coord_dim == 2:
+            return (self.x, self.y)
+        elif self.coord_dim == 3:
+            return (self.x, self.y, self.z)
+    coords = tuple
+
+class LineString(OGRGeometry):
+
+    def __getitem__(self, index):
+        "Returns the Point at the given index."
+        if index >= 0 and index < self.point_count:
+            x, y, z = c_double(), c_double(), c_double()
+            get_point(self._ptr, index, byref(x), byref(y), byref(z))
+            dim = self.coord_dim
+            if dim == 1:
+                return (x.value,)
+            elif dim == 2:
+                return (x.value, y.value)
+            elif dim == 3:
+                return (x.value, y.value, z.value)
+        else:
+            raise OGRIndexError('index out of range: %s' % str(index))
+
+    def __iter__(self):
+        "Iterates over each point in the LineString."
+        for i in xrange(self.point_count):
+            yield self[i]
+
+    def __len__(self):
+        "The length returns the number of points in the LineString."
+        return self.point_count
+
+    @property
+    def tuple(self):
+        "Returns the tuple representation of this LineString."
+        return tuple([self[i] for i in xrange(len(self))])
+    coords = tuple
+
+    def _listarr(self, func):
+        """
+        Internal routine that returns a sequence (list) corresponding with
+        the given function.
+        """
+        return [func(self._ptr, i) for i in xrange(len(self))]
+
+    @property
+    def x(self):
+        "Returns the X coordinates in a list."
+        return self._listarr(getx)
+
+    @property
+    def y(self):
+        "Returns the Y coordinates in a list."
+        return self._listarr(gety)
+    
+    @property
+    def z(self):
+        "Returns the Z coordinates in a list."
+        if self.coord_dim == 3:
+            return self._listarr(getz)
+
+# LinearRings are used in Polygons.
+class LinearRing(LineString): pass
+
+class Polygon(OGRGeometry):
+
+    def __len__(self):
+        "The number of interior rings in this Polygon."
+        return self.geom_count
+
+    def __iter__(self):
+        "Iterates through each ring in the Polygon."
+        for i in xrange(self.geom_count):
+            yield self[i]
+
+    def __getitem__(self, index):
+        "Gets the ring at the specified index."
+        if index < 0 or index >= self.geom_count:
+            raise OGRIndexError('index out of range: %s' % index)
+        else:
+            return OGRGeometry(clone_geom(get_geom_ref(self._ptr, index)), self.srs)
+
+    # Polygon Properties
+    @property
+    def shell(self):
+        "Returns the shell of this Polygon."
+        return self[0] # First ring is the shell
+    exterior_ring = shell
+
+    @property
+    def tuple(self):
+        "Returns a tuple of LinearRing coordinate tuples."
+        return tuple([self[i].tuple for i in xrange(self.geom_count)])
+    coords = tuple
+
+    @property
+    def point_count(self):
+        "The number of Points in this Polygon."
+        # Summing up the number of points in each ring of the Polygon.
+        return sum([self[i].point_count for i in xrange(self.geom_count)])
+
+    @property
+    def centroid(self):
+        "Returns the centroid (a Point) of this Polygon."
+        # The centroid is a Point, create a geometry for this.
+        p = OGRGeometry(OGRGeomType('Point'))
+        get_centroid(self._ptr, p._ptr)
+        return p
+
+# Geometry Collection base class.
+class GeometryCollection(OGRGeometry):
+    "The Geometry Collection class."
+
+    def __getitem__(self, index):
+        "Gets the Geometry at the specified index."
+        if index < 0 or index >= self.geom_count:
+            raise OGRIndexError('index out of range: %s' % index)
+        else:
+            return OGRGeometry(clone_geom(get_geom_ref(self._ptr, index)), self.srs)
+        
+    def __iter__(self):
+        "Iterates over each Geometry."
+        for i in xrange(self.geom_count):
+            yield self[i]
+
+    def __len__(self):
+        "The number of geometries in this Geometry Collection."
+        return self.geom_count
+
+    def add(self, geom):
+        "Add the geometry to this Geometry Collection."
+        if isinstance(geom, OGRGeometry):
+            if isinstance(geom, self.__class__):
+                for g in geom: add_geom(self._ptr, g._ptr)
+            else:
+                add_geom(self._ptr, geom._ptr)
+        elif isinstance(geom, basestring):
+            tmp = OGRGeometry(geom)
+            add_geom(self._ptr, tmp._ptr)
+        else:
+            raise OGRException('Must add an OGRGeometry.')
+
+    @property
+    def point_count(self):
+        "The number of Points in this Geometry Collection."
+        # Summing up the number of points in each geometry in this collection
+        return sum([self[i].point_count for i in xrange(self.geom_count)])
+
+    @property
+    def tuple(self):
+        "Returns a tuple representation of this Geometry Collection."
+        return tuple([self[i].tuple for i in xrange(self.geom_count)])
+    coords = tuple
+
+# Multiple Geometry types.
+class MultiPoint(GeometryCollection): pass
+class MultiLineString(GeometryCollection): pass
+class MultiPolygon(GeometryCollection): pass
+
+# Class mapping dictionary (using the OGRwkbGeometryType as the key)
+GEO_CLASSES = {1 : Point,
+               2 : LineString,
+               3 : Polygon,
+               4 : MultiPoint,
+               5 : MultiLineString,
+               6 : MultiPolygon,
+               7 : GeometryCollection,
+               101: LinearRing, 
+               }
diff --git a/webapp/django/contrib/gis/gdal/geomtype.py b/webapp/django/contrib/gis/gdal/geomtype.py
new file mode 100644
index 0000000..565326f
--- /dev/null
+++ b/webapp/django/contrib/gis/gdal/geomtype.py
@@ -0,0 +1,73 @@
+from django.contrib.gis.gdal.error import OGRException
+
+#### OGRGeomType ####
+class OGRGeomType(object):
+    "Encapulates OGR Geometry Types."
+
+    # Dictionary of acceptable OGRwkbGeometryType s and their string names.
+    _types = {0 : 'Unknown',
+              1 : 'Point',
+              2 : 'LineString',
+              3 : 'Polygon',
+              4 : 'MultiPoint',
+              5 : 'MultiLineString',
+              6 : 'MultiPolygon',
+              7 : 'GeometryCollection',
+              100 : 'None',
+              101 : 'LinearRing',
+              }
+    # Reverse type dictionary, keyed by lower-case of the name.
+    _str_types = dict([(v.lower(), k) for k, v in _types.items()])
+
+    def __init__(self, type_input):
+        "Figures out the correct OGR Type based upon the input."
+        if isinstance(type_input, OGRGeomType):
+            num = type_input.num
+        elif isinstance(type_input, basestring):
+            num = self._str_types.get(type_input.lower(), None)
+            if num is None:
+                raise OGRException('Invalid OGR String Type "%s"' % type_input)
+        elif isinstance(type_input, int):
+            if not type_input in self._types:
+                raise OGRException('Invalid OGR Integer Type: %d' % type_input)
+            num = type_input
+        else:
+            raise TypeError('Invalid OGR input type given.')
+        
+        # Setting the OGR geometry type number.
+        self.num = num
+
+    def __str__(self):
+        "Returns the value of the name property."
+        return self.name
+
+    def __eq__(self, other):
+        """
+        Does an equivalence test on the OGR type with the given
+        other OGRGeomType, the short-hand string, or the integer.
+        """
+        if isinstance(other, OGRGeomType):
+            return self.num == other.num
+        elif isinstance(other, basestring):
+            return self.name.lower() == other.lower()
+        elif isinstance(other, int):
+            return self.num == other
+        else:
+            return False
+
+    def __ne__(self, other):
+        return not (self == other)
+
+    @property
+    def name(self):
+        "Returns a short-hand string form of the OGR Geometry type."
+        return self._types[self.num]
+
+    @property
+    def django(self):
+        "Returns the Django GeometryField for this OGR Type."
+        s = self.name
+        if s in ('Unknown', 'LinearRing', 'None'):
+            return None
+        else:
+            return s + 'Field'
diff --git a/webapp/django/contrib/gis/gdal/layer.py b/webapp/django/contrib/gis/gdal/layer.py
new file mode 100644
index 0000000..d60e2cb
--- /dev/null
+++ b/webapp/django/contrib/gis/gdal/layer.py
@@ -0,0 +1,187 @@
+# Needed ctypes routines
+from ctypes import byref
+
+# Other GDAL imports.
+from django.contrib.gis.gdal.envelope import Envelope, OGREnvelope
+from django.contrib.gis.gdal.error import OGRException, OGRIndexError, SRSException
+from django.contrib.gis.gdal.feature import Feature
+from django.contrib.gis.gdal.field import FIELD_CLASSES
+from django.contrib.gis.gdal.geometries import OGRGeomType
+from django.contrib.gis.gdal.srs import SpatialReference
+
+# GDAL ctypes function prototypes.
+from django.contrib.gis.gdal.prototypes.ds import \
+    get_extent, get_fd_geom_type, get_fd_name, get_feature, get_feature_count, \
+    get_field_count, get_field_defn, get_field_name, get_field_precision, \
+    get_field_width, get_field_type, get_layer_defn, get_layer_srs, \
+    get_next_feature, reset_reading, test_capability
+from django.contrib.gis.gdal.prototypes.srs import clone_srs
+
+# For more information, see the OGR C API source code:
+#  http://www.gdal.org/ogr/ogr__api_8h.html
+#
+# The OGR_L_* routines are relevant here.
+class Layer(object):
+    "A class that wraps an OGR Layer, needs to be instantiated from a DataSource object."
+
+    #### Python 'magic' routines ####
+    def __init__(self, layer_ptr):
+        "Needs a C pointer (Python/ctypes integer) in order to initialize."
+        self._ptr = None # Initially NULL
+        if not layer_ptr:
+            raise OGRException('Cannot create Layer, invalid pointer given')
+        self._ptr = layer_ptr
+        self._ldefn = get_layer_defn(self._ptr)
+        # Does the Layer support random reading?
+        self._random_read = self.test_capability('RandomRead')
+
+    def __getitem__(self, index):
+        "Gets the Feature at the specified index."
+        if isinstance(index, (int, long)):
+            # An integer index was given -- we cannot do a check based on the
+            # number of features because the beginning and ending feature IDs
+            # are not guaranteed to be 0 and len(layer)-1, respectively.
+            if index < 0: raise OGRIndexError('Negative indices are not allowed on OGR Layers.')
+            return self._make_feature(index)
+        elif isinstance(index, slice):
+            # A slice was given
+            start, stop, stride = index.indices(self.num_feat)
+            return [self._make_feature(fid) for fid in xrange(start, stop, stride)]
+        else:
+            raise TypeError('Integers and slices may only be used when indexing OGR Layers.')
+
+    def __iter__(self):
+        "Iterates over each Feature in the Layer."
+        # ResetReading() must be called before iteration is to begin.
+        reset_reading(self._ptr)
+        for i in xrange(self.num_feat):
+            yield Feature(get_next_feature(self._ptr), self._ldefn)
+
+    def __len__(self):
+        "The length is the number of features."
+        return self.num_feat
+
+    def __str__(self):
+        "The string name of the layer."
+        return self.name
+
+    def _make_feature(self, feat_id):
+        """
+        Helper routine for __getitem__ that constructs a Feature from the given
+        Feature ID.  If the OGR Layer does not support random-access reading,
+        then each feature of the layer will be incremented through until the
+        a Feature is found matching the given feature ID.
+        """
+        if self._random_read:
+            # If the Layer supports random reading, return.
+            try:
+                return Feature(get_feature(self._ptr, feat_id), self._ldefn)
+            except OGRException:
+                pass
+        else:
+            # Random access isn't supported, have to increment through
+            # each feature until the given feature ID is encountered.
+            for feat in self:
+                if feat.fid == feat_id: return feat
+        # Should have returned a Feature, raise an OGRIndexError.    
+        raise OGRIndexError('Invalid feature id: %s.' % feat_id)
+
+    #### Layer properties ####
+    @property
+    def extent(self):
+        "Returns the extent (an Envelope) of this layer."
+        env = OGREnvelope()
+        get_extent(self._ptr, byref(env), 1)
+        return Envelope(env)
+
+    @property
+    def name(self):
+        "Returns the name of this layer in the Data Source."
+        return get_fd_name(self._ldefn)
+
+    @property
+    def num_feat(self, force=1):
+        "Returns the number of features in the Layer."
+        return get_feature_count(self._ptr, force)
+
+    @property
+    def num_fields(self):
+        "Returns the number of fields in the Layer."
+        return get_field_count(self._ldefn)
+
+    @property
+    def geom_type(self):
+        "Returns the geometry type (OGRGeomType) of the Layer."
+        return OGRGeomType(get_fd_geom_type(self._ldefn))
+
+    @property
+    def srs(self):
+        "Returns the Spatial Reference used in this Layer."
+        try:
+            ptr = get_layer_srs(self._ptr)
+            return SpatialReference(clone_srs(ptr))
+        except SRSException:
+            return None
+
+    @property
+    def fields(self):
+        """
+        Returns a list of string names corresponding to each of the Fields
+        available in this Layer.
+        """
+        return [get_field_name(get_field_defn(self._ldefn, i)) 
+                for i in xrange(self.num_fields) ]
+    
+    @property
+    def field_types(self):
+        """
+        Returns a list of the types of fields in this Layer.  For example,
+        the list [OFTInteger, OFTReal, OFTString] would be returned for
+        an OGR layer that had an integer, a floating-point, and string
+        fields.
+        """
+        return [FIELD_CLASSES[get_field_type(get_field_defn(self._ldefn, i))]
+                for i in xrange(self.num_fields)]
+
+    @property 
+    def field_widths(self):
+        "Returns a list of the maximum field widths for the features."
+        return [get_field_width(get_field_defn(self._ldefn, i))
+                for i in xrange(self.num_fields)]
+
+    @property 
+    def field_precisions(self):
+        "Returns the field precisions for the features."
+        return [get_field_precision(get_field_defn(self._ldefn, i))
+                for i in xrange(self.num_fields)]
+
+    #### Layer Methods ####
+    def get_fields(self, field_name):
+        """
+        Returns a list containing the given field name for every Feature
+        in the Layer.
+        """
+        if not field_name in self.fields:
+            raise OGRException('invalid field name: %s' % field_name)
+        return [feat.get(field_name) for feat in self]
+
+    def get_geoms(self, geos=False):
+        """
+        Returns a list containing the OGRGeometry for every Feature in
+        the Layer.
+        """
+        if geos:
+            from django.contrib.gis.geos import GEOSGeometry
+            return [GEOSGeometry(feat.geom.wkb) for feat in self]
+        else:
+            return [feat.geom for feat in self]
+
+    def test_capability(self, capability):
+        """
+        Returns a bool indicating whether the this Layer supports the given
+        capability (a string).  Valid capability strings include:
+          'RandomRead', 'SequentialWrite', 'RandomWrite', 'FastSpatialFilter',
+          'FastFeatureCount', 'FastGetExtent', 'CreateField', 'Transactions',
+          'DeleteFeature', and 'FastSetNextByIndex'.
+        """
+        return bool(test_capability(self._ptr, capability))
diff --git a/webapp/django/contrib/gis/gdal/libgdal.py b/webapp/django/contrib/gis/gdal/libgdal.py
new file mode 100644
index 0000000..bf8933d
--- /dev/null
+++ b/webapp/django/contrib/gis/gdal/libgdal.py
@@ -0,0 +1,83 @@
+import os, sys
+from ctypes import c_char_p, CDLL
+from ctypes.util import find_library
+from django.contrib.gis.gdal.error import OGRException
+
+# Custom library path set?
+try:
+    from django.conf import settings
+    lib_path = settings.GDAL_LIBRARY_PATH
+except (AttributeError, EnvironmentError, ImportError):
+    lib_path = None
+
+if lib_path:
+    lib_names = None
+elif os.name == 'nt':
+    # Windows NT shared library
+    lib_names = ['gdal15']
+elif os.name == 'posix':
+    # *NIX library names.
+    lib_names = ['gdal', 'gdal1.5.0']
+else:
+    raise OGRException('Unsupported OS "%s"' % os.name)
+
+# Using the ctypes `find_library` utility  to find the 
+# path to the GDAL library from the list of library names.
+if lib_names:
+    for lib_name in lib_names:
+        lib_path = find_library(lib_name)
+        if not lib_path is None: break
+        
+if lib_path is None:
+    raise OGRException('Could not find the GDAL library (tried "%s"). '
+                       'Try setting GDAL_LIBRARY_PATH in your settings.' % 
+                       '", "'.join(lib_names))
+
+# This loads the GDAL/OGR C library
+lgdal = CDLL(lib_path)
+
+# On Windows, the GDAL binaries have some OSR routines exported with 
+# STDCALL, while others are not.  Thus, the library will also need to 
+# be loaded up as WinDLL for said OSR functions that require the 
+# different calling convention.
+if os.name == 'nt':
+    from ctypes import WinDLL
+    lwingdal = WinDLL(lib_name)
+
+def std_call(func):
+    """
+    Returns the correct STDCALL function for certain OSR routines on Win32
+    platforms.
+    """
+    if os.name == 'nt':
+        return lwingdal[func]
+    else:
+        return lgdal[func]
+
+#### Version-information functions. ####
+
+# Returns GDAL library version information with the given key.
+_version_info = std_call('GDALVersionInfo')
+_version_info.argtypes = [c_char_p]
+_version_info.restype = c_char_p
+
+def gdal_version():
+    "Returns only the GDAL version number information."
+    return _version_info('RELEASE_NAME')
+
+def gdal_full_version(): 
+    "Returns the full GDAL version information."
+    return _version_info('')
+
+def gdal_release_date(date=False): 
+    """
+    Returns the release date in a string format, e.g, "2007/06/27".
+    If the date keyword argument is set to True, a Python datetime object
+    will be returned instead.
+    """
+    from datetime import date as date_type
+    rel = _version_info('RELEASE_DATE')
+    yy, mm, dd = map(int, (rel[0:4], rel[4:6], rel[6:8]))
+    d = date_type(yy, mm, dd)
+    if date: return d
+    else: return d.strftime('%Y/%m/%d')
diff --git a/webapp/django/contrib/gis/gdal/prototypes/__init__.py b/webapp/django/contrib/gis/gdal/prototypes/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/gis/gdal/prototypes/__init__.py
diff --git a/webapp/django/contrib/gis/gdal/prototypes/ds.py b/webapp/django/contrib/gis/gdal/prototypes/ds.py
new file mode 100644
index 0000000..b64183e
--- /dev/null
+++ b/webapp/django/contrib/gis/gdal/prototypes/ds.py
@@ -0,0 +1,68 @@
+"""
+ This module houses the ctypes function prototypes for OGR DataSource
+ related data structures. OGR_Dr_*, OGR_DS_*, OGR_L_*, OGR_F_*, 
+ OGR_Fld_* routines are relevant here.
+"""
+from ctypes import c_char_p, c_int, c_long, c_void_p, POINTER
+from django.contrib.gis.gdal.envelope import OGREnvelope
+from django.contrib.gis.gdal.libgdal import lgdal
+from django.contrib.gis.gdal.prototypes.generation import \
+    const_string_output, double_output, geom_output, int_output, \
+    srs_output, void_output, voidptr_output
+
+c_int_p = POINTER(c_int) # shortcut type
+
+### Driver Routines ###
+register_all = void_output(lgdal.OGRRegisterAll, [], errcheck=False)
+cleanup_all = void_output(lgdal.OGRCleanupAll, [], errcheck=False)
+get_driver = voidptr_output(lgdal.OGRGetDriver, [c_int])
+get_driver_by_name = voidptr_output(lgdal.OGRGetDriverByName, [c_char_p])
+get_driver_count = int_output(lgdal.OGRGetDriverCount, [])
+get_driver_name = const_string_output(lgdal.OGR_Dr_GetName, [c_void_p])
+
+### DataSource ###
+open_ds = voidptr_output(lgdal.OGROpen, [c_char_p, c_int, POINTER(c_void_p)])
+destroy_ds = void_output(lgdal.OGR_DS_Destroy, [c_void_p], errcheck=False)
+release_ds = void_output(lgdal.OGRReleaseDataSource, [c_void_p])
+get_ds_name = const_string_output(lgdal.OGR_DS_GetName, [c_void_p])
+get_layer = voidptr_output(lgdal.OGR_DS_GetLayer, [c_void_p, c_int])
+get_layer_by_name = voidptr_output(lgdal.OGR_DS_GetLayerByName, [c_void_p, c_char_p])
+get_layer_count = int_output(lgdal.OGR_DS_GetLayerCount, [c_void_p])
+
+### Layer Routines ###
+get_extent = void_output(lgdal.OGR_L_GetExtent, [c_void_p, POINTER(OGREnvelope), c_int])
+get_feature = voidptr_output(lgdal.OGR_L_GetFeature, [c_void_p, c_long])
+get_feature_count = int_output(lgdal.OGR_L_GetFeatureCount, [c_void_p, c_int])
+get_layer_defn = voidptr_output(lgdal.OGR_L_GetLayerDefn, [c_void_p])
+get_layer_srs = srs_output(lgdal.OGR_L_GetSpatialRef, [c_void_p])
+get_next_feature = voidptr_output(lgdal.OGR_L_GetNextFeature, [c_void_p])
+reset_reading = void_output(lgdal.OGR_L_ResetReading, [c_void_p], errcheck=False)
+test_capability = int_output(lgdal.OGR_L_TestCapability, [c_void_p, c_char_p])
+
+### Feature Definition Routines ###
+get_fd_geom_type = int_output(lgdal.OGR_FD_GetGeomType, [c_void_p])
+get_fd_name = const_string_output(lgdal.OGR_FD_GetName, [c_void_p])
+get_feat_name = const_string_output(lgdal.OGR_FD_GetName, [c_void_p])
+get_field_count = int_output(lgdal.OGR_FD_GetFieldCount, [c_void_p])
+get_field_defn = voidptr_output(lgdal.OGR_FD_GetFieldDefn, [c_void_p, c_int])
+
+### Feature Routines ###
+clone_feature = voidptr_output(lgdal.OGR_F_Clone, [c_void_p])
+destroy_feature = void_output(lgdal.OGR_F_Destroy, [c_void_p], errcheck=False)
+feature_equal = int_output(lgdal.OGR_F_Equal, [c_void_p, c_void_p])
+get_feat_geom_ref = geom_output(lgdal.OGR_F_GetGeometryRef, [c_void_p])
+get_feat_field_count = int_output(lgdal.OGR_F_GetFieldCount, [c_void_p])
+get_feat_field_defn = voidptr_output(lgdal.OGR_F_GetFieldDefnRef, [c_void_p, c_int])
+get_fid = int_output(lgdal.OGR_F_GetFID, [c_void_p])
+get_field_as_datetime = int_output(lgdal.OGR_F_GetFieldAsDateTime, [c_void_p, c_int, c_int_p, c_int_p, c_int_p, c_int_p, c_int_p, c_int_p])
+get_field_as_double = double_output(lgdal.OGR_F_GetFieldAsDouble, [c_void_p, c_int])
+get_field_as_integer = int_output(lgdal.OGR_F_GetFieldAsInteger, [c_void_p, c_int])
+get_field_as_string = const_string_output(lgdal.OGR_F_GetFieldAsString, [c_void_p, c_int])
+get_field_index = int_output(lgdal.OGR_F_GetFieldIndex, [c_void_p, c_char_p])
+
+### Field Routines ###
+get_field_name = const_string_output(lgdal.OGR_Fld_GetNameRef, [c_void_p])
+get_field_precision = int_output(lgdal.OGR_Fld_GetPrecision, [c_void_p])
+get_field_type = int_output(lgdal.OGR_Fld_GetType, [c_void_p])
+get_field_type_name = const_string_output(lgdal.OGR_GetFieldTypeName, [c_int])
+get_field_width = int_output(lgdal.OGR_Fld_GetWidth, [c_void_p])
diff --git a/webapp/django/contrib/gis/gdal/prototypes/errcheck.py b/webapp/django/contrib/gis/gdal/prototypes/errcheck.py
new file mode 100644
index 0000000..c66be9a
--- /dev/null
+++ b/webapp/django/contrib/gis/gdal/prototypes/errcheck.py
@@ -0,0 +1,125 @@
+"""
+ This module houses the error-checking routines used by the GDAL
+ ctypes prototypes.
+"""
+from ctypes import c_void_p, string_at
+from django.contrib.gis.gdal.error import check_err, OGRException, SRSException
+from django.contrib.gis.gdal.libgdal import lgdal
+
+# Helper routines for retrieving pointers and/or values from 
+# arguments passed in by reference. 
+def arg_byref(args, offset=-1):
+    "Returns the pointer argument's by-refernece value."
+    return args[offset]._obj.value
+
+def ptr_byref(args, offset=-1):
+    "Returns the pointer argument passed in by-reference."
+    return args[offset]._obj
+
+def check_bool(result, func, cargs):
+    "Returns the boolean evaluation of the value."
+    if bool(result): return True
+    else: return False
+
+### String checking Routines ###
+def check_const_string(result, func, cargs, offset=None):
+    """
+    Similar functionality to `check_string`, but does not free the pointer.
+    """
+    if offset:
+        check_err(result)
+        ptr = ptr_byref(cargs, offset)
+        return ptr.value
+    else:
+        return result
+
+def check_string(result, func, cargs, offset=-1, str_result=False):
+    """
+    Checks the string output returned from the given function, and frees
+    the string pointer allocated by OGR.  The `str_result` keyword
+    may be used when the result is the string pointer, otherwise
+    the OGR error code is assumed.  The `offset` keyword may be used
+    to extract the string pointer passed in by-reference at the given
+    slice offset in the function arguments.
+    """
+    if str_result:
+        # For routines that return a string.
+        ptr = result
+        if not ptr: s = None
+        else: s = string_at(result)
+    else:
+        # Error-code return specified.
+        check_err(result)
+        ptr = ptr_byref(cargs, offset)
+        # Getting the string value
+        s = ptr.value
+    # Correctly freeing the allocated memory beind GDAL pointer 
+    # w/the VSIFree routine.
+    if ptr: lgdal.VSIFree(ptr)
+    return s
+
+### DataSource, Layer error-checking ###
+
+### Envelope checking ###
+def check_envelope(result, func, cargs, offset=-1):
+    "Checks a function that returns an OGR Envelope by reference."
+    env = ptr_byref(cargs, offset)
+    return env
+
+### Geometry error-checking routines ###
+def check_geom(result, func, cargs):
+    "Checks a function that returns a geometry."
+    # OGR_G_Clone may return an integer, even though the
+    # restype is set to c_void_p
+    if isinstance(result, int):
+        result = c_void_p(result)
+    if not result: 
+        raise OGRException('Invalid geometry pointer returned from "%s".' % func.__name__)
+    return result
+
+def check_geom_offset(result, func, cargs, offset=-1):
+    "Chcks the geometry at the given offset in the C parameter list."
+    check_err(result)
+    geom = ptr_byref(cargs, offset=offset)
+    return check_geom(geom, func, cargs)
+
+### Spatial Reference error-checking routines ###
+def check_srs(result, func, cargs):
+    if isinstance(result, int):
+        result = c_void_p(result)
+    if not result:
+        raise SRSException('Invalid spatial reference pointer returned from "%s".' % func.__name__)
+    return result
+
+### Other error-checking routines ###
+def check_arg_errcode(result, func, cargs):
+    """
+    The error code is returned in the last argument, by reference.
+    Check its value with `check_err` before returning the result.
+    """
+    check_err(arg_byref(cargs))
+    return result
+
+def check_errcode(result, func, cargs):
+    """
+    Check the error code returned (c_int).
+    """
+    check_err(result)
+    return
+
+def check_pointer(result, func, cargs):
+    "Makes sure the result pointer is valid."
+    if bool(result): 
+        return result
+    else: 
+        raise OGRException('Invalid pointer returned from "%s"' % func.__name__)
+
+def check_str_arg(result, func, cargs):
+    """
+    This is for the OSRGet[Angular|Linear]Units functions, which
+    require that the returned string pointer not be freed.  This
+    returns both the double and tring values.
+    """
+    dbl = result
+    ptr = cargs[-1]._obj
+    return dbl, ptr.value
diff --git a/webapp/django/contrib/gis/gdal/prototypes/generation.py b/webapp/django/contrib/gis/gdal/prototypes/generation.py
new file mode 100644
index 0000000..bba715d
--- /dev/null
+++ b/webapp/django/contrib/gis/gdal/prototypes/generation.py
@@ -0,0 +1,116 @@
+"""
+ This module contains functions that generate ctypes prototypes for the
+ GDAL routines.
+"""
+
+from ctypes import c_char_p, c_double, c_int, c_void_p
+from django.contrib.gis.gdal.prototypes.errcheck import \
+    check_arg_errcode, check_errcode, check_geom, check_geom_offset, \
+    check_pointer, check_srs, check_str_arg, check_string, check_const_string
+
+def double_output(func, argtypes, errcheck=False, strarg=False):
+    "Generates a ctypes function that returns a double value."
+    func.argtypes = argtypes
+    func.restype = c_double
+    if errcheck: func.errcheck = check_arg_errcode
+    if strarg: func.errcheck = check_str_arg
+    return func
+
+def geom_output(func, argtypes, offset=None):
+    """
+    Generates a function that returns a Geometry either by reference
+    or directly (if the return_geom keyword is set to True).
+    """
+    # Setting the argument types
+    func.argtypes = argtypes
+
+    if not offset:
+        # When a geometry pointer is directly returned.
+        func.restype = c_void_p
+        func.errcheck = check_geom
+    else:
+        # Error code returned, geometry is returned by-reference.
+        func.restype = c_int
+        def geomerrcheck(result, func, cargs):
+            return check_geom_offset(result, func, cargs, offset)
+        func.errcheck = geomerrcheck
+
+    return func
+
+def int_output(func, argtypes):
+    "Generates a ctypes function that returns an integer value."
+    func.argtypes = argtypes
+    func.restype = c_int
+    return func
+
+def srs_output(func, argtypes):
+    """
+    Generates a ctypes prototype for the given function with
+    the given C arguments that returns a pointer to an OGR
+    Spatial Reference System.
+    """
+    func.argtypes = argtypes
+    func.restype = c_void_p
+    func.errcheck = check_srs
+    return func
+
+def const_string_output(func, argtypes, offset=None):
+    func.argtypes = argtypes
+    if offset:
+        func.restype = c_int
+    else:
+        func.restype = c_char_p
+
+    def _check_const(result, func, cargs):
+        return check_const_string(result, func, cargs, offset=offset)
+    func.errcheck = _check_const
+
+    return func
+
+def string_output(func, argtypes, offset=-1, str_result=False):
+    """
+    Generates a ctypes prototype for the given function with the
+    given argument types that returns a string from a GDAL pointer.
+    The `const` flag indicates whether the allocated pointer should 
+    be freed via the GDAL library routine VSIFree -- but only applies
+    only when `str_result` is True.
+    """
+    func.argtypes = argtypes
+    if str_result:
+        # String is the result, don't explicitly define
+        # the argument type so we can get the pointer.
+        pass
+    else:
+        # Error code is returned
+        func.restype = c_int
+
+    # Dynamically defining our error-checking function with the
+    # given offset.
+    def _check_str(result, func, cargs):
+        return check_string(result, func, cargs,
+                            offset=offset, str_result=str_result)
+    func.errcheck = _check_str
+    return func
+
+def void_output(func, argtypes, errcheck=True):
+    """
+    For functions that don't only return an error code that needs to
+    be examined.
+    """
+    if argtypes: func.argtypes = argtypes
+    if errcheck:
+        # `errcheck` keyword may be set to False for routines that
+        # return void, rather than a status code.
+        func.restype = c_int
+        func.errcheck = check_errcode
+    else:
+        func.restype = None
+        
+    return func
+
+def voidptr_output(func, argtypes):
+    "For functions that return c_void_p."
+    func.argtypes = argtypes
+    func.restype = c_void_p
+    func.errcheck = check_pointer
+    return func
diff --git a/webapp/django/contrib/gis/gdal/prototypes/geom.py b/webapp/django/contrib/gis/gdal/prototypes/geom.py
new file mode 100644
index 0000000..7757f55
--- /dev/null
+++ b/webapp/django/contrib/gis/gdal/prototypes/geom.py
@@ -0,0 +1,109 @@
+from datetime import date
+from ctypes import c_char, c_char_p, c_double, c_int, c_ubyte, c_void_p, POINTER
+from django.contrib.gis.gdal.envelope import OGREnvelope
+from django.contrib.gis.gdal.libgdal import lgdal, gdal_version
+from django.contrib.gis.gdal.prototypes.errcheck import check_bool, check_envelope
+from django.contrib.gis.gdal.prototypes.generation import \
+    const_string_output, double_output, geom_output, int_output, \
+    srs_output, string_output, void_output
+
+# Some prototypes need to be aware of what version GDAL we have.
+major, minor = map(int, gdal_version().split('.')[:2])
+if major <= 1 and minor <= 4:
+    GEOJSON = False
+else:
+    GEOJSON = True
+
+### Generation routines specific to this module ###
+def env_func(f, argtypes):
+    "For getting OGREnvelopes."
+    f.argtypes = argtypes
+    f.restype = None
+    f.errcheck = check_envelope
+    return f
+
+def pnt_func(f):
+    "For accessing point information."
+    return double_output(f, [c_void_p, c_int])
+
+def topology_func(f):
+    f.argtypes = [c_void_p, c_void_p]
+    f.restype = c_int
+    f.errchck = check_bool
+    return f
+
+### OGR_G ctypes function prototypes ###
+
+# GeoJSON routines, if supported.
+if GEOJSON:
+    from_json = geom_output(lgdal.OGR_G_CreateGeometryFromJson, [c_char_p])
+    to_json = string_output(lgdal.OGR_G_ExportToJson, [c_void_p], str_result=True)
+else:
+    from_json = False
+    to_json = False
+
+# GetX, GetY, GetZ all return doubles.
+getx = pnt_func(lgdal.OGR_G_GetX)
+gety = pnt_func(lgdal.OGR_G_GetY)
+getz = pnt_func(lgdal.OGR_G_GetZ)
+    
+# Geometry creation routines.
+from_wkb = geom_output(lgdal.OGR_G_CreateFromWkb, [c_char_p, c_void_p, POINTER(c_void_p), c_int], offset=-2)
+from_wkt = geom_output(lgdal.OGR_G_CreateFromWkt, [POINTER(c_char_p), c_void_p, POINTER(c_void_p)], offset=-1)
+create_geom = geom_output(lgdal.OGR_G_CreateGeometry, [c_int])
+clone_geom = geom_output(lgdal.OGR_G_Clone, [c_void_p])
+get_geom_ref = geom_output(lgdal.OGR_G_GetGeometryRef, [c_void_p, c_int])
+get_boundary = geom_output(lgdal.OGR_G_GetBoundary, [c_void_p])
+geom_convex_hull = geom_output(lgdal.OGR_G_ConvexHull, [c_void_p])
+geom_diff = geom_output(lgdal.OGR_G_Difference, [c_void_p, c_void_p])
+geom_intersection = geom_output(lgdal.OGR_G_Intersection, [c_void_p, c_void_p])
+geom_sym_diff = geom_output(lgdal.OGR_G_SymmetricDifference, [c_void_p, c_void_p])
+geom_union = geom_output(lgdal.OGR_G_Union, [c_void_p, c_void_p])
+
+# Geometry modification routines.
+add_geom = void_output(lgdal.OGR_G_AddGeometry, [c_void_p, c_void_p])
+import_wkt = void_output(lgdal.OGR_G_ImportFromWkt, [c_void_p, POINTER(c_char_p)])
+
+# Destroys a geometry
+destroy_geom = void_output(lgdal.OGR_G_DestroyGeometry, [c_void_p], errcheck=False)
+
+# Geometry export routines.
+to_wkb = void_output(lgdal.OGR_G_ExportToWkb, None, errcheck=True) # special handling for WKB.
+to_wkt = string_output(lgdal.OGR_G_ExportToWkt, [c_void_p, POINTER(c_char_p)])
+to_gml = string_output(lgdal.OGR_G_ExportToGML, [c_void_p], str_result=True)
+get_wkbsize = int_output(lgdal.OGR_G_WkbSize, [c_void_p])
+
+# Geometry spatial-reference related routines.
+assign_srs = void_output(lgdal.OGR_G_AssignSpatialReference, [c_void_p, c_void_p], errcheck=False)
+get_geom_srs = srs_output(lgdal.OGR_G_GetSpatialReference, [c_void_p])
+
+# Geometry properties
+get_area = double_output(lgdal.OGR_G_GetArea, [c_void_p])
+get_centroid = void_output(lgdal.OGR_G_Centroid, [c_void_p, c_void_p])
+get_dims = int_output(lgdal.OGR_G_GetDimension, [c_void_p])
+get_coord_dims = int_output(lgdal.OGR_G_GetCoordinateDimension, [c_void_p])
+
+get_geom_count = int_output(lgdal.OGR_G_GetGeometryCount, [c_void_p])
+get_geom_name = const_string_output(lgdal.OGR_G_GetGeometryName, [c_void_p])
+get_geom_type = int_output(lgdal.OGR_G_GetGeometryType, [c_void_p])
+get_point_count = int_output(lgdal.OGR_G_GetPointCount, [c_void_p])
+get_point = void_output(lgdal.OGR_G_GetPoint, [c_void_p, c_int, POINTER(c_double), POINTER(c_double), POINTER(c_double)], errcheck=False)
+geom_close_rings = void_output(lgdal.OGR_G_CloseRings, [c_void_p], errcheck=False)
+
+# Topology routines.
+ogr_contains = topology_func(lgdal.OGR_G_Contains)
+ogr_crosses = topology_func(lgdal.OGR_G_Crosses)
+ogr_disjoint = topology_func(lgdal.OGR_G_Disjoint)
+ogr_equals = topology_func(lgdal.OGR_G_Equals)
+ogr_intersects = topology_func(lgdal.OGR_G_Intersects)
+ogr_overlaps = topology_func(lgdal.OGR_G_Overlaps)
+ogr_touches = topology_func(lgdal.OGR_G_Touches)
+ogr_within = topology_func(lgdal.OGR_G_Within)
+
+# Transformation routines.
+geom_transform = void_output(lgdal.OGR_G_Transform, [c_void_p, c_void_p])
+geom_transform_to = void_output(lgdal.OGR_G_TransformTo, [c_void_p, c_void_p])
+
+# For retrieving the envelope of the geometry.
+get_envelope = env_func(lgdal.OGR_G_GetEnvelope, [c_void_p, POINTER(OGREnvelope)])
+
diff --git a/webapp/django/contrib/gis/gdal/prototypes/srs.py b/webapp/django/contrib/gis/gdal/prototypes/srs.py
new file mode 100644
index 0000000..ff4d0ad
--- /dev/null
+++ b/webapp/django/contrib/gis/gdal/prototypes/srs.py
@@ -0,0 +1,71 @@
+from ctypes import c_char_p, c_int, c_void_p, POINTER
+from django.contrib.gis.gdal.libgdal import lgdal, std_call
+from django.contrib.gis.gdal.prototypes.generation import \
+    const_string_output, double_output, int_output, \
+    srs_output, string_output, void_output
+
+## Shortcut generation for routines with known parameters.
+def srs_double(f):
+    """
+    Creates a function prototype for the OSR routines that take
+    the OSRSpatialReference object and
+    """
+    return double_output(f, [c_void_p, POINTER(c_int)], errcheck=True)
+
+def units_func(f):
+    """
+    Creates a ctypes function prototype for OSR units functions, e.g.,
+    OSRGetAngularUnits, OSRGetLinearUnits.
+    """
+    return double_output(f, [c_void_p, POINTER(c_char_p)], strarg=True)
+
+# Creation & destruction.
+clone_srs = srs_output(std_call('OSRClone'), [c_void_p])
+new_srs = srs_output(std_call('OSRNewSpatialReference'), [c_char_p])
+release_srs = void_output(lgdal.OSRRelease, [c_void_p], errcheck=False)
+destroy_srs = void_output(std_call('OSRDestroySpatialReference'), [c_void_p], errcheck=False)
+srs_validate = void_output(lgdal.OSRValidate, [c_void_p])
+
+# Getting the semi_major, semi_minor, and flattening functions.
+semi_major = srs_double(lgdal.OSRGetSemiMajor)
+semi_minor = srs_double(lgdal.OSRGetSemiMinor)
+invflattening = srs_double(lgdal.OSRGetInvFlattening)
+
+# WKT, PROJ, EPSG, XML importation routines.
+from_wkt = void_output(lgdal.OSRImportFromWkt, [c_void_p, POINTER(c_char_p)])
+from_proj = void_output(lgdal.OSRImportFromProj4, [c_void_p, c_char_p])
+from_epsg = void_output(std_call('OSRImportFromEPSG'), [c_void_p, c_int])
+from_xml = void_output(lgdal.OSRImportFromXML, [c_void_p, c_char_p])
+
+# Morphing to/from ESRI WKT.
+morph_to_esri = void_output(lgdal.OSRMorphToESRI, [c_void_p])
+morph_from_esri = void_output(lgdal.OSRMorphFromESRI, [c_void_p])
+
+# Identifying the EPSG
+identify_epsg = void_output(lgdal.OSRAutoIdentifyEPSG, [c_void_p])
+
+# Getting the angular_units, linear_units functions
+linear_units = units_func(lgdal.OSRGetLinearUnits)
+angular_units = units_func(lgdal.OSRGetAngularUnits)
+
+# For exporting to WKT, PROJ.4, "Pretty" WKT, and XML.
+to_wkt = string_output(std_call('OSRExportToWkt'), [c_void_p, POINTER(c_char_p)])
+to_proj = string_output(std_call('OSRExportToProj4'), [c_void_p, POINTER(c_char_p)])
+to_pretty_wkt = string_output(std_call('OSRExportToPrettyWkt'), [c_void_p, POINTER(c_char_p), c_int], offset=-2)
+
+# Memory leak fixed in GDAL 1.5; still exists in 1.4.
+to_xml = string_output(lgdal.OSRExportToXML, [c_void_p, POINTER(c_char_p), c_char_p], offset=-2)
+
+# String attribute retrival routines.
+get_attr_value = const_string_output(std_call('OSRGetAttrValue'), [c_void_p, c_char_p, c_int])
+get_auth_name = const_string_output(lgdal.OSRGetAuthorityName, [c_void_p, c_char_p])
+get_auth_code = const_string_output(lgdal.OSRGetAuthorityCode, [c_void_p, c_char_p])
+
+# SRS Properties
+isgeographic = int_output(lgdal.OSRIsGeographic, [c_void_p])
+islocal = int_output(lgdal.OSRIsLocal, [c_void_p])
+isprojected = int_output(lgdal.OSRIsProjected, [c_void_p])
+
+# Coordinate transformation
+new_ct= srs_output(std_call('OCTNewCoordinateTransformation'), [c_void_p, c_void_p])
+destroy_ct = void_output(std_call('OCTDestroyCoordinateTransformation'), [c_void_p], errcheck=False)
diff --git a/webapp/django/contrib/gis/gdal/srs.py b/webapp/django/contrib/gis/gdal/srs.py
new file mode 100644
index 0000000..d70e71e
--- /dev/null
+++ b/webapp/django/contrib/gis/gdal/srs.py
@@ -0,0 +1,360 @@
+"""
+  The Spatial Reference class, represensents OGR Spatial Reference objects.
+
+  Example:
+  >>> from django.contrib.gis.gdal import SpatialReference
+  >>> srs = SpatialReference('WGS84')
+  >>> print srs
+  GEOGCS["WGS 84",
+      DATUM["WGS_1984",
+          SPHEROID["WGS 84",6378137,298.257223563,
+              AUTHORITY["EPSG","7030"]],
+          TOWGS84[0,0,0,0,0,0,0],
+          AUTHORITY["EPSG","6326"]],
+      PRIMEM["Greenwich",0,
+          AUTHORITY["EPSG","8901"]],
+      UNIT["degree",0.01745329251994328,
+          AUTHORITY["EPSG","9122"]],
+      AUTHORITY["EPSG","4326"]]
+  >>> print srs.proj
+  +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs
+  >>> print srs.ellipsoid
+  (6378137.0, 6356752.3142451793, 298.25722356300003)
+  >>> print srs.projected, srs.geographic
+  False True
+  >>> srs.import_epsg(32140)
+  >>> print srs.name
+  NAD83 / Texas South Central
+"""
+import re
+from types import UnicodeType, TupleType
+from ctypes import byref, c_char_p, c_int, c_void_p
+
+# Getting the error checking routine and exceptions
+from django.contrib.gis.gdal.error import OGRException, SRSException
+from django.contrib.gis.gdal.prototypes.srs import *
+
+#### Spatial Reference class. ####
+class SpatialReference(object):
+    """
+    A wrapper for the OGRSpatialReference object.  According to the GDAL website,
+    the SpatialReference object "provide[s] services to represent coordinate 
+    systems (projections and datums) and to transform between them."
+    """
+
+    # Well-Known Geographical Coordinate System Name
+    _well_known = {'WGS84':4326, 'WGS72':4322, 'NAD27':4267, 'NAD83':4269}
+    _epsg_regex = re.compile('^(EPSG:)?(?P<epsg>\d+)$', re.I)
+    _proj_regex = re.compile(r'^\+proj')
+
+    #### Python 'magic' routines ####
+    def __init__(self, srs_input='', srs_type='wkt'):
+        """
+        Creates a GDAL OSR Spatial Reference object from the given input.
+        The input may be string of OGC Well Known Text (WKT), an integer 
+        EPSG code, a PROJ.4 string, and/or a projection "well known" shorthand 
+        string (one of 'WGS84', 'WGS72', 'NAD27', 'NAD83').
+        """
+        # Intializing pointer and string buffer.
+        self._ptr = None
+        buf = c_char_p('')
+
+        if isinstance(srs_input, basestring):
+            # Encoding to ASCII if unicode passed in.
+            if isinstance(srs_input, UnicodeType):
+                srs_input = srs_input.encode('ascii')
+
+            epsg_m = self._epsg_regex.match(srs_input)
+            proj_m = self._proj_regex.match(srs_input)
+            if epsg_m:
+                # Is this an EPSG well known name?    
+                srs_type = 'epsg'
+                srs_input = int(epsg_m.group('epsg'))
+            elif proj_m:
+                # Is the string a PROJ.4 string?
+                srs_type = 'proj'
+            elif srs_input in self._well_known:
+                # Is this a short-hand well known name?  
+                srs_type = 'epsg'
+                srs_input = self._well_known[srs_input]
+            elif srs_type == 'proj':
+                pass
+            else:
+                # Setting the buffer with WKT, PROJ.4 string, etc.
+                buf = c_char_p(srs_input)
+        elif isinstance(srs_input, int):
+            # EPSG integer code was input.
+            if srs_type != 'epsg': srs_type = 'epsg'
+        elif isinstance(srs_input, c_void_p):
+            srs_type = 'ogr'
+        else:
+            raise TypeError('Invalid SRS type "%s"' % srs_type)
+
+        if srs_type == 'ogr':
+            # SRS input is OGR pointer
+            srs = srs_input
+        else:
+            # Creating a new pointer, using the string buffer.
+            srs = new_srs(buf)
+
+        # If the pointer is NULL, throw an exception.
+        if not srs:
+            raise SRSException('Could not create spatial reference from: %s' % srs_input)
+        else:
+            self._ptr = srs
+
+        # Post-processing if in PROJ.4 or EPSG formats.
+        if srs_type == 'proj': self.import_proj(srs_input)
+        elif srs_type == 'epsg': self.import_epsg(srs_input)
+
+    def __del__(self):
+        "Destroys this spatial reference."
+        if self._ptr: release_srs(self._ptr)
+
+    def __getitem__(self, target):
+        """
+        Returns the value of the given string attribute node, None if the node 
+        doesn't exist.  Can also take a tuple as a parameter, (target, child), 
+        where child is the index of the attribute in the WKT.  For example:
+
+        >>> wkt = 'GEOGCS["WGS 84", DATUM["WGS_1984, ... AUTHORITY["EPSG","4326"]]')
+        >>> srs = SpatialReference(wkt) # could also use 'WGS84', or 4326
+        >>> print srs['GEOGCS']
+        WGS 84
+        >>> print srs['DATUM']
+        WGS_1984
+        >>> print srs['AUTHORITY']
+        EPSG
+        >>> print srs['AUTHORITY', 1] # The authority value
+        4326
+        >>> print srs['TOWGS84', 4] # the fourth value in this wkt
+        0
+        >>> print srs['UNIT|AUTHORITY'] # For the units authority, have to use the pipe symbole.
+        EPSG
+        >>> print srs['UNIT|AUTHORITY', 1] # The authority value for the untis
+        9122
+        """
+        if isinstance(target, TupleType):
+            return self.attr_value(*target)
+        else:
+            return self.attr_value(target)
+
+    def __str__(self):
+        "The string representation uses 'pretty' WKT."
+        return self.pretty_wkt
+
+    #### SpatialReference Methods ####
+    def attr_value(self, target, index=0):
+        """
+        The attribute value for the given target node (e.g. 'PROJCS'). The index
+        keyword specifies an index of the child node to return.
+        """
+        if not isinstance(target, str) or not isinstance(index, int):
+            raise TypeError
+        return get_attr_value(self._ptr, target, index)
+
+    def auth_name(self, target):
+        "Returns the authority name for the given string target node."
+        return get_auth_name(self._ptr, target)
+    
+    def auth_code(self, target):
+        "Returns the authority code for the given string target node."
+        return get_auth_code(self._ptr, target)
+
+    def clone(self):
+        "Returns a clone of this SpatialReference object."
+        return SpatialReference(clone_srs(self._ptr))
+
+    def from_esri(self):
+        "Morphs this SpatialReference from ESRI's format to EPSG."
+        morph_from_esri(self._ptr)
+
+    def identify_epsg(self):
+        """
+        This method inspects the WKT of this SpatialReference, and will
+        add EPSG authority nodes where an EPSG identifier is applicable.
+        """
+        identify_epsg(self._ptr)
+
+    def to_esri(self):
+        "Morphs this SpatialReference to ESRI's format."
+        morph_to_esri(self._ptr)
+
+    def validate(self):
+        "Checks to see if the given spatial reference is valid."
+        srs_validate(self._ptr)
+    
+    #### Name & SRID properties ####
+    @property
+    def name(self):
+        "Returns the name of this Spatial Reference."
+        if self.projected: return self.attr_value('PROJCS')
+        elif self.geographic: return self.attr_value('GEOGCS')
+        elif self.local: return self.attr_value('LOCAL_CS')
+        else: return None
+
+    @property
+    def srid(self):
+        "Returns the SRID of top-level authority, or None if undefined."
+        try:
+            return int(self.attr_value('AUTHORITY', 1))
+        except (TypeError, ValueError):
+            return None
+        
+    #### Unit Properties ####
+    @property
+    def linear_name(self):
+        "Returns the name of the linear units."
+        units, name = linear_units(self._ptr, byref(c_char_p()))
+        return name
+
+    @property
+    def linear_units(self):
+        "Returns the value of the linear units."
+        units, name = linear_units(self._ptr, byref(c_char_p()))
+        return units
+
+    @property
+    def angular_name(self):
+        "Returns the name of the angular units."
+        units, name = angular_units(self._ptr, byref(c_char_p()))
+        return name
+
+    @property
+    def angular_units(self):
+        "Returns the value of the angular units."
+        units, name = angular_units(self._ptr, byref(c_char_p()))
+        return units
+
+    @property
+    def units(self):
+        """
+        Returns a 2-tuple of the units value and the units name, 
+        and will automatically determines whether to return the linear
+        or angular units.
+        """
+        if self.projected or self.local:
+            return linear_units(self._ptr, byref(c_char_p()))
+        elif self.geographic:
+            return angular_units(self._ptr, byref(c_char_p()))
+        else:
+            return (None, None)
+
+    #### Spheroid/Ellipsoid Properties ####
+    @property
+    def ellipsoid(self):
+        """
+        Returns a tuple of the ellipsoid parameters:
+         (semimajor axis, semiminor axis, and inverse flattening)
+        """
+        return (self.semi_major, self.semi_minor, self.inverse_flattening)
+
+    @property
+    def semi_major(self):
+        "Returns the Semi Major Axis for this Spatial Reference."
+        return semi_major(self._ptr, byref(c_int()))
+
+    @property
+    def semi_minor(self):
+        "Returns the Semi Minor Axis for this Spatial Reference."
+        return semi_minor(self._ptr, byref(c_int()))
+
+    @property
+    def inverse_flattening(self):
+        "Returns the Inverse Flattening for this Spatial Reference."
+        return invflattening(self._ptr, byref(c_int()))
+
+    #### Boolean Properties ####
+    @property
+    def geographic(self):
+        """
+        Returns True if this SpatialReference is geographic 
+         (root node is GEOGCS).
+        """
+        return bool(isgeographic(self._ptr))
+
+    @property
+    def local(self):
+        "Returns True if this SpatialReference is local (root node is LOCAL_CS)."
+        return bool(islocal(self._ptr))
+
+    @property
+    def projected(self):
+        """
+        Returns True if this SpatialReference is a projected coordinate system 
+         (root node is PROJCS).
+        """
+        return bool(isprojected(self._ptr))
+
+    #### Import Routines #####
+    def import_wkt(self, wkt):
+        "Imports the Spatial Reference from OGC WKT (string)"
+        from_wkt(self._ptr, byref(c_char_p(wkt)))
+
+    def import_proj(self, proj):
+        "Imports the Spatial Reference from a PROJ.4 string."
+        from_proj(self._ptr, proj)
+
+    def import_epsg(self, epsg):
+        "Imports the Spatial Reference from the EPSG code (an integer)."
+        from_epsg(self._ptr, epsg)
+
+    def import_xml(self, xml):
+        "Imports the Spatial Reference from an XML string."
+        from_xml(self._ptr, xml)
+
+    #### Export Properties ####
+    @property
+    def wkt(self):
+        "Returns the WKT representation of this Spatial Reference."
+        return to_wkt(self._ptr, byref(c_char_p()))
+
+    @property
+    def pretty_wkt(self, simplify=0):
+        "Returns the 'pretty' representation of the WKT."
+        return to_pretty_wkt(self._ptr, byref(c_char_p()), simplify)
+
+    @property
+    def proj(self):
+        "Returns the PROJ.4 representation for this Spatial Reference."
+        return to_proj(self._ptr, byref(c_char_p()))
+
+    @property
+    def proj4(self):
+        "Alias for proj()."
+        return self.proj
+
+    @property
+    def xml(self, dialect=''):
+        "Returns the XML representation of this Spatial Reference."
+        # FIXME: This leaks memory, have to figure out why.
+        return to_xml(self._ptr, byref(c_char_p()), dialect)
+
+    def to_esri(self):
+        "Morphs this SpatialReference to ESRI's format."
+        morph_to_esri(self._ptr)
+
+    def from_esri(self):
+        "Morphs this SpatialReference from ESRI's format to EPSG."
+        morph_from_esri(self._ptr)
+
+class CoordTransform(object):
+    "The coordinate system transformation object."
+
+    def __init__(self, source, target):
+        "Initializes on a source and target SpatialReference objects."
+        self._ptr = None # Initially NULL 
+        if not isinstance(source, SpatialReference) or not isinstance(target, SpatialReference):
+            raise SRSException('source and target must be of type SpatialReference')
+        self._ptr = new_ct(source._ptr, target._ptr)
+        if not self._ptr:
+            raise SRSException('could not intialize CoordTransform object')
+        self._srs1_name = source.name
+        self._srs2_name = target.name
+
+    def __del__(self):
+        "Deletes this Coordinate Transformation object."
+        if self._ptr: destroy_ct(self._ptr)
+
+    def __str__(self):
+        return 'Transform from "%s" to "%s"' % (self._srs1_name, self._srs2_name)
diff --git a/webapp/django/contrib/gis/geos/LICENSE b/webapp/django/contrib/gis/geos/LICENSE
new file mode 100644
index 0000000..84cf485
--- /dev/null
+++ b/webapp/django/contrib/gis/geos/LICENSE
@@ -0,0 +1,27 @@
+Copyright (c) 2007, Justin Bronn
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, 
+       this list of conditions and the following disclaimer.
+   
+    2. Redistributions in binary form must reproduce the above copyright 
+       notice, this list of conditions and the following disclaimer in the
+       documentation and/or other materials provided with the distribution.
+
+    3. Neither the name of GEOSGeometry nor the names of its contributors may be used
+       to endorse or promote products derived from this software without
+       specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/webapp/django/contrib/gis/geos/__init__.py b/webapp/django/contrib/gis/geos/__init__.py
new file mode 100644
index 0000000..90e2605
--- /dev/null
+++ b/webapp/django/contrib/gis/geos/__init__.py
@@ -0,0 +1,69 @@
+"""
+ The goal of this module is to be a ctypes wrapper around the GEOS library
+ that will work on both *NIX and Windows systems.  Specifically, this uses
+ the GEOS C api.
+
+ I have several motivations for doing this:
+  (1) The GEOS SWIG wrapper is no longer maintained, and requires the
+      installation of SWIG.
+  (2) The PCL implementation is over 2K+ lines of C and would make
+      PCL a requisite package for the GeoDjango application stack.
+  (3) Windows and Mac compatibility becomes substantially easier, and does not
+      require the additional compilation of PCL or GEOS and SWIG -- all that
+      is needed is a Win32 or Mac compiled GEOS C library (dll or dylib)
+      in a location that Python can read (e.g. 'C:\Python25').
+
+ In summary, I wanted to wrap GEOS in a more maintainable and portable way using
+ only Python and the excellent ctypes library (now standard in Python 2.5).
+
+ In the spirit of loose coupling, this library does not require Django or
+ GeoDjango.  Only the GEOS C library and ctypes are needed for the platform
+ of your choice.
+
+ For more information about GEOS:
+  http://geos.refractions.net
+  
+ For more info about PCL and the discontinuation of the Python GEOS
+ library see Sean Gillies' writeup (and subsequent update) at:
+  http://zcologia.com/news/150/geometries-for-python/
+  http://zcologia.com/news/429/geometries-for-python-update/
+"""
+from django.contrib.gis.geos.base import GEOSGeometry, wkt_regex, hex_regex
+from django.contrib.gis.geos.geometries import Point, LineString, LinearRing, Polygon, HAS_NUMPY
+from django.contrib.gis.geos.collections import GeometryCollection, MultiPoint, MultiLineString, MultiPolygon
+from django.contrib.gis.geos.error import GEOSException, GEOSIndexError
+from django.contrib.gis.geos.libgeos import geos_version, geos_version_info
+
+def fromfile(file_name):
+    """
+    Given a string file name, returns a GEOSGeometry. The file may contain WKB,
+    WKT, or HEX.
+    """
+    fh = open(file_name, 'rb')
+    buf = fh.read()
+    fh.close()
+    if wkt_regex.match(buf) or hex_regex.match(buf):
+        return GEOSGeometry(buf)
+    else:
+        return GEOSGeometry(buffer(buf))
+
+def fromstr(wkt_or_hex, **kwargs):
+    "Given a string value (wkt or hex), returns a GEOSGeometry object."
+    return GEOSGeometry(wkt_or_hex, **kwargs)
+
+def hex_to_wkt(hex):
+    "Converts HEXEWKB into WKT."
+    return GEOSGeometry(hex).wkt
+
+def wkt_to_hex(wkt):
+    "Converts WKT into HEXEWKB."
+    return GEOSGeometry(wkt).hex
+
+def centroid(input):
+    "Returns the centroid of the geometry (given in HEXEWKB)."
+    return GEOSGeometry(input).centroid.wkt
+
+def area(input):
+    "Returns the area of the geometry (given in HEXEWKB)."
+    return GEOSGeometry(input).area
+    
diff --git a/webapp/django/contrib/gis/geos/base.py b/webapp/django/contrib/gis/geos/base.py
new file mode 100644
index 0000000..8200d59
--- /dev/null
+++ b/webapp/django/contrib/gis/geos/base.py
@@ -0,0 +1,608 @@
+"""
+ This module contains the 'base' GEOSGeometry object -- all GEOS Geometries
+ inherit from this object.
+"""
+# Python, ctypes and types dependencies.
+import re
+from ctypes import addressof, byref, c_double, c_size_t
+from types import UnicodeType
+
+# GEOS-related dependencies.
+from django.contrib.gis.geos.coordseq import GEOSCoordSeq
+from django.contrib.gis.geos.error import GEOSException
+from django.contrib.gis.geos.libgeos import GEOM_PTR
+
+# All other functions in this module come from the ctypes 
+# prototypes module -- which handles all interaction with
+# the underlying GEOS library.
+from django.contrib.gis.geos.prototypes import * 
+
+# Trying to import GDAL libraries, if available.  Have to place in
+# try/except since this package may be used outside GeoDjango.
+try:
+    from django.contrib.gis.gdal import OGRGeometry, SpatialReference, GEOJSON
+    HAS_GDAL = True
+except:
+    HAS_GDAL, GEOJSON = False, False
+
+# Regular expression for recognizing HEXEWKB and WKT.  A prophylactic measure
+# to prevent potentially malicious input from reaching the underlying C
+# library.  Not a substitute for good web security programming practices.
+hex_regex = re.compile(r'^[0-9A-F]+$', re.I)
+wkt_regex = re.compile(r'^(SRID=(?P<srid>\d+);)?(?P<wkt>(POINT|LINESTRING|LINEARRING|POLYGON|MULTIPOINT|MULTILINESTRING|MULTIPOLYGON|GEOMETRYCOLLECTION)[ACEGIMLONPSRUTY\d,\.\-\(\) ]+)$', re.I)
+json_regex = re.compile(r'^\{.+\}$')
+
+class GEOSGeometry(object):
+    "A class that, generally, encapsulates a GEOS geometry."
+
+    # Initially, the geometry pointer is NULL
+    _ptr = None
+
+    #### Python 'magic' routines ####
+    def __init__(self, geo_input, srid=None):
+        """
+        The base constructor for GEOS geometry objects, and may take the 
+        following inputs:
+         
+         * string: WKT
+         * string: HEXEWKB (a PostGIS-specific canonical form)
+         * buffer: WKB
+        
+        The `srid` keyword is used to specify the Source Reference Identifier
+        (SRID) number for this Geometry.  If not set, the SRID will be None.
+        """ 
+        if isinstance(geo_input, basestring):
+            if isinstance(geo_input, UnicodeType):
+                # Encoding to ASCII, WKT or HEXEWKB doesn't need any more.
+                geo_input = geo_input.encode('ascii')
+                            
+            wkt_m = wkt_regex.match(geo_input)
+            if wkt_m:
+                # Handling WKT input.
+                if wkt_m.group('srid'): srid = int(wkt_m.group('srid'))
+                g = from_wkt(wkt_m.group('wkt'))
+            elif hex_regex.match(geo_input):
+                # Handling HEXEWKB input.
+                g = from_hex(geo_input, len(geo_input))
+            elif GEOJSON and json_regex.match(geo_input):
+                # Handling GeoJSON input.
+                wkb_input = str(OGRGeometry(geo_input).wkb)
+                g = from_wkb(wkb_input, len(wkb_input))
+            else:
+                raise ValueError('String or unicode input unrecognized as WKT EWKT, and HEXEWKB.')
+        elif isinstance(geo_input, GEOM_PTR):
+            # When the input is a pointer to a geomtry (GEOM_PTR).
+            g = geo_input
+        elif isinstance(geo_input, buffer):
+            # When the input is a buffer (WKB).
+            wkb_input = str(geo_input)
+            g = from_wkb(wkb_input, len(wkb_input))
+        else:
+            # Invalid geometry type.
+            raise TypeError('Improper geometry input type: %s' % str(type(geo_input)))
+
+        if bool(g):
+            # Setting the pointer object with a valid pointer.
+            self._ptr = g
+        else:
+            raise GEOSException('Could not initialize GEOS Geometry with given input.')
+
+        # Post-initialization setup.
+        self._post_init(srid)
+
+    def _post_init(self, srid):
+        "Helper routine for performing post-initialization setup."
+        # Setting the SRID, if given.
+        if srid and isinstance(srid, int): self.srid = srid
+        
+        # Setting the class type (e.g., Point, Polygon, etc.)
+        self.__class__ = GEOS_CLASSES[self.geom_typeid]
+
+        # Setting the coordinate sequence for the geometry (will be None on 
+        # geometries that do not have coordinate sequences)
+        self._set_cs()
+
+    @property
+    def ptr(self):
+        """
+        Property for controlling access to the GEOS geometry pointer.  Using
+        this raises an exception when the pointer is NULL, thus preventing
+        the C library from attempting to access an invalid memory location.
+        """
+        if self._ptr: 
+            return self._ptr
+        else:
+            raise GEOSException('NULL GEOS pointer encountered; was this geometry modified?')
+
+    def __del__(self):
+        """
+        Destroys this Geometry; in other words, frees the memory used by the
+        GEOS C++ object.
+        """
+        if self._ptr: destroy_geom(self._ptr)
+
+    def __copy__(self):
+        """
+        Returns a clone because the copy of a GEOSGeometry may contain an
+        invalid pointer location if the original is garbage collected.
+        """
+        return self.clone()
+
+    def __deepcopy__(self, memodict):
+        """
+        The `deepcopy` routine is used by the `Node` class of django.utils.tree;
+        thus, the protocol routine needs to be implemented to return correct 
+        copies (clones) of these GEOS objects, which use C pointers.
+        """
+        return self.clone()
+
+    def __str__(self):
+        "WKT is used for the string representation."
+        return self.wkt
+
+    def __repr__(self):
+        "Short-hand representation because WKT may be very large."
+        return '<%s object at %s>' % (self.geom_type, hex(addressof(self.ptr)))
+
+    # Pickling support
+    def __getstate__(self):
+        # The pickled state is simply a tuple of the WKB (in string form)
+        # and the SRID.
+        return str(self.wkb), self.srid
+
+    def __setstate__(self, state):
+        # Instantiating from the tuple state that was pickled.
+        wkb, srid = state
+        ptr = from_wkb(wkb, len(wkb))
+        if not ptr: raise GEOSException('Invalid Geometry loaded from pickled state.')
+        self._ptr = ptr
+        self._post_init(srid)
+
+    # Comparison operators
+    def __eq__(self, other):
+        """
+        Equivalence testing, a Geometry may be compared with another Geometry
+        or a WKT representation.
+        """
+        if isinstance(other, basestring):
+            return self.wkt == other
+        elif isinstance(other, GEOSGeometry):
+            return self.equals_exact(other)
+        else:
+            return False
+
+    def __ne__(self, other):
+        "The not equals operator."
+        return not (self == other)
+
+    ### Geometry set-like operations ###
+    # Thanks to Sean Gillies for inspiration:
+    #  http://lists.gispython.org/pipermail/community/2007-July/001034.html
+    # g = g1 | g2
+    def __or__(self, other):
+        "Returns the union of this Geometry and the other."
+        return self.union(other)
+
+    # g = g1 & g2
+    def __and__(self, other):
+        "Returns the intersection of this Geometry and the other."
+        return self.intersection(other)
+
+    # g = g1 - g2
+    def __sub__(self, other):
+        "Return the difference this Geometry and the other."
+        return self.difference(other)
+
+    # g = g1 ^ g2
+    def __xor__(self, other):
+        "Return the symmetric difference of this Geometry and the other."
+        return self.sym_difference(other)
+
+    #### Coordinate Sequence Routines ####
+    @property
+    def has_cs(self):
+        "Returns True if this Geometry has a coordinate sequence, False if not."
+        # Only these geometries are allowed to have coordinate sequences.
+        if isinstance(self, (Point, LineString, LinearRing)):
+            return True
+        else:
+            return False
+
+    def _set_cs(self):
+        "Sets the coordinate sequence for this Geometry."
+        if self.has_cs:
+            self._cs = GEOSCoordSeq(get_cs(self.ptr), self.hasz)
+        else:
+            self._cs = None
+
+    @property
+    def coord_seq(self):
+        "Returns a clone of the coordinate sequence for this Geometry."
+        if self.has_cs:
+            return self._cs.clone()
+
+    #### Geometry Info ####
+    @property
+    def geom_type(self):
+        "Returns a string representing the Geometry type, e.g. 'Polygon'"
+        return geos_type(self.ptr)
+
+    @property
+    def geom_typeid(self):
+        "Returns an integer representing the Geometry type."
+        return geos_typeid(self.ptr)
+
+    @property
+    def num_geom(self):
+        "Returns the number of geometries in the Geometry."
+        return get_num_geoms(self.ptr)
+
+    @property
+    def num_coords(self):
+        "Returns the number of coordinates in the Geometry."
+        return get_num_coords(self.ptr)
+
+    @property
+    def num_points(self):
+        "Returns the number points, or coordinates, in the Geometry."
+        return self.num_coords
+
+    @property
+    def dims(self):
+        "Returns the dimension of this Geometry (0=point, 1=line, 2=surface)."
+        return get_dims(self.ptr)
+
+    def normalize(self):
+        "Converts this Geometry to normal form (or canonical form)."
+        return geos_normalize(self.ptr)
+
+    #### Unary predicates ####
+    @property
+    def empty(self):
+        """
+        Returns a boolean indicating whether the set of points in this Geometry 
+        are empty.
+        """
+        return geos_isempty(self.ptr)
+
+    @property
+    def hasz(self):
+        "Returns whether the geometry has a 3D dimension."
+        return geos_hasz(self.ptr)
+
+    @property
+    def ring(self):
+        "Returns whether or not the geometry is a ring."
+        return geos_isring(self.ptr)
+
+    @property
+    def simple(self):
+        "Returns false if the Geometry not simple."
+        return geos_issimple(self.ptr)
+
+    @property
+    def valid(self):
+        "This property tests the validity of this Geometry."
+        return geos_isvalid(self.ptr)
+
+    #### Binary predicates. ####
+    def contains(self, other):
+        "Returns true if other.within(this) returns true."
+        return geos_contains(self.ptr, other.ptr)
+
+    def crosses(self, other):
+        """
+        Returns true if the DE-9IM intersection matrix for the two Geometries
+        is T*T****** (for a point and a curve,a point and an area or a line and
+        an area) 0******** (for two curves).
+        """
+        return geos_crosses(self.ptr, other.ptr)
+
+    def disjoint(self, other):
+        """
+        Returns true if the DE-9IM intersection matrix for the two Geometries
+        is FF*FF****.
+        """
+        return geos_disjoint(self.ptr, other.ptr)
+
+    def equals(self, other):
+        """
+        Returns true if the DE-9IM intersection matrix for the two Geometries 
+        is T*F**FFF*.
+        """
+        return geos_equals(self.ptr, other.ptr)
+
+    def equals_exact(self, other, tolerance=0):
+        """
+        Returns true if the two Geometries are exactly equal, up to a
+        specified tolerance.
+        """
+        return geos_equalsexact(self.ptr, other.ptr, float(tolerance))
+
+    def intersects(self, other):
+        "Returns true if disjoint returns false."
+        return geos_intersects(self.ptr, other.ptr)
+
+    def overlaps(self, other):
+        """
+        Returns true if the DE-9IM intersection matrix for the two Geometries
+        is T*T***T** (for two points or two surfaces) 1*T***T** (for two curves).
+        """
+        return geos_overlaps(self.ptr, other.ptr)
+
+    def relate_pattern(self, other, pattern):
+        """
+        Returns true if the elements in the DE-9IM intersection matrix for the
+        two Geometries match the elements in pattern.
+        """
+        if not isinstance(pattern, str) or len(pattern) > 9:
+            raise GEOSException('invalid intersection matrix pattern')
+        return geos_relatepattern(self.ptr, other.ptr, pattern)
+
+    def touches(self, other):
+        """
+        Returns true if the DE-9IM intersection matrix for the two Geometries
+        is FT*******, F**T***** or F***T****.
+        """
+        return geos_touches(self.ptr, other.ptr)
+
+    def within(self, other):
+        """
+        Returns true if the DE-9IM intersection matrix for the two Geometries
+        is T*F**F***.
+        """
+        return geos_within(self.ptr, other.ptr)
+
+    #### SRID Routines ####
+    def get_srid(self):
+        "Gets the SRID for the geometry, returns None if no SRID is set."
+        s = geos_get_srid(self.ptr)
+        if s == 0: return None
+        else: return s
+
+    def set_srid(self, srid):
+        "Sets the SRID for the geometry."
+        geos_set_srid(self.ptr, srid)
+    srid = property(get_srid, set_srid)
+
+    #### Output Routines ####
+    @property
+    def ewkt(self):
+        "Returns the EWKT (WKT + SRID) of the Geometry."
+        if self.get_srid(): return 'SRID=%s;%s' % (self.srid, self.wkt)
+        else: return self.wkt
+
+    @property
+    def wkt(self):
+        "Returns the WKT (Well-Known Text) of the Geometry."
+        return to_wkt(self.ptr)
+
+    @property
+    def hex(self):
+        """
+        Returns the HEX of the Geometry -- please note that the SRID is not
+        included in this representation, because the GEOS C library uses
+        -1 by default, even if the SRID is set.
+        """
+        # A possible faster, all-python, implementation: 
+        #  str(self.wkb).encode('hex')
+        return to_hex(self.ptr, byref(c_size_t()))
+
+    @property
+    def json(self):
+        """
+        Returns GeoJSON representation of this Geometry if GDAL 1.5+ 
+        is installed.
+        """
+        if GEOJSON: return self.ogr.json
+    geojson = json
+
+    @property
+    def wkb(self):
+        "Returns the WKB of the Geometry as a buffer."
+        bin = to_wkb(self.ptr, byref(c_size_t()))
+        return buffer(bin)
+
+    @property
+    def kml(self):
+        "Returns the KML representation of this Geometry."
+        gtype = self.geom_type
+        return '<%s>%s</%s>' % (gtype, self.coord_seq.kml, gtype)
+
+    #### GDAL-specific output routines ####
+    @property
+    def ogr(self):
+        "Returns the OGR Geometry for this Geometry."
+        if HAS_GDAL:
+            if self.srid:
+                return OGRGeometry(self.wkb, self.srid)
+            else:
+                return OGRGeometry(self.wkb)
+        else:
+            return None
+
+    @property
+    def srs(self):
+        "Returns the OSR SpatialReference for SRID of this Geometry."
+        if HAS_GDAL and self.srid:
+            return SpatialReference(self.srid)
+        else:
+            return None
+
+    @property
+    def crs(self):
+        "Alias for `srs` property."
+        return self.srs
+
+    def transform(self, ct, clone=False):
+        """
+        Requires GDAL. Transforms the geometry according to the given 
+        transformation object, which may be an integer SRID, and WKT or 
+        PROJ.4 string. By default, the geometry is transformed in-place and 
+        nothing is returned. However if the `clone` keyword is set, then this 
+        geometry will not be modified and a transformed clone will be returned
+        instead.
+        """
+        srid = self.srid
+        if HAS_GDAL and srid:
+            g = OGRGeometry(self.wkb, srid)
+            g.transform(ct)
+            wkb = str(g.wkb)
+            ptr = from_wkb(wkb, len(wkb))
+            if clone: 
+                # User wants a cloned transformed geometry returned.
+                return GEOSGeometry(ptr, srid=g.srid)
+            if ptr:
+                # Reassigning pointer, and performing post-initialization setup
+                # again due to the reassignment.
+                destroy_geom(self.ptr)
+                self._ptr = ptr
+                self._post_init(g.srid)
+            else:
+                raise GEOSException('Transformed WKB was invalid.')
+
+    #### Topology Routines ####
+    def _topology(self, gptr):
+        "Helper routine to return Geometry from the given pointer."
+        return GEOSGeometry(gptr, srid=self.srid)
+
+    @property
+    def boundary(self):
+        "Returns the boundary as a newly allocated Geometry object."
+        return self._topology(geos_boundary(self.ptr))
+
+    def buffer(self, width, quadsegs=8):
+        """
+        Returns a geometry that represents all points whose distance from this
+        Geometry is less than or equal to distance. Calculations are in the
+        Spatial Reference System of this Geometry. The optional third parameter sets
+        the number of segment used to approximate a quarter circle (defaults to 8).
+        (Text from PostGIS documentation at ch. 6.1.3)
+        """
+        return self._topology(geos_buffer(self.ptr, width, quadsegs))
+
+    @property
+    def centroid(self):
+        """
+        The centroid is equal to the centroid of the set of component Geometries
+        of highest dimension (since the lower-dimension geometries contribute zero
+        "weight" to the centroid).
+        """
+        return self._topology(geos_centroid(self.ptr))
+
+    @property
+    def convex_hull(self):
+        """
+        Returns the smallest convex Polygon that contains all the points 
+        in the Geometry.
+        """
+        return self._topology(geos_convexhull(self.ptr))
+
+    def difference(self, other):
+        """
+        Returns a Geometry representing the points making up this Geometry
+        that do not make up other.
+        """
+        return self._topology(geos_difference(self.ptr, other.ptr))
+
+    @property
+    def envelope(self):
+        "Return the envelope for this geometry (a polygon)."
+        return self._topology(geos_envelope(self.ptr))
+
+    def intersection(self, other):
+        "Returns a Geometry representing the points shared by this Geometry and other."
+        return self._topology(geos_intersection(self.ptr, other.ptr))
+
+    @property
+    def point_on_surface(self):
+        "Computes an interior point of this Geometry."
+        return self._topology(geos_pointonsurface(self.ptr))
+
+    def relate(self, other):
+        "Returns the DE-9IM intersection matrix for this Geometry and the other."
+        return geos_relate(self.ptr, other.ptr)
+
+    def simplify(self, tolerance=0.0, preserve_topology=False):
+        """
+        Returns the Geometry, simplified using the Douglas-Peucker algorithm
+        to the specified tolerance (higher tolerance => less points).  If no
+        tolerance provided, defaults to 0.
+
+        By default, this function does not preserve topology - e.g. polygons can 
+        be split, collapse to lines or disappear holes can be created or 
+        disappear, and lines can cross. By specifying preserve_topology=True, 
+        the result will have the same dimension and number of components as the 
+        input. This is significantly slower.         
+        """
+        if preserve_topology:
+            return self._topology(geos_preservesimplify(self.ptr, tolerance))
+        else:
+            return self._topology(geos_simplify(self.ptr, tolerance))
+
+    def sym_difference(self, other):
+        """
+        Returns a set combining the points in this Geometry not in other,
+        and the points in other not in this Geometry.
+        """
+        return self._topology(geos_symdifference(self.ptr, other.ptr))
+
+    def union(self, other):
+        "Returns a Geometry representing all the points in this Geometry and other."
+        return self._topology(geos_union(self.ptr, other.ptr))
+
+    #### Other Routines ####
+    @property
+    def area(self):
+        "Returns the area of the Geometry."
+        return geos_area(self.ptr, byref(c_double()))
+
+    def distance(self, other):
+        """
+        Returns the distance between the closest points on this Geometry
+        and the other. Units will be in those of the coordinate system of
+        the Geometry.
+        """
+        if not isinstance(other, GEOSGeometry): 
+            raise TypeError('distance() works only on other GEOS Geometries.')
+        return geos_distance(self.ptr, other.ptr, byref(c_double()))
+
+    @property
+    def extent(self):
+        """
+        Returns the extent of this geometry as a 4-tuple, consisting of
+        (xmin, ymin, xmax, ymax).
+        """
+        env = self.envelope
+        if isinstance(env, Point):
+            xmin, ymin = env.tuple
+            xmax, ymax = xmin, ymin
+        else:
+            xmin, ymin = env[0][0]
+            xmax, ymax = env[0][2]
+        return (xmin, ymin, xmax, ymax)
+
+    @property
+    def length(self):
+        """
+        Returns the length of this Geometry (e.g., 0 for point, or the
+        circumfrence of a Polygon).
+        """
+        return geos_length(self.ptr, byref(c_double()))
+    
+    def clone(self):
+        "Clones this Geometry."
+        return GEOSGeometry(geom_clone(self.ptr), srid=self.srid)
+
+# Class mapping dictionary
+from django.contrib.gis.geos.geometries import Point, Polygon, LineString, LinearRing
+from django.contrib.gis.geos.collections import GeometryCollection, MultiPoint, MultiLineString, MultiPolygon
+GEOS_CLASSES = {0 : Point,
+                1 : LineString,
+                2 : LinearRing,
+                3 : Polygon,
+                4 : MultiPoint,
+                5 : MultiLineString,
+                6 : MultiPolygon,
+                7 : GeometryCollection,
+                }
diff --git a/webapp/django/contrib/gis/geos/collections.py b/webapp/django/contrib/gis/geos/collections.py
new file mode 100644
index 0000000..a69b2e7
--- /dev/null
+++ b/webapp/django/contrib/gis/geos/collections.py
@@ -0,0 +1,105 @@
+"""
+ This module houses the Geometry Collection objects:
+ GeometryCollection, MultiPoint, MultiLineString, and MultiPolygon
+"""
+from ctypes import c_int, c_uint, byref
+from types import TupleType, ListType
+from django.contrib.gis.geos.base import GEOSGeometry
+from django.contrib.gis.geos.error import GEOSException, GEOSIndexError
+from django.contrib.gis.geos.geometries import Point, LineString, LinearRing, Polygon
+from django.contrib.gis.geos.libgeos import get_pointer_arr, GEOM_PTR
+from django.contrib.gis.geos.prototypes import create_collection, destroy_geom, geom_clone, geos_typeid, get_cs, get_geomn
+
+class GeometryCollection(GEOSGeometry):
+    _allowed = (Point, LineString, LinearRing, Polygon)
+    _typeid = 7
+
+    def __init__(self, *args, **kwargs):
+        "Initializes a Geometry Collection from a sequence of Geometry objects."
+
+        # Checking the arguments
+        if not args:
+            raise TypeError, 'Must provide at least one Geometry to initialize %s.' % self.__class__.__name__
+
+        if len(args) == 1: 
+            # If only one geometry provided or a list of geometries is provided
+            #  in the first argument.
+            if isinstance(args[0], (TupleType, ListType)):
+                init_geoms = args[0]
+            else:
+                init_geoms = args
+        else:
+            init_geoms = args
+
+        # Ensuring that only the permitted geometries are allowed in this collection
+        if False in [isinstance(geom, self._allowed) for geom in init_geoms]:
+            raise TypeError('Invalid Geometry type encountered in the arguments.')
+
+        # Creating the geometry pointer array.
+        ngeoms = len(init_geoms)
+        geoms = get_pointer_arr(ngeoms)
+        for i in xrange(ngeoms): geoms[i] = geom_clone(init_geoms[i].ptr)
+        super(GeometryCollection, self).__init__(create_collection(c_int(self._typeid), byref(geoms), c_uint(ngeoms)), **kwargs)
+
+    def __getitem__(self, index):
+        "Returns the Geometry from this Collection at the given index (0-based)."
+        # Checking the index and returning the corresponding GEOS geometry.
+        self._checkindex(index)
+        return GEOSGeometry(geom_clone(get_geomn(self.ptr, index)), srid=self.srid)
+
+    def __setitem__(self, index, geom):
+        "Sets the Geometry at the specified index."
+        self._checkindex(index)
+        if not isinstance(geom, self._allowed):
+            raise TypeError('Incompatible Geometry for collection.')
+        
+        ngeoms = len(self)
+        geoms = get_pointer_arr(ngeoms)
+        for i in xrange(ngeoms):
+            if i == index:
+                geoms[i] = geom_clone(geom.ptr)
+            else:
+                geoms[i] = geom_clone(get_geomn(self.ptr, i))
+        
+        # Creating a new collection, and destroying the contents of the previous poiner.
+        prev_ptr = self.ptr
+        srid = self.srid
+        self._ptr = create_collection(c_int(self._typeid), byref(geoms), c_uint(ngeoms))
+        if srid: self.srid = srid
+        destroy_geom(prev_ptr)
+
+    def __iter__(self):
+        "Iterates over each Geometry in the Collection."
+        for i in xrange(len(self)):
+            yield self.__getitem__(i)
+
+    def __len__(self):
+        "Returns the number of geometries in this Collection."
+        return self.num_geom
+
+    def _checkindex(self, index):
+        "Checks the given geometry index."
+        if index < 0 or index >= self.num_geom:
+            raise GEOSIndexError('invalid GEOS Geometry index: %s' % str(index))
+
+    @property
+    def kml(self):
+        "Returns the KML for this Geometry Collection."
+        return '<MultiGeometry>%s</MultiGeometry>' % ''.join([g.kml for g in self])
+
+    @property
+    def tuple(self):
+        "Returns a tuple of all the coordinates in this Geometry Collection"
+        return tuple([g.tuple for g in self])
+    coords = tuple
+
+# MultiPoint, MultiLineString, and MultiPolygon class definitions.
+class MultiPoint(GeometryCollection): 
+    _allowed = Point
+    _typeid = 4
+class MultiLineString(GeometryCollection): 
+    _allowed = (LineString, LinearRing)
+    _typeid = 5
+class MultiPolygon(GeometryCollection): 
+    _allowed = Polygon
+    _typeid = 6
diff --git a/webapp/django/contrib/gis/geos/coordseq.py b/webapp/django/contrib/gis/geos/coordseq.py
new file mode 100644
index 0000000..bc0c479
--- /dev/null
+++ b/webapp/django/contrib/gis/geos/coordseq.py
@@ -0,0 +1,164 @@
+"""
+ This module houses the GEOSCoordSeq object, which is used internally
+ by GEOSGeometry to house the actual coordinates of the Point,
+ LineString, and LinearRing geometries.
+"""
+from ctypes import c_double, c_uint, byref
+from types import ListType, TupleType
+from django.contrib.gis.geos.error import GEOSException, GEOSIndexError
+from django.contrib.gis.geos.libgeos import CS_PTR, HAS_NUMPY
+from django.contrib.gis.geos.prototypes import cs_clone, cs_getdims, cs_getordinate, cs_getsize, cs_setordinate
+if HAS_NUMPY: from numpy import ndarray
+
+class GEOSCoordSeq(object):
+    "The internal representation of a list of coordinates inside a Geometry."
+
+    #### Python 'magic' routines ####
+    def __init__(self, ptr, z=False):
+        "Initializes from a GEOS pointer."
+        if not isinstance(ptr, CS_PTR):
+            raise TypeError('Coordinate sequence should initialize with a CS_PTR.')
+        self._ptr = ptr
+        self._z = z
+
+    def __iter__(self):
+        "Iterates over each point in the coordinate sequence."
+        for i in xrange(self.size):
+            yield self[i]
+
+    def __len__(self):
+        "Returns the number of points in the coordinate sequence."
+        return int(self.size)
+
+    def __str__(self):
+        "Returns the string representation of the coordinate sequence."
+        return str(self.tuple)
+
+    def __getitem__(self, index):
+        "Returns the coordinate sequence value at the given index."
+        coords = [self.getX(index), self.getY(index)]
+        if self.dims == 3 and self._z:
+            coords.append(self.getZ(index))
+        return tuple(coords)
+
+    def __setitem__(self, index, value):
+        "Sets the coordinate sequence value at the given index."
+        # Checking the input value
+        if isinstance(value, (ListType, TupleType)):
+            pass
+        elif HAS_NUMPY and isinstance(value, ndarray):
+            pass
+        else:
+            raise TypeError('Must set coordinate with a sequence (list, tuple, or numpy array).')
+        # Checking the dims of the input
+        if self.dims == 3 and self._z:
+            n_args = 3
+            set_3d = True
+        else:
+            n_args = 2
+            set_3d = False
+        if len(value) != n_args:
+            raise TypeError('Dimension of value does not match.')
+        # Setting the X, Y, Z
+        self.setX(index, value[0])
+        self.setY(index, value[1])
+        if set_3d: self.setZ(index, value[2])
+
+    #### Internal Routines ####
+    def _checkindex(self, index):
+        "Checks the given index."
+        sz = self.size
+        if (sz < 1) or (index < 0) or (index >= sz):
+            raise GEOSIndexError('invalid GEOS Geometry index: %s' % str(index))
+
+    def _checkdim(self, dim):
+        "Checks the given dimension."
+        if dim < 0 or dim > 2:
+            raise GEOSException('invalid ordinate dimension "%d"' % dim)
+
+    @property
+    def ptr(self):
+        """
+        Property for controlling access to coordinate sequence pointer,
+        preventing attempted access to a NULL memory location.
+        """
+        if self._ptr: return self._ptr
+        else: raise GEOSException('NULL coordinate sequence pointer encountered.')
+
+    #### Ordinate getting and setting routines ####
+    def getOrdinate(self, dimension, index):
+        "Returns the value for the given dimension and index."
+        self._checkindex(index)
+        self._checkdim(dimension)
+        return cs_getordinate(self.ptr, index, dimension, byref(c_double()))
+
+    def setOrdinate(self, dimension, index, value):
+        "Sets the value for the given dimension and index."
+        self._checkindex(index)
+        self._checkdim(dimension)
+        cs_setordinate(self.ptr, index, dimension, value)
+
+    def getX(self, index):
+        "Get the X value at the index."
+        return self.getOrdinate(0, index)
+
+    def setX(self, index, value):
+        "Set X with the value at the given index."
+        self.setOrdinate(0, index, value)
+
+    def getY(self, index):
+        "Get the Y value at the given index."
+        return self.getOrdinate(1, index)
+
+    def setY(self, index, value):
+        "Set Y with the value at the given index."
+        self.setOrdinate(1, index, value)
+
+    def getZ(self, index):
+        "Get Z with the value at the given index."
+        return self.getOrdinate(2, index)
+
+    def setZ(self, index, value):
+        "Set Z with the value at the given index."
+        self.setOrdinate(2, index, value)
+
+    ### Dimensions ###
+    @property
+    def size(self):
+        "Returns the size of this coordinate sequence."
+        return cs_getsize(self.ptr, byref(c_uint()))
+
+    @property
+    def dims(self):
+        "Returns the dimensions of this coordinate sequence."
+        return cs_getdims(self.ptr, byref(c_uint()))
+
+    @property
+    def hasz(self):
+        """
+        Returns whether this coordinate sequence is 3D.  This property value is
+        inherited from the parent Geometry.
+        """
+        return self._z
+
+    ### Other Methods ###
+    def clone(self):
+        "Clones this coordinate sequence."
+        return GEOSCoordSeq(cs_clone(self.ptr), self.hasz)
+
+    @property
+    def kml(self):
+        "Returns the KML representation for the coordinates."
+        # Getting the substitution string depending on whether the coordinates have
+        #  a Z dimension.
+        if self.hasz: substr = '%s,%s,%s '
+        else: substr = '%s,%s,0 '
+        return '<coordinates>%s</coordinates>' % \
+            ''.join([substr % self[i] for i in xrange(len(self))]).strip()
+
+    @property
+    def tuple(self):
+        "Returns a tuple version of this coordinate sequence."
+        n = self.size
+        if n == 1: return self[0]
+        else: return tuple([self[i] for i in xrange(n)])
diff --git a/webapp/django/contrib/gis/geos/error.py b/webapp/django/contrib/gis/geos/error.py
new file mode 100644
index 0000000..46bdfe6
--- /dev/null
+++ b/webapp/django/contrib/gis/geos/error.py
@@ -0,0 +1,20 @@
+"""
+ This module houses the GEOS exceptions, specifically, GEOSException and
+ GEOSGeometryIndexError.
+"""
+
+class GEOSException(Exception):
+    "The base GEOS exception, indicates a GEOS-related error."
+    pass
+
+class GEOSIndexError(GEOSException, KeyError):
+    """
+    This exception is raised when an invalid index is encountered, and has
+    the 'silent_variable_feature' attribute set to true.  This ensures that
+    django's templates proceed to use the next lookup type gracefully when
+    an Exception is raised.  Fixes ticket #4740.
+    """
+    # "If, during the method lookup, a method raises an exception, the exception
+    #  will be propagated, unless the exception has an attribute 
+    #  `silent_variable_failure` whose value is True." -- Django template docs.
+    silent_variable_failure = True
diff --git a/webapp/django/contrib/gis/geos/geometries.py b/webapp/django/contrib/gis/geos/geometries.py
new file mode 100644
index 0000000..c5420e9
--- /dev/null
+++ b/webapp/django/contrib/gis/geos/geometries.py
@@ -0,0 +1,391 @@
+"""
+ This module houses the Point, LineString, LinearRing, and Polygon OGC
+ geometry classes.  All geometry classes in this module inherit from 
+ GEOSGeometry.
+"""
+from ctypes import c_uint, byref
+from django.contrib.gis.geos.base import GEOSGeometry
+from django.contrib.gis.geos.coordseq import GEOSCoordSeq
+from django.contrib.gis.geos.error import GEOSException, GEOSIndexError
+from django.contrib.gis.geos.libgeos import get_pointer_arr, GEOM_PTR, HAS_NUMPY
+from django.contrib.gis.geos.prototypes import *
+if HAS_NUMPY: from numpy import ndarray, array
+
+class Point(GEOSGeometry):
+
+    def __init__(self, x, y=None, z=None, srid=None):
+        """
+        The Point object may be initialized with either a tuple, or individual
+        parameters.
+        
+        For Example:
+        >>> p = Point((5, 23)) # 2D point, passed in as a tuple
+        >>> p = Point(5, 23, 8) # 3D point, passed in with individual parameters
+        """
+
+        if isinstance(x, (tuple, list)):
+            # Here a tuple or list was passed in under the `x` parameter.
+            ndim = len(x)
+            if ndim < 2 or ndim > 3:
+                raise TypeError('Invalid sequence parameter: %s' % str(x))
+            coords = x
+        elif isinstance(x, (int, float, long)) and isinstance(y, (int, float, long)):
+            # Here X, Y, and (optionally) Z were passed in individually, as parameters.
+            if isinstance(z, (int, float, long)):
+                ndim = 3
+                coords = [x, y, z]
+            else:
+                ndim = 2
+                coords = [x, y]
+        else:
+            raise TypeError('Invalid parameters given for Point initialization.')
+
+        # Creating the coordinate sequence, and setting X, Y, [Z]
+        cs = create_cs(c_uint(1), c_uint(ndim))
+        cs_setx(cs, 0, coords[0])
+        cs_sety(cs, 0, coords[1])
+        if ndim == 3: cs_setz(cs, 0, coords[2])
+
+        # Initializing using the address returned from the GEOS 
+        #  createPoint factory.
+        super(Point, self).__init__(create_point(cs), srid=srid)
+
+    def __len__(self):
+        "Returns the number of dimensions for this Point (either 0, 2 or 3)."
+        if self.empty: return 0
+        if self.hasz: return 3
+        else: return 2
+        
+    def get_x(self):
+        "Returns the X component of the Point."
+        return self._cs.getOrdinate(0, 0)
+
+    def set_x(self, value):
+        "Sets the X component of the Point."
+        self._cs.setOrdinate(0, 0, value)
+
+    def get_y(self):
+        "Returns the Y component of the Point."
+        return self._cs.getOrdinate(1, 0)
+
+    def set_y(self, value):
+        "Sets the Y component of the Point."
+        self._cs.setOrdinate(1, 0, value)
+
+    def get_z(self):
+        "Returns the Z component of the Point."
+        if self.hasz:
+            return self._cs.getOrdinate(2, 0)
+        else:
+            return None
+
+    def set_z(self, value):
+        "Sets the Z component of the Point."
+        if self.hasz:
+            self._cs.setOrdinate(2, 0, value)
+        else:
+            raise GEOSException('Cannot set Z on 2D Point.')
+
+    # X, Y, Z properties
+    x = property(get_x, set_x)
+    y = property(get_y, set_y)
+    z = property(get_z, set_z)
+
+    ### Tuple setting and retrieval routines. ###
+    def get_coords(self):
+        "Returns a tuple of the point."
+        return self._cs.tuple
+
+    def set_coords(self, tup):
+        "Sets the coordinates of the point with the given tuple."
+        self._cs[0] = tup
+    
+    # The tuple and coords properties
+    tuple = property(get_coords, set_coords)
+    coords = tuple
+
+class LineString(GEOSGeometry):
+
+    #### Python 'magic' routines ####
+    def __init__(self, *args, **kwargs):
+        """
+        Initializes on the given sequence -- may take lists, tuples, NumPy arrays
+        of X,Y pairs, or Point objects.  If Point objects are used, ownership is
+        _not_ transferred to the LineString object.
+
+        Examples:
+         ls = LineString((1, 1), (2, 2))
+         ls = LineString([(1, 1), (2, 2)])
+         ls = LineString(array([(1, 1), (2, 2)]))
+         ls = LineString(Point(1, 1), Point(2, 2))
+        """
+        # If only one argument provided, set the coords array appropriately
+        if len(args) == 1: coords = args[0]
+        else: coords = args
+
+        if isinstance(coords, (tuple, list)):
+            # Getting the number of coords and the number of dimensions -- which
+            #  must stay the same, e.g., no LineString((1, 2), (1, 2, 3)).
+            ncoords = len(coords)
+            if coords: ndim = len(coords[0])
+            else: raise TypeError('Cannot initialize on empty sequence.')
+            self._checkdim(ndim)
+            # Incrementing through each of the coordinates and verifying
+            for i in xrange(1, ncoords):
+                if not isinstance(coords[i], (tuple, list, Point)):
+                    raise TypeError('each coordinate should be a sequence (list or tuple)')
+                if len(coords[i]) != ndim: raise TypeError('Dimension mismatch.')
+            numpy_coords = False
+        elif HAS_NUMPY and isinstance(coords, ndarray):
+            shape = coords.shape # Using numpy's shape.
+            if len(shape) != 2: raise TypeError('Too many dimensions.')
+            self._checkdim(shape[1])
+            ncoords = shape[0]
+            ndim = shape[1]
+            numpy_coords = True
+        else:
+            raise TypeError('Invalid initialization input for LineStrings.')
+
+        # Creating a coordinate sequence object because it is easier to 
+        #  set the points using GEOSCoordSeq.__setitem__().
+        cs = GEOSCoordSeq(create_cs(ncoords, ndim), z=bool(ndim==3))
+        for i in xrange(ncoords):
+            if numpy_coords: cs[i] = coords[i,:]
+            elif isinstance(coords[i], Point): cs[i] = coords[i].tuple
+            else: cs[i] = coords[i]        
+
+        # Getting the correct initialization function
+        if kwargs.get('ring', False):
+            func = create_linearring
+        else:
+            func = create_linestring
+
+        # If SRID was passed in with the keyword arguments
+        srid = kwargs.get('srid', None)
+       
+        # Calling the base geometry initialization with the returned pointer 
+        #  from the function.
+        super(LineString, self).__init__(func(cs.ptr), srid=srid)
+
+    def __getitem__(self, index):
+        "Gets the point at the specified index."
+        return self._cs[index]
+
+    def __setitem__(self, index, value):
+        "Sets the point at the specified index, e.g., line_str[0] = (1, 2)."
+        self._cs[index] = value
+
+    def __iter__(self):
+        "Allows iteration over this LineString."
+        for i in xrange(len(self)):
+            yield self[i]
+
+    def __len__(self):
+        "Returns the number of points in this LineString."
+        return len(self._cs)
+
+    def _checkdim(self, dim):
+        if dim not in (2, 3): raise TypeError('Dimension mismatch.')
+
+    #### Sequence Properties ####
+    @property
+    def tuple(self):
+        "Returns a tuple version of the geometry from the coordinate sequence."
+        return self._cs.tuple
+    coords = tuple
+
+    def _listarr(self, func):
+        """
+        Internal routine that returns a sequence (list) corresponding with
+        the given function.  Will return a numpy array if possible.
+        """
+        lst = [func(i) for i in xrange(len(self))]
+        if HAS_NUMPY: return array(lst) # ARRRR!
+        else: return lst
+
+    @property
+    def array(self):
+        "Returns a numpy array for the LineString."
+        return self._listarr(self._cs.__getitem__)
+
+    @property
+    def x(self):
+        "Returns a list or numpy array of the X variable."
+        return self._listarr(self._cs.getX)
+    
+    @property
+    def y(self):
+        "Returns a list or numpy array of the Y variable."
+        return self._listarr(self._cs.getY)
+
+    @property
+    def z(self):
+        "Returns a list or numpy array of the Z variable."
+        if not self.hasz: return None
+        else: return self._listarr(self._cs.getZ)
+
+# LinearRings are LineStrings used within Polygons.
+class LinearRing(LineString):
+    def __init__(self, *args, **kwargs):
+        "Overriding the initialization function to set the ring keyword."
+        kwargs['ring'] = True # Setting the ring keyword argument to True
+        super(LinearRing, self).__init__(*args, **kwargs)
+
+class Polygon(GEOSGeometry):
+
+    def __init__(self, *args, **kwargs):
+        """
+        Initializes on an exterior ring and a sequence of holes (both
+        instances may be either LinearRing instances, or a tuple/list
+        that may be constructed into a LinearRing).
+        
+        Examples of initialization, where shell, hole1, and hole2 are 
+        valid LinearRing geometries:
+        >>> poly = Polygon(shell, hole1, hole2)
+        >>> poly = Polygon(shell, (hole1, hole2))
+
+        Example where a tuple parameters are used:
+        >>> poly = Polygon(((0, 0), (0, 10), (10, 10), (0, 10), (0, 0)), 
+                           ((4, 4), (4, 6), (6, 6), (6, 4), (4, 4)))
+        """
+        if not args:
+            raise TypeError('Must provide at list one LinearRing instance to initialize Polygon.')
+
+        # Getting the ext_ring and init_holes parameters from the argument list
+        ext_ring = args[0]
+        init_holes = args[1:]
+        n_holes = len(init_holes)
+
+        # If initialized as Polygon(shell, (LinearRing, LinearRing)) [for backward-compatibility]
+        if n_holes == 1 and isinstance(init_holes[0], (tuple, list)) and \
+                (len(init_holes[0]) == 0 or isinstance(init_holes[0][0], LinearRing)): 
+            init_holes = init_holes[0]
+            n_holes = len(init_holes)
+
+        # Ensuring the exterior ring and holes parameters are LinearRing objects
+        # or may be instantiated into LinearRings.
+        ext_ring = self._construct_ring(ext_ring, 'Exterior parameter must be a LinearRing or an object that can initialize a LinearRing.')
+        holes_list = [] # Create new list, cause init_holes is a tuple.
+        for i in xrange(n_holes):
+            holes_list.append(self._construct_ring(init_holes[i], 'Holes parameter must be a sequence of LinearRings or objects that can initialize to LinearRings'))
+
+        # Why another loop?  Because if a TypeError is raised, cloned pointers will
+        # be around that can't be cleaned up.
+        holes = get_pointer_arr(n_holes)
+        for i in xrange(n_holes): holes[i] = geom_clone(holes_list[i].ptr)
+                      
+        # Getting the shell pointer address.
+        shell = geom_clone(ext_ring.ptr)
+
+        # Calling with the GEOS createPolygon factory.
+        super(Polygon, self).__init__(create_polygon(shell, byref(holes), c_uint(n_holes)), **kwargs)
+
+    def __getitem__(self, index):
+        """
+        Returns the ring at the specified index.  The first index, 0, will 
+        always return the exterior ring.  Indices > 0 will return the 
+        interior ring at the given index (e.g., poly[1] and poly[2] would
+        return the first and second interior ring, respectively).
+        """
+        if index == 0:
+            return self.exterior_ring
+        else:
+            # Getting the interior ring, have to subtract 1 from the index.
+            return self.get_interior_ring(index-1) 
+
+    def __setitem__(self, index, ring):
+        "Sets the ring at the specified index with the given ring."
+        # Checking the index and ring parameters.
+        self._checkindex(index)
+        if not isinstance(ring, LinearRing):
+            raise TypeError('must set Polygon index with a LinearRing object')
+
+        # Getting the shell
+        if index == 0:
+            shell = geom_clone(ring.ptr)
+        else:
+            shell = geom_clone(get_extring(self.ptr))
+
+        # Getting the interior rings (holes)
+        nholes = len(self)-1
+        if nholes > 0:
+            holes = get_pointer_arr(nholes)
+            for i in xrange(nholes):
+                if i == (index-1):
+                    holes[i] = geom_clone(ring.ptr)
+                else:
+                    holes[i] = geom_clone(get_intring(self.ptr, i))
+            holes_param = byref(holes)
+        else:
+            holes_param = None
+         
+        # Getting the current pointer, replacing with the newly constructed
+        # geometry, and destroying the old geometry.
+        prev_ptr = self.ptr
+        srid = self.srid
+        self._ptr = create_polygon(shell, holes_param, c_uint(nholes))
+        if srid: self.srid = srid
+        destroy_geom(prev_ptr)
+
+    def __iter__(self):
+        "Iterates over each ring in the polygon."
+        for i in xrange(len(self)):
+            yield self[i]
+
+    def __len__(self):
+        "Returns the number of rings in this Polygon."
+        return self.num_interior_rings + 1
+
+    def _checkindex(self, index):
+        "Internal routine for checking the given ring index."
+        if index < 0 or index >= len(self):
+            raise GEOSIndexError('invalid Polygon ring index: %s' % index)
+
+    def _construct_ring(self, param, msg=''):
+        "Helper routine for trying to construct a ring from the given parameter."
+        if isinstance(param, LinearRing): return param
+        try:
+            ring = LinearRing(param)
+            return ring
+        except TypeError:
+            raise TypeError(msg)
+
+    def get_interior_ring(self, ring_i):
+        """
+        Gets the interior ring at the specified index, 0 is for the first 
+        interior ring, not the exterior ring.
+        """
+        self._checkindex(ring_i+1)
+        return GEOSGeometry(geom_clone(get_intring(self.ptr, ring_i)), srid=self.srid)
+                                                        
+    #### Polygon Properties ####
+    @property
+    def num_interior_rings(self):
+        "Returns the number of interior rings."
+        # Getting the number of rings
+        return get_nrings(self.ptr)
+
+    def get_ext_ring(self):
+        "Gets the exterior ring of the Polygon."
+        return GEOSGeometry(geom_clone(get_extring(self.ptr)), srid=self.srid)
+
+    def set_ext_ring(self, ring):
+        "Sets the exterior ring of the Polygon."
+        self[0] = ring
+
+    # properties for the exterior ring/shell
+    exterior_ring = property(get_ext_ring, set_ext_ring)
+    shell = exterior_ring
+    
+    @property
+    def tuple(self):
+        "Gets the tuple for each ring in this Polygon."
+        return tuple([self[i].tuple for i in xrange(len(self))])
+    coords = tuple
+
+    @property
+    def kml(self):
+        "Returns the KML representation of this Polygon."
+        inner_kml = ''.join(["<innerBoundaryIs>%s</innerBoundaryIs>" % self[i+1].kml 
+                             for i in xrange(self.num_interior_rings)])
+        return "<Polygon><outerBoundaryIs>%s</outerBoundaryIs>%s</Polygon>" % (self[0].kml, inner_kml)
diff --git a/webapp/django/contrib/gis/geos/libgeos.py b/webapp/django/contrib/gis/geos/libgeos.py
new file mode 100644
index 0000000..d2990a6
--- /dev/null
+++ b/webapp/django/contrib/gis/geos/libgeos.py
@@ -0,0 +1,126 @@
+"""
+ This module houses the ctypes initialization procedures, as well
+ as the notice and error handler function callbacks (get called
+ when an error occurs in GEOS).
+
+ This module also houses GEOS Pointer utilities, including
+ get_pointer_arr(), and GEOM_PTR.
+"""
+import atexit, os, re, sys
+from ctypes import c_char_p, Structure, CDLL, CFUNCTYPE, POINTER
+from ctypes.util import find_library
+from django.contrib.gis.geos.error import GEOSException
+
+# NumPy supported?
+try:
+    from numpy import array, ndarray
+    HAS_NUMPY = True
+except ImportError:
+    HAS_NUMPY = False
+
+# Custom library path set?
+try:
+    from django.conf import settings
+    lib_path = settings.GEOS_LIBRARY_PATH
+except (AttributeError, EnvironmentError, ImportError):
+    lib_path = None
+
+# Setting the appropriate names for the GEOS-C library.
+if lib_path:
+    lib_names = None
+elif os.name == 'nt':
+    # Windows NT libraries
+    lib_names = ['libgeos_c-1']
+elif os.name == 'posix':
+    # *NIX libraries
+    lib_names = ['geos_c']
+else:
+    raise GEOSException('Unsupported OS "%s"' % os.name)
+
+# Using the ctypes `find_library` utility to find the the path to the GEOS 
+# shared library.  This is better than manually specifiying each library name 
+# and extension (e.g., libgeos_c.[so|so.1|dylib].).
+if lib_names: 
+    for lib_name in lib_names:
+        lib_path = find_library(lib_name)
+        if not lib_path is None: break
+
+# No GEOS library could be found.
+if lib_path is None: 
+    raise GEOSException('Could not find the GEOS library (tried "%s"). '
+                        'Try setting GEOS_LIBRARY_PATH in your settings.' % 
+                        '", "'.join(lib_names))
+
+# Getting the GEOS C library.  The C interface (CDLL) is used for
+#  both *NIX and Windows.
+# See the GEOS C API source code for more details on the library function calls:
+#  http://geos.refractions.net/ro/doxygen_docs/html/geos__c_8h-source.html
+lgeos = CDLL(lib_path)
+
+# The notice and error handler C function callback definitions.
+#  Supposed to mimic the GEOS message handler (C below):
+#  "typedef void (*GEOSMessageHandler)(const char *fmt, ...);"
+NOTICEFUNC = CFUNCTYPE(None, c_char_p, c_char_p)
+def notice_h(fmt, lst, output_h=sys.stdout):
+    try:
+        warn_msg = fmt % lst
+    except:
+        warn_msg = fmt 
+    output_h.write('GEOS_NOTICE: %s\n' % warn_msg)
+notice_h = NOTICEFUNC(notice_h)
+
+ERRORFUNC = CFUNCTYPE(None, c_char_p, c_char_p)
+def error_h(fmt, lst, output_h=sys.stderr):
+    try:
+        err_msg = fmt % lst
+    except:
+        err_msg = fmt
+    output_h.write('GEOS_ERROR: %s\n' % err_msg)
+error_h = ERRORFUNC(error_h)
+
+# The initGEOS routine should be called first, however, that routine takes
+#  the notice and error functions as parameters.  Here is the C code that
+#  is wrapped:
+#  "extern void GEOS_DLL initGEOS(GEOSMessageHandler notice_function, GEOSMessageHandler error_function);"
+lgeos.initGEOS(notice_h, error_h)
+
+#### GEOS Geometry C data structures, and utility functions. ####
+
+# Opaque GEOS geometry structures, used for GEOM_PTR and CS_PTR
+class GEOSGeom_t(Structure): pass
+class GEOSCoordSeq_t(Structure): pass
+
+# Pointers to opaque GEOS geometry structures.
+GEOM_PTR = POINTER(GEOSGeom_t)
+CS_PTR = POINTER(GEOSCoordSeq_t)
+
+# Used specifically by the GEOSGeom_createPolygon and GEOSGeom_createCollection 
+#  GEOS routines
+def get_pointer_arr(n):
+    "Gets a ctypes pointer array (of length `n`) for GEOSGeom_t opaque pointer."
+    GeomArr = GEOM_PTR * n
+    return GeomArr()
+
+# Returns the string version of the GEOS library. Have to set the restype 
+# explicitly to c_char_p to ensure compatibility accross 32 and 64-bit platforms.
+geos_version = lgeos.GEOSversion
+geos_version.argtypes = None   
+geos_version.restype = c_char_p
+
+# Regular expression should be able to parse version strings such as
+# '3.0.0rc4-CAPI-1.3.3', or '3.0.0-CAPI-1.4.1'
+version_regex = re.compile(r'^(?P<version>\d+\.\d+\.\d+)(rc(?P<release_candidate>\d+))?-CAPI-(?P<capi_version>\d+\.\d+\.\d+)$')
+def geos_version_info():
+    """
+    Returns a dictionary containing the various version metadata parsed from
+    the GEOS version string, including the version number, whether the version
+    is a release candidate (and what number release candidate), and the C API
+    version.
+    """
+    ver = geos_version()
+    m = version_regex.match(ver)
+    if not m: raise GEOSException('Could not parse version info string "%s"' % ver)
+    return dict((key, m.group(key)) for key in ('version', 'release_candidate', 'capi_version'))
+
+# Calling the finishGEOS() upon exit of the interpreter.
+atexit.register(lgeos.finishGEOS)
diff --git a/webapp/django/contrib/gis/geos/prototypes/__init__.py b/webapp/django/contrib/gis/geos/prototypes/__init__.py
new file mode 100644
index 0000000..b4639f3
--- /dev/null
+++ b/webapp/django/contrib/gis/geos/prototypes/__init__.py
@@ -0,0 +1,33 @@
+"""
+ This module contains all of the GEOS ctypes function prototypes. Each
+ prototype handles the interaction between the GEOS library and Python
+ via ctypes.
+"""
+
+# Coordinate sequence routines.
+from django.contrib.gis.geos.prototypes.coordseq import create_cs, get_cs, \
+    cs_clone, cs_getordinate, cs_setordinate, cs_getx, cs_gety, cs_getz, \
+    cs_setx, cs_sety, cs_setz, cs_getsize, cs_getdims
+
+# Geometry routines.
+from django.contrib.gis.geos.prototypes.geom import from_hex, from_wkb, from_wkt, \
+    create_point, create_linestring, create_linearring, create_polygon, create_collection, \
+    destroy_geom, get_extring, get_intring, get_nrings, get_geomn, geom_clone, \
+    geos_normalize, geos_type, geos_typeid, geos_get_srid, geos_set_srid, \
+    get_dims, get_num_coords, get_num_geoms, \
+    to_hex, to_wkb, to_wkt
+
+# Miscellaneous routines.
+from django.contrib.gis.geos.prototypes.misc import geos_area, geos_distance, geos_length
+
+# Predicates
+from django.contrib.gis.geos.prototypes.predicates import geos_hasz, geos_isempty, \
+    geos_isring, geos_issimple, geos_isvalid, geos_contains, geos_crosses, \
+    geos_disjoint, geos_equals, geos_equalsexact, geos_intersects, \
+    geos_intersects, geos_overlaps, geos_relatepattern, geos_touches, geos_within
+
+# Topology routines
+from django.contrib.gis.geos.prototypes.topology import \
+    geos_boundary, geos_buffer, geos_centroid, geos_convexhull, geos_difference, \
+    geos_envelope, geos_intersection, geos_pointonsurface, geos_preservesimplify, \
+    geos_simplify, geos_symdifference, geos_union, geos_relate
diff --git a/webapp/django/contrib/gis/geos/prototypes/coordseq.py b/webapp/django/contrib/gis/geos/prototypes/coordseq.py
new file mode 100644
index 0000000..3b5fb2c
--- /dev/null
+++ b/webapp/django/contrib/gis/geos/prototypes/coordseq.py
@@ -0,0 +1,82 @@
+from ctypes import c_double, c_int, c_uint, POINTER
+from django.contrib.gis.geos.libgeos import lgeos, GEOM_PTR, CS_PTR
+from django.contrib.gis.geos.prototypes.errcheck import last_arg_byref, GEOSException
+
+## Error-checking routines specific to coordinate sequences. ##
+def check_cs_ptr(result, func, cargs):
+    "Error checking on routines that return Geometries."
+    if not result:
+        raise GEOSException('Error encountered checking Coordinate Sequence returned from GEOS C function "%s".' % func.__name__)
+    return result
+
+def check_cs_op(result, func, cargs):
+    "Checks the status code of a coordinate sequence operation."
+    if result == 0:
+        raise GEOSException('Could not set value on coordinate sequence')
+    else:
+        return result
+
+def check_cs_get(result, func, cargs):
+    "Checking the coordinate sequence retrieval."
+    check_cs_op(result, func, cargs)
+    # Object in by reference, return its value.
+    return last_arg_byref(cargs)
+
+## Coordinate sequence prototype generation functions. ##
+def cs_int(func):
+    "For coordinate sequence routines that return an integer."
+    func.argtypes = [CS_PTR, POINTER(c_uint)]
+    func.restype = c_int
+    func.errcheck = check_cs_get
+    return func
+
+def cs_operation(func, ordinate=False, get=False):
+    "For coordinate sequence operations."
+    if get:
+        # Get routines get double parameter passed-in by reference.
+        func.errcheck = check_cs_get
+        dbl_param = POINTER(c_double)
+    else:
+        func.errcheck = check_cs_op
+        dbl_param = c_double
+
+    if ordinate:
+        # Get/Set ordinate routines have an extra uint parameter.
+        func.argtypes = [CS_PTR, c_uint, c_uint, dbl_param]
+    else:
+        func.argtypes = [CS_PTR, c_uint, dbl_param]
+
+    func.restype = c_int
+    return func
+
+def cs_output(func, argtypes):
+    "For routines that return a coordinate sequence."
+    func.argtypes = argtypes
+    func.restype = CS_PTR
+    func.errcheck = check_cs_ptr
+    return func
+
+## Coordinate Sequence ctypes prototypes ##
+
+# Coordinate Sequence constructors & cloning.
+cs_clone = cs_output(lgeos.GEOSCoordSeq_clone, [CS_PTR])
+create_cs = cs_output(lgeos.GEOSCoordSeq_create, [c_uint, c_uint])
+get_cs = cs_output(lgeos.GEOSGeom_getCoordSeq, [GEOM_PTR])
+
+# Getting, setting ordinate
+cs_getordinate = cs_operation(lgeos.GEOSCoordSeq_getOrdinate, ordinate=True, get=True)
+cs_setordinate = cs_operation(lgeos.GEOSCoordSeq_setOrdinate, ordinate=True)
+
+# For getting, x, y, z
+cs_getx = cs_operation(lgeos.GEOSCoordSeq_getX, get=True)
+cs_gety = cs_operation(lgeos.GEOSCoordSeq_getY, get=True)
+cs_getz = cs_operation(lgeos.GEOSCoordSeq_getZ, get=True)
+
+# For setting, x, y, z
+cs_setx = cs_operation(lgeos.GEOSCoordSeq_setX)
+cs_sety = cs_operation(lgeos.GEOSCoordSeq_setY)
+cs_setz = cs_operation(lgeos.GEOSCoordSeq_setZ)
+
+# These routines return size & dimensions.
+cs_getsize = cs_int(lgeos.GEOSCoordSeq_getSize)
+cs_getdims = cs_int(lgeos.GEOSCoordSeq_getDimensions)
diff --git a/webapp/django/contrib/gis/geos/prototypes/errcheck.py b/webapp/django/contrib/gis/geos/prototypes/errcheck.py
new file mode 100644
index 0000000..6fcc1a7
--- /dev/null
+++ b/webapp/django/contrib/gis/geos/prototypes/errcheck.py
@@ -0,0 +1,76 @@
+"""
+ Error checking functions for GEOS ctypes prototype functions.
+"""
+import os
+from ctypes import string_at, CDLL
+from ctypes.util import find_library
+from django.contrib.gis.geos.error import GEOSException
+
+# Getting the C library, needed to free the string pointers
+# returned from GEOS.
+if os.name == 'nt':
+    libc_name = 'msvcrt'
+else:
+    libc_name = 'libc'
+libc = CDLL(find_library(libc_name))
+
+### ctypes error checking routines ###
+def last_arg_byref(args):
+    "Returns the last C argument's by reference value."
+    return args[-1]._obj.value
+        
+def check_dbl(result, func, cargs):
+    "Checks the status code and returns the double value passed in by reference."
+    # Checking the status code
+    if result != 1: return None
+    # Double passed in by reference, return its value.
+    return last_arg_byref(cargs)
+
+def check_geom(result, func, cargs):
+    "Error checking on routines that return Geometries."
+    if not result: 
+        raise GEOSException('Error encountered checking Geometry returned from GEOS C function "%s".' % func.__name__)
+    return result
+
+def check_minus_one(result, func, cargs):
+    "Error checking on routines that should not return -1."
+    if result == -1:
+        raise GEOSException('Error encountered in GEOS C function "%s".' % func.__name__)
+    else:
+        return result
+
+def check_predicate(result, func, cargs):
+    "Error checking for unary/binary predicate functions."
+    val = ord(result) # getting the ordinal from the character
+    if val == 1: return True
+    elif val == 0: return False
+    else:
+        raise GEOSException('Error encountered on GEOS C predicate function "%s".' % func.__name__)
+
+def check_sized_string(result, func, cargs):
+    "Error checking for routines that return explicitly sized strings."
+    if not result:
+        raise GEOSException('Invalid string pointer returned by GEOS C function "%s"' % func.__name__)
+    # A c_size_t object is passed in by reference for the second
+    # argument on these routines, and its needed to determine the
+    # correct size.
+    s = string_at(result, last_arg_byref(cargs))
+    libc.free(result)
+    return s
+
+def check_string(result, func, cargs):
+    "Error checking for routines that return strings."
+    if not result: raise GEOSException('Error encountered checking string return value in GEOS C function "%s".' % func.__name__)
+    # Getting the string value at the pointer address.
+    s = string_at(result)
+    # Freeing the memory allocated by the GEOS library.
+    libc.free(result)
+    return s
+
+def check_zero(result, func, cargs):
+    "Error checking on routines that should not return 0."
+    if result == 0:
+        raise GEOSException('Error encountered in GEOS C function "%s".' % func.__name__)
+    else:
+        return result
+                            
diff --git a/webapp/django/contrib/gis/geos/prototypes/geom.py b/webapp/django/contrib/gis/geos/prototypes/geom.py
new file mode 100644
index 0000000..e5942a5
--- /dev/null
+++ b/webapp/django/contrib/gis/geos/prototypes/geom.py
@@ -0,0 +1,111 @@
+from ctypes import c_char_p, c_int, c_size_t, c_uint, POINTER
+from django.contrib.gis.geos.libgeos import lgeos, CS_PTR, GEOM_PTR
+from django.contrib.gis.geos.prototypes.errcheck import \
+    check_geom, check_minus_one, check_sized_string, check_string, check_zero
+
+### ctypes generation functions ###
+def bin_constructor(func):
+    "Generates a prototype for binary construction (HEX, WKB) GEOS routines."
+    func.argtypes = [c_char_p, c_size_t]
+    func.restype = GEOM_PTR
+    func.errcheck = check_geom
+    return func
+
+# HEX & WKB output
+def bin_output(func):
+    "Generates a prototype for the routines that return a a sized string."
+    func.argtypes = [GEOM_PTR, POINTER(c_size_t)]
+    func.errcheck = check_sized_string
+    return func
+
+def geom_output(func, argtypes):
+    "For GEOS routines that return a geometry."
+    if argtypes: func.argtypes = argtypes
+    func.restype = GEOM_PTR
+    func.errcheck = check_geom
+    return func
+
+def geom_index(func):
+    "For GEOS routines that return geometries from an index."
+    return geom_output(func, [GEOM_PTR, c_int])
+
+def int_from_geom(func, zero=False):
+    "Argument is a geometry, return type is an integer."
+    func.argtypes = [GEOM_PTR]
+    func.restype = c_int
+    if zero: 
+        func.errcheck = check_zero
+    else:
+        func.errcheck = check_minus_one
+    return func
+
+def string_from_geom(func):
+    "Argument is a Geometry, return type is a string."
+    # We do _not_ specify an argument type because we want just an
+    # address returned from the function.
+    func.argtypes = [GEOM_PTR]
+    func.errcheck = check_string
+    return func
+
+### ctypes prototypes ###
+
+# TODO: Tell all users to use GEOS 3.0.0, instead of the release 
+#  candidates, and use the new Reader and Writer APIs (e.g.,
+#  GEOSWKT[Reader|Writer], GEOSWKB[Reader|Writer]).  A good time
+#  to do this will be when Refractions releases a Windows PostGIS
+#  installer using GEOS 3.0.0.
+
+# Creation routines from WKB, HEX, WKT
+from_hex = bin_constructor(lgeos.GEOSGeomFromHEX_buf)
+from_wkb = bin_constructor(lgeos.GEOSGeomFromWKB_buf)
+from_wkt = geom_output(lgeos.GEOSGeomFromWKT, [c_char_p])
+
+# Output routines
+to_hex = bin_output(lgeos.GEOSGeomToHEX_buf)
+to_wkb = bin_output(lgeos.GEOSGeomToWKB_buf)
+to_wkt = string_from_geom(lgeos.GEOSGeomToWKT)
+
+# The GEOS geometry type, typeid, num_coordites and number of geometries
+geos_normalize = int_from_geom(lgeos.GEOSNormalize)
+geos_type = string_from_geom(lgeos.GEOSGeomType)
+geos_typeid = int_from_geom(lgeos.GEOSGeomTypeId)
+get_dims = int_from_geom(lgeos.GEOSGeom_getDimensions, zero=True)
+get_num_coords = int_from_geom(lgeos.GEOSGetNumCoordinates)
+get_num_geoms = int_from_geom(lgeos.GEOSGetNumGeometries)
+
+# Geometry creation factories
+create_point = geom_output(lgeos.GEOSGeom_createPoint, [CS_PTR])
+create_linestring = geom_output(lgeos.GEOSGeom_createLineString, [CS_PTR]) 
+create_linearring = geom_output(lgeos.GEOSGeom_createLinearRing, [CS_PTR])
+
+# Polygon and collection creation routines are special and will not
+# have their argument types defined.
+create_polygon = geom_output(lgeos.GEOSGeom_createPolygon, None)
+create_collection = geom_output(lgeos.GEOSGeom_createCollection, None)
+
+# Ring routines
+get_extring = geom_output(lgeos.GEOSGetExteriorRing, [GEOM_PTR])
+get_intring = geom_index(lgeos.GEOSGetInteriorRingN)
+get_nrings = int_from_geom(lgeos.GEOSGetNumInteriorRings)
+
+# Collection Routines
+get_geomn = geom_index(lgeos.GEOSGetGeometryN)
+
+# Cloning
+geom_clone = lgeos.GEOSGeom_clone
+geom_clone.argtypes = [GEOM_PTR]
+geom_clone.restype = GEOM_PTR
+
+# Destruction routine.
+destroy_geom = lgeos.GEOSGeom_destroy
+destroy_geom.argtypes = [GEOM_PTR]
+destroy_geom.restype = None
+
+# SRID routines
+geos_get_srid = lgeos.GEOSGetSRID
+geos_get_srid.argtypes = [GEOM_PTR]
+geos_get_srid.restype = c_int
+
+geos_set_srid = lgeos.GEOSSetSRID
+geos_set_srid.argtypes = [GEOM_PTR, c_int]
+geos_set_srid.restype = None
diff --git a/webapp/django/contrib/gis/geos/prototypes/misc.py b/webapp/django/contrib/gis/geos/prototypes/misc.py
new file mode 100644
index 0000000..255da91
--- /dev/null
+++ b/webapp/django/contrib/gis/geos/prototypes/misc.py
@@ -0,0 +1,27 @@
+"""
+ This module is for the miscellaneous GEOS routines, particularly the
+ ones that return the area, distance, and length.
+"""
+from ctypes import c_int, c_double, POINTER
+from django.contrib.gis.geos.libgeos import lgeos, GEOM_PTR
+from django.contrib.gis.geos.prototypes.errcheck import check_dbl
+
+### ctypes generator function ###
+def dbl_from_geom(func, num_geom=1):
+    """
+    Argument is a Geometry, return type is double that is passed
+    in by reference as the last argument.
+    """
+    argtypes = [GEOM_PTR for i in xrange(num_geom)]
+    argtypes += [POINTER(c_double)]
+    func.argtypes = argtypes
+    func.restype = c_int # Status code returned
+    func.errcheck = check_dbl
+    return func
+
+### ctypes prototypes ###
+
+# Area, distance, and length prototypes.
+geos_area = dbl_from_geom(lgeos.GEOSArea)
+geos_distance = dbl_from_geom(lgeos.GEOSDistance, num_geom=2)
+geos_length = dbl_from_geom(lgeos.GEOSLength)
diff --git a/webapp/django/contrib/gis/geos/prototypes/predicates.py b/webapp/django/contrib/gis/geos/prototypes/predicates.py
new file mode 100644
index 0000000..45240d9
--- /dev/null
+++ b/webapp/django/contrib/gis/geos/prototypes/predicates.py
@@ -0,0 +1,43 @@
+"""
+ This module houses the GEOS ctypes prototype functions for the 
+ unary and binary predicate operations on geometries.
+"""
+from ctypes import c_char, c_char_p, c_double
+from django.contrib.gis.geos.libgeos import lgeos, GEOM_PTR
+from django.contrib.gis.geos.prototypes.errcheck import check_predicate
+
+## Binary & unary predicate functions ##
+def binary_predicate(func, *args):
+    "For GEOS binary predicate functions."
+    argtypes = [GEOM_PTR, GEOM_PTR]
+    if args: argtypes += args
+    func.argtypes = argtypes
+    func.restype = c_char
+    func.errcheck = check_predicate
+    return func
+
+def unary_predicate(func):
+    "For GEOS unary predicate functions."
+    func.argtypes = [GEOM_PTR]
+    func.restype = c_char
+    func.errcheck = check_predicate
+    return func
+
+## Unary Predicates ##
+geos_hasz = unary_predicate(lgeos.GEOSHasZ)
+geos_isempty = unary_predicate(lgeos.GEOSisEmpty)
+geos_isring = unary_predicate(lgeos.GEOSisRing)
+geos_issimple = unary_predicate(lgeos.GEOSisSimple)
+geos_isvalid = unary_predicate(lgeos.GEOSisValid)
+
+## Binary Predicates ##
+geos_contains = binary_predicate(lgeos.GEOSContains)
+geos_crosses = binary_predicate(lgeos.GEOSCrosses)
+geos_disjoint = binary_predicate(lgeos.GEOSDisjoint)
+geos_equals = binary_predicate(lgeos.GEOSEquals)
+geos_equalsexact = binary_predicate(lgeos.GEOSEqualsExact, c_double)
+geos_intersects = binary_predicate(lgeos.GEOSIntersects)
+geos_overlaps = binary_predicate(lgeos.GEOSOverlaps)
+geos_relatepattern = binary_predicate(lgeos.GEOSRelatePattern, c_char_p)
+geos_touches = binary_predicate(lgeos.GEOSTouches)
+geos_within = binary_predicate(lgeos.GEOSWithin)
diff --git a/webapp/django/contrib/gis/geos/prototypes/topology.py b/webapp/django/contrib/gis/geos/prototypes/topology.py
new file mode 100644
index 0000000..70cf900
--- /dev/null
+++ b/webapp/django/contrib/gis/geos/prototypes/topology.py
@@ -0,0 +1,35 @@
+"""
+ This module houses the GEOS ctypes prototype functions for the 
+ topological operations on geometries.
+"""
+from ctypes import c_char_p, c_double, c_int
+from django.contrib.gis.geos.libgeos import lgeos, GEOM_PTR
+from django.contrib.gis.geos.prototypes.errcheck import check_geom, check_string
+
+def topology(func, *args):
+    "For GEOS unary topology functions."
+    argtypes = [GEOM_PTR]
+    if args: argtypes += args
+    func.argtypes = argtypes
+    func.restype = GEOM_PTR
+    func.errcheck = check_geom
+    return func
+
+### Topology Routines ###
+geos_boundary = topology(lgeos.GEOSBoundary)
+geos_buffer = topology(lgeos.GEOSBuffer, c_double, c_int)
+geos_centroid = topology(lgeos.GEOSGetCentroid)
+geos_convexhull = topology(lgeos.GEOSConvexHull)
+geos_difference = topology(lgeos.GEOSDifference, GEOM_PTR)
+geos_envelope = topology(lgeos.GEOSEnvelope)
+geos_intersection = topology(lgeos.GEOSIntersection, GEOM_PTR)
+geos_pointonsurface = topology(lgeos.GEOSPointOnSurface)
+geos_preservesimplify = topology(lgeos.GEOSTopologyPreserveSimplify, c_double)
+geos_simplify = topology(lgeos.GEOSSimplify, c_double)
+geos_symdifference = topology(lgeos.GEOSSymDifference, GEOM_PTR)
+geos_union = topology(lgeos.GEOSUnion, GEOM_PTR)
+
+# GEOSRelate returns a string, not a geometry.
+geos_relate = lgeos.GEOSRelate
+geos_relate.argtypes = [GEOM_PTR, GEOM_PTR]
+geos_relate.errcheck = check_string
diff --git a/webapp/django/contrib/gis/management/__init__.py b/webapp/django/contrib/gis/management/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/gis/management/__init__.py
diff --git a/webapp/django/contrib/gis/management/base.py b/webapp/django/contrib/gis/management/base.py
new file mode 100644
index 0000000..c998063
--- /dev/null
+++ b/webapp/django/contrib/gis/management/base.py
@@ -0,0 +1,15 @@
+from django.core.management.base import BaseCommand, CommandError
+
+class ArgsCommand(BaseCommand):
+    """
+    Command class for commands that take multiple arguments.
+    """
+    args = '<arg arg ...>'
+
+    def handle(self, *args, **options):
+        if not args:
+            raise CommandError('Must provide the following arguments: %s' % self.args)
+        return self.handle_args(*args, **options)
+
+    def handle_args(self, *args, **options):
+        raise NotImplementedError()
diff --git a/webapp/django/contrib/gis/management/commands/__init__.py b/webapp/django/contrib/gis/management/commands/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/gis/management/commands/__init__.py
diff --git a/webapp/django/contrib/gis/management/commands/inspectdb.py b/webapp/django/contrib/gis/management/commands/inspectdb.py
new file mode 100644
index 0000000..d4fe210
--- /dev/null
+++ b/webapp/django/contrib/gis/management/commands/inspectdb.py
@@ -0,0 +1,188 @@
+"""
+ This overrides the traditional `inspectdb` command so that geographic databases
+ may be introspected.
+"""
+
+from django.core.management.commands.inspectdb import Command as InspectCommand
+from django.contrib.gis.db.backend import SpatialBackend
+
+class Command(InspectCommand):
+
+    # Mapping from lower-case OGC type to the corresponding GeoDjango field.
+    geofield_mapping = {'point' : 'PointField',
+                        'linestring' : 'LineStringField',
+                        'polygon' : 'PolygonField',
+                        'multipoint' : 'MultiPointField',
+                        'multilinestring' : 'MultiLineStringField',
+                        'multipolygon' : 'MultiPolygonField',
+                        'geometrycollection' : 'GeometryCollectionField',
+                        'geometry' : 'GeometryField',
+                        }
+
+    def geometry_columns(self):
+        """
+        Returns a datastructure of metadata information associated with the
+        `geometry_columns` (or equivalent) table.
+        """
+        # The `geo_cols` is a dictionary data structure that holds information
+        # about any geographic columns in the database.
+        geo_cols = {}
+        def add_col(table, column, coldata):
+            if table in geo_cols:
+                # If table already has a geometry column.
+                geo_cols[table][column] = coldata
+            else:
+                # Otherwise, create a dictionary indexed by column.
+                geo_cols[table] = { column : coldata }
+
+        if SpatialBackend.name == 'postgis':
+            # PostGIS holds all geographic column information in the `geometry_columns` table.
+            from django.contrib.gis.models import GeometryColumns
+            for geo_col in GeometryColumns.objects.all():
+                table = geo_col.f_table_name
+                column = geo_col.f_geometry_column
+                coldata = {'type' : geo_col.type, 'srid' : geo_col.srid, 'dim' : geo_col.coord_dimension}
+                add_col(table, column, coldata)
+            return geo_cols
+        elif SpatialBackend.name == 'mysql':
+            # On MySQL have to get all table metadata before hand; this means walking through
+            # each table and seeing if any column types are spatial.  Can't detect this with
+            # `cursor.description` (what the introspection module does) because all spatial types
+            # have the same integer type (255 for GEOMETRY).
+            from django.db import connection
+            cursor = connection.cursor()
+            cursor.execute('SHOW TABLES')
+            tables = cursor.fetchall();
+            for table_tup in tables:
+                table = table_tup[0]
+                table_desc = cursor.execute('DESCRIBE `%s`' % table)
+                col_info = cursor.fetchall()
+                for column, typ, null, key, default, extra in col_info:
+                    if typ in self.geofield_mapping: add_col(table, column, {'type' : typ})
+            return geo_cols
+        else:
+            # TODO: Oracle (has incomplete `geometry_columns` -- have to parse
+            #  SDO SQL to get specific type, SRID, and other information).
+            raise NotImplementedError('Geographic database inspection not available.')
+
+    def handle_inspection(self):
+        "Overloaded from Django's version to handle geographic database tables."
+        from django.db import connection
+        import keyword
+
+        geo_cols = self.geometry_columns()
+
+        table2model = lambda table_name: table_name.title().replace('_', '')
+
+        cursor = connection.cursor()
+        yield "# This is an auto-generated Django model module."
+        yield "# You'll have to do the following manually to clean this up:"
+        yield "#     * Rearrange models' order"
+        yield "#     * Make sure each model has one field with primary_key=True"
+        yield "# Feel free to rename the models, but don't rename db_table values or field names."
+        yield "#"
+        yield "# Also note: You'll have to insert the output of 'django-admin.py sqlcustom [appname]'"
+        yield "# into your database."
+        yield ''
+        yield 'from django.contrib.gis.db import models'
+        yield ''
+        for table_name in connection.introspection.get_table_list(cursor):
+            # Getting the geographic table dictionary.
+            geo_table = geo_cols.get(table_name, {})
+
+            yield 'class %s(models.Model):' % table2model(table_name)
+            try:
+                relations = connection.introspection.get_relations(cursor, table_name)
+            except NotImplementedError:
+                relations = {}
+            try:
+                indexes = connection.introspection.get_indexes(cursor, table_name)
+            except NotImplementedError:
+                indexes = {}
+            for i, row in enumerate(connection.introspection.get_table_description(cursor, table_name)):
+                att_name, iatt_name = row[0].lower(), row[0]
+                comment_notes = [] # Holds Field notes, to be displayed in a Python comment.
+                extra_params = {}  # Holds Field parameters such as 'db_column'.
+
+                if ' ' in att_name:
+                    extra_params['db_column'] = att_name
+                    att_name = att_name.replace(' ', '')
+                    comment_notes.append('Field renamed to remove spaces.')
+                if keyword.iskeyword(att_name):
+                    extra_params['db_column'] = att_name
+                    att_name += '_field'
+                    comment_notes.append('Field renamed because it was a Python reserved word.')
+
+                if i in relations:
+                    rel_to = relations[i][1] == table_name and "'self'" or table2model(relations[i][1])
+                    field_type = 'ForeignKey(%s' % rel_to
+                    if att_name.endswith('_id'):
+                        att_name = att_name[:-3]
+                    else:
+                        extra_params['db_column'] = att_name
+                else:
+                    if iatt_name in geo_table:
+                        ## Customization for Geographic Columns ##
+                        geo_col = geo_table[iatt_name]
+                        field_type = self.geofield_mapping[geo_col['type'].lower()]
+                        # Adding extra keyword arguments for the SRID and dimension (if not defaults).
+                        dim, srid = geo_col.get('dim', 2), geo_col.get('srid', 4326)
+                        if dim != 2: extra_params['dim'] = dim
+                        if srid != 4326: extra_params['srid'] = srid
+                    else:
+                        try:
+                            field_type = connection.introspection.data_types_reverse[row[1]]
+                        except KeyError:
+                            field_type = 'TextField'
+                            comment_notes.append('This field type is a guess.')
+
+                    # This is a hook for data_types_reverse to return a tuple of
+                    # (field_type, extra_params_dict).
+                    if type(field_type) is tuple:
+                        field_type, new_params = field_type
+                        extra_params.update(new_params)
+
+                    # Add max_length for all CharFields.
+                    if field_type == 'CharField' and row[3]:
+                        extra_params['max_length'] = row[3]
+
+                    if field_type == 'DecimalField':
+                        extra_params['max_digits'] = row[4]
+                        extra_params['decimal_places'] = row[5]
+
+                    # Add primary_key and unique, if necessary.
+                    column_name = extra_params.get('db_column', att_name)
+                    if column_name in indexes:
+                        if indexes[column_name]['primary_key']:
+                            extra_params['primary_key'] = True
+                        elif indexes[column_name]['unique']:
+                            extra_params['unique'] = True
+
+                    field_type += '('
+
+                # Don't output 'id = meta.AutoField(primary_key=True)', because
+                # that's assumed if it doesn't exist.
+                if att_name == 'id' and field_type == 'AutoField(' and extra_params == {'primary_key': True}:
+                    continue
+
+                # Add 'null' and 'blank', if the 'null_ok' flag was present in the
+                # table description.
+                if row[6]: # If it's NULL...
+                    extra_params['blank'] = True
+                    if not field_type in ('TextField(', 'CharField('):
+                        extra_params['null'] = True
+
+                field_desc = '%s = models.%s' % (att_name, field_type)
+                if extra_params:
+                    if not field_desc.endswith('('):
+                        field_desc += ', '
+                    field_desc += ', '.join(['%s=%r' % (k, v) for k, v in extra_params.items()])
+                field_desc += ')'
+                if comment_notes:
+                    field_desc += ' # ' + ' '.join(comment_notes)
+                yield '    %s' % field_desc
+            if table_name in geo_cols:
+                yield '    objects = models.GeoManager()'
+            yield '    class Meta:'
+            yield '        db_table = %r' % table_name
+            yield ''
diff --git a/webapp/django/contrib/gis/management/commands/ogrinspect.py b/webapp/django/contrib/gis/management/commands/ogrinspect.py
new file mode 100644
index 0000000..aa4f418
--- /dev/null
+++ b/webapp/django/contrib/gis/management/commands/ogrinspect.py
@@ -0,0 +1,119 @@
+import os, sys
+from optparse import make_option
+from django.contrib.gis import gdal
+from django.contrib.gis.management.base import ArgsCommand, CommandError
+
+def layer_option(option, opt, value, parser):
+    """
+    Callback for `make_option` for the `ogrinspect` `layer_key`
+    keyword option which may be an integer or a string.
+    """
+    try:
+        dest = int(value)
+    except ValueError:
+        dest = value
+    setattr(parser.values, option.dest, dest)
+
+def list_option(option, opt, value, parser):
+    """
+    Callback for `make_option` for `ogrinspect` keywords that require
+    a string list.  If the string is 'True'/'true' then the option 
+    value will be a boolean instead.
+    """
+    if value.lower() == 'true':
+        dest = True
+    else:
+        dest = [s for s in value.split(',')]
+    setattr(parser.values, option.dest, dest)
+    
+class Command(ArgsCommand):
+    help = ('Inspects the given OGR-compatible data source (e.g., a shapefile) and outputs\n'
+            'a GeoDjango model with the given model name. For example:\n'
+            ' ./manage.py ogrinspect zipcode.shp Zipcode')
+    args = '[data_source] [model_name]'
+
+    option_list = ArgsCommand.option_list + (
+        make_option('--blank', dest='blank', type='string', action='callback',  
+                    callback=list_option, default=False,
+                    help='Use a comma separated list of OGR field names to add '
+                    'the `blank=True` option to the field definition.  Set with'
+                    '`true` to apply to all applicable fields.'),
+        make_option('--decimal', dest='decimal', type='string', action='callback', 
+                    callback=list_option, default=False,
+                    help='Use a comma separated list of OGR float fields to '
+                    'generate `DecimalField` instead of the default '
+                    '`FloatField`. Set to `true` to apply to all OGR float fields.'),
+        make_option('--geom-name', dest='geom_name', type='string', default='geom',
+                    help='Specifies the model name for the Geometry Field '
+                    '(defaults to `geom`)'),
+        make_option('--layer', dest='layer_key', type='string', action='callback', 
+                    callback=layer_option, default=0,
+                    help='The key for specifying which layer in the OGR data '
+                    'source to use. Defaults to 0 (the first layer). May be '
+                    'an integer or a string identifier for the layer.'),
+        make_option('--multi-geom', action='store_true', dest='multi_geom', default=False,
+                    help='Treat the geometry in the data source as a geometry collection.'),
+        make_option('--name-field', dest='name_field',
+                    help='Specifies a field name to return for the `__unicode__` function.'),
+        make_option('--no-imports', action='store_false', dest='imports', default=True,
+                    help='Do not include `from django.contrib.gis.db import models` '
+                    'statement.'),
+        make_option('--null', dest='null', type='string', action='callback',  
+                    callback=list_option, default=False,
+                    help='Use a comma separated list of OGR field names to add '
+                    'the `null=True` option to the field definition.  Set with'
+                    '`true` to apply to all applicable fields.'),
+        make_option('--srid', dest='srid',
+                    help='The SRID to use for the Geometry Field.  If it can be '
+                    'determined, the SRID of the data source is used.'),
+        make_option('--mapping', action='store_true', dest='mapping',
+                    help='Generate mapping dictionary for use with `LayerMapping`.')
+        )
+
+    requires_model_validation = False
+
+    def handle_args(self, *args, **options):
+        try:
+            data_source, model_name = args
+        except ValueError:
+            raise CommandError('Invalid arguments, must provide: %s' % self.args)
+
+        if not gdal.HAS_GDAL:
+            raise CommandError('GDAL is required to inspect geospatial data sources.')
+
+        # TODO: Support non file-based OGR datasources.
+        if not os.path.isfile(data_source):
+            raise CommandError('The given data source cannot be found: "%s"' % data_source)
+        
+        # Removing options with `None` values.
+        options = dict([(k, v) for k, v in options.items() if not v is None])
+
+        # Getting the OGR DataSource from the string parameter.
+        try:
+            ds = gdal.DataSource(data_source)
+        except gdal.OGRException, msg:
+            raise CommandError(msg)
+
+        # Whether the user wants to generate the LayerMapping dictionary as well.
+        show_mapping = options.pop('mapping', False)
+
+        # Returning the output of ogrinspect with the given arguments
+        # and options.
+        from django.contrib.gis.utils.ogrinspect import _ogrinspect, mapping
+        output = [s for s in _ogrinspect(ds, model_name, **options)]
+        if show_mapping:
+            # Constructing the keyword arguments for `mapping`, and
+            # calling it on the data source.
+            kwargs = {'geom_name' : options['geom_name'],
+                      'layer_key' : options['layer_key'],
+                      'multi_geom' : options['multi_geom'],
+                      }
+            mapping_dict = mapping(ds, **kwargs)
+            # This extra legwork is so that the dictionary definition comes
+            # out in the same order as the fields in the model definition.
+            rev_mapping = dict([(v, k) for k, v in mapping_dict.items()])
+            output.extend(['', '# Auto-generated `LayerMapping` dictionary for %s model' % model_name, 
+                           '%s_mapping = {' % model_name.lower()])
+            output.extend(["    '%s' : '%s'," % (rev_mapping[ogr_fld], ogr_fld) for ogr_fld in ds[options['layer_key']].fields])
+            output.extend(["    '%s' : '%s'," % (options['geom_name'], mapping_dict[options['geom_name']]), '}'])
+        return '\n'.join(output)
diff --git a/webapp/django/contrib/gis/maps/__init__.py b/webapp/django/contrib/gis/maps/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/gis/maps/__init__.py
diff --git a/webapp/django/contrib/gis/maps/google/__init__.py b/webapp/django/contrib/gis/maps/google/__init__.py
new file mode 100644
index 0000000..dfbbedc
--- /dev/null
+++ b/webapp/django/contrib/gis/maps/google/__init__.py
@@ -0,0 +1,61 @@
+"""
+  This module houses the GoogleMap object, used for generating
+   the needed javascript to embed Google Maps in a webpage.
+
+  Google(R) is a registered trademark of Google, Inc. of Mountain View, California.
+
+  Example:
+
+   * In the view:
+      return render_to_response('template.html', {'google' : GoogleMap(key="abcdefg")})
+
+   * In the template:
+
+     <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+     {{ google.xhtml }}
+     <head>
+       <title>Google Maps via GeoDjango</title>
+       {{ google.style }}
+       {{ google.scripts }}
+     </head>
+     {{ google.body }}
+     <div id="{{ google.dom_id }}" style="width:600px;height:400px;"></div>
+     </body>
+     </html>
+
+     Note:  If you want to be more explicit in your templates, the following are
+      equivalent:
+      {{ google.body }} => "<body {{ google.onload }} {{ google.onunload }}>"
+      {{ google.xhtml }} => "<html xmlns="http://www.w3.org/1999/xhtml" {{ google.xmlns }}>"
+      {{ google.style }} => "<style>{{ google.vml_css }}</style>"
+
+  Explanation:
+   - The `xhtml` property provides the correct XML namespace needed for 
+     Google Maps to operate in IE using XHTML.  Google Maps on IE uses
+     VML to draw polylines.  Returns, by default: 
+     <html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml">
+       
+   - The `style` property provides the correct style tag for the CSS
+     properties required by Google Maps on IE:
+     <style type="text/css">v\:* {behavior:url(#default#VML);}</style>
+
+   - The `scripts` property provides the necessary <script> tags for 
+     including the Google Maps javascript, as well as including the
+     generated javascript.
+
+   - The `body` property provides the correct attributes for the 
+     body tag to load the generated javascript.  By default, returns:
+     <body onload="gmap_load()" onunload="GUnload()">
+
+   - The `dom_id` property returns the DOM id for the map.  Defaults to "map".
+
+  The following attributes may be set or customized in your local settings:
+   * GOOGLE_MAPS_API_KEY: String of your Google Maps API key.  These are tied to
+      to a domain.  May be obtained from http://www.google.com/apis/maps/
+   * GOOGLE_MAPS_API_VERSION (optional): Defaults to using "2.x"
+   * GOOGLE_MAPS_URL (optional): Must have a substitution ('%s') for the API
+      version.
+"""
+from django.contrib.gis.maps.google.gmap import GoogleMap
+from django.contrib.gis.maps.google.overlays import GEvent, GMarker, GPolygon, GPolyline
+from django.contrib.gis.maps.google.zoom import GoogleZoom
diff --git a/webapp/django/contrib/gis/maps/google/gmap.py b/webapp/django/contrib/gis/maps/google/gmap.py
new file mode 100644
index 0000000..580ab7a
--- /dev/null
+++ b/webapp/django/contrib/gis/maps/google/gmap.py
@@ -0,0 +1,138 @@
+from django.conf import settings
+from django.contrib.gis import geos
+from django.template.loader import render_to_string
+from django.utils.safestring import mark_safe
+
+class GoogleMapException(Exception): pass
+from django.contrib.gis.maps.google.overlays import GPolygon, GPolyline, GMarker
+
+# The default Google Maps URL (for the API javascript)
+# TODO: Internationalize for Japan, UK, etc.
+GOOGLE_MAPS_URL='http://maps.google.com/maps?file=api&amp;v=%s&amp;key='
+
+class GoogleMap(object):
+    "A class for generating Google Maps JavaScript."
+
+    # String constants
+    onunload = mark_safe('onunload="GUnload()"') # Cleans up after Google Maps
+    vml_css  = mark_safe('v\:* {behavior:url(#default#VML);}') # CSS for IE VML
+    xmlns    = mark_safe('xmlns:v="urn:schemas-microsoft-com:vml"') # XML Namespace (for IE VML).
+
+    def __init__(self, key=None, api_url=None, version=None, 
+                 center=None, zoom=None, dom_id='map', load_func='gmap_load', 
+                 kml_urls=[], polygons=[], polylines=[], markers=[],
+                 template='gis/google/js/google-map.js',
+                 extra_context={}):
+
+        # The Google Maps API Key defined in the settings will be used
+        #  if not passed in as a parameter.  The use of an API key is
+        #  _required_.
+        if not key:
+            try:
+                self.key = settings.GOOGLE_MAPS_API_KEY
+            except AttributeError:
+                raise GoogleMapException('Google Maps API Key not found (try adding GOOGLE_MAPS_API_KEY to your settings).')
+        else:
+            self.key = key
+        
+        # Getting the Google Maps API version, defaults to using the latest ("2.x"),
+        #  this is not necessarily the most stable.
+        if not version:
+            self.version = getattr(settings, 'GOOGLE_MAPS_API_VERSION', '2.x')
+        else:
+            self.version = version
+
+        # Can specify the API URL in the `api_url` keyword.
+        if not api_url:
+            self.api_url = mark_safe(getattr(settings, 'GOOGLE_MAPS_URL', GOOGLE_MAPS_URL) % self.version)
+        else:
+            self.api_url = api_url
+
+        # Setting the DOM id of the map, the load function, the JavaScript
+        # template, and the KML URLs array.
+        self.dom_id = dom_id
+        self.load_func = load_func
+        self.template = template
+        self.kml_urls = kml_urls
+        
+        # Does the user want any GMarker, GPolygon, and/or GPolyline overlays?
+        self.polygons, self.polylines, self.markers = [], [], []
+        if markers:
+            for point in markers:
+                if isinstance(point, GMarker): 
+                    self.markers.append(point)
+                else:
+                    self.markers.append(GMarker(point))
+        if polygons:
+            for poly in polygons:
+                if isinstance(poly, GPolygon): 
+                    self.polygons.append(poly)
+                else:
+                    self.polygons.append(GPolygon(poly))
+        if polylines:
+            for pline in polylines:
+                if isinstance(pline, GPolyline):
+                    self.polylines.append(pline)
+                else:
+                    self.polylines.append(GPolyline(pline))
+       
+        # If GMarker, GPolygons, and/or GPolylines 
+        # are used the zoom will be automatically
+        # calculated via the Google Maps API.  If both a zoom level and a
+        # center coordinate are provided with polygons/polylines, no automatic
+        # determination will occur.
+        self.calc_zoom = False
+        if self.polygons or self.polylines  or self.markers:
+            if center is None or zoom is None:
+                self.calc_zoom = True
+    
+        # Defaults for the zoom level and center coordinates if the zoom
+        # is not automatically calculated.
+        if zoom is None: zoom = 4
+        self.zoom = zoom
+        if center is None: center = (0, 0)
+        self.center = center
+
+        # Setting the parameters for the javascript template.
+        params = {'calc_zoom' : self.calc_zoom,
+                  'center' : self.center,
+                  'dom_id' : self.dom_id,
+                  'kml_urls' : self.kml_urls,
+                  'load_func' : self.load_func,
+                  'zoom' : self.zoom,
+                  'polygons' : self.polygons,
+                  'polylines' : self.polylines,
+                  'markers' : self.markers,
+                  }
+        params.update(extra_context)
+        self.js = render_to_string(self.template, params)
+
+    @property
+    def body(self):
+        "Returns HTML body tag for loading and unloading Google Maps javascript."
+        return mark_safe('<body %s %s>' % (self.onload, self.onunload))
+
+    @property
+    def onload(self):
+        "Returns the `onload` HTML <body> attribute."
+        return mark_safe('onload="%s()"' % self.load_func)
+
+    @property
+    def api_script(self):
+        "Returns the <script> tag for the Google Maps API javascript."
+        return mark_safe('<script src="%s%s" type="text/javascript"></script>' % (self.api_url, self.key))
+
+    @property
+    def scripts(self):
+        "Returns all <script></script> tags required for Google Maps JavaScript."
+        return mark_safe('%s\n  <script type="text/javascript">\n//<![CDATA[\n%s//]]>\n  </script>' % (self.api_script, self.js))
+
+    @property
+    def style(self):
+        "Returns additional CSS styling needed for Google Maps on IE."
+        return mark_safe('<style type="text/css">%s</style>' % self.vml_css)
+
+    @property
+    def xhtml(self):
+        "Returns XHTML information needed for IE VML overlays."
+        return mark_safe('<html xmlns="http://www.w3.org/1999/xhtml" %s>' % self.xmlns)
diff --git a/webapp/django/contrib/gis/maps/google/overlays.py b/webapp/django/contrib/gis/maps/google/overlays.py
new file mode 100644
index 0000000..0efedf3
--- /dev/null
+++ b/webapp/django/contrib/gis/maps/google/overlays.py
@@ -0,0 +1,220 @@
+from django.utils.safestring import mark_safe
+from django.contrib.gis.geos import fromstr, Point, LineString, LinearRing, Polygon
+
+class GEvent(object):
+    """
+    A Python wrapper for the Google GEvent object.
+
+    Events can be attached to any object derived from GOverlayBase with the
+    add_event() call.
+
+    For more information please see the Google Maps API Reference:
+     http://code.google.com/apis/maps/documentation/reference.html#GEvent
+
+    Example:
+
+      from django.shortcuts import render_to_response
+      from django.contrib.gis.maps.google import GoogleMap, GEvent, GPolyline
+
+      def sample_request(request):
+          polyline = GPolyline('LINESTRING(101 26, 112 26, 102 31)')
+          event = GEvent('click', 
+            'function() { location.href = "http://www.google.com"}')
+          polyline.add_event(event)
+          return render_to_response('mytemplate.html', 
+          {'google' : GoogleMap(polylines=[polyline])})
+    """
+
+    def __init__(self, event, action):
+        """
+        Initializes a GEvent object. 
+        
+        Parameters:
+
+        event: 
+          string for the event, such as 'click'. The event must be a valid
+          event for the object in the Google Maps API. 
+          There is no validation of the event type within Django.
+
+        action:
+          string containing a Javascript function, such as 
+          'function() { location.href = "newurl";}'
+          The string must be a valid Javascript function. Again there is no 
+          validation fo the function within Django.
+        """
+        self.event = event
+        self.action = action
+
+    def __unicode__(self):
+        "Returns the parameter part of a GEvent."
+        return mark_safe('"%s", %s' %(self.event, self.action))
+
+class GOverlayBase(object):
+    def __init__(self):
+        self.events = []
+
+    def latlng_from_coords(self, coords):
+        "Generates a JavaScript array of GLatLng objects for the given coordinates."
+        return '[%s]' % ','.join(['new GLatLng(%s,%s)' % (y, x) for x, y in coords])
+
+    def add_event(self, event):
+        "Attaches a GEvent to the overlay object."
+        self.events.append(event)
+
+    def __unicode__(self):
+        "The string representation is the JavaScript API call."
+        return mark_safe('%s(%s)' % (self.__class__.__name__, self.js_params))
+
+class GPolygon(GOverlayBase):
+    """
+    A Python wrapper for the Google GPolygon object.  For more information
+    please see the Google Maps API Reference:
+     http://code.google.com/apis/maps/documentation/reference.html#GPolygon
+    """
+    def __init__(self, poly, 
+                 stroke_color='#0000ff', stroke_weight=2, stroke_opacity=1,
+                 fill_color='#0000ff', fill_opacity=0.4):
+        """
+        The GPolygon object initializes on a GEOS Polygon or a parameter that
+        may be instantiated into GEOS Polygon.  Please note that this will not
+        depict a Polygon's internal rings.
+
+        Keyword Options:
+
+          stroke_color:
+            The color of the polygon outline. Defaults to '#0000ff' (blue).
+
+          stroke_weight:
+            The width of the polygon outline, in pixels.  Defaults to 2.
+
+          stroke_opacity:
+            The opacity of the polygon outline, between 0 and 1.  Defaults to 1.
+
+          fill_color:
+            The color of the polygon fill.  Defaults to '#0000ff' (blue).
+
+          fill_opacity:
+            The opacity of the polygon fill.  Defaults to 0.4.
+        """
+        if isinstance(poly, basestring): poly = fromstr(poly)
+        if isinstance(poly, (tuple, list)): poly = Polygon(poly)
+        if not isinstance(poly, Polygon): 
+            raise TypeError('GPolygon may only initialize on GEOS Polygons.')
+
+        # Getting the envelope of the input polygon (used for automatically
+        # determining the zoom level).
+        self.envelope = poly.envelope
+
+        # Translating the coordinates into a JavaScript array of 
+        # Google `GLatLng` objects.
+        self.points = self.latlng_from_coords(poly.shell.coords)
+
+        # Stroke settings.
+        self.stroke_color, self.stroke_opacity, self.stroke_weight = stroke_color, stroke_opacity, stroke_weight
+      
+        # Fill settings.
+        self.fill_color, self.fill_opacity = fill_color, fill_opacity
+       
+        super(GPolygon, self).__init__()
+ 
+    @property
+    def js_params(self):
+        return '%s, "%s", %s, %s, "%s", %s' % (self.points, self.stroke_color, self.stroke_weight, self.stroke_opacity,
+                                               self.fill_color, self.fill_opacity)
+
+class GPolyline(GOverlayBase):
+    """
+    A Python wrapper for the Google GPolyline object.  For more information
+    please see the Google Maps API Reference:
+     http://code.google.com/apis/maps/documentation/reference.html#GPolyline
+    """
+    def __init__(self, geom, color='#0000ff', weight=2, opacity=1):
+        """
+        The GPolyline object may be initialized on GEOS LineStirng, LinearRing,
+        and Polygon objects (internal rings not supported) or a parameter that
+        may instantiated into one of the above geometries.
+
+        Keyword Options:
+          
+          color:
+            The color to use for the polyline.  Defaults to '#0000ff' (blue).
+  
+          weight:
+            The width of the polyline, in pixels.  Defaults to 2.
+
+          opacity:
+            The opacity of the polyline, between 0 and 1.  Defaults to 1.
+        """
+        # If a GEOS geometry isn't passed in, try to contsruct one.
+        if isinstance(geom, basestring): geom = fromstr(geom)
+        if isinstance(geom, (tuple, list)): geom = Polygon(geom)
+        # Generating the lat/lng coordinate pairs.
+        if isinstance(geom, (LineString, LinearRing)):
+            self.latlngs = self.latlng_from_coords(geom.coords)
+        elif isinstance(geom, Polygon):
+            self.latlngs = self.latlng_from_coords(geom.shell.coords)
+        else:
+            raise TypeError('GPolyline may only initialize on GEOS LineString, LinearRing, and/or Polygon geometries.')
+
+        # Getting the envelope for automatic zoom determination.
+        self.envelope = geom.envelope
+        self.color, self.weight, self.opacity = color, weight, opacity
+        super(GPolyline, self).__init__()
+        
+    @property
+    def js_params(self):
+        return '%s, "%s", %s, %s' % (self.latlngs, self.color, self.weight, self.opacity)
+
+class GMarker(GOverlayBase):
+    """
+    A Python wrapper for the Google GMarker object.  For more information
+    please see the Google Maps API Reference:
+     http://code.google.com/apis/maps/documentation/reference.html#GMarker
+
+    Example:
+
+      from django.shortcuts import render_to_response
+      from django.contrib.gis.maps.google.overlays import GMarker, GEvent
+     
+      def sample_request(request):
+          marker = GMarker('POINT(101 26)')
+          event = GEvent('click', 
+                         'function() { location.href = "http://www.google.com"}')
+          marker.add_event(event)
+          return render_to_response('mytemplate.html', 
+                 {'google' : GoogleMap(markers=[marker])})
+    """
+    def __init__(self, geom, title=None):
+        """
+        The GMarker object may initialize on GEOS Points or a parameter
+        that may be instantiated into a GEOS point.  Keyword options map to
+        GMarkerOptions -- so far only the title option is supported.
+
+        Keyword Options:
+         title: 
+           Title option for GMarker, will be displayed as a tooltip.
+        """
+        # If a GEOS geometry isn't passed in, try to construct one.
+        if isinstance(geom, basestring): geom = fromstr(geom)
+        if isinstance(geom, (tuple, list)): geom = Point(geom)
+        if isinstance(geom, Point):
+            self.latlng = self.latlng_from_coords(geom.coords)
+        else:
+            raise TypeError('GMarker may only initialize on GEOS Point geometry.')
+        # Getting the envelope for automatic zoom determination.
+        self.envelope = geom.envelope
+        # TODO: Add support for more GMarkerOptions
+        self.title = title
+        super(GMarker, self).__init__()
+
+    def latlng_from_coords(self, coords):
+        return 'new GLatLng(%s,%s)' %(coords[1], coords[0])
+    
+    def options(self):
+        result = []
+        if self.title: result.append('title: "%s"' % self.title) 
+        return '{%s}' % ','.join(result)
+
+    @property
+    def js_params(self):
+        return '%s, %s' % (self.latlng, self.options())
diff --git a/webapp/django/contrib/gis/maps/google/zoom.py b/webapp/django/contrib/gis/maps/google/zoom.py
new file mode 100644
index 0000000..abc3fbf
--- /dev/null
+++ b/webapp/django/contrib/gis/maps/google/zoom.py
@@ -0,0 +1,161 @@
+from django.contrib.gis.geos import GEOSGeometry, LinearRing, Polygon, Point
+from django.contrib.gis.maps.google.gmap import GoogleMapException
+from math import pi, sin, cos, log, exp, atan
+
+# Constants used for degree to radian conversion, and vice-versa.
+DTOR = pi / 180.
+RTOD = 180. / pi
+
+class GoogleZoom(object):
+    """
+    GoogleZoom is a utility for performing operations related to the zoom
+    levels on Google Maps.
+
+    This class is inspired by the OpenStreetMap Mapnik tile generation routine
+    `generate_tiles.py`, and the article "How Big Is the World" (Hack #16) in
+    "Google Maps Hacks" by Rich Gibson and Schuyler Erle.
+
+    `generate_tiles.py` may be found at:
+      http://trac.openstreetmap.org/browser/applications/rendering/mapnik/generate_tiles.py
+
+    "Google Maps Hacks" may be found at http://safari.oreilly.com/0596101619
+    """
+    
+    def __init__(self, num_zoom=19, tilesize=256):
+        "Initializes the Google Zoom object."
+        # Google's tilesize is 256x256, square tiles are assumed.
+        self._tilesize = tilesize
+        
+        # The number of zoom levels
+        self._nzoom = num_zoom
+
+        # Initializing arrays to hold the parameters for each one of the 
+        # zoom levels.
+        self._degpp = [] # Degrees per pixel
+        self._radpp = [] # Radians per pixel
+        self._npix  = [] # 1/2 the number of pixels for a tile at the given zoom level
+        
+        # Incrementing through the zoom levels and populating the parameter arrays.
+        z = tilesize # The number of pixels per zoom level.
+        for i in xrange(num_zoom):
+            # Getting the degrees and radians per pixel, and the 1/2 the number of
+            # for every zoom level.
+            self._degpp.append(z / 360.) # degrees per pixel
+            self._radpp.append(z / (2 * pi)) # radians per pixl
+            self._npix.append(z / 2) # number of pixels to center of tile
+
+            # Multiplying `z` by 2 for the next iteration.
+            z *= 2
+
+    def __len__(self):
+        "Returns the number of zoom levels."
+        return self._nzoom
+
+    def get_lon_lat(self, lonlat):
+        "Unpacks longitude, latitude from GEOS Points and 2-tuples."
+        if isinstance(lonlat, Point):
+            lon, lat = lonlat.coords
+        else:
+            lon, lat = lonlat
+        return lon, lat
+
+    def lonlat_to_pixel(self, lonlat, zoom):
+        "Converts a longitude, latitude coordinate pair for the given zoom level."
+        # Setting up, unpacking the longitude, latitude values and getting the
+        # number of pixels for the given zoom level.
+        lon, lat = self.get_lon_lat(lonlat)
+        npix = self._npix[zoom]
+
+        # Calculating the pixel x coordinate by multiplying the longitude value
+        # with with the number of degrees/pixel at the given zoom level.
+        px_x = round(npix + (lon * self._degpp[zoom]))
+
+        # Creating the factor, and ensuring that 1 or -1 is not passed in as the 
+        # base to the logarithm.  Here's why:
+        #  if fac = -1, we'll get log(0) which is undefined; 
+        #  if fac =  1, our logarithm base will be divided by 0, also undefined.
+        fac = min(max(sin(DTOR * lat), -0.9999), 0.9999)
+
+        # Calculating the pixel y coordinate.
+        px_y = round(npix + (0.5 * log((1 + fac)/(1 - fac)) * (-1.0 * self._radpp[zoom])))
+
+        # Returning the pixel x, y to the caller of the function.
+        return (px_x, px_y)
+
+    def pixel_to_lonlat(self, px, zoom):
+        "Converts a pixel to a longitude, latitude pair at the given zoom level."
+        if len(px) != 2:
+            raise TypeError('Pixel should be a sequence of two elements.')
+
+        # Getting the number of pixels for the given zoom level.
+        npix = self._npix[zoom]
+
+        # Calculating the longitude value, using the degrees per pixel.
+        lon = (px[0] - npix) / self._degpp[zoom]
+
+        # Calculating the latitude value.
+        lat = RTOD * ( 2 * atan(exp((px[1] - npix)/ (-1.0 * self._radpp[zoom]))) - 0.5 * pi)
+
+        # Returning the longitude, latitude coordinate pair.
+        return (lon, lat)
+    
+    def tile(self, lonlat, zoom):
+        """
+        Returns a Polygon  corresponding to the region represented by a fictional
+        Google Tile for the given longitude/latitude pair and zoom level. This
+        tile is used to determine the size of a tile at the given point.
+        """
+        # The given lonlat is the center of the tile.
+        delta = self._tilesize / 2
+
+        # Getting the pixel coordinates corresponding to the
+        # the longitude/latitude.
+        px = self.lonlat_to_pixel(lonlat, zoom)
+
+        # Getting the lower-left and upper-right lat/lon coordinates
+        # for the bounding box of the tile.
+        ll = self.pixel_to_lonlat((px[0]-delta, px[1]-delta), zoom)
+        ur = self.pixel_to_lonlat((px[0]+delta, px[1]+delta), zoom)
+
+        # Constructing the Polygon, representing the tile and returning.
+        return Polygon(LinearRing(ll, (ll[0], ur[1]), ur, (ur[0], ll[1]), ll), srid=4326)
+        
+    def get_zoom(self, geom):
+        "Returns the optimal Zoom level for the given geometry."
+        # Checking the input type.
+        if not isinstance(geom, GEOSGeometry) or geom.srid != 4326:
+            raise TypeError('get_zoom() expects a GEOS Geometry with an SRID of 4326.')
+
+        # Getting the envelope for the geometry, and its associated width, height
+        # and centroid.
+        env = geom.envelope
+        env_w, env_h = self.get_width_height(env.extent)
+        center = env.centroid
+
+        for z in xrange(self._nzoom):
+            # Getting the tile at the zoom level.
+            tile_w, tile_h = self.get_width_height(self.tile(center, z).extent)
+
+            # When we span more than one tile, this is an approximately good
+            # zoom level.
+            if (env_w > tile_w) or (env_h > tile_h):
+                if z == 0: 
+                    raise GoogleMapException('Geometry width and height should not exceed that of the Earth.')
+                return z-1
+        
+        # Otherwise, we've zoomed in to the max.
+        return self._nzoom-1
+
+    def get_width_height(self, extent):
+        """
+        Returns the width and height for the given extent.
+        """
+        # Getting the lower-left, upper-left, and upper-right
+        # coordinates from the extent.
+        ll = Point(extent[:2])
+        ul = Point(extent[0], extent[3])
+        ur = Point(extent[2:])
+        # Calculating the width and height.
+        height = ll.distance(ul)
+        width  = ul.distance(ur)
+        return width, height
diff --git a/webapp/django/contrib/gis/maps/openlayers/__init__.py b/webapp/django/contrib/gis/maps/openlayers/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/gis/maps/openlayers/__init__.py
diff --git a/webapp/django/contrib/gis/measure.py b/webapp/django/contrib/gis/measure.py
new file mode 100644
index 0000000..42c49ce
--- /dev/null
+++ b/webapp/django/contrib/gis/measure.py
@@ -0,0 +1,329 @@
+# Copyright (c) 2007, Robert Coup <robert.coup@onetrackmind.co.nz>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without modification,
+# are permitted provided that the following conditions are met:
+#
+#   1. Redistributions of source code must retain the above copyright notice,
+#      this list of conditions and the following disclaimer.
+#
+#   2. Redistributions in binary form must reproduce the above copyright
+#      notice, this list of conditions and the following disclaimer in the
+#      documentation and/or other materials provided with the distribution.
+#
+#   3. Neither the name of Distance nor the names of its contributors may be used
+#      to endorse or promote products derived from this software without
+#      specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+"""
+Distance and Area objects to allow for sensible and convienient calculation 
+and conversions.
+
+Authors: Robert Coup, Justin Bronn
+
+Inspired by GeoPy (http://exogen.case.edu/projects/geopy/)
+and Geoff Biggs' PhD work on dimensioned units for robotics.
+"""
+__all__ = ['A', 'Area', 'D', 'Distance']
+from decimal import Decimal
+
+class MeasureBase(object):
+    def default_units(self, kwargs):
+        """
+        Return the unit value and the the default units specified
+        from the given keyword arguments dictionary.
+        """
+        val = 0.0
+        for unit, value in kwargs.iteritems():
+            if unit in self.UNITS:
+                val += self.UNITS[unit] * value
+                default_unit = unit
+            elif unit in self.ALIAS:
+                u = self.ALIAS[unit]
+                val += self.UNITS[u] * value
+                default_unit = u
+            else:
+                lower = unit.lower()
+                if lower in self.UNITS:
+                    val += self.UNITS[lower] * value
+                    default_unit = lower
+                elif lower in self.LALIAS:
+                    u = self.LALIAS[lower]
+                    val += self.UNITS[u] * value
+                    default_unit = u
+                else:
+                    raise AttributeError('Unknown unit type: %s' % unit)
+        return val, default_unit
+
+    @classmethod
+    def unit_attname(cls, unit_str):
+        """
+        Retrieves the unit attribute name for the given unit string.  
+        For example, if the given unit string is 'metre', 'm' would be returned.
+        An exception is raised if an attribute cannot be found.
+        """
+        lower = unit_str.lower()
+        if unit_str in cls.UNITS:
+            return unit_str
+        elif lower in cls.UNITS:
+            return lower
+        elif lower in cls.LALIAS:
+            return cls.LALIAS[lower]
+        else:
+            raise Exception('Could not find a unit keyword associated with "%s"' % unit_str)
+
+class Distance(MeasureBase):
+    UNITS = {
+        'chain' : 20.1168,
+        'chain_benoit' : 20.116782,
+        'chain_sears' : 20.1167645,
+        'british_chain_benoit' : 20.1167824944,
+        'british_chain_sears' : 20.1167651216,
+        'british_chain_sears_truncated' : 20.116756,
+        'cm' : 0.01,
+        'british_ft' : 0.304799471539,
+        'british_yd' : 0.914398414616,
+        'clarke_ft' : 0.3047972654,
+        'clarke_link' : 0.201166195164,
+        'fathom' :  1.8288,
+        'ft': 0.3048,
+        'german_m' : 1.0000135965,
+        'gold_coast_ft' : 0.304799710181508,
+        'indian_yd' : 0.914398530744,
+        'inch' : 0.0254,
+        'km': 1000.0,
+        'link' : 0.201168,
+        'link_benoit' : 0.20116782,
+        'link_sears' : 0.20116765,
+        'm': 1.0,
+        'mi': 1609.344,
+        'mm' : 0.001,
+        'nm': 1852.0,
+        'nm_uk' : 1853.184,
+        'rod' : 5.0292,
+        'sears_yd' : 0.91439841,
+        'survey_ft' : 0.304800609601,
+        'um' : 0.000001,
+        'yd': 0.9144,
+        }
+
+    # Unit aliases for `UNIT` terms encountered in Spatial Reference WKT.
+    ALIAS = {
+        'centimeter' : 'cm',
+        'foot' : 'ft',
+        'inches' : 'inch',
+        'kilometer' : 'km',
+        'kilometre' : 'km',
+        'meter' : 'm',
+        'metre' : 'm',
+        'micrometer' : 'um',
+        'micrometre' : 'um',
+        'millimeter' : 'mm',
+        'millimetre' : 'mm',
+        'mile' : 'mi',
+        'yard' : 'yd',
+        'British chain (Benoit 1895 B)' : 'british_chain_benoit',
+        'British chain (Sears 1922)' : 'british_chain_sears',
+        'British chain (Sears 1922 truncated)' : 'british_chain_sears_truncated',
+        'British foot (Sears 1922)' : 'british_ft',
+        'British foot' : 'british_ft',
+        'British yard (Sears 1922)' : 'british_yd',
+        'British yard' : 'british_yd',
+        "Clarke's Foot" : 'clarke_ft',
+        "Clarke's link" : 'clarke_link',
+        'Chain (Benoit)' : 'chain_benoit',
+        'Chain (Sears)' : 'chain_sears',
+        'Foot (International)' : 'ft',
+        'German legal metre' : 'german_m',
+        'Gold Coast foot' : 'gold_coast_ft',
+        'Indian yard' : 'indian_yd',
+        'Link (Benoit)': 'link_benoit',
+        'Link (Sears)': 'link_sears',
+        'Nautical Mile' : 'nm',
+        'Nautical Mile (UK)' : 'nm_uk',
+        'US survey foot' : 'survey_ft',
+        'U.S. Foot' : 'survey_ft',
+        'Yard (Indian)' : 'indian_yd',
+        'Yard (Sears)' : 'sears_yd'
+        }
+    LALIAS = dict([(k.lower(), v) for k, v in ALIAS.items()])
+
+    def __init__(self, default_unit=None, **kwargs):
+        # The base unit is in meters.
+        self.m, self._default_unit = self.default_units(kwargs)
+        if default_unit and isinstance(default_unit, str):
+            self._default_unit = default_unit
+    
+    def __getattr__(self, name):
+        if name in self.UNITS:
+            return self.m / self.UNITS[name]
+        else:
+            raise AttributeError('Unknown unit type: %s' % name)
+    
+    def __repr__(self):
+        return 'Distance(%s=%s)' % (self._default_unit, getattr(self, self._default_unit))
+
+    def __str__(self):
+        return '%s %s' % (getattr(self, self._default_unit), self._default_unit)
+        
+    def __cmp__(self, other):
+        if isinstance(other, Distance):
+            return cmp(self.m, other.m)
+        else:
+            return NotImplemented
+        
+    def __add__(self, other):
+        if isinstance(other, Distance):
+            return Distance(default_unit=self._default_unit, m=(self.m + other.m))
+        else:
+            raise TypeError('Distance must be added with Distance')
+    
+    def __iadd__(self, other):
+        if isinstance(other, Distance):
+            self.m += other.m
+            return self
+        else:
+            raise TypeError('Distance must be added with Distance')
+    
+    def __sub__(self, other):
+        if isinstance(other, Distance):
+            return Distance(default_unit=self._default_unit, m=(self.m - other.m))
+        else:
+            raise TypeError('Distance must be subtracted from Distance')
+    
+    def __isub__(self, other):
+        if isinstance(other, Distance):
+            self.m -= other.m
+            return self
+        else:
+            raise TypeError('Distance must be subtracted from Distance')
+    
+    def __mul__(self, other):
+        if isinstance(other, (int, float, long, Decimal)):
+            return Distance(default_unit=self._default_unit, m=(self.m * float(other)))
+        elif isinstance(other, Distance):
+            return Area(default_unit='sq_' + self._default_unit, sq_m=(self.m * other.m))
+        else:
+            raise TypeError('Distance must be multiplied with number or Distance')
+    
+    def __imul__(self, other):
+        if isinstance(other, (int, float, long, Decimal)):
+            self.m *= float(other)
+            return self
+        else:
+            raise TypeError('Distance must be multiplied with number')
+    
+    def __div__(self, other):
+        if isinstance(other, (int, float, long, Decimal)):
+            return Distance(default_unit=self._default_unit, m=(self.m / float(other)))
+        else:
+            raise TypeError('Distance must be divided with number')
+
+    def __idiv__(self, other):
+        if isinstance(other, (int, float, long, Decimal)):
+            self.m /= float(other)
+            return self
+        else:
+            raise TypeError('Distance must be divided with number')
+
+    def __nonzero__(self):
+        return bool(self.m)
+
+class Area(MeasureBase):
+    # Getting the square units values and the alias dictionary.
+    UNITS = dict([('sq_%s' % k, v ** 2) for k, v in Distance.UNITS.items()])
+    ALIAS = dict([(k, 'sq_%s' % v) for k, v in Distance.ALIAS.items()])
+    LALIAS = dict([(k.lower(), v) for k, v in ALIAS.items()])
+
+    def __init__(self, default_unit=None, **kwargs):
+        self.sq_m, self._default_unit = self.default_units(kwargs)
+        if default_unit and isinstance(default_unit, str):
+            self._default_unit = default_unit
+    
+    def __getattr__(self, name):
+        if name in self.UNITS:
+            return self.sq_m / self.UNITS[name]
+        else:
+            raise AttributeError('Unknown unit type: ' + name)
+    
+    def __repr__(self):
+        return 'Area(%s=%s)' % (self._default_unit, getattr(self, self._default_unit))
+
+    def __str__(self):
+        return '%s %s' % (getattr(self, self._default_unit), self._default_unit)
+
+    def __cmp__(self, other):
+        if isinstance(other, Area):
+            return cmp(self.sq_m, other.sq_m)
+        else:
+            return NotImplemented
+        
+    def __add__(self, other):
+        if isinstance(other, Area):
+            return Area(default_unit=self._default_unit, sq_m=(self.sq_m + other.sq_m))
+        else:
+            raise TypeError('Area must be added with Area')
+    
+    def __iadd__(self, other):
+        if isinstance(other, Area):
+            self.sq_m += other.sq_m
+            return self
+        else:
+            raise TypeError('Area must be added with Area')
+    
+    def __sub__(self, other):
+        if isinstance(other, Area):
+            return Area(default_unit=self._default_unit, sq_m=(self.sq_m - other.sq_m))
+        else:
+            raise TypeError('Area must be subtracted from Area')
+    
+    def __isub__(self, other):
+        if isinstance(other, Area):
+            self.sq_m -= other.sq_m
+            return self
+        else:
+            raise TypeError('Area must be subtracted from Area')
+    
+    def __mul__(self, other):
+        if isinstance(other, (int, float, long, Decimal)):
+            return Area(default_unit=self._default_unit, sq_m=(self.sq_m * float(other)))
+        else:
+            raise TypeError('Area must be multiplied with number')
+    
+    def __imul__(self, other):
+        if isinstance(other, (int, float, long, Decimal)):
+            self.sq_m *= float(other)
+            return self
+        else:
+            raise TypeError('Area must be multiplied with number')
+    
+    def __div__(self, other):
+        if isinstance(other, (int, float, long, Decimal)):
+            return Area(default_unit=self._default_unit, sq_m=(self.sq_m / float(other)))
+        else:
+            raise TypeError('Area must be divided with number')
+
+    def __idiv__(self, other):
+        if isinstance(other, (int, float, long, Decimal)):
+            self.sq_m /= float(other)
+            return self
+        else:
+            raise TypeError('Area must be divided with number')
+
+    def __nonzero__(self):
+        return bool(self.sq_m)
+        
+# Shortcuts
+D = Distance
+A = Area
diff --git a/webapp/django/contrib/gis/models.py b/webapp/django/contrib/gis/models.py
new file mode 100644
index 0000000..4453dd8
--- /dev/null
+++ b/webapp/django/contrib/gis/models.py
@@ -0,0 +1,283 @@
+"""
+ Imports the SpatialRefSys and GeometryColumns models dependent on the
+ spatial database backend.
+"""
+import re
+from django.conf import settings
+
+# Checking for the presence of GDAL (needed for the SpatialReference object)
+from django.contrib.gis.gdal import HAS_GDAL, PYTHON23
+if HAS_GDAL:
+    from django.contrib.gis.gdal import SpatialReference
+
+class SpatialRefSysMixin(object):
+    """
+    The SpatialRefSysMixin is a class used by the database-dependent
+    SpatialRefSys objects to reduce redundnant code.
+    """
+
+    # For pulling out the spheroid from the spatial reference string. This
+    # regular expression is used only if the user does not have GDAL installed.
+    #  TODO: Flattening not used in all ellipsoids, could also be a minor axis, or 'b'
+    #        parameter.
+    spheroid_regex = re.compile(r'.+SPHEROID\[\"(?P<name>.+)\",(?P<major>\d+(\.\d+)?),(?P<flattening>\d{3}\.\d+),')
+
+    # For pulling out the units on platforms w/o GDAL installed.
+    # TODO: Figure out how to pull out angular units of projected coordinate system and
+    # fix for LOCAL_CS types.  GDAL should be highly recommended for performing 
+    # distance queries.
+    units_regex = re.compile(r'.+UNIT ?\["(?P<unit_name>[\w \'\(\)]+)", ?(?P<unit>[\d\.]+)(,AUTHORITY\["(?P<unit_auth_name>[\w \'\(\)]+)","(?P<unit_auth_val>\d+)"\])?\]([\w ]+)?(,AUTHORITY\["(?P<auth_name>[\w \'\(\)]+)","(?P<auth_val>\d+)"\])?\]$')
+    
+    def srs(self):
+        """
+        Returns a GDAL SpatialReference object, if GDAL is installed.
+        """
+        if HAS_GDAL:
+            if hasattr(self, '_srs'):
+                # Returning a clone of the cached SpatialReference object.
+                return self._srs.clone()
+            else:
+                # Attempting to cache a SpatialReference object.
+
+                # Trying to get from WKT first.
+                try:
+                    self._srs = SpatialReference(self.wkt)
+                    return self.srs
+                except Exception, msg:
+                    pass
+                
+                raise Exception('Could not get OSR SpatialReference from WKT: %s\nError:\n%s' % (self.wkt, msg))
+        else:
+            raise Exception('GDAL is not installed.')
+    srs = property(srs)
+
+    def ellipsoid(self):
+        """
+        Returns a tuple of the ellipsoid parameters:
+        (semimajor axis, semiminor axis, and inverse flattening).
+        """
+        if HAS_GDAL:
+            return self.srs.ellipsoid
+        else:
+            m = self.spheroid_regex.match(self.wkt)
+            if m: return (float(m.group('major')), float(m.group('flattening')))
+            else: return None
+    ellipsoid = property(ellipsoid)
+
+    def name(self):
+        "Returns the projection name."
+        return self.srs.name
+    name = property(name)
+
+    def spheroid(self):
+        "Returns the spheroid name for this spatial reference."
+        return self.srs['spheroid']
+    spheroid = property(spheroid)
+
+    def datum(self):
+        "Returns the datum for this spatial reference."
+        return self.srs['datum']
+    datum = property(datum)
+
+    def projected(self):
+        "Is this Spatial Reference projected?"
+        if HAS_GDAL:
+            return self.srs.projected
+        else:
+            return self.wkt.startswith('PROJCS')
+    projected = property(projected)
+
+    def local(self):
+        "Is this Spatial Reference local?"
+        if HAS_GDAL:
+            return self.srs.local
+        else:
+            return self.wkt.startswith('LOCAL_CS')
+    local = property(local)
+
+    def geographic(self):
+        "Is this Spatial Reference geographic?"
+        if HAS_GDAL:
+            return self.srs.geographic
+        else:
+            return self.wkt.startswith('GEOGCS')
+    geographic = property(geographic)
+
+    def linear_name(self):
+        "Returns the linear units name."
+        if HAS_GDAL:
+            return self.srs.linear_name
+        elif self.geographic: 
+            return None
+        else:
+            m = self.units_regex.match(self.wkt)
+            return m.group('unit_name')
+    linear_name = property(linear_name)
+
+    def linear_units(self):
+        "Returns the linear units."
+        if HAS_GDAL:
+            return self.srs.linear_units
+        elif self.geographic:
+            return None
+        else:
+            m = self.units_regex.match(self.wkt)
+            return m.group('unit')
+    linear_units = property(linear_units)
+
+    def angular_name(self):
+        "Returns the name of the angular units."
+        if HAS_GDAL:
+            return self.srs.angular_name
+        elif self.projected:
+            return None
+        else:
+            m = self.units_regex.match(self.wkt)
+            return m.group('unit_name')
+    angular_name = property(angular_name)
+
+    def angular_units(self):
+        "Returns the angular units."
+        if HAS_GDAL:
+            return self.srs.angular_units
+        elif self.projected:
+            return None
+        else:
+            m = self.units_regex.match(self.wkt)
+            return m.group('unit')
+    angular_units = property(angular_units)
+
+    def units(self):
+        "Returns a tuple of the units and the name."
+        if self.projected or self.local:
+            return (self.linear_units, self.linear_name)
+        elif self.geographic:
+            return (self.angular_units, self.angular_name)
+        else:
+            return (None, None)
+    units = property(units)
+
+    def get_units(cls, wkt):
+        """
+        Class method used by GeometryField on initialization to
+        retrive the units on the given WKT, without having to use
+        any of the database fields.
+        """
+        if HAS_GDAL:
+            return SpatialReference(wkt).units
+        else:
+            m = cls.units_regex.match(wkt)
+            return m.group('unit'), m.group('unit_name')
+    get_units = classmethod(get_units)
+
+    def get_spheroid(cls, wkt, string=True):
+        """
+        Class method used by GeometryField on initialization to
+        retrieve the `SPHEROID[..]` parameters from the given WKT.
+        """
+        if HAS_GDAL:
+            srs = SpatialReference(wkt)
+            sphere_params = srs.ellipsoid
+            sphere_name = srs['spheroid']
+        else:
+            m = cls.spheroid_regex.match(wkt)
+            if m: 
+                sphere_params = (float(m.group('major')), float(m.group('flattening')))
+                sphere_name = m.group('name')
+            else: 
+                return None
+        
+        if not string: 
+            return sphere_name, sphere_params
+        else:
+            # `string` parameter used to place in format acceptable by PostGIS
+            if len(sphere_params) == 3:
+                radius, flattening = sphere_params[0], sphere_params[2]
+            else:
+                radius, flattening = sphere_params
+            return 'SPHEROID["%s",%s,%s]' % (sphere_name, radius, flattening) 
+    get_spheroid = classmethod(get_spheroid)
+
+    def __unicode__(self):
+        """
+        Returns the string representation.  If GDAL is installed,
+        it will be 'pretty' OGC WKT.
+        """
+        try:
+            return unicode(self.srs)
+        except:
+            return unicode(self.wkt)
+
+# The SpatialRefSys and GeometryColumns models
+_srid_info = True
+if not PYTHON23 and settings.DATABASE_ENGINE == 'postgresql_psycopg2':
+    # Because the PostGIS version is checked when initializing the spatial 
+    # backend a `ProgrammingError` will be raised if the PostGIS tables 
+    # and functions are not installed.  We catch here so it won't be raised when 
+    # running the Django test suite.  `ImportError` is also possible if no ctypes.
+    try:
+        from django.contrib.gis.db.backend.postgis.models import GeometryColumns, SpatialRefSys
+    except:
+        _srid_info = False
+elif not PYTHON23 and settings.DATABASE_ENGINE == 'oracle':
+    # Same thing as above, except the GEOS library is attempted to be loaded for
+    # `BaseSpatialBackend`, and an exception will be raised during the
+    # Django test suite if it doesn't exist.
+    try:
+        from django.contrib.gis.db.backend.oracle.models import GeometryColumns, SpatialRefSys
+    except:
+        _srid_info = False
+else:
+    _srid_info = False
+
+if _srid_info:
+    def get_srid_info(srid):
+        """
+        Returns the units, unit name, and spheroid WKT associated with the
+        given SRID from the `spatial_ref_sys` (or equivalent) spatial database
+        table.  We use a database cursor to execute the query because this
+        function is used when it is not possible to use the ORM (for example,
+        during field initialization).
+        """
+        # SRID=-1 is a common convention for indicating the geometry has no
+        # spatial reference information associated with it.  Thus, we will
+        # return all None values without raising an exception.
+        if srid == -1: return None, None, None
+
+        # Getting the spatial reference WKT associated with the SRID from the
+        # `spatial_ref_sys` (or equivalent) spatial database table. This query
+        # cannot be executed using the ORM because this information is needed
+        # when the ORM cannot be used (e.g., during the initialization of 
+        # `GeometryField`).
+        from django.db import connection
+        cur = connection.cursor()
+        qn = connection.ops.quote_name
+        stmt = 'SELECT %(table)s.%(wkt_col)s FROM %(table)s WHERE (%(table)s.%(srid_col)s = %(srid)s)'
+        stmt = stmt % {'table' : qn(SpatialRefSys._meta.db_table),
+                       'wkt_col' : qn(SpatialRefSys.wkt_col()),
+                       'srid_col' : qn('srid'),
+                       'srid' : srid,
+                       }
+        cur.execute(stmt)
+        
+        # Fetching the WKT from the cursor; if the query failed raise an Exception.
+        fetched = cur.fetchone()
+        if not fetched:
+            raise ValueError('Failed to find spatial reference entry in "%s" corresponding to SRID=%s.' % 
+                             (SpatialRefSys._meta.db_table, srid))
+        srs_wkt = fetched[0]
+
+        # Getting metadata associated with the spatial reference system identifier.
+        # Specifically, getting the unit information and spheroid information 
+        # (both required for distance queries).
+        unit, unit_name = SpatialRefSys.get_units(srs_wkt)
+        spheroid = SpatialRefSys.get_spheroid(srs_wkt)
+        return unit, unit_name, spheroid
+else:
+    def get_srid_info(srid):
+        """
+        Dummy routine for the backends that do not have the OGC required
+        spatial metadata tables (like MySQL).
+        """
+        return None, None, None
+   
diff --git a/webapp/django/contrib/gis/shortcuts.py b/webapp/django/contrib/gis/shortcuts.py
new file mode 100644
index 0000000..5310e58
--- /dev/null
+++ b/webapp/django/contrib/gis/shortcuts.py
@@ -0,0 +1,31 @@
+import cStringIO, zipfile
+from django.http import HttpResponse
+from django.template import loader
+
+def compress_kml(kml):
+    "Returns compressed KMZ from the given KML string."
+    kmz = cStringIO.StringIO()
+    zf = zipfile.ZipFile(kmz, 'a', zipfile.ZIP_DEFLATED, False)
+    zf.writestr('doc.kml', kml)
+    zf.close()
+    kmz.seek(0)
+    return kmz.read()
+
+def render_to_kml(*args, **kwargs):
+    "Renders the response as KML (using the correct MIME type)."
+    return HttpResponse(loader.render_to_string(*args, **kwargs),
+                        mimetype='application/vnd.google-earth.kml+xml kml')
+
+def render_to_kmz(*args, **kwargs):
+    """
+    Compresses the KML content and returns as KMZ (using the correct 
+    MIME type).
+    """
+    return HttpResponse(compress_kml(loader.render_to_string(*args, **kwargs)),
+                        mimetype='application/vnd.google-earth.kmz')
+
+
+def render_to_text(*args, **kwargs):
+    "Renders the response using the MIME type for plain text."
+    return HttpResponse(loader.render_to_string(*args, **kwargs),
+                        mimetype='text/plain')
diff --git a/webapp/django/contrib/gis/sitemaps/__init__.py b/webapp/django/contrib/gis/sitemaps/__init__.py
new file mode 100644
index 0000000..9b6287f
--- /dev/null
+++ b/webapp/django/contrib/gis/sitemaps/__init__.py
@@ -0,0 +1,4 @@
+# Geo-enabled Sitemap classes.
+from django.contrib.gis.sitemaps.georss import GeoRSSSitemap
+from django.contrib.gis.sitemaps.kml import KMLSitemap, KMZSitemap
+
diff --git a/webapp/django/contrib/gis/sitemaps/georss.py b/webapp/django/contrib/gis/sitemaps/georss.py
new file mode 100644
index 0000000..45c97fb
--- /dev/null
+++ b/webapp/django/contrib/gis/sitemaps/georss.py
@@ -0,0 +1,53 @@
+from django.core import urlresolvers
+from django.contrib.sitemaps import Sitemap
+
+class GeoRSSSitemap(Sitemap):
+    """
+    A minimal hook to produce sitemaps for GeoRSS feeds.
+    """
+    def __init__(self, feed_dict, slug_dict=None):
+        """
+        This sitemap object initializes on a feed dictionary (as would be passed
+        to `django.contrib.syndication.views.feed`) and a slug dictionary.  
+        If the slug dictionary is not defined, then it's assumed the keys provide
+        the URL parameter to the feed.  However, if you have a complex feed (e.g.,
+        you override `get_object`, then you'll need to provide a slug dictionary.
+        The slug dictionary should have the same keys as the feed dictionary, but 
+        each value in the slug dictionary should be a sequence of slugs that may 
+        be used for valid feeds.  For example, let's say we have a feed that 
+        returns objects for a specific ZIP code in our feed dictionary:
+
+            feed_dict = {'zipcode' : ZipFeed}
+
+        Then we would use a slug dictionary with a list of the zip code slugs
+        corresponding to feeds you want listed in the sitemap:
+
+            slug_dict = {'zipcode' : ['77002', '77054']}
+        """
+        # Setting up.
+        self.feed_dict = feed_dict
+        self.locations = []
+        if slug_dict is None: slug_dict = {}
+        # Getting the feed locations.
+        for section in feed_dict.keys():
+            if slug_dict.get(section, False):
+                for slug in slug_dict[section]:
+                    self.locations.append(('%s/%s' % (section, slug)))
+            else:
+                self.locations.append(section)
+ 
+    def get_urls(self, page=1):
+        """
+        This method is overrridden so the appropriate `geo_format` attribute
+        is placed on each URL element.
+        """
+        urls = Sitemap.get_urls(self)
+        for url in urls: url['geo_format'] = 'georss'
+        return urls
+
+    def items(self):
+        return self.locations
+
+    def location(self, obj):
+        return urlresolvers.reverse('django.contrib.syndication.views.feed',
+                                    args=(obj,), kwargs={'feed_dict' : self.feed_dict})
diff --git a/webapp/django/contrib/gis/sitemaps/kml.py b/webapp/django/contrib/gis/sitemaps/kml.py
new file mode 100644
index 0000000..d85744f
--- /dev/null
+++ b/webapp/django/contrib/gis/sitemaps/kml.py
@@ -0,0 +1,63 @@
+from django.core import urlresolvers
+from django.contrib.sitemaps import Sitemap
+from django.contrib.gis.db.models.fields import GeometryField
+from django.db import models
+
+class KMLSitemap(Sitemap):
+    """
+    A minimal hook to produce KML sitemaps.
+    """
+    geo_format = 'kml'
+
+    def __init__(self, locations=None):
+        # If no locations specified, then we try to build for
+        # every model in installed applications.
+        self.locations = self._build_kml_sources(locations)
+        
+    def _build_kml_sources(self, sources):
+        """
+        Goes through the given sources and returns a 3-tuple of
+        the application label, module name, and field name of every
+        GeometryField encountered in the sources.
+
+        If no sources are provided, then all models.
+        """
+        kml_sources = []
+        if sources is None:
+            sources = models.get_models()
+        for source in sources:
+            if isinstance(source, models.base.ModelBase):
+                for field in source._meta.fields:
+                    if isinstance(field, GeometryField):
+                        kml_sources.append((source._meta.app_label,
+                                            source._meta.module_name,
+                                            field.name))
+            elif isinstance(source, (list, tuple)):
+                if len(source) != 3: 
+                    raise ValueError('Must specify a 3-tuple of (app_label, module_name, field_name).')
+                kml_sources.append(source)
+            else:
+                raise TypeError('KML Sources must be a model or a 3-tuple.')
+        return kml_sources
+
+    def get_urls(self, page=1):
+        """
+        This method is overrridden so the appropriate `geo_format` attribute
+        is placed on each URL element.
+        """
+        urls = Sitemap.get_urls(self, page=page)
+        for url in urls: url['geo_format'] = self.geo_format
+        return urls
+
+    def items(self):
+        return self.locations
+
+    def location(self, obj):
+        return urlresolvers.reverse('django.contrib.gis.sitemaps.views.%s' % self.geo_format,
+                                    kwargs={'label' : obj[0], 
+                                            'model' : obj[1],
+                                            'field_name': obj[2],
+                                            }
+                                    )
+class KMZSitemap(KMLSitemap):
+    geo_format = 'kmz'
diff --git a/webapp/django/contrib/gis/sitemaps/views.py b/webapp/django/contrib/gis/sitemaps/views.py
new file mode 100644
index 0000000..d20f7c6
--- /dev/null
+++ b/webapp/django/contrib/gis/sitemaps/views.py
@@ -0,0 +1,102 @@
+from django.http import HttpResponse, Http404
+from django.template import loader
+from django.contrib.gis.db.backend import SpatialBackend
+from django.contrib.sites.models import Site
+from django.core import urlresolvers
+from django.core.paginator import EmptyPage, PageNotAnInteger
+from django.db.models import get_model
+from django.utils.encoding import smart_str
+
+from django.contrib.gis.shortcuts import render_to_kml, render_to_kmz
+
+class KMLNotFound(Exception):
+    pass
+
+def index(request, sitemaps):
+    """
+    This view generates a sitemap index that uses the proper view
+    for resolving geographic section sitemap URLs.
+    """
+    current_site = Site.objects.get_current()
+    sites = []
+    protocol = request.is_secure() and 'https' or 'http'
+    for section, site in sitemaps.items():
+        if callable(site):
+            pages = site().paginator.num_pages
+        else:
+            pages = site.paginator.num_pages
+        sitemap_url = urlresolvers.reverse('django.contrib.gis.sitemaps.views.sitemap', kwargs={'section': section})
+        sites.append('%s://%s%s' % (protocol, current_site.domain, sitemap_url))
+      
+        if pages > 1:
+            for page in range(2, pages+1):
+                sites.append('%s://%s%s?p=%s' % (protocol, current_site.domain, sitemap_url, page))
+    xml = loader.render_to_string('sitemap_index.xml', {'sitemaps': sites})
+    return HttpResponse(xml, mimetype='application/xml')
+
+def sitemap(request, sitemaps, section=None):
+    """
+    This view generates a sitemap with additional geographic
+    elements defined by Google.
+    """
+    maps, urls = [], []
+    if section is not None:
+        if section not in sitemaps:
+            raise Http404("No sitemap available for section: %r" % section)
+        maps.append(sitemaps[section])
+    else:
+        maps = sitemaps.values()
+
+    page = request.GET.get("p", 1)
+    for site in maps:
+        try:
+            if callable(site):
+                urls.extend(site().get_urls(page))
+            else:
+                urls.extend(site.get_urls(page))
+        except EmptyPage:
+            raise Http404("Page %s empty" % page)
+        except PageNotAnInteger:
+            raise Http404("No page '%s'" % page)
+    xml = smart_str(loader.render_to_string('gis/sitemaps/geo_sitemap.xml', {'urlset': urls}))
+    return HttpResponse(xml, mimetype='application/xml')
+
+def kml(request, label, model, field_name=None, compress=False):
+    """
+    This view generates KML for the given app label, model, and field name.
+
+    The model's default manager must be GeoManager, and the field name
+    must be that of a geographic field.
+    """
+    placemarks = []
+    klass = get_model(label, model)
+    if not klass:
+        raise KMLNotFound("You must supply a valid app.model label.  Got %s.%s" % (label, model))
+
+    if SpatialBackend.postgis:
+        # PostGIS will take care of transformation.
+        placemarks = klass._default_manager.kml(field_name=field_name)
+    else:
+        # There's no KML method on Oracle or MySQL, so we use the `kml`
+        # attribute of the lazy geometry instead.
+        placemarks = []
+        if SpatialBackend.oracle:
+            qs = klass._default_manager.transform(4326, field_name=field_name)
+        else:
+            qs = klass._default_manager.all()
+        for mod in qs:
+            setattr(mod, 'kml', getattr(mod, field_name).kml)
+            placemarks.append(mod)
+
+    # Getting the render function and rendering to the correct.
+    if compress:
+        render = render_to_kmz
+    else:
+        render = render_to_kml
+    return render('gis/kml/placemarks.kml', {'places' : placemarks})
+
+def kmz(request, label, model, field_name=None):
+    """
+    This view returns KMZ for the given app label, model, and field name.
+    """
+    return kml(request, label, model, field_name, True)
diff --git a/webapp/django/contrib/gis/templates/gis/admin/openlayers.html b/webapp/django/contrib/gis/templates/gis/admin/openlayers.html
new file mode 100644
index 0000000..acf82b2
--- /dev/null
+++ b/webapp/django/contrib/gis/templates/gis/admin/openlayers.html
@@ -0,0 +1,37 @@
+{% block extrastyle %}
+<style type="text/css">
+  #{{ id }}_map { width: {{ map_width }}px; height: {{ map_height }}px; }
+  #{{ id }}_map .aligned label { float:inherit; }
+  #{{ id }}_admin_map { position: relative; vertical-align: top; float: left; }
+  {% if not display_wkt %}#{{ id }} { display: none; }{% endif %}
+  .olControlEditingToolbar .olControlModifyFeatureItemActive { 
+     background-image: url("{{ admin_media_prefix }}img/gis/move_vertex_on.png");
+     background-repeat: no-repeat;
+  }
+  .olControlEditingToolbar .olControlModifyFeatureItemInactive { 
+     background-image: url("{{ admin_media_prefix }}img/gis/move_vertex_off.png");
+     background-repeat: no-repeat;
+  }
+</style>
+<!--[if IE]>
+<style type="text/css">
+  /* This fixes the the mouse offset issues in IE. */
+  #{{ id }}_admin_map { position: static; vertical-align: top; }
+  /* `font-size: 0` fixes the 1px border between tiles, but borks LayerSwitcher.
+      Thus, this is disabled until a better fix is found.
+  #{{ id }}_map { width: {{ map_width }}px; height: {{ map_height }}px; font-size: 0; } */
+</style>
+<![endif]-->
+{% endblock %}
+<span id="{{ id }}_admin_map">
+<script type="text/javascript">
+//<![CDATA[
+{% block openlayers %}{% include "gis/admin/openlayers.js" %}{% endblock %}
+//]]>
+</script>
+<div id="{{ id }}_map"></div>
+<a href="javascript:{{ module }}.clearFeatures()">Delete all Features</a>
+{% if display_wkt %}<p> WKT debugging window:</p>{% endif %}
+<textarea id="{{ id }}" class="vWKTField required" cols="150" rows="10" name="{{ field_name }}">{{ wkt }}</textarea>
+<script type="text/javascript">{% block init_function %}{{ module }}.init();{% endblock %}</script>
+</span>
diff --git a/webapp/django/contrib/gis/templates/gis/admin/openlayers.js b/webapp/django/contrib/gis/templates/gis/admin/openlayers.js
new file mode 100644
index 0000000..7194261
--- /dev/null
+++ b/webapp/django/contrib/gis/templates/gis/admin/openlayers.js
@@ -0,0 +1,157 @@
+{# Author: Justin Bronn, Travis Pinney & Dane Springmeyer #}
+{% block vars %}var {{ module }} = {};
+{{ module }}.map = null; {{ module }}.controls = null; {{ module }}.panel = null; {{ module }}.re = new RegExp("^SRID=\d+;(.+)", "i"); {{ module }}.layers = {}; 
+{{ module }}.wkt_f = new OpenLayers.Format.WKT();
+{{ module }}.is_collection = {% if is_collection %}true{% else %}false{% endif %};
+{{ module }}.collection_type = '{{ collection_type }}';
+{{ module }}.is_linestring = {% if is_linestring %}true{% else %}false{% endif %};
+{{ module }}.is_polygon = {% if is_polygon %}true{% else %}false{% endif %};
+{{ module }}.is_point = {% if is_point %}true{% else %}false{% endif %};
+{% endblock %}
+{{ module }}.get_ewkt = function(feat){return 'SRID={{ srid }};' + {{ module }}.wkt_f.write(feat);}
+{{ module }}.read_wkt = function(wkt){
+  // OpenLayers cannot handle EWKT -- we make sure to strip it out.
+  // EWKT is only exposed to OL if there's a validation error in the admin.
+  var match = {{ module }}.re.exec(wkt);
+  if (match){wkt = match[1];}
+  return {{ module }}.wkt_f.read(wkt);
+}
+{{ module }}.write_wkt = function(feat){
+  if ({{ module }}.is_collection){ {{ module }}.num_geom = feat.geometry.components.length;}
+  else { {{ module }}.num_geom = 1;}
+  document.getElementById('{{ id }}').value = {{ module }}.get_ewkt(feat);
+}
+{{ module }}.add_wkt = function(event){
+  // This function will sync the contents of the `vector` layer with the
+  // WKT in the text field.
+  if ({{ module }}.is_collection){
+    var feat = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.{{ geom_type }}());
+    for (var i = 0; i < {{ module }}.layers.vector.features.length; i++){
+      feat.geometry.addComponents([{{ module }}.layers.vector.features[i].geometry]);
+    }
+    {{ module }}.write_wkt(feat);
+  } else {
+    // Make sure to remove any previously added features.
+    if ({{ module }}.layers.vector.features.length > 1){
+      old_feats = [{{ module }}.layers.vector.features[0]];
+      {{ module }}.layers.vector.removeFeatures(old_feats);
+      {{ module }}.layers.vector.destroyFeatures(old_feats);
+    }
+    {{ module }}.write_wkt(event.feature);
+  }
+}
+{{ module }}.modify_wkt = function(event){
+  if ({{ module }}.is_collection){
+    if ({{ module }}.is_point){
+      {{ module }}.add_wkt(event); 
+      return;
+    } else {
+      // When modifying the selected components are added to the 
+      // vector layer so we only increment to the `num_geom` value.
+      var feat = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.{{ geom_type }}());
+      for (var i = 0; i < {{ module }}.num_geom; i++){
+	feat.geometry.addComponents([{{ module }}.layers.vector.features[i].geometry]);
+      }
+      {{ module }}.write_wkt(feat);
+    }
+  } else {
+    {{ module }}.write_wkt(event.feature);
+  }
+}
+// Function to clear vector features and purge wkt from div
+{{ module }}.deleteFeatures = function(){
+  {{ module }}.layers.vector.removeFeatures({{ module }}.layers.vector.features);
+  {{ module }}.layers.vector.destroyFeatures();
+}
+{{ module }}.clearFeatures = function (){
+  {{ module }}.deleteFeatures();
+  document.getElementById('{{ id }}').value = '';
+  {{ module }}.map.setCenter(new OpenLayers.LonLat({{ default_lon }}, {{ default_lat }}), {{ default_zoom }});
+}
+// Add Select control
+{{ module }}.addSelectControl = function(){   
+  var select = new OpenLayers.Control.SelectFeature({{ module }}.layers.vector, {'toggle' : true, 'clickout' : true});
+  {{ module }}.map.addControl(select);
+  select.activate();
+}
+{{ module }}.enableDrawing = function(){ {{ module }}.map.getControlsByClass('OpenLayers.Control.DrawFeature')[0].activate();}
+{{ module }}.enableEditing = function(){ {{ module }}.map.getControlsByClass('OpenLayers.Control.ModifyFeature')[0].activate();}
+// Create an array of controls based on geometry type
+{{ module }}.getControls = function(lyr){
+  {{ module }}.panel = new OpenLayers.Control.Panel({'displayClass': 'olControlEditingToolbar'});
+  var nav = new OpenLayers.Control.Navigation();
+  var draw_ctl;
+  if ({{ module }}.is_linestring){
+    draw_ctl = new OpenLayers.Control.DrawFeature(lyr, OpenLayers.Handler.Path, {'displayClass': 'olControlDrawFeaturePath'});
+  } else if ({{ module }}.is_polygon){
+    draw_ctl = new OpenLayers.Control.DrawFeature(lyr, OpenLayers.Handler.Polygon, {'displayClass': 'olControlDrawFeaturePolygon'});
+  } else if ({{ module }}.is_point){
+    draw_ctl = new OpenLayers.Control.DrawFeature(lyr, OpenLayers.Handler.Point, {'displayClass': 'olControlDrawFeaturePoint'});
+  }
+  {% if modifiable %}
+  var mod = new OpenLayers.Control.ModifyFeature(lyr, {'displayClass': 'olControlModifyFeature'});
+  {{ module }}.controls = [nav, draw_ctl, mod];
+  {% else %}
+  {{ module }}.controls = [nav, darw_ctl];
+  {% endif %}  
+}
+{{ module }}.init = function(){
+    {% block map_options %}// The options hash, w/ zoom, resolution, and projection settings.
+    var options = { 
+{% autoescape off %}{% for item in map_options.items %}      '{{ item.0 }}' : {{ item.1 }}{% if not forloop.last %},{% endif %}
+{% endfor %}{% endautoescape %}    };{% endblock %}
+    // The admin map for this geometry field.
+    {{ module }}.map = new OpenLayers.Map('{{ id }}_map', options);
+    // Base Layer
+    {{ module }}.layers.base = {% block base_layer %}new OpenLayers.Layer.WMS( "{{ wms_name }}", "{{ wms_url }}", {layers: '{{ wms_layer }}'} );{% endblock %}
+    {{ module }}.map.addLayer({{ module }}.layers.base);
+    {% block extra_layers %}{% endblock %}
+    {% if is_linestring %}OpenLayers.Feature.Vector.style["default"]["strokeWidth"] = 3; // Default too thin for linestrings. {% endif %}
+    {{ module }}.layers.vector = new OpenLayers.Layer.Vector(" {{ field_name }}");
+    {{ module }}.map.addLayer({{ module }}.layers.vector);
+    // Read WKT from the text field.
+    var wkt = document.getElementById('{{ id }}').value;
+    if (wkt){
+      // After reading into geometry, immediately write back to 
+      // WKT <textarea> as EWKT (so that SRID is included).
+      var admin_geom = {{ module }}.read_wkt(wkt);
+      {{ module }}.write_wkt(admin_geom);
+      if ({{ module }}.is_collection){
+	// If geometry collection, add each component individually so they may be
+	// edited individually.
+	for (var i = 0; i < {{ module }}.num_geom; i++){
+	  {{ module }}.layers.vector.addFeatures([new OpenLayers.Feature.Vector(admin_geom.geometry.components[i].clone())]);
+	}
+      } else {
+	{{ module }}.layers.vector.addFeatures([admin_geom]);
+      }
+      // Zooming to the bounds.
+      {{ module }}.map.zoomToExtent(admin_geom.geometry.getBounds());
+    } else {
+      {{ module }}.map.setCenter(new OpenLayers.LonLat({{ default_lon }}, {{ default_lat }}), {{ default_zoom }});
+    }
+    // This allows editing of the geographic fields -- the modified WKT is
+    // written back to the content field (as EWKT, so that the ORM will know
+    // to transform back to original SRID). 
+    {{ module }}.layers.vector.events.on({"featuremodified" : {{ module }}.modify_wkt});
+    {{ module }}.layers.vector.events.on({"featureadded" : {{ module }}.add_wkt});
+    {% block controls %}
+    // Map controls:
+    // Add geometry specific panel of toolbar controls
+    {{ module }}.getControls({{ module }}.layers.vector);
+    {{ module }}.panel.addControls({{ module }}.controls);
+    {{ module }}.map.addControl({{ module }}.panel);
+    {{ module }}.addSelectControl();
+    // Then add optional visual controls
+    {% if mouse_position %}{{ module }}.map.addControl(new OpenLayers.Control.MousePosition());{% endif %}
+    {% if scale_text %}{{ module }}.map.addControl(new OpenLayers.Control.Scale());{% endif %}
+    {% if layerswitcher %}{{ module }}.map.addControl(new OpenLayers.Control.LayerSwitcher());{% endif %}
+    // Then add optional behavior controls
+    {% if scrollable %}{% else %}{{ module }}.map.getControlsByClass('OpenLayers.Control.Navigation')[0].disableZoomWheel();{% endif %}
+    {% endblock %}
+    if (wkt){
+      {{ module }}.enableEditing();
+    } else {
+      {{ module }}.enableDrawing();
+    }
+}
diff --git a/webapp/django/contrib/gis/templates/gis/admin/osm.html b/webapp/django/contrib/gis/templates/gis/admin/osm.html
new file mode 100644
index 0000000..b74b41f
--- /dev/null
+++ b/webapp/django/contrib/gis/templates/gis/admin/osm.html
@@ -0,0 +1,2 @@
+{% extends "gis/admin/openlayers.html" %}
+{% block openlayers %}{% include "gis/admin/osm.js" %}{% endblock %}
\ No newline at end of file
diff --git a/webapp/django/contrib/gis/templates/gis/admin/osm.js b/webapp/django/contrib/gis/templates/gis/admin/osm.js
new file mode 100644
index 0000000..2a1f59e
--- /dev/null
+++ b/webapp/django/contrib/gis/templates/gis/admin/osm.js
@@ -0,0 +1,2 @@
+{% extends "gis/admin/openlayers.js" %}
+{% block base_layer %}new OpenLayers.Layer.OSM.Mapnik("OpenStreetMap (Mapnik)");{% endblock %}
diff --git a/webapp/django/contrib/gis/templates/gis/google/js/google-map.js b/webapp/django/contrib/gis/templates/gis/google/js/google-map.js
new file mode 100644
index 0000000..5efdf90
--- /dev/null
+++ b/webapp/django/contrib/gis/templates/gis/google/js/google-map.js
@@ -0,0 +1,34 @@
+{% autoescape off %}{% block vars %}var map;{% endblock %}
+{% block functions %}{% endblock %}
+{% block load %}function {{ load_func }}(){
+  if (GBrowserIsCompatible()) {
+    map = new GMap2(document.getElementById("{{ dom_id }}"));
+    map.setCenter(new GLatLng({{ center.1 }}, {{ center.0 }}), {{ zoom }});
+    {% block controls %}map.addControl(new GSmallMapControl());
+    map.addControl(new GMapTypeControl());{% endblock %}
+    {% if calc_zoom %}var bounds = new GLatLngBounds(); var tmp_bounds = new GLatLngBounds();{% endif %}
+    {% for kml_url in kml_urls %}var kml{{ forloop.counter }} = new GGeoXml("{{ kml_url }}");
+    map.addOverlay(kml{{ forloop.counter }});{% endfor %}
+
+    {% for polygon in polygons %}var poly{{ forloop.counter }} = new {{ polygon }};
+    map.addOverlay(poly{{ forloop.counter }});
+    {% for event in polygon.events %}GEvent.addListener(poly{{ forloop.parentloop.counter }}, {{ event }});{% endfor %}
+    {% if calc_zoom %}tmp_bounds = poly{{ forloop.counter }}.getBounds(); bounds.extend(tmp_bounds.getSouthWest()); bounds.extend(tmp_bounds.getNorthEast());{% endif %}{% endfor %}
+
+    {% for polyline in polylines %}var polyline{{ forloop.counter }} = new {{ polyline }};
+    map.addOverlay(polyline{{ forloop.counter }});
+    {% for event in polyline.events %}GEvent.addListener(polyline{{ forloop.parentloop.counter }}, {{ event }}); {% endfor %}
+    {% if calc_zoom %}tmp_bounds = polyline{{ forloop.counter }}.getBounds(); bounds.extend(tmp_bounds.getSouthWest()); bounds.extend(tmp_bounds.getNorthEast());{% endif %}{% endfor %}
+    
+    {% for marker in markers %}var marker{{ forloop.counter }} = new {{ marker }};
+    map.addOverlay(marker{{ forloop.counter }});
+    {% for event in marker.events %}GEvent.addListener(marker{{ forloop.parentloop.counter }}, {{ event }}); {% endfor %}
+    {% if calc_zoom %}bounds.extend(marker{{ forloop.counter }}.getLatLng()); {% endif %}{% endfor %}
+
+    {% if calc_zoom %}map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));{% endif %}
+    {% block load_extra %}{% endblock %}
+  }else {
+    alert("Sorry, the Google Maps API is not compatible with this browser.");
+  }
+}
+{% endblock %}{% endautoescape %}
diff --git a/webapp/django/contrib/gis/templates/gis/kml/base.kml b/webapp/django/contrib/gis/templates/gis/kml/base.kml
new file mode 100644
index 0000000..374404c
--- /dev/null
+++ b/webapp/django/contrib/gis/templates/gis/kml/base.kml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<kml xmlns="http://earth.google.com/kml/{% block kml_version %}2.1{% endblock %}">
+<Document>{% block name %}{% endblock %}
+{% block placemarks %}{% endblock %}
+</Document>
+</kml>
diff --git a/webapp/django/contrib/gis/templates/gis/kml/placemarks.kml b/webapp/django/contrib/gis/templates/gis/kml/placemarks.kml
new file mode 100644
index 0000000..ea2ac19
--- /dev/null
+++ b/webapp/django/contrib/gis/templates/gis/kml/placemarks.kml
@@ -0,0 +1,8 @@
+{% extends "gis/kml/base.kml" %}
+{% block placemarks %}{% for place in places %}
+  <Placemark>
+    <name>{% if place.name %}{{ place.name }}{% else %}{{ place }}{% endif %}</name>
+    <description>{% if place.description %}{{ place.description }}{% else %}{{ place }}{% endif %}</description>
+    {{ place.kml|safe }}
+  </Placemark>{% endfor %}{% endblock %}
+
diff --git a/webapp/django/contrib/gis/templates/gis/sitemaps/geo_sitemap.xml b/webapp/django/contrib/gis/templates/gis/sitemaps/geo_sitemap.xml
new file mode 100644
index 0000000..dbf858e
--- /dev/null
+++ b/webapp/django/contrib/gis/templates/gis/sitemaps/geo_sitemap.xml
@@ -0,0 +1,17 @@
+{% autoescape off %}<?xml version="1.0" encoding="UTF-8"?>
+<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:geo="http://www.google.com/geo/schemas/sitemap/1.0">
+{% spaceless %}
+{% for url in urlset %}
+  <url>
+    <loc>{{ url.location|escape }}</loc>
+    {% if url.lastmod %}<lastmod>{{ url.lastmod|date:"Y-m-d" }}</lastmod>{% endif %}
+    {% if url.changefreq %}<changefreq>{{ url.changefreq }}</changefreq>{% endif %}
+    {% if url.priority %}<priority>{{ url.priority }}</priority>{% endif %}
+    {% if url.geo_format %}<geo:geo>
+      <geo:format>{{ url.geo_format }}</geo:format>
+    </geo:geo>{% endif %}
+   </url>
+{% endfor %}
+{% endspaceless %}
+</urlset>
+{% endautoescape %}
diff --git a/webapp/django/contrib/gis/tests/__init__.py b/webapp/django/contrib/gis/tests/__init__.py
new file mode 100644
index 0000000..8aa3820
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/__init__.py
@@ -0,0 +1,202 @@
+import sys, unittest
+
+from django.conf import settings
+from django.db import connection
+from django.db.models import get_app, get_apps, loading
+from django.test.simple import build_suite, build_test
+from django.test.utils import setup_test_environment, teardown_test_environment
+
+def geo_suite():
+    """
+    Builds a test suite for the GIS package.  This is not named
+    `suite` so it will not interfere with the Django test suite (since
+    spatial database tables are required to execute these tests on
+    some backends).
+    """
+    from django.contrib.gis.tests.utils import mysql, oracle, postgis
+    from django.contrib.gis.gdal import HAS_GDAL
+    from django.contrib.gis.utils import HAS_GEOIP
+
+    # Tests that require use of a spatial database (e.g., creation of models)
+    test_models = ['geoapp',]
+
+    # Tests that do not require setting up and tearing down a spatial database.
+    test_suite_names = [
+        'test_geos',
+        'test_measure',
+        ]
+    if HAS_GDAL:
+        if oracle:
+            # TODO: There's a problem with `select_related` and GeoQuerySet on
+            # Oracle -- e.g., GeoModel.objects.distance(geom, field_name='fk__point')
+            # doesn't work so we don't test `relatedapp`.
+            test_models += ['distapp', 'layermap']
+        elif postgis:
+            test_models += ['distapp', 'layermap', 'relatedapp']
+        elif mysql:
+            test_models += ['relatedapp']
+
+        test_suite_names += [
+            'test_gdal_driver',
+            'test_gdal_ds',
+            'test_gdal_envelope',
+            'test_gdal_geom',
+            'test_gdal_srs',
+            'test_spatialrefsys',
+            ]
+    else:
+        print >>sys.stderr, "GDAL not available - no GDAL tests will be run."
+
+    if HAS_GEOIP and hasattr(settings, 'GEOIP_PATH'):
+        test_suite_names.append('test_geoip')
+
+    s = unittest.TestSuite()
+    for test_suite in test_suite_names:
+        tsuite = getattr(__import__('django.contrib.gis.tests', globals(), locals(), [test_suite]),test_suite)
+        s.addTest(tsuite.suite())
+    return s, test_models
+
+def run_gis_tests(test_labels, **kwargs):
+    """
+    Use this routine as the TEST_RUNNER in your settings in order to run the
+    GeoDjango test suite.  This must be done as a database superuser for
+    PostGIS, so read the docstring in `run_test()` below for more details.
+    """
+    from django.contrib.gis.tests.utils import mysql
+
+    # Getting initial values.
+    old_installed = settings.INSTALLED_APPS
+    old_root_urlconf = settings.ROOT_URLCONF
+
+    # Based on ALWAYS_INSTALLED_APPS from django test suite --
+    # this prevents us from creating tables in our test database
+    # from locally installed apps.
+    new_installed =  ['django.contrib.contenttypes',
+                      'django.contrib.auth',
+                      'django.contrib.sites',
+                      'django.contrib.sitemaps',
+                      'django.contrib.flatpages',
+                      'django.contrib.gis',
+                      'django.contrib.redirects',
+                      'django.contrib.sessions',
+                      'django.contrib.comments',
+                      'django.contrib.admin',
+                      ]
+
+    # Setting the URLs.
+    settings.ROOT_URLCONF = 'django.contrib.gis.tests.urls'
+
+    # Creating the test suite, adding the test models to INSTALLED_APPS, and
+    # adding the model test suites to our suite package.
+    gis_suite, test_models = geo_suite()
+    for test_model in test_models:
+        module_name = 'django.contrib.gis.tests.%s' % test_model
+        if mysql:
+            test_module_name = 'tests_mysql'
+        else:
+            test_module_name = 'tests'
+        new_installed.append(module_name)
+
+        # Getting the model test suite
+        tsuite = getattr(__import__('django.contrib.gis.tests.%s' % test_model, globals(), locals(), [test_module_name]), 
+                         test_module_name)
+        gis_suite.addTest(tsuite.suite())
+
+    # Resetting the loaded flag to take into account what we appended to 
+    # the INSTALLED_APPS (since this routine is invoked through 
+    # django/core/management, it caches the apps; this ensures that syncdb 
+    # will see our appended models)
+    settings.INSTALLED_APPS = new_installed
+    loading.cache.loaded = False
+
+    # Running the tests using the GIS test runner.
+    result = run_tests(test_labels, suite=gis_suite, **kwargs)
+
+    # Restoring modified settings.
+    settings.INSTALLED_APPS = old_installed
+    settings.ROOT_URLCONF = old_root_urlconf
+
+    return result
+
+def run_tests(test_labels, verbosity=1, interactive=True, extra_tests=[], suite=None):
+    """
+    This module allows users to run tests for GIS apps that require the creation 
+    of a spatial database.  Currently, this is only required for PostgreSQL as
+    PostGIS needs extra overhead in test database creation.
+
+    In order to create a PostGIS database, the DATABASE_USER (or 
+    TEST_DATABASE_USER, if defined) will require superuser priviliges.  
+
+    To accomplish this outside the `postgres` user, you have a few options:
+      (A) Make your user a super user:
+        This may be done at the time the user is created, for example:
+        $ createuser --superuser <user_name>
+
+        Or you may alter the user's role from the SQL shell (assuming this
+        is done from an existing superuser role):
+        postgres# ALTER ROLE <user_name> SUPERUSER;
+
+      (B) Create your own PostgreSQL database as a local user:
+        1. Initialize database: `initdb -D /path/to/user/db`
+        2. If there's already a Postgres instance on the machine, it will need
+           to use a different TCP port than 5432. Edit postgresql.conf (in 
+           /path/to/user/db) to change the database port (e.g. `port = 5433`).  
+        3. Start this database `pg_ctl -D /path/to/user/db start`
+
+      (C) On Windows platforms the pgAdmin III utility may also be used as 
+        a simple way to add superuser privileges to your database user.
+
+    The TEST_RUNNER needs to be set in your settings like so:
+
+      TEST_RUNNER='django.contrib.gis.tests.run_tests'
+
+    Note: This test runner assumes that the PostGIS SQL files ('lwpostgis.sql'
+    and 'spatial_ref_sys.sql') are installed in the directory specified by 
+    `pg_config --sharedir` (and defaults to /usr/local/share if that fails).
+    This behavior is overridden if POSTGIS_SQL_PATH is set in your settings.
+    
+    Windows users should set POSTGIS_SQL_PATH manually because the output
+    of `pg_config` uses paths like 'C:/PROGRA~1/POSTGR~1/..'.
+
+    Finally, the tests may be run by invoking `./manage.py test`.
+    """
+    # The `create_spatial_db` routine abstracts away all the steps needed
+    # to properly construct a spatial database for the backend.
+    from django.contrib.gis.db.backend import create_spatial_db
+
+    # Setting up for testing.
+    setup_test_environment()
+    settings.DEBUG = False
+    old_name = settings.DATABASE_NAME
+
+    # The suite may be passed in manually, e.g., when we run the GeoDjango test,
+    # we want to build it and pass it in due to some customizations.  Otherwise, 
+    # the normal test suite creation process from `django.test.simple.run_tests` 
+    # is used to create the test suite.
+    if suite is None:
+        suite = unittest.TestSuite()
+        if test_labels:
+            for label in test_labels:
+                if '.' in label:
+                    suite.addTest(build_test(label))
+                else:
+                    app = get_app(label)
+                    suite.addTest(build_suite(app))
+        else:
+            for app in get_apps():
+                suite.addTest(build_suite(app))
+    
+        for test in extra_tests:
+            suite.addTest(test)
+
+    # Creating the test spatial database.
+    create_spatial_db(test=True, verbosity=verbosity)
+
+    # Executing the tests (including the model tests), and destorying the
+    # test database after the tests have completed.
+    result = unittest.TextTestRunner(verbosity=verbosity).run(suite)
+    connection.creation.destroy_test_db(old_name, verbosity)
+    teardown_test_environment()
+
+    # Returning the total failures and errors
+    return len(result.failures) + len(result.errors)
diff --git a/webapp/django/contrib/gis/tests/data/test_point/test_point.dbf b/webapp/django/contrib/gis/tests/data/test_point/test_point.dbf
new file mode 100644
index 0000000..b2b4eca
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/data/test_point/test_point.dbf
Binary files differ
diff --git a/webapp/django/contrib/gis/tests/data/test_point/test_point.prj b/webapp/django/contrib/gis/tests/data/test_point/test_point.prj
new file mode 100644
index 0000000..a30c00a
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/data/test_point/test_point.prj
@@ -0,0 +1 @@
+GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]
\ No newline at end of file
diff --git a/webapp/django/contrib/gis/tests/data/test_point/test_point.shp b/webapp/django/contrib/gis/tests/data/test_point/test_point.shp
new file mode 100644
index 0000000..95e8b0a
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/data/test_point/test_point.shp
Binary files differ
diff --git a/webapp/django/contrib/gis/tests/data/test_point/test_point.shx b/webapp/django/contrib/gis/tests/data/test_point/test_point.shx
new file mode 100644
index 0000000..087f3da
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/data/test_point/test_point.shx
Binary files differ
diff --git a/webapp/django/contrib/gis/tests/data/test_poly/test_poly.dbf b/webapp/django/contrib/gis/tests/data/test_poly/test_poly.dbf
new file mode 100644
index 0000000..7965bd6
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/data/test_poly/test_poly.dbf
Binary files differ
diff --git a/webapp/django/contrib/gis/tests/data/test_poly/test_poly.prj b/webapp/django/contrib/gis/tests/data/test_poly/test_poly.prj
new file mode 100644
index 0000000..a30c00a
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/data/test_poly/test_poly.prj
@@ -0,0 +1 @@
+GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]
\ No newline at end of file
diff --git a/webapp/django/contrib/gis/tests/data/test_poly/test_poly.shp b/webapp/django/contrib/gis/tests/data/test_poly/test_poly.shp
new file mode 100644
index 0000000..b22930b
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/data/test_poly/test_poly.shp
Binary files differ
diff --git a/webapp/django/contrib/gis/tests/data/test_poly/test_poly.shx b/webapp/django/contrib/gis/tests/data/test_poly/test_poly.shx
new file mode 100644
index 0000000..c92f78b
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/data/test_poly/test_poly.shx
Binary files differ
diff --git a/webapp/django/contrib/gis/tests/data/test_vrt/test_vrt.csv b/webapp/django/contrib/gis/tests/data/test_vrt/test_vrt.csv
new file mode 100644
index 0000000..dff648f
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/data/test_vrt/test_vrt.csv
@@ -0,0 +1,4 @@
+POINT_X,POINT_Y,NUM
+1.0,2.0,5
+5.0,23.0,17
+100.0,523.5,23
diff --git a/webapp/django/contrib/gis/tests/data/test_vrt/test_vrt.vrt b/webapp/django/contrib/gis/tests/data/test_vrt/test_vrt.vrt
new file mode 100644
index 0000000..85e6be8
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/data/test_vrt/test_vrt.vrt
@@ -0,0 +1,7 @@
+<OGRVRTDataSource>
+<OGRVRTLayer name="test_vrt">
+<SrcDataSource relativeToVRT="1">test_vrt.csv</SrcDataSource>
+<GeometryType>wkbPoint</GeometryType>
+<GeometryField encoding="PointFromColumns" x="POINT_X" y="POINT_Y" z="NUM"/>
+</OGRVRTLayer>
+</OGRVRTDataSource>
\ No newline at end of file
diff --git a/webapp/django/contrib/gis/tests/distapp/__init__.py b/webapp/django/contrib/gis/tests/distapp/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/distapp/__init__.py
diff --git a/webapp/django/contrib/gis/tests/distapp/data.py b/webapp/django/contrib/gis/tests/distapp/data.py
new file mode 100644
index 0000000..fefe313
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/distapp/data.py
@@ -0,0 +1,33 @@
+au_cities = (('Wollongong', 150.902, -34.4245),
+             ('Shellharbour', 150.87, -34.5789),
+             ('Thirroul', 150.924, -34.3147),
+             ('Mittagong', 150.449, -34.4509),
+             ('Batemans Bay', 150.175, -35.7082),
+             ('Canberra', 144.963, -37.8143),
+             ('Melbourne', 145.963, -37.8143),
+             ('Sydney', 151.26071, -33.887034),
+             ('Hobart', 147.33, -42.8827),
+             ('Adelaide', 138.6, -34.9258),
+             ('Hillsdale', 151.231341, -33.952685),
+             )
+
+stx_cities = (('Downtown Houston', -95.363151, 29.763374),
+              ('West University Place', -95.448601, 29.713803),
+              ('Southside Place', -95.436920, 29.705777),
+              ('Bellaire', -95.458732, 29.705614),
+              ('Pearland', -95.287303, 29.563568),
+              ('Galveston', -94.797489, 29.301336),
+              ('Sealy', -96.156952, 29.780918),
+              ('San Antonio', -98.493183, 29.424170),
+              ('Saint Hedwig', -98.199820, 29.414197),
+              )
+
+# Data from U.S. Census ZCTA cartographic boundary file for Texas (`zt48_d00.shp`).
+stx_zips = (('77002', 'POLYGON ((-95.365015 29.772327, -95.362415 29.772327, -95.360915 29.771827, -95.354615 29.771827, -95.351515 29.772527, -95.350915 29.765327, -95.351015 29.762436, -95.350115 29.760328, -95.347515 29.758528, -95.352315 29.753928, -95.356415 29.756328, -95.358215 29.754028, -95.360215 29.756328, -95.363415 29.757128, -95.364014 29.75638, -95.363415 29.753928, -95.360015 29.751828, -95.361815 29.749528, -95.362715 29.750028, -95.367516 29.744128, -95.369316 29.745128, -95.373916 29.744128, -95.380116 29.738028, -95.387916 29.727929, -95.388516 29.729629, -95.387916 29.732129, -95.382916 29.737428, -95.376616 29.742228, -95.372616 29.747228, -95.378601 29.750846, -95.378616 29.752028, -95.378616 29.754428, -95.376016 29.754528, -95.374616 29.759828, -95.373616 29.761128, -95.371916 29.763928, -95.372316 29.768727, -95.365884 29.76791, -95.366015 29.767127, -95.358715 29.765327, -95.358615 29.766327, -95.359115 29.767227, -95.360215 29.767027, -95.362783 29.768267, -95.365315 29.770527, -95.365015 29.772327))'),
+            ('77005', 'POLYGON ((-95.447918 29.727275, -95.428017 29.728729, -95.421117 29.729029, -95.418617 29.727629, -95.418517 29.726429, -95.402117 29.726629, -95.402117 29.725729, -95.395316 29.725729, -95.391916 29.726229, -95.389716 29.725829, -95.396517 29.715429, -95.397517 29.715929, -95.400917 29.711429, -95.411417 29.715029, -95.418417 29.714729, -95.418317 29.70623, -95.440818 29.70593, -95.445018 29.70683, -95.446618 29.70763, -95.447418 29.71003, -95.447918 29.727275))'),
+            ('77025', 'POLYGON ((-95.418317 29.70623, -95.414717 29.706129, -95.414617 29.70533, -95.418217 29.70533, -95.419817 29.69533, -95.419484 29.694196, -95.417166 29.690901, -95.414517 29.69433, -95.413317 29.69263, -95.412617 29.68973, -95.412817 29.68753, -95.414087 29.685055, -95.419165 29.685428, -95.421617 29.68513, -95.425717 29.67983, -95.425017 29.67923, -95.424517 29.67763, -95.427418 29.67763, -95.438018 29.664631, -95.436713 29.664411, -95.440118 29.662231, -95.439218 29.661031, -95.437718 29.660131, -95.435718 29.659731, -95.431818 29.660331, -95.441418 29.656631, -95.441318 29.656331, -95.441818 29.656131, -95.441718 29.659031, -95.441118 29.661031, -95.446718 29.656431, -95.446518 29.673431, -95.446918 29.69013, -95.447418 29.71003, -95.446618 29.70763, -95.445018 29.70683, -95.440818 29.70593, -95.418317 29.70623))'),
+            ('77401', 'POLYGON ((-95.447918 29.727275, -95.447418 29.71003, -95.446918 29.69013, -95.454318 29.68893, -95.475819 29.68903, -95.475819 29.69113, -95.484419 29.69103, -95.484519 29.69903, -95.480419 29.70133, -95.480419 29.69833, -95.474119 29.69833, -95.474119 29.70453, -95.472719 29.71283, -95.468019 29.71293, -95.468219 29.720229, -95.464018 29.720229, -95.464118 29.724529, -95.463018 29.725929, -95.459818 29.726129, -95.459918 29.720329, -95.451418 29.720429, -95.451775 29.726303, -95.451318 29.727029, -95.447918 29.727275))'),
+            )
+
+interstates = (('I-25', 'LINESTRING(-104.4780170766108 36.66698791870694, -104.4468522338495 36.79925409393386, -104.46212692626 36.9372149776075, -104.5126119783768 37.08163268820887, -104.5247764602161 37.29300499892048, -104.7084397427668 37.49150259925398, -104.8126599016282 37.69514285621863, -104.8452887035466 37.87613395659479, -104.7160169341003 38.05951763337799, -104.6165437927668 38.30432045855106, -104.6437227858174 38.53979986564737, -104.7596170387259 38.7322907594295, -104.8380078676822 38.89998460604341, -104.8501253693506 39.09980189213358, -104.8791648316464 39.24368776457503, -104.8635041274215 39.3785278162751, -104.8894471170052 39.5929228239605, -104.9721242843344 39.69528482419685, -105.0112104500356 39.7273080432394, -105.0010368577104 39.76677607811571, -104.981835619 39.81466504121967, -104.9858891550477 39.88806911250832, -104.9873548059578 39.98117234571016, -104.9766220487419 40.09796423450692, -104.9818565932953 40.36056530662884, -104.9912746373997 40.74904484447656)'),
+               )
diff --git a/webapp/django/contrib/gis/tests/distapp/models.py b/webapp/django/contrib/gis/tests/distapp/models.py
new file mode 100644
index 0000000..f23b277
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/distapp/models.py
@@ -0,0 +1,42 @@
+from django.contrib.gis.db import models
+
+class SouthTexasCity(models.Model):
+    "City model on projected coordinate system for South Texas."
+    name = models.CharField(max_length=30)
+    point = models.PointField(srid=32140)
+    objects = models.GeoManager()
+    def __unicode__(self): return self.name
+
+class SouthTexasCityFt(models.Model):
+    "Same City model as above, but U.S. survey feet are the units."
+    name = models.CharField(max_length=30)
+    point = models.PointField(srid=2278)
+    objects = models.GeoManager()
+    def __unicode__(self): return self.name
+
+class AustraliaCity(models.Model):
+    "City model for Australia, using WGS84."
+    name = models.CharField(max_length=30)
+    point = models.PointField()
+    objects = models.GeoManager()
+    def __unicode__(self): return self.name
+
+class CensusZipcode(models.Model):
+    "Model for a few South Texas ZIP codes (in original Census NAD83)."
+    name = models.CharField(max_length=5)
+    poly = models.PolygonField(srid=4269)
+    objects = models.GeoManager()
+
+class SouthTexasZipcode(models.Model):
+    "Model for a few South Texas ZIP codes."
+    name = models.CharField(max_length=5)
+    poly = models.PolygonField(srid=32140)
+    objects = models.GeoManager()
+    def __unicode__(self): return self.name
+
+class Interstate(models.Model):
+    "Geodetic model for U.S. Interstates."
+    name = models.CharField(max_length=10)
+    line = models.LineStringField()
+    objects = models.GeoManager()
+    def __unicode__(self): return self.name
diff --git a/webapp/django/contrib/gis/tests/distapp/tests.py b/webapp/django/contrib/gis/tests/distapp/tests.py
new file mode 100644
index 0000000..057e2f7
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/distapp/tests.py
@@ -0,0 +1,296 @@
+import os, unittest
+from decimal import Decimal
+
+from django.db.models import Q
+from django.contrib.gis.gdal import DataSource
+from django.contrib.gis.geos import GEOSGeometry, Point, LineString
+from django.contrib.gis.measure import D # alias for Distance
+from django.contrib.gis.db.models import GeoQ
+from django.contrib.gis.tests.utils import oracle, postgis, no_oracle
+
+from models import AustraliaCity, Interstate, SouthTexasCity, SouthTexasCityFt, CensusZipcode, SouthTexasZipcode
+from data import au_cities, interstates, stx_cities, stx_zips
+
+class DistanceTest(unittest.TestCase):
+
+    # A point we are testing distances with -- using a WGS84
+    # coordinate that'll be implicitly transormed to that to
+    # the coordinate system of the field, EPSG:32140 (Texas South Central
+    # w/units in meters)
+    stx_pnt = GEOSGeometry('POINT (-95.370401017314293 29.704867409475465)', 4326)
+    # Another one for Australia
+    au_pnt = GEOSGeometry('POINT (150.791 -34.4919)', 4326)
+
+    def get_names(self, qs):
+        cities = [c.name for c in qs]
+        cities.sort()
+        return cities
+
+    def test01_init(self):
+        "Initialization of distance models."
+
+        # Loading up the cities.
+        def load_cities(city_model, data_tup):
+            for name, x, y in data_tup:
+                c = city_model(name=name, point=Point(x, y, srid=4326))
+                c.save()
+        
+        load_cities(SouthTexasCity, stx_cities)
+        load_cities(SouthTexasCityFt, stx_cities)
+        load_cities(AustraliaCity, au_cities)
+
+        self.assertEqual(9, SouthTexasCity.objects.count())
+        self.assertEqual(9, SouthTexasCityFt.objects.count())
+        self.assertEqual(11, AustraliaCity.objects.count())
+        
+        # Loading up the South Texas Zip Codes.
+        for name, wkt in stx_zips:
+            poly = GEOSGeometry(wkt, srid=4269)
+            SouthTexasZipcode(name=name, poly=poly).save()
+            CensusZipcode(name=name, poly=poly).save()
+        self.assertEqual(4, SouthTexasZipcode.objects.count())
+        self.assertEqual(4, CensusZipcode.objects.count())
+
+        # Loading up the Interstates.
+        for name, wkt in interstates:
+            Interstate(name=name, line=GEOSGeometry(wkt, srid=4326)).save()
+        self.assertEqual(1, Interstate.objects.count())
+
+    def test02_dwithin(self):
+        "Testing the `dwithin` lookup type."
+        # Distances -- all should be equal (except for the
+        # degree/meter pair in au_cities, that's somewhat
+        # approximate).
+        tx_dists = [(7000, 22965.83), D(km=7), D(mi=4.349)]
+        au_dists = [(0.5, 32000), D(km=32), D(mi=19.884)]
+        
+        # Expected cities for Australia and Texas.
+        tx_cities = ['Downtown Houston', 'Southside Place']
+        au_cities = ['Mittagong', 'Shellharbour', 'Thirroul', 'Wollongong']
+
+        # Performing distance queries on two projected coordinate systems one
+        # with units in meters and the other in units of U.S. survey feet.
+        for dist in tx_dists:
+            if isinstance(dist, tuple): dist1, dist2 = dist
+            else: dist1 = dist2 = dist
+            qs1 = SouthTexasCity.objects.filter(point__dwithin=(self.stx_pnt, dist1))
+            qs2 = SouthTexasCityFt.objects.filter(point__dwithin=(self.stx_pnt, dist2))
+            for qs in qs1, qs2:
+                self.assertEqual(tx_cities, self.get_names(qs))
+
+        # Now performing the `dwithin` queries on a geodetic coordinate system.
+        for dist in au_dists:
+            if isinstance(dist, D) and not oracle: type_error = True
+            else: type_error = False
+
+            if isinstance(dist, tuple):
+                if oracle: dist = dist[1]
+                else: dist = dist[0]
+                
+            # Creating the query set.
+            qs = AustraliaCity.objects.order_by('name')
+            if type_error:
+                # A TypeError should be raised on PostGIS when trying to pass
+                # Distance objects into a DWithin query using a geodetic field.  
+                self.assertRaises(TypeError, AustraliaCity.objects.filter, point__dwithin=(self.au_pnt, dist))
+            else:
+                self.assertEqual(au_cities, self.get_names(qs.filter(point__dwithin=(self.au_pnt, dist))))
+                                 
+    def test03a_distance_method(self):
+        "Testing the `distance` GeoQuerySet method on projected coordinate systems."
+        # The point for La Grange, TX
+        lagrange = GEOSGeometry('POINT(-96.876369 29.905320)', 4326)
+        # Reference distances in feet and in meters. Got these values from 
+        # using the provided raw SQL statements.
+        #  SELECT ST_Distance(point, ST_Transform(ST_GeomFromText('POINT(-96.876369 29.905320)', 4326), 32140)) FROM distapp_southtexascity;
+        m_distances = [147075.069813, 139630.198056, 140888.552826,
+                       138809.684197, 158309.246259, 212183.594374,
+                       70870.188967, 165337.758878, 139196.085105]
+        #  SELECT ST_Distance(point, ST_Transform(ST_GeomFromText('POINT(-96.876369 29.905320)', 4326), 2278)) FROM distapp_southtexascityft;
+        ft_distances = [482528.79154625, 458103.408123001, 462231.860397575,
+                        455411.438904354, 519386.252102563, 696139.009211594,
+                        232513.278304279, 542445.630586414, 456679.155883207]
+
+        # Testing using different variations of parameters and using models
+        # with different projected coordinate systems.
+        dist1 = SouthTexasCity.objects.distance(lagrange, field_name='point')
+        dist2 = SouthTexasCity.objects.distance(lagrange)  # Using GEOSGeometry parameter
+        dist3 = SouthTexasCityFt.objects.distance(lagrange.ewkt) # Using EWKT string parameter.
+        dist4 = SouthTexasCityFt.objects.distance(lagrange)
+
+        # Original query done on PostGIS, have to adjust AlmostEqual tolerance
+        # for Oracle.
+        if oracle: tol = 2
+        else: tol = 5
+
+        # Ensuring expected distances are returned for each distance queryset.
+        for qs in [dist1, dist2, dist3, dist4]:
+            for i, c in enumerate(qs):
+                self.assertAlmostEqual(m_distances[i], c.distance.m, tol)
+                self.assertAlmostEqual(ft_distances[i], c.distance.survey_ft, tol)
+
+    def test03b_distance_method(self):
+        "Testing the `distance` GeoQuerySet method on geodetic coordnate systems."
+        if oracle: tol = 2
+        else: tol = 5
+
+        # Now testing geodetic distance aggregation.
+        hillsdale = AustraliaCity.objects.get(name='Hillsdale')
+        if not oracle:
+            # PostGIS is limited to disance queries only to/from point geometries,
+            # ensuring a TypeError is raised if something else is put in.
+            self.assertRaises(TypeError, AustraliaCity.objects.distance, 'LINESTRING(0 0, 1 1)')
+            self.assertRaises(TypeError, AustraliaCity.objects.distance, LineString((0, 0), (1, 1)))
+
+        # Got the reference distances using the raw SQL statements:
+        #  SELECT ST_distance_spheroid(point, ST_GeomFromText('POINT(151.231341 -33.952685)', 4326), 'SPHEROID["WGS 84",6378137.0,298.257223563]') FROM distapp_australiacity WHERE (NOT (id = 11));
+        spheroid_distances = [60504.0628825298, 77023.948962654, 49154.8867507115, 90847.435881812, 217402.811862568, 709599.234619957, 640011.483583758, 7772.00667666425, 1047861.7859506, 1165126.55237647]
+        #  SELECT ST_distance_sphere(point, ST_GeomFromText('POINT(151.231341 -33.952685)', 4326)) FROM distapp_australiacity WHERE (NOT (id = 11));  st_distance_sphere
+        sphere_distances = [60580.7612632291, 77143.7785056615, 49199.2725132184, 90804.4414289463, 217712.63666124, 709131.691061906, 639825.959074112, 7786.80274606706, 1049200.46122281, 1162619.7297006]
+
+        # Testing with spheroid distances first.
+        qs = AustraliaCity.objects.exclude(id=hillsdale.id).distance(hillsdale.point, spheroid=True)
+        for i, c in enumerate(qs):
+            self.assertAlmostEqual(spheroid_distances[i], c.distance.m, tol)
+        if postgis:
+            # PostGIS uses sphere-only distances by default, testing these as well.
+            qs =  AustraliaCity.objects.exclude(id=hillsdale.id).distance(hillsdale.point)
+            for i, c in enumerate(qs):
+                self.assertAlmostEqual(sphere_distances[i], c.distance.m, tol)
+
+    @no_oracle # Oracle already handles geographic distance calculation.
+    def test03c_distance_method(self):
+        "Testing the `distance` GeoQuerySet method used with `transform` on a geographic field."
+        # Normally you can't compute distances from a geometry field
+        # that is not a PointField (on PostGIS).
+        self.assertRaises(TypeError, CensusZipcode.objects.distance, self.stx_pnt)
+        
+        # We'll be using a Polygon (created by buffering the centroid
+        # of 77005 to 100m) -- which aren't allowed in geographic distance
+        # queries normally, however our field has been transformed to
+        # a non-geographic system.
+        z = SouthTexasZipcode.objects.get(name='77005')
+
+        # Reference query:
+        # SELECT ST_Distance(ST_Transform("distapp_censuszipcode"."poly", 32140), ST_GeomFromText('<buffer_wkt>', 32140)) FROM "distapp_censuszipcode";
+        dists_m = [3553.30384972258, 1243.18391525602, 2186.15439472242]
+
+        # Having our buffer in the SRID of the transformation and of the field
+        # -- should get the same results. The first buffer has no need for
+        # transformation SQL because it is the same SRID as what was given
+        # to `transform()`.  The second buffer will need to be transformed,
+        # however.
+        buf1 = z.poly.centroid.buffer(100)
+        buf2 = buf1.transform(4269, clone=True)
+        for buf in [buf1, buf2]:
+            qs = CensusZipcode.objects.exclude(name='77005').transform(32140).distance(buf)
+            self.assertEqual(['77002', '77025', '77401'], self.get_names(qs))
+            for i, z in enumerate(qs):
+                self.assertAlmostEqual(z.distance.m, dists_m[i], 5)
+
+    def test04_distance_lookups(self):
+        "Testing the `distance_lt`, `distance_gt`, `distance_lte`, and `distance_gte` lookup types."
+        # Retrieving the cities within a 20km 'donut' w/a 7km radius 'hole'
+        # (thus, Houston and Southside place will be excluded as tested in
+        # the `test02_dwithin` above).
+        qs1 = SouthTexasCity.objects.filter(point__distance_gte=(self.stx_pnt, D(km=7))).filter(point__distance_lte=(self.stx_pnt, D(km=20)))
+        qs2 = SouthTexasCityFt.objects.filter(point__distance_gte=(self.stx_pnt, D(km=7))).filter(point__distance_lte=(self.stx_pnt, D(km=20)))
+        for qs in qs1, qs2:
+            cities = self.get_names(qs)
+            self.assertEqual(cities, ['Bellaire', 'Pearland', 'West University Place'])
+
+        # Doing a distance query using Polygons instead of a Point.
+        z = SouthTexasZipcode.objects.get(name='77005')
+        qs = SouthTexasZipcode.objects.exclude(name='77005').filter(poly__distance_lte=(z.poly, D(m=275)))
+        self.assertEqual(['77025', '77401'], self.get_names(qs))
+        # If we add a little more distance 77002 should be included.
+        qs = SouthTexasZipcode.objects.exclude(name='77005').filter(poly__distance_lte=(z.poly, D(m=300)))
+        self.assertEqual(['77002', '77025', '77401'], self.get_names(qs))
+        
+    def test05_geodetic_distance_lookups(self):
+        "Testing distance lookups on geodetic coordinate systems."
+        if not oracle:
+            # Oracle doesn't have this limitation -- PostGIS only allows geodetic
+            # distance queries from Points to PointFields.
+            mp = GEOSGeometry('MULTIPOINT(0 0, 5 23)')
+            self.assertRaises(TypeError,
+                              AustraliaCity.objects.filter(point__distance_lte=(mp, D(km=100))))
+            # Too many params (4 in this case) should raise a ValueError.
+            self.assertRaises(ValueError, 
+                              AustraliaCity.objects.filter, point__distance_lte=('POINT(5 23)', D(km=100), 'spheroid', '4'))
+
+        # Not enough params should raise a ValueError.
+        self.assertRaises(ValueError,
+                          AustraliaCity.objects.filter, point__distance_lte=('POINT(5 23)',))
+
+        # Getting all cities w/in 550 miles of Hobart.
+        hobart = AustraliaCity.objects.get(name='Hobart')
+        qs = AustraliaCity.objects.exclude(name='Hobart').filter(point__distance_lte=(hobart.point, D(mi=550)))
+        cities = self.get_names(qs)
+        self.assertEqual(cities, ['Batemans Bay', 'Canberra', 'Melbourne'])
+
+        # Cities that are either really close or really far from Wollongong --
+        # and using different units of distance.
+        wollongong = AustraliaCity.objects.get(name='Wollongong')
+        d1, d2 = D(yd=19500), D(nm=400) # Yards (~17km) & Nautical miles.
+
+        # Normal geodetic distance lookup (uses `distance_sphere` on PostGIS.
+        gq1 = GeoQ(point__distance_lte=(wollongong.point, d1))
+        gq2 = GeoQ(point__distance_gte=(wollongong.point, d2))
+        qs1 = AustraliaCity.objects.exclude(name='Wollongong').filter(gq1 | gq2)
+
+        # Geodetic distance lookup but telling GeoDjango to use `distance_spheroid`
+        # instead (we should get the same results b/c accuracy variance won't matter
+        # in this test case). Using `Q` instead of `GeoQ` to be different (post-qsrf
+        # it doesn't matter).
+        if postgis:
+            gq3 = Q(point__distance_lte=(wollongong.point, d1, 'spheroid'))
+            gq4 = Q(point__distance_gte=(wollongong.point, d2, 'spheroid'))
+            qs2 = AustraliaCity.objects.exclude(name='Wollongong').filter(gq3 | gq4)
+            querysets = [qs1, qs2]
+        else:
+            querysets = [qs1]
+
+        for qs in querysets:
+            cities = self.get_names(qs)
+            self.assertEqual(cities, ['Adelaide', 'Hobart', 'Shellharbour', 'Thirroul'])
+
+    def test06_area(self):
+        "Testing the `area` GeoQuerySet method."
+        # Reference queries:
+        # SELECT ST_Area(poly) FROM distapp_southtexaszipcode;
+        area_sq_m = [5437908.90234375, 10183031.4389648, 11254471.0073242, 9881708.91772461]
+        # Tolerance has to be lower for Oracle and differences
+        # with GEOS 3.0.0RC4
+        tol = 2
+        for i, z in enumerate(SouthTexasZipcode.objects.area()):
+            self.assertAlmostEqual(area_sq_m[i], z.area.sq_m, tol)
+
+    def test07_length(self):
+        "Testing the `length` GeoQuerySet method."
+        # Reference query (should use `length_spheroid`).
+        # SELECT ST_length_spheroid(ST_GeomFromText('<wkt>', 4326) 'SPHEROID["WGS 84",6378137,298.257223563, AUTHORITY["EPSG","7030"]]');
+        len_m = 473504.769553813
+        qs = Interstate.objects.length()
+        if oracle: tol = 2
+        else: tol = 5
+        self.assertAlmostEqual(len_m, qs[0].length.m, tol)
+
+    def test08_perimeter(self):
+        "Testing the `perimeter` GeoQuerySet method."
+        # Reference query:
+        # SELECT ST_Perimeter(distapp_southtexaszipcode.poly) FROM distapp_southtexaszipcode;
+        perim_m = [18404.3550889361, 15627.2108551001, 20632.5588368978, 17094.5996143697]
+        if oracle: tol = 2
+        else: tol = 7
+        for i, z in enumerate(SouthTexasZipcode.objects.perimeter()):
+            self.assertAlmostEqual(perim_m[i], z.perimeter.m, tol)
+
+        # Running on points; should return 0.
+        for i, c in enumerate(SouthTexasCity.objects.perimeter(model_att='perim')):
+            self.assertEqual(0, c.perim.m)
+
+def suite():
+    s = unittest.TestSuite()
+    s.addTest(unittest.makeSuite(DistanceTest))
+    return s
diff --git a/webapp/django/contrib/gis/tests/geoapp/__init__.py b/webapp/django/contrib/gis/tests/geoapp/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/geoapp/__init__.py
diff --git a/webapp/django/contrib/gis/tests/geoapp/feeds.py b/webapp/django/contrib/gis/tests/geoapp/feeds.py
new file mode 100644
index 0000000..942b140
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/geoapp/feeds.py
@@ -0,0 +1,63 @@
+from django.contrib.gis import feeds
+from django.contrib.gis.tests.utils import mysql
+from models import City, Country
+
+class TestGeoRSS1(feeds.Feed):
+    link = '/city/'
+    title = 'Test GeoDjango Cities'
+
+    def items(self):
+        return City.objects.all()
+
+    def item_link(self, item):
+        return '/city/%s/' % item.pk
+
+    def item_geometry(self, item):
+        return item.point
+
+class TestGeoRSS2(TestGeoRSS1):
+    def geometry(self, obj):
+        # This should attach a <georss:box> element for the extent of
+        # of the cities in the database.  This tuple came from
+        # calling `City.objects.extent()` -- we can't do that call here
+        # because `extent` is not implemented for MySQL/Oracle.
+        return (-123.30, -41.32, 174.78, 48.46)
+
+    def item_geometry(self, item):
+        # Returning a simple tuple for the geometry.
+        return item.point.x, item.point.y
+
+class TestGeoAtom1(TestGeoRSS1):
+    feed_type = feeds.GeoAtom1Feed
+
+class TestGeoAtom2(TestGeoRSS2):
+    feed_type = feeds.GeoAtom1Feed
+
+    def geometry(self, obj):
+        # This time we'll use a 2-tuple of coordinates for the box.
+        return ((-123.30, -41.32), (174.78, 48.46))
+
+class TestW3CGeo1(TestGeoRSS1):
+    feed_type = feeds.W3CGeoFeed
+
+# The following feeds are invalid, and will raise exceptions.
+class TestW3CGeo2(TestGeoRSS2):
+    feed_type = feeds.W3CGeoFeed
+
+class TestW3CGeo3(TestGeoRSS1):
+    feed_type = feeds.W3CGeoFeed
+
+    def item_geometry(self, item):
+        from django.contrib.gis.geos import Polygon
+        return Polygon(((0, 0), (0, 1), (1, 1), (1, 0), (0, 0)))
+
+# The feed dictionary to use for URLs.
+feed_dict = {
+    'rss1' : TestGeoRSS1,
+    'rss2' : TestGeoRSS2,
+    'atom1' : TestGeoAtom1,
+    'atom2' : TestGeoAtom2,
+    'w3cgeo1' : TestW3CGeo1,
+    'w3cgeo2' : TestW3CGeo2,
+    'w3cgeo3' : TestW3CGeo3,
+}
diff --git a/webapp/django/contrib/gis/tests/geoapp/models.py b/webapp/django/contrib/gis/tests/geoapp/models.py
new file mode 100644
index 0000000..fcb06e1
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/geoapp/models.py
@@ -0,0 +1,33 @@
+from django.contrib.gis.db import models
+from django.contrib.gis.tests.utils import mysql
+
+# MySQL spatial indices can't handle NULL geometries.
+null_flag = not mysql
+
+class Country(models.Model):
+    name = models.CharField(max_length=30)
+    mpoly = models.MultiPolygonField() # SRID, by default, is 4326
+    objects = models.GeoManager()
+    def __unicode__(self): return self.name
+
+class City(models.Model):
+    name = models.CharField(max_length=30)
+    point = models.PointField() 
+    objects = models.GeoManager()
+    def __unicode__(self): return self.name
+
+class State(models.Model):
+    name = models.CharField(max_length=30)
+    poly = models.PolygonField(null=null_flag) # Allowing NULL geometries here.
+    objects = models.GeoManager()
+    def __unicode__(self): return self.name
+
+class Feature(models.Model):
+    name = models.CharField(max_length=20)
+    geom = models.GeometryField()
+    objects = models.GeoManager()
+    def __unicode__(self): return self.name
+
+class MinusOneSRID(models.Model):
+    geom = models.PointField(srid=-1) # Minus one SRID.
+    objects = models.GeoManager()
diff --git a/webapp/django/contrib/gis/tests/geoapp/sitemaps.py b/webapp/django/contrib/gis/tests/geoapp/sitemaps.py
new file mode 100644
index 0000000..ca785f2
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/geoapp/sitemaps.py
@@ -0,0 +1,8 @@
+from django.contrib.gis.sitemaps import GeoRSSSitemap, KMLSitemap, KMZSitemap
+from models import City, Country
+from feeds import feed_dict
+
+sitemaps = {'kml' : KMLSitemap([City, Country]),
+            'kmz' : KMZSitemap([City, Country]),
+            'georss' : GeoRSSSitemap(feed_dict),
+            }
diff --git a/webapp/django/contrib/gis/tests/geoapp/sql/city.mysql.sql b/webapp/django/contrib/gis/tests/geoapp/sql/city.mysql.sql
new file mode 100644
index 0000000..e73375c
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/geoapp/sql/city.mysql.sql
@@ -0,0 +1,8 @@
+INSERT INTO geoapp_city (`name`, `point`) VALUES ('Houston', GeomFromText('POINT (-95.363151 29.763374)'));
+INSERT INTO geoapp_city (`name`, `point`) VALUES ('Dallas', GeomFromText('POINT (-96.801611 32.782057)'));
+INSERT INTO geoapp_city (`name`, `point`) VALUES ('Oklahoma City', GeomFromText('POINT (-97.521157 34.464642)'));
+INSERT INTO geoapp_city (`name`, `point`) VALUES ('Wellington', GeomFromText('POINT (174.783117 -41.315268)'));
+INSERT INTO geoapp_city (`name`, `point`) VALUES ('Pueblo', GeomFromText('POINT (-104.609252 38.255001)'));
+INSERT INTO geoapp_city (`name`, `point`) VALUES ('Lawrence', GeomFromText('POINT (-95.235060 38.971823)'));
+INSERT INTO geoapp_city (`name`, `point`) VALUES ('Chicago', GeomFromText('POINT (-87.650175 41.850385)'));
+INSERT INTO geoapp_city (`name`, `point`) VALUES ('Victoria', GeomFromText('POINT (-123.305196 48.462611)'));
\ No newline at end of file
diff --git a/webapp/django/contrib/gis/tests/geoapp/sql/city.oracle.sql b/webapp/django/contrib/gis/tests/geoapp/sql/city.oracle.sql
new file mode 100644
index 0000000..9e6d7b7
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/geoapp/sql/city.oracle.sql
@@ -0,0 +1,8 @@
+INSERT INTO GEOAPP_CITY ("NAME", "POINT") VALUES ('Houston', SDO_GEOMETRY('POINT (-95.363151 29.763374)', 4326));
+INSERT INTO GEOAPP_CITY ("NAME", "POINT") VALUES ('Dallas', SDO_GEOMETRY('POINT (-96.801611 32.782057)', 4326));
+INSERT INTO GEOAPP_CITY ("NAME", "POINT") VALUES ('Oklahoma City', SDO_GEOMETRY('POINT (-97.521157 34.464642)', 4326));
+INSERT INTO GEOAPP_CITY ("NAME", "POINT") VALUES ('Wellington', SDO_GEOMETRY('POINT (174.783117 -41.315268)', 4326));
+INSERT INTO GEOAPP_CITY ("NAME", "POINT") VALUES ('Pueblo', SDO_GEOMETRY('POINT (-104.609252 38.255001)', 4326));
+INSERT INTO GEOAPP_CITY ("NAME", "POINT") VALUES ('Lawrence', SDO_GEOMETRY('POINT (-95.235060 38.971823)', 4326));
+INSERT INTO GEOAPP_CITY ("NAME", "POINT") VALUES ('Chicago', SDO_GEOMETRY('POINT (-87.650175 41.850385)', 4326));
+INSERT INTO GEOAPP_CITY ("NAME", "POINT") VALUES ('Victoria', SDO_GEOMETRY('POINT (-123.305196 48.462611)', 4326));
\ No newline at end of file
diff --git a/webapp/django/contrib/gis/tests/geoapp/sql/city.postgresql_psycopg2.sql b/webapp/django/contrib/gis/tests/geoapp/sql/city.postgresql_psycopg2.sql
new file mode 100644
index 0000000..3b9b01e
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/geoapp/sql/city.postgresql_psycopg2.sql
@@ -0,0 +1,8 @@
+INSERT INTO geoapp_city ("name", "point") VALUES ('Houston', 'SRID=4326;POINT (-95.363151 29.763374)');
+INSERT INTO geoapp_city ("name", "point") VALUES ('Dallas', 'SRID=4326;POINT (-96.801611 32.782057)');
+INSERT INTO geoapp_city ("name", "point") VALUES ('Oklahoma City', 'SRID=4326;POINT (-97.521157 34.464642)');
+INSERT INTO geoapp_city ("name", "point") VALUES ('Wellington', 'SRID=4326;POINT (174.783117 -41.315268)');
+INSERT INTO geoapp_city ("name", "point") VALUES ('Pueblo', 'SRID=4326;POINT (-104.609252 38.255001)');
+INSERT INTO geoapp_city ("name", "point") VALUES ('Lawrence', 'SRID=4326;POINT (-95.235060 38.971823)');
+INSERT INTO geoapp_city ("name", "point") VALUES ('Chicago', 'SRID=4326;POINT (-87.650175 41.850385)');
+INSERT INTO geoapp_city ("name", "point") VALUES ('Victoria', 'SRID=4326;POINT (-123.305196 48.462611)');
\ No newline at end of file
diff --git a/webapp/django/contrib/gis/tests/geoapp/sql/co.wkt b/webapp/django/contrib/gis/tests/geoapp/sql/co.wkt
new file mode 100644
index 0000000..17fad02
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/geoapp/sql/co.wkt
@@ -0,0 +1 @@
+POLYGON ((-107.9184209999999800 41.0020359999999970, -107.6913358243141800 41.0021042503422490, -107.6256240000000000 41.0021240000000020, -107.5215053632723100 41.0025067105257720, -107.3674429999999900 41.0030730000000010, -107.3177944624011200 41.0029672133671140, -107.3053129562196700 41.0029406188977600, -107.2411939999999900 41.0028039999999980, -107.0006060000000000 41.0034439999999950, -106.8577729999999900 41.0026629999999910, -106.4538589999999900 41.0020569999999940, -106.4395630000000100 41.0019780000000010, -106.4374190000000100 41.0017949999999940, -106.4309500000000000 41.0017519999999960, -106.3918520000000000 41.0011760000000010, -106.3863560000000100 41.0011439999999960, -106.3211649999999900 40.9991229999999970, -106.2175730000000000 40.9977340000000010, -106.1946242545105400 40.9976261471179200, -106.1905405794911800 40.9976069549524670, -106.0611809999999900 40.9969990000000020, -105.7642468572674100 40.9968975561793200, -105.7304210000000100 40.9968860000000030, -105.7248040000000100 40.9969100000000000, -105.5544177044212800 40.9973907108230620, -105.4122207031675800 40.9977918911954480, -105.2771379999999800 40.9981730000000010, -105.2565270000000100 40.9981909999999980, -105.2547790000000000 40.9982100000000000, -105.1734357616781100 40.9981770152523170, -104.9433706805682100 40.9980837236793720, -104.8552730000000000 40.9980479999999970, -104.8295039999999900 40.9992700000000030, -104.6759990000000000 41.0009570000000000, -104.4971489999999900 41.0018280000000030, -104.4970580000000000 41.0018049999999970, -104.4676719999999800 41.0014729999999970, -104.2146920000000000 41.0016570000000020, -104.2141910000000000 41.0015679999999990, -104.2114730000000000 41.0015909999999980, -104.1235859999999900 41.0016259999999950, -104.1045900000000000 41.0015429999999910, -104.0860679999999800 41.0015629999999970, -104.0669609999999900 41.0015039999999970, -104.0532489999999900 41.0014059999999960, -104.0392380000000000 41.0015020000000020, -104.0233829999999800 41.0018870000000040, -104.0182230000000100 41.0016170000000030, -104.0108048867797200 41.0016166745085400, -103.9726419999999800 41.0016150000000010, -103.9713730000000000 41.0015240000000030, -103.9535250000000000 41.0015959999999990, -103.9063240000000000 41.0013870000000010, -103.8962070000000000 41.0017500000000010, -103.8779670000000000 41.0016729999999900, -103.8584489999999900 41.0016809999999980, -103.7504979999999900 41.0020540000000010, -103.5745220000000000 41.0017210000000030, -103.4974469999999900 41.0016350000000000, -103.4866970000000100 41.0019139999999990, -103.4219750000000000 41.0020069999999990, -103.4219250000000000 41.0019689999999950, -103.3969909999999900 41.0025580000000010, -103.3653139999999800 41.0018460000000000, -103.3629790000000000 41.0018439999999910, -103.0778040000000000 41.0022980000000030, -103.0765360000000000 41.0022530000000030, -103.0595379999999900 41.0023679999999970, -103.0579980000000000 41.0023679999999970, -103.0434439999999900 41.0023440000000010, -103.0387040000000000 41.0022510000000010, -103.0020260000000000 41.0024859999999980, -103.0001019999999800 41.0024000000000020, -102.9826900000000100 41.0021569999999970, -102.9814830000000000 41.0021119999999970, -102.9636689999999800 41.0021859999999950, -102.9625220000000100 41.0020719999999980, -102.9607060000000000 41.0020589999999960, -102.9596239999999900 41.0020949999999970, -102.9448300000000000 41.0023029999999980, -102.9431090000000100 41.0020510000000020, -102.9255680000000000 41.0022799999999990, -102.9240290000000000 41.0021419999999990, -102.9065469999999900 41.0022759999999950, -102.9047960000000000 41.0022069999999990, -102.8874069999999800 41.0021780000000010, -102.8857460000000000 41.0021309999999990, -102.8678220000000000 41.0021830000000020, -102.8657839999999900 41.0019879999999970, -102.8492629999999900 41.0023010000000030, -102.8464550000000100 41.0022560000000030, -102.8303029999999900 41.0023509999999970, -102.8272800000000000 41.0021429999999970, -102.7735460000000000 41.0024140000000020, -102.7667230000000000 41.0022749999999900, -102.7546170000000000 41.0023609999999930, -102.7396239999999900 41.0022299999999970, -102.6534629999999900 41.0023320000000030, -102.6210330000000000 41.0025970000000020, -102.5786959999999900 41.0022910000000000, -102.5757380000000000 41.0022680000000010, -102.5754960000000000 41.0022000000000020, -102.5660479999999900 41.0022000000000020, -102.5567889999999900 41.0022189999999970, -102.5177010715824500 41.0023473358779430, -102.4879549999999900 41.0024449999999940, -102.4705369999999800 41.0023819999999970, -102.4692230000000000 41.0024239999999980, -102.4603345936969100 41.0024118023655500, -102.3877509894849600 41.0023121952773270, -102.3803729919328400 41.0023020703894620, -102.3795930000000000 41.0023010000000030, -102.3640659999999900 41.0021739999999970, -102.2928330000000000 41.0022069999999990, -102.2926219999999900 41.0022299999999970, -102.2925530000000000 41.0022069999999990, -102.2913540000000000 41.0022069999999990, -102.2778034555739900 41.0022337435695480, -102.2720999999999900 41.0022450000000020, -102.2678119999999900 41.0023830000000020, -102.2319310000000000 41.0023270000000010, -102.2121999999999800 41.0024620000000010, -102.2093610000000000 41.0024420000000020, -102.2090839362510100 41.0024402293320020, -102.2077760551977500 41.0024318708833140, -102.1912100000000000 41.0023259999999960, -102.1249720000000000 41.0023380000000020, -102.0705980000000000 41.0024230000000000, -102.0516140000000000 41.0023770000000030, -102.0512919999999900 40.7495910000000020, -102.0516344326070000 40.5821295926172280, -102.0517250000000000 40.5378389999999910, -102.0515190000000000 40.5200940000000000, -102.0514649999999900 40.4400079999999990, -102.0518400000000000 40.3963960000000030, -102.0515719999999900 40.3930799999999980, -102.0517979999999900 40.3600690000000030, -102.0515855426165400 40.3506461457410240, -102.0513090000000000 40.3383809999999980, -102.0519220000000000 40.2353439999999980, -102.0518939999999900 40.2291929999999950, -102.0519089999999900 40.1626740000000030, -102.0520010000000000 40.1483589999999990, -102.0518526008886700 40.0644696175368220, -102.0517440000000000 40.0030780000000020, -102.0517155646578700 39.9781730274562650, -102.0515690000000000 39.8498050000000030, -102.0513629999999900 39.8434710000000010, -102.0513179999999900 39.8333110000000020, -102.0512540000000000 39.8189920000000010, -102.0505939999999900 39.6755939999999900, -102.0500990000000000 39.6538120000000020, -102.0504219999999800 39.6460479999999930, -102.0499540000000000 39.5923310000000010, -102.0498059999999900 39.5740580000000010, -102.0495539999999900 39.5389320000000030, -102.0496730000000000 39.5366909999999980, -102.0496790000000000 39.5061830000000000, -102.0493690000000000 39.4233330000000000, -102.0493700000000000 39.4182100000000020, -102.0491669999999800 39.4035969999999980, -102.0489599999999800 39.3737119999999900, -102.0484490000000100 39.3031379999999900, -102.0472500000000100 39.1370200000000000, -102.0471339999999900 39.1297009999999970, -102.0465709999999900 39.0470380000000010, -102.0453879999999900 38.8133919999999930, -102.0453340000000000 38.7994630000000030, -102.0454479999999900 38.7834530000000020, -102.0453710000000000 38.7700639999999980, -102.0452870000000000 38.7555279999999980, -102.0453750000000100 38.7543389999999950, -102.0452119999999900 38.6975669999999990, -102.0451560000000100 38.6885550000000010, -102.0451269999999900 38.6867250000000030, -102.0451600000000000 38.6752210000000010, -102.0451020000000000 38.6749459999999980, -102.0450740000000000 38.6696170000000020, -102.0452880000000000 38.6152489999999990, -102.0452109999999900 38.5816089999999930, -102.0451889999999800 38.5587319999999920, -102.0452229999999900 38.5437969999999980, -102.0451120000000000 38.5237839999999990, -102.0452619999999900 38.5055319999999950, -102.0452629999999900 38.5053950000000000, -102.0453239999999800 38.4536469999999970, -102.0449360000000100 38.4196800000000000, -102.0444419999999900 38.4158019999999990, -102.0449440000000000 38.3844190000000010, -102.0446130000000000 38.3123239999999970, -102.0445680000000000 38.2688190000000010, -102.0443980000000000 38.2500149999999980, -102.0442510000000000 38.1417779999999950, -102.0445353236236500 38.1276753800285280, -102.0445890000000000 38.1250129999999960, -102.0445402773320500 38.1232621932310920, -102.0442550000000100 38.1130109999999930, -102.0446235449346800 38.0490802965374900, -102.0446310070721800 38.0477858554663160, -102.0446440000000100 38.0455320000000010, -102.0446200858831200 38.0420217065706370, -102.0445393420861100 38.0301695264644910, -102.0438440000000100 37.9281019999999960, -102.0438450000000000 37.9261350000000020, -102.0432189999999900 37.8679289999999900, -102.0430329999999900 37.8241459999999990, -102.0429530000000000 37.8035349999999970, -102.0426680000000100 37.7887580000000010, -102.0421580000000000 37.7601640000000030, -102.0418760000000000 37.7238750000000000, -102.0415740000000000 37.6804360000000000, -102.0416940000000100 37.6656809999999990, -102.0415819999999900 37.6544949999999970, -102.0415850000000000 37.6442819999999970, -102.0416180000000000 37.6078680000000030, -102.0417794058394900 37.5786915552958260, -102.0418940000000000 37.5579770000000010, -102.0418990000000000 37.5411860000000030, -102.0420159999999900 37.5352609999999980, -102.0417860000000000 37.5060659999999970, -102.0418009999999900 37.4694879999999980, -102.0417549999999900 37.4348549999999920, -102.0416690000000000 37.4347399999999980, -102.0416759999999800 37.4098979999999910, -102.0415240000000000 37.3750179999999970, -102.0420890000000000 37.3528189999999970, -102.0419740000000000 37.3526129999999980, -102.0418169999999900 37.3094899999999970, -102.0416640000000000 37.2976499999999900, -102.0419630000000000 37.2581640000000010, -102.0420020000000000 37.1417440000000030, -102.0421350000000000 37.1250209999999970, -102.0420920000000000 37.1250209999999970, -102.0418089999999900 37.1119729999999990, -102.0419830000000000 37.1065510000000030, -102.0419199999999900 37.0350830000000000, -102.0417490000000000 37.0343969999999980, -102.0419210000000000 37.0321780000000020, -102.0419500000000000 37.0308050000000010, -102.0419519999999900 37.0247419999999960, -102.0422400000000100 36.9930829999999990, -102.0545030000000000 36.9931089999999970, -102.1842710000000000 36.9935929999999970, -102.2083160000000000 36.9937299999999990, -102.2607890000000000 36.9943880000000010, -102.2703456818352900 36.9943999333374620, -102.3075936504973800 36.9944464445206690, -102.3552880000000000 36.9945059999999940, -102.3553670000000000 36.9945749999999980, -102.6981420000000000 36.9951489999999980, -102.7420599999999800 36.9976890000000010, -102.7598600000000000 37.0000190000000020, -102.7785689999999900 36.9992420000000020, -102.8067620000000100 37.0000190000000020, -102.8146160000000000 37.0007829999999980, -102.8419890000000000 36.9995979999999990, -102.9796130000000000 36.9985489999999970, -102.9858069999999900 36.9985709999999980, -102.9869760000000000 36.9985240000000030, -103.0021990000000000 37.0001040000000000, -103.0861049694139500 37.0001738656940380, -103.1054053653286500 37.0001899364881130, -103.1559220000000000 37.0002319999999970, -103.2006317284721000 37.0000603865096880, -103.3271777694062600 36.9995746531243130, -103.4256788724330500 36.9991965672206930, -103.7332470000000100 36.9980159999999930, -103.7343639999999900 36.9980410000000010, -104.0078549999999900 36.9962390000000030, -104.2154754884639700 36.9948744321965890, -104.2505359999999800 36.9946440000000010, -104.2975706429598400 36.9940532503817470, -104.3388329999999900 36.9935350000000010, -104.3556505253503100 36.9935565317715810, -104.3664476855351100 36.9935703555644370, -104.3992028820832900 36.9936122926149620, -104.4297693866500100 36.9936514274448880, -104.4806103169752700 36.9937165199763950, -104.5192570000000000 36.9937659999999940, -104.6245560000000000 36.9943769999999930, -104.6255450000000000 36.9935990000000030, -104.6450289999999900 36.9933779999999930, -104.7061122072671500 36.9934264441886570, -104.7320310000000100 36.9934470000000030, -104.7321199999999800 36.9934840000000020, -104.8399904125201100 36.9933955928282070, -105.0005539999999800 36.9932640000000030, -105.0292279999999900 36.9927289999999900, -105.1208000000000000 36.9954279999999970, -105.1550419641015100 36.9953391471581630, -105.2206130000000000 36.9951689999999970, -105.2512960000000000 36.9956049999999980, -105.4193100000000000 36.9958560000000030, -105.4381027436132300 36.9959680306975970, -105.4424590000000000 36.9959940000000030, -105.4472550000000000 36.9960169999999950, -105.4651820000000000 36.9959909999999970, -105.4708767069258500 36.9959784767062560, -105.5088359999999900 36.9958949999999900, -105.5124850000000000 36.9957769999999970, -105.5339220000000000 36.9958749999999980, -105.6274699999999900 36.9956790000000030, -105.6647199999999900 36.9958740000000010, -105.7164710000000000 36.9958489999999930, -105.7184073045491700 36.9958460161492080, -105.9961590000000100 36.9954180000000010, -105.9974720000000000 36.9954170000000030, -106.0066339999999900 36.9953429999999980, -106.0998058674331200 36.9947591067049760, -106.1639713822180900 36.9943569916150140, -106.2014689999999900 36.9941219999999970, -106.2477050000000000 36.9942660000000030, -106.2486750000000100 36.9942879999999900, -106.2932790000000000 36.9938900000000000, -106.3254286788247500 36.9941092316646730, -106.3431389999999800 36.9942300000000020, -106.4762779528519600 36.9938393350510210, -106.5005890000000100 36.9937679999999960, -106.6171590000000000 36.9929670000000000, -106.6171249999999900 36.9930039999999990, -106.6286520000000000 36.9931750000000010, -106.6287329999999800 36.9931609999999940, -106.6613440000000000 36.9932430000000000, -106.6756259999999900 36.9931229999999970, -106.7505910000000000 36.9924609999999990, -106.7820952897146500 36.9924517499673660, -106.8697959999999900 36.9924259999999950, -106.8772919999999800 37.0001389999999900, -106.9188864633427000 37.0001287471619240, -106.9560183645763800 37.0001195943242540, -107.1072626267445100 37.0000823133304520, -107.2552027234696400 37.0000458467977750, -107.4209130000000000 37.0000049999999940, -107.4224150136806600 37.0000049896361030, -107.4421819991443200 37.0000048532438730, -107.4817370013986600 37.0000045803142900, -107.5240868464170200 37.0000042881002860, -107.6007136407778000 37.0000037593752680, -107.7124779008385600 37.0000029882016790, -107.8556954995019300 37.0000020000000020, -107.8663089376175300 37.0000019267672610, -107.8691399085863600 37.0000019072335460, -107.8691806993063300 37.0000019069521000, -108.0006230000000000 37.0000009999999970, -108.1791870752784600 36.9992931616249270, -108.1871395402988700 36.9992616375912750, -108.2493580000000000 36.9990150000000000, -108.2506349999999900 36.9995610000000000, -108.2880860000000100 36.9995550000000010, -108.2884000000000000 36.9995199999999970, -108.3204640000000000 36.9994990000000000, -108.3207209999999900 36.9995100000000010, -108.3791655704288800 36.9994589777070430, -108.6196889999999900 36.9992489999999990, -108.6203090000000100 36.9992870000000020, -108.7492698254058500 36.9991399338227680, -108.9544040000000000 36.9989059999999980, -108.9588680000000000 36.9989130000000020, -109.0452229999999900 36.9990840000000030, -109.0451659999999800 37.0727419999999980, -109.0450580000000000 37.0746609999999990, -109.0449950000000000 37.0864290000000030, -109.0451889999999900 37.0962709999999940, -109.0451730000000100 37.1094640000000030, -109.0452029999999900 37.1119579999999940, -109.0451559999999900 37.1120639999999970, -109.0459950000000000 37.1772789999999990, -109.0459780000000100 37.2018309999999990, -109.0458015051062800 37.2050708135988660, -109.0454869999999900 37.2108440000000020, -109.0455598795331900 37.2397756720027080, -109.0455601977475200 37.2399019965338450, -109.0455839999999900 37.2493509999999970, -109.0460389999999900 37.2499930000000030, -109.0458980422733100 37.3269349905485300, -109.0458100000000000 37.3749930000000030, -109.0437991323256200 37.4690283342420190, -109.0434637832608200 37.4847104508718160, -109.0434249427800400 37.4865267700853340, -109.0431370000000000 37.4999919999999990, -109.0419150000000000 37.5306530000000010, -109.0418650000000000 37.5307260000000010, -109.0418059999999900 37.6041710000000010, -109.0421310000000000 37.6176620000000030, -109.0420890000000000 37.6237950000000010, -109.0422690000000000 37.6660669999999980, -109.0417320000000000 37.7112139999999980, -109.0417600000000000 37.7131820000000030, -109.0416360000000000 37.7402099999999980, -109.0420980000000000 37.7499899999999970, -109.0420421489000700 37.7543839997998490, -109.0414610000000000 37.8001050000000020, -109.0417540000000000 37.8358259999999900, -109.0417229999999900 37.8420509999999980, -109.0418440000000000 37.8727880000000000, -109.0416528185789500 37.8811669027885570, -109.0410580000000100 37.9072359999999970, -109.0431209999999900 37.9742600000000010, -109.0428189999999900 37.9970679999999990, -109.0428199999999900 37.9993010000000030, -109.0419724039658400 38.1317991668174590, -109.0418366569747100 38.1530194495367920, -109.0417619999999900 38.1646900000000000, -109.0546480000000000 38.2449209999999980, -109.0600619999999900 38.2754890000000000, -109.0599620000000000 38.4999869999999900, -109.0602530000000000 38.5993279999999930, -109.0595410000000000 38.7198879999999970, -109.0573880000000000 38.7954559999999940, -109.0572160449167600 38.7997308495970760, -109.0541889999999900 38.8749839999999980, -109.0539429999999900 38.9044140000000030, -109.0537970000000000 38.9052839999999950, -109.0532330000000100 38.9424670000000010, -109.0532919999999800 38.9428780000000000, -109.0524359999999900 38.9999850000000020, -109.0515879125035400 39.1157342577700790, -109.0515835157382700 39.1163343400931040, -109.0515807806367500 39.1167076340895430, -109.0515120000000000 39.1260949999999990, -109.0507650000000000 39.3666770000000030, -109.0513629999999800 39.4976740000000040, -109.0510402483332400 39.6604720118441210, -109.0506149999999900 39.8749699999999980, -109.0508730000000000 40.0589149999999990, -109.0508130000000100 40.0595789999999920, -109.0509440000000000 40.1807119999999930, -109.0509730000000000 40.1808490000000020, -109.0509687158226500 40.2226624122704100, -109.0509460000000000 40.4443679999999970, -109.0503140000000000 40.4950920000000000, -109.0506979999999800 40.4999630000000010, -109.0499550000000000 40.5399010000000000, -109.0500740000000000 40.5403579999999980, -109.0500719640466700 40.5404371043087370, -109.0480440000000000 40.6192309999999990, -109.0482490000000000 40.6536009999999950, -109.0490880000000000 40.7145620000000010, -109.0484550000000000 40.8260810000000020, -109.0500760000000000 41.0006589999999990, -108.8841379999999900 41.0000939999999970, -108.6311080000000000 41.0001559999999900, -108.5266670000000000 40.9996080000000020, -108.5006590000000000 41.0001120000000010, -108.2506490000000000 41.0001140000000040, -108.1812270000000100 41.0004549999999950, -108.0892190031385500 41.0015541392473680, -108.0465390000000000 41.0020639999999970, -107.9232341223959400 41.0020370519008000, -107.9184209999999800 41.0020359999999970))
\ No newline at end of file
diff --git a/webapp/django/contrib/gis/tests/geoapp/sql/country.mysql.sql b/webapp/django/contrib/gis/tests/geoapp/sql/country.mysql.sql
new file mode 100644
index 0000000..cd1cd78
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/geoapp/sql/country.mysql.sql
@@ -0,0 +1,4 @@
+-- New Zealand bondary courtesy of 'world_borders.shp', which was assembled from public domain sources by Schuyler Erle. See: http://mappinghacks.com/data/
+-- Texas boundary data is a data product from the U.S. Census Bureau.  See 'state.sql' for more information.
+INSERT INTO geoapp_country (`name`, `mpoly`) VALUES ('New Zealand', GeomFromText('MULTIPOLYGON (((174.616364000000004 -36.100861000000002,174.634978999999987 -36.124718,174.708862000000011 -36.205559,174.781096999999988 -36.266945,174.812744000000009 -36.339165,174.768311000000011 -36.34639,174.710784999999987 -36.525832999999999,174.708587999999992 -36.533332999999999,174.70773299999999 -36.541671999999998,174.714690999999988 -36.595832999999999,174.717194000000006 -36.603057999999997,174.774414000000007 -36.730277999999998,174.808319000000012 -36.805275000000002,174.854400999999996 -36.847777999999998,174.896636999999998 -36.878334000000002,175.011658000000011 -36.871941,175.020813000000004 -36.873610999999997,175.055542000000003 -36.880279999999999,175.076629999999994 -36.890839,175.082458000000003 -36.895279000000002,175.087463000000014 -36.900832999999999,175.091644000000002 -36.925559999999997,175.161652000000004 -36.955559,175.221069 -36.937775000000002,175.230255 -36.939438000000003,175.278320000000008 -36.965279000000002,175.310516000000007 -36.995002999999997,175.319976999999994 -37.005836000000002,175.323853000000014 -37.012222,175.328856999999999 -37.026947,175.330261000000007 -37.035277999999998,175.330535999999995 -37.044449,175.321899000000002 -37.06472,175.31942699999999 -37.095275999999998,175.317748999999992 -37.144165,175.319121999999993 -37.152495999999999,175.328856999999999 -37.168892,175.373290999999995 -37.216659999999997,175.385254000000003 -37.225830000000002,175.404967999999997 -37.228050000000003,175.579131999999987 -37.244446000000003,175.58914200000001 -37.169449,175.551636000000002 -37.024718999999997,175.547484999999995 -37.009171000000002,175.542480000000012 -36.994446000000003,175.536102 -36.980826999999998,175.524993999999992 -36.961669999999998,175.498566000000011 -36.927222999999998,175.484406000000007 -36.920279999999998,175.476348999999999 -36.917777999999998,175.464416999999997 -36.90889,175.435241999999988 -36.866942999999999,175.46691899999999 -36.809998,175.509430000000009 -36.776108,175.486358999999993 -36.679726000000002,175.463593000000003 -36.621383999999999,175.378296000000006 -36.570557,175.366364000000004 -36.561667999999997,175.361633000000012 -36.556389000000003,175.356628 -36.541671999999998,175.353850999999992 -36.525002,175.35244800000001 -36.489998,175.353577 -36.481940999999999,175.360229000000004 -36.478050000000003,175.538025000000005 -36.514724999999999,175.542755 -36.519996999999996,175.604950000000002 -36.622771999999998,175.631072999999986 -36.710555999999997,175.763610999999997 -36.713614999999997,175.840789999999998 -36.754173000000002,175.733582000000013 -36.805832000000002,175.701629999999994 -36.844161999999997,175.707458000000003 -36.869995000000003,175.709960999999993 -36.875275000000002,175.714690999999988 -36.880828999999999,175.720519999999993 -36.885277000000002,175.735779000000008 -36.891387999999999,175.74383499999999 -36.893889999999999,175.758330999999998 -36.876106,175.761382999999995 -36.869446000000003,175.757751000000013 -36.863059999999997,175.753051999999997 -36.857779999999998,175.749114999999989 -36.851394999999997,175.75 -36.843055999999997,175.752196999999995 -36.835555999999997,175.756378000000012 -36.830002,175.765533000000005 -36.828055999999997,175.808013999999986 -36.824173000000002,175.817200000000014 -36.825836000000002,175.833587999999992 -36.830832999999998,175.845519999999993 -36.839722000000002,175.849120999999997 -36.846107000000003,175.878570999999994 -36.914444000000003,175.881072999999986 -36.921669,175.918304000000006 -37.067504999999997,175.917480000000012 -37.075836000000002,175.915253000000007 -37.083061,175.898314999999997 -37.115004999999996,175.884154999999993 -37.168892,175.883330999999998 -37.176949,175.887206999999989 -37.244163999999998,175.892212 -37.249724999999998,175.921082000000013 -37.251671000000002,175.927185000000009 -37.256110999999997,175.93081699999999 -37.262504999999997,175.936371000000008 -37.278885000000002,175.940093999999988 -37.299717,175.974396000000013 -37.418059999999997,175.976074000000011 -37.453055999999997,176.026931999999988 -37.483108999999999,176.035583000000003 -37.487282,176.059417999999994 -37.502502,176.088287000000008 -37.525557999999997,176.093291999999991 -37.531112999999998,176.165526999999997 -37.613892,176.169433999999995 -37.620277000000002,176.167205999999993 -37.625832000000003,176.160247999999996 -37.624167999999997,176.082458000000003 -37.602500999999997,176.066924999999998 -37.59639,176.061095999999992 -37.591942000000003,176.057189999999991 -37.585555999999997,176.062744000000009 -37.580832999999998,176.070800999999989 -37.577781999999999,176.088287000000008 -37.580002,176.095245000000006 -37.576110999999997,176.090239999999994 -37.570838999999999,176.062468999999993 -37.546669,176.023087000000004 -37.528221000000002,176.018767999999994 -37.526057999999999,176.013931000000014 -37.524554999999999,176.007598999999999 -37.524222999999999,175.955535999999995 -37.521110999999998,175.946349999999995 -37.523055999999997,175.940796000000006 -37.527779000000002,175.953583000000009 -37.558891000000003,175.994415000000004 -37.638893000000003,176.071899000000002 -37.655273,176.14498900000001 -37.675277999999999,176.242187999999999 -37.709442000000003,176.267486999999988 -37.676392,176.488281 -37.756667999999998,176.521636999999998 -37.769447,176.527771 -37.773887999999999,176.537475999999998 -37.784447,176.549712999999997 -37.793334999999999,176.656646999999992 -37.855559999999997,176.671082000000013 -37.862502999999997,176.686645999999996 -37.868332000000002,176.759154999999993 -37.892775999999998,176.784149000000014 -37.900275999999998,176.80304000000001 -37.903328000000002,176.819702000000007 -37.904442000000003,176.838287000000008 -37.907501000000003,176.917755 -37.926108999999997,176.943848000000003 -37.932502999999997,177.08273299999999 -37.967216,177.107468000000011 -37.987220999999998,177.159424 -38.013336000000002,177.415253000000007 -37.982498,177.47357199999999 -37.962502,177.545806999999996 -37.919167000000002,177.552459999999996 -37.915000999999997,177.571625000000012 -37.902222000000002,177.599120999999997 -37.878051999999997,177.603577 -37.872498,177.646941999999996 -37.805,177.732178000000005 -37.682502999999997,177.738861000000014 -37.678336999999999,177.746917999999994 -37.675277999999999,177.791931000000005 -37.666946000000003,177.849396000000013 -37.657218999999998,177.858856000000003 -37.656661999999997,177.868010999999996 -37.654442000000003,177.875792999999987 -37.651389999999999,178.0 -37.592224000000002,178.006653 -37.588332999999999,178.012206999999989 -37.583328000000002,178.018004999999988 -37.550831000000002,178.05581699999999 -37.542777999999998,178.064972000000012 -37.542228999999999,178.187744000000009 -37.546951,178.281921000000011 -37.560828999999998,178.306915000000004 -37.568061999999998,178.311919999999986 -37.573334000000003,178.312468999999993 -37.578887999999999,178.306915000000004 -37.583610999999998,178.321075000000008 -37.602500999999997,178.336365 -37.618332000000002,178.34970100000001 -37.626944999999999,178.367737000000005 -37.630828999999999,178.448028999999991 -37.645279000000002,178.457458000000003 -37.646667,178.468018 -37.646949999999997,178.488861000000014 -37.644165,178.497192000000013 -37.646667,178.504424999999998 -37.649994,178.550536999999991 -37.6875,178.555542000000003 -37.692497000000003,178.559692000000013 -37.698883000000002,178.56552099999999 -37.713332999999999,178.562468999999993 -37.719994,178.483306999999996 -37.826393000000003,178.455230999999998 -37.860000999999997,178.449982000000006 -37.865004999999996,178.429687999999999 -37.876944999999999,178.419983000000002 -37.887779000000002,178.350525000000005 -38.004722999999998,178.347473000000008 -38.011116,178.347197999999992 -38.019722000000002,178.348846000000009 -38.027779000000002,178.354950000000002 -38.032218999999998,178.360229000000004 -38.037506,178.364136000000002 -38.043616999999998,178.375792999999987 -38.072777000000002,178.378296000000006 -38.089995999999999,178.377746999999999 -38.09861,178.353850999999992 -38.185555,178.319976999999994 -38.248055,178.318024000000008 -38.255561999999998,178.317474000000004 -38.263893000000003,178.320800999999989 -38.398612999999997,178.302459999999996 -38.528885000000002,178.300536999999991 -38.536391999999999,178.296356000000003 -38.541946000000003,178.158874999999995 -38.649169999999998,178.074982000000006 -38.713889999999999,178.068297999999999 -38.717773,178.060241999999988 -38.721107000000003,178.050812000000008 -38.721381999999998,178.044433999999995 -38.717216,177.928864000000004 -38.722220999999998,177.941070999999994 -38.793616999999998,177.923858999999993 -38.918334999999999,177.917786000000007 -38.942802,177.909697999999992 -38.969718999999998,177.897705000000002 -39.047942999999997,177.893859999999989 -39.064776999999999,177.906708000000009 -39.064278000000002,177.923034999999999 -39.089165,177.942200000000014 -39.091942000000003,177.967743000000013 -39.098334999999999,177.991332999999997 -39.115004999999996,177.996612999999996 -39.120277000000002,177.999390000000005 -39.127495000000003,177.909973000000008 -39.256950000000003,177.898865 -39.267502,177.874968999999993 -39.286118000000002,177.868010999999996 -39.290283000000002,177.861908 -39.285834999999999,177.844970999999987 -39.251396,177.839416999999997 -39.236946000000003,177.824127000000004 -39.193053999999997,177.823577999999998 -39.183883999999999,177.826629999999994 -39.177222999999998,177.841644000000002 -39.152779000000002,177.822021000000007 -39.114445000000003,177.823195999999996 -39.110115,177.82351700000001 -39.105110000000003,177.82119800000001 -39.101275999999999,177.816696000000007 -39.099274,177.680266999999986 -39.075279000000002,177.628845000000013 -39.071114,177.426085999999998 -39.064163,177.387755999999996 -39.077781999999999,177.246917999999994 -39.128334000000002,177.206085000000002 -39.143616000000002,177.149138999999991 -39.165000999999997,177.054961999999989 -39.204445,176.935790999999995 -39.349997999999999,176.931365999999997 -39.355559999999997,176.903870000000012 -39.398055999999997,176.898865 -39.412216,176.89776599999999 -39.438048999999999,176.899414000000007 -39.446387999999999,176.946625000000012 -39.664444000000003,177.01080300000001 -39.654998999999997,177.107178000000005 -39.660828000000002,177.116913000000011 -39.662216,177.120789000000002 -39.66861,177.119110000000006 -39.676108999999997,177.115783999999991 -39.682502999999997,177.08273299999999 -39.729996,177.073577999999998 -39.741385999999999,177.068024000000008 -39.746108999999997,177.059692000000013 -39.749167999999997,177.050262000000004 -39.751396,177.033874999999995 -39.757506999999997,177.028045999999989 -39.762504999999997,177.023590000000013 -39.768059,177.020263999999997 -39.774718999999997,176.894713999999993 -40.034728999999999,176.890533000000005 -40.049728000000002,176.889983999999998 -40.058052000000004,176.89498900000001 -40.082779000000002,176.893035999999995 -40.090279000000002,176.874114999999989 -40.121383999999999,176.834136999999998 -40.181671,176.808319000000012 -40.216659999999997,176.796935999999988 -40.226387000000003,176.687195000000003 -40.321387999999999,176.644135000000006 -40.379997000000003,176.628296000000006 -40.421944000000003,176.539977999999991 -40.495002999999997,176.521362000000011 -40.513893000000003,176.500823999999994 -40.535004,176.441924999999998 -40.600281000000003,176.405243000000013 -40.643889999999999,176.386108000000007 -40.675002999999997,176.35522499999999 -40.688606,176.349396000000013 -40.693610999999997,176.288574000000011 -40.793892,176.239136000000002 -40.90889,176.22079500000001 -40.931671,176.195526 -40.941665999999998,176.172760000000011 -40.952224999999999,176.158600000000007 -40.959999000000003,176.152771 -40.964722000000002,176.142212 -40.975273,176.134154999999993 -40.987502999999997,176.120789000000002 -41.013618,176.11300700000001 -41.035277999999998,176.098297000000002 -41.087218999999997,176.087463000000014 -41.116112,176.080811000000011 -41.129165999999998,176.062195000000003 -41.151938999999999,175.984679999999997 -41.231383999999998,175.955230999999998 -41.255279999999999,175.819121999999993 -41.347220999999998,175.743561 -41.392226999999998,175.736358999999993 -41.396110999999998,175.557738999999998 -41.485000999999997,175.471069 -41.541389000000002,175.427459999999996 -41.564444999999999,175.323028999999991 -41.614449,175.313292999999987 -41.616394,175.230804000000006 -41.620834000000002,175.222197999999992 -41.618332000000002,175.21691899999999 -41.612777999999999,175.184692000000013 -41.535834999999999,175.181915000000004 -41.519447,175.181091000000009 -41.500838999999999,175.188568000000004 -41.461112999999997,175.193024000000008 -41.446106,175.193848000000003 -41.437775000000002,175.191070999999994 -41.430557,175.186095999999992 -41.425002999999997,175.080261000000007 -41.385559,175.063018999999997 -41.380279999999999,175.05304000000001 -41.378608999999997,175.045532000000009 -41.378608999999997,175.027190999999988 -41.381667999999998,174.993286000000012 -41.393332999999998,174.985779000000008 -41.397224,174.972747999999996 -41.405830000000002,174.960509999999999 -41.415275999999999,174.949982000000006 -41.425559999999997,174.944976999999994 -41.431114,174.94165000000001 -41.437775000000002,174.936919999999986 -41.443328999999999,174.918578999999994 -41.448051,174.908600000000007 -41.448334000000003,174.872467 -41.429442999999999,174.86605800000001 -41.425002999999997,174.861084000000005 -41.419724000000002,174.861633000000012 -41.347496,174.863861000000014 -41.340279000000002,174.870789000000002 -41.327224999999999,174.87912 -41.315002,174.883881000000002 -41.309441,174.894440000000003 -41.290000999999997,174.89776599999999 -41.282501000000003,174.899993999999992 -41.275002,174.901916999999997 -41.258338999999999,174.901916999999997 -41.251114,174.898865 -41.234444000000003,174.89498900000001 -41.228050000000003,174.887482000000006 -41.224442000000003,174.827179 -41.218887000000002,174.818848000000003 -41.221938999999999,174.787475999999998 -41.244446000000003,174.778045999999989 -41.255836000000002,174.774414000000007 -41.262222,174.771087999999992 -41.278053,174.778594999999996 -41.281387000000002,174.796082000000013 -41.286949,174.818024000000008 -41.284728999999999,174.824127000000004 -41.289169,174.829407000000003 -41.294724000000002,174.833313000000004 -41.301108999999997,174.832184000000012 -41.309441,174.82995600000001 -41.316665999999998,174.826355000000007 -41.323334000000003,174.821625000000012 -41.328887999999999,174.815796000000006 -41.333610999999998,174.807189999999991 -41.336387999999999,174.744689999999991 -41.347496,174.700531000000012 -41.344444000000003,174.671906000000007 -41.338332999999999,174.654694000000006 -41.333061,174.648314999999997 -41.328612999999997,174.629669000000007 -41.315002,174.59191899999999 -41.27861,174.591644000000002 -41.271385000000002,174.594116000000014 -41.263893000000003,174.601074000000011 -41.250838999999999,174.608306999999996 -41.237777999999999,174.61300700000001 -41.232216,174.619110000000006 -41.23111,174.627746999999999 -41.233887000000003,174.637482000000006 -41.235557999999997,174.648590000000013 -41.234444000000003,174.666931000000005 -41.229720999999998,174.681365999999997 -41.221938999999999,174.694702000000007 -41.213614999999997,174.712738000000002 -41.199440000000003,174.718567000000007 -41.194716999999997,174.800812000000008 -41.100281000000003,174.844421000000011 -41.041671999999998,174.874390000000005 -41.018059,174.882721000000004 -41.015006999999997,174.892486999999988 -41.013061999999998,174.901093000000003 -41.010283999999999,174.908324999999991 -41.006393000000003,174.932189999999991 -40.987502999999997,174.94165000000001 -40.976387000000003,174.945251000000013 -40.969718999999998,174.947478999999987 -40.962218999999997,175.014983999999998 -40.84861,175.09857199999999 -40.755836000000002,175.112731999999994 -40.738892,175.120789000000002 -40.726944000000003,175.127746999999999 -40.713614999999997,175.164153999999996 -40.631943,175.169708000000014 -40.616942999999999,175.171906000000007 -40.609726000000002,175.187468999999993 -40.530830000000002,175.23800700000001 -40.329726999999998,175.23135400000001 -40.280830000000002,175.201629999999994 -40.181671,175.196349999999995 -40.166946000000003,175.178314 -40.134171000000002,175.15554800000001 -40.095832999999999,175.071625000000012 -40.003059,175.055542000000003 -39.987777999999999,175.022217000000012 -39.958053999999997,174.986358999999993 -39.93,174.974120999999997 -39.920836999999999,174.960784999999987 -39.912773,174.938873 -39.902222000000002,174.923034999999999 -39.895836000000003,174.836638999999991 -39.865004999999996,174.828307999999993 -39.862502999999997,174.790802000000014 -39.854720999999998,174.781096999999988 -39.853057999999997,174.751373 -39.865555,174.740509000000003 -39.866661,174.729674999999986 -39.865836999999999,174.57607999999999 -39.829169999999998,174.558013999999986 -39.824722,174.549408 -39.822226999999998,174.542205999999993 -39.818610999999997,174.523865 -39.805,174.421356000000003 -39.726944000000003,174.410521999999986 -39.716942000000003,174.376068000000004 -39.678612,174.353577 -39.639999000000003,174.348846000000009 -39.634444999999999,174.336638999999991 -39.625557,174.316070999999994 -39.613892,174.30886799999999 -39.610283000000003,174.217194000000006 -39.579726999999998,174.208862000000011 -39.577224999999999,174.040802000000014 -39.552779999999998,173.997741999999988 -39.551392,173.986908 -39.550552000000003,173.970245000000006 -39.545279999999998,173.963012999999989 -39.541671999999998,173.871062999999992 -39.483330000000002,173.851898000000006 -39.470551,173.839966000000004 -39.461387999999999,173.810790999999995 -39.4375,173.79525799999999 -39.421944000000003,173.786652000000004 -39.409996,173.775817999999987 -39.390839,173.769713999999993 -39.376944999999999,173.762206999999989 -39.354720999999998,173.754424999999998 -39.305,173.751923000000005 -39.288612,173.751647999999989 -39.269996999999996,173.781921000000011 -39.191383000000002,173.785247999999996 -39.184998,173.800536999999991 -39.169167000000002,173.82995600000001 -39.145836000000003,173.844421000000011 -39.138336000000002,173.868010999999996 -39.128883000000002,173.892761000000007 -39.120552000000004,174.011108000000007 -39.073334000000003,174.114685000000009 -39.024445,174.187744000000009 -38.988608999999997,174.209136999999998 -38.977218999999998,174.226623999999987 -38.972496,174.248016000000007 -38.970551,174.259978999999987 -38.970275999999998,174.281372000000005 -38.969994,174.293029999999987 -38.969994,174.313292999999987 -38.972496,174.351348999999999 -38.979438999999999,174.375244000000009 -38.979163999999997,174.384704999999997 -38.977218999999998,174.392761000000007 -38.974442000000003,174.456359999999989 -38.940277000000002,174.546082000000013 -38.871941,174.557738999999998 -38.860557999999997,174.568024000000008 -38.850281000000003,174.587738000000002 -38.828887999999999,174.594421000000011 -38.815834000000002,174.603302000000014 -38.786118000000002,174.608582000000013 -38.763061999999998,174.625518999999997 -38.677779999999998,174.642486999999988 -38.590836000000003,174.681091000000009 -38.379165999999998,174.724396000000013 -38.185828999999998,174.838561999999996 -38.157218999999998,174.848021999999986 -38.156944000000003,174.85635400000001 -38.154167,174.926636000000002 -38.116112,174.932465000000008 -38.111389000000003,174.940246999999999 -38.101112,174.898590000000013 -38.075004999999997,174.877166999999986 -38.064163,174.892486999999988 -37.976387000000003,174.893585000000002 -37.969994,174.868286000000012 -37.943610999999997,174.861084000000005 -37.939995000000003,174.85522499999999 -37.944716999999997,174.834686000000005 -37.963614999999997,174.830261000000007 -37.969161999999997,174.828033000000005 -37.976661999999997,174.828583000000009 -37.995002999999997,174.822754000000003 -37.999724999999998,174.814696999999995 -38.002502,174.804137999999995 -38.001944999999999,174.797211000000004 -37.998336999999999,174.791077 -37.993614,174.786376999999987 -37.988334999999999,174.783874999999995 -37.980826999999998,174.783600000000007 -37.971663999999997,174.788025000000005 -37.868332000000002,174.788879000000009 -37.860000999999997,174.791077 -37.852783000000002,174.795532000000009 -37.846947,174.819702000000007 -37.829169999999998,174.826629999999994 -37.825279000000002,174.841339000000005 -37.818610999999997,174.872741999999988 -37.806106999999997,174.883330999999998 -37.805,174.903045999999989 -37.807502999999997,174.945251000000013 -37.810555,174.967467999999997 -37.809165999999998,174.975525000000005 -37.806389000000003,174.974975999999998 -37.75,174.974670000000003 -37.740836999999999,174.966644000000002 -37.739998,174.951355000000007 -37.743057,174.94442699999999 -37.745002999999997,174.93081699999999 -37.752502,174.906921000000011 -37.774169999999998,174.870789000000002 -37.783057999999997,174.861633000000012 -37.785004,174.848297000000002 -37.769722000000002,174.828307999999993 -37.710830999999999,174.764160000000004 -37.527779000000002,174.744415000000004 -37.487502999999997,174.724975999999998 -37.447220000000002,174.717467999999997 -37.425002999999997,174.714690999999988 -37.408607000000003,174.714690999999988 -37.399445,174.719116000000014 -37.393616000000002,174.725799999999992 -37.389999000000003,174.744415000000004 -37.385834000000003,174.760528999999991 -37.380279999999999,174.767486999999988 -37.376389000000003,174.773041000000006 -37.371665999999998,174.831635000000006 -37.308052000000004,174.840789999999998 -37.296951,174.840515000000011 -37.291389000000002,174.82995600000001 -37.290557999999997,174.821899000000002 -37.291671999999998,174.812744000000009 -37.293616999999998,174.804687999999999 -37.296393999999999,174.797760000000011 -37.300277999999999,174.766083000000009 -37.321114,174.754700000000014 -37.330559,174.751373 -37.336945,174.744965000000008 -37.359169,174.740509000000003 -37.364722999999998,174.733582000000013 -37.368606999999997,174.724120999999997 -37.368889000000003,174.717194000000006 -37.365279999999998,174.711365 -37.360557999999997,174.701629999999994 -37.349724000000002,174.69442699999999 -37.336945,174.660187000000008 -37.273311999999997,174.645813000000004 -37.236389000000003,174.639709000000011 -37.224442000000003,174.599975999999998 -37.153885000000002,174.578307999999993 -37.115555,174.569976999999994 -37.103614999999998,174.555542000000003 -37.087502,174.551909999999992 -37.080832999999998,174.549712999999997 -37.073616,174.55304000000001 -37.067222999999998,174.558593999999999 -37.0625,174.568848000000003 -37.061385999999999,174.644135000000006 -37.061110999999997,174.661376999999987 -37.065551999999997,174.664977999999991 -37.071944999999999,174.666381999999999 -37.080283999999999,174.661925999999994 -37.085830999999999,174.650542999999999 -37.095275999999998,174.646087999999992 -37.100838000000003,174.648590000000013 -37.108055,174.703856999999999 -37.197777000000002,174.733856000000003 -37.196106,174.716644000000002 -37.154167,174.72357199999999 -37.150275999999998,174.87912 -37.088889999999999,174.887482000000006 -37.059165999999998,174.795532000000009 -37.023055999999997,174.804413000000011 -36.972220999999998,174.824982000000006 -36.960830999999999,174.829407000000003 -36.955002,174.83273299999999 -36.948608,174.828033000000005 -36.943053999999997,174.818848000000003 -36.941383000000002,174.770263999999997 -36.936661,174.696625000000012 -36.93972,174.686095999999992 -36.940834000000002,174.659697999999992 -36.947495000000004,174.653045999999989 -36.951393000000003,174.641662999999994 -36.960830999999999,174.622467 -36.982216,174.619110000000006 -36.988892,174.617187999999999 -36.996108999999997,174.600525000000005 -37.022224,174.524688999999995 -37.045555,174.515533000000005 -37.045555,174.508605999999986 -37.041946000000003,174.502472000000012 -37.037506,174.498016000000007 -37.031944000000003,174.490783999999991 -37.019165,174.484679999999997 -37.005561999999998,174.459228999999993 -36.944031000000003,174.451904000000013 -36.923889000000003,174.446930000000009 -36.909163999999997,174.443024000000008 -36.893616000000002,174.439147999999989 -36.868606999999997,174.436645999999996 -36.852226000000002,174.43386799999999 -36.835555999999997,174.427764999999994 -36.812775000000002,174.422760000000011 -36.798057999999997,174.416655999999989 -36.784171999999998,174.409697999999992 -36.771385000000002,174.406096999999988 -36.765006999999997,174.390533000000005 -36.740279999999998,174.344299000000007 -36.679336999999997,174.301085999999998 -36.62722,174.284973000000008 -36.612777999999999,174.267486999999988 -36.599167,174.236908 -36.568061999999998,174.208862000000011 -36.535277999999998,174.187744000000009 -36.496948000000003,174.17804000000001 -36.467498999999997,174.177764999999994 -36.458336000000003,174.178864000000004 -36.449997000000003,174.181091000000009 -36.442497000000003,174.184417999999994 -36.436110999999997,174.189972000000012 -36.431389000000003,174.196930000000009 -36.427779999999998,174.20495600000001 -36.428612,174.24383499999999 -36.440834000000002,174.251923000000005 -36.443610999999997,174.257751000000013 -36.448051,174.300262000000004 -36.515839,174.348846000000009 -36.601944000000003,174.367919999999998 -36.629165999999998,174.370728000000014 -36.6325,174.422484999999995 -36.667220999999998,174.430542000000003 -36.668059999999997,174.453033000000005 -36.651108,174.456359999999989 -36.644722000000002,174.465515000000011 -36.582779000000002,174.465515000000011 -36.532218999999998,174.442474000000004 -36.414718999999998,174.422211000000004 -36.366112,174.41885400000001 -36.370834000000002,174.391937000000013 -36.395004,174.384978999999987 -36.398887999999999,174.377166999999986 -36.401665,174.303864000000004 -36.395279000000002,174.296935999999988 -36.391669999999998,174.285247999999996 -36.3825,174.276916999999997 -36.370552000000004,174.26998900000001 -36.357779999999998,174.268585000000002 -36.349442000000003,174.268585000000002 -36.342224000000002,174.292205999999993 -36.316947999999996,174.299988000000013 -36.314163,174.308013999999986 -36.316947999999996,174.325531000000012 -36.330283999999999,174.334686000000005 -36.332222000000002,174.36883499999999 -36.331673000000002,174.376891999999998 -36.330832999999998,174.421248999999989 -36.310611999999999,174.50692699999999 -36.267220000000002,174.518311000000011 -36.258057,174.521636999999998 -36.251396,174.519135000000006 -36.245834000000002,174.505248999999992 -36.231383999999998,174.413299999999992 -36.263061999999998,174.378296000000006 -36.286667,174.364685000000009 -36.294167000000002,174.346619000000004 -36.298057999999997,174.336365 -36.298889000000003,174.305237000000005 -36.287506,174.365233999999987 -36.260002,174.442200000000014 -36.169724000000002,174.396087999999992 -36.144447,174.396362000000011 -36.151938999999999,174.394135000000006 -36.159163999999997,174.373290999999995 -36.206389999999999,174.369965000000008 -36.213057999999997,174.358856000000003 -36.222220999999998,174.345245000000006 -36.229720999999998,174.337463000000014 -36.232773000000002,174.33273299999999 -36.229163999999997,174.307738999999998 -36.176949,174.282745000000006 -36.121108999999997,174.274993999999992 -36.118332000000002,174.239409999999992 -36.111389000000003,174.229126000000008 -36.112502999999997,174.195251000000013 -36.131110999999997,174.188568000000004 -36.144165,174.185790999999995 -36.171944000000003,174.191345000000013 -36.176392,174.19830300000001 -36.18,174.217743000000013 -36.182502999999997,174.226898000000006 -36.182502999999997,174.236084000000005 -36.180557,174.244110000000006 -36.183059999999998,174.287749999999988 -36.210281000000002,174.312468999999993 -36.236663999999998,174.314696999999995 -36.243889000000003,174.267212 -36.270279000000002,174.259430000000009 -36.273055999999997,174.251373 -36.272499000000003,174.065796000000006 -36.168334999999999,173.999114999999989 -36.121108999999997,173.994415000000004 -36.115836999999999,173.99105800000001 -36.109444000000003,173.931091000000009 -35.981940999999999,173.938568000000004 -35.934998,173.947478999999987 -35.923889000000003,173.948577999999998 -35.915550000000003,173.946075000000008 -35.908051,173.913879000000009 -35.86972,173.908324999999991 -35.874442999999999,173.903870000000012 -35.879997000000003,173.904967999999997 -35.888336000000002,173.921356000000003 -36.003059,173.980804000000006 -36.121383999999999,173.987731999999994 -36.134171000000002,173.992461999999989 -36.139724999999999,174.124390000000005 -36.263618,174.176085999999998 -36.276947,174.180542000000003 -36.282501000000003,174.198853000000014 -36.343887000000002,174.199982000000006 -36.352226000000002,174.198028999999991 -36.368606999999997,174.194702000000007 -36.375275000000002,174.189147999999989 -36.379722999999998,174.115233999999987 -36.40361,174.089966000000004 -36.411385000000003,174.080811000000011 -36.409438999999999,174.06942699999999 -36.400275999999998,174.065796000000006 -36.393889999999999,174.057465000000008 -36.374718,174.049133000000012 -36.353614999999998,174.044433999999995 -36.338889999999999,174.039703000000003 -36.323334000000003,174.031096999999988 -36.293059999999997,174.020537999999988 -36.273887999999999,173.82607999999999 -36.032501000000003,173.737457000000006 -35.933608999999997,173.727172999999993 -35.923614999999998,173.590515000000011 -35.778053,173.398865 -35.573891000000003,173.395537999999988 -35.567504999999997,173.398865 -35.553612,173.446625000000012 -35.440277000000002,173.465789999999998 -35.429169000000002,173.501923000000005 -35.419724000000002,173.506378000000012 -35.425277999999999,173.540253000000007 -35.430832000000002,173.629943999999995 -35.356667000000002,173.65554800000001 -35.322502,173.65554800000001 -35.313332000000003,173.564147999999989 -35.278053,173.556091000000009 -35.280830000000002,173.551636000000002 -35.286391999999999,173.549712999999997 -35.302779999999998,173.549712999999997 -35.321114,173.551909999999992 -35.328612999999997,173.566924999999998 -35.344161999999997,173.568024000000008 -35.361671,173.566924999999998 -35.36972,173.559143000000006 -35.372771999999998,173.439696999999995 -35.376106,173.416077 -35.384444999999999,173.410247999999996 -35.388893000000003,173.391356999999999 -35.423057999999997,173.39498900000001 -35.449722,173.396087999999992 -35.458053999999997,173.392761000000007 -35.482773000000002,173.386382999999995 -35.523330999999999,173.380524000000008 -35.528053,173.37384 -35.524169999999998,173.306915000000004 -35.449165,173.237731999999994 -35.370277000000002,173.154144000000002 -35.276665,173.103302000000014 -35.226104999999997,173.09191899999999 -35.216942000000003,173.087463000000014 -35.211387999999999,173.09191899999999 -35.1875,173.098846000000009 -35.183608999999997,173.119110000000006 -35.185555,173.12802099999999 -35.1875,173.134704999999997 -35.191108999999997,173.14498900000001 -35.191940000000002,173.152771 -35.189163,173.163879000000009 -35.179169000000002,173.168578999999994 -35.173614999999998,173.18081699999999 -35.156104999999997,173.187468999999993 -35.143332999999998,173.191924999999998 -35.128334000000002,173.196349999999995 -35.104446000000003,173.197478999999987 -35.09639,173.198577999999998 -35.078887999999999,173.198577999999998 -35.051108999999997,173.193848000000003 -35.027222000000002,173.189423000000005 -35.012779000000002,173.179413000000011 -34.993332000000002,173.175812000000008 -34.986946000000003,173.159149000000014 -34.958336000000003,173.151093000000003 -34.946663,173.137755999999996 -34.93,172.947204999999997 -34.716942000000003,172.828033000000005 -34.584442000000003,172.812468999999993 -34.568893000000003,172.722473000000008 -34.495277000000002,172.739136000000002 -34.435555,172.900817999999987 -34.414718999999998,172.911925999999994 -34.414718999999998,173.020813000000004 -34.422226000000002,173.038879000000009 -34.436942999999999,173.043304000000006 -34.517775999999998,173.039977999999991 -34.522224,173.033324999999991 -34.525832999999999,173.024414000000007 -34.527779000000002,173.016662999999994 -34.52861,173.007476999999994 -34.526947,172.997467 -34.498336999999999,172.984130999999991 -34.472771000000002,172.961914000000007 -34.465279000000002,172.955230999999998 -34.468887000000002,172.908324999999991 -34.544167000000002,172.912749999999988 -34.549728000000002,172.923858999999993 -34.558891000000003,172.936095999999992 -34.567222999999998,172.973021999999986 -34.581116000000002,173.053314 -34.665550000000003,173.057738999999998 -34.680283000000003,173.110503999999992 -34.791389000000002,173.120789000000002 -34.810555,173.128570999999994 -34.822502,173.133026 -34.828055999999997,173.13857999999999 -34.832504,173.151916999999997 -34.839995999999999,173.213593000000003 -34.871941,173.242737000000005 -34.884726999999998,173.273314999999997 -34.940834000000002,173.268859999999989 -34.946387999999999,173.262206999999989 -34.959167,173.259978999999987 -34.966659999999997,173.258881000000002 -34.974716,173.259978999999987 -34.983055,173.264709000000011 -35.014449999999997,173.269135000000006 -35.019722000000002,173.317474000000004 -35.018889999999999,173.328583000000009 -35.009444999999999,173.358856000000003 -34.98111,173.36300700000001 -34.975555,173.366364000000004 -34.968887000000002,173.373259999999988 -34.936774999999997,173.371246000000014 -34.927444,173.400817999999987 -34.863334999999999,173.426085999999998 -34.82,173.450806 -34.807777000000002,173.500274999999988 -34.864722999999998,173.499114999999989 -34.871108999999997,173.492461999999989 -34.874718,173.452453999999989 -34.887779000000002,173.443297999999999 -34.889724999999999,173.433319000000012 -34.890555999999997,173.413025000000005 -34.888893000000003,173.405243000000013 -34.892502,173.399719000000005 -34.897224,173.399719000000005 -34.906387000000002,173.402190999999988 -34.913887000000003,173.411590999999987 -34.931778,173.419128 -34.945830999999998,173.426909999999992 -34.957779000000002,173.431641000000013 -34.963332999999999,173.44165000000001 -34.973328000000002,173.454131999999987 -34.981667000000002,173.467467999999997 -34.988892,173.475525000000005 -34.991669000000002,173.493286000000012 -34.995277000000002,173.541655999999989 -34.988608999999997,173.561645999999996 -34.958893000000003,173.562468999999993 -34.950836000000002,173.566924999999998 -34.936110999999997,173.572478999999987 -34.931389000000003,173.579131999999987 -34.927779999999998,173.589416999999997 -34.928612,173.83914200000001 -35.004173000000002,174.101074000000011 -35.121108999999997,174.098297000000002 -35.161667,174.091644000000002 -35.158051,174.056641000000013 -35.155555999999997,174.021911999999986 -35.164161999999997,174.008026 -35.207504,174.008026 -35.215004,174.011382999999995 -35.221381999999998,174.018311000000011 -35.224997999999999,174.093841999999995 -35.225273,174.100525000000005 -35.228881999999999,174.143585000000002 -35.328612999999997,174.208008000000007 -35.323334000000003,174.218018 -35.322226999999998,174.247741999999988 -35.27861,174.319976999999994 -35.232773000000002,174.383881000000002 -35.337775999999998,174.461638999999991 -35.445273999999998,174.491913000000011 -35.485275,174.575806 -35.601944000000003,174.577179 -35.610000999999997,174.577147999999994 -35.618088,174.569976999999994 -35.648055999999997,174.563292999999987 -35.651665,174.530272999999994 -35.649445,174.520263999999997 -35.648612999999997,174.513306 -35.645004,174.505248999999992 -35.642502,174.479126000000008 -35.641945,174.47357199999999 -35.646393000000003,174.474975999999998 -35.654716,174.518311000000011 -35.724167,174.523041000000006 -35.729438999999999,174.554137999999995 -35.750281999999999,174.561919999999986 -35.753059,174.583862000000011 -35.764724999999999,174.60244800000001 -35.844444000000003,174.596924 -35.849167,174.58914200000001 -35.851944000000003,174.577758999999986 -35.852226000000002,174.560790999999995 -35.847777999999998,174.554961999999989 -35.843330000000002,174.538574000000011 -35.819450000000003,174.523314999999997 -35.796669,174.519713999999993 -35.790283000000002,174.49105800000001 -35.769447,174.361908 -35.723328000000002,174.357451999999995 -35.72361,174.34857199999999 -35.734726000000002,174.346924 -35.833061,174.350525000000005 -35.839438999999999,174.35522499999999 -35.845001000000003,174.360779000000008 -35.849442000000003,174.381348000000003 -35.851112,174.384704999999997 -35.844718999999998,174.385528999999991 -35.828887999999999,174.391083000000009 -35.824173000000002,174.398865 -35.821387999999999,174.437468999999993 -35.822777000000002,174.476074000000011 -35.824173000000002,174.486358999999993 -35.824722,174.519713999999993 -35.844718999999998,174.525542999999999 -35.849167,174.524414000000007 -35.855559999999997,174.521362000000011 -35.862220999999998,174.501373 -35.889999000000003,174.496917999999994 -35.895553999999997,174.487182999999987 -35.915000999999997,174.495513999999986 -35.988608999999997,174.498016000000007 -35.994163999999998,174.514160000000004 -36.008614,174.56942699999999 -36.037224000000002,174.578583000000009 -36.038894999999997,174.587738000000002 -36.038894999999997,174.596619000000004 -36.036667,174.606902999999988 -36.037506,174.612731999999994 -36.042228999999999,174.622192000000013 -36.053055,174.62912 -36.065834000000002,174.629394999999988 -36.075004999999997,174.616364000000004 -36.100861000000002)),((171.185241999999988 -44.938332000000003,171.182129000000003 -44.94173,171.175017999999994 -44.949902000000002,171.167923000000002 -44.959850000000003,171.165436 -44.966599000000002,171.164703000000003 -44.970275999999998,171.163299999999992 -44.978332999999999,171.149719000000005 -44.996665999999998,171.07995600000001 -45.067222999999998,171.02664200000001 -45.103332999999999,170.975525000000005 -45.151108,170.966063999999989 -45.163055,170.961914000000007 -45.169167000000002,170.921630999999991 -45.243057,170.873566000000011 -45.358055,170.873290999999995 -45.367218,170.876891999999998 -45.373885999999999,170.871338000000009 -45.424171,170.859955000000014 -45.487502999999997,170.855804000000006 -45.493889000000003,170.750274999999988 -45.61972,170.674682999999987 -45.745002999999997,170.616913000000011 -45.839438999999999,170.55886799999999 -45.881667999999998,170.554413000000011 -45.888053999999997,170.555542000000003 -45.896110999999998,170.591063999999989 -45.894165,170.600525000000005 -45.891669999999998,170.608582000000013 -45.888053999999997,170.658600000000007 -45.858612,170.718018 -45.817504999999997,170.724670000000003 -45.813057,170.773314999999997 -45.782775999999998,170.781096999999988 -45.786391999999999,170.790802000000014 -45.806946000000003,170.790802000000014 -45.84639,170.788879000000009 -45.863892,170.783051 -45.878334000000002,170.776366999999993 -45.882773999999998,170.699982000000006 -45.911667,170.664429000000013 -45.908332999999999,170.57330300000001 -45.916663999999997,170.550536999999991 -45.919167000000002,170.484406000000007 -45.926949,170.452453999999989 -45.931946000000003,170.424408 -45.939438000000003,170.382721000000004 -45.956108,170.342467999999997 -45.97361,170.315246999999999 -45.991385999999999,170.309692000000013 -45.996948000000003,170.294433999999995 -46.013893000000003,170.281646999999992 -46.029442000000003,170.263610999999997 -46.051940999999999,170.256378000000012 -46.065551999999997,170.253051999999997 -46.081947,170.252472000000012 -46.09111,170.254424999999998 -46.107779999999998,170.252777000000009 -46.115836999999999,170.240783999999991 -46.146949999999997,170.237731999999994 -46.154167,170.226623999999987 -46.165000999999997,170.214416999999997 -46.174720999999998,170.193848000000003 -46.188048999999999,170.169433999999995 -46.198608,170.067748999999992 -46.246665999999998,169.911925999999994 -46.340279000000002,169.863585999999998 -46.371383999999999,169.858001999999999 -46.376663,169.849396000000013 -46.389442000000003,169.848021999999986 -46.416946000000003,169.849975999999998 -46.433326999999998,169.852172999999993 -46.440834000000002,169.853850999999992 -46.457504,169.850799999999992 -46.464722000000002,169.845245000000006 -46.469994,169.701904000000013 -46.558052000000004,169.631348000000003 -46.581947,169.458008000000007 -46.623328999999998,169.266388000000006 -46.656387000000002,169.133026 -46.670836999999999,169.107727000000011 -46.669167000000002,169.097197999999992 -46.666946000000003,169.084411999999986 -46.657501000000003,169.067200000000014 -46.635002,169.061919999999986 -46.675002999999997,169.053864000000004 -46.678612,169.008026 -46.680832000000002,168.883330999999998 -46.667777999999998,168.878296000000006 -46.661942000000003,168.861908 -46.628334000000002,168.862457000000006 -46.619446000000003,168.864409999999992 -46.611114999999998,168.864959999999996 -46.603889000000002,168.844970999999987 -46.563614,168.835784999999987 -46.560555,168.823853000000014 -46.561110999999997,168.733306999999996 -46.577499000000003,168.640533000000005 -46.603889000000002,168.633605999999986 -46.606392,168.614685000000009 -46.611114999999998,168.593018 -46.614165999999997,168.568848000000003 -46.615004999999996,168.516937000000013 -46.614165999999997,168.492737000000005 -46.613334999999999,168.442138999999997 -46.601500999999999,168.436630000000008 -46.599666999999997,168.446625000000012 -46.584003000000003,168.442200000000014 -46.575004999999997,168.454407000000003 -46.574447999999997,168.490509000000003 -46.573059,168.502472000000012 -46.574173000000002,168.506103999999993 -46.578887999999999,168.499114999999989 -46.583328000000002,168.505553999999989 -46.588051,168.551636000000002 -46.594444000000003,168.561371000000008 -46.591942000000003,168.566924999999998 -46.586661999999997,168.563599000000011 -46.580002,168.550812000000008 -46.570557,168.541655999999989 -46.567504999999997,168.391356999999999 -46.540000999999997,168.361908 -46.544449,168.353577 -46.547783000000003,168.351623999999987 -46.556106999999997,168.352172999999993 -46.564444999999999,168.362731999999994 -46.583885000000002,168.348236000000014 -46.582165000000003,168.352904999999993 -46.584499,168.359267999999986 -46.585830999999999,168.365082 -46.592666999999999,168.367248999999987 -46.596668,168.367599000000013 -46.601497999999999,168.364928999999989 -46.605331,168.35775799999999 -46.604500000000002,168.351409999999987 -46.603164999999997,168.275269000000009 -46.557777000000002,168.269135000000006 -46.535561,168.268311000000011 -46.529167,168.27664200000001 -46.525832999999999,168.286102 -46.523330999999999,168.307738999999998 -46.520553999999997,168.318297999999999 -46.520836000000003,168.318848000000003 -46.529167,168.321075000000008 -46.536667,168.328856999999999 -46.540557999999997,168.339416999999997 -46.539169,168.386658000000011 -46.497779999999999,168.392486999999988 -46.492226000000002,168.395537999999988 -46.485000999999997,168.396087999999992 -46.477775999999999,168.394135000000006 -46.470275999999998,168.37384 -46.421944000000003,168.36883499999999 -46.416106999999997,168.359679999999997 -46.415000999999997,168.350249999999988 -46.417503000000004,168.250274999999988 -46.400832999999999,168.211090000000013 -46.355277999999998,168.206085000000002 -46.351394999999997,168.194702000000007 -46.345551,168.185516000000007 -46.342498999999997,168.174988000000013 -46.340279000000002,168.116364000000004 -46.343612999999998,168.063873 -46.351669,167.955535999999995 -46.371383999999999,167.893035999999995 -46.387222,167.850799999999992 -46.399445,167.832184000000012 -46.398612999999997,167.824401999999992 -46.394447,167.753875999999991 -46.333885000000002,167.776916999999997 -46.312775000000002,167.781372000000005 -46.306389000000003,167.783600000000007 -46.298340000000003,167.781372000000005 -46.290840000000003,167.778045999999989 -46.284171999999998,167.701904000000013 -46.209442000000003,167.596924 -46.166389000000002,167.556641000000013 -46.156387000000002,167.546356000000003 -46.154167,167.534424 -46.152779000000002,167.483032000000009 -46.149726999999999,167.471069 -46.149994,167.460236000000009 -46.151389999999999,167.451904000000013 -46.154716,167.446075000000008 -46.159996,167.415526999999997 -46.204720000000002,167.356628 -46.254447999999996,167.280272999999994 -46.273055999999997,167.261108000000007 -46.267775999999998,167.238555999999988 -46.263893000000003,167.086638999999991 -46.240555,167.001373 -46.229163999999997,166.966063999999989 -46.224716,166.949982000000006 -46.223885000000003,166.915253000000007 -46.226104999999997,166.883026 -46.229996,166.836365 -46.232498,166.823028999999991 -46.231667000000002,166.768035999999995 -46.22361,166.726348999999999 -46.214165,166.717467999999997 -46.210830999999999,166.705230999999998 -46.201110999999997,166.670806999999996 -46.161667,166.67025799999999 -46.15361,166.684417999999994 -46.145004,166.693848000000003 -46.142775999999998,166.709411999999986 -46.135277000000002,166.738861000000014 -46.119163999999998,166.761230000000012 -46.093612999999998,166.784911999999991 -46.064945000000002,166.804748999999987 -46.033279,166.82995600000001 -46.003891000000003,166.854674999999986 -45.994163999999998,166.886932000000002 -45.990279999999998,166.943297999999999 -45.956108,166.949127000000004 -45.950836000000002,166.946930000000009 -45.945273999999998,166.939147999999989 -45.944716999999997,166.929687999999999 -45.947220000000002,166.836365 -45.981383999999998,166.828033000000005 -45.984444000000003,166.791350999999992 -46.005004999999997,166.785797000000002 -46.010283999999999,166.781096999999988 -46.016396,166.759308000000004 -46.035553,166.762969999999996 -46.038387,166.764969000000008 -46.042392999999997,166.763656999999995 -46.047221999999998,166.760162000000008 -46.050392000000002,166.740982000000002 -46.066059000000003,166.737793000000011 -46.066558999999998,166.670532000000009 -46.087218999999997,166.615783999999991 -46.090836000000003,166.613585999999998 -46.086387999999999,166.617461999999989 -46.059722999999998,166.621062999999992 -46.052498,166.640807999999993 -46.015006999999997,166.661652000000004 -45.991942999999999,166.625792999999987 -45.967216,166.492461999999989 -46.013061999999998,166.484406000000007 -46.014449999999997,166.474975999999998 -46.002785000000003,166.467194000000006 -45.990555,166.465239999999994 -45.983055,166.464690999999988 -45.839438999999999,166.468841999999995 -45.823059,166.472473000000008 -45.815834000000002,166.476898000000006 -45.809722999999998,166.537475999999998 -45.798889000000003,166.613861000000014 -45.801108999999997,166.652190999999988 -45.800277999999999,166.699982000000006 -45.798889000000003,166.881348000000003 -45.779998999999997,166.890807999999993 -45.777779000000002,166.974120999999997 -45.735000999999997,166.987182999999987 -45.709724,166.923034999999999 -45.705832999999998,166.912475999999998 -45.705275999999998,166.887482000000006 -45.705002,166.854126000000008 -45.707779000000002,166.825806 -45.714722000000002,166.809417999999994 -45.721381999999998,166.787475999999998 -45.689995000000003,166.775817999999987 -45.662773,166.81153900000001 -45.617942999999997,166.811217999999997 -45.613109999999999,166.812531000000007 -45.608111999999998,166.816710999999998 -45.605606000000002,166.869689999999991 -45.588779000000002,166.881026999999989 -45.586112999999997,166.88736 -45.585278000000002,166.895203000000009 -45.585608999999998,166.901366999999993 -45.587108999999998,166.912871999999993 -45.590946000000002,166.980255 -45.578612999999997,166.991913000000011 -45.580002,167.0 -45.576949999999997,167.005829000000006 -45.571671000000002,167.032470999999987 -45.527779000000002,167.041350999999992 -45.501396,166.989685000000009 -45.519165,166.891693000000004 -45.544724000000002,166.796875 -45.569389,166.791199000000006 -45.570720999999999,166.784836000000013 -45.571556,166.777023000000014 -45.571219999999997,166.710509999999999 -45.579445,166.704407000000003 -45.574447999999997,166.697204999999997 -45.554718,166.699127000000004 -45.546669,166.757476999999994 -45.425277999999999,166.801361000000014 -45.353614999999998,166.821625000000012 -45.320557,166.86883499999999 -45.279724000000002,166.880797999999999 -45.279167,167.008330999999998 -45.341667,167.038299999999992 -45.357779999999998,167.146941999999996 -45.427222999999998,167.16885400000001 -45.472496,167.205230999999998 -45.477775999999999,167.211914000000007 -45.475273,167.21414200000001 -45.467216,167.209411999999986 -45.461387999999999,167.173584000000005 -45.422775,167.158019999999993 -45.406661999999997,167.134978999999987 -45.386116,167.12912 -45.381385999999999,167.115509000000003 -45.372222999999998,167.097747999999996 -45.366112,167.087463000000014 -45.363616999999998,167.061645999999996 -45.345001000000003,167.051085999999998 -45.333328000000002,167.081421000000006 -45.325333,167.08407600000001 -45.321666999999998,167.092407000000009 -45.316498000000003,167.097243999999989 -45.314498999999998,167.114227 -45.310333,167.163574000000011 -45.302833999999997,167.169922000000014 -45.302998000000002,167.173584000000005 -45.305999999999997,167.176422000000002 -45.309330000000003,167.17756700000001 -45.313834999999997,167.212738000000002 -45.313332000000003,167.218841999999995 -45.318336000000002,167.232178000000005 -45.327224999999999,167.239685000000009 -45.331116000000002,167.248566000000011 -45.334167,167.260254000000003 -45.335830999999999,167.270813000000004 -45.334442000000003,167.301636000000002 -45.329445,167.309692000000013 -45.326110999999997,167.307738999999998 -45.318610999999997,167.300262000000004 -45.314444999999999,167.19464099999999 -45.271445999999997,167.138290000000012 -45.268943999999998,167.099471999999992 -45.272114000000002,167.094146999999992 -45.271278000000002,167.08964499999999 -45.268776000000003,167.002196999999995 -45.201110999999997,166.996917999999994 -45.145836000000003,167.146362000000011 -45.001671000000002,167.198577999999998 -44.956108,167.204407000000003 -44.951110999999997,167.228302000000014 -44.930832000000002,167.24105800000001 -44.921387000000003,167.260528999999991 -44.907501000000003,167.267486999999988 -44.903053,167.312744000000009 -44.875,167.320800999999989 -44.871383999999999,167.393462999999997 -44.862999000000002,167.398987000000005 -44.861496000000002,167.404312000000004 -44.863498999999997,167.421798999999993 -44.894168999999998,167.422974000000011 -44.898665999999999,167.420638999999994 -44.908496999999997,167.417968999999999 -44.912166999999997,167.440796000000006 -44.928612,167.439972000000012 -44.9375,167.441924999999998 -44.945,167.459686000000005 -44.99472,167.497741999999988 -45.003891000000003,167.507202000000007 -45.001396,167.508224000000013 -45.0,167.511658000000011 -44.995277000000002,167.511108000000007 -44.986946000000003,167.47908000000001 -44.903446000000002,167.465912000000003 -44.876441999999997,167.462752999999992 -44.867947,167.461578000000003 -44.863444999999999,167.460097999999988 -44.853946999999998,167.459411999999986 -44.843944999999998,167.459914999999995 -44.838444000000003,167.448577999999998 -44.795279999999998,167.453033000000005 -44.788894999999997,167.458587999999992 -44.783614999999998,167.59970100000001 -44.683883999999999,167.743010999999996 -44.611671,167.838866999999993 -44.498610999999997,167.850249999999988 -44.488052000000003,167.949982000000006 -44.40361,167.963593000000003 -44.395004,168.034973000000008 -44.353614999999998,168.12802099999999 -44.316947999999996,168.141662999999994 -44.308052000000004,168.144713999999993 -44.300834999999999,168.144135000000006 -44.292503000000004,168.124099999999999 -44.251404,168.143311000000011 -44.253059,168.153594999999996 -44.251396,168.169708000000014 -44.24472,168.288299999999992 -44.172775,168.29385400000001 -44.167503000000004,168.336638999999991 -44.123885999999999,168.339966000000004 -44.116661,168.337738000000002 -44.109169,168.334411999999986 -44.102783000000002,168.336365 -44.094444000000003,168.369689999999991 -44.043334999999999,168.374968999999993 -44.037781000000003,168.383026 -44.034447,168.402771 -44.029724000000002,168.672211000000004 -43.987777999999999,168.676909999999992 -43.993614,168.683043999999995 -43.998336999999999,168.690246999999999 -44.002228000000002,168.715239999999994 -44.012222,168.723021999999986 -44.012504999999997,168.753875999999991 -44.010002,168.764160000000004 -44.008614,168.824401999999992 -43.988334999999999,168.858582000000013 -43.976661999999997,168.866364000000004 -43.973328000000002,168.879669000000007 -43.964447,168.885254000000003 -43.959167,168.961914000000007 -43.90361,169.080765000000014 -43.848472999999998,169.142212 -43.794167000000002,169.224396000000013 -43.743332000000002,169.271636999999998 -43.722496,169.387482000000006 -43.679169000000002,169.491318000000007 -43.643467,169.539153999999996 -43.633614,169.62661700000001 -43.613892,169.64498900000001 -43.608893999999999,169.652771 -43.605559999999997,169.660521999999986 -43.601944000000003,169.721619000000004 -43.573334000000003,169.728302000000014 -43.568893000000003,169.739136000000002 -43.558052000000004,169.767486999999988 -43.522773999999998,169.790526999999997 -43.496665999999998,169.871062999999992 -43.406661999999997,169.884154999999993 -43.397781000000002,169.961638999999991 -43.371941,170.021911999999986 -43.352500999999997,170.028594999999996 -43.347777999999998,170.033874999999995 -43.342498999999997,170.038025000000005 -43.336112999999997,170.049408 -43.306946000000003,170.111358999999993 -43.254173000000002,170.288299999999992 -43.107779999999998,170.418029999999987 -43.052498,170.523041000000006 -43.010559,170.531921000000011 -43.008057,170.583037999999988 -42.990555,170.674347000000012 -42.958739999999999,170.704407000000003 -42.945830999999998,170.750549000000007 -42.924720999999998,170.781096999999988 -42.910553,170.794128 -42.901389999999999,171.065796000000006 -42.648055999999997,171.108306999999996 -42.608055,171.149719000000005 -42.563614,171.153594999999996 -42.55722,171.196075000000008 -42.476661999999997,171.225799999999992 -42.433608999999997,171.230255 -42.40889,171.235779000000008 -42.394165,171.247467 -42.375,171.260254000000003 -42.366112,171.270537999999988 -42.355003000000004,171.297760000000011 -42.310279999999999,171.304413000000011 -42.296669,171.309692000000013 -42.281944000000003,171.31665000000001 -42.249724999999998,171.321075000000008 -42.224716,171.322754000000003 -42.207222000000002,171.324401999999992 -42.18972,171.326355000000007 -42.172226000000002,171.329131999999987 -42.155830000000002,171.343841999999995 -42.110832000000002,171.361084000000005 -42.067779999999999,171.461638999999991 -41.859726000000002,171.51080300000001 -41.764449999999997,171.533051 -41.766396,171.557738999999998 -41.766663,171.569121999999993 -41.766112999999997,171.650817999999987 -41.761391000000003,171.663025000000005 -41.757781999999999,171.685790999999995 -41.746948000000003,171.790526999999997 -41.696387999999999,171.85522499999999 -41.652779000000002,171.886658000000011 -41.629997000000003,171.942200000000014 -41.550277999999999,172.02276599999999 -41.443053999999997,172.053864000000004 -41.417503000000004,172.064972000000012 -41.40361,172.122192000000013 -41.277779000000002,172.111633000000012 -41.236114999999998,172.10522499999999 -41.153053,172.106078999999994 -40.911385000000003,172.10635400000001 -40.893059,172.108856000000003 -40.885559,172.113861000000014 -40.879997000000003,172.186645999999996 -40.813332000000003,172.218567000000007 -40.785834999999999,172.22470100000001 -40.781109,172.255248999999992 -40.776947,172.263884999999988 -40.774169999999998,172.271362000000011 -40.770553999999997,172.299408 -40.755004999999997,172.348297000000002 -40.727493000000003,172.382721000000004 -40.698334000000003,172.426909999999992 -40.657775999999998,172.478302000000014 -40.613892,172.513320999999991 -40.598441999999999,172.517639000000003 -40.596783000000002,172.523482999999999 -40.597946,172.522644000000014 -40.602943000000003,172.521132999999992 -40.607277000000003,172.520813000000004 -40.625,172.519440000000003 -40.631385999999999,172.525542999999999 -40.6325,172.534149000000014 -40.631667999999998,172.571899000000002 -40.617775000000002,172.596343999999988 -40.601394999999997,172.62802099999999 -40.573891000000003,172.631621999999993 -40.567222999999998,172.631621999999993 -40.559998,172.608582000000013 -40.556946000000003,172.601348999999999 -40.558891000000003,172.597014999999999 -40.553333000000002,172.589690999999988 -40.558838000000002,172.583862000000011 -40.560004999999997,172.581024000000014 -40.556671,172.581848000000008 -40.551665999999997,172.589843999999999 -40.541172000000003,172.627166999999986 -40.511947999999997,172.633330999999998 -40.509171000000002,172.661376999999987 -40.502785000000003,172.712188999999995 -40.495552000000004,172.817748999999992 -40.504173000000002,172.861358999999993 -40.507781999999999,172.981628 -40.527222000000002,172.991332999999997 -40.529167,172.989959999999996 -40.53389,172.978026999999997 -40.53389,172.945251000000013 -40.530830000000002,172.895263999999997 -40.524445,172.797211000000004 -40.516112999999997,172.739959999999996 -40.516945,172.731628 -40.519722000000002,172.656921000000011 -40.653328000000002,172.701355000000007 -40.748336999999999,172.855804000000006 -40.853057999999997,172.865509000000003 -40.853057999999997,172.875244000000009 -40.851112,172.907195999999999 -40.828887999999999,172.930266999999986 -40.802222999999998,172.935241999999988 -40.796669,172.976623999999987 -40.781944000000003,172.985229000000004 -40.781112999999998,173.002196999999995 -40.786667,173.008330999999998 -40.791114999999998,173.013306 -40.796669,173.020537999999988 -40.809722999999998,173.051085999999998 -40.869446000000003,173.059692000000013 -40.962775999999998,173.059692000000013 -40.971938999999999,173.056091000000009 -40.978606999999997,173.031646999999992 -41.027495999999999,173.075806 -41.291114999999998,173.079680999999994 -41.297500999999997,173.085784999999987 -41.302222999999998,173.105529999999987 -41.313332000000003,173.168029999999987 -41.316108999999997,173.188873 -41.313332000000003,173.198853000000014 -41.311385999999999,173.207184000000012 -41.308608999999997,173.272217000000012 -41.274445,173.278320000000008 -41.269722000000002,173.32607999999999 -41.222496,173.340515000000011 -41.205832999999998,173.351623999999987 -41.195549,173.377166999999986 -41.178055,173.426085999999998 -41.150275999999998,173.598021999999986 -41.053612,173.606628 -41.052498,173.639709000000011 -41.073616,173.672760000000011 -41.070557,173.720519999999993 -41.060279999999999,173.727753000000007 -41.056389000000003,173.739959999999996 -41.047226000000002,173.744689999999991 -41.032501000000003,173.743286000000012 -41.024169999999998,173.738281 -41.018608,173.72744800000001 -41.019447,173.718841999999995 -41.022499000000003,173.696930000000009 -41.033614999999998,173.690796000000006 -41.038338000000003,173.682189999999991 -41.041114999999998,173.676085999999998 -41.036391999999999,173.673584000000005 -41.029167,173.674682999999987 -41.020836000000003,173.678314 -41.014449999999997,173.696625000000012 -41.000281999999999,173.751373 -40.976944000000003,173.800262000000004 -40.969161999999997,173.913299999999992 -40.931671,173.984679999999997 -40.896949999999997,173.994415000000004 -40.896667,174.02276599999999 -40.913055,174.027771 -40.91861,174.030272999999994 -40.925834999999999,174.03054800000001 -40.935271999999998,174.02941899999999 -40.943610999999997,174.022217000000012 -40.947220000000002,173.929961999999989 -40.992226000000002,173.832184000000012 -40.995002999999997,173.821075000000008 -40.994163999999998,173.782195999999999 -41.009171000000002,173.778594999999996 -41.015555999999997,173.769713999999993 -41.09861,173.778594999999996 -41.114449,173.794433999999995 -41.109444000000003,173.822204999999997 -41.080832999999998,173.821899000000002 -41.062218,173.836638999999991 -41.055,173.846343999999988 -41.053055,173.93081699999999 -41.049446000000003,173.946625000000012 -41.055832000000002,173.953033000000005 -41.060555,173.917755 -41.087502,173.887482000000006 -41.103332999999999,173.848846000000009 -41.144165,173.820526 -41.245834000000002,173.763306 -41.267502,173.76080300000001 -41.273055999999997,173.775817999999987 -41.289726000000002,173.788025000000005 -41.290557999999997,173.806365999999997 -41.289444000000003,174.03720100000001 -41.218330000000002,174.09970100000001 -41.198334000000003,174.128845000000013 -41.187218,174.133605999999986 -41.181671,174.133605999999986 -41.176108999999997,174.126068000000004 -41.174171,174.008605999999986 -41.175277999999999,174.001099000000011 -41.178885999999999,174.001373 -41.186385999999999,174.000274999999988 -41.194716999999997,173.993010999999996 -41.198334000000003,173.981902999999988 -41.199440000000003,173.932738999999998 -41.199997000000003,173.908324999999991 -41.199997000000003,173.899719000000005 -41.197495000000004,173.893585000000002 -41.192771999999998,173.887206999999989 -41.169724000000002,173.88580300000001 -41.161667,173.888031000000012 -41.154167,173.89776599999999 -41.133614,173.902466000000004 -41.128334000000002,174.032745000000006 -40.999724999999998,174.084411999999986 -41.021385000000002,174.094116000000014 -41.023330999999999,174.246338000000009 -41.044724000000002,174.258330999999998 -41.035277999999998,174.299408 -41.003616,174.315246999999999 -41.000557,174.323853000000014 -41.003334000000002,174.323853000000014 -41.010834000000003,174.321625000000012 -41.018059,174.209960999999993 -41.197495000000004,174.161376999999987 -41.225555,174.152771 -41.226661999999997,174.114685000000009 -41.231383999999998,174.052185000000009 -41.235000999999997,174.02664200000001 -41.236114999999998,174.053864000000004 -41.254173000000002,174.206359999999989 -41.269447,174.214966000000004 -41.266663,174.291655999999989 -41.238892,174.303588999999988 -41.229720999999998,174.320800999999989 -41.220275999999998,174.326904000000013 -41.222771000000002,174.288574000000011 -41.276947,174.249114999999989 -41.322502,174.241637999999995 -41.326110999999997,174.231902999999988 -41.328055999999997,174.208587999999992 -41.329445,174.193572999999986 -41.320281999999999,174.155243000000013 -41.305,174.148041000000006 -41.308608999999997,174.111633000000012 -41.336661999999997,174.052764999999994 -41.421112,174.049133000000012 -41.427779999999998,174.044433999999995 -41.442497000000003,174.045806999999996 -41.450836000000002,174.049988000000013 -41.466392999999997,174.063873 -41.493057,174.084136999999998 -41.526108,174.097473000000008 -41.519447,174.096069 -41.511116,174.100799999999992 -41.505561999999998,174.108306999999996 -41.509171000000002,174.114685000000009 -41.513893000000003,174.125792999999987 -41.523887999999999,174.151093000000003 -41.551392,174.176085999999998 -41.578612999999997,174.178864000000004 -41.586112999999997,174.179961999999989 -41.594444000000003,174.179137999999995 -41.602783000000002,174.174133000000012 -41.608336999999999,174.163299999999992 -41.618606999999997,174.157195999999999 -41.623328999999998,174.193024000000008 -41.685555,174.287749999999988 -41.734444000000003,174.291655999999989 -41.740836999999999,174.289153999999996 -41.748336999999999,174.283324999999991 -41.762222,174.236358999999993 -41.837218999999997,174.212188999999995 -41.865279999999998,174.201355000000007 -41.875557,174.184143000000006 -41.890555999999997,174.17804000000001 -41.895004,174.164703000000003 -41.90361,174.157195999999999 -41.907218999999998,174.143585000000002 -41.915832999999999,174.088561999999996 -41.957779000000002,174.009154999999993 -42.027495999999999,173.979674999999986 -42.061110999999997,173.965239999999994 -42.086945,173.959136999999998 -42.100838000000003,173.954407000000003 -42.115555,173.953307999999993 -42.123885999999999,173.953583000000009 -42.133330999999998,173.956359999999989 -42.166389000000002,173.933319000000012 -42.196944999999999,173.928314 -42.202499000000003,173.884154999999993 -42.243614,173.87802099999999 -42.248055,173.870513999999986 -42.251944999999999,173.86300700000001 -42.255561999999998,173.834686000000005 -42.271385000000002,173.801361000000014 -42.293059999999997,173.794983000000002 -42.297500999999997,173.568572999999986 -42.476944000000003,173.558593999999999 -42.487777999999999,173.541350999999992 -42.511947999999997,173.533874999999995 -42.525002,173.531372000000005 -42.532218999999998,173.500823999999994 -42.599724000000002,173.480804000000006 -42.621941,173.466063999999989 -42.656944000000003,173.459960999999993 -42.670836999999999,173.448853000000014 -42.690277000000002,173.387755999999996 -42.793616999999998,173.351623999999987 -42.840836000000003,173.328033000000005 -42.898887999999999,173.328033000000005 -42.906387000000002,173.325806 -42.913612,173.285521999999986 -42.958053999999997,173.106902999999988 -43.057777000000002,173.099396000000013 -43.061385999999999,173.090515000000011 -43.064444999999999,173.026366999999993 -43.081947,172.975799999999992 -43.09111,172.953033000000005 -43.092773,172.935516000000007 -43.098334999999999,172.92025799999999 -43.105834999999999,172.838012999999989 -43.148055999999997,172.818024000000008 -43.160828000000002,172.797760000000011 -43.183059999999998,172.772217000000012 -43.219718999999998,172.76080300000001 -43.239165999999997,172.758026 -43.246665999999998,172.726944000000003 -43.415539000000003,172.726593000000008 -43.423355,172.775817999999987 -43.612220999999998,172.894135000000006 -43.61972,172.90554800000001 -43.620834000000002,173.059692000000013 -43.653053,173.100525000000005 -43.697220000000002,173.105529999999987 -43.703612999999997,173.114409999999992 -43.741385999999999,173.116913000000011 -43.762504999999997,173.116913000000011 -43.769996999999996,173.112182999999987 -43.825004999999997,173.110779000000008 -43.833328000000002,173.091644000000002 -43.856392,173.058593999999999 -43.871108999999997,173.006088000000005 -43.869498999999998,173.002242999999993 -43.868999000000002,172.999236999999994 -43.865668999999997,172.990905999999995 -43.849670000000003,172.965239999999994 -43.802222999999998,172.961365 -43.764449999999997,172.958862000000011 -43.756950000000003,172.951355000000007 -43.755279999999999,172.939972000000012 -43.756110999999997,172.927185000000009 -43.766112999999997,172.921906000000007 -43.771667,172.920532000000009 -43.824173000000002,172.920532000000009 -43.833328000000002,172.917572000000007 -43.869221000000003,172.923584000000005 -43.875884999999997,172.931243999999992 -43.881390000000003,172.937408000000005 -43.887886000000002,172.938904000000008 -43.892384,172.938247999999987 -43.896220999999997,172.870789000000002 -43.904442000000003,172.861633000000012 -43.901389999999999,172.811919999999986 -43.882216999999997,172.804413000000011 -43.878334000000002,172.745789000000002 -43.837775999999998,172.740783999999991 -43.832222000000002,172.736908 -43.825836000000002,172.715239999999994 -43.808334000000002,172.642761000000007 -43.772224,172.513031000000012 -43.729438999999999,172.495238999999998 -43.723885000000003,172.483582000000013 -43.722771000000002,172.472197999999992 -43.72361,172.424988000000013 -43.733612,172.413299999999992 -43.743614,172.390258999999986 -43.763893000000003,172.384978999999987 -43.77861,172.382445999999987 -43.795006,172.383330999999998 -43.8125,172.384704999999997 -43.820838999999999,172.394713999999993 -43.850281000000003,172.393311000000011 -43.858612,172.386932000000002 -43.863334999999999,172.367461999999989 -43.867775000000002,172.297211000000004 -43.881110999999997,172.286925999999994 -43.883057,172.275542999999999 -43.883887999999999,172.189696999999995 -43.909163999999997,172.050812000000008 -43.965279000000002,171.978577 -43.995834000000002,171.955230999999998 -44.006667999999998,171.941070999999994 -44.015006999999997,171.782470999999987 -44.076949999999997,171.654694000000006 -44.122498,171.583587999999992 -44.153885000000002,171.547211000000004 -44.173889000000003,171.538483000000014 -44.178775999999999,171.355559999999997 -44.285491999999998,171.346465999999992 -44.292186999999998,171.342467999999997 -44.295555,171.319976999999994 -44.316391000000003,171.293578999999994 -44.343612999999998,171.285521999999986 -44.356392,171.278594999999996 -44.369995000000003,171.271911999999986 -44.383887999999999,171.269135000000006 -44.391112999999997,171.275542999999999 -44.395836000000003,171.279144000000002 -44.402495999999999,171.278594999999996 -44.420836999999999,171.277190999999988 -44.428885999999999,171.275542999999999 -44.437218,171.26998900000001 -44.451942000000003,171.263306 -44.465553,171.254974000000004 -44.478332999999999,171.214966000000004 -44.533057999999997,171.208313000000004 -44.537506,171.200531000000012 -44.541114999999998,171.196075000000008 -44.560279999999999,171.192200000000014 -44.645836000000003,171.193024000000008 -44.663330000000002,171.20495600000001 -44.700279000000002,171.21414200000001 -44.739165999999997,171.215239999999994 -44.747498,171.207184000000012 -44.851112,171.198577999999998 -44.919998,171.195800999999989 -44.927498,171.185241999999988 -44.938332000000003)))'));
+INSERT INTO geoapp_country (`name`, `mpoly`) VALUES ('Texas', GeomFromText('MULTIPOLYGON (((-103.00243399999998 36.500397,-102.90421904194784 36.500393342967676,-102.8402359524855 36.500390960558398,-102.840235952479716 36.500390960558398,-102.840235952474345 36.500390960558398,-102.840235952468362 36.500390960558398,-102.840235952461725 36.500390960558398,-102.840235952455885 36.500390960558398,-102.792077446284736 36.500389167377229,-102.643207699865854 36.500383624214699,-102.366462330167067 36.500373319605465,-102.250452999999979 36.500368999999999,-102.24499 36.500703999999999,-102.162463000000002 36.500326,-102.12545 36.500323999999999,-102.124752896301885 36.500398159967887,-102.122066000000004 36.500684,-101.930244999999999 36.500526,-101.925344139375468 36.500484781341967,-101.914929315957153 36.500397187533892,-101.826564999999988 36.499653999999992,-101.826498 36.499535000000002,-101.81449312121488 36.499579719643286,-101.788110000000003 36.499678000000003,-101.783359000000004 36.499709000000003,-101.781987 36.499718,-101.780609999999982 36.499727,-101.779435000000007 36.499733999999997,-101.773235954788092 36.499732939140301,-101.709314000000006 36.499721999999998,-101.698684999999998 36.499507999999999,-101.653707999999995 36.499572999999998,-101.649966000000006 36.499572999999998,-101.623914999999997 36.499527999999998,-101.414793008557069 36.499417763984319,-101.392608849457574 36.499406069885133,-101.340061173170298 36.499378370041477,-101.085155999999984 36.499243999999997,-101.052418000000003 36.499562999999995,-101.04533099999999 36.499540000000003,-100.977087999999995 36.499594999999999,-100.936058000000003 36.499602000000003,-100.918513000000004 36.499620999999998,-100.884174000000002 36.499682,-100.884079999999997 36.499682,-100.859656999999984 36.499687000000002,-100.850840000000005 36.49969999999999,-100.824235999999999 36.499617999999998,-100.824218000000002 36.499617999999998,-100.80619 36.499673999999999,-100.806172000000004 36.499634,-100.802909 36.499620999999998,-100.802886 36.499620999999998,-100.761810999999994 36.499617999999998,-100.761810999999994 36.499580000000002,-100.724361999999999 36.499580000000002,-100.724361000000002 36.499558,-100.708625999999995 36.499552999999999,-100.708628000000004 36.499520999999994,-100.657762999999989 36.499482999999991,-100.657762999999989 36.499499999999998,-100.648342999999997 36.499495000000003,-100.648343999999994 36.499462999999999,-100.592613999999998 36.499468999999998,-100.592555999999988 36.499468999999998,-100.592551 36.499428999999999,-100.583539000000002 36.499482999999991,-100.583378999999994 36.499442999999999,-100.578113999999999 36.499462999999999,-100.578113999999999 36.499439000000002,-100.546144999999996 36.499343000000003,-100.531215000000003 36.499341,-100.531215000000003 36.499290000000002,-100.530478000000002 36.49924,-100.530314000000004 36.499357000000003,-100.522227 36.499290999999999,-100.441064999999995 36.499490000000002,-100.441063999999997 36.499462,-100.433959000000002 36.499456000000002,-100.421327999999988 36.499447000000004,-100.421300999999985 36.499487999999999,-100.413634000000002 36.499443999999997,-100.41355 36.499468999999998,-100.378634000000005 36.499516999999997,-100.378591999999998 36.499445,-100.35185199999998 36.499487000000002,-100.351841999999991 36.499473000000002,-100.334463999999997 36.49942,-100.334440999999998 36.49944,-100.324150000000003 36.499679,-100.311244999999985 36.499631,-100.311018000000004 36.499687999999999,-100.310642999999985 36.499642,-100.253572851827684 36.499638031344489,-100.181220999999994 36.499633000000003,-100.090020999999993 36.499634,-100.000405999999984 36.499701999999999,-100.0004059967807 36.499497793115623,-100.00040222345956 36.260147946939995,-100.000399000000002 36.055677000000003,-100.000396170268971 35.879197994164429,-100.000394020347557 35.745115995014778,-100.000391999999991 35.619115,-100.000390396259149 35.519130234823749,-100.000386875554753 35.299632926398459,-100.000386874882437 35.299591010324292,-100.000386852473085 35.298193905884737,-100.000384999999994 35.182701999999999,-100.000381972929958 34.852568985943549,-100.000381605014198 34.812443999872983,-100.000381000000004 34.746460999999996,-100.000381000000004 34.570853999999997,-100.000381000000004 34.570647,-100.000381000000004 34.560509000000003,-99.998254592787575 34.560446149085699,-99.997501461048799 34.560423888524269,-99.985833 34.560079000000002,-99.974761999999998 34.561317999999993,-99.971554999999995 34.562179,-99.965608000000003 34.565843999999998,-99.958898000000005 34.571271000000003,-99.957540999999992 34.572708999999996,-99.95755299999999 34.574168999999998,-99.956716999999998 34.576523999999992,-99.954566999999997 34.578195,-99.94571999999998 34.579273,-99.930492488760507 34.576894921075187,-99.930189904388058 34.576847666503667,-99.929333999999997 34.576714000000003,-99.923210999999995 34.574551999999997,-99.921801000000002 34.570253,-99.915771000000007 34.565975000000002,-99.914151070156151 34.564995899308187,-99.898943000000003 34.555804000000002,-99.896006999999997 34.555529999999997,-99.89376 34.554219000000003,-99.887146999999999 34.549047000000002,-99.885392392967745 34.547401436342639,-99.884583851343237 34.546643143067669,-99.87806651563541 34.540530839522475,-99.87650823800611 34.539069404005723,-99.874403 34.537095,-99.873254000000003 34.535350999999999,-99.872356999999994 34.532096000000003,-99.868953000000005 34.52761499999999,-99.867217250163094 34.525864500605081,-99.853065999999998 34.511592999999998,-99.832903999999985 34.500067999999999,-99.825324999999992 34.497596,-99.818185999999997 34.487839999999991,-99.818738999999979 34.484975999999996,-99.814544624457952 34.476663062301249,-99.814312999999984 34.476204000000003,-99.793683999999999 34.453893999999998,-99.783787954821193 34.445078397966533,-99.782985999999994 34.444364,-99.775743000000006 34.444225000000003,-99.774224411180043 34.443216449834381,-99.765598999999995 34.437488000000002,-99.764825999999999 34.436433999999998,-99.764881999999986 34.435265999999999,-99.767647999999994 34.431854,-99.767234000000002 34.430501999999997,-99.754248000000004 34.421288999999994,-99.740907000000007 34.414763,-99.735679661059166 34.413018903486261,-99.730348000000006 34.411239999999992,-99.720258999999999 34.406295,-99.719721039768913 34.405807854123296,-99.716415999999995 34.402814999999997,-99.715089000000006 34.400753999999999,-99.714231999999996 34.397821999999998,-99.714838 34.394523999999997,-99.712682 34.390928000000002,-99.707900999999993 34.387538999999997,-99.696461999999997 34.381036000000002,-99.678282999999979 34.379798999999998,-99.672337448339604 34.378003970284972,-99.671377000000007 34.377713999999997,-99.666676988468737 34.374633899592595,-99.665992000000003 34.374184999999997,-99.665404581506792 34.374094751646162,-99.662705000000003 34.373679999999993,-99.659863615570984 34.374283464835351,-99.659362000000002 34.374389999999998,-99.654194000000004 34.376519000000002,-99.649662000000006 34.379885000000002,-99.630904999999998 34.376007,-99.628541546335526 34.375150829397036,-99.624196999999995 34.373576999999997,-99.600026 34.374687999999999,-99.596322999999998 34.377136999999998,-99.587595999999991 34.385866999999998,-99.587235087741874 34.386377538370702,-99.585718954359294 34.388522226586467,-99.585441999999986 34.388914,-99.584530999999984 34.391204999999999,-99.585306000000003 34.398122,-99.584479999999985 34.407673000000003,-99.580059999999989 34.416652999999997,-99.574366999999995 34.418281,-99.569695999999993 34.418418000000003,-99.563067665646059 34.417445690943012,-99.562203999999994 34.417318999999999,-99.561530791054494 34.417028950664999,-99.555986000000004 34.414639999999999,-99.549242000000007 34.412714999999992,-99.529786 34.411451999999997,-99.528744576810823 34.411579971493573,-99.523649999999989 34.412205999999998,-99.517623999999998 34.414493999999991,-99.514279999999999 34.414034999999998,-99.499874999999989 34.409607999999999,-99.497090999999983 34.407730999999991,-99.494103999999993 34.404755000000002,-99.490425999999999 34.399693999999997,-99.487218999999982 34.397955000000003,-99.477547 34.396355,-99.477019613816751 34.396364300212412,-99.474810232095294 34.396403261641368,-99.472297823530695 34.396447566809115,-99.470968999999997 34.396470999999991,-99.463286816319666 34.393024688790533,-99.452647999999996 34.388252,-99.445020999999983 34.379891999999998,-99.440759999999997 34.374122999999997,-99.430994999999982 34.373413999999997,-99.43081720973791 34.373532661492725,-99.420432000000005 34.380464000000003,-99.408847999999992 34.372776000000002,-99.407167999999999 34.372605,-99.406018176721332 34.372844364351735,-99.404336527339453 34.373194441551952,-99.402959999999979 34.373480999999998,-99.399602999999999 34.375078999999999,-99.397253000000006 34.377870999999999,-99.396160718377317 34.383134276834824,-99.391492 34.405631,-99.393918999999997 34.415273999999989,-99.396488000000005 34.417290999999999,-99.396901999999997 34.418688000000003,-99.397009999999995 34.424002999999999,-99.395768462359129 34.43494110377263,-99.394955999999993 34.442098999999999,-99.381011 34.456935999999999,-99.376037841709419 34.458617501802458,-99.375365000000002 34.458844999999997,-99.369609999999994 34.458699000000003,-99.358795 34.455862999999994,-99.354671999999994 34.451856999999997,-99.35478257092818 34.450383391084422,-99.354837000000003 34.449657999999999,-99.356770999999995 34.446542,-99.357101999999998 34.444915000000002,-99.356712999999999 34.442143999999999,-99.350407000000004 34.437083,-99.342020261837703 34.431514649700844,-99.341336999999996 34.431061,-99.341016600261696 34.430906286427735,-99.334036999999995 34.427536000000003,-99.331050066208874 34.424666026137302,-99.328674000000007 34.422383000000004,-99.325094009617374 34.416010263301388,-99.324222000000006 34.414458000000003,-99.321411663781888 34.411055277053073,-99.319798627189357 34.409102230797522,-99.319605999999979 34.408869000000003,-99.318363000000005 34.408295999999993,-99.316372999999999 34.408204999999995,-99.308273999999997 34.410013999999997,-99.299098 34.414227999999994,-99.294647999999981 34.415373000000002,-99.289922000000004 34.414731000000003,-99.287844819286008 34.413958196831629,-99.264167 34.405149000000002,-99.261320999999981 34.403498999999996,-99.261255940568432 34.403158389836314,-99.260996786434447 34.401801622187399,-99.259199386422964 34.392391568987605,-99.258998120407611 34.391337867029385,-99.258979999999994 34.391243000000003,-99.259239630132384 34.391043961974496,-99.260703756811225 34.389921531074158,-99.261190999999997 34.389547999999998,-99.262646013804954 34.388906249865343,-99.264243556741917 34.388201635660714,-99.264508000000006 34.388084999999997,-99.271031915197597 34.387722560266795,-99.271781628057255 34.38768090955238,-99.273607516746409 34.387579471291865,-99.273957999999993 34.38756,-99.27534 34.386598999999997,-99.274925999999994 34.384903999999999,-99.271845396288441 34.382114976063626,-99.271280999999988 34.381603999999996,-99.258696 34.372633999999998,-99.254722 34.372405,-99.251407999999984 34.375079999999997,-99.248969000000002 34.375984000000003,-99.242944999999992 34.372667999999997,-99.239138083830497 34.366035888164781,-99.237232999999989 34.362716999999996,-99.237183660287812 34.362563767173611,-99.235448627455725 34.357175329079247,-99.234251999999984 34.353459,-99.233273999999994 34.344101000000002,-99.23260599999999 34.342379999999999,-99.229993999999991 34.340538000000002,-99.226152999999982 34.339725999999999,-99.221975 34.340020000000003,-99.219768999999999 34.341377,-99.217335000000006 34.341520000000003,-99.213134999999994 34.340369000000003,-99.210957832415772 34.336710386428308,-99.210716000000005 34.336303999999998,-99.20972399999998 34.324934999999996,-99.211600000000004 34.313969999999998,-99.213476 34.310671999999997,-99.213233598142949 34.308226764636807,-99.211647999999997 34.292231999999991,-99.211468055040228 34.291676209875057,-99.209990337717599 34.287112032604114,-99.209742000000006 34.286344999999997,-99.209514950796304 34.286049346749877,-99.207560999999998 34.283504999999998,-99.203681000000003 34.281925999999999,-99.200221999999997 34.281151999999999,-99.196259999999995 34.281463000000002,-99.196052113016066 34.281264951942028,-99.19571031750732 34.280939333014615,-99.195605 34.280839,-99.194569999999985 34.272424,-99.196926000000005 34.260928999999997,-99.197153 34.244298,-99.19555299999999 34.24006,-99.191138999999993 34.23234,-99.190145999999984 34.229660000000003,-99.190036000000006 34.227186000000003,-99.192076 34.222192,-99.192683000000002 34.218825000000002,-99.192104 34.216693999999997,-99.189758414718312 34.214539281858485,-99.189510999999996 34.214312,-99.188483307800709 34.214128939694163,-99.159015999999994 34.20888,-99.143985 34.214762999999998,-99.138220000000004 34.219158999999998,-99.130609000000007 34.219408,-99.128513999999996 34.218766000000002,-99.127549000000002 34.217986000000003,-99.126614000000004 34.21532899999999,-99.127525000000006 34.213771,-99.130089999999996 34.212192000000002,-99.131552999999997 34.209352000000003,-99.131884999999997 34.207382000000003,-99.129791999999995 34.204402999999999,-99.126566999999994 34.203004,-99.119203999999996 34.201746999999997,-99.108757999999995 34.203400999999999,-99.102001344898341 34.205813362825268,-99.092190999999985 34.209316,-99.08119261238302 34.211229594305671,-99.079534999999993 34.211517999999991,-99.075978000000006 34.211221000000002,-99.06646499999998 34.208404000000002,-99.060343999999986 34.204760999999991,-99.059158999999994 34.202928999999997,-99.058800000000005 34.201256,-99.058083999999994 34.200569000000002,-99.048792000000006 34.198208999999999,-99.043470999999997 34.198208,-99.040961999999993 34.200842000000002,-99.039004000000006 34.204667,-99.037458999999998 34.206454,-99.036272999999994 34.206912000000003,-99.013074999999986 34.203221999999997,-99.005790000000005 34.206646999999997,-99.002916243275195 34.208781598893673,-99.002945441244265 34.209102775846141,-99.003147197273819 34.211322087284138,-99.003432988816769 34.214465787333673,-99.000760999999997 34.217643000000002,-98.99085199999999 34.221632999999997,-98.987293999999991 34.221223000000002,-98.981363999999999 34.217582999999991,-98.978684999999984 34.210231,-98.976586999999995 34.206291,-98.974131999999983 34.203566000000002,-98.969003 34.201298999999999,-98.966301999999999 34.201323000000002,-98.962469999999996 34.204667999999998,-98.962085000000002 34.206386000000002,-98.962306999999981 34.211312,-98.960791 34.213029999999996,-98.958474999999993 34.213854999999995,-98.952512999999982 34.212649999999996,-98.950395999999984 34.21168,-98.940219999999997 34.203685999999998,-98.928145 34.192689,-98.927456000000006 34.191155000000002,-98.923128999999989 34.185977999999999,-98.920704 34.183435000000003,-98.918333000000004 34.181831000000003,-98.909348999999992 34.177498999999997,-98.892677318093561 34.17250349095427,-98.87651287834953 34.167659972141138,-98.872921999999988 34.166584,-98.871543000000003 34.165026999999995,-98.871211000000002 34.163012000000002,-98.872229000000004 34.160446,-98.874954999999986 34.157031000000003,-98.874871999999996 34.155656999999998,-98.873271000000003 34.153596,-98.868116 34.149635000000004,-98.862549999999999 34.149110999999998,-98.860124999999996 34.149912999999998,-98.858418999999998 34.152732,-98.8579 34.159627,-98.857321999999982 34.161093999999999,-98.855585000000005 34.161620999999997,-98.854264541670545 34.16164976192438,-98.831114999999983 34.162154,-98.812953999999991 34.158444000000003,-98.806809999999984 34.155901,-98.804411553093104 34.153928907629435,-98.792015000000006 34.143735999999997,-98.779288744496085 34.140194111533035,-98.773070373738221 34.138463455122455,-98.767587610783494 34.136937528280072,-98.765569999999983 34.136375999999998,-98.764702233233265 34.135780085954792,-98.763778343962841 34.135145631382905,-98.761796999999987 34.133785000000003,-98.760558000000003 34.132387999999999,-98.759485999999995 34.128881999999997,-98.759653 34.126911999999997,-98.757118934362524 34.12470437936247,-98.757036999999983 34.124633000000003,-98.753813984496389 34.124468645349353,-98.749290999999999 34.124237999999998,-98.741966000000005 34.125529999999998,-98.740191287161664 34.126850584722824,-98.739461000000006 34.127394000000002,-98.737231999999992 34.130991999999999,-98.736819999999994 34.133374000000003,-98.735471000000004 34.135207999999999,-98.734286999999995 34.135758000000003,-98.730242646678789 34.1359250861193,-98.717536999999993 34.136450000000004,-98.716104 34.135947000000002,-98.70640034274598 34.134745066348501,-98.696517999999998 34.133521000000002,-98.690291400890658 34.133167457450512,-98.690072 34.133155000000002,-98.688275858887323 34.134465065675442,-98.685589983550884 34.136424083851644,-98.676900633591032 34.14276190388366,-98.676457484208683 34.143085127260051,-98.670573548505118 34.147376740066704,-98.655654999999982 34.158257999999996,-98.650582999999997 34.163113000000003,-98.648072999999997 34.164440999999997,-98.643223000000006 34.164530999999997,-98.635729999999995 34.161617999999997,-98.634085211037615 34.161100728840964,-98.630950281399748 34.160114822001631,-98.621666000000005 34.157195000000002,-98.620507214282355 34.157012478916968,-98.617663812339856 34.156564612849806,-98.616732999999996 34.156418000000002,-98.615748434938936 34.156446107485429,-98.612133570686254 34.156549305078279,-98.611829 34.156557999999997,-98.610173632571488 34.157093658210222,-98.610154152422197 34.157099961766605,-98.608852999999996 34.157521000000003,-98.603977999999998 34.160249,-98.599789 34.160570999999997,-98.577135999999996 34.148961999999997,-98.572451 34.145091,-98.560191000000003 34.133201999999997,-98.558593000000002 34.128253999999998,-98.550916999999998 34.119334000000002,-98.536257000000006 34.107343,-98.530610999999993 34.099843,-98.528199999999998 34.094960999999998,-98.504182 34.072370999999997,-98.487068052145446 34.063003092954936,-98.486783271268621 34.06284720836274,-98.486328 34.062598,-98.483944186894661 34.06241565608709,-98.482821069121968 34.062329745958955,-98.482039999999998 34.062269999999998,-98.475065999999998 34.064269000000003,-98.449033999999983 34.073461999999999,-98.446378999999993 34.075429999999997,-98.445784000000003 34.076827000000002,-98.445590305319797 34.079232123390703,-98.445584999999994 34.079298,-98.445259148452962 34.079797720749731,-98.443724000000003 34.082152,-98.442807999999999 34.083143999999997,-98.442148160210323 34.083427517317581,-98.441104460406791 34.083875970068213,-98.440092000000007 34.084311,-98.439068026005657 34.084479541105658,-98.434822808733685 34.08517828308225,-98.432126999999994 34.085622,-98.43151641213494 34.085605425226575,-98.43092946822253 34.085589492282431,-98.428479999999993 34.085523000000002,-98.425229999999999 34.084798999999997,-98.422252999999998 34.083036999999997,-98.419995 34.082487999999998,-98.419161945519861 34.082694545588339,-98.41804644206556 34.082971120917755,-98.417812999999995 34.083029000000003,-98.414426000000006 34.085073999999999,-98.400747497198822 34.098985940284976,-98.399776999999986 34.099972999999999,-98.398505572550647 34.104180252359392,-98.39838899999998 34.104565999999998,-98.398160000000004 34.121395999999997,-98.400493999999995 34.121777999999999,-98.400966999999994 34.122236,-98.398441000000005 34.128456,-98.384381000000005 34.146317000000003,-98.381237999999996 34.149453999999999,-98.367493999999994 34.156190999999993,-98.366862955318183 34.156357896864854,-98.364023000000003 34.157108999999998,-98.34173552164826 34.153594120579292,-98.339428832109121 34.153230340726623,-98.331172907733077 34.151928328079421,-98.326986688030772 34.151268134169193,-98.325445000000002 34.151024999999997,-98.324621914768684 34.150650086831803,-98.323612587945547 34.150190341106089,-98.322580000000002 34.149720000000002,-98.320651676675396 34.148059023851737,-98.318749999999994 34.146420999999997,-98.315432139066189 34.144301906683673,-98.312023538956254 34.142124858924547,-98.300208999999995 34.134579000000002,-98.299345719035045 34.134365643147696,-98.29862570169189 34.134187693395319,-98.293901000000005 34.133020000000002,-98.280321 34.130749999999999,-98.258217018239392 34.129574098564007,-98.256467 34.129480999999998,-98.254901718278489 34.129708262798985,-98.247953999999993 34.13071699999999,-98.241012999999995 34.133102999999998,-98.225282000000007 34.127245000000002,-98.223600000000005 34.125093,-98.216463000000005 34.121820999999997,-98.203710999999998 34.117676000000003,-98.200074999999998 34.116782999999998,-98.191455000000005 34.115752999999998,-98.169120000000007 34.114170999999999,-98.157411999999994 34.120466999999998,-98.154353999999998 34.122734,-98.142753999999996 34.136358999999999,-98.136769999999999 34.144992000000002,-98.130815999999996 34.150531999999998,-98.123377000000005 34.154539999999997,-98.114506000000006 34.154727,-98.109461999999979 34.154110999999993,-98.107064999999992 34.152531000000003,-98.101937000000007 34.146829999999994,-98.092021474678845 34.132735952269094,-98.090223999999992 34.130181,-98.089754999999982 34.128211,-98.090659999999986 34.12198,-98.092421000000002 34.116917,-98.095117999999999 34.11119,-98.096177285423778 34.109455137055363,-98.096466125075011 34.108982084942461,-98.099327999999986 34.104295,-98.101378023037029 34.101786489578267,-98.103538246996251 34.099143131812454,-98.104308999999986 34.098199999999999,-98.119416999999999 34.084474,-98.121038999999996 34.081265999999999,-98.120207999999991 34.072127000000002,-98.11802999999999 34.067064999999999,-98.114587 34.06228,-98.100919767943822 34.050244792175462,-98.099096110217346 34.048638900093685,-98.096177018664264 34.044625138601674,-98.096541898037387 34.040976263553816,-98.09727167092565 34.038969381040054,-98.097731364247636 34.038509687718062,-98.098001443813914 34.038239608151798,-98.102015208841422 34.03732738850595,-98.104022094890695 34.036232725638037,-98.104083244997014 34.036133356900422,-98.105481647738245 34.033860956680144,-98.105481647738245 34.032444902147553,-98.105481647738245 34.031306746267951,-98.103616999999986 34.029206999999992,-98.088202999999993 34.005481000000003,-98.085260000000005 34.003259,-98.082839000000007 34.002412,-98.055197000000007 33.995840999999999,-98.050169864666017 33.994989457544634,-98.041117 33.993456000000002,-98.027671999999981 33.993357000000003,-98.019485000000003 33.993803999999997,-98.018481521828946 33.993960861546498,-98.005667000000003 33.995964,-97.987387999999996 33.999822999999999,-97.982805999999997 34.001949000000003,-97.978243000000006 34.005386999999999,-97.974597608872358 34.00657735007583,-97.974172999999993 34.006715999999997,-97.973934144800623 34.006593661859519,-97.971670000000003 34.005434,-97.968339999999998 34.000529999999998,-97.965354903485249 33.996992503283089,-97.963375425210828 33.994646717187933,-97.96302799999998 33.994235000000003,-97.962715090700769 33.994009516348072,-97.958325000000002 33.990845999999998,-97.955849999999998 33.990136,-97.952687999999995 33.990113999999998,-97.947571999999994 33.991053,-97.946472999999997 33.990731999999994,-97.945729999999998 33.989839000000003,-97.945949999999982 33.988395999999995,-97.952184120103468 33.971402949359636,-97.95307606469359 33.968971674482539,-97.95691699999999 33.958502000000003,-97.960351000000003 33.951928000000002,-97.965737000000004 33.947392,-97.972662 33.944527,-97.974172999999993 33.942832000000003,-97.974062000000004 33.940289,-97.972493999999998 33.937907000000003,-97.971175000000002 33.937128999999999,-97.965952999999999 33.936191,-97.963425 33.936236999999998,-97.955511 33.938186000000002,-97.954466999999994 33.937773999999997,-97.953395 33.936444999999999,-97.952679000000003 33.929482,-97.953694999999996 33.924373000000003,-97.957155 33.914453999999999,-97.960615000000004 33.910353999999998,-97.961188664141474 33.909913087050903,-97.963139679674441 33.908413554571595,-97.964461 33.907398,-97.964803587866868 33.907309441163022,-97.9693952279504 33.906122503898267,-97.969873000000007 33.905999,-97.970298415583201 33.906261144464871,-97.973142999999993 33.908014,-97.976962999999998 33.912548999999999,-97.978803999999997 33.912548,-97.979984999999999 33.911402000000002,-97.983551999999989 33.904001999999991,-97.984539999999996 33.900703,-97.984566 33.899076999999998,-97.984416725907181 33.89872544733722,-97.984025057628415 33.897803036597892,-97.98383498894799 33.897355409354304,-97.983768999999995 33.897199999999991,-97.977858999999995 33.889929000000002,-97.974177999999995 33.886642999999999,-97.967776999999998 33.882429999999999,-97.958438 33.879179,-97.951215000000005 33.878424000000003,-97.946463999999992 33.878883000000002,-97.942729999999997 33.879845000000003,-97.938801999999995 33.879891,-97.936743000000007 33.879204,-97.933120450042608 33.877388671138185,-97.918328311832767 33.869976048610916,-97.905467000000002 33.863530999999995,-97.896737999999985 33.857984999999999,-97.877386999999999 33.850236000000002,-97.871447000000003 33.849001,-97.865764999999982 33.849392999999999,-97.835425213046037 33.857383352392631,-97.834333 33.857671000000003,-97.833886750888084 33.857971936447115,-97.833218553718808 33.858422547723912,-97.806802470257153 33.876236728393856,-97.805423000000005 33.877167,-97.803472999999997 33.880189999999999,-97.801578000000006 33.885137999999998,-97.784656999999982 33.890631999999997,-97.78061799999999 33.895533,-97.779683000000006 33.899242999999998,-97.780339999999995 33.904833000000004,-97.783716999999996 33.910559999999997,-97.772672 33.914382000000003,-97.765445999999997 33.913531999999989,-97.763769999999994 33.914240999999997,-97.762914903547767 33.914953098088951,-97.761142192227695 33.916429357685161,-97.760223999999994 33.917194000000002,-97.759399000000002 33.91881999999999,-97.759833999999984 33.92521,-97.762660999999994 33.930846000000003,-97.762767999999994 33.934396,-97.752956999999995 33.937049000000002,-97.738478 33.937421,-97.736553999999998 33.936574999999998,-97.735919542935619 33.936533987763056,-97.734773489745407 33.936459905200778,-97.733722999999998 33.936391999999998,-97.732266999999993 33.936691000000003,-97.725289000000004 33.941045000000003,-97.720699142354164 33.94461309292862,-97.716772000000006 33.947665999999998,-97.714693355370301 33.94981590741822,-97.712051708440285 33.952548118711093,-97.709683999999996 33.954996999999999,-97.708350195107343 33.95701014009046,-97.70415899999999 33.963335999999998,-97.69792099999998 33.977331,-97.69310999999999 33.983699,-97.688023 33.986606999999999,-97.671772000000004 33.991370000000003,-97.661489000000003 33.990817999999997,-97.656210000000002 33.989488,-97.633778000000007 33.981256999999999,-97.609091000000006 33.968093000000003,-97.589597999999995 33.953553999999997,-97.588828000000007 33.951881999999998,-97.591270649549756 33.930345579062646,-97.591514000000004 33.928199999999997,-97.595084 33.922953999999997,-97.596154999999996 33.922105999999999,-97.59697899999999 33.920228000000002,-97.597115000000002 33.917867999999999,-97.596955673755872 33.917077348335745,-97.596288999999985 33.913769000000002,-97.593782375104212 33.910260437761373,-97.589253999999997 33.903922,-97.587440999999984 33.902479,-97.582744000000005 33.900784999999999,-97.578907598302408 33.900207204108142,-97.558269999999993 33.897098999999997,-97.555002000000002 33.897281999999997,-97.551541 33.897947000000002,-97.543245999999996 33.901288999999998,-97.533617322522971 33.906127586572126,-97.532723000000004 33.906576999999999,-97.525277000000003 33.911750999999995,-97.519170999999986 33.913637999999999,-97.504870374844515 33.918353570482601,-97.500960000000006 33.919643,-97.495648860558163 33.919307898609453,-97.494857999999979 33.919257999999999,-97.492061582842766 33.918500058129531,-97.487115891787269 33.917159576320657,-97.48650499999998 33.916993999999995,-97.484158940985964 33.915822631562747,-97.460375999999982 33.903948,-97.458068999999995 33.901634999999999,-97.451065249608234 33.891558064966901,-97.450953999999996 33.891398000000002,-97.451469000000003 33.87093,-97.452287410342421 33.86882620086994,-97.455665873415143 33.860141550511862,-97.457616999999999 33.855125999999998,-97.459565999999995 33.853316,-97.461485999999994 33.849559999999997,-97.462857 33.841771999999999,-97.459067999999988 33.834581,-97.453056999999987 33.828536,-97.444192999999999 33.823773000000003,-97.426492999999994 33.819398,-97.410387 33.818845000000003,-97.403235695189224 33.818961304668854,-97.384901622687948 33.819259479377855,-97.372940999999997 33.819454,-97.368744000000007 33.821471000000003,-97.365506999999994 33.823762999999992,-97.358512999999988 33.830018000000003,-97.348337999999984 33.843876000000002,-97.340900078515631 33.860236176367188,-97.339391593410966 33.867629740388111,-97.337846311291798 33.870430566802547,-97.336524008254173 33.872827243260353,-97.33293952159849 33.874440259476913,-97.329175814777756 33.874440259476913,-97.327562805507441 33.873902588562437,-97.326564370247013 33.872737756024428,-97.326487449786001 33.872648016149064,-97.324157539016809 33.866016724171544,-97.322365295688968 33.864941382342593,-97.318243141591921 33.865120602507631,-97.31654836796514 33.865642075591225,-97.315913230822716 33.865837504006514,-97.314412999999988 33.866988999999997,-97.310479256695203 33.873361218982971,-97.307489695517361 33.878203969770759,-97.302471419756401 33.880175433263638,-97.299245387323282 33.880175433263638,-97.295170524880618 33.877119286431629,-97.294227111562321 33.876411726442917,-97.286921603026471 33.869423850720118,-97.28598279642199 33.868525862052032,-97.284253187903744 33.867526845294535,-97.279107999999979 33.864555000000003,-97.275347999999994 33.863225,-97.271531999999993 33.862560000000002,-97.257971626565464 33.863220416657512,-97.256624999999985 33.863286000000002,-97.255635999999996 33.863697999999999,-97.254234999999994 33.865322999999997,-97.249208999999993 33.875100999999994,-97.246418496348156 33.898356425448434,-97.246179999999981 33.900343999999997,-97.245398270620598 33.902084836575838,-97.245057441245748 33.90284383100218,-97.244945999999999 33.903092,-97.242092 33.906277000000003,-97.241794392023195 33.906436890220043,-97.238755934556053 33.908069304909361,-97.226522000000003 33.914642,-97.210920999999999 33.916063999999999,-97.210512235443105 33.915911440173737,-97.206141000000002 33.914279999999998,-97.185457999999997 33.9007,-97.180845000000005 33.895203999999993,-97.179608999999999 33.892249999999997,-97.170773789281327 33.861660975771436,-97.166629 33.847310999999998,-97.166824000000005 33.840395,-97.171627 33.835335,-97.180939422624874 33.831550006302521,-97.181369999999987 33.831375,-97.186254000000005 33.830894,-97.193690000000004 33.831307000000002,-97.195830999999998 33.830803000000003,-97.197477000000006 33.829794999999997,-97.199700000000007 33.827322000000002,-97.203513999999998 33.821824999999997,-97.204994999999997 33.81886999999999,-97.205652 33.809823999999999,-97.205556910941183 33.806237292333442,-97.205445103342427 33.802019970418343,-97.205431000000004 33.801487999999999,-97.205114487332324 33.800890302957832,-97.203236000000004 33.797342999999998,-97.194785999999993 33.785344000000002,-97.190397000000004 33.781153000000003,-97.187792000000002 33.769702000000002,-97.181842999999986 33.755869999999994,-97.173532726140948 33.740090726508434,-97.172577000695028 33.738276026602087,-97.172191999999995 33.737544999999997,-97.168438536634085 33.734131892706188,-97.163454368039083 33.729599677915004,-97.163149000000004 33.729322000000003,-97.162807288850388 33.729115696596551,-97.155066000000005 33.724442000000003,-97.152609597300682 33.723370138808036,-97.150103410774264 33.72227655424301,-97.149393999999987 33.721966999999999,-97.137529999999998 33.718663999999997,-97.126102000000003 33.716940999999998,-97.121101999999993 33.717174,-97.119522126797463 33.717502594273334,-97.114921749218269 33.718459416457094,-97.113264999999998 33.718803999999999,-97.112398501853761 33.719102240295193,-97.110065570752283 33.719905212653977,-97.108936 33.720294000000003,-97.108097026518521 33.720734123472262,-97.106518853348803 33.721562029324609,-97.104524999999995 33.722608,-97.097154000000003 33.727809,-97.094085000000007 33.730992,-97.092697209381924 33.732891057656268,-97.092130098039192 33.733667094850453,-97.091071999999983 33.735115,-97.089936943375889 33.737167271747261,-97.087911027802278 33.740830286618703,-97.086195000000004 33.743932999999998,-97.084820762198987 33.752363244406453,-97.084693 33.753146999999998,-97.08461299999999 33.759993,-97.085217999999998 33.765512,-97.087362453285593 33.77250304797397,-97.087851999999998 33.774099,-97.093101265647221 33.787040841586602,-97.093917000000005 33.789051999999998,-97.094675961767678 33.791977368936216,-97.095047178759813 33.793408200769441,-97.095235999999986 33.794136000000002,-97.095080023591905 33.79561056406444,-97.094877682854474 33.797523445530629,-97.094770999999994 33.798532000000002,-97.093897185962049 33.800360798466031,-97.09266432242093 33.802941048788071,-97.092111999999986 33.804096999999999,-97.087998999999982 33.808746999999997,-97.078589999999991 33.812755999999993,-97.067977124183287 33.814475679891196,-97.064604445188394 33.815487484896828,-97.062631847535258 33.816079264957295,-97.058622892638837 33.818751903281317,-97.055415722506638 33.823829921794093,-97.055412197115942 33.8238546000754,-97.055148464371385 33.82570077017467,-97.055682980641905 33.830778788687446,-97.057821087157734 33.834520485448607,-97.058282726048489 33.836367011192308,-97.058622892638837 33.837727655580807,-97.057553829022481 33.840133030590344,-97.055415722506638 33.841202089027483,-97.052208542016004 33.841736615656437,-97.048734113748537 33.840934820533782,-97.045339940802535 33.839496399893775,-97.041245000000004 33.837761,-97.038858000000005 33.838264000000002,-97.023899 33.844213000000003,-97.017857000000006 33.850141999999998,-97.010381749407998 33.858564100233409,-96.999664164722446 33.87063922351804,-96.985567000000003 33.886521999999999,-96.983970999999997 33.892082999999992,-96.984938999999997 33.904865999999991,-96.985275905099471 33.906070041818985,-96.988744999999994 33.918467999999997,-96.993996999999979 33.928978999999998,-96.995022999999989 33.932034999999999,-96.995140238436761 33.933014648420269,-96.996024643022366 33.940404763634284,-96.996183000000002 33.941727999999998,-96.996167702736543 33.941832622020257,-96.995421139189489 33.946938567064805,-96.995367999999999 33.947302,-96.994947208134789 33.948043840473474,-96.994456760007211 33.948908482357652,-96.994287999999983 33.949205999999997,-96.990835000000004 33.952700999999998,-96.988126301178397 33.954514162310069,-96.987892000000002 33.954670999999998,-96.982723774786024 33.956016867344054,-96.981537499896135 33.956325787441237,-96.981336999999982 33.956377999999994,-96.979415000000003 33.956178,-96.979347000000004 33.955129999999997,-96.980675999999988 33.951813999999999,-96.981031000000002 33.949159999999999,-96.97981799999998 33.941588000000003,-96.976955000000004 33.937452999999998,-96.973806999999979 33.935696999999998,-96.97254199999999 33.935794999999999,-96.952313000000004 33.944581999999997,-96.944610999999995 33.949216999999997,-96.933309804512817 33.955134148312766,-96.932252000000005 33.955688000000002,-96.924267999999998 33.959159,-96.922113999999979 33.959578999999998,-96.921429967464036 33.959451233053208,-96.919039990098355 33.959004821377064,-96.918617999999995 33.958925999999998,-96.91833921313939 33.958790334953079,-96.917063225391544 33.958169405626251,-96.916299999999993 33.957797999999997,-96.91417790611122 33.956157267456653,-96.911732563120111 33.95426660943896,-96.911336000000006 33.953960000000002,-96.910857206749995 33.953482904168467,-96.908421363636307 33.951055696608989,-96.907387 33.950024999999997,-96.905252999999988 33.947218999999997,-96.902433999999985 33.942017999999997,-96.901946611333699 33.940667581536225,-96.899441999999993 33.933728000000002,-96.896468999999996 33.91331799999999,-96.897193999999999 33.902954,-96.895728000000005 33.896414,-96.887761838797758 33.878628251663962,-96.883009999999999 33.868018999999997,-96.875280999999987 33.860505000000003,-96.87198767019855 33.857765462058182,-96.866438000000002 33.853149000000002,-96.85608999999998 33.84749,-96.850593000000003 33.847211,-96.845895999999996 33.848974999999996,-96.841592000000006 33.852893999999999,-96.840818999999996 33.863644999999998,-96.839777999999995 33.868395999999997,-96.837412999999984 33.871349000000002,-96.833926235310372 33.873661568818115,-96.832156999999995 33.874834999999997,-96.812777999999994 33.872646000000003,-96.794275999999996 33.868886000000003,-96.786859371055769 33.865207582975678,-96.783484999999999 33.863533999999994,-96.780568999999986 33.860098,-96.779588000000004 33.857939000000002,-96.777202000000003 33.848162000000002,-96.776765999999995 33.841976000000003,-96.770675999999995 33.829621000000003,-96.769378000000003 33.827477000000002,-96.766316855179326 33.825510582121247,-96.766234999999995 33.825457999999998,-96.761588000000003 33.824406000000003,-96.754041 33.824657999999999,-96.746233969152598 33.825673509073113,-96.746037999999984 33.825699,-96.741799282455162 33.826447231494264,-96.71318112067361 33.831498997677379,-96.712421999999989 33.831632999999997,-96.708134 33.833060000000003,-96.704457000000005 33.835020999999998,-96.700318655907978 33.838434731313264,-96.699573999999998 33.839049000000003,-96.695480719177567 33.844085960723298,-96.693127324791789 33.84698191524042,-96.690708 33.849958999999998,-96.688190999999989 33.854613,-96.687524326814838 33.85620885855986,-96.684726999999995 33.862904999999998,-96.682762564556768 33.871464102957781,-96.682209 33.873876000000003,-96.682102999999998 33.876645000000003,-96.683464 33.884217,-96.681051007513375 33.895708672998403,-96.680947000000003 33.89620399999999,-96.675306000000006 33.909114000000002,-96.673449000000005 33.912278,-96.670618000000005 33.914913999999996,-96.667186999999998 33.916939999999997,-96.665308436653305 33.917161206414967,-96.66440999999999 33.917267000000002,-96.659896000000003 33.916665999999999,-96.65150600931733 33.910998546998165,-96.644049999999979 33.905962000000002,-96.630116999999998 33.895422000000003,-96.628293999999997 33.894477000000002,-96.616355751891987 33.894625565889051,-96.614680358047494 33.89464641537834,-96.611821556077771 33.89468199182577,-96.607562 33.894734999999997,-96.592948000000007 33.895615999999997,-96.588319642127203 33.894847991673281,-96.587934000000004 33.894784,-96.58760387584924 33.894318075382706,-96.585452000000004 33.891280999999999,-96.585359999999994 33.888947999999999,-96.587494000000007 33.884250999999999,-96.590112000000005 33.880665,-96.597347999999982 33.875100999999994,-96.601685999999987 33.872822999999997,-96.611969999999999 33.869016000000002,-96.625399000000002 33.856541999999997,-96.628968999999998 33.852406999999999,-96.629746999999995 33.850866000000003,-96.630021999999983 33.847541,-96.629842405402627 33.847037300944812,-96.629577623992816 33.846294683138318,-96.629289999999997 33.845488000000003,-96.627812273090953 33.844523322531259,-96.626623854929747 33.84374750920842,-96.623154999999997 33.84148299999999,-96.622548607895212 33.841284829387497,-96.620258613641042 33.840536452948584,-96.605267599881515 33.835637348301233,-96.601258 33.834327000000002,-96.599141379811712 33.83346048638235,-96.597030984690946 33.832596521217091,-96.595164098773168 33.831832245189069,-96.592925999999991 33.830916000000002,-96.587067000000005 33.828009000000002,-96.573054340771023 33.81917200025552,-96.572936999999996 33.819097999999997,-96.568822993124115 33.818734252140963,-96.566549213959448 33.818533211567136,-96.566298000000003 33.818511,-96.551222999999993 33.81912899999999,-96.541502252916899 33.82118138128849,-96.537683599711926 33.821987629236112,-96.532865 33.823005000000002,-96.532141353898353 33.822830017549641,-96.529233999999988 33.822127000000002,-96.526655000000005 33.820891000000003,-96.526331240434345 33.820568979830284,-96.523863000000006 33.818114,-96.519910999999993 33.811346999999998,-96.517492044660074 33.805400310572544,-96.516583999999995 33.803167999999999,-96.515958999999995 33.798933999999996,-96.515952403498957 33.797370629253059,-96.5159410675722 33.794684014612457,-96.515912 33.787795000000003,-96.51191399999999 33.781477999999993,-96.502285999999998 33.773459999999993,-96.500268000000005 33.772582999999997,-96.486059999999995 33.773009999999999,-96.459153999999998 33.775232000000003,-96.456254 33.776035,-96.450509999999994 33.780588000000002,-96.448044999999993 33.781030999999999,-96.436454999999995 33.780050000000003,-96.430214000000007 33.778654000000003,-96.423664429058576 33.776393528613141,-96.422642999999994 33.776040999999999,-96.422322840041474 33.775682043625913,-96.420980388055867 33.774176915691271,-96.419961 33.773034000000003,-96.419583102042878 33.772404537625398,-96.417562000000004 33.769038000000002,-96.416145999999998 33.76609899999999,-96.413408000000004 33.757714,-96.411885201063754 33.755703128434462,-96.408468999999997 33.751191999999996,-96.403507000000005 33.746288999999997,-96.384116000000006 33.730141000000003,-96.383299027856694 33.729391180874664,-96.380090129695702 33.726446045924753,-96.379450023740389 33.7258585550397,-96.370956555983966 33.718063228581727,-96.370761536889887 33.717884239557762,-96.369590000000002 33.716808999999998,-96.369084597701828 33.715741445126696,-96.366945 33.711221999999999,-96.363253 33.701050000000002,-96.363143372320295 33.69469995601051,-96.363135 33.694215,-96.362964209763192 33.693778090504111,-96.362198000000006 33.691817999999998,-96.356236230636398 33.68737146600408,-96.355945999999989 33.687154999999997,-96.355455421824701 33.68710517164083,-96.352724507664888 33.686827790830883,-96.348305999999994 33.686378999999995,-96.346643697131185 33.686554630652331,-96.344174978865311 33.686815463144171,-96.342664999999997 33.686974999999997,-96.337175125435976 33.689043696356201,-96.321102999999994 33.695099999999996,-96.318759999999997 33.696753,-96.318590686098233 33.696960051986665,-96.318010443675675 33.697669623646739,-96.316924999999998 33.698996999999999,-96.314798583555884 33.702507526903553,-96.309963999999994 33.710489000000003,-96.308342766341951 33.715746247280322,-96.307034999999985 33.719987000000003,-96.307001890234133 33.720499786556005,-96.306595999999999 33.726785999999997,-96.307389 33.735005,-96.3061 33.741002000000002,-96.30525491425243 33.743702118680943,-96.304087485467235 33.747432149959735,-96.303009000000003 33.750878,-96.301705999999982 33.753756000000003,-96.294866999999996 33.764771000000003,-96.292482000000007 33.766418999999999,-96.277269000000004 33.769734999999997,-96.269895999999989 33.768405,-96.251497151236435 33.760405611313516,-96.248231999999987 33.758986,-96.23960043273749 33.754058875473291,-96.229595766085112 33.748347949873668,-96.229022999999998 33.748021,-96.220521000000005 33.747390000000003,-96.1999 33.752116999999998,-96.196336040977513 33.753254070097242,-96.186553999999987 33.756374999999998,-96.178059000000005 33.760517999999998,-96.174632999999986 33.763699000000003,-96.169932696734321 33.769534234627457,-96.169452000000007 33.770130999999999,-96.167888847884015 33.774482610028038,-96.162756999999985 33.788769000000002,-96.162122572851359 33.796140263149638,-96.162213638666273 33.796174412747511,-96.166837334419654 33.79790829445497,-96.170373408451042 33.799381659586444,-96.173025461119408 33.800560352833699,-96.175150000000002 33.801951000000003,-96.17734 33.805117000000003,-96.17895107878303 33.810509748931381,-96.178963999999993 33.810552999999999,-96.176910000000007 33.813934000000003,-96.175889999999981 33.814627000000002,-96.164217431250009 33.817001137011715,-96.150765000000007 33.816986999999997,-96.148792 33.819197000000003,-96.151629999999983 33.831945999999995,-96.150147000000004 33.835856,-96.148457006953691 33.837436961236868,-96.14806999999999 33.83779899999999,-96.147446683377808 33.837891494337825,-96.138904999999994 33.839159000000002,-96.128108733462625 33.839703753325978,-96.122951 33.839963999999995,-96.118168999999995 33.837883999999995,-96.109992999999989 33.832396000000003,-96.104074999999995 33.830730000000003,-96.099360000000004 33.830469999999998,-96.097448 33.832724999999996,-96.097637999999989 33.837935000000002,-96.099152999999987 33.842409000000004,-96.100785000000002 33.844230000000003,-96.101348999999999 33.845720999999998,-96.101472999999999 33.846708999999997,-96.100094999999996 33.847971,-96.084626 33.846656000000003,-96.063924 33.841522999999995,-96.055357999999984 33.838262,-96.049381559404907 33.836618570443349,-96.048833999999999 33.836468000000004,-96.044074587870469 33.838420736557822,-96.037191000000007 33.841245,-96.031783693249977 33.849934429642978,-96.031271075997878 33.850758194920559,-96.029462717056688 33.852402158173604,-96.025188419607474 33.852073366797306,-96.022229284477689 33.850922593794486,-96.021900493101384 33.849114234853282,-96.022507000000004 33.846130000000002,-96.022064891975305 33.843195970965255,-96.021407302851145 33.841880802274289,-96.019950829321616 33.840821548098475,-96.019598947095744 33.84056563358331,-96.005296 33.845505000000003,-96.000534603789163 33.849305889934179,-95.998351 33.851049000000003,-95.997709 33.852181999999992,-95.997673906338932 33.852568581878202,-95.997405462294296 33.855525685805766,-95.9977342536706 33.860950759443568,-95.997376655326022 33.862202357114477,-95.996747879541701 33.864403078452035,-95.993624351909531 33.866211440579008,-95.991487204777812 33.866869023331596,-95.988856861024331 33.866869023331596,-95.984753921632091 33.864671017651808,-95.984253769013037 33.864403078452035,-95.980965842506947 33.859306796190523,-95.9735403792467 33.856832331211713,-95.972155999999998 33.856371000000003,-95.971744371228908 33.856383941655046,-95.951609000000005 33.857016999999999,-95.945502988542614 33.859346036998218,-95.944283999999982 33.859811,-95.943359355023844 33.860365112733476,-95.941777921153459 33.861312819872232,-95.941266999999996 33.861618999999997,-95.936631000000006 33.870615,-95.93550004724635 33.874497995518659,-95.935325000000006 33.875098999999999,-95.935308000000006 33.878723999999998,-95.935637 33.880370999999997,-95.936817000000005 33.882385999999997,-95.937201999999999 33.884652000000003,-95.936131999999986 33.886825999999999,-95.935198 33.887100999999994,-95.922712000000004 33.883758,-95.915960999999996 33.881148000000003,-95.905343000000002 33.875629000000004,-95.893305999999995 33.868161,-95.887490999999997 33.863855999999998,-95.881292000000002 33.860627,-95.859469000000004 33.852455999999997,-95.849863999999997 33.844951999999999,-95.843772999999999 33.838949,-95.841300369514457 33.837329726167006,-95.840012000000002 33.836486,-95.839442445999168 33.836292954052603,-95.838335071878717 33.835917618112738,-95.837515999999994 33.835639999999998,-95.831947999999997 33.835160999999999,-95.828244999999995 33.836053999999997,-95.827967044704152 33.836191602640042,-95.826538854622555 33.836898632614485,-95.822787000000005 33.838755999999989,-95.821905415666805 33.839551758599306,-95.821112514659319 33.840267467546653,-95.820784000000003 33.840564,-95.819357999999994 33.842784999999999,-95.818975999999992 33.844456,-95.819524999999999 33.848438999999999,-95.820676999999989 33.850750999999995,-95.821665999999979 33.855443,-95.821665999999979 33.856633000000002,-95.82138191533943 33.857119395418813,-95.820824189768416 33.858074304994595,-95.820595999999995 33.858464999999995,-95.820256321913618 33.858527429344676,-95.805149 33.861303999999997,-95.800842000000003 33.861212000000002,-95.790314669347865 33.857829825250164,-95.789867 33.857685999999994,-95.789358977006231 33.85733891951336,-95.788304168820886 33.85661827626933,-95.787891000000002 33.856335999999999,-95.776255000000006 33.845145000000002,-95.773281999999995 33.843834,-95.772067000000007 33.843817,-95.763621999999984 33.847954,-95.758311274366889 33.849968021173019,-95.758015999999998 33.850079999999998,-95.757640875431136 33.850475976069447,-95.754310000000004 33.853991999999998,-95.753512999999984 33.856464000000003,-95.753688987366843 33.856976705401074,-95.75729390188404 33.867478931648478,-95.757457999999986 33.86795699999999,-95.758009454152003 33.868443703186436,-95.760805000000005 33.870911,-95.762558999999996 33.874366999999992,-95.76194240701966 33.883030946465368,-95.761915999999999 33.883401999999997,-95.758343999999994 33.890610999999993,-95.756366999999997 33.892625000000002,-95.747335000000007 33.895755999999999,-95.737508000000005 33.895966999999999,-95.729445045960333 33.893952819075864,-95.728448999999998 33.893704,-95.723226300470785 33.890698381785455,-95.717160861060378 33.887207774089354,-95.713910181462765 33.885337036216413,-95.713539999999981 33.885123999999998,-95.710877999999994 33.884551999999999,-95.696961999999999 33.885218000000002,-95.684831000000003 33.890231999999997,-95.676924999999983 33.897236999999997,-95.669978 33.905844000000002,-95.665338000000006 33.908132000000002,-95.659818 33.909092,-95.647272999999998 33.905976000000003,-95.636977999999999 33.906613,-95.609439392746168 33.923623282239362,-95.603656999999998 33.927194999999998,-95.599677999999983 33.934246999999999,-95.585944999999981 33.93448,-95.570311428427317 33.932892416047835,-95.564667905744443 33.932319318211334,-95.563423999999998 33.932192999999998,-95.562724847986416 33.932007581530534,-95.561592737930383 33.931707340510293,-95.561007000000004 33.931551999999996,-95.560415995740641 33.931042615914556,-95.559931936825777 33.930625407571753,-95.559414000000004 33.930179000000003,-95.558286100391328 33.928753215740784,-95.557777967458279 33.928110882033096,-95.556914999999989 33.927019999999999,-95.551147999999984 33.914566,-95.549144999999996 33.90795,-95.549475 33.901310999999993,-95.552330999999981 33.894419999999997,-95.55209457427955 33.888655441173519,-95.552085000000005 33.888421999999998,-95.551943532854764 33.888208369560985,-95.548485831718622 33.882986873004867,-95.548324999999991 33.882744000000002,-95.547838962671932 33.882363312195096,-95.545708294665019 33.880694470565629,-95.545197000000002 33.880293999999999,-95.54352178779898 33.880173169084813,-95.541265054919734 33.880010393826282,-95.539789999999996 33.879904000000003,-95.537358049249164 33.88037416967029,-95.534038375697051 33.881015963020303,-95.533282999999997 33.881161999999996,-95.531798241123994 33.881968630089013,-95.525321999999989 33.885486999999998,-95.521418133191162 33.888379988113826,-95.520137966641357 33.88932866459119,-95.515301759339067 33.891142240377064,-95.510062536063273 33.890134704348199,-95.506233872599807 33.886306036979761,-95.506495 33.878588999999998,-95.506084999999999 33.87639,-95.502407477038815 33.874787101867227,-95.502303999999995 33.874741999999998,-95.492028000000005 33.874822000000002,-95.480004545492946 33.87882505156746,-95.478574999999992 33.879300999999998,-95.477829321179073 33.879890044047791,-95.469962325642697 33.886104525088022,-95.467351237093553 33.886417854985297,-95.464924614258621 33.886709049048328,-95.462909526581015 33.885903021006229,-95.461498966768687 33.883686425341857,-95.46277824472287 33.878821065729895,-95.464211000000006 33.873372000000003,-95.463346 33.872312999999998,-95.461127233926518 33.871832054399569,-95.447370000000006 33.868850000000002,-95.418546279096461 33.866998581211959,-95.411345060268999 33.866536029139695,-95.407794999999979 33.866307999999989,-95.406882133018115 33.866362247208706,-95.404325916920058 33.866514150597617,-95.375232999999994 33.868243,-95.352338000000003 33.867789000000002,-95.339561303488324 33.868836967540759,-95.339121999999989 33.868873,-95.339014688391742 33.869073090388603,-95.33835013321854 33.870312202400832,-95.334854000000007 33.876830999999996,-95.334836460323601 33.877305631062114,-95.334523000000004 33.885787999999998,-95.333451999999994 33.886285999999998,-95.325571999999994 33.885703999999997,-95.310579050797429 33.880679668661742,-95.294789354523203 33.875388337067108,-95.287864786488143 33.87494634339312,-95.28344485260331 33.877745636185885,-95.281676877907344 33.882902226669891,-95.281529544303439 33.887616824907447,-95.281317419351268 33.889260797911334,-95.280350898312903 33.896751357029835,-95.279761569607459 33.899108654721076,-95.277846267017765 33.900876629417048,-95.275341635722626 33.901760616765031,-95.272542342929853 33.902055281117747,-95.267212735027385 33.900338966530455,-95.263849803053915 33.899255988324974,-95.261050510261143 33.899992642069066,-95.255746586173245 33.902939265610648,-95.253094626984378 33.90544389690578,-95.250884657186859 33.913105118684925,-95.250737329293145 33.917083057468233,-95.251326652288412 33.924154956252103,-95.253020000000006 33.927236999999998,-95.253623000000005 33.92971,-95.252905999999982 33.933647999999998,-95.250453815364224 33.936614470603772,-95.23166760862577 33.959340626388752,-95.231194814374604 33.959912577712174,-95.230491 33.960763999999998,-95.226393000000002 33.961953999999999,-95.219358 33.961567000000002,-95.184075000000007 33.950353,-95.174181557651636 33.944707625858101,-95.173657196254922 33.944408415920272,-95.168745999999999 33.941605999999993,-95.166685999999984 33.939728000000002,-95.161108999999982 33.937598,-95.149462 33.936335999999997,-95.131725657216535 33.936903570678005,-95.131056 33.936924999999995,-95.130760550144942 33.936820411866918,-95.124700000000004 33.934674999999991,-95.121184 33.931306999999997,-95.121974867397924 33.925542192115131,-95.122499622273722 33.921717137430115,-95.122365486317321 33.918632002634986,-95.119951031304154 33.915815139752631,-95.110963896232136 33.912998276870283,-95.103318123323447 33.913668959251616,-95.10214780889666 33.912991409673538,-95.100769532353866 33.912193461131935,-95.098489218495843 33.909913139475762,-95.095001673232161 33.904815960136006,-95.095247706914634 33.899772255341666,-95.095269945144935 33.899316370327696,-95.09392858558104 33.895962961020395,-95.090441035118587 33.893280234094433,-95.084002493615529 33.893280234094433,-95.079139333602001 33.898143394107954,-95.078905311676394 33.898377416033576,-95.074957661870556 33.900039583313315,-95.073630040977179 33.900598581227868,-95.071259538767663 33.901596686785098,-95.065491679645973 33.899584642240477,-95.06106518008815 33.895292278639054,-95.058834000000004 33.886812999999997,-95.049025 33.864089999999997,-95.046567999999994 33.862564999999996,-95.038661112238941 33.860609605793528,-95.037206999999995 33.86025,-95.033518790033554 33.860141698175291,-95.03143098776043 33.86008039125462,-95.030255193062573 33.860045864827867,-95.022324999999995 33.859813000000003,-95.016999191469623 33.861237606415294,-95.016422000000006 33.861392000000002,-95.008375999999984 33.866088999999995,-95.000223000000005 33.862504999999999,-94.995524000000003 33.857438000000002,-94.992810330111539 33.852698351540766,-94.992671 33.852454999999999,-94.992523097811741 33.852403566519136,-94.990494037024106 33.851697953840834,-94.988486999999992 33.850999999999999,-94.98739725328582 33.851074415574232,-94.983303000000006 33.851354,-94.981650000000002 33.852283999999997,-94.976208 33.859846999999995,-94.973410999999999 33.861730999999999,-94.971435 33.862122999999997,-94.968895000000003 33.860916000000003,-94.965888000000007 33.848421999999999,-94.964400999999995 33.837020999999993,-94.957676000000006 33.835003999999998,-94.949533421399437 33.825707838785306,-94.949112883549958 33.821754768331147,-94.948729542346143 33.818151347643564,-94.948715939727023 33.818023482549535,-94.944301522854289 33.81213759866646,-94.939560116480934 33.810502632153295,-94.935799688114457 33.810339132650462,-94.932366255585293 33.810993121156741,-94.928442330884351 33.812628087669893,-94.92451840618341 33.812791587172725,-94.924196338046286 33.812670811231236,-94.921902464831703 33.811810605997493,-94.919450010309433 33.810175636315982,-94.917815040627914 33.808704169305649,-94.917091634856007 33.805689966907131,-94.916834062621035 33.804616745101868,-94.916997555787162 33.801510305241678,-94.91961350347556 33.794152948011565,-94.920034399525505 33.790224602097751,-94.920103995647338 33.789575041141042,-94.920095560257593 33.789518805381888,-94.91961350347556 33.786305103362189,-94.913003475392784 33.779908559849432,-94.912450337640749 33.77937328682863,-94.911427000000003 33.778382999999998,-94.906244999999998 33.778191999999997,-94.902276 33.776288999999998,-94.89497736748055 33.771540270803243,-94.89019868072495 33.768431100796676,-94.888367999999986 33.76724,-94.887910246679809 33.766674529711281,-94.886225692565191 33.764593571999796,-94.885411379435553 33.764756432942491,-94.881447983999394 33.765549103837166,-94.879218389137634 33.764912090842074,-94.876033253179955 33.760771407616105,-94.875653319149677 33.757021753168047,-94.875534806260347 33.755852122792213,-94.875497398046861 33.755482932714841,-94.877080000000007 33.75222,-94.874668 33.749164,-94.870299604394191 33.746484207390097,-94.869443369718425 33.745958950164457,-94.869299999999996 33.745871,-94.8570941233355 33.742035460072337,-94.849295999999981 33.739584999999991,-94.841633779899112 33.739430990835892,-94.830804318260235 33.740068022348083,-94.828875382311935 33.74092532536806,-94.827937698058648 33.741342073027738,-94.826026615866809 33.743890180559411,-94.824752565187154 33.749304914465036,-94.82447272313469 33.749460382205008,-94.821885938813196 33.750897483986968,-94.817426749089677 33.752171534666616,-94.815635414888177 33.752066164468857,-94.813744972719192 33.751954964523563,-94.81275807295215 33.751896912919612,-94.812012015184067 33.751853028169073,-94.80914539498248 33.749304914465036,-94.798634446013509 33.744527205899239,-94.789716054221742 33.746119775421171,-94.777638928565466 33.753471071068567,-94.775064434371529 33.755038154868203,-94.770923763490302 33.754401129528375,-94.768057130944001 33.753445597691005,-94.766464573766783 33.750897483986968,-94.766146067269247 33.748030863785381,-94.766818924318841 33.746124416643802,-94.768057130944001 33.742616129879757,-94.767738636791165 33.737519908644046,-94.767244154304578 33.736926531576607,-94.76296091588064 33.731786662068515,-94.759138751496963 33.729557067206756,-94.758159820145337 33.729557067206756,-94.753087004596253 33.729557067206756,-94.750011775433265 33.728811557489699,-94.742576055627282 33.727008959675082,-94.742176780415733 33.726449974997927,-94.739390916583417 33.72254976995157,-94.737479828219207 33.716179498036198,-94.737788227808608 33.71500758055268,-94.73907239774114 33.71012773879076,-94.73746132453816 33.705563045258067,-94.73716130937693 33.704713004885136,-94.732383613155861 33.700253815161624,-94.728242929929891 33.699616789821789,-94.725694828570582 33.702483410023376,-94.724525908047042 33.704821269192259,-94.724102271393392 33.705668549067234,-94.721872664186904 33.707261118589173,-94.719006043985303 33.708216656598914,-94.714865360759347 33.707261118589173,-94.711043208720398 33.705668549067234,-94.709450639198465 33.699616789821789,-94.710289486124168 33.697309952648205,-94.710724689878106 33.696113138108018,-94.710724689878106 33.691653948384499,-94.710106194192988 33.688252279047049,-94.71008765219355 33.688150299756906,-94.707858069676533 33.686876245991066,-94.691547961569825 33.685092048879412,-94.684792000000002 33.684353000000002,-94.659166999999997 33.692138,-94.652265035786613 33.690979104454883,-94.649628372726468 33.688049476940073,-94.649099284135872 33.686462209886628,-94.648456523423718 33.684533926193204,-94.64818493525776 33.682632803768527,-94.647928021538007 33.680834402751707,-94.647870600191638 33.680432452214262,-94.648456523423718 33.673401362074948,-94.647827859209684 33.672301196274027,-94.646112824818204 33.669299876741562,-94.642890235687361 33.668420997570671,-94.635273213800133 33.669885811328072,-94.631328876730365 33.67284406472757,-94.630585813750528 33.673401362074948,-94.627656194751552 33.677795791992715,-94.62121101648988 33.681018386800773,-94.616816575217669 33.679553573043371,-94.614284398758912 33.677302743466427,-94.611543254774574 33.674866164477912,-94.611424034353576 33.674789522931938,-94.607441775118403 33.672229504256364,-94.60304734520065 33.671350625085473,-94.596895128555005 33.671350625085473,-94.593672545101384 33.673987285307021,-94.590449961647764 33.677502836053897,-94.590316660066918 33.67755410593854,-94.586641449284855 33.678967649811298,-94.579620000000006 33.677622999999997,-94.576973687569549 33.673401362074948,-94.5728722135906 33.669885811328072,-94.571305222138406 33.668005422800071,-94.569942586075811 33.666370260581196,-94.569356662843745 33.663440621711956,-94.571445361022185 33.660423619728157,-94.571993323065286 33.659632120703485,-94.572286279004103 33.656995454804722,-94.570821465246695 33.654944723492456,-94.568770728257221 33.65465176187643,-94.564669254278257 33.655823608340576,-94.563858010166513 33.65591721375597,-94.557052229552454 33.656702498865904,-94.552071876402621 33.653479904057846,-94.551192985877293 33.650257320604226,-94.551311999999982 33.644569999999995,-94.553536678805585 33.642054372646328,-94.552657799634687 33.638245860283412,-94.549142248887819 33.635902161677912,-94.543868917090279 33.635902161677912,-94.538888563940446 33.637952898667386,-94.538195599937964 33.637916426989378,-94.537583502619341 33.637884211439605,-94.533322276204103 33.637659937051346,-94.529220802225154 33.63443734792051,-94.528408204203203 33.630103504051213,-94.528341911699826 33.629749945032266,-94.52980672545722 33.627406252103981,-94.528927834931892 33.621839964367631,-94.526291174710352 33.619203298468861,-94.521363727720257 33.61686924674752,-94.520724886974008 33.61656663824732,-94.504615 33.620682000000002,-94.493418698303032 33.624467326832118,-94.492501061148843 33.624777568252533,-94.491502999999994 33.625115,-94.491295462081894 33.62531395337146,-94.487514000000004 33.628939000000003,-94.485874999999993 33.637867,-94.481313 33.638818999999998,-94.476415000000003 33.638947000000002,-94.466075000000004 33.636262000000002,-94.464185999999998 33.637655000000002,-94.461453000000006 33.643615999999994,-94.459197999999986 33.645145999999997,-94.454819999999998 33.644902999999999,-94.448637000000005 33.642766000000002,-94.446871000000002 33.640177999999999,-94.447513999999998 33.636254999999991,-94.448451000000006 33.634497000000003,-94.458816999999982 33.632444,-94.462736000000007 33.63091,-94.461129 33.625414999999997,-94.460285999999996 33.624420999999998,-94.45525499999998 33.622917,-94.452710999999994 33.622621000000002,-94.452325000000002 33.618817,-94.452961000000002 33.616985999999997,-94.454768999999999 33.615155999999992,-94.462335999999993 33.610567000000003,-94.469451000000007 33.60731599999999,-94.472166 33.604199,-94.471974000000003 33.602665000000002,-94.471151999999989 33.601588,-94.468086 33.599435999999997,-94.461794602929331 33.598691554192769,-94.458900358388505 33.598349085232492,-94.458231999999995 33.598269999999999,-94.454858239556387 33.593453869357283,-94.453995999999989 33.592222999999997,-94.453435550445548 33.592019500625121,-94.452150252013013 33.591552808439438,-94.451622 33.591360999999999,-94.449112 33.590893999999992,-94.442363999999998 33.591242999999999,-94.441536999999997 33.591501999999991,-94.439518000000007 33.594154000000003,-94.430358101189597 33.59122600196271,-94.430038999999994 33.591124,-94.429672337173542 33.590855074196774,-94.427920122643982 33.589569927010331,-94.427577999999983 33.589319000000003,-94.425982000000005 33.586424999999998,-94.413155000000003 33.569367999999997,-94.412481642075306 33.56890283335202,-94.412480771235352 33.568902231761562,-94.412480202418593 33.568901838813659,-94.412175000000005 33.568691,-94.408900999999986 33.568196999999998,-94.403341999999995 33.568424,-94.397341999999981 33.571607999999998,-94.385926999999995 33.581887999999999,-94.382886999999997 33.58326799999999,-94.379649 33.580607,-94.378075999999993 33.577019,-94.377759999999981 33.574609000000002,-94.378561000000005 33.571328999999999,-94.380090999999993 33.568942999999997,-94.382534000000007 33.567056999999998,-94.388052000000002 33.565511,-94.392357000000004 33.565286999999998,-94.394655618773015 33.564059042448399,-94.397398454287298 33.562313601959417,-94.399227012370631 33.559903231990447,-94.399393244337958 33.557077279687135,-94.399143896386974 33.555498071165481,-94.397957000000005 33.554389999999998,-94.392572999999999 33.551141999999999,-94.389515000000003 33.546778000000003,-94.386086000000006 33.544922999999997,-94.381666999999993 33.544035,-94.373392999999993 33.544471,-94.371597999999992 33.545000999999999,-94.363297000000003 33.544956999999997,-94.361350999999999 33.544612999999998,-94.358969999999999 33.54323,-94.355945000000006 33.54318,-94.348944999999986 33.548358999999998,-94.347382999999979 33.55107799999999,-94.34729 33.552197,-94.352653000000004 33.560611000000002,-94.352433000000005 33.56217199999999,-94.345512999999997 33.567312999999999,-94.344023000000007 33.567824000000002,-94.340576999999996 33.567878,-94.340047258358467 33.56768232744934,-94.338972839399958 33.567285465504582,-94.33842199999998 33.567081999999999,-94.337996277272822 33.566655299162022,-94.334939999999989 33.563592,-94.334379999999996 33.562536,-94.333929800646288 33.557825151092565,-94.333894999999998 33.557461000000004,-94.333202999999997 33.555365999999992,-94.331833000000003 33.553348,-94.33059 33.552692,-94.323660000000004 33.549835000000002,-94.319491999999997 33.548864000000002,-94.309582000000006 33.551673,-94.30641 33.555616,-94.306214999999995 33.557676,-94.307180999999986 33.559797000000003,-94.303577000000004 33.56828,-94.301022999999986 33.573022000000002,-94.298392000000007 33.576217999999997,-94.293257999999994 33.580418999999999,-94.289129000000003 33.582143999999992,-94.287025 33.582410000000003,-94.283581999999996 33.581890999999999,-94.282647999999995 33.580978000000002,-94.280849000000003 33.577187000000002,-94.280604999999994 33.574907999999994,-94.282171999999989 33.572989,-94.290372000000005 33.567905000000003,-94.291686999999996 33.563481000000003,-94.290901000000005 33.558872,-94.289439999999999 33.557634999999998,-94.287571999999997 33.557178,-94.279089999999997 33.557026,-94.275600999999995 33.557963999999998,-94.274473 33.558652000000002,-94.271997999999996 33.561517999999992,-94.270978999999997 33.563220999999999,-94.270853000000002 33.564782999999998,-94.265668999999988 33.573588999999998,-94.262754999999999 33.577354,-94.257801 33.582507999999997,-94.257524288354617 33.582703553652586,-94.252656000000002 33.586143999999997,-94.245931999999996 33.589113999999995,-94.242777000000004 33.589708999999999,-94.240178999999998 33.589536000000003,-94.236971999999994 33.587411000000003,-94.236362999999997 33.585991999999997,-94.236835999999997 33.580914,-94.237975000000006 33.577756999999998,-94.238867999999997 33.576721999999997,-94.244365999999999 33.573549,-94.251108000000002 33.56528,-94.252330999999984 33.561855,-94.252283000000006 33.560445,-94.251569000000003 33.558188,-94.250197 33.556764999999999,-94.237903999999986 33.552675,-94.233128263729824 33.552212399803537,-94.233017493976078 33.552201670126067,-94.231843999999981 33.552087999999998,-94.226392000000004 33.552911999999999,-94.222920999999999 33.554088,-94.21922099999999 33.556095999999997,-94.213604000000004 33.563133999999998,-94.21268334130005 33.563763266722709,-94.208078 33.566910999999998,-94.205634000000003 33.567228999999998,-94.203593999999981 33.566546000000002,-94.202594978382763 33.562850001484037,-94.201237000000006 33.557825999999999,-94.199485999999993 33.556085000000003,-94.197816999999986 33.555238000000003,-94.196394999999995 33.555123000000002,-94.193247999999997 33.556153999999999,-94.191332999999986 33.55766599999999,-94.189883999999992 33.562454000000002,-94.192482999999996 33.570425,-94.194399000000004 33.573678,-94.196366991504703 33.574779501237479,-94.201105911663163 33.575851400157113,-94.204265191768783 33.575005164570705,-94.207404999999994 33.574353000000002,-94.209665 33.573509999999999,-94.211329000000006 33.573774,-94.216140999999993 33.576391999999998,-94.217408000000006 33.579259999999998,-94.217197999999982 33.580736999999999,-94.214431000000005 33.583187000000002,-94.212997 33.583486999999991,-94.210966999999997 33.583143,-94.205788416261612 33.581380140341984,-94.203588205048902 33.580815984742067,-94.199751933850294 33.581098061448763,-94.196536237091394 33.581718635888464,-94.194464999999994 33.582886000000002,-94.190890999999979 33.587474,-94.183913000000004 33.594681999999999,-94.180879999999988 33.592612000000003,-94.176327 33.591076999999999,-94.162266000000002 33.588906,-94.161081999999993 33.587972,-94.162009999999995 33.580877,-94.161276999999998 33.579270999999999,-94.156782000000007 33.575749000000002,-94.152625999999998 33.575923000000003,-94.148731999999995 33.580196999999998,-94.146047999999993 33.581975,-94.144383000000005 33.582097999999995,-94.142160000000004 33.581389999999999,-94.141852 33.579590000000003,-94.143023999999983 33.577725,-94.145668999999984 33.575599999999994,-94.149506000000002 33.573602,-94.151257 33.571793,-94.151754999999994 33.569476000000002,-94.151455999999996 33.568387,-94.148520000000005 33.565677999999991,-94.145239000000004 33.564987000000002,-94.143401999999995 33.565504999999995,-94.136863999999989 33.570999999999998,-94.136045999999993 33.571387999999999,-94.135142000000002 33.571033,-94.134308000000004 33.569209,-94.133047999999988 33.557952999999998,-94.131382000000002 33.552934,-94.128658 33.550952000000002,-94.126897999999983 33.550646999999991,-94.123897999999997 33.552100000000003,-94.122878999999983 33.553111999999999,-94.12071899999998 33.560555,-94.120354999999989 33.5655,-94.119902152897509 33.566998927274319,-94.112842999999998 33.566991000000002,-94.103176000000005 33.570349999999998,-94.100106999999994 33.57256799999999,-94.097439999999992 33.573718999999997,-94.088943 33.575322,-94.082640999999995 33.575491999999997,-94.072670000000002 33.572234000000002,-94.072231491265512 33.572605318678747,-94.072031926011121 33.573523317998088,-94.072031926011121 33.573846369634623,-94.072031926011121 33.574161925883949,-94.071815412538413 33.574459631515609,-94.071712621294751 33.574600969288895,-94.071353404455635 33.574840447439463,-94.070395493400298 33.574561056392717,-94.069534727631535 33.574169799087244,-94.069517406590393 33.574161925883949,-94.068559493988133 33.573563230894273,-94.068280102941401 33.571966710019424,-94.06782332144887 33.570215714974232,-94.067801146640278 33.570130711574109,-94.066845999999998 33.568908999999998,-94.061283000000003 33.568804999999998,-94.056597999999994 33.567824999999999,-94.056095999999997 33.567252000000003,-94.055662999999996 33.561886999999999,-94.056442000000004 33.560997999999991,-94.059849999999997 33.559249,-94.061179999999993 33.559159,-94.066685000000007 33.560953999999995,-94.067984999999993 33.560960999999999,-94.071719999999999 33.559682000000002,-94.073744000000005 33.558284999999998,-94.073825999999997 33.555833999999997,-94.072156000000007 33.553863999999997,-94.069091999999998 33.553406000000003,-94.06547999999998 33.550908999999997,-94.061896000000004 33.549764000000003,-94.056095999999997 33.550725999999997,-94.051882000000006 33.552585,-94.050211999999988 33.551082999999998,-94.046040000000005 33.551321000000002,-94.043449999999993 33.552253,-94.043428000000006 33.551424999999995,-94.043374999999997 33.542315000000002,-94.043020107474533 33.494534442391668,-94.043008999999998 33.493039000000003,-94.043278999999998 33.491029999999995,-94.043271947583932 33.489425304099555,-94.043188 33.470323999999991,-94.043130608695648 33.460424000000003,-94.043089437732434 33.453322008844353,-94.043061045958495 33.448424427841935,-94.043010021810147 33.439622762252007,-94.042987999999994 33.435823999999997,-94.042987999999994 33.434442436873745,-94.042987999999994 33.431023999999994,-94.042886999999993 33.420225000000002,-94.042890126641851 33.419424334827802,-94.042891364631132 33.419107312620362,-94.042967439944888 33.399626074590046,-94.043053 33.377715999999999,-94.042868999999996 33.371169999999999,-94.043127999999996 33.358756999999997,-94.043066999999979 33.352097,-94.043066999999979 33.347351000000003,-94.043066999999979 33.339614667914582,-94.043066999999979 33.330497999999999,-94.042990000000003 33.271227000000003,-94.043049999999994 33.260903999999996,-94.043003999999996 33.250127999999997,-94.042730000000006 33.241822999999997,-94.042876000000007 33.215218999999998,-94.042891999999995 33.202666,-94.042874999999995 33.199784999999999,-94.042718999999991 33.160290999999994,-94.043184999999994 33.143476,-94.043076999999982 33.138162,-94.043007000000003 33.13389,-94.042951563372725 33.117233519058104,-94.042869999999994 33.092726999999996,-94.043036 33.079484999999998,-94.042963999999998 33.019219,-94.042986850316112 33.007494023677346,-94.043068075862834 32.965815492539427,-94.043087999999997 32.955592000000003,-94.043066999999979 32.937902999999999,-94.043092 32.910021,-94.042884999999998 32.898910999999998,-94.042859000000007 32.892771000000003,-94.042885999999996 32.880965000000003,-94.043025 32.880445999999999,-94.042784999999995 32.871485999999997,-94.042921087938623 32.829694015190334,-94.043025999999983 32.797476000000003,-94.042747000000006 32.786973000000003,-94.042828999999998 32.785277,-94.042937999999992 32.780557999999999,-94.043026999999995 32.776862999999999,-94.042946999999998 32.767991000000002,-94.042974715046569 32.757603400545236,-94.04314699999999 32.693030999999998,-94.042912999999999 32.655126999999993,-94.042779999999993 32.643465999999997,-94.042823999999996 32.640304999999998,-94.042925999999994 32.622014999999998,-94.042929 32.618259999999992,-94.042918999999998 32.610142000000003,-94.042939007208048 32.604544739553475,-94.043082999999996 32.564261000000002,-94.043142000000003 32.559502000000002,-94.043081 32.513612999999999,-94.042884999999998 32.505144999999999,-94.042911000000004 32.492851999999999,-94.043088999999995 32.486561000000002,-94.043071999999995 32.48429999999999,-94.042955000000006 32.480260999999999,-94.042995000000005 32.478003999999999,-94.042901999999998 32.472905999999995,-94.042874999999995 32.471347999999992,-94.042902999999981 32.470385999999998,-94.042907999999997 32.439890999999996,-94.042985999999999 32.435507,-94.042898999999991 32.400658999999997,-94.042923000000002 32.399918,-94.042900999999986 32.392282999999999,-94.042762999999994 32.373331999999998,-94.042738999999997 32.363559000000002,-94.042733519218956 32.277818574933548,-94.042732999999998 32.269696000000003,-94.042732 32.269620000000003,-94.042671451745775 32.225096273752321,-94.042662000000007 32.218145999999997,-94.042600205901905 32.185155675879351,-94.042565999999994 32.166893999999999,-94.042538999999991 32.166826,-94.042591000000002 32.158096999999998,-94.042681000000002 32.137956000000003,-94.042751999999993 32.125163,-94.042337000000003 32.119914,-94.042699999999996 32.056012000000003,-94.042717288248511 32.00695918811028,-94.042720000000003 31.999265,-94.042490448495869 31.997488887291052,-94.042251674184627 31.995641414801661,-94.041832999999997 31.992401999999998,-94.038411999999994 31.992436999999999,-94.029282999999992 31.995864999999998,-94.027080554152732 31.994823406342874,-94.018664 31.990842999999998,-94.011671046736083 31.979908989829021,-94.008352361284565 31.974719974671689,-94.002944198469422 31.966263903968002,-93.995504541226836 31.954631438414648,-93.994147015257326 31.952508844111783,-93.977461000000005 31.926418999999996,-93.971711999999982 31.920383999999995,-93.953546000000003 31.910562999999996,-93.943541310721315 31.908563758569336,-93.938002035663573 31.906916949339585,-93.935007833635339 31.903773037645127,-93.932462763507019 31.895538979891644,-93.931327794714704 31.894581351390723,-93.92767203678045 31.891496810199779,-93.923929283519882 31.889849995167665,-93.919587694495533 31.890748256066246,-93.915948999999998 31.892861000000003,-93.909557114944889 31.893143619429534,-93.905252294448232 31.890856686636408,-93.90476638821832 31.890598549301192,-93.901173350426333 31.885957535142037,-93.901888 31.880063,-93.898135577976262 31.874953416991548,-93.896981462364707 31.873381885463036,-93.889196542313442 31.867692899288475,-93.888241004857136 31.85786451213389,-93.888148571748644 31.856913771406646,-93.887306164689562 31.854968889155742,-93.884117000000003 31.847605999999995,-93.880377455095243 31.844791786271248,-93.879654915472827 31.84424803536659,-93.874821999999995 31.840611000000003,-93.874804231839249 31.835091218914506,-93.874787826198073 31.829994712349503,-93.874761000000007 31.821660999999999,-93.870917000000006 31.816836999999996,-93.868473098390325 31.815251608244314,-93.853390000000005 31.805467,-93.846187999999998 31.802021,-93.839950728453459 31.798597132180646,-93.836868453653821 31.794158659336233,-93.836868453653821 31.791454071635616,-93.836868453653821 31.788733862378688,-93.834649214842401 31.783309060642711,-93.831197070889573 31.780226788232302,-93.827450999999996 31.777740999999999,-93.823442999999997 31.775098,-93.822597999999985 31.773558999999995,-93.826519525540022 31.761832440276638,-93.827342999999999 31.759369999999997,-93.830112066651125 31.754555168030393,-93.830647423185951 31.745811043570992,-93.824579 31.734396999999998,-93.819048075401312 31.72885814427071,-93.818932598107111 31.728523867973351,-93.815657495541259 31.719043310199801,-93.815835943108667 31.711905251886723,-93.815525624652665 31.710796971318612,-93.814600367558683 31.707492480599399,-93.814586782471608 31.707443962415162,-93.811060073548262 31.705827553684028,-93.810303944025605 31.705480994217723,-93.807270273132957 31.704231833580664,-93.806045429297654 31.703104120446881,-93.803419352361757 31.700686292667093,-93.802693549340276 31.697783082925291,-93.802451615781152 31.693186330065117,-93.804479 31.685663999999999,-93.812820813246589 31.676953615984285,-93.81562111199878 31.674029590143711,-93.817425 31.672146,-93.821829497696953 31.673879806810671,-93.822051000000002 31.673966999999998,-93.822341750589956 31.673502431839047,-93.826462000000006 31.666919,-93.8257324849111 31.66154827530681,-93.825660999999997 31.661021999999996,-93.825228912080746 31.660277861177896,-93.81803699999999 31.647891999999999,-93.817707248836442 31.6409111211136,-93.816838000000004 31.622509,-93.818717000000007 31.614555999999997,-93.823976999999999 31.614227999999997,-93.825414416100287 31.615089707767993,-93.827851999999993 31.616550999999998,-93.838056999999992 31.606795000000002,-93.839382999999998 31.599074999999999,-93.837534908858984 31.593743346167731,-93.834924 31.586210999999999,-93.822958 31.568129999999996,-93.822219025006859 31.564792487143556,-93.820763999999997 31.558221000000003,-93.818582000000006 31.554825999999998,-93.798086999999995 31.534044000000002,-93.787687000000005 31.527343999999996,-93.781574079702807 31.525595412174177,-93.780834999999996 31.525383999999999,-93.777170583402579 31.525128039451072,-93.760062000000005 31.523933,-93.753860000000003 31.525331,-93.751899169046524 31.525601857922521,-93.749869902733366 31.526210635456998,-93.746826003263621 31.526007705679731,-93.743376259969125 31.525196002300419,-93.742401241878753 31.523787647735123,-93.74154991556837 31.522557958452786,-93.741111000000004 31.520101,-93.740752889151466 31.518711098615515,-93.740332360499409 31.517078940980245,-93.739317727342822 31.515049678599539,-93.734411826534469 31.513527159467717,-93.733432858180635 31.513223342063657,-93.726736285639134 31.511599931372594,-93.725924582259807 31.504091651519342,-93.728765551952293 31.496786301443361,-93.730997740177827 31.492118989316349,-93.733996137544537 31.48847587643743,-93.737167999999997 31.484621999999998,-93.741884999999982 31.483535,-93.745608448194673 31.481972669547908,-93.746355058504165 31.481633300507966,-93.747840636420193 31.480958036391328,-93.749869902733366 31.478928770078173,-93.749869902733366 31.475276095040186,-93.749626709600278 31.47120988033301,-93.749476 31.468689999999999,-93.709416000000004 31.442995,-93.706857276389258 31.44142369846492,-93.700929751125955 31.437783629836048,-93.697919763270235 31.429300939077926,-93.697603150134782 31.428408665937056,-93.704678 31.418899999999997,-93.704697874245824 31.418107106580852,-93.704878999999991 31.410881,-93.701611 31.409333999999998,-93.695865999999995 31.409391999999997,-93.689953513429003 31.406208353384852,-93.678362516190631 31.399967047179565,-93.675064666986117 31.398191282223291,-93.674659331220113 31.397973024503138,-93.674116999999981 31.397680999999995,-93.671643999999986 31.393352,-93.670181999999983 31.387184,-93.668532759396427 31.379357124595749,-93.668145986696857 31.37510269235548,-93.669064113561134 31.373151679996884,-93.669693055010129 31.371815184369147,-93.669512094168894 31.370548454097019,-93.668919524600994 31.366400452767671,-93.667402247962755 31.365414223393856,-93.665051865060306 31.363886475190469,-93.663891561951601 31.361952641672623,-93.663698175601809 31.360018811902275,-93.664665092360735 31.357698213179859,-93.665825387974422 31.355184231855155,-93.668439000000006 31.353011999999996,-93.669515978941746 31.350266666374935,-93.673736148309771 31.339509006758242,-93.677277000000004 31.330482999999997,-93.687850999999995 31.309835,-93.686922292404276 31.305369360695714,-93.686880000000002 31.305166,-93.686723586265984 31.304979085312567,-93.684737187533131 31.30260533533086,-93.684038999999999 31.301770999999995,-93.683824154244718 31.301752735987076,-93.675439999999995 31.30104,-93.668927999999994 31.297974999999997,-93.657003999999986 31.281735999999999,-93.647719584117951 31.27389987096868,-93.642516 31.269508000000002,-93.632650200244299 31.270182983909681,-93.620343000000005 31.271025000000002,-93.615257056394739 31.261768439618621,-93.61394199999998 31.259374999999995,-93.614287999999988 31.251631,-93.616308000000004 31.244595000000004,-93.616007481020262 31.233959925788763,-93.613835693061347 31.232449117569455,-93.609977782626956 31.229765355202261,-93.609827614285464 31.229660890324059,-93.608033931702224 31.227867209671889,-93.60740940488401 31.227242683526022,-93.605259887151632 31.224152751460338,-93.604319472818304 31.220794125122111,-93.604319472818304 31.215285983654958,-93.607287999999997 31.205403,-93.602442999999994 31.182541,-93.600307999999998 31.176157999999997,-93.598827999999997 31.174679,-93.595531708436056 31.171774432382691,-93.588772842417583 31.16581877494577,-93.588502999999989 31.165581,-93.588046655571759 31.165671453282986,-93.583339301771971 31.166604510813709,-93.579215000000005 31.167421999999995,-93.578993496784307 31.167654977688123,-93.574136071231791 31.172764031170193,-93.569563000000002 31.177574,-93.560942999999995 31.182481999999997,-93.552649000000002 31.185575,-93.548930999999996 31.186601,-93.535096999999993 31.185614,-93.533756450961803 31.184752004501149,-93.533306999999994 31.184463,-93.5330935917342 31.183965183917415,-93.531744000000003 31.180816999999998,-93.533193520062923 31.174490811082034,-93.53417786817559 31.170194787673282,-93.536829999999981 31.158620000000003,-93.540253000000007 31.156578999999997,-93.544009577425854 31.153014849431809,-93.544887639546317 31.148844041597808,-93.544887639546317 31.143136612291205,-93.544701999999987 31.135888999999999,-93.540277800652078 31.128868068802213,-93.539619249807799 31.121843550568837,-93.541375382556595 31.113501939154769,-93.541635919885238 31.113241401693255,-93.548470239502265 31.106407078590973,-93.549716998224596 31.105160319232844,-93.55112206776522 31.099540038044921,-93.551692642249563 31.097257738879012,-93.551034091405285 31.091111287020031,-93.546643772295099 31.082989189009115,-93.540128999999993 31.078002999999995,-93.53104031045666 31.074698717981779,-93.527873992025093 31.072210897922254,-93.526043656150705 31.070772777782928,-93.524020490083288 31.067083472240864,-93.523009982318626 31.065240780256033,-93.523659621286654 31.063941504256789,-93.525329858273139 31.060601035263321,-93.529255791555698 31.057567354514948,-93.532069000000007 31.055264,-93.531218761655126 31.051678447674814,-93.523247999999995 31.037841999999998,-93.516942620821894 31.032584114108545,-93.516407263768343 31.029550433360171,-93.516883288197775 31.024314186160638,-93.516942620821894 31.023661529978199,-93.539525999999995 31.008497999999999,-93.540062152267268 31.008345085566372,-93.540618575989114 31.008186389569964,-93.555580999999989 31.003918999999996,-93.562626264226125 31.00599480945781,-93.566016847371429 31.004567194682853,-93.567979815741779 31.001533515663564,-93.569764334642755 30.996715319472376,-93.571101253513504 30.991033414001794,-93.571905755076102 30.987614282198351,-93.567971999999997 30.977981,-93.560533000000007 30.971285999999999,-93.55046299120518 30.967360467203815,-93.549841 30.967117999999996,-93.539153617393822 30.956968324013513,-93.532549000000003 30.950695999999997,-93.526524876707626 30.939912016599852,-93.526293050708773 30.939497017171423,-93.526245000000003 30.939411,-93.526242458076936 30.939167805401102,-93.526231146824912 30.938085618677029,-93.526146999999995 30.930035,-93.526269219450654 30.929894609689271,-93.530935999999983 30.924533999999998,-93.542488999999989 30.920064,-93.54502991280485 30.920837107400992,-93.546884259495414 30.92151141825828,-93.549244331161987 30.921005686748707,-93.550358562122057 30.920030731622223,-93.551941554990407 30.918645608548566,-93.555650241837967 30.911228247920597,-93.555751501305451 30.910053639118178,-93.555774257662236 30.909789665608852,-93.556493125509377 30.9014508058257,-93.562447641167196 30.896531852982324,-93.563812214002311 30.895404595987301,-93.564247644832776 30.895044891882932,-93.567787752332634 30.888301832311882,-93.567450600170787 30.878524390216981,-93.566008182600839 30.875519355165832,-93.565853452041281 30.875197,-93.565427680666076 30.874309976760035,-93.563763247930751 30.87311591407202,-93.559394659034922 30.869981891957959,-93.55904186947815 30.86972880101742,-93.558616999999984 30.869423999999999,-93.558608112367665 30.868835818489011,-93.558593354020289 30.867859114376206,-93.558393833586933 30.854654896933653,-93.558352334289978 30.851908482785802,-93.558231866260058 30.843935935637496,-93.558171999999999 30.839973999999998,-93.553625999999994 30.835139999999999,-93.55374115920948 30.832414921630001,-93.554057 30.824940999999995,-93.561666000000002 30.807738999999998,-93.563243 30.806218000000005,-93.564501487304341 30.805543276361082,-93.569303000000005 30.802969,-93.578395 30.802046999999998,-93.584264999999988 30.796662999999995,-93.588934854633479 30.787551489258888,-93.589380999999989 30.786681000000002,-93.589895999999996 30.77776,-93.591925627378814 30.768225181611253,-93.592827999999997 30.763985999999996,-93.607757000000007 30.757656999999995,-93.611581311334461 30.752392350515215,-93.615058988962588 30.747604886281291,-93.619129 30.742001999999996,-93.617688 30.738479000000005,-93.609908791486006 30.729403419430973,-93.609718999999998 30.729181999999998,-93.609544 30.723138999999996,-93.61030547238029 30.720788970554505,-93.611192000000003 30.718053,-93.61618399999999 30.713980000000003,-93.616977218405893 30.712276394979256,-93.620773999999997 30.704122000000005,-93.621061387132315 30.696047232392139,-93.621092999999988 30.695159,-93.62235785978659 30.692974242186811,-93.629903999999996 30.679939999999995,-93.632922525899005 30.677439880221801,-93.638212999999993 30.673057999999997,-93.646373493696458 30.671658473870171,-93.653439445062318 30.670446661945991,-93.654970999999989 30.670183999999999,-93.666219386787546 30.661299653678171,-93.670353999999989 30.658033999999997,-93.670860468306827 30.657347728689221,-93.683099999999996 30.640763000000003,-93.685120999999981 30.625201,-93.684323003112922 30.617258061147268,-93.683396999999985 30.608040999999997,-93.680812614601606 30.602993111696524,-93.680648411741274 30.602453589051585,-93.679828117977763 30.599758343304948,-93.681234543283509 30.596101640780542,-93.683902548646543 30.593069810094963,-93.684328672415049 30.59258557751615,-93.684347894395486 30.592579170189346,-93.687282162286593 30.59160108089231,-93.689533999999995 30.592759,-93.692869000000002 30.594382000000003,-93.712453999999994 30.588479,-93.72107859525056 30.580404159651369,-93.727657631584904 30.574244488790981,-93.727844000000005 30.574069999999995,-93.727840097341868 30.573768021870688,-93.72780696123904 30.571204031383882,-93.727747245613443 30.566583382517752,-93.727745999999996 30.566486999999999,-93.725846999999987 30.556978,-93.728764326223569 30.546403128121515,-93.729195000000004 30.544841999999999,-93.736587760607577 30.541316766984647,-93.740252999999996 30.539569,-93.738909526480768 30.537838512460276,-93.732793 30.529960000000003,-93.727721000000003 30.525671000000003,-93.718711305261792 30.520890798500346,-93.714321999999996 30.518561999999996,-93.710116999999997 30.506399999999996,-93.713193644304937 30.50058809182816,-93.716678000000002 30.494005999999995,-93.71365216083376 30.483878530555742,-93.711446941284677 30.476497671106777,-93.710595424186792 30.473647647388944,-93.709703157003446 30.47066123332699,-93.708899372668625 30.467970970942378,-93.705844999999997 30.457747999999999,-93.697828 30.443837999999996,-93.6978 30.440583,-93.698862234241474 30.438260713588438,-93.702220303997905 30.430919206922557,-93.702664999999996 30.429947000000002,-93.722313999999997 30.420729,-93.729486046484141 30.413342592858086,-93.738025291703323 30.404548123662593,-93.738321805525445 30.404242747530638,-93.745333000000002 30.397022,-93.751243378615428 30.396311282781173,-93.751436999999996 30.396287999999998,-93.754787283332149 30.393127406185759,-93.75746720581121 30.390599218098316,-93.757654000000002 30.390422999999995,-93.757872622462301 30.389610210267922,-93.758470934573069 30.387385818798332,-93.75855399999999 30.387077,-93.758091991038413 30.3842338214119,-93.758032188807945 30.383865801664729,-93.757931393201204 30.383245510859378,-93.75589426835937 30.370709152880856,-93.756044740613035 30.365928314513319,-93.75610723110799 30.3639428524199,-93.756352000000007 30.356166000000002,-93.758519945992674 30.350935458285047,-93.760658351649255 30.34577618769989,-93.763244572034736 30.339536487238696,-93.765822 30.333317999999995,-93.764264999999995 30.330222999999997,-93.760690955159149 30.32995156504764,-93.760328 30.329923999999998,-93.747921244232074 30.314935395431327,-93.743830002049762 30.309992764786195,-93.741160171732417 30.306767342150266,-93.738698999999997 30.303793999999996,-93.734966161369201 30.301561360829975,-93.729390287632427 30.298226388348422,-93.724220000000003 30.295133999999997,-93.718684474451791 30.295009979388311,-93.714319430116035 30.294282471059141,-93.71311219174963 30.293184979315004,-93.711118400234781 30.291372437742464,-93.709949692759622 30.289928741213533,-93.708644873043468 30.288316906143507,-93.708448001046747 30.287627854154977,-93.707590519980414 30.284626670422831,-93.706607851977495 30.281187332412603,-93.706635817233519 30.280914670488997,-93.707189856385114 30.275512775340033,-93.709131999999997 30.271826999999995,-93.707538803456245 30.253087036355307,-93.707271000000006 30.249936999999996,-93.705637767078656 30.244573755694763,-93.705083000000002 30.242751999999996,-93.707646217538425 30.23733474070027,-93.713358999999997 30.225261,-93.71802168481895 30.219915738218987,-93.719219999999993 30.218541999999999,-93.720945999999998 30.209852,-93.717397000000005 30.193439,-93.710467999999992 30.180670999999997,-93.706634735424259 30.17682001000631,-93.705927274531248 30.176109277739844,-93.705791510460429 30.175972885881706,-93.703764000000007 30.173936,-93.703646997347349 30.173527735424756,-93.702964616901454 30.171146663230584,-93.701744610591902 30.166889619937699,-93.701686103512344 30.166685467574972,-93.697748000000004 30.152943999999998,-93.696083741705934 30.150925109485563,-93.688211999999979 30.141376,-93.69286799999999 30.135216999999997,-93.69498 30.135185,-93.698276000000007 30.138608000000005,-93.700984936503929 30.137486558544058,-93.701251999999997 30.137376,-93.7012922571502 30.136537706048752,-93.701585086407604 30.130439981942867,-93.701656556414648 30.128951727699913,-93.701742498922442 30.127162105630983,-93.701985639262489 30.122099077688652,-93.702366286953335 30.114172668214064,-93.702403861450691 30.11339023643033,-93.702436000000006 30.112720999999997,-93.70268530105453 30.112503701678254,-93.704703872918159 30.110744253531749,-93.710410303455276 30.105770356484715,-93.714491639657382 30.10221294069715,-93.723764999999986 30.094129999999996,-93.727140999999989 30.092110594495406,-93.7293848599641 30.090768395691203,-93.72996305770063 30.09042253796256,-93.732484999999997 30.088913999999995,-93.734084999999979 30.086129999999997,-93.731705540540531 30.081478540540548,-93.731605000000002 30.081282000000002,-93.729179922109864 30.079341937687897,-93.727017487667368 30.077611990133899,-93.71640499999998 30.069121999999997,-93.716151269697463 30.069056930886212,-93.707507094464489 30.066840132907302,-93.702179999999998 30.065473999999995,-93.700580000000002 30.063666,-93.699479012508235 30.0595596142199,-93.699395999999993 30.059249999999995,-93.699786698153744 30.05843348475733,-93.700658293446523 30.056611948527472,-93.700819999999993 30.056273999999998,-93.702099264262131 30.055460929156467,-93.703267223154896 30.054718601437116,-93.703940000000003 30.054290999999999,-93.704473210548429 30.054251542735575,-93.709782747672762 30.053858640136632,-93.710785394684464 30.05378444485228,-93.720804999999999 30.053042999999995,-93.729054152595779 30.045230570163486,-93.729990027439044 30.044344241966268,-93.737446000000006 30.037282999999999,-93.739158000000003 30.032626999999998,-93.739733999999999 30.023987000000002,-93.741078000000002 30.021571000000002,-93.744068611359822 30.019549890100706,-93.74834924745744 30.01665695787004,-93.753252045558341 30.013343557169065,-93.766227014667976 30.004574835541469,-93.782835629207284 29.993350429819579,-93.786934999999986 29.990579999999998,-93.789430999999993 29.987812000000002,-93.803328792953494 29.962666096659486,-93.807814999999991 29.954549,-93.813734999999994 29.935126,-93.816550000000007 29.920725999999995,-93.818997999999993 29.914822,-93.830374000000006 29.894358999999998,-93.838374000000002 29.882854999999999,-93.853129483564672 29.866348149842587,-93.854474509531912 29.864843479256791,-93.855140000000006 29.864098999999996,-93.857517787207271 29.862146563102172,-93.862474802662518 29.858076283033213,-93.863569999999996 29.857177,-93.864820388168837 29.856398395289631,-93.872445999999997 29.851650000000003,-93.890679000000006 29.843159000000004,-93.900728 29.836967,-93.911111176241661 29.828996955749506,-93.916359999999997 29.824967999999998,-93.922743999999994 29.818808,-93.927992000000003 29.809640000000002,-93.929208000000003 29.802952,-93.928808000000004 29.79708,-93.926503999999994 29.789559999999998,-93.922407000000007 29.785048,-93.898470000000003 29.771576999999997,-93.893861999999999 29.767289000000002,-93.890820999999988 29.761672999999995,-93.891780610698319 29.758916671398389,-93.892526767476923 29.756773455119472,-93.893828999999997 29.753032999999999,-93.891732576672823 29.744984915009951,-93.891637000000003 29.744618000000003,-93.891484462723341 29.744488863328282,-93.888820999999993 29.742234000000003,-93.873941000000002 29.737770000000005,-93.870019999999997 29.735482,-93.863203999999996 29.724059,-93.837970999999982 29.690618999999998,-93.852868 29.675885,-93.866980999999996 29.673085,-93.889989999999997 29.674012999999999,-93.930999999999997 29.679611999999999,-93.955443390383635 29.680262610936268,-93.955453232202885 29.68026287289646,-93.991585827226885 29.681224615973395,-94.000169999999997 29.681453101326589,-94.000222586816207 29.681454501032487,-94.001406000000003 29.681486,-94.010062765207763 29.679864152681674,-94.056505999999999 29.671163,-94.132576999999984 29.646217,-94.354166823921716 29.561457673765378,-94.370794193562546 29.555097613439198,-94.391123278008692 29.54732162684321,-94.45341877657637 29.523493256060661,-94.456196753642018 29.522430664556182,-94.45805240375158 29.521720868184531,-94.499046371673685 29.506040450016997,-94.499089575343746 29.506023924375612,-94.500455432020999 29.505501476685335,-94.500806999999995 29.505367,-94.552043946167103 29.48495633977835,-94.552044379602123 29.484956167115939,-94.568074121423052 29.478570587212708,-94.593696728539513 29.46836361027578,-94.594852999999986 29.467903,-94.599458690353401 29.465813271763974,-94.62931993394271 29.452264405230761,-94.631084 29.451464,-94.634656044789836 29.449584234717392,-94.661528069434993 29.435443006940758,-94.670389 29.430779999999999,-94.674924987623086 29.427889211977174,-94.680871144138621 29.42409972235215,-94.694158000000002 29.415631999999999,-94.708472999999998 29.403049000000003,-94.723958999999979 29.383268000000005,-94.730956033155138 29.369322304827527,-94.731047000000004 29.369140999999996,-94.731324722869132 29.369141342444962,-94.731537324603394 29.369141604592603,-94.742750849251038 29.369155431380086,-94.744595216508316 29.369157705569055,-94.744833999999997 29.369157999999999,-94.761491000000007 29.361882999999999,-94.772184717669788 29.3616343088914,-94.778690999999995 29.361483,-94.780073439975141 29.362532749099824,-94.782355999999993 29.364266,-94.782645420567292 29.368514320481975,-94.783130999999997 29.375641999999996,-94.766847999999996 29.393488999999999,-94.754099999999994 29.400999999999996,-94.743385419572206 29.410035318862811,-94.73704402931665 29.415382843516582,-94.727822669267709 29.423158969605012,-94.723817999999994 29.426535999999995,-94.716270519001597 29.430976788539081,-94.706539419927282 29.436702374764607,-94.706364999999991 29.436804999999996,-94.686385999999999 29.466508999999995,-94.681540999999996 29.471388999999999,-94.672399999999996 29.476842999999999,-94.665852999999998 29.478401000000002,-94.656737000000007 29.478032999999996,-94.645948000000004 29.473769,-94.628217000000006 29.475986000000002,-94.608557000000005 29.483344999999996,-94.594211 29.492127,-94.595122262498009 29.503650874486677,-94.595439999999996 29.507669,-94.591407000000004 29.513857999999999,-94.580274000000003 29.525295,-94.566674000000006 29.531987999999995,-94.553989999999985 29.529558999999999,-94.546993999999998 29.524379,-94.532347999999999 29.5178,-94.511044999999996 29.519649999999995,-94.495024999999984 29.525030999999998,-94.503428999999997 29.543249999999997,-94.509486999999993 29.542589999999997,-94.523742999999996 29.545987,-94.523871183237745 29.546315590042923,-94.5261306113389 29.55210749848424,-94.526336 29.552633999999998,-94.542531999999994 29.568999999999999,-94.546193009360195 29.571896121601313,-94.546385 29.572047999999995,-94.546803832691651 29.57214903106096,-94.55398799999999 29.573882,-94.570006000000006 29.572232,-94.578210999999982 29.567281,-94.593518000000003 29.561319,-94.625889999999998 29.552807999999999,-94.634988842169335 29.550728838088908,-94.643914431984982 29.54868926579681,-94.666855093063802 29.543447131924982,-94.691625000000002 29.537787000000002,-94.693243673136905 29.537529479678042,-94.718275999999989 29.533546999999995,-94.740699000000006 29.525857999999999,-94.757688999999999 29.524616999999999,-94.768675999999999 29.525659,-94.780938000000006 29.531093000000002,-94.785987568065153 29.540133852805589,-94.789123822994313 29.545749069554745,-94.789562096440733 29.546533763545689,-94.78971899677407 29.546814681200559,-94.790604999999999 29.548400999999998,-94.779438999999996 29.549472000000002,-94.772471009935998 29.548613672580952,-94.771052999999995 29.548438999999995,-94.762972090755014 29.555767305595641,-94.75523699999998 29.562781999999999,-94.750081379755628 29.56810096117977,-94.734626000000006 29.584046,-94.731874420576986 29.588423440241069,-94.724443803393115 29.600244680945409,-94.708741000000003 29.625226,-94.705273448792255 29.640626536822896,-94.703938528752261 29.6465553563269,-94.702680930363101 29.65214076491651,-94.702542126991759 29.652757236398369,-94.699660909360375 29.665553672721437,-94.69780371146922 29.673802100155214,-94.694887994254785 29.686751760487848,-94.693153999999993 29.694452999999999,-94.692434000000006 29.70361,-94.692611750388934 29.704808689927841,-94.695098387970873 29.721577752663908,-94.695317000000003 29.723051999999999,-94.695611486157915 29.72357178078331,-94.697558868014866 29.727008993840069,-94.705700105090941 29.741378628781629,-94.713878412983604 29.755813695314995,-94.714586470042065 29.757063446593907,-94.722078339612551 29.770286919851305,-94.724615999999983 29.774766,-94.735270999999997 29.785433,-94.738125273271791 29.786265833277604,-94.740919000000005 29.787080999999997,-94.749144589762409 29.783534045463153,-94.75591801041729 29.780613280409739,-94.771512 29.773888999999997,-94.792237999999998 29.767432999999997,-94.798897371247961 29.764438558858895,-94.816085 29.756710000000002,-94.81943931055217 29.753325616252695,-94.823987131664666 29.748737021482022,-94.851107999999996 29.721373000000003,-94.856932183541645 29.710462974624775,-94.860426638443812 29.703917062844585,-94.864167858487249 29.696908903620852,-94.865007000000006 29.695336999999999,-94.865123196353878 29.694545038919138,-94.867438000000007 29.678768000000002,-94.872550999999987 29.67125,-94.893107 29.661335999999999,-94.915413 29.656613999999998,-94.921317999999999 29.658177999999999,-94.928410408640929 29.669495826038883,-94.930071799099807 29.672147016790593,-94.930110565443542 29.672208878811933,-94.930656833967475 29.673080595662611,-94.931474856161643 29.67438596783704,-94.934166999999988 29.678681999999998,-94.935264231405057 29.686686879688732,-94.935319060033862 29.687086883348073,-94.935997030967087 29.692033037575822,-94.936088999999996 29.692703999999999,-94.936280063994801 29.692851065945039,-94.941277009519624 29.696697319220664,-94.942680999999993 29.697778,-94.942922907078852 29.697804516058127,-94.95311095436017 29.698921254167477,-94.965343618259496 29.700262107971746,-94.965962999999988 29.70033,-94.972666000000004 29.684869999999997,-94.980123280315652 29.679059463608382,-94.986438191421769 29.674139034277729,-94.988580124776774 29.672470090483102,-95.001800051879343 29.662169436052462,-95.002396227716986 29.661704909944582,-95.005398 29.659365999999995,-95.011683000000005 29.649802000000005,-95.013860566469219 29.644103309100927,-95.014229369455222 29.643138151779844,-95.015636 29.639457,-95.015582911847446 29.639202042718885,-95.014543866006605 29.634211997110764,-95.013498999999996 29.629193999999998,-95.006633444897872 29.623869765921089,-95.00056235200779 29.61916163683599,-95.000370188745762 29.619012614335521,-94.997782627529062 29.617005962082896,-94.997731096758997 29.616965999999998,-94.995478872439179 29.615219401320278,-94.993499353954022 29.613684285860323,-94.988871000000003 29.610095,-94.988045541621688 29.608923290953985,-94.982835617337045 29.60152798723708,-94.982705999999993 29.601344000000005,-94.982886347998431 29.601051719777942,-94.983895794498991 29.599415764569699,-94.98693593300419 29.594488776939745,-94.988992999999994 29.591155,-94.991605757589539 29.588791109774153,-94.991811610459919 29.588604864563266,-94.992208959522046 29.588245363334387,-95.006677600766466 29.575154872369662,-95.007235451984087 29.574650156950938,-95.007670000000005 29.574256999999996,-95.00815781845921 29.573398130166158,-95.016627 29.558487,-95.018253 29.554884999999999,-95.016926355758628 29.548485488141377,-95.015164999999996 29.539988999999998,-95.012091452887788 29.536262245236642,-95.011587670186657 29.535651395780732,-95.011086587278399 29.535043819893005,-95.001666768519442 29.523622047865974,-94.999580999999992 29.521093,-94.989064037839412 29.515168017977793,-94.982063906682782 29.511224326765198,-94.981915999999998 29.511140999999995,-94.981645984265953 29.511070508097891,-94.961088181447877 29.505703566689924,-94.958443000000003 29.505013000000002,-94.958183821928699 29.504969740154092,-94.957844913785792 29.504913172428417,-94.95747910332102 29.504852114391142,-94.955724072517796 29.504559179260749,-94.952845264169682 29.504078672538427,-94.930551536860648 29.500357589179547,-94.927405495678158 29.499832478177321,-94.909464999999997 29.496837999999997,-94.913072085311995 29.488019044482122,-94.913385000000005 29.487254,-94.917178632618899 29.481741136316387,-94.925104227340569 29.470223752399235,-94.925293406029382 29.469948840084836,-94.925914000000006 29.469047,-94.930860999999993 29.450503999999999,-94.923011455799639 29.448810114938265,-94.920334997737442 29.448232551169699,-94.919400999999993 29.448030999999997,-94.916063708203708 29.446327523795176,-94.890799999999984 29.433432,-94.888257132054065 29.420136433311271,-94.887299999999996 29.415132,-94.887087039327696 29.40154064293051,-94.886938304445962 29.392048238229908,-94.886925408340758 29.391225196262944,-94.886904215833582 29.389872669858736,-94.886764190565785 29.380936121184895,-94.886591910643261 29.369941049100753,-94.886536208040312 29.366386054846032,-94.886982892003275 29.364738908620176,-94.888420210858001 29.359438798199445,-94.888544709543254 29.358979709544975,-94.888781730376067 29.358105695694917,-94.894234145274325 29.337999926591962,-94.894147383920654 29.327241695272729,-94.894002695197727 29.309300588032027,-94.893993580875261 29.308170430590454,-94.891329624021282 29.304475264201969,-94.888683946869179 29.30080545353194,-94.886599269217157 29.297913803549264,-94.886536208040312 29.297826331584119,-94.885816422022174 29.297499155955627,-94.884216982863776 29.296772137788121,-94.876917125093229 29.293454018939102,-94.875951551627523 29.293015121686942,-94.86617837453683 29.293883848703121,-94.865126326153927 29.293977364132552,-94.861112574100105 29.294855372432302,-94.849730461009372 29.297345209778594,-94.825607939204673 29.30577638202961,-94.824952733476934 29.30600538596191,-94.823862547308252 29.313200608971236,-94.822547126780194 29.321882377573708,-94.82230657170463 29.344254498409398,-94.810695999999993 29.353434999999998,-94.797913847039041 29.344567105809805,-94.79693012269928 29.343884625840758,-94.784895000000006 29.335535,-94.779995 29.334935000000002,-94.777063999999996 29.336811,-94.773074869484503 29.336485139838025,-94.745528999999991 29.334235,-94.744945 29.33641,-94.731319999999997 29.338066,-94.722529999999992 29.331445999999996,-94.731082 29.331833,-94.769694999999999 29.304936,-94.780304129101268 29.295750693651897,-94.786095000000003 29.290737,-94.793321795438203 29.286014946162535,-94.795651468635626 29.284492716516493,-94.803695000000005 29.279236999999998,-94.809348860129617 29.275904173901317,-94.81020919937113 29.275397022855465,-94.819018398045671 29.270204194137058,-94.82210781776098 29.268383049216432,-94.825036245866656 29.266656805306088,-94.825782574142963 29.266216861214712,-94.826962003659688 29.265521613475173,-94.833188167130103 29.261851427154124,-94.844390135018429 29.255248113651685,-94.870677905110114 29.23975205180561,-94.881596387366812 29.233315846843187,-94.896165027201874 29.224727954332334,-94.925556066041452 29.207402583865772,-94.927613957028456 29.206189502425392,-94.940693735267132 29.198479261054111,-94.968741214129224 29.181945889621023,-94.978383546115566 29.176261947153485,-94.981700088962569 29.174306918145966,-95.026218999999998 29.148064000000002,-95.076832914261459 29.114498139229923,-95.081772999999998 29.111222,-95.084611040272236 29.108948681405003,-95.100241410561338 29.096428488590096,-95.110484 29.088224,-95.116308293211759 29.081343778536318,-95.119264367911811 29.077851775668329,-95.119484217932538 29.077592067446851,-95.122403192505772 29.074143890856067,-95.122524999999996 29.074000000000002,-95.122638295373392 29.073709965581063,-95.125134000000003 29.067321,-95.183550616106302 29.028323983126334,-95.191390999999996 29.023089999999996,-95.192301227546167 29.02243038040822,-95.237672480263356 28.989550945676651,-95.238923999999997 28.988644,-95.240558404572027 28.987315672512366,-95.251568580535192 28.978367386619187,-95.251619678822578 28.978325857575001,-95.272266000000002 28.961545999999995,-95.29656403895315 28.934716691525271,-95.297146999999981 28.934073,-95.309703999999996 28.928262,-95.334686660244515 28.911063042846731,-95.353450999999993 28.898145,-95.376979000000006 28.876159999999999,-95.377903963555724 28.874482723635413,-95.38239 28.866347999999999,-95.416173999999998 28.859482,-95.436326577581042 28.85908617652915,-95.439594 28.859022000000003,-95.449516932572138 28.854239851149391,-95.480746000949352 28.839189657836059,-95.485144835951402 28.837069731735976,-95.486768999999995 28.836286999999995,-95.506945757563287 28.824808612805594,-95.536465934189138 28.808014833314715,-95.564052739104355 28.79232093268277,-95.564094788066555 28.792297011382839,-95.564132228771385 28.792275711681647,-95.568135999999981 28.789997999999997,-95.576201168007842 28.785870627961152,-95.606319447682353 28.770457515020929,-95.613122366343802 28.766976102576891,-95.695711236705606 28.724711019702028,-95.715243498124195 28.714715330888584,-95.812504000000004 28.664942,-95.854124934570734 28.646410960033691,-95.884026000000006 28.633098,-95.920915435374582 28.618912188118028,-95.97832748198536 28.596834417485056,-96.000681999999983 28.588238,-96.000998496292368 28.588108377001081,-96.024040703743012 28.578671299526803,-96.035336417502748 28.574045070633311,-96.05294532761279 28.566833233429691,-96.077867999999995 28.556625999999998,-96.194412 28.502223999999998,-96.220123346321373 28.492065891861738,-96.220376184174313 28.491966,-96.226882700448613 28.487451845000788,-96.241923733725443 28.477016528665938,-96.244750999999994 28.475055,-96.270391000000004 28.461929999999999,-96.303212000000002 28.441870999999999,-96.321560000000005 28.425148,-96.328817 28.423658999999997,-96.341616999999999 28.417333999999997,-96.371116999999998 28.397660999999999,-96.372100999999986 28.393874999999998,-96.370716999999985 28.387667,-96.378616389014681 28.383909329746462,-96.379349732835649 28.386024690464755,-96.381702691108558 28.392811896356477,-96.381863685354148 28.393276290946375,-96.375880899310658 28.401794149460329,-96.37413840285555 28.404274990018202,-96.340801887331921 28.432913073072363,-96.338559687910475 28.434839257985413,-96.335119195902806 28.437794848703732,-96.312964581561445 28.451131053409146,-96.280819757359396 28.470480970729877,-96.274497619264608 28.474286648703266,-96.268341347214189 28.477992481854848,-96.252027698910211 28.484249764669329,-96.250247000000002 28.484932771712327,-96.223824788704931 28.495067307260509,-96.218978121459415 28.500382701101032,-96.21505000939203 28.509679222336811,-96.145447855080619 28.544740658174199,-96.10473518795402 28.559498996555909,-96.046210731424992 28.586980036018211,-96.032979113622659 28.589015683181284,-96.007533711461477 28.59970275682273,-95.986159544454679 28.60631857558586,-95.982088289576367 28.614461085342473,-95.98565064745685 28.621076904105603,-95.983106103295938 28.641942154390655,-95.97852589224803 28.650593590730978,-95.986065974637228 28.655467849280154,-95.996337701374344 28.658736120211515,-96.002953500413568 28.656191585912577,-96.006515878017979 28.648049056432036,-96.010005951759737 28.648641710656278,-96.010506546843942 28.648726717396318,-96.011440067305529 28.648885239790378,-96.014343010193883 28.649378192516537,-96.026200716522851 28.65139176594381,-96.03348799089656 28.652629228032097,-96.039323368019012 28.651170385770797,-96.047737442142406 28.649066870151618,-96.049244844336243 28.648218956037223,-96.052682972641108 28.646285007998213,-96.05836686193534 28.643087818836001,-96.072165030584017 28.635326345489485,-96.092812363862251 28.627145317384699,-96.098878916233431 28.624741586366319,-96.099137163186526 28.624639261986079,-96.099760206508392 28.62447226081035,-96.102639895829256 28.623700385909448,-96.141413249033207 28.613307536255487,-96.148501276515404 28.611407654045699,-96.187178316202875 28.593595864643298,-96.198374286842139 28.586980055742131,-96.221784081288092 28.580364246840958,-96.228908787187095 28.580873158631725,-96.233997875508891 28.596649310733014,-96.233997875508891 28.601738394123839,-96.222292978285921 28.607336389305434,-96.214150448805384 28.613443281484855,-96.212623728226021 28.62260364440889,-96.2309444244882 28.64143324753087,-96.208552463485731 28.662298487953962,-96.214659365527126 28.665351929112688,-96.192267404524671 28.68774389011514,-96.1912495908051 28.694359708878277,-96.195829762405154 28.698939880478335,-96.202445561444364 28.700975507917487,-96.208747675276499 28.700187749031503,-96.21684000834783 28.699176214258408,-96.221467818495611 28.69859774191346,-96.222801895007663 28.698430983480506,-96.223384071149837 28.698294,-96.224163927167865 28.698110503315906,-96.227000018566372 28.697443183508955,-96.229623268039219 28.696825944469072,-96.231453341209956 28.69639533631743,-96.233964222112746 28.695240331316239,-96.23422531976 28.695120226420762,-96.234426397558138 28.695027730650764,-96.243315632596989 28.690938683290845,-96.256898753233088 28.684690448956413,-96.263514562134276 28.683672635236839,-96.268603640594122 28.688761723558645,-96.287942160437836 28.68316371851509,-96.304227224329892 28.671458831154069,-96.305245042980445 28.660262850652849,-96.303866760710434 28.646480081370939,-96.303718312539132 28.644995605411349,-96.322902111893882 28.641863561491792,-96.322903115546453 28.641863397630402,-96.328654788116609 28.640924350533034,-96.373438710121519 28.626674919011112,-96.376492171004159 28.620059100247982,-96.384634680760783 28.615987845369677,-96.473693647496702 28.573239550803915,-96.48794308888057 28.569677192923439,-96.482854000558774 28.580364266564878,-96.480309456397848 28.596649335387912,-96.485907441717487 28.60784531588914,-96.490487633041468 28.610898766909834,-96.510843966604781 28.614970031650095,-96.510335069606953 28.617514575811001,-96.497612348802434 28.625148188569788,-96.496594535082863 28.630746183751381,-96.49964797624159 28.635835272073191,-96.506263795004728 28.638379806372129,-96.513590449607946 28.639711925390898,-96.518002756430107 28.640514162994929,-96.524548246905439 28.641704252172264,-96.541744210187403 28.644830790950802,-96.545449731689985 28.645504522133091,-96.555118991611849 28.64601343885484,-96.5632615210924 28.64448670841351,-96.564664053901609 28.647882315216158,-96.572092291837293 28.665866475800886,-96.572930781014264 28.667896502859467,-96.570386236853366 28.674003385176928,-96.559190266214102 28.687235002979271,-96.559699163211917 28.6913062775815,-96.561225893653244 28.696395346179383,-96.566823878972883 28.697922096344637,-96.575158129308363 28.702846874961025,-96.578019859474111 28.704537895383844,-96.57828826199534 28.705826226653553,-96.579938546079447 28.713747585140421,-96.580564403635009 28.716751699466613,-96.584126761515478 28.722858581784067,-96.584439828543964 28.722940967911413,-96.591359183115401 28.724761852179114,-96.593796021437342 28.725403125944972,-96.611342043876562 28.720366765465901,-96.616906294097589 28.718769618875786,-96.625254999999996 28.716373230030175,-96.632357663078409 28.714334501780041,-96.638120426114043 28.71268037463507,-96.643733366943522 28.711069252030907,-96.64589364157122 28.710449172933409,-96.648758110223909 28.709626963981723,-96.65548660082564 28.704200766225345,-96.664534272187169 28.696904262901135,-96.657918463285995 28.687743919701024,-96.642136214348383 28.67476740345478,-96.635017595423747 28.668914316579048,-96.634564255386636 28.662567599984854,-96.634358790297441 28.659691108644115,-96.634304719917793 28.658934128568227,-96.633999771842213 28.654664885057134,-96.627892869800831 28.650084693733149,-96.626425176648581 28.649921620227584,-96.623312698200763 28.64957579673532,-96.621378075676532 28.648286046719594,-96.615940371111847 28.64466090565978,-96.615679075580019 28.64448670841351,-96.614055987266909 28.642701311583636,-96.613585709918453 28.642184006591457,-96.613038272810982 28.641581825879328,-96.612716570908134 28.641227953848528,-96.611999586497333 28.640439271135588,-96.610589997120172 28.638888723093881,-96.610589997120172 28.638695619081329,-96.610589997120172 28.63634418879494,-96.61975034032028 28.62769274259265,-96.620390401117646 28.626519297452973,-96.620672695530928 28.626001757543317,-96.621575870071126 28.624345937066781,-96.622336527533278 28.62295139797671,-96.622803791340985 28.622094747411062,-96.621924089240224 28.619379144726071,-96.621515564809087 28.618118047314677,-96.621338841511317 28.617572510068054,-96.620571817957583 28.61520474122884,-96.620437729127232 28.614790814755992,-96.617253050911174 28.604959849584038,-96.615239196090883 28.598743166058551,-96.614649885719274 28.596923990196654,-96.613008078443599 28.591855801497097,-96.611528402529856 28.587288105363601,-96.611113505533794 28.586007336117376,-96.611098903979951 28.585962261746474,-96.608298572876635 28.583628658523324,-96.608045443097311 28.583417717585569,-96.607377235577218 28.583437664220053,-96.600365219155734 28.58364697962633,-96.593251058093557 28.583859344147964,-96.573948594733835 28.584435541167107,-96.565297148531556 28.582399903865994,-96.564279334811971 28.57629300182461,-96.563658896232639 28.575155527088082,-96.562968608029692 28.573889994257026,-96.561225893653244 28.570695006643017,-96.557566061723506 28.569051817003789,-96.543745727976315 28.562846769979732,-96.536289388489891 28.559499026141786,-96.535271536438941 28.559346348925885,-96.526111211846271 28.557972305562419,-96.524846286909124 28.55686549700842,-96.523547686998668 28.555729222873186,-96.522039937244045 28.554409942750958,-96.516783301381025 28.541093122164042,-96.514406314623301 28.535071417976255,-96.512075206364955 28.532603188828926,-96.505754868421008 28.525911074776143,-96.496773944100411 28.520225902118948,-96.493684489370622 28.518270192113103,-96.482894459981281 28.511439806078794,-96.464303363514816 28.49967112954555,-96.450283853050735 28.49079639296917,-96.41974938229167 28.46738661824714,-96.410828816467941 28.459457253614527,-96.410588999643707 28.459244083835621,-96.409758652296418 28.458206146634446,-96.408886828651134 28.457116363910039,-96.40506625078595 28.452340627696451,-96.402446489887097 28.449065917053971,-96.402758256176753 28.447714917044181,-96.403973200604497 28.442450108152798,-96.407195206365273 28.441281062045864,-96.417343901660857 28.437598792799108,-96.461479843413926 28.421584870195201,-96.476120924474287 28.411702150055138,-96.481836236149007 28.407844318412668,-96.504737094149291 28.397666161492985,-96.511137484289378 28.396220910815867,-96.520513236388609 28.394103803612502,-96.534249520963641 28.388796609353736,-96.542905217114992 28.385452367272176,-96.559699173073881 28.377818734789468,-96.57038624671533 28.368658381727396,-96.577905378446388 28.364719789411506,-96.5917603939982 28.357462401226169,-96.600411840200493 28.354408960067438,-96.650793747525029 28.34677533744669,-96.672676831253582 28.335579347083499,-96.688452973492915 28.347284234444516,-96.694559875534281 28.347284234444516,-96.698122233414779 28.342704062844462,-96.705246949175717 28.348810964885843,-96.700157860853906 28.369676195446971,-96.705755865897487 28.400210705653887,-96.710336037497541 28.406826524417021,-96.710425531143088 28.406841439843959,-96.711757514930511 28.407063434453107,-96.711949596522956 28.407095447664108,-96.71209813364915 28.407120203551969,-96.7125191933293 28.40719037931537,-96.712878460543081 28.407250256459115,-96.722549831718325 28.408862132132249,-96.749013067323034 28.408862132132249,-96.762244685125353 28.411915593014903,-96.76554491144303 28.411090543097366,-96.768351577304784 28.410388882297497,-96.775985199925543 28.405808690973519,-96.777118787058129 28.404067826336821,-96.778115367638478 28.402537364460464,-96.780337941159374 28.399124129135416,-96.780820705165937 28.398382742114745,-96.790234641309425 28.383925636830853,-96.794392274787313 28.366371177405831,-96.794814812909479 28.364587126849088,-96.794810066932399 28.364444747076842,-96.79477772408616 28.363474458555832,-96.794305906049686 28.349319871745632,-96.794064195689629 28.347593374049037,-96.792754716842737 28.338239980125699,-96.790743538307225 28.323874459722486,-96.791161640090152 28.319066463411133,-96.791737095961722 28.312448960638157,-96.791761391474679 28.312169572361466,-96.791798306096766 28.312130020933203,-96.806010803272656 28.29690232711997,-96.809573161153153 28.290286508356836,-96.806010803272656 28.282143978876302,-96.799480493673911 28.2729662335258,-96.799349781293685 28.272782529381054,-96.787181219874626 28.255680743271615,-96.787181219874626 28.250082757951983,-96.800412817953031 28.224128419345121,-96.810027933605966 28.21709297064087,-96.81015126416365 28.217002728792142,-96.823379937963566 28.207323213817581,-96.836184503007971 28.197954022244446,-96.84100213695676 28.194428925121734,-96.842143298799229 28.193593928862132,-96.847274602334139 28.190686192954498,-96.857267971405633 28.185023289193378,-96.872677809006134 28.176291056181483,-96.877474270970822 28.171878306563691,-96.886067200578026 28.1639728030657,-96.898123211167331 28.152881261735526,-96.906497631141988 28.149042991548708,-96.910337015250093 28.147283276415891,-96.926704620510804 28.131597659113019,-96.934764623415617 28.123873491831901,-96.962356663895278 28.123371819605953,-96.962754569737697 28.123364584972112,-96.979717515560068 28.129783000626698,-96.995398793779131 28.135716460690723,-97.000413785843605 28.137614026355994,-97.007520616950742 28.136091128354632,-97.007538501604586 28.136087295914667,-97.009222611239821 28.135094102666635,-97.00939982996681 28.134989589017771,-97.027385928308092 28.12438239869169,-97.028912648887456 28.117257682930727,-97.025203084589847 28.111384210119862,-97.023365428929196 28.108474590635566,-97.022805746846075 28.107588427939849,-97.02290356380766 28.107197159145706,-97.023379876854563 28.105291902342927,-97.02382356056566 28.10351716319958,-97.025496807419856 28.101530180660298,-97.031966099908146 28.09384788848477,-97.033883146887263 28.088918342142531,-97.035528457788629 28.084687545284659,-97.035528457788629 28.083043098067591,-97.035528457788629 28.081818766572983,-97.035528457788629 28.074000471643224,-97.033022532693735 28.061470870449408,-97.032801767679686 28.060367047518316,-97.031459273912688 28.053654591691117,-97.031457183186404 28.053644138079921,-97.025859197866765 28.041939250718904,-97.030948266464648 28.033287814378582,-97.03239348781301 28.032603236465789,-97.040617526386512 28.028707642778524,-97.041168915404441 28.028259640036232,-97.046718327422383 28.023750751173218,-97.048760075590963 28.022091833877354,-97.050263648357429 28.019142519014494,-97.059727497080047 28.000578821719444,-97.061991693393324 27.99613751499442,-97.06790259446116 27.99219690579767,-97.073772658186698 27.988283521554418,-97.075732208193486 27.986977152070377,-97.083740513918784 27.975854507337193,-97.090858162154831 27.965968886660271,-97.094600599978094 27.960771057335059,-97.101378519421061 27.951357282114685,-97.101544336287489 27.951126980954953,-97.101629253046639 27.951009041034034,-97.112670327945679 27.935674217691009,-97.118292397880069 27.927865788706086,-97.121533983365822 27.923363587495643,-97.122089895488358 27.923104160785101,-97.123659587861624 27.92237163470331,-97.129167576400675 27.91980122961516,-97.134800331352182 27.902469771509406,-97.13578341488774 27.899444915775788,-97.139044920333077 27.897526377912126,-97.141761509630356 27.895928379836029,-97.144434841366106 27.894355827453982,-97.155121915007527 27.880615312653809,-97.156735458496229 27.877916799393841,-97.171211094589736 27.85370753808861,-97.17159000749372 27.853073838716419,-97.18273536107327 27.834434189625789,-97.184638591770963 27.831251199324921,-97.187183135931861 27.824126483563962,-97.18941247112663 27.823657146727278,-97.196852395853725 27.822090836400886,-97.201135366472329 27.822090836400886,-97.208766105658313 27.822090836400886,-97.209575096934316 27.822090836400886,-97.21103842611052 27.822356897891609,-97.21191517248603 27.822516307306422,-97.214117494684729 27.822916731993345,-97.215541825234411 27.823175702780983,-97.217387510601711 27.823511284007832,-97.220771087297493 27.824126483563962,-97.222189700736266 27.82464074101355,-97.223091414240102 27.824967618564596,-97.225175600069406 27.825723150734085,-97.225442194074731 27.826156365185522,-97.225555528799433 27.826340533769983,-97.225696025109201 27.826568839847944,-97.22598639723725 27.82704069367685,-97.227317456819009 27.829203661466853,-97.227317456819009 27.832884543697009,-97.227317456819009 27.832951908184537,-97.22711696094737 27.834288541284948,-97.22651425924083 27.838306534493725,-97.227537582741903 27.841230302974814,-97.228388390382094 27.843661171179477,-97.233100025453197 27.847817700825228,-97.234045759551762 27.848652012430087,-97.234511621821596 27.849062988727319,-97.238500481248579 27.854279199579018,-97.239439164419366 27.855506710708827,-97.241127420860792 27.857714434929608,-97.24139627838295 27.858969111470945,-97.242350826195675 27.863423696705052,-97.242654131578206 27.86483913096664,-97.243132066142749 27.865496290124597,-97.244364366034702 27.867190700237273,-97.250796680782656 27.876035121329831,-97.263010484865433 27.88010639593206,-97.267085449659064 27.88068852838779,-97.272090543185925 27.881403535150675,-97.273697558506882 27.881633106649463,-97.276628649874411 27.881144591421538,-97.283916343274228 27.879929975854907,-97.291452123510041 27.878674012482271,-97.291709327200167 27.878631145200583,-97.295071705789752 27.87807074876898,-97.29826066531912 27.876989746639367,-97.302276298241679 27.875628516526195,-97.30641171632756 27.874226681314273,-97.315889353880934 27.871013926092836,-97.325097299274915 27.867892591849294,-97.326845878314657 27.866807265961079,-97.334190606350404 27.862248465187459,-97.346213303335873 27.854786094892546,-97.354613966176373 27.849571885725148,-97.359768343966266 27.850509060182219,-97.360211961357962 27.850589719168646,-97.360654441244435 27.850290746360063,-97.363614400263117 27.848290774636723,-97.376904444631478 27.839311017562139,-97.379041564479934 27.837867018088055,-97.379057154646048 27.837837708581311,-97.379081675001302 27.837791610322164,-97.37968928125764 27.836649310776913,-97.391764280353456 27.813948316782309,-97.391812130016405 27.812975373996721,-97.391812459346511 27.812968677620422,-97.39203202611381 27.808504155006624,-97.392068018906713 27.807772301822137,-97.392095751995882 27.807208395884746,-97.393123788240075 27.786304999999999,-97.393168763213623 27.785390509210199,-97.393291005863816 27.782904909577571,-97.393142269808052 27.782564941361908,-97.39298939956177 27.782215523565412,-97.390949955785928 27.777553936582201,-97.390465068726371 27.776445623015572,-97.390185233729682 27.775805999999999,-97.389524844304646 27.774296538065283,-97.38835420640342 27.771620793596586,-97.388306220610531 27.771511111755789,-97.388011229692253 27.770836846624743,-97.38704242749894 27.768622441036733,-97.386166290102864 27.766619840754537,-97.385225495384532 27.765302728148875,-97.378862356737287 27.756394334042721,-97.375764970087644 27.752057992733249,-97.373069654276961 27.748284550598278,-97.368354500700462 27.741683335591173,-97.365855345900911 27.739779218033028,-97.354970329043653 27.731485873530172,-97.352272255056832 27.729430198526604,-97.34997871774064 27.727682741876539,-97.347507961666906 27.725800261438444,-97.346980343555629 27.725398266768138,-97.343485766084669 27.723942192633796,-97.323096068004702 27.715446484002907,-97.316445853072636 27.712675560756566,-97.312489136070184 27.711663774861414,-97.307771479065892 27.710457406346261,-97.30518751069485 27.709796650788128,-97.285725857752936 27.704820043684109,-97.259850586867117 27.698203387982087,-97.253955150197811 27.696695845323848,-97.254014647303208 27.696526337654994,-97.255455364792269 27.692421723465429,-97.259957004258851 27.67959652118169,-97.261636792970123 27.679316557300702,-97.26241778482418 27.679186392412099,-97.266063906300232 27.678578707462119,-97.266172011465457 27.678349884642419,-97.272736281666539 27.664455499360063,-97.273042341106247 27.663807672923248,-97.273584380560237 27.662660354976065,-97.276535709391737 27.656413369610792,-97.277059923980644 27.655303780997631,-97.278846463786479 27.651522268106756,-97.280071982275985 27.648928251476995,-97.280889132874719 27.647198614380269,-97.282300269490932 27.644211705671331,-97.282869528026779 27.64300677394548,-97.287959956150573 27.632232024058997,-97.288756326795195 27.630546371240786,-97.290370933329072 27.627128784125372,-97.290610159422798 27.626622421740255,-97.291264204229464 27.625238025568656,-97.291996439564016 27.623688125953898,-97.292910903535031 27.621752508687905,-97.293983233844585 27.619482740684056,-97.29528946695001 27.616717877953022,-97.296598377059297 27.613947348891728,-97.297587499071795 27.609496333379006,-97.298634024222366 27.60478700569162,-97.29761621050281 27.598680093788271,-97.294053852622326 27.594099922188217,-97.294182769084571 27.593971005725969,-97.300049926927869 27.588103847882682,-97.302196382102863 27.585957392707677,-97.311120578488044 27.579146819865922,-97.321534901946578 27.571199044464009,-97.325080504595888 27.561034984604785,-97.336802147188081 27.527432946040641,-97.343417965951204 27.517763686118776,-97.347489240553443 27.503005347737066,-97.350542661988243 27.478577729709574,-97.359194108190536 27.458221396146271,-97.365809926953673 27.450587783387487,-97.371916828995055 27.425142361502377,-97.369881181831957 27.412419660421783,-97.372934622990698 27.401223670058592,-97.379550422029908 27.390027689557368,-97.399397858595393 27.344734850830708,-97.401942402756291 27.335574497768633,-97.404995863638931 27.329976512448997,-97.413138393119482 27.321325066246711,-97.42026310888042 27.317253791644482,-97.430441285524054 27.313691423902039,-97.450797599363412 27.313691423902039,-97.482858840011673 27.297915271800758,-97.508304242172855 27.275014394076553,-97.532222933616623 27.278576761818989,-97.544436737699399 27.284174747138625,-97.546981281860297 27.290790556039799,-97.536803105216677 27.289263825598471,-97.526624948296998 27.291808369759369,-97.524589320857856 27.297915271800758,-97.51746460509689 27.305039987561717,-97.504741884292372 27.305039987561717,-97.498126085253162 27.308602345442196,-97.502706237129289 27.322342870104325,-97.499143898972747 27.327940855423961,-97.483876634007316 27.33862793892736,-97.483876634007316 27.351350640007954,-97.486930094889971 27.358984272490666,-97.501688443133645 27.366617904973374,-97.514411144214236 27.361528796927644,-97.520518046255617 27.352877370449281,-97.538329835658018 27.335574478044709,-97.570899973304094 27.315727061203152,-97.584131581244463 27.309620159161771,-97.609068086407831 27.285192570720163,-97.621790807212349 27.287228188297352,-97.63146005727225 27.286210384439741,-97.63654914066305 27.282139109837512,-97.636657939024673 27.281797172172649,-97.640111498543547 27.270943129336285,-97.639093679892994 27.253131339933887,-97.635022415152719 27.247024437892502,-97.628915513111338 27.242953173152234,-97.597363199046811 27.242444266292445,-97.5826048606651 27.240408628991332,-97.573953414462821 27.238881903480983,-97.56123071338223 27.232775006370584,-97.542910007258072 27.229212648490105,-97.520009129533875 27.231248285791217,-97.509830972614182 27.235319550531486,-97.503215153851045 27.23989972213154,-97.500161712692318 27.244479898662579,-97.485148876501881 27.25084127385778,-97.467082638600573 27.253640266517596,-97.45843119239828 27.259492710198106,-97.450288657986775 27.262546171080761,-97.424079880742951 27.264072891660124,-97.422298701802717 27.257711541119829,-97.434766954384401 27.202240525749552,-97.444945121166043 27.144733882940127,-97.443672849085587 27.116235010034327,-97.452324285425917 27.115217201245734,-97.455886653168363 27.110382571284802,-97.456650008527049 27.09969549764336,-97.46173908698691 27.095624227972113,-97.475479621510999 27.098423220631929,-97.480568699970846 27.102494490303176,-97.491510231973166 27.101222218222723,-97.495835955074313 27.09409750739275,-97.4932914109134 27.078066891999608,-97.477515248950155 27.066107546277717,-97.479041969529504 27.06279964182713,-97.482256963728076 27.061942305056665,-97.48693005051112 27.057710553505324,-97.487693415731783 27.053639288765055,-97.486675602012198 27.034809685643079,-97.477515248950141 27.032519589981089,-97.473952881207694 27.029211690461484,-97.473443984209865 27.022850330059228,-97.478300083716704 27.000269498406993,-97.478533072531675 26.999186101907302,-97.480568690108868 26.997659376396957,-97.483967678435022 27.000330000000002,-97.484131057851314 27.000458369056773,-97.492988547644813 27.000330000000002,-97.49889841702128 27.000244349959733,-97.533497176854453 26.999742920066073,-97.536803065768822 26.999695008767091,-97.549271318350492 26.995878197456715,-97.555378215460905 26.990280207206101,-97.551052502221722 26.980865400714134,-97.549525776711377 26.965343697111763,-97.552324769371197 26.95211208177491,-97.555378205598956 26.947277449348487,-97.555378205598956 26.938880461507075,-97.540874325578116 26.906310323861007,-97.540110950495503 26.900966796902246,-97.547999041339082 26.895114353221743,-97.552324764440229 26.888498544320569,-97.552324764440229 26.875332999999998,-97.552324764440229 26.873831771434514,-97.552324764440229 26.871753101924,-97.552324764440229 26.867633303897481,-97.555396527456509 26.865969429990074,-97.558431656619632 26.864325399446898,-97.558453748966258 26.864224239771101,-97.559853702000524 26.857813929560987,-97.562641307980527 26.845049630589628,-97.563266286580571 26.842187886943357,-97.552579212939136 26.827938454188693,-97.547744582978211 26.824630549738107,-97.537566416196555 26.824885004400745,-97.509830908511418 26.8035108521869,-97.48438549155729 26.763561555211936,-97.478024141017002 26.757200199740662,-97.471662790476714 26.758726925251008,-97.468609339456009 26.740915130917632,-97.467337057513589 26.710126182073765,-97.444945096511148 26.633535472850511,-97.445708451869848 26.609362327976836,-97.441206258760758 26.5999011976768,-97.435205432977895 26.587290766879221,-97.432741093635642 26.582112082834445,-97.429217375703914 26.574707168454967,-97.428151110966368 26.572466467229631,-97.418145193925739 26.555638334425574,-97.416955130465126 26.553636864107652,-97.41864075483771 26.543121778291471,-97.42039414733226 26.532183948458435,-97.422284917775215 26.520389141863415,-97.422298667285844 26.520303371102887,-97.425861015304378 26.516741008291426,-97.430695645265303 26.506562841509776,-97.430695645265303 26.494603495787885,-97.42802638225659 26.488322868889494,-97.42636993202612 26.484425333937217,-97.429168909893022 26.478063961207511,-97.43553026043331 26.470175880225888,-97.441382709044788 26.466613522345408,-97.441382709044788 26.455417541844177,-97.43756589773443 26.449819546662585,-97.425861005442428 26.446002740283195,-97.421026375481503 26.446766095641895,-97.417209564171131 26.449819546662585,-97.411611568989528 26.447275002501684,-97.412883841069984 26.433025580841726,-97.421789740702152 26.417249413947498,-97.419499649971158 26.413178149207234,-97.406013578738921 26.409106884466965,-97.398125502688274 26.410888063407203,-97.394308686446919 26.414450416356704,-97.395072051667569 26.417249413947498,-97.382484933201752 26.411326066613285,-97.377769169124974 26.409106884466965,-97.369626639644437 26.394602999515151,-97.374461259743413 26.38086247238753,-97.388965149626202 26.365849678110436,-97.392018610508856 26.339386444971247,-97.391000786927322 26.332261729210284,-97.38794734576858 26.330480545339064,-97.376242448545611 26.336332993950553,-97.372171183805335 26.339895346900054,-97.36937219114553 26.348546788171358,-97.358176200782339 26.356434874083959,-97.343417852538664 26.35923386920927,-97.342332537534404 26.358759043566288,-97.335275323058127 26.355671510096041,-97.335020017473738 26.355402767481841,-97.331108052904881 26.351284911668415,-97.330440693097202 26.350582427937965,-97.333762617526986 26.340749518544904,-97.336802038706509 26.331752819885011,-97.343786761143846 26.325987658774913,-97.344677525679145 26.325252425399061,-97.352414066956698 26.31886671611711,-97.352832659030639 26.318521211944631,-97.354359379610003 26.313941040344577,-97.348998828460125 26.312092573442666,-97.347821984790102 26.311686765063648,-97.346980205488165 26.311396496183672,-97.34736083223585 26.297503848546928,-97.347437236753805 26.2947151295396,-97.347489122209922 26.292821341560611,-97.347051378510429 26.289694600417153,-97.344137846000223 26.268883651035111,-97.343926764329439 26.267375924606483,-97.342629246748771 26.266550231912309,-97.341127771669619 26.265594748131736,-97.335282658907644 26.265594748131736,-97.331967408745584 26.265594748131736,-97.330307576264516 26.266747410222209,-97.323817586106017 26.271254350355399,-97.322807065545476 26.271956101137519,-97.313207351206557 26.273518846137112,-97.312102101648151 26.273698770576502,-97.311865543405119 26.273737280077761,-97.307030913444194 26.253126493084562,-97.308048727163751 26.249055213551365,-97.321280340035131 26.236078054109896,-97.321280340035131 26.228698889850026,-97.304486359421333 26.202490107675235,-97.296598288301666 26.200708923804015,-97.294817109361432 26.192311940893585,-97.296089381441874 26.182388227541828,-97.303096384204423 26.167373221160254,-97.305986772892751 26.161179530923267,-97.306776455083323 26.159487354748606,-97.300965235160419 26.149753561518516,-97.296881711355638 26.142913659244432,-97.296598288301666 26.14243892563589,-97.285549237329036 26.12861437636975,-97.28536038956149 26.128378090441405,-97.284582435540926 26.126454238998875,-97.282094393487881 26.120301403270393,-97.282839179410786 26.118439442973433,-97.28311220967295 26.117756868971455,-97.285501587752023 26.116923364107649,-97.294053737977038 26.113940052730097,-97.295071554162092 26.108342057548505,-97.292023254217796 26.105090538920617,-97.291924538345086 26.104985242032239,-97.291541272704407 26.104576425513905,-97.287190793518263 26.099935916255493,-97.286650074642992 26.099359149688052,-97.286603231473521 26.09930918366079,-97.283195451762182 26.095674220102872,-97.282639002190891 26.095080674133143,-97.282108002623801 26.094514274823585,-97.280435495761154 26.092730268223651,-97.279905974795895 26.09216544608875,-97.27980430522237 26.092056998587434,-97.27089841052117 26.086459003405839,-97.267086875013263 26.085485845069449,-97.24859983335169 26.080765747704277,-97.246979719077387 26.080352101364454,-97.229515030031649 26.08000965739204,-97.220290685310772 26.079828788368793,-97.208048240752987 26.079588741074772,-97.205005053278043 26.078666562185607,-97.199651252911579 26.077044196913871,-97.199152512570265 26.073220535461079,-97.199134106850465 26.073079425477676,-97.198725011196004 26.069943037351702,-97.198302051934135 26.066700361972018,-97.196018989165054 26.049196947106083,-97.195939794821285 26.0485897927724,-97.195071061587612 26.04192952989985,-97.204994779870347 26.030224637607851,-97.214918488291119 26.030733549398622,-97.224842206573854 26.027425644948035,-97.226114478654296 26.024372193927345,-97.219244211392265 25.99612778184791,-97.216954125592238 25.993837693582392,-97.208557137750816 25.991802058746771,-97.195834416946283 25.993074335758202,-97.174460269663413 26.000071824804216,-97.167208324722026 26.007069313850227,-97.162755377371425 26.014575709756024,-97.16262814819099 26.023481604457221,-97.172042954682937 26.044728528107019,-97.178658763584124 26.045491893327686,-97.182730028324386 26.053125515948434,-97.164981847348457 26.063876207878327,-97.152009000000007 26.062107999999998,-97.152012551274964 26.062039393270581,-97.15321 26.038906,-97.151921999999999 26.017652999999999,-97.14747181118706 25.985075937251509,-97.145567 25.971132,-97.146880999999993 25.969781,-97.146293999999997 25.955606,-97.147784999999985 25.953132,-97.156608000000006 25.949021999999999,-97.160293999999993 25.950243,-97.168198638692317 25.959262149012673,-97.178362000000007 25.962114,-97.187583000000004 25.958174,-97.206945000000005 25.960899,-97.214339285966162 25.960186817526893,-97.227626420907342 25.958907063854085,-97.229225999999997 25.958753000000002,-97.239867000000004 25.954974,-97.244841570811701 25.950784663302475,-97.248032999999992 25.948097,-97.255343503388133 25.949129556975723,-97.276707000000002 25.952147,-97.28138899999999 25.948036999999996,-97.277163000000002 25.935438,-97.284201820237172 25.935775045516863,-97.290083634347766 25.936056689174489,-97.293963761326751 25.936242484429805,-97.303601999999998 25.936703999999999,-97.316138101068788 25.931602038234757,-97.320560999999984 25.929801999999999,-97.324914000000007 25.924040999999999,-97.332235861490744 25.923541683060932,-97.33463605770983 25.923378000829199,-97.338346 25.923124999999999,-97.339310160867683 25.923294280152341,-97.350397999999998 25.925241,-97.367642000000004 25.915679999999998,-97.369283543255307 25.913688286645449,-97.373641276386991 25.908400972256459,-97.374430000000004 25.907443999999998,-97.372365000000002 25.905015999999996,-97.365976000000003 25.902446999999999,-97.365883578347024 25.900015396466173,-97.365521 25.890476,-97.364300486696564 25.885628504434479,-97.362421560218849 25.878165998501085,-97.360082000000006 25.868874000000002,-97.364783621478566 25.852096838905283,-97.36542 25.849826,-97.372864000000007 25.840116999999996,-97.394513000000003 25.837377,-97.422635999999997 25.840377999999998,-97.42853949246836 25.842912007889609,-97.434188204901034 25.845336654308195,-97.441181027463472 25.848338244915578,-97.445113000000006 25.850026,-97.445601387363794 25.851485440010176,-97.447179184935308 25.856200346812667,-97.448271000000005 25.859463000000002,-97.449172000000004 25.871677999999996,-97.452166849899044 25.875807172885114,-97.453724626189043 25.87795496921364,-97.454727000000005 25.879337,-97.45488774919265 25.879394304385261,-97.462586893331732 25.882138919861518,-97.468261999999982 25.884162,-97.468599721544905 25.884059457735212,-97.481532785459223 25.880132596436578,-97.486059999999995 25.878758,-97.490359999998347 25.879275544671589,-97.494739403174762 25.879802646248233,-97.496860999999996 25.880057999999998,-97.519591990380178 25.88590026892226,-97.521761999999995 25.886458,-97.52344767329889 25.891064017588189,-97.524375103029939 25.893598172727145,-97.528116959024402 25.903822606212749,-97.528119935206945 25.903830738482007,-97.52812430798204 25.903842686870224,-97.528627999999998 25.905218999999999,-97.528849446448064 25.906732522417784,-97.530321999999998 25.916796999999999,-97.530415259581318 25.916820899843632,-97.539878370214808 25.919246032588486,-97.542957 25.920034999999999,-97.545169999999999 25.923974999999999,-97.545468770003851 25.926387609575503,-97.545470694802859 25.92640315259677,-97.546397824784293 25.933889856891241,-97.546420999999995 25.934076999999998,-97.546611329705271 25.934141994258589,-97.555160182125618 25.937061277530951,-97.555378999999988 25.937135999999999,-97.555477252221124 25.937015705749829,-97.559364000000002 25.932257,-97.582565000000002 25.937856999999997,-97.580418999999992 25.945115999999995,-97.583044 25.955442999999999,-97.598043000000004 25.957556,-97.5981230356591 25.957681442330628,-97.607733999999994 25.972745,-97.60783562843973 25.973457509771446,-97.607844088251909 25.973516820913719,-97.608283 25.976593999999999,-97.609461531117333 25.977846566488182,-97.613191727531174 25.981811093986448,-97.613466053312663 25.982102652924251,-97.616041456343709 25.984839842874308,-97.624938181905222 25.994295461083137,-97.627225999999993 25.996727,-97.634804000000003 25.999508999999996,-97.635072411453706 25.99971613545971,-97.639164724998494 26.00287420951236,-97.642117661027001 26.005153015998879,-97.644011365977178 26.006614404624422,-97.643848619841975 26.01214811069886,-97.643707610985203 26.016942704231127,-97.649175518723894 26.021499311673544,-97.65096419129361 26.02118629315062,-97.659123404318109 26.019758427116106,-97.661326460130226 26.019372891335045,-97.66298585459532 26.019511685247039,-97.668297999999993 26.019955999999997,-97.669519566971061 26.021667429940447,-97.671350987084779 26.024233271429612,-97.671567999996611 26.024226704244594,-97.691453959129774 26.023624920821636,-97.697068999999999 26.023454999999998,-97.703247203861338 26.030308742132775,-97.706066818770353 26.031284762516545,-97.709294717923569 26.032402112038366,-97.711145328137576 26.033042707775564,-97.719920000000002 26.030837999999999,-97.723585926686539 26.030959832537771,-97.729354247932832 26.031151535557555,-97.735180242251758 26.031345155270547,-97.758837769919694 26.032131383932391,-97.76309059882324 26.033650253079866,-97.763351431657455 26.034258862745556,-97.76491324062286 26.037903081983409,-97.769788888528993 26.041344719068825,-97.770077387482857 26.041548365582649,-97.776788595669075 26.042443189872706,-97.779190602367677 26.042763456191249,-97.784050976575529 26.040637041739476,-97.789822674626535 26.0424596835391,-97.792252861730461 26.04428232533872,-97.793102878401371 26.047342389307317,-97.793537334820812 26.048906434437896,-97.794638769549053 26.052871604582215,-97.795290594138677 26.055218176136449,-97.801344 26.060016999999998,-97.803973303988229 26.059548218630308,-97.8082126910423 26.058792373859696,-97.819424117916668 26.056793476786609,-97.820997703829306 26.056512920501468,-97.825546000000003 26.055702,-97.826721102251625 26.055271667399982,-97.830409376527257 26.053920989485444,-97.836607999999984 26.051650999999996,-97.848759348822554 26.052295281844582,-97.85186756815483 26.052460084066457,-97.859824237628374 26.052881958029587,-97.860225497621784 26.05290323340671,-97.860503999999992 26.052917999999998,-97.861874999990562 26.053580848914272,-97.869705222636284 26.057366592615971,-97.871187000000006 26.058082999999996,-97.876982999999996 26.064482999999999,-97.886529999999993 26.066338999999999,-97.901546631929207 26.060958662441269,-97.905109129229899 26.05968224852101,-97.913882 26.056539,-97.935419999999993 26.052687999999996,-97.944344999999984 26.059620999999996,-97.950095000000005 26.061827999999998,-97.96210735288345 26.054793018383155,-97.96735799999999 26.051718,-97.971403108419892 26.054550391225565,-97.978769 26.059707999999997,-97.979877702655912 26.062937323324391,-97.981335 26.067181999999995,-98.010970999999998 26.063862999999998,-98.015122209308288 26.064471399070538,-98.026123959861238 26.06608380989196,-98.028288992822496 26.066401115993269,-98.028758999999994 26.066469999999999,-98.029241090705753 26.065867136858621,-98.033102 26.061039,-98.034402999999998 26.051375,-98.034479464439173 26.051215303797409,-98.034525269179767 26.051119640464091,-98.039238999999981 26.041274999999995,-98.054365285842039 26.044575736209502,-98.070020999999997 26.047992,-98.070022345126233 26.049160242153427,-98.070025 26.051466,-98.071425788568789 26.055027814897404,-98.076094939927231 26.066900165398668,-98.076139697069991 26.067013970337847,-98.076205751241318 26.067181927684643,-98.076543999999998 26.068041999999998,-98.076994427275579 26.068371469710563,-98.080289992888041 26.070782045417982,-98.080494999999999 26.070931999999999,-98.080906883185932 26.070920010911959,-98.084755 26.070808,-98.085506402845155 26.069709056167966,-98.085848999999982 26.069208,-98.085628527723046 26.069048386721494,-98.081567000000007 26.066108,-98.081855064865067 26.063941606819231,-98.081884000000002 26.063724,-98.082307152201508 26.063513440869801,-98.091037999999998 26.059169,-98.093593108176947 26.058759459973995,-98.094431999999998 26.058624999999996,-98.095078111969258 26.058956205325877,-98.096949561841043 26.059915534659098,-98.097643000000005 26.060270999999997,-98.105504999999994 26.067537000000002,-98.122952624574893 26.063250384797335,-98.12786358062813 26.062043837809401,-98.128331000000003 26.061928999999999,-98.142925292417388 26.051941751725515,-98.14645163947533 26.049528582072455,-98.146621999999994 26.049412,-98.146852932570667 26.049588146033326,-98.149462999999997 26.051579,-98.149462999999997 26.055813,-98.151730999999998 26.058187,-98.158277994458601 26.062311711597108,-98.16142849281799 26.064296576133319,-98.161911645017582 26.064600969774318,-98.167608590156348 26.068190136655492,-98.172071527808072 26.071001859012309,-98.177897000000002 26.074672,-98.179863281323136 26.072661506851002,-98.189059999999998 26.063257999999998,-98.191534000000004 26.057117999999999,-98.197046 26.056152999999998,-98.200871000000006 26.059161,-98.203328791159265 26.063523594334541,-98.204415309491765 26.065452171017675,-98.20496 26.066419,-98.205720285634712 26.066905180236589,-98.2057544964389 26.066927057036718,-98.220672999999991 26.076467,-98.228363119990576 26.077028417928002,-98.230097 26.077155,-98.231072909449267 26.07694353295701,-98.240214327563166 26.074962705064888,-98.248806000000002 26.073101,-98.250234708208026 26.074229377516481,-98.260964088277859 26.082703320039151,-98.264514000000005 26.085506999999996,-98.272091468517374 26.0934369782697,-98.272527821536428 26.09389363077193,-98.277218000000005 26.098801999999999,-98.277020629370639 26.099144109090908,-98.272932087266241 26.106230915405163,-98.272897999999998 26.10629,-98.272099931737145 26.106512924095771,-98.270258188934392 26.107027377392626,-98.270033999999995 26.107089999999999,-98.269661374787887 26.108231250649609,-98.268046405073434 26.113177467856264,-98.266755660647689 26.117130670341034,-98.265753950746401 26.120198637935399,-98.265698 26.12037,-98.266046753689267 26.120369439652073,-98.268388964369507 26.120365676386069,-98.271048543344023 26.120361403199535,-98.2713587738927 26.120360904747326,-98.279433560913844 26.12034793086255,-98.289509742149562 26.120331741306838,-98.296194999999997 26.120321,-98.299522999999979 26.11749,-98.299575546893735 26.117376878214852,-98.299577897643644 26.117371817572689,-98.299619756950364 26.117281703787395,-98.301477861619162 26.113281617347607,-98.302978999999993 26.110049999999998,-98.307788398559808 26.112633359128559,-98.31093219000293 26.114322040617914,-98.314784784069062 26.116391454064445,-98.31781148535309 26.118017240801439,-98.323055746360907 26.120834185452331,-98.323827999999992 26.121248999999995,-98.324165904650499 26.121735183484471,-98.335204000000004 26.137616999999999,-98.337914801547555 26.149187638321976,-98.338210450252006 26.150449569219312,-98.338419999999999 26.151344000000002,-98.338123748811455 26.151776768193923,-98.337139471603692 26.153214615149455,-98.336278203634194 26.154472768358826,-98.335109254490916 26.156180386856505,-98.334230366689056 26.157464279382136,-98.333315999999996 26.158799999999999,-98.333279392301918 26.159609030127591,-98.333194378655719 26.161487831708563,-98.333156000000002 26.162336,-98.33332593363771 26.162525092143447,-98.336569396995017 26.166134227137082,-98.336837000000003 26.166432,-98.337709251548077 26.166391430160555,-98.345513373134324 26.166028447761192,-98.345781000000002 26.166015999999999,-98.345955918391979 26.165759937155421,-98.34781294946896 26.163041431373035,-98.354645000000005 26.15304,-98.380009845764519 26.156864235849298,-98.386243919298991 26.157804141722139,-98.386694000000006 26.157872,-98.386714843024777 26.157901012682096,-98.387178289965661 26.158546112849205,-98.389418830831929 26.161664858836595,-98.394322667090904 26.168490808715738,-98.402249554153599 26.179524728065878,-98.404432999999997 26.182563999999999,-98.41082579547016 26.183537375155975,-98.418120000000002 26.184647999999999,-98.44253599999999 26.199151,-98.444302622216625 26.201317032456906,-98.444376000000005 26.201407,-98.444366742625562 26.201566115583965,-98.444174812576264 26.204865005795593,-98.443681770155465 26.213339409994948,-98.45054565332704 26.219516919037407,-98.450975699346984 26.219903961344286,-98.465077324681431 26.222335272645303,-98.467962758220992 26.221802674698019,-98.47639547470331 26.220246150374404,-98.481645999999998 26.219277000000002,-98.483269000000007 26.216439,-98.496684404575589 26.212853148677059,-98.500574513964963 26.213825676024403,-98.503492081872309 26.214798198660183,-98.504399410834864 26.216045775617395,-98.509275818143593 26.222750833698164,-98.509327236533252 26.222821533963195,-98.516621175147847 26.223550930651591,-98.520846190978133 26.222726536052498,-98.524733007990875 26.221968131567948,-98.526589565145571 26.221605875956907,-98.528323413163747 26.222421776495104,-98.535240999999999 26.225677,-98.538016739096946 26.231331135295655,-98.538505426714039 26.231595841236214,-98.543851889046309 26.23449184328507,-98.556093449912439 26.231976454911809,-98.561600478976516 26.23084487397777,-98.564343479612191 26.231667774301364,-98.575891642961039 26.235132223865481,-98.57618836327309 26.235221239973473,-98.581780384919284 26.243001439905978,-98.583095590242166 26.247416774401941,-98.585184223567666 26.254428618568909,-98.588002268837087 26.255070784392117,-98.599153999999999 26.257611999999998,-98.610401443364651 26.253223367217647,-98.613465000000005 26.252027999999999,-98.617434734670965 26.252082931217494,-98.618976176235122 26.252104260920568,-98.625299999997523 26.252191766854153,-98.626653663614832 26.252210498179227,-98.633391522135483 26.243617562727948,-98.63418 26.242612,-98.636673745354344 26.241784277127035,-98.654221000000007 26.235959999999999,-98.669397000000004 26.236319999999996,-98.675206000000003 26.239989,-98.678410535728389 26.244637915883345,-98.679041999999995 26.245553999999998,-98.678977427258005 26.246060764449961,-98.677766000000005 26.255568,-98.679196310064967 26.258571609080832,-98.681167000000002 26.262709999999998,-98.687156000000002 26.26512,-98.698855915315121 26.265619481498664,-98.707451416076225 26.272152066874316,-98.710601999999994 26.279018,-98.709170532219119 26.284185773270103,-98.710647239525585 26.288123668959596,-98.711233447604599 26.289686894290245,-98.722550749196131 26.295571625529284,-98.729196000000002 26.299026999999999,-98.73263614407044 26.29899082409209,-98.734613221934339 26.298970033513189,-98.745271658069271 26.303095890935232,-98.745297595683382 26.304159357241051,-98.745599830797417 26.316551278053844,-98.745615470637418 26.317192526042046,-98.748245116157776 26.32061106368975,-98.74905366960931 26.321662182706675,-98.754840366886953 26.324877004144408,-98.755242435754027 26.32510037501579,-98.766685638772316 26.325769085950686,-98.779858354339893 26.326538865087553,-98.779911999999996 26.326541999999996,-98.779946859358333 26.326559704051515,-98.789821999999987 26.331575,-98.796251999999996 26.349104,-98.797592059971961 26.356670995104565,-98.798210999999995 26.360166,-98.807348000000005 26.369420999999999,-98.808280016253249 26.369491024329768,-98.813413043374013 26.369876679389535,-98.81818280466733 26.370235041528161,-98.81932575812273 26.370320914010964,-98.824571000000006 26.370715,-98.828353477559162 26.367368473620303,-98.832909 26.363337999999999,-98.838554497099707 26.360957856802237,-98.842229804437778 26.359408346173527,-98.844057000000006 26.358637999999999,-98.847707 26.359594999999999,-98.853132332741467 26.364754198689674,-98.853414999999998 26.365023,-98.853852117327648 26.365076242531281,-98.854321671505204 26.365133435992636,-98.861354000000006 26.365989999999996,-98.861661690067152 26.365902494757481,-98.869113443480302 26.363783259984523,-98.874117355796216 26.362360176799562,-98.876164212939671 26.361778062685843,-98.882912762903771 26.359858814831277,-98.890964919192157 26.357568829017531,-98.895015448091129 26.359360408468842,-98.900432100164338 26.361756234493352,-98.900829697862818 26.361932094951143,-98.905559653818443 26.364024190108832,-98.91296803413384 26.372226331500926,-98.915344992389564 26.37485796579432,-98.921277034399395 26.381425588572444,-98.922831447878195 26.38166472803821,-98.923508557916591 26.381768898347495,-98.924925720775448 26.381986922427696,-98.926689551972586 26.38116380140492,-98.934437533628781 26.377548077521784,-98.937555770591459 26.376092900630621,-98.942046463189357 26.375531566775365,-98.950185820407469 26.380302920861933,-98.952073083609605 26.383491745197549,-98.952938578460817 26.384954133189183,-98.953327659277917 26.385611545667039,-98.958325183064531 26.394055638388448,-98.960041959595969 26.394835991082342,-98.96758721887106 26.398265653180793,-98.981979903868819 26.396488780147621,-98.98323657723455 26.396333635432413,-98.985344372930967 26.396073413984297,-98.99032130527651 26.395458978465552,-99.008003378826189 26.395458978465552,-99.014739404125635 26.398826987036053,-99.018845438188137 26.404005475794783,-99.021934999999999 26.407902,-99.025336792347318 26.409271761295809,-99.030462148109507 26.411335530401477,-99.031104888479149 26.411594335405351,-99.032315999999994 26.412082000000002,-99.033086386506682 26.412180127570064,-99.037216923343138 26.412706252494743,-99.039107 26.412946999999999,-99.039645291109963 26.412681959983438,-99.045466000000005 26.409815999999999,-99.053184999999999 26.402006,-99.062093000000004 26.397371,-99.082001999999989 26.396509999999996,-99.085125999999988 26.398782,-99.089412999999979 26.408099999999997,-99.092044248326658 26.410330707587079,-99.0977332288968 26.415153685331873,-99.099649490160544 26.416778244479925,-99.110855 26.426278,-99.113807999999992 26.434002,-99.110485406379198 26.436329519428725,-99.103082999999998 26.441514999999999,-99.097481906444941 26.458865277747179,-99.094712087984234 26.467445230774196,-99.091634999999997 26.476977000000002,-99.105030999999997 26.500335,-99.114051328117867 26.510193091438737,-99.123438026388797 26.520451579672599,-99.126618350727256 26.523927276756307,-99.127319211298612 26.524693229780183,-99.127781999999996 26.525199,-99.128040494672888 26.525242991472329,-99.131554903978838 26.52584108518932,-99.136510932879688 26.526684518463242,-99.143658999999985 26.527901,-99.157083944984777 26.532657279516766,-99.166741999999985 26.536078999999997,-99.170704 26.540316,-99.171403999999995 26.549848,-99.167459686682065 26.559874693319248,-99.167410000000004 26.560001,-99.168618869529794 26.566870928153797,-99.16946034016965 26.571652951934592,-99.178064000000006 26.620546999999998,-99.200522000000007 26.656442999999999,-99.209947999999997 26.693937999999999,-99.208906999999982 26.724761,-99.240022999999979 26.745850999999998,-99.242444000000006 26.788262,-99.243132825912184 26.78921716914337,-99.262208 26.815667999999999,-99.268613000000002 26.843212999999999,-99.274832961326339 26.850997131057774,-99.280470999999991 26.858053000000002,-99.295146000000003 26.86544,-99.316753000000006 26.865831,-99.328801222539823 26.879647723469141,-99.328900000000004 26.879760999999998,-99.328852280051947 26.879943529980665,-99.328653604395157 26.88070346927794,-99.326247644284351 26.88990632616278,-99.321819000000005 26.906846000000002,-99.324684000000005 26.915973,-99.337297000000007 26.922758999999999,-99.361143999999996 26.928920999999999,-99.367053999999996 26.929033999999998,-99.379148999999998 26.934489999999997,-99.388253000000006 26.944216999999998,-99.393748000000002 26.960730000000002,-99.390189000000007 26.966348,-99.377312000000003 26.973818999999999,-99.376593 26.977716999999998,-99.378434999999996 26.980034,-99.385448615007036 26.981891053234623,-99.387366999999998 26.982399,-99.403694000000002 26.997355999999996,-99.407320999999996 27.005808999999999,-99.415475999999998 27.017239999999997,-99.420446999999996 27.016567999999999,-99.429379999999981 27.010833000000002,-99.432154999999995 27.010698999999995,-99.438721 27.01463,-99.445682828533535 27.022104842939122,-99.446523999999997 27.023008,-99.446589518313687 27.0234513503828,-99.446929167151652 27.025749691622671,-99.446969999999979 27.026026000000002,-99.446787747918748 27.026353589968604,-99.444062000000002 27.031253,-99.443973 27.036457999999996,-99.447729715193731 27.048260380671568,-99.452315999999996 27.062668999999996,-99.450282 27.067705,-99.439210578806851 27.075275465844946,-99.434470000000005 27.078517000000002,-99.429209 27.090981999999997,-99.430274999999995 27.094871999999999,-99.437646 27.100442,-99.442122999999995 27.106839,-99.441108999999997 27.110041999999996,-99.433369999999982 27.119218,-99.430581000000004 27.126611999999998,-99.431354999999996 27.13758,-99.438264999999987 27.144791999999995,-99.439971 27.151071999999996,-99.437950999999998 27.154121,-99.42998399999999 27.159148999999999,-99.426616441133064 27.174998569551711,-99.42634799999999 27.176261999999998,-99.426389092127664 27.176475083747437,-99.428025433058153 27.184960350328335,-99.432794999999999 27.209693,-99.441928000000004 27.217984999999995,-99.442101400955139 27.218265584747954,-99.445237999999989 27.223341,-99.443121431464945 27.230753685991843,-99.441406999999998 27.236757999999998,-99.441548999999995 27.249919999999999,-99.452207395848959 27.263806782859465,-99.452390999999992 27.264046,-99.452635348600225 27.264144272092288,-99.454218033886534 27.264780796280988,-99.462735864984637 27.268206496624611,-99.463308999999981 27.268436999999995,-99.463731957038988 27.268231398925973,-99.480688 27.259988999999997,-99.487909999999999 27.260721,-99.492407 27.264118,-99.496069429210138 27.270723950024919,-99.496615000000006 27.271707999999997,-99.496412995851571 27.272119287725655,-99.490870463706145 27.283404082904614,-99.487572835142558 27.290118173493504,-99.487513000000007 27.29024,-99.487552182270463 27.290674424182523,-99.487937000000002 27.294941,-99.493651777311726 27.30231355132117,-99.494603999999995 27.303542,-99.494999311050705 27.30367917804087,-99.501697839297435 27.306003653868146,-99.502036000000004 27.306121,-99.50260564894451 27.305998370990778,-99.511531000000005 27.304076999999999,-99.522353224815092 27.304131436852781,-99.523657999999983 27.304137999999995,-99.527521386758664 27.305370598210363,-99.529216737576675 27.305911493159478,-99.529653999999994 27.306051,-99.533911450776046 27.310119063512179,-99.536090758332008 27.312201427353024,-99.536443000000006 27.312538,-99.537771000000006 27.316072999999996,-99.53137599999998 27.323809,-99.52136037329538 27.324774325824137,-99.521259999999998 27.324784,-99.520793197388144 27.325167862222077,-99.515101491997058 27.329848278790703,-99.509737777509301 27.334258981108004,-99.504836999999995 27.338289,-99.507830999999996 27.348637,-99.507785758525344 27.353517859091919,-99.507778999999999 27.354247,-99.505884699626023 27.358359262089539,-99.503847413823948 27.362781925614613,-99.502763417847504 27.36513512979511,-99.502013099315448 27.366763966750881,-99.499076000000002 27.373139999999999,-99.492143999999996 27.380516999999998,-99.488110785984318 27.408328989964531,-99.487887470616073 27.409868914391197,-99.487633320470721 27.411621467383494,-99.487521 27.412396,-99.487591555014376 27.412624523015491,-99.489856740583164 27.419961308946796,-99.495313182879073 27.437634363915539,-99.495699000000002 27.438884000000002,-99.495681276107845 27.439260342274874,-99.495103999999998 27.451518,-99.489866073767956 27.458841813736395,-99.48498035355378 27.465673163249864,-99.484933241276849 27.465739036942171,-99.483818999999997 27.467296999999995,-99.483170086267094 27.470026063960816,-99.480813109028745 27.479938539705284,-99.480418999999998 27.481595999999996,-99.480219000000005 27.485795999999997,-99.483519 27.491095999999999,-99.494943552274876 27.498766770813134,-99.497518999999997 27.500495999999998,-99.501722168778215 27.500229993495459,-99.502529258718056 27.500178915086504,-99.513319999999993 27.499496,-99.516119999999361 27.498282666666942,-99.519319999999979 27.496896,-99.525819999999982 27.496696,-99.528319999999994 27.498895999999998,-99.525855930815595 27.516294999999385,-99.525849791073696 27.516338353233991,-99.525316190784537 27.520106149807926,-99.523876376642917 27.530272798702207,-99.522431296340699 27.540476632400054,-99.521918999999997 27.544094,-99.518818999999993 27.553194,-99.514319 27.556994,-99.511118999999994 27.564493999999996,-99.512219000000002 27.568093999999995,-99.515978000000004 27.572130999999999,-99.51621006287597 27.572263354504685,-99.516956092136581 27.572688844074506,-99.522907946893667 27.576083418863931,-99.530137999999994 27.580207,-99.536560517954015 27.595669560441458,-99.539721999999998 27.603280999999999,-99.549741780062789 27.610632655019803,-99.554405160028892 27.614054243170667,-99.554950000000005 27.614453999999999,-99.555217670042637 27.614437037021997,-99.556811999999994 27.614335999999998,-99.559466999999998 27.609075999999998,-99.562869000000006 27.607264,-99.580005999999997 27.602250999999995,-99.584175941853502 27.603675176957196,-99.584843000000006 27.603902999999999,-99.584876722760043 27.604178863233781,-99.585148000000004 27.606397999999999,-99.578360965974085 27.610254799100861,-99.578159999999983 27.610368999999999,-99.578158133228257 27.610639131051315,-99.578098999999995 27.619195999999999,-99.584782000000004 27.622006999999996,-99.591372000000007 27.627464,-99.592626330929548 27.632690692534315,-99.594037999999998 27.638573,-99.596231000000003 27.639857999999997,-99.603532999999999 27.641991999999998,-99.612907806834755 27.638651258855042,-99.615318942915422 27.637792043123689,-99.624515000000002 27.634515,-99.625321999999997 27.631136999999999,-99.638929000000005 27.626757999999999,-99.654323999999988 27.629615999999999,-99.665948 27.635967999999998,-99.665422000000007 27.640274999999999,-99.660175716081199 27.644678795569117,-99.659499999999994 27.645246,-99.659300532255756 27.646059100049566,-99.658294999999995 27.650158,-99.661845 27.655753,-99.668942 27.659973999999998,-99.672015651285406 27.660163655087903,-99.685812999999982 27.661014999999999,-99.699355999999995 27.655417,-99.704600999999997 27.654953999999996,-99.711511000000002 27.658365,-99.721518999999986 27.666154999999996,-99.723715999999996 27.673328,-99.727277746539684 27.678262316066267,-99.732288643517421 27.685204233237535,-99.732448000000005 27.685424999999999,-99.732610774853441 27.685596448480599,-99.757538999999994 27.711853,-99.758533999999997 27.717071,-99.770740000000004 27.732133999999999,-99.774900999999986 27.73354,-99.785365999999996 27.730354999999999,-99.788844999999981 27.730718,-99.796341999999981 27.735586,-99.801651000000007 27.741771,-99.805670000000006 27.758687999999999,-99.813085999999998 27.773952,-99.817390803736785 27.775433523363962,-99.819091999999998 27.776019000000002,-99.822192999999999 27.766855,-99.825793000000004 27.764373999999997,-99.835127 27.762881,-99.841707999999997 27.766463999999999,-99.843346625073153 27.773142384459568,-99.844736999999981 27.778808999999999,-99.849281022020321 27.790032142335203,-99.850876999999997 27.793973999999999,-99.857944055165163 27.794214491272228,-99.870065999999994 27.794626999999998,-99.877441689362087 27.799278597548025,-99.877677000000006 27.799427,-99.877679299916537 27.799779028327777,-99.877693551047656 27.801960325692491,-99.877840000000006 27.824375999999997,-99.876677795668783 27.832975173255242,-99.876002999999997 27.837968,-99.877201999999997 27.842179000000002,-99.882014999999996 27.850391999999996,-99.89364999999998 27.856193,-99.901486000000006 27.864162,-99.904385000000005 27.875283999999997,-99.901231999999993 27.884405999999995,-99.894091000000003 27.892949999999999,-99.893456 27.899208000000002,-99.895827999999995 27.904177999999998,-99.900080000000003 27.912141999999999,-99.905861237749605 27.914081496997749,-99.917461000000003 27.917973,-99.925935042520848 27.927688375003317,-99.93714199999998 27.940536999999999,-99.938541 27.954059,-99.932160999999979 27.96771,-99.931811999999994 27.980967,-99.962768999999994 27.983536,-99.984922999999995 27.990729000000002,-99.991446999999994 27.99456,-99.998749958954292 28.00705628754028,-100.000278657311796 28.009672084008166,-100.008630999999994 28.023963999999999,-100.012838999999985 28.037203000000002,-100.014975394500183 28.048814882934586,-100.016570970484992 28.057487270710915,-100.017914000000005 28.064786999999999,-100.028724999999994 28.073118,-100.046108000000004 28.079067999999999,-100.053122999999985 28.08473,-100.056983000000002 28.094207,-100.05559599999998 28.101140999999998,-100.056492999999989 28.104185999999995,-100.064147158981442 28.110644603904401,-100.067651999999995 28.113602,-100.075474 28.124881999999999,-100.083393 28.144034999999999,-100.090288999999984 28.148312999999998,-100.119627999999992 28.155588000000002,-100.12658652988236 28.159659080291213,-100.141098 28.168149,-100.159890345070792 28.168159605160877,-100.160589999999999 28.16816,-100.1644540887186 28.169825181963088,-100.168437999999995 28.171541999999999,-100.173949604741296 28.178834844700365,-100.174413 28.179448,-100.17569869464343 28.180169771489844,-100.185693999999998 28.185780999999999,-100.195825662217615 28.189941498404405,-100.196499000000003 28.190218000000002,-100.19841872968675 28.190245400986015,-100.202449991411854 28.190302940621361,-100.208059000000006 28.190382999999997,-100.21208061434919 28.196473071951928,-100.212104999999994 28.196509999999996,-100.212111438897693 28.196576571978802,-100.212136678181992 28.196837521783539,-100.213449999999995 28.210415999999999,-100.217564999999993 28.226934,-100.220284000000007 28.232209999999995,-100.22363 28.235223999999995,-100.227575000000002 28.235856999999999,-100.246200000000002 28.234092,-100.251633999999996 28.236177,-100.261135590980771 28.244561246718906,-100.267604000000006 28.250268999999999,-100.280518 28.267969,-100.289383999999998 28.273491,-100.293468000000004 28.278475,-100.294296000000003 28.284381,-100.287553999999986 28.301093000000002,-100.286470999999992 28.312295999999996,-100.288638999999989 28.316977999999995,-100.314198000000005 28.345859,-100.317245999999997 28.357382,-100.320392999999996 28.362116999999998,-100.341869000000003 28.384952999999996,-100.344399999999979 28.389662,-100.34934096344108 28.4019924953441,-100.349585999999988 28.402603999999997,-100.349394820211828 28.402858691740477,-100.345766407828719 28.407692501181913,-100.343945000000005 28.410119000000002,-100.337058999999996 28.427150999999995,-100.336185999999998 28.430180999999997,-100.337474638078888 28.440402915586755,-100.337648113426326 28.441778981052359,-100.337796999999995 28.442959999999999,-100.338752462381066 28.444650728533539,-100.341532999999998 28.449570999999995,-100.350785999999999 28.459246,-100.353875644654778 28.461269551534915,-100.357498000000007 28.463642,-100.35795880406117 28.464220845064407,-100.358193534884933 28.464515705266944,-100.367961112704847 28.47678537623738,-100.368288000000007 28.477195999999999,-100.368051363629903 28.477598261305609,-100.365982000000002 28.481116,-100.356642877924983 28.482149981508559,-100.352234999999979 28.482638,-100.344180999999992 28.486249,-100.337140000000005 28.491728999999999,-100.33381399999999 28.499251999999998,-100.338517999999993 28.501833,-100.362147999999991 28.508399,-100.379079000000004 28.511638999999999,-100.388859999999994 28.515747999999995,-100.405057999999983 28.535779999999999,-100.411413999999994 28.551898999999999,-100.40430324537553 28.563833042228197,-100.397270000000006 28.575637,-100.396799999999999 28.580400999999998,-100.398385000000005 28.584883999999999,-100.403243426032972 28.586668145075244,-100.425819035320046 28.594958517689108,-100.429856 28.596440999999995,-100.431892715674053 28.597943579291371,-100.447320000000005 28.609324999999998,-100.448648000000006 28.616773999999999,-100.447280739633683 28.625703494601449,-100.445528999999993 28.637143999999996,-100.44560646842767 28.637394606891831,-100.447014715516048 28.641950223113035,-100.447091 28.642196999999999,-100.447325484276334 28.642184618041064,-100.447599559425257 28.642170145483281,-100.456522261830528 28.641698981546444,-100.462866000000005 28.641363999999999,-100.474494000000007 28.647071,-100.479445543783555 28.654922981332383,-100.479495071011698 28.655001519842354,-100.479635999999999 28.655225000000002,-100.481416494659797 28.655591917738484,-100.492493911747701 28.657874710783531,-100.493322226012125 28.658045406716248,-100.495863 28.658568999999996,-100.496129521434568 28.658770241190073,-100.500353999999987 28.661960000000004,-100.502122125123847 28.667202406240314,-100.505211969634487 28.676363647108229,-100.509438609439442 28.688895431533517,-100.510054999999994 28.690722999999995,-100.510127443340068 28.69126843161186,-100.510538898440004 28.694366309458967,-100.51077198772829 28.696121257064849,-100.511998000000006 28.705352,-100.511351260759739 28.706743032691019,-100.510646631791559 28.708258576930099,-100.509872363628347 28.709923903942272,-100.509406561254394 28.710925770365975,-100.508636802312012 28.712581398765199,-100.507069450532313 28.715952521820881,-100.506701000000007 28.716745000000003,-100.506745928327234 28.717920131927187,-100.506786973330165 28.718993692782757,-100.507152057645129 28.728542729239727,-100.507513721430456 28.738002299344281,-100.507590113222051 28.740000380261673,-100.507613000000006 28.740599,-100.507694735304739 28.740708529390524,-100.51442566685138 28.749728313832868,-100.519226000000003 28.756160999999999,-100.533017 28.763279999999998,-100.537772000000004 28.780775999999996,-100.534846642084489 28.786410367511117,-100.532431000000003 28.791062999999998,-100.535830000000004 28.805887999999999,-100.546431879116881 28.824270186264151,-100.546968759195195 28.825201061771438,-100.547323999999989 28.825817,-100.548186025546428 28.826178082695296,-100.553129999999982 28.828249,-100.561442999999997 28.829174000000002,-100.570509999999999 28.826317,-100.574698999999995 28.828786999999998,-100.576846000000003 28.836168000000004,-100.572991999999999 28.848463999999996,-100.580501999999996 28.856007999999999,-100.591040000000007 28.863054000000002,-100.598061272695219 28.874286065303028,-100.598877000000002 28.875590999999996,-100.602654 28.887660000000004,-100.602394435759351 28.893839359355621,-100.602053999999995 28.901944,-100.615584686670886 28.902906942475386,-100.627205999999987 28.903734,-100.631611000000007 28.902838999999997,-100.633502414453218 28.905240591668694,-100.640568000000002 28.914211999999999,-100.639169999999979 28.916288999999999,-100.638857000000002 28.927621999999996,-100.651511999999997 28.943431999999998,-100.64789859018552 28.954344193790252,-100.646992999999995 28.957078999999997,-100.646600907687997 28.967547400926616,-100.64647463428885 28.970918751315974,-100.645893999999998 28.986421,-100.647406325643686 28.99295674936236,-100.647835962928511 28.994813493392339,-100.648681241069511 28.998466493719445,-100.65094599999999 29.008254000000004,-100.653757999999996 29.015356,-100.656109999999998 29.017223999999999,-100.660207999999997 29.031497000000002,-100.663212 29.048041999999995,-100.662508000000003 29.058106999999996,-100.664064999999994 29.073205999999999,-100.666359117032755 29.07896154562156,-100.668483863047285 29.084292168447689,-100.674655999999999 29.099777000000003,-100.684472 29.110657,-100.692326999999992 29.115227999999995,-100.70996599999998 29.119684000000003,-100.727461999999989 29.129122999999996,-100.737795000000006 29.139078999999999,-100.739115999999996 29.141658,-100.737590999999995 29.147406999999998,-100.739681000000004 29.150486000000004,-100.746139999999997 29.154149000000004,-100.752330696165359 29.155516457617566,-100.759726 29.157149999999998,-100.76337082361762 29.160348915845475,-100.772648999999987 29.168492,-100.775904999999995 29.173344,-100.772154104961558 29.17809434863841,-100.766030999999998 29.185848999999997,-100.767059000000003 29.195287,-100.768348510582513 29.197581465531123,-100.775064591152173 29.209531592641572,-100.785521000000003 29.228136999999997,-100.791371999999996 29.225944999999999,-100.795681000000002 29.227729999999998,-100.79704599999998 29.235585999999998,-100.795234211471239 29.241421249558652,-100.795010188783237 29.242142762180318,-100.794911999999997 29.242459,-100.795310930062826 29.24310735172228,-100.797670999999994 29.246943000000002,-100.805332448258866 29.251327106905226,-100.815767091023289 29.257298117587734,-100.823532999999998 29.261742000000002,-100.834039999999987 29.261399999999998,-100.839016 29.263259,-100.841581161127962 29.265429071012271,-100.848663999999999 29.271420999999997,-100.856469000000004 29.275663999999999,-100.864659000000003 29.276076,-100.874739696506666 29.279181633366278,-100.876048999999995 29.279585,-100.876625364221198 29.280115401513385,-100.878513170701353 29.281852663087207,-100.878882999999988 29.282193000000003,-100.879105716359817 29.283377353454046,-100.880504361011205 29.290815018226784,-100.882051999999987 29.299044999999996,-100.886842 29.307848,-100.895590728097048 29.309871687341737,-100.904835000000006 29.31201,-100.906461302333199 29.313095095005444,-100.914770068080642 29.318638836799305,-100.916744062319239 29.319955917421627,-100.92203960930695 29.323489191321695,-100.922232587658954 29.323617949573855,-100.924041970395777 29.324825198761538,-100.926468967605715 29.326444530233299,-100.926628772437255 29.326551154580446,-100.926677999999981 29.326584,-100.92692137104487 29.32669794102517,-100.927819078352698 29.327118228044156,-100.92782883100196 29.32712279402223,-100.930446231588661 29.328348203997709,-100.940614999999994 29.333109,-100.941560773525751 29.336361493535293,-100.943196 29.341985,-100.945807189162338 29.344363370184055,-100.948971999999998 29.347245999999998,-100.95603875001359 29.347290187325033,-100.964324999999988 29.347342,-100.971743000000004 29.351370999999997,-100.972915999999998 29.354545000000005,-100.995606999999993 29.363403000000005,-101.004206999999994 29.364771999999999,-101.010614000000004 29.368669,-101.010768998319776 29.36895846820963,-101.014103165002794 29.375185214807839,-101.024016000000003 29.393697999999997,-101.036603999999997 29.406107999999996,-101.038600000000002 29.410713999999999,-101.037642000000005 29.414681000000002,-101.043363999999997 29.42988,-101.056956999999983 29.440773,-101.06011415724447 29.458454662113137,-101.060150999999991 29.458660999999999,-101.063843258270609 29.460131584976065,-101.087148999999997 29.469414,-101.103699000000006 29.470549999999999,-101.115253999999993 29.468458999999996,-101.130037999999985 29.47842,-101.137502999999995 29.473541999999998,-101.144336999999993 29.473246,-101.151876999999999 29.477004999999998,-101.163854997623304 29.493316894569897,-101.168923969306405 29.50021992913986,-101.171662999999995 29.503950000000003,-101.173821000000004 29.514566000000002,-101.192719999999994 29.520285,-101.227418999999998 29.522349999999996,-101.235274999999987 29.524854,-101.254895000000005 29.520341999999996,-101.260836999999981 29.529933,-101.261174999999994 29.536777,-101.252755240314642 29.553001111955531,-101.244355179006547 29.569187266927752,-101.24384013276574 29.574337712700849,-101.242022713082847 29.59251185083151,-101.251352546644355 29.604174135250076,-101.252152766968493 29.604494220898598,-101.259127443101093 29.607284069726152,-101.265347312053251 29.607284069726152,-101.274677145614746 29.602619152945408,-101.277624046978673 29.599940160672645,-101.283229510623855 29.594844301688571,-101.297224215766221 29.587069435365102,-101.30733154801338 29.587846934050759,-101.312894947857018 29.594028488101586,-101.314328915651188 29.595621785307589,-101.313192213312618 29.602947206633093,-101.31110792457288 29.616379301091623,-101.30733154801338 29.640715970810437,-101.311218981175116 29.64849082206727,-101.316661381574889 29.655488204771718,-101.325213716450733 29.657820655628775,-101.350093282659174 29.654710721152696,-101.353062961800887 29.655502634567405,-101.361755552011104 29.657820655628775,-101.364595571422868 29.66106639883844,-101.367197952410862 29.664040554714198,-101.371300910394638 29.676075888592084,-101.372874548462477 29.680691889931673,-101.378860251896057 29.698249939417508,-101.396947999999995 29.713947,-101.398362000000006 29.717000000000002,-101.396293999999997 29.727055,-101.397008999999997 29.733962999999999,-101.400635999999992 29.738078999999999,-101.410024000000007 29.741498,-101.415583999999996 29.746534,-101.415509877418046 29.750619769974676,-101.415402087456428 29.756561346443686,-101.424731921017937 29.758116313681725,-101.430388403484372 29.756500180308258,-101.441059122217254 29.75345141196761,-101.446501522617027 29.755006409338922,-101.451652003139955 29.758440048234313,-101.453498905321467 29.759671311053037,-101.455223999999987 29.771874,-101.467493655663716 29.779885945414083,-101.475268506920557 29.780663444099741,-101.503223000000006 29.764581999999997,-101.522695143280473 29.759671311053037,-101.526552276219391 29.761451532447605,-101.532802460460985 29.764336242900427,-101.53746737724174 29.782995910023434,-101.53804719015173 29.783865628452077,-101.546797210803248 29.796990645299058,-101.56156944476453 29.794658179375361,-101.572592853930203 29.778735448896484,-101.575564187573463 29.774443514881042,-101.582561562744587 29.771333610538232,-101.598573641854728 29.773657690388074,-101.603680999999995 29.774398999999999,-101.607256216824311 29.773863608191139,-101.625957999999997 29.771063000000002,-101.630319 29.768729,-101.632632680380155 29.763891873249722,-101.63512799999998 29.758675,-101.646417999999997 29.754303999999998,-101.652400999999983 29.758794999999996,-101.65328091488901 29.761368862201802,-101.654578 29.765162999999998,-101.662452999999985 29.77128,-101.689992000000004 29.771212999999996,-101.706636000000003 29.762736999999998,-101.714223999999987 29.767659999999999,-101.735201999999987 29.771591999999998,-101.754322999999999 29.777661999999999,-101.760919284561496 29.782457957985276,-101.763273999999981 29.784169999999996,-101.776796131253491 29.789191504347542,-101.777161000000007 29.789327,-101.777360180704861 29.789301830227139,-101.785668 29.788251999999996,-101.791002820423358 29.783037559970925,-101.796869557069002 29.782618516634159,-101.806507764952315 29.786389987871868,-101.809441149516488 29.790161459109573,-101.813855730843954 29.79253854440006,-101.814888826583982 29.793094827432377,-101.818909248247508 29.792167038125061,-101.830044431332681 29.789597381341238,-101.831231874027822 29.789323356194672,-101.852603555202364 29.801894932400803,-101.862241763085706 29.800218726571018,-101.866487373818487 29.79821962567333,-101.875399999999985 29.794022999999999,-101.878152615094365 29.794637055896249,-101.892739000000006 29.797891,-101.912406000000004 29.797849999999997,-101.917556726002999 29.792675767854249,-101.917942403066036 29.792482929945557,-101.922585359733716 29.790161459109573,-101.929709258872364 29.789323356194672,-101.932572380438657 29.791613852338052,-101.938090312383324 29.796028195755184,-101.946471365894325 29.797704401584976,-101.952535620779244 29.796990962273608,-101.953595265032959 29.796866298670082,-101.959462001678588 29.799380623656123,-101.965427194081556 29.806464275410743,-101.966166845299441 29.8073426094683,-101.970357372054934 29.81027599403247,-101.974547898810414 29.81027599403247,-101.982165144097308 29.804870201524977,-101.987538526473998 29.801056829485908,-101.993568005272067 29.802652866652032,-102.001318622543394 29.804704498914084,-102.001786318660763 29.804828300723614,-102.021918999999997 29.802490999999996,-102.032489182844799 29.803756293694118,-102.034758999999994 29.804027999999999,-102.039012999999997 29.802655,-102.041088000000002 29.799609999999998,-102.038411999999994 29.792831999999997,-102.039226999999997 29.790977000000002,-102.041308736499772 29.78984019520162,-102.048982832584102 29.785649487466547,-102.050044 29.785069999999997,-102.053123037129694 29.785312127485501,-102.073645999999982 29.786926,-102.076299925656656 29.790865308882584,-102.077348 29.792421,-102.084438999999989 29.794962000000002,-102.091420021879856 29.792967151942147,-102.091815999999994 29.792853999999995,-102.098789196918744 29.792718427915432,-102.115682000000007 29.792389999999997,-102.142325999999997 29.802854,-102.159600999999995 29.814355999999997,-102.161673999999991 29.819486999999999,-102.181894 29.846033999999996,-102.182859740836193 29.846584944255238,-102.18326563789924 29.846816503951921,-102.184058205433814 29.847268654791659,-102.186149999999998 29.848461999999998,-102.187393471220204 29.848699156882201,-102.188384798592551 29.848888224473839,-102.188671999999997 29.848942999999998,-102.189026115519184 29.848805138880103,-102.189342793483831 29.848681852617602,-102.205381000000003 29.842438,-102.216284162639099 29.842976962035557,-102.227553 29.843533999999995,-102.261388999999994 29.853283,-102.264041000000006 29.855964,-102.261776999999995 29.864001999999999,-102.264954000000003 29.867805999999998,-102.268816999999984 29.867990999999996,-102.276754999999994 29.862977999999998,-102.281249000000003 29.863116999999999,-102.297330999999986 29.875194,-102.301381000000006 29.877673999999995,-102.315388999999996 29.879919999999998,-102.320618999999994 29.878979999999995,-102.320667125014978 29.878900015386019,-102.320698585434869 29.878847727619664,-102.324634000000003 29.872306999999996,-102.333383999999995 29.868046,-102.341032999999996 29.869305000000004,-102.349861000000004 29.862316999999997,-102.361383773688715 29.849029038788231,-102.364542 29.845386999999995,-102.363642671554629 29.839963091609825,-102.362514000000004 29.833155999999995,-102.369522000000003 29.820395,-102.377253999999994 29.800163,-102.377312999999987 29.789971,-102.385270832882995 29.770348713937391,-102.386677616883858 29.766879890389689,-102.391739211722737 29.765814289574276,-102.392906191083 29.765568609270456,-102.402175111261812 29.766775086101941,-102.412062000000006 29.768061999999997,-102.433301 29.776608,-102.460890018677347 29.77909171043791,-102.468946430597143 29.779816991558327,-102.469957868267898 29.780012383523857,-102.481595292961757 29.782260529257879,-102.490330613701886 29.783948039559665,-102.492674483475767 29.783853017496881,-102.508312776666344 29.783219030534834,-102.508509848222559 29.783087649355906,-102.512686811979108 29.780303003853621,-102.512942156326147 29.774953626291172,-102.513380999999995 29.76576,-102.526400256170959 29.758693706517125,-102.535832205630967 29.753574449155192,-102.539417050278132 29.751628749336795,-102.545492105079163 29.750899740311965,-102.551081152293932 29.752357753652575,-102.556670813570321 29.757783010503054,-102.559343229460382 29.760376824671383,-102.565661280990938 29.761591836573395,-102.572255912443325 29.757095496286663,-102.57574472309652 29.754716761401177,-102.57635337725236 29.754301769870359,-102.585948674897452 29.751239442391949,-102.587774480184081 29.750656738873374,-102.597160000000002 29.751608,-102.612879000000007 29.748181999999996,-102.622534000000002 29.736632,-102.630150999999984 29.734314999999999,-102.64566499999998 29.733910000000002,-102.661251958261417 29.736122779697027,-102.66726872436665 29.739732837494621,-102.670971460158171 29.741954477821469,-102.677191937153026 29.738261067251376,-102.678467215476147 29.736427653943998,-102.6852530581628 29.72667193704833,-102.688163999999986 29.722486999999997,-102.690237999999979 29.707481999999999,-102.695507594622001 29.699754690880447,-102.698346999999984 29.695590999999997,-102.699316999999994 29.685029,-102.693466 29.676507,-102.697798916570122 29.672550546488289,-102.711337549653422 29.6601882100483,-102.724231000000003 29.648415000000004,-102.736947999999984 29.641537999999997,-102.742030999999997 29.632142000000002,-102.74048425929719 29.62775763619268,-102.738427999999999 29.621928999999998,-102.739991000000003 29.599041,-102.746201999999997 29.592875000000003,-102.757065999999995 29.597798999999998,-102.761810999999994 29.598396999999999,-102.768340999999992 29.594733999999999,-102.766929734823805 29.591197739636346,-102.762241000000003 29.579448999999997,-102.766124000000005 29.572347999999998,-102.768792219428661 29.572598581791439,-102.773961 29.573084,-102.776343296957975 29.562015327831393,-102.777530999999996 29.556497,-102.77572499999998 29.552188999999995,-102.771428999999998 29.548545999999998,-102.79216136048494 29.533953841063816,-102.807296321997939 29.523301326891541,-102.808565712504773 29.522407885546979,-102.808691999999979 29.522319000000003,-102.808681334358837 29.522097795383676,-102.808577631171161 29.519946998869006,-102.807327 29.494009000000002,-102.813953999999995 29.482805999999997,-102.814096473430837 29.482483316434472,-102.814383778328263 29.481832608662831,-102.822314986984821 29.463869465126457,-102.82537225240516 29.456945161410285,-102.827007089548758 29.453242470491304,-102.830969999999979 29.444267,-102.832538999999997 29.433109000000002,-102.830570753051859 29.427471931628293,-102.827354999999983 29.418261999999995,-102.825211066354328 29.40389180477127,-102.824564449740322 29.399557712155943,-102.831802092379931 29.389471209449322,-102.832669213065941 29.388262775214326,-102.84047188579207 29.377388836904565,-102.840778422425643 29.376961642203423,-102.841560439245441 29.370344567434586,-102.842457529677418 29.362753791491347,-102.843015380341285 29.358033509958585,-102.843020777220957 29.357987843989019,-102.861629999999991 29.351638999999995,-102.871857000000006 29.352092999999996,-102.876866000000007 29.354058999999996,-102.879534000000007 29.353326999999997,-102.883721999999992 29.348058999999999,-102.881857488401977 29.34363024944906,-102.879805000000005 29.338754999999999,-102.890489000000002 29.309498999999995,-102.88922161316745 29.299205074185686,-102.888328 29.291947,-102.891022000000007 29.287113000000002,-102.902604999999994 29.279440999999998,-102.90311226801488 29.27677066200776,-102.906295999999998 29.260010999999995,-102.903188999999983 29.254028999999999,-102.887901999999997 29.245611999999998,-102.881135 29.246022,-102.871347 29.241624999999999,-102.870795537867835 29.239589944231255,-102.86823682221636 29.230147538772215,-102.866845999999995 29.225014999999999,-102.878020000000006 29.214697999999999,-102.890063999999995 29.208813999999997,-102.899231 29.208863,-102.908656596973657 29.219194069767902,-102.908787000000004 29.219336999999996,-102.909098471667448 29.219296482603067,-102.910575587951939 29.219104333804097,-102.912131000000002 29.218902,-102.912650757516516 29.218481184275788,-102.915803535402844 29.215928573746115,-102.915865999999994 29.215877999999996,-102.915845750043147 29.215583596781208,-102.915608148145267 29.212129230727648,-102.915554 29.211341999999998,-102.915202931298523 29.21076702044931,-102.914525807203304 29.209658028088604,-102.912447999999998 29.206254999999999,-102.91453363655873 29.20019781620671,-102.917367531146525 29.191967513425833,-102.917805 29.190697,-102.922897000000006 29.192704085059273,-102.925481999999988 29.193722999999995,-102.932612000000006 29.194113000000005,-102.944911000000005 29.188819999999996,-102.947155999999993 29.180776999999999,-102.95089 29.176834999999997,-102.953474999999997 29.176307999999995,-102.977266 29.186226,-102.981742305424802 29.185103060319207,-102.989431999999994 29.183174,-102.98978258837333 29.182935350109393,-102.991725524817895 29.181612768970929,-102.994653 29.17962,-102.994906329461855 29.17910907354543,-102.99809599999999 29.172675999999996,-102.995688 29.161218999999999,-103.00243399999998 29.150260999999997,-103.0050672680876 29.149386797638936,-103.008362000000005 29.148292999999995,-103.010324999999995 29.137821999999996,-103.015028 29.125769999999996,-103.016945338084582 29.124525732477775,-103.024896087692937 29.119366048020158,-103.032982999999987 29.114118,-103.033302941039096 29.107355634443419,-103.034095953658579 29.105913798143234,-103.035682683422891 29.103028844591982,-103.04044215980575 29.099351067768175,-103.049126083320303 29.097714968852063,-103.055369601981923 29.096538655622457,-103.061557539334615 29.093936906572154,-103.06671291432167 29.091769303506382,-103.074407490743866 29.088534080562461,-103.076354546596249 29.085721668416742,-103.076667707631657 29.079576983004682,-103.076847 29.076059,-103.091926967746744 29.064237268591206,-103.100265999999991 29.057699999999997,-103.101359249603803 29.049403674773888,-103.102531654124817 29.040506667933872,-103.100975335951205 29.030701853789079,-103.100368259199087 29.026877266486249,-103.101607999999999 29.018122999999999,-103.107810999999998 29.013812,-103.117237999999986 29.000208999999998,-103.113922000000002 28.988546999999997,-103.115062910480361 28.985887850893185,-103.115327999999991 28.98527,-103.115773294260094 28.985147329619764,-103.126748000000006 28.982123999999995,-103.134930999999995 28.983525,-103.143274000000005 28.978073999999999,-103.156645999999995 28.972830999999999,-103.163865 28.972099,-103.165923000000006 28.974001999999999,-103.166234999999986 28.978836000000005,-103.174329720990258 28.980505274886987,-103.182663652045193 28.982223879127538,-103.194928465619142 28.984753100989199,-103.195705106971403 28.984913258196226,-103.207825367468075 28.987412670652219,-103.227338454203803 28.991436614861634,-103.227579101883322 28.991486240676846,-103.227800999999999 28.991532000000003,-103.228011662384262 28.991347921912006,-103.228737472224623 28.990713704806197,-103.239108999999985 28.981650999999996,-103.245121150470112 28.980239630911282,-103.2474464632202 28.980649978816817,-103.249155161185584 28.980951512720708,-103.25190330878641 28.984768118238364,-103.253285000000005 28.986686999999996,-103.26030800838916 28.989731411362609,-103.266003072061508 28.990206003834011,-103.270357000000004 28.988113999999996,-103.270725571428585 28.987466542857135,-103.27232562100086 28.984655789108508,-103.273357000000004 28.982844,-103.273647076585334 28.982817854078331,-103.281189929980513 28.982137982403092,-103.282424051550748 28.983865752282551,-103.284749352823042 28.987121173462914,-103.285935817906974 28.994002716014545,-103.289257951411443 28.999697788883793,-103.296614077237592 29.004443676810233,-103.302399476821606 29.006455988366771,-103.312987409437454 29.010138745081029,-103.315449022736544 29.011725838031147,-103.323993942362023 29.017235063099889,-103.331021803791103 29.021766184756,-103.332920159881368 29.026986669752301,-103.332783823258595 29.028827200289001,-103.332445567409962 29.033393619832523,-103.334818511373186 29.039800579109659,-103.341462759988346 29.041224342728523,-103.347869719265475 29.037427630547988,-103.350815999999995 29.028566999999999,-103.355428000000003 29.021529,-103.355590463621823 29.021464336016578,-103.361777791205157 29.019001647792766,-103.361998 29.018913999999999,-103.382125000000002 29.024248999999998,-103.386095607142025 29.025822707722725,-103.399799910010643 29.031254261761571,-103.402689272115182 29.032399429564627,-103.427474921518822 29.04222295692054,-103.427754276336316 29.042333676218103,-103.430481680804888 29.047455485683194,-103.434668000000002 29.055316999999995,-103.439550459717495 29.058547821156772,-103.449722032594721 29.065278554178825,-103.453029264571228 29.067467015663059,-103.457386392383299 29.068596640465525,-103.460381908910477 29.067681344107211,-103.463195887793432 29.066821517562918,-103.469166763983068 29.069242141692889,-103.471264639062966 29.073115142802621,-103.471299587628792 29.074897490538035,-103.471426016715213 29.08134526859719,-103.474814887995407 29.086670637304994,-103.484429000000006 29.094524,-103.49531945696836 29.1087608679228,-103.500928937954981 29.116094025764934,-103.503236 29.119109999999996,-103.506163032831353 29.119368513261239,-103.513192088151087 29.119989313955617,-103.524613000000002 29.120998,-103.524225442342612 29.124905426308125,-103.523383999999993 29.133389,-103.525026999999994 29.137353999999998,-103.539240927934515 29.144791265038371,-103.551909954693073 29.151420179312847,-103.558678999999984 29.154961999999998,-103.579462000000007 29.149964999999998,-103.592359999999999 29.150259999999999,-103.598960126757959 29.155019048637598,-103.606437999999997 29.160411,-103.607894091053709 29.162314354517299,-103.610539999999986 29.165772999999998,-103.624537921955991 29.163185608071569,-103.629433693714475 29.1622806680118,-103.638195234739996 29.160661174732635,-103.645634999999999 29.159286000000002,-103.653180000000006 29.162863999999995,-103.656807999999984 29.169098999999999,-103.660202999999996 29.170933999999999,-103.667724667668963 29.172878689431396,-103.669696386484915 29.173388467437,-103.688670000000002 29.178293999999998,-103.688830238367032 29.178273608722382,-103.690116124218548 29.178109972160996,-103.697314000000006 29.177194,-103.699305464408098 29.178139630948273,-103.713769999999997 29.185008,-103.724743000000004 29.191469999999999,-103.73193762439729 29.198544108660482,-103.742175000000003 29.20861,-103.750912464183997 29.219357091602017,-103.755265634411842 29.22471149629115,-103.75594348727293 29.225545256136954,-103.768569999999997 29.227360999999995,-103.777623396259372 29.232265264832392,-103.780085146052983 29.242351446713872,-103.780352362214714 29.243446273985068,-103.781659908552058 29.248803500057083,-103.789034484601103 29.257501704713096,-103.792700821322356 29.259284649416337,-103.795120675584712 29.260461427946989,-103.80876361213285 29.267096007175422,-103.816641821688407 29.27092719156084,-103.818617217853202 29.271599921312173,-103.838302999999982 29.278303999999999,-103.854966933859771 29.281484400071786,-103.856892999999999 29.281852,-103.880606 29.284961999999997,-103.896615144488038 29.284634799403065,-103.910231251371073 29.284356508561018,-103.916269383748329 29.284233099060927,-103.91710599999999 29.284215999999997,-103.91776286712728 29.284516760669142,-103.918698764585329 29.284945281345607,-103.918909999999997 29.285042,-103.918905327188597 29.285488562070029,-103.918900778480648 29.285923264066316,-103.918857000000003 29.290106999999995,-103.924975999999987 29.293913000000003,-103.943697999999983 29.294945999999996,-103.965795999999983 29.298586999999998,-103.975234999999998 29.296016999999999,-103.983459597310627 29.299165977024781,-103.998789342279238 29.305035323921498,-104.012357062242771 29.310230038851625,-104.018558084893087 29.312604243583909,-104.038281999999995 29.320155999999997,-104.047006656168747 29.325575022319434,-104.055595999999994 29.330909999999996,-104.056467149578211 29.334496091467582,-104.057243999999997 29.337694000000003,-104.068917843404819 29.342306667996301,-104.075923999999986 29.345075,-104.082149999999999 29.345922999999996,-104.091021999999995 29.353691999999995,-104.093326000000005 29.359926000000002,-104.098377999999983 29.366755999999999,-104.106466999999981 29.373127,-104.122882935723638 29.379859019095424,-104.125474999999994 29.380922000000002,-104.132831527553293 29.381873417846823,-104.136236243923818 29.382313748953422,-104.143691999999987 29.383277999999997,-104.1467332019064 29.385415391432094,-104.148888696362661 29.386930297552944,-104.151718842950046 29.388919356896473,-104.157422367906094 29.392927859373117,-104.166562999999996 29.399352,-104.180069999999986 29.412763999999999,-104.181273000000004 29.426265,-104.182051945448123 29.427144615030393,-104.195989999999995 29.442884000000003,-104.208194000000006 29.448201,-104.212529153241931 29.452438774515159,-104.213947876032222 29.456222068892099,-104.21370324326665 29.462011765001886,-104.213238514637069 29.473010445135856,-104.218538498245692 29.476600759818915,-104.220568643482977 29.477976020723915,-104.227547514371139 29.480496161448666,-104.229081071868791 29.481049944541308,-104.233824999999996 29.486544999999996,-104.233486999999997 29.492733999999995,-104.235847000000007 29.496744,-104.238313284768751 29.498023301020304,-104.246870092866089 29.50246185307569,-104.254473621536903 29.506405923975272,-104.260293266516271 29.50942466611497,-104.26168489846043 29.511073814728768,-104.264155000000002 29.514001,-104.271046277211582 29.51559593462645,-104.274575430964404 29.516412730896519,-104.293481117436073 29.520788310787555,-104.306646311930564 29.523835296697214,-104.308812834933008 29.524336722260216,-104.311570786550874 29.52540915148019,-104.318073989469781 29.527937921306467,-104.320711000000003 29.526326414398167,-104.326090351466348 29.523039031981277,-104.327483437129615 29.522187701603762,-104.334811000000002 29.519462999999998,-104.338113000000007 29.519967,-104.353150868059984 29.530471948300562,-104.369085650105362 29.541603450512167,-104.37074044290263 29.542759433043344,-104.371174999999994 29.543062999999997,-104.371454921502831 29.543072731712495,-104.371996954766473 29.543091575966443,-104.375901661123379 29.543227326450971,-104.381040999999996 29.543405999999997,-104.394588999999982 29.556087000000002,-104.394583075653415 29.556197720561212,-104.394577025204526 29.556310797858156,-104.394552364240909 29.55677168847231,-104.394503136758885 29.55769170460702,-104.394351 29.560534999999998,-104.39571704642303 29.563607040276512,-104.39636925661604 29.56507376640522,-104.397848504811165 29.56840038104859,-104.399550133070164 29.572227096202102,-104.399591 29.572319,-104.399981791506633 29.572551361916329,-104.452301000000006 29.60366,-104.466520000000003 29.609296,-104.483502 29.627740999999997,-104.486693164979016 29.629712817604439,-104.493658999999994 29.634016999999997,-104.503232654335022 29.63787621670291,-104.507568060311556 29.63962385355849,-104.51068846437596 29.64315687341222,-104.513969549435132 29.646871821353749,-104.51818442992635 29.651644041921735,-104.53325150001281 29.668703453669117,-104.535568725458901 29.671327089370656,-104.539761023554547 29.676073741438437,-104.540155514025756 29.678572204873163,-104.540559188867974 29.681128836544634,-104.537934834631798 29.684482179324355,-104.535770155740693 29.687248158943191,-104.536302269386866 29.690440851131939,-104.537991394981006 29.693268523024599,-104.544269904764263 29.703779029587054,-104.545505621253113 29.70584767433138,-104.552240999999995 29.717122999999997,-104.555600999999996 29.731220999999998,-104.554914970831931 29.738152096413199,-104.554660236582549 29.740725729903364,-104.557361904757329 29.745049367744027,-104.565950999999998 29.758794999999996,-104.565687999999994 29.770461999999998,-104.571279565966023 29.778773775962186,-104.586447318468245 29.801320404476364,-104.592472 29.810276000000002,-104.594023000000007 29.809220999999997,-104.599148999999997 29.811007,-104.610166000000007 29.819117999999996,-104.610205623651026 29.819231101342197,-104.610356932717465 29.819662996386217,-104.613081011852316 29.827438579869643,-104.615248982559379 29.833626813172685,-104.619039 29.844444999999997,-104.624350000000007 29.845221999999996,-104.629290740007292 29.852171499068138,-104.629713747950376 29.852766489555783,-104.630103000000005 29.853313999999997,-104.630111961493199 29.853664893019587,-104.630290851730521 29.860669455113747,-104.630338938536084 29.862552324858758,-104.630359999999996 29.863376999999996,-104.630588419131911 29.86393398222631,-104.633274999999998 29.870484999999999,-104.63616345635748 29.872800876528242,-104.645854762904364 29.880571071602066,-104.65678299999999 29.889332999999997,-104.658422170930251 29.891285606400047,-104.65864999999998 29.891556999999999,-104.658665881124946 29.891956296855856,-104.659041999999999 29.901413000000002,-104.661965712024596 29.903547518850328,-104.666224133352003 29.906656470935726,-104.672326999999996 29.911111999999996,-104.679772 29.924658999999998,-104.680850906343153 29.932111041680564,-104.684321999999995 29.956085999999999,-104.679660999999982 29.975271999999997,-104.680379178583593 29.977083,-104.685479 29.989943,-104.689640999999995 30.014949999999999,-104.693591999999995 30.019077000000003,-104.701242868742796 30.021046973658397,-104.702310999999995 30.021321999999998,-104.702447580064685 30.021555813412469,-104.7030116881661 30.022521518330599,-104.703997999999999 30.02421,-104.703882705803636 30.024660825787098,-104.703121214098445 30.027638426639932,-104.701101999999992 30.035533999999998,-104.706873999999999 30.050685,-104.706630611705322 30.051708605996314,-104.703831250551389 30.063481739403372,-104.703581999999997 30.06453,-104.699792220462342 30.065066336345112,-104.698848962238912 30.065199827927678,-104.698233000000002 30.065286999999998,-104.697787990647399 30.065651654776563,-104.69277799999999 30.069756999999996,-104.687313590037505 30.080921966773531,-104.685080632167896 30.08548438075637,-104.685002999999995 30.085643,-104.685554782105299 30.093963293324606,-104.685687 30.095957000000002,-104.686861171517634 30.098036494960315,-104.692093999999983 30.107303999999996,-104.693655813605488 30.119154117533654,-104.695366000000007 30.13213,-104.692122999999995 30.138662999999998,-104.690080458880587 30.149079251722458,-104.687506999999997 30.162202999999998,-104.687296000000003 30.179464000000003,-104.702787999999998 30.211735999999995,-104.707897632633845 30.218501061672534,-104.711235999999985 30.222920999999999,-104.713166 30.237956999999998,-104.722357186598074 30.248308653999679,-104.724410584274111 30.250621311025988,-104.72532436157617 30.251650460675243,-104.73347160041142 30.260826359409911,-104.733822000000004 30.261220999999999,-104.734059376092361 30.261231667834558,-104.737359999999995 30.261379999999996,-104.740448 30.259454000000002,-104.749663999999996 30.26126,-104.751566999999994 30.263643999999999,-104.754655151309422 30.272796681105522,-104.757893999999993 30.282395999999999,-104.761634 30.301147999999998,-104.779356000000007 30.313188,-104.790279572675416 30.323632238875831,-104.797291 30.330335999999999,-104.809794338457337 30.334925849121163,-104.810755485390246 30.338091979227556,-104.81211787963197 30.342579864771171,-104.813478341684558 30.347061385458392,-104.814379749150064 30.356375955470707,-104.814778573671205 30.360497153782266,-104.817595751374526 30.365914799658352,-104.824313633436745 30.370465624210016,-104.837492999999995 30.373909,-104.849824017938076 30.383147747051474,-104.859521 30.390413000000002,-104.857439999999997 30.408957,-104.852419999999995 30.418792,-104.861074000000002 30.428896999999996,-104.86474141169117 30.441297336779865,-104.865463293164552 30.443738179024677,-104.868454614768496 30.453852504447951,-104.869872 30.458644999999997,-104.86871099999999 30.463229999999996,-104.866118999999983 30.46479,-104.866094000000004 30.467379999999999,-104.870137228360662 30.483875070981508,-104.873288503237063 30.496731258693877,-104.873335488188886 30.496922942181985,-104.876786999999979 30.511004000000003,-104.878566789651714 30.514416830422793,-104.880108146577356 30.517372454871531,-104.88208573587417 30.521164575423189,-104.889375999999999 30.535143999999995,-104.890392881954469 30.540947215529823,-104.892228000000003 30.551419999999997,-104.895440150997459 30.560421421221292,-104.899000999999998 30.570399999999996,-104.909330873116318 30.584188648619556,-104.909747767935556 30.584745133303247,-104.918689620637082 30.596681007395873,-104.924796 30.604831999999998,-104.927016167130404 30.604700501077968,-104.934922481779466 30.604232215677584,-104.939873000000006 30.603939,-104.953391370086464 30.606003357240429,-104.967167000000003 30.608106999999997,-104.971627504383378 30.61006529240159,-104.972071 30.61026,-104.972794851616513 30.611297344530712,-104.980135850742045 30.621817657146149,-104.980290999999994 30.622039999999995,-104.982191641583043 30.62882153037463,-104.983981 30.635206,-104.985513855292751 30.652294791670293,-104.9863 30.661059000000002,-105.001239999999996 30.672583000000003,-105.002056999999994 30.680971999999997,-105.006614566555172 30.685839873047019,-105.006800999999996 30.686039,-105.007528432885024 30.6859080282745,-105.007959930235828 30.685830338698263,-105.020141999999993 30.683637,-105.035888798004834 30.686138071331488,-105.042930223005172 30.687256464175281,-105.044973600167665 30.685364445024991,-105.049769587265445 30.680923708581364,-105.049884734287517 30.6808170907847,-105.050688284649809 30.681171184306308,-105.054688384336032 30.682933873306403,-105.062333999999993 30.686302999999995,-105.062477471553692 30.692159292631892,-105.062625999999995 30.698222,-105.084504902225902 30.710918832086001,-105.098281999999998 30.718914000000002,-105.108075999999997 30.730049999999995,-105.110705999999993 30.737749999999995,-105.110681999999983 30.743366000000002,-105.113815999999986 30.746001,-105.119547104826722 30.748125675649064,-105.123265000000004 30.749504000000005,-105.140207000000004 30.752502,-105.152361999999982 30.751451999999997,-105.157640215066564 30.754007791997694,-105.16015278062757 30.757058756266805,-105.160271207191187 30.758203550015399,-105.161229588477383 30.767467931854636,-105.164076390339474 30.771453450048199,-105.164818961888187 30.77249304906519,-105.164868027003308 30.772491740665838,-105.170370203038615 30.772345016388588,-105.178279098267282 30.772134113115257,-105.183436 30.776644999999995,-105.185930999999997 30.784391999999997,-105.195143999999999 30.792138,-105.195988495740664 30.791702299374609,-105.203522176185984 30.787815448176353,-105.206160999999994 30.786453999999996,-105.212916518294108 30.785414778041517,-105.215967484302155 30.786491589369188,-105.216685356202021 30.789542555377231,-105.215888956387687 30.792967070566242,-105.214890669496626 30.797259699168034,-105.218659510882389 30.801566944478708,-105.222008841883465 30.801829013843189,-105.231580057313238 30.802577916338681,-105.238364256021057 30.803108747911697,-105.249792715464977 30.799033957074698,-105.255416052233826 30.797028969328842,-105.261224946310648 30.798054073736733,-105.261360733612406 30.798078036329223,-105.27276013440985 30.808707209360072,-105.27887297001547 30.814407016614517,-105.283004544196217 30.818259431108679,-105.287237620233441 30.822206489243744,-105.289317685342255 30.822206489243744,-105.295630129130572 30.822206489243744,-105.300778681061615 30.818848737795758,-105.303672944509898 30.816961174571279,-105.314862960890409 30.816961174571279,-105.316949659843416 30.82296045428,-105.31766045482081 30.825003996727105,-105.320108268786385 30.827451797139727,-105.322675464925993 30.828439452154051,-105.330102631610075 30.831296841312803,-105.347695000000002 30.838065,-105.353219571709047 30.842032277683753,-105.358103536812379 30.84553952616983,-105.359771122039604 30.846737044096301,-105.360672052753856 30.84738401593513,-105.36720323988537 30.847875849249167,-105.377416999999994 30.848644999999998,-105.387780492422849 30.851314552204784,-105.394242074789418 30.852979003795937,-105.396689881978517 30.855426817761515,-105.396237319899697 30.858492407966825,-105.394628539050657 30.86939005724841,-105.394248999999988 30.871960999999999,-105.395681745186749 30.87649980844607,-105.399608999999998 30.888940999999996,-105.399828021807267 30.889112280223049,-105.402824820246408 30.891455847338634,-105.413505 30.899808,-105.430088999999995 30.905791999999998,-105.44547819369545 30.915748838601054,-105.448693870984556 30.917829388134351,-105.452149246331331 30.920065022782566,-105.4597280766598 30.924968540917344,-105.469954295993247 30.931584924947412,-105.472488639470896 30.933224650164071,-105.476269681741059 30.935670991952524,-105.488027000000002 30.943277999999999,-105.495516502166126 30.9493992090351,-105.4968561000139 30.950494069316512,-105.497422439936116 30.953962910943051,-105.497963910074574 30.957279424722472,-105.502256687477072 30.962680017552614,-105.507558525965123 30.966493977230062,-105.533087999999992 30.984859,-105.541468808393844 30.984769556162778,-105.543675999999991 30.984745999999998,-105.557430349577899 30.990228688381027,-105.570063935625512 31.008532833135739,-105.575218046011173 31.016000355201566,-105.578084306850855 31.020153131231776,-105.578407858220658 31.020621907958049,-105.57911399999999 31.021644999999999,-105.580554486932016 31.024917232759986,-105.581339666024604 31.026700857930102,-105.581404000000006 31.026847000000004,-105.581361569643192 31.027041810483581,-105.581235244876609 31.027621805343596,-105.579823718925667 31.034102543987302,-105.579541999999989 31.035395999999995,-105.579765234089464 31.036249085539566,-105.579847333127134 31.036562825712579,-105.585323000000002 31.057487999999996,-105.592709163135751 31.0626132919136,-105.595921000000004 31.064841999999999,-105.598772999999994 31.074925999999998,-105.60333 31.082624999999997,-105.627348999999995 31.098545,-105.641890000000004 31.098321999999996,-105.646730999999988 31.113907999999999,-105.647031366805422 31.114192798578223,-105.648833999999994 31.115902000000002,-105.662869191777489 31.12063916934996,-105.673930643060629 31.124372639388369,-105.709491 31.136374999999997,-105.717005999999998 31.141438,-105.717653520299876 31.143411480377267,-105.719539999999995 31.149160999999996,-105.742677999999998 31.164897,-105.763531 31.164121000000005,-105.773256999999987 31.166896999999999,-105.774148788612138 31.168976038235485,-105.780021000000005 31.182666,-105.779878030009812 31.18682806893737,-105.779724999999999 31.191282999999995,-105.782894999999996 31.197562999999999,-105.790659746923424 31.200723362140888,-105.794386000000003 31.20224,-105.818835000000007 31.230680999999997,-105.825806058218902 31.23733997673531,-105.835722000000004 31.246811999999995,-105.851073632158958 31.265902599748792,-105.86604427072389 31.284519412988434,-105.869353000000004 31.288633999999998,-105.869862116496506 31.288859823963843,-105.876014999999981 31.291588999999995,-105.890871999999987 31.290013999999996,-105.895034999999993 31.290977999999999,-105.903460999999993 31.306768999999999,-105.908770999999987 31.312773999999997,-105.914613899052299 31.312859252963214,-105.93196564998388 31.313112430054005,-105.932552999999999 31.313120999999995,-105.933375187723101 31.313903465142818,-105.938451999999984 31.318735,-105.948091000000005 31.340069,-105.945903 31.352809999999998,-105.953942999999995 31.364749,-105.970101 31.365936999999995,-105.997579969562565 31.386863626037869,-106.00418474278807 31.391893495117941,-106.004925999999998 31.392457999999998,-106.006143777923754 31.392558937255828,-106.022866323827969 31.393945009265412,-106.080091217088636 31.398688175961098,-106.080258 31.398702,-106.080335505244278 31.398768097394733,-106.096409750603954 31.412476405141465,-106.100621535494 31.416068265421309,-106.102641400977276 31.417790830744398,-106.10264993125142 31.41779810546371,-106.106876999999997 31.421403000000005,-106.112168999999994 31.423577999999996,-106.132782000000006 31.425367000000005,-106.143572676566535 31.431101721097118,-106.158218000000005 31.438885000000003,-106.175305198785026 31.455910533348611,-106.175674999999998 31.456278999999995,-106.17677981450808 31.456634312625521,-106.182946895641223 31.45861766980741,-106.20560859826729 31.465905761156737,-106.205826999999999 31.465975999999998,-106.205998876707866 31.466165148890862,-106.212686244283063 31.473524541419071,-106.218538531147885 31.479964934554566,-106.218843000000007 31.480299999999996,-106.218893022078106 31.480498686193428,-106.223908999999992 31.500422,-106.236804000000006 31.513376,-106.242649095206133 31.530650094003715,-106.245874455325477 31.540182047193959,-106.246202999999994 31.541153,-106.246406806009631 31.541315626597875,-106.254779999999997 31.547997000000002,-106.280345588488331 31.561810530102129,-106.280548572587122 31.561920205925162,-106.280811 31.562061999999997,-106.287785 31.584444999999999,-106.292254713772053 31.594651759250389,-106.295141086978958 31.601242900860864,-106.303535999999994 31.620412999999996,-106.308594276522342 31.627497440426588,-106.330970256390501 31.658836434185069,-106.33473699999999 31.664111999999999,-106.338265602146336 31.671883697950737,-106.346992532059133 31.691104641686092,-106.349537999999995 31.696711,-106.357472918704602 31.702103016258707,-106.368303742040567 31.709462886938788,-106.370138999999995 31.710709999999999,-106.373839000000004 31.714809999999996,-106.378039 31.72831,-106.381039 31.732109999999999,-106.38595139194058 31.734759025425479,-106.394642915450532 31.739445961452269,-106.404086535473255 31.744538468290354,-106.417940000000002 31.752009,-106.421739999999616 31.752623660686648,-106.431540999999996 31.754208999999996,-106.434644983693715 31.755853956158482,-106.444263765046571 31.76095142933643,-106.451540999999992 31.764807999999999,-106.467641999999998 31.759607999999997,-106.470742 31.753508,-106.472156160715315 31.752506597443457,-106.47367184987327 31.751433300058491,-106.475016438009845 31.750481163584279,-106.475542000000004 31.750108999999998,-106.48261401078824 31.748321568701869,-106.484641999999994 31.747809000000004,-106.486162292248409 31.747994847970777,-106.488078402545341 31.748229082678503,-106.489542 31.748407999999998,-106.507341999999994 31.761208,-106.509102011460428 31.762827435120251,-106.511609062807707 31.765134242258316,-106.523643000000007 31.776206999999996,-106.528643000000002 31.781807,-106.528542999999999 31.783906999999996,-106.528542999999999 31.784407000000002,-106.527996999999999 31.786944999999999,-106.527623000000006 31.789119000000003,-106.527737999999985 31.789760999999995,-106.527942999999993 31.790507000000002,-106.530514999999994 31.792103,-106.532480000000007 31.791913999999998,-106.533 31.791829,-106.533043000000006 31.791906999999995,-106.534743000000006 31.796106999999999,-106.535154000000006 31.797088999999996,-106.535342999999997 31.797507,-106.535842999999986 31.798607,-106.542096999999998 31.802145999999997,-106.542143999999993 31.802106999999996,-106.544713999999999 31.804286999999999,-106.545344 31.805007,-106.546561898485905 31.806561850400339,-106.546615562760394 31.806630361790774,-106.547143999999989 31.807304999999996,-106.551861034152338 31.808599471053657,-106.558443999999994 31.810406,-106.560680020141419 31.810752754512048,-106.560847305685968 31.810778696593822,-106.562944999999999 31.811104,-106.56344399999999 31.812605999999995,-106.566844000000003 31.813305999999997,-106.569123704016391 31.811582321353455,-106.570943999999997 31.810205999999997,-106.577243999999993 31.810406,-106.581344 31.813905999999996,-106.582144 31.815505999999999,-106.588044999999994 31.822105999999998,-106.589044999999984 31.822705999999997,-106.593826000000007 31.824901,-106.602727000000002 31.825023999999996,-106.605266999999998 31.827911999999998,-106.603310537982878 31.834798487166189,-106.601945 31.839604999999999,-106.60204499999999 31.844404999999998,-106.605244999999982 31.845904999999998,-106.605845000000002 31.846304999999997,-106.614637000000002 31.846489999999996,-106.621857000000006 31.852854,-106.625763000000006 31.856276,-106.627808000000002 31.860592999999998,-106.629708357956787 31.861913746439043,-106.635925999999998 31.866235,-106.635879999999986 31.871514,-106.634872999999999 31.874477999999996,-106.630798999999996 31.879696999999997,-106.629271361585637 31.8835303997664,-106.629197000000005 31.883717000000004,-106.629948941610351 31.885072003811555,-106.630443527558498 31.88596325099838,-106.630530381920593 31.886119763139838,-106.630691999999982 31.886410999999999,-106.633926999999986 31.889183999999997,-106.635073463799642 31.889856364267651,-106.636317332120683 31.890585853164694,-106.638154 31.891662999999998,-106.638364165758659 31.89171923904625,-106.642899999999983 31.892932999999999,-106.645296000000002 31.894859,-106.645645999999999 31.895648999999995,-106.645478999999995 31.898669999999999,-106.640839999999997 31.904598,-106.63512839833713 31.908732779117901,-106.633668 31.90979,-106.633408736085542 31.909871832166754,-106.625946999999996 31.912227,-106.62344499999999 31.914034,-106.618336531290581 31.916262323146238,-106.614677480394235 31.917858407661853,-106.614345999999998 31.918002999999995,-106.611846 31.920003,-106.616063629645311 31.921863544491501,-106.623932999999994 31.925334999999997,-106.624022586877501 31.92530240401349,-106.628663000000003 31.923614,-106.629746999999995 31.926570000000002,-106.625321999999983 31.930053000000004,-106.622529 31.934863000000004,-106.622117000000003 31.936620999999999,-106.622377 31.940863,-106.623659000000004 31.945509999999995,-106.616135999999983 31.948439,-106.614701999999994 31.956,-106.617707999999993 31.956008,-106.622819000000007 31.952891,-106.625123000000002 31.954530999999999,-106.625534999999985 31.957475999999996,-106.624298999999993 31.961054,-106.620453999999981 31.963402999999996,-106.619370999999987 31.964777000000005,-106.618745000000004 31.966954999999995,-106.619568999999998 31.971578,-106.621872999999994 31.972933,-106.623215999999999 31.972909999999999,-106.626465999999994 31.97069,-106.630114000000006 31.971257999999999,-106.638186000000005 31.976819999999996,-106.639528999999996 31.980347999999996,-106.63649199999999 31.985719,-106.631181999999995 31.989809,-106.629494617643616 31.990072722748106,-106.628337072326531 31.990253636712819,-106.62822051159516 31.990271854111079,-106.626910882874782 31.990476537349483,-106.623567999999992 31.990998999999999,-106.619448000000006 31.994733,-106.618486000000004 32.000494999999994,-106.599096000000003 32.000731000000002,-106.598639000000006 32.000753999999993,-106.595332999999997 32.000777999999997,-106.587971999999979 32.000748999999999,-106.582805114232855 32.000751357586125,-106.566056000000003 32.000759000000002,-106.565141999999994 32.000736000000003,-106.564298514026802 32.00073927393025,-106.562131862706067 32.000747683631808,-106.55942760630407 32.000758180008894,-106.517043115844388 32.000922692365819,-106.411074999999983 32.001334,-106.409326934223301 32.001349629127162,-106.409108574114072 32.001351581443814,-106.394297999999992 32.001483999999998,-106.376861000000005 32.001171999999997,-106.32356972407176 32.001457096670784,-106.313306999999995 32.001511999999998,-106.205915000000005 32.001761999999999,-106.200699 32.001784999999998,-106.18183999999998 32.002049999999997,-106.125534000000002 32.002532999999993,-106.05045734599986 32.002412317859424,-105.998002999999997 32.002327999999999,-105.900599999999997 32.002099999999992,-105.886159000000006 32.001969999999993,-105.854061000000002 32.00235,-105.750527000000005 32.002206,-105.731362000000004 32.001564000000002,-105.563520259526442 32.001015604709174,-105.429281000000003 32.000577,-105.428582000000006 32.000599999999999,-105.427048999999997 32.000638000000002,-105.390395999999981 32.000607000000002,-105.340142768272344 32.000583616714373,-105.200871148394683 32.000518812363367,-105.153993999999997 32.000497000000003,-105.150310000000005 32.000497000000003,-105.14824 32.000484999999998,-105.132915999999994 32.000518,-105.131377 32.000523999999999,-105.118039999999993 32.000484999999998,-105.078604999999996 32.000532999999997,-105.077045999999996 32.000578999999995,-104.918272000000002 32.000495999999991,-104.643525999999994 32.000442999999997,-104.640917999999999 32.000396000000002,-104.531936999999999 32.000311000000004,-104.531756 32.000117000000003,-104.024520999999993 32.000010000000003,-103.980179000000007 32.000124999999997,-103.875476000000006 32.000554,-103.748317 32.000197999999997,-103.72373965094468 32.000208021677786,-103.713395184678689 32.000212239744897,-103.713395184670219 32.000212239744904,-103.713395184654971 32.000212239744911,-103.713395184639609 32.000212239744918,-103.60161412595366 32.000257819670985,-103.326500999999993 32.00036999999999,-103.278520999999998 32.000419,-103.270382999999995 32.000326,-103.267707999999999 32.000323999999992,-103.267633000000004 32.000475000000002,-103.215641000000005 32.000512999999998,-103.133028835827503 32.000473953106116,-103.088697999999994 32.000452999999993,-103.085875999999985 32.000464999999998,-103.064422999999991 32.000518,-103.064344000000006 32.087051000000002,-103.064347999999995 32.123041,-103.064421999999993 32.145006000000002,-103.064695999999998 32.522193,-103.064761000000004 32.587983,-103.064787999999993 32.600397,-103.064761000000004 32.601863000000002,-103.064814999999996 32.624536999999997,-103.064633 32.646419999999992,-103.064864 32.682647000000003,-103.064797999999996 32.690761000000002,-103.064798999999994 32.708694,-103.064826999999994 32.726627999999998,-103.064807000000002 32.777302999999996,-103.064698000000007 32.783602000000002,-103.064711000000003 32.784593,-103.064699000000005 32.827531,-103.064672000000002 32.828470000000003,-103.064888999999994 32.849359,-103.064915999999982 32.857259999999997,-103.064807000000002 32.857695999999997,-103.064862000000005 32.868346000000003,-103.064700999999985 32.879354999999997,-103.064569000000006 32.900013999999999,-103.064656999999997 32.959097,-103.064678999999998 32.964373000000002,-103.064625000000007 32.999898999999999,-103.064452000000003 33.010289999999998,-103.06398 33.038693000000002,-103.063904999999991 33.042054999999998,-103.063382198608849 33.066417104805645,-103.0628188509327 33.092668632365545,-103.062136190569035 33.12448003074244,-103.060102999999984 33.219225000000002,-103.059719999999999 33.256262,-103.059241999999998 33.260370999999992,-103.057856 33.315233999999997,-103.057486999999995 33.32947699999999,-103.056655000000006 33.388437999999994,-103.052609999999987 33.570599,-103.051664000000002 33.629489,-103.051362999999995 33.64195,-103.051535 33.650486999999998,-103.051086999999981 33.658186,-103.050532000000004 33.672407999999997,-103.050147999999993 33.701971,-103.049608000000006 33.737766,-103.049096000000006 33.746270000000003,-103.047346000000005 33.824674999999999,-103.046907000000004 33.850299999999997,-103.045643999999996 33.901536999999998,-103.045698000000002 33.90629899999999,-103.044893000000002 33.945616999999999,-103.043949999999981 33.974629,-103.043616999999998 34.003633,-103.043531000000002 34.018014,-103.043554999999984 34.032713999999991,-103.043745999999999 34.037294000000003,-103.043771000000007 34.041538000000003,-103.043720999999991 34.042319999999997,-103.043767000000003 34.043544999999995,-103.043744000000004 34.049985999999997,-103.04368599999998 34.063077999999997,-103.043515999999983 34.079382000000003,-103.043569000000005 34.087947,-103.043571175003294 34.092846731402311,-103.043572866326429 34.096656853966635,-103.04358003846437 34.112813863799865,-103.043644 34.256903,-103.043718999999982 34.289440999999997,-103.043935999999988 34.302584999999993,-103.043978999999979 34.312763999999994,-103.043947553639484 34.376410480771497,-103.043947499824213 34.37651940122479,-103.043946000000005 34.379555000000003,-103.043943999999982 34.37966,-103.043919000000002 34.380915999999992,-103.043693000000005 34.383578,-103.043629999999993 34.384689999999999,-103.043614000000005 34.384968999999998,-103.043612999999993 34.388679000000003,-103.043612999999993 34.390442,-103.043606047260084 34.391254973944719,-103.043584999999993 34.393715999999998,-103.043610999999999 34.397105000000003,-103.043582999999998 34.400677999999999,-103.043537999999998 34.405462999999997,-103.043582 34.455657000000002,-103.043587999999986 34.459662000000002,-103.043588999999997 34.459774000000003,-103.043593999999985 34.46266,-103.043434927764125 34.510540742996007,-103.043071999999981 34.619782,-103.043277851519235 34.65183038816317,-103.0432796163159 34.65210514391012,-103.043285999999995 34.653098999999997,-103.042827000000003 34.671187999999994,-103.042768999999993 34.747360999999998,-103.042770000000004 34.792223999999997,-103.042781000000005 34.850242999999999,-103.042520999999979 34.899546,-103.0425974544018 35.032467348285799,-103.042641999999987 35.109912999999999,-103.043261 35.125058000000003,-103.042519999999996 35.135596,-103.042599999999993 35.142766000000002,-103.042710999999997 35.144734999999997,-103.042568000000003 35.159317999999999,-103.042394999999999 35.178573,-103.042338999999984 35.181922,-103.042366 35.182786,-103.042377000000002 35.183149,-103.042496999999997 35.211862000000004,-103.042775000000006 35.241236999999998,-103.042366 35.250056,-103.041554000000005 35.622487,-103.041484634909168 35.651235429903174,-103.041145999999998 35.791583000000003,-103.041916999999998 35.796441000000002,-103.041715999999994 35.814072000000003,-103.042186 35.825216999999995,-103.04130499999998 35.837693999999999,-103.040823999999986 36.055230999999992,-103.041387523024824 36.229129564686382,-103.041674 36.317534000000002,-103.041745000000006 36.318266999999999,-103.041923999999995 36.500439,-103.00243399999998 36.500397)),((-96.818513748151517 28.172441936006489,-96.816443421354066 28.174808025412563,-96.791958210781445 28.188687337716829,-96.733036581469989 28.190913261798631,-96.70383764358462 28.198245729538105,-96.697421731775194 28.2029594609741,-96.702659211994316 28.211208487181011,-96.703313894801497 28.216445964862743,-96.686815839850283 28.218410020896432,-96.662461568376486 28.227313732447904,-96.66062845144161 28.228884976259902,-96.663116248646261 28.233205895474203,-96.651855673914184 28.251275190431315,-96.607991796426646 28.277069769155677,-96.608122730450688 28.280081317680857,-96.611527096272326 28.281390688369981,-96.610479598706064 28.283092866206033,-96.592934048725994 28.296972182316367,-96.581018783574592 28.302209665072866,-96.553260151988255 28.302340591484768,-96.546975176740276 28.305614018207578,-96.542130508742858 28.315958034472228,-96.528905880514458 28.322504882843088,-96.476269225261575 28.330753906512612,-96.45099839278295 28.337038879223222,-96.434107525610045 28.344764159184386,-96.418918843885365 28.35484630740093,-96.415252604940861 28.362833452872817,-96.417216660974546 28.367154372087118,-96.412895739222876 28.36951123780511,-96.403206408302779 28.371475291301415,-96.401242352269094 28.366892498964241,-96.400558825492723 28.362187299887704,-96.398667286465624 28.349166496619617,-96.397846 28.343512999999998,-96.413700000000006 28.327342999999999,-96.439098999999999 28.319051999999999,-96.495600517783487 28.293964130304811,-96.547774000000004 28.270797999999999,-96.587113635820756 28.248878526668094,-96.611036668198281 28.235548960715661,-96.621533999999983 28.229699999999998,-96.694665999999998 28.18212,-96.758140999999995 28.136872999999998,-96.830820125734775 28.079724674840076,-96.849624000000006 28.064938999999999,-96.854049189790473 28.060788472935577,-96.855594496383262 28.059339080448503,-96.859762278796424 28.055429983997605,-96.896530613737951 28.020943786452513,-96.898080497387397 28.019490100997579,-96.929052999999996 27.990439999999996,-96.96699599999998 27.950531000000002,-97.001440999999986 27.911442,-97.031660000000002 27.869974999999997,-97.041798999999997 27.852925999999997,-97.045408776308051 27.837452569961062,-97.045409609838757 27.837448997003069,-97.04598 27.835004,-97.050599498412936 27.830109781194331,-97.058265753683145 27.821987615677948,-97.076304165860961 27.802876463727326,-97.079565315161531 27.799421374709375,-97.083535350812468 27.795215242050556,-97.085211615730273 27.793439290085495,-97.085394999999991 27.793244999999999,-97.11422230692618 27.755303327915222,-97.116276999999997 27.752599,-97.117304906633777 27.751048809529347,-97.118830196202964 27.748748513687826,-97.139140047561696 27.718119138409879,-97.139351757288111 27.717799858049549,-97.143807202733072 27.711080581371732,-97.165547551982726 27.678293865995041,-97.166583141799606 27.676732088482499,-97.166681999999994 27.676583,-97.184850261879149 27.644709535797791,-97.192144670654784 27.631912600211269,-97.198729900630283 27.620359811436909,-97.201865999999995 27.614857999999998,-97.211651066704889 27.596044174137351,-97.213608899397855 27.592279833590187,-97.221943360361436 27.576255098965802,-97.265194083077162 27.493096589152017,-97.265746568141566 27.492034321708481,-97.276090999999994 27.472145,-97.304469999999995 27.407734,-97.326522999999995 27.347611999999998,-97.347445832595042 27.277936119324231,-97.350397999999998 27.268104999999998,-97.363400999999996 27.210366,-97.370941000000002 27.161165999999998,-97.377001000000007 27.101020999999999,-97.379130000000004 27.047996,-97.378361999999996 26.992877,-97.370730999999992 26.909706,-97.365301177044699 26.875333999999995,-97.365282052674758 26.875212938438843,-97.364726000000005 26.871692999999997,-97.363633430415348 26.866515420001111,-97.352028350385282 26.811520085064032,-97.35141299999998 26.808603999999999,-97.350529648372714 26.805138580575584,-97.333027999999999 26.736478999999996,-97.304204860681779 26.646364129642233,-97.300690000000003 26.635375,-97.297812715808362 26.627503004299889,-97.297022484076606 26.625340999999999,-97.287871455917369 26.600304594305239,-97.275119000000004 26.565415000000002,-97.269391999999982 26.554046,-97.269132970349304 26.553256905349773,-97.257954534248029 26.519203490608863,-97.229844 26.433568999999999,-97.223724090442104 26.411478908273114,-97.206682644704898 26.34996703527348,-97.194643999999997 26.306512999999999,-97.185844000000003 26.267102999999995,-97.177979856301576 26.220346386353309,-97.177168840972797 26.215524458900923,-97.173264999999986 26.192314,-97.170387765328073 26.167037808112223,-97.169872392484734 26.162510314053797,-97.167099005951158 26.138146416702778,-97.161470999999992 26.088705,-97.158662630175101 26.080176913346069,-97.154270970414501 26.066840900880429,-97.161462285840642 26.067639941946975,-97.169842256221145 26.077853024187579,-97.171781452365479 26.102521767945923,-97.179531587141199 26.146202099560895,-97.178745972847352 26.177103221942961,-97.183983445454302 26.214289306886101,-97.194458400817808 26.271639686993655,-97.214884565299002 26.353606215503973,-97.226930759399721 26.385554824668418,-97.240286324189555 26.405980989149626,-97.240845398636537 26.411470089808617,-97.243166933615896 26.434263367616055,-97.247618791929028 26.456260775909261,-97.254165635225121 26.471187589585856,-97.262545605605609 26.482971915638458,-97.27642492679071 26.521729238684483,-97.292399243108349 26.528014213932472,-97.310730412457033 26.556558470596535,-97.308111681228326 26.5712234060755,-97.308635417324538 26.576722756880109,-97.317015387705027 26.597672667607057,-97.318434072834165 26.60022630157264,-97.324871601690262 26.611813856840271,-97.338489044677715 26.647428701777493,-97.33639404954522 26.666021744249065,-97.345821512417203 26.700589103038251,-97.363105189274393 26.710540307081217,-97.370437657013895 26.723895871871047,-97.370961403259614 26.736203954318924,-97.367557047587525 26.740393934434408,-97.364152671616353 26.758986971196869,-97.364646278833362 26.767121661774897,-97.368866408127118 26.774699404876429,-97.370437646864346 26.781508126370166,-97.368342661881371 26.795649318140761,-97.373056398392137 26.808481136684847,-97.387459455673451 26.820789208983193,-97.383531343606066 26.875520854055946,-97.385626348888096 26.88887641440536,-97.391649435788921 26.901970109878395,-97.389554460955466 26.945964918852653,-97.390340075249313 27.05228571820243,-97.389816329003565 27.067212531879022,-97.386411973331462 27.083186832972341,-97.387459455673422 27.090519300711819,-97.390601943297412 27.094185534581555,-97.390078197051665 27.156511519247964,-97.377508246555678 27.199458835730731,-97.379865109736301 27.202863196477598,-97.386673841379576 27.204696313412462,-97.382221972916923 27.229050589961044,-97.37488951532697 27.25026236588155,-97.373318276589728 27.276449754290233,-97.372896734486858 27.277942715507475,-97.367033301341749 27.298709035706306,-97.36467643816114 27.302637142698917,-97.359962701650375 27.304732132756659,-97.357605838469766 27.307874620380655,-97.362319574980518 27.32672953597509,-97.366771423144115 27.333276389420721,-97.36179581858525 27.359987519000377,-97.346607126710992 27.390364889744752,-97.336132171347501 27.402411088920228,-97.331156576938184 27.412362295500575,-97.329585328051422 27.418123524502818,-97.330894688591016 27.425455992242295,-97.329847196099536 27.434359703793774,-97.317277255753083 27.463689574751687,-97.293708603647858 27.497209429631152,-97.282971770086746 27.521563701104967,-97.267627232015485 27.541048841138782,-97.26651977444007 27.542455137362143,-97.266473727822444 27.542513609294531,-97.257831889393842 27.556392930479635,-97.261144559602045 27.562355746269706,-97.261759991311692 27.563463525096239,-97.260450620622564 27.56739163716362,-97.260303240478223 27.567589679048492,-97.252732825146552 27.577762415194865,-97.252070650242061 27.578652211895708,-97.247885553160842 27.581360217573209,-97.247618802078478 27.581532821322067,-97.236881968517352 27.598292751933528,-97.24107194863285 27.602482732049012,-97.241084821027414 27.602523494839662,-97.242643187370078 27.607458346757408,-97.231683715414945 27.631671123728168,-97.231553918442799 27.631957884363242,-97.231382612637987 27.632336350521356,-97.221955159915538 27.632860099304484,-97.221711030183002 27.632638163711842,-97.219074540339648 27.630241360463614,-97.217418907944051 27.630677052710489,-97.214098935780783 27.631550728615359,-97.200743370990949 27.650143776161688,-97.197339005169326 27.664546838517776,-97.19760088336696 27.678426154628117,-97.203474366386629 27.684532651921231,-97.20308902068453 27.688000774441392,-97.200450811776179 27.688974477466285,-97.190006537429824 27.692829222058965,-97.188284576858237 27.695272543577584,-97.170627865440125 27.720325976082009,-97.166176017276527 27.732372180332245,-97.161200407642937 27.734074342943998,-97.153606061705801 27.733288721037997,-97.147321086457822 27.735383711095739,-97.130823034043985 27.751619892924076,-97.127942424617643 27.75580987303956,-97.127680546420009 27.759999858229808,-97.125046985317312 27.763143140340585,-97.103326269871417 27.789067861139614,-97.102999946318647 27.791923200131116,-97.10255066693685 27.795854405604921,-97.102495980878558 27.796332909939515,-97.102278777379922 27.798233445813956,-97.100865886772965 27.802472121847156,-97.098874421707819 27.808446522979796,-97.095168997779496 27.812151946908138,-97.092851314507953 27.81446963017968,-97.092589446459854 27.819183356540908,-97.098874421707819 27.822849590410645,-97.104263831428213 27.822227735056668,-97.126109297533233 27.819707102786651,-97.130299287798252 27.820492727230029,-97.134489267913736 27.825206463740791,-97.132394272781227 27.827301438574235,-97.10670775348396 27.832389859144307,-97.087681973298601 27.836158807756469,-97.056712719518927 27.842293721800239,-97.055822986229373 27.843403727743151,-97.04322620548075 27.859119113080268,-97.013634476624247 27.906780143237341,-97.017955395838555 27.911493874673329,-97.016384146951765 27.917255079570445,-96.985744902767337 27.954048356415132,-96.977888688782102 27.976438572489602,-96.978805242174786 27.978271691961854,-96.980900237307296 27.978271691961854,-96.986006780964971 27.976176699366729,-96.986661461234775 27.980759491703903,-96.978281501003806 28.001709402430844,-96.967806540565562 28.020040576854303,-96.966759042999328 28.020367911280101,-96.965187799187319 28.013297317932185,-96.962569062883844 28.012380759464751,-96.952617853766114 28.01643980428749,-96.946987563862692 28.02652194996665,-96.932453562407773 28.035425661518129,-96.926430465357427 28.043412814602167,-96.929572952981431 28.051399967686208,-96.927085150701998 28.057292130712504,-96.906004298338829 28.076147047258459,-96.890946545563423 28.076801730065643,-96.886232814127425 28.084396073465374,-96.88832780925992 28.086622002621937,-96.889113433703315 28.099453823703399,-96.886887499471996 28.117130312782294,-96.879424092633712 28.131402425890027,-96.874972236857971 28.133235547899659,-96.87078225420511 28.13127149186597,-96.86462821551855 28.126295887307109,-96.857164811217643 28.115559058820768,-96.845380482627661 28.108881273888468,-96.830128556765757 28.111822717849165,-96.827049318353744 28.112416571196771,-96.816574357915513 28.119618104912195,-96.810420321766344 28.126034014184238,-96.810944073086844 28.136378030448888,-96.816836228500989 28.158048094801106,-96.820248352517055 28.163388807027481,-96.822859330626116 28.167475552598326,-96.818513748151517 28.172441936006489)))'));
\ No newline at end of file
diff --git a/webapp/django/contrib/gis/tests/geoapp/sql/country.postgresql_psycopg2.sql b/webapp/django/contrib/gis/tests/geoapp/sql/country.postgresql_psycopg2.sql
new file mode 100644
index 0000000..01c9e73
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/geoapp/sql/country.postgresql_psycopg2.sql
@@ -0,0 +1,4 @@
+-- New Zealand bondary courtesy of 'world_borders.shp', which was assembled from public domain sources by Schuyler Erle. See: http://mappinghacks.com/data/
+-- Texas boundary data is a data product from the U.S. Census Bureau.  See 'state.sql' for more information.
+INSERT INTO geoapp_country ("name", "mpoly") VALUES ('New Zealand', 'SRID=4326;MULTIPOLYGON (((174.616364000000004 -36.100861000000002,174.634978999999987 -36.124718,174.708862000000011 -36.205559,174.781096999999988 -36.266945,174.812744000000009 -36.339165,174.768311000000011 -36.34639,174.710784999999987 -36.525832999999999,174.708587999999992 -36.533332999999999,174.70773299999999 -36.541671999999998,174.714690999999988 -36.595832999999999,174.717194000000006 -36.603057999999997,174.774414000000007 -36.730277999999998,174.808319000000012 -36.805275000000002,174.854400999999996 -36.847777999999998,174.896636999999998 -36.878334000000002,175.011658000000011 -36.871941,175.020813000000004 -36.873610999999997,175.055542000000003 -36.880279999999999,175.076629999999994 -36.890839,175.082458000000003 -36.895279000000002,175.087463000000014 -36.900832999999999,175.091644000000002 -36.925559999999997,175.161652000000004 -36.955559,175.221069 -36.937775000000002,175.230255 -36.939438000000003,175.278320000000008 -36.965279000000002,175.310516000000007 -36.995002999999997,175.319976999999994 -37.005836000000002,175.323853000000014 -37.012222,175.328856999999999 -37.026947,175.330261000000007 -37.035277999999998,175.330535999999995 -37.044449,175.321899000000002 -37.06472,175.31942699999999 -37.095275999999998,175.317748999999992 -37.144165,175.319121999999993 -37.152495999999999,175.328856999999999 -37.168892,175.373290999999995 -37.216659999999997,175.385254000000003 -37.225830000000002,175.404967999999997 -37.228050000000003,175.579131999999987 -37.244446000000003,175.58914200000001 -37.169449,175.551636000000002 -37.024718999999997,175.547484999999995 -37.009171000000002,175.542480000000012 -36.994446000000003,175.536102 -36.980826999999998,175.524993999999992 -36.961669999999998,175.498566000000011 -36.927222999999998,175.484406000000007 -36.920279999999998,175.476348999999999 -36.917777999999998,175.464416999999997 -36.90889,175.435241999999988 -36.866942999999999,175.46691899999999 -36.809998,175.509430000000009 -36.776108,175.486358999999993 -36.679726000000002,175.463593000000003 -36.621383999999999,175.378296000000006 -36.570557,175.366364000000004 -36.561667999999997,175.361633000000012 -36.556389000000003,175.356628 -36.541671999999998,175.353850999999992 -36.525002,175.35244800000001 -36.489998,175.353577 -36.481940999999999,175.360229000000004 -36.478050000000003,175.538025000000005 -36.514724999999999,175.542755 -36.519996999999996,175.604950000000002 -36.622771999999998,175.631072999999986 -36.710555999999997,175.763610999999997 -36.713614999999997,175.840789999999998 -36.754173000000002,175.733582000000013 -36.805832000000002,175.701629999999994 -36.844161999999997,175.707458000000003 -36.869995000000003,175.709960999999993 -36.875275000000002,175.714690999999988 -36.880828999999999,175.720519999999993 -36.885277000000002,175.735779000000008 -36.891387999999999,175.74383499999999 -36.893889999999999,175.758330999999998 -36.876106,175.761382999999995 -36.869446000000003,175.757751000000013 -36.863059999999997,175.753051999999997 -36.857779999999998,175.749114999999989 -36.851394999999997,175.75 -36.843055999999997,175.752196999999995 -36.835555999999997,175.756378000000012 -36.830002,175.765533000000005 -36.828055999999997,175.808013999999986 -36.824173000000002,175.817200000000014 -36.825836000000002,175.833587999999992 -36.830832999999998,175.845519999999993 -36.839722000000002,175.849120999999997 -36.846107000000003,175.878570999999994 -36.914444000000003,175.881072999999986 -36.921669,175.918304000000006 -37.067504999999997,175.917480000000012 -37.075836000000002,175.915253000000007 -37.083061,175.898314999999997 -37.115004999999996,175.884154999999993 -37.168892,175.883330999999998 -37.176949,175.887206999999989 -37.244163999999998,175.892212 -37.249724999999998,175.921082000000013 -37.251671000000002,175.927185000000009 -37.256110999999997,175.93081699999999 -37.262504999999997,175.936371000000008 -37.278885000000002,175.940093999999988 -37.299717,175.974396000000013 -37.418059999999997,175.976074000000011 -37.453055999999997,176.026931999999988 -37.483108999999999,176.035583000000003 -37.487282,176.059417999999994 -37.502502,176.088287000000008 -37.525557999999997,176.093291999999991 -37.531112999999998,176.165526999999997 -37.613892,176.169433999999995 -37.620277000000002,176.167205999999993 -37.625832000000003,176.160247999999996 -37.624167999999997,176.082458000000003 -37.602500999999997,176.066924999999998 -37.59639,176.061095999999992 -37.591942000000003,176.057189999999991 -37.585555999999997,176.062744000000009 -37.580832999999998,176.070800999999989 -37.577781999999999,176.088287000000008 -37.580002,176.095245000000006 -37.576110999999997,176.090239999999994 -37.570838999999999,176.062468999999993 -37.546669,176.023087000000004 -37.528221000000002,176.018767999999994 -37.526057999999999,176.013931000000014 -37.524554999999999,176.007598999999999 -37.524222999999999,175.955535999999995 -37.521110999999998,175.946349999999995 -37.523055999999997,175.940796000000006 -37.527779000000002,175.953583000000009 -37.558891000000003,175.994415000000004 -37.638893000000003,176.071899000000002 -37.655273,176.14498900000001 -37.675277999999999,176.242187999999999 -37.709442000000003,176.267486999999988 -37.676392,176.488281 -37.756667999999998,176.521636999999998 -37.769447,176.527771 -37.773887999999999,176.537475999999998 -37.784447,176.549712999999997 -37.793334999999999,176.656646999999992 -37.855559999999997,176.671082000000013 -37.862502999999997,176.686645999999996 -37.868332000000002,176.759154999999993 -37.892775999999998,176.784149000000014 -37.900275999999998,176.80304000000001 -37.903328000000002,176.819702000000007 -37.904442000000003,176.838287000000008 -37.907501000000003,176.917755 -37.926108999999997,176.943848000000003 -37.932502999999997,177.08273299999999 -37.967216,177.107468000000011 -37.987220999999998,177.159424 -38.013336000000002,177.415253000000007 -37.982498,177.47357199999999 -37.962502,177.545806999999996 -37.919167000000002,177.552459999999996 -37.915000999999997,177.571625000000012 -37.902222000000002,177.599120999999997 -37.878051999999997,177.603577 -37.872498,177.646941999999996 -37.805,177.732178000000005 -37.682502999999997,177.738861000000014 -37.678336999999999,177.746917999999994 -37.675277999999999,177.791931000000005 -37.666946000000003,177.849396000000013 -37.657218999999998,177.858856000000003 -37.656661999999997,177.868010999999996 -37.654442000000003,177.875792999999987 -37.651389999999999,178.0 -37.592224000000002,178.006653 -37.588332999999999,178.012206999999989 -37.583328000000002,178.018004999999988 -37.550831000000002,178.05581699999999 -37.542777999999998,178.064972000000012 -37.542228999999999,178.187744000000009 -37.546951,178.281921000000011 -37.560828999999998,178.306915000000004 -37.568061999999998,178.311919999999986 -37.573334000000003,178.312468999999993 -37.578887999999999,178.306915000000004 -37.583610999999998,178.321075000000008 -37.602500999999997,178.336365 -37.618332000000002,178.34970100000001 -37.626944999999999,178.367737000000005 -37.630828999999999,178.448028999999991 -37.645279000000002,178.457458000000003 -37.646667,178.468018 -37.646949999999997,178.488861000000014 -37.644165,178.497192000000013 -37.646667,178.504424999999998 -37.649994,178.550536999999991 -37.6875,178.555542000000003 -37.692497000000003,178.559692000000013 -37.698883000000002,178.56552099999999 -37.713332999999999,178.562468999999993 -37.719994,178.483306999999996 -37.826393000000003,178.455230999999998 -37.860000999999997,178.449982000000006 -37.865004999999996,178.429687999999999 -37.876944999999999,178.419983000000002 -37.887779000000002,178.350525000000005 -38.004722999999998,178.347473000000008 -38.011116,178.347197999999992 -38.019722000000002,178.348846000000009 -38.027779000000002,178.354950000000002 -38.032218999999998,178.360229000000004 -38.037506,178.364136000000002 -38.043616999999998,178.375792999999987 -38.072777000000002,178.378296000000006 -38.089995999999999,178.377746999999999 -38.09861,178.353850999999992 -38.185555,178.319976999999994 -38.248055,178.318024000000008 -38.255561999999998,178.317474000000004 -38.263893000000003,178.320800999999989 -38.398612999999997,178.302459999999996 -38.528885000000002,178.300536999999991 -38.536391999999999,178.296356000000003 -38.541946000000003,178.158874999999995 -38.649169999999998,178.074982000000006 -38.713889999999999,178.068297999999999 -38.717773,178.060241999999988 -38.721107000000003,178.050812000000008 -38.721381999999998,178.044433999999995 -38.717216,177.928864000000004 -38.722220999999998,177.941070999999994 -38.793616999999998,177.923858999999993 -38.918334999999999,177.917786000000007 -38.942802,177.909697999999992 -38.969718999999998,177.897705000000002 -39.047942999999997,177.893859999999989 -39.064776999999999,177.906708000000009 -39.064278000000002,177.923034999999999 -39.089165,177.942200000000014 -39.091942000000003,177.967743000000013 -39.098334999999999,177.991332999999997 -39.115004999999996,177.996612999999996 -39.120277000000002,177.999390000000005 -39.127495000000003,177.909973000000008 -39.256950000000003,177.898865 -39.267502,177.874968999999993 -39.286118000000002,177.868010999999996 -39.290283000000002,177.861908 -39.285834999999999,177.844970999999987 -39.251396,177.839416999999997 -39.236946000000003,177.824127000000004 -39.193053999999997,177.823577999999998 -39.183883999999999,177.826629999999994 -39.177222999999998,177.841644000000002 -39.152779000000002,177.822021000000007 -39.114445000000003,177.823195999999996 -39.110115,177.82351700000001 -39.105110000000003,177.82119800000001 -39.101275999999999,177.816696000000007 -39.099274,177.680266999999986 -39.075279000000002,177.628845000000013 -39.071114,177.426085999999998 -39.064163,177.387755999999996 -39.077781999999999,177.246917999999994 -39.128334000000002,177.206085000000002 -39.143616000000002,177.149138999999991 -39.165000999999997,177.054961999999989 -39.204445,176.935790999999995 -39.349997999999999,176.931365999999997 -39.355559999999997,176.903870000000012 -39.398055999999997,176.898865 -39.412216,176.89776599999999 -39.438048999999999,176.899414000000007 -39.446387999999999,176.946625000000012 -39.664444000000003,177.01080300000001 -39.654998999999997,177.107178000000005 -39.660828000000002,177.116913000000011 -39.662216,177.120789000000002 -39.66861,177.119110000000006 -39.676108999999997,177.115783999999991 -39.682502999999997,177.08273299999999 -39.729996,177.073577999999998 -39.741385999999999,177.068024000000008 -39.746108999999997,177.059692000000013 -39.749167999999997,177.050262000000004 -39.751396,177.033874999999995 -39.757506999999997,177.028045999999989 -39.762504999999997,177.023590000000013 -39.768059,177.020263999999997 -39.774718999999997,176.894713999999993 -40.034728999999999,176.890533000000005 -40.049728000000002,176.889983999999998 -40.058052000000004,176.89498900000001 -40.082779000000002,176.893035999999995 -40.090279000000002,176.874114999999989 -40.121383999999999,176.834136999999998 -40.181671,176.808319000000012 -40.216659999999997,176.796935999999988 -40.226387000000003,176.687195000000003 -40.321387999999999,176.644135000000006 -40.379997000000003,176.628296000000006 -40.421944000000003,176.539977999999991 -40.495002999999997,176.521362000000011 -40.513893000000003,176.500823999999994 -40.535004,176.441924999999998 -40.600281000000003,176.405243000000013 -40.643889999999999,176.386108000000007 -40.675002999999997,176.35522499999999 -40.688606,176.349396000000013 -40.693610999999997,176.288574000000011 -40.793892,176.239136000000002 -40.90889,176.22079500000001 -40.931671,176.195526 -40.941665999999998,176.172760000000011 -40.952224999999999,176.158600000000007 -40.959999000000003,176.152771 -40.964722000000002,176.142212 -40.975273,176.134154999999993 -40.987502999999997,176.120789000000002 -41.013618,176.11300700000001 -41.035277999999998,176.098297000000002 -41.087218999999997,176.087463000000014 -41.116112,176.080811000000011 -41.129165999999998,176.062195000000003 -41.151938999999999,175.984679999999997 -41.231383999999998,175.955230999999998 -41.255279999999999,175.819121999999993 -41.347220999999998,175.743561 -41.392226999999998,175.736358999999993 -41.396110999999998,175.557738999999998 -41.485000999999997,175.471069 -41.541389000000002,175.427459999999996 -41.564444999999999,175.323028999999991 -41.614449,175.313292999999987 -41.616394,175.230804000000006 -41.620834000000002,175.222197999999992 -41.618332000000002,175.21691899999999 -41.612777999999999,175.184692000000013 -41.535834999999999,175.181915000000004 -41.519447,175.181091000000009 -41.500838999999999,175.188568000000004 -41.461112999999997,175.193024000000008 -41.446106,175.193848000000003 -41.437775000000002,175.191070999999994 -41.430557,175.186095999999992 -41.425002999999997,175.080261000000007 -41.385559,175.063018999999997 -41.380279999999999,175.05304000000001 -41.378608999999997,175.045532000000009 -41.378608999999997,175.027190999999988 -41.381667999999998,174.993286000000012 -41.393332999999998,174.985779000000008 -41.397224,174.972747999999996 -41.405830000000002,174.960509999999999 -41.415275999999999,174.949982000000006 -41.425559999999997,174.944976999999994 -41.431114,174.94165000000001 -41.437775000000002,174.936919999999986 -41.443328999999999,174.918578999999994 -41.448051,174.908600000000007 -41.448334000000003,174.872467 -41.429442999999999,174.86605800000001 -41.425002999999997,174.861084000000005 -41.419724000000002,174.861633000000012 -41.347496,174.863861000000014 -41.340279000000002,174.870789000000002 -41.327224999999999,174.87912 -41.315002,174.883881000000002 -41.309441,174.894440000000003 -41.290000999999997,174.89776599999999 -41.282501000000003,174.899993999999992 -41.275002,174.901916999999997 -41.258338999999999,174.901916999999997 -41.251114,174.898865 -41.234444000000003,174.89498900000001 -41.228050000000003,174.887482000000006 -41.224442000000003,174.827179 -41.218887000000002,174.818848000000003 -41.221938999999999,174.787475999999998 -41.244446000000003,174.778045999999989 -41.255836000000002,174.774414000000007 -41.262222,174.771087999999992 -41.278053,174.778594999999996 -41.281387000000002,174.796082000000013 -41.286949,174.818024000000008 -41.284728999999999,174.824127000000004 -41.289169,174.829407000000003 -41.294724000000002,174.833313000000004 -41.301108999999997,174.832184000000012 -41.309441,174.82995600000001 -41.316665999999998,174.826355000000007 -41.323334000000003,174.821625000000012 -41.328887999999999,174.815796000000006 -41.333610999999998,174.807189999999991 -41.336387999999999,174.744689999999991 -41.347496,174.700531000000012 -41.344444000000003,174.671906000000007 -41.338332999999999,174.654694000000006 -41.333061,174.648314999999997 -41.328612999999997,174.629669000000007 -41.315002,174.59191899999999 -41.27861,174.591644000000002 -41.271385000000002,174.594116000000014 -41.263893000000003,174.601074000000011 -41.250838999999999,174.608306999999996 -41.237777999999999,174.61300700000001 -41.232216,174.619110000000006 -41.23111,174.627746999999999 -41.233887000000003,174.637482000000006 -41.235557999999997,174.648590000000013 -41.234444000000003,174.666931000000005 -41.229720999999998,174.681365999999997 -41.221938999999999,174.694702000000007 -41.213614999999997,174.712738000000002 -41.199440000000003,174.718567000000007 -41.194716999999997,174.800812000000008 -41.100281000000003,174.844421000000011 -41.041671999999998,174.874390000000005 -41.018059,174.882721000000004 -41.015006999999997,174.892486999999988 -41.013061999999998,174.901093000000003 -41.010283999999999,174.908324999999991 -41.006393000000003,174.932189999999991 -40.987502999999997,174.94165000000001 -40.976387000000003,174.945251000000013 -40.969718999999998,174.947478999999987 -40.962218999999997,175.014983999999998 -40.84861,175.09857199999999 -40.755836000000002,175.112731999999994 -40.738892,175.120789000000002 -40.726944000000003,175.127746999999999 -40.713614999999997,175.164153999999996 -40.631943,175.169708000000014 -40.616942999999999,175.171906000000007 -40.609726000000002,175.187468999999993 -40.530830000000002,175.23800700000001 -40.329726999999998,175.23135400000001 -40.280830000000002,175.201629999999994 -40.181671,175.196349999999995 -40.166946000000003,175.178314 -40.134171000000002,175.15554800000001 -40.095832999999999,175.071625000000012 -40.003059,175.055542000000003 -39.987777999999999,175.022217000000012 -39.958053999999997,174.986358999999993 -39.93,174.974120999999997 -39.920836999999999,174.960784999999987 -39.912773,174.938873 -39.902222000000002,174.923034999999999 -39.895836000000003,174.836638999999991 -39.865004999999996,174.828307999999993 -39.862502999999997,174.790802000000014 -39.854720999999998,174.781096999999988 -39.853057999999997,174.751373 -39.865555,174.740509000000003 -39.866661,174.729674999999986 -39.865836999999999,174.57607999999999 -39.829169999999998,174.558013999999986 -39.824722,174.549408 -39.822226999999998,174.542205999999993 -39.818610999999997,174.523865 -39.805,174.421356000000003 -39.726944000000003,174.410521999999986 -39.716942000000003,174.376068000000004 -39.678612,174.353577 -39.639999000000003,174.348846000000009 -39.634444999999999,174.336638999999991 -39.625557,174.316070999999994 -39.613892,174.30886799999999 -39.610283000000003,174.217194000000006 -39.579726999999998,174.208862000000011 -39.577224999999999,174.040802000000014 -39.552779999999998,173.997741999999988 -39.551392,173.986908 -39.550552000000003,173.970245000000006 -39.545279999999998,173.963012999999989 -39.541671999999998,173.871062999999992 -39.483330000000002,173.851898000000006 -39.470551,173.839966000000004 -39.461387999999999,173.810790999999995 -39.4375,173.79525799999999 -39.421944000000003,173.786652000000004 -39.409996,173.775817999999987 -39.390839,173.769713999999993 -39.376944999999999,173.762206999999989 -39.354720999999998,173.754424999999998 -39.305,173.751923000000005 -39.288612,173.751647999999989 -39.269996999999996,173.781921000000011 -39.191383000000002,173.785247999999996 -39.184998,173.800536999999991 -39.169167000000002,173.82995600000001 -39.145836000000003,173.844421000000011 -39.138336000000002,173.868010999999996 -39.128883000000002,173.892761000000007 -39.120552000000004,174.011108000000007 -39.073334000000003,174.114685000000009 -39.024445,174.187744000000009 -38.988608999999997,174.209136999999998 -38.977218999999998,174.226623999999987 -38.972496,174.248016000000007 -38.970551,174.259978999999987 -38.970275999999998,174.281372000000005 -38.969994,174.293029999999987 -38.969994,174.313292999999987 -38.972496,174.351348999999999 -38.979438999999999,174.375244000000009 -38.979163999999997,174.384704999999997 -38.977218999999998,174.392761000000007 -38.974442000000003,174.456359999999989 -38.940277000000002,174.546082000000013 -38.871941,174.557738999999998 -38.860557999999997,174.568024000000008 -38.850281000000003,174.587738000000002 -38.828887999999999,174.594421000000011 -38.815834000000002,174.603302000000014 -38.786118000000002,174.608582000000013 -38.763061999999998,174.625518999999997 -38.677779999999998,174.642486999999988 -38.590836000000003,174.681091000000009 -38.379165999999998,174.724396000000013 -38.185828999999998,174.838561999999996 -38.157218999999998,174.848021999999986 -38.156944000000003,174.85635400000001 -38.154167,174.926636000000002 -38.116112,174.932465000000008 -38.111389000000003,174.940246999999999 -38.101112,174.898590000000013 -38.075004999999997,174.877166999999986 -38.064163,174.892486999999988 -37.976387000000003,174.893585000000002 -37.969994,174.868286000000012 -37.943610999999997,174.861084000000005 -37.939995000000003,174.85522499999999 -37.944716999999997,174.834686000000005 -37.963614999999997,174.830261000000007 -37.969161999999997,174.828033000000005 -37.976661999999997,174.828583000000009 -37.995002999999997,174.822754000000003 -37.999724999999998,174.814696999999995 -38.002502,174.804137999999995 -38.001944999999999,174.797211000000004 -37.998336999999999,174.791077 -37.993614,174.786376999999987 -37.988334999999999,174.783874999999995 -37.980826999999998,174.783600000000007 -37.971663999999997,174.788025000000005 -37.868332000000002,174.788879000000009 -37.860000999999997,174.791077 -37.852783000000002,174.795532000000009 -37.846947,174.819702000000007 -37.829169999999998,174.826629999999994 -37.825279000000002,174.841339000000005 -37.818610999999997,174.872741999999988 -37.806106999999997,174.883330999999998 -37.805,174.903045999999989 -37.807502999999997,174.945251000000013 -37.810555,174.967467999999997 -37.809165999999998,174.975525000000005 -37.806389000000003,174.974975999999998 -37.75,174.974670000000003 -37.740836999999999,174.966644000000002 -37.739998,174.951355000000007 -37.743057,174.94442699999999 -37.745002999999997,174.93081699999999 -37.752502,174.906921000000011 -37.774169999999998,174.870789000000002 -37.783057999999997,174.861633000000012 -37.785004,174.848297000000002 -37.769722000000002,174.828307999999993 -37.710830999999999,174.764160000000004 -37.527779000000002,174.744415000000004 -37.487502999999997,174.724975999999998 -37.447220000000002,174.717467999999997 -37.425002999999997,174.714690999999988 -37.408607000000003,174.714690999999988 -37.399445,174.719116000000014 -37.393616000000002,174.725799999999992 -37.389999000000003,174.744415000000004 -37.385834000000003,174.760528999999991 -37.380279999999999,174.767486999999988 -37.376389000000003,174.773041000000006 -37.371665999999998,174.831635000000006 -37.308052000000004,174.840789999999998 -37.296951,174.840515000000011 -37.291389000000002,174.82995600000001 -37.290557999999997,174.821899000000002 -37.291671999999998,174.812744000000009 -37.293616999999998,174.804687999999999 -37.296393999999999,174.797760000000011 -37.300277999999999,174.766083000000009 -37.321114,174.754700000000014 -37.330559,174.751373 -37.336945,174.744965000000008 -37.359169,174.740509000000003 -37.364722999999998,174.733582000000013 -37.368606999999997,174.724120999999997 -37.368889000000003,174.717194000000006 -37.365279999999998,174.711365 -37.360557999999997,174.701629999999994 -37.349724000000002,174.69442699999999 -37.336945,174.660187000000008 -37.273311999999997,174.645813000000004 -37.236389000000003,174.639709000000011 -37.224442000000003,174.599975999999998 -37.153885000000002,174.578307999999993 -37.115555,174.569976999999994 -37.103614999999998,174.555542000000003 -37.087502,174.551909999999992 -37.080832999999998,174.549712999999997 -37.073616,174.55304000000001 -37.067222999999998,174.558593999999999 -37.0625,174.568848000000003 -37.061385999999999,174.644135000000006 -37.061110999999997,174.661376999999987 -37.065551999999997,174.664977999999991 -37.071944999999999,174.666381999999999 -37.080283999999999,174.661925999999994 -37.085830999999999,174.650542999999999 -37.095275999999998,174.646087999999992 -37.100838000000003,174.648590000000013 -37.108055,174.703856999999999 -37.197777000000002,174.733856000000003 -37.196106,174.716644000000002 -37.154167,174.72357199999999 -37.150275999999998,174.87912 -37.088889999999999,174.887482000000006 -37.059165999999998,174.795532000000009 -37.023055999999997,174.804413000000011 -36.972220999999998,174.824982000000006 -36.960830999999999,174.829407000000003 -36.955002,174.83273299999999 -36.948608,174.828033000000005 -36.943053999999997,174.818848000000003 -36.941383000000002,174.770263999999997 -36.936661,174.696625000000012 -36.93972,174.686095999999992 -36.940834000000002,174.659697999999992 -36.947495000000004,174.653045999999989 -36.951393000000003,174.641662999999994 -36.960830999999999,174.622467 -36.982216,174.619110000000006 -36.988892,174.617187999999999 -36.996108999999997,174.600525000000005 -37.022224,174.524688999999995 -37.045555,174.515533000000005 -37.045555,174.508605999999986 -37.041946000000003,174.502472000000012 -37.037506,174.498016000000007 -37.031944000000003,174.490783999999991 -37.019165,174.484679999999997 -37.005561999999998,174.459228999999993 -36.944031000000003,174.451904000000013 -36.923889000000003,174.446930000000009 -36.909163999999997,174.443024000000008 -36.893616000000002,174.439147999999989 -36.868606999999997,174.436645999999996 -36.852226000000002,174.43386799999999 -36.835555999999997,174.427764999999994 -36.812775000000002,174.422760000000011 -36.798057999999997,174.416655999999989 -36.784171999999998,174.409697999999992 -36.771385000000002,174.406096999999988 -36.765006999999997,174.390533000000005 -36.740279999999998,174.344299000000007 -36.679336999999997,174.301085999999998 -36.62722,174.284973000000008 -36.612777999999999,174.267486999999988 -36.599167,174.236908 -36.568061999999998,174.208862000000011 -36.535277999999998,174.187744000000009 -36.496948000000003,174.17804000000001 -36.467498999999997,174.177764999999994 -36.458336000000003,174.178864000000004 -36.449997000000003,174.181091000000009 -36.442497000000003,174.184417999999994 -36.436110999999997,174.189972000000012 -36.431389000000003,174.196930000000009 -36.427779999999998,174.20495600000001 -36.428612,174.24383499999999 -36.440834000000002,174.251923000000005 -36.443610999999997,174.257751000000013 -36.448051,174.300262000000004 -36.515839,174.348846000000009 -36.601944000000003,174.367919999999998 -36.629165999999998,174.370728000000014 -36.6325,174.422484999999995 -36.667220999999998,174.430542000000003 -36.668059999999997,174.453033000000005 -36.651108,174.456359999999989 -36.644722000000002,174.465515000000011 -36.582779000000002,174.465515000000011 -36.532218999999998,174.442474000000004 -36.414718999999998,174.422211000000004 -36.366112,174.41885400000001 -36.370834000000002,174.391937000000013 -36.395004,174.384978999999987 -36.398887999999999,174.377166999999986 -36.401665,174.303864000000004 -36.395279000000002,174.296935999999988 -36.391669999999998,174.285247999999996 -36.3825,174.276916999999997 -36.370552000000004,174.26998900000001 -36.357779999999998,174.268585000000002 -36.349442000000003,174.268585000000002 -36.342224000000002,174.292205999999993 -36.316947999999996,174.299988000000013 -36.314163,174.308013999999986 -36.316947999999996,174.325531000000012 -36.330283999999999,174.334686000000005 -36.332222000000002,174.36883499999999 -36.331673000000002,174.376891999999998 -36.330832999999998,174.421248999999989 -36.310611999999999,174.50692699999999 -36.267220000000002,174.518311000000011 -36.258057,174.521636999999998 -36.251396,174.519135000000006 -36.245834000000002,174.505248999999992 -36.231383999999998,174.413299999999992 -36.263061999999998,174.378296000000006 -36.286667,174.364685000000009 -36.294167000000002,174.346619000000004 -36.298057999999997,174.336365 -36.298889000000003,174.305237000000005 -36.287506,174.365233999999987 -36.260002,174.442200000000014 -36.169724000000002,174.396087999999992 -36.144447,174.396362000000011 -36.151938999999999,174.394135000000006 -36.159163999999997,174.373290999999995 -36.206389999999999,174.369965000000008 -36.213057999999997,174.358856000000003 -36.222220999999998,174.345245000000006 -36.229720999999998,174.337463000000014 -36.232773000000002,174.33273299999999 -36.229163999999997,174.307738999999998 -36.176949,174.282745000000006 -36.121108999999997,174.274993999999992 -36.118332000000002,174.239409999999992 -36.111389000000003,174.229126000000008 -36.112502999999997,174.195251000000013 -36.131110999999997,174.188568000000004 -36.144165,174.185790999999995 -36.171944000000003,174.191345000000013 -36.176392,174.19830300000001 -36.18,174.217743000000013 -36.182502999999997,174.226898000000006 -36.182502999999997,174.236084000000005 -36.180557,174.244110000000006 -36.183059999999998,174.287749999999988 -36.210281000000002,174.312468999999993 -36.236663999999998,174.314696999999995 -36.243889000000003,174.267212 -36.270279000000002,174.259430000000009 -36.273055999999997,174.251373 -36.272499000000003,174.065796000000006 -36.168334999999999,173.999114999999989 -36.121108999999997,173.994415000000004 -36.115836999999999,173.99105800000001 -36.109444000000003,173.931091000000009 -35.981940999999999,173.938568000000004 -35.934998,173.947478999999987 -35.923889000000003,173.948577999999998 -35.915550000000003,173.946075000000008 -35.908051,173.913879000000009 -35.86972,173.908324999999991 -35.874442999999999,173.903870000000012 -35.879997000000003,173.904967999999997 -35.888336000000002,173.921356000000003 -36.003059,173.980804000000006 -36.121383999999999,173.987731999999994 -36.134171000000002,173.992461999999989 -36.139724999999999,174.124390000000005 -36.263618,174.176085999999998 -36.276947,174.180542000000003 -36.282501000000003,174.198853000000014 -36.343887000000002,174.199982000000006 -36.352226000000002,174.198028999999991 -36.368606999999997,174.194702000000007 -36.375275000000002,174.189147999999989 -36.379722999999998,174.115233999999987 -36.40361,174.089966000000004 -36.411385000000003,174.080811000000011 -36.409438999999999,174.06942699999999 -36.400275999999998,174.065796000000006 -36.393889999999999,174.057465000000008 -36.374718,174.049133000000012 -36.353614999999998,174.044433999999995 -36.338889999999999,174.039703000000003 -36.323334000000003,174.031096999999988 -36.293059999999997,174.020537999999988 -36.273887999999999,173.82607999999999 -36.032501000000003,173.737457000000006 -35.933608999999997,173.727172999999993 -35.923614999999998,173.590515000000011 -35.778053,173.398865 -35.573891000000003,173.395537999999988 -35.567504999999997,173.398865 -35.553612,173.446625000000012 -35.440277000000002,173.465789999999998 -35.429169000000002,173.501923000000005 -35.419724000000002,173.506378000000012 -35.425277999999999,173.540253000000007 -35.430832000000002,173.629943999999995 -35.356667000000002,173.65554800000001 -35.322502,173.65554800000001 -35.313332000000003,173.564147999999989 -35.278053,173.556091000000009 -35.280830000000002,173.551636000000002 -35.286391999999999,173.549712999999997 -35.302779999999998,173.549712999999997 -35.321114,173.551909999999992 -35.328612999999997,173.566924999999998 -35.344161999999997,173.568024000000008 -35.361671,173.566924999999998 -35.36972,173.559143000000006 -35.372771999999998,173.439696999999995 -35.376106,173.416077 -35.384444999999999,173.410247999999996 -35.388893000000003,173.391356999999999 -35.423057999999997,173.39498900000001 -35.449722,173.396087999999992 -35.458053999999997,173.392761000000007 -35.482773000000002,173.386382999999995 -35.523330999999999,173.380524000000008 -35.528053,173.37384 -35.524169999999998,173.306915000000004 -35.449165,173.237731999999994 -35.370277000000002,173.154144000000002 -35.276665,173.103302000000014 -35.226104999999997,173.09191899999999 -35.216942000000003,173.087463000000014 -35.211387999999999,173.09191899999999 -35.1875,173.098846000000009 -35.183608999999997,173.119110000000006 -35.185555,173.12802099999999 -35.1875,173.134704999999997 -35.191108999999997,173.14498900000001 -35.191940000000002,173.152771 -35.189163,173.163879000000009 -35.179169000000002,173.168578999999994 -35.173614999999998,173.18081699999999 -35.156104999999997,173.187468999999993 -35.143332999999998,173.191924999999998 -35.128334000000002,173.196349999999995 -35.104446000000003,173.197478999999987 -35.09639,173.198577999999998 -35.078887999999999,173.198577999999998 -35.051108999999997,173.193848000000003 -35.027222000000002,173.189423000000005 -35.012779000000002,173.179413000000011 -34.993332000000002,173.175812000000008 -34.986946000000003,173.159149000000014 -34.958336000000003,173.151093000000003 -34.946663,173.137755999999996 -34.93,172.947204999999997 -34.716942000000003,172.828033000000005 -34.584442000000003,172.812468999999993 -34.568893000000003,172.722473000000008 -34.495277000000002,172.739136000000002 -34.435555,172.900817999999987 -34.414718999999998,172.911925999999994 -34.414718999999998,173.020813000000004 -34.422226000000002,173.038879000000009 -34.436942999999999,173.043304000000006 -34.517775999999998,173.039977999999991 -34.522224,173.033324999999991 -34.525832999999999,173.024414000000007 -34.527779000000002,173.016662999999994 -34.52861,173.007476999999994 -34.526947,172.997467 -34.498336999999999,172.984130999999991 -34.472771000000002,172.961914000000007 -34.465279000000002,172.955230999999998 -34.468887000000002,172.908324999999991 -34.544167000000002,172.912749999999988 -34.549728000000002,172.923858999999993 -34.558891000000003,172.936095999999992 -34.567222999999998,172.973021999999986 -34.581116000000002,173.053314 -34.665550000000003,173.057738999999998 -34.680283000000003,173.110503999999992 -34.791389000000002,173.120789000000002 -34.810555,173.128570999999994 -34.822502,173.133026 -34.828055999999997,173.13857999999999 -34.832504,173.151916999999997 -34.839995999999999,173.213593000000003 -34.871941,173.242737000000005 -34.884726999999998,173.273314999999997 -34.940834000000002,173.268859999999989 -34.946387999999999,173.262206999999989 -34.959167,173.259978999999987 -34.966659999999997,173.258881000000002 -34.974716,173.259978999999987 -34.983055,173.264709000000011 -35.014449999999997,173.269135000000006 -35.019722000000002,173.317474000000004 -35.018889999999999,173.328583000000009 -35.009444999999999,173.358856000000003 -34.98111,173.36300700000001 -34.975555,173.366364000000004 -34.968887000000002,173.373259999999988 -34.936774999999997,173.371246000000014 -34.927444,173.400817999999987 -34.863334999999999,173.426085999999998 -34.82,173.450806 -34.807777000000002,173.500274999999988 -34.864722999999998,173.499114999999989 -34.871108999999997,173.492461999999989 -34.874718,173.452453999999989 -34.887779000000002,173.443297999999999 -34.889724999999999,173.433319000000012 -34.890555999999997,173.413025000000005 -34.888893000000003,173.405243000000013 -34.892502,173.399719000000005 -34.897224,173.399719000000005 -34.906387000000002,173.402190999999988 -34.913887000000003,173.411590999999987 -34.931778,173.419128 -34.945830999999998,173.426909999999992 -34.957779000000002,173.431641000000013 -34.963332999999999,173.44165000000001 -34.973328000000002,173.454131999999987 -34.981667000000002,173.467467999999997 -34.988892,173.475525000000005 -34.991669000000002,173.493286000000012 -34.995277000000002,173.541655999999989 -34.988608999999997,173.561645999999996 -34.958893000000003,173.562468999999993 -34.950836000000002,173.566924999999998 -34.936110999999997,173.572478999999987 -34.931389000000003,173.579131999999987 -34.927779999999998,173.589416999999997 -34.928612,173.83914200000001 -35.004173000000002,174.101074000000011 -35.121108999999997,174.098297000000002 -35.161667,174.091644000000002 -35.158051,174.056641000000013 -35.155555999999997,174.021911999999986 -35.164161999999997,174.008026 -35.207504,174.008026 -35.215004,174.011382999999995 -35.221381999999998,174.018311000000011 -35.224997999999999,174.093841999999995 -35.225273,174.100525000000005 -35.228881999999999,174.143585000000002 -35.328612999999997,174.208008000000007 -35.323334000000003,174.218018 -35.322226999999998,174.247741999999988 -35.27861,174.319976999999994 -35.232773000000002,174.383881000000002 -35.337775999999998,174.461638999999991 -35.445273999999998,174.491913000000011 -35.485275,174.575806 -35.601944000000003,174.577179 -35.610000999999997,174.577147999999994 -35.618088,174.569976999999994 -35.648055999999997,174.563292999999987 -35.651665,174.530272999999994 -35.649445,174.520263999999997 -35.648612999999997,174.513306 -35.645004,174.505248999999992 -35.642502,174.479126000000008 -35.641945,174.47357199999999 -35.646393000000003,174.474975999999998 -35.654716,174.518311000000011 -35.724167,174.523041000000006 -35.729438999999999,174.554137999999995 -35.750281999999999,174.561919999999986 -35.753059,174.583862000000011 -35.764724999999999,174.60244800000001 -35.844444000000003,174.596924 -35.849167,174.58914200000001 -35.851944000000003,174.577758999999986 -35.852226000000002,174.560790999999995 -35.847777999999998,174.554961999999989 -35.843330000000002,174.538574000000011 -35.819450000000003,174.523314999999997 -35.796669,174.519713999999993 -35.790283000000002,174.49105800000001 -35.769447,174.361908 -35.723328000000002,174.357451999999995 -35.72361,174.34857199999999 -35.734726000000002,174.346924 -35.833061,174.350525000000005 -35.839438999999999,174.35522499999999 -35.845001000000003,174.360779000000008 -35.849442000000003,174.381348000000003 -35.851112,174.384704999999997 -35.844718999999998,174.385528999999991 -35.828887999999999,174.391083000000009 -35.824173000000002,174.398865 -35.821387999999999,174.437468999999993 -35.822777000000002,174.476074000000011 -35.824173000000002,174.486358999999993 -35.824722,174.519713999999993 -35.844718999999998,174.525542999999999 -35.849167,174.524414000000007 -35.855559999999997,174.521362000000011 -35.862220999999998,174.501373 -35.889999000000003,174.496917999999994 -35.895553999999997,174.487182999999987 -35.915000999999997,174.495513999999986 -35.988608999999997,174.498016000000007 -35.994163999999998,174.514160000000004 -36.008614,174.56942699999999 -36.037224000000002,174.578583000000009 -36.038894999999997,174.587738000000002 -36.038894999999997,174.596619000000004 -36.036667,174.606902999999988 -36.037506,174.612731999999994 -36.042228999999999,174.622192000000013 -36.053055,174.62912 -36.065834000000002,174.629394999999988 -36.075004999999997,174.616364000000004 -36.100861000000002)),((171.185241999999988 -44.938332000000003,171.182129000000003 -44.94173,171.175017999999994 -44.949902000000002,171.167923000000002 -44.959850000000003,171.165436 -44.966599000000002,171.164703000000003 -44.970275999999998,171.163299999999992 -44.978332999999999,171.149719000000005 -44.996665999999998,171.07995600000001 -45.067222999999998,171.02664200000001 -45.103332999999999,170.975525000000005 -45.151108,170.966063999999989 -45.163055,170.961914000000007 -45.169167000000002,170.921630999999991 -45.243057,170.873566000000011 -45.358055,170.873290999999995 -45.367218,170.876891999999998 -45.373885999999999,170.871338000000009 -45.424171,170.859955000000014 -45.487502999999997,170.855804000000006 -45.493889000000003,170.750274999999988 -45.61972,170.674682999999987 -45.745002999999997,170.616913000000011 -45.839438999999999,170.55886799999999 -45.881667999999998,170.554413000000011 -45.888053999999997,170.555542000000003 -45.896110999999998,170.591063999999989 -45.894165,170.600525000000005 -45.891669999999998,170.608582000000013 -45.888053999999997,170.658600000000007 -45.858612,170.718018 -45.817504999999997,170.724670000000003 -45.813057,170.773314999999997 -45.782775999999998,170.781096999999988 -45.786391999999999,170.790802000000014 -45.806946000000003,170.790802000000014 -45.84639,170.788879000000009 -45.863892,170.783051 -45.878334000000002,170.776366999999993 -45.882773999999998,170.699982000000006 -45.911667,170.664429000000013 -45.908332999999999,170.57330300000001 -45.916663999999997,170.550536999999991 -45.919167000000002,170.484406000000007 -45.926949,170.452453999999989 -45.931946000000003,170.424408 -45.939438000000003,170.382721000000004 -45.956108,170.342467999999997 -45.97361,170.315246999999999 -45.991385999999999,170.309692000000013 -45.996948000000003,170.294433999999995 -46.013893000000003,170.281646999999992 -46.029442000000003,170.263610999999997 -46.051940999999999,170.256378000000012 -46.065551999999997,170.253051999999997 -46.081947,170.252472000000012 -46.09111,170.254424999999998 -46.107779999999998,170.252777000000009 -46.115836999999999,170.240783999999991 -46.146949999999997,170.237731999999994 -46.154167,170.226623999999987 -46.165000999999997,170.214416999999997 -46.174720999999998,170.193848000000003 -46.188048999999999,170.169433999999995 -46.198608,170.067748999999992 -46.246665999999998,169.911925999999994 -46.340279000000002,169.863585999999998 -46.371383999999999,169.858001999999999 -46.376663,169.849396000000013 -46.389442000000003,169.848021999999986 -46.416946000000003,169.849975999999998 -46.433326999999998,169.852172999999993 -46.440834000000002,169.853850999999992 -46.457504,169.850799999999992 -46.464722000000002,169.845245000000006 -46.469994,169.701904000000013 -46.558052000000004,169.631348000000003 -46.581947,169.458008000000007 -46.623328999999998,169.266388000000006 -46.656387000000002,169.133026 -46.670836999999999,169.107727000000011 -46.669167000000002,169.097197999999992 -46.666946000000003,169.084411999999986 -46.657501000000003,169.067200000000014 -46.635002,169.061919999999986 -46.675002999999997,169.053864000000004 -46.678612,169.008026 -46.680832000000002,168.883330999999998 -46.667777999999998,168.878296000000006 -46.661942000000003,168.861908 -46.628334000000002,168.862457000000006 -46.619446000000003,168.864409999999992 -46.611114999999998,168.864959999999996 -46.603889000000002,168.844970999999987 -46.563614,168.835784999999987 -46.560555,168.823853000000014 -46.561110999999997,168.733306999999996 -46.577499000000003,168.640533000000005 -46.603889000000002,168.633605999999986 -46.606392,168.614685000000009 -46.611114999999998,168.593018 -46.614165999999997,168.568848000000003 -46.615004999999996,168.516937000000013 -46.614165999999997,168.492737000000005 -46.613334999999999,168.442138999999997 -46.601500999999999,168.436630000000008 -46.599666999999997,168.446625000000012 -46.584003000000003,168.442200000000014 -46.575004999999997,168.454407000000003 -46.574447999999997,168.490509000000003 -46.573059,168.502472000000012 -46.574173000000002,168.506103999999993 -46.578887999999999,168.499114999999989 -46.583328000000002,168.505553999999989 -46.588051,168.551636000000002 -46.594444000000003,168.561371000000008 -46.591942000000003,168.566924999999998 -46.586661999999997,168.563599000000011 -46.580002,168.550812000000008 -46.570557,168.541655999999989 -46.567504999999997,168.391356999999999 -46.540000999999997,168.361908 -46.544449,168.353577 -46.547783000000003,168.351623999999987 -46.556106999999997,168.352172999999993 -46.564444999999999,168.362731999999994 -46.583885000000002,168.348236000000014 -46.582165000000003,168.352904999999993 -46.584499,168.359267999999986 -46.585830999999999,168.365082 -46.592666999999999,168.367248999999987 -46.596668,168.367599000000013 -46.601497999999999,168.364928999999989 -46.605331,168.35775799999999 -46.604500000000002,168.351409999999987 -46.603164999999997,168.275269000000009 -46.557777000000002,168.269135000000006 -46.535561,168.268311000000011 -46.529167,168.27664200000001 -46.525832999999999,168.286102 -46.523330999999999,168.307738999999998 -46.520553999999997,168.318297999999999 -46.520836000000003,168.318848000000003 -46.529167,168.321075000000008 -46.536667,168.328856999999999 -46.540557999999997,168.339416999999997 -46.539169,168.386658000000011 -46.497779999999999,168.392486999999988 -46.492226000000002,168.395537999999988 -46.485000999999997,168.396087999999992 -46.477775999999999,168.394135000000006 -46.470275999999998,168.37384 -46.421944000000003,168.36883499999999 -46.416106999999997,168.359679999999997 -46.415000999999997,168.350249999999988 -46.417503000000004,168.250274999999988 -46.400832999999999,168.211090000000013 -46.355277999999998,168.206085000000002 -46.351394999999997,168.194702000000007 -46.345551,168.185516000000007 -46.342498999999997,168.174988000000013 -46.340279000000002,168.116364000000004 -46.343612999999998,168.063873 -46.351669,167.955535999999995 -46.371383999999999,167.893035999999995 -46.387222,167.850799999999992 -46.399445,167.832184000000012 -46.398612999999997,167.824401999999992 -46.394447,167.753875999999991 -46.333885000000002,167.776916999999997 -46.312775000000002,167.781372000000005 -46.306389000000003,167.783600000000007 -46.298340000000003,167.781372000000005 -46.290840000000003,167.778045999999989 -46.284171999999998,167.701904000000013 -46.209442000000003,167.596924 -46.166389000000002,167.556641000000013 -46.156387000000002,167.546356000000003 -46.154167,167.534424 -46.152779000000002,167.483032000000009 -46.149726999999999,167.471069 -46.149994,167.460236000000009 -46.151389999999999,167.451904000000013 -46.154716,167.446075000000008 -46.159996,167.415526999999997 -46.204720000000002,167.356628 -46.254447999999996,167.280272999999994 -46.273055999999997,167.261108000000007 -46.267775999999998,167.238555999999988 -46.263893000000003,167.086638999999991 -46.240555,167.001373 -46.229163999999997,166.966063999999989 -46.224716,166.949982000000006 -46.223885000000003,166.915253000000007 -46.226104999999997,166.883026 -46.229996,166.836365 -46.232498,166.823028999999991 -46.231667000000002,166.768035999999995 -46.22361,166.726348999999999 -46.214165,166.717467999999997 -46.210830999999999,166.705230999999998 -46.201110999999997,166.670806999999996 -46.161667,166.67025799999999 -46.15361,166.684417999999994 -46.145004,166.693848000000003 -46.142775999999998,166.709411999999986 -46.135277000000002,166.738861000000014 -46.119163999999998,166.761230000000012 -46.093612999999998,166.784911999999991 -46.064945000000002,166.804748999999987 -46.033279,166.82995600000001 -46.003891000000003,166.854674999999986 -45.994163999999998,166.886932000000002 -45.990279999999998,166.943297999999999 -45.956108,166.949127000000004 -45.950836000000002,166.946930000000009 -45.945273999999998,166.939147999999989 -45.944716999999997,166.929687999999999 -45.947220000000002,166.836365 -45.981383999999998,166.828033000000005 -45.984444000000003,166.791350999999992 -46.005004999999997,166.785797000000002 -46.010283999999999,166.781096999999988 -46.016396,166.759308000000004 -46.035553,166.762969999999996 -46.038387,166.764969000000008 -46.042392999999997,166.763656999999995 -46.047221999999998,166.760162000000008 -46.050392000000002,166.740982000000002 -46.066059000000003,166.737793000000011 -46.066558999999998,166.670532000000009 -46.087218999999997,166.615783999999991 -46.090836000000003,166.613585999999998 -46.086387999999999,166.617461999999989 -46.059722999999998,166.621062999999992 -46.052498,166.640807999999993 -46.015006999999997,166.661652000000004 -45.991942999999999,166.625792999999987 -45.967216,166.492461999999989 -46.013061999999998,166.484406000000007 -46.014449999999997,166.474975999999998 -46.002785000000003,166.467194000000006 -45.990555,166.465239999999994 -45.983055,166.464690999999988 -45.839438999999999,166.468841999999995 -45.823059,166.472473000000008 -45.815834000000002,166.476898000000006 -45.809722999999998,166.537475999999998 -45.798889000000003,166.613861000000014 -45.801108999999997,166.652190999999988 -45.800277999999999,166.699982000000006 -45.798889000000003,166.881348000000003 -45.779998999999997,166.890807999999993 -45.777779000000002,166.974120999999997 -45.735000999999997,166.987182999999987 -45.709724,166.923034999999999 -45.705832999999998,166.912475999999998 -45.705275999999998,166.887482000000006 -45.705002,166.854126000000008 -45.707779000000002,166.825806 -45.714722000000002,166.809417999999994 -45.721381999999998,166.787475999999998 -45.689995000000003,166.775817999999987 -45.662773,166.81153900000001 -45.617942999999997,166.811217999999997 -45.613109999999999,166.812531000000007 -45.608111999999998,166.816710999999998 -45.605606000000002,166.869689999999991 -45.588779000000002,166.881026999999989 -45.586112999999997,166.88736 -45.585278000000002,166.895203000000009 -45.585608999999998,166.901366999999993 -45.587108999999998,166.912871999999993 -45.590946000000002,166.980255 -45.578612999999997,166.991913000000011 -45.580002,167.0 -45.576949999999997,167.005829000000006 -45.571671000000002,167.032470999999987 -45.527779000000002,167.041350999999992 -45.501396,166.989685000000009 -45.519165,166.891693000000004 -45.544724000000002,166.796875 -45.569389,166.791199000000006 -45.570720999999999,166.784836000000013 -45.571556,166.777023000000014 -45.571219999999997,166.710509999999999 -45.579445,166.704407000000003 -45.574447999999997,166.697204999999997 -45.554718,166.699127000000004 -45.546669,166.757476999999994 -45.425277999999999,166.801361000000014 -45.353614999999998,166.821625000000012 -45.320557,166.86883499999999 -45.279724000000002,166.880797999999999 -45.279167,167.008330999999998 -45.341667,167.038299999999992 -45.357779999999998,167.146941999999996 -45.427222999999998,167.16885400000001 -45.472496,167.205230999999998 -45.477775999999999,167.211914000000007 -45.475273,167.21414200000001 -45.467216,167.209411999999986 -45.461387999999999,167.173584000000005 -45.422775,167.158019999999993 -45.406661999999997,167.134978999999987 -45.386116,167.12912 -45.381385999999999,167.115509000000003 -45.372222999999998,167.097747999999996 -45.366112,167.087463000000014 -45.363616999999998,167.061645999999996 -45.345001000000003,167.051085999999998 -45.333328000000002,167.081421000000006 -45.325333,167.08407600000001 -45.321666999999998,167.092407000000009 -45.316498000000003,167.097243999999989 -45.314498999999998,167.114227 -45.310333,167.163574000000011 -45.302833999999997,167.169922000000014 -45.302998000000002,167.173584000000005 -45.305999999999997,167.176422000000002 -45.309330000000003,167.17756700000001 -45.313834999999997,167.212738000000002 -45.313332000000003,167.218841999999995 -45.318336000000002,167.232178000000005 -45.327224999999999,167.239685000000009 -45.331116000000002,167.248566000000011 -45.334167,167.260254000000003 -45.335830999999999,167.270813000000004 -45.334442000000003,167.301636000000002 -45.329445,167.309692000000013 -45.326110999999997,167.307738999999998 -45.318610999999997,167.300262000000004 -45.314444999999999,167.19464099999999 -45.271445999999997,167.138290000000012 -45.268943999999998,167.099471999999992 -45.272114000000002,167.094146999999992 -45.271278000000002,167.08964499999999 -45.268776000000003,167.002196999999995 -45.201110999999997,166.996917999999994 -45.145836000000003,167.146362000000011 -45.001671000000002,167.198577999999998 -44.956108,167.204407000000003 -44.951110999999997,167.228302000000014 -44.930832000000002,167.24105800000001 -44.921387000000003,167.260528999999991 -44.907501000000003,167.267486999999988 -44.903053,167.312744000000009 -44.875,167.320800999999989 -44.871383999999999,167.393462999999997 -44.862999000000002,167.398987000000005 -44.861496000000002,167.404312000000004 -44.863498999999997,167.421798999999993 -44.894168999999998,167.422974000000011 -44.898665999999999,167.420638999999994 -44.908496999999997,167.417968999999999 -44.912166999999997,167.440796000000006 -44.928612,167.439972000000012 -44.9375,167.441924999999998 -44.945,167.459686000000005 -44.99472,167.497741999999988 -45.003891000000003,167.507202000000007 -45.001396,167.508224000000013 -45.0,167.511658000000011 -44.995277000000002,167.511108000000007 -44.986946000000003,167.47908000000001 -44.903446000000002,167.465912000000003 -44.876441999999997,167.462752999999992 -44.867947,167.461578000000003 -44.863444999999999,167.460097999999988 -44.853946999999998,167.459411999999986 -44.843944999999998,167.459914999999995 -44.838444000000003,167.448577999999998 -44.795279999999998,167.453033000000005 -44.788894999999997,167.458587999999992 -44.783614999999998,167.59970100000001 -44.683883999999999,167.743010999999996 -44.611671,167.838866999999993 -44.498610999999997,167.850249999999988 -44.488052000000003,167.949982000000006 -44.40361,167.963593000000003 -44.395004,168.034973000000008 -44.353614999999998,168.12802099999999 -44.316947999999996,168.141662999999994 -44.308052000000004,168.144713999999993 -44.300834999999999,168.144135000000006 -44.292503000000004,168.124099999999999 -44.251404,168.143311000000011 -44.253059,168.153594999999996 -44.251396,168.169708000000014 -44.24472,168.288299999999992 -44.172775,168.29385400000001 -44.167503000000004,168.336638999999991 -44.123885999999999,168.339966000000004 -44.116661,168.337738000000002 -44.109169,168.334411999999986 -44.102783000000002,168.336365 -44.094444000000003,168.369689999999991 -44.043334999999999,168.374968999999993 -44.037781000000003,168.383026 -44.034447,168.402771 -44.029724000000002,168.672211000000004 -43.987777999999999,168.676909999999992 -43.993614,168.683043999999995 -43.998336999999999,168.690246999999999 -44.002228000000002,168.715239999999994 -44.012222,168.723021999999986 -44.012504999999997,168.753875999999991 -44.010002,168.764160000000004 -44.008614,168.824401999999992 -43.988334999999999,168.858582000000013 -43.976661999999997,168.866364000000004 -43.973328000000002,168.879669000000007 -43.964447,168.885254000000003 -43.959167,168.961914000000007 -43.90361,169.080765000000014 -43.848472999999998,169.142212 -43.794167000000002,169.224396000000013 -43.743332000000002,169.271636999999998 -43.722496,169.387482000000006 -43.679169000000002,169.491318000000007 -43.643467,169.539153999999996 -43.633614,169.62661700000001 -43.613892,169.64498900000001 -43.608893999999999,169.652771 -43.605559999999997,169.660521999999986 -43.601944000000003,169.721619000000004 -43.573334000000003,169.728302000000014 -43.568893000000003,169.739136000000002 -43.558052000000004,169.767486999999988 -43.522773999999998,169.790526999999997 -43.496665999999998,169.871062999999992 -43.406661999999997,169.884154999999993 -43.397781000000002,169.961638999999991 -43.371941,170.021911999999986 -43.352500999999997,170.028594999999996 -43.347777999999998,170.033874999999995 -43.342498999999997,170.038025000000005 -43.336112999999997,170.049408 -43.306946000000003,170.111358999999993 -43.254173000000002,170.288299999999992 -43.107779999999998,170.418029999999987 -43.052498,170.523041000000006 -43.010559,170.531921000000011 -43.008057,170.583037999999988 -42.990555,170.674347000000012 -42.958739999999999,170.704407000000003 -42.945830999999998,170.750549000000007 -42.924720999999998,170.781096999999988 -42.910553,170.794128 -42.901389999999999,171.065796000000006 -42.648055999999997,171.108306999999996 -42.608055,171.149719000000005 -42.563614,171.153594999999996 -42.55722,171.196075000000008 -42.476661999999997,171.225799999999992 -42.433608999999997,171.230255 -42.40889,171.235779000000008 -42.394165,171.247467 -42.375,171.260254000000003 -42.366112,171.270537999999988 -42.355003000000004,171.297760000000011 -42.310279999999999,171.304413000000011 -42.296669,171.309692000000013 -42.281944000000003,171.31665000000001 -42.249724999999998,171.321075000000008 -42.224716,171.322754000000003 -42.207222000000002,171.324401999999992 -42.18972,171.326355000000007 -42.172226000000002,171.329131999999987 -42.155830000000002,171.343841999999995 -42.110832000000002,171.361084000000005 -42.067779999999999,171.461638999999991 -41.859726000000002,171.51080300000001 -41.764449999999997,171.533051 -41.766396,171.557738999999998 -41.766663,171.569121999999993 -41.766112999999997,171.650817999999987 -41.761391000000003,171.663025000000005 -41.757781999999999,171.685790999999995 -41.746948000000003,171.790526999999997 -41.696387999999999,171.85522499999999 -41.652779000000002,171.886658000000011 -41.629997000000003,171.942200000000014 -41.550277999999999,172.02276599999999 -41.443053999999997,172.053864000000004 -41.417503000000004,172.064972000000012 -41.40361,172.122192000000013 -41.277779000000002,172.111633000000012 -41.236114999999998,172.10522499999999 -41.153053,172.106078999999994 -40.911385000000003,172.10635400000001 -40.893059,172.108856000000003 -40.885559,172.113861000000014 -40.879997000000003,172.186645999999996 -40.813332000000003,172.218567000000007 -40.785834999999999,172.22470100000001 -40.781109,172.255248999999992 -40.776947,172.263884999999988 -40.774169999999998,172.271362000000011 -40.770553999999997,172.299408 -40.755004999999997,172.348297000000002 -40.727493000000003,172.382721000000004 -40.698334000000003,172.426909999999992 -40.657775999999998,172.478302000000014 -40.613892,172.513320999999991 -40.598441999999999,172.517639000000003 -40.596783000000002,172.523482999999999 -40.597946,172.522644000000014 -40.602943000000003,172.521132999999992 -40.607277000000003,172.520813000000004 -40.625,172.519440000000003 -40.631385999999999,172.525542999999999 -40.6325,172.534149000000014 -40.631667999999998,172.571899000000002 -40.617775000000002,172.596343999999988 -40.601394999999997,172.62802099999999 -40.573891000000003,172.631621999999993 -40.567222999999998,172.631621999999993 -40.559998,172.608582000000013 -40.556946000000003,172.601348999999999 -40.558891000000003,172.597014999999999 -40.553333000000002,172.589690999999988 -40.558838000000002,172.583862000000011 -40.560004999999997,172.581024000000014 -40.556671,172.581848000000008 -40.551665999999997,172.589843999999999 -40.541172000000003,172.627166999999986 -40.511947999999997,172.633330999999998 -40.509171000000002,172.661376999999987 -40.502785000000003,172.712188999999995 -40.495552000000004,172.817748999999992 -40.504173000000002,172.861358999999993 -40.507781999999999,172.981628 -40.527222000000002,172.991332999999997 -40.529167,172.989959999999996 -40.53389,172.978026999999997 -40.53389,172.945251000000013 -40.530830000000002,172.895263999999997 -40.524445,172.797211000000004 -40.516112999999997,172.739959999999996 -40.516945,172.731628 -40.519722000000002,172.656921000000011 -40.653328000000002,172.701355000000007 -40.748336999999999,172.855804000000006 -40.853057999999997,172.865509000000003 -40.853057999999997,172.875244000000009 -40.851112,172.907195999999999 -40.828887999999999,172.930266999999986 -40.802222999999998,172.935241999999988 -40.796669,172.976623999999987 -40.781944000000003,172.985229000000004 -40.781112999999998,173.002196999999995 -40.786667,173.008330999999998 -40.791114999999998,173.013306 -40.796669,173.020537999999988 -40.809722999999998,173.051085999999998 -40.869446000000003,173.059692000000013 -40.962775999999998,173.059692000000013 -40.971938999999999,173.056091000000009 -40.978606999999997,173.031646999999992 -41.027495999999999,173.075806 -41.291114999999998,173.079680999999994 -41.297500999999997,173.085784999999987 -41.302222999999998,173.105529999999987 -41.313332000000003,173.168029999999987 -41.316108999999997,173.188873 -41.313332000000003,173.198853000000014 -41.311385999999999,173.207184000000012 -41.308608999999997,173.272217000000012 -41.274445,173.278320000000008 -41.269722000000002,173.32607999999999 -41.222496,173.340515000000011 -41.205832999999998,173.351623999999987 -41.195549,173.377166999999986 -41.178055,173.426085999999998 -41.150275999999998,173.598021999999986 -41.053612,173.606628 -41.052498,173.639709000000011 -41.073616,173.672760000000011 -41.070557,173.720519999999993 -41.060279999999999,173.727753000000007 -41.056389000000003,173.739959999999996 -41.047226000000002,173.744689999999991 -41.032501000000003,173.743286000000012 -41.024169999999998,173.738281 -41.018608,173.72744800000001 -41.019447,173.718841999999995 -41.022499000000003,173.696930000000009 -41.033614999999998,173.690796000000006 -41.038338000000003,173.682189999999991 -41.041114999999998,173.676085999999998 -41.036391999999999,173.673584000000005 -41.029167,173.674682999999987 -41.020836000000003,173.678314 -41.014449999999997,173.696625000000012 -41.000281999999999,173.751373 -40.976944000000003,173.800262000000004 -40.969161999999997,173.913299999999992 -40.931671,173.984679999999997 -40.896949999999997,173.994415000000004 -40.896667,174.02276599999999 -40.913055,174.027771 -40.91861,174.030272999999994 -40.925834999999999,174.03054800000001 -40.935271999999998,174.02941899999999 -40.943610999999997,174.022217000000012 -40.947220000000002,173.929961999999989 -40.992226000000002,173.832184000000012 -40.995002999999997,173.821075000000008 -40.994163999999998,173.782195999999999 -41.009171000000002,173.778594999999996 -41.015555999999997,173.769713999999993 -41.09861,173.778594999999996 -41.114449,173.794433999999995 -41.109444000000003,173.822204999999997 -41.080832999999998,173.821899000000002 -41.062218,173.836638999999991 -41.055,173.846343999999988 -41.053055,173.93081699999999 -41.049446000000003,173.946625000000012 -41.055832000000002,173.953033000000005 -41.060555,173.917755 -41.087502,173.887482000000006 -41.103332999999999,173.848846000000009 -41.144165,173.820526 -41.245834000000002,173.763306 -41.267502,173.76080300000001 -41.273055999999997,173.775817999999987 -41.289726000000002,173.788025000000005 -41.290557999999997,173.806365999999997 -41.289444000000003,174.03720100000001 -41.218330000000002,174.09970100000001 -41.198334000000003,174.128845000000013 -41.187218,174.133605999999986 -41.181671,174.133605999999986 -41.176108999999997,174.126068000000004 -41.174171,174.008605999999986 -41.175277999999999,174.001099000000011 -41.178885999999999,174.001373 -41.186385999999999,174.000274999999988 -41.194716999999997,173.993010999999996 -41.198334000000003,173.981902999999988 -41.199440000000003,173.932738999999998 -41.199997000000003,173.908324999999991 -41.199997000000003,173.899719000000005 -41.197495000000004,173.893585000000002 -41.192771999999998,173.887206999999989 -41.169724000000002,173.88580300000001 -41.161667,173.888031000000012 -41.154167,173.89776599999999 -41.133614,173.902466000000004 -41.128334000000002,174.032745000000006 -40.999724999999998,174.084411999999986 -41.021385000000002,174.094116000000014 -41.023330999999999,174.246338000000009 -41.044724000000002,174.258330999999998 -41.035277999999998,174.299408 -41.003616,174.315246999999999 -41.000557,174.323853000000014 -41.003334000000002,174.323853000000014 -41.010834000000003,174.321625000000012 -41.018059,174.209960999999993 -41.197495000000004,174.161376999999987 -41.225555,174.152771 -41.226661999999997,174.114685000000009 -41.231383999999998,174.052185000000009 -41.235000999999997,174.02664200000001 -41.236114999999998,174.053864000000004 -41.254173000000002,174.206359999999989 -41.269447,174.214966000000004 -41.266663,174.291655999999989 -41.238892,174.303588999999988 -41.229720999999998,174.320800999999989 -41.220275999999998,174.326904000000013 -41.222771000000002,174.288574000000011 -41.276947,174.249114999999989 -41.322502,174.241637999999995 -41.326110999999997,174.231902999999988 -41.328055999999997,174.208587999999992 -41.329445,174.193572999999986 -41.320281999999999,174.155243000000013 -41.305,174.148041000000006 -41.308608999999997,174.111633000000012 -41.336661999999997,174.052764999999994 -41.421112,174.049133000000012 -41.427779999999998,174.044433999999995 -41.442497000000003,174.045806999999996 -41.450836000000002,174.049988000000013 -41.466392999999997,174.063873 -41.493057,174.084136999999998 -41.526108,174.097473000000008 -41.519447,174.096069 -41.511116,174.100799999999992 -41.505561999999998,174.108306999999996 -41.509171000000002,174.114685000000009 -41.513893000000003,174.125792999999987 -41.523887999999999,174.151093000000003 -41.551392,174.176085999999998 -41.578612999999997,174.178864000000004 -41.586112999999997,174.179961999999989 -41.594444000000003,174.179137999999995 -41.602783000000002,174.174133000000012 -41.608336999999999,174.163299999999992 -41.618606999999997,174.157195999999999 -41.623328999999998,174.193024000000008 -41.685555,174.287749999999988 -41.734444000000003,174.291655999999989 -41.740836999999999,174.289153999999996 -41.748336999999999,174.283324999999991 -41.762222,174.236358999999993 -41.837218999999997,174.212188999999995 -41.865279999999998,174.201355000000007 -41.875557,174.184143000000006 -41.890555999999997,174.17804000000001 -41.895004,174.164703000000003 -41.90361,174.157195999999999 -41.907218999999998,174.143585000000002 -41.915832999999999,174.088561999999996 -41.957779000000002,174.009154999999993 -42.027495999999999,173.979674999999986 -42.061110999999997,173.965239999999994 -42.086945,173.959136999999998 -42.100838000000003,173.954407000000003 -42.115555,173.953307999999993 -42.123885999999999,173.953583000000009 -42.133330999999998,173.956359999999989 -42.166389000000002,173.933319000000012 -42.196944999999999,173.928314 -42.202499000000003,173.884154999999993 -42.243614,173.87802099999999 -42.248055,173.870513999999986 -42.251944999999999,173.86300700000001 -42.255561999999998,173.834686000000005 -42.271385000000002,173.801361000000014 -42.293059999999997,173.794983000000002 -42.297500999999997,173.568572999999986 -42.476944000000003,173.558593999999999 -42.487777999999999,173.541350999999992 -42.511947999999997,173.533874999999995 -42.525002,173.531372000000005 -42.532218999999998,173.500823999999994 -42.599724000000002,173.480804000000006 -42.621941,173.466063999999989 -42.656944000000003,173.459960999999993 -42.670836999999999,173.448853000000014 -42.690277000000002,173.387755999999996 -42.793616999999998,173.351623999999987 -42.840836000000003,173.328033000000005 -42.898887999999999,173.328033000000005 -42.906387000000002,173.325806 -42.913612,173.285521999999986 -42.958053999999997,173.106902999999988 -43.057777000000002,173.099396000000013 -43.061385999999999,173.090515000000011 -43.064444999999999,173.026366999999993 -43.081947,172.975799999999992 -43.09111,172.953033000000005 -43.092773,172.935516000000007 -43.098334999999999,172.92025799999999 -43.105834999999999,172.838012999999989 -43.148055999999997,172.818024000000008 -43.160828000000002,172.797760000000011 -43.183059999999998,172.772217000000012 -43.219718999999998,172.76080300000001 -43.239165999999997,172.758026 -43.246665999999998,172.726944000000003 -43.415539000000003,172.726593000000008 -43.423355,172.775817999999987 -43.612220999999998,172.894135000000006 -43.61972,172.90554800000001 -43.620834000000002,173.059692000000013 -43.653053,173.100525000000005 -43.697220000000002,173.105529999999987 -43.703612999999997,173.114409999999992 -43.741385999999999,173.116913000000011 -43.762504999999997,173.116913000000011 -43.769996999999996,173.112182999999987 -43.825004999999997,173.110779000000008 -43.833328000000002,173.091644000000002 -43.856392,173.058593999999999 -43.871108999999997,173.006088000000005 -43.869498999999998,173.002242999999993 -43.868999000000002,172.999236999999994 -43.865668999999997,172.990905999999995 -43.849670000000003,172.965239999999994 -43.802222999999998,172.961365 -43.764449999999997,172.958862000000011 -43.756950000000003,172.951355000000007 -43.755279999999999,172.939972000000012 -43.756110999999997,172.927185000000009 -43.766112999999997,172.921906000000007 -43.771667,172.920532000000009 -43.824173000000002,172.920532000000009 -43.833328000000002,172.917572000000007 -43.869221000000003,172.923584000000005 -43.875884999999997,172.931243999999992 -43.881390000000003,172.937408000000005 -43.887886000000002,172.938904000000008 -43.892384,172.938247999999987 -43.896220999999997,172.870789000000002 -43.904442000000003,172.861633000000012 -43.901389999999999,172.811919999999986 -43.882216999999997,172.804413000000011 -43.878334000000002,172.745789000000002 -43.837775999999998,172.740783999999991 -43.832222000000002,172.736908 -43.825836000000002,172.715239999999994 -43.808334000000002,172.642761000000007 -43.772224,172.513031000000012 -43.729438999999999,172.495238999999998 -43.723885000000003,172.483582000000013 -43.722771000000002,172.472197999999992 -43.72361,172.424988000000013 -43.733612,172.413299999999992 -43.743614,172.390258999999986 -43.763893000000003,172.384978999999987 -43.77861,172.382445999999987 -43.795006,172.383330999999998 -43.8125,172.384704999999997 -43.820838999999999,172.394713999999993 -43.850281000000003,172.393311000000011 -43.858612,172.386932000000002 -43.863334999999999,172.367461999999989 -43.867775000000002,172.297211000000004 -43.881110999999997,172.286925999999994 -43.883057,172.275542999999999 -43.883887999999999,172.189696999999995 -43.909163999999997,172.050812000000008 -43.965279000000002,171.978577 -43.995834000000002,171.955230999999998 -44.006667999999998,171.941070999999994 -44.015006999999997,171.782470999999987 -44.076949999999997,171.654694000000006 -44.122498,171.583587999999992 -44.153885000000002,171.547211000000004 -44.173889000000003,171.538483000000014 -44.178775999999999,171.355559999999997 -44.285491999999998,171.346465999999992 -44.292186999999998,171.342467999999997 -44.295555,171.319976999999994 -44.316391000000003,171.293578999999994 -44.343612999999998,171.285521999999986 -44.356392,171.278594999999996 -44.369995000000003,171.271911999999986 -44.383887999999999,171.269135000000006 -44.391112999999997,171.275542999999999 -44.395836000000003,171.279144000000002 -44.402495999999999,171.278594999999996 -44.420836999999999,171.277190999999988 -44.428885999999999,171.275542999999999 -44.437218,171.26998900000001 -44.451942000000003,171.263306 -44.465553,171.254974000000004 -44.478332999999999,171.214966000000004 -44.533057999999997,171.208313000000004 -44.537506,171.200531000000012 -44.541114999999998,171.196075000000008 -44.560279999999999,171.192200000000014 -44.645836000000003,171.193024000000008 -44.663330000000002,171.20495600000001 -44.700279000000002,171.21414200000001 -44.739165999999997,171.215239999999994 -44.747498,171.207184000000012 -44.851112,171.198577999999998 -44.919998,171.195800999999989 -44.927498,171.185241999999988 -44.938332000000003)))');
+INSERT INTO geoapp_country ("name", "mpoly") VALUES ('Texas', 'SRID=4326;MULTIPOLYGON (((-103.00243399999998 36.500397,-102.90421904194784 36.500393342967676,-102.8402359524855 36.500390960558398,-102.840235952479716 36.500390960558398,-102.840235952474345 36.500390960558398,-102.840235952468362 36.500390960558398,-102.840235952461725 36.500390960558398,-102.840235952455885 36.500390960558398,-102.792077446284736 36.500389167377229,-102.643207699865854 36.500383624214699,-102.366462330167067 36.500373319605465,-102.250452999999979 36.500368999999999,-102.24499 36.500703999999999,-102.162463000000002 36.500326,-102.12545 36.500323999999999,-102.124752896301885 36.500398159967887,-102.122066000000004 36.500684,-101.930244999999999 36.500526,-101.925344139375468 36.500484781341967,-101.914929315957153 36.500397187533892,-101.826564999999988 36.499653999999992,-101.826498 36.499535000000002,-101.81449312121488 36.499579719643286,-101.788110000000003 36.499678000000003,-101.783359000000004 36.499709000000003,-101.781987 36.499718,-101.780609999999982 36.499727,-101.779435000000007 36.499733999999997,-101.773235954788092 36.499732939140301,-101.709314000000006 36.499721999999998,-101.698684999999998 36.499507999999999,-101.653707999999995 36.499572999999998,-101.649966000000006 36.499572999999998,-101.623914999999997 36.499527999999998,-101.414793008557069 36.499417763984319,-101.392608849457574 36.499406069885133,-101.340061173170298 36.499378370041477,-101.085155999999984 36.499243999999997,-101.052418000000003 36.499562999999995,-101.04533099999999 36.499540000000003,-100.977087999999995 36.499594999999999,-100.936058000000003 36.499602000000003,-100.918513000000004 36.499620999999998,-100.884174000000002 36.499682,-100.884079999999997 36.499682,-100.859656999999984 36.499687000000002,-100.850840000000005 36.49969999999999,-100.824235999999999 36.499617999999998,-100.824218000000002 36.499617999999998,-100.80619 36.499673999999999,-100.806172000000004 36.499634,-100.802909 36.499620999999998,-100.802886 36.499620999999998,-100.761810999999994 36.499617999999998,-100.761810999999994 36.499580000000002,-100.724361999999999 36.499580000000002,-100.724361000000002 36.499558,-100.708625999999995 36.499552999999999,-100.708628000000004 36.499520999999994,-100.657762999999989 36.499482999999991,-100.657762999999989 36.499499999999998,-100.648342999999997 36.499495000000003,-100.648343999999994 36.499462999999999,-100.592613999999998 36.499468999999998,-100.592555999999988 36.499468999999998,-100.592551 36.499428999999999,-100.583539000000002 36.499482999999991,-100.583378999999994 36.499442999999999,-100.578113999999999 36.499462999999999,-100.578113999999999 36.499439000000002,-100.546144999999996 36.499343000000003,-100.531215000000003 36.499341,-100.531215000000003 36.499290000000002,-100.530478000000002 36.49924,-100.530314000000004 36.499357000000003,-100.522227 36.499290999999999,-100.441064999999995 36.499490000000002,-100.441063999999997 36.499462,-100.433959000000002 36.499456000000002,-100.421327999999988 36.499447000000004,-100.421300999999985 36.499487999999999,-100.413634000000002 36.499443999999997,-100.41355 36.499468999999998,-100.378634000000005 36.499516999999997,-100.378591999999998 36.499445,-100.35185199999998 36.499487000000002,-100.351841999999991 36.499473000000002,-100.334463999999997 36.49942,-100.334440999999998 36.49944,-100.324150000000003 36.499679,-100.311244999999985 36.499631,-100.311018000000004 36.499687999999999,-100.310642999999985 36.499642,-100.253572851827684 36.499638031344489,-100.181220999999994 36.499633000000003,-100.090020999999993 36.499634,-100.000405999999984 36.499701999999999,-100.0004059967807 36.499497793115623,-100.00040222345956 36.260147946939995,-100.000399000000002 36.055677000000003,-100.000396170268971 35.879197994164429,-100.000394020347557 35.745115995014778,-100.000391999999991 35.619115,-100.000390396259149 35.519130234823749,-100.000386875554753 35.299632926398459,-100.000386874882437 35.299591010324292,-100.000386852473085 35.298193905884737,-100.000384999999994 35.182701999999999,-100.000381972929958 34.852568985943549,-100.000381605014198 34.812443999872983,-100.000381000000004 34.746460999999996,-100.000381000000004 34.570853999999997,-100.000381000000004 34.570647,-100.000381000000004 34.560509000000003,-99.998254592787575 34.560446149085699,-99.997501461048799 34.560423888524269,-99.985833 34.560079000000002,-99.974761999999998 34.561317999999993,-99.971554999999995 34.562179,-99.965608000000003 34.565843999999998,-99.958898000000005 34.571271000000003,-99.957540999999992 34.572708999999996,-99.95755299999999 34.574168999999998,-99.956716999999998 34.576523999999992,-99.954566999999997 34.578195,-99.94571999999998 34.579273,-99.930492488760507 34.576894921075187,-99.930189904388058 34.576847666503667,-99.929333999999997 34.576714000000003,-99.923210999999995 34.574551999999997,-99.921801000000002 34.570253,-99.915771000000007 34.565975000000002,-99.914151070156151 34.564995899308187,-99.898943000000003 34.555804000000002,-99.896006999999997 34.555529999999997,-99.89376 34.554219000000003,-99.887146999999999 34.549047000000002,-99.885392392967745 34.547401436342639,-99.884583851343237 34.546643143067669,-99.87806651563541 34.540530839522475,-99.87650823800611 34.539069404005723,-99.874403 34.537095,-99.873254000000003 34.535350999999999,-99.872356999999994 34.532096000000003,-99.868953000000005 34.52761499999999,-99.867217250163094 34.525864500605081,-99.853065999999998 34.511592999999998,-99.832903999999985 34.500067999999999,-99.825324999999992 34.497596,-99.818185999999997 34.487839999999991,-99.818738999999979 34.484975999999996,-99.814544624457952 34.476663062301249,-99.814312999999984 34.476204000000003,-99.793683999999999 34.453893999999998,-99.783787954821193 34.445078397966533,-99.782985999999994 34.444364,-99.775743000000006 34.444225000000003,-99.774224411180043 34.443216449834381,-99.765598999999995 34.437488000000002,-99.764825999999999 34.436433999999998,-99.764881999999986 34.435265999999999,-99.767647999999994 34.431854,-99.767234000000002 34.430501999999997,-99.754248000000004 34.421288999999994,-99.740907000000007 34.414763,-99.735679661059166 34.413018903486261,-99.730348000000006 34.411239999999992,-99.720258999999999 34.406295,-99.719721039768913 34.405807854123296,-99.716415999999995 34.402814999999997,-99.715089000000006 34.400753999999999,-99.714231999999996 34.397821999999998,-99.714838 34.394523999999997,-99.712682 34.390928000000002,-99.707900999999993 34.387538999999997,-99.696461999999997 34.381036000000002,-99.678282999999979 34.379798999999998,-99.672337448339604 34.378003970284972,-99.671377000000007 34.377713999999997,-99.666676988468737 34.374633899592595,-99.665992000000003 34.374184999999997,-99.665404581506792 34.374094751646162,-99.662705000000003 34.373679999999993,-99.659863615570984 34.374283464835351,-99.659362000000002 34.374389999999998,-99.654194000000004 34.376519000000002,-99.649662000000006 34.379885000000002,-99.630904999999998 34.376007,-99.628541546335526 34.375150829397036,-99.624196999999995 34.373576999999997,-99.600026 34.374687999999999,-99.596322999999998 34.377136999999998,-99.587595999999991 34.385866999999998,-99.587235087741874 34.386377538370702,-99.585718954359294 34.388522226586467,-99.585441999999986 34.388914,-99.584530999999984 34.391204999999999,-99.585306000000003 34.398122,-99.584479999999985 34.407673000000003,-99.580059999999989 34.416652999999997,-99.574366999999995 34.418281,-99.569695999999993 34.418418000000003,-99.563067665646059 34.417445690943012,-99.562203999999994 34.417318999999999,-99.561530791054494 34.417028950664999,-99.555986000000004 34.414639999999999,-99.549242000000007 34.412714999999992,-99.529786 34.411451999999997,-99.528744576810823 34.411579971493573,-99.523649999999989 34.412205999999998,-99.517623999999998 34.414493999999991,-99.514279999999999 34.414034999999998,-99.499874999999989 34.409607999999999,-99.497090999999983 34.407730999999991,-99.494103999999993 34.404755000000002,-99.490425999999999 34.399693999999997,-99.487218999999982 34.397955000000003,-99.477547 34.396355,-99.477019613816751 34.396364300212412,-99.474810232095294 34.396403261641368,-99.472297823530695 34.396447566809115,-99.470968999999997 34.396470999999991,-99.463286816319666 34.393024688790533,-99.452647999999996 34.388252,-99.445020999999983 34.379891999999998,-99.440759999999997 34.374122999999997,-99.430994999999982 34.373413999999997,-99.43081720973791 34.373532661492725,-99.420432000000005 34.380464000000003,-99.408847999999992 34.372776000000002,-99.407167999999999 34.372605,-99.406018176721332 34.372844364351735,-99.404336527339453 34.373194441551952,-99.402959999999979 34.373480999999998,-99.399602999999999 34.375078999999999,-99.397253000000006 34.377870999999999,-99.396160718377317 34.383134276834824,-99.391492 34.405631,-99.393918999999997 34.415273999999989,-99.396488000000005 34.417290999999999,-99.396901999999997 34.418688000000003,-99.397009999999995 34.424002999999999,-99.395768462359129 34.43494110377263,-99.394955999999993 34.442098999999999,-99.381011 34.456935999999999,-99.376037841709419 34.458617501802458,-99.375365000000002 34.458844999999997,-99.369609999999994 34.458699000000003,-99.358795 34.455862999999994,-99.354671999999994 34.451856999999997,-99.35478257092818 34.450383391084422,-99.354837000000003 34.449657999999999,-99.356770999999995 34.446542,-99.357101999999998 34.444915000000002,-99.356712999999999 34.442143999999999,-99.350407000000004 34.437083,-99.342020261837703 34.431514649700844,-99.341336999999996 34.431061,-99.341016600261696 34.430906286427735,-99.334036999999995 34.427536000000003,-99.331050066208874 34.424666026137302,-99.328674000000007 34.422383000000004,-99.325094009617374 34.416010263301388,-99.324222000000006 34.414458000000003,-99.321411663781888 34.411055277053073,-99.319798627189357 34.409102230797522,-99.319605999999979 34.408869000000003,-99.318363000000005 34.408295999999993,-99.316372999999999 34.408204999999995,-99.308273999999997 34.410013999999997,-99.299098 34.414227999999994,-99.294647999999981 34.415373000000002,-99.289922000000004 34.414731000000003,-99.287844819286008 34.413958196831629,-99.264167 34.405149000000002,-99.261320999999981 34.403498999999996,-99.261255940568432 34.403158389836314,-99.260996786434447 34.401801622187399,-99.259199386422964 34.392391568987605,-99.258998120407611 34.391337867029385,-99.258979999999994 34.391243000000003,-99.259239630132384 34.391043961974496,-99.260703756811225 34.389921531074158,-99.261190999999997 34.389547999999998,-99.262646013804954 34.388906249865343,-99.264243556741917 34.388201635660714,-99.264508000000006 34.388084999999997,-99.271031915197597 34.387722560266795,-99.271781628057255 34.38768090955238,-99.273607516746409 34.387579471291865,-99.273957999999993 34.38756,-99.27534 34.386598999999997,-99.274925999999994 34.384903999999999,-99.271845396288441 34.382114976063626,-99.271280999999988 34.381603999999996,-99.258696 34.372633999999998,-99.254722 34.372405,-99.251407999999984 34.375079999999997,-99.248969000000002 34.375984000000003,-99.242944999999992 34.372667999999997,-99.239138083830497 34.366035888164781,-99.237232999999989 34.362716999999996,-99.237183660287812 34.362563767173611,-99.235448627455725 34.357175329079247,-99.234251999999984 34.353459,-99.233273999999994 34.344101000000002,-99.23260599999999 34.342379999999999,-99.229993999999991 34.340538000000002,-99.226152999999982 34.339725999999999,-99.221975 34.340020000000003,-99.219768999999999 34.341377,-99.217335000000006 34.341520000000003,-99.213134999999994 34.340369000000003,-99.210957832415772 34.336710386428308,-99.210716000000005 34.336303999999998,-99.20972399999998 34.324934999999996,-99.211600000000004 34.313969999999998,-99.213476 34.310671999999997,-99.213233598142949 34.308226764636807,-99.211647999999997 34.292231999999991,-99.211468055040228 34.291676209875057,-99.209990337717599 34.287112032604114,-99.209742000000006 34.286344999999997,-99.209514950796304 34.286049346749877,-99.207560999999998 34.283504999999998,-99.203681000000003 34.281925999999999,-99.200221999999997 34.281151999999999,-99.196259999999995 34.281463000000002,-99.196052113016066 34.281264951942028,-99.19571031750732 34.280939333014615,-99.195605 34.280839,-99.194569999999985 34.272424,-99.196926000000005 34.260928999999997,-99.197153 34.244298,-99.19555299999999 34.24006,-99.191138999999993 34.23234,-99.190145999999984 34.229660000000003,-99.190036000000006 34.227186000000003,-99.192076 34.222192,-99.192683000000002 34.218825000000002,-99.192104 34.216693999999997,-99.189758414718312 34.214539281858485,-99.189510999999996 34.214312,-99.188483307800709 34.214128939694163,-99.159015999999994 34.20888,-99.143985 34.214762999999998,-99.138220000000004 34.219158999999998,-99.130609000000007 34.219408,-99.128513999999996 34.218766000000002,-99.127549000000002 34.217986000000003,-99.126614000000004 34.21532899999999,-99.127525000000006 34.213771,-99.130089999999996 34.212192000000002,-99.131552999999997 34.209352000000003,-99.131884999999997 34.207382000000003,-99.129791999999995 34.204402999999999,-99.126566999999994 34.203004,-99.119203999999996 34.201746999999997,-99.108757999999995 34.203400999999999,-99.102001344898341 34.205813362825268,-99.092190999999985 34.209316,-99.08119261238302 34.211229594305671,-99.079534999999993 34.211517999999991,-99.075978000000006 34.211221000000002,-99.06646499999998 34.208404000000002,-99.060343999999986 34.204760999999991,-99.059158999999994 34.202928999999997,-99.058800000000005 34.201256,-99.058083999999994 34.200569000000002,-99.048792000000006 34.198208999999999,-99.043470999999997 34.198208,-99.040961999999993 34.200842000000002,-99.039004000000006 34.204667,-99.037458999999998 34.206454,-99.036272999999994 34.206912000000003,-99.013074999999986 34.203221999999997,-99.005790000000005 34.206646999999997,-99.002916243275195 34.208781598893673,-99.002945441244265 34.209102775846141,-99.003147197273819 34.211322087284138,-99.003432988816769 34.214465787333673,-99.000760999999997 34.217643000000002,-98.99085199999999 34.221632999999997,-98.987293999999991 34.221223000000002,-98.981363999999999 34.217582999999991,-98.978684999999984 34.210231,-98.976586999999995 34.206291,-98.974131999999983 34.203566000000002,-98.969003 34.201298999999999,-98.966301999999999 34.201323000000002,-98.962469999999996 34.204667999999998,-98.962085000000002 34.206386000000002,-98.962306999999981 34.211312,-98.960791 34.213029999999996,-98.958474999999993 34.213854999999995,-98.952512999999982 34.212649999999996,-98.950395999999984 34.21168,-98.940219999999997 34.203685999999998,-98.928145 34.192689,-98.927456000000006 34.191155000000002,-98.923128999999989 34.185977999999999,-98.920704 34.183435000000003,-98.918333000000004 34.181831000000003,-98.909348999999992 34.177498999999997,-98.892677318093561 34.17250349095427,-98.87651287834953 34.167659972141138,-98.872921999999988 34.166584,-98.871543000000003 34.165026999999995,-98.871211000000002 34.163012000000002,-98.872229000000004 34.160446,-98.874954999999986 34.157031000000003,-98.874871999999996 34.155656999999998,-98.873271000000003 34.153596,-98.868116 34.149635000000004,-98.862549999999999 34.149110999999998,-98.860124999999996 34.149912999999998,-98.858418999999998 34.152732,-98.8579 34.159627,-98.857321999999982 34.161093999999999,-98.855585000000005 34.161620999999997,-98.854264541670545 34.16164976192438,-98.831114999999983 34.162154,-98.812953999999991 34.158444000000003,-98.806809999999984 34.155901,-98.804411553093104 34.153928907629435,-98.792015000000006 34.143735999999997,-98.779288744496085 34.140194111533035,-98.773070373738221 34.138463455122455,-98.767587610783494 34.136937528280072,-98.765569999999983 34.136375999999998,-98.764702233233265 34.135780085954792,-98.763778343962841 34.135145631382905,-98.761796999999987 34.133785000000003,-98.760558000000003 34.132387999999999,-98.759485999999995 34.128881999999997,-98.759653 34.126911999999997,-98.757118934362524 34.12470437936247,-98.757036999999983 34.124633000000003,-98.753813984496389 34.124468645349353,-98.749290999999999 34.124237999999998,-98.741966000000005 34.125529999999998,-98.740191287161664 34.126850584722824,-98.739461000000006 34.127394000000002,-98.737231999999992 34.130991999999999,-98.736819999999994 34.133374000000003,-98.735471000000004 34.135207999999999,-98.734286999999995 34.135758000000003,-98.730242646678789 34.1359250861193,-98.717536999999993 34.136450000000004,-98.716104 34.135947000000002,-98.70640034274598 34.134745066348501,-98.696517999999998 34.133521000000002,-98.690291400890658 34.133167457450512,-98.690072 34.133155000000002,-98.688275858887323 34.134465065675442,-98.685589983550884 34.136424083851644,-98.676900633591032 34.14276190388366,-98.676457484208683 34.143085127260051,-98.670573548505118 34.147376740066704,-98.655654999999982 34.158257999999996,-98.650582999999997 34.163113000000003,-98.648072999999997 34.164440999999997,-98.643223000000006 34.164530999999997,-98.635729999999995 34.161617999999997,-98.634085211037615 34.161100728840964,-98.630950281399748 34.160114822001631,-98.621666000000005 34.157195000000002,-98.620507214282355 34.157012478916968,-98.617663812339856 34.156564612849806,-98.616732999999996 34.156418000000002,-98.615748434938936 34.156446107485429,-98.612133570686254 34.156549305078279,-98.611829 34.156557999999997,-98.610173632571488 34.157093658210222,-98.610154152422197 34.157099961766605,-98.608852999999996 34.157521000000003,-98.603977999999998 34.160249,-98.599789 34.160570999999997,-98.577135999999996 34.148961999999997,-98.572451 34.145091,-98.560191000000003 34.133201999999997,-98.558593000000002 34.128253999999998,-98.550916999999998 34.119334000000002,-98.536257000000006 34.107343,-98.530610999999993 34.099843,-98.528199999999998 34.094960999999998,-98.504182 34.072370999999997,-98.487068052145446 34.063003092954936,-98.486783271268621 34.06284720836274,-98.486328 34.062598,-98.483944186894661 34.06241565608709,-98.482821069121968 34.062329745958955,-98.482039999999998 34.062269999999998,-98.475065999999998 34.064269000000003,-98.449033999999983 34.073461999999999,-98.446378999999993 34.075429999999997,-98.445784000000003 34.076827000000002,-98.445590305319797 34.079232123390703,-98.445584999999994 34.079298,-98.445259148452962 34.079797720749731,-98.443724000000003 34.082152,-98.442807999999999 34.083143999999997,-98.442148160210323 34.083427517317581,-98.441104460406791 34.083875970068213,-98.440092000000007 34.084311,-98.439068026005657 34.084479541105658,-98.434822808733685 34.08517828308225,-98.432126999999994 34.085622,-98.43151641213494 34.085605425226575,-98.43092946822253 34.085589492282431,-98.428479999999993 34.085523000000002,-98.425229999999999 34.084798999999997,-98.422252999999998 34.083036999999997,-98.419995 34.082487999999998,-98.419161945519861 34.082694545588339,-98.41804644206556 34.082971120917755,-98.417812999999995 34.083029000000003,-98.414426000000006 34.085073999999999,-98.400747497198822 34.098985940284976,-98.399776999999986 34.099972999999999,-98.398505572550647 34.104180252359392,-98.39838899999998 34.104565999999998,-98.398160000000004 34.121395999999997,-98.400493999999995 34.121777999999999,-98.400966999999994 34.122236,-98.398441000000005 34.128456,-98.384381000000005 34.146317000000003,-98.381237999999996 34.149453999999999,-98.367493999999994 34.156190999999993,-98.366862955318183 34.156357896864854,-98.364023000000003 34.157108999999998,-98.34173552164826 34.153594120579292,-98.339428832109121 34.153230340726623,-98.331172907733077 34.151928328079421,-98.326986688030772 34.151268134169193,-98.325445000000002 34.151024999999997,-98.324621914768684 34.150650086831803,-98.323612587945547 34.150190341106089,-98.322580000000002 34.149720000000002,-98.320651676675396 34.148059023851737,-98.318749999999994 34.146420999999997,-98.315432139066189 34.144301906683673,-98.312023538956254 34.142124858924547,-98.300208999999995 34.134579000000002,-98.299345719035045 34.134365643147696,-98.29862570169189 34.134187693395319,-98.293901000000005 34.133020000000002,-98.280321 34.130749999999999,-98.258217018239392 34.129574098564007,-98.256467 34.129480999999998,-98.254901718278489 34.129708262798985,-98.247953999999993 34.13071699999999,-98.241012999999995 34.133102999999998,-98.225282000000007 34.127245000000002,-98.223600000000005 34.125093,-98.216463000000005 34.121820999999997,-98.203710999999998 34.117676000000003,-98.200074999999998 34.116782999999998,-98.191455000000005 34.115752999999998,-98.169120000000007 34.114170999999999,-98.157411999999994 34.120466999999998,-98.154353999999998 34.122734,-98.142753999999996 34.136358999999999,-98.136769999999999 34.144992000000002,-98.130815999999996 34.150531999999998,-98.123377000000005 34.154539999999997,-98.114506000000006 34.154727,-98.109461999999979 34.154110999999993,-98.107064999999992 34.152531000000003,-98.101937000000007 34.146829999999994,-98.092021474678845 34.132735952269094,-98.090223999999992 34.130181,-98.089754999999982 34.128211,-98.090659999999986 34.12198,-98.092421000000002 34.116917,-98.095117999999999 34.11119,-98.096177285423778 34.109455137055363,-98.096466125075011 34.108982084942461,-98.099327999999986 34.104295,-98.101378023037029 34.101786489578267,-98.103538246996251 34.099143131812454,-98.104308999999986 34.098199999999999,-98.119416999999999 34.084474,-98.121038999999996 34.081265999999999,-98.120207999999991 34.072127000000002,-98.11802999999999 34.067064999999999,-98.114587 34.06228,-98.100919767943822 34.050244792175462,-98.099096110217346 34.048638900093685,-98.096177018664264 34.044625138601674,-98.096541898037387 34.040976263553816,-98.09727167092565 34.038969381040054,-98.097731364247636 34.038509687718062,-98.098001443813914 34.038239608151798,-98.102015208841422 34.03732738850595,-98.104022094890695 34.036232725638037,-98.104083244997014 34.036133356900422,-98.105481647738245 34.033860956680144,-98.105481647738245 34.032444902147553,-98.105481647738245 34.031306746267951,-98.103616999999986 34.029206999999992,-98.088202999999993 34.005481000000003,-98.085260000000005 34.003259,-98.082839000000007 34.002412,-98.055197000000007 33.995840999999999,-98.050169864666017 33.994989457544634,-98.041117 33.993456000000002,-98.027671999999981 33.993357000000003,-98.019485000000003 33.993803999999997,-98.018481521828946 33.993960861546498,-98.005667000000003 33.995964,-97.987387999999996 33.999822999999999,-97.982805999999997 34.001949000000003,-97.978243000000006 34.005386999999999,-97.974597608872358 34.00657735007583,-97.974172999999993 34.006715999999997,-97.973934144800623 34.006593661859519,-97.971670000000003 34.005434,-97.968339999999998 34.000529999999998,-97.965354903485249 33.996992503283089,-97.963375425210828 33.994646717187933,-97.96302799999998 33.994235000000003,-97.962715090700769 33.994009516348072,-97.958325000000002 33.990845999999998,-97.955849999999998 33.990136,-97.952687999999995 33.990113999999998,-97.947571999999994 33.991053,-97.946472999999997 33.990731999999994,-97.945729999999998 33.989839000000003,-97.945949999999982 33.988395999999995,-97.952184120103468 33.971402949359636,-97.95307606469359 33.968971674482539,-97.95691699999999 33.958502000000003,-97.960351000000003 33.951928000000002,-97.965737000000004 33.947392,-97.972662 33.944527,-97.974172999999993 33.942832000000003,-97.974062000000004 33.940289,-97.972493999999998 33.937907000000003,-97.971175000000002 33.937128999999999,-97.965952999999999 33.936191,-97.963425 33.936236999999998,-97.955511 33.938186000000002,-97.954466999999994 33.937773999999997,-97.953395 33.936444999999999,-97.952679000000003 33.929482,-97.953694999999996 33.924373000000003,-97.957155 33.914453999999999,-97.960615000000004 33.910353999999998,-97.961188664141474 33.909913087050903,-97.963139679674441 33.908413554571595,-97.964461 33.907398,-97.964803587866868 33.907309441163022,-97.9693952279504 33.906122503898267,-97.969873000000007 33.905999,-97.970298415583201 33.906261144464871,-97.973142999999993 33.908014,-97.976962999999998 33.912548999999999,-97.978803999999997 33.912548,-97.979984999999999 33.911402000000002,-97.983551999999989 33.904001999999991,-97.984539999999996 33.900703,-97.984566 33.899076999999998,-97.984416725907181 33.89872544733722,-97.984025057628415 33.897803036597892,-97.98383498894799 33.897355409354304,-97.983768999999995 33.897199999999991,-97.977858999999995 33.889929000000002,-97.974177999999995 33.886642999999999,-97.967776999999998 33.882429999999999,-97.958438 33.879179,-97.951215000000005 33.878424000000003,-97.946463999999992 33.878883000000002,-97.942729999999997 33.879845000000003,-97.938801999999995 33.879891,-97.936743000000007 33.879204,-97.933120450042608 33.877388671138185,-97.918328311832767 33.869976048610916,-97.905467000000002 33.863530999999995,-97.896737999999985 33.857984999999999,-97.877386999999999 33.850236000000002,-97.871447000000003 33.849001,-97.865764999999982 33.849392999999999,-97.835425213046037 33.857383352392631,-97.834333 33.857671000000003,-97.833886750888084 33.857971936447115,-97.833218553718808 33.858422547723912,-97.806802470257153 33.876236728393856,-97.805423000000005 33.877167,-97.803472999999997 33.880189999999999,-97.801578000000006 33.885137999999998,-97.784656999999982 33.890631999999997,-97.78061799999999 33.895533,-97.779683000000006 33.899242999999998,-97.780339999999995 33.904833000000004,-97.783716999999996 33.910559999999997,-97.772672 33.914382000000003,-97.765445999999997 33.913531999999989,-97.763769999999994 33.914240999999997,-97.762914903547767 33.914953098088951,-97.761142192227695 33.916429357685161,-97.760223999999994 33.917194000000002,-97.759399000000002 33.91881999999999,-97.759833999999984 33.92521,-97.762660999999994 33.930846000000003,-97.762767999999994 33.934396,-97.752956999999995 33.937049000000002,-97.738478 33.937421,-97.736553999999998 33.936574999999998,-97.735919542935619 33.936533987763056,-97.734773489745407 33.936459905200778,-97.733722999999998 33.936391999999998,-97.732266999999993 33.936691000000003,-97.725289000000004 33.941045000000003,-97.720699142354164 33.94461309292862,-97.716772000000006 33.947665999999998,-97.714693355370301 33.94981590741822,-97.712051708440285 33.952548118711093,-97.709683999999996 33.954996999999999,-97.708350195107343 33.95701014009046,-97.70415899999999 33.963335999999998,-97.69792099999998 33.977331,-97.69310999999999 33.983699,-97.688023 33.986606999999999,-97.671772000000004 33.991370000000003,-97.661489000000003 33.990817999999997,-97.656210000000002 33.989488,-97.633778000000007 33.981256999999999,-97.609091000000006 33.968093000000003,-97.589597999999995 33.953553999999997,-97.588828000000007 33.951881999999998,-97.591270649549756 33.930345579062646,-97.591514000000004 33.928199999999997,-97.595084 33.922953999999997,-97.596154999999996 33.922105999999999,-97.59697899999999 33.920228000000002,-97.597115000000002 33.917867999999999,-97.596955673755872 33.917077348335745,-97.596288999999985 33.913769000000002,-97.593782375104212 33.910260437761373,-97.589253999999997 33.903922,-97.587440999999984 33.902479,-97.582744000000005 33.900784999999999,-97.578907598302408 33.900207204108142,-97.558269999999993 33.897098999999997,-97.555002000000002 33.897281999999997,-97.551541 33.897947000000002,-97.543245999999996 33.901288999999998,-97.533617322522971 33.906127586572126,-97.532723000000004 33.906576999999999,-97.525277000000003 33.911750999999995,-97.519170999999986 33.913637999999999,-97.504870374844515 33.918353570482601,-97.500960000000006 33.919643,-97.495648860558163 33.919307898609453,-97.494857999999979 33.919257999999999,-97.492061582842766 33.918500058129531,-97.487115891787269 33.917159576320657,-97.48650499999998 33.916993999999995,-97.484158940985964 33.915822631562747,-97.460375999999982 33.903948,-97.458068999999995 33.901634999999999,-97.451065249608234 33.891558064966901,-97.450953999999996 33.891398000000002,-97.451469000000003 33.87093,-97.452287410342421 33.86882620086994,-97.455665873415143 33.860141550511862,-97.457616999999999 33.855125999999998,-97.459565999999995 33.853316,-97.461485999999994 33.849559999999997,-97.462857 33.841771999999999,-97.459067999999988 33.834581,-97.453056999999987 33.828536,-97.444192999999999 33.823773000000003,-97.426492999999994 33.819398,-97.410387 33.818845000000003,-97.403235695189224 33.818961304668854,-97.384901622687948 33.819259479377855,-97.372940999999997 33.819454,-97.368744000000007 33.821471000000003,-97.365506999999994 33.823762999999992,-97.358512999999988 33.830018000000003,-97.348337999999984 33.843876000000002,-97.340900078515631 33.860236176367188,-97.339391593410966 33.867629740388111,-97.337846311291798 33.870430566802547,-97.336524008254173 33.872827243260353,-97.33293952159849 33.874440259476913,-97.329175814777756 33.874440259476913,-97.327562805507441 33.873902588562437,-97.326564370247013 33.872737756024428,-97.326487449786001 33.872648016149064,-97.324157539016809 33.866016724171544,-97.322365295688968 33.864941382342593,-97.318243141591921 33.865120602507631,-97.31654836796514 33.865642075591225,-97.315913230822716 33.865837504006514,-97.314412999999988 33.866988999999997,-97.310479256695203 33.873361218982971,-97.307489695517361 33.878203969770759,-97.302471419756401 33.880175433263638,-97.299245387323282 33.880175433263638,-97.295170524880618 33.877119286431629,-97.294227111562321 33.876411726442917,-97.286921603026471 33.869423850720118,-97.28598279642199 33.868525862052032,-97.284253187903744 33.867526845294535,-97.279107999999979 33.864555000000003,-97.275347999999994 33.863225,-97.271531999999993 33.862560000000002,-97.257971626565464 33.863220416657512,-97.256624999999985 33.863286000000002,-97.255635999999996 33.863697999999999,-97.254234999999994 33.865322999999997,-97.249208999999993 33.875100999999994,-97.246418496348156 33.898356425448434,-97.246179999999981 33.900343999999997,-97.245398270620598 33.902084836575838,-97.245057441245748 33.90284383100218,-97.244945999999999 33.903092,-97.242092 33.906277000000003,-97.241794392023195 33.906436890220043,-97.238755934556053 33.908069304909361,-97.226522000000003 33.914642,-97.210920999999999 33.916063999999999,-97.210512235443105 33.915911440173737,-97.206141000000002 33.914279999999998,-97.185457999999997 33.9007,-97.180845000000005 33.895203999999993,-97.179608999999999 33.892249999999997,-97.170773789281327 33.861660975771436,-97.166629 33.847310999999998,-97.166824000000005 33.840395,-97.171627 33.835335,-97.180939422624874 33.831550006302521,-97.181369999999987 33.831375,-97.186254000000005 33.830894,-97.193690000000004 33.831307000000002,-97.195830999999998 33.830803000000003,-97.197477000000006 33.829794999999997,-97.199700000000007 33.827322000000002,-97.203513999999998 33.821824999999997,-97.204994999999997 33.81886999999999,-97.205652 33.809823999999999,-97.205556910941183 33.806237292333442,-97.205445103342427 33.802019970418343,-97.205431000000004 33.801487999999999,-97.205114487332324 33.800890302957832,-97.203236000000004 33.797342999999998,-97.194785999999993 33.785344000000002,-97.190397000000004 33.781153000000003,-97.187792000000002 33.769702000000002,-97.181842999999986 33.755869999999994,-97.173532726140948 33.740090726508434,-97.172577000695028 33.738276026602087,-97.172191999999995 33.737544999999997,-97.168438536634085 33.734131892706188,-97.163454368039083 33.729599677915004,-97.163149000000004 33.729322000000003,-97.162807288850388 33.729115696596551,-97.155066000000005 33.724442000000003,-97.152609597300682 33.723370138808036,-97.150103410774264 33.72227655424301,-97.149393999999987 33.721966999999999,-97.137529999999998 33.718663999999997,-97.126102000000003 33.716940999999998,-97.121101999999993 33.717174,-97.119522126797463 33.717502594273334,-97.114921749218269 33.718459416457094,-97.113264999999998 33.718803999999999,-97.112398501853761 33.719102240295193,-97.110065570752283 33.719905212653977,-97.108936 33.720294000000003,-97.108097026518521 33.720734123472262,-97.106518853348803 33.721562029324609,-97.104524999999995 33.722608,-97.097154000000003 33.727809,-97.094085000000007 33.730992,-97.092697209381924 33.732891057656268,-97.092130098039192 33.733667094850453,-97.091071999999983 33.735115,-97.089936943375889 33.737167271747261,-97.087911027802278 33.740830286618703,-97.086195000000004 33.743932999999998,-97.084820762198987 33.752363244406453,-97.084693 33.753146999999998,-97.08461299999999 33.759993,-97.085217999999998 33.765512,-97.087362453285593 33.77250304797397,-97.087851999999998 33.774099,-97.093101265647221 33.787040841586602,-97.093917000000005 33.789051999999998,-97.094675961767678 33.791977368936216,-97.095047178759813 33.793408200769441,-97.095235999999986 33.794136000000002,-97.095080023591905 33.79561056406444,-97.094877682854474 33.797523445530629,-97.094770999999994 33.798532000000002,-97.093897185962049 33.800360798466031,-97.09266432242093 33.802941048788071,-97.092111999999986 33.804096999999999,-97.087998999999982 33.808746999999997,-97.078589999999991 33.812755999999993,-97.067977124183287 33.814475679891196,-97.064604445188394 33.815487484896828,-97.062631847535258 33.816079264957295,-97.058622892638837 33.818751903281317,-97.055415722506638 33.823829921794093,-97.055412197115942 33.8238546000754,-97.055148464371385 33.82570077017467,-97.055682980641905 33.830778788687446,-97.057821087157734 33.834520485448607,-97.058282726048489 33.836367011192308,-97.058622892638837 33.837727655580807,-97.057553829022481 33.840133030590344,-97.055415722506638 33.841202089027483,-97.052208542016004 33.841736615656437,-97.048734113748537 33.840934820533782,-97.045339940802535 33.839496399893775,-97.041245000000004 33.837761,-97.038858000000005 33.838264000000002,-97.023899 33.844213000000003,-97.017857000000006 33.850141999999998,-97.010381749407998 33.858564100233409,-96.999664164722446 33.87063922351804,-96.985567000000003 33.886521999999999,-96.983970999999997 33.892082999999992,-96.984938999999997 33.904865999999991,-96.985275905099471 33.906070041818985,-96.988744999999994 33.918467999999997,-96.993996999999979 33.928978999999998,-96.995022999999989 33.932034999999999,-96.995140238436761 33.933014648420269,-96.996024643022366 33.940404763634284,-96.996183000000002 33.941727999999998,-96.996167702736543 33.941832622020257,-96.995421139189489 33.946938567064805,-96.995367999999999 33.947302,-96.994947208134789 33.948043840473474,-96.994456760007211 33.948908482357652,-96.994287999999983 33.949205999999997,-96.990835000000004 33.952700999999998,-96.988126301178397 33.954514162310069,-96.987892000000002 33.954670999999998,-96.982723774786024 33.956016867344054,-96.981537499896135 33.956325787441237,-96.981336999999982 33.956377999999994,-96.979415000000003 33.956178,-96.979347000000004 33.955129999999997,-96.980675999999988 33.951813999999999,-96.981031000000002 33.949159999999999,-96.97981799999998 33.941588000000003,-96.976955000000004 33.937452999999998,-96.973806999999979 33.935696999999998,-96.97254199999999 33.935794999999999,-96.952313000000004 33.944581999999997,-96.944610999999995 33.949216999999997,-96.933309804512817 33.955134148312766,-96.932252000000005 33.955688000000002,-96.924267999999998 33.959159,-96.922113999999979 33.959578999999998,-96.921429967464036 33.959451233053208,-96.919039990098355 33.959004821377064,-96.918617999999995 33.958925999999998,-96.91833921313939 33.958790334953079,-96.917063225391544 33.958169405626251,-96.916299999999993 33.957797999999997,-96.91417790611122 33.956157267456653,-96.911732563120111 33.95426660943896,-96.911336000000006 33.953960000000002,-96.910857206749995 33.953482904168467,-96.908421363636307 33.951055696608989,-96.907387 33.950024999999997,-96.905252999999988 33.947218999999997,-96.902433999999985 33.942017999999997,-96.901946611333699 33.940667581536225,-96.899441999999993 33.933728000000002,-96.896468999999996 33.91331799999999,-96.897193999999999 33.902954,-96.895728000000005 33.896414,-96.887761838797758 33.878628251663962,-96.883009999999999 33.868018999999997,-96.875280999999987 33.860505000000003,-96.87198767019855 33.857765462058182,-96.866438000000002 33.853149000000002,-96.85608999999998 33.84749,-96.850593000000003 33.847211,-96.845895999999996 33.848974999999996,-96.841592000000006 33.852893999999999,-96.840818999999996 33.863644999999998,-96.839777999999995 33.868395999999997,-96.837412999999984 33.871349000000002,-96.833926235310372 33.873661568818115,-96.832156999999995 33.874834999999997,-96.812777999999994 33.872646000000003,-96.794275999999996 33.868886000000003,-96.786859371055769 33.865207582975678,-96.783484999999999 33.863533999999994,-96.780568999999986 33.860098,-96.779588000000004 33.857939000000002,-96.777202000000003 33.848162000000002,-96.776765999999995 33.841976000000003,-96.770675999999995 33.829621000000003,-96.769378000000003 33.827477000000002,-96.766316855179326 33.825510582121247,-96.766234999999995 33.825457999999998,-96.761588000000003 33.824406000000003,-96.754041 33.824657999999999,-96.746233969152598 33.825673509073113,-96.746037999999984 33.825699,-96.741799282455162 33.826447231494264,-96.71318112067361 33.831498997677379,-96.712421999999989 33.831632999999997,-96.708134 33.833060000000003,-96.704457000000005 33.835020999999998,-96.700318655907978 33.838434731313264,-96.699573999999998 33.839049000000003,-96.695480719177567 33.844085960723298,-96.693127324791789 33.84698191524042,-96.690708 33.849958999999998,-96.688190999999989 33.854613,-96.687524326814838 33.85620885855986,-96.684726999999995 33.862904999999998,-96.682762564556768 33.871464102957781,-96.682209 33.873876000000003,-96.682102999999998 33.876645000000003,-96.683464 33.884217,-96.681051007513375 33.895708672998403,-96.680947000000003 33.89620399999999,-96.675306000000006 33.909114000000002,-96.673449000000005 33.912278,-96.670618000000005 33.914913999999996,-96.667186999999998 33.916939999999997,-96.665308436653305 33.917161206414967,-96.66440999999999 33.917267000000002,-96.659896000000003 33.916665999999999,-96.65150600931733 33.910998546998165,-96.644049999999979 33.905962000000002,-96.630116999999998 33.895422000000003,-96.628293999999997 33.894477000000002,-96.616355751891987 33.894625565889051,-96.614680358047494 33.89464641537834,-96.611821556077771 33.89468199182577,-96.607562 33.894734999999997,-96.592948000000007 33.895615999999997,-96.588319642127203 33.894847991673281,-96.587934000000004 33.894784,-96.58760387584924 33.894318075382706,-96.585452000000004 33.891280999999999,-96.585359999999994 33.888947999999999,-96.587494000000007 33.884250999999999,-96.590112000000005 33.880665,-96.597347999999982 33.875100999999994,-96.601685999999987 33.872822999999997,-96.611969999999999 33.869016000000002,-96.625399000000002 33.856541999999997,-96.628968999999998 33.852406999999999,-96.629746999999995 33.850866000000003,-96.630021999999983 33.847541,-96.629842405402627 33.847037300944812,-96.629577623992816 33.846294683138318,-96.629289999999997 33.845488000000003,-96.627812273090953 33.844523322531259,-96.626623854929747 33.84374750920842,-96.623154999999997 33.84148299999999,-96.622548607895212 33.841284829387497,-96.620258613641042 33.840536452948584,-96.605267599881515 33.835637348301233,-96.601258 33.834327000000002,-96.599141379811712 33.83346048638235,-96.597030984690946 33.832596521217091,-96.595164098773168 33.831832245189069,-96.592925999999991 33.830916000000002,-96.587067000000005 33.828009000000002,-96.573054340771023 33.81917200025552,-96.572936999999996 33.819097999999997,-96.568822993124115 33.818734252140963,-96.566549213959448 33.818533211567136,-96.566298000000003 33.818511,-96.551222999999993 33.81912899999999,-96.541502252916899 33.82118138128849,-96.537683599711926 33.821987629236112,-96.532865 33.823005000000002,-96.532141353898353 33.822830017549641,-96.529233999999988 33.822127000000002,-96.526655000000005 33.820891000000003,-96.526331240434345 33.820568979830284,-96.523863000000006 33.818114,-96.519910999999993 33.811346999999998,-96.517492044660074 33.805400310572544,-96.516583999999995 33.803167999999999,-96.515958999999995 33.798933999999996,-96.515952403498957 33.797370629253059,-96.5159410675722 33.794684014612457,-96.515912 33.787795000000003,-96.51191399999999 33.781477999999993,-96.502285999999998 33.773459999999993,-96.500268000000005 33.772582999999997,-96.486059999999995 33.773009999999999,-96.459153999999998 33.775232000000003,-96.456254 33.776035,-96.450509999999994 33.780588000000002,-96.448044999999993 33.781030999999999,-96.436454999999995 33.780050000000003,-96.430214000000007 33.778654000000003,-96.423664429058576 33.776393528613141,-96.422642999999994 33.776040999999999,-96.422322840041474 33.775682043625913,-96.420980388055867 33.774176915691271,-96.419961 33.773034000000003,-96.419583102042878 33.772404537625398,-96.417562000000004 33.769038000000002,-96.416145999999998 33.76609899999999,-96.413408000000004 33.757714,-96.411885201063754 33.755703128434462,-96.408468999999997 33.751191999999996,-96.403507000000005 33.746288999999997,-96.384116000000006 33.730141000000003,-96.383299027856694 33.729391180874664,-96.380090129695702 33.726446045924753,-96.379450023740389 33.7258585550397,-96.370956555983966 33.718063228581727,-96.370761536889887 33.717884239557762,-96.369590000000002 33.716808999999998,-96.369084597701828 33.715741445126696,-96.366945 33.711221999999999,-96.363253 33.701050000000002,-96.363143372320295 33.69469995601051,-96.363135 33.694215,-96.362964209763192 33.693778090504111,-96.362198000000006 33.691817999999998,-96.356236230636398 33.68737146600408,-96.355945999999989 33.687154999999997,-96.355455421824701 33.68710517164083,-96.352724507664888 33.686827790830883,-96.348305999999994 33.686378999999995,-96.346643697131185 33.686554630652331,-96.344174978865311 33.686815463144171,-96.342664999999997 33.686974999999997,-96.337175125435976 33.689043696356201,-96.321102999999994 33.695099999999996,-96.318759999999997 33.696753,-96.318590686098233 33.696960051986665,-96.318010443675675 33.697669623646739,-96.316924999999998 33.698996999999999,-96.314798583555884 33.702507526903553,-96.309963999999994 33.710489000000003,-96.308342766341951 33.715746247280322,-96.307034999999985 33.719987000000003,-96.307001890234133 33.720499786556005,-96.306595999999999 33.726785999999997,-96.307389 33.735005,-96.3061 33.741002000000002,-96.30525491425243 33.743702118680943,-96.304087485467235 33.747432149959735,-96.303009000000003 33.750878,-96.301705999999982 33.753756000000003,-96.294866999999996 33.764771000000003,-96.292482000000007 33.766418999999999,-96.277269000000004 33.769734999999997,-96.269895999999989 33.768405,-96.251497151236435 33.760405611313516,-96.248231999999987 33.758986,-96.23960043273749 33.754058875473291,-96.229595766085112 33.748347949873668,-96.229022999999998 33.748021,-96.220521000000005 33.747390000000003,-96.1999 33.752116999999998,-96.196336040977513 33.753254070097242,-96.186553999999987 33.756374999999998,-96.178059000000005 33.760517999999998,-96.174632999999986 33.763699000000003,-96.169932696734321 33.769534234627457,-96.169452000000007 33.770130999999999,-96.167888847884015 33.774482610028038,-96.162756999999985 33.788769000000002,-96.162122572851359 33.796140263149638,-96.162213638666273 33.796174412747511,-96.166837334419654 33.79790829445497,-96.170373408451042 33.799381659586444,-96.173025461119408 33.800560352833699,-96.175150000000002 33.801951000000003,-96.17734 33.805117000000003,-96.17895107878303 33.810509748931381,-96.178963999999993 33.810552999999999,-96.176910000000007 33.813934000000003,-96.175889999999981 33.814627000000002,-96.164217431250009 33.817001137011715,-96.150765000000007 33.816986999999997,-96.148792 33.819197000000003,-96.151629999999983 33.831945999999995,-96.150147000000004 33.835856,-96.148457006953691 33.837436961236868,-96.14806999999999 33.83779899999999,-96.147446683377808 33.837891494337825,-96.138904999999994 33.839159000000002,-96.128108733462625 33.839703753325978,-96.122951 33.839963999999995,-96.118168999999995 33.837883999999995,-96.109992999999989 33.832396000000003,-96.104074999999995 33.830730000000003,-96.099360000000004 33.830469999999998,-96.097448 33.832724999999996,-96.097637999999989 33.837935000000002,-96.099152999999987 33.842409000000004,-96.100785000000002 33.844230000000003,-96.101348999999999 33.845720999999998,-96.101472999999999 33.846708999999997,-96.100094999999996 33.847971,-96.084626 33.846656000000003,-96.063924 33.841522999999995,-96.055357999999984 33.838262,-96.049381559404907 33.836618570443349,-96.048833999999999 33.836468000000004,-96.044074587870469 33.838420736557822,-96.037191000000007 33.841245,-96.031783693249977 33.849934429642978,-96.031271075997878 33.850758194920559,-96.029462717056688 33.852402158173604,-96.025188419607474 33.852073366797306,-96.022229284477689 33.850922593794486,-96.021900493101384 33.849114234853282,-96.022507000000004 33.846130000000002,-96.022064891975305 33.843195970965255,-96.021407302851145 33.841880802274289,-96.019950829321616 33.840821548098475,-96.019598947095744 33.84056563358331,-96.005296 33.845505000000003,-96.000534603789163 33.849305889934179,-95.998351 33.851049000000003,-95.997709 33.852181999999992,-95.997673906338932 33.852568581878202,-95.997405462294296 33.855525685805766,-95.9977342536706 33.860950759443568,-95.997376655326022 33.862202357114477,-95.996747879541701 33.864403078452035,-95.993624351909531 33.866211440579008,-95.991487204777812 33.866869023331596,-95.988856861024331 33.866869023331596,-95.984753921632091 33.864671017651808,-95.984253769013037 33.864403078452035,-95.980965842506947 33.859306796190523,-95.9735403792467 33.856832331211713,-95.972155999999998 33.856371000000003,-95.971744371228908 33.856383941655046,-95.951609000000005 33.857016999999999,-95.945502988542614 33.859346036998218,-95.944283999999982 33.859811,-95.943359355023844 33.860365112733476,-95.941777921153459 33.861312819872232,-95.941266999999996 33.861618999999997,-95.936631000000006 33.870615,-95.93550004724635 33.874497995518659,-95.935325000000006 33.875098999999999,-95.935308000000006 33.878723999999998,-95.935637 33.880370999999997,-95.936817000000005 33.882385999999997,-95.937201999999999 33.884652000000003,-95.936131999999986 33.886825999999999,-95.935198 33.887100999999994,-95.922712000000004 33.883758,-95.915960999999996 33.881148000000003,-95.905343000000002 33.875629000000004,-95.893305999999995 33.868161,-95.887490999999997 33.863855999999998,-95.881292000000002 33.860627,-95.859469000000004 33.852455999999997,-95.849863999999997 33.844951999999999,-95.843772999999999 33.838949,-95.841300369514457 33.837329726167006,-95.840012000000002 33.836486,-95.839442445999168 33.836292954052603,-95.838335071878717 33.835917618112738,-95.837515999999994 33.835639999999998,-95.831947999999997 33.835160999999999,-95.828244999999995 33.836053999999997,-95.827967044704152 33.836191602640042,-95.826538854622555 33.836898632614485,-95.822787000000005 33.838755999999989,-95.821905415666805 33.839551758599306,-95.821112514659319 33.840267467546653,-95.820784000000003 33.840564,-95.819357999999994 33.842784999999999,-95.818975999999992 33.844456,-95.819524999999999 33.848438999999999,-95.820676999999989 33.850750999999995,-95.821665999999979 33.855443,-95.821665999999979 33.856633000000002,-95.82138191533943 33.857119395418813,-95.820824189768416 33.858074304994595,-95.820595999999995 33.858464999999995,-95.820256321913618 33.858527429344676,-95.805149 33.861303999999997,-95.800842000000003 33.861212000000002,-95.790314669347865 33.857829825250164,-95.789867 33.857685999999994,-95.789358977006231 33.85733891951336,-95.788304168820886 33.85661827626933,-95.787891000000002 33.856335999999999,-95.776255000000006 33.845145000000002,-95.773281999999995 33.843834,-95.772067000000007 33.843817,-95.763621999999984 33.847954,-95.758311274366889 33.849968021173019,-95.758015999999998 33.850079999999998,-95.757640875431136 33.850475976069447,-95.754310000000004 33.853991999999998,-95.753512999999984 33.856464000000003,-95.753688987366843 33.856976705401074,-95.75729390188404 33.867478931648478,-95.757457999999986 33.86795699999999,-95.758009454152003 33.868443703186436,-95.760805000000005 33.870911,-95.762558999999996 33.874366999999992,-95.76194240701966 33.883030946465368,-95.761915999999999 33.883401999999997,-95.758343999999994 33.890610999999993,-95.756366999999997 33.892625000000002,-95.747335000000007 33.895755999999999,-95.737508000000005 33.895966999999999,-95.729445045960333 33.893952819075864,-95.728448999999998 33.893704,-95.723226300470785 33.890698381785455,-95.717160861060378 33.887207774089354,-95.713910181462765 33.885337036216413,-95.713539999999981 33.885123999999998,-95.710877999999994 33.884551999999999,-95.696961999999999 33.885218000000002,-95.684831000000003 33.890231999999997,-95.676924999999983 33.897236999999997,-95.669978 33.905844000000002,-95.665338000000006 33.908132000000002,-95.659818 33.909092,-95.647272999999998 33.905976000000003,-95.636977999999999 33.906613,-95.609439392746168 33.923623282239362,-95.603656999999998 33.927194999999998,-95.599677999999983 33.934246999999999,-95.585944999999981 33.93448,-95.570311428427317 33.932892416047835,-95.564667905744443 33.932319318211334,-95.563423999999998 33.932192999999998,-95.562724847986416 33.932007581530534,-95.561592737930383 33.931707340510293,-95.561007000000004 33.931551999999996,-95.560415995740641 33.931042615914556,-95.559931936825777 33.930625407571753,-95.559414000000004 33.930179000000003,-95.558286100391328 33.928753215740784,-95.557777967458279 33.928110882033096,-95.556914999999989 33.927019999999999,-95.551147999999984 33.914566,-95.549144999999996 33.90795,-95.549475 33.901310999999993,-95.552330999999981 33.894419999999997,-95.55209457427955 33.888655441173519,-95.552085000000005 33.888421999999998,-95.551943532854764 33.888208369560985,-95.548485831718622 33.882986873004867,-95.548324999999991 33.882744000000002,-95.547838962671932 33.882363312195096,-95.545708294665019 33.880694470565629,-95.545197000000002 33.880293999999999,-95.54352178779898 33.880173169084813,-95.541265054919734 33.880010393826282,-95.539789999999996 33.879904000000003,-95.537358049249164 33.88037416967029,-95.534038375697051 33.881015963020303,-95.533282999999997 33.881161999999996,-95.531798241123994 33.881968630089013,-95.525321999999989 33.885486999999998,-95.521418133191162 33.888379988113826,-95.520137966641357 33.88932866459119,-95.515301759339067 33.891142240377064,-95.510062536063273 33.890134704348199,-95.506233872599807 33.886306036979761,-95.506495 33.878588999999998,-95.506084999999999 33.87639,-95.502407477038815 33.874787101867227,-95.502303999999995 33.874741999999998,-95.492028000000005 33.874822000000002,-95.480004545492946 33.87882505156746,-95.478574999999992 33.879300999999998,-95.477829321179073 33.879890044047791,-95.469962325642697 33.886104525088022,-95.467351237093553 33.886417854985297,-95.464924614258621 33.886709049048328,-95.462909526581015 33.885903021006229,-95.461498966768687 33.883686425341857,-95.46277824472287 33.878821065729895,-95.464211000000006 33.873372000000003,-95.463346 33.872312999999998,-95.461127233926518 33.871832054399569,-95.447370000000006 33.868850000000002,-95.418546279096461 33.866998581211959,-95.411345060268999 33.866536029139695,-95.407794999999979 33.866307999999989,-95.406882133018115 33.866362247208706,-95.404325916920058 33.866514150597617,-95.375232999999994 33.868243,-95.352338000000003 33.867789000000002,-95.339561303488324 33.868836967540759,-95.339121999999989 33.868873,-95.339014688391742 33.869073090388603,-95.33835013321854 33.870312202400832,-95.334854000000007 33.876830999999996,-95.334836460323601 33.877305631062114,-95.334523000000004 33.885787999999998,-95.333451999999994 33.886285999999998,-95.325571999999994 33.885703999999997,-95.310579050797429 33.880679668661742,-95.294789354523203 33.875388337067108,-95.287864786488143 33.87494634339312,-95.28344485260331 33.877745636185885,-95.281676877907344 33.882902226669891,-95.281529544303439 33.887616824907447,-95.281317419351268 33.889260797911334,-95.280350898312903 33.896751357029835,-95.279761569607459 33.899108654721076,-95.277846267017765 33.900876629417048,-95.275341635722626 33.901760616765031,-95.272542342929853 33.902055281117747,-95.267212735027385 33.900338966530455,-95.263849803053915 33.899255988324974,-95.261050510261143 33.899992642069066,-95.255746586173245 33.902939265610648,-95.253094626984378 33.90544389690578,-95.250884657186859 33.913105118684925,-95.250737329293145 33.917083057468233,-95.251326652288412 33.924154956252103,-95.253020000000006 33.927236999999998,-95.253623000000005 33.92971,-95.252905999999982 33.933647999999998,-95.250453815364224 33.936614470603772,-95.23166760862577 33.959340626388752,-95.231194814374604 33.959912577712174,-95.230491 33.960763999999998,-95.226393000000002 33.961953999999999,-95.219358 33.961567000000002,-95.184075000000007 33.950353,-95.174181557651636 33.944707625858101,-95.173657196254922 33.944408415920272,-95.168745999999999 33.941605999999993,-95.166685999999984 33.939728000000002,-95.161108999999982 33.937598,-95.149462 33.936335999999997,-95.131725657216535 33.936903570678005,-95.131056 33.936924999999995,-95.130760550144942 33.936820411866918,-95.124700000000004 33.934674999999991,-95.121184 33.931306999999997,-95.121974867397924 33.925542192115131,-95.122499622273722 33.921717137430115,-95.122365486317321 33.918632002634986,-95.119951031304154 33.915815139752631,-95.110963896232136 33.912998276870283,-95.103318123323447 33.913668959251616,-95.10214780889666 33.912991409673538,-95.100769532353866 33.912193461131935,-95.098489218495843 33.909913139475762,-95.095001673232161 33.904815960136006,-95.095247706914634 33.899772255341666,-95.095269945144935 33.899316370327696,-95.09392858558104 33.895962961020395,-95.090441035118587 33.893280234094433,-95.084002493615529 33.893280234094433,-95.079139333602001 33.898143394107954,-95.078905311676394 33.898377416033576,-95.074957661870556 33.900039583313315,-95.073630040977179 33.900598581227868,-95.071259538767663 33.901596686785098,-95.065491679645973 33.899584642240477,-95.06106518008815 33.895292278639054,-95.058834000000004 33.886812999999997,-95.049025 33.864089999999997,-95.046567999999994 33.862564999999996,-95.038661112238941 33.860609605793528,-95.037206999999995 33.86025,-95.033518790033554 33.860141698175291,-95.03143098776043 33.86008039125462,-95.030255193062573 33.860045864827867,-95.022324999999995 33.859813000000003,-95.016999191469623 33.861237606415294,-95.016422000000006 33.861392000000002,-95.008375999999984 33.866088999999995,-95.000223000000005 33.862504999999999,-94.995524000000003 33.857438000000002,-94.992810330111539 33.852698351540766,-94.992671 33.852454999999999,-94.992523097811741 33.852403566519136,-94.990494037024106 33.851697953840834,-94.988486999999992 33.850999999999999,-94.98739725328582 33.851074415574232,-94.983303000000006 33.851354,-94.981650000000002 33.852283999999997,-94.976208 33.859846999999995,-94.973410999999999 33.861730999999999,-94.971435 33.862122999999997,-94.968895000000003 33.860916000000003,-94.965888000000007 33.848421999999999,-94.964400999999995 33.837020999999993,-94.957676000000006 33.835003999999998,-94.949533421399437 33.825707838785306,-94.949112883549958 33.821754768331147,-94.948729542346143 33.818151347643564,-94.948715939727023 33.818023482549535,-94.944301522854289 33.81213759866646,-94.939560116480934 33.810502632153295,-94.935799688114457 33.810339132650462,-94.932366255585293 33.810993121156741,-94.928442330884351 33.812628087669893,-94.92451840618341 33.812791587172725,-94.924196338046286 33.812670811231236,-94.921902464831703 33.811810605997493,-94.919450010309433 33.810175636315982,-94.917815040627914 33.808704169305649,-94.917091634856007 33.805689966907131,-94.916834062621035 33.804616745101868,-94.916997555787162 33.801510305241678,-94.91961350347556 33.794152948011565,-94.920034399525505 33.790224602097751,-94.920103995647338 33.789575041141042,-94.920095560257593 33.789518805381888,-94.91961350347556 33.786305103362189,-94.913003475392784 33.779908559849432,-94.912450337640749 33.77937328682863,-94.911427000000003 33.778382999999998,-94.906244999999998 33.778191999999997,-94.902276 33.776288999999998,-94.89497736748055 33.771540270803243,-94.89019868072495 33.768431100796676,-94.888367999999986 33.76724,-94.887910246679809 33.766674529711281,-94.886225692565191 33.764593571999796,-94.885411379435553 33.764756432942491,-94.881447983999394 33.765549103837166,-94.879218389137634 33.764912090842074,-94.876033253179955 33.760771407616105,-94.875653319149677 33.757021753168047,-94.875534806260347 33.755852122792213,-94.875497398046861 33.755482932714841,-94.877080000000007 33.75222,-94.874668 33.749164,-94.870299604394191 33.746484207390097,-94.869443369718425 33.745958950164457,-94.869299999999996 33.745871,-94.8570941233355 33.742035460072337,-94.849295999999981 33.739584999999991,-94.841633779899112 33.739430990835892,-94.830804318260235 33.740068022348083,-94.828875382311935 33.74092532536806,-94.827937698058648 33.741342073027738,-94.826026615866809 33.743890180559411,-94.824752565187154 33.749304914465036,-94.82447272313469 33.749460382205008,-94.821885938813196 33.750897483986968,-94.817426749089677 33.752171534666616,-94.815635414888177 33.752066164468857,-94.813744972719192 33.751954964523563,-94.81275807295215 33.751896912919612,-94.812012015184067 33.751853028169073,-94.80914539498248 33.749304914465036,-94.798634446013509 33.744527205899239,-94.789716054221742 33.746119775421171,-94.777638928565466 33.753471071068567,-94.775064434371529 33.755038154868203,-94.770923763490302 33.754401129528375,-94.768057130944001 33.753445597691005,-94.766464573766783 33.750897483986968,-94.766146067269247 33.748030863785381,-94.766818924318841 33.746124416643802,-94.768057130944001 33.742616129879757,-94.767738636791165 33.737519908644046,-94.767244154304578 33.736926531576607,-94.76296091588064 33.731786662068515,-94.759138751496963 33.729557067206756,-94.758159820145337 33.729557067206756,-94.753087004596253 33.729557067206756,-94.750011775433265 33.728811557489699,-94.742576055627282 33.727008959675082,-94.742176780415733 33.726449974997927,-94.739390916583417 33.72254976995157,-94.737479828219207 33.716179498036198,-94.737788227808608 33.71500758055268,-94.73907239774114 33.71012773879076,-94.73746132453816 33.705563045258067,-94.73716130937693 33.704713004885136,-94.732383613155861 33.700253815161624,-94.728242929929891 33.699616789821789,-94.725694828570582 33.702483410023376,-94.724525908047042 33.704821269192259,-94.724102271393392 33.705668549067234,-94.721872664186904 33.707261118589173,-94.719006043985303 33.708216656598914,-94.714865360759347 33.707261118589173,-94.711043208720398 33.705668549067234,-94.709450639198465 33.699616789821789,-94.710289486124168 33.697309952648205,-94.710724689878106 33.696113138108018,-94.710724689878106 33.691653948384499,-94.710106194192988 33.688252279047049,-94.71008765219355 33.688150299756906,-94.707858069676533 33.686876245991066,-94.691547961569825 33.685092048879412,-94.684792000000002 33.684353000000002,-94.659166999999997 33.692138,-94.652265035786613 33.690979104454883,-94.649628372726468 33.688049476940073,-94.649099284135872 33.686462209886628,-94.648456523423718 33.684533926193204,-94.64818493525776 33.682632803768527,-94.647928021538007 33.680834402751707,-94.647870600191638 33.680432452214262,-94.648456523423718 33.673401362074948,-94.647827859209684 33.672301196274027,-94.646112824818204 33.669299876741562,-94.642890235687361 33.668420997570671,-94.635273213800133 33.669885811328072,-94.631328876730365 33.67284406472757,-94.630585813750528 33.673401362074948,-94.627656194751552 33.677795791992715,-94.62121101648988 33.681018386800773,-94.616816575217669 33.679553573043371,-94.614284398758912 33.677302743466427,-94.611543254774574 33.674866164477912,-94.611424034353576 33.674789522931938,-94.607441775118403 33.672229504256364,-94.60304734520065 33.671350625085473,-94.596895128555005 33.671350625085473,-94.593672545101384 33.673987285307021,-94.590449961647764 33.677502836053897,-94.590316660066918 33.67755410593854,-94.586641449284855 33.678967649811298,-94.579620000000006 33.677622999999997,-94.576973687569549 33.673401362074948,-94.5728722135906 33.669885811328072,-94.571305222138406 33.668005422800071,-94.569942586075811 33.666370260581196,-94.569356662843745 33.663440621711956,-94.571445361022185 33.660423619728157,-94.571993323065286 33.659632120703485,-94.572286279004103 33.656995454804722,-94.570821465246695 33.654944723492456,-94.568770728257221 33.65465176187643,-94.564669254278257 33.655823608340576,-94.563858010166513 33.65591721375597,-94.557052229552454 33.656702498865904,-94.552071876402621 33.653479904057846,-94.551192985877293 33.650257320604226,-94.551311999999982 33.644569999999995,-94.553536678805585 33.642054372646328,-94.552657799634687 33.638245860283412,-94.549142248887819 33.635902161677912,-94.543868917090279 33.635902161677912,-94.538888563940446 33.637952898667386,-94.538195599937964 33.637916426989378,-94.537583502619341 33.637884211439605,-94.533322276204103 33.637659937051346,-94.529220802225154 33.63443734792051,-94.528408204203203 33.630103504051213,-94.528341911699826 33.629749945032266,-94.52980672545722 33.627406252103981,-94.528927834931892 33.621839964367631,-94.526291174710352 33.619203298468861,-94.521363727720257 33.61686924674752,-94.520724886974008 33.61656663824732,-94.504615 33.620682000000002,-94.493418698303032 33.624467326832118,-94.492501061148843 33.624777568252533,-94.491502999999994 33.625115,-94.491295462081894 33.62531395337146,-94.487514000000004 33.628939000000003,-94.485874999999993 33.637867,-94.481313 33.638818999999998,-94.476415000000003 33.638947000000002,-94.466075000000004 33.636262000000002,-94.464185999999998 33.637655000000002,-94.461453000000006 33.643615999999994,-94.459197999999986 33.645145999999997,-94.454819999999998 33.644902999999999,-94.448637000000005 33.642766000000002,-94.446871000000002 33.640177999999999,-94.447513999999998 33.636254999999991,-94.448451000000006 33.634497000000003,-94.458816999999982 33.632444,-94.462736000000007 33.63091,-94.461129 33.625414999999997,-94.460285999999996 33.624420999999998,-94.45525499999998 33.622917,-94.452710999999994 33.622621000000002,-94.452325000000002 33.618817,-94.452961000000002 33.616985999999997,-94.454768999999999 33.615155999999992,-94.462335999999993 33.610567000000003,-94.469451000000007 33.60731599999999,-94.472166 33.604199,-94.471974000000003 33.602665000000002,-94.471151999999989 33.601588,-94.468086 33.599435999999997,-94.461794602929331 33.598691554192769,-94.458900358388505 33.598349085232492,-94.458231999999995 33.598269999999999,-94.454858239556387 33.593453869357283,-94.453995999999989 33.592222999999997,-94.453435550445548 33.592019500625121,-94.452150252013013 33.591552808439438,-94.451622 33.591360999999999,-94.449112 33.590893999999992,-94.442363999999998 33.591242999999999,-94.441536999999997 33.591501999999991,-94.439518000000007 33.594154000000003,-94.430358101189597 33.59122600196271,-94.430038999999994 33.591124,-94.429672337173542 33.590855074196774,-94.427920122643982 33.589569927010331,-94.427577999999983 33.589319000000003,-94.425982000000005 33.586424999999998,-94.413155000000003 33.569367999999997,-94.412481642075306 33.56890283335202,-94.412480771235352 33.568902231761562,-94.412480202418593 33.568901838813659,-94.412175000000005 33.568691,-94.408900999999986 33.568196999999998,-94.403341999999995 33.568424,-94.397341999999981 33.571607999999998,-94.385926999999995 33.581887999999999,-94.382886999999997 33.58326799999999,-94.379649 33.580607,-94.378075999999993 33.577019,-94.377759999999981 33.574609000000002,-94.378561000000005 33.571328999999999,-94.380090999999993 33.568942999999997,-94.382534000000007 33.567056999999998,-94.388052000000002 33.565511,-94.392357000000004 33.565286999999998,-94.394655618773015 33.564059042448399,-94.397398454287298 33.562313601959417,-94.399227012370631 33.559903231990447,-94.399393244337958 33.557077279687135,-94.399143896386974 33.555498071165481,-94.397957000000005 33.554389999999998,-94.392572999999999 33.551141999999999,-94.389515000000003 33.546778000000003,-94.386086000000006 33.544922999999997,-94.381666999999993 33.544035,-94.373392999999993 33.544471,-94.371597999999992 33.545000999999999,-94.363297000000003 33.544956999999997,-94.361350999999999 33.544612999999998,-94.358969999999999 33.54323,-94.355945000000006 33.54318,-94.348944999999986 33.548358999999998,-94.347382999999979 33.55107799999999,-94.34729 33.552197,-94.352653000000004 33.560611000000002,-94.352433000000005 33.56217199999999,-94.345512999999997 33.567312999999999,-94.344023000000007 33.567824000000002,-94.340576999999996 33.567878,-94.340047258358467 33.56768232744934,-94.338972839399958 33.567285465504582,-94.33842199999998 33.567081999999999,-94.337996277272822 33.566655299162022,-94.334939999999989 33.563592,-94.334379999999996 33.562536,-94.333929800646288 33.557825151092565,-94.333894999999998 33.557461000000004,-94.333202999999997 33.555365999999992,-94.331833000000003 33.553348,-94.33059 33.552692,-94.323660000000004 33.549835000000002,-94.319491999999997 33.548864000000002,-94.309582000000006 33.551673,-94.30641 33.555616,-94.306214999999995 33.557676,-94.307180999999986 33.559797000000003,-94.303577000000004 33.56828,-94.301022999999986 33.573022000000002,-94.298392000000007 33.576217999999997,-94.293257999999994 33.580418999999999,-94.289129000000003 33.582143999999992,-94.287025 33.582410000000003,-94.283581999999996 33.581890999999999,-94.282647999999995 33.580978000000002,-94.280849000000003 33.577187000000002,-94.280604999999994 33.574907999999994,-94.282171999999989 33.572989,-94.290372000000005 33.567905000000003,-94.291686999999996 33.563481000000003,-94.290901000000005 33.558872,-94.289439999999999 33.557634999999998,-94.287571999999997 33.557178,-94.279089999999997 33.557026,-94.275600999999995 33.557963999999998,-94.274473 33.558652000000002,-94.271997999999996 33.561517999999992,-94.270978999999997 33.563220999999999,-94.270853000000002 33.564782999999998,-94.265668999999988 33.573588999999998,-94.262754999999999 33.577354,-94.257801 33.582507999999997,-94.257524288354617 33.582703553652586,-94.252656000000002 33.586143999999997,-94.245931999999996 33.589113999999995,-94.242777000000004 33.589708999999999,-94.240178999999998 33.589536000000003,-94.236971999999994 33.587411000000003,-94.236362999999997 33.585991999999997,-94.236835999999997 33.580914,-94.237975000000006 33.577756999999998,-94.238867999999997 33.576721999999997,-94.244365999999999 33.573549,-94.251108000000002 33.56528,-94.252330999999984 33.561855,-94.252283000000006 33.560445,-94.251569000000003 33.558188,-94.250197 33.556764999999999,-94.237903999999986 33.552675,-94.233128263729824 33.552212399803537,-94.233017493976078 33.552201670126067,-94.231843999999981 33.552087999999998,-94.226392000000004 33.552911999999999,-94.222920999999999 33.554088,-94.21922099999999 33.556095999999997,-94.213604000000004 33.563133999999998,-94.21268334130005 33.563763266722709,-94.208078 33.566910999999998,-94.205634000000003 33.567228999999998,-94.203593999999981 33.566546000000002,-94.202594978382763 33.562850001484037,-94.201237000000006 33.557825999999999,-94.199485999999993 33.556085000000003,-94.197816999999986 33.555238000000003,-94.196394999999995 33.555123000000002,-94.193247999999997 33.556153999999999,-94.191332999999986 33.55766599999999,-94.189883999999992 33.562454000000002,-94.192482999999996 33.570425,-94.194399000000004 33.573678,-94.196366991504703 33.574779501237479,-94.201105911663163 33.575851400157113,-94.204265191768783 33.575005164570705,-94.207404999999994 33.574353000000002,-94.209665 33.573509999999999,-94.211329000000006 33.573774,-94.216140999999993 33.576391999999998,-94.217408000000006 33.579259999999998,-94.217197999999982 33.580736999999999,-94.214431000000005 33.583187000000002,-94.212997 33.583486999999991,-94.210966999999997 33.583143,-94.205788416261612 33.581380140341984,-94.203588205048902 33.580815984742067,-94.199751933850294 33.581098061448763,-94.196536237091394 33.581718635888464,-94.194464999999994 33.582886000000002,-94.190890999999979 33.587474,-94.183913000000004 33.594681999999999,-94.180879999999988 33.592612000000003,-94.176327 33.591076999999999,-94.162266000000002 33.588906,-94.161081999999993 33.587972,-94.162009999999995 33.580877,-94.161276999999998 33.579270999999999,-94.156782000000007 33.575749000000002,-94.152625999999998 33.575923000000003,-94.148731999999995 33.580196999999998,-94.146047999999993 33.581975,-94.144383000000005 33.582097999999995,-94.142160000000004 33.581389999999999,-94.141852 33.579590000000003,-94.143023999999983 33.577725,-94.145668999999984 33.575599999999994,-94.149506000000002 33.573602,-94.151257 33.571793,-94.151754999999994 33.569476000000002,-94.151455999999996 33.568387,-94.148520000000005 33.565677999999991,-94.145239000000004 33.564987000000002,-94.143401999999995 33.565504999999995,-94.136863999999989 33.570999999999998,-94.136045999999993 33.571387999999999,-94.135142000000002 33.571033,-94.134308000000004 33.569209,-94.133047999999988 33.557952999999998,-94.131382000000002 33.552934,-94.128658 33.550952000000002,-94.126897999999983 33.550646999999991,-94.123897999999997 33.552100000000003,-94.122878999999983 33.553111999999999,-94.12071899999998 33.560555,-94.120354999999989 33.5655,-94.119902152897509 33.566998927274319,-94.112842999999998 33.566991000000002,-94.103176000000005 33.570349999999998,-94.100106999999994 33.57256799999999,-94.097439999999992 33.573718999999997,-94.088943 33.575322,-94.082640999999995 33.575491999999997,-94.072670000000002 33.572234000000002,-94.072231491265512 33.572605318678747,-94.072031926011121 33.573523317998088,-94.072031926011121 33.573846369634623,-94.072031926011121 33.574161925883949,-94.071815412538413 33.574459631515609,-94.071712621294751 33.574600969288895,-94.071353404455635 33.574840447439463,-94.070395493400298 33.574561056392717,-94.069534727631535 33.574169799087244,-94.069517406590393 33.574161925883949,-94.068559493988133 33.573563230894273,-94.068280102941401 33.571966710019424,-94.06782332144887 33.570215714974232,-94.067801146640278 33.570130711574109,-94.066845999999998 33.568908999999998,-94.061283000000003 33.568804999999998,-94.056597999999994 33.567824999999999,-94.056095999999997 33.567252000000003,-94.055662999999996 33.561886999999999,-94.056442000000004 33.560997999999991,-94.059849999999997 33.559249,-94.061179999999993 33.559159,-94.066685000000007 33.560953999999995,-94.067984999999993 33.560960999999999,-94.071719999999999 33.559682000000002,-94.073744000000005 33.558284999999998,-94.073825999999997 33.555833999999997,-94.072156000000007 33.553863999999997,-94.069091999999998 33.553406000000003,-94.06547999999998 33.550908999999997,-94.061896000000004 33.549764000000003,-94.056095999999997 33.550725999999997,-94.051882000000006 33.552585,-94.050211999999988 33.551082999999998,-94.046040000000005 33.551321000000002,-94.043449999999993 33.552253,-94.043428000000006 33.551424999999995,-94.043374999999997 33.542315000000002,-94.043020107474533 33.494534442391668,-94.043008999999998 33.493039000000003,-94.043278999999998 33.491029999999995,-94.043271947583932 33.489425304099555,-94.043188 33.470323999999991,-94.043130608695648 33.460424000000003,-94.043089437732434 33.453322008844353,-94.043061045958495 33.448424427841935,-94.043010021810147 33.439622762252007,-94.042987999999994 33.435823999999997,-94.042987999999994 33.434442436873745,-94.042987999999994 33.431023999999994,-94.042886999999993 33.420225000000002,-94.042890126641851 33.419424334827802,-94.042891364631132 33.419107312620362,-94.042967439944888 33.399626074590046,-94.043053 33.377715999999999,-94.042868999999996 33.371169999999999,-94.043127999999996 33.358756999999997,-94.043066999999979 33.352097,-94.043066999999979 33.347351000000003,-94.043066999999979 33.339614667914582,-94.043066999999979 33.330497999999999,-94.042990000000003 33.271227000000003,-94.043049999999994 33.260903999999996,-94.043003999999996 33.250127999999997,-94.042730000000006 33.241822999999997,-94.042876000000007 33.215218999999998,-94.042891999999995 33.202666,-94.042874999999995 33.199784999999999,-94.042718999999991 33.160290999999994,-94.043184999999994 33.143476,-94.043076999999982 33.138162,-94.043007000000003 33.13389,-94.042951563372725 33.117233519058104,-94.042869999999994 33.092726999999996,-94.043036 33.079484999999998,-94.042963999999998 33.019219,-94.042986850316112 33.007494023677346,-94.043068075862834 32.965815492539427,-94.043087999999997 32.955592000000003,-94.043066999999979 32.937902999999999,-94.043092 32.910021,-94.042884999999998 32.898910999999998,-94.042859000000007 32.892771000000003,-94.042885999999996 32.880965000000003,-94.043025 32.880445999999999,-94.042784999999995 32.871485999999997,-94.042921087938623 32.829694015190334,-94.043025999999983 32.797476000000003,-94.042747000000006 32.786973000000003,-94.042828999999998 32.785277,-94.042937999999992 32.780557999999999,-94.043026999999995 32.776862999999999,-94.042946999999998 32.767991000000002,-94.042974715046569 32.757603400545236,-94.04314699999999 32.693030999999998,-94.042912999999999 32.655126999999993,-94.042779999999993 32.643465999999997,-94.042823999999996 32.640304999999998,-94.042925999999994 32.622014999999998,-94.042929 32.618259999999992,-94.042918999999998 32.610142000000003,-94.042939007208048 32.604544739553475,-94.043082999999996 32.564261000000002,-94.043142000000003 32.559502000000002,-94.043081 32.513612999999999,-94.042884999999998 32.505144999999999,-94.042911000000004 32.492851999999999,-94.043088999999995 32.486561000000002,-94.043071999999995 32.48429999999999,-94.042955000000006 32.480260999999999,-94.042995000000005 32.478003999999999,-94.042901999999998 32.472905999999995,-94.042874999999995 32.471347999999992,-94.042902999999981 32.470385999999998,-94.042907999999997 32.439890999999996,-94.042985999999999 32.435507,-94.042898999999991 32.400658999999997,-94.042923000000002 32.399918,-94.042900999999986 32.392282999999999,-94.042762999999994 32.373331999999998,-94.042738999999997 32.363559000000002,-94.042733519218956 32.277818574933548,-94.042732999999998 32.269696000000003,-94.042732 32.269620000000003,-94.042671451745775 32.225096273752321,-94.042662000000007 32.218145999999997,-94.042600205901905 32.185155675879351,-94.042565999999994 32.166893999999999,-94.042538999999991 32.166826,-94.042591000000002 32.158096999999998,-94.042681000000002 32.137956000000003,-94.042751999999993 32.125163,-94.042337000000003 32.119914,-94.042699999999996 32.056012000000003,-94.042717288248511 32.00695918811028,-94.042720000000003 31.999265,-94.042490448495869 31.997488887291052,-94.042251674184627 31.995641414801661,-94.041832999999997 31.992401999999998,-94.038411999999994 31.992436999999999,-94.029282999999992 31.995864999999998,-94.027080554152732 31.994823406342874,-94.018664 31.990842999999998,-94.011671046736083 31.979908989829021,-94.008352361284565 31.974719974671689,-94.002944198469422 31.966263903968002,-93.995504541226836 31.954631438414648,-93.994147015257326 31.952508844111783,-93.977461000000005 31.926418999999996,-93.971711999999982 31.920383999999995,-93.953546000000003 31.910562999999996,-93.943541310721315 31.908563758569336,-93.938002035663573 31.906916949339585,-93.935007833635339 31.903773037645127,-93.932462763507019 31.895538979891644,-93.931327794714704 31.894581351390723,-93.92767203678045 31.891496810199779,-93.923929283519882 31.889849995167665,-93.919587694495533 31.890748256066246,-93.915948999999998 31.892861000000003,-93.909557114944889 31.893143619429534,-93.905252294448232 31.890856686636408,-93.90476638821832 31.890598549301192,-93.901173350426333 31.885957535142037,-93.901888 31.880063,-93.898135577976262 31.874953416991548,-93.896981462364707 31.873381885463036,-93.889196542313442 31.867692899288475,-93.888241004857136 31.85786451213389,-93.888148571748644 31.856913771406646,-93.887306164689562 31.854968889155742,-93.884117000000003 31.847605999999995,-93.880377455095243 31.844791786271248,-93.879654915472827 31.84424803536659,-93.874821999999995 31.840611000000003,-93.874804231839249 31.835091218914506,-93.874787826198073 31.829994712349503,-93.874761000000007 31.821660999999999,-93.870917000000006 31.816836999999996,-93.868473098390325 31.815251608244314,-93.853390000000005 31.805467,-93.846187999999998 31.802021,-93.839950728453459 31.798597132180646,-93.836868453653821 31.794158659336233,-93.836868453653821 31.791454071635616,-93.836868453653821 31.788733862378688,-93.834649214842401 31.783309060642711,-93.831197070889573 31.780226788232302,-93.827450999999996 31.777740999999999,-93.823442999999997 31.775098,-93.822597999999985 31.773558999999995,-93.826519525540022 31.761832440276638,-93.827342999999999 31.759369999999997,-93.830112066651125 31.754555168030393,-93.830647423185951 31.745811043570992,-93.824579 31.734396999999998,-93.819048075401312 31.72885814427071,-93.818932598107111 31.728523867973351,-93.815657495541259 31.719043310199801,-93.815835943108667 31.711905251886723,-93.815525624652665 31.710796971318612,-93.814600367558683 31.707492480599399,-93.814586782471608 31.707443962415162,-93.811060073548262 31.705827553684028,-93.810303944025605 31.705480994217723,-93.807270273132957 31.704231833580664,-93.806045429297654 31.703104120446881,-93.803419352361757 31.700686292667093,-93.802693549340276 31.697783082925291,-93.802451615781152 31.693186330065117,-93.804479 31.685663999999999,-93.812820813246589 31.676953615984285,-93.81562111199878 31.674029590143711,-93.817425 31.672146,-93.821829497696953 31.673879806810671,-93.822051000000002 31.673966999999998,-93.822341750589956 31.673502431839047,-93.826462000000006 31.666919,-93.8257324849111 31.66154827530681,-93.825660999999997 31.661021999999996,-93.825228912080746 31.660277861177896,-93.81803699999999 31.647891999999999,-93.817707248836442 31.6409111211136,-93.816838000000004 31.622509,-93.818717000000007 31.614555999999997,-93.823976999999999 31.614227999999997,-93.825414416100287 31.615089707767993,-93.827851999999993 31.616550999999998,-93.838056999999992 31.606795000000002,-93.839382999999998 31.599074999999999,-93.837534908858984 31.593743346167731,-93.834924 31.586210999999999,-93.822958 31.568129999999996,-93.822219025006859 31.564792487143556,-93.820763999999997 31.558221000000003,-93.818582000000006 31.554825999999998,-93.798086999999995 31.534044000000002,-93.787687000000005 31.527343999999996,-93.781574079702807 31.525595412174177,-93.780834999999996 31.525383999999999,-93.777170583402579 31.525128039451072,-93.760062000000005 31.523933,-93.753860000000003 31.525331,-93.751899169046524 31.525601857922521,-93.749869902733366 31.526210635456998,-93.746826003263621 31.526007705679731,-93.743376259969125 31.525196002300419,-93.742401241878753 31.523787647735123,-93.74154991556837 31.522557958452786,-93.741111000000004 31.520101,-93.740752889151466 31.518711098615515,-93.740332360499409 31.517078940980245,-93.739317727342822 31.515049678599539,-93.734411826534469 31.513527159467717,-93.733432858180635 31.513223342063657,-93.726736285639134 31.511599931372594,-93.725924582259807 31.504091651519342,-93.728765551952293 31.496786301443361,-93.730997740177827 31.492118989316349,-93.733996137544537 31.48847587643743,-93.737167999999997 31.484621999999998,-93.741884999999982 31.483535,-93.745608448194673 31.481972669547908,-93.746355058504165 31.481633300507966,-93.747840636420193 31.480958036391328,-93.749869902733366 31.478928770078173,-93.749869902733366 31.475276095040186,-93.749626709600278 31.47120988033301,-93.749476 31.468689999999999,-93.709416000000004 31.442995,-93.706857276389258 31.44142369846492,-93.700929751125955 31.437783629836048,-93.697919763270235 31.429300939077926,-93.697603150134782 31.428408665937056,-93.704678 31.418899999999997,-93.704697874245824 31.418107106580852,-93.704878999999991 31.410881,-93.701611 31.409333999999998,-93.695865999999995 31.409391999999997,-93.689953513429003 31.406208353384852,-93.678362516190631 31.399967047179565,-93.675064666986117 31.398191282223291,-93.674659331220113 31.397973024503138,-93.674116999999981 31.397680999999995,-93.671643999999986 31.393352,-93.670181999999983 31.387184,-93.668532759396427 31.379357124595749,-93.668145986696857 31.37510269235548,-93.669064113561134 31.373151679996884,-93.669693055010129 31.371815184369147,-93.669512094168894 31.370548454097019,-93.668919524600994 31.366400452767671,-93.667402247962755 31.365414223393856,-93.665051865060306 31.363886475190469,-93.663891561951601 31.361952641672623,-93.663698175601809 31.360018811902275,-93.664665092360735 31.357698213179859,-93.665825387974422 31.355184231855155,-93.668439000000006 31.353011999999996,-93.669515978941746 31.350266666374935,-93.673736148309771 31.339509006758242,-93.677277000000004 31.330482999999997,-93.687850999999995 31.309835,-93.686922292404276 31.305369360695714,-93.686880000000002 31.305166,-93.686723586265984 31.304979085312567,-93.684737187533131 31.30260533533086,-93.684038999999999 31.301770999999995,-93.683824154244718 31.301752735987076,-93.675439999999995 31.30104,-93.668927999999994 31.297974999999997,-93.657003999999986 31.281735999999999,-93.647719584117951 31.27389987096868,-93.642516 31.269508000000002,-93.632650200244299 31.270182983909681,-93.620343000000005 31.271025000000002,-93.615257056394739 31.261768439618621,-93.61394199999998 31.259374999999995,-93.614287999999988 31.251631,-93.616308000000004 31.244595000000004,-93.616007481020262 31.233959925788763,-93.613835693061347 31.232449117569455,-93.609977782626956 31.229765355202261,-93.609827614285464 31.229660890324059,-93.608033931702224 31.227867209671889,-93.60740940488401 31.227242683526022,-93.605259887151632 31.224152751460338,-93.604319472818304 31.220794125122111,-93.604319472818304 31.215285983654958,-93.607287999999997 31.205403,-93.602442999999994 31.182541,-93.600307999999998 31.176157999999997,-93.598827999999997 31.174679,-93.595531708436056 31.171774432382691,-93.588772842417583 31.16581877494577,-93.588502999999989 31.165581,-93.588046655571759 31.165671453282986,-93.583339301771971 31.166604510813709,-93.579215000000005 31.167421999999995,-93.578993496784307 31.167654977688123,-93.574136071231791 31.172764031170193,-93.569563000000002 31.177574,-93.560942999999995 31.182481999999997,-93.552649000000002 31.185575,-93.548930999999996 31.186601,-93.535096999999993 31.185614,-93.533756450961803 31.184752004501149,-93.533306999999994 31.184463,-93.5330935917342 31.183965183917415,-93.531744000000003 31.180816999999998,-93.533193520062923 31.174490811082034,-93.53417786817559 31.170194787673282,-93.536829999999981 31.158620000000003,-93.540253000000007 31.156578999999997,-93.544009577425854 31.153014849431809,-93.544887639546317 31.148844041597808,-93.544887639546317 31.143136612291205,-93.544701999999987 31.135888999999999,-93.540277800652078 31.128868068802213,-93.539619249807799 31.121843550568837,-93.541375382556595 31.113501939154769,-93.541635919885238 31.113241401693255,-93.548470239502265 31.106407078590973,-93.549716998224596 31.105160319232844,-93.55112206776522 31.099540038044921,-93.551692642249563 31.097257738879012,-93.551034091405285 31.091111287020031,-93.546643772295099 31.082989189009115,-93.540128999999993 31.078002999999995,-93.53104031045666 31.074698717981779,-93.527873992025093 31.072210897922254,-93.526043656150705 31.070772777782928,-93.524020490083288 31.067083472240864,-93.523009982318626 31.065240780256033,-93.523659621286654 31.063941504256789,-93.525329858273139 31.060601035263321,-93.529255791555698 31.057567354514948,-93.532069000000007 31.055264,-93.531218761655126 31.051678447674814,-93.523247999999995 31.037841999999998,-93.516942620821894 31.032584114108545,-93.516407263768343 31.029550433360171,-93.516883288197775 31.024314186160638,-93.516942620821894 31.023661529978199,-93.539525999999995 31.008497999999999,-93.540062152267268 31.008345085566372,-93.540618575989114 31.008186389569964,-93.555580999999989 31.003918999999996,-93.562626264226125 31.00599480945781,-93.566016847371429 31.004567194682853,-93.567979815741779 31.001533515663564,-93.569764334642755 30.996715319472376,-93.571101253513504 30.991033414001794,-93.571905755076102 30.987614282198351,-93.567971999999997 30.977981,-93.560533000000007 30.971285999999999,-93.55046299120518 30.967360467203815,-93.549841 30.967117999999996,-93.539153617393822 30.956968324013513,-93.532549000000003 30.950695999999997,-93.526524876707626 30.939912016599852,-93.526293050708773 30.939497017171423,-93.526245000000003 30.939411,-93.526242458076936 30.939167805401102,-93.526231146824912 30.938085618677029,-93.526146999999995 30.930035,-93.526269219450654 30.929894609689271,-93.530935999999983 30.924533999999998,-93.542488999999989 30.920064,-93.54502991280485 30.920837107400992,-93.546884259495414 30.92151141825828,-93.549244331161987 30.921005686748707,-93.550358562122057 30.920030731622223,-93.551941554990407 30.918645608548566,-93.555650241837967 30.911228247920597,-93.555751501305451 30.910053639118178,-93.555774257662236 30.909789665608852,-93.556493125509377 30.9014508058257,-93.562447641167196 30.896531852982324,-93.563812214002311 30.895404595987301,-93.564247644832776 30.895044891882932,-93.567787752332634 30.888301832311882,-93.567450600170787 30.878524390216981,-93.566008182600839 30.875519355165832,-93.565853452041281 30.875197,-93.565427680666076 30.874309976760035,-93.563763247930751 30.87311591407202,-93.559394659034922 30.869981891957959,-93.55904186947815 30.86972880101742,-93.558616999999984 30.869423999999999,-93.558608112367665 30.868835818489011,-93.558593354020289 30.867859114376206,-93.558393833586933 30.854654896933653,-93.558352334289978 30.851908482785802,-93.558231866260058 30.843935935637496,-93.558171999999999 30.839973999999998,-93.553625999999994 30.835139999999999,-93.55374115920948 30.832414921630001,-93.554057 30.824940999999995,-93.561666000000002 30.807738999999998,-93.563243 30.806218000000005,-93.564501487304341 30.805543276361082,-93.569303000000005 30.802969,-93.578395 30.802046999999998,-93.584264999999988 30.796662999999995,-93.588934854633479 30.787551489258888,-93.589380999999989 30.786681000000002,-93.589895999999996 30.77776,-93.591925627378814 30.768225181611253,-93.592827999999997 30.763985999999996,-93.607757000000007 30.757656999999995,-93.611581311334461 30.752392350515215,-93.615058988962588 30.747604886281291,-93.619129 30.742001999999996,-93.617688 30.738479000000005,-93.609908791486006 30.729403419430973,-93.609718999999998 30.729181999999998,-93.609544 30.723138999999996,-93.61030547238029 30.720788970554505,-93.611192000000003 30.718053,-93.61618399999999 30.713980000000003,-93.616977218405893 30.712276394979256,-93.620773999999997 30.704122000000005,-93.621061387132315 30.696047232392139,-93.621092999999988 30.695159,-93.62235785978659 30.692974242186811,-93.629903999999996 30.679939999999995,-93.632922525899005 30.677439880221801,-93.638212999999993 30.673057999999997,-93.646373493696458 30.671658473870171,-93.653439445062318 30.670446661945991,-93.654970999999989 30.670183999999999,-93.666219386787546 30.661299653678171,-93.670353999999989 30.658033999999997,-93.670860468306827 30.657347728689221,-93.683099999999996 30.640763000000003,-93.685120999999981 30.625201,-93.684323003112922 30.617258061147268,-93.683396999999985 30.608040999999997,-93.680812614601606 30.602993111696524,-93.680648411741274 30.602453589051585,-93.679828117977763 30.599758343304948,-93.681234543283509 30.596101640780542,-93.683902548646543 30.593069810094963,-93.684328672415049 30.59258557751615,-93.684347894395486 30.592579170189346,-93.687282162286593 30.59160108089231,-93.689533999999995 30.592759,-93.692869000000002 30.594382000000003,-93.712453999999994 30.588479,-93.72107859525056 30.580404159651369,-93.727657631584904 30.574244488790981,-93.727844000000005 30.574069999999995,-93.727840097341868 30.573768021870688,-93.72780696123904 30.571204031383882,-93.727747245613443 30.566583382517752,-93.727745999999996 30.566486999999999,-93.725846999999987 30.556978,-93.728764326223569 30.546403128121515,-93.729195000000004 30.544841999999999,-93.736587760607577 30.541316766984647,-93.740252999999996 30.539569,-93.738909526480768 30.537838512460276,-93.732793 30.529960000000003,-93.727721000000003 30.525671000000003,-93.718711305261792 30.520890798500346,-93.714321999999996 30.518561999999996,-93.710116999999997 30.506399999999996,-93.713193644304937 30.50058809182816,-93.716678000000002 30.494005999999995,-93.71365216083376 30.483878530555742,-93.711446941284677 30.476497671106777,-93.710595424186792 30.473647647388944,-93.709703157003446 30.47066123332699,-93.708899372668625 30.467970970942378,-93.705844999999997 30.457747999999999,-93.697828 30.443837999999996,-93.6978 30.440583,-93.698862234241474 30.438260713588438,-93.702220303997905 30.430919206922557,-93.702664999999996 30.429947000000002,-93.722313999999997 30.420729,-93.729486046484141 30.413342592858086,-93.738025291703323 30.404548123662593,-93.738321805525445 30.404242747530638,-93.745333000000002 30.397022,-93.751243378615428 30.396311282781173,-93.751436999999996 30.396287999999998,-93.754787283332149 30.393127406185759,-93.75746720581121 30.390599218098316,-93.757654000000002 30.390422999999995,-93.757872622462301 30.389610210267922,-93.758470934573069 30.387385818798332,-93.75855399999999 30.387077,-93.758091991038413 30.3842338214119,-93.758032188807945 30.383865801664729,-93.757931393201204 30.383245510859378,-93.75589426835937 30.370709152880856,-93.756044740613035 30.365928314513319,-93.75610723110799 30.3639428524199,-93.756352000000007 30.356166000000002,-93.758519945992674 30.350935458285047,-93.760658351649255 30.34577618769989,-93.763244572034736 30.339536487238696,-93.765822 30.333317999999995,-93.764264999999995 30.330222999999997,-93.760690955159149 30.32995156504764,-93.760328 30.329923999999998,-93.747921244232074 30.314935395431327,-93.743830002049762 30.309992764786195,-93.741160171732417 30.306767342150266,-93.738698999999997 30.303793999999996,-93.734966161369201 30.301561360829975,-93.729390287632427 30.298226388348422,-93.724220000000003 30.295133999999997,-93.718684474451791 30.295009979388311,-93.714319430116035 30.294282471059141,-93.71311219174963 30.293184979315004,-93.711118400234781 30.291372437742464,-93.709949692759622 30.289928741213533,-93.708644873043468 30.288316906143507,-93.708448001046747 30.287627854154977,-93.707590519980414 30.284626670422831,-93.706607851977495 30.281187332412603,-93.706635817233519 30.280914670488997,-93.707189856385114 30.275512775340033,-93.709131999999997 30.271826999999995,-93.707538803456245 30.253087036355307,-93.707271000000006 30.249936999999996,-93.705637767078656 30.244573755694763,-93.705083000000002 30.242751999999996,-93.707646217538425 30.23733474070027,-93.713358999999997 30.225261,-93.71802168481895 30.219915738218987,-93.719219999999993 30.218541999999999,-93.720945999999998 30.209852,-93.717397000000005 30.193439,-93.710467999999992 30.180670999999997,-93.706634735424259 30.17682001000631,-93.705927274531248 30.176109277739844,-93.705791510460429 30.175972885881706,-93.703764000000007 30.173936,-93.703646997347349 30.173527735424756,-93.702964616901454 30.171146663230584,-93.701744610591902 30.166889619937699,-93.701686103512344 30.166685467574972,-93.697748000000004 30.152943999999998,-93.696083741705934 30.150925109485563,-93.688211999999979 30.141376,-93.69286799999999 30.135216999999997,-93.69498 30.135185,-93.698276000000007 30.138608000000005,-93.700984936503929 30.137486558544058,-93.701251999999997 30.137376,-93.7012922571502 30.136537706048752,-93.701585086407604 30.130439981942867,-93.701656556414648 30.128951727699913,-93.701742498922442 30.127162105630983,-93.701985639262489 30.122099077688652,-93.702366286953335 30.114172668214064,-93.702403861450691 30.11339023643033,-93.702436000000006 30.112720999999997,-93.70268530105453 30.112503701678254,-93.704703872918159 30.110744253531749,-93.710410303455276 30.105770356484715,-93.714491639657382 30.10221294069715,-93.723764999999986 30.094129999999996,-93.727140999999989 30.092110594495406,-93.7293848599641 30.090768395691203,-93.72996305770063 30.09042253796256,-93.732484999999997 30.088913999999995,-93.734084999999979 30.086129999999997,-93.731705540540531 30.081478540540548,-93.731605000000002 30.081282000000002,-93.729179922109864 30.079341937687897,-93.727017487667368 30.077611990133899,-93.71640499999998 30.069121999999997,-93.716151269697463 30.069056930886212,-93.707507094464489 30.066840132907302,-93.702179999999998 30.065473999999995,-93.700580000000002 30.063666,-93.699479012508235 30.0595596142199,-93.699395999999993 30.059249999999995,-93.699786698153744 30.05843348475733,-93.700658293446523 30.056611948527472,-93.700819999999993 30.056273999999998,-93.702099264262131 30.055460929156467,-93.703267223154896 30.054718601437116,-93.703940000000003 30.054290999999999,-93.704473210548429 30.054251542735575,-93.709782747672762 30.053858640136632,-93.710785394684464 30.05378444485228,-93.720804999999999 30.053042999999995,-93.729054152595779 30.045230570163486,-93.729990027439044 30.044344241966268,-93.737446000000006 30.037282999999999,-93.739158000000003 30.032626999999998,-93.739733999999999 30.023987000000002,-93.741078000000002 30.021571000000002,-93.744068611359822 30.019549890100706,-93.74834924745744 30.01665695787004,-93.753252045558341 30.013343557169065,-93.766227014667976 30.004574835541469,-93.782835629207284 29.993350429819579,-93.786934999999986 29.990579999999998,-93.789430999999993 29.987812000000002,-93.803328792953494 29.962666096659486,-93.807814999999991 29.954549,-93.813734999999994 29.935126,-93.816550000000007 29.920725999999995,-93.818997999999993 29.914822,-93.830374000000006 29.894358999999998,-93.838374000000002 29.882854999999999,-93.853129483564672 29.866348149842587,-93.854474509531912 29.864843479256791,-93.855140000000006 29.864098999999996,-93.857517787207271 29.862146563102172,-93.862474802662518 29.858076283033213,-93.863569999999996 29.857177,-93.864820388168837 29.856398395289631,-93.872445999999997 29.851650000000003,-93.890679000000006 29.843159000000004,-93.900728 29.836967,-93.911111176241661 29.828996955749506,-93.916359999999997 29.824967999999998,-93.922743999999994 29.818808,-93.927992000000003 29.809640000000002,-93.929208000000003 29.802952,-93.928808000000004 29.79708,-93.926503999999994 29.789559999999998,-93.922407000000007 29.785048,-93.898470000000003 29.771576999999997,-93.893861999999999 29.767289000000002,-93.890820999999988 29.761672999999995,-93.891780610698319 29.758916671398389,-93.892526767476923 29.756773455119472,-93.893828999999997 29.753032999999999,-93.891732576672823 29.744984915009951,-93.891637000000003 29.744618000000003,-93.891484462723341 29.744488863328282,-93.888820999999993 29.742234000000003,-93.873941000000002 29.737770000000005,-93.870019999999997 29.735482,-93.863203999999996 29.724059,-93.837970999999982 29.690618999999998,-93.852868 29.675885,-93.866980999999996 29.673085,-93.889989999999997 29.674012999999999,-93.930999999999997 29.679611999999999,-93.955443390383635 29.680262610936268,-93.955453232202885 29.68026287289646,-93.991585827226885 29.681224615973395,-94.000169999999997 29.681453101326589,-94.000222586816207 29.681454501032487,-94.001406000000003 29.681486,-94.010062765207763 29.679864152681674,-94.056505999999999 29.671163,-94.132576999999984 29.646217,-94.354166823921716 29.561457673765378,-94.370794193562546 29.555097613439198,-94.391123278008692 29.54732162684321,-94.45341877657637 29.523493256060661,-94.456196753642018 29.522430664556182,-94.45805240375158 29.521720868184531,-94.499046371673685 29.506040450016997,-94.499089575343746 29.506023924375612,-94.500455432020999 29.505501476685335,-94.500806999999995 29.505367,-94.552043946167103 29.48495633977835,-94.552044379602123 29.484956167115939,-94.568074121423052 29.478570587212708,-94.593696728539513 29.46836361027578,-94.594852999999986 29.467903,-94.599458690353401 29.465813271763974,-94.62931993394271 29.452264405230761,-94.631084 29.451464,-94.634656044789836 29.449584234717392,-94.661528069434993 29.435443006940758,-94.670389 29.430779999999999,-94.674924987623086 29.427889211977174,-94.680871144138621 29.42409972235215,-94.694158000000002 29.415631999999999,-94.708472999999998 29.403049000000003,-94.723958999999979 29.383268000000005,-94.730956033155138 29.369322304827527,-94.731047000000004 29.369140999999996,-94.731324722869132 29.369141342444962,-94.731537324603394 29.369141604592603,-94.742750849251038 29.369155431380086,-94.744595216508316 29.369157705569055,-94.744833999999997 29.369157999999999,-94.761491000000007 29.361882999999999,-94.772184717669788 29.3616343088914,-94.778690999999995 29.361483,-94.780073439975141 29.362532749099824,-94.782355999999993 29.364266,-94.782645420567292 29.368514320481975,-94.783130999999997 29.375641999999996,-94.766847999999996 29.393488999999999,-94.754099999999994 29.400999999999996,-94.743385419572206 29.410035318862811,-94.73704402931665 29.415382843516582,-94.727822669267709 29.423158969605012,-94.723817999999994 29.426535999999995,-94.716270519001597 29.430976788539081,-94.706539419927282 29.436702374764607,-94.706364999999991 29.436804999999996,-94.686385999999999 29.466508999999995,-94.681540999999996 29.471388999999999,-94.672399999999996 29.476842999999999,-94.665852999999998 29.478401000000002,-94.656737000000007 29.478032999999996,-94.645948000000004 29.473769,-94.628217000000006 29.475986000000002,-94.608557000000005 29.483344999999996,-94.594211 29.492127,-94.595122262498009 29.503650874486677,-94.595439999999996 29.507669,-94.591407000000004 29.513857999999999,-94.580274000000003 29.525295,-94.566674000000006 29.531987999999995,-94.553989999999985 29.529558999999999,-94.546993999999998 29.524379,-94.532347999999999 29.5178,-94.511044999999996 29.519649999999995,-94.495024999999984 29.525030999999998,-94.503428999999997 29.543249999999997,-94.509486999999993 29.542589999999997,-94.523742999999996 29.545987,-94.523871183237745 29.546315590042923,-94.5261306113389 29.55210749848424,-94.526336 29.552633999999998,-94.542531999999994 29.568999999999999,-94.546193009360195 29.571896121601313,-94.546385 29.572047999999995,-94.546803832691651 29.57214903106096,-94.55398799999999 29.573882,-94.570006000000006 29.572232,-94.578210999999982 29.567281,-94.593518000000003 29.561319,-94.625889999999998 29.552807999999999,-94.634988842169335 29.550728838088908,-94.643914431984982 29.54868926579681,-94.666855093063802 29.543447131924982,-94.691625000000002 29.537787000000002,-94.693243673136905 29.537529479678042,-94.718275999999989 29.533546999999995,-94.740699000000006 29.525857999999999,-94.757688999999999 29.524616999999999,-94.768675999999999 29.525659,-94.780938000000006 29.531093000000002,-94.785987568065153 29.540133852805589,-94.789123822994313 29.545749069554745,-94.789562096440733 29.546533763545689,-94.78971899677407 29.546814681200559,-94.790604999999999 29.548400999999998,-94.779438999999996 29.549472000000002,-94.772471009935998 29.548613672580952,-94.771052999999995 29.548438999999995,-94.762972090755014 29.555767305595641,-94.75523699999998 29.562781999999999,-94.750081379755628 29.56810096117977,-94.734626000000006 29.584046,-94.731874420576986 29.588423440241069,-94.724443803393115 29.600244680945409,-94.708741000000003 29.625226,-94.705273448792255 29.640626536822896,-94.703938528752261 29.6465553563269,-94.702680930363101 29.65214076491651,-94.702542126991759 29.652757236398369,-94.699660909360375 29.665553672721437,-94.69780371146922 29.673802100155214,-94.694887994254785 29.686751760487848,-94.693153999999993 29.694452999999999,-94.692434000000006 29.70361,-94.692611750388934 29.704808689927841,-94.695098387970873 29.721577752663908,-94.695317000000003 29.723051999999999,-94.695611486157915 29.72357178078331,-94.697558868014866 29.727008993840069,-94.705700105090941 29.741378628781629,-94.713878412983604 29.755813695314995,-94.714586470042065 29.757063446593907,-94.722078339612551 29.770286919851305,-94.724615999999983 29.774766,-94.735270999999997 29.785433,-94.738125273271791 29.786265833277604,-94.740919000000005 29.787080999999997,-94.749144589762409 29.783534045463153,-94.75591801041729 29.780613280409739,-94.771512 29.773888999999997,-94.792237999999998 29.767432999999997,-94.798897371247961 29.764438558858895,-94.816085 29.756710000000002,-94.81943931055217 29.753325616252695,-94.823987131664666 29.748737021482022,-94.851107999999996 29.721373000000003,-94.856932183541645 29.710462974624775,-94.860426638443812 29.703917062844585,-94.864167858487249 29.696908903620852,-94.865007000000006 29.695336999999999,-94.865123196353878 29.694545038919138,-94.867438000000007 29.678768000000002,-94.872550999999987 29.67125,-94.893107 29.661335999999999,-94.915413 29.656613999999998,-94.921317999999999 29.658177999999999,-94.928410408640929 29.669495826038883,-94.930071799099807 29.672147016790593,-94.930110565443542 29.672208878811933,-94.930656833967475 29.673080595662611,-94.931474856161643 29.67438596783704,-94.934166999999988 29.678681999999998,-94.935264231405057 29.686686879688732,-94.935319060033862 29.687086883348073,-94.935997030967087 29.692033037575822,-94.936088999999996 29.692703999999999,-94.936280063994801 29.692851065945039,-94.941277009519624 29.696697319220664,-94.942680999999993 29.697778,-94.942922907078852 29.697804516058127,-94.95311095436017 29.698921254167477,-94.965343618259496 29.700262107971746,-94.965962999999988 29.70033,-94.972666000000004 29.684869999999997,-94.980123280315652 29.679059463608382,-94.986438191421769 29.674139034277729,-94.988580124776774 29.672470090483102,-95.001800051879343 29.662169436052462,-95.002396227716986 29.661704909944582,-95.005398 29.659365999999995,-95.011683000000005 29.649802000000005,-95.013860566469219 29.644103309100927,-95.014229369455222 29.643138151779844,-95.015636 29.639457,-95.015582911847446 29.639202042718885,-95.014543866006605 29.634211997110764,-95.013498999999996 29.629193999999998,-95.006633444897872 29.623869765921089,-95.00056235200779 29.61916163683599,-95.000370188745762 29.619012614335521,-94.997782627529062 29.617005962082896,-94.997731096758997 29.616965999999998,-94.995478872439179 29.615219401320278,-94.993499353954022 29.613684285860323,-94.988871000000003 29.610095,-94.988045541621688 29.608923290953985,-94.982835617337045 29.60152798723708,-94.982705999999993 29.601344000000005,-94.982886347998431 29.601051719777942,-94.983895794498991 29.599415764569699,-94.98693593300419 29.594488776939745,-94.988992999999994 29.591155,-94.991605757589539 29.588791109774153,-94.991811610459919 29.588604864563266,-94.992208959522046 29.588245363334387,-95.006677600766466 29.575154872369662,-95.007235451984087 29.574650156950938,-95.007670000000005 29.574256999999996,-95.00815781845921 29.573398130166158,-95.016627 29.558487,-95.018253 29.554884999999999,-95.016926355758628 29.548485488141377,-95.015164999999996 29.539988999999998,-95.012091452887788 29.536262245236642,-95.011587670186657 29.535651395780732,-95.011086587278399 29.535043819893005,-95.001666768519442 29.523622047865974,-94.999580999999992 29.521093,-94.989064037839412 29.515168017977793,-94.982063906682782 29.511224326765198,-94.981915999999998 29.511140999999995,-94.981645984265953 29.511070508097891,-94.961088181447877 29.505703566689924,-94.958443000000003 29.505013000000002,-94.958183821928699 29.504969740154092,-94.957844913785792 29.504913172428417,-94.95747910332102 29.504852114391142,-94.955724072517796 29.504559179260749,-94.952845264169682 29.504078672538427,-94.930551536860648 29.500357589179547,-94.927405495678158 29.499832478177321,-94.909464999999997 29.496837999999997,-94.913072085311995 29.488019044482122,-94.913385000000005 29.487254,-94.917178632618899 29.481741136316387,-94.925104227340569 29.470223752399235,-94.925293406029382 29.469948840084836,-94.925914000000006 29.469047,-94.930860999999993 29.450503999999999,-94.923011455799639 29.448810114938265,-94.920334997737442 29.448232551169699,-94.919400999999993 29.448030999999997,-94.916063708203708 29.446327523795176,-94.890799999999984 29.433432,-94.888257132054065 29.420136433311271,-94.887299999999996 29.415132,-94.887087039327696 29.40154064293051,-94.886938304445962 29.392048238229908,-94.886925408340758 29.391225196262944,-94.886904215833582 29.389872669858736,-94.886764190565785 29.380936121184895,-94.886591910643261 29.369941049100753,-94.886536208040312 29.366386054846032,-94.886982892003275 29.364738908620176,-94.888420210858001 29.359438798199445,-94.888544709543254 29.358979709544975,-94.888781730376067 29.358105695694917,-94.894234145274325 29.337999926591962,-94.894147383920654 29.327241695272729,-94.894002695197727 29.309300588032027,-94.893993580875261 29.308170430590454,-94.891329624021282 29.304475264201969,-94.888683946869179 29.30080545353194,-94.886599269217157 29.297913803549264,-94.886536208040312 29.297826331584119,-94.885816422022174 29.297499155955627,-94.884216982863776 29.296772137788121,-94.876917125093229 29.293454018939102,-94.875951551627523 29.293015121686942,-94.86617837453683 29.293883848703121,-94.865126326153927 29.293977364132552,-94.861112574100105 29.294855372432302,-94.849730461009372 29.297345209778594,-94.825607939204673 29.30577638202961,-94.824952733476934 29.30600538596191,-94.823862547308252 29.313200608971236,-94.822547126780194 29.321882377573708,-94.82230657170463 29.344254498409398,-94.810695999999993 29.353434999999998,-94.797913847039041 29.344567105809805,-94.79693012269928 29.343884625840758,-94.784895000000006 29.335535,-94.779995 29.334935000000002,-94.777063999999996 29.336811,-94.773074869484503 29.336485139838025,-94.745528999999991 29.334235,-94.744945 29.33641,-94.731319999999997 29.338066,-94.722529999999992 29.331445999999996,-94.731082 29.331833,-94.769694999999999 29.304936,-94.780304129101268 29.295750693651897,-94.786095000000003 29.290737,-94.793321795438203 29.286014946162535,-94.795651468635626 29.284492716516493,-94.803695000000005 29.279236999999998,-94.809348860129617 29.275904173901317,-94.81020919937113 29.275397022855465,-94.819018398045671 29.270204194137058,-94.82210781776098 29.268383049216432,-94.825036245866656 29.266656805306088,-94.825782574142963 29.266216861214712,-94.826962003659688 29.265521613475173,-94.833188167130103 29.261851427154124,-94.844390135018429 29.255248113651685,-94.870677905110114 29.23975205180561,-94.881596387366812 29.233315846843187,-94.896165027201874 29.224727954332334,-94.925556066041452 29.207402583865772,-94.927613957028456 29.206189502425392,-94.940693735267132 29.198479261054111,-94.968741214129224 29.181945889621023,-94.978383546115566 29.176261947153485,-94.981700088962569 29.174306918145966,-95.026218999999998 29.148064000000002,-95.076832914261459 29.114498139229923,-95.081772999999998 29.111222,-95.084611040272236 29.108948681405003,-95.100241410561338 29.096428488590096,-95.110484 29.088224,-95.116308293211759 29.081343778536318,-95.119264367911811 29.077851775668329,-95.119484217932538 29.077592067446851,-95.122403192505772 29.074143890856067,-95.122524999999996 29.074000000000002,-95.122638295373392 29.073709965581063,-95.125134000000003 29.067321,-95.183550616106302 29.028323983126334,-95.191390999999996 29.023089999999996,-95.192301227546167 29.02243038040822,-95.237672480263356 28.989550945676651,-95.238923999999997 28.988644,-95.240558404572027 28.987315672512366,-95.251568580535192 28.978367386619187,-95.251619678822578 28.978325857575001,-95.272266000000002 28.961545999999995,-95.29656403895315 28.934716691525271,-95.297146999999981 28.934073,-95.309703999999996 28.928262,-95.334686660244515 28.911063042846731,-95.353450999999993 28.898145,-95.376979000000006 28.876159999999999,-95.377903963555724 28.874482723635413,-95.38239 28.866347999999999,-95.416173999999998 28.859482,-95.436326577581042 28.85908617652915,-95.439594 28.859022000000003,-95.449516932572138 28.854239851149391,-95.480746000949352 28.839189657836059,-95.485144835951402 28.837069731735976,-95.486768999999995 28.836286999999995,-95.506945757563287 28.824808612805594,-95.536465934189138 28.808014833314715,-95.564052739104355 28.79232093268277,-95.564094788066555 28.792297011382839,-95.564132228771385 28.792275711681647,-95.568135999999981 28.789997999999997,-95.576201168007842 28.785870627961152,-95.606319447682353 28.770457515020929,-95.613122366343802 28.766976102576891,-95.695711236705606 28.724711019702028,-95.715243498124195 28.714715330888584,-95.812504000000004 28.664942,-95.854124934570734 28.646410960033691,-95.884026000000006 28.633098,-95.920915435374582 28.618912188118028,-95.97832748198536 28.596834417485056,-96.000681999999983 28.588238,-96.000998496292368 28.588108377001081,-96.024040703743012 28.578671299526803,-96.035336417502748 28.574045070633311,-96.05294532761279 28.566833233429691,-96.077867999999995 28.556625999999998,-96.194412 28.502223999999998,-96.220123346321373 28.492065891861738,-96.220376184174313 28.491966,-96.226882700448613 28.487451845000788,-96.241923733725443 28.477016528665938,-96.244750999999994 28.475055,-96.270391000000004 28.461929999999999,-96.303212000000002 28.441870999999999,-96.321560000000005 28.425148,-96.328817 28.423658999999997,-96.341616999999999 28.417333999999997,-96.371116999999998 28.397660999999999,-96.372100999999986 28.393874999999998,-96.370716999999985 28.387667,-96.378616389014681 28.383909329746462,-96.379349732835649 28.386024690464755,-96.381702691108558 28.392811896356477,-96.381863685354148 28.393276290946375,-96.375880899310658 28.401794149460329,-96.37413840285555 28.404274990018202,-96.340801887331921 28.432913073072363,-96.338559687910475 28.434839257985413,-96.335119195902806 28.437794848703732,-96.312964581561445 28.451131053409146,-96.280819757359396 28.470480970729877,-96.274497619264608 28.474286648703266,-96.268341347214189 28.477992481854848,-96.252027698910211 28.484249764669329,-96.250247000000002 28.484932771712327,-96.223824788704931 28.495067307260509,-96.218978121459415 28.500382701101032,-96.21505000939203 28.509679222336811,-96.145447855080619 28.544740658174199,-96.10473518795402 28.559498996555909,-96.046210731424992 28.586980036018211,-96.032979113622659 28.589015683181284,-96.007533711461477 28.59970275682273,-95.986159544454679 28.60631857558586,-95.982088289576367 28.614461085342473,-95.98565064745685 28.621076904105603,-95.983106103295938 28.641942154390655,-95.97852589224803 28.650593590730978,-95.986065974637228 28.655467849280154,-95.996337701374344 28.658736120211515,-96.002953500413568 28.656191585912577,-96.006515878017979 28.648049056432036,-96.010005951759737 28.648641710656278,-96.010506546843942 28.648726717396318,-96.011440067305529 28.648885239790378,-96.014343010193883 28.649378192516537,-96.026200716522851 28.65139176594381,-96.03348799089656 28.652629228032097,-96.039323368019012 28.651170385770797,-96.047737442142406 28.649066870151618,-96.049244844336243 28.648218956037223,-96.052682972641108 28.646285007998213,-96.05836686193534 28.643087818836001,-96.072165030584017 28.635326345489485,-96.092812363862251 28.627145317384699,-96.098878916233431 28.624741586366319,-96.099137163186526 28.624639261986079,-96.099760206508392 28.62447226081035,-96.102639895829256 28.623700385909448,-96.141413249033207 28.613307536255487,-96.148501276515404 28.611407654045699,-96.187178316202875 28.593595864643298,-96.198374286842139 28.586980055742131,-96.221784081288092 28.580364246840958,-96.228908787187095 28.580873158631725,-96.233997875508891 28.596649310733014,-96.233997875508891 28.601738394123839,-96.222292978285921 28.607336389305434,-96.214150448805384 28.613443281484855,-96.212623728226021 28.62260364440889,-96.2309444244882 28.64143324753087,-96.208552463485731 28.662298487953962,-96.214659365527126 28.665351929112688,-96.192267404524671 28.68774389011514,-96.1912495908051 28.694359708878277,-96.195829762405154 28.698939880478335,-96.202445561444364 28.700975507917487,-96.208747675276499 28.700187749031503,-96.21684000834783 28.699176214258408,-96.221467818495611 28.69859774191346,-96.222801895007663 28.698430983480506,-96.223384071149837 28.698294,-96.224163927167865 28.698110503315906,-96.227000018566372 28.697443183508955,-96.229623268039219 28.696825944469072,-96.231453341209956 28.69639533631743,-96.233964222112746 28.695240331316239,-96.23422531976 28.695120226420762,-96.234426397558138 28.695027730650764,-96.243315632596989 28.690938683290845,-96.256898753233088 28.684690448956413,-96.263514562134276 28.683672635236839,-96.268603640594122 28.688761723558645,-96.287942160437836 28.68316371851509,-96.304227224329892 28.671458831154069,-96.305245042980445 28.660262850652849,-96.303866760710434 28.646480081370939,-96.303718312539132 28.644995605411349,-96.322902111893882 28.641863561491792,-96.322903115546453 28.641863397630402,-96.328654788116609 28.640924350533034,-96.373438710121519 28.626674919011112,-96.376492171004159 28.620059100247982,-96.384634680760783 28.615987845369677,-96.473693647496702 28.573239550803915,-96.48794308888057 28.569677192923439,-96.482854000558774 28.580364266564878,-96.480309456397848 28.596649335387912,-96.485907441717487 28.60784531588914,-96.490487633041468 28.610898766909834,-96.510843966604781 28.614970031650095,-96.510335069606953 28.617514575811001,-96.497612348802434 28.625148188569788,-96.496594535082863 28.630746183751381,-96.49964797624159 28.635835272073191,-96.506263795004728 28.638379806372129,-96.513590449607946 28.639711925390898,-96.518002756430107 28.640514162994929,-96.524548246905439 28.641704252172264,-96.541744210187403 28.644830790950802,-96.545449731689985 28.645504522133091,-96.555118991611849 28.64601343885484,-96.5632615210924 28.64448670841351,-96.564664053901609 28.647882315216158,-96.572092291837293 28.665866475800886,-96.572930781014264 28.667896502859467,-96.570386236853366 28.674003385176928,-96.559190266214102 28.687235002979271,-96.559699163211917 28.6913062775815,-96.561225893653244 28.696395346179383,-96.566823878972883 28.697922096344637,-96.575158129308363 28.702846874961025,-96.578019859474111 28.704537895383844,-96.57828826199534 28.705826226653553,-96.579938546079447 28.713747585140421,-96.580564403635009 28.716751699466613,-96.584126761515478 28.722858581784067,-96.584439828543964 28.722940967911413,-96.591359183115401 28.724761852179114,-96.593796021437342 28.725403125944972,-96.611342043876562 28.720366765465901,-96.616906294097589 28.718769618875786,-96.625254999999996 28.716373230030175,-96.632357663078409 28.714334501780041,-96.638120426114043 28.71268037463507,-96.643733366943522 28.711069252030907,-96.64589364157122 28.710449172933409,-96.648758110223909 28.709626963981723,-96.65548660082564 28.704200766225345,-96.664534272187169 28.696904262901135,-96.657918463285995 28.687743919701024,-96.642136214348383 28.67476740345478,-96.635017595423747 28.668914316579048,-96.634564255386636 28.662567599984854,-96.634358790297441 28.659691108644115,-96.634304719917793 28.658934128568227,-96.633999771842213 28.654664885057134,-96.627892869800831 28.650084693733149,-96.626425176648581 28.649921620227584,-96.623312698200763 28.64957579673532,-96.621378075676532 28.648286046719594,-96.615940371111847 28.64466090565978,-96.615679075580019 28.64448670841351,-96.614055987266909 28.642701311583636,-96.613585709918453 28.642184006591457,-96.613038272810982 28.641581825879328,-96.612716570908134 28.641227953848528,-96.611999586497333 28.640439271135588,-96.610589997120172 28.638888723093881,-96.610589997120172 28.638695619081329,-96.610589997120172 28.63634418879494,-96.61975034032028 28.62769274259265,-96.620390401117646 28.626519297452973,-96.620672695530928 28.626001757543317,-96.621575870071126 28.624345937066781,-96.622336527533278 28.62295139797671,-96.622803791340985 28.622094747411062,-96.621924089240224 28.619379144726071,-96.621515564809087 28.618118047314677,-96.621338841511317 28.617572510068054,-96.620571817957583 28.61520474122884,-96.620437729127232 28.614790814755992,-96.617253050911174 28.604959849584038,-96.615239196090883 28.598743166058551,-96.614649885719274 28.596923990196654,-96.613008078443599 28.591855801497097,-96.611528402529856 28.587288105363601,-96.611113505533794 28.586007336117376,-96.611098903979951 28.585962261746474,-96.608298572876635 28.583628658523324,-96.608045443097311 28.583417717585569,-96.607377235577218 28.583437664220053,-96.600365219155734 28.58364697962633,-96.593251058093557 28.583859344147964,-96.573948594733835 28.584435541167107,-96.565297148531556 28.582399903865994,-96.564279334811971 28.57629300182461,-96.563658896232639 28.575155527088082,-96.562968608029692 28.573889994257026,-96.561225893653244 28.570695006643017,-96.557566061723506 28.569051817003789,-96.543745727976315 28.562846769979732,-96.536289388489891 28.559499026141786,-96.535271536438941 28.559346348925885,-96.526111211846271 28.557972305562419,-96.524846286909124 28.55686549700842,-96.523547686998668 28.555729222873186,-96.522039937244045 28.554409942750958,-96.516783301381025 28.541093122164042,-96.514406314623301 28.535071417976255,-96.512075206364955 28.532603188828926,-96.505754868421008 28.525911074776143,-96.496773944100411 28.520225902118948,-96.493684489370622 28.518270192113103,-96.482894459981281 28.511439806078794,-96.464303363514816 28.49967112954555,-96.450283853050735 28.49079639296917,-96.41974938229167 28.46738661824714,-96.410828816467941 28.459457253614527,-96.410588999643707 28.459244083835621,-96.409758652296418 28.458206146634446,-96.408886828651134 28.457116363910039,-96.40506625078595 28.452340627696451,-96.402446489887097 28.449065917053971,-96.402758256176753 28.447714917044181,-96.403973200604497 28.442450108152798,-96.407195206365273 28.441281062045864,-96.417343901660857 28.437598792799108,-96.461479843413926 28.421584870195201,-96.476120924474287 28.411702150055138,-96.481836236149007 28.407844318412668,-96.504737094149291 28.397666161492985,-96.511137484289378 28.396220910815867,-96.520513236388609 28.394103803612502,-96.534249520963641 28.388796609353736,-96.542905217114992 28.385452367272176,-96.559699173073881 28.377818734789468,-96.57038624671533 28.368658381727396,-96.577905378446388 28.364719789411506,-96.5917603939982 28.357462401226169,-96.600411840200493 28.354408960067438,-96.650793747525029 28.34677533744669,-96.672676831253582 28.335579347083499,-96.688452973492915 28.347284234444516,-96.694559875534281 28.347284234444516,-96.698122233414779 28.342704062844462,-96.705246949175717 28.348810964885843,-96.700157860853906 28.369676195446971,-96.705755865897487 28.400210705653887,-96.710336037497541 28.406826524417021,-96.710425531143088 28.406841439843959,-96.711757514930511 28.407063434453107,-96.711949596522956 28.407095447664108,-96.71209813364915 28.407120203551969,-96.7125191933293 28.40719037931537,-96.712878460543081 28.407250256459115,-96.722549831718325 28.408862132132249,-96.749013067323034 28.408862132132249,-96.762244685125353 28.411915593014903,-96.76554491144303 28.411090543097366,-96.768351577304784 28.410388882297497,-96.775985199925543 28.405808690973519,-96.777118787058129 28.404067826336821,-96.778115367638478 28.402537364460464,-96.780337941159374 28.399124129135416,-96.780820705165937 28.398382742114745,-96.790234641309425 28.383925636830853,-96.794392274787313 28.366371177405831,-96.794814812909479 28.364587126849088,-96.794810066932399 28.364444747076842,-96.79477772408616 28.363474458555832,-96.794305906049686 28.349319871745632,-96.794064195689629 28.347593374049037,-96.792754716842737 28.338239980125699,-96.790743538307225 28.323874459722486,-96.791161640090152 28.319066463411133,-96.791737095961722 28.312448960638157,-96.791761391474679 28.312169572361466,-96.791798306096766 28.312130020933203,-96.806010803272656 28.29690232711997,-96.809573161153153 28.290286508356836,-96.806010803272656 28.282143978876302,-96.799480493673911 28.2729662335258,-96.799349781293685 28.272782529381054,-96.787181219874626 28.255680743271615,-96.787181219874626 28.250082757951983,-96.800412817953031 28.224128419345121,-96.810027933605966 28.21709297064087,-96.81015126416365 28.217002728792142,-96.823379937963566 28.207323213817581,-96.836184503007971 28.197954022244446,-96.84100213695676 28.194428925121734,-96.842143298799229 28.193593928862132,-96.847274602334139 28.190686192954498,-96.857267971405633 28.185023289193378,-96.872677809006134 28.176291056181483,-96.877474270970822 28.171878306563691,-96.886067200578026 28.1639728030657,-96.898123211167331 28.152881261735526,-96.906497631141988 28.149042991548708,-96.910337015250093 28.147283276415891,-96.926704620510804 28.131597659113019,-96.934764623415617 28.123873491831901,-96.962356663895278 28.123371819605953,-96.962754569737697 28.123364584972112,-96.979717515560068 28.129783000626698,-96.995398793779131 28.135716460690723,-97.000413785843605 28.137614026355994,-97.007520616950742 28.136091128354632,-97.007538501604586 28.136087295914667,-97.009222611239821 28.135094102666635,-97.00939982996681 28.134989589017771,-97.027385928308092 28.12438239869169,-97.028912648887456 28.117257682930727,-97.025203084589847 28.111384210119862,-97.023365428929196 28.108474590635566,-97.022805746846075 28.107588427939849,-97.02290356380766 28.107197159145706,-97.023379876854563 28.105291902342927,-97.02382356056566 28.10351716319958,-97.025496807419856 28.101530180660298,-97.031966099908146 28.09384788848477,-97.033883146887263 28.088918342142531,-97.035528457788629 28.084687545284659,-97.035528457788629 28.083043098067591,-97.035528457788629 28.081818766572983,-97.035528457788629 28.074000471643224,-97.033022532693735 28.061470870449408,-97.032801767679686 28.060367047518316,-97.031459273912688 28.053654591691117,-97.031457183186404 28.053644138079921,-97.025859197866765 28.041939250718904,-97.030948266464648 28.033287814378582,-97.03239348781301 28.032603236465789,-97.040617526386512 28.028707642778524,-97.041168915404441 28.028259640036232,-97.046718327422383 28.023750751173218,-97.048760075590963 28.022091833877354,-97.050263648357429 28.019142519014494,-97.059727497080047 28.000578821719444,-97.061991693393324 27.99613751499442,-97.06790259446116 27.99219690579767,-97.073772658186698 27.988283521554418,-97.075732208193486 27.986977152070377,-97.083740513918784 27.975854507337193,-97.090858162154831 27.965968886660271,-97.094600599978094 27.960771057335059,-97.101378519421061 27.951357282114685,-97.101544336287489 27.951126980954953,-97.101629253046639 27.951009041034034,-97.112670327945679 27.935674217691009,-97.118292397880069 27.927865788706086,-97.121533983365822 27.923363587495643,-97.122089895488358 27.923104160785101,-97.123659587861624 27.92237163470331,-97.129167576400675 27.91980122961516,-97.134800331352182 27.902469771509406,-97.13578341488774 27.899444915775788,-97.139044920333077 27.897526377912126,-97.141761509630356 27.895928379836029,-97.144434841366106 27.894355827453982,-97.155121915007527 27.880615312653809,-97.156735458496229 27.877916799393841,-97.171211094589736 27.85370753808861,-97.17159000749372 27.853073838716419,-97.18273536107327 27.834434189625789,-97.184638591770963 27.831251199324921,-97.187183135931861 27.824126483563962,-97.18941247112663 27.823657146727278,-97.196852395853725 27.822090836400886,-97.201135366472329 27.822090836400886,-97.208766105658313 27.822090836400886,-97.209575096934316 27.822090836400886,-97.21103842611052 27.822356897891609,-97.21191517248603 27.822516307306422,-97.214117494684729 27.822916731993345,-97.215541825234411 27.823175702780983,-97.217387510601711 27.823511284007832,-97.220771087297493 27.824126483563962,-97.222189700736266 27.82464074101355,-97.223091414240102 27.824967618564596,-97.225175600069406 27.825723150734085,-97.225442194074731 27.826156365185522,-97.225555528799433 27.826340533769983,-97.225696025109201 27.826568839847944,-97.22598639723725 27.82704069367685,-97.227317456819009 27.829203661466853,-97.227317456819009 27.832884543697009,-97.227317456819009 27.832951908184537,-97.22711696094737 27.834288541284948,-97.22651425924083 27.838306534493725,-97.227537582741903 27.841230302974814,-97.228388390382094 27.843661171179477,-97.233100025453197 27.847817700825228,-97.234045759551762 27.848652012430087,-97.234511621821596 27.849062988727319,-97.238500481248579 27.854279199579018,-97.239439164419366 27.855506710708827,-97.241127420860792 27.857714434929608,-97.24139627838295 27.858969111470945,-97.242350826195675 27.863423696705052,-97.242654131578206 27.86483913096664,-97.243132066142749 27.865496290124597,-97.244364366034702 27.867190700237273,-97.250796680782656 27.876035121329831,-97.263010484865433 27.88010639593206,-97.267085449659064 27.88068852838779,-97.272090543185925 27.881403535150675,-97.273697558506882 27.881633106649463,-97.276628649874411 27.881144591421538,-97.283916343274228 27.879929975854907,-97.291452123510041 27.878674012482271,-97.291709327200167 27.878631145200583,-97.295071705789752 27.87807074876898,-97.29826066531912 27.876989746639367,-97.302276298241679 27.875628516526195,-97.30641171632756 27.874226681314273,-97.315889353880934 27.871013926092836,-97.325097299274915 27.867892591849294,-97.326845878314657 27.866807265961079,-97.334190606350404 27.862248465187459,-97.346213303335873 27.854786094892546,-97.354613966176373 27.849571885725148,-97.359768343966266 27.850509060182219,-97.360211961357962 27.850589719168646,-97.360654441244435 27.850290746360063,-97.363614400263117 27.848290774636723,-97.376904444631478 27.839311017562139,-97.379041564479934 27.837867018088055,-97.379057154646048 27.837837708581311,-97.379081675001302 27.837791610322164,-97.37968928125764 27.836649310776913,-97.391764280353456 27.813948316782309,-97.391812130016405 27.812975373996721,-97.391812459346511 27.812968677620422,-97.39203202611381 27.808504155006624,-97.392068018906713 27.807772301822137,-97.392095751995882 27.807208395884746,-97.393123788240075 27.786304999999999,-97.393168763213623 27.785390509210199,-97.393291005863816 27.782904909577571,-97.393142269808052 27.782564941361908,-97.39298939956177 27.782215523565412,-97.390949955785928 27.777553936582201,-97.390465068726371 27.776445623015572,-97.390185233729682 27.775805999999999,-97.389524844304646 27.774296538065283,-97.38835420640342 27.771620793596586,-97.388306220610531 27.771511111755789,-97.388011229692253 27.770836846624743,-97.38704242749894 27.768622441036733,-97.386166290102864 27.766619840754537,-97.385225495384532 27.765302728148875,-97.378862356737287 27.756394334042721,-97.375764970087644 27.752057992733249,-97.373069654276961 27.748284550598278,-97.368354500700462 27.741683335591173,-97.365855345900911 27.739779218033028,-97.354970329043653 27.731485873530172,-97.352272255056832 27.729430198526604,-97.34997871774064 27.727682741876539,-97.347507961666906 27.725800261438444,-97.346980343555629 27.725398266768138,-97.343485766084669 27.723942192633796,-97.323096068004702 27.715446484002907,-97.316445853072636 27.712675560756566,-97.312489136070184 27.711663774861414,-97.307771479065892 27.710457406346261,-97.30518751069485 27.709796650788128,-97.285725857752936 27.704820043684109,-97.259850586867117 27.698203387982087,-97.253955150197811 27.696695845323848,-97.254014647303208 27.696526337654994,-97.255455364792269 27.692421723465429,-97.259957004258851 27.67959652118169,-97.261636792970123 27.679316557300702,-97.26241778482418 27.679186392412099,-97.266063906300232 27.678578707462119,-97.266172011465457 27.678349884642419,-97.272736281666539 27.664455499360063,-97.273042341106247 27.663807672923248,-97.273584380560237 27.662660354976065,-97.276535709391737 27.656413369610792,-97.277059923980644 27.655303780997631,-97.278846463786479 27.651522268106756,-97.280071982275985 27.648928251476995,-97.280889132874719 27.647198614380269,-97.282300269490932 27.644211705671331,-97.282869528026779 27.64300677394548,-97.287959956150573 27.632232024058997,-97.288756326795195 27.630546371240786,-97.290370933329072 27.627128784125372,-97.290610159422798 27.626622421740255,-97.291264204229464 27.625238025568656,-97.291996439564016 27.623688125953898,-97.292910903535031 27.621752508687905,-97.293983233844585 27.619482740684056,-97.29528946695001 27.616717877953022,-97.296598377059297 27.613947348891728,-97.297587499071795 27.609496333379006,-97.298634024222366 27.60478700569162,-97.29761621050281 27.598680093788271,-97.294053852622326 27.594099922188217,-97.294182769084571 27.593971005725969,-97.300049926927869 27.588103847882682,-97.302196382102863 27.585957392707677,-97.311120578488044 27.579146819865922,-97.321534901946578 27.571199044464009,-97.325080504595888 27.561034984604785,-97.336802147188081 27.527432946040641,-97.343417965951204 27.517763686118776,-97.347489240553443 27.503005347737066,-97.350542661988243 27.478577729709574,-97.359194108190536 27.458221396146271,-97.365809926953673 27.450587783387487,-97.371916828995055 27.425142361502377,-97.369881181831957 27.412419660421783,-97.372934622990698 27.401223670058592,-97.379550422029908 27.390027689557368,-97.399397858595393 27.344734850830708,-97.401942402756291 27.335574497768633,-97.404995863638931 27.329976512448997,-97.413138393119482 27.321325066246711,-97.42026310888042 27.317253791644482,-97.430441285524054 27.313691423902039,-97.450797599363412 27.313691423902039,-97.482858840011673 27.297915271800758,-97.508304242172855 27.275014394076553,-97.532222933616623 27.278576761818989,-97.544436737699399 27.284174747138625,-97.546981281860297 27.290790556039799,-97.536803105216677 27.289263825598471,-97.526624948296998 27.291808369759369,-97.524589320857856 27.297915271800758,-97.51746460509689 27.305039987561717,-97.504741884292372 27.305039987561717,-97.498126085253162 27.308602345442196,-97.502706237129289 27.322342870104325,-97.499143898972747 27.327940855423961,-97.483876634007316 27.33862793892736,-97.483876634007316 27.351350640007954,-97.486930094889971 27.358984272490666,-97.501688443133645 27.366617904973374,-97.514411144214236 27.361528796927644,-97.520518046255617 27.352877370449281,-97.538329835658018 27.335574478044709,-97.570899973304094 27.315727061203152,-97.584131581244463 27.309620159161771,-97.609068086407831 27.285192570720163,-97.621790807212349 27.287228188297352,-97.63146005727225 27.286210384439741,-97.63654914066305 27.282139109837512,-97.636657939024673 27.281797172172649,-97.640111498543547 27.270943129336285,-97.639093679892994 27.253131339933887,-97.635022415152719 27.247024437892502,-97.628915513111338 27.242953173152234,-97.597363199046811 27.242444266292445,-97.5826048606651 27.240408628991332,-97.573953414462821 27.238881903480983,-97.56123071338223 27.232775006370584,-97.542910007258072 27.229212648490105,-97.520009129533875 27.231248285791217,-97.509830972614182 27.235319550531486,-97.503215153851045 27.23989972213154,-97.500161712692318 27.244479898662579,-97.485148876501881 27.25084127385778,-97.467082638600573 27.253640266517596,-97.45843119239828 27.259492710198106,-97.450288657986775 27.262546171080761,-97.424079880742951 27.264072891660124,-97.422298701802717 27.257711541119829,-97.434766954384401 27.202240525749552,-97.444945121166043 27.144733882940127,-97.443672849085587 27.116235010034327,-97.452324285425917 27.115217201245734,-97.455886653168363 27.110382571284802,-97.456650008527049 27.09969549764336,-97.46173908698691 27.095624227972113,-97.475479621510999 27.098423220631929,-97.480568699970846 27.102494490303176,-97.491510231973166 27.101222218222723,-97.495835955074313 27.09409750739275,-97.4932914109134 27.078066891999608,-97.477515248950155 27.066107546277717,-97.479041969529504 27.06279964182713,-97.482256963728076 27.061942305056665,-97.48693005051112 27.057710553505324,-97.487693415731783 27.053639288765055,-97.486675602012198 27.034809685643079,-97.477515248950141 27.032519589981089,-97.473952881207694 27.029211690461484,-97.473443984209865 27.022850330059228,-97.478300083716704 27.000269498406993,-97.478533072531675 26.999186101907302,-97.480568690108868 26.997659376396957,-97.483967678435022 27.000330000000002,-97.484131057851314 27.000458369056773,-97.492988547644813 27.000330000000002,-97.49889841702128 27.000244349959733,-97.533497176854453 26.999742920066073,-97.536803065768822 26.999695008767091,-97.549271318350492 26.995878197456715,-97.555378215460905 26.990280207206101,-97.551052502221722 26.980865400714134,-97.549525776711377 26.965343697111763,-97.552324769371197 26.95211208177491,-97.555378205598956 26.947277449348487,-97.555378205598956 26.938880461507075,-97.540874325578116 26.906310323861007,-97.540110950495503 26.900966796902246,-97.547999041339082 26.895114353221743,-97.552324764440229 26.888498544320569,-97.552324764440229 26.875332999999998,-97.552324764440229 26.873831771434514,-97.552324764440229 26.871753101924,-97.552324764440229 26.867633303897481,-97.555396527456509 26.865969429990074,-97.558431656619632 26.864325399446898,-97.558453748966258 26.864224239771101,-97.559853702000524 26.857813929560987,-97.562641307980527 26.845049630589628,-97.563266286580571 26.842187886943357,-97.552579212939136 26.827938454188693,-97.547744582978211 26.824630549738107,-97.537566416196555 26.824885004400745,-97.509830908511418 26.8035108521869,-97.48438549155729 26.763561555211936,-97.478024141017002 26.757200199740662,-97.471662790476714 26.758726925251008,-97.468609339456009 26.740915130917632,-97.467337057513589 26.710126182073765,-97.444945096511148 26.633535472850511,-97.445708451869848 26.609362327976836,-97.441206258760758 26.5999011976768,-97.435205432977895 26.587290766879221,-97.432741093635642 26.582112082834445,-97.429217375703914 26.574707168454967,-97.428151110966368 26.572466467229631,-97.418145193925739 26.555638334425574,-97.416955130465126 26.553636864107652,-97.41864075483771 26.543121778291471,-97.42039414733226 26.532183948458435,-97.422284917775215 26.520389141863415,-97.422298667285844 26.520303371102887,-97.425861015304378 26.516741008291426,-97.430695645265303 26.506562841509776,-97.430695645265303 26.494603495787885,-97.42802638225659 26.488322868889494,-97.42636993202612 26.484425333937217,-97.429168909893022 26.478063961207511,-97.43553026043331 26.470175880225888,-97.441382709044788 26.466613522345408,-97.441382709044788 26.455417541844177,-97.43756589773443 26.449819546662585,-97.425861005442428 26.446002740283195,-97.421026375481503 26.446766095641895,-97.417209564171131 26.449819546662585,-97.411611568989528 26.447275002501684,-97.412883841069984 26.433025580841726,-97.421789740702152 26.417249413947498,-97.419499649971158 26.413178149207234,-97.406013578738921 26.409106884466965,-97.398125502688274 26.410888063407203,-97.394308686446919 26.414450416356704,-97.395072051667569 26.417249413947498,-97.382484933201752 26.411326066613285,-97.377769169124974 26.409106884466965,-97.369626639644437 26.394602999515151,-97.374461259743413 26.38086247238753,-97.388965149626202 26.365849678110436,-97.392018610508856 26.339386444971247,-97.391000786927322 26.332261729210284,-97.38794734576858 26.330480545339064,-97.376242448545611 26.336332993950553,-97.372171183805335 26.339895346900054,-97.36937219114553 26.348546788171358,-97.358176200782339 26.356434874083959,-97.343417852538664 26.35923386920927,-97.342332537534404 26.358759043566288,-97.335275323058127 26.355671510096041,-97.335020017473738 26.355402767481841,-97.331108052904881 26.351284911668415,-97.330440693097202 26.350582427937965,-97.333762617526986 26.340749518544904,-97.336802038706509 26.331752819885011,-97.343786761143846 26.325987658774913,-97.344677525679145 26.325252425399061,-97.352414066956698 26.31886671611711,-97.352832659030639 26.318521211944631,-97.354359379610003 26.313941040344577,-97.348998828460125 26.312092573442666,-97.347821984790102 26.311686765063648,-97.346980205488165 26.311396496183672,-97.34736083223585 26.297503848546928,-97.347437236753805 26.2947151295396,-97.347489122209922 26.292821341560611,-97.347051378510429 26.289694600417153,-97.344137846000223 26.268883651035111,-97.343926764329439 26.267375924606483,-97.342629246748771 26.266550231912309,-97.341127771669619 26.265594748131736,-97.335282658907644 26.265594748131736,-97.331967408745584 26.265594748131736,-97.330307576264516 26.266747410222209,-97.323817586106017 26.271254350355399,-97.322807065545476 26.271956101137519,-97.313207351206557 26.273518846137112,-97.312102101648151 26.273698770576502,-97.311865543405119 26.273737280077761,-97.307030913444194 26.253126493084562,-97.308048727163751 26.249055213551365,-97.321280340035131 26.236078054109896,-97.321280340035131 26.228698889850026,-97.304486359421333 26.202490107675235,-97.296598288301666 26.200708923804015,-97.294817109361432 26.192311940893585,-97.296089381441874 26.182388227541828,-97.303096384204423 26.167373221160254,-97.305986772892751 26.161179530923267,-97.306776455083323 26.159487354748606,-97.300965235160419 26.149753561518516,-97.296881711355638 26.142913659244432,-97.296598288301666 26.14243892563589,-97.285549237329036 26.12861437636975,-97.28536038956149 26.128378090441405,-97.284582435540926 26.126454238998875,-97.282094393487881 26.120301403270393,-97.282839179410786 26.118439442973433,-97.28311220967295 26.117756868971455,-97.285501587752023 26.116923364107649,-97.294053737977038 26.113940052730097,-97.295071554162092 26.108342057548505,-97.292023254217796 26.105090538920617,-97.291924538345086 26.104985242032239,-97.291541272704407 26.104576425513905,-97.287190793518263 26.099935916255493,-97.286650074642992 26.099359149688052,-97.286603231473521 26.09930918366079,-97.283195451762182 26.095674220102872,-97.282639002190891 26.095080674133143,-97.282108002623801 26.094514274823585,-97.280435495761154 26.092730268223651,-97.279905974795895 26.09216544608875,-97.27980430522237 26.092056998587434,-97.27089841052117 26.086459003405839,-97.267086875013263 26.085485845069449,-97.24859983335169 26.080765747704277,-97.246979719077387 26.080352101364454,-97.229515030031649 26.08000965739204,-97.220290685310772 26.079828788368793,-97.208048240752987 26.079588741074772,-97.205005053278043 26.078666562185607,-97.199651252911579 26.077044196913871,-97.199152512570265 26.073220535461079,-97.199134106850465 26.073079425477676,-97.198725011196004 26.069943037351702,-97.198302051934135 26.066700361972018,-97.196018989165054 26.049196947106083,-97.195939794821285 26.0485897927724,-97.195071061587612 26.04192952989985,-97.204994779870347 26.030224637607851,-97.214918488291119 26.030733549398622,-97.224842206573854 26.027425644948035,-97.226114478654296 26.024372193927345,-97.219244211392265 25.99612778184791,-97.216954125592238 25.993837693582392,-97.208557137750816 25.991802058746771,-97.195834416946283 25.993074335758202,-97.174460269663413 26.000071824804216,-97.167208324722026 26.007069313850227,-97.162755377371425 26.014575709756024,-97.16262814819099 26.023481604457221,-97.172042954682937 26.044728528107019,-97.178658763584124 26.045491893327686,-97.182730028324386 26.053125515948434,-97.164981847348457 26.063876207878327,-97.152009000000007 26.062107999999998,-97.152012551274964 26.062039393270581,-97.15321 26.038906,-97.151921999999999 26.017652999999999,-97.14747181118706 25.985075937251509,-97.145567 25.971132,-97.146880999999993 25.969781,-97.146293999999997 25.955606,-97.147784999999985 25.953132,-97.156608000000006 25.949021999999999,-97.160293999999993 25.950243,-97.168198638692317 25.959262149012673,-97.178362000000007 25.962114,-97.187583000000004 25.958174,-97.206945000000005 25.960899,-97.214339285966162 25.960186817526893,-97.227626420907342 25.958907063854085,-97.229225999999997 25.958753000000002,-97.239867000000004 25.954974,-97.244841570811701 25.950784663302475,-97.248032999999992 25.948097,-97.255343503388133 25.949129556975723,-97.276707000000002 25.952147,-97.28138899999999 25.948036999999996,-97.277163000000002 25.935438,-97.284201820237172 25.935775045516863,-97.290083634347766 25.936056689174489,-97.293963761326751 25.936242484429805,-97.303601999999998 25.936703999999999,-97.316138101068788 25.931602038234757,-97.320560999999984 25.929801999999999,-97.324914000000007 25.924040999999999,-97.332235861490744 25.923541683060932,-97.33463605770983 25.923378000829199,-97.338346 25.923124999999999,-97.339310160867683 25.923294280152341,-97.350397999999998 25.925241,-97.367642000000004 25.915679999999998,-97.369283543255307 25.913688286645449,-97.373641276386991 25.908400972256459,-97.374430000000004 25.907443999999998,-97.372365000000002 25.905015999999996,-97.365976000000003 25.902446999999999,-97.365883578347024 25.900015396466173,-97.365521 25.890476,-97.364300486696564 25.885628504434479,-97.362421560218849 25.878165998501085,-97.360082000000006 25.868874000000002,-97.364783621478566 25.852096838905283,-97.36542 25.849826,-97.372864000000007 25.840116999999996,-97.394513000000003 25.837377,-97.422635999999997 25.840377999999998,-97.42853949246836 25.842912007889609,-97.434188204901034 25.845336654308195,-97.441181027463472 25.848338244915578,-97.445113000000006 25.850026,-97.445601387363794 25.851485440010176,-97.447179184935308 25.856200346812667,-97.448271000000005 25.859463000000002,-97.449172000000004 25.871677999999996,-97.452166849899044 25.875807172885114,-97.453724626189043 25.87795496921364,-97.454727000000005 25.879337,-97.45488774919265 25.879394304385261,-97.462586893331732 25.882138919861518,-97.468261999999982 25.884162,-97.468599721544905 25.884059457735212,-97.481532785459223 25.880132596436578,-97.486059999999995 25.878758,-97.490359999998347 25.879275544671589,-97.494739403174762 25.879802646248233,-97.496860999999996 25.880057999999998,-97.519591990380178 25.88590026892226,-97.521761999999995 25.886458,-97.52344767329889 25.891064017588189,-97.524375103029939 25.893598172727145,-97.528116959024402 25.903822606212749,-97.528119935206945 25.903830738482007,-97.52812430798204 25.903842686870224,-97.528627999999998 25.905218999999999,-97.528849446448064 25.906732522417784,-97.530321999999998 25.916796999999999,-97.530415259581318 25.916820899843632,-97.539878370214808 25.919246032588486,-97.542957 25.920034999999999,-97.545169999999999 25.923974999999999,-97.545468770003851 25.926387609575503,-97.545470694802859 25.92640315259677,-97.546397824784293 25.933889856891241,-97.546420999999995 25.934076999999998,-97.546611329705271 25.934141994258589,-97.555160182125618 25.937061277530951,-97.555378999999988 25.937135999999999,-97.555477252221124 25.937015705749829,-97.559364000000002 25.932257,-97.582565000000002 25.937856999999997,-97.580418999999992 25.945115999999995,-97.583044 25.955442999999999,-97.598043000000004 25.957556,-97.5981230356591 25.957681442330628,-97.607733999999994 25.972745,-97.60783562843973 25.973457509771446,-97.607844088251909 25.973516820913719,-97.608283 25.976593999999999,-97.609461531117333 25.977846566488182,-97.613191727531174 25.981811093986448,-97.613466053312663 25.982102652924251,-97.616041456343709 25.984839842874308,-97.624938181905222 25.994295461083137,-97.627225999999993 25.996727,-97.634804000000003 25.999508999999996,-97.635072411453706 25.99971613545971,-97.639164724998494 26.00287420951236,-97.642117661027001 26.005153015998879,-97.644011365977178 26.006614404624422,-97.643848619841975 26.01214811069886,-97.643707610985203 26.016942704231127,-97.649175518723894 26.021499311673544,-97.65096419129361 26.02118629315062,-97.659123404318109 26.019758427116106,-97.661326460130226 26.019372891335045,-97.66298585459532 26.019511685247039,-97.668297999999993 26.019955999999997,-97.669519566971061 26.021667429940447,-97.671350987084779 26.024233271429612,-97.671567999996611 26.024226704244594,-97.691453959129774 26.023624920821636,-97.697068999999999 26.023454999999998,-97.703247203861338 26.030308742132775,-97.706066818770353 26.031284762516545,-97.709294717923569 26.032402112038366,-97.711145328137576 26.033042707775564,-97.719920000000002 26.030837999999999,-97.723585926686539 26.030959832537771,-97.729354247932832 26.031151535557555,-97.735180242251758 26.031345155270547,-97.758837769919694 26.032131383932391,-97.76309059882324 26.033650253079866,-97.763351431657455 26.034258862745556,-97.76491324062286 26.037903081983409,-97.769788888528993 26.041344719068825,-97.770077387482857 26.041548365582649,-97.776788595669075 26.042443189872706,-97.779190602367677 26.042763456191249,-97.784050976575529 26.040637041739476,-97.789822674626535 26.0424596835391,-97.792252861730461 26.04428232533872,-97.793102878401371 26.047342389307317,-97.793537334820812 26.048906434437896,-97.794638769549053 26.052871604582215,-97.795290594138677 26.055218176136449,-97.801344 26.060016999999998,-97.803973303988229 26.059548218630308,-97.8082126910423 26.058792373859696,-97.819424117916668 26.056793476786609,-97.820997703829306 26.056512920501468,-97.825546000000003 26.055702,-97.826721102251625 26.055271667399982,-97.830409376527257 26.053920989485444,-97.836607999999984 26.051650999999996,-97.848759348822554 26.052295281844582,-97.85186756815483 26.052460084066457,-97.859824237628374 26.052881958029587,-97.860225497621784 26.05290323340671,-97.860503999999992 26.052917999999998,-97.861874999990562 26.053580848914272,-97.869705222636284 26.057366592615971,-97.871187000000006 26.058082999999996,-97.876982999999996 26.064482999999999,-97.886529999999993 26.066338999999999,-97.901546631929207 26.060958662441269,-97.905109129229899 26.05968224852101,-97.913882 26.056539,-97.935419999999993 26.052687999999996,-97.944344999999984 26.059620999999996,-97.950095000000005 26.061827999999998,-97.96210735288345 26.054793018383155,-97.96735799999999 26.051718,-97.971403108419892 26.054550391225565,-97.978769 26.059707999999997,-97.979877702655912 26.062937323324391,-97.981335 26.067181999999995,-98.010970999999998 26.063862999999998,-98.015122209308288 26.064471399070538,-98.026123959861238 26.06608380989196,-98.028288992822496 26.066401115993269,-98.028758999999994 26.066469999999999,-98.029241090705753 26.065867136858621,-98.033102 26.061039,-98.034402999999998 26.051375,-98.034479464439173 26.051215303797409,-98.034525269179767 26.051119640464091,-98.039238999999981 26.041274999999995,-98.054365285842039 26.044575736209502,-98.070020999999997 26.047992,-98.070022345126233 26.049160242153427,-98.070025 26.051466,-98.071425788568789 26.055027814897404,-98.076094939927231 26.066900165398668,-98.076139697069991 26.067013970337847,-98.076205751241318 26.067181927684643,-98.076543999999998 26.068041999999998,-98.076994427275579 26.068371469710563,-98.080289992888041 26.070782045417982,-98.080494999999999 26.070931999999999,-98.080906883185932 26.070920010911959,-98.084755 26.070808,-98.085506402845155 26.069709056167966,-98.085848999999982 26.069208,-98.085628527723046 26.069048386721494,-98.081567000000007 26.066108,-98.081855064865067 26.063941606819231,-98.081884000000002 26.063724,-98.082307152201508 26.063513440869801,-98.091037999999998 26.059169,-98.093593108176947 26.058759459973995,-98.094431999999998 26.058624999999996,-98.095078111969258 26.058956205325877,-98.096949561841043 26.059915534659098,-98.097643000000005 26.060270999999997,-98.105504999999994 26.067537000000002,-98.122952624574893 26.063250384797335,-98.12786358062813 26.062043837809401,-98.128331000000003 26.061928999999999,-98.142925292417388 26.051941751725515,-98.14645163947533 26.049528582072455,-98.146621999999994 26.049412,-98.146852932570667 26.049588146033326,-98.149462999999997 26.051579,-98.149462999999997 26.055813,-98.151730999999998 26.058187,-98.158277994458601 26.062311711597108,-98.16142849281799 26.064296576133319,-98.161911645017582 26.064600969774318,-98.167608590156348 26.068190136655492,-98.172071527808072 26.071001859012309,-98.177897000000002 26.074672,-98.179863281323136 26.072661506851002,-98.189059999999998 26.063257999999998,-98.191534000000004 26.057117999999999,-98.197046 26.056152999999998,-98.200871000000006 26.059161,-98.203328791159265 26.063523594334541,-98.204415309491765 26.065452171017675,-98.20496 26.066419,-98.205720285634712 26.066905180236589,-98.2057544964389 26.066927057036718,-98.220672999999991 26.076467,-98.228363119990576 26.077028417928002,-98.230097 26.077155,-98.231072909449267 26.07694353295701,-98.240214327563166 26.074962705064888,-98.248806000000002 26.073101,-98.250234708208026 26.074229377516481,-98.260964088277859 26.082703320039151,-98.264514000000005 26.085506999999996,-98.272091468517374 26.0934369782697,-98.272527821536428 26.09389363077193,-98.277218000000005 26.098801999999999,-98.277020629370639 26.099144109090908,-98.272932087266241 26.106230915405163,-98.272897999999998 26.10629,-98.272099931737145 26.106512924095771,-98.270258188934392 26.107027377392626,-98.270033999999995 26.107089999999999,-98.269661374787887 26.108231250649609,-98.268046405073434 26.113177467856264,-98.266755660647689 26.117130670341034,-98.265753950746401 26.120198637935399,-98.265698 26.12037,-98.266046753689267 26.120369439652073,-98.268388964369507 26.120365676386069,-98.271048543344023 26.120361403199535,-98.2713587738927 26.120360904747326,-98.279433560913844 26.12034793086255,-98.289509742149562 26.120331741306838,-98.296194999999997 26.120321,-98.299522999999979 26.11749,-98.299575546893735 26.117376878214852,-98.299577897643644 26.117371817572689,-98.299619756950364 26.117281703787395,-98.301477861619162 26.113281617347607,-98.302978999999993 26.110049999999998,-98.307788398559808 26.112633359128559,-98.31093219000293 26.114322040617914,-98.314784784069062 26.116391454064445,-98.31781148535309 26.118017240801439,-98.323055746360907 26.120834185452331,-98.323827999999992 26.121248999999995,-98.324165904650499 26.121735183484471,-98.335204000000004 26.137616999999999,-98.337914801547555 26.149187638321976,-98.338210450252006 26.150449569219312,-98.338419999999999 26.151344000000002,-98.338123748811455 26.151776768193923,-98.337139471603692 26.153214615149455,-98.336278203634194 26.154472768358826,-98.335109254490916 26.156180386856505,-98.334230366689056 26.157464279382136,-98.333315999999996 26.158799999999999,-98.333279392301918 26.159609030127591,-98.333194378655719 26.161487831708563,-98.333156000000002 26.162336,-98.33332593363771 26.162525092143447,-98.336569396995017 26.166134227137082,-98.336837000000003 26.166432,-98.337709251548077 26.166391430160555,-98.345513373134324 26.166028447761192,-98.345781000000002 26.166015999999999,-98.345955918391979 26.165759937155421,-98.34781294946896 26.163041431373035,-98.354645000000005 26.15304,-98.380009845764519 26.156864235849298,-98.386243919298991 26.157804141722139,-98.386694000000006 26.157872,-98.386714843024777 26.157901012682096,-98.387178289965661 26.158546112849205,-98.389418830831929 26.161664858836595,-98.394322667090904 26.168490808715738,-98.402249554153599 26.179524728065878,-98.404432999999997 26.182563999999999,-98.41082579547016 26.183537375155975,-98.418120000000002 26.184647999999999,-98.44253599999999 26.199151,-98.444302622216625 26.201317032456906,-98.444376000000005 26.201407,-98.444366742625562 26.201566115583965,-98.444174812576264 26.204865005795593,-98.443681770155465 26.213339409994948,-98.45054565332704 26.219516919037407,-98.450975699346984 26.219903961344286,-98.465077324681431 26.222335272645303,-98.467962758220992 26.221802674698019,-98.47639547470331 26.220246150374404,-98.481645999999998 26.219277000000002,-98.483269000000007 26.216439,-98.496684404575589 26.212853148677059,-98.500574513964963 26.213825676024403,-98.503492081872309 26.214798198660183,-98.504399410834864 26.216045775617395,-98.509275818143593 26.222750833698164,-98.509327236533252 26.222821533963195,-98.516621175147847 26.223550930651591,-98.520846190978133 26.222726536052498,-98.524733007990875 26.221968131567948,-98.526589565145571 26.221605875956907,-98.528323413163747 26.222421776495104,-98.535240999999999 26.225677,-98.538016739096946 26.231331135295655,-98.538505426714039 26.231595841236214,-98.543851889046309 26.23449184328507,-98.556093449912439 26.231976454911809,-98.561600478976516 26.23084487397777,-98.564343479612191 26.231667774301364,-98.575891642961039 26.235132223865481,-98.57618836327309 26.235221239973473,-98.581780384919284 26.243001439905978,-98.583095590242166 26.247416774401941,-98.585184223567666 26.254428618568909,-98.588002268837087 26.255070784392117,-98.599153999999999 26.257611999999998,-98.610401443364651 26.253223367217647,-98.613465000000005 26.252027999999999,-98.617434734670965 26.252082931217494,-98.618976176235122 26.252104260920568,-98.625299999997523 26.252191766854153,-98.626653663614832 26.252210498179227,-98.633391522135483 26.243617562727948,-98.63418 26.242612,-98.636673745354344 26.241784277127035,-98.654221000000007 26.235959999999999,-98.669397000000004 26.236319999999996,-98.675206000000003 26.239989,-98.678410535728389 26.244637915883345,-98.679041999999995 26.245553999999998,-98.678977427258005 26.246060764449961,-98.677766000000005 26.255568,-98.679196310064967 26.258571609080832,-98.681167000000002 26.262709999999998,-98.687156000000002 26.26512,-98.698855915315121 26.265619481498664,-98.707451416076225 26.272152066874316,-98.710601999999994 26.279018,-98.709170532219119 26.284185773270103,-98.710647239525585 26.288123668959596,-98.711233447604599 26.289686894290245,-98.722550749196131 26.295571625529284,-98.729196000000002 26.299026999999999,-98.73263614407044 26.29899082409209,-98.734613221934339 26.298970033513189,-98.745271658069271 26.303095890935232,-98.745297595683382 26.304159357241051,-98.745599830797417 26.316551278053844,-98.745615470637418 26.317192526042046,-98.748245116157776 26.32061106368975,-98.74905366960931 26.321662182706675,-98.754840366886953 26.324877004144408,-98.755242435754027 26.32510037501579,-98.766685638772316 26.325769085950686,-98.779858354339893 26.326538865087553,-98.779911999999996 26.326541999999996,-98.779946859358333 26.326559704051515,-98.789821999999987 26.331575,-98.796251999999996 26.349104,-98.797592059971961 26.356670995104565,-98.798210999999995 26.360166,-98.807348000000005 26.369420999999999,-98.808280016253249 26.369491024329768,-98.813413043374013 26.369876679389535,-98.81818280466733 26.370235041528161,-98.81932575812273 26.370320914010964,-98.824571000000006 26.370715,-98.828353477559162 26.367368473620303,-98.832909 26.363337999999999,-98.838554497099707 26.360957856802237,-98.842229804437778 26.359408346173527,-98.844057000000006 26.358637999999999,-98.847707 26.359594999999999,-98.853132332741467 26.364754198689674,-98.853414999999998 26.365023,-98.853852117327648 26.365076242531281,-98.854321671505204 26.365133435992636,-98.861354000000006 26.365989999999996,-98.861661690067152 26.365902494757481,-98.869113443480302 26.363783259984523,-98.874117355796216 26.362360176799562,-98.876164212939671 26.361778062685843,-98.882912762903771 26.359858814831277,-98.890964919192157 26.357568829017531,-98.895015448091129 26.359360408468842,-98.900432100164338 26.361756234493352,-98.900829697862818 26.361932094951143,-98.905559653818443 26.364024190108832,-98.91296803413384 26.372226331500926,-98.915344992389564 26.37485796579432,-98.921277034399395 26.381425588572444,-98.922831447878195 26.38166472803821,-98.923508557916591 26.381768898347495,-98.924925720775448 26.381986922427696,-98.926689551972586 26.38116380140492,-98.934437533628781 26.377548077521784,-98.937555770591459 26.376092900630621,-98.942046463189357 26.375531566775365,-98.950185820407469 26.380302920861933,-98.952073083609605 26.383491745197549,-98.952938578460817 26.384954133189183,-98.953327659277917 26.385611545667039,-98.958325183064531 26.394055638388448,-98.960041959595969 26.394835991082342,-98.96758721887106 26.398265653180793,-98.981979903868819 26.396488780147621,-98.98323657723455 26.396333635432413,-98.985344372930967 26.396073413984297,-98.99032130527651 26.395458978465552,-99.008003378826189 26.395458978465552,-99.014739404125635 26.398826987036053,-99.018845438188137 26.404005475794783,-99.021934999999999 26.407902,-99.025336792347318 26.409271761295809,-99.030462148109507 26.411335530401477,-99.031104888479149 26.411594335405351,-99.032315999999994 26.412082000000002,-99.033086386506682 26.412180127570064,-99.037216923343138 26.412706252494743,-99.039107 26.412946999999999,-99.039645291109963 26.412681959983438,-99.045466000000005 26.409815999999999,-99.053184999999999 26.402006,-99.062093000000004 26.397371,-99.082001999999989 26.396509999999996,-99.085125999999988 26.398782,-99.089412999999979 26.408099999999997,-99.092044248326658 26.410330707587079,-99.0977332288968 26.415153685331873,-99.099649490160544 26.416778244479925,-99.110855 26.426278,-99.113807999999992 26.434002,-99.110485406379198 26.436329519428725,-99.103082999999998 26.441514999999999,-99.097481906444941 26.458865277747179,-99.094712087984234 26.467445230774196,-99.091634999999997 26.476977000000002,-99.105030999999997 26.500335,-99.114051328117867 26.510193091438737,-99.123438026388797 26.520451579672599,-99.126618350727256 26.523927276756307,-99.127319211298612 26.524693229780183,-99.127781999999996 26.525199,-99.128040494672888 26.525242991472329,-99.131554903978838 26.52584108518932,-99.136510932879688 26.526684518463242,-99.143658999999985 26.527901,-99.157083944984777 26.532657279516766,-99.166741999999985 26.536078999999997,-99.170704 26.540316,-99.171403999999995 26.549848,-99.167459686682065 26.559874693319248,-99.167410000000004 26.560001,-99.168618869529794 26.566870928153797,-99.16946034016965 26.571652951934592,-99.178064000000006 26.620546999999998,-99.200522000000007 26.656442999999999,-99.209947999999997 26.693937999999999,-99.208906999999982 26.724761,-99.240022999999979 26.745850999999998,-99.242444000000006 26.788262,-99.243132825912184 26.78921716914337,-99.262208 26.815667999999999,-99.268613000000002 26.843212999999999,-99.274832961326339 26.850997131057774,-99.280470999999991 26.858053000000002,-99.295146000000003 26.86544,-99.316753000000006 26.865831,-99.328801222539823 26.879647723469141,-99.328900000000004 26.879760999999998,-99.328852280051947 26.879943529980665,-99.328653604395157 26.88070346927794,-99.326247644284351 26.88990632616278,-99.321819000000005 26.906846000000002,-99.324684000000005 26.915973,-99.337297000000007 26.922758999999999,-99.361143999999996 26.928920999999999,-99.367053999999996 26.929033999999998,-99.379148999999998 26.934489999999997,-99.388253000000006 26.944216999999998,-99.393748000000002 26.960730000000002,-99.390189000000007 26.966348,-99.377312000000003 26.973818999999999,-99.376593 26.977716999999998,-99.378434999999996 26.980034,-99.385448615007036 26.981891053234623,-99.387366999999998 26.982399,-99.403694000000002 26.997355999999996,-99.407320999999996 27.005808999999999,-99.415475999999998 27.017239999999997,-99.420446999999996 27.016567999999999,-99.429379999999981 27.010833000000002,-99.432154999999995 27.010698999999995,-99.438721 27.01463,-99.445682828533535 27.022104842939122,-99.446523999999997 27.023008,-99.446589518313687 27.0234513503828,-99.446929167151652 27.025749691622671,-99.446969999999979 27.026026000000002,-99.446787747918748 27.026353589968604,-99.444062000000002 27.031253,-99.443973 27.036457999999996,-99.447729715193731 27.048260380671568,-99.452315999999996 27.062668999999996,-99.450282 27.067705,-99.439210578806851 27.075275465844946,-99.434470000000005 27.078517000000002,-99.429209 27.090981999999997,-99.430274999999995 27.094871999999999,-99.437646 27.100442,-99.442122999999995 27.106839,-99.441108999999997 27.110041999999996,-99.433369999999982 27.119218,-99.430581000000004 27.126611999999998,-99.431354999999996 27.13758,-99.438264999999987 27.144791999999995,-99.439971 27.151071999999996,-99.437950999999998 27.154121,-99.42998399999999 27.159148999999999,-99.426616441133064 27.174998569551711,-99.42634799999999 27.176261999999998,-99.426389092127664 27.176475083747437,-99.428025433058153 27.184960350328335,-99.432794999999999 27.209693,-99.441928000000004 27.217984999999995,-99.442101400955139 27.218265584747954,-99.445237999999989 27.223341,-99.443121431464945 27.230753685991843,-99.441406999999998 27.236757999999998,-99.441548999999995 27.249919999999999,-99.452207395848959 27.263806782859465,-99.452390999999992 27.264046,-99.452635348600225 27.264144272092288,-99.454218033886534 27.264780796280988,-99.462735864984637 27.268206496624611,-99.463308999999981 27.268436999999995,-99.463731957038988 27.268231398925973,-99.480688 27.259988999999997,-99.487909999999999 27.260721,-99.492407 27.264118,-99.496069429210138 27.270723950024919,-99.496615000000006 27.271707999999997,-99.496412995851571 27.272119287725655,-99.490870463706145 27.283404082904614,-99.487572835142558 27.290118173493504,-99.487513000000007 27.29024,-99.487552182270463 27.290674424182523,-99.487937000000002 27.294941,-99.493651777311726 27.30231355132117,-99.494603999999995 27.303542,-99.494999311050705 27.30367917804087,-99.501697839297435 27.306003653868146,-99.502036000000004 27.306121,-99.50260564894451 27.305998370990778,-99.511531000000005 27.304076999999999,-99.522353224815092 27.304131436852781,-99.523657999999983 27.304137999999995,-99.527521386758664 27.305370598210363,-99.529216737576675 27.305911493159478,-99.529653999999994 27.306051,-99.533911450776046 27.310119063512179,-99.536090758332008 27.312201427353024,-99.536443000000006 27.312538,-99.537771000000006 27.316072999999996,-99.53137599999998 27.323809,-99.52136037329538 27.324774325824137,-99.521259999999998 27.324784,-99.520793197388144 27.325167862222077,-99.515101491997058 27.329848278790703,-99.509737777509301 27.334258981108004,-99.504836999999995 27.338289,-99.507830999999996 27.348637,-99.507785758525344 27.353517859091919,-99.507778999999999 27.354247,-99.505884699626023 27.358359262089539,-99.503847413823948 27.362781925614613,-99.502763417847504 27.36513512979511,-99.502013099315448 27.366763966750881,-99.499076000000002 27.373139999999999,-99.492143999999996 27.380516999999998,-99.488110785984318 27.408328989964531,-99.487887470616073 27.409868914391197,-99.487633320470721 27.411621467383494,-99.487521 27.412396,-99.487591555014376 27.412624523015491,-99.489856740583164 27.419961308946796,-99.495313182879073 27.437634363915539,-99.495699000000002 27.438884000000002,-99.495681276107845 27.439260342274874,-99.495103999999998 27.451518,-99.489866073767956 27.458841813736395,-99.48498035355378 27.465673163249864,-99.484933241276849 27.465739036942171,-99.483818999999997 27.467296999999995,-99.483170086267094 27.470026063960816,-99.480813109028745 27.479938539705284,-99.480418999999998 27.481595999999996,-99.480219000000005 27.485795999999997,-99.483519 27.491095999999999,-99.494943552274876 27.498766770813134,-99.497518999999997 27.500495999999998,-99.501722168778215 27.500229993495459,-99.502529258718056 27.500178915086504,-99.513319999999993 27.499496,-99.516119999999361 27.498282666666942,-99.519319999999979 27.496896,-99.525819999999982 27.496696,-99.528319999999994 27.498895999999998,-99.525855930815595 27.516294999999385,-99.525849791073696 27.516338353233991,-99.525316190784537 27.520106149807926,-99.523876376642917 27.530272798702207,-99.522431296340699 27.540476632400054,-99.521918999999997 27.544094,-99.518818999999993 27.553194,-99.514319 27.556994,-99.511118999999994 27.564493999999996,-99.512219000000002 27.568093999999995,-99.515978000000004 27.572130999999999,-99.51621006287597 27.572263354504685,-99.516956092136581 27.572688844074506,-99.522907946893667 27.576083418863931,-99.530137999999994 27.580207,-99.536560517954015 27.595669560441458,-99.539721999999998 27.603280999999999,-99.549741780062789 27.610632655019803,-99.554405160028892 27.614054243170667,-99.554950000000005 27.614453999999999,-99.555217670042637 27.614437037021997,-99.556811999999994 27.614335999999998,-99.559466999999998 27.609075999999998,-99.562869000000006 27.607264,-99.580005999999997 27.602250999999995,-99.584175941853502 27.603675176957196,-99.584843000000006 27.603902999999999,-99.584876722760043 27.604178863233781,-99.585148000000004 27.606397999999999,-99.578360965974085 27.610254799100861,-99.578159999999983 27.610368999999999,-99.578158133228257 27.610639131051315,-99.578098999999995 27.619195999999999,-99.584782000000004 27.622006999999996,-99.591372000000007 27.627464,-99.592626330929548 27.632690692534315,-99.594037999999998 27.638573,-99.596231000000003 27.639857999999997,-99.603532999999999 27.641991999999998,-99.612907806834755 27.638651258855042,-99.615318942915422 27.637792043123689,-99.624515000000002 27.634515,-99.625321999999997 27.631136999999999,-99.638929000000005 27.626757999999999,-99.654323999999988 27.629615999999999,-99.665948 27.635967999999998,-99.665422000000007 27.640274999999999,-99.660175716081199 27.644678795569117,-99.659499999999994 27.645246,-99.659300532255756 27.646059100049566,-99.658294999999995 27.650158,-99.661845 27.655753,-99.668942 27.659973999999998,-99.672015651285406 27.660163655087903,-99.685812999999982 27.661014999999999,-99.699355999999995 27.655417,-99.704600999999997 27.654953999999996,-99.711511000000002 27.658365,-99.721518999999986 27.666154999999996,-99.723715999999996 27.673328,-99.727277746539684 27.678262316066267,-99.732288643517421 27.685204233237535,-99.732448000000005 27.685424999999999,-99.732610774853441 27.685596448480599,-99.757538999999994 27.711853,-99.758533999999997 27.717071,-99.770740000000004 27.732133999999999,-99.774900999999986 27.73354,-99.785365999999996 27.730354999999999,-99.788844999999981 27.730718,-99.796341999999981 27.735586,-99.801651000000007 27.741771,-99.805670000000006 27.758687999999999,-99.813085999999998 27.773952,-99.817390803736785 27.775433523363962,-99.819091999999998 27.776019000000002,-99.822192999999999 27.766855,-99.825793000000004 27.764373999999997,-99.835127 27.762881,-99.841707999999997 27.766463999999999,-99.843346625073153 27.773142384459568,-99.844736999999981 27.778808999999999,-99.849281022020321 27.790032142335203,-99.850876999999997 27.793973999999999,-99.857944055165163 27.794214491272228,-99.870065999999994 27.794626999999998,-99.877441689362087 27.799278597548025,-99.877677000000006 27.799427,-99.877679299916537 27.799779028327777,-99.877693551047656 27.801960325692491,-99.877840000000006 27.824375999999997,-99.876677795668783 27.832975173255242,-99.876002999999997 27.837968,-99.877201999999997 27.842179000000002,-99.882014999999996 27.850391999999996,-99.89364999999998 27.856193,-99.901486000000006 27.864162,-99.904385000000005 27.875283999999997,-99.901231999999993 27.884405999999995,-99.894091000000003 27.892949999999999,-99.893456 27.899208000000002,-99.895827999999995 27.904177999999998,-99.900080000000003 27.912141999999999,-99.905861237749605 27.914081496997749,-99.917461000000003 27.917973,-99.925935042520848 27.927688375003317,-99.93714199999998 27.940536999999999,-99.938541 27.954059,-99.932160999999979 27.96771,-99.931811999999994 27.980967,-99.962768999999994 27.983536,-99.984922999999995 27.990729000000002,-99.991446999999994 27.99456,-99.998749958954292 28.00705628754028,-100.000278657311796 28.009672084008166,-100.008630999999994 28.023963999999999,-100.012838999999985 28.037203000000002,-100.014975394500183 28.048814882934586,-100.016570970484992 28.057487270710915,-100.017914000000005 28.064786999999999,-100.028724999999994 28.073118,-100.046108000000004 28.079067999999999,-100.053122999999985 28.08473,-100.056983000000002 28.094207,-100.05559599999998 28.101140999999998,-100.056492999999989 28.104185999999995,-100.064147158981442 28.110644603904401,-100.067651999999995 28.113602,-100.075474 28.124881999999999,-100.083393 28.144034999999999,-100.090288999999984 28.148312999999998,-100.119627999999992 28.155588000000002,-100.12658652988236 28.159659080291213,-100.141098 28.168149,-100.159890345070792 28.168159605160877,-100.160589999999999 28.16816,-100.1644540887186 28.169825181963088,-100.168437999999995 28.171541999999999,-100.173949604741296 28.178834844700365,-100.174413 28.179448,-100.17569869464343 28.180169771489844,-100.185693999999998 28.185780999999999,-100.195825662217615 28.189941498404405,-100.196499000000003 28.190218000000002,-100.19841872968675 28.190245400986015,-100.202449991411854 28.190302940621361,-100.208059000000006 28.190382999999997,-100.21208061434919 28.196473071951928,-100.212104999999994 28.196509999999996,-100.212111438897693 28.196576571978802,-100.212136678181992 28.196837521783539,-100.213449999999995 28.210415999999999,-100.217564999999993 28.226934,-100.220284000000007 28.232209999999995,-100.22363 28.235223999999995,-100.227575000000002 28.235856999999999,-100.246200000000002 28.234092,-100.251633999999996 28.236177,-100.261135590980771 28.244561246718906,-100.267604000000006 28.250268999999999,-100.280518 28.267969,-100.289383999999998 28.273491,-100.293468000000004 28.278475,-100.294296000000003 28.284381,-100.287553999999986 28.301093000000002,-100.286470999999992 28.312295999999996,-100.288638999999989 28.316977999999995,-100.314198000000005 28.345859,-100.317245999999997 28.357382,-100.320392999999996 28.362116999999998,-100.341869000000003 28.384952999999996,-100.344399999999979 28.389662,-100.34934096344108 28.4019924953441,-100.349585999999988 28.402603999999997,-100.349394820211828 28.402858691740477,-100.345766407828719 28.407692501181913,-100.343945000000005 28.410119000000002,-100.337058999999996 28.427150999999995,-100.336185999999998 28.430180999999997,-100.337474638078888 28.440402915586755,-100.337648113426326 28.441778981052359,-100.337796999999995 28.442959999999999,-100.338752462381066 28.444650728533539,-100.341532999999998 28.449570999999995,-100.350785999999999 28.459246,-100.353875644654778 28.461269551534915,-100.357498000000007 28.463642,-100.35795880406117 28.464220845064407,-100.358193534884933 28.464515705266944,-100.367961112704847 28.47678537623738,-100.368288000000007 28.477195999999999,-100.368051363629903 28.477598261305609,-100.365982000000002 28.481116,-100.356642877924983 28.482149981508559,-100.352234999999979 28.482638,-100.344180999999992 28.486249,-100.337140000000005 28.491728999999999,-100.33381399999999 28.499251999999998,-100.338517999999993 28.501833,-100.362147999999991 28.508399,-100.379079000000004 28.511638999999999,-100.388859999999994 28.515747999999995,-100.405057999999983 28.535779999999999,-100.411413999999994 28.551898999999999,-100.40430324537553 28.563833042228197,-100.397270000000006 28.575637,-100.396799999999999 28.580400999999998,-100.398385000000005 28.584883999999999,-100.403243426032972 28.586668145075244,-100.425819035320046 28.594958517689108,-100.429856 28.596440999999995,-100.431892715674053 28.597943579291371,-100.447320000000005 28.609324999999998,-100.448648000000006 28.616773999999999,-100.447280739633683 28.625703494601449,-100.445528999999993 28.637143999999996,-100.44560646842767 28.637394606891831,-100.447014715516048 28.641950223113035,-100.447091 28.642196999999999,-100.447325484276334 28.642184618041064,-100.447599559425257 28.642170145483281,-100.456522261830528 28.641698981546444,-100.462866000000005 28.641363999999999,-100.474494000000007 28.647071,-100.479445543783555 28.654922981332383,-100.479495071011698 28.655001519842354,-100.479635999999999 28.655225000000002,-100.481416494659797 28.655591917738484,-100.492493911747701 28.657874710783531,-100.493322226012125 28.658045406716248,-100.495863 28.658568999999996,-100.496129521434568 28.658770241190073,-100.500353999999987 28.661960000000004,-100.502122125123847 28.667202406240314,-100.505211969634487 28.676363647108229,-100.509438609439442 28.688895431533517,-100.510054999999994 28.690722999999995,-100.510127443340068 28.69126843161186,-100.510538898440004 28.694366309458967,-100.51077198772829 28.696121257064849,-100.511998000000006 28.705352,-100.511351260759739 28.706743032691019,-100.510646631791559 28.708258576930099,-100.509872363628347 28.709923903942272,-100.509406561254394 28.710925770365975,-100.508636802312012 28.712581398765199,-100.507069450532313 28.715952521820881,-100.506701000000007 28.716745000000003,-100.506745928327234 28.717920131927187,-100.506786973330165 28.718993692782757,-100.507152057645129 28.728542729239727,-100.507513721430456 28.738002299344281,-100.507590113222051 28.740000380261673,-100.507613000000006 28.740599,-100.507694735304739 28.740708529390524,-100.51442566685138 28.749728313832868,-100.519226000000003 28.756160999999999,-100.533017 28.763279999999998,-100.537772000000004 28.780775999999996,-100.534846642084489 28.786410367511117,-100.532431000000003 28.791062999999998,-100.535830000000004 28.805887999999999,-100.546431879116881 28.824270186264151,-100.546968759195195 28.825201061771438,-100.547323999999989 28.825817,-100.548186025546428 28.826178082695296,-100.553129999999982 28.828249,-100.561442999999997 28.829174000000002,-100.570509999999999 28.826317,-100.574698999999995 28.828786999999998,-100.576846000000003 28.836168000000004,-100.572991999999999 28.848463999999996,-100.580501999999996 28.856007999999999,-100.591040000000007 28.863054000000002,-100.598061272695219 28.874286065303028,-100.598877000000002 28.875590999999996,-100.602654 28.887660000000004,-100.602394435759351 28.893839359355621,-100.602053999999995 28.901944,-100.615584686670886 28.902906942475386,-100.627205999999987 28.903734,-100.631611000000007 28.902838999999997,-100.633502414453218 28.905240591668694,-100.640568000000002 28.914211999999999,-100.639169999999979 28.916288999999999,-100.638857000000002 28.927621999999996,-100.651511999999997 28.943431999999998,-100.64789859018552 28.954344193790252,-100.646992999999995 28.957078999999997,-100.646600907687997 28.967547400926616,-100.64647463428885 28.970918751315974,-100.645893999999998 28.986421,-100.647406325643686 28.99295674936236,-100.647835962928511 28.994813493392339,-100.648681241069511 28.998466493719445,-100.65094599999999 29.008254000000004,-100.653757999999996 29.015356,-100.656109999999998 29.017223999999999,-100.660207999999997 29.031497000000002,-100.663212 29.048041999999995,-100.662508000000003 29.058106999999996,-100.664064999999994 29.073205999999999,-100.666359117032755 29.07896154562156,-100.668483863047285 29.084292168447689,-100.674655999999999 29.099777000000003,-100.684472 29.110657,-100.692326999999992 29.115227999999995,-100.70996599999998 29.119684000000003,-100.727461999999989 29.129122999999996,-100.737795000000006 29.139078999999999,-100.739115999999996 29.141658,-100.737590999999995 29.147406999999998,-100.739681000000004 29.150486000000004,-100.746139999999997 29.154149000000004,-100.752330696165359 29.155516457617566,-100.759726 29.157149999999998,-100.76337082361762 29.160348915845475,-100.772648999999987 29.168492,-100.775904999999995 29.173344,-100.772154104961558 29.17809434863841,-100.766030999999998 29.185848999999997,-100.767059000000003 29.195287,-100.768348510582513 29.197581465531123,-100.775064591152173 29.209531592641572,-100.785521000000003 29.228136999999997,-100.791371999999996 29.225944999999999,-100.795681000000002 29.227729999999998,-100.79704599999998 29.235585999999998,-100.795234211471239 29.241421249558652,-100.795010188783237 29.242142762180318,-100.794911999999997 29.242459,-100.795310930062826 29.24310735172228,-100.797670999999994 29.246943000000002,-100.805332448258866 29.251327106905226,-100.815767091023289 29.257298117587734,-100.823532999999998 29.261742000000002,-100.834039999999987 29.261399999999998,-100.839016 29.263259,-100.841581161127962 29.265429071012271,-100.848663999999999 29.271420999999997,-100.856469000000004 29.275663999999999,-100.864659000000003 29.276076,-100.874739696506666 29.279181633366278,-100.876048999999995 29.279585,-100.876625364221198 29.280115401513385,-100.878513170701353 29.281852663087207,-100.878882999999988 29.282193000000003,-100.879105716359817 29.283377353454046,-100.880504361011205 29.290815018226784,-100.882051999999987 29.299044999999996,-100.886842 29.307848,-100.895590728097048 29.309871687341737,-100.904835000000006 29.31201,-100.906461302333199 29.313095095005444,-100.914770068080642 29.318638836799305,-100.916744062319239 29.319955917421627,-100.92203960930695 29.323489191321695,-100.922232587658954 29.323617949573855,-100.924041970395777 29.324825198761538,-100.926468967605715 29.326444530233299,-100.926628772437255 29.326551154580446,-100.926677999999981 29.326584,-100.92692137104487 29.32669794102517,-100.927819078352698 29.327118228044156,-100.92782883100196 29.32712279402223,-100.930446231588661 29.328348203997709,-100.940614999999994 29.333109,-100.941560773525751 29.336361493535293,-100.943196 29.341985,-100.945807189162338 29.344363370184055,-100.948971999999998 29.347245999999998,-100.95603875001359 29.347290187325033,-100.964324999999988 29.347342,-100.971743000000004 29.351370999999997,-100.972915999999998 29.354545000000005,-100.995606999999993 29.363403000000005,-101.004206999999994 29.364771999999999,-101.010614000000004 29.368669,-101.010768998319776 29.36895846820963,-101.014103165002794 29.375185214807839,-101.024016000000003 29.393697999999997,-101.036603999999997 29.406107999999996,-101.038600000000002 29.410713999999999,-101.037642000000005 29.414681000000002,-101.043363999999997 29.42988,-101.056956999999983 29.440773,-101.06011415724447 29.458454662113137,-101.060150999999991 29.458660999999999,-101.063843258270609 29.460131584976065,-101.087148999999997 29.469414,-101.103699000000006 29.470549999999999,-101.115253999999993 29.468458999999996,-101.130037999999985 29.47842,-101.137502999999995 29.473541999999998,-101.144336999999993 29.473246,-101.151876999999999 29.477004999999998,-101.163854997623304 29.493316894569897,-101.168923969306405 29.50021992913986,-101.171662999999995 29.503950000000003,-101.173821000000004 29.514566000000002,-101.192719999999994 29.520285,-101.227418999999998 29.522349999999996,-101.235274999999987 29.524854,-101.254895000000005 29.520341999999996,-101.260836999999981 29.529933,-101.261174999999994 29.536777,-101.252755240314642 29.553001111955531,-101.244355179006547 29.569187266927752,-101.24384013276574 29.574337712700849,-101.242022713082847 29.59251185083151,-101.251352546644355 29.604174135250076,-101.252152766968493 29.604494220898598,-101.259127443101093 29.607284069726152,-101.265347312053251 29.607284069726152,-101.274677145614746 29.602619152945408,-101.277624046978673 29.599940160672645,-101.283229510623855 29.594844301688571,-101.297224215766221 29.587069435365102,-101.30733154801338 29.587846934050759,-101.312894947857018 29.594028488101586,-101.314328915651188 29.595621785307589,-101.313192213312618 29.602947206633093,-101.31110792457288 29.616379301091623,-101.30733154801338 29.640715970810437,-101.311218981175116 29.64849082206727,-101.316661381574889 29.655488204771718,-101.325213716450733 29.657820655628775,-101.350093282659174 29.654710721152696,-101.353062961800887 29.655502634567405,-101.361755552011104 29.657820655628775,-101.364595571422868 29.66106639883844,-101.367197952410862 29.664040554714198,-101.371300910394638 29.676075888592084,-101.372874548462477 29.680691889931673,-101.378860251896057 29.698249939417508,-101.396947999999995 29.713947,-101.398362000000006 29.717000000000002,-101.396293999999997 29.727055,-101.397008999999997 29.733962999999999,-101.400635999999992 29.738078999999999,-101.410024000000007 29.741498,-101.415583999999996 29.746534,-101.415509877418046 29.750619769974676,-101.415402087456428 29.756561346443686,-101.424731921017937 29.758116313681725,-101.430388403484372 29.756500180308258,-101.441059122217254 29.75345141196761,-101.446501522617027 29.755006409338922,-101.451652003139955 29.758440048234313,-101.453498905321467 29.759671311053037,-101.455223999999987 29.771874,-101.467493655663716 29.779885945414083,-101.475268506920557 29.780663444099741,-101.503223000000006 29.764581999999997,-101.522695143280473 29.759671311053037,-101.526552276219391 29.761451532447605,-101.532802460460985 29.764336242900427,-101.53746737724174 29.782995910023434,-101.53804719015173 29.783865628452077,-101.546797210803248 29.796990645299058,-101.56156944476453 29.794658179375361,-101.572592853930203 29.778735448896484,-101.575564187573463 29.774443514881042,-101.582561562744587 29.771333610538232,-101.598573641854728 29.773657690388074,-101.603680999999995 29.774398999999999,-101.607256216824311 29.773863608191139,-101.625957999999997 29.771063000000002,-101.630319 29.768729,-101.632632680380155 29.763891873249722,-101.63512799999998 29.758675,-101.646417999999997 29.754303999999998,-101.652400999999983 29.758794999999996,-101.65328091488901 29.761368862201802,-101.654578 29.765162999999998,-101.662452999999985 29.77128,-101.689992000000004 29.771212999999996,-101.706636000000003 29.762736999999998,-101.714223999999987 29.767659999999999,-101.735201999999987 29.771591999999998,-101.754322999999999 29.777661999999999,-101.760919284561496 29.782457957985276,-101.763273999999981 29.784169999999996,-101.776796131253491 29.789191504347542,-101.777161000000007 29.789327,-101.777360180704861 29.789301830227139,-101.785668 29.788251999999996,-101.791002820423358 29.783037559970925,-101.796869557069002 29.782618516634159,-101.806507764952315 29.786389987871868,-101.809441149516488 29.790161459109573,-101.813855730843954 29.79253854440006,-101.814888826583982 29.793094827432377,-101.818909248247508 29.792167038125061,-101.830044431332681 29.789597381341238,-101.831231874027822 29.789323356194672,-101.852603555202364 29.801894932400803,-101.862241763085706 29.800218726571018,-101.866487373818487 29.79821962567333,-101.875399999999985 29.794022999999999,-101.878152615094365 29.794637055896249,-101.892739000000006 29.797891,-101.912406000000004 29.797849999999997,-101.917556726002999 29.792675767854249,-101.917942403066036 29.792482929945557,-101.922585359733716 29.790161459109573,-101.929709258872364 29.789323356194672,-101.932572380438657 29.791613852338052,-101.938090312383324 29.796028195755184,-101.946471365894325 29.797704401584976,-101.952535620779244 29.796990962273608,-101.953595265032959 29.796866298670082,-101.959462001678588 29.799380623656123,-101.965427194081556 29.806464275410743,-101.966166845299441 29.8073426094683,-101.970357372054934 29.81027599403247,-101.974547898810414 29.81027599403247,-101.982165144097308 29.804870201524977,-101.987538526473998 29.801056829485908,-101.993568005272067 29.802652866652032,-102.001318622543394 29.804704498914084,-102.001786318660763 29.804828300723614,-102.021918999999997 29.802490999999996,-102.032489182844799 29.803756293694118,-102.034758999999994 29.804027999999999,-102.039012999999997 29.802655,-102.041088000000002 29.799609999999998,-102.038411999999994 29.792831999999997,-102.039226999999997 29.790977000000002,-102.041308736499772 29.78984019520162,-102.048982832584102 29.785649487466547,-102.050044 29.785069999999997,-102.053123037129694 29.785312127485501,-102.073645999999982 29.786926,-102.076299925656656 29.790865308882584,-102.077348 29.792421,-102.084438999999989 29.794962000000002,-102.091420021879856 29.792967151942147,-102.091815999999994 29.792853999999995,-102.098789196918744 29.792718427915432,-102.115682000000007 29.792389999999997,-102.142325999999997 29.802854,-102.159600999999995 29.814355999999997,-102.161673999999991 29.819486999999999,-102.181894 29.846033999999996,-102.182859740836193 29.846584944255238,-102.18326563789924 29.846816503951921,-102.184058205433814 29.847268654791659,-102.186149999999998 29.848461999999998,-102.187393471220204 29.848699156882201,-102.188384798592551 29.848888224473839,-102.188671999999997 29.848942999999998,-102.189026115519184 29.848805138880103,-102.189342793483831 29.848681852617602,-102.205381000000003 29.842438,-102.216284162639099 29.842976962035557,-102.227553 29.843533999999995,-102.261388999999994 29.853283,-102.264041000000006 29.855964,-102.261776999999995 29.864001999999999,-102.264954000000003 29.867805999999998,-102.268816999999984 29.867990999999996,-102.276754999999994 29.862977999999998,-102.281249000000003 29.863116999999999,-102.297330999999986 29.875194,-102.301381000000006 29.877673999999995,-102.315388999999996 29.879919999999998,-102.320618999999994 29.878979999999995,-102.320667125014978 29.878900015386019,-102.320698585434869 29.878847727619664,-102.324634000000003 29.872306999999996,-102.333383999999995 29.868046,-102.341032999999996 29.869305000000004,-102.349861000000004 29.862316999999997,-102.361383773688715 29.849029038788231,-102.364542 29.845386999999995,-102.363642671554629 29.839963091609825,-102.362514000000004 29.833155999999995,-102.369522000000003 29.820395,-102.377253999999994 29.800163,-102.377312999999987 29.789971,-102.385270832882995 29.770348713937391,-102.386677616883858 29.766879890389689,-102.391739211722737 29.765814289574276,-102.392906191083 29.765568609270456,-102.402175111261812 29.766775086101941,-102.412062000000006 29.768061999999997,-102.433301 29.776608,-102.460890018677347 29.77909171043791,-102.468946430597143 29.779816991558327,-102.469957868267898 29.780012383523857,-102.481595292961757 29.782260529257879,-102.490330613701886 29.783948039559665,-102.492674483475767 29.783853017496881,-102.508312776666344 29.783219030534834,-102.508509848222559 29.783087649355906,-102.512686811979108 29.780303003853621,-102.512942156326147 29.774953626291172,-102.513380999999995 29.76576,-102.526400256170959 29.758693706517125,-102.535832205630967 29.753574449155192,-102.539417050278132 29.751628749336795,-102.545492105079163 29.750899740311965,-102.551081152293932 29.752357753652575,-102.556670813570321 29.757783010503054,-102.559343229460382 29.760376824671383,-102.565661280990938 29.761591836573395,-102.572255912443325 29.757095496286663,-102.57574472309652 29.754716761401177,-102.57635337725236 29.754301769870359,-102.585948674897452 29.751239442391949,-102.587774480184081 29.750656738873374,-102.597160000000002 29.751608,-102.612879000000007 29.748181999999996,-102.622534000000002 29.736632,-102.630150999999984 29.734314999999999,-102.64566499999998 29.733910000000002,-102.661251958261417 29.736122779697027,-102.66726872436665 29.739732837494621,-102.670971460158171 29.741954477821469,-102.677191937153026 29.738261067251376,-102.678467215476147 29.736427653943998,-102.6852530581628 29.72667193704833,-102.688163999999986 29.722486999999997,-102.690237999999979 29.707481999999999,-102.695507594622001 29.699754690880447,-102.698346999999984 29.695590999999997,-102.699316999999994 29.685029,-102.693466 29.676507,-102.697798916570122 29.672550546488289,-102.711337549653422 29.6601882100483,-102.724231000000003 29.648415000000004,-102.736947999999984 29.641537999999997,-102.742030999999997 29.632142000000002,-102.74048425929719 29.62775763619268,-102.738427999999999 29.621928999999998,-102.739991000000003 29.599041,-102.746201999999997 29.592875000000003,-102.757065999999995 29.597798999999998,-102.761810999999994 29.598396999999999,-102.768340999999992 29.594733999999999,-102.766929734823805 29.591197739636346,-102.762241000000003 29.579448999999997,-102.766124000000005 29.572347999999998,-102.768792219428661 29.572598581791439,-102.773961 29.573084,-102.776343296957975 29.562015327831393,-102.777530999999996 29.556497,-102.77572499999998 29.552188999999995,-102.771428999999998 29.548545999999998,-102.79216136048494 29.533953841063816,-102.807296321997939 29.523301326891541,-102.808565712504773 29.522407885546979,-102.808691999999979 29.522319000000003,-102.808681334358837 29.522097795383676,-102.808577631171161 29.519946998869006,-102.807327 29.494009000000002,-102.813953999999995 29.482805999999997,-102.814096473430837 29.482483316434472,-102.814383778328263 29.481832608662831,-102.822314986984821 29.463869465126457,-102.82537225240516 29.456945161410285,-102.827007089548758 29.453242470491304,-102.830969999999979 29.444267,-102.832538999999997 29.433109000000002,-102.830570753051859 29.427471931628293,-102.827354999999983 29.418261999999995,-102.825211066354328 29.40389180477127,-102.824564449740322 29.399557712155943,-102.831802092379931 29.389471209449322,-102.832669213065941 29.388262775214326,-102.84047188579207 29.377388836904565,-102.840778422425643 29.376961642203423,-102.841560439245441 29.370344567434586,-102.842457529677418 29.362753791491347,-102.843015380341285 29.358033509958585,-102.843020777220957 29.357987843989019,-102.861629999999991 29.351638999999995,-102.871857000000006 29.352092999999996,-102.876866000000007 29.354058999999996,-102.879534000000007 29.353326999999997,-102.883721999999992 29.348058999999999,-102.881857488401977 29.34363024944906,-102.879805000000005 29.338754999999999,-102.890489000000002 29.309498999999995,-102.88922161316745 29.299205074185686,-102.888328 29.291947,-102.891022000000007 29.287113000000002,-102.902604999999994 29.279440999999998,-102.90311226801488 29.27677066200776,-102.906295999999998 29.260010999999995,-102.903188999999983 29.254028999999999,-102.887901999999997 29.245611999999998,-102.881135 29.246022,-102.871347 29.241624999999999,-102.870795537867835 29.239589944231255,-102.86823682221636 29.230147538772215,-102.866845999999995 29.225014999999999,-102.878020000000006 29.214697999999999,-102.890063999999995 29.208813999999997,-102.899231 29.208863,-102.908656596973657 29.219194069767902,-102.908787000000004 29.219336999999996,-102.909098471667448 29.219296482603067,-102.910575587951939 29.219104333804097,-102.912131000000002 29.218902,-102.912650757516516 29.218481184275788,-102.915803535402844 29.215928573746115,-102.915865999999994 29.215877999999996,-102.915845750043147 29.215583596781208,-102.915608148145267 29.212129230727648,-102.915554 29.211341999999998,-102.915202931298523 29.21076702044931,-102.914525807203304 29.209658028088604,-102.912447999999998 29.206254999999999,-102.91453363655873 29.20019781620671,-102.917367531146525 29.191967513425833,-102.917805 29.190697,-102.922897000000006 29.192704085059273,-102.925481999999988 29.193722999999995,-102.932612000000006 29.194113000000005,-102.944911000000005 29.188819999999996,-102.947155999999993 29.180776999999999,-102.95089 29.176834999999997,-102.953474999999997 29.176307999999995,-102.977266 29.186226,-102.981742305424802 29.185103060319207,-102.989431999999994 29.183174,-102.98978258837333 29.182935350109393,-102.991725524817895 29.181612768970929,-102.994653 29.17962,-102.994906329461855 29.17910907354543,-102.99809599999999 29.172675999999996,-102.995688 29.161218999999999,-103.00243399999998 29.150260999999997,-103.0050672680876 29.149386797638936,-103.008362000000005 29.148292999999995,-103.010324999999995 29.137821999999996,-103.015028 29.125769999999996,-103.016945338084582 29.124525732477775,-103.024896087692937 29.119366048020158,-103.032982999999987 29.114118,-103.033302941039096 29.107355634443419,-103.034095953658579 29.105913798143234,-103.035682683422891 29.103028844591982,-103.04044215980575 29.099351067768175,-103.049126083320303 29.097714968852063,-103.055369601981923 29.096538655622457,-103.061557539334615 29.093936906572154,-103.06671291432167 29.091769303506382,-103.074407490743866 29.088534080562461,-103.076354546596249 29.085721668416742,-103.076667707631657 29.079576983004682,-103.076847 29.076059,-103.091926967746744 29.064237268591206,-103.100265999999991 29.057699999999997,-103.101359249603803 29.049403674773888,-103.102531654124817 29.040506667933872,-103.100975335951205 29.030701853789079,-103.100368259199087 29.026877266486249,-103.101607999999999 29.018122999999999,-103.107810999999998 29.013812,-103.117237999999986 29.000208999999998,-103.113922000000002 28.988546999999997,-103.115062910480361 28.985887850893185,-103.115327999999991 28.98527,-103.115773294260094 28.985147329619764,-103.126748000000006 28.982123999999995,-103.134930999999995 28.983525,-103.143274000000005 28.978073999999999,-103.156645999999995 28.972830999999999,-103.163865 28.972099,-103.165923000000006 28.974001999999999,-103.166234999999986 28.978836000000005,-103.174329720990258 28.980505274886987,-103.182663652045193 28.982223879127538,-103.194928465619142 28.984753100989199,-103.195705106971403 28.984913258196226,-103.207825367468075 28.987412670652219,-103.227338454203803 28.991436614861634,-103.227579101883322 28.991486240676846,-103.227800999999999 28.991532000000003,-103.228011662384262 28.991347921912006,-103.228737472224623 28.990713704806197,-103.239108999999985 28.981650999999996,-103.245121150470112 28.980239630911282,-103.2474464632202 28.980649978816817,-103.249155161185584 28.980951512720708,-103.25190330878641 28.984768118238364,-103.253285000000005 28.986686999999996,-103.26030800838916 28.989731411362609,-103.266003072061508 28.990206003834011,-103.270357000000004 28.988113999999996,-103.270725571428585 28.987466542857135,-103.27232562100086 28.984655789108508,-103.273357000000004 28.982844,-103.273647076585334 28.982817854078331,-103.281189929980513 28.982137982403092,-103.282424051550748 28.983865752282551,-103.284749352823042 28.987121173462914,-103.285935817906974 28.994002716014545,-103.289257951411443 28.999697788883793,-103.296614077237592 29.004443676810233,-103.302399476821606 29.006455988366771,-103.312987409437454 29.010138745081029,-103.315449022736544 29.011725838031147,-103.323993942362023 29.017235063099889,-103.331021803791103 29.021766184756,-103.332920159881368 29.026986669752301,-103.332783823258595 29.028827200289001,-103.332445567409962 29.033393619832523,-103.334818511373186 29.039800579109659,-103.341462759988346 29.041224342728523,-103.347869719265475 29.037427630547988,-103.350815999999995 29.028566999999999,-103.355428000000003 29.021529,-103.355590463621823 29.021464336016578,-103.361777791205157 29.019001647792766,-103.361998 29.018913999999999,-103.382125000000002 29.024248999999998,-103.386095607142025 29.025822707722725,-103.399799910010643 29.031254261761571,-103.402689272115182 29.032399429564627,-103.427474921518822 29.04222295692054,-103.427754276336316 29.042333676218103,-103.430481680804888 29.047455485683194,-103.434668000000002 29.055316999999995,-103.439550459717495 29.058547821156772,-103.449722032594721 29.065278554178825,-103.453029264571228 29.067467015663059,-103.457386392383299 29.068596640465525,-103.460381908910477 29.067681344107211,-103.463195887793432 29.066821517562918,-103.469166763983068 29.069242141692889,-103.471264639062966 29.073115142802621,-103.471299587628792 29.074897490538035,-103.471426016715213 29.08134526859719,-103.474814887995407 29.086670637304994,-103.484429000000006 29.094524,-103.49531945696836 29.1087608679228,-103.500928937954981 29.116094025764934,-103.503236 29.119109999999996,-103.506163032831353 29.119368513261239,-103.513192088151087 29.119989313955617,-103.524613000000002 29.120998,-103.524225442342612 29.124905426308125,-103.523383999999993 29.133389,-103.525026999999994 29.137353999999998,-103.539240927934515 29.144791265038371,-103.551909954693073 29.151420179312847,-103.558678999999984 29.154961999999998,-103.579462000000007 29.149964999999998,-103.592359999999999 29.150259999999999,-103.598960126757959 29.155019048637598,-103.606437999999997 29.160411,-103.607894091053709 29.162314354517299,-103.610539999999986 29.165772999999998,-103.624537921955991 29.163185608071569,-103.629433693714475 29.1622806680118,-103.638195234739996 29.160661174732635,-103.645634999999999 29.159286000000002,-103.653180000000006 29.162863999999995,-103.656807999999984 29.169098999999999,-103.660202999999996 29.170933999999999,-103.667724667668963 29.172878689431396,-103.669696386484915 29.173388467437,-103.688670000000002 29.178293999999998,-103.688830238367032 29.178273608722382,-103.690116124218548 29.178109972160996,-103.697314000000006 29.177194,-103.699305464408098 29.178139630948273,-103.713769999999997 29.185008,-103.724743000000004 29.191469999999999,-103.73193762439729 29.198544108660482,-103.742175000000003 29.20861,-103.750912464183997 29.219357091602017,-103.755265634411842 29.22471149629115,-103.75594348727293 29.225545256136954,-103.768569999999997 29.227360999999995,-103.777623396259372 29.232265264832392,-103.780085146052983 29.242351446713872,-103.780352362214714 29.243446273985068,-103.781659908552058 29.248803500057083,-103.789034484601103 29.257501704713096,-103.792700821322356 29.259284649416337,-103.795120675584712 29.260461427946989,-103.80876361213285 29.267096007175422,-103.816641821688407 29.27092719156084,-103.818617217853202 29.271599921312173,-103.838302999999982 29.278303999999999,-103.854966933859771 29.281484400071786,-103.856892999999999 29.281852,-103.880606 29.284961999999997,-103.896615144488038 29.284634799403065,-103.910231251371073 29.284356508561018,-103.916269383748329 29.284233099060927,-103.91710599999999 29.284215999999997,-103.91776286712728 29.284516760669142,-103.918698764585329 29.284945281345607,-103.918909999999997 29.285042,-103.918905327188597 29.285488562070029,-103.918900778480648 29.285923264066316,-103.918857000000003 29.290106999999995,-103.924975999999987 29.293913000000003,-103.943697999999983 29.294945999999996,-103.965795999999983 29.298586999999998,-103.975234999999998 29.296016999999999,-103.983459597310627 29.299165977024781,-103.998789342279238 29.305035323921498,-104.012357062242771 29.310230038851625,-104.018558084893087 29.312604243583909,-104.038281999999995 29.320155999999997,-104.047006656168747 29.325575022319434,-104.055595999999994 29.330909999999996,-104.056467149578211 29.334496091467582,-104.057243999999997 29.337694000000003,-104.068917843404819 29.342306667996301,-104.075923999999986 29.345075,-104.082149999999999 29.345922999999996,-104.091021999999995 29.353691999999995,-104.093326000000005 29.359926000000002,-104.098377999999983 29.366755999999999,-104.106466999999981 29.373127,-104.122882935723638 29.379859019095424,-104.125474999999994 29.380922000000002,-104.132831527553293 29.381873417846823,-104.136236243923818 29.382313748953422,-104.143691999999987 29.383277999999997,-104.1467332019064 29.385415391432094,-104.148888696362661 29.386930297552944,-104.151718842950046 29.388919356896473,-104.157422367906094 29.392927859373117,-104.166562999999996 29.399352,-104.180069999999986 29.412763999999999,-104.181273000000004 29.426265,-104.182051945448123 29.427144615030393,-104.195989999999995 29.442884000000003,-104.208194000000006 29.448201,-104.212529153241931 29.452438774515159,-104.213947876032222 29.456222068892099,-104.21370324326665 29.462011765001886,-104.213238514637069 29.473010445135856,-104.218538498245692 29.476600759818915,-104.220568643482977 29.477976020723915,-104.227547514371139 29.480496161448666,-104.229081071868791 29.481049944541308,-104.233824999999996 29.486544999999996,-104.233486999999997 29.492733999999995,-104.235847000000007 29.496744,-104.238313284768751 29.498023301020304,-104.246870092866089 29.50246185307569,-104.254473621536903 29.506405923975272,-104.260293266516271 29.50942466611497,-104.26168489846043 29.511073814728768,-104.264155000000002 29.514001,-104.271046277211582 29.51559593462645,-104.274575430964404 29.516412730896519,-104.293481117436073 29.520788310787555,-104.306646311930564 29.523835296697214,-104.308812834933008 29.524336722260216,-104.311570786550874 29.52540915148019,-104.318073989469781 29.527937921306467,-104.320711000000003 29.526326414398167,-104.326090351466348 29.523039031981277,-104.327483437129615 29.522187701603762,-104.334811000000002 29.519462999999998,-104.338113000000007 29.519967,-104.353150868059984 29.530471948300562,-104.369085650105362 29.541603450512167,-104.37074044290263 29.542759433043344,-104.371174999999994 29.543062999999997,-104.371454921502831 29.543072731712495,-104.371996954766473 29.543091575966443,-104.375901661123379 29.543227326450971,-104.381040999999996 29.543405999999997,-104.394588999999982 29.556087000000002,-104.394583075653415 29.556197720561212,-104.394577025204526 29.556310797858156,-104.394552364240909 29.55677168847231,-104.394503136758885 29.55769170460702,-104.394351 29.560534999999998,-104.39571704642303 29.563607040276512,-104.39636925661604 29.56507376640522,-104.397848504811165 29.56840038104859,-104.399550133070164 29.572227096202102,-104.399591 29.572319,-104.399981791506633 29.572551361916329,-104.452301000000006 29.60366,-104.466520000000003 29.609296,-104.483502 29.627740999999997,-104.486693164979016 29.629712817604439,-104.493658999999994 29.634016999999997,-104.503232654335022 29.63787621670291,-104.507568060311556 29.63962385355849,-104.51068846437596 29.64315687341222,-104.513969549435132 29.646871821353749,-104.51818442992635 29.651644041921735,-104.53325150001281 29.668703453669117,-104.535568725458901 29.671327089370656,-104.539761023554547 29.676073741438437,-104.540155514025756 29.678572204873163,-104.540559188867974 29.681128836544634,-104.537934834631798 29.684482179324355,-104.535770155740693 29.687248158943191,-104.536302269386866 29.690440851131939,-104.537991394981006 29.693268523024599,-104.544269904764263 29.703779029587054,-104.545505621253113 29.70584767433138,-104.552240999999995 29.717122999999997,-104.555600999999996 29.731220999999998,-104.554914970831931 29.738152096413199,-104.554660236582549 29.740725729903364,-104.557361904757329 29.745049367744027,-104.565950999999998 29.758794999999996,-104.565687999999994 29.770461999999998,-104.571279565966023 29.778773775962186,-104.586447318468245 29.801320404476364,-104.592472 29.810276000000002,-104.594023000000007 29.809220999999997,-104.599148999999997 29.811007,-104.610166000000007 29.819117999999996,-104.610205623651026 29.819231101342197,-104.610356932717465 29.819662996386217,-104.613081011852316 29.827438579869643,-104.615248982559379 29.833626813172685,-104.619039 29.844444999999997,-104.624350000000007 29.845221999999996,-104.629290740007292 29.852171499068138,-104.629713747950376 29.852766489555783,-104.630103000000005 29.853313999999997,-104.630111961493199 29.853664893019587,-104.630290851730521 29.860669455113747,-104.630338938536084 29.862552324858758,-104.630359999999996 29.863376999999996,-104.630588419131911 29.86393398222631,-104.633274999999998 29.870484999999999,-104.63616345635748 29.872800876528242,-104.645854762904364 29.880571071602066,-104.65678299999999 29.889332999999997,-104.658422170930251 29.891285606400047,-104.65864999999998 29.891556999999999,-104.658665881124946 29.891956296855856,-104.659041999999999 29.901413000000002,-104.661965712024596 29.903547518850328,-104.666224133352003 29.906656470935726,-104.672326999999996 29.911111999999996,-104.679772 29.924658999999998,-104.680850906343153 29.932111041680564,-104.684321999999995 29.956085999999999,-104.679660999999982 29.975271999999997,-104.680379178583593 29.977083,-104.685479 29.989943,-104.689640999999995 30.014949999999999,-104.693591999999995 30.019077000000003,-104.701242868742796 30.021046973658397,-104.702310999999995 30.021321999999998,-104.702447580064685 30.021555813412469,-104.7030116881661 30.022521518330599,-104.703997999999999 30.02421,-104.703882705803636 30.024660825787098,-104.703121214098445 30.027638426639932,-104.701101999999992 30.035533999999998,-104.706873999999999 30.050685,-104.706630611705322 30.051708605996314,-104.703831250551389 30.063481739403372,-104.703581999999997 30.06453,-104.699792220462342 30.065066336345112,-104.698848962238912 30.065199827927678,-104.698233000000002 30.065286999999998,-104.697787990647399 30.065651654776563,-104.69277799999999 30.069756999999996,-104.687313590037505 30.080921966773531,-104.685080632167896 30.08548438075637,-104.685002999999995 30.085643,-104.685554782105299 30.093963293324606,-104.685687 30.095957000000002,-104.686861171517634 30.098036494960315,-104.692093999999983 30.107303999999996,-104.693655813605488 30.119154117533654,-104.695366000000007 30.13213,-104.692122999999995 30.138662999999998,-104.690080458880587 30.149079251722458,-104.687506999999997 30.162202999999998,-104.687296000000003 30.179464000000003,-104.702787999999998 30.211735999999995,-104.707897632633845 30.218501061672534,-104.711235999999985 30.222920999999999,-104.713166 30.237956999999998,-104.722357186598074 30.248308653999679,-104.724410584274111 30.250621311025988,-104.72532436157617 30.251650460675243,-104.73347160041142 30.260826359409911,-104.733822000000004 30.261220999999999,-104.734059376092361 30.261231667834558,-104.737359999999995 30.261379999999996,-104.740448 30.259454000000002,-104.749663999999996 30.26126,-104.751566999999994 30.263643999999999,-104.754655151309422 30.272796681105522,-104.757893999999993 30.282395999999999,-104.761634 30.301147999999998,-104.779356000000007 30.313188,-104.790279572675416 30.323632238875831,-104.797291 30.330335999999999,-104.809794338457337 30.334925849121163,-104.810755485390246 30.338091979227556,-104.81211787963197 30.342579864771171,-104.813478341684558 30.347061385458392,-104.814379749150064 30.356375955470707,-104.814778573671205 30.360497153782266,-104.817595751374526 30.365914799658352,-104.824313633436745 30.370465624210016,-104.837492999999995 30.373909,-104.849824017938076 30.383147747051474,-104.859521 30.390413000000002,-104.857439999999997 30.408957,-104.852419999999995 30.418792,-104.861074000000002 30.428896999999996,-104.86474141169117 30.441297336779865,-104.865463293164552 30.443738179024677,-104.868454614768496 30.453852504447951,-104.869872 30.458644999999997,-104.86871099999999 30.463229999999996,-104.866118999999983 30.46479,-104.866094000000004 30.467379999999999,-104.870137228360662 30.483875070981508,-104.873288503237063 30.496731258693877,-104.873335488188886 30.496922942181985,-104.876786999999979 30.511004000000003,-104.878566789651714 30.514416830422793,-104.880108146577356 30.517372454871531,-104.88208573587417 30.521164575423189,-104.889375999999999 30.535143999999995,-104.890392881954469 30.540947215529823,-104.892228000000003 30.551419999999997,-104.895440150997459 30.560421421221292,-104.899000999999998 30.570399999999996,-104.909330873116318 30.584188648619556,-104.909747767935556 30.584745133303247,-104.918689620637082 30.596681007395873,-104.924796 30.604831999999998,-104.927016167130404 30.604700501077968,-104.934922481779466 30.604232215677584,-104.939873000000006 30.603939,-104.953391370086464 30.606003357240429,-104.967167000000003 30.608106999999997,-104.971627504383378 30.61006529240159,-104.972071 30.61026,-104.972794851616513 30.611297344530712,-104.980135850742045 30.621817657146149,-104.980290999999994 30.622039999999995,-104.982191641583043 30.62882153037463,-104.983981 30.635206,-104.985513855292751 30.652294791670293,-104.9863 30.661059000000002,-105.001239999999996 30.672583000000003,-105.002056999999994 30.680971999999997,-105.006614566555172 30.685839873047019,-105.006800999999996 30.686039,-105.007528432885024 30.6859080282745,-105.007959930235828 30.685830338698263,-105.020141999999993 30.683637,-105.035888798004834 30.686138071331488,-105.042930223005172 30.687256464175281,-105.044973600167665 30.685364445024991,-105.049769587265445 30.680923708581364,-105.049884734287517 30.6808170907847,-105.050688284649809 30.681171184306308,-105.054688384336032 30.682933873306403,-105.062333999999993 30.686302999999995,-105.062477471553692 30.692159292631892,-105.062625999999995 30.698222,-105.084504902225902 30.710918832086001,-105.098281999999998 30.718914000000002,-105.108075999999997 30.730049999999995,-105.110705999999993 30.737749999999995,-105.110681999999983 30.743366000000002,-105.113815999999986 30.746001,-105.119547104826722 30.748125675649064,-105.123265000000004 30.749504000000005,-105.140207000000004 30.752502,-105.152361999999982 30.751451999999997,-105.157640215066564 30.754007791997694,-105.16015278062757 30.757058756266805,-105.160271207191187 30.758203550015399,-105.161229588477383 30.767467931854636,-105.164076390339474 30.771453450048199,-105.164818961888187 30.77249304906519,-105.164868027003308 30.772491740665838,-105.170370203038615 30.772345016388588,-105.178279098267282 30.772134113115257,-105.183436 30.776644999999995,-105.185930999999997 30.784391999999997,-105.195143999999999 30.792138,-105.195988495740664 30.791702299374609,-105.203522176185984 30.787815448176353,-105.206160999999994 30.786453999999996,-105.212916518294108 30.785414778041517,-105.215967484302155 30.786491589369188,-105.216685356202021 30.789542555377231,-105.215888956387687 30.792967070566242,-105.214890669496626 30.797259699168034,-105.218659510882389 30.801566944478708,-105.222008841883465 30.801829013843189,-105.231580057313238 30.802577916338681,-105.238364256021057 30.803108747911697,-105.249792715464977 30.799033957074698,-105.255416052233826 30.797028969328842,-105.261224946310648 30.798054073736733,-105.261360733612406 30.798078036329223,-105.27276013440985 30.808707209360072,-105.27887297001547 30.814407016614517,-105.283004544196217 30.818259431108679,-105.287237620233441 30.822206489243744,-105.289317685342255 30.822206489243744,-105.295630129130572 30.822206489243744,-105.300778681061615 30.818848737795758,-105.303672944509898 30.816961174571279,-105.314862960890409 30.816961174571279,-105.316949659843416 30.82296045428,-105.31766045482081 30.825003996727105,-105.320108268786385 30.827451797139727,-105.322675464925993 30.828439452154051,-105.330102631610075 30.831296841312803,-105.347695000000002 30.838065,-105.353219571709047 30.842032277683753,-105.358103536812379 30.84553952616983,-105.359771122039604 30.846737044096301,-105.360672052753856 30.84738401593513,-105.36720323988537 30.847875849249167,-105.377416999999994 30.848644999999998,-105.387780492422849 30.851314552204784,-105.394242074789418 30.852979003795937,-105.396689881978517 30.855426817761515,-105.396237319899697 30.858492407966825,-105.394628539050657 30.86939005724841,-105.394248999999988 30.871960999999999,-105.395681745186749 30.87649980844607,-105.399608999999998 30.888940999999996,-105.399828021807267 30.889112280223049,-105.402824820246408 30.891455847338634,-105.413505 30.899808,-105.430088999999995 30.905791999999998,-105.44547819369545 30.915748838601054,-105.448693870984556 30.917829388134351,-105.452149246331331 30.920065022782566,-105.4597280766598 30.924968540917344,-105.469954295993247 30.931584924947412,-105.472488639470896 30.933224650164071,-105.476269681741059 30.935670991952524,-105.488027000000002 30.943277999999999,-105.495516502166126 30.9493992090351,-105.4968561000139 30.950494069316512,-105.497422439936116 30.953962910943051,-105.497963910074574 30.957279424722472,-105.502256687477072 30.962680017552614,-105.507558525965123 30.966493977230062,-105.533087999999992 30.984859,-105.541468808393844 30.984769556162778,-105.543675999999991 30.984745999999998,-105.557430349577899 30.990228688381027,-105.570063935625512 31.008532833135739,-105.575218046011173 31.016000355201566,-105.578084306850855 31.020153131231776,-105.578407858220658 31.020621907958049,-105.57911399999999 31.021644999999999,-105.580554486932016 31.024917232759986,-105.581339666024604 31.026700857930102,-105.581404000000006 31.026847000000004,-105.581361569643192 31.027041810483581,-105.581235244876609 31.027621805343596,-105.579823718925667 31.034102543987302,-105.579541999999989 31.035395999999995,-105.579765234089464 31.036249085539566,-105.579847333127134 31.036562825712579,-105.585323000000002 31.057487999999996,-105.592709163135751 31.0626132919136,-105.595921000000004 31.064841999999999,-105.598772999999994 31.074925999999998,-105.60333 31.082624999999997,-105.627348999999995 31.098545,-105.641890000000004 31.098321999999996,-105.646730999999988 31.113907999999999,-105.647031366805422 31.114192798578223,-105.648833999999994 31.115902000000002,-105.662869191777489 31.12063916934996,-105.673930643060629 31.124372639388369,-105.709491 31.136374999999997,-105.717005999999998 31.141438,-105.717653520299876 31.143411480377267,-105.719539999999995 31.149160999999996,-105.742677999999998 31.164897,-105.763531 31.164121000000005,-105.773256999999987 31.166896999999999,-105.774148788612138 31.168976038235485,-105.780021000000005 31.182666,-105.779878030009812 31.18682806893737,-105.779724999999999 31.191282999999995,-105.782894999999996 31.197562999999999,-105.790659746923424 31.200723362140888,-105.794386000000003 31.20224,-105.818835000000007 31.230680999999997,-105.825806058218902 31.23733997673531,-105.835722000000004 31.246811999999995,-105.851073632158958 31.265902599748792,-105.86604427072389 31.284519412988434,-105.869353000000004 31.288633999999998,-105.869862116496506 31.288859823963843,-105.876014999999981 31.291588999999995,-105.890871999999987 31.290013999999996,-105.895034999999993 31.290977999999999,-105.903460999999993 31.306768999999999,-105.908770999999987 31.312773999999997,-105.914613899052299 31.312859252963214,-105.93196564998388 31.313112430054005,-105.932552999999999 31.313120999999995,-105.933375187723101 31.313903465142818,-105.938451999999984 31.318735,-105.948091000000005 31.340069,-105.945903 31.352809999999998,-105.953942999999995 31.364749,-105.970101 31.365936999999995,-105.997579969562565 31.386863626037869,-106.00418474278807 31.391893495117941,-106.004925999999998 31.392457999999998,-106.006143777923754 31.392558937255828,-106.022866323827969 31.393945009265412,-106.080091217088636 31.398688175961098,-106.080258 31.398702,-106.080335505244278 31.398768097394733,-106.096409750603954 31.412476405141465,-106.100621535494 31.416068265421309,-106.102641400977276 31.417790830744398,-106.10264993125142 31.41779810546371,-106.106876999999997 31.421403000000005,-106.112168999999994 31.423577999999996,-106.132782000000006 31.425367000000005,-106.143572676566535 31.431101721097118,-106.158218000000005 31.438885000000003,-106.175305198785026 31.455910533348611,-106.175674999999998 31.456278999999995,-106.17677981450808 31.456634312625521,-106.182946895641223 31.45861766980741,-106.20560859826729 31.465905761156737,-106.205826999999999 31.465975999999998,-106.205998876707866 31.466165148890862,-106.212686244283063 31.473524541419071,-106.218538531147885 31.479964934554566,-106.218843000000007 31.480299999999996,-106.218893022078106 31.480498686193428,-106.223908999999992 31.500422,-106.236804000000006 31.513376,-106.242649095206133 31.530650094003715,-106.245874455325477 31.540182047193959,-106.246202999999994 31.541153,-106.246406806009631 31.541315626597875,-106.254779999999997 31.547997000000002,-106.280345588488331 31.561810530102129,-106.280548572587122 31.561920205925162,-106.280811 31.562061999999997,-106.287785 31.584444999999999,-106.292254713772053 31.594651759250389,-106.295141086978958 31.601242900860864,-106.303535999999994 31.620412999999996,-106.308594276522342 31.627497440426588,-106.330970256390501 31.658836434185069,-106.33473699999999 31.664111999999999,-106.338265602146336 31.671883697950737,-106.346992532059133 31.691104641686092,-106.349537999999995 31.696711,-106.357472918704602 31.702103016258707,-106.368303742040567 31.709462886938788,-106.370138999999995 31.710709999999999,-106.373839000000004 31.714809999999996,-106.378039 31.72831,-106.381039 31.732109999999999,-106.38595139194058 31.734759025425479,-106.394642915450532 31.739445961452269,-106.404086535473255 31.744538468290354,-106.417940000000002 31.752009,-106.421739999999616 31.752623660686648,-106.431540999999996 31.754208999999996,-106.434644983693715 31.755853956158482,-106.444263765046571 31.76095142933643,-106.451540999999992 31.764807999999999,-106.467641999999998 31.759607999999997,-106.470742 31.753508,-106.472156160715315 31.752506597443457,-106.47367184987327 31.751433300058491,-106.475016438009845 31.750481163584279,-106.475542000000004 31.750108999999998,-106.48261401078824 31.748321568701869,-106.484641999999994 31.747809000000004,-106.486162292248409 31.747994847970777,-106.488078402545341 31.748229082678503,-106.489542 31.748407999999998,-106.507341999999994 31.761208,-106.509102011460428 31.762827435120251,-106.511609062807707 31.765134242258316,-106.523643000000007 31.776206999999996,-106.528643000000002 31.781807,-106.528542999999999 31.783906999999996,-106.528542999999999 31.784407000000002,-106.527996999999999 31.786944999999999,-106.527623000000006 31.789119000000003,-106.527737999999985 31.789760999999995,-106.527942999999993 31.790507000000002,-106.530514999999994 31.792103,-106.532480000000007 31.791913999999998,-106.533 31.791829,-106.533043000000006 31.791906999999995,-106.534743000000006 31.796106999999999,-106.535154000000006 31.797088999999996,-106.535342999999997 31.797507,-106.535842999999986 31.798607,-106.542096999999998 31.802145999999997,-106.542143999999993 31.802106999999996,-106.544713999999999 31.804286999999999,-106.545344 31.805007,-106.546561898485905 31.806561850400339,-106.546615562760394 31.806630361790774,-106.547143999999989 31.807304999999996,-106.551861034152338 31.808599471053657,-106.558443999999994 31.810406,-106.560680020141419 31.810752754512048,-106.560847305685968 31.810778696593822,-106.562944999999999 31.811104,-106.56344399999999 31.812605999999995,-106.566844000000003 31.813305999999997,-106.569123704016391 31.811582321353455,-106.570943999999997 31.810205999999997,-106.577243999999993 31.810406,-106.581344 31.813905999999996,-106.582144 31.815505999999999,-106.588044999999994 31.822105999999998,-106.589044999999984 31.822705999999997,-106.593826000000007 31.824901,-106.602727000000002 31.825023999999996,-106.605266999999998 31.827911999999998,-106.603310537982878 31.834798487166189,-106.601945 31.839604999999999,-106.60204499999999 31.844404999999998,-106.605244999999982 31.845904999999998,-106.605845000000002 31.846304999999997,-106.614637000000002 31.846489999999996,-106.621857000000006 31.852854,-106.625763000000006 31.856276,-106.627808000000002 31.860592999999998,-106.629708357956787 31.861913746439043,-106.635925999999998 31.866235,-106.635879999999986 31.871514,-106.634872999999999 31.874477999999996,-106.630798999999996 31.879696999999997,-106.629271361585637 31.8835303997664,-106.629197000000005 31.883717000000004,-106.629948941610351 31.885072003811555,-106.630443527558498 31.88596325099838,-106.630530381920593 31.886119763139838,-106.630691999999982 31.886410999999999,-106.633926999999986 31.889183999999997,-106.635073463799642 31.889856364267651,-106.636317332120683 31.890585853164694,-106.638154 31.891662999999998,-106.638364165758659 31.89171923904625,-106.642899999999983 31.892932999999999,-106.645296000000002 31.894859,-106.645645999999999 31.895648999999995,-106.645478999999995 31.898669999999999,-106.640839999999997 31.904598,-106.63512839833713 31.908732779117901,-106.633668 31.90979,-106.633408736085542 31.909871832166754,-106.625946999999996 31.912227,-106.62344499999999 31.914034,-106.618336531290581 31.916262323146238,-106.614677480394235 31.917858407661853,-106.614345999999998 31.918002999999995,-106.611846 31.920003,-106.616063629645311 31.921863544491501,-106.623932999999994 31.925334999999997,-106.624022586877501 31.92530240401349,-106.628663000000003 31.923614,-106.629746999999995 31.926570000000002,-106.625321999999983 31.930053000000004,-106.622529 31.934863000000004,-106.622117000000003 31.936620999999999,-106.622377 31.940863,-106.623659000000004 31.945509999999995,-106.616135999999983 31.948439,-106.614701999999994 31.956,-106.617707999999993 31.956008,-106.622819000000007 31.952891,-106.625123000000002 31.954530999999999,-106.625534999999985 31.957475999999996,-106.624298999999993 31.961054,-106.620453999999981 31.963402999999996,-106.619370999999987 31.964777000000005,-106.618745000000004 31.966954999999995,-106.619568999999998 31.971578,-106.621872999999994 31.972933,-106.623215999999999 31.972909999999999,-106.626465999999994 31.97069,-106.630114000000006 31.971257999999999,-106.638186000000005 31.976819999999996,-106.639528999999996 31.980347999999996,-106.63649199999999 31.985719,-106.631181999999995 31.989809,-106.629494617643616 31.990072722748106,-106.628337072326531 31.990253636712819,-106.62822051159516 31.990271854111079,-106.626910882874782 31.990476537349483,-106.623567999999992 31.990998999999999,-106.619448000000006 31.994733,-106.618486000000004 32.000494999999994,-106.599096000000003 32.000731000000002,-106.598639000000006 32.000753999999993,-106.595332999999997 32.000777999999997,-106.587971999999979 32.000748999999999,-106.582805114232855 32.000751357586125,-106.566056000000003 32.000759000000002,-106.565141999999994 32.000736000000003,-106.564298514026802 32.00073927393025,-106.562131862706067 32.000747683631808,-106.55942760630407 32.000758180008894,-106.517043115844388 32.000922692365819,-106.411074999999983 32.001334,-106.409326934223301 32.001349629127162,-106.409108574114072 32.001351581443814,-106.394297999999992 32.001483999999998,-106.376861000000005 32.001171999999997,-106.32356972407176 32.001457096670784,-106.313306999999995 32.001511999999998,-106.205915000000005 32.001761999999999,-106.200699 32.001784999999998,-106.18183999999998 32.002049999999997,-106.125534000000002 32.002532999999993,-106.05045734599986 32.002412317859424,-105.998002999999997 32.002327999999999,-105.900599999999997 32.002099999999992,-105.886159000000006 32.001969999999993,-105.854061000000002 32.00235,-105.750527000000005 32.002206,-105.731362000000004 32.001564000000002,-105.563520259526442 32.001015604709174,-105.429281000000003 32.000577,-105.428582000000006 32.000599999999999,-105.427048999999997 32.000638000000002,-105.390395999999981 32.000607000000002,-105.340142768272344 32.000583616714373,-105.200871148394683 32.000518812363367,-105.153993999999997 32.000497000000003,-105.150310000000005 32.000497000000003,-105.14824 32.000484999999998,-105.132915999999994 32.000518,-105.131377 32.000523999999999,-105.118039999999993 32.000484999999998,-105.078604999999996 32.000532999999997,-105.077045999999996 32.000578999999995,-104.918272000000002 32.000495999999991,-104.643525999999994 32.000442999999997,-104.640917999999999 32.000396000000002,-104.531936999999999 32.000311000000004,-104.531756 32.000117000000003,-104.024520999999993 32.000010000000003,-103.980179000000007 32.000124999999997,-103.875476000000006 32.000554,-103.748317 32.000197999999997,-103.72373965094468 32.000208021677786,-103.713395184678689 32.000212239744897,-103.713395184670219 32.000212239744904,-103.713395184654971 32.000212239744911,-103.713395184639609 32.000212239744918,-103.60161412595366 32.000257819670985,-103.326500999999993 32.00036999999999,-103.278520999999998 32.000419,-103.270382999999995 32.000326,-103.267707999999999 32.000323999999992,-103.267633000000004 32.000475000000002,-103.215641000000005 32.000512999999998,-103.133028835827503 32.000473953106116,-103.088697999999994 32.000452999999993,-103.085875999999985 32.000464999999998,-103.064422999999991 32.000518,-103.064344000000006 32.087051000000002,-103.064347999999995 32.123041,-103.064421999999993 32.145006000000002,-103.064695999999998 32.522193,-103.064761000000004 32.587983,-103.064787999999993 32.600397,-103.064761000000004 32.601863000000002,-103.064814999999996 32.624536999999997,-103.064633 32.646419999999992,-103.064864 32.682647000000003,-103.064797999999996 32.690761000000002,-103.064798999999994 32.708694,-103.064826999999994 32.726627999999998,-103.064807000000002 32.777302999999996,-103.064698000000007 32.783602000000002,-103.064711000000003 32.784593,-103.064699000000005 32.827531,-103.064672000000002 32.828470000000003,-103.064888999999994 32.849359,-103.064915999999982 32.857259999999997,-103.064807000000002 32.857695999999997,-103.064862000000005 32.868346000000003,-103.064700999999985 32.879354999999997,-103.064569000000006 32.900013999999999,-103.064656999999997 32.959097,-103.064678999999998 32.964373000000002,-103.064625000000007 32.999898999999999,-103.064452000000003 33.010289999999998,-103.06398 33.038693000000002,-103.063904999999991 33.042054999999998,-103.063382198608849 33.066417104805645,-103.0628188509327 33.092668632365545,-103.062136190569035 33.12448003074244,-103.060102999999984 33.219225000000002,-103.059719999999999 33.256262,-103.059241999999998 33.260370999999992,-103.057856 33.315233999999997,-103.057486999999995 33.32947699999999,-103.056655000000006 33.388437999999994,-103.052609999999987 33.570599,-103.051664000000002 33.629489,-103.051362999999995 33.64195,-103.051535 33.650486999999998,-103.051086999999981 33.658186,-103.050532000000004 33.672407999999997,-103.050147999999993 33.701971,-103.049608000000006 33.737766,-103.049096000000006 33.746270000000003,-103.047346000000005 33.824674999999999,-103.046907000000004 33.850299999999997,-103.045643999999996 33.901536999999998,-103.045698000000002 33.90629899999999,-103.044893000000002 33.945616999999999,-103.043949999999981 33.974629,-103.043616999999998 34.003633,-103.043531000000002 34.018014,-103.043554999999984 34.032713999999991,-103.043745999999999 34.037294000000003,-103.043771000000007 34.041538000000003,-103.043720999999991 34.042319999999997,-103.043767000000003 34.043544999999995,-103.043744000000004 34.049985999999997,-103.04368599999998 34.063077999999997,-103.043515999999983 34.079382000000003,-103.043569000000005 34.087947,-103.043571175003294 34.092846731402311,-103.043572866326429 34.096656853966635,-103.04358003846437 34.112813863799865,-103.043644 34.256903,-103.043718999999982 34.289440999999997,-103.043935999999988 34.302584999999993,-103.043978999999979 34.312763999999994,-103.043947553639484 34.376410480771497,-103.043947499824213 34.37651940122479,-103.043946000000005 34.379555000000003,-103.043943999999982 34.37966,-103.043919000000002 34.380915999999992,-103.043693000000005 34.383578,-103.043629999999993 34.384689999999999,-103.043614000000005 34.384968999999998,-103.043612999999993 34.388679000000003,-103.043612999999993 34.390442,-103.043606047260084 34.391254973944719,-103.043584999999993 34.393715999999998,-103.043610999999999 34.397105000000003,-103.043582999999998 34.400677999999999,-103.043537999999998 34.405462999999997,-103.043582 34.455657000000002,-103.043587999999986 34.459662000000002,-103.043588999999997 34.459774000000003,-103.043593999999985 34.46266,-103.043434927764125 34.510540742996007,-103.043071999999981 34.619782,-103.043277851519235 34.65183038816317,-103.0432796163159 34.65210514391012,-103.043285999999995 34.653098999999997,-103.042827000000003 34.671187999999994,-103.042768999999993 34.747360999999998,-103.042770000000004 34.792223999999997,-103.042781000000005 34.850242999999999,-103.042520999999979 34.899546,-103.0425974544018 35.032467348285799,-103.042641999999987 35.109912999999999,-103.043261 35.125058000000003,-103.042519999999996 35.135596,-103.042599999999993 35.142766000000002,-103.042710999999997 35.144734999999997,-103.042568000000003 35.159317999999999,-103.042394999999999 35.178573,-103.042338999999984 35.181922,-103.042366 35.182786,-103.042377000000002 35.183149,-103.042496999999997 35.211862000000004,-103.042775000000006 35.241236999999998,-103.042366 35.250056,-103.041554000000005 35.622487,-103.041484634909168 35.651235429903174,-103.041145999999998 35.791583000000003,-103.041916999999998 35.796441000000002,-103.041715999999994 35.814072000000003,-103.042186 35.825216999999995,-103.04130499999998 35.837693999999999,-103.040823999999986 36.055230999999992,-103.041387523024824 36.229129564686382,-103.041674 36.317534000000002,-103.041745000000006 36.318266999999999,-103.041923999999995 36.500439,-103.00243399999998 36.500397)),((-96.818513748151517 28.172441936006489,-96.816443421354066 28.174808025412563,-96.791958210781445 28.188687337716829,-96.733036581469989 28.190913261798631,-96.70383764358462 28.198245729538105,-96.697421731775194 28.2029594609741,-96.702659211994316 28.211208487181011,-96.703313894801497 28.216445964862743,-96.686815839850283 28.218410020896432,-96.662461568376486 28.227313732447904,-96.66062845144161 28.228884976259902,-96.663116248646261 28.233205895474203,-96.651855673914184 28.251275190431315,-96.607991796426646 28.277069769155677,-96.608122730450688 28.280081317680857,-96.611527096272326 28.281390688369981,-96.610479598706064 28.283092866206033,-96.592934048725994 28.296972182316367,-96.581018783574592 28.302209665072866,-96.553260151988255 28.302340591484768,-96.546975176740276 28.305614018207578,-96.542130508742858 28.315958034472228,-96.528905880514458 28.322504882843088,-96.476269225261575 28.330753906512612,-96.45099839278295 28.337038879223222,-96.434107525610045 28.344764159184386,-96.418918843885365 28.35484630740093,-96.415252604940861 28.362833452872817,-96.417216660974546 28.367154372087118,-96.412895739222876 28.36951123780511,-96.403206408302779 28.371475291301415,-96.401242352269094 28.366892498964241,-96.400558825492723 28.362187299887704,-96.398667286465624 28.349166496619617,-96.397846 28.343512999999998,-96.413700000000006 28.327342999999999,-96.439098999999999 28.319051999999999,-96.495600517783487 28.293964130304811,-96.547774000000004 28.270797999999999,-96.587113635820756 28.248878526668094,-96.611036668198281 28.235548960715661,-96.621533999999983 28.229699999999998,-96.694665999999998 28.18212,-96.758140999999995 28.136872999999998,-96.830820125734775 28.079724674840076,-96.849624000000006 28.064938999999999,-96.854049189790473 28.060788472935577,-96.855594496383262 28.059339080448503,-96.859762278796424 28.055429983997605,-96.896530613737951 28.020943786452513,-96.898080497387397 28.019490100997579,-96.929052999999996 27.990439999999996,-96.96699599999998 27.950531000000002,-97.001440999999986 27.911442,-97.031660000000002 27.869974999999997,-97.041798999999997 27.852925999999997,-97.045408776308051 27.837452569961062,-97.045409609838757 27.837448997003069,-97.04598 27.835004,-97.050599498412936 27.830109781194331,-97.058265753683145 27.821987615677948,-97.076304165860961 27.802876463727326,-97.079565315161531 27.799421374709375,-97.083535350812468 27.795215242050556,-97.085211615730273 27.793439290085495,-97.085394999999991 27.793244999999999,-97.11422230692618 27.755303327915222,-97.116276999999997 27.752599,-97.117304906633777 27.751048809529347,-97.118830196202964 27.748748513687826,-97.139140047561696 27.718119138409879,-97.139351757288111 27.717799858049549,-97.143807202733072 27.711080581371732,-97.165547551982726 27.678293865995041,-97.166583141799606 27.676732088482499,-97.166681999999994 27.676583,-97.184850261879149 27.644709535797791,-97.192144670654784 27.631912600211269,-97.198729900630283 27.620359811436909,-97.201865999999995 27.614857999999998,-97.211651066704889 27.596044174137351,-97.213608899397855 27.592279833590187,-97.221943360361436 27.576255098965802,-97.265194083077162 27.493096589152017,-97.265746568141566 27.492034321708481,-97.276090999999994 27.472145,-97.304469999999995 27.407734,-97.326522999999995 27.347611999999998,-97.347445832595042 27.277936119324231,-97.350397999999998 27.268104999999998,-97.363400999999996 27.210366,-97.370941000000002 27.161165999999998,-97.377001000000007 27.101020999999999,-97.379130000000004 27.047996,-97.378361999999996 26.992877,-97.370730999999992 26.909706,-97.365301177044699 26.875333999999995,-97.365282052674758 26.875212938438843,-97.364726000000005 26.871692999999997,-97.363633430415348 26.866515420001111,-97.352028350385282 26.811520085064032,-97.35141299999998 26.808603999999999,-97.350529648372714 26.805138580575584,-97.333027999999999 26.736478999999996,-97.304204860681779 26.646364129642233,-97.300690000000003 26.635375,-97.297812715808362 26.627503004299889,-97.297022484076606 26.625340999999999,-97.287871455917369 26.600304594305239,-97.275119000000004 26.565415000000002,-97.269391999999982 26.554046,-97.269132970349304 26.553256905349773,-97.257954534248029 26.519203490608863,-97.229844 26.433568999999999,-97.223724090442104 26.411478908273114,-97.206682644704898 26.34996703527348,-97.194643999999997 26.306512999999999,-97.185844000000003 26.267102999999995,-97.177979856301576 26.220346386353309,-97.177168840972797 26.215524458900923,-97.173264999999986 26.192314,-97.170387765328073 26.167037808112223,-97.169872392484734 26.162510314053797,-97.167099005951158 26.138146416702778,-97.161470999999992 26.088705,-97.158662630175101 26.080176913346069,-97.154270970414501 26.066840900880429,-97.161462285840642 26.067639941946975,-97.169842256221145 26.077853024187579,-97.171781452365479 26.102521767945923,-97.179531587141199 26.146202099560895,-97.178745972847352 26.177103221942961,-97.183983445454302 26.214289306886101,-97.194458400817808 26.271639686993655,-97.214884565299002 26.353606215503973,-97.226930759399721 26.385554824668418,-97.240286324189555 26.405980989149626,-97.240845398636537 26.411470089808617,-97.243166933615896 26.434263367616055,-97.247618791929028 26.456260775909261,-97.254165635225121 26.471187589585856,-97.262545605605609 26.482971915638458,-97.27642492679071 26.521729238684483,-97.292399243108349 26.528014213932472,-97.310730412457033 26.556558470596535,-97.308111681228326 26.5712234060755,-97.308635417324538 26.576722756880109,-97.317015387705027 26.597672667607057,-97.318434072834165 26.60022630157264,-97.324871601690262 26.611813856840271,-97.338489044677715 26.647428701777493,-97.33639404954522 26.666021744249065,-97.345821512417203 26.700589103038251,-97.363105189274393 26.710540307081217,-97.370437657013895 26.723895871871047,-97.370961403259614 26.736203954318924,-97.367557047587525 26.740393934434408,-97.364152671616353 26.758986971196869,-97.364646278833362 26.767121661774897,-97.368866408127118 26.774699404876429,-97.370437646864346 26.781508126370166,-97.368342661881371 26.795649318140761,-97.373056398392137 26.808481136684847,-97.387459455673451 26.820789208983193,-97.383531343606066 26.875520854055946,-97.385626348888096 26.88887641440536,-97.391649435788921 26.901970109878395,-97.389554460955466 26.945964918852653,-97.390340075249313 27.05228571820243,-97.389816329003565 27.067212531879022,-97.386411973331462 27.083186832972341,-97.387459455673422 27.090519300711819,-97.390601943297412 27.094185534581555,-97.390078197051665 27.156511519247964,-97.377508246555678 27.199458835730731,-97.379865109736301 27.202863196477598,-97.386673841379576 27.204696313412462,-97.382221972916923 27.229050589961044,-97.37488951532697 27.25026236588155,-97.373318276589728 27.276449754290233,-97.372896734486858 27.277942715507475,-97.367033301341749 27.298709035706306,-97.36467643816114 27.302637142698917,-97.359962701650375 27.304732132756659,-97.357605838469766 27.307874620380655,-97.362319574980518 27.32672953597509,-97.366771423144115 27.333276389420721,-97.36179581858525 27.359987519000377,-97.346607126710992 27.390364889744752,-97.336132171347501 27.402411088920228,-97.331156576938184 27.412362295500575,-97.329585328051422 27.418123524502818,-97.330894688591016 27.425455992242295,-97.329847196099536 27.434359703793774,-97.317277255753083 27.463689574751687,-97.293708603647858 27.497209429631152,-97.282971770086746 27.521563701104967,-97.267627232015485 27.541048841138782,-97.26651977444007 27.542455137362143,-97.266473727822444 27.542513609294531,-97.257831889393842 27.556392930479635,-97.261144559602045 27.562355746269706,-97.261759991311692 27.563463525096239,-97.260450620622564 27.56739163716362,-97.260303240478223 27.567589679048492,-97.252732825146552 27.577762415194865,-97.252070650242061 27.578652211895708,-97.247885553160842 27.581360217573209,-97.247618802078478 27.581532821322067,-97.236881968517352 27.598292751933528,-97.24107194863285 27.602482732049012,-97.241084821027414 27.602523494839662,-97.242643187370078 27.607458346757408,-97.231683715414945 27.631671123728168,-97.231553918442799 27.631957884363242,-97.231382612637987 27.632336350521356,-97.221955159915538 27.632860099304484,-97.221711030183002 27.632638163711842,-97.219074540339648 27.630241360463614,-97.217418907944051 27.630677052710489,-97.214098935780783 27.631550728615359,-97.200743370990949 27.650143776161688,-97.197339005169326 27.664546838517776,-97.19760088336696 27.678426154628117,-97.203474366386629 27.684532651921231,-97.20308902068453 27.688000774441392,-97.200450811776179 27.688974477466285,-97.190006537429824 27.692829222058965,-97.188284576858237 27.695272543577584,-97.170627865440125 27.720325976082009,-97.166176017276527 27.732372180332245,-97.161200407642937 27.734074342943998,-97.153606061705801 27.733288721037997,-97.147321086457822 27.735383711095739,-97.130823034043985 27.751619892924076,-97.127942424617643 27.75580987303956,-97.127680546420009 27.759999858229808,-97.125046985317312 27.763143140340585,-97.103326269871417 27.789067861139614,-97.102999946318647 27.791923200131116,-97.10255066693685 27.795854405604921,-97.102495980878558 27.796332909939515,-97.102278777379922 27.798233445813956,-97.100865886772965 27.802472121847156,-97.098874421707819 27.808446522979796,-97.095168997779496 27.812151946908138,-97.092851314507953 27.81446963017968,-97.092589446459854 27.819183356540908,-97.098874421707819 27.822849590410645,-97.104263831428213 27.822227735056668,-97.126109297533233 27.819707102786651,-97.130299287798252 27.820492727230029,-97.134489267913736 27.825206463740791,-97.132394272781227 27.827301438574235,-97.10670775348396 27.832389859144307,-97.087681973298601 27.836158807756469,-97.056712719518927 27.842293721800239,-97.055822986229373 27.843403727743151,-97.04322620548075 27.859119113080268,-97.013634476624247 27.906780143237341,-97.017955395838555 27.911493874673329,-97.016384146951765 27.917255079570445,-96.985744902767337 27.954048356415132,-96.977888688782102 27.976438572489602,-96.978805242174786 27.978271691961854,-96.980900237307296 27.978271691961854,-96.986006780964971 27.976176699366729,-96.986661461234775 27.980759491703903,-96.978281501003806 28.001709402430844,-96.967806540565562 28.020040576854303,-96.966759042999328 28.020367911280101,-96.965187799187319 28.013297317932185,-96.962569062883844 28.012380759464751,-96.952617853766114 28.01643980428749,-96.946987563862692 28.02652194996665,-96.932453562407773 28.035425661518129,-96.926430465357427 28.043412814602167,-96.929572952981431 28.051399967686208,-96.927085150701998 28.057292130712504,-96.906004298338829 28.076147047258459,-96.890946545563423 28.076801730065643,-96.886232814127425 28.084396073465374,-96.88832780925992 28.086622002621937,-96.889113433703315 28.099453823703399,-96.886887499471996 28.117130312782294,-96.879424092633712 28.131402425890027,-96.874972236857971 28.133235547899659,-96.87078225420511 28.13127149186597,-96.86462821551855 28.126295887307109,-96.857164811217643 28.115559058820768,-96.845380482627661 28.108881273888468,-96.830128556765757 28.111822717849165,-96.827049318353744 28.112416571196771,-96.816574357915513 28.119618104912195,-96.810420321766344 28.126034014184238,-96.810944073086844 28.136378030448888,-96.816836228500989 28.158048094801106,-96.820248352517055 28.163388807027481,-96.822859330626116 28.167475552598326,-96.818513748151517 28.172441936006489)))');
\ No newline at end of file
diff --git a/webapp/django/contrib/gis/tests/geoapp/sql/ks.wkt b/webapp/django/contrib/gis/tests/geoapp/sql/ks.wkt
new file mode 100644
index 0000000..8bfd38c
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/geoapp/sql/ks.wkt
@@ -0,0 +1 @@
+POLYGON ((-102.051743999999999 40.003078000000002,-101.916696000000002 40.003141999999997,-101.904176000000007 40.003162000000003,-101.861740775252272 40.002907997451267,-101.841025000000002 40.002783999999991,-101.832160999999999 40.002932999999999,-101.807687 40.002797999999999,-101.804861999999986 40.002752,-101.783266423091504 40.002735966476642,-101.748492901329186 40.002710149056902,-101.627071 40.00262,-101.625809000000004 40.002710999999998,-101.579641080501318 40.002654627564297,-101.54227299999998 40.002608999999993,-101.417209 40.002423999999998,-101.411050023557621 40.002364583193085,-101.409952999999987 40.002353999999997,-101.387325211262052 40.00246006676732,-101.374325999999996 40.002520999999994,-101.342859000000004 40.002580000000002,-101.324035999999992 40.002695999999993,-101.293991000000005 40.002558999999998,-101.286555000000007 40.002558999999998,-101.248672999999997 40.002543000000003,-101.215033000000005 40.002555,-101.19221899999998 40.002490999999999,-101.186892990733696 40.002481867883319,-101.178804999999997 40.002468,-101.168704000000005 40.002547,-101.130906999999993 40.002426999999997,-101.104950380573442 40.002382874850099,-101.104950380567658 40.002382874850092,-101.060316999999998 40.002307000000002,-101.027686000000003 40.002255999999996,-100.962089380046322 40.00217532965339,-100.937427 40.002144999999999,-100.764559455237134 40.002296963384197,-100.758829999999989 40.002301999999993,-100.752183000000002 40.002127999999992,-100.7388309887763 40.002228385746484,-100.733295999999996 40.002270000000003,-100.729904000000005 40.002110999999999,-100.721127999999993 40.002068999999999,-100.683435000000003 40.002234,-100.660229999999984 40.002161999999998,-100.645444999999995 40.001882999999999,-100.626504856699498 40.001892789287538,-100.600944999999996 40.001905999999998,-100.594756999999987 40.001976999999997,-100.567238000000003 40.001888999999998,-100.551885999999996 40.001888999999998,-100.514429898999168 40.001844039098764,-100.511064999999988 40.00184,-100.487159000000005 40.001767,-100.477018 40.001752000000003,-100.475853999999998 40.001767999999998,-100.468772999999985 40.001724000000003,-100.447071999999991 40.001795,-100.439081000000002 40.001773999999997,-100.402449685831499 40.001800164690437,-100.390079999999998 40.001809000000002,-100.290126736823893 40.001691651381378,-100.231651999999997 40.001623000000002,-100.229478999999998 40.001692999999996,-100.215406000000002 40.001629,-100.196958999999993 40.001494,-100.19359 40.001573,-100.190323000000006 40.001586000000003,-100.188181 40.001541000000003,-100.177823000000004 40.001593,-99.990926000000002 40.001503,-99.986610999999996 40.001550000000002,-99.948166999999998 40.001812999999999,-99.944417 40.001584,-99.930432999999979 40.001516000000002,-99.906657999999993 40.001511999999998,-99.850154757615712 40.001444140609848,-99.813400999999999 40.001399999999997,-99.775639999999981 40.001646999999998,-99.772120999999984 40.001804,-99.764213999999996 40.001550999999999,-99.756834999999995 40.001342,-99.746628 40.001820000000002,-99.737774855821357 40.001824224692157,-99.731959000000003 40.001826999999992,-99.719639 40.001807999999997,-99.628345999999993 40.001866,-99.625979999999984 40.001865000000002,-99.515340365578794 40.002008435606839,-99.501791999999995 40.002026,-99.498998999999984 40.00195699999999,-99.497659999999982 40.001911999999997,-99.493464999999986 40.001936999999998,-99.480727999999999 40.001942,-99.423564999999996 40.002270000000003,-99.412644999999998 40.001867999999995,-99.403389000000004 40.001969000000003,-99.366747146128873 40.001962496644857,-99.290702999999979 40.001949000000003,-99.286655999999994 40.002017000000002,-99.282966999999999 40.001879000000002,-99.254012000000003 40.002074,-99.25036999999999 40.00195699999999,-99.216375999999997 40.002015999999998,-99.197591999999986 40.002032999999997,-99.188905000000005 40.002023,-99.186961999999994 40.001976999999997,-99.178965000000005 40.001976999999997,-99.169815999999997 40.001925,-99.123032999999992 40.002164999999998,-99.113510000000005 40.002192999999998,-99.085596999999993 40.002132999999994,-99.067047050731574 40.00217023690761,-99.020337999999995 40.00226399999999,-99.018700999999993 40.002333,-98.992135000000005 40.002192,-98.972286999999994 40.002245000000002,-98.971721000000002 40.002268,-98.961009000000004 40.002316999999998,-98.96091899999999 40.002271,-98.953888072580213 40.002253239016738,-98.934791999999987 40.002204999999996,-98.8435956659672 40.002348607685946,-98.842134005327992 40.002350909376077,-98.834455999999989 40.002363000000003,-98.820589999999982 40.002319,-98.777203 40.002358999999998,-98.774940999999998 40.002336,-98.729330606936671 40.002229113826232,-98.726294999999993 40.002222000000003,-98.710403999999997 40.002180000000003,-98.693095999999997 40.002372999999999,-98.691443000000007 40.002504999999999,-98.690286999999998 40.002547999999997,-98.672819000000004 40.002364,-98.669723999999988 40.002409999999998,-98.653832999999992 40.002268999999998,-98.652494000000004 40.002245000000002,-98.640709999999984 40.002493,-98.616372379820518 40.002409030470169,-98.613754999999998 40.002400000000002,-98.593342000000007 40.002475999999994,-98.575219000000004 40.002479999999991,-98.560578000000007 40.002274,-98.543186000000006 40.002285,-98.523053000000004 40.002336,-98.506634585466017 40.002329436673158,-98.504454999999979 40.002328565375151,-98.50084801790743 40.002327123469641,-98.490532999999999 40.002322999999997,-98.441997554675297 40.002366263566756,-98.391848301995964 40.002410965650498,-98.274015000000006 40.002516,-98.268218000000005 40.002490000000002,-98.25000799999998 40.002307000000002,-98.213290432425865 40.002506421375415,-98.193483 40.002614,-98.179315000000003 40.002482999999998,-98.172269 40.002437999999991,-98.156873151934732 40.002445128178877,-98.142031000000003 40.002451999999998,-98.099659000000003 40.002226999999998,-98.076034000000007 40.002300999999996,-98.068701000000004 40.002355,-98.050056999999981 40.002277999999997,-98.047469000000007 40.002186000000002,-98.042767978165202 40.002191261754177,-98.014411999999979 40.002223,-98.010157000000007 40.002153,-97.972185999999994 40.002113999999999,-97.931810999999996 40.002049999999997,-97.876261 40.002102,-97.85745 40.002065000000002,-97.838378999999989 40.001909999999995,-97.821597999999994 40.002003999999992,-97.819426000000007 40.001957999999995,-97.777154999999993 40.002167,-97.770775999999998 40.001976999999997,-97.769204000000002 40.001995,-97.767746000000002 40.001994000000003,-97.714825952022949 40.001974503868432,-97.706952472912022 40.001971603221314,-97.701160424072398 40.001969469388285,-97.61370959051284 40.001937251863488,-97.595964207410262 40.001930714334961,-97.593671575073259 40.001929869712491,-97.51530799999999 40.001900999999997,-97.511381 40.001899000000002,-97.510264000000006 40.001835,-97.48896951184885 40.0019310946697,-97.481234094494141 40.001966001936331,-97.463284999999999 40.00204699999999,-97.444661999999994 40.001957999999995,-97.425443 40.002048000000002,-97.417825999999991 40.002023999999999,-97.415833000000006 40.002000999999993,-97.369102999999996 40.00206,-97.350896000000006 40.001930000000002,-97.350272000000004 40.001975999999999,-97.256541388870858 40.001563097676062,-97.24516899999999 40.001513000000003,-97.245080000000002 40.001466999999998,-97.202309999999997 40.00144199999999,-97.200190000000006 40.001548999999997,-97.181775000000002 40.001550000000002,-97.165136038800085 40.001526729909067,-97.164288093539042 40.001525544031956,-97.157705785150654 40.001516338474417,-97.144150390621661 40.001497380844818,-97.142447999999987 40.001494999999998,-97.137865999999988 40.001814000000003,-97.049662999999995 40.001322999999999,-97.030802999999992 40.001342,-97.009164999999996 40.001463,-96.918187714380807 40.001505032225388,-96.916093000000004 40.001505999999999,-96.880459000000002 40.001448000000003,-96.878253 40.001466,-96.875056999999998 40.001448000000003,-96.873812 40.001449999999998,-96.868892342573133 40.001444286089438,-96.805301797100199 40.001370429180717,-96.693246065483095 40.001240282633297,-96.622400999999996 40.001157999999997,-96.610348999999999 40.000881,-96.604883999999984 40.000891000000003,-96.581788013355691 40.000963078853125,-96.580851999999993 40.000965999999998,-96.570853999999997 40.001090999999995,-96.557862999999998 40.000968,-96.538977000000003 40.000850999999997,-96.527110999999991 40.001030999999998,-96.469944999999996 40.000965999999998,-96.467535999999996 40.001035000000002,-96.463639999999998 40.000967000000003,-96.354812913341547 40.000735780492882,-96.350953725714731 40.00072758106856,-96.341811057717251 40.000708156095854,-96.304554999999993 40.000629000000004,-96.301066000000006 40.000632000000003,-96.239171999999996 40.000691000000003,-96.223838999999998 40.000729,-96.220170999999993 40.00072,-96.154364999999984 40.000495,-96.154246 40.00045,-96.147166999999982 40.000478999999999,-96.125936999999979 40.000432000000004,-96.125788 40.000467,-96.089781000000002 40.000518999999997,-96.081394999999986 40.000602999999998,-96.051691000000005 40.000726999999998,-96.02409 40.000718999999997,-96.014716997898134 40.000662392993569,-96.010677999999999 40.000638000000002,-95.995389500007406 40.000603953777215,-95.958139000000003 40.000520999999999,-95.901560435593936 40.000482839492363,-95.882524000000004 40.00047,-95.788023999999993 40.000452000000003,-95.784575000000004 40.000463000000003,-95.672891827756033 40.000336669594915,-95.658762261555324 40.000320686938032,-95.63965170807073 40.000299070038061,-95.565216789143676 40.000214872989645,-95.463103327781397 40.00009936736172,-95.455130658279359 40.000090349077695,-95.452048066669519 40.000086862204618,-95.438655850967621 40.000071713601649,-95.436011808705814 40.000068722793607,-95.426269559489981 40.00005770284973,-95.42148745056565 40.000052293567869,-95.41484447973599 40.000044779372317,-95.375257000000005 40.0,-95.339895999999982 39.999999000000003,-95.326448603970363 39.999998574530281,-95.30829 39.999997999999998,-95.308403999999996 39.993758,-95.307779999999994 39.990617999999998,-95.307111000000006 39.989114,-95.302506999999991 39.984357000000003,-95.289715 39.977705999999998,-95.274756999999994 39.972115000000002,-95.269885999999985 39.969396000000003,-95.261854 39.960617999999997,-95.257651999999993 39.954886000000002,-95.250253999999998 39.948644000000002,-95.241382999999999 39.944949,-95.236761 39.943930999999999,-95.231114000000005 39.943784,-95.220212000000004 39.944432999999997,-95.216440000000006 39.943953,-95.213736999999995 39.943205999999996,-95.204427999999993 39.938949,-95.201277000000005 39.934193999999998,-95.200689999999994 39.928154999999997,-95.20201 39.922438,-95.205744999999993 39.915168999999999,-95.206326000000004 39.912120999999999,-95.206195999999991 39.909557,-95.205732999999981 39.908275000000003,-95.202631127107011 39.904826841138963,-95.201935000000006 39.904052999999998,-95.19982446963148 39.902956959499498,-95.199773390195176 39.902930432929807,-95.199730682369619 39.902908253904485,-95.199347000000003 39.902709000000002,-95.193815999999984 39.900689999999997,-95.189565000000002 39.899959000000003,-95.179452999999995 39.900061999999991,-95.172296000000003 39.902025999999999,-95.159833999999989 39.906984,-95.156023999999988 39.907243,-95.153185481864639 39.906665666721331,-95.151701132402337 39.906363761184394,-95.149656999999991 39.905947999999995,-95.148243978290679 39.905255611516672,-95.146055000000004 39.904183000000003,-95.143801999999994 39.901917999999995,-95.142562999999981 39.897992000000002,-95.142444999999995 39.895419999999994,-95.143403000000006 39.889355999999992,-95.142718000000002 39.885888999999992,-95.140601000000004 39.88168799999999,-95.137091999999996 39.878350999999995,-95.134747000000004 39.876852,-95.128165999999993 39.874164999999998,-95.105912000000004 39.869163999999998,-95.090958483530287 39.863446088154532,-95.090158000000002 39.86314,-95.085003 39.861882999999999,-95.081534000000005 39.861718000000003,-95.079786043666886 39.861878094210859,-95.052535000000006 39.864373999999998,-95.042141999999998 39.864804999999997,-95.037767000000002 39.865541999999998,-95.034318031759739 39.867229060943565,-95.032053000000005 39.868336999999997,-95.031002514960235 39.869148692103728,-95.027930999999981 39.871521999999999,-95.025918959417425 39.87568321107333,-95.025422000000006 39.876711,-95.025119000000004 39.878833,-95.02586205726584 39.885935119809076,-95.025947000000002 39.886747,-95.025771840138887 39.887478608302466,-95.025475064075451 39.888718183571669,-95.025239999999997 39.889699999999998,-95.024388999999999 39.891202,-95.021897459019584 39.893924778577606,-95.019088516216428 39.896994416745422,-95.018742999999986 39.89737199999999,-95.018224596337973 39.897611313155366,-95.013151999999991 39.899952999999996,-95.010684182587667 39.900289758615472,-95.008439999999993 39.900596,-95.003818999999993 39.900400999999995,-94.990284000000003 39.897010000000002,-94.989784913598129 39.896958718834505,-94.987823822157509 39.896757216540813,-94.986975 39.89667,-94.985308455245701 39.896814869812808,-94.979390624873346 39.897329296428744,-94.977748999999989 39.897472,-94.963345000000004 39.901136,-94.959276000000003 39.901671,-94.958440298615102 39.901548064610132,-94.95153999999998 39.900532999999996,-94.943866999999983 39.898130000000002,-94.935306395585215 39.893779379194363,-94.934493000000003 39.893366,-94.929574000000002 39.888753999999992,-94.927897000000002 39.88611199999999,-94.927358999999996 39.883966,-94.927251999999996 39.880257999999991,-94.928466 39.876344000000003,-94.931084167287821 39.873075003673321,-94.931462999999994 39.872602,-94.938790999999995 39.866954,-94.940742999999998 39.864409999999999,-94.942407000000003 39.861065999999994,-94.942566999999983 39.856601999999995,-94.939767000000003 39.851930000000003,-94.937655000000007 39.849786000000002,-94.926149999999993 39.841321999999998,-94.916917999999995 39.836137999999998,-94.909941999999987 39.834426,-94.903156999999979 39.833849999999998,-94.892677000000006 39.834377999999994,-94.889493000000002 39.834026,-94.886932999999999 39.833098,-94.881012999999996 39.828921999999991,-94.878676999999996 39.826521999999997,-94.877043999999998 39.823754,-94.876543999999996 39.820594,-94.875944000000004 39.813293999999999,-94.87632679569893 39.807169268817198,-94.876344000000003 39.806894,-94.876705972386588 39.80614007495069,-94.880932 39.797338000000003,-94.884084 39.794234000000003,-94.890292000000002 39.791626,-94.892965000000004 39.791097999999991,-94.912908274541266 39.790276806342419,-94.92474489359239 39.789789416146199,-94.925605000000004 39.789753999999995,-94.925940683661906 39.789631963361245,-94.927258709273417 39.789152799691166,-94.929653999999999 39.788281999999995,-94.93035270914757 39.787827111232048,-94.930442023078356 39.787768964141691,-94.930979872832452 39.787418801541357,-94.932726000000002 39.786282,-94.932913349551853 39.786043884763131,-94.935059195246907 39.783316584105528,-94.935205999999994 39.78313,-94.935782000000003 39.778905999999999,-94.935301999999993 39.77561,-94.935036741896766 39.775108050050804,-94.934624304242575 39.774327591105198,-94.934262000000004 39.773642000000002,-94.929652999999988 39.769098,-94.929421387607832 39.768921584953624,-94.928626586797606 39.768316199289764,-94.926229000000006 39.76648999999999,-94.923991330811134 39.765173947104167,-94.916788999999994 39.760937999999996,-94.912293000000005 39.759337999999993,-94.906244 39.759417999999997,-94.905921454535701 39.759501730763866,-94.900921941190049 39.760799572828766,-94.899156000000005 39.761257999999998,-94.899025621234756 39.761323457651685,-94.895268000000002 39.76321,-94.895041000000006 39.763350000000003,-94.894070999999997 39.763945999999997,-94.893918999999997 39.76404,-94.893724000000006 39.764159999999997,-94.893646000000004 39.764208000000004,-94.883923999999993 39.770186000000002,-94.881460000000004 39.771258000000003,-94.881422 39.771258000000003,-94.874706321154179 39.772392308082928,-94.871144 39.772993999999997,-94.869643999999994 39.772894,-94.867142999999999 39.771693999999997,-94.865243000000007 39.770094,-94.863142999999994 39.767294,-94.860742999999999 39.763094000000002,-94.859442999999999 39.753694000000003,-94.860369889104035 39.749534984666809,-94.860371 39.74953,-94.862942999999987 39.742994000000003,-94.870142999999999 39.734594,-94.875642999999997 39.730494,-94.884142999999995 39.726793999999998,-94.891743999999989 39.724893999999999,-94.899315999999999 39.724041999999997,-94.900553640444031 39.724102079633198,-94.901582061073228 39.724152002964722,-94.902612000000005 39.724201999999998,-94.906055088082866 39.724933471502588,-94.907014260749904 39.725137244236571,-94.907785666538786 39.725301126582274,-94.910067999999995 39.725785999999999,-94.911087398893699 39.726157408899255,-94.918323999999998 39.728793999999994,-94.93000499999998 39.735370000000003,-94.939221000000003 39.74157799999999,-94.944740999999979 39.744377,-94.948658825773634 39.745572502168315,-94.948680784417533 39.745579202723142,-94.948725999999994 39.745593,-94.952629999999999 39.745961,-94.955286 39.745688999999999,-94.960086000000004 39.743065,-94.963779819772341 39.740240978767318,-94.964692434782606 39.73954326086956,-94.965317999999982 39.739064999999989,-94.965565209393333 39.738728671232884,-94.970224508542714 39.732389687437191,-94.970421999999985 39.732120999999999,-94.971205999999981 39.729304999999997,-94.971078000000006 39.723146,-94.968452999999997 39.707402000000002,-94.968980999999999 39.692954,-94.969909 39.689050000000002,-94.971316999999999 39.686410000000002,-94.976096392737759 39.68160006801152,-94.976325000000003 39.68137,-94.981556999999995 39.678634000000002,-94.984149000000002 39.677849999999992,-94.986445080691666 39.677537608069159,-94.990587390516794 39.676974028501114,-94.993556999999996 39.676569999999998,-94.998766892420107 39.676509388876212,-95.001379 39.676479,-95.004602740773237 39.676177881356345,-95.008105239221649 39.675850724907868,-95.009022999999999 39.675764999999998,-95.010225986948086 39.675477408241932,-95.013209713780839 39.674764104372102,-95.015309999999985 39.674261999999999,-95.018317999999994 39.672868999999999,-95.021521942351953 39.670631293568427,-95.024595000000005 39.668484999999997,-95.027643999999995 39.665453999999997,-95.037464 39.652904999999997,-95.039049000000006 39.649639,-95.044554000000005 39.644370000000002,-95.049518000000006 39.637875999999999,-95.053366999999994 39.630347,-95.054924999999997 39.624994999999991,-95.055024819926729 39.623527163368095,-95.055152000000007 39.621656999999992,-95.054958456554544 39.620961328886679,-95.053131423647116 39.614394255464305,-95.053011999999981 39.613965,-95.052555891387243 39.613278556984888,-95.047910999999999 39.606287999999999,-95.046445000000006 39.601605999999997,-95.046361000000005 39.599556999999997,-95.047165000000007 39.595117000000002,-95.049277000000004 39.589582999999998,-95.054804000000004 39.582487999999998,-95.056897000000006 39.580567000000002,-95.059518999999995 39.579132,-95.064519000000004 39.577114999999999,-95.066275551338904 39.576786470694117,-95.068266439890465 39.576414113098046,-95.069315000000003 39.576217999999997,-95.072159999999982 39.576121999999991,-95.075842551355763 39.576644128527029,-95.076688000000004 39.576763999999997,-95.088569515113861 39.580713698327401,-95.089515000000006 39.581028000000003,-95.09068217809525 39.58095107619048,-95.095736000000002 39.580618,-95.099095000000005 39.579690999999997,-95.100375015351446 39.579100080742663,-95.10182940536555 39.578428661399109,-95.103228 39.577782999999997,-95.106109962410699 39.575487768136732,-95.106244982404746 39.575380236480051,-95.106274453941239 39.575356764970024,-95.106406000000007 39.575251999999999,-95.107454000000004 39.573842999999997,-95.108931052511622 39.56997896968771,-95.109155613535791 39.569391508783276,-95.112830712234896 39.559777298955126,-95.112877844119652 39.559653999999995,-95.113077000000004 39.559132999999996,-95.113262990573148 39.557121201967142,-95.113516735173974 39.554376531201555,-95.113557 39.553940999999995,-95.113330390574859 39.553319942050457,-95.109694540741444 39.543355336910984,-95.109303999999995 39.542284999999993,-95.106595999999996 39.537657000000003,-95.106363136618171 39.537386330858773,-95.106309238275287 39.537323682029822,-95.102887999999993 39.533346999999999,-95.096713422649174 39.527826015970483,-95.095319522838992 39.526579663685382,-95.092703999999998 39.524241000000004,-95.082713999999996 39.516711999999998,-95.077440999999993 39.513551999999997,-95.059460999999985 39.506143000000002,-95.05637999999999 39.503971999999997,-95.052176999999986 39.499995999999996,-95.050551999999996 39.497514000000002,-95.049844999999991 39.494414999999989,-95.048370000000006 39.480420000000002,-95.047133000000002 39.474970999999996,-95.045715999999999 39.472459,-95.040779999999998 39.466386999999997,-95.03749999999998 39.463689000000002,-95.033407999999994 39.460875999999992,-95.028497999999999 39.458286999999999,-95.015825000000007 39.452809000000002,-94.995767999999998 39.448174000000002,-94.990172 39.446192000000003,-94.982144000000005 39.440551999999997,-94.978797999999998 39.436241000000003,-94.976606000000004 39.426701,-94.972952000000006 39.421705000000003,-94.968547467194298 39.418879728230785,-94.966981164652054 39.417875029083376,-94.966065999999998 39.417287999999999,-94.965430539155946 39.417093446959996,-94.954817000000006 39.413843999999997,-94.951209000000006 39.411706999999993,-94.947863999999996 39.408603999999997,-94.946292999999983 39.405645999999997,-94.946662000000003 39.399717000000003,-94.946226999999993 39.395648,-94.945577 39.393850999999998,-94.942038999999994 39.389499,-94.939696999999995 39.387949999999996,-94.938205659338905 39.38711651736979,-94.938199994953891 39.387113351650086,-94.938198708293527 39.387112632559479,-94.937157999999982 39.386530999999998,-94.933651999999995 39.385545999999998,-94.932170703908099 39.385397898493565,-94.923109999999994 39.384492000000002,-94.919224999999997 39.385173999999999,-94.915858999999998 39.386347999999998,-94.909581000000003 39.388865000000003,-94.901822999999993 39.392797999999999,-94.896448416922993 39.39340032396553,-94.894979000000006 39.393565000000002,-94.891845000000004 39.393312999999999,-94.888971999999995 39.392431999999999,-94.888058227506249 39.391822741147728,-94.885025999999996 39.389800999999999,-94.880978999999996 39.383899,-94.879281000000006 39.37977999999999,-94.879087999999996 39.375702999999994,-94.881359999999987 39.370382999999997,-94.885216 39.366911000000002,-94.890928000000002 39.364030999999997,-94.896832000000003 39.363135,-94.899023999999997 39.362431,-94.902496999999997 39.360382999999999,-94.90716104958679 39.35683832231404,-94.907297 39.356735,-94.907510470967722 39.356484333333356,-94.909408999999997 39.354254999999995,-94.910016999999996 39.352542999999997,-94.91007929967077 39.352122876579188,-94.910166635146069 39.351533921963672,-94.910234386079424 39.351077037464393,-94.910640999999998 39.348334999999999,-94.910055514481613 39.342727430625168,-94.908683540921714 39.329587162119807,-94.908064999999993 39.323663000000003,-94.906599414484603 39.317389801180319,-94.905982468129508 39.31474906332776,-94.905548856768945 39.312893060899633,-94.905328999999995 39.311951999999998,-94.904604536115073 39.31007473956825,-94.903592654247163 39.307452709910535,-94.903137 39.306272,-94.902341179156608 39.304705098857582,-94.900693838394318 39.301461629999167,-94.900362755471093 39.300809756886117,-94.900048999999996 39.300192000000003,-94.895217000000002 39.29420799999999,-94.889432625546704 39.288730528394183,-94.887056 39.286479999999997,-94.882576 39.283327999999997,-94.881425972827699 39.282735692772164,-94.879585687759075 39.281787876778168,-94.878319999999988 39.281135999999996,-94.869470269042495 39.278423959123423,-94.867567999999991 39.277841000000002,-94.866576416802303 39.277461598502107,-94.857072000000002 39.273825000000002,-94.850573678793964 39.270595179638669,-94.850470600187833 39.270543947117169,-94.846320000000006 39.268481,-94.844203868589133 39.266965084952687,-94.840994595225254 39.264666085108807,-94.837855000000005 39.262416999999999,-94.836102527271095 39.260730409704507,-94.834879550067882 39.259553409087879,-94.832501320107042 39.257264586268427,-94.832102355305352 39.256880620143498,-94.831470999999993 39.256273,-94.827487000000005 39.249888999999996,-94.826571473591798 39.245793223963304,-94.825663000000006 39.241728999999999,-94.826110999999983 39.238289000000002,-94.826405091238243 39.237538367125239,-94.827108391663188 39.2357432765168,-94.827791000000005 39.234000999999999,-94.828117769197533 39.233533772937683,-94.83244435695299 39.227347452739551,-94.834698551534771 39.224124319346686,-94.834896 39.223841999999998,-94.834917496024659 39.223414229109203,-94.835039139715306 39.220993519665384,-94.835046603087861 39.220844998551456,-94.835055999999994 39.220658,-94.833551999999997 39.217793999999998,-94.831678999999994 39.215938,-94.823791 39.209873999999999,-94.820687000000007 39.208626000000002,-94.811662999999996 39.206594000000003,-94.800359054554335 39.206051410618606,-94.799662999999995 39.206018,-94.798924306591658 39.206116812235138,-94.793913945984244 39.206787029303406,-94.788135068391796 39.207560047994349,-94.787343000000007 39.207666000000003,-94.783838000000003 39.207154000000003,-94.781518000000005 39.206145999999997,-94.780294078498926 39.205273290755756,-94.778971577769184 39.204330290235411,-94.777838000000003 39.203522,-94.775537999999997 39.200602000000003,-94.770897097034492 39.191141697801093,-94.770859400196969 39.191064854247678,-94.770337999999995 39.190002,-94.763137999999998 39.179903000000003,-94.75233799999998 39.173202999999994,-94.74193799999999 39.170203,-94.736536999999998 39.169203000000003,-94.723636999999997 39.169002999999989,-94.714136999999994 39.170403,-94.696331999999998 39.178562999999997,-94.687235999999999 39.183503000000002,-94.680335999999983 39.184303,-94.669134999999997 39.182003000000002,-94.663835000000006 39.179102999999998,-94.660314999999997 39.168050999999991,-94.662434999999988 39.157602999999995,-94.650734999999983 39.154102999999999,-94.640034999999997 39.153102999999994,-94.623934000000006 39.156602999999997,-94.615834000000007 39.160003000000003,-94.608834000000002 39.160502999999999,-94.601732999999996 39.15960299999999,-94.596033000000006 39.157702999999998,-94.591932999999997 39.155003,-94.589933000000002 39.140402999999999,-94.592533000000003 39.135902999999992,-94.600433999999993 39.128503000000002,-94.605733999999998 39.122204000000004,-94.607033999999999 39.119404000000003,-94.607354 39.113444,-94.607234000000005 39.089604,-94.607333999999994 39.081703999999995,-94.607275518421304 39.072346947409343,-94.607234000000005 39.065703999999997,-94.607342812841125 39.057404745686583,-94.60738379566331 39.05427894858029,-94.607437239929951 39.050202705779334,-94.607518499034526 39.044004999999999,-94.607559479691474 39.040879368039988,-94.607612854426819 39.036808428453341,-94.60764748233197 39.034167326647299,-94.607654028188094 39.033668068249817,-94.60769507925167 39.030537066312085,-94.607898722639391 39.015005000000002,-94.607914652765047 39.013789994834404,-94.607991843462372 39.007902590176151,-94.608087526605189 39.000604749887366,-94.608092759229436 39.000205652880325,-94.608190956218394 38.992716079262479,-94.608212339138063 38.991085184540211,-94.608264438806202 38.98711149548862,-94.608279957450691 38.985927874365181,-94.608301211867541 38.984306780669819,-94.608333999999999 38.981805999999999,-94.608294286905348 38.97390309416464,-94.608273484679671 38.969763451253407,-94.608249262127771 38.964943163424849,-94.608207879518076 38.956708024096379,-94.608134000000007 38.942005999999999,-94.608134000000007 38.940005999999997,-94.607866 38.937398000000002,-94.607977999999989 38.936869999999992,-94.608002838442587 38.912906322207348,-94.608006216770249 38.909646973100827,-94.608010407202343 38.90560412040071,-94.608022064178897 38.894357681354862,-94.60802273861259 38.893706999999999,-94.608033000000006 38.883806999999997,-94.608033000000006 38.869207000000003,-94.608033000000006 38.868107000000002,-94.607992999999993 38.867271000000002,-94.608033000000006 38.861207,-94.608033000000006 38.855007,-94.608033000000006 38.850107,-94.608033000000006 38.847206999999997,-94.607624999999999 38.827559999999991,-94.607668973053535 38.825816299300072,-94.608041 38.811064000000002,-94.608617609754887 38.781926100280451,-94.609398999999996 38.742440000000002,-94.60945599999998 38.74069999999999,-94.609507757106428 38.73815999467709,-94.609625656590424 38.7323740198146,-94.610322172686637 38.698192151600097,-94.61071084056907 38.679118085101081,-94.61073851283922 38.677760054904219,-94.611602000000005 38.635384000000002,-94.611464999999995 38.625011,-94.611857999999998 38.620485000000002,-94.611908 38.609271999999997,-94.611905562149673 38.605890005062435,-94.611886999999996 38.580139000000003,-94.611902 38.580109999999998,-94.612176000000005 38.576546,-94.612156999999996 38.549816999999997,-94.612272000000004 38.547916999999998,-94.612464742072774 38.518760616499996,-94.612644000000003 38.491644,-94.612725999999995 38.484366999999999,-94.612696 38.483153999999999,-94.612865999999997 38.477570999999998,-94.613365000000002 38.403421999999999,-94.613264999999998 38.392426,-94.613275404637193 38.388718047420433,-94.613328999999993 38.369617999999996,-94.613311999999993 38.364407,-94.613085455228386 38.3436360393057,-94.612999999999985 38.335800999999996,-94.612825 38.324387000000002,-94.612787999999995 38.320141999999997,-94.612673 38.314832000000003,-94.612673 38.302526999999998,-94.612689368276676 38.301464114946214,-94.612843999999996 38.291422999999995,-94.612848999999997 38.289914000000003,-94.612707829046002 38.272362044447966,-94.612691999999996 38.270394000000003,-94.612613999999994 38.237766,-94.612634999999997 38.226987,-94.612658999999994 38.219251,-94.61265866950464 38.21872154645218,-94.612657999999982 38.217649000000002,-94.612821999999994 38.203918000000002,-94.612848 38.200713999999998,-94.613073 38.190551999999997,-94.61341774677895 38.168183959706163,-94.613422 38.16790799999999,-94.613748 38.160632999999997,-94.613855999999998 38.149768999999999,-94.613889466360249 38.136312911169284,-94.613919497343275 38.124238112111762,-94.614061000000007 38.067343,-94.614088999999993 38.065900999999997,-94.614054999999993 38.060088,-94.613980999999995 38.036949,-94.614211999999981 37.992462000000003,-94.614464999999996 37.987798999999995,-94.614511123427164 37.979395512107736,-94.614514360688489 37.978805697169918,-94.614557000000005 37.971036999999995,-94.614561999999992 37.951517000000003,-94.614593999999997 37.949977999999994,-94.614611999999994 37.944361999999998,-94.614754000000005 37.940769000000003,-94.614834999999999 37.936700000000002,-94.614778 37.934199999999997,-94.615181000000007 37.915944000000003,-94.615392999999983 37.906391999999997,-94.61546899999999 37.901775,-94.615706000000003 37.886842999999999,-94.615921 37.878331000000003,-94.615834000000007 37.872509999999998,-94.616 37.863126,-94.616282760205394 37.851281931678621,-94.616426000000004 37.845281999999997,-94.616433230053673 37.842955730230052,-94.61645 37.837560000000003,-94.616861999999998 37.819456000000002,-94.6176681324215 37.775831003788085,-94.617720999999989 37.77297,-94.617737774720197 37.764628336555312,-94.617744979193901 37.761045725680312,-94.617807999999997 37.729706999999998,-94.617975 37.722175999999997,-94.61780499999999 37.690178000000003,-94.617650999999995 37.687671000000002,-94.617687000000004 37.686652999999993,-94.617885 37.682214000000002,-94.617733999999999 37.673127,-94.617576 37.653671000000003,-94.617517909436387 37.643988652624088,-94.61747699999998 37.637169999999998,-94.617472819127315 37.636539916507168,-94.6173 37.610495,-94.617428000000004 37.609521999999998,-94.617283 37.571896000000002,-94.617315000000005 37.571498999999996,-94.617080999999999 37.567013000000003,-94.61711240153133 37.563155381499406,-94.617159999999984 37.557307999999999,-94.617186000000004 37.553485000000002,-94.617167532949537 37.551779056391354,-94.616988484457494 37.535238968895172,-94.616907999999981 37.527804000000003,-94.616788999999997 37.521509999999999,-94.616880369657522 37.506771761864755,-94.617022999999989 37.483764999999998,-94.617182999999997 37.469664999999999,-94.617180000000005 37.465203000000002,-94.617221999999998 37.460476,-94.617204999999984 37.46037299999999,-94.617200999999994 37.454788,-94.617131999999998 37.439818000000002,-94.617265000000003 37.425535999999994,-94.617510999999993 37.410908999999997,-94.617557000000005 37.396374999999999,-94.61759158917468 37.381725975861251,-94.617625000000004 37.367576,-94.617626 37.367444999999989,-94.617536999999999 37.364355000000003,-94.617636000000005 37.338417,-94.617694999999998 37.336841999999997,-94.617648000000003 37.323588999999998,-94.61807499999999 37.240436000000003,-94.618157999999994 37.237596999999994,-94.618122999999997 37.229334,-94.61815 37.228121000000002,-94.618218999999996 37.207771999999999,-94.618305000000007 37.207337000000003,-94.618319 37.188774000000002,-94.618504999999985 37.181184000000002,-94.618472999999994 37.174782,-94.618351000000004 37.160210999999997,-94.618071999999998 37.132345,-94.61807499999999 37.129755000000003,-94.61816441512984 37.118929895303054,-94.618212 37.113168999999992,-94.618150999999997 37.103968000000002,-94.618059000000002 37.096676000000002,-94.618088 37.093670999999993,-94.618089999999995 37.093494,-94.618085255103864 37.089305442941992,-94.618082 37.086432000000002,-94.61811999999999 37.085934000000002,-94.617981999999998 37.075077,-94.617954311863897 37.070346986543974,-94.617947706480578 37.069218577181687,-94.617910161110728 37.062804634983031,-94.617893975984089 37.060039701061122,-94.617874999999998 37.056798,-94.617877538275181 37.056339390079508,-94.617964999999998 37.040537,-94.617972200190749 37.032971759572447,-94.617994999999979 37.009015999999995,-94.618027702303792 37.004829720380044,-94.618080000000006 36.998134999999998,-94.625223999999989 36.998671999999999,-94.699735000000004 36.998804999999997,-94.701796999999999 36.998814000000003,-94.711286363060864 36.99879670415919,-94.712770000000006 36.99879399999999,-94.722629184733563 36.998741903378082,-94.732834603466486 36.998687977231512,-94.736330645670293 36.998669503899912,-94.737183000000002 36.998665000000003,-94.739323999999996 36.998686999999997,-94.745992043692311 36.998700535427304,-94.749560781475736 36.99870777958963,-94.749834600019099 36.998708335412474,-94.777257000000006 36.998764,-94.831280000000007 36.998812,-94.831539962039543 36.998812565955092,-94.840925999999996 36.998832999999998,-94.846637705524785 36.998860673615503,-94.849800999999999 36.998875999999996,-94.853196999999994 36.998874,-94.896852168601683 36.999075231107383,-94.904605402657381 36.99911097010289,-94.9407882710602 36.999277757196154,-94.995293000000004 36.999528999999995,-95.007620000000003 36.999513999999998,-95.011432999999997 36.999535000000002,-95.030323999999993 36.999516999999997,-95.037857000000002 36.999496999999998,-95.049498999999983 36.999580000000002,-95.073509 36.999509000000003,-95.1405498515593 36.999533623834409,-95.155186999999998 36.999538999999999,-95.155372 36.999540000000003,-95.159067907556633 36.999536629205572,-95.177300999999986 36.999519999999997,-95.195307 36.999564999999997,-95.267905305061163 36.999446910377756,-95.285983101167361 36.999417504731007,-95.322564999999997 36.999357999999994,-95.328057999999999 36.999364999999997,-95.328326999999987 36.999366000000002,-95.331209999999999 36.999380000000002,-95.377252424658963 36.999296311678272,-95.381753803085687 36.999288129815376,-95.407683000000006 36.999240999999998,-95.511578 36.999234999999999,-95.522414951940931 36.999281058114107,-95.534401000000003 36.999332000000003,-95.573598000000004 36.999309999999994,-95.601517312742303 36.999317968253862,-95.612139999999997 36.999321000000002,-95.615933999999996 36.999364999999997,-95.621011943860609 36.999361983160732,-95.624350000000007 36.999360000000003,-95.630078999999995 36.999319999999997,-95.638122589416028 36.999320470082949,-95.664300999999995 36.999321999999999,-95.674044398562955 36.999333876292773,-95.686452000000003 36.999349000000002,-95.696658999999997 36.999215,-95.71038 36.999370999999996,-95.710782524132014 36.999362783399121,-95.714887000000004 36.999279,-95.718053999999995 36.999254999999998,-95.741907999999995 36.999243999999997,-95.746466244276931 36.999250838506164,-95.759905000000003 36.999270999999993,-95.768719000000004 36.999205000000003,-95.786761999999996 36.999309999999994,-95.807979999999986 36.999124000000002,-95.819364496908179 36.999150471530008,-95.866899000000004 36.999260999999997,-95.873943999999995 36.999299999999998,-95.875256999999991 36.999302,-95.877150999999998 36.999304000000002,-95.910179999999997 36.999336,-95.928122000000002 36.999245000000002,-95.936991999999989 36.999267999999994,-95.964270378114222 36.999093604402042,-96.00081 36.99886,-96.095164142267308 36.998935940299688,-96.14121 36.998972999999999,-96.143207000000004 36.999133999999998,-96.147143 36.999021999999997,-96.149709 36.99904,-96.152383999999998 36.999050999999994,-96.154016999999982 36.999161,-96.184768000000005 36.999211000000003,-96.200028000000003 36.999028000000003,-96.217571000000007 36.999070000000003,-96.235320025971774 36.999130675786525,-96.27480962492784 36.999265672629733,-96.276368000000005 36.999270999999993,-96.279078999999996 36.999271999999991,-96.381556872639493 36.999226629434901,-96.394272 36.999220999999999,-96.415412000000003 36.999113,-96.500287999999998 36.998643,-96.525212323286397 36.998711038495294,-96.525495980566973 36.998711812823821,-96.551130926932458 36.998781791180214,-96.551130927020779 36.998781791180456,-96.624487489749981 36.998982040153741,-96.705431000000004 36.999203,-96.710481999999999 36.999270999999993,-96.731983006833033 36.99928335311408,-96.736589999999993 36.999285999999998,-96.741269999999986 36.999239000000003,-96.749837999999997 36.998987999999997,-96.792060000000006 36.999179999999996,-96.795198999999997 36.99886,-96.822790999999995 36.999181999999998,-96.867517000000007 36.999217000000002,-96.876289999999997 36.999232999999997,-96.902083000000005 36.999155000000002,-96.903509999999997 36.999132000000003,-96.917092999999994 36.999181999999998,-96.921914999999998 36.999150999999998,-96.924934279563146 36.999131784030439,-96.934641999999997 36.999070000000003,-96.967371 36.999066999999997,-96.975561999999996 36.999018999999997,-97.030081999999979 36.998928999999997,-97.039783999999983 36.999000000000002,-97.045562883576096 36.99899981011751,-97.100651999999997 36.998998,-97.104275999999999 36.999020000000002,-97.120284999999996 36.999014000000003,-97.122596999999999 36.999035999999997,-97.147721000000004 36.999110999999999,-97.202000013134437 36.999050609464689,-97.255829185181881 36.998990719420135,-97.342808466604069 36.998893946743877,-97.362376892203329 36.998872175019791,-97.364929972745273 36.99886933447624,-97.372421000000003 36.998860999999998,-97.384924999999996 36.998843,-97.462279999999993 36.998685000000002,-97.472860999999995 36.998721000000003,-97.527292000000003 36.998749999999994,-97.545899999999989 36.998708999999991,-97.546497999999985 36.998746999999995,-97.564536000000004 36.998711,-97.582460039051355 36.99869862770732,-97.606549 36.998682000000002,-97.637136999999996 36.999090000000002,-97.650465999999994 36.999003999999999,-97.692180007144742 36.998844793059916,-97.697103999999982 36.998826,-97.768704 36.998749999999994,-97.783432000000005 36.998961,-97.783489000000003 36.998846999999998,-97.802297999999979 36.998713000000002,-97.965379045838461 36.998468720211747,-98.033955000000006 36.998365999999997,-98.03989 36.998348999999997,-98.045341999999991 36.998327000000003,-98.111985000000004 36.998133000000003,-98.128185436781749 36.99814624647324,-98.147452 36.998162,-98.177595999999994 36.998008999999996,-98.190367496841162 36.998003995168112,-98.208218000000002 36.997996999999998,-98.219498999999999 36.997824,-98.237712000000002 36.99797199999999,-98.346187999999984 36.997962,-98.347186011230875 36.997961873429141,-98.354073 36.997960999999997,-98.408991 36.998513000000003,-98.418267999999998 36.998538000000003,-98.420209 36.998516000000002,-98.476584655565659 36.998733519956424,-98.485495952453391 36.998767903324406,-98.544871999999984 36.998997000000003,-98.622244241689657 36.999025734091177,-98.714511999999999 36.99906,-98.718464999999995 36.999179999999996,-98.761596999999995 36.999425000000002,-98.791936000000007 36.999254999999998,-98.793711000000002 36.999226999999991,-98.797451999999993 36.999228999999993,-98.811832237742053 36.99924038482925,-98.869449000000003 36.999285999999998,-98.880009 36.999262999999999,-98.880579999999995 36.999308999999997,-98.994371 36.999493,-99.000846251360556 36.99951188908193,-99.029336999999998 36.999594999999999,-99.044703416105833 36.999312701167916,-99.049695 36.999220999999999,-99.124882999999997 36.99942,-99.12944899999998 36.999422000000003,-99.215429691089184 36.999525607779709,-99.221470798208784 36.999532887387339,-99.22594390512576 36.999538277535649,-99.248119999999986 36.999564999999997,-99.277506000000002 36.999578999999997,-99.375390999999993 37.000176999999994,-99.375813215185289 37.000169016042221,-99.396673054015949 36.999774562980598,-99.407015 36.999578999999997,-99.456202999999988 36.999471,-99.484333000000007 36.999625999999999,-99.500394999999983 36.99957599999999,-99.500394999999983 36.999637,-99.502664999999993 36.999645,-99.504092999999997 36.999648,-99.508573999999982 36.999657999999997,-99.541115670095081 36.999572526667627,-99.558068000000006 36.999527999999998,-99.625399000000002 36.999670999999999,-99.648651999999998 36.999603999999998,-99.657657999999998 37.000197,-99.675479899119665 37.000294824261658,-99.700804554289192 37.000433831091229,-99.722499410223932 37.000552913981863,-99.774254999999997 37.000836999999997,-99.774816 37.000841,-99.786016000000004 37.000931,-99.875408999999991 37.001658999999997,-99.904897139036905 37.001652107487203,-99.995200999999994 37.001631000000003,-100.001285999999993 37.001699000000002,-100.002562999999995 37.001705999999999,-100.005706000000004 37.001725999999998,-100.08949117994996 37.002091554886341,-100.115721999999991 37.002206,-100.187546999999995 37.002082,-100.19237099999998 37.002035999999997,-100.193753999999998 37.002133,-100.201675999999992 37.002080999999997,-100.269984573601874 37.001795796937508,-100.395563941387664 37.001271475927872,-100.434302684862132 37.001109733298897,-100.434343961694367 37.0011095609592,-100.436759028295029 37.001099477534027,-100.462594151135718 37.000991610310841,-100.526354155903263 37.000725398506596,-100.551597999999998 37.000619999999998,-100.552683000000002 37.000734999999999,-100.591328000000004 37.000376000000003,-100.591413000000003 37.000399000000002,-100.629769999999994 37.000025,-100.63332699999998 36.999935999999998,-100.675551999999996 36.999687999999999,-100.734516999999997 36.999059000000003,-100.756894000000003 36.999356999999996,-100.759718826764541 36.999297806889686,-100.765484 36.999177000000003,-100.806116000000003 36.999091,-100.814277000000004 36.999085,-100.850054835707368 36.998687920265262,-100.855633999999981 36.998626000000002,-100.891659999999987 36.998604,-100.904274 36.998745,-100.904588000000004 36.998561000000002,-100.945565999999985 36.998151999999997,-100.958261085233985 36.99812508251128,-100.996501999999992 36.998044,-101.012641000000002 36.998176,-101.053589000000002 36.997966999999996,-101.066742000000005 36.997920999999998,-101.096255470166753 36.997758490771822,-101.211485999999979 36.997123999999999,-101.212908999999996 36.997044000000002,-101.283204233333976 36.996668964004151,-101.357796999999991 36.996271,-101.359673999999998 36.996231999999999,-101.37818 36.996164,-101.413867999999994 36.996008000000003,-101.415004999999994 36.995966000000003,-101.485326 36.995610999999997,-101.519065999999995 36.99554599999999,-101.555239 36.99541399999999,-101.600396000000003 36.995152999999995,-101.601592999999994 36.995094999999999,-101.672152845644291 36.994768289529276,-101.672152845650672 36.994768289529254,-101.718235173867967 36.994554916342196,-101.761767880686108 36.994353348566563,-101.826607533764985 36.994053124077894,-101.862548907230888 36.993886706153717,-101.881050066963184 36.993801040963412,-101.899294480822903 36.993716564573397,-101.902439999999999 36.993701999999999,-101.905152836625547 36.993689460946754,-101.93521516037174 36.99355050931414,-102.000446999999994 36.993248999999992,-102.000446999999994 36.993271999999997,-102.028206999999981 36.993124999999999,-102.042240000000007 36.993082999999999,-102.041951999999995 37.024741999999996,-102.04195 37.030805,-102.041921000000002 37.032178000000002,-102.041748999999996 37.034396999999998,-102.04191999999999 37.035083,-102.041983000000002 37.106551000000003,-102.041808999999986 37.111972999999999,-102.042091999999997 37.125020999999997,-102.042135000000002 37.125020999999997,-102.042121535383529 37.12671399835564,-102.042001999999997 37.141744000000003,-102.041962999999996 37.258164,-102.041663999999997 37.29764999999999,-102.041816999999995 37.309489999999997,-102.041973999999996 37.352612999999998,-102.042089000000004 37.352818999999997,-102.041523999999995 37.375017999999997,-102.041585760607518 37.389190434149839,-102.041675999999981 37.409897999999991,-102.041668999999999 37.434739999999998,-102.041754999999995 37.434854999999992,-102.041800999999992 37.469487999999998,-102.041786000000002 37.506065999999997,-102.04201599999999 37.535260999999998,-102.041899 37.541186000000003,-102.041893999999999 37.557977,-102.041618 37.607868000000003,-102.041584999999998 37.644281999999997,-102.041581999999991 37.654494999999997,-102.041694000000007 37.665680999999999,-102.041573999999997 37.680436,-102.041876000000002 37.723875,-102.041989965869121 37.73854062916552,-102.042158 37.760164000000003,-102.042668000000006 37.788758,-102.042952999999997 37.803534999999997,-102.043032999999994 37.824145999999999,-102.043218999999993 37.86792899999999,-102.043714531331204 37.914003914798144,-102.043845000000005 37.926135000000002,-102.043844000000007 37.928101999999996,-102.044644000000005 38.045532,-102.044255000000007 38.113010999999993,-102.044450868202546 38.120049353793199,-102.044589000000002 38.125012999999996,-102.044415729020699 38.133607343100145,-102.044251000000003 38.141777999999995,-102.044296878804843 38.175558844899406,-102.044398 38.250014999999998,-102.044510721728557 38.262483349316234,-102.044567999999998 38.268819,-102.044612999999998 38.312323999999997,-102.044944 38.384419,-102.044441999999989 38.415801999999999,-102.044936000000007 38.41968,-102.045323999999979 38.453646999999997,-102.045262999999991 38.505395,-102.045261999999994 38.505531999999995,-102.045112000000003 38.523783999999999,-102.045222999999993 38.543796999999998,-102.045188999999979 38.558731999999992,-102.045210999999995 38.581608999999993,-102.045287999999999 38.615248999999999,-102.045074 38.669617000000002,-102.045102 38.674945999999998,-102.045159999999996 38.675221,-102.045126999999994 38.686725000000003,-102.045156000000006 38.688555,-102.045211999999992 38.697566999999999,-102.045375000000007 38.754338999999995,-102.045287000000002 38.755527999999998,-102.045371000000003 38.770063999999998,-102.045447999999993 38.783453000000002,-102.045333999999997 38.799463000000003,-102.045387999999988 38.813391999999993,-102.046570999999986 39.047038,-102.047133999999986 39.129700999999997,-102.047188612927897 39.133146793270186,-102.047250000000005 39.13702,-102.047851021058236 39.220289738242592,-102.048449000000005 39.30313799999999,-102.04895999999998 39.37371199999999,-102.049100972149461 39.394064428437375,-102.049166999999983 39.403596999999998,-102.049369999999996 39.418210000000002,-102.049368999999999 39.423333,-102.049678999999998 39.506183,-102.049672999999999 39.536690999999998,-102.049553999999986 39.538932000000003,-102.049763758475066 39.568170000775439,-102.04980599999999 39.574058,-102.049954 39.592331,-102.050258163748609 39.627242889069393,-102.050421999999983 39.646047999999993,-102.050099000000003 39.653812000000002,-102.05059399999999 39.67559399999999,-102.050898693231389 39.741794606053567,-102.051254 39.818992,-102.051317999999995 39.833311000000002,-102.051362999999995 39.843471,-102.051569 39.849805000000003,-102.051743999999999 40.003078000000002))
\ No newline at end of file
diff --git a/webapp/django/contrib/gis/tests/geoapp/sql/nz.wkt b/webapp/django/contrib/gis/tests/geoapp/sql/nz.wkt
new file mode 100644
index 0000000..7e7b593
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/geoapp/sql/nz.wkt
@@ -0,0 +1 @@
+MULTIPOLYGON (((174.616364000000004 -36.100861000000002,174.634978999999987 -36.124718,174.708862000000011 -36.205559,174.781096999999988 -36.266945,174.812744000000009 -36.339165,174.768311000000011 -36.34639,174.710784999999987 -36.525832999999999,174.708587999999992 -36.533332999999999,174.70773299999999 -36.541671999999998,174.714690999999988 -36.595832999999999,174.717194000000006 -36.603057999999997,174.774414000000007 -36.730277999999998,174.808319000000012 -36.805275000000002,174.854400999999996 -36.847777999999998,174.896636999999998 -36.878334000000002,175.011658000000011 -36.871941,175.020813000000004 -36.873610999999997,175.055542000000003 -36.880279999999999,175.076629999999994 -36.890839,175.082458000000003 -36.895279000000002,175.087463000000014 -36.900832999999999,175.091644000000002 -36.925559999999997,175.161652000000004 -36.955559,175.221069 -36.937775000000002,175.230255 -36.939438000000003,175.278320000000008 -36.965279000000002,175.310516000000007 -36.995002999999997,175.319976999999994 -37.005836000000002,175.323853000000014 -37.012222,175.328856999999999 -37.026947,175.330261000000007 -37.035277999999998,175.330535999999995 -37.044449,175.321899000000002 -37.06472,175.31942699999999 -37.095275999999998,175.317748999999992 -37.144165,175.319121999999993 -37.152495999999999,175.328856999999999 -37.168892,175.373290999999995 -37.216659999999997,175.385254000000003 -37.225830000000002,175.404967999999997 -37.228050000000003,175.579131999999987 -37.244446000000003,175.58914200000001 -37.169449,175.551636000000002 -37.024718999999997,175.547484999999995 -37.009171000000002,175.542480000000012 -36.994446000000003,175.536102 -36.980826999999998,175.524993999999992 -36.961669999999998,175.498566000000011 -36.927222999999998,175.484406000000007 -36.920279999999998,175.476348999999999 -36.917777999999998,175.464416999999997 -36.90889,175.435241999999988 -36.866942999999999,175.46691899999999 -36.809998,175.509430000000009 -36.776108,175.486358999999993 -36.679726000000002,175.463593000000003 -36.621383999999999,175.378296000000006 -36.570557,175.366364000000004 -36.561667999999997,175.361633000000012 -36.556389000000003,175.356628 -36.541671999999998,175.353850999999992 -36.525002,175.35244800000001 -36.489998,175.353577 -36.481940999999999,175.360229000000004 -36.478050000000003,175.538025000000005 -36.514724999999999,175.542755 -36.519996999999996,175.604950000000002 -36.622771999999998,175.631072999999986 -36.710555999999997,175.763610999999997 -36.713614999999997,175.840789999999998 -36.754173000000002,175.733582000000013 -36.805832000000002,175.701629999999994 -36.844161999999997,175.707458000000003 -36.869995000000003,175.709960999999993 -36.875275000000002,175.714690999999988 -36.880828999999999,175.720519999999993 -36.885277000000002,175.735779000000008 -36.891387999999999,175.74383499999999 -36.893889999999999,175.758330999999998 -36.876106,175.761382999999995 -36.869446000000003,175.757751000000013 -36.863059999999997,175.753051999999997 -36.857779999999998,175.749114999999989 -36.851394999999997,175.75 -36.843055999999997,175.752196999999995 -36.835555999999997,175.756378000000012 -36.830002,175.765533000000005 -36.828055999999997,175.808013999999986 -36.824173000000002,175.817200000000014 -36.825836000000002,175.833587999999992 -36.830832999999998,175.845519999999993 -36.839722000000002,175.849120999999997 -36.846107000000003,175.878570999999994 -36.914444000000003,175.881072999999986 -36.921669,175.918304000000006 -37.067504999999997,175.917480000000012 -37.075836000000002,175.915253000000007 -37.083061,175.898314999999997 -37.115004999999996,175.884154999999993 -37.168892,175.883330999999998 -37.176949,175.887206999999989 -37.244163999999998,175.892212 -37.249724999999998,175.921082000000013 -37.251671000000002,175.927185000000009 -37.256110999999997,175.93081699999999 -37.262504999999997,175.936371000000008 -37.278885000000002,175.940093999999988 -37.299717,175.974396000000013 -37.418059999999997,175.976074000000011 -37.453055999999997,176.026931999999988 -37.483108999999999,176.035583000000003 -37.487282,176.059417999999994 -37.502502,176.088287000000008 -37.525557999999997,176.093291999999991 -37.531112999999998,176.165526999999997 -37.613892,176.169433999999995 -37.620277000000002,176.167205999999993 -37.625832000000003,176.160247999999996 -37.624167999999997,176.082458000000003 -37.602500999999997,176.066924999999998 -37.59639,176.061095999999992 -37.591942000000003,176.057189999999991 -37.585555999999997,176.062744000000009 -37.580832999999998,176.070800999999989 -37.577781999999999,176.088287000000008 -37.580002,176.095245000000006 -37.576110999999997,176.090239999999994 -37.570838999999999,176.062468999999993 -37.546669,176.023087000000004 -37.528221000000002,176.018767999999994 -37.526057999999999,176.013931000000014 -37.524554999999999,176.007598999999999 -37.524222999999999,175.955535999999995 -37.521110999999998,175.946349999999995 -37.523055999999997,175.940796000000006 -37.527779000000002,175.953583000000009 -37.558891000000003,175.994415000000004 -37.638893000000003,176.071899000000002 -37.655273,176.14498900000001 -37.675277999999999,176.242187999999999 -37.709442000000003,176.267486999999988 -37.676392,176.488281 -37.756667999999998,176.521636999999998 -37.769447,176.527771 -37.773887999999999,176.537475999999998 -37.784447,176.549712999999997 -37.793334999999999,176.656646999999992 -37.855559999999997,176.671082000000013 -37.862502999999997,176.686645999999996 -37.868332000000002,176.759154999999993 -37.892775999999998,176.784149000000014 -37.900275999999998,176.80304000000001 -37.903328000000002,176.819702000000007 -37.904442000000003,176.838287000000008 -37.907501000000003,176.917755 -37.926108999999997,176.943848000000003 -37.932502999999997,177.08273299999999 -37.967216,177.107468000000011 -37.987220999999998,177.159424 -38.013336000000002,177.415253000000007 -37.982498,177.47357199999999 -37.962502,177.545806999999996 -37.919167000000002,177.552459999999996 -37.915000999999997,177.571625000000012 -37.902222000000002,177.599120999999997 -37.878051999999997,177.603577 -37.872498,177.646941999999996 -37.805,177.732178000000005 -37.682502999999997,177.738861000000014 -37.678336999999999,177.746917999999994 -37.675277999999999,177.791931000000005 -37.666946000000003,177.849396000000013 -37.657218999999998,177.858856000000003 -37.656661999999997,177.868010999999996 -37.654442000000003,177.875792999999987 -37.651389999999999,178.0 -37.592224000000002,178.006653 -37.588332999999999,178.012206999999989 -37.583328000000002,178.018004999999988 -37.550831000000002,178.05581699999999 -37.542777999999998,178.064972000000012 -37.542228999999999,178.187744000000009 -37.546951,178.281921000000011 -37.560828999999998,178.306915000000004 -37.568061999999998,178.311919999999986 -37.573334000000003,178.312468999999993 -37.578887999999999,178.306915000000004 -37.583610999999998,178.321075000000008 -37.602500999999997,178.336365 -37.618332000000002,178.34970100000001 -37.626944999999999,178.367737000000005 -37.630828999999999,178.448028999999991 -37.645279000000002,178.457458000000003 -37.646667,178.468018 -37.646949999999997,178.488861000000014 -37.644165,178.497192000000013 -37.646667,178.504424999999998 -37.649994,178.550536999999991 -37.6875,178.555542000000003 -37.692497000000003,178.559692000000013 -37.698883000000002,178.56552099999999 -37.713332999999999,178.562468999999993 -37.719994,178.483306999999996 -37.826393000000003,178.455230999999998 -37.860000999999997,178.449982000000006 -37.865004999999996,178.429687999999999 -37.876944999999999,178.419983000000002 -37.887779000000002,178.350525000000005 -38.004722999999998,178.347473000000008 -38.011116,178.347197999999992 -38.019722000000002,178.348846000000009 -38.027779000000002,178.354950000000002 -38.032218999999998,178.360229000000004 -38.037506,178.364136000000002 -38.043616999999998,178.375792999999987 -38.072777000000002,178.378296000000006 -38.089995999999999,178.377746999999999 -38.09861,178.353850999999992 -38.185555,178.319976999999994 -38.248055,178.318024000000008 -38.255561999999998,178.317474000000004 -38.263893000000003,178.320800999999989 -38.398612999999997,178.302459999999996 -38.528885000000002,178.300536999999991 -38.536391999999999,178.296356000000003 -38.541946000000003,178.158874999999995 -38.649169999999998,178.074982000000006 -38.713889999999999,178.068297999999999 -38.717773,178.060241999999988 -38.721107000000003,178.050812000000008 -38.721381999999998,178.044433999999995 -38.717216,177.928864000000004 -38.722220999999998,177.941070999999994 -38.793616999999998,177.923858999999993 -38.918334999999999,177.917786000000007 -38.942802,177.909697999999992 -38.969718999999998,177.897705000000002 -39.047942999999997,177.893859999999989 -39.064776999999999,177.906708000000009 -39.064278000000002,177.923034999999999 -39.089165,177.942200000000014 -39.091942000000003,177.967743000000013 -39.098334999999999,177.991332999999997 -39.115004999999996,177.996612999999996 -39.120277000000002,177.999390000000005 -39.127495000000003,177.909973000000008 -39.256950000000003,177.898865 -39.267502,177.874968999999993 -39.286118000000002,177.868010999999996 -39.290283000000002,177.861908 -39.285834999999999,177.844970999999987 -39.251396,177.839416999999997 -39.236946000000003,177.824127000000004 -39.193053999999997,177.823577999999998 -39.183883999999999,177.826629999999994 -39.177222999999998,177.841644000000002 -39.152779000000002,177.822021000000007 -39.114445000000003,177.823195999999996 -39.110115,177.82351700000001 -39.105110000000003,177.82119800000001 -39.101275999999999,177.816696000000007 -39.099274,177.680266999999986 -39.075279000000002,177.628845000000013 -39.071114,177.426085999999998 -39.064163,177.387755999999996 -39.077781999999999,177.246917999999994 -39.128334000000002,177.206085000000002 -39.143616000000002,177.149138999999991 -39.165000999999997,177.054961999999989 -39.204445,176.935790999999995 -39.349997999999999,176.931365999999997 -39.355559999999997,176.903870000000012 -39.398055999999997,176.898865 -39.412216,176.89776599999999 -39.438048999999999,176.899414000000007 -39.446387999999999,176.946625000000012 -39.664444000000003,177.01080300000001 -39.654998999999997,177.107178000000005 -39.660828000000002,177.116913000000011 -39.662216,177.120789000000002 -39.66861,177.119110000000006 -39.676108999999997,177.115783999999991 -39.682502999999997,177.08273299999999 -39.729996,177.073577999999998 -39.741385999999999,177.068024000000008 -39.746108999999997,177.059692000000013 -39.749167999999997,177.050262000000004 -39.751396,177.033874999999995 -39.757506999999997,177.028045999999989 -39.762504999999997,177.023590000000013 -39.768059,177.020263999999997 -39.774718999999997,176.894713999999993 -40.034728999999999,176.890533000000005 -40.049728000000002,176.889983999999998 -40.058052000000004,176.89498900000001 -40.082779000000002,176.893035999999995 -40.090279000000002,176.874114999999989 -40.121383999999999,176.834136999999998 -40.181671,176.808319000000012 -40.216659999999997,176.796935999999988 -40.226387000000003,176.687195000000003 -40.321387999999999,176.644135000000006 -40.379997000000003,176.628296000000006 -40.421944000000003,176.539977999999991 -40.495002999999997,176.521362000000011 -40.513893000000003,176.500823999999994 -40.535004,176.441924999999998 -40.600281000000003,176.405243000000013 -40.643889999999999,176.386108000000007 -40.675002999999997,176.35522499999999 -40.688606,176.349396000000013 -40.693610999999997,176.288574000000011 -40.793892,176.239136000000002 -40.90889,176.22079500000001 -40.931671,176.195526 -40.941665999999998,176.172760000000011 -40.952224999999999,176.158600000000007 -40.959999000000003,176.152771 -40.964722000000002,176.142212 -40.975273,176.134154999999993 -40.987502999999997,176.120789000000002 -41.013618,176.11300700000001 -41.035277999999998,176.098297000000002 -41.087218999999997,176.087463000000014 -41.116112,176.080811000000011 -41.129165999999998,176.062195000000003 -41.151938999999999,175.984679999999997 -41.231383999999998,175.955230999999998 -41.255279999999999,175.819121999999993 -41.347220999999998,175.743561 -41.392226999999998,175.736358999999993 -41.396110999999998,175.557738999999998 -41.485000999999997,175.471069 -41.541389000000002,175.427459999999996 -41.564444999999999,175.323028999999991 -41.614449,175.313292999999987 -41.616394,175.230804000000006 -41.620834000000002,175.222197999999992 -41.618332000000002,175.21691899999999 -41.612777999999999,175.184692000000013 -41.535834999999999,175.181915000000004 -41.519447,175.181091000000009 -41.500838999999999,175.188568000000004 -41.461112999999997,175.193024000000008 -41.446106,175.193848000000003 -41.437775000000002,175.191070999999994 -41.430557,175.186095999999992 -41.425002999999997,175.080261000000007 -41.385559,175.063018999999997 -41.380279999999999,175.05304000000001 -41.378608999999997,175.045532000000009 -41.378608999999997,175.027190999999988 -41.381667999999998,174.993286000000012 -41.393332999999998,174.985779000000008 -41.397224,174.972747999999996 -41.405830000000002,174.960509999999999 -41.415275999999999,174.949982000000006 -41.425559999999997,174.944976999999994 -41.431114,174.94165000000001 -41.437775000000002,174.936919999999986 -41.443328999999999,174.918578999999994 -41.448051,174.908600000000007 -41.448334000000003,174.872467 -41.429442999999999,174.86605800000001 -41.425002999999997,174.861084000000005 -41.419724000000002,174.861633000000012 -41.347496,174.863861000000014 -41.340279000000002,174.870789000000002 -41.327224999999999,174.87912 -41.315002,174.883881000000002 -41.309441,174.894440000000003 -41.290000999999997,174.89776599999999 -41.282501000000003,174.899993999999992 -41.275002,174.901916999999997 -41.258338999999999,174.901916999999997 -41.251114,174.898865 -41.234444000000003,174.89498900000001 -41.228050000000003,174.887482000000006 -41.224442000000003,174.827179 -41.218887000000002,174.818848000000003 -41.221938999999999,174.787475999999998 -41.244446000000003,174.778045999999989 -41.255836000000002,174.774414000000007 -41.262222,174.771087999999992 -41.278053,174.778594999999996 -41.281387000000002,174.796082000000013 -41.286949,174.818024000000008 -41.284728999999999,174.824127000000004 -41.289169,174.829407000000003 -41.294724000000002,174.833313000000004 -41.301108999999997,174.832184000000012 -41.309441,174.82995600000001 -41.316665999999998,174.826355000000007 -41.323334000000003,174.821625000000012 -41.328887999999999,174.815796000000006 -41.333610999999998,174.807189999999991 -41.336387999999999,174.744689999999991 -41.347496,174.700531000000012 -41.344444000000003,174.671906000000007 -41.338332999999999,174.654694000000006 -41.333061,174.648314999999997 -41.328612999999997,174.629669000000007 -41.315002,174.59191899999999 -41.27861,174.591644000000002 -41.271385000000002,174.594116000000014 -41.263893000000003,174.601074000000011 -41.250838999999999,174.608306999999996 -41.237777999999999,174.61300700000001 -41.232216,174.619110000000006 -41.23111,174.627746999999999 -41.233887000000003,174.637482000000006 -41.235557999999997,174.648590000000013 -41.234444000000003,174.666931000000005 -41.229720999999998,174.681365999999997 -41.221938999999999,174.694702000000007 -41.213614999999997,174.712738000000002 -41.199440000000003,174.718567000000007 -41.194716999999997,174.800812000000008 -41.100281000000003,174.844421000000011 -41.041671999999998,174.874390000000005 -41.018059,174.882721000000004 -41.015006999999997,174.892486999999988 -41.013061999999998,174.901093000000003 -41.010283999999999,174.908324999999991 -41.006393000000003,174.932189999999991 -40.987502999999997,174.94165000000001 -40.976387000000003,174.945251000000013 -40.969718999999998,174.947478999999987 -40.962218999999997,175.014983999999998 -40.84861,175.09857199999999 -40.755836000000002,175.112731999999994 -40.738892,175.120789000000002 -40.726944000000003,175.127746999999999 -40.713614999999997,175.164153999999996 -40.631943,175.169708000000014 -40.616942999999999,175.171906000000007 -40.609726000000002,175.187468999999993 -40.530830000000002,175.23800700000001 -40.329726999999998,175.23135400000001 -40.280830000000002,175.201629999999994 -40.181671,175.196349999999995 -40.166946000000003,175.178314 -40.134171000000002,175.15554800000001 -40.095832999999999,175.071625000000012 -40.003059,175.055542000000003 -39.987777999999999,175.022217000000012 -39.958053999999997,174.986358999999993 -39.93,174.974120999999997 -39.920836999999999,174.960784999999987 -39.912773,174.938873 -39.902222000000002,174.923034999999999 -39.895836000000003,174.836638999999991 -39.865004999999996,174.828307999999993 -39.862502999999997,174.790802000000014 -39.854720999999998,174.781096999999988 -39.853057999999997,174.751373 -39.865555,174.740509000000003 -39.866661,174.729674999999986 -39.865836999999999,174.57607999999999 -39.829169999999998,174.558013999999986 -39.824722,174.549408 -39.822226999999998,174.542205999999993 -39.818610999999997,174.523865 -39.805,174.421356000000003 -39.726944000000003,174.410521999999986 -39.716942000000003,174.376068000000004 -39.678612,174.353577 -39.639999000000003,174.348846000000009 -39.634444999999999,174.336638999999991 -39.625557,174.316070999999994 -39.613892,174.30886799999999 -39.610283000000003,174.217194000000006 -39.579726999999998,174.208862000000011 -39.577224999999999,174.040802000000014 -39.552779999999998,173.997741999999988 -39.551392,173.986908 -39.550552000000003,173.970245000000006 -39.545279999999998,173.963012999999989 -39.541671999999998,173.871062999999992 -39.483330000000002,173.851898000000006 -39.470551,173.839966000000004 -39.461387999999999,173.810790999999995 -39.4375,173.79525799999999 -39.421944000000003,173.786652000000004 -39.409996,173.775817999999987 -39.390839,173.769713999999993 -39.376944999999999,173.762206999999989 -39.354720999999998,173.754424999999998 -39.305,173.751923000000005 -39.288612,173.751647999999989 -39.269996999999996,173.781921000000011 -39.191383000000002,173.785247999999996 -39.184998,173.800536999999991 -39.169167000000002,173.82995600000001 -39.145836000000003,173.844421000000011 -39.138336000000002,173.868010999999996 -39.128883000000002,173.892761000000007 -39.120552000000004,174.011108000000007 -39.073334000000003,174.114685000000009 -39.024445,174.187744000000009 -38.988608999999997,174.209136999999998 -38.977218999999998,174.226623999999987 -38.972496,174.248016000000007 -38.970551,174.259978999999987 -38.970275999999998,174.281372000000005 -38.969994,174.293029999999987 -38.969994,174.313292999999987 -38.972496,174.351348999999999 -38.979438999999999,174.375244000000009 -38.979163999999997,174.384704999999997 -38.977218999999998,174.392761000000007 -38.974442000000003,174.456359999999989 -38.940277000000002,174.546082000000013 -38.871941,174.557738999999998 -38.860557999999997,174.568024000000008 -38.850281000000003,174.587738000000002 -38.828887999999999,174.594421000000011 -38.815834000000002,174.603302000000014 -38.786118000000002,174.608582000000013 -38.763061999999998,174.625518999999997 -38.677779999999998,174.642486999999988 -38.590836000000003,174.681091000000009 -38.379165999999998,174.724396000000013 -38.185828999999998,174.838561999999996 -38.157218999999998,174.848021999999986 -38.156944000000003,174.85635400000001 -38.154167,174.926636000000002 -38.116112,174.932465000000008 -38.111389000000003,174.940246999999999 -38.101112,174.898590000000013 -38.075004999999997,174.877166999999986 -38.064163,174.892486999999988 -37.976387000000003,174.893585000000002 -37.969994,174.868286000000012 -37.943610999999997,174.861084000000005 -37.939995000000003,174.85522499999999 -37.944716999999997,174.834686000000005 -37.963614999999997,174.830261000000007 -37.969161999999997,174.828033000000005 -37.976661999999997,174.828583000000009 -37.995002999999997,174.822754000000003 -37.999724999999998,174.814696999999995 -38.002502,174.804137999999995 -38.001944999999999,174.797211000000004 -37.998336999999999,174.791077 -37.993614,174.786376999999987 -37.988334999999999,174.783874999999995 -37.980826999999998,174.783600000000007 -37.971663999999997,174.788025000000005 -37.868332000000002,174.788879000000009 -37.860000999999997,174.791077 -37.852783000000002,174.795532000000009 -37.846947,174.819702000000007 -37.829169999999998,174.826629999999994 -37.825279000000002,174.841339000000005 -37.818610999999997,174.872741999999988 -37.806106999999997,174.883330999999998 -37.805,174.903045999999989 -37.807502999999997,174.945251000000013 -37.810555,174.967467999999997 -37.809165999999998,174.975525000000005 -37.806389000000003,174.974975999999998 -37.75,174.974670000000003 -37.740836999999999,174.966644000000002 -37.739998,174.951355000000007 -37.743057,174.94442699999999 -37.745002999999997,174.93081699999999 -37.752502,174.906921000000011 -37.774169999999998,174.870789000000002 -37.783057999999997,174.861633000000012 -37.785004,174.848297000000002 -37.769722000000002,174.828307999999993 -37.710830999999999,174.764160000000004 -37.527779000000002,174.744415000000004 -37.487502999999997,174.724975999999998 -37.447220000000002,174.717467999999997 -37.425002999999997,174.714690999999988 -37.408607000000003,174.714690999999988 -37.399445,174.719116000000014 -37.393616000000002,174.725799999999992 -37.389999000000003,174.744415000000004 -37.385834000000003,174.760528999999991 -37.380279999999999,174.767486999999988 -37.376389000000003,174.773041000000006 -37.371665999999998,174.831635000000006 -37.308052000000004,174.840789999999998 -37.296951,174.840515000000011 -37.291389000000002,174.82995600000001 -37.290557999999997,174.821899000000002 -37.291671999999998,174.812744000000009 -37.293616999999998,174.804687999999999 -37.296393999999999,174.797760000000011 -37.300277999999999,174.766083000000009 -37.321114,174.754700000000014 -37.330559,174.751373 -37.336945,174.744965000000008 -37.359169,174.740509000000003 -37.364722999999998,174.733582000000013 -37.368606999999997,174.724120999999997 -37.368889000000003,174.717194000000006 -37.365279999999998,174.711365 -37.360557999999997,174.701629999999994 -37.349724000000002,174.69442699999999 -37.336945,174.660187000000008 -37.273311999999997,174.645813000000004 -37.236389000000003,174.639709000000011 -37.224442000000003,174.599975999999998 -37.153885000000002,174.578307999999993 -37.115555,174.569976999999994 -37.103614999999998,174.555542000000003 -37.087502,174.551909999999992 -37.080832999999998,174.549712999999997 -37.073616,174.55304000000001 -37.067222999999998,174.558593999999999 -37.0625,174.568848000000003 -37.061385999999999,174.644135000000006 -37.061110999999997,174.661376999999987 -37.065551999999997,174.664977999999991 -37.071944999999999,174.666381999999999 -37.080283999999999,174.661925999999994 -37.085830999999999,174.650542999999999 -37.095275999999998,174.646087999999992 -37.100838000000003,174.648590000000013 -37.108055,174.703856999999999 -37.197777000000002,174.733856000000003 -37.196106,174.716644000000002 -37.154167,174.72357199999999 -37.150275999999998,174.87912 -37.088889999999999,174.887482000000006 -37.059165999999998,174.795532000000009 -37.023055999999997,174.804413000000011 -36.972220999999998,174.824982000000006 -36.960830999999999,174.829407000000003 -36.955002,174.83273299999999 -36.948608,174.828033000000005 -36.943053999999997,174.818848000000003 -36.941383000000002,174.770263999999997 -36.936661,174.696625000000012 -36.93972,174.686095999999992 -36.940834000000002,174.659697999999992 -36.947495000000004,174.653045999999989 -36.951393000000003,174.641662999999994 -36.960830999999999,174.622467 -36.982216,174.619110000000006 -36.988892,174.617187999999999 -36.996108999999997,174.600525000000005 -37.022224,174.524688999999995 -37.045555,174.515533000000005 -37.045555,174.508605999999986 -37.041946000000003,174.502472000000012 -37.037506,174.498016000000007 -37.031944000000003,174.490783999999991 -37.019165,174.484679999999997 -37.005561999999998,174.459228999999993 -36.944031000000003,174.451904000000013 -36.923889000000003,174.446930000000009 -36.909163999999997,174.443024000000008 -36.893616000000002,174.439147999999989 -36.868606999999997,174.436645999999996 -36.852226000000002,174.43386799999999 -36.835555999999997,174.427764999999994 -36.812775000000002,174.422760000000011 -36.798057999999997,174.416655999999989 -36.784171999999998,174.409697999999992 -36.771385000000002,174.406096999999988 -36.765006999999997,174.390533000000005 -36.740279999999998,174.344299000000007 -36.679336999999997,174.301085999999998 -36.62722,174.284973000000008 -36.612777999999999,174.267486999999988 -36.599167,174.236908 -36.568061999999998,174.208862000000011 -36.535277999999998,174.187744000000009 -36.496948000000003,174.17804000000001 -36.467498999999997,174.177764999999994 -36.458336000000003,174.178864000000004 -36.449997000000003,174.181091000000009 -36.442497000000003,174.184417999999994 -36.436110999999997,174.189972000000012 -36.431389000000003,174.196930000000009 -36.427779999999998,174.20495600000001 -36.428612,174.24383499999999 -36.440834000000002,174.251923000000005 -36.443610999999997,174.257751000000013 -36.448051,174.300262000000004 -36.515839,174.348846000000009 -36.601944000000003,174.367919999999998 -36.629165999999998,174.370728000000014 -36.6325,174.422484999999995 -36.667220999999998,174.430542000000003 -36.668059999999997,174.453033000000005 -36.651108,174.456359999999989 -36.644722000000002,174.465515000000011 -36.582779000000002,174.465515000000011 -36.532218999999998,174.442474000000004 -36.414718999999998,174.422211000000004 -36.366112,174.41885400000001 -36.370834000000002,174.391937000000013 -36.395004,174.384978999999987 -36.398887999999999,174.377166999999986 -36.401665,174.303864000000004 -36.395279000000002,174.296935999999988 -36.391669999999998,174.285247999999996 -36.3825,174.276916999999997 -36.370552000000004,174.26998900000001 -36.357779999999998,174.268585000000002 -36.349442000000003,174.268585000000002 -36.342224000000002,174.292205999999993 -36.316947999999996,174.299988000000013 -36.314163,174.308013999999986 -36.316947999999996,174.325531000000012 -36.330283999999999,174.334686000000005 -36.332222000000002,174.36883499999999 -36.331673000000002,174.376891999999998 -36.330832999999998,174.421248999999989 -36.310611999999999,174.50692699999999 -36.267220000000002,174.518311000000011 -36.258057,174.521636999999998 -36.251396,174.519135000000006 -36.245834000000002,174.505248999999992 -36.231383999999998,174.413299999999992 -36.263061999999998,174.378296000000006 -36.286667,174.364685000000009 -36.294167000000002,174.346619000000004 -36.298057999999997,174.336365 -36.298889000000003,174.305237000000005 -36.287506,174.365233999999987 -36.260002,174.442200000000014 -36.169724000000002,174.396087999999992 -36.144447,174.396362000000011 -36.151938999999999,174.394135000000006 -36.159163999999997,174.373290999999995 -36.206389999999999,174.369965000000008 -36.213057999999997,174.358856000000003 -36.222220999999998,174.345245000000006 -36.229720999999998,174.337463000000014 -36.232773000000002,174.33273299999999 -36.229163999999997,174.307738999999998 -36.176949,174.282745000000006 -36.121108999999997,174.274993999999992 -36.118332000000002,174.239409999999992 -36.111389000000003,174.229126000000008 -36.112502999999997,174.195251000000013 -36.131110999999997,174.188568000000004 -36.144165,174.185790999999995 -36.171944000000003,174.191345000000013 -36.176392,174.19830300000001 -36.18,174.217743000000013 -36.182502999999997,174.226898000000006 -36.182502999999997,174.236084000000005 -36.180557,174.244110000000006 -36.183059999999998,174.287749999999988 -36.210281000000002,174.312468999999993 -36.236663999999998,174.314696999999995 -36.243889000000003,174.267212 -36.270279000000002,174.259430000000009 -36.273055999999997,174.251373 -36.272499000000003,174.065796000000006 -36.168334999999999,173.999114999999989 -36.121108999999997,173.994415000000004 -36.115836999999999,173.99105800000001 -36.109444000000003,173.931091000000009 -35.981940999999999,173.938568000000004 -35.934998,173.947478999999987 -35.923889000000003,173.948577999999998 -35.915550000000003,173.946075000000008 -35.908051,173.913879000000009 -35.86972,173.908324999999991 -35.874442999999999,173.903870000000012 -35.879997000000003,173.904967999999997 -35.888336000000002,173.921356000000003 -36.003059,173.980804000000006 -36.121383999999999,173.987731999999994 -36.134171000000002,173.992461999999989 -36.139724999999999,174.124390000000005 -36.263618,174.176085999999998 -36.276947,174.180542000000003 -36.282501000000003,174.198853000000014 -36.343887000000002,174.199982000000006 -36.352226000000002,174.198028999999991 -36.368606999999997,174.194702000000007 -36.375275000000002,174.189147999999989 -36.379722999999998,174.115233999999987 -36.40361,174.089966000000004 -36.411385000000003,174.080811000000011 -36.409438999999999,174.06942699999999 -36.400275999999998,174.065796000000006 -36.393889999999999,174.057465000000008 -36.374718,174.049133000000012 -36.353614999999998,174.044433999999995 -36.338889999999999,174.039703000000003 -36.323334000000003,174.031096999999988 -36.293059999999997,174.020537999999988 -36.273887999999999,173.82607999999999 -36.032501000000003,173.737457000000006 -35.933608999999997,173.727172999999993 -35.923614999999998,173.590515000000011 -35.778053,173.398865 -35.573891000000003,173.395537999999988 -35.567504999999997,173.398865 -35.553612,173.446625000000012 -35.440277000000002,173.465789999999998 -35.429169000000002,173.501923000000005 -35.419724000000002,173.506378000000012 -35.425277999999999,173.540253000000007 -35.430832000000002,173.629943999999995 -35.356667000000002,173.65554800000001 -35.322502,173.65554800000001 -35.313332000000003,173.564147999999989 -35.278053,173.556091000000009 -35.280830000000002,173.551636000000002 -35.286391999999999,173.549712999999997 -35.302779999999998,173.549712999999997 -35.321114,173.551909999999992 -35.328612999999997,173.566924999999998 -35.344161999999997,173.568024000000008 -35.361671,173.566924999999998 -35.36972,173.559143000000006 -35.372771999999998,173.439696999999995 -35.376106,173.416077 -35.384444999999999,173.410247999999996 -35.388893000000003,173.391356999999999 -35.423057999999997,173.39498900000001 -35.449722,173.396087999999992 -35.458053999999997,173.392761000000007 -35.482773000000002,173.386382999999995 -35.523330999999999,173.380524000000008 -35.528053,173.37384 -35.524169999999998,173.306915000000004 -35.449165,173.237731999999994 -35.370277000000002,173.154144000000002 -35.276665,173.103302000000014 -35.226104999999997,173.09191899999999 -35.216942000000003,173.087463000000014 -35.211387999999999,173.09191899999999 -35.1875,173.098846000000009 -35.183608999999997,173.119110000000006 -35.185555,173.12802099999999 -35.1875,173.134704999999997 -35.191108999999997,173.14498900000001 -35.191940000000002,173.152771 -35.189163,173.163879000000009 -35.179169000000002,173.168578999999994 -35.173614999999998,173.18081699999999 -35.156104999999997,173.187468999999993 -35.143332999999998,173.191924999999998 -35.128334000000002,173.196349999999995 -35.104446000000003,173.197478999999987 -35.09639,173.198577999999998 -35.078887999999999,173.198577999999998 -35.051108999999997,173.193848000000003 -35.027222000000002,173.189423000000005 -35.012779000000002,173.179413000000011 -34.993332000000002,173.175812000000008 -34.986946000000003,173.159149000000014 -34.958336000000003,173.151093000000003 -34.946663,173.137755999999996 -34.93,172.947204999999997 -34.716942000000003,172.828033000000005 -34.584442000000003,172.812468999999993 -34.568893000000003,172.722473000000008 -34.495277000000002,172.739136000000002 -34.435555,172.900817999999987 -34.414718999999998,172.911925999999994 -34.414718999999998,173.020813000000004 -34.422226000000002,173.038879000000009 -34.436942999999999,173.043304000000006 -34.517775999999998,173.039977999999991 -34.522224,173.033324999999991 -34.525832999999999,173.024414000000007 -34.527779000000002,173.016662999999994 -34.52861,173.007476999999994 -34.526947,172.997467 -34.498336999999999,172.984130999999991 -34.472771000000002,172.961914000000007 -34.465279000000002,172.955230999999998 -34.468887000000002,172.908324999999991 -34.544167000000002,172.912749999999988 -34.549728000000002,172.923858999999993 -34.558891000000003,172.936095999999992 -34.567222999999998,172.973021999999986 -34.581116000000002,173.053314 -34.665550000000003,173.057738999999998 -34.680283000000003,173.110503999999992 -34.791389000000002,173.120789000000002 -34.810555,173.128570999999994 -34.822502,173.133026 -34.828055999999997,173.13857999999999 -34.832504,173.151916999999997 -34.839995999999999,173.213593000000003 -34.871941,173.242737000000005 -34.884726999999998,173.273314999999997 -34.940834000000002,173.268859999999989 -34.946387999999999,173.262206999999989 -34.959167,173.259978999999987 -34.966659999999997,173.258881000000002 -34.974716,173.259978999999987 -34.983055,173.264709000000011 -35.014449999999997,173.269135000000006 -35.019722000000002,173.317474000000004 -35.018889999999999,173.328583000000009 -35.009444999999999,173.358856000000003 -34.98111,173.36300700000001 -34.975555,173.366364000000004 -34.968887000000002,173.373259999999988 -34.936774999999997,173.371246000000014 -34.927444,173.400817999999987 -34.863334999999999,173.426085999999998 -34.82,173.450806 -34.807777000000002,173.500274999999988 -34.864722999999998,173.499114999999989 -34.871108999999997,173.492461999999989 -34.874718,173.452453999999989 -34.887779000000002,173.443297999999999 -34.889724999999999,173.433319000000012 -34.890555999999997,173.413025000000005 -34.888893000000003,173.405243000000013 -34.892502,173.399719000000005 -34.897224,173.399719000000005 -34.906387000000002,173.402190999999988 -34.913887000000003,173.411590999999987 -34.931778,173.419128 -34.945830999999998,173.426909999999992 -34.957779000000002,173.431641000000013 -34.963332999999999,173.44165000000001 -34.973328000000002,173.454131999999987 -34.981667000000002,173.467467999999997 -34.988892,173.475525000000005 -34.991669000000002,173.493286000000012 -34.995277000000002,173.541655999999989 -34.988608999999997,173.561645999999996 -34.958893000000003,173.562468999999993 -34.950836000000002,173.566924999999998 -34.936110999999997,173.572478999999987 -34.931389000000003,173.579131999999987 -34.927779999999998,173.589416999999997 -34.928612,173.83914200000001 -35.004173000000002,174.101074000000011 -35.121108999999997,174.098297000000002 -35.161667,174.091644000000002 -35.158051,174.056641000000013 -35.155555999999997,174.021911999999986 -35.164161999999997,174.008026 -35.207504,174.008026 -35.215004,174.011382999999995 -35.221381999999998,174.018311000000011 -35.224997999999999,174.093841999999995 -35.225273,174.100525000000005 -35.228881999999999,174.143585000000002 -35.328612999999997,174.208008000000007 -35.323334000000003,174.218018 -35.322226999999998,174.247741999999988 -35.27861,174.319976999999994 -35.232773000000002,174.383881000000002 -35.337775999999998,174.461638999999991 -35.445273999999998,174.491913000000011 -35.485275,174.575806 -35.601944000000003,174.577179 -35.610000999999997,174.577147999999994 -35.618088,174.569976999999994 -35.648055999999997,174.563292999999987 -35.651665,174.530272999999994 -35.649445,174.520263999999997 -35.648612999999997,174.513306 -35.645004,174.505248999999992 -35.642502,174.479126000000008 -35.641945,174.47357199999999 -35.646393000000003,174.474975999999998 -35.654716,174.518311000000011 -35.724167,174.523041000000006 -35.729438999999999,174.554137999999995 -35.750281999999999,174.561919999999986 -35.753059,174.583862000000011 -35.764724999999999,174.60244800000001 -35.844444000000003,174.596924 -35.849167,174.58914200000001 -35.851944000000003,174.577758999999986 -35.852226000000002,174.560790999999995 -35.847777999999998,174.554961999999989 -35.843330000000002,174.538574000000011 -35.819450000000003,174.523314999999997 -35.796669,174.519713999999993 -35.790283000000002,174.49105800000001 -35.769447,174.361908 -35.723328000000002,174.357451999999995 -35.72361,174.34857199999999 -35.734726000000002,174.346924 -35.833061,174.350525000000005 -35.839438999999999,174.35522499999999 -35.845001000000003,174.360779000000008 -35.849442000000003,174.381348000000003 -35.851112,174.384704999999997 -35.844718999999998,174.385528999999991 -35.828887999999999,174.391083000000009 -35.824173000000002,174.398865 -35.821387999999999,174.437468999999993 -35.822777000000002,174.476074000000011 -35.824173000000002,174.486358999999993 -35.824722,174.519713999999993 -35.844718999999998,174.525542999999999 -35.849167,174.524414000000007 -35.855559999999997,174.521362000000011 -35.862220999999998,174.501373 -35.889999000000003,174.496917999999994 -35.895553999999997,174.487182999999987 -35.915000999999997,174.495513999999986 -35.988608999999997,174.498016000000007 -35.994163999999998,174.514160000000004 -36.008614,174.56942699999999 -36.037224000000002,174.578583000000009 -36.038894999999997,174.587738000000002 -36.038894999999997,174.596619000000004 -36.036667,174.606902999999988 -36.037506,174.612731999999994 -36.042228999999999,174.622192000000013 -36.053055,174.62912 -36.065834000000002,174.629394999999988 -36.075004999999997,174.616364000000004 -36.100861000000002)),((171.185241999999988 -44.938332000000003,171.182129000000003 -44.94173,171.175017999999994 -44.949902000000002,171.167923000000002 -44.959850000000003,171.165436 -44.966599000000002,171.164703000000003 -44.970275999999998,171.163299999999992 -44.978332999999999,171.149719000000005 -44.996665999999998,171.07995600000001 -45.067222999999998,171.02664200000001 -45.103332999999999,170.975525000000005 -45.151108,170.966063999999989 -45.163055,170.961914000000007 -45.169167000000002,170.921630999999991 -45.243057,170.873566000000011 -45.358055,170.873290999999995 -45.367218,170.876891999999998 -45.373885999999999,170.871338000000009 -45.424171,170.859955000000014 -45.487502999999997,170.855804000000006 -45.493889000000003,170.750274999999988 -45.61972,170.674682999999987 -45.745002999999997,170.616913000000011 -45.839438999999999,170.55886799999999 -45.881667999999998,170.554413000000011 -45.888053999999997,170.555542000000003 -45.896110999999998,170.591063999999989 -45.894165,170.600525000000005 -45.891669999999998,170.608582000000013 -45.888053999999997,170.658600000000007 -45.858612,170.718018 -45.817504999999997,170.724670000000003 -45.813057,170.773314999999997 -45.782775999999998,170.781096999999988 -45.786391999999999,170.790802000000014 -45.806946000000003,170.790802000000014 -45.84639,170.788879000000009 -45.863892,170.783051 -45.878334000000002,170.776366999999993 -45.882773999999998,170.699982000000006 -45.911667,170.664429000000013 -45.908332999999999,170.57330300000001 -45.916663999999997,170.550536999999991 -45.919167000000002,170.484406000000007 -45.926949,170.452453999999989 -45.931946000000003,170.424408 -45.939438000000003,170.382721000000004 -45.956108,170.342467999999997 -45.97361,170.315246999999999 -45.991385999999999,170.309692000000013 -45.996948000000003,170.294433999999995 -46.013893000000003,170.281646999999992 -46.029442000000003,170.263610999999997 -46.051940999999999,170.256378000000012 -46.065551999999997,170.253051999999997 -46.081947,170.252472000000012 -46.09111,170.254424999999998 -46.107779999999998,170.252777000000009 -46.115836999999999,170.240783999999991 -46.146949999999997,170.237731999999994 -46.154167,170.226623999999987 -46.165000999999997,170.214416999999997 -46.174720999999998,170.193848000000003 -46.188048999999999,170.169433999999995 -46.198608,170.067748999999992 -46.246665999999998,169.911925999999994 -46.340279000000002,169.863585999999998 -46.371383999999999,169.858001999999999 -46.376663,169.849396000000013 -46.389442000000003,169.848021999999986 -46.416946000000003,169.849975999999998 -46.433326999999998,169.852172999999993 -46.440834000000002,169.853850999999992 -46.457504,169.850799999999992 -46.464722000000002,169.845245000000006 -46.469994,169.701904000000013 -46.558052000000004,169.631348000000003 -46.581947,169.458008000000007 -46.623328999999998,169.266388000000006 -46.656387000000002,169.133026 -46.670836999999999,169.107727000000011 -46.669167000000002,169.097197999999992 -46.666946000000003,169.084411999999986 -46.657501000000003,169.067200000000014 -46.635002,169.061919999999986 -46.675002999999997,169.053864000000004 -46.678612,169.008026 -46.680832000000002,168.883330999999998 -46.667777999999998,168.878296000000006 -46.661942000000003,168.861908 -46.628334000000002,168.862457000000006 -46.619446000000003,168.864409999999992 -46.611114999999998,168.864959999999996 -46.603889000000002,168.844970999999987 -46.563614,168.835784999999987 -46.560555,168.823853000000014 -46.561110999999997,168.733306999999996 -46.577499000000003,168.640533000000005 -46.603889000000002,168.633605999999986 -46.606392,168.614685000000009 -46.611114999999998,168.593018 -46.614165999999997,168.568848000000003 -46.615004999999996,168.516937000000013 -46.614165999999997,168.492737000000005 -46.613334999999999,168.442138999999997 -46.601500999999999,168.436630000000008 -46.599666999999997,168.446625000000012 -46.584003000000003,168.442200000000014 -46.575004999999997,168.454407000000003 -46.574447999999997,168.490509000000003 -46.573059,168.502472000000012 -46.574173000000002,168.506103999999993 -46.578887999999999,168.499114999999989 -46.583328000000002,168.505553999999989 -46.588051,168.551636000000002 -46.594444000000003,168.561371000000008 -46.591942000000003,168.566924999999998 -46.586661999999997,168.563599000000011 -46.580002,168.550812000000008 -46.570557,168.541655999999989 -46.567504999999997,168.391356999999999 -46.540000999999997,168.361908 -46.544449,168.353577 -46.547783000000003,168.351623999999987 -46.556106999999997,168.352172999999993 -46.564444999999999,168.362731999999994 -46.583885000000002,168.348236000000014 -46.582165000000003,168.352904999999993 -46.584499,168.359267999999986 -46.585830999999999,168.365082 -46.592666999999999,168.367248999999987 -46.596668,168.367599000000013 -46.601497999999999,168.364928999999989 -46.605331,168.35775799999999 -46.604500000000002,168.351409999999987 -46.603164999999997,168.275269000000009 -46.557777000000002,168.269135000000006 -46.535561,168.268311000000011 -46.529167,168.27664200000001 -46.525832999999999,168.286102 -46.523330999999999,168.307738999999998 -46.520553999999997,168.318297999999999 -46.520836000000003,168.318848000000003 -46.529167,168.321075000000008 -46.536667,168.328856999999999 -46.540557999999997,168.339416999999997 -46.539169,168.386658000000011 -46.497779999999999,168.392486999999988 -46.492226000000002,168.395537999999988 -46.485000999999997,168.396087999999992 -46.477775999999999,168.394135000000006 -46.470275999999998,168.37384 -46.421944000000003,168.36883499999999 -46.416106999999997,168.359679999999997 -46.415000999999997,168.350249999999988 -46.417503000000004,168.250274999999988 -46.400832999999999,168.211090000000013 -46.355277999999998,168.206085000000002 -46.351394999999997,168.194702000000007 -46.345551,168.185516000000007 -46.342498999999997,168.174988000000013 -46.340279000000002,168.116364000000004 -46.343612999999998,168.063873 -46.351669,167.955535999999995 -46.371383999999999,167.893035999999995 -46.387222,167.850799999999992 -46.399445,167.832184000000012 -46.398612999999997,167.824401999999992 -46.394447,167.753875999999991 -46.333885000000002,167.776916999999997 -46.312775000000002,167.781372000000005 -46.306389000000003,167.783600000000007 -46.298340000000003,167.781372000000005 -46.290840000000003,167.778045999999989 -46.284171999999998,167.701904000000013 -46.209442000000003,167.596924 -46.166389000000002,167.556641000000013 -46.156387000000002,167.546356000000003 -46.154167,167.534424 -46.152779000000002,167.483032000000009 -46.149726999999999,167.471069 -46.149994,167.460236000000009 -46.151389999999999,167.451904000000013 -46.154716,167.446075000000008 -46.159996,167.415526999999997 -46.204720000000002,167.356628 -46.254447999999996,167.280272999999994 -46.273055999999997,167.261108000000007 -46.267775999999998,167.238555999999988 -46.263893000000003,167.086638999999991 -46.240555,167.001373 -46.229163999999997,166.966063999999989 -46.224716,166.949982000000006 -46.223885000000003,166.915253000000007 -46.226104999999997,166.883026 -46.229996,166.836365 -46.232498,166.823028999999991 -46.231667000000002,166.768035999999995 -46.22361,166.726348999999999 -46.214165,166.717467999999997 -46.210830999999999,166.705230999999998 -46.201110999999997,166.670806999999996 -46.161667,166.67025799999999 -46.15361,166.684417999999994 -46.145004,166.693848000000003 -46.142775999999998,166.709411999999986 -46.135277000000002,166.738861000000014 -46.119163999999998,166.761230000000012 -46.093612999999998,166.784911999999991 -46.064945000000002,166.804748999999987 -46.033279,166.82995600000001 -46.003891000000003,166.854674999999986 -45.994163999999998,166.886932000000002 -45.990279999999998,166.943297999999999 -45.956108,166.949127000000004 -45.950836000000002,166.946930000000009 -45.945273999999998,166.939147999999989 -45.944716999999997,166.929687999999999 -45.947220000000002,166.836365 -45.981383999999998,166.828033000000005 -45.984444000000003,166.791350999999992 -46.005004999999997,166.785797000000002 -46.010283999999999,166.781096999999988 -46.016396,166.759308000000004 -46.035553,166.762969999999996 -46.038387,166.764969000000008 -46.042392999999997,166.763656999999995 -46.047221999999998,166.760162000000008 -46.050392000000002,166.740982000000002 -46.066059000000003,166.737793000000011 -46.066558999999998,166.670532000000009 -46.087218999999997,166.615783999999991 -46.090836000000003,166.613585999999998 -46.086387999999999,166.617461999999989 -46.059722999999998,166.621062999999992 -46.052498,166.640807999999993 -46.015006999999997,166.661652000000004 -45.991942999999999,166.625792999999987 -45.967216,166.492461999999989 -46.013061999999998,166.484406000000007 -46.014449999999997,166.474975999999998 -46.002785000000003,166.467194000000006 -45.990555,166.465239999999994 -45.983055,166.464690999999988 -45.839438999999999,166.468841999999995 -45.823059,166.472473000000008 -45.815834000000002,166.476898000000006 -45.809722999999998,166.537475999999998 -45.798889000000003,166.613861000000014 -45.801108999999997,166.652190999999988 -45.800277999999999,166.699982000000006 -45.798889000000003,166.881348000000003 -45.779998999999997,166.890807999999993 -45.777779000000002,166.974120999999997 -45.735000999999997,166.987182999999987 -45.709724,166.923034999999999 -45.705832999999998,166.912475999999998 -45.705275999999998,166.887482000000006 -45.705002,166.854126000000008 -45.707779000000002,166.825806 -45.714722000000002,166.809417999999994 -45.721381999999998,166.787475999999998 -45.689995000000003,166.775817999999987 -45.662773,166.81153900000001 -45.617942999999997,166.811217999999997 -45.613109999999999,166.812531000000007 -45.608111999999998,166.816710999999998 -45.605606000000002,166.869689999999991 -45.588779000000002,166.881026999999989 -45.586112999999997,166.88736 -45.585278000000002,166.895203000000009 -45.585608999999998,166.901366999999993 -45.587108999999998,166.912871999999993 -45.590946000000002,166.980255 -45.578612999999997,166.991913000000011 -45.580002,167.0 -45.576949999999997,167.005829000000006 -45.571671000000002,167.032470999999987 -45.527779000000002,167.041350999999992 -45.501396,166.989685000000009 -45.519165,166.891693000000004 -45.544724000000002,166.796875 -45.569389,166.791199000000006 -45.570720999999999,166.784836000000013 -45.571556,166.777023000000014 -45.571219999999997,166.710509999999999 -45.579445,166.704407000000003 -45.574447999999997,166.697204999999997 -45.554718,166.699127000000004 -45.546669,166.757476999999994 -45.425277999999999,166.801361000000014 -45.353614999999998,166.821625000000012 -45.320557,166.86883499999999 -45.279724000000002,166.880797999999999 -45.279167,167.008330999999998 -45.341667,167.038299999999992 -45.357779999999998,167.146941999999996 -45.427222999999998,167.16885400000001 -45.472496,167.205230999999998 -45.477775999999999,167.211914000000007 -45.475273,167.21414200000001 -45.467216,167.209411999999986 -45.461387999999999,167.173584000000005 -45.422775,167.158019999999993 -45.406661999999997,167.134978999999987 -45.386116,167.12912 -45.381385999999999,167.115509000000003 -45.372222999999998,167.097747999999996 -45.366112,167.087463000000014 -45.363616999999998,167.061645999999996 -45.345001000000003,167.051085999999998 -45.333328000000002,167.081421000000006 -45.325333,167.08407600000001 -45.321666999999998,167.092407000000009 -45.316498000000003,167.097243999999989 -45.314498999999998,167.114227 -45.310333,167.163574000000011 -45.302833999999997,167.169922000000014 -45.302998000000002,167.173584000000005 -45.305999999999997,167.176422000000002 -45.309330000000003,167.17756700000001 -45.313834999999997,167.212738000000002 -45.313332000000003,167.218841999999995 -45.318336000000002,167.232178000000005 -45.327224999999999,167.239685000000009 -45.331116000000002,167.248566000000011 -45.334167,167.260254000000003 -45.335830999999999,167.270813000000004 -45.334442000000003,167.301636000000002 -45.329445,167.309692000000013 -45.326110999999997,167.307738999999998 -45.318610999999997,167.300262000000004 -45.314444999999999,167.19464099999999 -45.271445999999997,167.138290000000012 -45.268943999999998,167.099471999999992 -45.272114000000002,167.094146999999992 -45.271278000000002,167.08964499999999 -45.268776000000003,167.002196999999995 -45.201110999999997,166.996917999999994 -45.145836000000003,167.146362000000011 -45.001671000000002,167.198577999999998 -44.956108,167.204407000000003 -44.951110999999997,167.228302000000014 -44.930832000000002,167.24105800000001 -44.921387000000003,167.260528999999991 -44.907501000000003,167.267486999999988 -44.903053,167.312744000000009 -44.875,167.320800999999989 -44.871383999999999,167.393462999999997 -44.862999000000002,167.398987000000005 -44.861496000000002,167.404312000000004 -44.863498999999997,167.421798999999993 -44.894168999999998,167.422974000000011 -44.898665999999999,167.420638999999994 -44.908496999999997,167.417968999999999 -44.912166999999997,167.440796000000006 -44.928612,167.439972000000012 -44.9375,167.441924999999998 -44.945,167.459686000000005 -44.99472,167.497741999999988 -45.003891000000003,167.507202000000007 -45.001396,167.508224000000013 -45.0,167.511658000000011 -44.995277000000002,167.511108000000007 -44.986946000000003,167.47908000000001 -44.903446000000002,167.465912000000003 -44.876441999999997,167.462752999999992 -44.867947,167.461578000000003 -44.863444999999999,167.460097999999988 -44.853946999999998,167.459411999999986 -44.843944999999998,167.459914999999995 -44.838444000000003,167.448577999999998 -44.795279999999998,167.453033000000005 -44.788894999999997,167.458587999999992 -44.783614999999998,167.59970100000001 -44.683883999999999,167.743010999999996 -44.611671,167.838866999999993 -44.498610999999997,167.850249999999988 -44.488052000000003,167.949982000000006 -44.40361,167.963593000000003 -44.395004,168.034973000000008 -44.353614999999998,168.12802099999999 -44.316947999999996,168.141662999999994 -44.308052000000004,168.144713999999993 -44.300834999999999,168.144135000000006 -44.292503000000004,168.124099999999999 -44.251404,168.143311000000011 -44.253059,168.153594999999996 -44.251396,168.169708000000014 -44.24472,168.288299999999992 -44.172775,168.29385400000001 -44.167503000000004,168.336638999999991 -44.123885999999999,168.339966000000004 -44.116661,168.337738000000002 -44.109169,168.334411999999986 -44.102783000000002,168.336365 -44.094444000000003,168.369689999999991 -44.043334999999999,168.374968999999993 -44.037781000000003,168.383026 -44.034447,168.402771 -44.029724000000002,168.672211000000004 -43.987777999999999,168.676909999999992 -43.993614,168.683043999999995 -43.998336999999999,168.690246999999999 -44.002228000000002,168.715239999999994 -44.012222,168.723021999999986 -44.012504999999997,168.753875999999991 -44.010002,168.764160000000004 -44.008614,168.824401999999992 -43.988334999999999,168.858582000000013 -43.976661999999997,168.866364000000004 -43.973328000000002,168.879669000000007 -43.964447,168.885254000000003 -43.959167,168.961914000000007 -43.90361,169.080765000000014 -43.848472999999998,169.142212 -43.794167000000002,169.224396000000013 -43.743332000000002,169.271636999999998 -43.722496,169.387482000000006 -43.679169000000002,169.491318000000007 -43.643467,169.539153999999996 -43.633614,169.62661700000001 -43.613892,169.64498900000001 -43.608893999999999,169.652771 -43.605559999999997,169.660521999999986 -43.601944000000003,169.721619000000004 -43.573334000000003,169.728302000000014 -43.568893000000003,169.739136000000002 -43.558052000000004,169.767486999999988 -43.522773999999998,169.790526999999997 -43.496665999999998,169.871062999999992 -43.406661999999997,169.884154999999993 -43.397781000000002,169.961638999999991 -43.371941,170.021911999999986 -43.352500999999997,170.028594999999996 -43.347777999999998,170.033874999999995 -43.342498999999997,170.038025000000005 -43.336112999999997,170.049408 -43.306946000000003,170.111358999999993 -43.254173000000002,170.288299999999992 -43.107779999999998,170.418029999999987 -43.052498,170.523041000000006 -43.010559,170.531921000000011 -43.008057,170.583037999999988 -42.990555,170.674347000000012 -42.958739999999999,170.704407000000003 -42.945830999999998,170.750549000000007 -42.924720999999998,170.781096999999988 -42.910553,170.794128 -42.901389999999999,171.065796000000006 -42.648055999999997,171.108306999999996 -42.608055,171.149719000000005 -42.563614,171.153594999999996 -42.55722,171.196075000000008 -42.476661999999997,171.225799999999992 -42.433608999999997,171.230255 -42.40889,171.235779000000008 -42.394165,171.247467 -42.375,171.260254000000003 -42.366112,171.270537999999988 -42.355003000000004,171.297760000000011 -42.310279999999999,171.304413000000011 -42.296669,171.309692000000013 -42.281944000000003,171.31665000000001 -42.249724999999998,171.321075000000008 -42.224716,171.322754000000003 -42.207222000000002,171.324401999999992 -42.18972,171.326355000000007 -42.172226000000002,171.329131999999987 -42.155830000000002,171.343841999999995 -42.110832000000002,171.361084000000005 -42.067779999999999,171.461638999999991 -41.859726000000002,171.51080300000001 -41.764449999999997,171.533051 -41.766396,171.557738999999998 -41.766663,171.569121999999993 -41.766112999999997,171.650817999999987 -41.761391000000003,171.663025000000005 -41.757781999999999,171.685790999999995 -41.746948000000003,171.790526999999997 -41.696387999999999,171.85522499999999 -41.652779000000002,171.886658000000011 -41.629997000000003,171.942200000000014 -41.550277999999999,172.02276599999999 -41.443053999999997,172.053864000000004 -41.417503000000004,172.064972000000012 -41.40361,172.122192000000013 -41.277779000000002,172.111633000000012 -41.236114999999998,172.10522499999999 -41.153053,172.106078999999994 -40.911385000000003,172.10635400000001 -40.893059,172.108856000000003 -40.885559,172.113861000000014 -40.879997000000003,172.186645999999996 -40.813332000000003,172.218567000000007 -40.785834999999999,172.22470100000001 -40.781109,172.255248999999992 -40.776947,172.263884999999988 -40.774169999999998,172.271362000000011 -40.770553999999997,172.299408 -40.755004999999997,172.348297000000002 -40.727493000000003,172.382721000000004 -40.698334000000003,172.426909999999992 -40.657775999999998,172.478302000000014 -40.613892,172.513320999999991 -40.598441999999999,172.517639000000003 -40.596783000000002,172.523482999999999 -40.597946,172.522644000000014 -40.602943000000003,172.521132999999992 -40.607277000000003,172.520813000000004 -40.625,172.519440000000003 -40.631385999999999,172.525542999999999 -40.6325,172.534149000000014 -40.631667999999998,172.571899000000002 -40.617775000000002,172.596343999999988 -40.601394999999997,172.62802099999999 -40.573891000000003,172.631621999999993 -40.567222999999998,172.631621999999993 -40.559998,172.608582000000013 -40.556946000000003,172.601348999999999 -40.558891000000003,172.597014999999999 -40.553333000000002,172.589690999999988 -40.558838000000002,172.583862000000011 -40.560004999999997,172.581024000000014 -40.556671,172.581848000000008 -40.551665999999997,172.589843999999999 -40.541172000000003,172.627166999999986 -40.511947999999997,172.633330999999998 -40.509171000000002,172.661376999999987 -40.502785000000003,172.712188999999995 -40.495552000000004,172.817748999999992 -40.504173000000002,172.861358999999993 -40.507781999999999,172.981628 -40.527222000000002,172.991332999999997 -40.529167,172.989959999999996 -40.53389,172.978026999999997 -40.53389,172.945251000000013 -40.530830000000002,172.895263999999997 -40.524445,172.797211000000004 -40.516112999999997,172.739959999999996 -40.516945,172.731628 -40.519722000000002,172.656921000000011 -40.653328000000002,172.701355000000007 -40.748336999999999,172.855804000000006 -40.853057999999997,172.865509000000003 -40.853057999999997,172.875244000000009 -40.851112,172.907195999999999 -40.828887999999999,172.930266999999986 -40.802222999999998,172.935241999999988 -40.796669,172.976623999999987 -40.781944000000003,172.985229000000004 -40.781112999999998,173.002196999999995 -40.786667,173.008330999999998 -40.791114999999998,173.013306 -40.796669,173.020537999999988 -40.809722999999998,173.051085999999998 -40.869446000000003,173.059692000000013 -40.962775999999998,173.059692000000013 -40.971938999999999,173.056091000000009 -40.978606999999997,173.031646999999992 -41.027495999999999,173.075806 -41.291114999999998,173.079680999999994 -41.297500999999997,173.085784999999987 -41.302222999999998,173.105529999999987 -41.313332000000003,173.168029999999987 -41.316108999999997,173.188873 -41.313332000000003,173.198853000000014 -41.311385999999999,173.207184000000012 -41.308608999999997,173.272217000000012 -41.274445,173.278320000000008 -41.269722000000002,173.32607999999999 -41.222496,173.340515000000011 -41.205832999999998,173.351623999999987 -41.195549,173.377166999999986 -41.178055,173.426085999999998 -41.150275999999998,173.598021999999986 -41.053612,173.606628 -41.052498,173.639709000000011 -41.073616,173.672760000000011 -41.070557,173.720519999999993 -41.060279999999999,173.727753000000007 -41.056389000000003,173.739959999999996 -41.047226000000002,173.744689999999991 -41.032501000000003,173.743286000000012 -41.024169999999998,173.738281 -41.018608,173.72744800000001 -41.019447,173.718841999999995 -41.022499000000003,173.696930000000009 -41.033614999999998,173.690796000000006 -41.038338000000003,173.682189999999991 -41.041114999999998,173.676085999999998 -41.036391999999999,173.673584000000005 -41.029167,173.674682999999987 -41.020836000000003,173.678314 -41.014449999999997,173.696625000000012 -41.000281999999999,173.751373 -40.976944000000003,173.800262000000004 -40.969161999999997,173.913299999999992 -40.931671,173.984679999999997 -40.896949999999997,173.994415000000004 -40.896667,174.02276599999999 -40.913055,174.027771 -40.91861,174.030272999999994 -40.925834999999999,174.03054800000001 -40.935271999999998,174.02941899999999 -40.943610999999997,174.022217000000012 -40.947220000000002,173.929961999999989 -40.992226000000002,173.832184000000012 -40.995002999999997,173.821075000000008 -40.994163999999998,173.782195999999999 -41.009171000000002,173.778594999999996 -41.015555999999997,173.769713999999993 -41.09861,173.778594999999996 -41.114449,173.794433999999995 -41.109444000000003,173.822204999999997 -41.080832999999998,173.821899000000002 -41.062218,173.836638999999991 -41.055,173.846343999999988 -41.053055,173.93081699999999 -41.049446000000003,173.946625000000012 -41.055832000000002,173.953033000000005 -41.060555,173.917755 -41.087502,173.887482000000006 -41.103332999999999,173.848846000000009 -41.144165,173.820526 -41.245834000000002,173.763306 -41.267502,173.76080300000001 -41.273055999999997,173.775817999999987 -41.289726000000002,173.788025000000005 -41.290557999999997,173.806365999999997 -41.289444000000003,174.03720100000001 -41.218330000000002,174.09970100000001 -41.198334000000003,174.128845000000013 -41.187218,174.133605999999986 -41.181671,174.133605999999986 -41.176108999999997,174.126068000000004 -41.174171,174.008605999999986 -41.175277999999999,174.001099000000011 -41.178885999999999,174.001373 -41.186385999999999,174.000274999999988 -41.194716999999997,173.993010999999996 -41.198334000000003,173.981902999999988 -41.199440000000003,173.932738999999998 -41.199997000000003,173.908324999999991 -41.199997000000003,173.899719000000005 -41.197495000000004,173.893585000000002 -41.192771999999998,173.887206999999989 -41.169724000000002,173.88580300000001 -41.161667,173.888031000000012 -41.154167,173.89776599999999 -41.133614,173.902466000000004 -41.128334000000002,174.032745000000006 -40.999724999999998,174.084411999999986 -41.021385000000002,174.094116000000014 -41.023330999999999,174.246338000000009 -41.044724000000002,174.258330999999998 -41.035277999999998,174.299408 -41.003616,174.315246999999999 -41.000557,174.323853000000014 -41.003334000000002,174.323853000000014 -41.010834000000003,174.321625000000012 -41.018059,174.209960999999993 -41.197495000000004,174.161376999999987 -41.225555,174.152771 -41.226661999999997,174.114685000000009 -41.231383999999998,174.052185000000009 -41.235000999999997,174.02664200000001 -41.236114999999998,174.053864000000004 -41.254173000000002,174.206359999999989 -41.269447,174.214966000000004 -41.266663,174.291655999999989 -41.238892,174.303588999999988 -41.229720999999998,174.320800999999989 -41.220275999999998,174.326904000000013 -41.222771000000002,174.288574000000011 -41.276947,174.249114999999989 -41.322502,174.241637999999995 -41.326110999999997,174.231902999999988 -41.328055999999997,174.208587999999992 -41.329445,174.193572999999986 -41.320281999999999,174.155243000000013 -41.305,174.148041000000006 -41.308608999999997,174.111633000000012 -41.336661999999997,174.052764999999994 -41.421112,174.049133000000012 -41.427779999999998,174.044433999999995 -41.442497000000003,174.045806999999996 -41.450836000000002,174.049988000000013 -41.466392999999997,174.063873 -41.493057,174.084136999999998 -41.526108,174.097473000000008 -41.519447,174.096069 -41.511116,174.100799999999992 -41.505561999999998,174.108306999999996 -41.509171000000002,174.114685000000009 -41.513893000000003,174.125792999999987 -41.523887999999999,174.151093000000003 -41.551392,174.176085999999998 -41.578612999999997,174.178864000000004 -41.586112999999997,174.179961999999989 -41.594444000000003,174.179137999999995 -41.602783000000002,174.174133000000012 -41.608336999999999,174.163299999999992 -41.618606999999997,174.157195999999999 -41.623328999999998,174.193024000000008 -41.685555,174.287749999999988 -41.734444000000003,174.291655999999989 -41.740836999999999,174.289153999999996 -41.748336999999999,174.283324999999991 -41.762222,174.236358999999993 -41.837218999999997,174.212188999999995 -41.865279999999998,174.201355000000007 -41.875557,174.184143000000006 -41.890555999999997,174.17804000000001 -41.895004,174.164703000000003 -41.90361,174.157195999999999 -41.907218999999998,174.143585000000002 -41.915832999999999,174.088561999999996 -41.957779000000002,174.009154999999993 -42.027495999999999,173.979674999999986 -42.061110999999997,173.965239999999994 -42.086945,173.959136999999998 -42.100838000000003,173.954407000000003 -42.115555,173.953307999999993 -42.123885999999999,173.953583000000009 -42.133330999999998,173.956359999999989 -42.166389000000002,173.933319000000012 -42.196944999999999,173.928314 -42.202499000000003,173.884154999999993 -42.243614,173.87802099999999 -42.248055,173.870513999999986 -42.251944999999999,173.86300700000001 -42.255561999999998,173.834686000000005 -42.271385000000002,173.801361000000014 -42.293059999999997,173.794983000000002 -42.297500999999997,173.568572999999986 -42.476944000000003,173.558593999999999 -42.487777999999999,173.541350999999992 -42.511947999999997,173.533874999999995 -42.525002,173.531372000000005 -42.532218999999998,173.500823999999994 -42.599724000000002,173.480804000000006 -42.621941,173.466063999999989 -42.656944000000003,173.459960999999993 -42.670836999999999,173.448853000000014 -42.690277000000002,173.387755999999996 -42.793616999999998,173.351623999999987 -42.840836000000003,173.328033000000005 -42.898887999999999,173.328033000000005 -42.906387000000002,173.325806 -42.913612,173.285521999999986 -42.958053999999997,173.106902999999988 -43.057777000000002,173.099396000000013 -43.061385999999999,173.090515000000011 -43.064444999999999,173.026366999999993 -43.081947,172.975799999999992 -43.09111,172.953033000000005 -43.092773,172.935516000000007 -43.098334999999999,172.92025799999999 -43.105834999999999,172.838012999999989 -43.148055999999997,172.818024000000008 -43.160828000000002,172.797760000000011 -43.183059999999998,172.772217000000012 -43.219718999999998,172.76080300000001 -43.239165999999997,172.758026 -43.246665999999998,172.726944000000003 -43.415539000000003,172.726593000000008 -43.423355,172.775817999999987 -43.612220999999998,172.894135000000006 -43.61972,172.90554800000001 -43.620834000000002,173.059692000000013 -43.653053,173.100525000000005 -43.697220000000002,173.105529999999987 -43.703612999999997,173.114409999999992 -43.741385999999999,173.116913000000011 -43.762504999999997,173.116913000000011 -43.769996999999996,173.112182999999987 -43.825004999999997,173.110779000000008 -43.833328000000002,173.091644000000002 -43.856392,173.058593999999999 -43.871108999999997,173.006088000000005 -43.869498999999998,173.002242999999993 -43.868999000000002,172.999236999999994 -43.865668999999997,172.990905999999995 -43.849670000000003,172.965239999999994 -43.802222999999998,172.961365 -43.764449999999997,172.958862000000011 -43.756950000000003,172.951355000000007 -43.755279999999999,172.939972000000012 -43.756110999999997,172.927185000000009 -43.766112999999997,172.921906000000007 -43.771667,172.920532000000009 -43.824173000000002,172.920532000000009 -43.833328000000002,172.917572000000007 -43.869221000000003,172.923584000000005 -43.875884999999997,172.931243999999992 -43.881390000000003,172.937408000000005 -43.887886000000002,172.938904000000008 -43.892384,172.938247999999987 -43.896220999999997,172.870789000000002 -43.904442000000003,172.861633000000012 -43.901389999999999,172.811919999999986 -43.882216999999997,172.804413000000011 -43.878334000000002,172.745789000000002 -43.837775999999998,172.740783999999991 -43.832222000000002,172.736908 -43.825836000000002,172.715239999999994 -43.808334000000002,172.642761000000007 -43.772224,172.513031000000012 -43.729438999999999,172.495238999999998 -43.723885000000003,172.483582000000013 -43.722771000000002,172.472197999999992 -43.72361,172.424988000000013 -43.733612,172.413299999999992 -43.743614,172.390258999999986 -43.763893000000003,172.384978999999987 -43.77861,172.382445999999987 -43.795006,172.383330999999998 -43.8125,172.384704999999997 -43.820838999999999,172.394713999999993 -43.850281000000003,172.393311000000011 -43.858612,172.386932000000002 -43.863334999999999,172.367461999999989 -43.867775000000002,172.297211000000004 -43.881110999999997,172.286925999999994 -43.883057,172.275542999999999 -43.883887999999999,172.189696999999995 -43.909163999999997,172.050812000000008 -43.965279000000002,171.978577 -43.995834000000002,171.955230999999998 -44.006667999999998,171.941070999999994 -44.015006999999997,171.782470999999987 -44.076949999999997,171.654694000000006 -44.122498,171.583587999999992 -44.153885000000002,171.547211000000004 -44.173889000000003,171.538483000000014 -44.178775999999999,171.355559999999997 -44.285491999999998,171.346465999999992 -44.292186999999998,171.342467999999997 -44.295555,171.319976999999994 -44.316391000000003,171.293578999999994 -44.343612999999998,171.285521999999986 -44.356392,171.278594999999996 -44.369995000000003,171.271911999999986 -44.383887999999999,171.269135000000006 -44.391112999999997,171.275542999999999 -44.395836000000003,171.279144000000002 -44.402495999999999,171.278594999999996 -44.420836999999999,171.277190999999988 -44.428885999999999,171.275542999999999 -44.437218,171.26998900000001 -44.451942000000003,171.263306 -44.465553,171.254974000000004 -44.478332999999999,171.214966000000004 -44.533057999999997,171.208313000000004 -44.537506,171.200531000000012 -44.541114999999998,171.196075000000008 -44.560279999999999,171.192200000000014 -44.645836000000003,171.193024000000008 -44.663330000000002,171.20495600000001 -44.700279000000002,171.21414200000001 -44.739165999999997,171.215239999999994 -44.747498,171.207184000000012 -44.851112,171.198577999999998 -44.919998,171.195800999999989 -44.927498,171.185241999999988 -44.938332000000003)))
diff --git a/webapp/django/contrib/gis/tests/geoapp/sql/state.mysql.sql b/webapp/django/contrib/gis/tests/geoapp/sql/state.mysql.sql
new file mode 100644
index 0000000..0796306
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/geoapp/sql/state.mysql.sql
@@ -0,0 +1,5 @@
+-- State border data courtesy of U.S. Census Bureau Cartographic Boundary Files: http://www.census.gov/geo/www/cob/st2000.html
+-- Boundary file data is a product of the U.S. federal government and is public domain.  See 17 U.S.C. 105.
+-- INSERT INTO geoapp_state (`name`, `poly`) VALUES ('Puerto Rico', NULL); MySQL spatial indices can't handle NULL values :-/
+INSERT INTO geoapp_state (`name`, `poly`) VALUES ('Colorado', GeomFromText('POLYGON ((-107.918420999999981 41.002035999999997,-107.69133582431418 41.002104250342249,-107.625624000000002 41.002124000000002,-107.521505363272311 41.002506710525772,-107.367442999999994 41.003073,-107.317794462401125 41.002967213367114,-107.305312956219666 41.00294061889776,-107.241193999999993 41.002803999999998,-107.000606000000005 41.003443999999995,-106.857772999999995 41.002662999999991,-106.453858999999994 41.002056999999994,-106.439563000000007 41.001978,-106.437419000000006 41.001794999999994,-106.430949999999996 41.001751999999996,-106.391852 41.001176,-106.386356000000006 41.001143999999996,-106.321164999999993 40.999122999999997,-106.217573000000002 40.997734,-106.194624254510543 40.99762614711792,-106.190540579491184 40.997606954952467,-106.061180999999991 40.996999000000002,-105.764246857267409 40.99689755617932,-105.730421000000007 40.996886000000003,-105.724804000000006 40.99691,-105.554417704421283 40.997390710823062,-105.412220703167577 40.997791891195448,-105.277137999999979 40.998173,-105.256527000000006 40.998190999999998,-105.254778999999999 40.99821,-105.173435761678107 40.998177015252317,-104.943370680568208 40.998083723679372,-104.855272999999997 40.998047999999997,-104.829503999999986 40.999270000000003,-104.675999000000004 41.000957,-104.497148999999993 41.001828000000003,-104.497057999999996 41.001804999999997,-104.467671999999979 41.001472999999997,-104.214691999999999 41.001657000000002,-104.214191 41.001567999999999,-104.211472999999998 41.001590999999998,-104.123585999999989 41.001625999999995,-104.104590000000002 41.001542999999991,-104.086067999999983 41.001562999999997,-104.066960999999992 41.001503999999997,-104.053248999999994 41.001405999999996,-104.039237999999997 41.001502000000002,-104.023382999999981 41.001887000000004,-104.018223000000006 41.001617000000003,-104.010804886779724 41.00161667450854,-103.972641999999979 41.001615,-103.971373 41.001524000000003,-103.953524999999999 41.001595999999999,-103.906323999999998 41.001387,-103.896207000000004 41.00175,-103.877966999999998 41.00167299999999,-103.858448999999993 41.001680999999998,-103.750497999999993 41.002054,-103.574522000000002 41.001721000000003,-103.497446999999994 41.001635,-103.486697000000007 41.001913999999999,-103.421975000000003 41.002006999999999,-103.421925000000002 41.001968999999995,-103.396990999999986 41.002558,-103.365313999999984 41.001846,-103.362978999999996 41.001843999999991,-103.077804 41.002298000000003,-103.076536000000004 41.002253000000003,-103.059537999999989 41.002367999999997,-103.057997999999998 41.002367999999997,-103.043443999999994 41.002344,-103.038703999999996 41.002251,-103.002026 41.002485999999998,-103.000101999999984 41.002400000000002,-102.982690000000005 41.002156999999997,-102.981482999999997 41.002111999999997,-102.963668999999982 41.002185999999995,-102.962522000000007 41.002071999999998,-102.960706000000002 41.002058999999996,-102.959623999999991 41.002094999999997,-102.944829999999996 41.002302999999998,-102.943109000000007 41.002051000000002,-102.925567999999998 41.002279999999999,-102.924029000000004 41.002141999999999,-102.906546999999989 41.002275999999995,-102.904796000000005 41.002206999999999,-102.887406999999982 41.002178,-102.885745999999997 41.002130999999999,-102.867822000000004 41.002183000000002,-102.865783999999991 41.001987999999997,-102.849262999999993 41.002301000000003,-102.846455000000006 41.002256000000003,-102.830302999999986 41.002350999999997,-102.827280000000002 41.002142999999997,-102.773545999999996 41.002414000000002,-102.766722999999999 41.00227499999999,-102.754616999999996 41.002360999999993,-102.739623999999992 41.002229999999997,-102.653462999999988 41.002332000000003,-102.621032999999997 41.002597000000002,-102.578695999999994 41.002291,-102.575738 41.002268,-102.575496 41.002200000000002,-102.566047999999995 41.002200000000002,-102.556788999999995 41.002218999999997,-102.517701071582451 41.002347335877943,-102.487954999999985 41.002444999999994,-102.470536999999979 41.002381999999997,-102.469223 41.002423999999998,-102.460334593696913 41.00241180236555,-102.387750989484957 41.002312195277327,-102.380372991932845 41.002302070389462,-102.379593 41.002301000000003,-102.364065999999994 41.002173999999997,-102.292833000000002 41.002206999999999,-102.292621999999994 41.002229999999997,-102.292552999999998 41.002206999999999,-102.291353999999998 41.002206999999999,-102.277803455573988 41.002233743569548,-102.272099999999995 41.002245000000002,-102.267811999999992 41.002383000000002,-102.231931000000003 41.002327,-102.212199999999982 41.002462,-102.209361 41.002442000000002,-102.209083936251005 41.002440229332002,-102.207776055197755 41.002431870883314,-102.191209999999998 41.002325999999996,-102.124972 41.002338000000002,-102.070598000000004 41.002423,-102.051614 41.002377000000003,-102.051291999999989 40.749591000000002,-102.051634432607003 40.582129592617228,-102.051725000000005 40.537838999999991,-102.051518999999999 40.520094,-102.051464999999993 40.440007999999999,-102.051839999999999 40.396396000000003,-102.051571999999993 40.393079999999998,-102.051797999999991 40.360069000000003,-102.051585542616536 40.350646145741024,-102.051309000000003 40.338380999999998,-102.051922000000005 40.235343999999998,-102.05189399999999 40.229192999999995,-102.051908999999995 40.162674000000003,-102.052001000000004 40.148358999999999,-102.051852600888665 40.064469617536822,-102.051743999999999 40.003078000000002,-102.051715564657869 39.978173027456265,-102.051569 39.849805000000003,-102.051362999999995 39.843471,-102.051317999999995 39.833311000000002,-102.051254 39.818992,-102.05059399999999 39.67559399999999,-102.050099000000003 39.653812000000002,-102.050421999999983 39.646047999999993,-102.049954 39.592331,-102.04980599999999 39.574058,-102.049553999999986 39.538932000000003,-102.049672999999999 39.536690999999998,-102.049678999999998 39.506183,-102.049368999999999 39.423333,-102.049369999999996 39.418210000000002,-102.049166999999983 39.403596999999998,-102.04895999999998 39.37371199999999,-102.048449000000005 39.30313799999999,-102.047250000000005 39.13702,-102.047133999999986 39.129700999999997,-102.046570999999986 39.047038,-102.045387999999988 38.813391999999993,-102.045333999999997 38.799463000000003,-102.045447999999993 38.783453000000002,-102.045371000000003 38.770063999999998,-102.045287000000002 38.755527999999998,-102.045375000000007 38.754338999999995,-102.045211999999992 38.697566999999999,-102.045156000000006 38.688555,-102.045126999999994 38.686725000000003,-102.045159999999996 38.675221,-102.045102 38.674945999999998,-102.045074 38.669617000000002,-102.045287999999999 38.615248999999999,-102.045210999999995 38.581608999999993,-102.045188999999979 38.558731999999992,-102.045222999999993 38.543796999999998,-102.045112000000003 38.523783999999999,-102.045261999999994 38.505531999999995,-102.045262999999991 38.505395,-102.045323999999979 38.453646999999997,-102.044936000000007 38.41968,-102.044441999999989 38.415801999999999,-102.044944 38.384419,-102.044612999999998 38.312323999999997,-102.044567999999998 38.268819,-102.044398 38.250014999999998,-102.044251000000003 38.141777999999995,-102.044535323623649 38.127675380028528,-102.044589000000002 38.125012999999996,-102.044540277332047 38.123262193231092,-102.044255000000007 38.113010999999993,-102.04462354493468 38.04908029653749,-102.044631007072184 38.047785855466316,-102.044644000000005 38.045532,-102.044620085883125 38.042021706570637,-102.044539342086111 38.030169526464491,-102.043844000000007 37.928101999999996,-102.043845000000005 37.926135000000002,-102.043218999999993 37.86792899999999,-102.043032999999994 37.824145999999999,-102.042952999999997 37.803534999999997,-102.042668000000006 37.788758,-102.042158 37.760164000000003,-102.041876000000002 37.723875,-102.041573999999997 37.680436,-102.041694000000007 37.665680999999999,-102.041581999999991 37.654494999999997,-102.041584999999998 37.644281999999997,-102.041618 37.607868000000003,-102.041779405839492 37.578691555295826,-102.041893999999999 37.557977,-102.041899 37.541186000000003,-102.04201599999999 37.535260999999998,-102.041786000000002 37.506065999999997,-102.041800999999992 37.469487999999998,-102.041754999999995 37.434854999999992,-102.041668999999999 37.434739999999998,-102.041675999999981 37.409897999999991,-102.041523999999995 37.375017999999997,-102.042089000000004 37.352818999999997,-102.041973999999996 37.352612999999998,-102.041816999999995 37.309489999999997,-102.041663999999997 37.29764999999999,-102.041962999999996 37.258164,-102.042001999999997 37.141744000000003,-102.042135000000002 37.125020999999997,-102.042091999999997 37.125020999999997,-102.041808999999986 37.111972999999999,-102.041983000000002 37.106551000000003,-102.04191999999999 37.035083,-102.041748999999996 37.034396999999998,-102.041921000000002 37.032178000000002,-102.04195 37.030805,-102.041951999999995 37.024741999999996,-102.042240000000007 36.993082999999999,-102.054502999999997 36.993108999999997,-102.184270999999995 36.993592999999997,-102.208315999999996 36.993729999999999,-102.260789000000003 36.994388,-102.270345681835295 36.994399933337462,-102.307593650497381 36.994446444520669,-102.355288000000002 36.994505999999994,-102.355367 36.994574999999998,-102.698142000000004 36.995148999999998,-102.742059999999981 36.997689,-102.759860000000003 37.000019000000002,-102.77856899999999 36.999242000000002,-102.806762000000006 37.000019000000002,-102.814616 37.000782999999998,-102.841988999999998 36.999597999999999,-102.979613 36.998548999999997,-102.985806999999994 36.998570999999998,-102.986975999999999 36.998524000000003,-103.002199000000005 37.000104,-103.086104969413952 37.000173865694038,-103.10540536532865 37.000189936488113,-103.155922000000004 37.000231999999997,-103.200631728472104 37.000060386509688,-103.327177769406262 36.999574653124313,-103.425678872433053 36.999196567220693,-103.733247000000006 36.998015999999993,-103.734363999999985 36.998041,-104.007854999999992 36.996239000000003,-104.215475488463966 36.994874432196589,-104.250535999999983 36.994644,-104.29757064295984 36.994053250381747,-104.338832999999994 36.993535,-104.355650525350313 36.993556531771581,-104.366447685535107 36.993570355564437,-104.399202882083287 36.993612292614962,-104.429769386650008 36.993651427444888,-104.480610316975273 36.993716519976395,-104.519256999999996 36.993765999999994,-104.624555999999998 36.994376999999993,-104.625545000000002 36.993599000000003,-104.645028999999994 36.993377999999993,-104.706112207267154 36.993426444188657,-104.732031000000006 36.993447000000003,-104.732119999999981 36.993484000000002,-104.839990412520109 36.993395592828207,-105.00055399999998 36.993264000000003,-105.029227999999989 36.99272899999999,-105.120800000000003 36.995427999999997,-105.155041964101514 36.995339147158163,-105.220613 36.995168999999997,-105.251295999999996 36.995604999999998,-105.419309999999996 36.995856000000003,-105.438102743613229 36.995968030697597,-105.442458999999999 36.995994000000003,-105.447254999999998 36.996016999999995,-105.465181999999999 36.995990999999997,-105.47087670692585 36.995978476706256,-105.508835999999988 36.99589499999999,-105.512484999999998 36.995776999999997,-105.533922000000004 36.995874999999998,-105.627469999999988 36.995679000000003,-105.664719999999988 36.995874,-105.716470999999999 36.995848999999993,-105.718407304549174 36.995846016149208,-105.996159000000006 36.995418,-105.997472000000002 36.995417000000003,-106.006633999999991 36.995342999999998,-106.099805867433119 36.994759106704976,-106.163971382218094 36.994356991615014,-106.201468999999989 36.994121999999997,-106.247704999999996 36.994266000000003,-106.248675000000006 36.99428799999999,-106.293278999999998 36.99389,-106.32542867882475 36.994109231664673,-106.343138999999979 36.994230000000002,-106.476277952851959 36.993839335051021,-106.500589000000005 36.993767999999996,-106.617159 36.992967,-106.617124999999987 36.993003999999999,-106.628652000000002 36.993175,-106.628732999999983 36.993160999999994,-106.661344 36.993243,-106.675625999999994 36.993122999999997,-106.750591 36.992460999999999,-106.782095289714647 36.992451749967366,-106.869795999999994 36.992425999999995,-106.877291999999983 37.00013899999999,-106.918886463342702 37.000128747161924,-106.95601836457638 37.000119594324254,-107.107262626744514 37.000082313330452,-107.255202723469637 37.000045846797775,-107.420912999999999 37.000004999999994,-107.422415013680663 37.000004989636103,-107.442181999144324 37.000004853243873,-107.481737001398656 37.00000458031429,-107.524086846417021 37.000004288100286,-107.600713640777798 37.000003759375268,-107.712477900838564 37.000002988201679,-107.855695499501934 37.000002000000002,-107.866308937617532 37.000001926767261,-107.869139908586362 37.000001907233546,-107.869180699306327 37.0000019069521,-108.000623000000004 37.000000999999997,-108.179187075278463 36.999293161624927,-108.187139540298872 36.999261637591275,-108.249358 36.999015,-108.250634999999988 36.999561,-108.288086000000007 36.999555,-108.288399999999996 36.999519999999997,-108.320464 36.999499,-108.320720999999992 36.99951,-108.379165570428881 36.999458977707043,-108.619688999999994 36.999248999999999,-108.620309000000006 36.999287000000002,-108.749269825405847 36.999139933822768,-108.954403999999997 36.998905999999998,-108.958867999999995 36.998913000000002,-109.045222999999993 36.999084000000003,-109.04516599999998 37.072741999999998,-109.045057999999997 37.074660999999999,-109.044995 37.086429000000003,-109.045188999999993 37.096270999999994,-109.045173000000005 37.109464000000003,-109.045202999999987 37.111957999999994,-109.045155999999992 37.112063999999997,-109.045995000000005 37.177278999999999,-109.045978000000005 37.201830999999999,-109.045801505106283 37.205070813598866,-109.045486999999994 37.210844000000002,-109.045559879533187 37.239775672002708,-109.04556019774752 37.239901996533845,-109.045583999999991 37.249350999999997,-109.046038999999993 37.249993000000003,-109.045898042273308 37.32693499054853,-109.045810000000003 37.374993000000003,-109.043799132325617 37.469028334242019,-109.043463783260819 37.484710450871816,-109.043424942780035 37.486526770085334,-109.043137000000002 37.499991999999999,-109.041915000000003 37.530653,-109.041865 37.530726,-109.041805999999994 37.604171,-109.042130999999998 37.617662000000003,-109.042089000000004 37.623795,-109.042269000000005 37.666066999999998,-109.041731999999996 37.711213999999998,-109.041759999999996 37.713182000000003,-109.041635999999997 37.740209999999998,-109.042097999999996 37.749989999999997,-109.042042148900066 37.754383999799849,-109.041460999999998 37.800105000000002,-109.041753999999997 37.83582599999999,-109.04172299999999 37.842050999999998,-109.041843999999998 37.872788,-109.041652818578953 37.881166902788557,-109.041058000000007 37.907235999999997,-109.043120999999985 37.97426,-109.042818999999994 37.997067999999999,-109.042819999999992 37.999301000000003,-109.041972403965843 38.131799166817459,-109.041836656974709 38.153019449536792,-109.041761999999991 38.16469,-109.054648 38.244920999999998,-109.060061999999988 38.275489,-109.059961999999999 38.49998699999999,-109.060253000000003 38.599327999999993,-109.059540999999996 38.719887999999997,-109.057388000000003 38.795455999999994,-109.057216044916757 38.799730849597076,-109.054188999999994 38.874983999999998,-109.05394299999999 38.904414000000003,-109.053797000000003 38.905283999999995,-109.053233000000006 38.942467,-109.053291999999985 38.942878,-109.052435999999986 38.999985000000002,-109.051587912503535 39.115734257770079,-109.051583515738272 39.116334340093104,-109.051580780636755 39.116707634089543,-109.051512000000002 39.126094999999999,-109.050764999999998 39.366677000000003,-109.051362999999981 39.497674000000004,-109.051040248333237 39.660472011844121,-109.050614999999993 39.874969999999998,-109.050872999999996 40.058914999999999,-109.050813000000005 40.059578999999992,-109.050944 40.180711999999993,-109.050972999999999 40.180849000000002,-109.050968715822648 40.22266241227041,-109.050945999999996 40.444367999999997,-109.050314 40.495092,-109.050697999999983 40.499963,-109.049954999999997 40.539901,-109.050073999999995 40.540357999999998,-109.050071964046666 40.540437104308737,-109.048044000000004 40.619230999999999,-109.048248999999998 40.653600999999995,-109.049087999999998 40.714562,-109.048455000000004 40.826081000000002,-109.050076000000004 41.000658999999999,-108.884137999999993 41.000093999999997,-108.631107999999998 41.00015599999999,-108.526667000000003 40.999608000000002,-108.500658999999999 41.000112,-108.250648999999996 41.000114000000004,-108.181227000000007 41.000454999999995,-108.089219003138552 41.001554139247368,-108.046538999999996 41.002063999999997,-107.923234122395939 41.0020370519008,-107.918420999999981 41.002035999999997))'));
+INSERT INTO geoapp_state (`name`, `poly`) VALUES ('Kansas', GeomFromText('POLYGON ((-102.051743999999999 40.003078000000002,-101.916696000000002 40.003141999999997,-101.904176000000007 40.003162000000003,-101.861740775252272 40.002907997451267,-101.841025000000002 40.002783999999991,-101.832160999999999 40.002932999999999,-101.807687 40.002797999999999,-101.804861999999986 40.002752,-101.783266423091504 40.002735966476642,-101.748492901329186 40.002710149056902,-101.627071 40.00262,-101.625809000000004 40.002710999999998,-101.579641080501318 40.002654627564297,-101.54227299999998 40.002608999999993,-101.417209 40.002423999999998,-101.411050023557621 40.002364583193085,-101.409952999999987 40.002353999999997,-101.387325211262052 40.00246006676732,-101.374325999999996 40.002520999999994,-101.342859000000004 40.002580000000002,-101.324035999999992 40.002695999999993,-101.293991000000005 40.002558999999998,-101.286555000000007 40.002558999999998,-101.248672999999997 40.002543000000003,-101.215033000000005 40.002555,-101.19221899999998 40.002490999999999,-101.186892990733696 40.002481867883319,-101.178804999999997 40.002468,-101.168704000000005 40.002547,-101.130906999999993 40.002426999999997,-101.104950380573442 40.002382874850099,-101.104950380567658 40.002382874850092,-101.060316999999998 40.002307000000002,-101.027686000000003 40.002255999999996,-100.962089380046322 40.00217532965339,-100.937427 40.002144999999999,-100.764559455237134 40.002296963384197,-100.758829999999989 40.002301999999993,-100.752183000000002 40.002127999999992,-100.7388309887763 40.002228385746484,-100.733295999999996 40.002270000000003,-100.729904000000005 40.002110999999999,-100.721127999999993 40.002068999999999,-100.683435000000003 40.002234,-100.660229999999984 40.002161999999998,-100.645444999999995 40.001882999999999,-100.626504856699498 40.001892789287538,-100.600944999999996 40.001905999999998,-100.594756999999987 40.001976999999997,-100.567238000000003 40.001888999999998,-100.551885999999996 40.001888999999998,-100.514429898999168 40.001844039098764,-100.511064999999988 40.00184,-100.487159000000005 40.001767,-100.477018 40.001752000000003,-100.475853999999998 40.001767999999998,-100.468772999999985 40.001724000000003,-100.447071999999991 40.001795,-100.439081000000002 40.001773999999997,-100.402449685831499 40.001800164690437,-100.390079999999998 40.001809000000002,-100.290126736823893 40.001691651381378,-100.231651999999997 40.001623000000002,-100.229478999999998 40.001692999999996,-100.215406000000002 40.001629,-100.196958999999993 40.001494,-100.19359 40.001573,-100.190323000000006 40.001586000000003,-100.188181 40.001541000000003,-100.177823000000004 40.001593,-99.990926000000002 40.001503,-99.986610999999996 40.001550000000002,-99.948166999999998 40.001812999999999,-99.944417 40.001584,-99.930432999999979 40.001516000000002,-99.906657999999993 40.001511999999998,-99.850154757615712 40.001444140609848,-99.813400999999999 40.001399999999997,-99.775639999999981 40.001646999999998,-99.772120999999984 40.001804,-99.764213999999996 40.001550999999999,-99.756834999999995 40.001342,-99.746628 40.001820000000002,-99.737774855821357 40.001824224692157,-99.731959000000003 40.001826999999992,-99.719639 40.001807999999997,-99.628345999999993 40.001866,-99.625979999999984 40.001865000000002,-99.515340365578794 40.002008435606839,-99.501791999999995 40.002026,-99.498998999999984 40.00195699999999,-99.497659999999982 40.001911999999997,-99.493464999999986 40.001936999999998,-99.480727999999999 40.001942,-99.423564999999996 40.002270000000003,-99.412644999999998 40.001867999999995,-99.403389000000004 40.001969000000003,-99.366747146128873 40.001962496644857,-99.290702999999979 40.001949000000003,-99.286655999999994 40.002017000000002,-99.282966999999999 40.001879000000002,-99.254012000000003 40.002074,-99.25036999999999 40.00195699999999,-99.216375999999997 40.002015999999998,-99.197591999999986 40.002032999999997,-99.188905000000005 40.002023,-99.186961999999994 40.001976999999997,-99.178965000000005 40.001976999999997,-99.169815999999997 40.001925,-99.123032999999992 40.002164999999998,-99.113510000000005 40.002192999999998,-99.085596999999993 40.002132999999994,-99.067047050731574 40.00217023690761,-99.020337999999995 40.00226399999999,-99.018700999999993 40.002333,-98.992135000000005 40.002192,-98.972286999999994 40.002245000000002,-98.971721000000002 40.002268,-98.961009000000004 40.002316999999998,-98.96091899999999 40.002271,-98.953888072580213 40.002253239016738,-98.934791999999987 40.002204999999996,-98.8435956659672 40.002348607685946,-98.842134005327992 40.002350909376077,-98.834455999999989 40.002363000000003,-98.820589999999982 40.002319,-98.777203 40.002358999999998,-98.774940999999998 40.002336,-98.729330606936671 40.002229113826232,-98.726294999999993 40.002222000000003,-98.710403999999997 40.002180000000003,-98.693095999999997 40.002372999999999,-98.691443000000007 40.002504999999999,-98.690286999999998 40.002547999999997,-98.672819000000004 40.002364,-98.669723999999988 40.002409999999998,-98.653832999999992 40.002268999999998,-98.652494000000004 40.002245000000002,-98.640709999999984 40.002493,-98.616372379820518 40.002409030470169,-98.613754999999998 40.002400000000002,-98.593342000000007 40.002475999999994,-98.575219000000004 40.002479999999991,-98.560578000000007 40.002274,-98.543186000000006 40.002285,-98.523053000000004 40.002336,-98.506634585466017 40.002329436673158,-98.504454999999979 40.002328565375151,-98.50084801790743 40.002327123469641,-98.490532999999999 40.002322999999997,-98.441997554675297 40.002366263566756,-98.391848301995964 40.002410965650498,-98.274015000000006 40.002516,-98.268218000000005 40.002490000000002,-98.25000799999998 40.002307000000002,-98.213290432425865 40.002506421375415,-98.193483 40.002614,-98.179315000000003 40.002482999999998,-98.172269 40.002437999999991,-98.156873151934732 40.002445128178877,-98.142031000000003 40.002451999999998,-98.099659000000003 40.002226999999998,-98.076034000000007 40.002300999999996,-98.068701000000004 40.002355,-98.050056999999981 40.002277999999997,-98.047469000000007 40.002186000000002,-98.042767978165202 40.002191261754177,-98.014411999999979 40.002223,-98.010157000000007 40.002153,-97.972185999999994 40.002113999999999,-97.931810999999996 40.002049999999997,-97.876261 40.002102,-97.85745 40.002065000000002,-97.838378999999989 40.001909999999995,-97.821597999999994 40.002003999999992,-97.819426000000007 40.001957999999995,-97.777154999999993 40.002167,-97.770775999999998 40.001976999999997,-97.769204000000002 40.001995,-97.767746000000002 40.001994000000003,-97.714825952022949 40.001974503868432,-97.706952472912022 40.001971603221314,-97.701160424072398 40.001969469388285,-97.61370959051284 40.001937251863488,-97.595964207410262 40.001930714334961,-97.593671575073259 40.001929869712491,-97.51530799999999 40.001900999999997,-97.511381 40.001899000000002,-97.510264000000006 40.001835,-97.48896951184885 40.0019310946697,-97.481234094494141 40.001966001936331,-97.463284999999999 40.00204699999999,-97.444661999999994 40.001957999999995,-97.425443 40.002048000000002,-97.417825999999991 40.002023999999999,-97.415833000000006 40.002000999999993,-97.369102999999996 40.00206,-97.350896000000006 40.001930000000002,-97.350272000000004 40.001975999999999,-97.256541388870858 40.001563097676062,-97.24516899999999 40.001513000000003,-97.245080000000002 40.001466999999998,-97.202309999999997 40.00144199999999,-97.200190000000006 40.001548999999997,-97.181775000000002 40.001550000000002,-97.165136038800085 40.001526729909067,-97.164288093539042 40.001525544031956,-97.157705785150654 40.001516338474417,-97.144150390621661 40.001497380844818,-97.142447999999987 40.001494999999998,-97.137865999999988 40.001814000000003,-97.049662999999995 40.001322999999999,-97.030802999999992 40.001342,-97.009164999999996 40.001463,-96.918187714380807 40.001505032225388,-96.916093000000004 40.001505999999999,-96.880459000000002 40.001448000000003,-96.878253 40.001466,-96.875056999999998 40.001448000000003,-96.873812 40.001449999999998,-96.868892342573133 40.001444286089438,-96.805301797100199 40.001370429180717,-96.693246065483095 40.001240282633297,-96.622400999999996 40.001157999999997,-96.610348999999999 40.000881,-96.604883999999984 40.000891000000003,-96.581788013355691 40.000963078853125,-96.580851999999993 40.000965999999998,-96.570853999999997 40.001090999999995,-96.557862999999998 40.000968,-96.538977000000003 40.000850999999997,-96.527110999999991 40.001030999999998,-96.469944999999996 40.000965999999998,-96.467535999999996 40.001035000000002,-96.463639999999998 40.000967000000003,-96.354812913341547 40.000735780492882,-96.350953725714731 40.00072758106856,-96.341811057717251 40.000708156095854,-96.304554999999993 40.000629000000004,-96.301066000000006 40.000632000000003,-96.239171999999996 40.000691000000003,-96.223838999999998 40.000729,-96.220170999999993 40.00072,-96.154364999999984 40.000495,-96.154246 40.00045,-96.147166999999982 40.000478999999999,-96.125936999999979 40.000432000000004,-96.125788 40.000467,-96.089781000000002 40.000518999999997,-96.081394999999986 40.000602999999998,-96.051691000000005 40.000726999999998,-96.02409 40.000718999999997,-96.014716997898134 40.000662392993569,-96.010677999999999 40.000638000000002,-95.995389500007406 40.000603953777215,-95.958139000000003 40.000520999999999,-95.901560435593936 40.000482839492363,-95.882524000000004 40.00047,-95.788023999999993 40.000452000000003,-95.784575000000004 40.000463000000003,-95.672891827756033 40.000336669594915,-95.658762261555324 40.000320686938032,-95.63965170807073 40.000299070038061,-95.565216789143676 40.000214872989645,-95.463103327781397 40.00009936736172,-95.455130658279359 40.000090349077695,-95.452048066669519 40.000086862204618,-95.438655850967621 40.000071713601649,-95.436011808705814 40.000068722793607,-95.426269559489981 40.00005770284973,-95.42148745056565 40.000052293567869,-95.41484447973599 40.000044779372317,-95.375257000000005 40.0,-95.339895999999982 39.999999000000003,-95.326448603970363 39.999998574530281,-95.30829 39.999997999999998,-95.308403999999996 39.993758,-95.307779999999994 39.990617999999998,-95.307111000000006 39.989114,-95.302506999999991 39.984357000000003,-95.289715 39.977705999999998,-95.274756999999994 39.972115000000002,-95.269885999999985 39.969396000000003,-95.261854 39.960617999999997,-95.257651999999993 39.954886000000002,-95.250253999999998 39.948644000000002,-95.241382999999999 39.944949,-95.236761 39.943930999999999,-95.231114000000005 39.943784,-95.220212000000004 39.944432999999997,-95.216440000000006 39.943953,-95.213736999999995 39.943205999999996,-95.204427999999993 39.938949,-95.201277000000005 39.934193999999998,-95.200689999999994 39.928154999999997,-95.20201 39.922438,-95.205744999999993 39.915168999999999,-95.206326000000004 39.912120999999999,-95.206195999999991 39.909557,-95.205732999999981 39.908275000000003,-95.202631127107011 39.904826841138963,-95.201935000000006 39.904052999999998,-95.19982446963148 39.902956959499498,-95.199773390195176 39.902930432929807,-95.199730682369619 39.902908253904485,-95.199347000000003 39.902709000000002,-95.193815999999984 39.900689999999997,-95.189565000000002 39.899959000000003,-95.179452999999995 39.900061999999991,-95.172296000000003 39.902025999999999,-95.159833999999989 39.906984,-95.156023999999988 39.907243,-95.153185481864639 39.906665666721331,-95.151701132402337 39.906363761184394,-95.149656999999991 39.905947999999995,-95.148243978290679 39.905255611516672,-95.146055000000004 39.904183000000003,-95.143801999999994 39.901917999999995,-95.142562999999981 39.897992000000002,-95.142444999999995 39.895419999999994,-95.143403000000006 39.889355999999992,-95.142718000000002 39.885888999999992,-95.140601000000004 39.88168799999999,-95.137091999999996 39.878350999999995,-95.134747000000004 39.876852,-95.128165999999993 39.874164999999998,-95.105912000000004 39.869163999999998,-95.090958483530287 39.863446088154532,-95.090158000000002 39.86314,-95.085003 39.861882999999999,-95.081534000000005 39.861718000000003,-95.079786043666886 39.861878094210859,-95.052535000000006 39.864373999999998,-95.042141999999998 39.864804999999997,-95.037767000000002 39.865541999999998,-95.034318031759739 39.867229060943565,-95.032053000000005 39.868336999999997,-95.031002514960235 39.869148692103728,-95.027930999999981 39.871521999999999,-95.025918959417425 39.87568321107333,-95.025422000000006 39.876711,-95.025119000000004 39.878833,-95.02586205726584 39.885935119809076,-95.025947000000002 39.886747,-95.025771840138887 39.887478608302466,-95.025475064075451 39.888718183571669,-95.025239999999997 39.889699999999998,-95.024388999999999 39.891202,-95.021897459019584 39.893924778577606,-95.019088516216428 39.896994416745422,-95.018742999999986 39.89737199999999,-95.018224596337973 39.897611313155366,-95.013151999999991 39.899952999999996,-95.010684182587667 39.900289758615472,-95.008439999999993 39.900596,-95.003818999999993 39.900400999999995,-94.990284000000003 39.897010000000002,-94.989784913598129 39.896958718834505,-94.987823822157509 39.896757216540813,-94.986975 39.89667,-94.985308455245701 39.896814869812808,-94.979390624873346 39.897329296428744,-94.977748999999989 39.897472,-94.963345000000004 39.901136,-94.959276000000003 39.901671,-94.958440298615102 39.901548064610132,-94.95153999999998 39.900532999999996,-94.943866999999983 39.898130000000002,-94.935306395585215 39.893779379194363,-94.934493000000003 39.893366,-94.929574000000002 39.888753999999992,-94.927897000000002 39.88611199999999,-94.927358999999996 39.883966,-94.927251999999996 39.880257999999991,-94.928466 39.876344000000003,-94.931084167287821 39.873075003673321,-94.931462999999994 39.872602,-94.938790999999995 39.866954,-94.940742999999998 39.864409999999999,-94.942407000000003 39.861065999999994,-94.942566999999983 39.856601999999995,-94.939767000000003 39.851930000000003,-94.937655000000007 39.849786000000002,-94.926149999999993 39.841321999999998,-94.916917999999995 39.836137999999998,-94.909941999999987 39.834426,-94.903156999999979 39.833849999999998,-94.892677000000006 39.834377999999994,-94.889493000000002 39.834026,-94.886932999999999 39.833098,-94.881012999999996 39.828921999999991,-94.878676999999996 39.826521999999997,-94.877043999999998 39.823754,-94.876543999999996 39.820594,-94.875944000000004 39.813293999999999,-94.87632679569893 39.807169268817198,-94.876344000000003 39.806894,-94.876705972386588 39.80614007495069,-94.880932 39.797338000000003,-94.884084 39.794234000000003,-94.890292000000002 39.791626,-94.892965000000004 39.791097999999991,-94.912908274541266 39.790276806342419,-94.92474489359239 39.789789416146199,-94.925605000000004 39.789753999999995,-94.925940683661906 39.789631963361245,-94.927258709273417 39.789152799691166,-94.929653999999999 39.788281999999995,-94.93035270914757 39.787827111232048,-94.930442023078356 39.787768964141691,-94.930979872832452 39.787418801541357,-94.932726000000002 39.786282,-94.932913349551853 39.786043884763131,-94.935059195246907 39.783316584105528,-94.935205999999994 39.78313,-94.935782000000003 39.778905999999999,-94.935301999999993 39.77561,-94.935036741896766 39.775108050050804,-94.934624304242575 39.774327591105198,-94.934262000000004 39.773642000000002,-94.929652999999988 39.769098,-94.929421387607832 39.768921584953624,-94.928626586797606 39.768316199289764,-94.926229000000006 39.76648999999999,-94.923991330811134 39.765173947104167,-94.916788999999994 39.760937999999996,-94.912293000000005 39.759337999999993,-94.906244 39.759417999999997,-94.905921454535701 39.759501730763866,-94.900921941190049 39.760799572828766,-94.899156000000005 39.761257999999998,-94.899025621234756 39.761323457651685,-94.895268000000002 39.76321,-94.895041000000006 39.763350000000003,-94.894070999999997 39.763945999999997,-94.893918999999997 39.76404,-94.893724000000006 39.764159999999997,-94.893646000000004 39.764208000000004,-94.883923999999993 39.770186000000002,-94.881460000000004 39.771258000000003,-94.881422 39.771258000000003,-94.874706321154179 39.772392308082928,-94.871144 39.772993999999997,-94.869643999999994 39.772894,-94.867142999999999 39.771693999999997,-94.865243000000007 39.770094,-94.863142999999994 39.767294,-94.860742999999999 39.763094000000002,-94.859442999999999 39.753694000000003,-94.860369889104035 39.749534984666809,-94.860371 39.74953,-94.862942999999987 39.742994000000003,-94.870142999999999 39.734594,-94.875642999999997 39.730494,-94.884142999999995 39.726793999999998,-94.891743999999989 39.724893999999999,-94.899315999999999 39.724041999999997,-94.900553640444031 39.724102079633198,-94.901582061073228 39.724152002964722,-94.902612000000005 39.724201999999998,-94.906055088082866 39.724933471502588,-94.907014260749904 39.725137244236571,-94.907785666538786 39.725301126582274,-94.910067999999995 39.725785999999999,-94.911087398893699 39.726157408899255,-94.918323999999998 39.728793999999994,-94.93000499999998 39.735370000000003,-94.939221000000003 39.74157799999999,-94.944740999999979 39.744377,-94.948658825773634 39.745572502168315,-94.948680784417533 39.745579202723142,-94.948725999999994 39.745593,-94.952629999999999 39.745961,-94.955286 39.745688999999999,-94.960086000000004 39.743065,-94.963779819772341 39.740240978767318,-94.964692434782606 39.73954326086956,-94.965317999999982 39.739064999999989,-94.965565209393333 39.738728671232884,-94.970224508542714 39.732389687437191,-94.970421999999985 39.732120999999999,-94.971205999999981 39.729304999999997,-94.971078000000006 39.723146,-94.968452999999997 39.707402000000002,-94.968980999999999 39.692954,-94.969909 39.689050000000002,-94.971316999999999 39.686410000000002,-94.976096392737759 39.68160006801152,-94.976325000000003 39.68137,-94.981556999999995 39.678634000000002,-94.984149000000002 39.677849999999992,-94.986445080691666 39.677537608069159,-94.990587390516794 39.676974028501114,-94.993556999999996 39.676569999999998,-94.998766892420107 39.676509388876212,-95.001379 39.676479,-95.004602740773237 39.676177881356345,-95.008105239221649 39.675850724907868,-95.009022999999999 39.675764999999998,-95.010225986948086 39.675477408241932,-95.013209713780839 39.674764104372102,-95.015309999999985 39.674261999999999,-95.018317999999994 39.672868999999999,-95.021521942351953 39.670631293568427,-95.024595000000005 39.668484999999997,-95.027643999999995 39.665453999999997,-95.037464 39.652904999999997,-95.039049000000006 39.649639,-95.044554000000005 39.644370000000002,-95.049518000000006 39.637875999999999,-95.053366999999994 39.630347,-95.054924999999997 39.624994999999991,-95.055024819926729 39.623527163368095,-95.055152000000007 39.621656999999992,-95.054958456554544 39.620961328886679,-95.053131423647116 39.614394255464305,-95.053011999999981 39.613965,-95.052555891387243 39.613278556984888,-95.047910999999999 39.606287999999999,-95.046445000000006 39.601605999999997,-95.046361000000005 39.599556999999997,-95.047165000000007 39.595117000000002,-95.049277000000004 39.589582999999998,-95.054804000000004 39.582487999999998,-95.056897000000006 39.580567000000002,-95.059518999999995 39.579132,-95.064519000000004 39.577114999999999,-95.066275551338904 39.576786470694117,-95.068266439890465 39.576414113098046,-95.069315000000003 39.576217999999997,-95.072159999999982 39.576121999999991,-95.075842551355763 39.576644128527029,-95.076688000000004 39.576763999999997,-95.088569515113861 39.580713698327401,-95.089515000000006 39.581028000000003,-95.09068217809525 39.58095107619048,-95.095736000000002 39.580618,-95.099095000000005 39.579690999999997,-95.100375015351446 39.579100080742663,-95.10182940536555 39.578428661399109,-95.103228 39.577782999999997,-95.106109962410699 39.575487768136732,-95.106244982404746 39.575380236480051,-95.106274453941239 39.575356764970024,-95.106406000000007 39.575251999999999,-95.107454000000004 39.573842999999997,-95.108931052511622 39.56997896968771,-95.109155613535791 39.569391508783276,-95.112830712234896 39.559777298955126,-95.112877844119652 39.559653999999995,-95.113077000000004 39.559132999999996,-95.113262990573148 39.557121201967142,-95.113516735173974 39.554376531201555,-95.113557 39.553940999999995,-95.113330390574859 39.553319942050457,-95.109694540741444 39.543355336910984,-95.109303999999995 39.542284999999993,-95.106595999999996 39.537657000000003,-95.106363136618171 39.537386330858773,-95.106309238275287 39.537323682029822,-95.102887999999993 39.533346999999999,-95.096713422649174 39.527826015970483,-95.095319522838992 39.526579663685382,-95.092703999999998 39.524241000000004,-95.082713999999996 39.516711999999998,-95.077440999999993 39.513551999999997,-95.059460999999985 39.506143000000002,-95.05637999999999 39.503971999999997,-95.052176999999986 39.499995999999996,-95.050551999999996 39.497514000000002,-95.049844999999991 39.494414999999989,-95.048370000000006 39.480420000000002,-95.047133000000002 39.474970999999996,-95.045715999999999 39.472459,-95.040779999999998 39.466386999999997,-95.03749999999998 39.463689000000002,-95.033407999999994 39.460875999999992,-95.028497999999999 39.458286999999999,-95.015825000000007 39.452809000000002,-94.995767999999998 39.448174000000002,-94.990172 39.446192000000003,-94.982144000000005 39.440551999999997,-94.978797999999998 39.436241000000003,-94.976606000000004 39.426701,-94.972952000000006 39.421705000000003,-94.968547467194298 39.418879728230785,-94.966981164652054 39.417875029083376,-94.966065999999998 39.417287999999999,-94.965430539155946 39.417093446959996,-94.954817000000006 39.413843999999997,-94.951209000000006 39.411706999999993,-94.947863999999996 39.408603999999997,-94.946292999999983 39.405645999999997,-94.946662000000003 39.399717000000003,-94.946226999999993 39.395648,-94.945577 39.393850999999998,-94.942038999999994 39.389499,-94.939696999999995 39.387949999999996,-94.938205659338905 39.38711651736979,-94.938199994953891 39.387113351650086,-94.938198708293527 39.387112632559479,-94.937157999999982 39.386530999999998,-94.933651999999995 39.385545999999998,-94.932170703908099 39.385397898493565,-94.923109999999994 39.384492000000002,-94.919224999999997 39.385173999999999,-94.915858999999998 39.386347999999998,-94.909581000000003 39.388865000000003,-94.901822999999993 39.392797999999999,-94.896448416922993 39.39340032396553,-94.894979000000006 39.393565000000002,-94.891845000000004 39.393312999999999,-94.888971999999995 39.392431999999999,-94.888058227506249 39.391822741147728,-94.885025999999996 39.389800999999999,-94.880978999999996 39.383899,-94.879281000000006 39.37977999999999,-94.879087999999996 39.375702999999994,-94.881359999999987 39.370382999999997,-94.885216 39.366911000000002,-94.890928000000002 39.364030999999997,-94.896832000000003 39.363135,-94.899023999999997 39.362431,-94.902496999999997 39.360382999999999,-94.90716104958679 39.35683832231404,-94.907297 39.356735,-94.907510470967722 39.356484333333356,-94.909408999999997 39.354254999999995,-94.910016999999996 39.352542999999997,-94.91007929967077 39.352122876579188,-94.910166635146069 39.351533921963672,-94.910234386079424 39.351077037464393,-94.910640999999998 39.348334999999999,-94.910055514481613 39.342727430625168,-94.908683540921714 39.329587162119807,-94.908064999999993 39.323663000000003,-94.906599414484603 39.317389801180319,-94.905982468129508 39.31474906332776,-94.905548856768945 39.312893060899633,-94.905328999999995 39.311951999999998,-94.904604536115073 39.31007473956825,-94.903592654247163 39.307452709910535,-94.903137 39.306272,-94.902341179156608 39.304705098857582,-94.900693838394318 39.301461629999167,-94.900362755471093 39.300809756886117,-94.900048999999996 39.300192000000003,-94.895217000000002 39.29420799999999,-94.889432625546704 39.288730528394183,-94.887056 39.286479999999997,-94.882576 39.283327999999997,-94.881425972827699 39.282735692772164,-94.879585687759075 39.281787876778168,-94.878319999999988 39.281135999999996,-94.869470269042495 39.278423959123423,-94.867567999999991 39.277841000000002,-94.866576416802303 39.277461598502107,-94.857072000000002 39.273825000000002,-94.850573678793964 39.270595179638669,-94.850470600187833 39.270543947117169,-94.846320000000006 39.268481,-94.844203868589133 39.266965084952687,-94.840994595225254 39.264666085108807,-94.837855000000005 39.262416999999999,-94.836102527271095 39.260730409704507,-94.834879550067882 39.259553409087879,-94.832501320107042 39.257264586268427,-94.832102355305352 39.256880620143498,-94.831470999999993 39.256273,-94.827487000000005 39.249888999999996,-94.826571473591798 39.245793223963304,-94.825663000000006 39.241728999999999,-94.826110999999983 39.238289000000002,-94.826405091238243 39.237538367125239,-94.827108391663188 39.2357432765168,-94.827791000000005 39.234000999999999,-94.828117769197533 39.233533772937683,-94.83244435695299 39.227347452739551,-94.834698551534771 39.224124319346686,-94.834896 39.223841999999998,-94.834917496024659 39.223414229109203,-94.835039139715306 39.220993519665384,-94.835046603087861 39.220844998551456,-94.835055999999994 39.220658,-94.833551999999997 39.217793999999998,-94.831678999999994 39.215938,-94.823791 39.209873999999999,-94.820687000000007 39.208626000000002,-94.811662999999996 39.206594000000003,-94.800359054554335 39.206051410618606,-94.799662999999995 39.206018,-94.798924306591658 39.206116812235138,-94.793913945984244 39.206787029303406,-94.788135068391796 39.207560047994349,-94.787343000000007 39.207666000000003,-94.783838000000003 39.207154000000003,-94.781518000000005 39.206145999999997,-94.780294078498926 39.205273290755756,-94.778971577769184 39.204330290235411,-94.777838000000003 39.203522,-94.775537999999997 39.200602000000003,-94.770897097034492 39.191141697801093,-94.770859400196969 39.191064854247678,-94.770337999999995 39.190002,-94.763137999999998 39.179903000000003,-94.75233799999998 39.173202999999994,-94.74193799999999 39.170203,-94.736536999999998 39.169203000000003,-94.723636999999997 39.169002999999989,-94.714136999999994 39.170403,-94.696331999999998 39.178562999999997,-94.687235999999999 39.183503000000002,-94.680335999999983 39.184303,-94.669134999999997 39.182003000000002,-94.663835000000006 39.179102999999998,-94.660314999999997 39.168050999999991,-94.662434999999988 39.157602999999995,-94.650734999999983 39.154102999999999,-94.640034999999997 39.153102999999994,-94.623934000000006 39.156602999999997,-94.615834000000007 39.160003000000003,-94.608834000000002 39.160502999999999,-94.601732999999996 39.15960299999999,-94.596033000000006 39.157702999999998,-94.591932999999997 39.155003,-94.589933000000002 39.140402999999999,-94.592533000000003 39.135902999999992,-94.600433999999993 39.128503000000002,-94.605733999999998 39.122204000000004,-94.607033999999999 39.119404000000003,-94.607354 39.113444,-94.607234000000005 39.089604,-94.607333999999994 39.081703999999995,-94.607275518421304 39.072346947409343,-94.607234000000005 39.065703999999997,-94.607342812841125 39.057404745686583,-94.60738379566331 39.05427894858029,-94.607437239929951 39.050202705779334,-94.607518499034526 39.044004999999999,-94.607559479691474 39.040879368039988,-94.607612854426819 39.036808428453341,-94.60764748233197 39.034167326647299,-94.607654028188094 39.033668068249817,-94.60769507925167 39.030537066312085,-94.607898722639391 39.015005000000002,-94.607914652765047 39.013789994834404,-94.607991843462372 39.007902590176151,-94.608087526605189 39.000604749887366,-94.608092759229436 39.000205652880325,-94.608190956218394 38.992716079262479,-94.608212339138063 38.991085184540211,-94.608264438806202 38.98711149548862,-94.608279957450691 38.985927874365181,-94.608301211867541 38.984306780669819,-94.608333999999999 38.981805999999999,-94.608294286905348 38.97390309416464,-94.608273484679671 38.969763451253407,-94.608249262127771 38.964943163424849,-94.608207879518076 38.956708024096379,-94.608134000000007 38.942005999999999,-94.608134000000007 38.940005999999997,-94.607866 38.937398000000002,-94.607977999999989 38.936869999999992,-94.608002838442587 38.912906322207348,-94.608006216770249 38.909646973100827,-94.608010407202343 38.90560412040071,-94.608022064178897 38.894357681354862,-94.60802273861259 38.893706999999999,-94.608033000000006 38.883806999999997,-94.608033000000006 38.869207000000003,-94.608033000000006 38.868107000000002,-94.607992999999993 38.867271000000002,-94.608033000000006 38.861207,-94.608033000000006 38.855007,-94.608033000000006 38.850107,-94.608033000000006 38.847206999999997,-94.607624999999999 38.827559999999991,-94.607668973053535 38.825816299300072,-94.608041 38.811064000000002,-94.608617609754887 38.781926100280451,-94.609398999999996 38.742440000000002,-94.60945599999998 38.74069999999999,-94.609507757106428 38.73815999467709,-94.609625656590424 38.7323740198146,-94.610322172686637 38.698192151600097,-94.61071084056907 38.679118085101081,-94.61073851283922 38.677760054904219,-94.611602000000005 38.635384000000002,-94.611464999999995 38.625011,-94.611857999999998 38.620485000000002,-94.611908 38.609271999999997,-94.611905562149673 38.605890005062435,-94.611886999999996 38.580139000000003,-94.611902 38.580109999999998,-94.612176000000005 38.576546,-94.612156999999996 38.549816999999997,-94.612272000000004 38.547916999999998,-94.612464742072774 38.518760616499996,-94.612644000000003 38.491644,-94.612725999999995 38.484366999999999,-94.612696 38.483153999999999,-94.612865999999997 38.477570999999998,-94.613365000000002 38.403421999999999,-94.613264999999998 38.392426,-94.613275404637193 38.388718047420433,-94.613328999999993 38.369617999999996,-94.613311999999993 38.364407,-94.613085455228386 38.3436360393057,-94.612999999999985 38.335800999999996,-94.612825 38.324387000000002,-94.612787999999995 38.320141999999997,-94.612673 38.314832000000003,-94.612673 38.302526999999998,-94.612689368276676 38.301464114946214,-94.612843999999996 38.291422999999995,-94.612848999999997 38.289914000000003,-94.612707829046002 38.272362044447966,-94.612691999999996 38.270394000000003,-94.612613999999994 38.237766,-94.612634999999997 38.226987,-94.612658999999994 38.219251,-94.61265866950464 38.21872154645218,-94.612657999999982 38.217649000000002,-94.612821999999994 38.203918000000002,-94.612848 38.200713999999998,-94.613073 38.190551999999997,-94.61341774677895 38.168183959706163,-94.613422 38.16790799999999,-94.613748 38.160632999999997,-94.613855999999998 38.149768999999999,-94.613889466360249 38.136312911169284,-94.613919497343275 38.124238112111762,-94.614061000000007 38.067343,-94.614088999999993 38.065900999999997,-94.614054999999993 38.060088,-94.613980999999995 38.036949,-94.614211999999981 37.992462000000003,-94.614464999999996 37.987798999999995,-94.614511123427164 37.979395512107736,-94.614514360688489 37.978805697169918,-94.614557000000005 37.971036999999995,-94.614561999999992 37.951517000000003,-94.614593999999997 37.949977999999994,-94.614611999999994 37.944361999999998,-94.614754000000005 37.940769000000003,-94.614834999999999 37.936700000000002,-94.614778 37.934199999999997,-94.615181000000007 37.915944000000003,-94.615392999999983 37.906391999999997,-94.61546899999999 37.901775,-94.615706000000003 37.886842999999999,-94.615921 37.878331000000003,-94.615834000000007 37.872509999999998,-94.616 37.863126,-94.616282760205394 37.851281931678621,-94.616426000000004 37.845281999999997,-94.616433230053673 37.842955730230052,-94.61645 37.837560000000003,-94.616861999999998 37.819456000000002,-94.6176681324215 37.775831003788085,-94.617720999999989 37.77297,-94.617737774720197 37.764628336555312,-94.617744979193901 37.761045725680312,-94.617807999999997 37.729706999999998,-94.617975 37.722175999999997,-94.61780499999999 37.690178000000003,-94.617650999999995 37.687671000000002,-94.617687000000004 37.686652999999993,-94.617885 37.682214000000002,-94.617733999999999 37.673127,-94.617576 37.653671000000003,-94.617517909436387 37.643988652624088,-94.61747699999998 37.637169999999998,-94.617472819127315 37.636539916507168,-94.6173 37.610495,-94.617428000000004 37.609521999999998,-94.617283 37.571896000000002,-94.617315000000005 37.571498999999996,-94.617080999999999 37.567013000000003,-94.61711240153133 37.563155381499406,-94.617159999999984 37.557307999999999,-94.617186000000004 37.553485000000002,-94.617167532949537 37.551779056391354,-94.616988484457494 37.535238968895172,-94.616907999999981 37.527804000000003,-94.616788999999997 37.521509999999999,-94.616880369657522 37.506771761864755,-94.617022999999989 37.483764999999998,-94.617182999999997 37.469664999999999,-94.617180000000005 37.465203000000002,-94.617221999999998 37.460476,-94.617204999999984 37.46037299999999,-94.617200999999994 37.454788,-94.617131999999998 37.439818000000002,-94.617265000000003 37.425535999999994,-94.617510999999993 37.410908999999997,-94.617557000000005 37.396374999999999,-94.61759158917468 37.381725975861251,-94.617625000000004 37.367576,-94.617626 37.367444999999989,-94.617536999999999 37.364355000000003,-94.617636000000005 37.338417,-94.617694999999998 37.336841999999997,-94.617648000000003 37.323588999999998,-94.61807499999999 37.240436000000003,-94.618157999999994 37.237596999999994,-94.618122999999997 37.229334,-94.61815 37.228121000000002,-94.618218999999996 37.207771999999999,-94.618305000000007 37.207337000000003,-94.618319 37.188774000000002,-94.618504999999985 37.181184000000002,-94.618472999999994 37.174782,-94.618351000000004 37.160210999999997,-94.618071999999998 37.132345,-94.61807499999999 37.129755000000003,-94.61816441512984 37.118929895303054,-94.618212 37.113168999999992,-94.618150999999997 37.103968000000002,-94.618059000000002 37.096676000000002,-94.618088 37.093670999999993,-94.618089999999995 37.093494,-94.618085255103864 37.089305442941992,-94.618082 37.086432000000002,-94.61811999999999 37.085934000000002,-94.617981999999998 37.075077,-94.617954311863897 37.070346986543974,-94.617947706480578 37.069218577181687,-94.617910161110728 37.062804634983031,-94.617893975984089 37.060039701061122,-94.617874999999998 37.056798,-94.617877538275181 37.056339390079508,-94.617964999999998 37.040537,-94.617972200190749 37.032971759572447,-94.617994999999979 37.009015999999995,-94.618027702303792 37.004829720380044,-94.618080000000006 36.998134999999998,-94.625223999999989 36.998671999999999,-94.699735000000004 36.998804999999997,-94.701796999999999 36.998814000000003,-94.711286363060864 36.99879670415919,-94.712770000000006 36.99879399999999,-94.722629184733563 36.998741903378082,-94.732834603466486 36.998687977231512,-94.736330645670293 36.998669503899912,-94.737183000000002 36.998665000000003,-94.739323999999996 36.998686999999997,-94.745992043692311 36.998700535427304,-94.749560781475736 36.99870777958963,-94.749834600019099 36.998708335412474,-94.777257000000006 36.998764,-94.831280000000007 36.998812,-94.831539962039543 36.998812565955092,-94.840925999999996 36.998832999999998,-94.846637705524785 36.998860673615503,-94.849800999999999 36.998875999999996,-94.853196999999994 36.998874,-94.896852168601683 36.999075231107383,-94.904605402657381 36.99911097010289,-94.9407882710602 36.999277757196154,-94.995293000000004 36.999528999999995,-95.007620000000003 36.999513999999998,-95.011432999999997 36.999535000000002,-95.030323999999993 36.999516999999997,-95.037857000000002 36.999496999999998,-95.049498999999983 36.999580000000002,-95.073509 36.999509000000003,-95.1405498515593 36.999533623834409,-95.155186999999998 36.999538999999999,-95.155372 36.999540000000003,-95.159067907556633 36.999536629205572,-95.177300999999986 36.999519999999997,-95.195307 36.999564999999997,-95.267905305061163 36.999446910377756,-95.285983101167361 36.999417504731007,-95.322564999999997 36.999357999999994,-95.328057999999999 36.999364999999997,-95.328326999999987 36.999366000000002,-95.331209999999999 36.999380000000002,-95.377252424658963 36.999296311678272,-95.381753803085687 36.999288129815376,-95.407683000000006 36.999240999999998,-95.511578 36.999234999999999,-95.522414951940931 36.999281058114107,-95.534401000000003 36.999332000000003,-95.573598000000004 36.999309999999994,-95.601517312742303 36.999317968253862,-95.612139999999997 36.999321000000002,-95.615933999999996 36.999364999999997,-95.621011943860609 36.999361983160732,-95.624350000000007 36.999360000000003,-95.630078999999995 36.999319999999997,-95.638122589416028 36.999320470082949,-95.664300999999995 36.999321999999999,-95.674044398562955 36.999333876292773,-95.686452000000003 36.999349000000002,-95.696658999999997 36.999215,-95.71038 36.999370999999996,-95.710782524132014 36.999362783399121,-95.714887000000004 36.999279,-95.718053999999995 36.999254999999998,-95.741907999999995 36.999243999999997,-95.746466244276931 36.999250838506164,-95.759905000000003 36.999270999999993,-95.768719000000004 36.999205000000003,-95.786761999999996 36.999309999999994,-95.807979999999986 36.999124000000002,-95.819364496908179 36.999150471530008,-95.866899000000004 36.999260999999997,-95.873943999999995 36.999299999999998,-95.875256999999991 36.999302,-95.877150999999998 36.999304000000002,-95.910179999999997 36.999336,-95.928122000000002 36.999245000000002,-95.936991999999989 36.999267999999994,-95.964270378114222 36.999093604402042,-96.00081 36.99886,-96.095164142267308 36.998935940299688,-96.14121 36.998972999999999,-96.143207000000004 36.999133999999998,-96.147143 36.999021999999997,-96.149709 36.99904,-96.152383999999998 36.999050999999994,-96.154016999999982 36.999161,-96.184768000000005 36.999211000000003,-96.200028000000003 36.999028000000003,-96.217571000000007 36.999070000000003,-96.235320025971774 36.999130675786525,-96.27480962492784 36.999265672629733,-96.276368000000005 36.999270999999993,-96.279078999999996 36.999271999999991,-96.381556872639493 36.999226629434901,-96.394272 36.999220999999999,-96.415412000000003 36.999113,-96.500287999999998 36.998643,-96.525212323286397 36.998711038495294,-96.525495980566973 36.998711812823821,-96.551130926932458 36.998781791180214,-96.551130927020779 36.998781791180456,-96.624487489749981 36.998982040153741,-96.705431000000004 36.999203,-96.710481999999999 36.999270999999993,-96.731983006833033 36.99928335311408,-96.736589999999993 36.999285999999998,-96.741269999999986 36.999239000000003,-96.749837999999997 36.998987999999997,-96.792060000000006 36.999179999999996,-96.795198999999997 36.99886,-96.822790999999995 36.999181999999998,-96.867517000000007 36.999217000000002,-96.876289999999997 36.999232999999997,-96.902083000000005 36.999155000000002,-96.903509999999997 36.999132000000003,-96.917092999999994 36.999181999999998,-96.921914999999998 36.999150999999998,-96.924934279563146 36.999131784030439,-96.934641999999997 36.999070000000003,-96.967371 36.999066999999997,-96.975561999999996 36.999018999999997,-97.030081999999979 36.998928999999997,-97.039783999999983 36.999000000000002,-97.045562883576096 36.99899981011751,-97.100651999999997 36.998998,-97.104275999999999 36.999020000000002,-97.120284999999996 36.999014000000003,-97.122596999999999 36.999035999999997,-97.147721000000004 36.999110999999999,-97.202000013134437 36.999050609464689,-97.255829185181881 36.998990719420135,-97.342808466604069 36.998893946743877,-97.362376892203329 36.998872175019791,-97.364929972745273 36.99886933447624,-97.372421000000003 36.998860999999998,-97.384924999999996 36.998843,-97.462279999999993 36.998685000000002,-97.472860999999995 36.998721000000003,-97.527292000000003 36.998749999999994,-97.545899999999989 36.998708999999991,-97.546497999999985 36.998746999999995,-97.564536000000004 36.998711,-97.582460039051355 36.99869862770732,-97.606549 36.998682000000002,-97.637136999999996 36.999090000000002,-97.650465999999994 36.999003999999999,-97.692180007144742 36.998844793059916,-97.697103999999982 36.998826,-97.768704 36.998749999999994,-97.783432000000005 36.998961,-97.783489000000003 36.998846999999998,-97.802297999999979 36.998713000000002,-97.965379045838461 36.998468720211747,-98.033955000000006 36.998365999999997,-98.03989 36.998348999999997,-98.045341999999991 36.998327000000003,-98.111985000000004 36.998133000000003,-98.128185436781749 36.99814624647324,-98.147452 36.998162,-98.177595999999994 36.998008999999996,-98.190367496841162 36.998003995168112,-98.208218000000002 36.997996999999998,-98.219498999999999 36.997824,-98.237712000000002 36.99797199999999,-98.346187999999984 36.997962,-98.347186011230875 36.997961873429141,-98.354073 36.997960999999997,-98.408991 36.998513000000003,-98.418267999999998 36.998538000000003,-98.420209 36.998516000000002,-98.476584655565659 36.998733519956424,-98.485495952453391 36.998767903324406,-98.544871999999984 36.998997000000003,-98.622244241689657 36.999025734091177,-98.714511999999999 36.99906,-98.718464999999995 36.999179999999996,-98.761596999999995 36.999425000000002,-98.791936000000007 36.999254999999998,-98.793711000000002 36.999226999999991,-98.797451999999993 36.999228999999993,-98.811832237742053 36.99924038482925,-98.869449000000003 36.999285999999998,-98.880009 36.999262999999999,-98.880579999999995 36.999308999999997,-98.994371 36.999493,-99.000846251360556 36.99951188908193,-99.029336999999998 36.999594999999999,-99.044703416105833 36.999312701167916,-99.049695 36.999220999999999,-99.124882999999997 36.99942,-99.12944899999998 36.999422000000003,-99.215429691089184 36.999525607779709,-99.221470798208784 36.999532887387339,-99.22594390512576 36.999538277535649,-99.248119999999986 36.999564999999997,-99.277506000000002 36.999578999999997,-99.375390999999993 37.000176999999994,-99.375813215185289 37.000169016042221,-99.396673054015949 36.999774562980598,-99.407015 36.999578999999997,-99.456202999999988 36.999471,-99.484333000000007 36.999625999999999,-99.500394999999983 36.99957599999999,-99.500394999999983 36.999637,-99.502664999999993 36.999645,-99.504092999999997 36.999648,-99.508573999999982 36.999657999999997,-99.541115670095081 36.999572526667627,-99.558068000000006 36.999527999999998,-99.625399000000002 36.999670999999999,-99.648651999999998 36.999603999999998,-99.657657999999998 37.000197,-99.675479899119665 37.000294824261658,-99.700804554289192 37.000433831091229,-99.722499410223932 37.000552913981863,-99.774254999999997 37.000836999999997,-99.774816 37.000841,-99.786016000000004 37.000931,-99.875408999999991 37.001658999999997,-99.904897139036905 37.001652107487203,-99.995200999999994 37.001631000000003,-100.001285999999993 37.001699000000002,-100.002562999999995 37.001705999999999,-100.005706000000004 37.001725999999998,-100.08949117994996 37.002091554886341,-100.115721999999991 37.002206,-100.187546999999995 37.002082,-100.19237099999998 37.002035999999997,-100.193753999999998 37.002133,-100.201675999999992 37.002080999999997,-100.269984573601874 37.001795796937508,-100.395563941387664 37.001271475927872,-100.434302684862132 37.001109733298897,-100.434343961694367 37.0011095609592,-100.436759028295029 37.001099477534027,-100.462594151135718 37.000991610310841,-100.526354155903263 37.000725398506596,-100.551597999999998 37.000619999999998,-100.552683000000002 37.000734999999999,-100.591328000000004 37.000376000000003,-100.591413000000003 37.000399000000002,-100.629769999999994 37.000025,-100.63332699999998 36.999935999999998,-100.675551999999996 36.999687999999999,-100.734516999999997 36.999059000000003,-100.756894000000003 36.999356999999996,-100.759718826764541 36.999297806889686,-100.765484 36.999177000000003,-100.806116000000003 36.999091,-100.814277000000004 36.999085,-100.850054835707368 36.998687920265262,-100.855633999999981 36.998626000000002,-100.891659999999987 36.998604,-100.904274 36.998745,-100.904588000000004 36.998561000000002,-100.945565999999985 36.998151999999997,-100.958261085233985 36.99812508251128,-100.996501999999992 36.998044,-101.012641000000002 36.998176,-101.053589000000002 36.997966999999996,-101.066742000000005 36.997920999999998,-101.096255470166753 36.997758490771822,-101.211485999999979 36.997123999999999,-101.212908999999996 36.997044000000002,-101.283204233333976 36.996668964004151,-101.357796999999991 36.996271,-101.359673999999998 36.996231999999999,-101.37818 36.996164,-101.413867999999994 36.996008000000003,-101.415004999999994 36.995966000000003,-101.485326 36.995610999999997,-101.519065999999995 36.99554599999999,-101.555239 36.99541399999999,-101.600396000000003 36.995152999999995,-101.601592999999994 36.995094999999999,-101.672152845644291 36.994768289529276,-101.672152845650672 36.994768289529254,-101.718235173867967 36.994554916342196,-101.761767880686108 36.994353348566563,-101.826607533764985 36.994053124077894,-101.862548907230888 36.993886706153717,-101.881050066963184 36.993801040963412,-101.899294480822903 36.993716564573397,-101.902439999999999 36.993701999999999,-101.905152836625547 36.993689460946754,-101.93521516037174 36.99355050931414,-102.000446999999994 36.993248999999992,-102.000446999999994 36.993271999999997,-102.028206999999981 36.993124999999999,-102.042240000000007 36.993082999999999,-102.041951999999995 37.024741999999996,-102.04195 37.030805,-102.041921000000002 37.032178000000002,-102.041748999999996 37.034396999999998,-102.04191999999999 37.035083,-102.041983000000002 37.106551000000003,-102.041808999999986 37.111972999999999,-102.042091999999997 37.125020999999997,-102.042135000000002 37.125020999999997,-102.042121535383529 37.12671399835564,-102.042001999999997 37.141744000000003,-102.041962999999996 37.258164,-102.041663999999997 37.29764999999999,-102.041816999999995 37.309489999999997,-102.041973999999996 37.352612999999998,-102.042089000000004 37.352818999999997,-102.041523999999995 37.375017999999997,-102.041585760607518 37.389190434149839,-102.041675999999981 37.409897999999991,-102.041668999999999 37.434739999999998,-102.041754999999995 37.434854999999992,-102.041800999999992 37.469487999999998,-102.041786000000002 37.506065999999997,-102.04201599999999 37.535260999999998,-102.041899 37.541186000000003,-102.041893999999999 37.557977,-102.041618 37.607868000000003,-102.041584999999998 37.644281999999997,-102.041581999999991 37.654494999999997,-102.041694000000007 37.665680999999999,-102.041573999999997 37.680436,-102.041876000000002 37.723875,-102.041989965869121 37.73854062916552,-102.042158 37.760164000000003,-102.042668000000006 37.788758,-102.042952999999997 37.803534999999997,-102.043032999999994 37.824145999999999,-102.043218999999993 37.86792899999999,-102.043714531331204 37.914003914798144,-102.043845000000005 37.926135000000002,-102.043844000000007 37.928101999999996,-102.044644000000005 38.045532,-102.044255000000007 38.113010999999993,-102.044450868202546 38.120049353793199,-102.044589000000002 38.125012999999996,-102.044415729020699 38.133607343100145,-102.044251000000003 38.141777999999995,-102.044296878804843 38.175558844899406,-102.044398 38.250014999999998,-102.044510721728557 38.262483349316234,-102.044567999999998 38.268819,-102.044612999999998 38.312323999999997,-102.044944 38.384419,-102.044441999999989 38.415801999999999,-102.044936000000007 38.41968,-102.045323999999979 38.453646999999997,-102.045262999999991 38.505395,-102.045261999999994 38.505531999999995,-102.045112000000003 38.523783999999999,-102.045222999999993 38.543796999999998,-102.045188999999979 38.558731999999992,-102.045210999999995 38.581608999999993,-102.045287999999999 38.615248999999999,-102.045074 38.669617000000002,-102.045102 38.674945999999998,-102.045159999999996 38.675221,-102.045126999999994 38.686725000000003,-102.045156000000006 38.688555,-102.045211999999992 38.697566999999999,-102.045375000000007 38.754338999999995,-102.045287000000002 38.755527999999998,-102.045371000000003 38.770063999999998,-102.045447999999993 38.783453000000002,-102.045333999999997 38.799463000000003,-102.045387999999988 38.813391999999993,-102.046570999999986 39.047038,-102.047133999999986 39.129700999999997,-102.047188612927897 39.133146793270186,-102.047250000000005 39.13702,-102.047851021058236 39.220289738242592,-102.048449000000005 39.30313799999999,-102.04895999999998 39.37371199999999,-102.049100972149461 39.394064428437375,-102.049166999999983 39.403596999999998,-102.049369999999996 39.418210000000002,-102.049368999999999 39.423333,-102.049678999999998 39.506183,-102.049672999999999 39.536690999999998,-102.049553999999986 39.538932000000003,-102.049763758475066 39.568170000775439,-102.04980599999999 39.574058,-102.049954 39.592331,-102.050258163748609 39.627242889069393,-102.050421999999983 39.646047999999993,-102.050099000000003 39.653812000000002,-102.05059399999999 39.67559399999999,-102.050898693231389 39.741794606053567,-102.051254 39.818992,-102.051317999999995 39.833311000000002,-102.051362999999995 39.843471,-102.051569 39.849805000000003,-102.051743999999999 40.003078000000002))'));
\ No newline at end of file
diff --git a/webapp/django/contrib/gis/tests/geoapp/sql/state.postgresql_psycopg2.sql b/webapp/django/contrib/gis/tests/geoapp/sql/state.postgresql_psycopg2.sql
new file mode 100644
index 0000000..d27af33
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/geoapp/sql/state.postgresql_psycopg2.sql
@@ -0,0 +1,5 @@
+-- State border data courtesy of U.S. Census Bureau Cartographic Boundary Files: http://www.census.gov/geo/www/cob/st2000.html
+-- Boundary file data is a product of the U.S. federal government and is public domain.  See 17 U.S.C. 105.
+INSERT INTO geoapp_state ("name", "poly") VALUES ('Puerto Rico', NULL);
+INSERT INTO geoapp_state ("name", "poly") VALUES ('Colorado', 'SRID=4326;POLYGON ((-107.918420999999981 41.002035999999997,-107.69133582431418 41.002104250342249,-107.625624000000002 41.002124000000002,-107.521505363272311 41.002506710525772,-107.367442999999994 41.003073,-107.317794462401125 41.002967213367114,-107.305312956219666 41.00294061889776,-107.241193999999993 41.002803999999998,-107.000606000000005 41.003443999999995,-106.857772999999995 41.002662999999991,-106.453858999999994 41.002056999999994,-106.439563000000007 41.001978,-106.437419000000006 41.001794999999994,-106.430949999999996 41.001751999999996,-106.391852 41.001176,-106.386356000000006 41.001143999999996,-106.321164999999993 40.999122999999997,-106.217573000000002 40.997734,-106.194624254510543 40.99762614711792,-106.190540579491184 40.997606954952467,-106.061180999999991 40.996999000000002,-105.764246857267409 40.99689755617932,-105.730421000000007 40.996886000000003,-105.724804000000006 40.99691,-105.554417704421283 40.997390710823062,-105.412220703167577 40.997791891195448,-105.277137999999979 40.998173,-105.256527000000006 40.998190999999998,-105.254778999999999 40.99821,-105.173435761678107 40.998177015252317,-104.943370680568208 40.998083723679372,-104.855272999999997 40.998047999999997,-104.829503999999986 40.999270000000003,-104.675999000000004 41.000957,-104.497148999999993 41.001828000000003,-104.497057999999996 41.001804999999997,-104.467671999999979 41.001472999999997,-104.214691999999999 41.001657000000002,-104.214191 41.001567999999999,-104.211472999999998 41.001590999999998,-104.123585999999989 41.001625999999995,-104.104590000000002 41.001542999999991,-104.086067999999983 41.001562999999997,-104.066960999999992 41.001503999999997,-104.053248999999994 41.001405999999996,-104.039237999999997 41.001502000000002,-104.023382999999981 41.001887000000004,-104.018223000000006 41.001617000000003,-104.010804886779724 41.00161667450854,-103.972641999999979 41.001615,-103.971373 41.001524000000003,-103.953524999999999 41.001595999999999,-103.906323999999998 41.001387,-103.896207000000004 41.00175,-103.877966999999998 41.00167299999999,-103.858448999999993 41.001680999999998,-103.750497999999993 41.002054,-103.574522000000002 41.001721000000003,-103.497446999999994 41.001635,-103.486697000000007 41.001913999999999,-103.421975000000003 41.002006999999999,-103.421925000000002 41.001968999999995,-103.396990999999986 41.002558,-103.365313999999984 41.001846,-103.362978999999996 41.001843999999991,-103.077804 41.002298000000003,-103.076536000000004 41.002253000000003,-103.059537999999989 41.002367999999997,-103.057997999999998 41.002367999999997,-103.043443999999994 41.002344,-103.038703999999996 41.002251,-103.002026 41.002485999999998,-103.000101999999984 41.002400000000002,-102.982690000000005 41.002156999999997,-102.981482999999997 41.002111999999997,-102.963668999999982 41.002185999999995,-102.962522000000007 41.002071999999998,-102.960706000000002 41.002058999999996,-102.959623999999991 41.002094999999997,-102.944829999999996 41.002302999999998,-102.943109000000007 41.002051000000002,-102.925567999999998 41.002279999999999,-102.924029000000004 41.002141999999999,-102.906546999999989 41.002275999999995,-102.904796000000005 41.002206999999999,-102.887406999999982 41.002178,-102.885745999999997 41.002130999999999,-102.867822000000004 41.002183000000002,-102.865783999999991 41.001987999999997,-102.849262999999993 41.002301000000003,-102.846455000000006 41.002256000000003,-102.830302999999986 41.002350999999997,-102.827280000000002 41.002142999999997,-102.773545999999996 41.002414000000002,-102.766722999999999 41.00227499999999,-102.754616999999996 41.002360999999993,-102.739623999999992 41.002229999999997,-102.653462999999988 41.002332000000003,-102.621032999999997 41.002597000000002,-102.578695999999994 41.002291,-102.575738 41.002268,-102.575496 41.002200000000002,-102.566047999999995 41.002200000000002,-102.556788999999995 41.002218999999997,-102.517701071582451 41.002347335877943,-102.487954999999985 41.002444999999994,-102.470536999999979 41.002381999999997,-102.469223 41.002423999999998,-102.460334593696913 41.00241180236555,-102.387750989484957 41.002312195277327,-102.380372991932845 41.002302070389462,-102.379593 41.002301000000003,-102.364065999999994 41.002173999999997,-102.292833000000002 41.002206999999999,-102.292621999999994 41.002229999999997,-102.292552999999998 41.002206999999999,-102.291353999999998 41.002206999999999,-102.277803455573988 41.002233743569548,-102.272099999999995 41.002245000000002,-102.267811999999992 41.002383000000002,-102.231931000000003 41.002327,-102.212199999999982 41.002462,-102.209361 41.002442000000002,-102.209083936251005 41.002440229332002,-102.207776055197755 41.002431870883314,-102.191209999999998 41.002325999999996,-102.124972 41.002338000000002,-102.070598000000004 41.002423,-102.051614 41.002377000000003,-102.051291999999989 40.749591000000002,-102.051634432607003 40.582129592617228,-102.051725000000005 40.537838999999991,-102.051518999999999 40.520094,-102.051464999999993 40.440007999999999,-102.051839999999999 40.396396000000003,-102.051571999999993 40.393079999999998,-102.051797999999991 40.360069000000003,-102.051585542616536 40.350646145741024,-102.051309000000003 40.338380999999998,-102.051922000000005 40.235343999999998,-102.05189399999999 40.229192999999995,-102.051908999999995 40.162674000000003,-102.052001000000004 40.148358999999999,-102.051852600888665 40.064469617536822,-102.051743999999999 40.003078000000002,-102.051715564657869 39.978173027456265,-102.051569 39.849805000000003,-102.051362999999995 39.843471,-102.051317999999995 39.833311000000002,-102.051254 39.818992,-102.05059399999999 39.67559399999999,-102.050099000000003 39.653812000000002,-102.050421999999983 39.646047999999993,-102.049954 39.592331,-102.04980599999999 39.574058,-102.049553999999986 39.538932000000003,-102.049672999999999 39.536690999999998,-102.049678999999998 39.506183,-102.049368999999999 39.423333,-102.049369999999996 39.418210000000002,-102.049166999999983 39.403596999999998,-102.04895999999998 39.37371199999999,-102.048449000000005 39.30313799999999,-102.047250000000005 39.13702,-102.047133999999986 39.129700999999997,-102.046570999999986 39.047038,-102.045387999999988 38.813391999999993,-102.045333999999997 38.799463000000003,-102.045447999999993 38.783453000000002,-102.045371000000003 38.770063999999998,-102.045287000000002 38.755527999999998,-102.045375000000007 38.754338999999995,-102.045211999999992 38.697566999999999,-102.045156000000006 38.688555,-102.045126999999994 38.686725000000003,-102.045159999999996 38.675221,-102.045102 38.674945999999998,-102.045074 38.669617000000002,-102.045287999999999 38.615248999999999,-102.045210999999995 38.581608999999993,-102.045188999999979 38.558731999999992,-102.045222999999993 38.543796999999998,-102.045112000000003 38.523783999999999,-102.045261999999994 38.505531999999995,-102.045262999999991 38.505395,-102.045323999999979 38.453646999999997,-102.044936000000007 38.41968,-102.044441999999989 38.415801999999999,-102.044944 38.384419,-102.044612999999998 38.312323999999997,-102.044567999999998 38.268819,-102.044398 38.250014999999998,-102.044251000000003 38.141777999999995,-102.044535323623649 38.127675380028528,-102.044589000000002 38.125012999999996,-102.044540277332047 38.123262193231092,-102.044255000000007 38.113010999999993,-102.04462354493468 38.04908029653749,-102.044631007072184 38.047785855466316,-102.044644000000005 38.045532,-102.044620085883125 38.042021706570637,-102.044539342086111 38.030169526464491,-102.043844000000007 37.928101999999996,-102.043845000000005 37.926135000000002,-102.043218999999993 37.86792899999999,-102.043032999999994 37.824145999999999,-102.042952999999997 37.803534999999997,-102.042668000000006 37.788758,-102.042158 37.760164000000003,-102.041876000000002 37.723875,-102.041573999999997 37.680436,-102.041694000000007 37.665680999999999,-102.041581999999991 37.654494999999997,-102.041584999999998 37.644281999999997,-102.041618 37.607868000000003,-102.041779405839492 37.578691555295826,-102.041893999999999 37.557977,-102.041899 37.541186000000003,-102.04201599999999 37.535260999999998,-102.041786000000002 37.506065999999997,-102.041800999999992 37.469487999999998,-102.041754999999995 37.434854999999992,-102.041668999999999 37.434739999999998,-102.041675999999981 37.409897999999991,-102.041523999999995 37.375017999999997,-102.042089000000004 37.352818999999997,-102.041973999999996 37.352612999999998,-102.041816999999995 37.309489999999997,-102.041663999999997 37.29764999999999,-102.041962999999996 37.258164,-102.042001999999997 37.141744000000003,-102.042135000000002 37.125020999999997,-102.042091999999997 37.125020999999997,-102.041808999999986 37.111972999999999,-102.041983000000002 37.106551000000003,-102.04191999999999 37.035083,-102.041748999999996 37.034396999999998,-102.041921000000002 37.032178000000002,-102.04195 37.030805,-102.041951999999995 37.024741999999996,-102.042240000000007 36.993082999999999,-102.054502999999997 36.993108999999997,-102.184270999999995 36.993592999999997,-102.208315999999996 36.993729999999999,-102.260789000000003 36.994388,-102.270345681835295 36.994399933337462,-102.307593650497381 36.994446444520669,-102.355288000000002 36.994505999999994,-102.355367 36.994574999999998,-102.698142000000004 36.995148999999998,-102.742059999999981 36.997689,-102.759860000000003 37.000019000000002,-102.77856899999999 36.999242000000002,-102.806762000000006 37.000019000000002,-102.814616 37.000782999999998,-102.841988999999998 36.999597999999999,-102.979613 36.998548999999997,-102.985806999999994 36.998570999999998,-102.986975999999999 36.998524000000003,-103.002199000000005 37.000104,-103.086104969413952 37.000173865694038,-103.10540536532865 37.000189936488113,-103.155922000000004 37.000231999999997,-103.200631728472104 37.000060386509688,-103.327177769406262 36.999574653124313,-103.425678872433053 36.999196567220693,-103.733247000000006 36.998015999999993,-103.734363999999985 36.998041,-104.007854999999992 36.996239000000003,-104.215475488463966 36.994874432196589,-104.250535999999983 36.994644,-104.29757064295984 36.994053250381747,-104.338832999999994 36.993535,-104.355650525350313 36.993556531771581,-104.366447685535107 36.993570355564437,-104.399202882083287 36.993612292614962,-104.429769386650008 36.993651427444888,-104.480610316975273 36.993716519976395,-104.519256999999996 36.993765999999994,-104.624555999999998 36.994376999999993,-104.625545000000002 36.993599000000003,-104.645028999999994 36.993377999999993,-104.706112207267154 36.993426444188657,-104.732031000000006 36.993447000000003,-104.732119999999981 36.993484000000002,-104.839990412520109 36.993395592828207,-105.00055399999998 36.993264000000003,-105.029227999999989 36.99272899999999,-105.120800000000003 36.995427999999997,-105.155041964101514 36.995339147158163,-105.220613 36.995168999999997,-105.251295999999996 36.995604999999998,-105.419309999999996 36.995856000000003,-105.438102743613229 36.995968030697597,-105.442458999999999 36.995994000000003,-105.447254999999998 36.996016999999995,-105.465181999999999 36.995990999999997,-105.47087670692585 36.995978476706256,-105.508835999999988 36.99589499999999,-105.512484999999998 36.995776999999997,-105.533922000000004 36.995874999999998,-105.627469999999988 36.995679000000003,-105.664719999999988 36.995874,-105.716470999999999 36.995848999999993,-105.718407304549174 36.995846016149208,-105.996159000000006 36.995418,-105.997472000000002 36.995417000000003,-106.006633999999991 36.995342999999998,-106.099805867433119 36.994759106704976,-106.163971382218094 36.994356991615014,-106.201468999999989 36.994121999999997,-106.247704999999996 36.994266000000003,-106.248675000000006 36.99428799999999,-106.293278999999998 36.99389,-106.32542867882475 36.994109231664673,-106.343138999999979 36.994230000000002,-106.476277952851959 36.993839335051021,-106.500589000000005 36.993767999999996,-106.617159 36.992967,-106.617124999999987 36.993003999999999,-106.628652000000002 36.993175,-106.628732999999983 36.993160999999994,-106.661344 36.993243,-106.675625999999994 36.993122999999997,-106.750591 36.992460999999999,-106.782095289714647 36.992451749967366,-106.869795999999994 36.992425999999995,-106.877291999999983 37.00013899999999,-106.918886463342702 37.000128747161924,-106.95601836457638 37.000119594324254,-107.107262626744514 37.000082313330452,-107.255202723469637 37.000045846797775,-107.420912999999999 37.000004999999994,-107.422415013680663 37.000004989636103,-107.442181999144324 37.000004853243873,-107.481737001398656 37.00000458031429,-107.524086846417021 37.000004288100286,-107.600713640777798 37.000003759375268,-107.712477900838564 37.000002988201679,-107.855695499501934 37.000002000000002,-107.866308937617532 37.000001926767261,-107.869139908586362 37.000001907233546,-107.869180699306327 37.0000019069521,-108.000623000000004 37.000000999999997,-108.179187075278463 36.999293161624927,-108.187139540298872 36.999261637591275,-108.249358 36.999015,-108.250634999999988 36.999561,-108.288086000000007 36.999555,-108.288399999999996 36.999519999999997,-108.320464 36.999499,-108.320720999999992 36.99951,-108.379165570428881 36.999458977707043,-108.619688999999994 36.999248999999999,-108.620309000000006 36.999287000000002,-108.749269825405847 36.999139933822768,-108.954403999999997 36.998905999999998,-108.958867999999995 36.998913000000002,-109.045222999999993 36.999084000000003,-109.04516599999998 37.072741999999998,-109.045057999999997 37.074660999999999,-109.044995 37.086429000000003,-109.045188999999993 37.096270999999994,-109.045173000000005 37.109464000000003,-109.045202999999987 37.111957999999994,-109.045155999999992 37.112063999999997,-109.045995000000005 37.177278999999999,-109.045978000000005 37.201830999999999,-109.045801505106283 37.205070813598866,-109.045486999999994 37.210844000000002,-109.045559879533187 37.239775672002708,-109.04556019774752 37.239901996533845,-109.045583999999991 37.249350999999997,-109.046038999999993 37.249993000000003,-109.045898042273308 37.32693499054853,-109.045810000000003 37.374993000000003,-109.043799132325617 37.469028334242019,-109.043463783260819 37.484710450871816,-109.043424942780035 37.486526770085334,-109.043137000000002 37.499991999999999,-109.041915000000003 37.530653,-109.041865 37.530726,-109.041805999999994 37.604171,-109.042130999999998 37.617662000000003,-109.042089000000004 37.623795,-109.042269000000005 37.666066999999998,-109.041731999999996 37.711213999999998,-109.041759999999996 37.713182000000003,-109.041635999999997 37.740209999999998,-109.042097999999996 37.749989999999997,-109.042042148900066 37.754383999799849,-109.041460999999998 37.800105000000002,-109.041753999999997 37.83582599999999,-109.04172299999999 37.842050999999998,-109.041843999999998 37.872788,-109.041652818578953 37.881166902788557,-109.041058000000007 37.907235999999997,-109.043120999999985 37.97426,-109.042818999999994 37.997067999999999,-109.042819999999992 37.999301000000003,-109.041972403965843 38.131799166817459,-109.041836656974709 38.153019449536792,-109.041761999999991 38.16469,-109.054648 38.244920999999998,-109.060061999999988 38.275489,-109.059961999999999 38.49998699999999,-109.060253000000003 38.599327999999993,-109.059540999999996 38.719887999999997,-109.057388000000003 38.795455999999994,-109.057216044916757 38.799730849597076,-109.054188999999994 38.874983999999998,-109.05394299999999 38.904414000000003,-109.053797000000003 38.905283999999995,-109.053233000000006 38.942467,-109.053291999999985 38.942878,-109.052435999999986 38.999985000000002,-109.051587912503535 39.115734257770079,-109.051583515738272 39.116334340093104,-109.051580780636755 39.116707634089543,-109.051512000000002 39.126094999999999,-109.050764999999998 39.366677000000003,-109.051362999999981 39.497674000000004,-109.051040248333237 39.660472011844121,-109.050614999999993 39.874969999999998,-109.050872999999996 40.058914999999999,-109.050813000000005 40.059578999999992,-109.050944 40.180711999999993,-109.050972999999999 40.180849000000002,-109.050968715822648 40.22266241227041,-109.050945999999996 40.444367999999997,-109.050314 40.495092,-109.050697999999983 40.499963,-109.049954999999997 40.539901,-109.050073999999995 40.540357999999998,-109.050071964046666 40.540437104308737,-109.048044000000004 40.619230999999999,-109.048248999999998 40.653600999999995,-109.049087999999998 40.714562,-109.048455000000004 40.826081000000002,-109.050076000000004 41.000658999999999,-108.884137999999993 41.000093999999997,-108.631107999999998 41.00015599999999,-108.526667000000003 40.999608000000002,-108.500658999999999 41.000112,-108.250648999999996 41.000114000000004,-108.181227000000007 41.000454999999995,-108.089219003138552 41.001554139247368,-108.046538999999996 41.002063999999997,-107.923234122395939 41.0020370519008,-107.918420999999981 41.002035999999997))');
+INSERT INTO geoapp_state ("name", "poly") VALUES ('Kansas', 'SRID=4326;POLYGON ((-102.051743999999999 40.003078000000002,-101.916696000000002 40.003141999999997,-101.904176000000007 40.003162000000003,-101.861740775252272 40.002907997451267,-101.841025000000002 40.002783999999991,-101.832160999999999 40.002932999999999,-101.807687 40.002797999999999,-101.804861999999986 40.002752,-101.783266423091504 40.002735966476642,-101.748492901329186 40.002710149056902,-101.627071 40.00262,-101.625809000000004 40.002710999999998,-101.579641080501318 40.002654627564297,-101.54227299999998 40.002608999999993,-101.417209 40.002423999999998,-101.411050023557621 40.002364583193085,-101.409952999999987 40.002353999999997,-101.387325211262052 40.00246006676732,-101.374325999999996 40.002520999999994,-101.342859000000004 40.002580000000002,-101.324035999999992 40.002695999999993,-101.293991000000005 40.002558999999998,-101.286555000000007 40.002558999999998,-101.248672999999997 40.002543000000003,-101.215033000000005 40.002555,-101.19221899999998 40.002490999999999,-101.186892990733696 40.002481867883319,-101.178804999999997 40.002468,-101.168704000000005 40.002547,-101.130906999999993 40.002426999999997,-101.104950380573442 40.002382874850099,-101.104950380567658 40.002382874850092,-101.060316999999998 40.002307000000002,-101.027686000000003 40.002255999999996,-100.962089380046322 40.00217532965339,-100.937427 40.002144999999999,-100.764559455237134 40.002296963384197,-100.758829999999989 40.002301999999993,-100.752183000000002 40.002127999999992,-100.7388309887763 40.002228385746484,-100.733295999999996 40.002270000000003,-100.729904000000005 40.002110999999999,-100.721127999999993 40.002068999999999,-100.683435000000003 40.002234,-100.660229999999984 40.002161999999998,-100.645444999999995 40.001882999999999,-100.626504856699498 40.001892789287538,-100.600944999999996 40.001905999999998,-100.594756999999987 40.001976999999997,-100.567238000000003 40.001888999999998,-100.551885999999996 40.001888999999998,-100.514429898999168 40.001844039098764,-100.511064999999988 40.00184,-100.487159000000005 40.001767,-100.477018 40.001752000000003,-100.475853999999998 40.001767999999998,-100.468772999999985 40.001724000000003,-100.447071999999991 40.001795,-100.439081000000002 40.001773999999997,-100.402449685831499 40.001800164690437,-100.390079999999998 40.001809000000002,-100.290126736823893 40.001691651381378,-100.231651999999997 40.001623000000002,-100.229478999999998 40.001692999999996,-100.215406000000002 40.001629,-100.196958999999993 40.001494,-100.19359 40.001573,-100.190323000000006 40.001586000000003,-100.188181 40.001541000000003,-100.177823000000004 40.001593,-99.990926000000002 40.001503,-99.986610999999996 40.001550000000002,-99.948166999999998 40.001812999999999,-99.944417 40.001584,-99.930432999999979 40.001516000000002,-99.906657999999993 40.001511999999998,-99.850154757615712 40.001444140609848,-99.813400999999999 40.001399999999997,-99.775639999999981 40.001646999999998,-99.772120999999984 40.001804,-99.764213999999996 40.001550999999999,-99.756834999999995 40.001342,-99.746628 40.001820000000002,-99.737774855821357 40.001824224692157,-99.731959000000003 40.001826999999992,-99.719639 40.001807999999997,-99.628345999999993 40.001866,-99.625979999999984 40.001865000000002,-99.515340365578794 40.002008435606839,-99.501791999999995 40.002026,-99.498998999999984 40.00195699999999,-99.497659999999982 40.001911999999997,-99.493464999999986 40.001936999999998,-99.480727999999999 40.001942,-99.423564999999996 40.002270000000003,-99.412644999999998 40.001867999999995,-99.403389000000004 40.001969000000003,-99.366747146128873 40.001962496644857,-99.290702999999979 40.001949000000003,-99.286655999999994 40.002017000000002,-99.282966999999999 40.001879000000002,-99.254012000000003 40.002074,-99.25036999999999 40.00195699999999,-99.216375999999997 40.002015999999998,-99.197591999999986 40.002032999999997,-99.188905000000005 40.002023,-99.186961999999994 40.001976999999997,-99.178965000000005 40.001976999999997,-99.169815999999997 40.001925,-99.123032999999992 40.002164999999998,-99.113510000000005 40.002192999999998,-99.085596999999993 40.002132999999994,-99.067047050731574 40.00217023690761,-99.020337999999995 40.00226399999999,-99.018700999999993 40.002333,-98.992135000000005 40.002192,-98.972286999999994 40.002245000000002,-98.971721000000002 40.002268,-98.961009000000004 40.002316999999998,-98.96091899999999 40.002271,-98.953888072580213 40.002253239016738,-98.934791999999987 40.002204999999996,-98.8435956659672 40.002348607685946,-98.842134005327992 40.002350909376077,-98.834455999999989 40.002363000000003,-98.820589999999982 40.002319,-98.777203 40.002358999999998,-98.774940999999998 40.002336,-98.729330606936671 40.002229113826232,-98.726294999999993 40.002222000000003,-98.710403999999997 40.002180000000003,-98.693095999999997 40.002372999999999,-98.691443000000007 40.002504999999999,-98.690286999999998 40.002547999999997,-98.672819000000004 40.002364,-98.669723999999988 40.002409999999998,-98.653832999999992 40.002268999999998,-98.652494000000004 40.002245000000002,-98.640709999999984 40.002493,-98.616372379820518 40.002409030470169,-98.613754999999998 40.002400000000002,-98.593342000000007 40.002475999999994,-98.575219000000004 40.002479999999991,-98.560578000000007 40.002274,-98.543186000000006 40.002285,-98.523053000000004 40.002336,-98.506634585466017 40.002329436673158,-98.504454999999979 40.002328565375151,-98.50084801790743 40.002327123469641,-98.490532999999999 40.002322999999997,-98.441997554675297 40.002366263566756,-98.391848301995964 40.002410965650498,-98.274015000000006 40.002516,-98.268218000000005 40.002490000000002,-98.25000799999998 40.002307000000002,-98.213290432425865 40.002506421375415,-98.193483 40.002614,-98.179315000000003 40.002482999999998,-98.172269 40.002437999999991,-98.156873151934732 40.002445128178877,-98.142031000000003 40.002451999999998,-98.099659000000003 40.002226999999998,-98.076034000000007 40.002300999999996,-98.068701000000004 40.002355,-98.050056999999981 40.002277999999997,-98.047469000000007 40.002186000000002,-98.042767978165202 40.002191261754177,-98.014411999999979 40.002223,-98.010157000000007 40.002153,-97.972185999999994 40.002113999999999,-97.931810999999996 40.002049999999997,-97.876261 40.002102,-97.85745 40.002065000000002,-97.838378999999989 40.001909999999995,-97.821597999999994 40.002003999999992,-97.819426000000007 40.001957999999995,-97.777154999999993 40.002167,-97.770775999999998 40.001976999999997,-97.769204000000002 40.001995,-97.767746000000002 40.001994000000003,-97.714825952022949 40.001974503868432,-97.706952472912022 40.001971603221314,-97.701160424072398 40.001969469388285,-97.61370959051284 40.001937251863488,-97.595964207410262 40.001930714334961,-97.593671575073259 40.001929869712491,-97.51530799999999 40.001900999999997,-97.511381 40.001899000000002,-97.510264000000006 40.001835,-97.48896951184885 40.0019310946697,-97.481234094494141 40.001966001936331,-97.463284999999999 40.00204699999999,-97.444661999999994 40.001957999999995,-97.425443 40.002048000000002,-97.417825999999991 40.002023999999999,-97.415833000000006 40.002000999999993,-97.369102999999996 40.00206,-97.350896000000006 40.001930000000002,-97.350272000000004 40.001975999999999,-97.256541388870858 40.001563097676062,-97.24516899999999 40.001513000000003,-97.245080000000002 40.001466999999998,-97.202309999999997 40.00144199999999,-97.200190000000006 40.001548999999997,-97.181775000000002 40.001550000000002,-97.165136038800085 40.001526729909067,-97.164288093539042 40.001525544031956,-97.157705785150654 40.001516338474417,-97.144150390621661 40.001497380844818,-97.142447999999987 40.001494999999998,-97.137865999999988 40.001814000000003,-97.049662999999995 40.001322999999999,-97.030802999999992 40.001342,-97.009164999999996 40.001463,-96.918187714380807 40.001505032225388,-96.916093000000004 40.001505999999999,-96.880459000000002 40.001448000000003,-96.878253 40.001466,-96.875056999999998 40.001448000000003,-96.873812 40.001449999999998,-96.868892342573133 40.001444286089438,-96.805301797100199 40.001370429180717,-96.693246065483095 40.001240282633297,-96.622400999999996 40.001157999999997,-96.610348999999999 40.000881,-96.604883999999984 40.000891000000003,-96.581788013355691 40.000963078853125,-96.580851999999993 40.000965999999998,-96.570853999999997 40.001090999999995,-96.557862999999998 40.000968,-96.538977000000003 40.000850999999997,-96.527110999999991 40.001030999999998,-96.469944999999996 40.000965999999998,-96.467535999999996 40.001035000000002,-96.463639999999998 40.000967000000003,-96.354812913341547 40.000735780492882,-96.350953725714731 40.00072758106856,-96.341811057717251 40.000708156095854,-96.304554999999993 40.000629000000004,-96.301066000000006 40.000632000000003,-96.239171999999996 40.000691000000003,-96.223838999999998 40.000729,-96.220170999999993 40.00072,-96.154364999999984 40.000495,-96.154246 40.00045,-96.147166999999982 40.000478999999999,-96.125936999999979 40.000432000000004,-96.125788 40.000467,-96.089781000000002 40.000518999999997,-96.081394999999986 40.000602999999998,-96.051691000000005 40.000726999999998,-96.02409 40.000718999999997,-96.014716997898134 40.000662392993569,-96.010677999999999 40.000638000000002,-95.995389500007406 40.000603953777215,-95.958139000000003 40.000520999999999,-95.901560435593936 40.000482839492363,-95.882524000000004 40.00047,-95.788023999999993 40.000452000000003,-95.784575000000004 40.000463000000003,-95.672891827756033 40.000336669594915,-95.658762261555324 40.000320686938032,-95.63965170807073 40.000299070038061,-95.565216789143676 40.000214872989645,-95.463103327781397 40.00009936736172,-95.455130658279359 40.000090349077695,-95.452048066669519 40.000086862204618,-95.438655850967621 40.000071713601649,-95.436011808705814 40.000068722793607,-95.426269559489981 40.00005770284973,-95.42148745056565 40.000052293567869,-95.41484447973599 40.000044779372317,-95.375257000000005 40.0,-95.339895999999982 39.999999000000003,-95.326448603970363 39.999998574530281,-95.30829 39.999997999999998,-95.308403999999996 39.993758,-95.307779999999994 39.990617999999998,-95.307111000000006 39.989114,-95.302506999999991 39.984357000000003,-95.289715 39.977705999999998,-95.274756999999994 39.972115000000002,-95.269885999999985 39.969396000000003,-95.261854 39.960617999999997,-95.257651999999993 39.954886000000002,-95.250253999999998 39.948644000000002,-95.241382999999999 39.944949,-95.236761 39.943930999999999,-95.231114000000005 39.943784,-95.220212000000004 39.944432999999997,-95.216440000000006 39.943953,-95.213736999999995 39.943205999999996,-95.204427999999993 39.938949,-95.201277000000005 39.934193999999998,-95.200689999999994 39.928154999999997,-95.20201 39.922438,-95.205744999999993 39.915168999999999,-95.206326000000004 39.912120999999999,-95.206195999999991 39.909557,-95.205732999999981 39.908275000000003,-95.202631127107011 39.904826841138963,-95.201935000000006 39.904052999999998,-95.19982446963148 39.902956959499498,-95.199773390195176 39.902930432929807,-95.199730682369619 39.902908253904485,-95.199347000000003 39.902709000000002,-95.193815999999984 39.900689999999997,-95.189565000000002 39.899959000000003,-95.179452999999995 39.900061999999991,-95.172296000000003 39.902025999999999,-95.159833999999989 39.906984,-95.156023999999988 39.907243,-95.153185481864639 39.906665666721331,-95.151701132402337 39.906363761184394,-95.149656999999991 39.905947999999995,-95.148243978290679 39.905255611516672,-95.146055000000004 39.904183000000003,-95.143801999999994 39.901917999999995,-95.142562999999981 39.897992000000002,-95.142444999999995 39.895419999999994,-95.143403000000006 39.889355999999992,-95.142718000000002 39.885888999999992,-95.140601000000004 39.88168799999999,-95.137091999999996 39.878350999999995,-95.134747000000004 39.876852,-95.128165999999993 39.874164999999998,-95.105912000000004 39.869163999999998,-95.090958483530287 39.863446088154532,-95.090158000000002 39.86314,-95.085003 39.861882999999999,-95.081534000000005 39.861718000000003,-95.079786043666886 39.861878094210859,-95.052535000000006 39.864373999999998,-95.042141999999998 39.864804999999997,-95.037767000000002 39.865541999999998,-95.034318031759739 39.867229060943565,-95.032053000000005 39.868336999999997,-95.031002514960235 39.869148692103728,-95.027930999999981 39.871521999999999,-95.025918959417425 39.87568321107333,-95.025422000000006 39.876711,-95.025119000000004 39.878833,-95.02586205726584 39.885935119809076,-95.025947000000002 39.886747,-95.025771840138887 39.887478608302466,-95.025475064075451 39.888718183571669,-95.025239999999997 39.889699999999998,-95.024388999999999 39.891202,-95.021897459019584 39.893924778577606,-95.019088516216428 39.896994416745422,-95.018742999999986 39.89737199999999,-95.018224596337973 39.897611313155366,-95.013151999999991 39.899952999999996,-95.010684182587667 39.900289758615472,-95.008439999999993 39.900596,-95.003818999999993 39.900400999999995,-94.990284000000003 39.897010000000002,-94.989784913598129 39.896958718834505,-94.987823822157509 39.896757216540813,-94.986975 39.89667,-94.985308455245701 39.896814869812808,-94.979390624873346 39.897329296428744,-94.977748999999989 39.897472,-94.963345000000004 39.901136,-94.959276000000003 39.901671,-94.958440298615102 39.901548064610132,-94.95153999999998 39.900532999999996,-94.943866999999983 39.898130000000002,-94.935306395585215 39.893779379194363,-94.934493000000003 39.893366,-94.929574000000002 39.888753999999992,-94.927897000000002 39.88611199999999,-94.927358999999996 39.883966,-94.927251999999996 39.880257999999991,-94.928466 39.876344000000003,-94.931084167287821 39.873075003673321,-94.931462999999994 39.872602,-94.938790999999995 39.866954,-94.940742999999998 39.864409999999999,-94.942407000000003 39.861065999999994,-94.942566999999983 39.856601999999995,-94.939767000000003 39.851930000000003,-94.937655000000007 39.849786000000002,-94.926149999999993 39.841321999999998,-94.916917999999995 39.836137999999998,-94.909941999999987 39.834426,-94.903156999999979 39.833849999999998,-94.892677000000006 39.834377999999994,-94.889493000000002 39.834026,-94.886932999999999 39.833098,-94.881012999999996 39.828921999999991,-94.878676999999996 39.826521999999997,-94.877043999999998 39.823754,-94.876543999999996 39.820594,-94.875944000000004 39.813293999999999,-94.87632679569893 39.807169268817198,-94.876344000000003 39.806894,-94.876705972386588 39.80614007495069,-94.880932 39.797338000000003,-94.884084 39.794234000000003,-94.890292000000002 39.791626,-94.892965000000004 39.791097999999991,-94.912908274541266 39.790276806342419,-94.92474489359239 39.789789416146199,-94.925605000000004 39.789753999999995,-94.925940683661906 39.789631963361245,-94.927258709273417 39.789152799691166,-94.929653999999999 39.788281999999995,-94.93035270914757 39.787827111232048,-94.930442023078356 39.787768964141691,-94.930979872832452 39.787418801541357,-94.932726000000002 39.786282,-94.932913349551853 39.786043884763131,-94.935059195246907 39.783316584105528,-94.935205999999994 39.78313,-94.935782000000003 39.778905999999999,-94.935301999999993 39.77561,-94.935036741896766 39.775108050050804,-94.934624304242575 39.774327591105198,-94.934262000000004 39.773642000000002,-94.929652999999988 39.769098,-94.929421387607832 39.768921584953624,-94.928626586797606 39.768316199289764,-94.926229000000006 39.76648999999999,-94.923991330811134 39.765173947104167,-94.916788999999994 39.760937999999996,-94.912293000000005 39.759337999999993,-94.906244 39.759417999999997,-94.905921454535701 39.759501730763866,-94.900921941190049 39.760799572828766,-94.899156000000005 39.761257999999998,-94.899025621234756 39.761323457651685,-94.895268000000002 39.76321,-94.895041000000006 39.763350000000003,-94.894070999999997 39.763945999999997,-94.893918999999997 39.76404,-94.893724000000006 39.764159999999997,-94.893646000000004 39.764208000000004,-94.883923999999993 39.770186000000002,-94.881460000000004 39.771258000000003,-94.881422 39.771258000000003,-94.874706321154179 39.772392308082928,-94.871144 39.772993999999997,-94.869643999999994 39.772894,-94.867142999999999 39.771693999999997,-94.865243000000007 39.770094,-94.863142999999994 39.767294,-94.860742999999999 39.763094000000002,-94.859442999999999 39.753694000000003,-94.860369889104035 39.749534984666809,-94.860371 39.74953,-94.862942999999987 39.742994000000003,-94.870142999999999 39.734594,-94.875642999999997 39.730494,-94.884142999999995 39.726793999999998,-94.891743999999989 39.724893999999999,-94.899315999999999 39.724041999999997,-94.900553640444031 39.724102079633198,-94.901582061073228 39.724152002964722,-94.902612000000005 39.724201999999998,-94.906055088082866 39.724933471502588,-94.907014260749904 39.725137244236571,-94.907785666538786 39.725301126582274,-94.910067999999995 39.725785999999999,-94.911087398893699 39.726157408899255,-94.918323999999998 39.728793999999994,-94.93000499999998 39.735370000000003,-94.939221000000003 39.74157799999999,-94.944740999999979 39.744377,-94.948658825773634 39.745572502168315,-94.948680784417533 39.745579202723142,-94.948725999999994 39.745593,-94.952629999999999 39.745961,-94.955286 39.745688999999999,-94.960086000000004 39.743065,-94.963779819772341 39.740240978767318,-94.964692434782606 39.73954326086956,-94.965317999999982 39.739064999999989,-94.965565209393333 39.738728671232884,-94.970224508542714 39.732389687437191,-94.970421999999985 39.732120999999999,-94.971205999999981 39.729304999999997,-94.971078000000006 39.723146,-94.968452999999997 39.707402000000002,-94.968980999999999 39.692954,-94.969909 39.689050000000002,-94.971316999999999 39.686410000000002,-94.976096392737759 39.68160006801152,-94.976325000000003 39.68137,-94.981556999999995 39.678634000000002,-94.984149000000002 39.677849999999992,-94.986445080691666 39.677537608069159,-94.990587390516794 39.676974028501114,-94.993556999999996 39.676569999999998,-94.998766892420107 39.676509388876212,-95.001379 39.676479,-95.004602740773237 39.676177881356345,-95.008105239221649 39.675850724907868,-95.009022999999999 39.675764999999998,-95.010225986948086 39.675477408241932,-95.013209713780839 39.674764104372102,-95.015309999999985 39.674261999999999,-95.018317999999994 39.672868999999999,-95.021521942351953 39.670631293568427,-95.024595000000005 39.668484999999997,-95.027643999999995 39.665453999999997,-95.037464 39.652904999999997,-95.039049000000006 39.649639,-95.044554000000005 39.644370000000002,-95.049518000000006 39.637875999999999,-95.053366999999994 39.630347,-95.054924999999997 39.624994999999991,-95.055024819926729 39.623527163368095,-95.055152000000007 39.621656999999992,-95.054958456554544 39.620961328886679,-95.053131423647116 39.614394255464305,-95.053011999999981 39.613965,-95.052555891387243 39.613278556984888,-95.047910999999999 39.606287999999999,-95.046445000000006 39.601605999999997,-95.046361000000005 39.599556999999997,-95.047165000000007 39.595117000000002,-95.049277000000004 39.589582999999998,-95.054804000000004 39.582487999999998,-95.056897000000006 39.580567000000002,-95.059518999999995 39.579132,-95.064519000000004 39.577114999999999,-95.066275551338904 39.576786470694117,-95.068266439890465 39.576414113098046,-95.069315000000003 39.576217999999997,-95.072159999999982 39.576121999999991,-95.075842551355763 39.576644128527029,-95.076688000000004 39.576763999999997,-95.088569515113861 39.580713698327401,-95.089515000000006 39.581028000000003,-95.09068217809525 39.58095107619048,-95.095736000000002 39.580618,-95.099095000000005 39.579690999999997,-95.100375015351446 39.579100080742663,-95.10182940536555 39.578428661399109,-95.103228 39.577782999999997,-95.106109962410699 39.575487768136732,-95.106244982404746 39.575380236480051,-95.106274453941239 39.575356764970024,-95.106406000000007 39.575251999999999,-95.107454000000004 39.573842999999997,-95.108931052511622 39.56997896968771,-95.109155613535791 39.569391508783276,-95.112830712234896 39.559777298955126,-95.112877844119652 39.559653999999995,-95.113077000000004 39.559132999999996,-95.113262990573148 39.557121201967142,-95.113516735173974 39.554376531201555,-95.113557 39.553940999999995,-95.113330390574859 39.553319942050457,-95.109694540741444 39.543355336910984,-95.109303999999995 39.542284999999993,-95.106595999999996 39.537657000000003,-95.106363136618171 39.537386330858773,-95.106309238275287 39.537323682029822,-95.102887999999993 39.533346999999999,-95.096713422649174 39.527826015970483,-95.095319522838992 39.526579663685382,-95.092703999999998 39.524241000000004,-95.082713999999996 39.516711999999998,-95.077440999999993 39.513551999999997,-95.059460999999985 39.506143000000002,-95.05637999999999 39.503971999999997,-95.052176999999986 39.499995999999996,-95.050551999999996 39.497514000000002,-95.049844999999991 39.494414999999989,-95.048370000000006 39.480420000000002,-95.047133000000002 39.474970999999996,-95.045715999999999 39.472459,-95.040779999999998 39.466386999999997,-95.03749999999998 39.463689000000002,-95.033407999999994 39.460875999999992,-95.028497999999999 39.458286999999999,-95.015825000000007 39.452809000000002,-94.995767999999998 39.448174000000002,-94.990172 39.446192000000003,-94.982144000000005 39.440551999999997,-94.978797999999998 39.436241000000003,-94.976606000000004 39.426701,-94.972952000000006 39.421705000000003,-94.968547467194298 39.418879728230785,-94.966981164652054 39.417875029083376,-94.966065999999998 39.417287999999999,-94.965430539155946 39.417093446959996,-94.954817000000006 39.413843999999997,-94.951209000000006 39.411706999999993,-94.947863999999996 39.408603999999997,-94.946292999999983 39.405645999999997,-94.946662000000003 39.399717000000003,-94.946226999999993 39.395648,-94.945577 39.393850999999998,-94.942038999999994 39.389499,-94.939696999999995 39.387949999999996,-94.938205659338905 39.38711651736979,-94.938199994953891 39.387113351650086,-94.938198708293527 39.387112632559479,-94.937157999999982 39.386530999999998,-94.933651999999995 39.385545999999998,-94.932170703908099 39.385397898493565,-94.923109999999994 39.384492000000002,-94.919224999999997 39.385173999999999,-94.915858999999998 39.386347999999998,-94.909581000000003 39.388865000000003,-94.901822999999993 39.392797999999999,-94.896448416922993 39.39340032396553,-94.894979000000006 39.393565000000002,-94.891845000000004 39.393312999999999,-94.888971999999995 39.392431999999999,-94.888058227506249 39.391822741147728,-94.885025999999996 39.389800999999999,-94.880978999999996 39.383899,-94.879281000000006 39.37977999999999,-94.879087999999996 39.375702999999994,-94.881359999999987 39.370382999999997,-94.885216 39.366911000000002,-94.890928000000002 39.364030999999997,-94.896832000000003 39.363135,-94.899023999999997 39.362431,-94.902496999999997 39.360382999999999,-94.90716104958679 39.35683832231404,-94.907297 39.356735,-94.907510470967722 39.356484333333356,-94.909408999999997 39.354254999999995,-94.910016999999996 39.352542999999997,-94.91007929967077 39.352122876579188,-94.910166635146069 39.351533921963672,-94.910234386079424 39.351077037464393,-94.910640999999998 39.348334999999999,-94.910055514481613 39.342727430625168,-94.908683540921714 39.329587162119807,-94.908064999999993 39.323663000000003,-94.906599414484603 39.317389801180319,-94.905982468129508 39.31474906332776,-94.905548856768945 39.312893060899633,-94.905328999999995 39.311951999999998,-94.904604536115073 39.31007473956825,-94.903592654247163 39.307452709910535,-94.903137 39.306272,-94.902341179156608 39.304705098857582,-94.900693838394318 39.301461629999167,-94.900362755471093 39.300809756886117,-94.900048999999996 39.300192000000003,-94.895217000000002 39.29420799999999,-94.889432625546704 39.288730528394183,-94.887056 39.286479999999997,-94.882576 39.283327999999997,-94.881425972827699 39.282735692772164,-94.879585687759075 39.281787876778168,-94.878319999999988 39.281135999999996,-94.869470269042495 39.278423959123423,-94.867567999999991 39.277841000000002,-94.866576416802303 39.277461598502107,-94.857072000000002 39.273825000000002,-94.850573678793964 39.270595179638669,-94.850470600187833 39.270543947117169,-94.846320000000006 39.268481,-94.844203868589133 39.266965084952687,-94.840994595225254 39.264666085108807,-94.837855000000005 39.262416999999999,-94.836102527271095 39.260730409704507,-94.834879550067882 39.259553409087879,-94.832501320107042 39.257264586268427,-94.832102355305352 39.256880620143498,-94.831470999999993 39.256273,-94.827487000000005 39.249888999999996,-94.826571473591798 39.245793223963304,-94.825663000000006 39.241728999999999,-94.826110999999983 39.238289000000002,-94.826405091238243 39.237538367125239,-94.827108391663188 39.2357432765168,-94.827791000000005 39.234000999999999,-94.828117769197533 39.233533772937683,-94.83244435695299 39.227347452739551,-94.834698551534771 39.224124319346686,-94.834896 39.223841999999998,-94.834917496024659 39.223414229109203,-94.835039139715306 39.220993519665384,-94.835046603087861 39.220844998551456,-94.835055999999994 39.220658,-94.833551999999997 39.217793999999998,-94.831678999999994 39.215938,-94.823791 39.209873999999999,-94.820687000000007 39.208626000000002,-94.811662999999996 39.206594000000003,-94.800359054554335 39.206051410618606,-94.799662999999995 39.206018,-94.798924306591658 39.206116812235138,-94.793913945984244 39.206787029303406,-94.788135068391796 39.207560047994349,-94.787343000000007 39.207666000000003,-94.783838000000003 39.207154000000003,-94.781518000000005 39.206145999999997,-94.780294078498926 39.205273290755756,-94.778971577769184 39.204330290235411,-94.777838000000003 39.203522,-94.775537999999997 39.200602000000003,-94.770897097034492 39.191141697801093,-94.770859400196969 39.191064854247678,-94.770337999999995 39.190002,-94.763137999999998 39.179903000000003,-94.75233799999998 39.173202999999994,-94.74193799999999 39.170203,-94.736536999999998 39.169203000000003,-94.723636999999997 39.169002999999989,-94.714136999999994 39.170403,-94.696331999999998 39.178562999999997,-94.687235999999999 39.183503000000002,-94.680335999999983 39.184303,-94.669134999999997 39.182003000000002,-94.663835000000006 39.179102999999998,-94.660314999999997 39.168050999999991,-94.662434999999988 39.157602999999995,-94.650734999999983 39.154102999999999,-94.640034999999997 39.153102999999994,-94.623934000000006 39.156602999999997,-94.615834000000007 39.160003000000003,-94.608834000000002 39.160502999999999,-94.601732999999996 39.15960299999999,-94.596033000000006 39.157702999999998,-94.591932999999997 39.155003,-94.589933000000002 39.140402999999999,-94.592533000000003 39.135902999999992,-94.600433999999993 39.128503000000002,-94.605733999999998 39.122204000000004,-94.607033999999999 39.119404000000003,-94.607354 39.113444,-94.607234000000005 39.089604,-94.607333999999994 39.081703999999995,-94.607275518421304 39.072346947409343,-94.607234000000005 39.065703999999997,-94.607342812841125 39.057404745686583,-94.60738379566331 39.05427894858029,-94.607437239929951 39.050202705779334,-94.607518499034526 39.044004999999999,-94.607559479691474 39.040879368039988,-94.607612854426819 39.036808428453341,-94.60764748233197 39.034167326647299,-94.607654028188094 39.033668068249817,-94.60769507925167 39.030537066312085,-94.607898722639391 39.015005000000002,-94.607914652765047 39.013789994834404,-94.607991843462372 39.007902590176151,-94.608087526605189 39.000604749887366,-94.608092759229436 39.000205652880325,-94.608190956218394 38.992716079262479,-94.608212339138063 38.991085184540211,-94.608264438806202 38.98711149548862,-94.608279957450691 38.985927874365181,-94.608301211867541 38.984306780669819,-94.608333999999999 38.981805999999999,-94.608294286905348 38.97390309416464,-94.608273484679671 38.969763451253407,-94.608249262127771 38.964943163424849,-94.608207879518076 38.956708024096379,-94.608134000000007 38.942005999999999,-94.608134000000007 38.940005999999997,-94.607866 38.937398000000002,-94.607977999999989 38.936869999999992,-94.608002838442587 38.912906322207348,-94.608006216770249 38.909646973100827,-94.608010407202343 38.90560412040071,-94.608022064178897 38.894357681354862,-94.60802273861259 38.893706999999999,-94.608033000000006 38.883806999999997,-94.608033000000006 38.869207000000003,-94.608033000000006 38.868107000000002,-94.607992999999993 38.867271000000002,-94.608033000000006 38.861207,-94.608033000000006 38.855007,-94.608033000000006 38.850107,-94.608033000000006 38.847206999999997,-94.607624999999999 38.827559999999991,-94.607668973053535 38.825816299300072,-94.608041 38.811064000000002,-94.608617609754887 38.781926100280451,-94.609398999999996 38.742440000000002,-94.60945599999998 38.74069999999999,-94.609507757106428 38.73815999467709,-94.609625656590424 38.7323740198146,-94.610322172686637 38.698192151600097,-94.61071084056907 38.679118085101081,-94.61073851283922 38.677760054904219,-94.611602000000005 38.635384000000002,-94.611464999999995 38.625011,-94.611857999999998 38.620485000000002,-94.611908 38.609271999999997,-94.611905562149673 38.605890005062435,-94.611886999999996 38.580139000000003,-94.611902 38.580109999999998,-94.612176000000005 38.576546,-94.612156999999996 38.549816999999997,-94.612272000000004 38.547916999999998,-94.612464742072774 38.518760616499996,-94.612644000000003 38.491644,-94.612725999999995 38.484366999999999,-94.612696 38.483153999999999,-94.612865999999997 38.477570999999998,-94.613365000000002 38.403421999999999,-94.613264999999998 38.392426,-94.613275404637193 38.388718047420433,-94.613328999999993 38.369617999999996,-94.613311999999993 38.364407,-94.613085455228386 38.3436360393057,-94.612999999999985 38.335800999999996,-94.612825 38.324387000000002,-94.612787999999995 38.320141999999997,-94.612673 38.314832000000003,-94.612673 38.302526999999998,-94.612689368276676 38.301464114946214,-94.612843999999996 38.291422999999995,-94.612848999999997 38.289914000000003,-94.612707829046002 38.272362044447966,-94.612691999999996 38.270394000000003,-94.612613999999994 38.237766,-94.612634999999997 38.226987,-94.612658999999994 38.219251,-94.61265866950464 38.21872154645218,-94.612657999999982 38.217649000000002,-94.612821999999994 38.203918000000002,-94.612848 38.200713999999998,-94.613073 38.190551999999997,-94.61341774677895 38.168183959706163,-94.613422 38.16790799999999,-94.613748 38.160632999999997,-94.613855999999998 38.149768999999999,-94.613889466360249 38.136312911169284,-94.613919497343275 38.124238112111762,-94.614061000000007 38.067343,-94.614088999999993 38.065900999999997,-94.614054999999993 38.060088,-94.613980999999995 38.036949,-94.614211999999981 37.992462000000003,-94.614464999999996 37.987798999999995,-94.614511123427164 37.979395512107736,-94.614514360688489 37.978805697169918,-94.614557000000005 37.971036999999995,-94.614561999999992 37.951517000000003,-94.614593999999997 37.949977999999994,-94.614611999999994 37.944361999999998,-94.614754000000005 37.940769000000003,-94.614834999999999 37.936700000000002,-94.614778 37.934199999999997,-94.615181000000007 37.915944000000003,-94.615392999999983 37.906391999999997,-94.61546899999999 37.901775,-94.615706000000003 37.886842999999999,-94.615921 37.878331000000003,-94.615834000000007 37.872509999999998,-94.616 37.863126,-94.616282760205394 37.851281931678621,-94.616426000000004 37.845281999999997,-94.616433230053673 37.842955730230052,-94.61645 37.837560000000003,-94.616861999999998 37.819456000000002,-94.6176681324215 37.775831003788085,-94.617720999999989 37.77297,-94.617737774720197 37.764628336555312,-94.617744979193901 37.761045725680312,-94.617807999999997 37.729706999999998,-94.617975 37.722175999999997,-94.61780499999999 37.690178000000003,-94.617650999999995 37.687671000000002,-94.617687000000004 37.686652999999993,-94.617885 37.682214000000002,-94.617733999999999 37.673127,-94.617576 37.653671000000003,-94.617517909436387 37.643988652624088,-94.61747699999998 37.637169999999998,-94.617472819127315 37.636539916507168,-94.6173 37.610495,-94.617428000000004 37.609521999999998,-94.617283 37.571896000000002,-94.617315000000005 37.571498999999996,-94.617080999999999 37.567013000000003,-94.61711240153133 37.563155381499406,-94.617159999999984 37.557307999999999,-94.617186000000004 37.553485000000002,-94.617167532949537 37.551779056391354,-94.616988484457494 37.535238968895172,-94.616907999999981 37.527804000000003,-94.616788999999997 37.521509999999999,-94.616880369657522 37.506771761864755,-94.617022999999989 37.483764999999998,-94.617182999999997 37.469664999999999,-94.617180000000005 37.465203000000002,-94.617221999999998 37.460476,-94.617204999999984 37.46037299999999,-94.617200999999994 37.454788,-94.617131999999998 37.439818000000002,-94.617265000000003 37.425535999999994,-94.617510999999993 37.410908999999997,-94.617557000000005 37.396374999999999,-94.61759158917468 37.381725975861251,-94.617625000000004 37.367576,-94.617626 37.367444999999989,-94.617536999999999 37.364355000000003,-94.617636000000005 37.338417,-94.617694999999998 37.336841999999997,-94.617648000000003 37.323588999999998,-94.61807499999999 37.240436000000003,-94.618157999999994 37.237596999999994,-94.618122999999997 37.229334,-94.61815 37.228121000000002,-94.618218999999996 37.207771999999999,-94.618305000000007 37.207337000000003,-94.618319 37.188774000000002,-94.618504999999985 37.181184000000002,-94.618472999999994 37.174782,-94.618351000000004 37.160210999999997,-94.618071999999998 37.132345,-94.61807499999999 37.129755000000003,-94.61816441512984 37.118929895303054,-94.618212 37.113168999999992,-94.618150999999997 37.103968000000002,-94.618059000000002 37.096676000000002,-94.618088 37.093670999999993,-94.618089999999995 37.093494,-94.618085255103864 37.089305442941992,-94.618082 37.086432000000002,-94.61811999999999 37.085934000000002,-94.617981999999998 37.075077,-94.617954311863897 37.070346986543974,-94.617947706480578 37.069218577181687,-94.617910161110728 37.062804634983031,-94.617893975984089 37.060039701061122,-94.617874999999998 37.056798,-94.617877538275181 37.056339390079508,-94.617964999999998 37.040537,-94.617972200190749 37.032971759572447,-94.617994999999979 37.009015999999995,-94.618027702303792 37.004829720380044,-94.618080000000006 36.998134999999998,-94.625223999999989 36.998671999999999,-94.699735000000004 36.998804999999997,-94.701796999999999 36.998814000000003,-94.711286363060864 36.99879670415919,-94.712770000000006 36.99879399999999,-94.722629184733563 36.998741903378082,-94.732834603466486 36.998687977231512,-94.736330645670293 36.998669503899912,-94.737183000000002 36.998665000000003,-94.739323999999996 36.998686999999997,-94.745992043692311 36.998700535427304,-94.749560781475736 36.99870777958963,-94.749834600019099 36.998708335412474,-94.777257000000006 36.998764,-94.831280000000007 36.998812,-94.831539962039543 36.998812565955092,-94.840925999999996 36.998832999999998,-94.846637705524785 36.998860673615503,-94.849800999999999 36.998875999999996,-94.853196999999994 36.998874,-94.896852168601683 36.999075231107383,-94.904605402657381 36.99911097010289,-94.9407882710602 36.999277757196154,-94.995293000000004 36.999528999999995,-95.007620000000003 36.999513999999998,-95.011432999999997 36.999535000000002,-95.030323999999993 36.999516999999997,-95.037857000000002 36.999496999999998,-95.049498999999983 36.999580000000002,-95.073509 36.999509000000003,-95.1405498515593 36.999533623834409,-95.155186999999998 36.999538999999999,-95.155372 36.999540000000003,-95.159067907556633 36.999536629205572,-95.177300999999986 36.999519999999997,-95.195307 36.999564999999997,-95.267905305061163 36.999446910377756,-95.285983101167361 36.999417504731007,-95.322564999999997 36.999357999999994,-95.328057999999999 36.999364999999997,-95.328326999999987 36.999366000000002,-95.331209999999999 36.999380000000002,-95.377252424658963 36.999296311678272,-95.381753803085687 36.999288129815376,-95.407683000000006 36.999240999999998,-95.511578 36.999234999999999,-95.522414951940931 36.999281058114107,-95.534401000000003 36.999332000000003,-95.573598000000004 36.999309999999994,-95.601517312742303 36.999317968253862,-95.612139999999997 36.999321000000002,-95.615933999999996 36.999364999999997,-95.621011943860609 36.999361983160732,-95.624350000000007 36.999360000000003,-95.630078999999995 36.999319999999997,-95.638122589416028 36.999320470082949,-95.664300999999995 36.999321999999999,-95.674044398562955 36.999333876292773,-95.686452000000003 36.999349000000002,-95.696658999999997 36.999215,-95.71038 36.999370999999996,-95.710782524132014 36.999362783399121,-95.714887000000004 36.999279,-95.718053999999995 36.999254999999998,-95.741907999999995 36.999243999999997,-95.746466244276931 36.999250838506164,-95.759905000000003 36.999270999999993,-95.768719000000004 36.999205000000003,-95.786761999999996 36.999309999999994,-95.807979999999986 36.999124000000002,-95.819364496908179 36.999150471530008,-95.866899000000004 36.999260999999997,-95.873943999999995 36.999299999999998,-95.875256999999991 36.999302,-95.877150999999998 36.999304000000002,-95.910179999999997 36.999336,-95.928122000000002 36.999245000000002,-95.936991999999989 36.999267999999994,-95.964270378114222 36.999093604402042,-96.00081 36.99886,-96.095164142267308 36.998935940299688,-96.14121 36.998972999999999,-96.143207000000004 36.999133999999998,-96.147143 36.999021999999997,-96.149709 36.99904,-96.152383999999998 36.999050999999994,-96.154016999999982 36.999161,-96.184768000000005 36.999211000000003,-96.200028000000003 36.999028000000003,-96.217571000000007 36.999070000000003,-96.235320025971774 36.999130675786525,-96.27480962492784 36.999265672629733,-96.276368000000005 36.999270999999993,-96.279078999999996 36.999271999999991,-96.381556872639493 36.999226629434901,-96.394272 36.999220999999999,-96.415412000000003 36.999113,-96.500287999999998 36.998643,-96.525212323286397 36.998711038495294,-96.525495980566973 36.998711812823821,-96.551130926932458 36.998781791180214,-96.551130927020779 36.998781791180456,-96.624487489749981 36.998982040153741,-96.705431000000004 36.999203,-96.710481999999999 36.999270999999993,-96.731983006833033 36.99928335311408,-96.736589999999993 36.999285999999998,-96.741269999999986 36.999239000000003,-96.749837999999997 36.998987999999997,-96.792060000000006 36.999179999999996,-96.795198999999997 36.99886,-96.822790999999995 36.999181999999998,-96.867517000000007 36.999217000000002,-96.876289999999997 36.999232999999997,-96.902083000000005 36.999155000000002,-96.903509999999997 36.999132000000003,-96.917092999999994 36.999181999999998,-96.921914999999998 36.999150999999998,-96.924934279563146 36.999131784030439,-96.934641999999997 36.999070000000003,-96.967371 36.999066999999997,-96.975561999999996 36.999018999999997,-97.030081999999979 36.998928999999997,-97.039783999999983 36.999000000000002,-97.045562883576096 36.99899981011751,-97.100651999999997 36.998998,-97.104275999999999 36.999020000000002,-97.120284999999996 36.999014000000003,-97.122596999999999 36.999035999999997,-97.147721000000004 36.999110999999999,-97.202000013134437 36.999050609464689,-97.255829185181881 36.998990719420135,-97.342808466604069 36.998893946743877,-97.362376892203329 36.998872175019791,-97.364929972745273 36.99886933447624,-97.372421000000003 36.998860999999998,-97.384924999999996 36.998843,-97.462279999999993 36.998685000000002,-97.472860999999995 36.998721000000003,-97.527292000000003 36.998749999999994,-97.545899999999989 36.998708999999991,-97.546497999999985 36.998746999999995,-97.564536000000004 36.998711,-97.582460039051355 36.99869862770732,-97.606549 36.998682000000002,-97.637136999999996 36.999090000000002,-97.650465999999994 36.999003999999999,-97.692180007144742 36.998844793059916,-97.697103999999982 36.998826,-97.768704 36.998749999999994,-97.783432000000005 36.998961,-97.783489000000003 36.998846999999998,-97.802297999999979 36.998713000000002,-97.965379045838461 36.998468720211747,-98.033955000000006 36.998365999999997,-98.03989 36.998348999999997,-98.045341999999991 36.998327000000003,-98.111985000000004 36.998133000000003,-98.128185436781749 36.99814624647324,-98.147452 36.998162,-98.177595999999994 36.998008999999996,-98.190367496841162 36.998003995168112,-98.208218000000002 36.997996999999998,-98.219498999999999 36.997824,-98.237712000000002 36.99797199999999,-98.346187999999984 36.997962,-98.347186011230875 36.997961873429141,-98.354073 36.997960999999997,-98.408991 36.998513000000003,-98.418267999999998 36.998538000000003,-98.420209 36.998516000000002,-98.476584655565659 36.998733519956424,-98.485495952453391 36.998767903324406,-98.544871999999984 36.998997000000003,-98.622244241689657 36.999025734091177,-98.714511999999999 36.99906,-98.718464999999995 36.999179999999996,-98.761596999999995 36.999425000000002,-98.791936000000007 36.999254999999998,-98.793711000000002 36.999226999999991,-98.797451999999993 36.999228999999993,-98.811832237742053 36.99924038482925,-98.869449000000003 36.999285999999998,-98.880009 36.999262999999999,-98.880579999999995 36.999308999999997,-98.994371 36.999493,-99.000846251360556 36.99951188908193,-99.029336999999998 36.999594999999999,-99.044703416105833 36.999312701167916,-99.049695 36.999220999999999,-99.124882999999997 36.99942,-99.12944899999998 36.999422000000003,-99.215429691089184 36.999525607779709,-99.221470798208784 36.999532887387339,-99.22594390512576 36.999538277535649,-99.248119999999986 36.999564999999997,-99.277506000000002 36.999578999999997,-99.375390999999993 37.000176999999994,-99.375813215185289 37.000169016042221,-99.396673054015949 36.999774562980598,-99.407015 36.999578999999997,-99.456202999999988 36.999471,-99.484333000000007 36.999625999999999,-99.500394999999983 36.99957599999999,-99.500394999999983 36.999637,-99.502664999999993 36.999645,-99.504092999999997 36.999648,-99.508573999999982 36.999657999999997,-99.541115670095081 36.999572526667627,-99.558068000000006 36.999527999999998,-99.625399000000002 36.999670999999999,-99.648651999999998 36.999603999999998,-99.657657999999998 37.000197,-99.675479899119665 37.000294824261658,-99.700804554289192 37.000433831091229,-99.722499410223932 37.000552913981863,-99.774254999999997 37.000836999999997,-99.774816 37.000841,-99.786016000000004 37.000931,-99.875408999999991 37.001658999999997,-99.904897139036905 37.001652107487203,-99.995200999999994 37.001631000000003,-100.001285999999993 37.001699000000002,-100.002562999999995 37.001705999999999,-100.005706000000004 37.001725999999998,-100.08949117994996 37.002091554886341,-100.115721999999991 37.002206,-100.187546999999995 37.002082,-100.19237099999998 37.002035999999997,-100.193753999999998 37.002133,-100.201675999999992 37.002080999999997,-100.269984573601874 37.001795796937508,-100.395563941387664 37.001271475927872,-100.434302684862132 37.001109733298897,-100.434343961694367 37.0011095609592,-100.436759028295029 37.001099477534027,-100.462594151135718 37.000991610310841,-100.526354155903263 37.000725398506596,-100.551597999999998 37.000619999999998,-100.552683000000002 37.000734999999999,-100.591328000000004 37.000376000000003,-100.591413000000003 37.000399000000002,-100.629769999999994 37.000025,-100.63332699999998 36.999935999999998,-100.675551999999996 36.999687999999999,-100.734516999999997 36.999059000000003,-100.756894000000003 36.999356999999996,-100.759718826764541 36.999297806889686,-100.765484 36.999177000000003,-100.806116000000003 36.999091,-100.814277000000004 36.999085,-100.850054835707368 36.998687920265262,-100.855633999999981 36.998626000000002,-100.891659999999987 36.998604,-100.904274 36.998745,-100.904588000000004 36.998561000000002,-100.945565999999985 36.998151999999997,-100.958261085233985 36.99812508251128,-100.996501999999992 36.998044,-101.012641000000002 36.998176,-101.053589000000002 36.997966999999996,-101.066742000000005 36.997920999999998,-101.096255470166753 36.997758490771822,-101.211485999999979 36.997123999999999,-101.212908999999996 36.997044000000002,-101.283204233333976 36.996668964004151,-101.357796999999991 36.996271,-101.359673999999998 36.996231999999999,-101.37818 36.996164,-101.413867999999994 36.996008000000003,-101.415004999999994 36.995966000000003,-101.485326 36.995610999999997,-101.519065999999995 36.99554599999999,-101.555239 36.99541399999999,-101.600396000000003 36.995152999999995,-101.601592999999994 36.995094999999999,-101.672152845644291 36.994768289529276,-101.672152845650672 36.994768289529254,-101.718235173867967 36.994554916342196,-101.761767880686108 36.994353348566563,-101.826607533764985 36.994053124077894,-101.862548907230888 36.993886706153717,-101.881050066963184 36.993801040963412,-101.899294480822903 36.993716564573397,-101.902439999999999 36.993701999999999,-101.905152836625547 36.993689460946754,-101.93521516037174 36.99355050931414,-102.000446999999994 36.993248999999992,-102.000446999999994 36.993271999999997,-102.028206999999981 36.993124999999999,-102.042240000000007 36.993082999999999,-102.041951999999995 37.024741999999996,-102.04195 37.030805,-102.041921000000002 37.032178000000002,-102.041748999999996 37.034396999999998,-102.04191999999999 37.035083,-102.041983000000002 37.106551000000003,-102.041808999999986 37.111972999999999,-102.042091999999997 37.125020999999997,-102.042135000000002 37.125020999999997,-102.042121535383529 37.12671399835564,-102.042001999999997 37.141744000000003,-102.041962999999996 37.258164,-102.041663999999997 37.29764999999999,-102.041816999999995 37.309489999999997,-102.041973999999996 37.352612999999998,-102.042089000000004 37.352818999999997,-102.041523999999995 37.375017999999997,-102.041585760607518 37.389190434149839,-102.041675999999981 37.409897999999991,-102.041668999999999 37.434739999999998,-102.041754999999995 37.434854999999992,-102.041800999999992 37.469487999999998,-102.041786000000002 37.506065999999997,-102.04201599999999 37.535260999999998,-102.041899 37.541186000000003,-102.041893999999999 37.557977,-102.041618 37.607868000000003,-102.041584999999998 37.644281999999997,-102.041581999999991 37.654494999999997,-102.041694000000007 37.665680999999999,-102.041573999999997 37.680436,-102.041876000000002 37.723875,-102.041989965869121 37.73854062916552,-102.042158 37.760164000000003,-102.042668000000006 37.788758,-102.042952999999997 37.803534999999997,-102.043032999999994 37.824145999999999,-102.043218999999993 37.86792899999999,-102.043714531331204 37.914003914798144,-102.043845000000005 37.926135000000002,-102.043844000000007 37.928101999999996,-102.044644000000005 38.045532,-102.044255000000007 38.113010999999993,-102.044450868202546 38.120049353793199,-102.044589000000002 38.125012999999996,-102.044415729020699 38.133607343100145,-102.044251000000003 38.141777999999995,-102.044296878804843 38.175558844899406,-102.044398 38.250014999999998,-102.044510721728557 38.262483349316234,-102.044567999999998 38.268819,-102.044612999999998 38.312323999999997,-102.044944 38.384419,-102.044441999999989 38.415801999999999,-102.044936000000007 38.41968,-102.045323999999979 38.453646999999997,-102.045262999999991 38.505395,-102.045261999999994 38.505531999999995,-102.045112000000003 38.523783999999999,-102.045222999999993 38.543796999999998,-102.045188999999979 38.558731999999992,-102.045210999999995 38.581608999999993,-102.045287999999999 38.615248999999999,-102.045074 38.669617000000002,-102.045102 38.674945999999998,-102.045159999999996 38.675221,-102.045126999999994 38.686725000000003,-102.045156000000006 38.688555,-102.045211999999992 38.697566999999999,-102.045375000000007 38.754338999999995,-102.045287000000002 38.755527999999998,-102.045371000000003 38.770063999999998,-102.045447999999993 38.783453000000002,-102.045333999999997 38.799463000000003,-102.045387999999988 38.813391999999993,-102.046570999999986 39.047038,-102.047133999999986 39.129700999999997,-102.047188612927897 39.133146793270186,-102.047250000000005 39.13702,-102.047851021058236 39.220289738242592,-102.048449000000005 39.30313799999999,-102.04895999999998 39.37371199999999,-102.049100972149461 39.394064428437375,-102.049166999999983 39.403596999999998,-102.049369999999996 39.418210000000002,-102.049368999999999 39.423333,-102.049678999999998 39.506183,-102.049672999999999 39.536690999999998,-102.049553999999986 39.538932000000003,-102.049763758475066 39.568170000775439,-102.04980599999999 39.574058,-102.049954 39.592331,-102.050258163748609 39.627242889069393,-102.050421999999983 39.646047999999993,-102.050099000000003 39.653812000000002,-102.05059399999999 39.67559399999999,-102.050898693231389 39.741794606053567,-102.051254 39.818992,-102.051317999999995 39.833311000000002,-102.051362999999995 39.843471,-102.051569 39.849805000000003,-102.051743999999999 40.003078000000002))');
\ No newline at end of file
diff --git a/webapp/django/contrib/gis/tests/geoapp/sql/tx.wkt b/webapp/django/contrib/gis/tests/geoapp/sql/tx.wkt
new file mode 100644
index 0000000..768f13f
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/geoapp/sql/tx.wkt
@@ -0,0 +1 @@
+MULTIPOLYGON (((-103.00243399999998 36.500397,-102.90421904194784 36.500393342967676,-102.8402359524855 36.500390960558398,-102.840235952479716 36.500390960558398,-102.840235952474345 36.500390960558398,-102.840235952468362 36.500390960558398,-102.840235952461725 36.500390960558398,-102.840235952455885 36.500390960558398,-102.792077446284736 36.500389167377229,-102.643207699865854 36.500383624214699,-102.366462330167067 36.500373319605465,-102.250452999999979 36.500368999999999,-102.24499 36.500703999999999,-102.162463000000002 36.500326,-102.12545 36.500323999999999,-102.124752896301885 36.500398159967887,-102.122066000000004 36.500684,-101.930244999999999 36.500526,-101.925344139375468 36.500484781341967,-101.914929315957153 36.500397187533892,-101.826564999999988 36.499653999999992,-101.826498 36.499535000000002,-101.81449312121488 36.499579719643286,-101.788110000000003 36.499678000000003,-101.783359000000004 36.499709000000003,-101.781987 36.499718,-101.780609999999982 36.499727,-101.779435000000007 36.499733999999997,-101.773235954788092 36.499732939140301,-101.709314000000006 36.499721999999998,-101.698684999999998 36.499507999999999,-101.653707999999995 36.499572999999998,-101.649966000000006 36.499572999999998,-101.623914999999997 36.499527999999998,-101.414793008557069 36.499417763984319,-101.392608849457574 36.499406069885133,-101.340061173170298 36.499378370041477,-101.085155999999984 36.499243999999997,-101.052418000000003 36.499562999999995,-101.04533099999999 36.499540000000003,-100.977087999999995 36.499594999999999,-100.936058000000003 36.499602000000003,-100.918513000000004 36.499620999999998,-100.884174000000002 36.499682,-100.884079999999997 36.499682,-100.859656999999984 36.499687000000002,-100.850840000000005 36.49969999999999,-100.824235999999999 36.499617999999998,-100.824218000000002 36.499617999999998,-100.80619 36.499673999999999,-100.806172000000004 36.499634,-100.802909 36.499620999999998,-100.802886 36.499620999999998,-100.761810999999994 36.499617999999998,-100.761810999999994 36.499580000000002,-100.724361999999999 36.499580000000002,-100.724361000000002 36.499558,-100.708625999999995 36.499552999999999,-100.708628000000004 36.499520999999994,-100.657762999999989 36.499482999999991,-100.657762999999989 36.499499999999998,-100.648342999999997 36.499495000000003,-100.648343999999994 36.499462999999999,-100.592613999999998 36.499468999999998,-100.592555999999988 36.499468999999998,-100.592551 36.499428999999999,-100.583539000000002 36.499482999999991,-100.583378999999994 36.499442999999999,-100.578113999999999 36.499462999999999,-100.578113999999999 36.499439000000002,-100.546144999999996 36.499343000000003,-100.531215000000003 36.499341,-100.531215000000003 36.499290000000002,-100.530478000000002 36.49924,-100.530314000000004 36.499357000000003,-100.522227 36.499290999999999,-100.441064999999995 36.499490000000002,-100.441063999999997 36.499462,-100.433959000000002 36.499456000000002,-100.421327999999988 36.499447000000004,-100.421300999999985 36.499487999999999,-100.413634000000002 36.499443999999997,-100.41355 36.499468999999998,-100.378634000000005 36.499516999999997,-100.378591999999998 36.499445,-100.35185199999998 36.499487000000002,-100.351841999999991 36.499473000000002,-100.334463999999997 36.49942,-100.334440999999998 36.49944,-100.324150000000003 36.499679,-100.311244999999985 36.499631,-100.311018000000004 36.499687999999999,-100.310642999999985 36.499642,-100.253572851827684 36.499638031344489,-100.181220999999994 36.499633000000003,-100.090020999999993 36.499634,-100.000405999999984 36.499701999999999,-100.0004059967807 36.499497793115623,-100.00040222345956 36.260147946939995,-100.000399000000002 36.055677000000003,-100.000396170268971 35.879197994164429,-100.000394020347557 35.745115995014778,-100.000391999999991 35.619115,-100.000390396259149 35.519130234823749,-100.000386875554753 35.299632926398459,-100.000386874882437 35.299591010324292,-100.000386852473085 35.298193905884737,-100.000384999999994 35.182701999999999,-100.000381972929958 34.852568985943549,-100.000381605014198 34.812443999872983,-100.000381000000004 34.746460999999996,-100.000381000000004 34.570853999999997,-100.000381000000004 34.570647,-100.000381000000004 34.560509000000003,-99.998254592787575 34.560446149085699,-99.997501461048799 34.560423888524269,-99.985833 34.560079000000002,-99.974761999999998 34.561317999999993,-99.971554999999995 34.562179,-99.965608000000003 34.565843999999998,-99.958898000000005 34.571271000000003,-99.957540999999992 34.572708999999996,-99.95755299999999 34.574168999999998,-99.956716999999998 34.576523999999992,-99.954566999999997 34.578195,-99.94571999999998 34.579273,-99.930492488760507 34.576894921075187,-99.930189904388058 34.576847666503667,-99.929333999999997 34.576714000000003,-99.923210999999995 34.574551999999997,-99.921801000000002 34.570253,-99.915771000000007 34.565975000000002,-99.914151070156151 34.564995899308187,-99.898943000000003 34.555804000000002,-99.896006999999997 34.555529999999997,-99.89376 34.554219000000003,-99.887146999999999 34.549047000000002,-99.885392392967745 34.547401436342639,-99.884583851343237 34.546643143067669,-99.87806651563541 34.540530839522475,-99.87650823800611 34.539069404005723,-99.874403 34.537095,-99.873254000000003 34.535350999999999,-99.872356999999994 34.532096000000003,-99.868953000000005 34.52761499999999,-99.867217250163094 34.525864500605081,-99.853065999999998 34.511592999999998,-99.832903999999985 34.500067999999999,-99.825324999999992 34.497596,-99.818185999999997 34.487839999999991,-99.818738999999979 34.484975999999996,-99.814544624457952 34.476663062301249,-99.814312999999984 34.476204000000003,-99.793683999999999 34.453893999999998,-99.783787954821193 34.445078397966533,-99.782985999999994 34.444364,-99.775743000000006 34.444225000000003,-99.774224411180043 34.443216449834381,-99.765598999999995 34.437488000000002,-99.764825999999999 34.436433999999998,-99.764881999999986 34.435265999999999,-99.767647999999994 34.431854,-99.767234000000002 34.430501999999997,-99.754248000000004 34.421288999999994,-99.740907000000007 34.414763,-99.735679661059166 34.413018903486261,-99.730348000000006 34.411239999999992,-99.720258999999999 34.406295,-99.719721039768913 34.405807854123296,-99.716415999999995 34.402814999999997,-99.715089000000006 34.400753999999999,-99.714231999999996 34.397821999999998,-99.714838 34.394523999999997,-99.712682 34.390928000000002,-99.707900999999993 34.387538999999997,-99.696461999999997 34.381036000000002,-99.678282999999979 34.379798999999998,-99.672337448339604 34.378003970284972,-99.671377000000007 34.377713999999997,-99.666676988468737 34.374633899592595,-99.665992000000003 34.374184999999997,-99.665404581506792 34.374094751646162,-99.662705000000003 34.373679999999993,-99.659863615570984 34.374283464835351,-99.659362000000002 34.374389999999998,-99.654194000000004 34.376519000000002,-99.649662000000006 34.379885000000002,-99.630904999999998 34.376007,-99.628541546335526 34.375150829397036,-99.624196999999995 34.373576999999997,-99.600026 34.374687999999999,-99.596322999999998 34.377136999999998,-99.587595999999991 34.385866999999998,-99.587235087741874 34.386377538370702,-99.585718954359294 34.388522226586467,-99.585441999999986 34.388914,-99.584530999999984 34.391204999999999,-99.585306000000003 34.398122,-99.584479999999985 34.407673000000003,-99.580059999999989 34.416652999999997,-99.574366999999995 34.418281,-99.569695999999993 34.418418000000003,-99.563067665646059 34.417445690943012,-99.562203999999994 34.417318999999999,-99.561530791054494 34.417028950664999,-99.555986000000004 34.414639999999999,-99.549242000000007 34.412714999999992,-99.529786 34.411451999999997,-99.528744576810823 34.411579971493573,-99.523649999999989 34.412205999999998,-99.517623999999998 34.414493999999991,-99.514279999999999 34.414034999999998,-99.499874999999989 34.409607999999999,-99.497090999999983 34.407730999999991,-99.494103999999993 34.404755000000002,-99.490425999999999 34.399693999999997,-99.487218999999982 34.397955000000003,-99.477547 34.396355,-99.477019613816751 34.396364300212412,-99.474810232095294 34.396403261641368,-99.472297823530695 34.396447566809115,-99.470968999999997 34.396470999999991,-99.463286816319666 34.393024688790533,-99.452647999999996 34.388252,-99.445020999999983 34.379891999999998,-99.440759999999997 34.374122999999997,-99.430994999999982 34.373413999999997,-99.43081720973791 34.373532661492725,-99.420432000000005 34.380464000000003,-99.408847999999992 34.372776000000002,-99.407167999999999 34.372605,-99.406018176721332 34.372844364351735,-99.404336527339453 34.373194441551952,-99.402959999999979 34.373480999999998,-99.399602999999999 34.375078999999999,-99.397253000000006 34.377870999999999,-99.396160718377317 34.383134276834824,-99.391492 34.405631,-99.393918999999997 34.415273999999989,-99.396488000000005 34.417290999999999,-99.396901999999997 34.418688000000003,-99.397009999999995 34.424002999999999,-99.395768462359129 34.43494110377263,-99.394955999999993 34.442098999999999,-99.381011 34.456935999999999,-99.376037841709419 34.458617501802458,-99.375365000000002 34.458844999999997,-99.369609999999994 34.458699000000003,-99.358795 34.455862999999994,-99.354671999999994 34.451856999999997,-99.35478257092818 34.450383391084422,-99.354837000000003 34.449657999999999,-99.356770999999995 34.446542,-99.357101999999998 34.444915000000002,-99.356712999999999 34.442143999999999,-99.350407000000004 34.437083,-99.342020261837703 34.431514649700844,-99.341336999999996 34.431061,-99.341016600261696 34.430906286427735,-99.334036999999995 34.427536000000003,-99.331050066208874 34.424666026137302,-99.328674000000007 34.422383000000004,-99.325094009617374 34.416010263301388,-99.324222000000006 34.414458000000003,-99.321411663781888 34.411055277053073,-99.319798627189357 34.409102230797522,-99.319605999999979 34.408869000000003,-99.318363000000005 34.408295999999993,-99.316372999999999 34.408204999999995,-99.308273999999997 34.410013999999997,-99.299098 34.414227999999994,-99.294647999999981 34.415373000000002,-99.289922000000004 34.414731000000003,-99.287844819286008 34.413958196831629,-99.264167 34.405149000000002,-99.261320999999981 34.403498999999996,-99.261255940568432 34.403158389836314,-99.260996786434447 34.401801622187399,-99.259199386422964 34.392391568987605,-99.258998120407611 34.391337867029385,-99.258979999999994 34.391243000000003,-99.259239630132384 34.391043961974496,-99.260703756811225 34.389921531074158,-99.261190999999997 34.389547999999998,-99.262646013804954 34.388906249865343,-99.264243556741917 34.388201635660714,-99.264508000000006 34.388084999999997,-99.271031915197597 34.387722560266795,-99.271781628057255 34.38768090955238,-99.273607516746409 34.387579471291865,-99.273957999999993 34.38756,-99.27534 34.386598999999997,-99.274925999999994 34.384903999999999,-99.271845396288441 34.382114976063626,-99.271280999999988 34.381603999999996,-99.258696 34.372633999999998,-99.254722 34.372405,-99.251407999999984 34.375079999999997,-99.248969000000002 34.375984000000003,-99.242944999999992 34.372667999999997,-99.239138083830497 34.366035888164781,-99.237232999999989 34.362716999999996,-99.237183660287812 34.362563767173611,-99.235448627455725 34.357175329079247,-99.234251999999984 34.353459,-99.233273999999994 34.344101000000002,-99.23260599999999 34.342379999999999,-99.229993999999991 34.340538000000002,-99.226152999999982 34.339725999999999,-99.221975 34.340020000000003,-99.219768999999999 34.341377,-99.217335000000006 34.341520000000003,-99.213134999999994 34.340369000000003,-99.210957832415772 34.336710386428308,-99.210716000000005 34.336303999999998,-99.20972399999998 34.324934999999996,-99.211600000000004 34.313969999999998,-99.213476 34.310671999999997,-99.213233598142949 34.308226764636807,-99.211647999999997 34.292231999999991,-99.211468055040228 34.291676209875057,-99.209990337717599 34.287112032604114,-99.209742000000006 34.286344999999997,-99.209514950796304 34.286049346749877,-99.207560999999998 34.283504999999998,-99.203681000000003 34.281925999999999,-99.200221999999997 34.281151999999999,-99.196259999999995 34.281463000000002,-99.196052113016066 34.281264951942028,-99.19571031750732 34.280939333014615,-99.195605 34.280839,-99.194569999999985 34.272424,-99.196926000000005 34.260928999999997,-99.197153 34.244298,-99.19555299999999 34.24006,-99.191138999999993 34.23234,-99.190145999999984 34.229660000000003,-99.190036000000006 34.227186000000003,-99.192076 34.222192,-99.192683000000002 34.218825000000002,-99.192104 34.216693999999997,-99.189758414718312 34.214539281858485,-99.189510999999996 34.214312,-99.188483307800709 34.214128939694163,-99.159015999999994 34.20888,-99.143985 34.214762999999998,-99.138220000000004 34.219158999999998,-99.130609000000007 34.219408,-99.128513999999996 34.218766000000002,-99.127549000000002 34.217986000000003,-99.126614000000004 34.21532899999999,-99.127525000000006 34.213771,-99.130089999999996 34.212192000000002,-99.131552999999997 34.209352000000003,-99.131884999999997 34.207382000000003,-99.129791999999995 34.204402999999999,-99.126566999999994 34.203004,-99.119203999999996 34.201746999999997,-99.108757999999995 34.203400999999999,-99.102001344898341 34.205813362825268,-99.092190999999985 34.209316,-99.08119261238302 34.211229594305671,-99.079534999999993 34.211517999999991,-99.075978000000006 34.211221000000002,-99.06646499999998 34.208404000000002,-99.060343999999986 34.204760999999991,-99.059158999999994 34.202928999999997,-99.058800000000005 34.201256,-99.058083999999994 34.200569000000002,-99.048792000000006 34.198208999999999,-99.043470999999997 34.198208,-99.040961999999993 34.200842000000002,-99.039004000000006 34.204667,-99.037458999999998 34.206454,-99.036272999999994 34.206912000000003,-99.013074999999986 34.203221999999997,-99.005790000000005 34.206646999999997,-99.002916243275195 34.208781598893673,-99.002945441244265 34.209102775846141,-99.003147197273819 34.211322087284138,-99.003432988816769 34.214465787333673,-99.000760999999997 34.217643000000002,-98.99085199999999 34.221632999999997,-98.987293999999991 34.221223000000002,-98.981363999999999 34.217582999999991,-98.978684999999984 34.210231,-98.976586999999995 34.206291,-98.974131999999983 34.203566000000002,-98.969003 34.201298999999999,-98.966301999999999 34.201323000000002,-98.962469999999996 34.204667999999998,-98.962085000000002 34.206386000000002,-98.962306999999981 34.211312,-98.960791 34.213029999999996,-98.958474999999993 34.213854999999995,-98.952512999999982 34.212649999999996,-98.950395999999984 34.21168,-98.940219999999997 34.203685999999998,-98.928145 34.192689,-98.927456000000006 34.191155000000002,-98.923128999999989 34.185977999999999,-98.920704 34.183435000000003,-98.918333000000004 34.181831000000003,-98.909348999999992 34.177498999999997,-98.892677318093561 34.17250349095427,-98.87651287834953 34.167659972141138,-98.872921999999988 34.166584,-98.871543000000003 34.165026999999995,-98.871211000000002 34.163012000000002,-98.872229000000004 34.160446,-98.874954999999986 34.157031000000003,-98.874871999999996 34.155656999999998,-98.873271000000003 34.153596,-98.868116 34.149635000000004,-98.862549999999999 34.149110999999998,-98.860124999999996 34.149912999999998,-98.858418999999998 34.152732,-98.8579 34.159627,-98.857321999999982 34.161093999999999,-98.855585000000005 34.161620999999997,-98.854264541670545 34.16164976192438,-98.831114999999983 34.162154,-98.812953999999991 34.158444000000003,-98.806809999999984 34.155901,-98.804411553093104 34.153928907629435,-98.792015000000006 34.143735999999997,-98.779288744496085 34.140194111533035,-98.773070373738221 34.138463455122455,-98.767587610783494 34.136937528280072,-98.765569999999983 34.136375999999998,-98.764702233233265 34.135780085954792,-98.763778343962841 34.135145631382905,-98.761796999999987 34.133785000000003,-98.760558000000003 34.132387999999999,-98.759485999999995 34.128881999999997,-98.759653 34.126911999999997,-98.757118934362524 34.12470437936247,-98.757036999999983 34.124633000000003,-98.753813984496389 34.124468645349353,-98.749290999999999 34.124237999999998,-98.741966000000005 34.125529999999998,-98.740191287161664 34.126850584722824,-98.739461000000006 34.127394000000002,-98.737231999999992 34.130991999999999,-98.736819999999994 34.133374000000003,-98.735471000000004 34.135207999999999,-98.734286999999995 34.135758000000003,-98.730242646678789 34.1359250861193,-98.717536999999993 34.136450000000004,-98.716104 34.135947000000002,-98.70640034274598 34.134745066348501,-98.696517999999998 34.133521000000002,-98.690291400890658 34.133167457450512,-98.690072 34.133155000000002,-98.688275858887323 34.134465065675442,-98.685589983550884 34.136424083851644,-98.676900633591032 34.14276190388366,-98.676457484208683 34.143085127260051,-98.670573548505118 34.147376740066704,-98.655654999999982 34.158257999999996,-98.650582999999997 34.163113000000003,-98.648072999999997 34.164440999999997,-98.643223000000006 34.164530999999997,-98.635729999999995 34.161617999999997,-98.634085211037615 34.161100728840964,-98.630950281399748 34.160114822001631,-98.621666000000005 34.157195000000002,-98.620507214282355 34.157012478916968,-98.617663812339856 34.156564612849806,-98.616732999999996 34.156418000000002,-98.615748434938936 34.156446107485429,-98.612133570686254 34.156549305078279,-98.611829 34.156557999999997,-98.610173632571488 34.157093658210222,-98.610154152422197 34.157099961766605,-98.608852999999996 34.157521000000003,-98.603977999999998 34.160249,-98.599789 34.160570999999997,-98.577135999999996 34.148961999999997,-98.572451 34.145091,-98.560191000000003 34.133201999999997,-98.558593000000002 34.128253999999998,-98.550916999999998 34.119334000000002,-98.536257000000006 34.107343,-98.530610999999993 34.099843,-98.528199999999998 34.094960999999998,-98.504182 34.072370999999997,-98.487068052145446 34.063003092954936,-98.486783271268621 34.06284720836274,-98.486328 34.062598,-98.483944186894661 34.06241565608709,-98.482821069121968 34.062329745958955,-98.482039999999998 34.062269999999998,-98.475065999999998 34.064269000000003,-98.449033999999983 34.073461999999999,-98.446378999999993 34.075429999999997,-98.445784000000003 34.076827000000002,-98.445590305319797 34.079232123390703,-98.445584999999994 34.079298,-98.445259148452962 34.079797720749731,-98.443724000000003 34.082152,-98.442807999999999 34.083143999999997,-98.442148160210323 34.083427517317581,-98.441104460406791 34.083875970068213,-98.440092000000007 34.084311,-98.439068026005657 34.084479541105658,-98.434822808733685 34.08517828308225,-98.432126999999994 34.085622,-98.43151641213494 34.085605425226575,-98.43092946822253 34.085589492282431,-98.428479999999993 34.085523000000002,-98.425229999999999 34.084798999999997,-98.422252999999998 34.083036999999997,-98.419995 34.082487999999998,-98.419161945519861 34.082694545588339,-98.41804644206556 34.082971120917755,-98.417812999999995 34.083029000000003,-98.414426000000006 34.085073999999999,-98.400747497198822 34.098985940284976,-98.399776999999986 34.099972999999999,-98.398505572550647 34.104180252359392,-98.39838899999998 34.104565999999998,-98.398160000000004 34.121395999999997,-98.400493999999995 34.121777999999999,-98.400966999999994 34.122236,-98.398441000000005 34.128456,-98.384381000000005 34.146317000000003,-98.381237999999996 34.149453999999999,-98.367493999999994 34.156190999999993,-98.366862955318183 34.156357896864854,-98.364023000000003 34.157108999999998,-98.34173552164826 34.153594120579292,-98.339428832109121 34.153230340726623,-98.331172907733077 34.151928328079421,-98.326986688030772 34.151268134169193,-98.325445000000002 34.151024999999997,-98.324621914768684 34.150650086831803,-98.323612587945547 34.150190341106089,-98.322580000000002 34.149720000000002,-98.320651676675396 34.148059023851737,-98.318749999999994 34.146420999999997,-98.315432139066189 34.144301906683673,-98.312023538956254 34.142124858924547,-98.300208999999995 34.134579000000002,-98.299345719035045 34.134365643147696,-98.29862570169189 34.134187693395319,-98.293901000000005 34.133020000000002,-98.280321 34.130749999999999,-98.258217018239392 34.129574098564007,-98.256467 34.129480999999998,-98.254901718278489 34.129708262798985,-98.247953999999993 34.13071699999999,-98.241012999999995 34.133102999999998,-98.225282000000007 34.127245000000002,-98.223600000000005 34.125093,-98.216463000000005 34.121820999999997,-98.203710999999998 34.117676000000003,-98.200074999999998 34.116782999999998,-98.191455000000005 34.115752999999998,-98.169120000000007 34.114170999999999,-98.157411999999994 34.120466999999998,-98.154353999999998 34.122734,-98.142753999999996 34.136358999999999,-98.136769999999999 34.144992000000002,-98.130815999999996 34.150531999999998,-98.123377000000005 34.154539999999997,-98.114506000000006 34.154727,-98.109461999999979 34.154110999999993,-98.107064999999992 34.152531000000003,-98.101937000000007 34.146829999999994,-98.092021474678845 34.132735952269094,-98.090223999999992 34.130181,-98.089754999999982 34.128211,-98.090659999999986 34.12198,-98.092421000000002 34.116917,-98.095117999999999 34.11119,-98.096177285423778 34.109455137055363,-98.096466125075011 34.108982084942461,-98.099327999999986 34.104295,-98.101378023037029 34.101786489578267,-98.103538246996251 34.099143131812454,-98.104308999999986 34.098199999999999,-98.119416999999999 34.084474,-98.121038999999996 34.081265999999999,-98.120207999999991 34.072127000000002,-98.11802999999999 34.067064999999999,-98.114587 34.06228,-98.100919767943822 34.050244792175462,-98.099096110217346 34.048638900093685,-98.096177018664264 34.044625138601674,-98.096541898037387 34.040976263553816,-98.09727167092565 34.038969381040054,-98.097731364247636 34.038509687718062,-98.098001443813914 34.038239608151798,-98.102015208841422 34.03732738850595,-98.104022094890695 34.036232725638037,-98.104083244997014 34.036133356900422,-98.105481647738245 34.033860956680144,-98.105481647738245 34.032444902147553,-98.105481647738245 34.031306746267951,-98.103616999999986 34.029206999999992,-98.088202999999993 34.005481000000003,-98.085260000000005 34.003259,-98.082839000000007 34.002412,-98.055197000000007 33.995840999999999,-98.050169864666017 33.994989457544634,-98.041117 33.993456000000002,-98.027671999999981 33.993357000000003,-98.019485000000003 33.993803999999997,-98.018481521828946 33.993960861546498,-98.005667000000003 33.995964,-97.987387999999996 33.999822999999999,-97.982805999999997 34.001949000000003,-97.978243000000006 34.005386999999999,-97.974597608872358 34.00657735007583,-97.974172999999993 34.006715999999997,-97.973934144800623 34.006593661859519,-97.971670000000003 34.005434,-97.968339999999998 34.000529999999998,-97.965354903485249 33.996992503283089,-97.963375425210828 33.994646717187933,-97.96302799999998 33.994235000000003,-97.962715090700769 33.994009516348072,-97.958325000000002 33.990845999999998,-97.955849999999998 33.990136,-97.952687999999995 33.990113999999998,-97.947571999999994 33.991053,-97.946472999999997 33.990731999999994,-97.945729999999998 33.989839000000003,-97.945949999999982 33.988395999999995,-97.952184120103468 33.971402949359636,-97.95307606469359 33.968971674482539,-97.95691699999999 33.958502000000003,-97.960351000000003 33.951928000000002,-97.965737000000004 33.947392,-97.972662 33.944527,-97.974172999999993 33.942832000000003,-97.974062000000004 33.940289,-97.972493999999998 33.937907000000003,-97.971175000000002 33.937128999999999,-97.965952999999999 33.936191,-97.963425 33.936236999999998,-97.955511 33.938186000000002,-97.954466999999994 33.937773999999997,-97.953395 33.936444999999999,-97.952679000000003 33.929482,-97.953694999999996 33.924373000000003,-97.957155 33.914453999999999,-97.960615000000004 33.910353999999998,-97.961188664141474 33.909913087050903,-97.963139679674441 33.908413554571595,-97.964461 33.907398,-97.964803587866868 33.907309441163022,-97.9693952279504 33.906122503898267,-97.969873000000007 33.905999,-97.970298415583201 33.906261144464871,-97.973142999999993 33.908014,-97.976962999999998 33.912548999999999,-97.978803999999997 33.912548,-97.979984999999999 33.911402000000002,-97.983551999999989 33.904001999999991,-97.984539999999996 33.900703,-97.984566 33.899076999999998,-97.984416725907181 33.89872544733722,-97.984025057628415 33.897803036597892,-97.98383498894799 33.897355409354304,-97.983768999999995 33.897199999999991,-97.977858999999995 33.889929000000002,-97.974177999999995 33.886642999999999,-97.967776999999998 33.882429999999999,-97.958438 33.879179,-97.951215000000005 33.878424000000003,-97.946463999999992 33.878883000000002,-97.942729999999997 33.879845000000003,-97.938801999999995 33.879891,-97.936743000000007 33.879204,-97.933120450042608 33.877388671138185,-97.918328311832767 33.869976048610916,-97.905467000000002 33.863530999999995,-97.896737999999985 33.857984999999999,-97.877386999999999 33.850236000000002,-97.871447000000003 33.849001,-97.865764999999982 33.849392999999999,-97.835425213046037 33.857383352392631,-97.834333 33.857671000000003,-97.833886750888084 33.857971936447115,-97.833218553718808 33.858422547723912,-97.806802470257153 33.876236728393856,-97.805423000000005 33.877167,-97.803472999999997 33.880189999999999,-97.801578000000006 33.885137999999998,-97.784656999999982 33.890631999999997,-97.78061799999999 33.895533,-97.779683000000006 33.899242999999998,-97.780339999999995 33.904833000000004,-97.783716999999996 33.910559999999997,-97.772672 33.914382000000003,-97.765445999999997 33.913531999999989,-97.763769999999994 33.914240999999997,-97.762914903547767 33.914953098088951,-97.761142192227695 33.916429357685161,-97.760223999999994 33.917194000000002,-97.759399000000002 33.91881999999999,-97.759833999999984 33.92521,-97.762660999999994 33.930846000000003,-97.762767999999994 33.934396,-97.752956999999995 33.937049000000002,-97.738478 33.937421,-97.736553999999998 33.936574999999998,-97.735919542935619 33.936533987763056,-97.734773489745407 33.936459905200778,-97.733722999999998 33.936391999999998,-97.732266999999993 33.936691000000003,-97.725289000000004 33.941045000000003,-97.720699142354164 33.94461309292862,-97.716772000000006 33.947665999999998,-97.714693355370301 33.94981590741822,-97.712051708440285 33.952548118711093,-97.709683999999996 33.954996999999999,-97.708350195107343 33.95701014009046,-97.70415899999999 33.963335999999998,-97.69792099999998 33.977331,-97.69310999999999 33.983699,-97.688023 33.986606999999999,-97.671772000000004 33.991370000000003,-97.661489000000003 33.990817999999997,-97.656210000000002 33.989488,-97.633778000000007 33.981256999999999,-97.609091000000006 33.968093000000003,-97.589597999999995 33.953553999999997,-97.588828000000007 33.951881999999998,-97.591270649549756 33.930345579062646,-97.591514000000004 33.928199999999997,-97.595084 33.922953999999997,-97.596154999999996 33.922105999999999,-97.59697899999999 33.920228000000002,-97.597115000000002 33.917867999999999,-97.596955673755872 33.917077348335745,-97.596288999999985 33.913769000000002,-97.593782375104212 33.910260437761373,-97.589253999999997 33.903922,-97.587440999999984 33.902479,-97.582744000000005 33.900784999999999,-97.578907598302408 33.900207204108142,-97.558269999999993 33.897098999999997,-97.555002000000002 33.897281999999997,-97.551541 33.897947000000002,-97.543245999999996 33.901288999999998,-97.533617322522971 33.906127586572126,-97.532723000000004 33.906576999999999,-97.525277000000003 33.911750999999995,-97.519170999999986 33.913637999999999,-97.504870374844515 33.918353570482601,-97.500960000000006 33.919643,-97.495648860558163 33.919307898609453,-97.494857999999979 33.919257999999999,-97.492061582842766 33.918500058129531,-97.487115891787269 33.917159576320657,-97.48650499999998 33.916993999999995,-97.484158940985964 33.915822631562747,-97.460375999999982 33.903948,-97.458068999999995 33.901634999999999,-97.451065249608234 33.891558064966901,-97.450953999999996 33.891398000000002,-97.451469000000003 33.87093,-97.452287410342421 33.86882620086994,-97.455665873415143 33.860141550511862,-97.457616999999999 33.855125999999998,-97.459565999999995 33.853316,-97.461485999999994 33.849559999999997,-97.462857 33.841771999999999,-97.459067999999988 33.834581,-97.453056999999987 33.828536,-97.444192999999999 33.823773000000003,-97.426492999999994 33.819398,-97.410387 33.818845000000003,-97.403235695189224 33.818961304668854,-97.384901622687948 33.819259479377855,-97.372940999999997 33.819454,-97.368744000000007 33.821471000000003,-97.365506999999994 33.823762999999992,-97.358512999999988 33.830018000000003,-97.348337999999984 33.843876000000002,-97.340900078515631 33.860236176367188,-97.339391593410966 33.867629740388111,-97.337846311291798 33.870430566802547,-97.336524008254173 33.872827243260353,-97.33293952159849 33.874440259476913,-97.329175814777756 33.874440259476913,-97.327562805507441 33.873902588562437,-97.326564370247013 33.872737756024428,-97.326487449786001 33.872648016149064,-97.324157539016809 33.866016724171544,-97.322365295688968 33.864941382342593,-97.318243141591921 33.865120602507631,-97.31654836796514 33.865642075591225,-97.315913230822716 33.865837504006514,-97.314412999999988 33.866988999999997,-97.310479256695203 33.873361218982971,-97.307489695517361 33.878203969770759,-97.302471419756401 33.880175433263638,-97.299245387323282 33.880175433263638,-97.295170524880618 33.877119286431629,-97.294227111562321 33.876411726442917,-97.286921603026471 33.869423850720118,-97.28598279642199 33.868525862052032,-97.284253187903744 33.867526845294535,-97.279107999999979 33.864555000000003,-97.275347999999994 33.863225,-97.271531999999993 33.862560000000002,-97.257971626565464 33.863220416657512,-97.256624999999985 33.863286000000002,-97.255635999999996 33.863697999999999,-97.254234999999994 33.865322999999997,-97.249208999999993 33.875100999999994,-97.246418496348156 33.898356425448434,-97.246179999999981 33.900343999999997,-97.245398270620598 33.902084836575838,-97.245057441245748 33.90284383100218,-97.244945999999999 33.903092,-97.242092 33.906277000000003,-97.241794392023195 33.906436890220043,-97.238755934556053 33.908069304909361,-97.226522000000003 33.914642,-97.210920999999999 33.916063999999999,-97.210512235443105 33.915911440173737,-97.206141000000002 33.914279999999998,-97.185457999999997 33.9007,-97.180845000000005 33.895203999999993,-97.179608999999999 33.892249999999997,-97.170773789281327 33.861660975771436,-97.166629 33.847310999999998,-97.166824000000005 33.840395,-97.171627 33.835335,-97.180939422624874 33.831550006302521,-97.181369999999987 33.831375,-97.186254000000005 33.830894,-97.193690000000004 33.831307000000002,-97.195830999999998 33.830803000000003,-97.197477000000006 33.829794999999997,-97.199700000000007 33.827322000000002,-97.203513999999998 33.821824999999997,-97.204994999999997 33.81886999999999,-97.205652 33.809823999999999,-97.205556910941183 33.806237292333442,-97.205445103342427 33.802019970418343,-97.205431000000004 33.801487999999999,-97.205114487332324 33.800890302957832,-97.203236000000004 33.797342999999998,-97.194785999999993 33.785344000000002,-97.190397000000004 33.781153000000003,-97.187792000000002 33.769702000000002,-97.181842999999986 33.755869999999994,-97.173532726140948 33.740090726508434,-97.172577000695028 33.738276026602087,-97.172191999999995 33.737544999999997,-97.168438536634085 33.734131892706188,-97.163454368039083 33.729599677915004,-97.163149000000004 33.729322000000003,-97.162807288850388 33.729115696596551,-97.155066000000005 33.724442000000003,-97.152609597300682 33.723370138808036,-97.150103410774264 33.72227655424301,-97.149393999999987 33.721966999999999,-97.137529999999998 33.718663999999997,-97.126102000000003 33.716940999999998,-97.121101999999993 33.717174,-97.119522126797463 33.717502594273334,-97.114921749218269 33.718459416457094,-97.113264999999998 33.718803999999999,-97.112398501853761 33.719102240295193,-97.110065570752283 33.719905212653977,-97.108936 33.720294000000003,-97.108097026518521 33.720734123472262,-97.106518853348803 33.721562029324609,-97.104524999999995 33.722608,-97.097154000000003 33.727809,-97.094085000000007 33.730992,-97.092697209381924 33.732891057656268,-97.092130098039192 33.733667094850453,-97.091071999999983 33.735115,-97.089936943375889 33.737167271747261,-97.087911027802278 33.740830286618703,-97.086195000000004 33.743932999999998,-97.084820762198987 33.752363244406453,-97.084693 33.753146999999998,-97.08461299999999 33.759993,-97.085217999999998 33.765512,-97.087362453285593 33.77250304797397,-97.087851999999998 33.774099,-97.093101265647221 33.787040841586602,-97.093917000000005 33.789051999999998,-97.094675961767678 33.791977368936216,-97.095047178759813 33.793408200769441,-97.095235999999986 33.794136000000002,-97.095080023591905 33.79561056406444,-97.094877682854474 33.797523445530629,-97.094770999999994 33.798532000000002,-97.093897185962049 33.800360798466031,-97.09266432242093 33.802941048788071,-97.092111999999986 33.804096999999999,-97.087998999999982 33.808746999999997,-97.078589999999991 33.812755999999993,-97.067977124183287 33.814475679891196,-97.064604445188394 33.815487484896828,-97.062631847535258 33.816079264957295,-97.058622892638837 33.818751903281317,-97.055415722506638 33.823829921794093,-97.055412197115942 33.8238546000754,-97.055148464371385 33.82570077017467,-97.055682980641905 33.830778788687446,-97.057821087157734 33.834520485448607,-97.058282726048489 33.836367011192308,-97.058622892638837 33.837727655580807,-97.057553829022481 33.840133030590344,-97.055415722506638 33.841202089027483,-97.052208542016004 33.841736615656437,-97.048734113748537 33.840934820533782,-97.045339940802535 33.839496399893775,-97.041245000000004 33.837761,-97.038858000000005 33.838264000000002,-97.023899 33.844213000000003,-97.017857000000006 33.850141999999998,-97.010381749407998 33.858564100233409,-96.999664164722446 33.87063922351804,-96.985567000000003 33.886521999999999,-96.983970999999997 33.892082999999992,-96.984938999999997 33.904865999999991,-96.985275905099471 33.906070041818985,-96.988744999999994 33.918467999999997,-96.993996999999979 33.928978999999998,-96.995022999999989 33.932034999999999,-96.995140238436761 33.933014648420269,-96.996024643022366 33.940404763634284,-96.996183000000002 33.941727999999998,-96.996167702736543 33.941832622020257,-96.995421139189489 33.946938567064805,-96.995367999999999 33.947302,-96.994947208134789 33.948043840473474,-96.994456760007211 33.948908482357652,-96.994287999999983 33.949205999999997,-96.990835000000004 33.952700999999998,-96.988126301178397 33.954514162310069,-96.987892000000002 33.954670999999998,-96.982723774786024 33.956016867344054,-96.981537499896135 33.956325787441237,-96.981336999999982 33.956377999999994,-96.979415000000003 33.956178,-96.979347000000004 33.955129999999997,-96.980675999999988 33.951813999999999,-96.981031000000002 33.949159999999999,-96.97981799999998 33.941588000000003,-96.976955000000004 33.937452999999998,-96.973806999999979 33.935696999999998,-96.97254199999999 33.935794999999999,-96.952313000000004 33.944581999999997,-96.944610999999995 33.949216999999997,-96.933309804512817 33.955134148312766,-96.932252000000005 33.955688000000002,-96.924267999999998 33.959159,-96.922113999999979 33.959578999999998,-96.921429967464036 33.959451233053208,-96.919039990098355 33.959004821377064,-96.918617999999995 33.958925999999998,-96.91833921313939 33.958790334953079,-96.917063225391544 33.958169405626251,-96.916299999999993 33.957797999999997,-96.91417790611122 33.956157267456653,-96.911732563120111 33.95426660943896,-96.911336000000006 33.953960000000002,-96.910857206749995 33.953482904168467,-96.908421363636307 33.951055696608989,-96.907387 33.950024999999997,-96.905252999999988 33.947218999999997,-96.902433999999985 33.942017999999997,-96.901946611333699 33.940667581536225,-96.899441999999993 33.933728000000002,-96.896468999999996 33.91331799999999,-96.897193999999999 33.902954,-96.895728000000005 33.896414,-96.887761838797758 33.878628251663962,-96.883009999999999 33.868018999999997,-96.875280999999987 33.860505000000003,-96.87198767019855 33.857765462058182,-96.866438000000002 33.853149000000002,-96.85608999999998 33.84749,-96.850593000000003 33.847211,-96.845895999999996 33.848974999999996,-96.841592000000006 33.852893999999999,-96.840818999999996 33.863644999999998,-96.839777999999995 33.868395999999997,-96.837412999999984 33.871349000000002,-96.833926235310372 33.873661568818115,-96.832156999999995 33.874834999999997,-96.812777999999994 33.872646000000003,-96.794275999999996 33.868886000000003,-96.786859371055769 33.865207582975678,-96.783484999999999 33.863533999999994,-96.780568999999986 33.860098,-96.779588000000004 33.857939000000002,-96.777202000000003 33.848162000000002,-96.776765999999995 33.841976000000003,-96.770675999999995 33.829621000000003,-96.769378000000003 33.827477000000002,-96.766316855179326 33.825510582121247,-96.766234999999995 33.825457999999998,-96.761588000000003 33.824406000000003,-96.754041 33.824657999999999,-96.746233969152598 33.825673509073113,-96.746037999999984 33.825699,-96.741799282455162 33.826447231494264,-96.71318112067361 33.831498997677379,-96.712421999999989 33.831632999999997,-96.708134 33.833060000000003,-96.704457000000005 33.835020999999998,-96.700318655907978 33.838434731313264,-96.699573999999998 33.839049000000003,-96.695480719177567 33.844085960723298,-96.693127324791789 33.84698191524042,-96.690708 33.849958999999998,-96.688190999999989 33.854613,-96.687524326814838 33.85620885855986,-96.684726999999995 33.862904999999998,-96.682762564556768 33.871464102957781,-96.682209 33.873876000000003,-96.682102999999998 33.876645000000003,-96.683464 33.884217,-96.681051007513375 33.895708672998403,-96.680947000000003 33.89620399999999,-96.675306000000006 33.909114000000002,-96.673449000000005 33.912278,-96.670618000000005 33.914913999999996,-96.667186999999998 33.916939999999997,-96.665308436653305 33.917161206414967,-96.66440999999999 33.917267000000002,-96.659896000000003 33.916665999999999,-96.65150600931733 33.910998546998165,-96.644049999999979 33.905962000000002,-96.630116999999998 33.895422000000003,-96.628293999999997 33.894477000000002,-96.616355751891987 33.894625565889051,-96.614680358047494 33.89464641537834,-96.611821556077771 33.89468199182577,-96.607562 33.894734999999997,-96.592948000000007 33.895615999999997,-96.588319642127203 33.894847991673281,-96.587934000000004 33.894784,-96.58760387584924 33.894318075382706,-96.585452000000004 33.891280999999999,-96.585359999999994 33.888947999999999,-96.587494000000007 33.884250999999999,-96.590112000000005 33.880665,-96.597347999999982 33.875100999999994,-96.601685999999987 33.872822999999997,-96.611969999999999 33.869016000000002,-96.625399000000002 33.856541999999997,-96.628968999999998 33.852406999999999,-96.629746999999995 33.850866000000003,-96.630021999999983 33.847541,-96.629842405402627 33.847037300944812,-96.629577623992816 33.846294683138318,-96.629289999999997 33.845488000000003,-96.627812273090953 33.844523322531259,-96.626623854929747 33.84374750920842,-96.623154999999997 33.84148299999999,-96.622548607895212 33.841284829387497,-96.620258613641042 33.840536452948584,-96.605267599881515 33.835637348301233,-96.601258 33.834327000000002,-96.599141379811712 33.83346048638235,-96.597030984690946 33.832596521217091,-96.595164098773168 33.831832245189069,-96.592925999999991 33.830916000000002,-96.587067000000005 33.828009000000002,-96.573054340771023 33.81917200025552,-96.572936999999996 33.819097999999997,-96.568822993124115 33.818734252140963,-96.566549213959448 33.818533211567136,-96.566298000000003 33.818511,-96.551222999999993 33.81912899999999,-96.541502252916899 33.82118138128849,-96.537683599711926 33.821987629236112,-96.532865 33.823005000000002,-96.532141353898353 33.822830017549641,-96.529233999999988 33.822127000000002,-96.526655000000005 33.820891000000003,-96.526331240434345 33.820568979830284,-96.523863000000006 33.818114,-96.519910999999993 33.811346999999998,-96.517492044660074 33.805400310572544,-96.516583999999995 33.803167999999999,-96.515958999999995 33.798933999999996,-96.515952403498957 33.797370629253059,-96.5159410675722 33.794684014612457,-96.515912 33.787795000000003,-96.51191399999999 33.781477999999993,-96.502285999999998 33.773459999999993,-96.500268000000005 33.772582999999997,-96.486059999999995 33.773009999999999,-96.459153999999998 33.775232000000003,-96.456254 33.776035,-96.450509999999994 33.780588000000002,-96.448044999999993 33.781030999999999,-96.436454999999995 33.780050000000003,-96.430214000000007 33.778654000000003,-96.423664429058576 33.776393528613141,-96.422642999999994 33.776040999999999,-96.422322840041474 33.775682043625913,-96.420980388055867 33.774176915691271,-96.419961 33.773034000000003,-96.419583102042878 33.772404537625398,-96.417562000000004 33.769038000000002,-96.416145999999998 33.76609899999999,-96.413408000000004 33.757714,-96.411885201063754 33.755703128434462,-96.408468999999997 33.751191999999996,-96.403507000000005 33.746288999999997,-96.384116000000006 33.730141000000003,-96.383299027856694 33.729391180874664,-96.380090129695702 33.726446045924753,-96.379450023740389 33.7258585550397,-96.370956555983966 33.718063228581727,-96.370761536889887 33.717884239557762,-96.369590000000002 33.716808999999998,-96.369084597701828 33.715741445126696,-96.366945 33.711221999999999,-96.363253 33.701050000000002,-96.363143372320295 33.69469995601051,-96.363135 33.694215,-96.362964209763192 33.693778090504111,-96.362198000000006 33.691817999999998,-96.356236230636398 33.68737146600408,-96.355945999999989 33.687154999999997,-96.355455421824701 33.68710517164083,-96.352724507664888 33.686827790830883,-96.348305999999994 33.686378999999995,-96.346643697131185 33.686554630652331,-96.344174978865311 33.686815463144171,-96.342664999999997 33.686974999999997,-96.337175125435976 33.689043696356201,-96.321102999999994 33.695099999999996,-96.318759999999997 33.696753,-96.318590686098233 33.696960051986665,-96.318010443675675 33.697669623646739,-96.316924999999998 33.698996999999999,-96.314798583555884 33.702507526903553,-96.309963999999994 33.710489000000003,-96.308342766341951 33.715746247280322,-96.307034999999985 33.719987000000003,-96.307001890234133 33.720499786556005,-96.306595999999999 33.726785999999997,-96.307389 33.735005,-96.3061 33.741002000000002,-96.30525491425243 33.743702118680943,-96.304087485467235 33.747432149959735,-96.303009000000003 33.750878,-96.301705999999982 33.753756000000003,-96.294866999999996 33.764771000000003,-96.292482000000007 33.766418999999999,-96.277269000000004 33.769734999999997,-96.269895999999989 33.768405,-96.251497151236435 33.760405611313516,-96.248231999999987 33.758986,-96.23960043273749 33.754058875473291,-96.229595766085112 33.748347949873668,-96.229022999999998 33.748021,-96.220521000000005 33.747390000000003,-96.1999 33.752116999999998,-96.196336040977513 33.753254070097242,-96.186553999999987 33.756374999999998,-96.178059000000005 33.760517999999998,-96.174632999999986 33.763699000000003,-96.169932696734321 33.769534234627457,-96.169452000000007 33.770130999999999,-96.167888847884015 33.774482610028038,-96.162756999999985 33.788769000000002,-96.162122572851359 33.796140263149638,-96.162213638666273 33.796174412747511,-96.166837334419654 33.79790829445497,-96.170373408451042 33.799381659586444,-96.173025461119408 33.800560352833699,-96.175150000000002 33.801951000000003,-96.17734 33.805117000000003,-96.17895107878303 33.810509748931381,-96.178963999999993 33.810552999999999,-96.176910000000007 33.813934000000003,-96.175889999999981 33.814627000000002,-96.164217431250009 33.817001137011715,-96.150765000000007 33.816986999999997,-96.148792 33.819197000000003,-96.151629999999983 33.831945999999995,-96.150147000000004 33.835856,-96.148457006953691 33.837436961236868,-96.14806999999999 33.83779899999999,-96.147446683377808 33.837891494337825,-96.138904999999994 33.839159000000002,-96.128108733462625 33.839703753325978,-96.122951 33.839963999999995,-96.118168999999995 33.837883999999995,-96.109992999999989 33.832396000000003,-96.104074999999995 33.830730000000003,-96.099360000000004 33.830469999999998,-96.097448 33.832724999999996,-96.097637999999989 33.837935000000002,-96.099152999999987 33.842409000000004,-96.100785000000002 33.844230000000003,-96.101348999999999 33.845720999999998,-96.101472999999999 33.846708999999997,-96.100094999999996 33.847971,-96.084626 33.846656000000003,-96.063924 33.841522999999995,-96.055357999999984 33.838262,-96.049381559404907 33.836618570443349,-96.048833999999999 33.836468000000004,-96.044074587870469 33.838420736557822,-96.037191000000007 33.841245,-96.031783693249977 33.849934429642978,-96.031271075997878 33.850758194920559,-96.029462717056688 33.852402158173604,-96.025188419607474 33.852073366797306,-96.022229284477689 33.850922593794486,-96.021900493101384 33.849114234853282,-96.022507000000004 33.846130000000002,-96.022064891975305 33.843195970965255,-96.021407302851145 33.841880802274289,-96.019950829321616 33.840821548098475,-96.019598947095744 33.84056563358331,-96.005296 33.845505000000003,-96.000534603789163 33.849305889934179,-95.998351 33.851049000000003,-95.997709 33.852181999999992,-95.997673906338932 33.852568581878202,-95.997405462294296 33.855525685805766,-95.9977342536706 33.860950759443568,-95.997376655326022 33.862202357114477,-95.996747879541701 33.864403078452035,-95.993624351909531 33.866211440579008,-95.991487204777812 33.866869023331596,-95.988856861024331 33.866869023331596,-95.984753921632091 33.864671017651808,-95.984253769013037 33.864403078452035,-95.980965842506947 33.859306796190523,-95.9735403792467 33.856832331211713,-95.972155999999998 33.856371000000003,-95.971744371228908 33.856383941655046,-95.951609000000005 33.857016999999999,-95.945502988542614 33.859346036998218,-95.944283999999982 33.859811,-95.943359355023844 33.860365112733476,-95.941777921153459 33.861312819872232,-95.941266999999996 33.861618999999997,-95.936631000000006 33.870615,-95.93550004724635 33.874497995518659,-95.935325000000006 33.875098999999999,-95.935308000000006 33.878723999999998,-95.935637 33.880370999999997,-95.936817000000005 33.882385999999997,-95.937201999999999 33.884652000000003,-95.936131999999986 33.886825999999999,-95.935198 33.887100999999994,-95.922712000000004 33.883758,-95.915960999999996 33.881148000000003,-95.905343000000002 33.875629000000004,-95.893305999999995 33.868161,-95.887490999999997 33.863855999999998,-95.881292000000002 33.860627,-95.859469000000004 33.852455999999997,-95.849863999999997 33.844951999999999,-95.843772999999999 33.838949,-95.841300369514457 33.837329726167006,-95.840012000000002 33.836486,-95.839442445999168 33.836292954052603,-95.838335071878717 33.835917618112738,-95.837515999999994 33.835639999999998,-95.831947999999997 33.835160999999999,-95.828244999999995 33.836053999999997,-95.827967044704152 33.836191602640042,-95.826538854622555 33.836898632614485,-95.822787000000005 33.838755999999989,-95.821905415666805 33.839551758599306,-95.821112514659319 33.840267467546653,-95.820784000000003 33.840564,-95.819357999999994 33.842784999999999,-95.818975999999992 33.844456,-95.819524999999999 33.848438999999999,-95.820676999999989 33.850750999999995,-95.821665999999979 33.855443,-95.821665999999979 33.856633000000002,-95.82138191533943 33.857119395418813,-95.820824189768416 33.858074304994595,-95.820595999999995 33.858464999999995,-95.820256321913618 33.858527429344676,-95.805149 33.861303999999997,-95.800842000000003 33.861212000000002,-95.790314669347865 33.857829825250164,-95.789867 33.857685999999994,-95.789358977006231 33.85733891951336,-95.788304168820886 33.85661827626933,-95.787891000000002 33.856335999999999,-95.776255000000006 33.845145000000002,-95.773281999999995 33.843834,-95.772067000000007 33.843817,-95.763621999999984 33.847954,-95.758311274366889 33.849968021173019,-95.758015999999998 33.850079999999998,-95.757640875431136 33.850475976069447,-95.754310000000004 33.853991999999998,-95.753512999999984 33.856464000000003,-95.753688987366843 33.856976705401074,-95.75729390188404 33.867478931648478,-95.757457999999986 33.86795699999999,-95.758009454152003 33.868443703186436,-95.760805000000005 33.870911,-95.762558999999996 33.874366999999992,-95.76194240701966 33.883030946465368,-95.761915999999999 33.883401999999997,-95.758343999999994 33.890610999999993,-95.756366999999997 33.892625000000002,-95.747335000000007 33.895755999999999,-95.737508000000005 33.895966999999999,-95.729445045960333 33.893952819075864,-95.728448999999998 33.893704,-95.723226300470785 33.890698381785455,-95.717160861060378 33.887207774089354,-95.713910181462765 33.885337036216413,-95.713539999999981 33.885123999999998,-95.710877999999994 33.884551999999999,-95.696961999999999 33.885218000000002,-95.684831000000003 33.890231999999997,-95.676924999999983 33.897236999999997,-95.669978 33.905844000000002,-95.665338000000006 33.908132000000002,-95.659818 33.909092,-95.647272999999998 33.905976000000003,-95.636977999999999 33.906613,-95.609439392746168 33.923623282239362,-95.603656999999998 33.927194999999998,-95.599677999999983 33.934246999999999,-95.585944999999981 33.93448,-95.570311428427317 33.932892416047835,-95.564667905744443 33.932319318211334,-95.563423999999998 33.932192999999998,-95.562724847986416 33.932007581530534,-95.561592737930383 33.931707340510293,-95.561007000000004 33.931551999999996,-95.560415995740641 33.931042615914556,-95.559931936825777 33.930625407571753,-95.559414000000004 33.930179000000003,-95.558286100391328 33.928753215740784,-95.557777967458279 33.928110882033096,-95.556914999999989 33.927019999999999,-95.551147999999984 33.914566,-95.549144999999996 33.90795,-95.549475 33.901310999999993,-95.552330999999981 33.894419999999997,-95.55209457427955 33.888655441173519,-95.552085000000005 33.888421999999998,-95.551943532854764 33.888208369560985,-95.548485831718622 33.882986873004867,-95.548324999999991 33.882744000000002,-95.547838962671932 33.882363312195096,-95.545708294665019 33.880694470565629,-95.545197000000002 33.880293999999999,-95.54352178779898 33.880173169084813,-95.541265054919734 33.880010393826282,-95.539789999999996 33.879904000000003,-95.537358049249164 33.88037416967029,-95.534038375697051 33.881015963020303,-95.533282999999997 33.881161999999996,-95.531798241123994 33.881968630089013,-95.525321999999989 33.885486999999998,-95.521418133191162 33.888379988113826,-95.520137966641357 33.88932866459119,-95.515301759339067 33.891142240377064,-95.510062536063273 33.890134704348199,-95.506233872599807 33.886306036979761,-95.506495 33.878588999999998,-95.506084999999999 33.87639,-95.502407477038815 33.874787101867227,-95.502303999999995 33.874741999999998,-95.492028000000005 33.874822000000002,-95.480004545492946 33.87882505156746,-95.478574999999992 33.879300999999998,-95.477829321179073 33.879890044047791,-95.469962325642697 33.886104525088022,-95.467351237093553 33.886417854985297,-95.464924614258621 33.886709049048328,-95.462909526581015 33.885903021006229,-95.461498966768687 33.883686425341857,-95.46277824472287 33.878821065729895,-95.464211000000006 33.873372000000003,-95.463346 33.872312999999998,-95.461127233926518 33.871832054399569,-95.447370000000006 33.868850000000002,-95.418546279096461 33.866998581211959,-95.411345060268999 33.866536029139695,-95.407794999999979 33.866307999999989,-95.406882133018115 33.866362247208706,-95.404325916920058 33.866514150597617,-95.375232999999994 33.868243,-95.352338000000003 33.867789000000002,-95.339561303488324 33.868836967540759,-95.339121999999989 33.868873,-95.339014688391742 33.869073090388603,-95.33835013321854 33.870312202400832,-95.334854000000007 33.876830999999996,-95.334836460323601 33.877305631062114,-95.334523000000004 33.885787999999998,-95.333451999999994 33.886285999999998,-95.325571999999994 33.885703999999997,-95.310579050797429 33.880679668661742,-95.294789354523203 33.875388337067108,-95.287864786488143 33.87494634339312,-95.28344485260331 33.877745636185885,-95.281676877907344 33.882902226669891,-95.281529544303439 33.887616824907447,-95.281317419351268 33.889260797911334,-95.280350898312903 33.896751357029835,-95.279761569607459 33.899108654721076,-95.277846267017765 33.900876629417048,-95.275341635722626 33.901760616765031,-95.272542342929853 33.902055281117747,-95.267212735027385 33.900338966530455,-95.263849803053915 33.899255988324974,-95.261050510261143 33.899992642069066,-95.255746586173245 33.902939265610648,-95.253094626984378 33.90544389690578,-95.250884657186859 33.913105118684925,-95.250737329293145 33.917083057468233,-95.251326652288412 33.924154956252103,-95.253020000000006 33.927236999999998,-95.253623000000005 33.92971,-95.252905999999982 33.933647999999998,-95.250453815364224 33.936614470603772,-95.23166760862577 33.959340626388752,-95.231194814374604 33.959912577712174,-95.230491 33.960763999999998,-95.226393000000002 33.961953999999999,-95.219358 33.961567000000002,-95.184075000000007 33.950353,-95.174181557651636 33.944707625858101,-95.173657196254922 33.944408415920272,-95.168745999999999 33.941605999999993,-95.166685999999984 33.939728000000002,-95.161108999999982 33.937598,-95.149462 33.936335999999997,-95.131725657216535 33.936903570678005,-95.131056 33.936924999999995,-95.130760550144942 33.936820411866918,-95.124700000000004 33.934674999999991,-95.121184 33.931306999999997,-95.121974867397924 33.925542192115131,-95.122499622273722 33.921717137430115,-95.122365486317321 33.918632002634986,-95.119951031304154 33.915815139752631,-95.110963896232136 33.912998276870283,-95.103318123323447 33.913668959251616,-95.10214780889666 33.912991409673538,-95.100769532353866 33.912193461131935,-95.098489218495843 33.909913139475762,-95.095001673232161 33.904815960136006,-95.095247706914634 33.899772255341666,-95.095269945144935 33.899316370327696,-95.09392858558104 33.895962961020395,-95.090441035118587 33.893280234094433,-95.084002493615529 33.893280234094433,-95.079139333602001 33.898143394107954,-95.078905311676394 33.898377416033576,-95.074957661870556 33.900039583313315,-95.073630040977179 33.900598581227868,-95.071259538767663 33.901596686785098,-95.065491679645973 33.899584642240477,-95.06106518008815 33.895292278639054,-95.058834000000004 33.886812999999997,-95.049025 33.864089999999997,-95.046567999999994 33.862564999999996,-95.038661112238941 33.860609605793528,-95.037206999999995 33.86025,-95.033518790033554 33.860141698175291,-95.03143098776043 33.86008039125462,-95.030255193062573 33.860045864827867,-95.022324999999995 33.859813000000003,-95.016999191469623 33.861237606415294,-95.016422000000006 33.861392000000002,-95.008375999999984 33.866088999999995,-95.000223000000005 33.862504999999999,-94.995524000000003 33.857438000000002,-94.992810330111539 33.852698351540766,-94.992671 33.852454999999999,-94.992523097811741 33.852403566519136,-94.990494037024106 33.851697953840834,-94.988486999999992 33.850999999999999,-94.98739725328582 33.851074415574232,-94.983303000000006 33.851354,-94.981650000000002 33.852283999999997,-94.976208 33.859846999999995,-94.973410999999999 33.861730999999999,-94.971435 33.862122999999997,-94.968895000000003 33.860916000000003,-94.965888000000007 33.848421999999999,-94.964400999999995 33.837020999999993,-94.957676000000006 33.835003999999998,-94.949533421399437 33.825707838785306,-94.949112883549958 33.821754768331147,-94.948729542346143 33.818151347643564,-94.948715939727023 33.818023482549535,-94.944301522854289 33.81213759866646,-94.939560116480934 33.810502632153295,-94.935799688114457 33.810339132650462,-94.932366255585293 33.810993121156741,-94.928442330884351 33.812628087669893,-94.92451840618341 33.812791587172725,-94.924196338046286 33.812670811231236,-94.921902464831703 33.811810605997493,-94.919450010309433 33.810175636315982,-94.917815040627914 33.808704169305649,-94.917091634856007 33.805689966907131,-94.916834062621035 33.804616745101868,-94.916997555787162 33.801510305241678,-94.91961350347556 33.794152948011565,-94.920034399525505 33.790224602097751,-94.920103995647338 33.789575041141042,-94.920095560257593 33.789518805381888,-94.91961350347556 33.786305103362189,-94.913003475392784 33.779908559849432,-94.912450337640749 33.77937328682863,-94.911427000000003 33.778382999999998,-94.906244999999998 33.778191999999997,-94.902276 33.776288999999998,-94.89497736748055 33.771540270803243,-94.89019868072495 33.768431100796676,-94.888367999999986 33.76724,-94.887910246679809 33.766674529711281,-94.886225692565191 33.764593571999796,-94.885411379435553 33.764756432942491,-94.881447983999394 33.765549103837166,-94.879218389137634 33.764912090842074,-94.876033253179955 33.760771407616105,-94.875653319149677 33.757021753168047,-94.875534806260347 33.755852122792213,-94.875497398046861 33.755482932714841,-94.877080000000007 33.75222,-94.874668 33.749164,-94.870299604394191 33.746484207390097,-94.869443369718425 33.745958950164457,-94.869299999999996 33.745871,-94.8570941233355 33.742035460072337,-94.849295999999981 33.739584999999991,-94.841633779899112 33.739430990835892,-94.830804318260235 33.740068022348083,-94.828875382311935 33.74092532536806,-94.827937698058648 33.741342073027738,-94.826026615866809 33.743890180559411,-94.824752565187154 33.749304914465036,-94.82447272313469 33.749460382205008,-94.821885938813196 33.750897483986968,-94.817426749089677 33.752171534666616,-94.815635414888177 33.752066164468857,-94.813744972719192 33.751954964523563,-94.81275807295215 33.751896912919612,-94.812012015184067 33.751853028169073,-94.80914539498248 33.749304914465036,-94.798634446013509 33.744527205899239,-94.789716054221742 33.746119775421171,-94.777638928565466 33.753471071068567,-94.775064434371529 33.755038154868203,-94.770923763490302 33.754401129528375,-94.768057130944001 33.753445597691005,-94.766464573766783 33.750897483986968,-94.766146067269247 33.748030863785381,-94.766818924318841 33.746124416643802,-94.768057130944001 33.742616129879757,-94.767738636791165 33.737519908644046,-94.767244154304578 33.736926531576607,-94.76296091588064 33.731786662068515,-94.759138751496963 33.729557067206756,-94.758159820145337 33.729557067206756,-94.753087004596253 33.729557067206756,-94.750011775433265 33.728811557489699,-94.742576055627282 33.727008959675082,-94.742176780415733 33.726449974997927,-94.739390916583417 33.72254976995157,-94.737479828219207 33.716179498036198,-94.737788227808608 33.71500758055268,-94.73907239774114 33.71012773879076,-94.73746132453816 33.705563045258067,-94.73716130937693 33.704713004885136,-94.732383613155861 33.700253815161624,-94.728242929929891 33.699616789821789,-94.725694828570582 33.702483410023376,-94.724525908047042 33.704821269192259,-94.724102271393392 33.705668549067234,-94.721872664186904 33.707261118589173,-94.719006043985303 33.708216656598914,-94.714865360759347 33.707261118589173,-94.711043208720398 33.705668549067234,-94.709450639198465 33.699616789821789,-94.710289486124168 33.697309952648205,-94.710724689878106 33.696113138108018,-94.710724689878106 33.691653948384499,-94.710106194192988 33.688252279047049,-94.71008765219355 33.688150299756906,-94.707858069676533 33.686876245991066,-94.691547961569825 33.685092048879412,-94.684792000000002 33.684353000000002,-94.659166999999997 33.692138,-94.652265035786613 33.690979104454883,-94.649628372726468 33.688049476940073,-94.649099284135872 33.686462209886628,-94.648456523423718 33.684533926193204,-94.64818493525776 33.682632803768527,-94.647928021538007 33.680834402751707,-94.647870600191638 33.680432452214262,-94.648456523423718 33.673401362074948,-94.647827859209684 33.672301196274027,-94.646112824818204 33.669299876741562,-94.642890235687361 33.668420997570671,-94.635273213800133 33.669885811328072,-94.631328876730365 33.67284406472757,-94.630585813750528 33.673401362074948,-94.627656194751552 33.677795791992715,-94.62121101648988 33.681018386800773,-94.616816575217669 33.679553573043371,-94.614284398758912 33.677302743466427,-94.611543254774574 33.674866164477912,-94.611424034353576 33.674789522931938,-94.607441775118403 33.672229504256364,-94.60304734520065 33.671350625085473,-94.596895128555005 33.671350625085473,-94.593672545101384 33.673987285307021,-94.590449961647764 33.677502836053897,-94.590316660066918 33.67755410593854,-94.586641449284855 33.678967649811298,-94.579620000000006 33.677622999999997,-94.576973687569549 33.673401362074948,-94.5728722135906 33.669885811328072,-94.571305222138406 33.668005422800071,-94.569942586075811 33.666370260581196,-94.569356662843745 33.663440621711956,-94.571445361022185 33.660423619728157,-94.571993323065286 33.659632120703485,-94.572286279004103 33.656995454804722,-94.570821465246695 33.654944723492456,-94.568770728257221 33.65465176187643,-94.564669254278257 33.655823608340576,-94.563858010166513 33.65591721375597,-94.557052229552454 33.656702498865904,-94.552071876402621 33.653479904057846,-94.551192985877293 33.650257320604226,-94.551311999999982 33.644569999999995,-94.553536678805585 33.642054372646328,-94.552657799634687 33.638245860283412,-94.549142248887819 33.635902161677912,-94.543868917090279 33.635902161677912,-94.538888563940446 33.637952898667386,-94.538195599937964 33.637916426989378,-94.537583502619341 33.637884211439605,-94.533322276204103 33.637659937051346,-94.529220802225154 33.63443734792051,-94.528408204203203 33.630103504051213,-94.528341911699826 33.629749945032266,-94.52980672545722 33.627406252103981,-94.528927834931892 33.621839964367631,-94.526291174710352 33.619203298468861,-94.521363727720257 33.61686924674752,-94.520724886974008 33.61656663824732,-94.504615 33.620682000000002,-94.493418698303032 33.624467326832118,-94.492501061148843 33.624777568252533,-94.491502999999994 33.625115,-94.491295462081894 33.62531395337146,-94.487514000000004 33.628939000000003,-94.485874999999993 33.637867,-94.481313 33.638818999999998,-94.476415000000003 33.638947000000002,-94.466075000000004 33.636262000000002,-94.464185999999998 33.637655000000002,-94.461453000000006 33.643615999999994,-94.459197999999986 33.645145999999997,-94.454819999999998 33.644902999999999,-94.448637000000005 33.642766000000002,-94.446871000000002 33.640177999999999,-94.447513999999998 33.636254999999991,-94.448451000000006 33.634497000000003,-94.458816999999982 33.632444,-94.462736000000007 33.63091,-94.461129 33.625414999999997,-94.460285999999996 33.624420999999998,-94.45525499999998 33.622917,-94.452710999999994 33.622621000000002,-94.452325000000002 33.618817,-94.452961000000002 33.616985999999997,-94.454768999999999 33.615155999999992,-94.462335999999993 33.610567000000003,-94.469451000000007 33.60731599999999,-94.472166 33.604199,-94.471974000000003 33.602665000000002,-94.471151999999989 33.601588,-94.468086 33.599435999999997,-94.461794602929331 33.598691554192769,-94.458900358388505 33.598349085232492,-94.458231999999995 33.598269999999999,-94.454858239556387 33.593453869357283,-94.453995999999989 33.592222999999997,-94.453435550445548 33.592019500625121,-94.452150252013013 33.591552808439438,-94.451622 33.591360999999999,-94.449112 33.590893999999992,-94.442363999999998 33.591242999999999,-94.441536999999997 33.591501999999991,-94.439518000000007 33.594154000000003,-94.430358101189597 33.59122600196271,-94.430038999999994 33.591124,-94.429672337173542 33.590855074196774,-94.427920122643982 33.589569927010331,-94.427577999999983 33.589319000000003,-94.425982000000005 33.586424999999998,-94.413155000000003 33.569367999999997,-94.412481642075306 33.56890283335202,-94.412480771235352 33.568902231761562,-94.412480202418593 33.568901838813659,-94.412175000000005 33.568691,-94.408900999999986 33.568196999999998,-94.403341999999995 33.568424,-94.397341999999981 33.571607999999998,-94.385926999999995 33.581887999999999,-94.382886999999997 33.58326799999999,-94.379649 33.580607,-94.378075999999993 33.577019,-94.377759999999981 33.574609000000002,-94.378561000000005 33.571328999999999,-94.380090999999993 33.568942999999997,-94.382534000000007 33.567056999999998,-94.388052000000002 33.565511,-94.392357000000004 33.565286999999998,-94.394655618773015 33.564059042448399,-94.397398454287298 33.562313601959417,-94.399227012370631 33.559903231990447,-94.399393244337958 33.557077279687135,-94.399143896386974 33.555498071165481,-94.397957000000005 33.554389999999998,-94.392572999999999 33.551141999999999,-94.389515000000003 33.546778000000003,-94.386086000000006 33.544922999999997,-94.381666999999993 33.544035,-94.373392999999993 33.544471,-94.371597999999992 33.545000999999999,-94.363297000000003 33.544956999999997,-94.361350999999999 33.544612999999998,-94.358969999999999 33.54323,-94.355945000000006 33.54318,-94.348944999999986 33.548358999999998,-94.347382999999979 33.55107799999999,-94.34729 33.552197,-94.352653000000004 33.560611000000002,-94.352433000000005 33.56217199999999,-94.345512999999997 33.567312999999999,-94.344023000000007 33.567824000000002,-94.340576999999996 33.567878,-94.340047258358467 33.56768232744934,-94.338972839399958 33.567285465504582,-94.33842199999998 33.567081999999999,-94.337996277272822 33.566655299162022,-94.334939999999989 33.563592,-94.334379999999996 33.562536,-94.333929800646288 33.557825151092565,-94.333894999999998 33.557461000000004,-94.333202999999997 33.555365999999992,-94.331833000000003 33.553348,-94.33059 33.552692,-94.323660000000004 33.549835000000002,-94.319491999999997 33.548864000000002,-94.309582000000006 33.551673,-94.30641 33.555616,-94.306214999999995 33.557676,-94.307180999999986 33.559797000000003,-94.303577000000004 33.56828,-94.301022999999986 33.573022000000002,-94.298392000000007 33.576217999999997,-94.293257999999994 33.580418999999999,-94.289129000000003 33.582143999999992,-94.287025 33.582410000000003,-94.283581999999996 33.581890999999999,-94.282647999999995 33.580978000000002,-94.280849000000003 33.577187000000002,-94.280604999999994 33.574907999999994,-94.282171999999989 33.572989,-94.290372000000005 33.567905000000003,-94.291686999999996 33.563481000000003,-94.290901000000005 33.558872,-94.289439999999999 33.557634999999998,-94.287571999999997 33.557178,-94.279089999999997 33.557026,-94.275600999999995 33.557963999999998,-94.274473 33.558652000000002,-94.271997999999996 33.561517999999992,-94.270978999999997 33.563220999999999,-94.270853000000002 33.564782999999998,-94.265668999999988 33.573588999999998,-94.262754999999999 33.577354,-94.257801 33.582507999999997,-94.257524288354617 33.582703553652586,-94.252656000000002 33.586143999999997,-94.245931999999996 33.589113999999995,-94.242777000000004 33.589708999999999,-94.240178999999998 33.589536000000003,-94.236971999999994 33.587411000000003,-94.236362999999997 33.585991999999997,-94.236835999999997 33.580914,-94.237975000000006 33.577756999999998,-94.238867999999997 33.576721999999997,-94.244365999999999 33.573549,-94.251108000000002 33.56528,-94.252330999999984 33.561855,-94.252283000000006 33.560445,-94.251569000000003 33.558188,-94.250197 33.556764999999999,-94.237903999999986 33.552675,-94.233128263729824 33.552212399803537,-94.233017493976078 33.552201670126067,-94.231843999999981 33.552087999999998,-94.226392000000004 33.552911999999999,-94.222920999999999 33.554088,-94.21922099999999 33.556095999999997,-94.213604000000004 33.563133999999998,-94.21268334130005 33.563763266722709,-94.208078 33.566910999999998,-94.205634000000003 33.567228999999998,-94.203593999999981 33.566546000000002,-94.202594978382763 33.562850001484037,-94.201237000000006 33.557825999999999,-94.199485999999993 33.556085000000003,-94.197816999999986 33.555238000000003,-94.196394999999995 33.555123000000002,-94.193247999999997 33.556153999999999,-94.191332999999986 33.55766599999999,-94.189883999999992 33.562454000000002,-94.192482999999996 33.570425,-94.194399000000004 33.573678,-94.196366991504703 33.574779501237479,-94.201105911663163 33.575851400157113,-94.204265191768783 33.575005164570705,-94.207404999999994 33.574353000000002,-94.209665 33.573509999999999,-94.211329000000006 33.573774,-94.216140999999993 33.576391999999998,-94.217408000000006 33.579259999999998,-94.217197999999982 33.580736999999999,-94.214431000000005 33.583187000000002,-94.212997 33.583486999999991,-94.210966999999997 33.583143,-94.205788416261612 33.581380140341984,-94.203588205048902 33.580815984742067,-94.199751933850294 33.581098061448763,-94.196536237091394 33.581718635888464,-94.194464999999994 33.582886000000002,-94.190890999999979 33.587474,-94.183913000000004 33.594681999999999,-94.180879999999988 33.592612000000003,-94.176327 33.591076999999999,-94.162266000000002 33.588906,-94.161081999999993 33.587972,-94.162009999999995 33.580877,-94.161276999999998 33.579270999999999,-94.156782000000007 33.575749000000002,-94.152625999999998 33.575923000000003,-94.148731999999995 33.580196999999998,-94.146047999999993 33.581975,-94.144383000000005 33.582097999999995,-94.142160000000004 33.581389999999999,-94.141852 33.579590000000003,-94.143023999999983 33.577725,-94.145668999999984 33.575599999999994,-94.149506000000002 33.573602,-94.151257 33.571793,-94.151754999999994 33.569476000000002,-94.151455999999996 33.568387,-94.148520000000005 33.565677999999991,-94.145239000000004 33.564987000000002,-94.143401999999995 33.565504999999995,-94.136863999999989 33.570999999999998,-94.136045999999993 33.571387999999999,-94.135142000000002 33.571033,-94.134308000000004 33.569209,-94.133047999999988 33.557952999999998,-94.131382000000002 33.552934,-94.128658 33.550952000000002,-94.126897999999983 33.550646999999991,-94.123897999999997 33.552100000000003,-94.122878999999983 33.553111999999999,-94.12071899999998 33.560555,-94.120354999999989 33.5655,-94.119902152897509 33.566998927274319,-94.112842999999998 33.566991000000002,-94.103176000000005 33.570349999999998,-94.100106999999994 33.57256799999999,-94.097439999999992 33.573718999999997,-94.088943 33.575322,-94.082640999999995 33.575491999999997,-94.072670000000002 33.572234000000002,-94.072231491265512 33.572605318678747,-94.072031926011121 33.573523317998088,-94.072031926011121 33.573846369634623,-94.072031926011121 33.574161925883949,-94.071815412538413 33.574459631515609,-94.071712621294751 33.574600969288895,-94.071353404455635 33.574840447439463,-94.070395493400298 33.574561056392717,-94.069534727631535 33.574169799087244,-94.069517406590393 33.574161925883949,-94.068559493988133 33.573563230894273,-94.068280102941401 33.571966710019424,-94.06782332144887 33.570215714974232,-94.067801146640278 33.570130711574109,-94.066845999999998 33.568908999999998,-94.061283000000003 33.568804999999998,-94.056597999999994 33.567824999999999,-94.056095999999997 33.567252000000003,-94.055662999999996 33.561886999999999,-94.056442000000004 33.560997999999991,-94.059849999999997 33.559249,-94.061179999999993 33.559159,-94.066685000000007 33.560953999999995,-94.067984999999993 33.560960999999999,-94.071719999999999 33.559682000000002,-94.073744000000005 33.558284999999998,-94.073825999999997 33.555833999999997,-94.072156000000007 33.553863999999997,-94.069091999999998 33.553406000000003,-94.06547999999998 33.550908999999997,-94.061896000000004 33.549764000000003,-94.056095999999997 33.550725999999997,-94.051882000000006 33.552585,-94.050211999999988 33.551082999999998,-94.046040000000005 33.551321000000002,-94.043449999999993 33.552253,-94.043428000000006 33.551424999999995,-94.043374999999997 33.542315000000002,-94.043020107474533 33.494534442391668,-94.043008999999998 33.493039000000003,-94.043278999999998 33.491029999999995,-94.043271947583932 33.489425304099555,-94.043188 33.470323999999991,-94.043130608695648 33.460424000000003,-94.043089437732434 33.453322008844353,-94.043061045958495 33.448424427841935,-94.043010021810147 33.439622762252007,-94.042987999999994 33.435823999999997,-94.042987999999994 33.434442436873745,-94.042987999999994 33.431023999999994,-94.042886999999993 33.420225000000002,-94.042890126641851 33.419424334827802,-94.042891364631132 33.419107312620362,-94.042967439944888 33.399626074590046,-94.043053 33.377715999999999,-94.042868999999996 33.371169999999999,-94.043127999999996 33.358756999999997,-94.043066999999979 33.352097,-94.043066999999979 33.347351000000003,-94.043066999999979 33.339614667914582,-94.043066999999979 33.330497999999999,-94.042990000000003 33.271227000000003,-94.043049999999994 33.260903999999996,-94.043003999999996 33.250127999999997,-94.042730000000006 33.241822999999997,-94.042876000000007 33.215218999999998,-94.042891999999995 33.202666,-94.042874999999995 33.199784999999999,-94.042718999999991 33.160290999999994,-94.043184999999994 33.143476,-94.043076999999982 33.138162,-94.043007000000003 33.13389,-94.042951563372725 33.117233519058104,-94.042869999999994 33.092726999999996,-94.043036 33.079484999999998,-94.042963999999998 33.019219,-94.042986850316112 33.007494023677346,-94.043068075862834 32.965815492539427,-94.043087999999997 32.955592000000003,-94.043066999999979 32.937902999999999,-94.043092 32.910021,-94.042884999999998 32.898910999999998,-94.042859000000007 32.892771000000003,-94.042885999999996 32.880965000000003,-94.043025 32.880445999999999,-94.042784999999995 32.871485999999997,-94.042921087938623 32.829694015190334,-94.043025999999983 32.797476000000003,-94.042747000000006 32.786973000000003,-94.042828999999998 32.785277,-94.042937999999992 32.780557999999999,-94.043026999999995 32.776862999999999,-94.042946999999998 32.767991000000002,-94.042974715046569 32.757603400545236,-94.04314699999999 32.693030999999998,-94.042912999999999 32.655126999999993,-94.042779999999993 32.643465999999997,-94.042823999999996 32.640304999999998,-94.042925999999994 32.622014999999998,-94.042929 32.618259999999992,-94.042918999999998 32.610142000000003,-94.042939007208048 32.604544739553475,-94.043082999999996 32.564261000000002,-94.043142000000003 32.559502000000002,-94.043081 32.513612999999999,-94.042884999999998 32.505144999999999,-94.042911000000004 32.492851999999999,-94.043088999999995 32.486561000000002,-94.043071999999995 32.48429999999999,-94.042955000000006 32.480260999999999,-94.042995000000005 32.478003999999999,-94.042901999999998 32.472905999999995,-94.042874999999995 32.471347999999992,-94.042902999999981 32.470385999999998,-94.042907999999997 32.439890999999996,-94.042985999999999 32.435507,-94.042898999999991 32.400658999999997,-94.042923000000002 32.399918,-94.042900999999986 32.392282999999999,-94.042762999999994 32.373331999999998,-94.042738999999997 32.363559000000002,-94.042733519218956 32.277818574933548,-94.042732999999998 32.269696000000003,-94.042732 32.269620000000003,-94.042671451745775 32.225096273752321,-94.042662000000007 32.218145999999997,-94.042600205901905 32.185155675879351,-94.042565999999994 32.166893999999999,-94.042538999999991 32.166826,-94.042591000000002 32.158096999999998,-94.042681000000002 32.137956000000003,-94.042751999999993 32.125163,-94.042337000000003 32.119914,-94.042699999999996 32.056012000000003,-94.042717288248511 32.00695918811028,-94.042720000000003 31.999265,-94.042490448495869 31.997488887291052,-94.042251674184627 31.995641414801661,-94.041832999999997 31.992401999999998,-94.038411999999994 31.992436999999999,-94.029282999999992 31.995864999999998,-94.027080554152732 31.994823406342874,-94.018664 31.990842999999998,-94.011671046736083 31.979908989829021,-94.008352361284565 31.974719974671689,-94.002944198469422 31.966263903968002,-93.995504541226836 31.954631438414648,-93.994147015257326 31.952508844111783,-93.977461000000005 31.926418999999996,-93.971711999999982 31.920383999999995,-93.953546000000003 31.910562999999996,-93.943541310721315 31.908563758569336,-93.938002035663573 31.906916949339585,-93.935007833635339 31.903773037645127,-93.932462763507019 31.895538979891644,-93.931327794714704 31.894581351390723,-93.92767203678045 31.891496810199779,-93.923929283519882 31.889849995167665,-93.919587694495533 31.890748256066246,-93.915948999999998 31.892861000000003,-93.909557114944889 31.893143619429534,-93.905252294448232 31.890856686636408,-93.90476638821832 31.890598549301192,-93.901173350426333 31.885957535142037,-93.901888 31.880063,-93.898135577976262 31.874953416991548,-93.896981462364707 31.873381885463036,-93.889196542313442 31.867692899288475,-93.888241004857136 31.85786451213389,-93.888148571748644 31.856913771406646,-93.887306164689562 31.854968889155742,-93.884117000000003 31.847605999999995,-93.880377455095243 31.844791786271248,-93.879654915472827 31.84424803536659,-93.874821999999995 31.840611000000003,-93.874804231839249 31.835091218914506,-93.874787826198073 31.829994712349503,-93.874761000000007 31.821660999999999,-93.870917000000006 31.816836999999996,-93.868473098390325 31.815251608244314,-93.853390000000005 31.805467,-93.846187999999998 31.802021,-93.839950728453459 31.798597132180646,-93.836868453653821 31.794158659336233,-93.836868453653821 31.791454071635616,-93.836868453653821 31.788733862378688,-93.834649214842401 31.783309060642711,-93.831197070889573 31.780226788232302,-93.827450999999996 31.777740999999999,-93.823442999999997 31.775098,-93.822597999999985 31.773558999999995,-93.826519525540022 31.761832440276638,-93.827342999999999 31.759369999999997,-93.830112066651125 31.754555168030393,-93.830647423185951 31.745811043570992,-93.824579 31.734396999999998,-93.819048075401312 31.72885814427071,-93.818932598107111 31.728523867973351,-93.815657495541259 31.719043310199801,-93.815835943108667 31.711905251886723,-93.815525624652665 31.710796971318612,-93.814600367558683 31.707492480599399,-93.814586782471608 31.707443962415162,-93.811060073548262 31.705827553684028,-93.810303944025605 31.705480994217723,-93.807270273132957 31.704231833580664,-93.806045429297654 31.703104120446881,-93.803419352361757 31.700686292667093,-93.802693549340276 31.697783082925291,-93.802451615781152 31.693186330065117,-93.804479 31.685663999999999,-93.812820813246589 31.676953615984285,-93.81562111199878 31.674029590143711,-93.817425 31.672146,-93.821829497696953 31.673879806810671,-93.822051000000002 31.673966999999998,-93.822341750589956 31.673502431839047,-93.826462000000006 31.666919,-93.8257324849111 31.66154827530681,-93.825660999999997 31.661021999999996,-93.825228912080746 31.660277861177896,-93.81803699999999 31.647891999999999,-93.817707248836442 31.6409111211136,-93.816838000000004 31.622509,-93.818717000000007 31.614555999999997,-93.823976999999999 31.614227999999997,-93.825414416100287 31.615089707767993,-93.827851999999993 31.616550999999998,-93.838056999999992 31.606795000000002,-93.839382999999998 31.599074999999999,-93.837534908858984 31.593743346167731,-93.834924 31.586210999999999,-93.822958 31.568129999999996,-93.822219025006859 31.564792487143556,-93.820763999999997 31.558221000000003,-93.818582000000006 31.554825999999998,-93.798086999999995 31.534044000000002,-93.787687000000005 31.527343999999996,-93.781574079702807 31.525595412174177,-93.780834999999996 31.525383999999999,-93.777170583402579 31.525128039451072,-93.760062000000005 31.523933,-93.753860000000003 31.525331,-93.751899169046524 31.525601857922521,-93.749869902733366 31.526210635456998,-93.746826003263621 31.526007705679731,-93.743376259969125 31.525196002300419,-93.742401241878753 31.523787647735123,-93.74154991556837 31.522557958452786,-93.741111000000004 31.520101,-93.740752889151466 31.518711098615515,-93.740332360499409 31.517078940980245,-93.739317727342822 31.515049678599539,-93.734411826534469 31.513527159467717,-93.733432858180635 31.513223342063657,-93.726736285639134 31.511599931372594,-93.725924582259807 31.504091651519342,-93.728765551952293 31.496786301443361,-93.730997740177827 31.492118989316349,-93.733996137544537 31.48847587643743,-93.737167999999997 31.484621999999998,-93.741884999999982 31.483535,-93.745608448194673 31.481972669547908,-93.746355058504165 31.481633300507966,-93.747840636420193 31.480958036391328,-93.749869902733366 31.478928770078173,-93.749869902733366 31.475276095040186,-93.749626709600278 31.47120988033301,-93.749476 31.468689999999999,-93.709416000000004 31.442995,-93.706857276389258 31.44142369846492,-93.700929751125955 31.437783629836048,-93.697919763270235 31.429300939077926,-93.697603150134782 31.428408665937056,-93.704678 31.418899999999997,-93.704697874245824 31.418107106580852,-93.704878999999991 31.410881,-93.701611 31.409333999999998,-93.695865999999995 31.409391999999997,-93.689953513429003 31.406208353384852,-93.678362516190631 31.399967047179565,-93.675064666986117 31.398191282223291,-93.674659331220113 31.397973024503138,-93.674116999999981 31.397680999999995,-93.671643999999986 31.393352,-93.670181999999983 31.387184,-93.668532759396427 31.379357124595749,-93.668145986696857 31.37510269235548,-93.669064113561134 31.373151679996884,-93.669693055010129 31.371815184369147,-93.669512094168894 31.370548454097019,-93.668919524600994 31.366400452767671,-93.667402247962755 31.365414223393856,-93.665051865060306 31.363886475190469,-93.663891561951601 31.361952641672623,-93.663698175601809 31.360018811902275,-93.664665092360735 31.357698213179859,-93.665825387974422 31.355184231855155,-93.668439000000006 31.353011999999996,-93.669515978941746 31.350266666374935,-93.673736148309771 31.339509006758242,-93.677277000000004 31.330482999999997,-93.687850999999995 31.309835,-93.686922292404276 31.305369360695714,-93.686880000000002 31.305166,-93.686723586265984 31.304979085312567,-93.684737187533131 31.30260533533086,-93.684038999999999 31.301770999999995,-93.683824154244718 31.301752735987076,-93.675439999999995 31.30104,-93.668927999999994 31.297974999999997,-93.657003999999986 31.281735999999999,-93.647719584117951 31.27389987096868,-93.642516 31.269508000000002,-93.632650200244299 31.270182983909681,-93.620343000000005 31.271025000000002,-93.615257056394739 31.261768439618621,-93.61394199999998 31.259374999999995,-93.614287999999988 31.251631,-93.616308000000004 31.244595000000004,-93.616007481020262 31.233959925788763,-93.613835693061347 31.232449117569455,-93.609977782626956 31.229765355202261,-93.609827614285464 31.229660890324059,-93.608033931702224 31.227867209671889,-93.60740940488401 31.227242683526022,-93.605259887151632 31.224152751460338,-93.604319472818304 31.220794125122111,-93.604319472818304 31.215285983654958,-93.607287999999997 31.205403,-93.602442999999994 31.182541,-93.600307999999998 31.176157999999997,-93.598827999999997 31.174679,-93.595531708436056 31.171774432382691,-93.588772842417583 31.16581877494577,-93.588502999999989 31.165581,-93.588046655571759 31.165671453282986,-93.583339301771971 31.166604510813709,-93.579215000000005 31.167421999999995,-93.578993496784307 31.167654977688123,-93.574136071231791 31.172764031170193,-93.569563000000002 31.177574,-93.560942999999995 31.182481999999997,-93.552649000000002 31.185575,-93.548930999999996 31.186601,-93.535096999999993 31.185614,-93.533756450961803 31.184752004501149,-93.533306999999994 31.184463,-93.5330935917342 31.183965183917415,-93.531744000000003 31.180816999999998,-93.533193520062923 31.174490811082034,-93.53417786817559 31.170194787673282,-93.536829999999981 31.158620000000003,-93.540253000000007 31.156578999999997,-93.544009577425854 31.153014849431809,-93.544887639546317 31.148844041597808,-93.544887639546317 31.143136612291205,-93.544701999999987 31.135888999999999,-93.540277800652078 31.128868068802213,-93.539619249807799 31.121843550568837,-93.541375382556595 31.113501939154769,-93.541635919885238 31.113241401693255,-93.548470239502265 31.106407078590973,-93.549716998224596 31.105160319232844,-93.55112206776522 31.099540038044921,-93.551692642249563 31.097257738879012,-93.551034091405285 31.091111287020031,-93.546643772295099 31.082989189009115,-93.540128999999993 31.078002999999995,-93.53104031045666 31.074698717981779,-93.527873992025093 31.072210897922254,-93.526043656150705 31.070772777782928,-93.524020490083288 31.067083472240864,-93.523009982318626 31.065240780256033,-93.523659621286654 31.063941504256789,-93.525329858273139 31.060601035263321,-93.529255791555698 31.057567354514948,-93.532069000000007 31.055264,-93.531218761655126 31.051678447674814,-93.523247999999995 31.037841999999998,-93.516942620821894 31.032584114108545,-93.516407263768343 31.029550433360171,-93.516883288197775 31.024314186160638,-93.516942620821894 31.023661529978199,-93.539525999999995 31.008497999999999,-93.540062152267268 31.008345085566372,-93.540618575989114 31.008186389569964,-93.555580999999989 31.003918999999996,-93.562626264226125 31.00599480945781,-93.566016847371429 31.004567194682853,-93.567979815741779 31.001533515663564,-93.569764334642755 30.996715319472376,-93.571101253513504 30.991033414001794,-93.571905755076102 30.987614282198351,-93.567971999999997 30.977981,-93.560533000000007 30.971285999999999,-93.55046299120518 30.967360467203815,-93.549841 30.967117999999996,-93.539153617393822 30.956968324013513,-93.532549000000003 30.950695999999997,-93.526524876707626 30.939912016599852,-93.526293050708773 30.939497017171423,-93.526245000000003 30.939411,-93.526242458076936 30.939167805401102,-93.526231146824912 30.938085618677029,-93.526146999999995 30.930035,-93.526269219450654 30.929894609689271,-93.530935999999983 30.924533999999998,-93.542488999999989 30.920064,-93.54502991280485 30.920837107400992,-93.546884259495414 30.92151141825828,-93.549244331161987 30.921005686748707,-93.550358562122057 30.920030731622223,-93.551941554990407 30.918645608548566,-93.555650241837967 30.911228247920597,-93.555751501305451 30.910053639118178,-93.555774257662236 30.909789665608852,-93.556493125509377 30.9014508058257,-93.562447641167196 30.896531852982324,-93.563812214002311 30.895404595987301,-93.564247644832776 30.895044891882932,-93.567787752332634 30.888301832311882,-93.567450600170787 30.878524390216981,-93.566008182600839 30.875519355165832,-93.565853452041281 30.875197,-93.565427680666076 30.874309976760035,-93.563763247930751 30.87311591407202,-93.559394659034922 30.869981891957959,-93.55904186947815 30.86972880101742,-93.558616999999984 30.869423999999999,-93.558608112367665 30.868835818489011,-93.558593354020289 30.867859114376206,-93.558393833586933 30.854654896933653,-93.558352334289978 30.851908482785802,-93.558231866260058 30.843935935637496,-93.558171999999999 30.839973999999998,-93.553625999999994 30.835139999999999,-93.55374115920948 30.832414921630001,-93.554057 30.824940999999995,-93.561666000000002 30.807738999999998,-93.563243 30.806218000000005,-93.564501487304341 30.805543276361082,-93.569303000000005 30.802969,-93.578395 30.802046999999998,-93.584264999999988 30.796662999999995,-93.588934854633479 30.787551489258888,-93.589380999999989 30.786681000000002,-93.589895999999996 30.77776,-93.591925627378814 30.768225181611253,-93.592827999999997 30.763985999999996,-93.607757000000007 30.757656999999995,-93.611581311334461 30.752392350515215,-93.615058988962588 30.747604886281291,-93.619129 30.742001999999996,-93.617688 30.738479000000005,-93.609908791486006 30.729403419430973,-93.609718999999998 30.729181999999998,-93.609544 30.723138999999996,-93.61030547238029 30.720788970554505,-93.611192000000003 30.718053,-93.61618399999999 30.713980000000003,-93.616977218405893 30.712276394979256,-93.620773999999997 30.704122000000005,-93.621061387132315 30.696047232392139,-93.621092999999988 30.695159,-93.62235785978659 30.692974242186811,-93.629903999999996 30.679939999999995,-93.632922525899005 30.677439880221801,-93.638212999999993 30.673057999999997,-93.646373493696458 30.671658473870171,-93.653439445062318 30.670446661945991,-93.654970999999989 30.670183999999999,-93.666219386787546 30.661299653678171,-93.670353999999989 30.658033999999997,-93.670860468306827 30.657347728689221,-93.683099999999996 30.640763000000003,-93.685120999999981 30.625201,-93.684323003112922 30.617258061147268,-93.683396999999985 30.608040999999997,-93.680812614601606 30.602993111696524,-93.680648411741274 30.602453589051585,-93.679828117977763 30.599758343304948,-93.681234543283509 30.596101640780542,-93.683902548646543 30.593069810094963,-93.684328672415049 30.59258557751615,-93.684347894395486 30.592579170189346,-93.687282162286593 30.59160108089231,-93.689533999999995 30.592759,-93.692869000000002 30.594382000000003,-93.712453999999994 30.588479,-93.72107859525056 30.580404159651369,-93.727657631584904 30.574244488790981,-93.727844000000005 30.574069999999995,-93.727840097341868 30.573768021870688,-93.72780696123904 30.571204031383882,-93.727747245613443 30.566583382517752,-93.727745999999996 30.566486999999999,-93.725846999999987 30.556978,-93.728764326223569 30.546403128121515,-93.729195000000004 30.544841999999999,-93.736587760607577 30.541316766984647,-93.740252999999996 30.539569,-93.738909526480768 30.537838512460276,-93.732793 30.529960000000003,-93.727721000000003 30.525671000000003,-93.718711305261792 30.520890798500346,-93.714321999999996 30.518561999999996,-93.710116999999997 30.506399999999996,-93.713193644304937 30.50058809182816,-93.716678000000002 30.494005999999995,-93.71365216083376 30.483878530555742,-93.711446941284677 30.476497671106777,-93.710595424186792 30.473647647388944,-93.709703157003446 30.47066123332699,-93.708899372668625 30.467970970942378,-93.705844999999997 30.457747999999999,-93.697828 30.443837999999996,-93.6978 30.440583,-93.698862234241474 30.438260713588438,-93.702220303997905 30.430919206922557,-93.702664999999996 30.429947000000002,-93.722313999999997 30.420729,-93.729486046484141 30.413342592858086,-93.738025291703323 30.404548123662593,-93.738321805525445 30.404242747530638,-93.745333000000002 30.397022,-93.751243378615428 30.396311282781173,-93.751436999999996 30.396287999999998,-93.754787283332149 30.393127406185759,-93.75746720581121 30.390599218098316,-93.757654000000002 30.390422999999995,-93.757872622462301 30.389610210267922,-93.758470934573069 30.387385818798332,-93.75855399999999 30.387077,-93.758091991038413 30.3842338214119,-93.758032188807945 30.383865801664729,-93.757931393201204 30.383245510859378,-93.75589426835937 30.370709152880856,-93.756044740613035 30.365928314513319,-93.75610723110799 30.3639428524199,-93.756352000000007 30.356166000000002,-93.758519945992674 30.350935458285047,-93.760658351649255 30.34577618769989,-93.763244572034736 30.339536487238696,-93.765822 30.333317999999995,-93.764264999999995 30.330222999999997,-93.760690955159149 30.32995156504764,-93.760328 30.329923999999998,-93.747921244232074 30.314935395431327,-93.743830002049762 30.309992764786195,-93.741160171732417 30.306767342150266,-93.738698999999997 30.303793999999996,-93.734966161369201 30.301561360829975,-93.729390287632427 30.298226388348422,-93.724220000000003 30.295133999999997,-93.718684474451791 30.295009979388311,-93.714319430116035 30.294282471059141,-93.71311219174963 30.293184979315004,-93.711118400234781 30.291372437742464,-93.709949692759622 30.289928741213533,-93.708644873043468 30.288316906143507,-93.708448001046747 30.287627854154977,-93.707590519980414 30.284626670422831,-93.706607851977495 30.281187332412603,-93.706635817233519 30.280914670488997,-93.707189856385114 30.275512775340033,-93.709131999999997 30.271826999999995,-93.707538803456245 30.253087036355307,-93.707271000000006 30.249936999999996,-93.705637767078656 30.244573755694763,-93.705083000000002 30.242751999999996,-93.707646217538425 30.23733474070027,-93.713358999999997 30.225261,-93.71802168481895 30.219915738218987,-93.719219999999993 30.218541999999999,-93.720945999999998 30.209852,-93.717397000000005 30.193439,-93.710467999999992 30.180670999999997,-93.706634735424259 30.17682001000631,-93.705927274531248 30.176109277739844,-93.705791510460429 30.175972885881706,-93.703764000000007 30.173936,-93.703646997347349 30.173527735424756,-93.702964616901454 30.171146663230584,-93.701744610591902 30.166889619937699,-93.701686103512344 30.166685467574972,-93.697748000000004 30.152943999999998,-93.696083741705934 30.150925109485563,-93.688211999999979 30.141376,-93.69286799999999 30.135216999999997,-93.69498 30.135185,-93.698276000000007 30.138608000000005,-93.700984936503929 30.137486558544058,-93.701251999999997 30.137376,-93.7012922571502 30.136537706048752,-93.701585086407604 30.130439981942867,-93.701656556414648 30.128951727699913,-93.701742498922442 30.127162105630983,-93.701985639262489 30.122099077688652,-93.702366286953335 30.114172668214064,-93.702403861450691 30.11339023643033,-93.702436000000006 30.112720999999997,-93.70268530105453 30.112503701678254,-93.704703872918159 30.110744253531749,-93.710410303455276 30.105770356484715,-93.714491639657382 30.10221294069715,-93.723764999999986 30.094129999999996,-93.727140999999989 30.092110594495406,-93.7293848599641 30.090768395691203,-93.72996305770063 30.09042253796256,-93.732484999999997 30.088913999999995,-93.734084999999979 30.086129999999997,-93.731705540540531 30.081478540540548,-93.731605000000002 30.081282000000002,-93.729179922109864 30.079341937687897,-93.727017487667368 30.077611990133899,-93.71640499999998 30.069121999999997,-93.716151269697463 30.069056930886212,-93.707507094464489 30.066840132907302,-93.702179999999998 30.065473999999995,-93.700580000000002 30.063666,-93.699479012508235 30.0595596142199,-93.699395999999993 30.059249999999995,-93.699786698153744 30.05843348475733,-93.700658293446523 30.056611948527472,-93.700819999999993 30.056273999999998,-93.702099264262131 30.055460929156467,-93.703267223154896 30.054718601437116,-93.703940000000003 30.054290999999999,-93.704473210548429 30.054251542735575,-93.709782747672762 30.053858640136632,-93.710785394684464 30.05378444485228,-93.720804999999999 30.053042999999995,-93.729054152595779 30.045230570163486,-93.729990027439044 30.044344241966268,-93.737446000000006 30.037282999999999,-93.739158000000003 30.032626999999998,-93.739733999999999 30.023987000000002,-93.741078000000002 30.021571000000002,-93.744068611359822 30.019549890100706,-93.74834924745744 30.01665695787004,-93.753252045558341 30.013343557169065,-93.766227014667976 30.004574835541469,-93.782835629207284 29.993350429819579,-93.786934999999986 29.990579999999998,-93.789430999999993 29.987812000000002,-93.803328792953494 29.962666096659486,-93.807814999999991 29.954549,-93.813734999999994 29.935126,-93.816550000000007 29.920725999999995,-93.818997999999993 29.914822,-93.830374000000006 29.894358999999998,-93.838374000000002 29.882854999999999,-93.853129483564672 29.866348149842587,-93.854474509531912 29.864843479256791,-93.855140000000006 29.864098999999996,-93.857517787207271 29.862146563102172,-93.862474802662518 29.858076283033213,-93.863569999999996 29.857177,-93.864820388168837 29.856398395289631,-93.872445999999997 29.851650000000003,-93.890679000000006 29.843159000000004,-93.900728 29.836967,-93.911111176241661 29.828996955749506,-93.916359999999997 29.824967999999998,-93.922743999999994 29.818808,-93.927992000000003 29.809640000000002,-93.929208000000003 29.802952,-93.928808000000004 29.79708,-93.926503999999994 29.789559999999998,-93.922407000000007 29.785048,-93.898470000000003 29.771576999999997,-93.893861999999999 29.767289000000002,-93.890820999999988 29.761672999999995,-93.891780610698319 29.758916671398389,-93.892526767476923 29.756773455119472,-93.893828999999997 29.753032999999999,-93.891732576672823 29.744984915009951,-93.891637000000003 29.744618000000003,-93.891484462723341 29.744488863328282,-93.888820999999993 29.742234000000003,-93.873941000000002 29.737770000000005,-93.870019999999997 29.735482,-93.863203999999996 29.724059,-93.837970999999982 29.690618999999998,-93.852868 29.675885,-93.866980999999996 29.673085,-93.889989999999997 29.674012999999999,-93.930999999999997 29.679611999999999,-93.955443390383635 29.680262610936268,-93.955453232202885 29.68026287289646,-93.991585827226885 29.681224615973395,-94.000169999999997 29.681453101326589,-94.000222586816207 29.681454501032487,-94.001406000000003 29.681486,-94.010062765207763 29.679864152681674,-94.056505999999999 29.671163,-94.132576999999984 29.646217,-94.354166823921716 29.561457673765378,-94.370794193562546 29.555097613439198,-94.391123278008692 29.54732162684321,-94.45341877657637 29.523493256060661,-94.456196753642018 29.522430664556182,-94.45805240375158 29.521720868184531,-94.499046371673685 29.506040450016997,-94.499089575343746 29.506023924375612,-94.500455432020999 29.505501476685335,-94.500806999999995 29.505367,-94.552043946167103 29.48495633977835,-94.552044379602123 29.484956167115939,-94.568074121423052 29.478570587212708,-94.593696728539513 29.46836361027578,-94.594852999999986 29.467903,-94.599458690353401 29.465813271763974,-94.62931993394271 29.452264405230761,-94.631084 29.451464,-94.634656044789836 29.449584234717392,-94.661528069434993 29.435443006940758,-94.670389 29.430779999999999,-94.674924987623086 29.427889211977174,-94.680871144138621 29.42409972235215,-94.694158000000002 29.415631999999999,-94.708472999999998 29.403049000000003,-94.723958999999979 29.383268000000005,-94.730956033155138 29.369322304827527,-94.731047000000004 29.369140999999996,-94.731324722869132 29.369141342444962,-94.731537324603394 29.369141604592603,-94.742750849251038 29.369155431380086,-94.744595216508316 29.369157705569055,-94.744833999999997 29.369157999999999,-94.761491000000007 29.361882999999999,-94.772184717669788 29.3616343088914,-94.778690999999995 29.361483,-94.780073439975141 29.362532749099824,-94.782355999999993 29.364266,-94.782645420567292 29.368514320481975,-94.783130999999997 29.375641999999996,-94.766847999999996 29.393488999999999,-94.754099999999994 29.400999999999996,-94.743385419572206 29.410035318862811,-94.73704402931665 29.415382843516582,-94.727822669267709 29.423158969605012,-94.723817999999994 29.426535999999995,-94.716270519001597 29.430976788539081,-94.706539419927282 29.436702374764607,-94.706364999999991 29.436804999999996,-94.686385999999999 29.466508999999995,-94.681540999999996 29.471388999999999,-94.672399999999996 29.476842999999999,-94.665852999999998 29.478401000000002,-94.656737000000007 29.478032999999996,-94.645948000000004 29.473769,-94.628217000000006 29.475986000000002,-94.608557000000005 29.483344999999996,-94.594211 29.492127,-94.595122262498009 29.503650874486677,-94.595439999999996 29.507669,-94.591407000000004 29.513857999999999,-94.580274000000003 29.525295,-94.566674000000006 29.531987999999995,-94.553989999999985 29.529558999999999,-94.546993999999998 29.524379,-94.532347999999999 29.5178,-94.511044999999996 29.519649999999995,-94.495024999999984 29.525030999999998,-94.503428999999997 29.543249999999997,-94.509486999999993 29.542589999999997,-94.523742999999996 29.545987,-94.523871183237745 29.546315590042923,-94.5261306113389 29.55210749848424,-94.526336 29.552633999999998,-94.542531999999994 29.568999999999999,-94.546193009360195 29.571896121601313,-94.546385 29.572047999999995,-94.546803832691651 29.57214903106096,-94.55398799999999 29.573882,-94.570006000000006 29.572232,-94.578210999999982 29.567281,-94.593518000000003 29.561319,-94.625889999999998 29.552807999999999,-94.634988842169335 29.550728838088908,-94.643914431984982 29.54868926579681,-94.666855093063802 29.543447131924982,-94.691625000000002 29.537787000000002,-94.693243673136905 29.537529479678042,-94.718275999999989 29.533546999999995,-94.740699000000006 29.525857999999999,-94.757688999999999 29.524616999999999,-94.768675999999999 29.525659,-94.780938000000006 29.531093000000002,-94.785987568065153 29.540133852805589,-94.789123822994313 29.545749069554745,-94.789562096440733 29.546533763545689,-94.78971899677407 29.546814681200559,-94.790604999999999 29.548400999999998,-94.779438999999996 29.549472000000002,-94.772471009935998 29.548613672580952,-94.771052999999995 29.548438999999995,-94.762972090755014 29.555767305595641,-94.75523699999998 29.562781999999999,-94.750081379755628 29.56810096117977,-94.734626000000006 29.584046,-94.731874420576986 29.588423440241069,-94.724443803393115 29.600244680945409,-94.708741000000003 29.625226,-94.705273448792255 29.640626536822896,-94.703938528752261 29.6465553563269,-94.702680930363101 29.65214076491651,-94.702542126991759 29.652757236398369,-94.699660909360375 29.665553672721437,-94.69780371146922 29.673802100155214,-94.694887994254785 29.686751760487848,-94.693153999999993 29.694452999999999,-94.692434000000006 29.70361,-94.692611750388934 29.704808689927841,-94.695098387970873 29.721577752663908,-94.695317000000003 29.723051999999999,-94.695611486157915 29.72357178078331,-94.697558868014866 29.727008993840069,-94.705700105090941 29.741378628781629,-94.713878412983604 29.755813695314995,-94.714586470042065 29.757063446593907,-94.722078339612551 29.770286919851305,-94.724615999999983 29.774766,-94.735270999999997 29.785433,-94.738125273271791 29.786265833277604,-94.740919000000005 29.787080999999997,-94.749144589762409 29.783534045463153,-94.75591801041729 29.780613280409739,-94.771512 29.773888999999997,-94.792237999999998 29.767432999999997,-94.798897371247961 29.764438558858895,-94.816085 29.756710000000002,-94.81943931055217 29.753325616252695,-94.823987131664666 29.748737021482022,-94.851107999999996 29.721373000000003,-94.856932183541645 29.710462974624775,-94.860426638443812 29.703917062844585,-94.864167858487249 29.696908903620852,-94.865007000000006 29.695336999999999,-94.865123196353878 29.694545038919138,-94.867438000000007 29.678768000000002,-94.872550999999987 29.67125,-94.893107 29.661335999999999,-94.915413 29.656613999999998,-94.921317999999999 29.658177999999999,-94.928410408640929 29.669495826038883,-94.930071799099807 29.672147016790593,-94.930110565443542 29.672208878811933,-94.930656833967475 29.673080595662611,-94.931474856161643 29.67438596783704,-94.934166999999988 29.678681999999998,-94.935264231405057 29.686686879688732,-94.935319060033862 29.687086883348073,-94.935997030967087 29.692033037575822,-94.936088999999996 29.692703999999999,-94.936280063994801 29.692851065945039,-94.941277009519624 29.696697319220664,-94.942680999999993 29.697778,-94.942922907078852 29.697804516058127,-94.95311095436017 29.698921254167477,-94.965343618259496 29.700262107971746,-94.965962999999988 29.70033,-94.972666000000004 29.684869999999997,-94.980123280315652 29.679059463608382,-94.986438191421769 29.674139034277729,-94.988580124776774 29.672470090483102,-95.001800051879343 29.662169436052462,-95.002396227716986 29.661704909944582,-95.005398 29.659365999999995,-95.011683000000005 29.649802000000005,-95.013860566469219 29.644103309100927,-95.014229369455222 29.643138151779844,-95.015636 29.639457,-95.015582911847446 29.639202042718885,-95.014543866006605 29.634211997110764,-95.013498999999996 29.629193999999998,-95.006633444897872 29.623869765921089,-95.00056235200779 29.61916163683599,-95.000370188745762 29.619012614335521,-94.997782627529062 29.617005962082896,-94.997731096758997 29.616965999999998,-94.995478872439179 29.615219401320278,-94.993499353954022 29.613684285860323,-94.988871000000003 29.610095,-94.988045541621688 29.608923290953985,-94.982835617337045 29.60152798723708,-94.982705999999993 29.601344000000005,-94.982886347998431 29.601051719777942,-94.983895794498991 29.599415764569699,-94.98693593300419 29.594488776939745,-94.988992999999994 29.591155,-94.991605757589539 29.588791109774153,-94.991811610459919 29.588604864563266,-94.992208959522046 29.588245363334387,-95.006677600766466 29.575154872369662,-95.007235451984087 29.574650156950938,-95.007670000000005 29.574256999999996,-95.00815781845921 29.573398130166158,-95.016627 29.558487,-95.018253 29.554884999999999,-95.016926355758628 29.548485488141377,-95.015164999999996 29.539988999999998,-95.012091452887788 29.536262245236642,-95.011587670186657 29.535651395780732,-95.011086587278399 29.535043819893005,-95.001666768519442 29.523622047865974,-94.999580999999992 29.521093,-94.989064037839412 29.515168017977793,-94.982063906682782 29.511224326765198,-94.981915999999998 29.511140999999995,-94.981645984265953 29.511070508097891,-94.961088181447877 29.505703566689924,-94.958443000000003 29.505013000000002,-94.958183821928699 29.504969740154092,-94.957844913785792 29.504913172428417,-94.95747910332102 29.504852114391142,-94.955724072517796 29.504559179260749,-94.952845264169682 29.504078672538427,-94.930551536860648 29.500357589179547,-94.927405495678158 29.499832478177321,-94.909464999999997 29.496837999999997,-94.913072085311995 29.488019044482122,-94.913385000000005 29.487254,-94.917178632618899 29.481741136316387,-94.925104227340569 29.470223752399235,-94.925293406029382 29.469948840084836,-94.925914000000006 29.469047,-94.930860999999993 29.450503999999999,-94.923011455799639 29.448810114938265,-94.920334997737442 29.448232551169699,-94.919400999999993 29.448030999999997,-94.916063708203708 29.446327523795176,-94.890799999999984 29.433432,-94.888257132054065 29.420136433311271,-94.887299999999996 29.415132,-94.887087039327696 29.40154064293051,-94.886938304445962 29.392048238229908,-94.886925408340758 29.391225196262944,-94.886904215833582 29.389872669858736,-94.886764190565785 29.380936121184895,-94.886591910643261 29.369941049100753,-94.886536208040312 29.366386054846032,-94.886982892003275 29.364738908620176,-94.888420210858001 29.359438798199445,-94.888544709543254 29.358979709544975,-94.888781730376067 29.358105695694917,-94.894234145274325 29.337999926591962,-94.894147383920654 29.327241695272729,-94.894002695197727 29.309300588032027,-94.893993580875261 29.308170430590454,-94.891329624021282 29.304475264201969,-94.888683946869179 29.30080545353194,-94.886599269217157 29.297913803549264,-94.886536208040312 29.297826331584119,-94.885816422022174 29.297499155955627,-94.884216982863776 29.296772137788121,-94.876917125093229 29.293454018939102,-94.875951551627523 29.293015121686942,-94.86617837453683 29.293883848703121,-94.865126326153927 29.293977364132552,-94.861112574100105 29.294855372432302,-94.849730461009372 29.297345209778594,-94.825607939204673 29.30577638202961,-94.824952733476934 29.30600538596191,-94.823862547308252 29.313200608971236,-94.822547126780194 29.321882377573708,-94.82230657170463 29.344254498409398,-94.810695999999993 29.353434999999998,-94.797913847039041 29.344567105809805,-94.79693012269928 29.343884625840758,-94.784895000000006 29.335535,-94.779995 29.334935000000002,-94.777063999999996 29.336811,-94.773074869484503 29.336485139838025,-94.745528999999991 29.334235,-94.744945 29.33641,-94.731319999999997 29.338066,-94.722529999999992 29.331445999999996,-94.731082 29.331833,-94.769694999999999 29.304936,-94.780304129101268 29.295750693651897,-94.786095000000003 29.290737,-94.793321795438203 29.286014946162535,-94.795651468635626 29.284492716516493,-94.803695000000005 29.279236999999998,-94.809348860129617 29.275904173901317,-94.81020919937113 29.275397022855465,-94.819018398045671 29.270204194137058,-94.82210781776098 29.268383049216432,-94.825036245866656 29.266656805306088,-94.825782574142963 29.266216861214712,-94.826962003659688 29.265521613475173,-94.833188167130103 29.261851427154124,-94.844390135018429 29.255248113651685,-94.870677905110114 29.23975205180561,-94.881596387366812 29.233315846843187,-94.896165027201874 29.224727954332334,-94.925556066041452 29.207402583865772,-94.927613957028456 29.206189502425392,-94.940693735267132 29.198479261054111,-94.968741214129224 29.181945889621023,-94.978383546115566 29.176261947153485,-94.981700088962569 29.174306918145966,-95.026218999999998 29.148064000000002,-95.076832914261459 29.114498139229923,-95.081772999999998 29.111222,-95.084611040272236 29.108948681405003,-95.100241410561338 29.096428488590096,-95.110484 29.088224,-95.116308293211759 29.081343778536318,-95.119264367911811 29.077851775668329,-95.119484217932538 29.077592067446851,-95.122403192505772 29.074143890856067,-95.122524999999996 29.074000000000002,-95.122638295373392 29.073709965581063,-95.125134000000003 29.067321,-95.183550616106302 29.028323983126334,-95.191390999999996 29.023089999999996,-95.192301227546167 29.02243038040822,-95.237672480263356 28.989550945676651,-95.238923999999997 28.988644,-95.240558404572027 28.987315672512366,-95.251568580535192 28.978367386619187,-95.251619678822578 28.978325857575001,-95.272266000000002 28.961545999999995,-95.29656403895315 28.934716691525271,-95.297146999999981 28.934073,-95.309703999999996 28.928262,-95.334686660244515 28.911063042846731,-95.353450999999993 28.898145,-95.376979000000006 28.876159999999999,-95.377903963555724 28.874482723635413,-95.38239 28.866347999999999,-95.416173999999998 28.859482,-95.436326577581042 28.85908617652915,-95.439594 28.859022000000003,-95.449516932572138 28.854239851149391,-95.480746000949352 28.839189657836059,-95.485144835951402 28.837069731735976,-95.486768999999995 28.836286999999995,-95.506945757563287 28.824808612805594,-95.536465934189138 28.808014833314715,-95.564052739104355 28.79232093268277,-95.564094788066555 28.792297011382839,-95.564132228771385 28.792275711681647,-95.568135999999981 28.789997999999997,-95.576201168007842 28.785870627961152,-95.606319447682353 28.770457515020929,-95.613122366343802 28.766976102576891,-95.695711236705606 28.724711019702028,-95.715243498124195 28.714715330888584,-95.812504000000004 28.664942,-95.854124934570734 28.646410960033691,-95.884026000000006 28.633098,-95.920915435374582 28.618912188118028,-95.97832748198536 28.596834417485056,-96.000681999999983 28.588238,-96.000998496292368 28.588108377001081,-96.024040703743012 28.578671299526803,-96.035336417502748 28.574045070633311,-96.05294532761279 28.566833233429691,-96.077867999999995 28.556625999999998,-96.194412 28.502223999999998,-96.220123346321373 28.492065891861738,-96.220376184174313 28.491966,-96.226882700448613 28.487451845000788,-96.241923733725443 28.477016528665938,-96.244750999999994 28.475055,-96.270391000000004 28.461929999999999,-96.303212000000002 28.441870999999999,-96.321560000000005 28.425148,-96.328817 28.423658999999997,-96.341616999999999 28.417333999999997,-96.371116999999998 28.397660999999999,-96.372100999999986 28.393874999999998,-96.370716999999985 28.387667,-96.378616389014681 28.383909329746462,-96.379349732835649 28.386024690464755,-96.381702691108558 28.392811896356477,-96.381863685354148 28.393276290946375,-96.375880899310658 28.401794149460329,-96.37413840285555 28.404274990018202,-96.340801887331921 28.432913073072363,-96.338559687910475 28.434839257985413,-96.335119195902806 28.437794848703732,-96.312964581561445 28.451131053409146,-96.280819757359396 28.470480970729877,-96.274497619264608 28.474286648703266,-96.268341347214189 28.477992481854848,-96.252027698910211 28.484249764669329,-96.250247000000002 28.484932771712327,-96.223824788704931 28.495067307260509,-96.218978121459415 28.500382701101032,-96.21505000939203 28.509679222336811,-96.145447855080619 28.544740658174199,-96.10473518795402 28.559498996555909,-96.046210731424992 28.586980036018211,-96.032979113622659 28.589015683181284,-96.007533711461477 28.59970275682273,-95.986159544454679 28.60631857558586,-95.982088289576367 28.614461085342473,-95.98565064745685 28.621076904105603,-95.983106103295938 28.641942154390655,-95.97852589224803 28.650593590730978,-95.986065974637228 28.655467849280154,-95.996337701374344 28.658736120211515,-96.002953500413568 28.656191585912577,-96.006515878017979 28.648049056432036,-96.010005951759737 28.648641710656278,-96.010506546843942 28.648726717396318,-96.011440067305529 28.648885239790378,-96.014343010193883 28.649378192516537,-96.026200716522851 28.65139176594381,-96.03348799089656 28.652629228032097,-96.039323368019012 28.651170385770797,-96.047737442142406 28.649066870151618,-96.049244844336243 28.648218956037223,-96.052682972641108 28.646285007998213,-96.05836686193534 28.643087818836001,-96.072165030584017 28.635326345489485,-96.092812363862251 28.627145317384699,-96.098878916233431 28.624741586366319,-96.099137163186526 28.624639261986079,-96.099760206508392 28.62447226081035,-96.102639895829256 28.623700385909448,-96.141413249033207 28.613307536255487,-96.148501276515404 28.611407654045699,-96.187178316202875 28.593595864643298,-96.198374286842139 28.586980055742131,-96.221784081288092 28.580364246840958,-96.228908787187095 28.580873158631725,-96.233997875508891 28.596649310733014,-96.233997875508891 28.601738394123839,-96.222292978285921 28.607336389305434,-96.214150448805384 28.613443281484855,-96.212623728226021 28.62260364440889,-96.2309444244882 28.64143324753087,-96.208552463485731 28.662298487953962,-96.214659365527126 28.665351929112688,-96.192267404524671 28.68774389011514,-96.1912495908051 28.694359708878277,-96.195829762405154 28.698939880478335,-96.202445561444364 28.700975507917487,-96.208747675276499 28.700187749031503,-96.21684000834783 28.699176214258408,-96.221467818495611 28.69859774191346,-96.222801895007663 28.698430983480506,-96.223384071149837 28.698294,-96.224163927167865 28.698110503315906,-96.227000018566372 28.697443183508955,-96.229623268039219 28.696825944469072,-96.231453341209956 28.69639533631743,-96.233964222112746 28.695240331316239,-96.23422531976 28.695120226420762,-96.234426397558138 28.695027730650764,-96.243315632596989 28.690938683290845,-96.256898753233088 28.684690448956413,-96.263514562134276 28.683672635236839,-96.268603640594122 28.688761723558645,-96.287942160437836 28.68316371851509,-96.304227224329892 28.671458831154069,-96.305245042980445 28.660262850652849,-96.303866760710434 28.646480081370939,-96.303718312539132 28.644995605411349,-96.322902111893882 28.641863561491792,-96.322903115546453 28.641863397630402,-96.328654788116609 28.640924350533034,-96.373438710121519 28.626674919011112,-96.376492171004159 28.620059100247982,-96.384634680760783 28.615987845369677,-96.473693647496702 28.573239550803915,-96.48794308888057 28.569677192923439,-96.482854000558774 28.580364266564878,-96.480309456397848 28.596649335387912,-96.485907441717487 28.60784531588914,-96.490487633041468 28.610898766909834,-96.510843966604781 28.614970031650095,-96.510335069606953 28.617514575811001,-96.497612348802434 28.625148188569788,-96.496594535082863 28.630746183751381,-96.49964797624159 28.635835272073191,-96.506263795004728 28.638379806372129,-96.513590449607946 28.639711925390898,-96.518002756430107 28.640514162994929,-96.524548246905439 28.641704252172264,-96.541744210187403 28.644830790950802,-96.545449731689985 28.645504522133091,-96.555118991611849 28.64601343885484,-96.5632615210924 28.64448670841351,-96.564664053901609 28.647882315216158,-96.572092291837293 28.665866475800886,-96.572930781014264 28.667896502859467,-96.570386236853366 28.674003385176928,-96.559190266214102 28.687235002979271,-96.559699163211917 28.6913062775815,-96.561225893653244 28.696395346179383,-96.566823878972883 28.697922096344637,-96.575158129308363 28.702846874961025,-96.578019859474111 28.704537895383844,-96.57828826199534 28.705826226653553,-96.579938546079447 28.713747585140421,-96.580564403635009 28.716751699466613,-96.584126761515478 28.722858581784067,-96.584439828543964 28.722940967911413,-96.591359183115401 28.724761852179114,-96.593796021437342 28.725403125944972,-96.611342043876562 28.720366765465901,-96.616906294097589 28.718769618875786,-96.625254999999996 28.716373230030175,-96.632357663078409 28.714334501780041,-96.638120426114043 28.71268037463507,-96.643733366943522 28.711069252030907,-96.64589364157122 28.710449172933409,-96.648758110223909 28.709626963981723,-96.65548660082564 28.704200766225345,-96.664534272187169 28.696904262901135,-96.657918463285995 28.687743919701024,-96.642136214348383 28.67476740345478,-96.635017595423747 28.668914316579048,-96.634564255386636 28.662567599984854,-96.634358790297441 28.659691108644115,-96.634304719917793 28.658934128568227,-96.633999771842213 28.654664885057134,-96.627892869800831 28.650084693733149,-96.626425176648581 28.649921620227584,-96.623312698200763 28.64957579673532,-96.621378075676532 28.648286046719594,-96.615940371111847 28.64466090565978,-96.615679075580019 28.64448670841351,-96.614055987266909 28.642701311583636,-96.613585709918453 28.642184006591457,-96.613038272810982 28.641581825879328,-96.612716570908134 28.641227953848528,-96.611999586497333 28.640439271135588,-96.610589997120172 28.638888723093881,-96.610589997120172 28.638695619081329,-96.610589997120172 28.63634418879494,-96.61975034032028 28.62769274259265,-96.620390401117646 28.626519297452973,-96.620672695530928 28.626001757543317,-96.621575870071126 28.624345937066781,-96.622336527533278 28.62295139797671,-96.622803791340985 28.622094747411062,-96.621924089240224 28.619379144726071,-96.621515564809087 28.618118047314677,-96.621338841511317 28.617572510068054,-96.620571817957583 28.61520474122884,-96.620437729127232 28.614790814755992,-96.617253050911174 28.604959849584038,-96.615239196090883 28.598743166058551,-96.614649885719274 28.596923990196654,-96.613008078443599 28.591855801497097,-96.611528402529856 28.587288105363601,-96.611113505533794 28.586007336117376,-96.611098903979951 28.585962261746474,-96.608298572876635 28.583628658523324,-96.608045443097311 28.583417717585569,-96.607377235577218 28.583437664220053,-96.600365219155734 28.58364697962633,-96.593251058093557 28.583859344147964,-96.573948594733835 28.584435541167107,-96.565297148531556 28.582399903865994,-96.564279334811971 28.57629300182461,-96.563658896232639 28.575155527088082,-96.562968608029692 28.573889994257026,-96.561225893653244 28.570695006643017,-96.557566061723506 28.569051817003789,-96.543745727976315 28.562846769979732,-96.536289388489891 28.559499026141786,-96.535271536438941 28.559346348925885,-96.526111211846271 28.557972305562419,-96.524846286909124 28.55686549700842,-96.523547686998668 28.555729222873186,-96.522039937244045 28.554409942750958,-96.516783301381025 28.541093122164042,-96.514406314623301 28.535071417976255,-96.512075206364955 28.532603188828926,-96.505754868421008 28.525911074776143,-96.496773944100411 28.520225902118948,-96.493684489370622 28.518270192113103,-96.482894459981281 28.511439806078794,-96.464303363514816 28.49967112954555,-96.450283853050735 28.49079639296917,-96.41974938229167 28.46738661824714,-96.410828816467941 28.459457253614527,-96.410588999643707 28.459244083835621,-96.409758652296418 28.458206146634446,-96.408886828651134 28.457116363910039,-96.40506625078595 28.452340627696451,-96.402446489887097 28.449065917053971,-96.402758256176753 28.447714917044181,-96.403973200604497 28.442450108152798,-96.407195206365273 28.441281062045864,-96.417343901660857 28.437598792799108,-96.461479843413926 28.421584870195201,-96.476120924474287 28.411702150055138,-96.481836236149007 28.407844318412668,-96.504737094149291 28.397666161492985,-96.511137484289378 28.396220910815867,-96.520513236388609 28.394103803612502,-96.534249520963641 28.388796609353736,-96.542905217114992 28.385452367272176,-96.559699173073881 28.377818734789468,-96.57038624671533 28.368658381727396,-96.577905378446388 28.364719789411506,-96.5917603939982 28.357462401226169,-96.600411840200493 28.354408960067438,-96.650793747525029 28.34677533744669,-96.672676831253582 28.335579347083499,-96.688452973492915 28.347284234444516,-96.694559875534281 28.347284234444516,-96.698122233414779 28.342704062844462,-96.705246949175717 28.348810964885843,-96.700157860853906 28.369676195446971,-96.705755865897487 28.400210705653887,-96.710336037497541 28.406826524417021,-96.710425531143088 28.406841439843959,-96.711757514930511 28.407063434453107,-96.711949596522956 28.407095447664108,-96.71209813364915 28.407120203551969,-96.7125191933293 28.40719037931537,-96.712878460543081 28.407250256459115,-96.722549831718325 28.408862132132249,-96.749013067323034 28.408862132132249,-96.762244685125353 28.411915593014903,-96.76554491144303 28.411090543097366,-96.768351577304784 28.410388882297497,-96.775985199925543 28.405808690973519,-96.777118787058129 28.404067826336821,-96.778115367638478 28.402537364460464,-96.780337941159374 28.399124129135416,-96.780820705165937 28.398382742114745,-96.790234641309425 28.383925636830853,-96.794392274787313 28.366371177405831,-96.794814812909479 28.364587126849088,-96.794810066932399 28.364444747076842,-96.79477772408616 28.363474458555832,-96.794305906049686 28.349319871745632,-96.794064195689629 28.347593374049037,-96.792754716842737 28.338239980125699,-96.790743538307225 28.323874459722486,-96.791161640090152 28.319066463411133,-96.791737095961722 28.312448960638157,-96.791761391474679 28.312169572361466,-96.791798306096766 28.312130020933203,-96.806010803272656 28.29690232711997,-96.809573161153153 28.290286508356836,-96.806010803272656 28.282143978876302,-96.799480493673911 28.2729662335258,-96.799349781293685 28.272782529381054,-96.787181219874626 28.255680743271615,-96.787181219874626 28.250082757951983,-96.800412817953031 28.224128419345121,-96.810027933605966 28.21709297064087,-96.81015126416365 28.217002728792142,-96.823379937963566 28.207323213817581,-96.836184503007971 28.197954022244446,-96.84100213695676 28.194428925121734,-96.842143298799229 28.193593928862132,-96.847274602334139 28.190686192954498,-96.857267971405633 28.185023289193378,-96.872677809006134 28.176291056181483,-96.877474270970822 28.171878306563691,-96.886067200578026 28.1639728030657,-96.898123211167331 28.152881261735526,-96.906497631141988 28.149042991548708,-96.910337015250093 28.147283276415891,-96.926704620510804 28.131597659113019,-96.934764623415617 28.123873491831901,-96.962356663895278 28.123371819605953,-96.962754569737697 28.123364584972112,-96.979717515560068 28.129783000626698,-96.995398793779131 28.135716460690723,-97.000413785843605 28.137614026355994,-97.007520616950742 28.136091128354632,-97.007538501604586 28.136087295914667,-97.009222611239821 28.135094102666635,-97.00939982996681 28.134989589017771,-97.027385928308092 28.12438239869169,-97.028912648887456 28.117257682930727,-97.025203084589847 28.111384210119862,-97.023365428929196 28.108474590635566,-97.022805746846075 28.107588427939849,-97.02290356380766 28.107197159145706,-97.023379876854563 28.105291902342927,-97.02382356056566 28.10351716319958,-97.025496807419856 28.101530180660298,-97.031966099908146 28.09384788848477,-97.033883146887263 28.088918342142531,-97.035528457788629 28.084687545284659,-97.035528457788629 28.083043098067591,-97.035528457788629 28.081818766572983,-97.035528457788629 28.074000471643224,-97.033022532693735 28.061470870449408,-97.032801767679686 28.060367047518316,-97.031459273912688 28.053654591691117,-97.031457183186404 28.053644138079921,-97.025859197866765 28.041939250718904,-97.030948266464648 28.033287814378582,-97.03239348781301 28.032603236465789,-97.040617526386512 28.028707642778524,-97.041168915404441 28.028259640036232,-97.046718327422383 28.023750751173218,-97.048760075590963 28.022091833877354,-97.050263648357429 28.019142519014494,-97.059727497080047 28.000578821719444,-97.061991693393324 27.99613751499442,-97.06790259446116 27.99219690579767,-97.073772658186698 27.988283521554418,-97.075732208193486 27.986977152070377,-97.083740513918784 27.975854507337193,-97.090858162154831 27.965968886660271,-97.094600599978094 27.960771057335059,-97.101378519421061 27.951357282114685,-97.101544336287489 27.951126980954953,-97.101629253046639 27.951009041034034,-97.112670327945679 27.935674217691009,-97.118292397880069 27.927865788706086,-97.121533983365822 27.923363587495643,-97.122089895488358 27.923104160785101,-97.123659587861624 27.92237163470331,-97.129167576400675 27.91980122961516,-97.134800331352182 27.902469771509406,-97.13578341488774 27.899444915775788,-97.139044920333077 27.897526377912126,-97.141761509630356 27.895928379836029,-97.144434841366106 27.894355827453982,-97.155121915007527 27.880615312653809,-97.156735458496229 27.877916799393841,-97.171211094589736 27.85370753808861,-97.17159000749372 27.853073838716419,-97.18273536107327 27.834434189625789,-97.184638591770963 27.831251199324921,-97.187183135931861 27.824126483563962,-97.18941247112663 27.823657146727278,-97.196852395853725 27.822090836400886,-97.201135366472329 27.822090836400886,-97.208766105658313 27.822090836400886,-97.209575096934316 27.822090836400886,-97.21103842611052 27.822356897891609,-97.21191517248603 27.822516307306422,-97.214117494684729 27.822916731993345,-97.215541825234411 27.823175702780983,-97.217387510601711 27.823511284007832,-97.220771087297493 27.824126483563962,-97.222189700736266 27.82464074101355,-97.223091414240102 27.824967618564596,-97.225175600069406 27.825723150734085,-97.225442194074731 27.826156365185522,-97.225555528799433 27.826340533769983,-97.225696025109201 27.826568839847944,-97.22598639723725 27.82704069367685,-97.227317456819009 27.829203661466853,-97.227317456819009 27.832884543697009,-97.227317456819009 27.832951908184537,-97.22711696094737 27.834288541284948,-97.22651425924083 27.838306534493725,-97.227537582741903 27.841230302974814,-97.228388390382094 27.843661171179477,-97.233100025453197 27.847817700825228,-97.234045759551762 27.848652012430087,-97.234511621821596 27.849062988727319,-97.238500481248579 27.854279199579018,-97.239439164419366 27.855506710708827,-97.241127420860792 27.857714434929608,-97.24139627838295 27.858969111470945,-97.242350826195675 27.863423696705052,-97.242654131578206 27.86483913096664,-97.243132066142749 27.865496290124597,-97.244364366034702 27.867190700237273,-97.250796680782656 27.876035121329831,-97.263010484865433 27.88010639593206,-97.267085449659064 27.88068852838779,-97.272090543185925 27.881403535150675,-97.273697558506882 27.881633106649463,-97.276628649874411 27.881144591421538,-97.283916343274228 27.879929975854907,-97.291452123510041 27.878674012482271,-97.291709327200167 27.878631145200583,-97.295071705789752 27.87807074876898,-97.29826066531912 27.876989746639367,-97.302276298241679 27.875628516526195,-97.30641171632756 27.874226681314273,-97.315889353880934 27.871013926092836,-97.325097299274915 27.867892591849294,-97.326845878314657 27.866807265961079,-97.334190606350404 27.862248465187459,-97.346213303335873 27.854786094892546,-97.354613966176373 27.849571885725148,-97.359768343966266 27.850509060182219,-97.360211961357962 27.850589719168646,-97.360654441244435 27.850290746360063,-97.363614400263117 27.848290774636723,-97.376904444631478 27.839311017562139,-97.379041564479934 27.837867018088055,-97.379057154646048 27.837837708581311,-97.379081675001302 27.837791610322164,-97.37968928125764 27.836649310776913,-97.391764280353456 27.813948316782309,-97.391812130016405 27.812975373996721,-97.391812459346511 27.812968677620422,-97.39203202611381 27.808504155006624,-97.392068018906713 27.807772301822137,-97.392095751995882 27.807208395884746,-97.393123788240075 27.786304999999999,-97.393168763213623 27.785390509210199,-97.393291005863816 27.782904909577571,-97.393142269808052 27.782564941361908,-97.39298939956177 27.782215523565412,-97.390949955785928 27.777553936582201,-97.390465068726371 27.776445623015572,-97.390185233729682 27.775805999999999,-97.389524844304646 27.774296538065283,-97.38835420640342 27.771620793596586,-97.388306220610531 27.771511111755789,-97.388011229692253 27.770836846624743,-97.38704242749894 27.768622441036733,-97.386166290102864 27.766619840754537,-97.385225495384532 27.765302728148875,-97.378862356737287 27.756394334042721,-97.375764970087644 27.752057992733249,-97.373069654276961 27.748284550598278,-97.368354500700462 27.741683335591173,-97.365855345900911 27.739779218033028,-97.354970329043653 27.731485873530172,-97.352272255056832 27.729430198526604,-97.34997871774064 27.727682741876539,-97.347507961666906 27.725800261438444,-97.346980343555629 27.725398266768138,-97.343485766084669 27.723942192633796,-97.323096068004702 27.715446484002907,-97.316445853072636 27.712675560756566,-97.312489136070184 27.711663774861414,-97.307771479065892 27.710457406346261,-97.30518751069485 27.709796650788128,-97.285725857752936 27.704820043684109,-97.259850586867117 27.698203387982087,-97.253955150197811 27.696695845323848,-97.254014647303208 27.696526337654994,-97.255455364792269 27.692421723465429,-97.259957004258851 27.67959652118169,-97.261636792970123 27.679316557300702,-97.26241778482418 27.679186392412099,-97.266063906300232 27.678578707462119,-97.266172011465457 27.678349884642419,-97.272736281666539 27.664455499360063,-97.273042341106247 27.663807672923248,-97.273584380560237 27.662660354976065,-97.276535709391737 27.656413369610792,-97.277059923980644 27.655303780997631,-97.278846463786479 27.651522268106756,-97.280071982275985 27.648928251476995,-97.280889132874719 27.647198614380269,-97.282300269490932 27.644211705671331,-97.282869528026779 27.64300677394548,-97.287959956150573 27.632232024058997,-97.288756326795195 27.630546371240786,-97.290370933329072 27.627128784125372,-97.290610159422798 27.626622421740255,-97.291264204229464 27.625238025568656,-97.291996439564016 27.623688125953898,-97.292910903535031 27.621752508687905,-97.293983233844585 27.619482740684056,-97.29528946695001 27.616717877953022,-97.296598377059297 27.613947348891728,-97.297587499071795 27.609496333379006,-97.298634024222366 27.60478700569162,-97.29761621050281 27.598680093788271,-97.294053852622326 27.594099922188217,-97.294182769084571 27.593971005725969,-97.300049926927869 27.588103847882682,-97.302196382102863 27.585957392707677,-97.311120578488044 27.579146819865922,-97.321534901946578 27.571199044464009,-97.325080504595888 27.561034984604785,-97.336802147188081 27.527432946040641,-97.343417965951204 27.517763686118776,-97.347489240553443 27.503005347737066,-97.350542661988243 27.478577729709574,-97.359194108190536 27.458221396146271,-97.365809926953673 27.450587783387487,-97.371916828995055 27.425142361502377,-97.369881181831957 27.412419660421783,-97.372934622990698 27.401223670058592,-97.379550422029908 27.390027689557368,-97.399397858595393 27.344734850830708,-97.401942402756291 27.335574497768633,-97.404995863638931 27.329976512448997,-97.413138393119482 27.321325066246711,-97.42026310888042 27.317253791644482,-97.430441285524054 27.313691423902039,-97.450797599363412 27.313691423902039,-97.482858840011673 27.297915271800758,-97.508304242172855 27.275014394076553,-97.532222933616623 27.278576761818989,-97.544436737699399 27.284174747138625,-97.546981281860297 27.290790556039799,-97.536803105216677 27.289263825598471,-97.526624948296998 27.291808369759369,-97.524589320857856 27.297915271800758,-97.51746460509689 27.305039987561717,-97.504741884292372 27.305039987561717,-97.498126085253162 27.308602345442196,-97.502706237129289 27.322342870104325,-97.499143898972747 27.327940855423961,-97.483876634007316 27.33862793892736,-97.483876634007316 27.351350640007954,-97.486930094889971 27.358984272490666,-97.501688443133645 27.366617904973374,-97.514411144214236 27.361528796927644,-97.520518046255617 27.352877370449281,-97.538329835658018 27.335574478044709,-97.570899973304094 27.315727061203152,-97.584131581244463 27.309620159161771,-97.609068086407831 27.285192570720163,-97.621790807212349 27.287228188297352,-97.63146005727225 27.286210384439741,-97.63654914066305 27.282139109837512,-97.636657939024673 27.281797172172649,-97.640111498543547 27.270943129336285,-97.639093679892994 27.253131339933887,-97.635022415152719 27.247024437892502,-97.628915513111338 27.242953173152234,-97.597363199046811 27.242444266292445,-97.5826048606651 27.240408628991332,-97.573953414462821 27.238881903480983,-97.56123071338223 27.232775006370584,-97.542910007258072 27.229212648490105,-97.520009129533875 27.231248285791217,-97.509830972614182 27.235319550531486,-97.503215153851045 27.23989972213154,-97.500161712692318 27.244479898662579,-97.485148876501881 27.25084127385778,-97.467082638600573 27.253640266517596,-97.45843119239828 27.259492710198106,-97.450288657986775 27.262546171080761,-97.424079880742951 27.264072891660124,-97.422298701802717 27.257711541119829,-97.434766954384401 27.202240525749552,-97.444945121166043 27.144733882940127,-97.443672849085587 27.116235010034327,-97.452324285425917 27.115217201245734,-97.455886653168363 27.110382571284802,-97.456650008527049 27.09969549764336,-97.46173908698691 27.095624227972113,-97.475479621510999 27.098423220631929,-97.480568699970846 27.102494490303176,-97.491510231973166 27.101222218222723,-97.495835955074313 27.09409750739275,-97.4932914109134 27.078066891999608,-97.477515248950155 27.066107546277717,-97.479041969529504 27.06279964182713,-97.482256963728076 27.061942305056665,-97.48693005051112 27.057710553505324,-97.487693415731783 27.053639288765055,-97.486675602012198 27.034809685643079,-97.477515248950141 27.032519589981089,-97.473952881207694 27.029211690461484,-97.473443984209865 27.022850330059228,-97.478300083716704 27.000269498406993,-97.478533072531675 26.999186101907302,-97.480568690108868 26.997659376396957,-97.483967678435022 27.000330000000002,-97.484131057851314 27.000458369056773,-97.492988547644813 27.000330000000002,-97.49889841702128 27.000244349959733,-97.533497176854453 26.999742920066073,-97.536803065768822 26.999695008767091,-97.549271318350492 26.995878197456715,-97.555378215460905 26.990280207206101,-97.551052502221722 26.980865400714134,-97.549525776711377 26.965343697111763,-97.552324769371197 26.95211208177491,-97.555378205598956 26.947277449348487,-97.555378205598956 26.938880461507075,-97.540874325578116 26.906310323861007,-97.540110950495503 26.900966796902246,-97.547999041339082 26.895114353221743,-97.552324764440229 26.888498544320569,-97.552324764440229 26.875332999999998,-97.552324764440229 26.873831771434514,-97.552324764440229 26.871753101924,-97.552324764440229 26.867633303897481,-97.555396527456509 26.865969429990074,-97.558431656619632 26.864325399446898,-97.558453748966258 26.864224239771101,-97.559853702000524 26.857813929560987,-97.562641307980527 26.845049630589628,-97.563266286580571 26.842187886943357,-97.552579212939136 26.827938454188693,-97.547744582978211 26.824630549738107,-97.537566416196555 26.824885004400745,-97.509830908511418 26.8035108521869,-97.48438549155729 26.763561555211936,-97.478024141017002 26.757200199740662,-97.471662790476714 26.758726925251008,-97.468609339456009 26.740915130917632,-97.467337057513589 26.710126182073765,-97.444945096511148 26.633535472850511,-97.445708451869848 26.609362327976836,-97.441206258760758 26.5999011976768,-97.435205432977895 26.587290766879221,-97.432741093635642 26.582112082834445,-97.429217375703914 26.574707168454967,-97.428151110966368 26.572466467229631,-97.418145193925739 26.555638334425574,-97.416955130465126 26.553636864107652,-97.41864075483771 26.543121778291471,-97.42039414733226 26.532183948458435,-97.422284917775215 26.520389141863415,-97.422298667285844 26.520303371102887,-97.425861015304378 26.516741008291426,-97.430695645265303 26.506562841509776,-97.430695645265303 26.494603495787885,-97.42802638225659 26.488322868889494,-97.42636993202612 26.484425333937217,-97.429168909893022 26.478063961207511,-97.43553026043331 26.470175880225888,-97.441382709044788 26.466613522345408,-97.441382709044788 26.455417541844177,-97.43756589773443 26.449819546662585,-97.425861005442428 26.446002740283195,-97.421026375481503 26.446766095641895,-97.417209564171131 26.449819546662585,-97.411611568989528 26.447275002501684,-97.412883841069984 26.433025580841726,-97.421789740702152 26.417249413947498,-97.419499649971158 26.413178149207234,-97.406013578738921 26.409106884466965,-97.398125502688274 26.410888063407203,-97.394308686446919 26.414450416356704,-97.395072051667569 26.417249413947498,-97.382484933201752 26.411326066613285,-97.377769169124974 26.409106884466965,-97.369626639644437 26.394602999515151,-97.374461259743413 26.38086247238753,-97.388965149626202 26.365849678110436,-97.392018610508856 26.339386444971247,-97.391000786927322 26.332261729210284,-97.38794734576858 26.330480545339064,-97.376242448545611 26.336332993950553,-97.372171183805335 26.339895346900054,-97.36937219114553 26.348546788171358,-97.358176200782339 26.356434874083959,-97.343417852538664 26.35923386920927,-97.342332537534404 26.358759043566288,-97.335275323058127 26.355671510096041,-97.335020017473738 26.355402767481841,-97.331108052904881 26.351284911668415,-97.330440693097202 26.350582427937965,-97.333762617526986 26.340749518544904,-97.336802038706509 26.331752819885011,-97.343786761143846 26.325987658774913,-97.344677525679145 26.325252425399061,-97.352414066956698 26.31886671611711,-97.352832659030639 26.318521211944631,-97.354359379610003 26.313941040344577,-97.348998828460125 26.312092573442666,-97.347821984790102 26.311686765063648,-97.346980205488165 26.311396496183672,-97.34736083223585 26.297503848546928,-97.347437236753805 26.2947151295396,-97.347489122209922 26.292821341560611,-97.347051378510429 26.289694600417153,-97.344137846000223 26.268883651035111,-97.343926764329439 26.267375924606483,-97.342629246748771 26.266550231912309,-97.341127771669619 26.265594748131736,-97.335282658907644 26.265594748131736,-97.331967408745584 26.265594748131736,-97.330307576264516 26.266747410222209,-97.323817586106017 26.271254350355399,-97.322807065545476 26.271956101137519,-97.313207351206557 26.273518846137112,-97.312102101648151 26.273698770576502,-97.311865543405119 26.273737280077761,-97.307030913444194 26.253126493084562,-97.308048727163751 26.249055213551365,-97.321280340035131 26.236078054109896,-97.321280340035131 26.228698889850026,-97.304486359421333 26.202490107675235,-97.296598288301666 26.200708923804015,-97.294817109361432 26.192311940893585,-97.296089381441874 26.182388227541828,-97.303096384204423 26.167373221160254,-97.305986772892751 26.161179530923267,-97.306776455083323 26.159487354748606,-97.300965235160419 26.149753561518516,-97.296881711355638 26.142913659244432,-97.296598288301666 26.14243892563589,-97.285549237329036 26.12861437636975,-97.28536038956149 26.128378090441405,-97.284582435540926 26.126454238998875,-97.282094393487881 26.120301403270393,-97.282839179410786 26.118439442973433,-97.28311220967295 26.117756868971455,-97.285501587752023 26.116923364107649,-97.294053737977038 26.113940052730097,-97.295071554162092 26.108342057548505,-97.292023254217796 26.105090538920617,-97.291924538345086 26.104985242032239,-97.291541272704407 26.104576425513905,-97.287190793518263 26.099935916255493,-97.286650074642992 26.099359149688052,-97.286603231473521 26.09930918366079,-97.283195451762182 26.095674220102872,-97.282639002190891 26.095080674133143,-97.282108002623801 26.094514274823585,-97.280435495761154 26.092730268223651,-97.279905974795895 26.09216544608875,-97.27980430522237 26.092056998587434,-97.27089841052117 26.086459003405839,-97.267086875013263 26.085485845069449,-97.24859983335169 26.080765747704277,-97.246979719077387 26.080352101364454,-97.229515030031649 26.08000965739204,-97.220290685310772 26.079828788368793,-97.208048240752987 26.079588741074772,-97.205005053278043 26.078666562185607,-97.199651252911579 26.077044196913871,-97.199152512570265 26.073220535461079,-97.199134106850465 26.073079425477676,-97.198725011196004 26.069943037351702,-97.198302051934135 26.066700361972018,-97.196018989165054 26.049196947106083,-97.195939794821285 26.0485897927724,-97.195071061587612 26.04192952989985,-97.204994779870347 26.030224637607851,-97.214918488291119 26.030733549398622,-97.224842206573854 26.027425644948035,-97.226114478654296 26.024372193927345,-97.219244211392265 25.99612778184791,-97.216954125592238 25.993837693582392,-97.208557137750816 25.991802058746771,-97.195834416946283 25.993074335758202,-97.174460269663413 26.000071824804216,-97.167208324722026 26.007069313850227,-97.162755377371425 26.014575709756024,-97.16262814819099 26.023481604457221,-97.172042954682937 26.044728528107019,-97.178658763584124 26.045491893327686,-97.182730028324386 26.053125515948434,-97.164981847348457 26.063876207878327,-97.152009000000007 26.062107999999998,-97.152012551274964 26.062039393270581,-97.15321 26.038906,-97.151921999999999 26.017652999999999,-97.14747181118706 25.985075937251509,-97.145567 25.971132,-97.146880999999993 25.969781,-97.146293999999997 25.955606,-97.147784999999985 25.953132,-97.156608000000006 25.949021999999999,-97.160293999999993 25.950243,-97.168198638692317 25.959262149012673,-97.178362000000007 25.962114,-97.187583000000004 25.958174,-97.206945000000005 25.960899,-97.214339285966162 25.960186817526893,-97.227626420907342 25.958907063854085,-97.229225999999997 25.958753000000002,-97.239867000000004 25.954974,-97.244841570811701 25.950784663302475,-97.248032999999992 25.948097,-97.255343503388133 25.949129556975723,-97.276707000000002 25.952147,-97.28138899999999 25.948036999999996,-97.277163000000002 25.935438,-97.284201820237172 25.935775045516863,-97.290083634347766 25.936056689174489,-97.293963761326751 25.936242484429805,-97.303601999999998 25.936703999999999,-97.316138101068788 25.931602038234757,-97.320560999999984 25.929801999999999,-97.324914000000007 25.924040999999999,-97.332235861490744 25.923541683060932,-97.33463605770983 25.923378000829199,-97.338346 25.923124999999999,-97.339310160867683 25.923294280152341,-97.350397999999998 25.925241,-97.367642000000004 25.915679999999998,-97.369283543255307 25.913688286645449,-97.373641276386991 25.908400972256459,-97.374430000000004 25.907443999999998,-97.372365000000002 25.905015999999996,-97.365976000000003 25.902446999999999,-97.365883578347024 25.900015396466173,-97.365521 25.890476,-97.364300486696564 25.885628504434479,-97.362421560218849 25.878165998501085,-97.360082000000006 25.868874000000002,-97.364783621478566 25.852096838905283,-97.36542 25.849826,-97.372864000000007 25.840116999999996,-97.394513000000003 25.837377,-97.422635999999997 25.840377999999998,-97.42853949246836 25.842912007889609,-97.434188204901034 25.845336654308195,-97.441181027463472 25.848338244915578,-97.445113000000006 25.850026,-97.445601387363794 25.851485440010176,-97.447179184935308 25.856200346812667,-97.448271000000005 25.859463000000002,-97.449172000000004 25.871677999999996,-97.452166849899044 25.875807172885114,-97.453724626189043 25.87795496921364,-97.454727000000005 25.879337,-97.45488774919265 25.879394304385261,-97.462586893331732 25.882138919861518,-97.468261999999982 25.884162,-97.468599721544905 25.884059457735212,-97.481532785459223 25.880132596436578,-97.486059999999995 25.878758,-97.490359999998347 25.879275544671589,-97.494739403174762 25.879802646248233,-97.496860999999996 25.880057999999998,-97.519591990380178 25.88590026892226,-97.521761999999995 25.886458,-97.52344767329889 25.891064017588189,-97.524375103029939 25.893598172727145,-97.528116959024402 25.903822606212749,-97.528119935206945 25.903830738482007,-97.52812430798204 25.903842686870224,-97.528627999999998 25.905218999999999,-97.528849446448064 25.906732522417784,-97.530321999999998 25.916796999999999,-97.530415259581318 25.916820899843632,-97.539878370214808 25.919246032588486,-97.542957 25.920034999999999,-97.545169999999999 25.923974999999999,-97.545468770003851 25.926387609575503,-97.545470694802859 25.92640315259677,-97.546397824784293 25.933889856891241,-97.546420999999995 25.934076999999998,-97.546611329705271 25.934141994258589,-97.555160182125618 25.937061277530951,-97.555378999999988 25.937135999999999,-97.555477252221124 25.937015705749829,-97.559364000000002 25.932257,-97.582565000000002 25.937856999999997,-97.580418999999992 25.945115999999995,-97.583044 25.955442999999999,-97.598043000000004 25.957556,-97.5981230356591 25.957681442330628,-97.607733999999994 25.972745,-97.60783562843973 25.973457509771446,-97.607844088251909 25.973516820913719,-97.608283 25.976593999999999,-97.609461531117333 25.977846566488182,-97.613191727531174 25.981811093986448,-97.613466053312663 25.982102652924251,-97.616041456343709 25.984839842874308,-97.624938181905222 25.994295461083137,-97.627225999999993 25.996727,-97.634804000000003 25.999508999999996,-97.635072411453706 25.99971613545971,-97.639164724998494 26.00287420951236,-97.642117661027001 26.005153015998879,-97.644011365977178 26.006614404624422,-97.643848619841975 26.01214811069886,-97.643707610985203 26.016942704231127,-97.649175518723894 26.021499311673544,-97.65096419129361 26.02118629315062,-97.659123404318109 26.019758427116106,-97.661326460130226 26.019372891335045,-97.66298585459532 26.019511685247039,-97.668297999999993 26.019955999999997,-97.669519566971061 26.021667429940447,-97.671350987084779 26.024233271429612,-97.671567999996611 26.024226704244594,-97.691453959129774 26.023624920821636,-97.697068999999999 26.023454999999998,-97.703247203861338 26.030308742132775,-97.706066818770353 26.031284762516545,-97.709294717923569 26.032402112038366,-97.711145328137576 26.033042707775564,-97.719920000000002 26.030837999999999,-97.723585926686539 26.030959832537771,-97.729354247932832 26.031151535557555,-97.735180242251758 26.031345155270547,-97.758837769919694 26.032131383932391,-97.76309059882324 26.033650253079866,-97.763351431657455 26.034258862745556,-97.76491324062286 26.037903081983409,-97.769788888528993 26.041344719068825,-97.770077387482857 26.041548365582649,-97.776788595669075 26.042443189872706,-97.779190602367677 26.042763456191249,-97.784050976575529 26.040637041739476,-97.789822674626535 26.0424596835391,-97.792252861730461 26.04428232533872,-97.793102878401371 26.047342389307317,-97.793537334820812 26.048906434437896,-97.794638769549053 26.052871604582215,-97.795290594138677 26.055218176136449,-97.801344 26.060016999999998,-97.803973303988229 26.059548218630308,-97.8082126910423 26.058792373859696,-97.819424117916668 26.056793476786609,-97.820997703829306 26.056512920501468,-97.825546000000003 26.055702,-97.826721102251625 26.055271667399982,-97.830409376527257 26.053920989485444,-97.836607999999984 26.051650999999996,-97.848759348822554 26.052295281844582,-97.85186756815483 26.052460084066457,-97.859824237628374 26.052881958029587,-97.860225497621784 26.05290323340671,-97.860503999999992 26.052917999999998,-97.861874999990562 26.053580848914272,-97.869705222636284 26.057366592615971,-97.871187000000006 26.058082999999996,-97.876982999999996 26.064482999999999,-97.886529999999993 26.066338999999999,-97.901546631929207 26.060958662441269,-97.905109129229899 26.05968224852101,-97.913882 26.056539,-97.935419999999993 26.052687999999996,-97.944344999999984 26.059620999999996,-97.950095000000005 26.061827999999998,-97.96210735288345 26.054793018383155,-97.96735799999999 26.051718,-97.971403108419892 26.054550391225565,-97.978769 26.059707999999997,-97.979877702655912 26.062937323324391,-97.981335 26.067181999999995,-98.010970999999998 26.063862999999998,-98.015122209308288 26.064471399070538,-98.026123959861238 26.06608380989196,-98.028288992822496 26.066401115993269,-98.028758999999994 26.066469999999999,-98.029241090705753 26.065867136858621,-98.033102 26.061039,-98.034402999999998 26.051375,-98.034479464439173 26.051215303797409,-98.034525269179767 26.051119640464091,-98.039238999999981 26.041274999999995,-98.054365285842039 26.044575736209502,-98.070020999999997 26.047992,-98.070022345126233 26.049160242153427,-98.070025 26.051466,-98.071425788568789 26.055027814897404,-98.076094939927231 26.066900165398668,-98.076139697069991 26.067013970337847,-98.076205751241318 26.067181927684643,-98.076543999999998 26.068041999999998,-98.076994427275579 26.068371469710563,-98.080289992888041 26.070782045417982,-98.080494999999999 26.070931999999999,-98.080906883185932 26.070920010911959,-98.084755 26.070808,-98.085506402845155 26.069709056167966,-98.085848999999982 26.069208,-98.085628527723046 26.069048386721494,-98.081567000000007 26.066108,-98.081855064865067 26.063941606819231,-98.081884000000002 26.063724,-98.082307152201508 26.063513440869801,-98.091037999999998 26.059169,-98.093593108176947 26.058759459973995,-98.094431999999998 26.058624999999996,-98.095078111969258 26.058956205325877,-98.096949561841043 26.059915534659098,-98.097643000000005 26.060270999999997,-98.105504999999994 26.067537000000002,-98.122952624574893 26.063250384797335,-98.12786358062813 26.062043837809401,-98.128331000000003 26.061928999999999,-98.142925292417388 26.051941751725515,-98.14645163947533 26.049528582072455,-98.146621999999994 26.049412,-98.146852932570667 26.049588146033326,-98.149462999999997 26.051579,-98.149462999999997 26.055813,-98.151730999999998 26.058187,-98.158277994458601 26.062311711597108,-98.16142849281799 26.064296576133319,-98.161911645017582 26.064600969774318,-98.167608590156348 26.068190136655492,-98.172071527808072 26.071001859012309,-98.177897000000002 26.074672,-98.179863281323136 26.072661506851002,-98.189059999999998 26.063257999999998,-98.191534000000004 26.057117999999999,-98.197046 26.056152999999998,-98.200871000000006 26.059161,-98.203328791159265 26.063523594334541,-98.204415309491765 26.065452171017675,-98.20496 26.066419,-98.205720285634712 26.066905180236589,-98.2057544964389 26.066927057036718,-98.220672999999991 26.076467,-98.228363119990576 26.077028417928002,-98.230097 26.077155,-98.231072909449267 26.07694353295701,-98.240214327563166 26.074962705064888,-98.248806000000002 26.073101,-98.250234708208026 26.074229377516481,-98.260964088277859 26.082703320039151,-98.264514000000005 26.085506999999996,-98.272091468517374 26.0934369782697,-98.272527821536428 26.09389363077193,-98.277218000000005 26.098801999999999,-98.277020629370639 26.099144109090908,-98.272932087266241 26.106230915405163,-98.272897999999998 26.10629,-98.272099931737145 26.106512924095771,-98.270258188934392 26.107027377392626,-98.270033999999995 26.107089999999999,-98.269661374787887 26.108231250649609,-98.268046405073434 26.113177467856264,-98.266755660647689 26.117130670341034,-98.265753950746401 26.120198637935399,-98.265698 26.12037,-98.266046753689267 26.120369439652073,-98.268388964369507 26.120365676386069,-98.271048543344023 26.120361403199535,-98.2713587738927 26.120360904747326,-98.279433560913844 26.12034793086255,-98.289509742149562 26.120331741306838,-98.296194999999997 26.120321,-98.299522999999979 26.11749,-98.299575546893735 26.117376878214852,-98.299577897643644 26.117371817572689,-98.299619756950364 26.117281703787395,-98.301477861619162 26.113281617347607,-98.302978999999993 26.110049999999998,-98.307788398559808 26.112633359128559,-98.31093219000293 26.114322040617914,-98.314784784069062 26.116391454064445,-98.31781148535309 26.118017240801439,-98.323055746360907 26.120834185452331,-98.323827999999992 26.121248999999995,-98.324165904650499 26.121735183484471,-98.335204000000004 26.137616999999999,-98.337914801547555 26.149187638321976,-98.338210450252006 26.150449569219312,-98.338419999999999 26.151344000000002,-98.338123748811455 26.151776768193923,-98.337139471603692 26.153214615149455,-98.336278203634194 26.154472768358826,-98.335109254490916 26.156180386856505,-98.334230366689056 26.157464279382136,-98.333315999999996 26.158799999999999,-98.333279392301918 26.159609030127591,-98.333194378655719 26.161487831708563,-98.333156000000002 26.162336,-98.33332593363771 26.162525092143447,-98.336569396995017 26.166134227137082,-98.336837000000003 26.166432,-98.337709251548077 26.166391430160555,-98.345513373134324 26.166028447761192,-98.345781000000002 26.166015999999999,-98.345955918391979 26.165759937155421,-98.34781294946896 26.163041431373035,-98.354645000000005 26.15304,-98.380009845764519 26.156864235849298,-98.386243919298991 26.157804141722139,-98.386694000000006 26.157872,-98.386714843024777 26.157901012682096,-98.387178289965661 26.158546112849205,-98.389418830831929 26.161664858836595,-98.394322667090904 26.168490808715738,-98.402249554153599 26.179524728065878,-98.404432999999997 26.182563999999999,-98.41082579547016 26.183537375155975,-98.418120000000002 26.184647999999999,-98.44253599999999 26.199151,-98.444302622216625 26.201317032456906,-98.444376000000005 26.201407,-98.444366742625562 26.201566115583965,-98.444174812576264 26.204865005795593,-98.443681770155465 26.213339409994948,-98.45054565332704 26.219516919037407,-98.450975699346984 26.219903961344286,-98.465077324681431 26.222335272645303,-98.467962758220992 26.221802674698019,-98.47639547470331 26.220246150374404,-98.481645999999998 26.219277000000002,-98.483269000000007 26.216439,-98.496684404575589 26.212853148677059,-98.500574513964963 26.213825676024403,-98.503492081872309 26.214798198660183,-98.504399410834864 26.216045775617395,-98.509275818143593 26.222750833698164,-98.509327236533252 26.222821533963195,-98.516621175147847 26.223550930651591,-98.520846190978133 26.222726536052498,-98.524733007990875 26.221968131567948,-98.526589565145571 26.221605875956907,-98.528323413163747 26.222421776495104,-98.535240999999999 26.225677,-98.538016739096946 26.231331135295655,-98.538505426714039 26.231595841236214,-98.543851889046309 26.23449184328507,-98.556093449912439 26.231976454911809,-98.561600478976516 26.23084487397777,-98.564343479612191 26.231667774301364,-98.575891642961039 26.235132223865481,-98.57618836327309 26.235221239973473,-98.581780384919284 26.243001439905978,-98.583095590242166 26.247416774401941,-98.585184223567666 26.254428618568909,-98.588002268837087 26.255070784392117,-98.599153999999999 26.257611999999998,-98.610401443364651 26.253223367217647,-98.613465000000005 26.252027999999999,-98.617434734670965 26.252082931217494,-98.618976176235122 26.252104260920568,-98.625299999997523 26.252191766854153,-98.626653663614832 26.252210498179227,-98.633391522135483 26.243617562727948,-98.63418 26.242612,-98.636673745354344 26.241784277127035,-98.654221000000007 26.235959999999999,-98.669397000000004 26.236319999999996,-98.675206000000003 26.239989,-98.678410535728389 26.244637915883345,-98.679041999999995 26.245553999999998,-98.678977427258005 26.246060764449961,-98.677766000000005 26.255568,-98.679196310064967 26.258571609080832,-98.681167000000002 26.262709999999998,-98.687156000000002 26.26512,-98.698855915315121 26.265619481498664,-98.707451416076225 26.272152066874316,-98.710601999999994 26.279018,-98.709170532219119 26.284185773270103,-98.710647239525585 26.288123668959596,-98.711233447604599 26.289686894290245,-98.722550749196131 26.295571625529284,-98.729196000000002 26.299026999999999,-98.73263614407044 26.29899082409209,-98.734613221934339 26.298970033513189,-98.745271658069271 26.303095890935232,-98.745297595683382 26.304159357241051,-98.745599830797417 26.316551278053844,-98.745615470637418 26.317192526042046,-98.748245116157776 26.32061106368975,-98.74905366960931 26.321662182706675,-98.754840366886953 26.324877004144408,-98.755242435754027 26.32510037501579,-98.766685638772316 26.325769085950686,-98.779858354339893 26.326538865087553,-98.779911999999996 26.326541999999996,-98.779946859358333 26.326559704051515,-98.789821999999987 26.331575,-98.796251999999996 26.349104,-98.797592059971961 26.356670995104565,-98.798210999999995 26.360166,-98.807348000000005 26.369420999999999,-98.808280016253249 26.369491024329768,-98.813413043374013 26.369876679389535,-98.81818280466733 26.370235041528161,-98.81932575812273 26.370320914010964,-98.824571000000006 26.370715,-98.828353477559162 26.367368473620303,-98.832909 26.363337999999999,-98.838554497099707 26.360957856802237,-98.842229804437778 26.359408346173527,-98.844057000000006 26.358637999999999,-98.847707 26.359594999999999,-98.853132332741467 26.364754198689674,-98.853414999999998 26.365023,-98.853852117327648 26.365076242531281,-98.854321671505204 26.365133435992636,-98.861354000000006 26.365989999999996,-98.861661690067152 26.365902494757481,-98.869113443480302 26.363783259984523,-98.874117355796216 26.362360176799562,-98.876164212939671 26.361778062685843,-98.882912762903771 26.359858814831277,-98.890964919192157 26.357568829017531,-98.895015448091129 26.359360408468842,-98.900432100164338 26.361756234493352,-98.900829697862818 26.361932094951143,-98.905559653818443 26.364024190108832,-98.91296803413384 26.372226331500926,-98.915344992389564 26.37485796579432,-98.921277034399395 26.381425588572444,-98.922831447878195 26.38166472803821,-98.923508557916591 26.381768898347495,-98.924925720775448 26.381986922427696,-98.926689551972586 26.38116380140492,-98.934437533628781 26.377548077521784,-98.937555770591459 26.376092900630621,-98.942046463189357 26.375531566775365,-98.950185820407469 26.380302920861933,-98.952073083609605 26.383491745197549,-98.952938578460817 26.384954133189183,-98.953327659277917 26.385611545667039,-98.958325183064531 26.394055638388448,-98.960041959595969 26.394835991082342,-98.96758721887106 26.398265653180793,-98.981979903868819 26.396488780147621,-98.98323657723455 26.396333635432413,-98.985344372930967 26.396073413984297,-98.99032130527651 26.395458978465552,-99.008003378826189 26.395458978465552,-99.014739404125635 26.398826987036053,-99.018845438188137 26.404005475794783,-99.021934999999999 26.407902,-99.025336792347318 26.409271761295809,-99.030462148109507 26.411335530401477,-99.031104888479149 26.411594335405351,-99.032315999999994 26.412082000000002,-99.033086386506682 26.412180127570064,-99.037216923343138 26.412706252494743,-99.039107 26.412946999999999,-99.039645291109963 26.412681959983438,-99.045466000000005 26.409815999999999,-99.053184999999999 26.402006,-99.062093000000004 26.397371,-99.082001999999989 26.396509999999996,-99.085125999999988 26.398782,-99.089412999999979 26.408099999999997,-99.092044248326658 26.410330707587079,-99.0977332288968 26.415153685331873,-99.099649490160544 26.416778244479925,-99.110855 26.426278,-99.113807999999992 26.434002,-99.110485406379198 26.436329519428725,-99.103082999999998 26.441514999999999,-99.097481906444941 26.458865277747179,-99.094712087984234 26.467445230774196,-99.091634999999997 26.476977000000002,-99.105030999999997 26.500335,-99.114051328117867 26.510193091438737,-99.123438026388797 26.520451579672599,-99.126618350727256 26.523927276756307,-99.127319211298612 26.524693229780183,-99.127781999999996 26.525199,-99.128040494672888 26.525242991472329,-99.131554903978838 26.52584108518932,-99.136510932879688 26.526684518463242,-99.143658999999985 26.527901,-99.157083944984777 26.532657279516766,-99.166741999999985 26.536078999999997,-99.170704 26.540316,-99.171403999999995 26.549848,-99.167459686682065 26.559874693319248,-99.167410000000004 26.560001,-99.168618869529794 26.566870928153797,-99.16946034016965 26.571652951934592,-99.178064000000006 26.620546999999998,-99.200522000000007 26.656442999999999,-99.209947999999997 26.693937999999999,-99.208906999999982 26.724761,-99.240022999999979 26.745850999999998,-99.242444000000006 26.788262,-99.243132825912184 26.78921716914337,-99.262208 26.815667999999999,-99.268613000000002 26.843212999999999,-99.274832961326339 26.850997131057774,-99.280470999999991 26.858053000000002,-99.295146000000003 26.86544,-99.316753000000006 26.865831,-99.328801222539823 26.879647723469141,-99.328900000000004 26.879760999999998,-99.328852280051947 26.879943529980665,-99.328653604395157 26.88070346927794,-99.326247644284351 26.88990632616278,-99.321819000000005 26.906846000000002,-99.324684000000005 26.915973,-99.337297000000007 26.922758999999999,-99.361143999999996 26.928920999999999,-99.367053999999996 26.929033999999998,-99.379148999999998 26.934489999999997,-99.388253000000006 26.944216999999998,-99.393748000000002 26.960730000000002,-99.390189000000007 26.966348,-99.377312000000003 26.973818999999999,-99.376593 26.977716999999998,-99.378434999999996 26.980034,-99.385448615007036 26.981891053234623,-99.387366999999998 26.982399,-99.403694000000002 26.997355999999996,-99.407320999999996 27.005808999999999,-99.415475999999998 27.017239999999997,-99.420446999999996 27.016567999999999,-99.429379999999981 27.010833000000002,-99.432154999999995 27.010698999999995,-99.438721 27.01463,-99.445682828533535 27.022104842939122,-99.446523999999997 27.023008,-99.446589518313687 27.0234513503828,-99.446929167151652 27.025749691622671,-99.446969999999979 27.026026000000002,-99.446787747918748 27.026353589968604,-99.444062000000002 27.031253,-99.443973 27.036457999999996,-99.447729715193731 27.048260380671568,-99.452315999999996 27.062668999999996,-99.450282 27.067705,-99.439210578806851 27.075275465844946,-99.434470000000005 27.078517000000002,-99.429209 27.090981999999997,-99.430274999999995 27.094871999999999,-99.437646 27.100442,-99.442122999999995 27.106839,-99.441108999999997 27.110041999999996,-99.433369999999982 27.119218,-99.430581000000004 27.126611999999998,-99.431354999999996 27.13758,-99.438264999999987 27.144791999999995,-99.439971 27.151071999999996,-99.437950999999998 27.154121,-99.42998399999999 27.159148999999999,-99.426616441133064 27.174998569551711,-99.42634799999999 27.176261999999998,-99.426389092127664 27.176475083747437,-99.428025433058153 27.184960350328335,-99.432794999999999 27.209693,-99.441928000000004 27.217984999999995,-99.442101400955139 27.218265584747954,-99.445237999999989 27.223341,-99.443121431464945 27.230753685991843,-99.441406999999998 27.236757999999998,-99.441548999999995 27.249919999999999,-99.452207395848959 27.263806782859465,-99.452390999999992 27.264046,-99.452635348600225 27.264144272092288,-99.454218033886534 27.264780796280988,-99.462735864984637 27.268206496624611,-99.463308999999981 27.268436999999995,-99.463731957038988 27.268231398925973,-99.480688 27.259988999999997,-99.487909999999999 27.260721,-99.492407 27.264118,-99.496069429210138 27.270723950024919,-99.496615000000006 27.271707999999997,-99.496412995851571 27.272119287725655,-99.490870463706145 27.283404082904614,-99.487572835142558 27.290118173493504,-99.487513000000007 27.29024,-99.487552182270463 27.290674424182523,-99.487937000000002 27.294941,-99.493651777311726 27.30231355132117,-99.494603999999995 27.303542,-99.494999311050705 27.30367917804087,-99.501697839297435 27.306003653868146,-99.502036000000004 27.306121,-99.50260564894451 27.305998370990778,-99.511531000000005 27.304076999999999,-99.522353224815092 27.304131436852781,-99.523657999999983 27.304137999999995,-99.527521386758664 27.305370598210363,-99.529216737576675 27.305911493159478,-99.529653999999994 27.306051,-99.533911450776046 27.310119063512179,-99.536090758332008 27.312201427353024,-99.536443000000006 27.312538,-99.537771000000006 27.316072999999996,-99.53137599999998 27.323809,-99.52136037329538 27.324774325824137,-99.521259999999998 27.324784,-99.520793197388144 27.325167862222077,-99.515101491997058 27.329848278790703,-99.509737777509301 27.334258981108004,-99.504836999999995 27.338289,-99.507830999999996 27.348637,-99.507785758525344 27.353517859091919,-99.507778999999999 27.354247,-99.505884699626023 27.358359262089539,-99.503847413823948 27.362781925614613,-99.502763417847504 27.36513512979511,-99.502013099315448 27.366763966750881,-99.499076000000002 27.373139999999999,-99.492143999999996 27.380516999999998,-99.488110785984318 27.408328989964531,-99.487887470616073 27.409868914391197,-99.487633320470721 27.411621467383494,-99.487521 27.412396,-99.487591555014376 27.412624523015491,-99.489856740583164 27.419961308946796,-99.495313182879073 27.437634363915539,-99.495699000000002 27.438884000000002,-99.495681276107845 27.439260342274874,-99.495103999999998 27.451518,-99.489866073767956 27.458841813736395,-99.48498035355378 27.465673163249864,-99.484933241276849 27.465739036942171,-99.483818999999997 27.467296999999995,-99.483170086267094 27.470026063960816,-99.480813109028745 27.479938539705284,-99.480418999999998 27.481595999999996,-99.480219000000005 27.485795999999997,-99.483519 27.491095999999999,-99.494943552274876 27.498766770813134,-99.497518999999997 27.500495999999998,-99.501722168778215 27.500229993495459,-99.502529258718056 27.500178915086504,-99.513319999999993 27.499496,-99.516119999999361 27.498282666666942,-99.519319999999979 27.496896,-99.525819999999982 27.496696,-99.528319999999994 27.498895999999998,-99.525855930815595 27.516294999999385,-99.525849791073696 27.516338353233991,-99.525316190784537 27.520106149807926,-99.523876376642917 27.530272798702207,-99.522431296340699 27.540476632400054,-99.521918999999997 27.544094,-99.518818999999993 27.553194,-99.514319 27.556994,-99.511118999999994 27.564493999999996,-99.512219000000002 27.568093999999995,-99.515978000000004 27.572130999999999,-99.51621006287597 27.572263354504685,-99.516956092136581 27.572688844074506,-99.522907946893667 27.576083418863931,-99.530137999999994 27.580207,-99.536560517954015 27.595669560441458,-99.539721999999998 27.603280999999999,-99.549741780062789 27.610632655019803,-99.554405160028892 27.614054243170667,-99.554950000000005 27.614453999999999,-99.555217670042637 27.614437037021997,-99.556811999999994 27.614335999999998,-99.559466999999998 27.609075999999998,-99.562869000000006 27.607264,-99.580005999999997 27.602250999999995,-99.584175941853502 27.603675176957196,-99.584843000000006 27.603902999999999,-99.584876722760043 27.604178863233781,-99.585148000000004 27.606397999999999,-99.578360965974085 27.610254799100861,-99.578159999999983 27.610368999999999,-99.578158133228257 27.610639131051315,-99.578098999999995 27.619195999999999,-99.584782000000004 27.622006999999996,-99.591372000000007 27.627464,-99.592626330929548 27.632690692534315,-99.594037999999998 27.638573,-99.596231000000003 27.639857999999997,-99.603532999999999 27.641991999999998,-99.612907806834755 27.638651258855042,-99.615318942915422 27.637792043123689,-99.624515000000002 27.634515,-99.625321999999997 27.631136999999999,-99.638929000000005 27.626757999999999,-99.654323999999988 27.629615999999999,-99.665948 27.635967999999998,-99.665422000000007 27.640274999999999,-99.660175716081199 27.644678795569117,-99.659499999999994 27.645246,-99.659300532255756 27.646059100049566,-99.658294999999995 27.650158,-99.661845 27.655753,-99.668942 27.659973999999998,-99.672015651285406 27.660163655087903,-99.685812999999982 27.661014999999999,-99.699355999999995 27.655417,-99.704600999999997 27.654953999999996,-99.711511000000002 27.658365,-99.721518999999986 27.666154999999996,-99.723715999999996 27.673328,-99.727277746539684 27.678262316066267,-99.732288643517421 27.685204233237535,-99.732448000000005 27.685424999999999,-99.732610774853441 27.685596448480599,-99.757538999999994 27.711853,-99.758533999999997 27.717071,-99.770740000000004 27.732133999999999,-99.774900999999986 27.73354,-99.785365999999996 27.730354999999999,-99.788844999999981 27.730718,-99.796341999999981 27.735586,-99.801651000000007 27.741771,-99.805670000000006 27.758687999999999,-99.813085999999998 27.773952,-99.817390803736785 27.775433523363962,-99.819091999999998 27.776019000000002,-99.822192999999999 27.766855,-99.825793000000004 27.764373999999997,-99.835127 27.762881,-99.841707999999997 27.766463999999999,-99.843346625073153 27.773142384459568,-99.844736999999981 27.778808999999999,-99.849281022020321 27.790032142335203,-99.850876999999997 27.793973999999999,-99.857944055165163 27.794214491272228,-99.870065999999994 27.794626999999998,-99.877441689362087 27.799278597548025,-99.877677000000006 27.799427,-99.877679299916537 27.799779028327777,-99.877693551047656 27.801960325692491,-99.877840000000006 27.824375999999997,-99.876677795668783 27.832975173255242,-99.876002999999997 27.837968,-99.877201999999997 27.842179000000002,-99.882014999999996 27.850391999999996,-99.89364999999998 27.856193,-99.901486000000006 27.864162,-99.904385000000005 27.875283999999997,-99.901231999999993 27.884405999999995,-99.894091000000003 27.892949999999999,-99.893456 27.899208000000002,-99.895827999999995 27.904177999999998,-99.900080000000003 27.912141999999999,-99.905861237749605 27.914081496997749,-99.917461000000003 27.917973,-99.925935042520848 27.927688375003317,-99.93714199999998 27.940536999999999,-99.938541 27.954059,-99.932160999999979 27.96771,-99.931811999999994 27.980967,-99.962768999999994 27.983536,-99.984922999999995 27.990729000000002,-99.991446999999994 27.99456,-99.998749958954292 28.00705628754028,-100.000278657311796 28.009672084008166,-100.008630999999994 28.023963999999999,-100.012838999999985 28.037203000000002,-100.014975394500183 28.048814882934586,-100.016570970484992 28.057487270710915,-100.017914000000005 28.064786999999999,-100.028724999999994 28.073118,-100.046108000000004 28.079067999999999,-100.053122999999985 28.08473,-100.056983000000002 28.094207,-100.05559599999998 28.101140999999998,-100.056492999999989 28.104185999999995,-100.064147158981442 28.110644603904401,-100.067651999999995 28.113602,-100.075474 28.124881999999999,-100.083393 28.144034999999999,-100.090288999999984 28.148312999999998,-100.119627999999992 28.155588000000002,-100.12658652988236 28.159659080291213,-100.141098 28.168149,-100.159890345070792 28.168159605160877,-100.160589999999999 28.16816,-100.1644540887186 28.169825181963088,-100.168437999999995 28.171541999999999,-100.173949604741296 28.178834844700365,-100.174413 28.179448,-100.17569869464343 28.180169771489844,-100.185693999999998 28.185780999999999,-100.195825662217615 28.189941498404405,-100.196499000000003 28.190218000000002,-100.19841872968675 28.190245400986015,-100.202449991411854 28.190302940621361,-100.208059000000006 28.190382999999997,-100.21208061434919 28.196473071951928,-100.212104999999994 28.196509999999996,-100.212111438897693 28.196576571978802,-100.212136678181992 28.196837521783539,-100.213449999999995 28.210415999999999,-100.217564999999993 28.226934,-100.220284000000007 28.232209999999995,-100.22363 28.235223999999995,-100.227575000000002 28.235856999999999,-100.246200000000002 28.234092,-100.251633999999996 28.236177,-100.261135590980771 28.244561246718906,-100.267604000000006 28.250268999999999,-100.280518 28.267969,-100.289383999999998 28.273491,-100.293468000000004 28.278475,-100.294296000000003 28.284381,-100.287553999999986 28.301093000000002,-100.286470999999992 28.312295999999996,-100.288638999999989 28.316977999999995,-100.314198000000005 28.345859,-100.317245999999997 28.357382,-100.320392999999996 28.362116999999998,-100.341869000000003 28.384952999999996,-100.344399999999979 28.389662,-100.34934096344108 28.4019924953441,-100.349585999999988 28.402603999999997,-100.349394820211828 28.402858691740477,-100.345766407828719 28.407692501181913,-100.343945000000005 28.410119000000002,-100.337058999999996 28.427150999999995,-100.336185999999998 28.430180999999997,-100.337474638078888 28.440402915586755,-100.337648113426326 28.441778981052359,-100.337796999999995 28.442959999999999,-100.338752462381066 28.444650728533539,-100.341532999999998 28.449570999999995,-100.350785999999999 28.459246,-100.353875644654778 28.461269551534915,-100.357498000000007 28.463642,-100.35795880406117 28.464220845064407,-100.358193534884933 28.464515705266944,-100.367961112704847 28.47678537623738,-100.368288000000007 28.477195999999999,-100.368051363629903 28.477598261305609,-100.365982000000002 28.481116,-100.356642877924983 28.482149981508559,-100.352234999999979 28.482638,-100.344180999999992 28.486249,-100.337140000000005 28.491728999999999,-100.33381399999999 28.499251999999998,-100.338517999999993 28.501833,-100.362147999999991 28.508399,-100.379079000000004 28.511638999999999,-100.388859999999994 28.515747999999995,-100.405057999999983 28.535779999999999,-100.411413999999994 28.551898999999999,-100.40430324537553 28.563833042228197,-100.397270000000006 28.575637,-100.396799999999999 28.580400999999998,-100.398385000000005 28.584883999999999,-100.403243426032972 28.586668145075244,-100.425819035320046 28.594958517689108,-100.429856 28.596440999999995,-100.431892715674053 28.597943579291371,-100.447320000000005 28.609324999999998,-100.448648000000006 28.616773999999999,-100.447280739633683 28.625703494601449,-100.445528999999993 28.637143999999996,-100.44560646842767 28.637394606891831,-100.447014715516048 28.641950223113035,-100.447091 28.642196999999999,-100.447325484276334 28.642184618041064,-100.447599559425257 28.642170145483281,-100.456522261830528 28.641698981546444,-100.462866000000005 28.641363999999999,-100.474494000000007 28.647071,-100.479445543783555 28.654922981332383,-100.479495071011698 28.655001519842354,-100.479635999999999 28.655225000000002,-100.481416494659797 28.655591917738484,-100.492493911747701 28.657874710783531,-100.493322226012125 28.658045406716248,-100.495863 28.658568999999996,-100.496129521434568 28.658770241190073,-100.500353999999987 28.661960000000004,-100.502122125123847 28.667202406240314,-100.505211969634487 28.676363647108229,-100.509438609439442 28.688895431533517,-100.510054999999994 28.690722999999995,-100.510127443340068 28.69126843161186,-100.510538898440004 28.694366309458967,-100.51077198772829 28.696121257064849,-100.511998000000006 28.705352,-100.511351260759739 28.706743032691019,-100.510646631791559 28.708258576930099,-100.509872363628347 28.709923903942272,-100.509406561254394 28.710925770365975,-100.508636802312012 28.712581398765199,-100.507069450532313 28.715952521820881,-100.506701000000007 28.716745000000003,-100.506745928327234 28.717920131927187,-100.506786973330165 28.718993692782757,-100.507152057645129 28.728542729239727,-100.507513721430456 28.738002299344281,-100.507590113222051 28.740000380261673,-100.507613000000006 28.740599,-100.507694735304739 28.740708529390524,-100.51442566685138 28.749728313832868,-100.519226000000003 28.756160999999999,-100.533017 28.763279999999998,-100.537772000000004 28.780775999999996,-100.534846642084489 28.786410367511117,-100.532431000000003 28.791062999999998,-100.535830000000004 28.805887999999999,-100.546431879116881 28.824270186264151,-100.546968759195195 28.825201061771438,-100.547323999999989 28.825817,-100.548186025546428 28.826178082695296,-100.553129999999982 28.828249,-100.561442999999997 28.829174000000002,-100.570509999999999 28.826317,-100.574698999999995 28.828786999999998,-100.576846000000003 28.836168000000004,-100.572991999999999 28.848463999999996,-100.580501999999996 28.856007999999999,-100.591040000000007 28.863054000000002,-100.598061272695219 28.874286065303028,-100.598877000000002 28.875590999999996,-100.602654 28.887660000000004,-100.602394435759351 28.893839359355621,-100.602053999999995 28.901944,-100.615584686670886 28.902906942475386,-100.627205999999987 28.903734,-100.631611000000007 28.902838999999997,-100.633502414453218 28.905240591668694,-100.640568000000002 28.914211999999999,-100.639169999999979 28.916288999999999,-100.638857000000002 28.927621999999996,-100.651511999999997 28.943431999999998,-100.64789859018552 28.954344193790252,-100.646992999999995 28.957078999999997,-100.646600907687997 28.967547400926616,-100.64647463428885 28.970918751315974,-100.645893999999998 28.986421,-100.647406325643686 28.99295674936236,-100.647835962928511 28.994813493392339,-100.648681241069511 28.998466493719445,-100.65094599999999 29.008254000000004,-100.653757999999996 29.015356,-100.656109999999998 29.017223999999999,-100.660207999999997 29.031497000000002,-100.663212 29.048041999999995,-100.662508000000003 29.058106999999996,-100.664064999999994 29.073205999999999,-100.666359117032755 29.07896154562156,-100.668483863047285 29.084292168447689,-100.674655999999999 29.099777000000003,-100.684472 29.110657,-100.692326999999992 29.115227999999995,-100.70996599999998 29.119684000000003,-100.727461999999989 29.129122999999996,-100.737795000000006 29.139078999999999,-100.739115999999996 29.141658,-100.737590999999995 29.147406999999998,-100.739681000000004 29.150486000000004,-100.746139999999997 29.154149000000004,-100.752330696165359 29.155516457617566,-100.759726 29.157149999999998,-100.76337082361762 29.160348915845475,-100.772648999999987 29.168492,-100.775904999999995 29.173344,-100.772154104961558 29.17809434863841,-100.766030999999998 29.185848999999997,-100.767059000000003 29.195287,-100.768348510582513 29.197581465531123,-100.775064591152173 29.209531592641572,-100.785521000000003 29.228136999999997,-100.791371999999996 29.225944999999999,-100.795681000000002 29.227729999999998,-100.79704599999998 29.235585999999998,-100.795234211471239 29.241421249558652,-100.795010188783237 29.242142762180318,-100.794911999999997 29.242459,-100.795310930062826 29.24310735172228,-100.797670999999994 29.246943000000002,-100.805332448258866 29.251327106905226,-100.815767091023289 29.257298117587734,-100.823532999999998 29.261742000000002,-100.834039999999987 29.261399999999998,-100.839016 29.263259,-100.841581161127962 29.265429071012271,-100.848663999999999 29.271420999999997,-100.856469000000004 29.275663999999999,-100.864659000000003 29.276076,-100.874739696506666 29.279181633366278,-100.876048999999995 29.279585,-100.876625364221198 29.280115401513385,-100.878513170701353 29.281852663087207,-100.878882999999988 29.282193000000003,-100.879105716359817 29.283377353454046,-100.880504361011205 29.290815018226784,-100.882051999999987 29.299044999999996,-100.886842 29.307848,-100.895590728097048 29.309871687341737,-100.904835000000006 29.31201,-100.906461302333199 29.313095095005444,-100.914770068080642 29.318638836799305,-100.916744062319239 29.319955917421627,-100.92203960930695 29.323489191321695,-100.922232587658954 29.323617949573855,-100.924041970395777 29.324825198761538,-100.926468967605715 29.326444530233299,-100.926628772437255 29.326551154580446,-100.926677999999981 29.326584,-100.92692137104487 29.32669794102517,-100.927819078352698 29.327118228044156,-100.92782883100196 29.32712279402223,-100.930446231588661 29.328348203997709,-100.940614999999994 29.333109,-100.941560773525751 29.336361493535293,-100.943196 29.341985,-100.945807189162338 29.344363370184055,-100.948971999999998 29.347245999999998,-100.95603875001359 29.347290187325033,-100.964324999999988 29.347342,-100.971743000000004 29.351370999999997,-100.972915999999998 29.354545000000005,-100.995606999999993 29.363403000000005,-101.004206999999994 29.364771999999999,-101.010614000000004 29.368669,-101.010768998319776 29.36895846820963,-101.014103165002794 29.375185214807839,-101.024016000000003 29.393697999999997,-101.036603999999997 29.406107999999996,-101.038600000000002 29.410713999999999,-101.037642000000005 29.414681000000002,-101.043363999999997 29.42988,-101.056956999999983 29.440773,-101.06011415724447 29.458454662113137,-101.060150999999991 29.458660999999999,-101.063843258270609 29.460131584976065,-101.087148999999997 29.469414,-101.103699000000006 29.470549999999999,-101.115253999999993 29.468458999999996,-101.130037999999985 29.47842,-101.137502999999995 29.473541999999998,-101.144336999999993 29.473246,-101.151876999999999 29.477004999999998,-101.163854997623304 29.493316894569897,-101.168923969306405 29.50021992913986,-101.171662999999995 29.503950000000003,-101.173821000000004 29.514566000000002,-101.192719999999994 29.520285,-101.227418999999998 29.522349999999996,-101.235274999999987 29.524854,-101.254895000000005 29.520341999999996,-101.260836999999981 29.529933,-101.261174999999994 29.536777,-101.252755240314642 29.553001111955531,-101.244355179006547 29.569187266927752,-101.24384013276574 29.574337712700849,-101.242022713082847 29.59251185083151,-101.251352546644355 29.604174135250076,-101.252152766968493 29.604494220898598,-101.259127443101093 29.607284069726152,-101.265347312053251 29.607284069726152,-101.274677145614746 29.602619152945408,-101.277624046978673 29.599940160672645,-101.283229510623855 29.594844301688571,-101.297224215766221 29.587069435365102,-101.30733154801338 29.587846934050759,-101.312894947857018 29.594028488101586,-101.314328915651188 29.595621785307589,-101.313192213312618 29.602947206633093,-101.31110792457288 29.616379301091623,-101.30733154801338 29.640715970810437,-101.311218981175116 29.64849082206727,-101.316661381574889 29.655488204771718,-101.325213716450733 29.657820655628775,-101.350093282659174 29.654710721152696,-101.353062961800887 29.655502634567405,-101.361755552011104 29.657820655628775,-101.364595571422868 29.66106639883844,-101.367197952410862 29.664040554714198,-101.371300910394638 29.676075888592084,-101.372874548462477 29.680691889931673,-101.378860251896057 29.698249939417508,-101.396947999999995 29.713947,-101.398362000000006 29.717000000000002,-101.396293999999997 29.727055,-101.397008999999997 29.733962999999999,-101.400635999999992 29.738078999999999,-101.410024000000007 29.741498,-101.415583999999996 29.746534,-101.415509877418046 29.750619769974676,-101.415402087456428 29.756561346443686,-101.424731921017937 29.758116313681725,-101.430388403484372 29.756500180308258,-101.441059122217254 29.75345141196761,-101.446501522617027 29.755006409338922,-101.451652003139955 29.758440048234313,-101.453498905321467 29.759671311053037,-101.455223999999987 29.771874,-101.467493655663716 29.779885945414083,-101.475268506920557 29.780663444099741,-101.503223000000006 29.764581999999997,-101.522695143280473 29.759671311053037,-101.526552276219391 29.761451532447605,-101.532802460460985 29.764336242900427,-101.53746737724174 29.782995910023434,-101.53804719015173 29.783865628452077,-101.546797210803248 29.796990645299058,-101.56156944476453 29.794658179375361,-101.572592853930203 29.778735448896484,-101.575564187573463 29.774443514881042,-101.582561562744587 29.771333610538232,-101.598573641854728 29.773657690388074,-101.603680999999995 29.774398999999999,-101.607256216824311 29.773863608191139,-101.625957999999997 29.771063000000002,-101.630319 29.768729,-101.632632680380155 29.763891873249722,-101.63512799999998 29.758675,-101.646417999999997 29.754303999999998,-101.652400999999983 29.758794999999996,-101.65328091488901 29.761368862201802,-101.654578 29.765162999999998,-101.662452999999985 29.77128,-101.689992000000004 29.771212999999996,-101.706636000000003 29.762736999999998,-101.714223999999987 29.767659999999999,-101.735201999999987 29.771591999999998,-101.754322999999999 29.777661999999999,-101.760919284561496 29.782457957985276,-101.763273999999981 29.784169999999996,-101.776796131253491 29.789191504347542,-101.777161000000007 29.789327,-101.777360180704861 29.789301830227139,-101.785668 29.788251999999996,-101.791002820423358 29.783037559970925,-101.796869557069002 29.782618516634159,-101.806507764952315 29.786389987871868,-101.809441149516488 29.790161459109573,-101.813855730843954 29.79253854440006,-101.814888826583982 29.793094827432377,-101.818909248247508 29.792167038125061,-101.830044431332681 29.789597381341238,-101.831231874027822 29.789323356194672,-101.852603555202364 29.801894932400803,-101.862241763085706 29.800218726571018,-101.866487373818487 29.79821962567333,-101.875399999999985 29.794022999999999,-101.878152615094365 29.794637055896249,-101.892739000000006 29.797891,-101.912406000000004 29.797849999999997,-101.917556726002999 29.792675767854249,-101.917942403066036 29.792482929945557,-101.922585359733716 29.790161459109573,-101.929709258872364 29.789323356194672,-101.932572380438657 29.791613852338052,-101.938090312383324 29.796028195755184,-101.946471365894325 29.797704401584976,-101.952535620779244 29.796990962273608,-101.953595265032959 29.796866298670082,-101.959462001678588 29.799380623656123,-101.965427194081556 29.806464275410743,-101.966166845299441 29.8073426094683,-101.970357372054934 29.81027599403247,-101.974547898810414 29.81027599403247,-101.982165144097308 29.804870201524977,-101.987538526473998 29.801056829485908,-101.993568005272067 29.802652866652032,-102.001318622543394 29.804704498914084,-102.001786318660763 29.804828300723614,-102.021918999999997 29.802490999999996,-102.032489182844799 29.803756293694118,-102.034758999999994 29.804027999999999,-102.039012999999997 29.802655,-102.041088000000002 29.799609999999998,-102.038411999999994 29.792831999999997,-102.039226999999997 29.790977000000002,-102.041308736499772 29.78984019520162,-102.048982832584102 29.785649487466547,-102.050044 29.785069999999997,-102.053123037129694 29.785312127485501,-102.073645999999982 29.786926,-102.076299925656656 29.790865308882584,-102.077348 29.792421,-102.084438999999989 29.794962000000002,-102.091420021879856 29.792967151942147,-102.091815999999994 29.792853999999995,-102.098789196918744 29.792718427915432,-102.115682000000007 29.792389999999997,-102.142325999999997 29.802854,-102.159600999999995 29.814355999999997,-102.161673999999991 29.819486999999999,-102.181894 29.846033999999996,-102.182859740836193 29.846584944255238,-102.18326563789924 29.846816503951921,-102.184058205433814 29.847268654791659,-102.186149999999998 29.848461999999998,-102.187393471220204 29.848699156882201,-102.188384798592551 29.848888224473839,-102.188671999999997 29.848942999999998,-102.189026115519184 29.848805138880103,-102.189342793483831 29.848681852617602,-102.205381000000003 29.842438,-102.216284162639099 29.842976962035557,-102.227553 29.843533999999995,-102.261388999999994 29.853283,-102.264041000000006 29.855964,-102.261776999999995 29.864001999999999,-102.264954000000003 29.867805999999998,-102.268816999999984 29.867990999999996,-102.276754999999994 29.862977999999998,-102.281249000000003 29.863116999999999,-102.297330999999986 29.875194,-102.301381000000006 29.877673999999995,-102.315388999999996 29.879919999999998,-102.320618999999994 29.878979999999995,-102.320667125014978 29.878900015386019,-102.320698585434869 29.878847727619664,-102.324634000000003 29.872306999999996,-102.333383999999995 29.868046,-102.341032999999996 29.869305000000004,-102.349861000000004 29.862316999999997,-102.361383773688715 29.849029038788231,-102.364542 29.845386999999995,-102.363642671554629 29.839963091609825,-102.362514000000004 29.833155999999995,-102.369522000000003 29.820395,-102.377253999999994 29.800163,-102.377312999999987 29.789971,-102.385270832882995 29.770348713937391,-102.386677616883858 29.766879890389689,-102.391739211722737 29.765814289574276,-102.392906191083 29.765568609270456,-102.402175111261812 29.766775086101941,-102.412062000000006 29.768061999999997,-102.433301 29.776608,-102.460890018677347 29.77909171043791,-102.468946430597143 29.779816991558327,-102.469957868267898 29.780012383523857,-102.481595292961757 29.782260529257879,-102.490330613701886 29.783948039559665,-102.492674483475767 29.783853017496881,-102.508312776666344 29.783219030534834,-102.508509848222559 29.783087649355906,-102.512686811979108 29.780303003853621,-102.512942156326147 29.774953626291172,-102.513380999999995 29.76576,-102.526400256170959 29.758693706517125,-102.535832205630967 29.753574449155192,-102.539417050278132 29.751628749336795,-102.545492105079163 29.750899740311965,-102.551081152293932 29.752357753652575,-102.556670813570321 29.757783010503054,-102.559343229460382 29.760376824671383,-102.565661280990938 29.761591836573395,-102.572255912443325 29.757095496286663,-102.57574472309652 29.754716761401177,-102.57635337725236 29.754301769870359,-102.585948674897452 29.751239442391949,-102.587774480184081 29.750656738873374,-102.597160000000002 29.751608,-102.612879000000007 29.748181999999996,-102.622534000000002 29.736632,-102.630150999999984 29.734314999999999,-102.64566499999998 29.733910000000002,-102.661251958261417 29.736122779697027,-102.66726872436665 29.739732837494621,-102.670971460158171 29.741954477821469,-102.677191937153026 29.738261067251376,-102.678467215476147 29.736427653943998,-102.6852530581628 29.72667193704833,-102.688163999999986 29.722486999999997,-102.690237999999979 29.707481999999999,-102.695507594622001 29.699754690880447,-102.698346999999984 29.695590999999997,-102.699316999999994 29.685029,-102.693466 29.676507,-102.697798916570122 29.672550546488289,-102.711337549653422 29.6601882100483,-102.724231000000003 29.648415000000004,-102.736947999999984 29.641537999999997,-102.742030999999997 29.632142000000002,-102.74048425929719 29.62775763619268,-102.738427999999999 29.621928999999998,-102.739991000000003 29.599041,-102.746201999999997 29.592875000000003,-102.757065999999995 29.597798999999998,-102.761810999999994 29.598396999999999,-102.768340999999992 29.594733999999999,-102.766929734823805 29.591197739636346,-102.762241000000003 29.579448999999997,-102.766124000000005 29.572347999999998,-102.768792219428661 29.572598581791439,-102.773961 29.573084,-102.776343296957975 29.562015327831393,-102.777530999999996 29.556497,-102.77572499999998 29.552188999999995,-102.771428999999998 29.548545999999998,-102.79216136048494 29.533953841063816,-102.807296321997939 29.523301326891541,-102.808565712504773 29.522407885546979,-102.808691999999979 29.522319000000003,-102.808681334358837 29.522097795383676,-102.808577631171161 29.519946998869006,-102.807327 29.494009000000002,-102.813953999999995 29.482805999999997,-102.814096473430837 29.482483316434472,-102.814383778328263 29.481832608662831,-102.822314986984821 29.463869465126457,-102.82537225240516 29.456945161410285,-102.827007089548758 29.453242470491304,-102.830969999999979 29.444267,-102.832538999999997 29.433109000000002,-102.830570753051859 29.427471931628293,-102.827354999999983 29.418261999999995,-102.825211066354328 29.40389180477127,-102.824564449740322 29.399557712155943,-102.831802092379931 29.389471209449322,-102.832669213065941 29.388262775214326,-102.84047188579207 29.377388836904565,-102.840778422425643 29.376961642203423,-102.841560439245441 29.370344567434586,-102.842457529677418 29.362753791491347,-102.843015380341285 29.358033509958585,-102.843020777220957 29.357987843989019,-102.861629999999991 29.351638999999995,-102.871857000000006 29.352092999999996,-102.876866000000007 29.354058999999996,-102.879534000000007 29.353326999999997,-102.883721999999992 29.348058999999999,-102.881857488401977 29.34363024944906,-102.879805000000005 29.338754999999999,-102.890489000000002 29.309498999999995,-102.88922161316745 29.299205074185686,-102.888328 29.291947,-102.891022000000007 29.287113000000002,-102.902604999999994 29.279440999999998,-102.90311226801488 29.27677066200776,-102.906295999999998 29.260010999999995,-102.903188999999983 29.254028999999999,-102.887901999999997 29.245611999999998,-102.881135 29.246022,-102.871347 29.241624999999999,-102.870795537867835 29.239589944231255,-102.86823682221636 29.230147538772215,-102.866845999999995 29.225014999999999,-102.878020000000006 29.214697999999999,-102.890063999999995 29.208813999999997,-102.899231 29.208863,-102.908656596973657 29.219194069767902,-102.908787000000004 29.219336999999996,-102.909098471667448 29.219296482603067,-102.910575587951939 29.219104333804097,-102.912131000000002 29.218902,-102.912650757516516 29.218481184275788,-102.915803535402844 29.215928573746115,-102.915865999999994 29.215877999999996,-102.915845750043147 29.215583596781208,-102.915608148145267 29.212129230727648,-102.915554 29.211341999999998,-102.915202931298523 29.21076702044931,-102.914525807203304 29.209658028088604,-102.912447999999998 29.206254999999999,-102.91453363655873 29.20019781620671,-102.917367531146525 29.191967513425833,-102.917805 29.190697,-102.922897000000006 29.192704085059273,-102.925481999999988 29.193722999999995,-102.932612000000006 29.194113000000005,-102.944911000000005 29.188819999999996,-102.947155999999993 29.180776999999999,-102.95089 29.176834999999997,-102.953474999999997 29.176307999999995,-102.977266 29.186226,-102.981742305424802 29.185103060319207,-102.989431999999994 29.183174,-102.98978258837333 29.182935350109393,-102.991725524817895 29.181612768970929,-102.994653 29.17962,-102.994906329461855 29.17910907354543,-102.99809599999999 29.172675999999996,-102.995688 29.161218999999999,-103.00243399999998 29.150260999999997,-103.0050672680876 29.149386797638936,-103.008362000000005 29.148292999999995,-103.010324999999995 29.137821999999996,-103.015028 29.125769999999996,-103.016945338084582 29.124525732477775,-103.024896087692937 29.119366048020158,-103.032982999999987 29.114118,-103.033302941039096 29.107355634443419,-103.034095953658579 29.105913798143234,-103.035682683422891 29.103028844591982,-103.04044215980575 29.099351067768175,-103.049126083320303 29.097714968852063,-103.055369601981923 29.096538655622457,-103.061557539334615 29.093936906572154,-103.06671291432167 29.091769303506382,-103.074407490743866 29.088534080562461,-103.076354546596249 29.085721668416742,-103.076667707631657 29.079576983004682,-103.076847 29.076059,-103.091926967746744 29.064237268591206,-103.100265999999991 29.057699999999997,-103.101359249603803 29.049403674773888,-103.102531654124817 29.040506667933872,-103.100975335951205 29.030701853789079,-103.100368259199087 29.026877266486249,-103.101607999999999 29.018122999999999,-103.107810999999998 29.013812,-103.117237999999986 29.000208999999998,-103.113922000000002 28.988546999999997,-103.115062910480361 28.985887850893185,-103.115327999999991 28.98527,-103.115773294260094 28.985147329619764,-103.126748000000006 28.982123999999995,-103.134930999999995 28.983525,-103.143274000000005 28.978073999999999,-103.156645999999995 28.972830999999999,-103.163865 28.972099,-103.165923000000006 28.974001999999999,-103.166234999999986 28.978836000000005,-103.174329720990258 28.980505274886987,-103.182663652045193 28.982223879127538,-103.194928465619142 28.984753100989199,-103.195705106971403 28.984913258196226,-103.207825367468075 28.987412670652219,-103.227338454203803 28.991436614861634,-103.227579101883322 28.991486240676846,-103.227800999999999 28.991532000000003,-103.228011662384262 28.991347921912006,-103.228737472224623 28.990713704806197,-103.239108999999985 28.981650999999996,-103.245121150470112 28.980239630911282,-103.2474464632202 28.980649978816817,-103.249155161185584 28.980951512720708,-103.25190330878641 28.984768118238364,-103.253285000000005 28.986686999999996,-103.26030800838916 28.989731411362609,-103.266003072061508 28.990206003834011,-103.270357000000004 28.988113999999996,-103.270725571428585 28.987466542857135,-103.27232562100086 28.984655789108508,-103.273357000000004 28.982844,-103.273647076585334 28.982817854078331,-103.281189929980513 28.982137982403092,-103.282424051550748 28.983865752282551,-103.284749352823042 28.987121173462914,-103.285935817906974 28.994002716014545,-103.289257951411443 28.999697788883793,-103.296614077237592 29.004443676810233,-103.302399476821606 29.006455988366771,-103.312987409437454 29.010138745081029,-103.315449022736544 29.011725838031147,-103.323993942362023 29.017235063099889,-103.331021803791103 29.021766184756,-103.332920159881368 29.026986669752301,-103.332783823258595 29.028827200289001,-103.332445567409962 29.033393619832523,-103.334818511373186 29.039800579109659,-103.341462759988346 29.041224342728523,-103.347869719265475 29.037427630547988,-103.350815999999995 29.028566999999999,-103.355428000000003 29.021529,-103.355590463621823 29.021464336016578,-103.361777791205157 29.019001647792766,-103.361998 29.018913999999999,-103.382125000000002 29.024248999999998,-103.386095607142025 29.025822707722725,-103.399799910010643 29.031254261761571,-103.402689272115182 29.032399429564627,-103.427474921518822 29.04222295692054,-103.427754276336316 29.042333676218103,-103.430481680804888 29.047455485683194,-103.434668000000002 29.055316999999995,-103.439550459717495 29.058547821156772,-103.449722032594721 29.065278554178825,-103.453029264571228 29.067467015663059,-103.457386392383299 29.068596640465525,-103.460381908910477 29.067681344107211,-103.463195887793432 29.066821517562918,-103.469166763983068 29.069242141692889,-103.471264639062966 29.073115142802621,-103.471299587628792 29.074897490538035,-103.471426016715213 29.08134526859719,-103.474814887995407 29.086670637304994,-103.484429000000006 29.094524,-103.49531945696836 29.1087608679228,-103.500928937954981 29.116094025764934,-103.503236 29.119109999999996,-103.506163032831353 29.119368513261239,-103.513192088151087 29.119989313955617,-103.524613000000002 29.120998,-103.524225442342612 29.124905426308125,-103.523383999999993 29.133389,-103.525026999999994 29.137353999999998,-103.539240927934515 29.144791265038371,-103.551909954693073 29.151420179312847,-103.558678999999984 29.154961999999998,-103.579462000000007 29.149964999999998,-103.592359999999999 29.150259999999999,-103.598960126757959 29.155019048637598,-103.606437999999997 29.160411,-103.607894091053709 29.162314354517299,-103.610539999999986 29.165772999999998,-103.624537921955991 29.163185608071569,-103.629433693714475 29.1622806680118,-103.638195234739996 29.160661174732635,-103.645634999999999 29.159286000000002,-103.653180000000006 29.162863999999995,-103.656807999999984 29.169098999999999,-103.660202999999996 29.170933999999999,-103.667724667668963 29.172878689431396,-103.669696386484915 29.173388467437,-103.688670000000002 29.178293999999998,-103.688830238367032 29.178273608722382,-103.690116124218548 29.178109972160996,-103.697314000000006 29.177194,-103.699305464408098 29.178139630948273,-103.713769999999997 29.185008,-103.724743000000004 29.191469999999999,-103.73193762439729 29.198544108660482,-103.742175000000003 29.20861,-103.750912464183997 29.219357091602017,-103.755265634411842 29.22471149629115,-103.75594348727293 29.225545256136954,-103.768569999999997 29.227360999999995,-103.777623396259372 29.232265264832392,-103.780085146052983 29.242351446713872,-103.780352362214714 29.243446273985068,-103.781659908552058 29.248803500057083,-103.789034484601103 29.257501704713096,-103.792700821322356 29.259284649416337,-103.795120675584712 29.260461427946989,-103.80876361213285 29.267096007175422,-103.816641821688407 29.27092719156084,-103.818617217853202 29.271599921312173,-103.838302999999982 29.278303999999999,-103.854966933859771 29.281484400071786,-103.856892999999999 29.281852,-103.880606 29.284961999999997,-103.896615144488038 29.284634799403065,-103.910231251371073 29.284356508561018,-103.916269383748329 29.284233099060927,-103.91710599999999 29.284215999999997,-103.91776286712728 29.284516760669142,-103.918698764585329 29.284945281345607,-103.918909999999997 29.285042,-103.918905327188597 29.285488562070029,-103.918900778480648 29.285923264066316,-103.918857000000003 29.290106999999995,-103.924975999999987 29.293913000000003,-103.943697999999983 29.294945999999996,-103.965795999999983 29.298586999999998,-103.975234999999998 29.296016999999999,-103.983459597310627 29.299165977024781,-103.998789342279238 29.305035323921498,-104.012357062242771 29.310230038851625,-104.018558084893087 29.312604243583909,-104.038281999999995 29.320155999999997,-104.047006656168747 29.325575022319434,-104.055595999999994 29.330909999999996,-104.056467149578211 29.334496091467582,-104.057243999999997 29.337694000000003,-104.068917843404819 29.342306667996301,-104.075923999999986 29.345075,-104.082149999999999 29.345922999999996,-104.091021999999995 29.353691999999995,-104.093326000000005 29.359926000000002,-104.098377999999983 29.366755999999999,-104.106466999999981 29.373127,-104.122882935723638 29.379859019095424,-104.125474999999994 29.380922000000002,-104.132831527553293 29.381873417846823,-104.136236243923818 29.382313748953422,-104.143691999999987 29.383277999999997,-104.1467332019064 29.385415391432094,-104.148888696362661 29.386930297552944,-104.151718842950046 29.388919356896473,-104.157422367906094 29.392927859373117,-104.166562999999996 29.399352,-104.180069999999986 29.412763999999999,-104.181273000000004 29.426265,-104.182051945448123 29.427144615030393,-104.195989999999995 29.442884000000003,-104.208194000000006 29.448201,-104.212529153241931 29.452438774515159,-104.213947876032222 29.456222068892099,-104.21370324326665 29.462011765001886,-104.213238514637069 29.473010445135856,-104.218538498245692 29.476600759818915,-104.220568643482977 29.477976020723915,-104.227547514371139 29.480496161448666,-104.229081071868791 29.481049944541308,-104.233824999999996 29.486544999999996,-104.233486999999997 29.492733999999995,-104.235847000000007 29.496744,-104.238313284768751 29.498023301020304,-104.246870092866089 29.50246185307569,-104.254473621536903 29.506405923975272,-104.260293266516271 29.50942466611497,-104.26168489846043 29.511073814728768,-104.264155000000002 29.514001,-104.271046277211582 29.51559593462645,-104.274575430964404 29.516412730896519,-104.293481117436073 29.520788310787555,-104.306646311930564 29.523835296697214,-104.308812834933008 29.524336722260216,-104.311570786550874 29.52540915148019,-104.318073989469781 29.527937921306467,-104.320711000000003 29.526326414398167,-104.326090351466348 29.523039031981277,-104.327483437129615 29.522187701603762,-104.334811000000002 29.519462999999998,-104.338113000000007 29.519967,-104.353150868059984 29.530471948300562,-104.369085650105362 29.541603450512167,-104.37074044290263 29.542759433043344,-104.371174999999994 29.543062999999997,-104.371454921502831 29.543072731712495,-104.371996954766473 29.543091575966443,-104.375901661123379 29.543227326450971,-104.381040999999996 29.543405999999997,-104.394588999999982 29.556087000000002,-104.394583075653415 29.556197720561212,-104.394577025204526 29.556310797858156,-104.394552364240909 29.55677168847231,-104.394503136758885 29.55769170460702,-104.394351 29.560534999999998,-104.39571704642303 29.563607040276512,-104.39636925661604 29.56507376640522,-104.397848504811165 29.56840038104859,-104.399550133070164 29.572227096202102,-104.399591 29.572319,-104.399981791506633 29.572551361916329,-104.452301000000006 29.60366,-104.466520000000003 29.609296,-104.483502 29.627740999999997,-104.486693164979016 29.629712817604439,-104.493658999999994 29.634016999999997,-104.503232654335022 29.63787621670291,-104.507568060311556 29.63962385355849,-104.51068846437596 29.64315687341222,-104.513969549435132 29.646871821353749,-104.51818442992635 29.651644041921735,-104.53325150001281 29.668703453669117,-104.535568725458901 29.671327089370656,-104.539761023554547 29.676073741438437,-104.540155514025756 29.678572204873163,-104.540559188867974 29.681128836544634,-104.537934834631798 29.684482179324355,-104.535770155740693 29.687248158943191,-104.536302269386866 29.690440851131939,-104.537991394981006 29.693268523024599,-104.544269904764263 29.703779029587054,-104.545505621253113 29.70584767433138,-104.552240999999995 29.717122999999997,-104.555600999999996 29.731220999999998,-104.554914970831931 29.738152096413199,-104.554660236582549 29.740725729903364,-104.557361904757329 29.745049367744027,-104.565950999999998 29.758794999999996,-104.565687999999994 29.770461999999998,-104.571279565966023 29.778773775962186,-104.586447318468245 29.801320404476364,-104.592472 29.810276000000002,-104.594023000000007 29.809220999999997,-104.599148999999997 29.811007,-104.610166000000007 29.819117999999996,-104.610205623651026 29.819231101342197,-104.610356932717465 29.819662996386217,-104.613081011852316 29.827438579869643,-104.615248982559379 29.833626813172685,-104.619039 29.844444999999997,-104.624350000000007 29.845221999999996,-104.629290740007292 29.852171499068138,-104.629713747950376 29.852766489555783,-104.630103000000005 29.853313999999997,-104.630111961493199 29.853664893019587,-104.630290851730521 29.860669455113747,-104.630338938536084 29.862552324858758,-104.630359999999996 29.863376999999996,-104.630588419131911 29.86393398222631,-104.633274999999998 29.870484999999999,-104.63616345635748 29.872800876528242,-104.645854762904364 29.880571071602066,-104.65678299999999 29.889332999999997,-104.658422170930251 29.891285606400047,-104.65864999999998 29.891556999999999,-104.658665881124946 29.891956296855856,-104.659041999999999 29.901413000000002,-104.661965712024596 29.903547518850328,-104.666224133352003 29.906656470935726,-104.672326999999996 29.911111999999996,-104.679772 29.924658999999998,-104.680850906343153 29.932111041680564,-104.684321999999995 29.956085999999999,-104.679660999999982 29.975271999999997,-104.680379178583593 29.977083,-104.685479 29.989943,-104.689640999999995 30.014949999999999,-104.693591999999995 30.019077000000003,-104.701242868742796 30.021046973658397,-104.702310999999995 30.021321999999998,-104.702447580064685 30.021555813412469,-104.7030116881661 30.022521518330599,-104.703997999999999 30.02421,-104.703882705803636 30.024660825787098,-104.703121214098445 30.027638426639932,-104.701101999999992 30.035533999999998,-104.706873999999999 30.050685,-104.706630611705322 30.051708605996314,-104.703831250551389 30.063481739403372,-104.703581999999997 30.06453,-104.699792220462342 30.065066336345112,-104.698848962238912 30.065199827927678,-104.698233000000002 30.065286999999998,-104.697787990647399 30.065651654776563,-104.69277799999999 30.069756999999996,-104.687313590037505 30.080921966773531,-104.685080632167896 30.08548438075637,-104.685002999999995 30.085643,-104.685554782105299 30.093963293324606,-104.685687 30.095957000000002,-104.686861171517634 30.098036494960315,-104.692093999999983 30.107303999999996,-104.693655813605488 30.119154117533654,-104.695366000000007 30.13213,-104.692122999999995 30.138662999999998,-104.690080458880587 30.149079251722458,-104.687506999999997 30.162202999999998,-104.687296000000003 30.179464000000003,-104.702787999999998 30.211735999999995,-104.707897632633845 30.218501061672534,-104.711235999999985 30.222920999999999,-104.713166 30.237956999999998,-104.722357186598074 30.248308653999679,-104.724410584274111 30.250621311025988,-104.72532436157617 30.251650460675243,-104.73347160041142 30.260826359409911,-104.733822000000004 30.261220999999999,-104.734059376092361 30.261231667834558,-104.737359999999995 30.261379999999996,-104.740448 30.259454000000002,-104.749663999999996 30.26126,-104.751566999999994 30.263643999999999,-104.754655151309422 30.272796681105522,-104.757893999999993 30.282395999999999,-104.761634 30.301147999999998,-104.779356000000007 30.313188,-104.790279572675416 30.323632238875831,-104.797291 30.330335999999999,-104.809794338457337 30.334925849121163,-104.810755485390246 30.338091979227556,-104.81211787963197 30.342579864771171,-104.813478341684558 30.347061385458392,-104.814379749150064 30.356375955470707,-104.814778573671205 30.360497153782266,-104.817595751374526 30.365914799658352,-104.824313633436745 30.370465624210016,-104.837492999999995 30.373909,-104.849824017938076 30.383147747051474,-104.859521 30.390413000000002,-104.857439999999997 30.408957,-104.852419999999995 30.418792,-104.861074000000002 30.428896999999996,-104.86474141169117 30.441297336779865,-104.865463293164552 30.443738179024677,-104.868454614768496 30.453852504447951,-104.869872 30.458644999999997,-104.86871099999999 30.463229999999996,-104.866118999999983 30.46479,-104.866094000000004 30.467379999999999,-104.870137228360662 30.483875070981508,-104.873288503237063 30.496731258693877,-104.873335488188886 30.496922942181985,-104.876786999999979 30.511004000000003,-104.878566789651714 30.514416830422793,-104.880108146577356 30.517372454871531,-104.88208573587417 30.521164575423189,-104.889375999999999 30.535143999999995,-104.890392881954469 30.540947215529823,-104.892228000000003 30.551419999999997,-104.895440150997459 30.560421421221292,-104.899000999999998 30.570399999999996,-104.909330873116318 30.584188648619556,-104.909747767935556 30.584745133303247,-104.918689620637082 30.596681007395873,-104.924796 30.604831999999998,-104.927016167130404 30.604700501077968,-104.934922481779466 30.604232215677584,-104.939873000000006 30.603939,-104.953391370086464 30.606003357240429,-104.967167000000003 30.608106999999997,-104.971627504383378 30.61006529240159,-104.972071 30.61026,-104.972794851616513 30.611297344530712,-104.980135850742045 30.621817657146149,-104.980290999999994 30.622039999999995,-104.982191641583043 30.62882153037463,-104.983981 30.635206,-104.985513855292751 30.652294791670293,-104.9863 30.661059000000002,-105.001239999999996 30.672583000000003,-105.002056999999994 30.680971999999997,-105.006614566555172 30.685839873047019,-105.006800999999996 30.686039,-105.007528432885024 30.6859080282745,-105.007959930235828 30.685830338698263,-105.020141999999993 30.683637,-105.035888798004834 30.686138071331488,-105.042930223005172 30.687256464175281,-105.044973600167665 30.685364445024991,-105.049769587265445 30.680923708581364,-105.049884734287517 30.6808170907847,-105.050688284649809 30.681171184306308,-105.054688384336032 30.682933873306403,-105.062333999999993 30.686302999999995,-105.062477471553692 30.692159292631892,-105.062625999999995 30.698222,-105.084504902225902 30.710918832086001,-105.098281999999998 30.718914000000002,-105.108075999999997 30.730049999999995,-105.110705999999993 30.737749999999995,-105.110681999999983 30.743366000000002,-105.113815999999986 30.746001,-105.119547104826722 30.748125675649064,-105.123265000000004 30.749504000000005,-105.140207000000004 30.752502,-105.152361999999982 30.751451999999997,-105.157640215066564 30.754007791997694,-105.16015278062757 30.757058756266805,-105.160271207191187 30.758203550015399,-105.161229588477383 30.767467931854636,-105.164076390339474 30.771453450048199,-105.164818961888187 30.77249304906519,-105.164868027003308 30.772491740665838,-105.170370203038615 30.772345016388588,-105.178279098267282 30.772134113115257,-105.183436 30.776644999999995,-105.185930999999997 30.784391999999997,-105.195143999999999 30.792138,-105.195988495740664 30.791702299374609,-105.203522176185984 30.787815448176353,-105.206160999999994 30.786453999999996,-105.212916518294108 30.785414778041517,-105.215967484302155 30.786491589369188,-105.216685356202021 30.789542555377231,-105.215888956387687 30.792967070566242,-105.214890669496626 30.797259699168034,-105.218659510882389 30.801566944478708,-105.222008841883465 30.801829013843189,-105.231580057313238 30.802577916338681,-105.238364256021057 30.803108747911697,-105.249792715464977 30.799033957074698,-105.255416052233826 30.797028969328842,-105.261224946310648 30.798054073736733,-105.261360733612406 30.798078036329223,-105.27276013440985 30.808707209360072,-105.27887297001547 30.814407016614517,-105.283004544196217 30.818259431108679,-105.287237620233441 30.822206489243744,-105.289317685342255 30.822206489243744,-105.295630129130572 30.822206489243744,-105.300778681061615 30.818848737795758,-105.303672944509898 30.816961174571279,-105.314862960890409 30.816961174571279,-105.316949659843416 30.82296045428,-105.31766045482081 30.825003996727105,-105.320108268786385 30.827451797139727,-105.322675464925993 30.828439452154051,-105.330102631610075 30.831296841312803,-105.347695000000002 30.838065,-105.353219571709047 30.842032277683753,-105.358103536812379 30.84553952616983,-105.359771122039604 30.846737044096301,-105.360672052753856 30.84738401593513,-105.36720323988537 30.847875849249167,-105.377416999999994 30.848644999999998,-105.387780492422849 30.851314552204784,-105.394242074789418 30.852979003795937,-105.396689881978517 30.855426817761515,-105.396237319899697 30.858492407966825,-105.394628539050657 30.86939005724841,-105.394248999999988 30.871960999999999,-105.395681745186749 30.87649980844607,-105.399608999999998 30.888940999999996,-105.399828021807267 30.889112280223049,-105.402824820246408 30.891455847338634,-105.413505 30.899808,-105.430088999999995 30.905791999999998,-105.44547819369545 30.915748838601054,-105.448693870984556 30.917829388134351,-105.452149246331331 30.920065022782566,-105.4597280766598 30.924968540917344,-105.469954295993247 30.931584924947412,-105.472488639470896 30.933224650164071,-105.476269681741059 30.935670991952524,-105.488027000000002 30.943277999999999,-105.495516502166126 30.9493992090351,-105.4968561000139 30.950494069316512,-105.497422439936116 30.953962910943051,-105.497963910074574 30.957279424722472,-105.502256687477072 30.962680017552614,-105.507558525965123 30.966493977230062,-105.533087999999992 30.984859,-105.541468808393844 30.984769556162778,-105.543675999999991 30.984745999999998,-105.557430349577899 30.990228688381027,-105.570063935625512 31.008532833135739,-105.575218046011173 31.016000355201566,-105.578084306850855 31.020153131231776,-105.578407858220658 31.020621907958049,-105.57911399999999 31.021644999999999,-105.580554486932016 31.024917232759986,-105.581339666024604 31.026700857930102,-105.581404000000006 31.026847000000004,-105.581361569643192 31.027041810483581,-105.581235244876609 31.027621805343596,-105.579823718925667 31.034102543987302,-105.579541999999989 31.035395999999995,-105.579765234089464 31.036249085539566,-105.579847333127134 31.036562825712579,-105.585323000000002 31.057487999999996,-105.592709163135751 31.0626132919136,-105.595921000000004 31.064841999999999,-105.598772999999994 31.074925999999998,-105.60333 31.082624999999997,-105.627348999999995 31.098545,-105.641890000000004 31.098321999999996,-105.646730999999988 31.113907999999999,-105.647031366805422 31.114192798578223,-105.648833999999994 31.115902000000002,-105.662869191777489 31.12063916934996,-105.673930643060629 31.124372639388369,-105.709491 31.136374999999997,-105.717005999999998 31.141438,-105.717653520299876 31.143411480377267,-105.719539999999995 31.149160999999996,-105.742677999999998 31.164897,-105.763531 31.164121000000005,-105.773256999999987 31.166896999999999,-105.774148788612138 31.168976038235485,-105.780021000000005 31.182666,-105.779878030009812 31.18682806893737,-105.779724999999999 31.191282999999995,-105.782894999999996 31.197562999999999,-105.790659746923424 31.200723362140888,-105.794386000000003 31.20224,-105.818835000000007 31.230680999999997,-105.825806058218902 31.23733997673531,-105.835722000000004 31.246811999999995,-105.851073632158958 31.265902599748792,-105.86604427072389 31.284519412988434,-105.869353000000004 31.288633999999998,-105.869862116496506 31.288859823963843,-105.876014999999981 31.291588999999995,-105.890871999999987 31.290013999999996,-105.895034999999993 31.290977999999999,-105.903460999999993 31.306768999999999,-105.908770999999987 31.312773999999997,-105.914613899052299 31.312859252963214,-105.93196564998388 31.313112430054005,-105.932552999999999 31.313120999999995,-105.933375187723101 31.313903465142818,-105.938451999999984 31.318735,-105.948091000000005 31.340069,-105.945903 31.352809999999998,-105.953942999999995 31.364749,-105.970101 31.365936999999995,-105.997579969562565 31.386863626037869,-106.00418474278807 31.391893495117941,-106.004925999999998 31.392457999999998,-106.006143777923754 31.392558937255828,-106.022866323827969 31.393945009265412,-106.080091217088636 31.398688175961098,-106.080258 31.398702,-106.080335505244278 31.398768097394733,-106.096409750603954 31.412476405141465,-106.100621535494 31.416068265421309,-106.102641400977276 31.417790830744398,-106.10264993125142 31.41779810546371,-106.106876999999997 31.421403000000005,-106.112168999999994 31.423577999999996,-106.132782000000006 31.425367000000005,-106.143572676566535 31.431101721097118,-106.158218000000005 31.438885000000003,-106.175305198785026 31.455910533348611,-106.175674999999998 31.456278999999995,-106.17677981450808 31.456634312625521,-106.182946895641223 31.45861766980741,-106.20560859826729 31.465905761156737,-106.205826999999999 31.465975999999998,-106.205998876707866 31.466165148890862,-106.212686244283063 31.473524541419071,-106.218538531147885 31.479964934554566,-106.218843000000007 31.480299999999996,-106.218893022078106 31.480498686193428,-106.223908999999992 31.500422,-106.236804000000006 31.513376,-106.242649095206133 31.530650094003715,-106.245874455325477 31.540182047193959,-106.246202999999994 31.541153,-106.246406806009631 31.541315626597875,-106.254779999999997 31.547997000000002,-106.280345588488331 31.561810530102129,-106.280548572587122 31.561920205925162,-106.280811 31.562061999999997,-106.287785 31.584444999999999,-106.292254713772053 31.594651759250389,-106.295141086978958 31.601242900860864,-106.303535999999994 31.620412999999996,-106.308594276522342 31.627497440426588,-106.330970256390501 31.658836434185069,-106.33473699999999 31.664111999999999,-106.338265602146336 31.671883697950737,-106.346992532059133 31.691104641686092,-106.349537999999995 31.696711,-106.357472918704602 31.702103016258707,-106.368303742040567 31.709462886938788,-106.370138999999995 31.710709999999999,-106.373839000000004 31.714809999999996,-106.378039 31.72831,-106.381039 31.732109999999999,-106.38595139194058 31.734759025425479,-106.394642915450532 31.739445961452269,-106.404086535473255 31.744538468290354,-106.417940000000002 31.752009,-106.421739999999616 31.752623660686648,-106.431540999999996 31.754208999999996,-106.434644983693715 31.755853956158482,-106.444263765046571 31.76095142933643,-106.451540999999992 31.764807999999999,-106.467641999999998 31.759607999999997,-106.470742 31.753508,-106.472156160715315 31.752506597443457,-106.47367184987327 31.751433300058491,-106.475016438009845 31.750481163584279,-106.475542000000004 31.750108999999998,-106.48261401078824 31.748321568701869,-106.484641999999994 31.747809000000004,-106.486162292248409 31.747994847970777,-106.488078402545341 31.748229082678503,-106.489542 31.748407999999998,-106.507341999999994 31.761208,-106.509102011460428 31.762827435120251,-106.511609062807707 31.765134242258316,-106.523643000000007 31.776206999999996,-106.528643000000002 31.781807,-106.528542999999999 31.783906999999996,-106.528542999999999 31.784407000000002,-106.527996999999999 31.786944999999999,-106.527623000000006 31.789119000000003,-106.527737999999985 31.789760999999995,-106.527942999999993 31.790507000000002,-106.530514999999994 31.792103,-106.532480000000007 31.791913999999998,-106.533 31.791829,-106.533043000000006 31.791906999999995,-106.534743000000006 31.796106999999999,-106.535154000000006 31.797088999999996,-106.535342999999997 31.797507,-106.535842999999986 31.798607,-106.542096999999998 31.802145999999997,-106.542143999999993 31.802106999999996,-106.544713999999999 31.804286999999999,-106.545344 31.805007,-106.546561898485905 31.806561850400339,-106.546615562760394 31.806630361790774,-106.547143999999989 31.807304999999996,-106.551861034152338 31.808599471053657,-106.558443999999994 31.810406,-106.560680020141419 31.810752754512048,-106.560847305685968 31.810778696593822,-106.562944999999999 31.811104,-106.56344399999999 31.812605999999995,-106.566844000000003 31.813305999999997,-106.569123704016391 31.811582321353455,-106.570943999999997 31.810205999999997,-106.577243999999993 31.810406,-106.581344 31.813905999999996,-106.582144 31.815505999999999,-106.588044999999994 31.822105999999998,-106.589044999999984 31.822705999999997,-106.593826000000007 31.824901,-106.602727000000002 31.825023999999996,-106.605266999999998 31.827911999999998,-106.603310537982878 31.834798487166189,-106.601945 31.839604999999999,-106.60204499999999 31.844404999999998,-106.605244999999982 31.845904999999998,-106.605845000000002 31.846304999999997,-106.614637000000002 31.846489999999996,-106.621857000000006 31.852854,-106.625763000000006 31.856276,-106.627808000000002 31.860592999999998,-106.629708357956787 31.861913746439043,-106.635925999999998 31.866235,-106.635879999999986 31.871514,-106.634872999999999 31.874477999999996,-106.630798999999996 31.879696999999997,-106.629271361585637 31.8835303997664,-106.629197000000005 31.883717000000004,-106.629948941610351 31.885072003811555,-106.630443527558498 31.88596325099838,-106.630530381920593 31.886119763139838,-106.630691999999982 31.886410999999999,-106.633926999999986 31.889183999999997,-106.635073463799642 31.889856364267651,-106.636317332120683 31.890585853164694,-106.638154 31.891662999999998,-106.638364165758659 31.89171923904625,-106.642899999999983 31.892932999999999,-106.645296000000002 31.894859,-106.645645999999999 31.895648999999995,-106.645478999999995 31.898669999999999,-106.640839999999997 31.904598,-106.63512839833713 31.908732779117901,-106.633668 31.90979,-106.633408736085542 31.909871832166754,-106.625946999999996 31.912227,-106.62344499999999 31.914034,-106.618336531290581 31.916262323146238,-106.614677480394235 31.917858407661853,-106.614345999999998 31.918002999999995,-106.611846 31.920003,-106.616063629645311 31.921863544491501,-106.623932999999994 31.925334999999997,-106.624022586877501 31.92530240401349,-106.628663000000003 31.923614,-106.629746999999995 31.926570000000002,-106.625321999999983 31.930053000000004,-106.622529 31.934863000000004,-106.622117000000003 31.936620999999999,-106.622377 31.940863,-106.623659000000004 31.945509999999995,-106.616135999999983 31.948439,-106.614701999999994 31.956,-106.617707999999993 31.956008,-106.622819000000007 31.952891,-106.625123000000002 31.954530999999999,-106.625534999999985 31.957475999999996,-106.624298999999993 31.961054,-106.620453999999981 31.963402999999996,-106.619370999999987 31.964777000000005,-106.618745000000004 31.966954999999995,-106.619568999999998 31.971578,-106.621872999999994 31.972933,-106.623215999999999 31.972909999999999,-106.626465999999994 31.97069,-106.630114000000006 31.971257999999999,-106.638186000000005 31.976819999999996,-106.639528999999996 31.980347999999996,-106.63649199999999 31.985719,-106.631181999999995 31.989809,-106.629494617643616 31.990072722748106,-106.628337072326531 31.990253636712819,-106.62822051159516 31.990271854111079,-106.626910882874782 31.990476537349483,-106.623567999999992 31.990998999999999,-106.619448000000006 31.994733,-106.618486000000004 32.000494999999994,-106.599096000000003 32.000731000000002,-106.598639000000006 32.000753999999993,-106.595332999999997 32.000777999999997,-106.587971999999979 32.000748999999999,-106.582805114232855 32.000751357586125,-106.566056000000003 32.000759000000002,-106.565141999999994 32.000736000000003,-106.564298514026802 32.00073927393025,-106.562131862706067 32.000747683631808,-106.55942760630407 32.000758180008894,-106.517043115844388 32.000922692365819,-106.411074999999983 32.001334,-106.409326934223301 32.001349629127162,-106.409108574114072 32.001351581443814,-106.394297999999992 32.001483999999998,-106.376861000000005 32.001171999999997,-106.32356972407176 32.001457096670784,-106.313306999999995 32.001511999999998,-106.205915000000005 32.001761999999999,-106.200699 32.001784999999998,-106.18183999999998 32.002049999999997,-106.125534000000002 32.002532999999993,-106.05045734599986 32.002412317859424,-105.998002999999997 32.002327999999999,-105.900599999999997 32.002099999999992,-105.886159000000006 32.001969999999993,-105.854061000000002 32.00235,-105.750527000000005 32.002206,-105.731362000000004 32.001564000000002,-105.563520259526442 32.001015604709174,-105.429281000000003 32.000577,-105.428582000000006 32.000599999999999,-105.427048999999997 32.000638000000002,-105.390395999999981 32.000607000000002,-105.340142768272344 32.000583616714373,-105.200871148394683 32.000518812363367,-105.153993999999997 32.000497000000003,-105.150310000000005 32.000497000000003,-105.14824 32.000484999999998,-105.132915999999994 32.000518,-105.131377 32.000523999999999,-105.118039999999993 32.000484999999998,-105.078604999999996 32.000532999999997,-105.077045999999996 32.000578999999995,-104.918272000000002 32.000495999999991,-104.643525999999994 32.000442999999997,-104.640917999999999 32.000396000000002,-104.531936999999999 32.000311000000004,-104.531756 32.000117000000003,-104.024520999999993 32.000010000000003,-103.980179000000007 32.000124999999997,-103.875476000000006 32.000554,-103.748317 32.000197999999997,-103.72373965094468 32.000208021677786,-103.713395184678689 32.000212239744897,-103.713395184670219 32.000212239744904,-103.713395184654971 32.000212239744911,-103.713395184639609 32.000212239744918,-103.60161412595366 32.000257819670985,-103.326500999999993 32.00036999999999,-103.278520999999998 32.000419,-103.270382999999995 32.000326,-103.267707999999999 32.000323999999992,-103.267633000000004 32.000475000000002,-103.215641000000005 32.000512999999998,-103.133028835827503 32.000473953106116,-103.088697999999994 32.000452999999993,-103.085875999999985 32.000464999999998,-103.064422999999991 32.000518,-103.064344000000006 32.087051000000002,-103.064347999999995 32.123041,-103.064421999999993 32.145006000000002,-103.064695999999998 32.522193,-103.064761000000004 32.587983,-103.064787999999993 32.600397,-103.064761000000004 32.601863000000002,-103.064814999999996 32.624536999999997,-103.064633 32.646419999999992,-103.064864 32.682647000000003,-103.064797999999996 32.690761000000002,-103.064798999999994 32.708694,-103.064826999999994 32.726627999999998,-103.064807000000002 32.777302999999996,-103.064698000000007 32.783602000000002,-103.064711000000003 32.784593,-103.064699000000005 32.827531,-103.064672000000002 32.828470000000003,-103.064888999999994 32.849359,-103.064915999999982 32.857259999999997,-103.064807000000002 32.857695999999997,-103.064862000000005 32.868346000000003,-103.064700999999985 32.879354999999997,-103.064569000000006 32.900013999999999,-103.064656999999997 32.959097,-103.064678999999998 32.964373000000002,-103.064625000000007 32.999898999999999,-103.064452000000003 33.010289999999998,-103.06398 33.038693000000002,-103.063904999999991 33.042054999999998,-103.063382198608849 33.066417104805645,-103.0628188509327 33.092668632365545,-103.062136190569035 33.12448003074244,-103.060102999999984 33.219225000000002,-103.059719999999999 33.256262,-103.059241999999998 33.260370999999992,-103.057856 33.315233999999997,-103.057486999999995 33.32947699999999,-103.056655000000006 33.388437999999994,-103.052609999999987 33.570599,-103.051664000000002 33.629489,-103.051362999999995 33.64195,-103.051535 33.650486999999998,-103.051086999999981 33.658186,-103.050532000000004 33.672407999999997,-103.050147999999993 33.701971,-103.049608000000006 33.737766,-103.049096000000006 33.746270000000003,-103.047346000000005 33.824674999999999,-103.046907000000004 33.850299999999997,-103.045643999999996 33.901536999999998,-103.045698000000002 33.90629899999999,-103.044893000000002 33.945616999999999,-103.043949999999981 33.974629,-103.043616999999998 34.003633,-103.043531000000002 34.018014,-103.043554999999984 34.032713999999991,-103.043745999999999 34.037294000000003,-103.043771000000007 34.041538000000003,-103.043720999999991 34.042319999999997,-103.043767000000003 34.043544999999995,-103.043744000000004 34.049985999999997,-103.04368599999998 34.063077999999997,-103.043515999999983 34.079382000000003,-103.043569000000005 34.087947,-103.043571175003294 34.092846731402311,-103.043572866326429 34.096656853966635,-103.04358003846437 34.112813863799865,-103.043644 34.256903,-103.043718999999982 34.289440999999997,-103.043935999999988 34.302584999999993,-103.043978999999979 34.312763999999994,-103.043947553639484 34.376410480771497,-103.043947499824213 34.37651940122479,-103.043946000000005 34.379555000000003,-103.043943999999982 34.37966,-103.043919000000002 34.380915999999992,-103.043693000000005 34.383578,-103.043629999999993 34.384689999999999,-103.043614000000005 34.384968999999998,-103.043612999999993 34.388679000000003,-103.043612999999993 34.390442,-103.043606047260084 34.391254973944719,-103.043584999999993 34.393715999999998,-103.043610999999999 34.397105000000003,-103.043582999999998 34.400677999999999,-103.043537999999998 34.405462999999997,-103.043582 34.455657000000002,-103.043587999999986 34.459662000000002,-103.043588999999997 34.459774000000003,-103.043593999999985 34.46266,-103.043434927764125 34.510540742996007,-103.043071999999981 34.619782,-103.043277851519235 34.65183038816317,-103.0432796163159 34.65210514391012,-103.043285999999995 34.653098999999997,-103.042827000000003 34.671187999999994,-103.042768999999993 34.747360999999998,-103.042770000000004 34.792223999999997,-103.042781000000005 34.850242999999999,-103.042520999999979 34.899546,-103.0425974544018 35.032467348285799,-103.042641999999987 35.109912999999999,-103.043261 35.125058000000003,-103.042519999999996 35.135596,-103.042599999999993 35.142766000000002,-103.042710999999997 35.144734999999997,-103.042568000000003 35.159317999999999,-103.042394999999999 35.178573,-103.042338999999984 35.181922,-103.042366 35.182786,-103.042377000000002 35.183149,-103.042496999999997 35.211862000000004,-103.042775000000006 35.241236999999998,-103.042366 35.250056,-103.041554000000005 35.622487,-103.041484634909168 35.651235429903174,-103.041145999999998 35.791583000000003,-103.041916999999998 35.796441000000002,-103.041715999999994 35.814072000000003,-103.042186 35.825216999999995,-103.04130499999998 35.837693999999999,-103.040823999999986 36.055230999999992,-103.041387523024824 36.229129564686382,-103.041674 36.317534000000002,-103.041745000000006 36.318266999999999,-103.041923999999995 36.500439,-103.00243399999998 36.500397)),((-96.818513748151517 28.172441936006489,-96.816443421354066 28.174808025412563,-96.791958210781445 28.188687337716829,-96.733036581469989 28.190913261798631,-96.70383764358462 28.198245729538105,-96.697421731775194 28.2029594609741,-96.702659211994316 28.211208487181011,-96.703313894801497 28.216445964862743,-96.686815839850283 28.218410020896432,-96.662461568376486 28.227313732447904,-96.66062845144161 28.228884976259902,-96.663116248646261 28.233205895474203,-96.651855673914184 28.251275190431315,-96.607991796426646 28.277069769155677,-96.608122730450688 28.280081317680857,-96.611527096272326 28.281390688369981,-96.610479598706064 28.283092866206033,-96.592934048725994 28.296972182316367,-96.581018783574592 28.302209665072866,-96.553260151988255 28.302340591484768,-96.546975176740276 28.305614018207578,-96.542130508742858 28.315958034472228,-96.528905880514458 28.322504882843088,-96.476269225261575 28.330753906512612,-96.45099839278295 28.337038879223222,-96.434107525610045 28.344764159184386,-96.418918843885365 28.35484630740093,-96.415252604940861 28.362833452872817,-96.417216660974546 28.367154372087118,-96.412895739222876 28.36951123780511,-96.403206408302779 28.371475291301415,-96.401242352269094 28.366892498964241,-96.400558825492723 28.362187299887704,-96.398667286465624 28.349166496619617,-96.397846 28.343512999999998,-96.413700000000006 28.327342999999999,-96.439098999999999 28.319051999999999,-96.495600517783487 28.293964130304811,-96.547774000000004 28.270797999999999,-96.587113635820756 28.248878526668094,-96.611036668198281 28.235548960715661,-96.621533999999983 28.229699999999998,-96.694665999999998 28.18212,-96.758140999999995 28.136872999999998,-96.830820125734775 28.079724674840076,-96.849624000000006 28.064938999999999,-96.854049189790473 28.060788472935577,-96.855594496383262 28.059339080448503,-96.859762278796424 28.055429983997605,-96.896530613737951 28.020943786452513,-96.898080497387397 28.019490100997579,-96.929052999999996 27.990439999999996,-96.96699599999998 27.950531000000002,-97.001440999999986 27.911442,-97.031660000000002 27.869974999999997,-97.041798999999997 27.852925999999997,-97.045408776308051 27.837452569961062,-97.045409609838757 27.837448997003069,-97.04598 27.835004,-97.050599498412936 27.830109781194331,-97.058265753683145 27.821987615677948,-97.076304165860961 27.802876463727326,-97.079565315161531 27.799421374709375,-97.083535350812468 27.795215242050556,-97.085211615730273 27.793439290085495,-97.085394999999991 27.793244999999999,-97.11422230692618 27.755303327915222,-97.116276999999997 27.752599,-97.117304906633777 27.751048809529347,-97.118830196202964 27.748748513687826,-97.139140047561696 27.718119138409879,-97.139351757288111 27.717799858049549,-97.143807202733072 27.711080581371732,-97.165547551982726 27.678293865995041,-97.166583141799606 27.676732088482499,-97.166681999999994 27.676583,-97.184850261879149 27.644709535797791,-97.192144670654784 27.631912600211269,-97.198729900630283 27.620359811436909,-97.201865999999995 27.614857999999998,-97.211651066704889 27.596044174137351,-97.213608899397855 27.592279833590187,-97.221943360361436 27.576255098965802,-97.265194083077162 27.493096589152017,-97.265746568141566 27.492034321708481,-97.276090999999994 27.472145,-97.304469999999995 27.407734,-97.326522999999995 27.347611999999998,-97.347445832595042 27.277936119324231,-97.350397999999998 27.268104999999998,-97.363400999999996 27.210366,-97.370941000000002 27.161165999999998,-97.377001000000007 27.101020999999999,-97.379130000000004 27.047996,-97.378361999999996 26.992877,-97.370730999999992 26.909706,-97.365301177044699 26.875333999999995,-97.365282052674758 26.875212938438843,-97.364726000000005 26.871692999999997,-97.363633430415348 26.866515420001111,-97.352028350385282 26.811520085064032,-97.35141299999998 26.808603999999999,-97.350529648372714 26.805138580575584,-97.333027999999999 26.736478999999996,-97.304204860681779 26.646364129642233,-97.300690000000003 26.635375,-97.297812715808362 26.627503004299889,-97.297022484076606 26.625340999999999,-97.287871455917369 26.600304594305239,-97.275119000000004 26.565415000000002,-97.269391999999982 26.554046,-97.269132970349304 26.553256905349773,-97.257954534248029 26.519203490608863,-97.229844 26.433568999999999,-97.223724090442104 26.411478908273114,-97.206682644704898 26.34996703527348,-97.194643999999997 26.306512999999999,-97.185844000000003 26.267102999999995,-97.177979856301576 26.220346386353309,-97.177168840972797 26.215524458900923,-97.173264999999986 26.192314,-97.170387765328073 26.167037808112223,-97.169872392484734 26.162510314053797,-97.167099005951158 26.138146416702778,-97.161470999999992 26.088705,-97.158662630175101 26.080176913346069,-97.154270970414501 26.066840900880429,-97.161462285840642 26.067639941946975,-97.169842256221145 26.077853024187579,-97.171781452365479 26.102521767945923,-97.179531587141199 26.146202099560895,-97.178745972847352 26.177103221942961,-97.183983445454302 26.214289306886101,-97.194458400817808 26.271639686993655,-97.214884565299002 26.353606215503973,-97.226930759399721 26.385554824668418,-97.240286324189555 26.405980989149626,-97.240845398636537 26.411470089808617,-97.243166933615896 26.434263367616055,-97.247618791929028 26.456260775909261,-97.254165635225121 26.471187589585856,-97.262545605605609 26.482971915638458,-97.27642492679071 26.521729238684483,-97.292399243108349 26.528014213932472,-97.310730412457033 26.556558470596535,-97.308111681228326 26.5712234060755,-97.308635417324538 26.576722756880109,-97.317015387705027 26.597672667607057,-97.318434072834165 26.60022630157264,-97.324871601690262 26.611813856840271,-97.338489044677715 26.647428701777493,-97.33639404954522 26.666021744249065,-97.345821512417203 26.700589103038251,-97.363105189274393 26.710540307081217,-97.370437657013895 26.723895871871047,-97.370961403259614 26.736203954318924,-97.367557047587525 26.740393934434408,-97.364152671616353 26.758986971196869,-97.364646278833362 26.767121661774897,-97.368866408127118 26.774699404876429,-97.370437646864346 26.781508126370166,-97.368342661881371 26.795649318140761,-97.373056398392137 26.808481136684847,-97.387459455673451 26.820789208983193,-97.383531343606066 26.875520854055946,-97.385626348888096 26.88887641440536,-97.391649435788921 26.901970109878395,-97.389554460955466 26.945964918852653,-97.390340075249313 27.05228571820243,-97.389816329003565 27.067212531879022,-97.386411973331462 27.083186832972341,-97.387459455673422 27.090519300711819,-97.390601943297412 27.094185534581555,-97.390078197051665 27.156511519247964,-97.377508246555678 27.199458835730731,-97.379865109736301 27.202863196477598,-97.386673841379576 27.204696313412462,-97.382221972916923 27.229050589961044,-97.37488951532697 27.25026236588155,-97.373318276589728 27.276449754290233,-97.372896734486858 27.277942715507475,-97.367033301341749 27.298709035706306,-97.36467643816114 27.302637142698917,-97.359962701650375 27.304732132756659,-97.357605838469766 27.307874620380655,-97.362319574980518 27.32672953597509,-97.366771423144115 27.333276389420721,-97.36179581858525 27.359987519000377,-97.346607126710992 27.390364889744752,-97.336132171347501 27.402411088920228,-97.331156576938184 27.412362295500575,-97.329585328051422 27.418123524502818,-97.330894688591016 27.425455992242295,-97.329847196099536 27.434359703793774,-97.317277255753083 27.463689574751687,-97.293708603647858 27.497209429631152,-97.282971770086746 27.521563701104967,-97.267627232015485 27.541048841138782,-97.26651977444007 27.542455137362143,-97.266473727822444 27.542513609294531,-97.257831889393842 27.556392930479635,-97.261144559602045 27.562355746269706,-97.261759991311692 27.563463525096239,-97.260450620622564 27.56739163716362,-97.260303240478223 27.567589679048492,-97.252732825146552 27.577762415194865,-97.252070650242061 27.578652211895708,-97.247885553160842 27.581360217573209,-97.247618802078478 27.581532821322067,-97.236881968517352 27.598292751933528,-97.24107194863285 27.602482732049012,-97.241084821027414 27.602523494839662,-97.242643187370078 27.607458346757408,-97.231683715414945 27.631671123728168,-97.231553918442799 27.631957884363242,-97.231382612637987 27.632336350521356,-97.221955159915538 27.632860099304484,-97.221711030183002 27.632638163711842,-97.219074540339648 27.630241360463614,-97.217418907944051 27.630677052710489,-97.214098935780783 27.631550728615359,-97.200743370990949 27.650143776161688,-97.197339005169326 27.664546838517776,-97.19760088336696 27.678426154628117,-97.203474366386629 27.684532651921231,-97.20308902068453 27.688000774441392,-97.200450811776179 27.688974477466285,-97.190006537429824 27.692829222058965,-97.188284576858237 27.695272543577584,-97.170627865440125 27.720325976082009,-97.166176017276527 27.732372180332245,-97.161200407642937 27.734074342943998,-97.153606061705801 27.733288721037997,-97.147321086457822 27.735383711095739,-97.130823034043985 27.751619892924076,-97.127942424617643 27.75580987303956,-97.127680546420009 27.759999858229808,-97.125046985317312 27.763143140340585,-97.103326269871417 27.789067861139614,-97.102999946318647 27.791923200131116,-97.10255066693685 27.795854405604921,-97.102495980878558 27.796332909939515,-97.102278777379922 27.798233445813956,-97.100865886772965 27.802472121847156,-97.098874421707819 27.808446522979796,-97.095168997779496 27.812151946908138,-97.092851314507953 27.81446963017968,-97.092589446459854 27.819183356540908,-97.098874421707819 27.822849590410645,-97.104263831428213 27.822227735056668,-97.126109297533233 27.819707102786651,-97.130299287798252 27.820492727230029,-97.134489267913736 27.825206463740791,-97.132394272781227 27.827301438574235,-97.10670775348396 27.832389859144307,-97.087681973298601 27.836158807756469,-97.056712719518927 27.842293721800239,-97.055822986229373 27.843403727743151,-97.04322620548075 27.859119113080268,-97.013634476624247 27.906780143237341,-97.017955395838555 27.911493874673329,-97.016384146951765 27.917255079570445,-96.985744902767337 27.954048356415132,-96.977888688782102 27.976438572489602,-96.978805242174786 27.978271691961854,-96.980900237307296 27.978271691961854,-96.986006780964971 27.976176699366729,-96.986661461234775 27.980759491703903,-96.978281501003806 28.001709402430844,-96.967806540565562 28.020040576854303,-96.966759042999328 28.020367911280101,-96.965187799187319 28.013297317932185,-96.962569062883844 28.012380759464751,-96.952617853766114 28.01643980428749,-96.946987563862692 28.02652194996665,-96.932453562407773 28.035425661518129,-96.926430465357427 28.043412814602167,-96.929572952981431 28.051399967686208,-96.927085150701998 28.057292130712504,-96.906004298338829 28.076147047258459,-96.890946545563423 28.076801730065643,-96.886232814127425 28.084396073465374,-96.88832780925992 28.086622002621937,-96.889113433703315 28.099453823703399,-96.886887499471996 28.117130312782294,-96.879424092633712 28.131402425890027,-96.874972236857971 28.133235547899659,-96.87078225420511 28.13127149186597,-96.86462821551855 28.126295887307109,-96.857164811217643 28.115559058820768,-96.845380482627661 28.108881273888468,-96.830128556765757 28.111822717849165,-96.827049318353744 28.112416571196771,-96.816574357915513 28.119618104912195,-96.810420321766344 28.126034014184238,-96.810944073086844 28.136378030448888,-96.816836228500989 28.158048094801106,-96.820248352517055 28.163388807027481,-96.822859330626116 28.167475552598326,-96.818513748151517 28.172441936006489)))
\ No newline at end of file
diff --git a/webapp/django/contrib/gis/tests/geoapp/test_feeds.py b/webapp/django/contrib/gis/tests/geoapp/test_feeds.py
new file mode 100644
index 0000000..fba424c
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/geoapp/test_feeds.py
@@ -0,0 +1,76 @@
+import unittest
+from xml.dom import minidom
+
+from django.test import Client
+from models import City
+
+class GeoFeedTest(unittest.TestCase):
+    client = Client()
+
+    def assertChildNodes(self, elem, expected):
+        "Taken from regressiontests/syndication/tests.py."
+        actual = set([n.nodeName for n in elem.childNodes])
+        expected = set(expected)
+        self.assertEqual(actual, expected)
+
+    def test_geofeed_rss(self):
+        "Tests geographic feeds using GeoRSS over RSSv2."
+        # Uses `GEOSGeometry` in `item_geometry`
+        doc1 = minidom.parseString(self.client.get('/geoapp/feeds/rss1/').content)
+        # Uses a 2-tuple in `item_geometry`
+        doc2 = minidom.parseString(self.client.get('/geoapp/feeds/rss2/').content) 
+        feed1, feed2 = doc1.firstChild, doc2.firstChild
+
+        # Making sure the box got added to the second GeoRSS feed.
+        self.assertChildNodes(feed2.getElementsByTagName('channel')[0], 
+                              ['title', 'link', 'description', 'language', 'lastBuildDate', 'item', 'georss:box']
+                              )
+        
+        # Incrementing through the feeds.
+        for feed in [feed1, feed2]:
+            # Ensuring the georss namespace was added to the <rss> element.
+            self.assertEqual(feed.getAttribute(u'xmlns:georss'),  u'http://www.georss.org/georss')
+            chan = feed.getElementsByTagName('channel')[0]
+            items = chan.getElementsByTagName('item')
+            self.assertEqual(len(items), City.objects.count())
+                
+            # Ensuring the georss element was added to each item in the feed.
+            for item in items:
+                self.assertChildNodes(item, ['title', 'link', 'description', 'guid', 'georss:point'])
+
+    def test_geofeed_atom(self):
+        "Testing geographic feeds using GeoRSS over Atom."
+        doc1 = minidom.parseString(self.client.get('/geoapp/feeds/atom1/').content)
+        doc2 = minidom.parseString(self.client.get('/geoapp/feeds/atom2/').content)
+        feed1, feed2 = doc1.firstChild, doc2.firstChild
+
+        # Making sure the box got added to the second GeoRSS feed.
+        self.assertChildNodes(feed2, ['title', 'link', 'id', 'updated', 'entry', 'georss:box'])        
+
+        for feed in [feed1, feed2]:
+            # Ensuring the georsss namespace was added to the <feed> element.
+            self.assertEqual(feed.getAttribute(u'xmlns:georss'),  u'http://www.georss.org/georss')
+            entries = feed.getElementsByTagName('entry')
+            self.assertEqual(len(entries), City.objects.count())
+            
+            # Ensuring the georss element was added to each entry in the feed.
+            for entry in entries:
+                self.assertChildNodes(entry, ['title', 'link', 'id', 'summary', 'georss:point'])
+
+    def test_geofeed_w3c(self):
+        "Testing geographic feeds using W3C Geo."
+        doc = minidom.parseString(self.client.get('/geoapp/feeds/w3cgeo1/').content)
+        feed = doc.firstChild
+        # Ensuring the geo namespace was added to the <feed> element.
+        self.assertEqual(feed.getAttribute(u'xmlns:geo'), u'http://www.w3.org/2003/01/geo/wgs84_pos#')
+        chan = feed.getElementsByTagName('channel')[0]
+        items = chan.getElementsByTagName('item')
+        self.assertEqual(len(items), City.objects.count())
+
+        # Ensuring the geo:lat and geo:lon element was added to each item in the feed.
+        for item in items:
+            self.assertChildNodes(item, ['title', 'link', 'description', 'guid', 'geo:lat', 'geo:lon'])
+
+        # Boxes and Polygons aren't allowed in W3C Geo feeds.
+        self.assertRaises(ValueError, self.client.get, '/geoapp/feeds/w3cgeo2/') # Box in <channel>
+        self.assertRaises(ValueError, self.client.get, '/geoapp/feeds/w3cgeo3/') # Polygons in <entry>
diff --git a/webapp/django/contrib/gis/tests/geoapp/test_sitemaps.py b/webapp/django/contrib/gis/tests/geoapp/test_sitemaps.py
new file mode 100644
index 0000000..a83e044
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/geoapp/test_sitemaps.py
@@ -0,0 +1,83 @@
+import unittest, zipfile, cStringIO
+from xml.dom import minidom
+
+from django.test import Client
+from models import City, Country
+
+class GeoSitemapTest(unittest.TestCase):
+    client = Client()
+
+    def assertChildNodes(self, elem, expected):
+        "Taken from regressiontests/syndication/tests.py."
+        actual = set([n.nodeName for n in elem.childNodes])
+        expected = set(expected)
+        self.assertEqual(actual, expected)
+
+    def test_geositemap_index(self):
+        "Tests geographic sitemap index."
+        # Getting the geo index.
+        doc = minidom.parseString(self.client.get('/geoapp/sitemap.xml').content)
+        index = doc.firstChild
+        self.assertEqual(index.getAttribute(u'xmlns'), u'http://www.sitemaps.org/schemas/sitemap/0.9')
+        self.assertEqual(3, len(index.getElementsByTagName('sitemap')))
+
+    def test_geositemap_kml(self):
+        "Tests KML/KMZ geographic sitemaps."
+        for kml_type in ('kml', 'kmz'):
+            doc = minidom.parseString(self.client.get('/geoapp/sitemaps/%s.xml' % kml_type).content)
+
+            # Ensuring the right sitemaps namespaces are present.
+            urlset = doc.firstChild
+            self.assertEqual(urlset.getAttribute(u'xmlns'), u'http://www.sitemaps.org/schemas/sitemap/0.9')
+            self.assertEqual(urlset.getAttribute(u'xmlns:geo'), u'http://www.google.com/geo/schemas/sitemap/1.0')
+        
+            urls = urlset.getElementsByTagName('url')
+            self.assertEqual(2, len(urls)) # Should only be 2 sitemaps.
+            for url in urls:
+                self.assertChildNodes(url, ['loc', 'geo:geo'])
+                # Making sure the 'geo:format' element was properly set.
+                geo_elem = url.getElementsByTagName('geo:geo')[0]
+                geo_format = geo_elem.getElementsByTagName('geo:format')[0]
+                self.assertEqual(kml_type, geo_format.childNodes[0].data)
+
+                # Getting the relative URL since we don't have a real site.
+                kml_url = url.getElementsByTagName('loc')[0].childNodes[0].data.split('http://example.com')[1]
+                
+                if kml_type == 'kml':
+                    kml_doc = minidom.parseString(self.client.get(kml_url).content)
+                elif kml_type == 'kmz':
+                    # Have to decompress KMZ before parsing.
+                    buf = cStringIO.StringIO(self.client.get(kml_url).content)
+                    zf = zipfile.ZipFile(buf)
+                    self.assertEqual(1, len(zf.filelist))
+                    self.assertEqual('doc.kml', zf.filelist[0].filename)
+                    kml_doc = minidom.parseString(zf.read('doc.kml'))
+                
+                # Ensuring the correct number of placemarks are in the KML doc.
+                if 'city' in kml_url:
+                    model = City
+                elif 'country' in kml_url:
+                    model = Country
+                self.assertEqual(model.objects.count(), len(kml_doc.getElementsByTagName('Placemark')))
+
+    def test_geositemap_georss(self):
+        "Tests GeoRSS geographic sitemaps."
+        from feeds import feed_dict
+
+        doc = minidom.parseString(self.client.get('/geoapp/sitemaps/georss.xml').content)
+   
+        # Ensuring the right sitemaps namespaces are present.
+        urlset = doc.firstChild
+        self.assertEqual(urlset.getAttribute(u'xmlns'), u'http://www.sitemaps.org/schemas/sitemap/0.9')
+        self.assertEqual(urlset.getAttribute(u'xmlns:geo'), u'http://www.google.com/geo/schemas/sitemap/1.0')
+
+        # Making sure the correct number of feed URLs were included.
+        urls = urlset.getElementsByTagName('url')
+        self.assertEqual(len(feed_dict), len(urls))
+
+        for url in urls:
+            self.assertChildNodes(url, ['loc', 'geo:geo'])
+            # Making sure the 'geo:format' element was properly set to 'georss'.
+            geo_elem = url.getElementsByTagName('geo:geo')[0]
+            geo_format = geo_elem.getElementsByTagName('geo:format')[0]
+            self.assertEqual('georss', geo_format.childNodes[0].data)
diff --git a/webapp/django/contrib/gis/tests/geoapp/tests.py b/webapp/django/contrib/gis/tests/geoapp/tests.py
new file mode 100644
index 0000000..ff6eac9
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/geoapp/tests.py
@@ -0,0 +1,568 @@
+import os, unittest
+from models import Country, City, State, Feature, MinusOneSRID
+from django.contrib.gis import gdal
+from django.contrib.gis.db.backend import SpatialBackend
+from django.contrib.gis.geos import *
+from django.contrib.gis.measure import Distance
+from django.contrib.gis.tests.utils import no_oracle, no_postgis, oracle, postgis
+
+# TODO: Some tests depend on the success/failure of previous tests, these should
+# be decoupled.  This flag is an artifact of this problem, and makes debugging easier;
+# specifically, the DISABLE flag will disables all tests, allowing problem tests to
+# be examined individually.
+DISABLE = False
+
+class GeoModelTest(unittest.TestCase):
+    
+    def test01_initial_sql(self):
+        "Testing geographic initial SQL."
+        if DISABLE: return
+        if oracle:
+            # Oracle doesn't allow strings longer than 4000 characters
+            # in SQL files, and I'm stumped on how to use Oracle BFILE's
+            # in PLSQL, so we set up the larger geometries manually, rather
+            # than relying on the initial SQL. 
+
+            # Routine for returning the path to the data files.
+            data_dir = os.path.join(os.path.dirname(__file__), 'sql')
+            def get_file(wkt_file):
+                return os.path.join(data_dir, wkt_file)
+
+            State(name='Colorado', poly=fromfile(get_file('co.wkt'))).save()
+            State(name='Kansas', poly=fromfile(get_file('ks.wkt'))).save()
+            Country(name='Texas', mpoly=fromfile(get_file('tx.wkt'))).save()
+            Country(name='New Zealand', mpoly=fromfile(get_file('nz.wkt'))).save()
+
+        # Ensuring that data was loaded from initial SQL.
+        self.assertEqual(2, Country.objects.count())
+        self.assertEqual(8, City.objects.count())
+
+        # Oracle cannot handle NULL geometry values w/certain queries.
+        if oracle: n_state = 2
+        else: n_state = 3
+        self.assertEqual(n_state, State.objects.count())
+
+    def test02_proxy(self):
+        "Testing Lazy-Geometry support (using the GeometryProxy)."
+        if DISABLE: return
+        ## Testing on a Point
+        pnt = Point(0, 0)
+        nullcity = City(name='NullCity', point=pnt)
+        nullcity.save()
+
+        # Making sure TypeError is thrown when trying to set with an
+        #  incompatible type.
+        for bad in [5, 2.0, LineString((0, 0), (1, 1))]:
+            try:
+                nullcity.point = bad
+            except TypeError:
+                pass
+            else:
+                self.fail('Should throw a TypeError')
+
+        # Now setting with a compatible GEOS Geometry, saving, and ensuring
+        #  the save took, notice no SRID is explicitly set.
+        new = Point(5, 23)
+        nullcity.point = new
+
+        # Ensuring that the SRID is automatically set to that of the 
+        #  field after assignment, but before saving.
+        self.assertEqual(4326, nullcity.point.srid)
+        nullcity.save()
+
+        # Ensuring the point was saved correctly after saving
+        self.assertEqual(new, City.objects.get(name='NullCity').point)
+
+        # Setting the X and Y of the Point
+        nullcity.point.x = 23
+        nullcity.point.y = 5
+        # Checking assignments pre & post-save.
+        self.assertNotEqual(Point(23, 5), City.objects.get(name='NullCity').point)
+        nullcity.save()
+        self.assertEqual(Point(23, 5), City.objects.get(name='NullCity').point)
+        nullcity.delete()
+
+        ## Testing on a Polygon
+        shell = LinearRing((0, 0), (0, 100), (100, 100), (100, 0), (0, 0))
+        inner = LinearRing((40, 40), (40, 60), (60, 60), (60, 40), (40, 40))
+
+        # Creating a State object using a built Polygon
+        ply = Polygon(shell, inner)
+        nullstate = State(name='NullState', poly=ply)
+        self.assertEqual(4326, nullstate.poly.srid) # SRID auto-set from None
+        nullstate.save()
+
+        ns = State.objects.get(name='NullState')
+        self.assertEqual(ply, ns.poly)
+        
+        # Testing the `ogr` and `srs` lazy-geometry properties.
+        if gdal.HAS_GDAL:
+            self.assertEqual(True, isinstance(ns.poly.ogr, gdal.OGRGeometry))
+            self.assertEqual(ns.poly.wkb, ns.poly.ogr.wkb)
+            self.assertEqual(True, isinstance(ns.poly.srs, gdal.SpatialReference))
+            self.assertEqual('WGS 84', ns.poly.srs.name)
+
+        # Changing the interior ring on the poly attribute.
+        new_inner = LinearRing((30, 30), (30, 70), (70, 70), (70, 30), (30, 30))
+        ns.poly[1] = new_inner
+        ply[1] = new_inner
+        self.assertEqual(4326, ns.poly.srid)
+        ns.save()
+        self.assertEqual(ply, State.objects.get(name='NullState').poly)
+        ns.delete()
+
+    @no_oracle # Oracle does not support KML.
+    def test03a_kml(self):
+        "Testing KML output from the database using GeoManager.kml()."
+        if DISABLE: return
+        # Should throw a TypeError when trying to obtain KML from a
+        #  non-geometry field.
+        qs = City.objects.all()
+        self.assertRaises(TypeError, qs.kml, 'name')
+
+        # The reference KML depends on the version of PostGIS used 
+        # (the output stopped including altitude in 1.3.3).
+        major, minor1, minor2 = SpatialBackend.version
+        ref_kml1 = '<Point><coordinates>-104.609252,38.255001,0</coordinates></Point>'
+        ref_kml2 = '<Point><coordinates>-104.609252,38.255001</coordinates></Point>'
+        if major == 1:
+            if minor1 > 3 or (minor1 == 3 and minor2 >= 3): ref_kml = ref_kml2
+            else: ref_kml = ref_kml1
+        else:
+            ref_kml = ref_kml2
+
+        # Ensuring the KML is as expected.
+        ptown1 = City.objects.kml(field_name='point', precision=9).get(name='Pueblo')
+        ptown2 = City.objects.kml(precision=9).get(name='Pueblo')
+        for ptown in [ptown1, ptown2]:
+            self.assertEqual(ref_kml, ptown.kml)
+
+    def test03b_gml(self):
+        "Testing GML output from the database using GeoManager.gml()."
+        if DISABLE: return
+        # Should throw a TypeError when tyring to obtain GML from a
+        #  non-geometry field.
+        qs = City.objects.all()
+        self.assertRaises(TypeError, qs.gml, field_name='name')
+        ptown1 = City.objects.gml(field_name='point', precision=9).get(name='Pueblo')
+        ptown2 = City.objects.gml(precision=9).get(name='Pueblo')
+
+        if oracle:
+            # No precision parameter for Oracle :-/
+            import re
+            gml_regex = re.compile(r'<gml:Point srsName="SDO:4326" xmlns:gml="http://www.opengis.net/gml"><gml:coordinates decimal="\." cs="," ts=" ">-104.60925199\d+,38.25500\d+ </gml:coordinates></gml:Point>')
+            for ptown in [ptown1, ptown2]:
+                self.assertEqual(True, bool(gml_regex.match(ptown.gml)))
+        else:
+            for ptown in [ptown1, ptown2]:
+                self.assertEqual('<gml:Point srsName="EPSG:4326"><gml:coordinates>-104.609252,38.255001</gml:coordinates></gml:Point>', ptown.gml)
+
+    def test04_transform(self):
+        "Testing the transform() GeoManager method."
+        if DISABLE: return
+        # Pre-transformed points for Houston and Pueblo.
+        htown = fromstr('POINT(1947516.83115183 6322297.06040572)', srid=3084)
+        ptown = fromstr('POINT(992363.390841912 481455.395105533)', srid=2774)
+        prec = 3 # Precision is low due to version variations in PROJ and GDAL.
+
+        # Asserting the result of the transform operation with the values in
+        #  the pre-transformed points.  Oracle does not have the 3084 SRID.
+        if not oracle:
+            h = City.objects.transform(htown.srid).get(name='Houston')
+            self.assertEqual(3084, h.point.srid)
+            self.assertAlmostEqual(htown.x, h.point.x, prec)
+            self.assertAlmostEqual(htown.y, h.point.y, prec)
+
+        p1 = City.objects.transform(ptown.srid, field_name='point').get(name='Pueblo')
+        p2 = City.objects.transform(srid=ptown.srid).get(name='Pueblo')
+        for p in [p1, p2]:
+            self.assertEqual(2774, p.point.srid)
+            self.assertAlmostEqual(ptown.x, p.point.x, prec)
+            self.assertAlmostEqual(ptown.y, p.point.y, prec)
+
+    @no_oracle # Most likely can do this in Oracle, however, it is not yet implemented (patches welcome!)
+    def test05_extent(self):
+        "Testing the `extent` GeoQuerySet method."
+        if DISABLE: return
+        # Reference query:
+        # `SELECT ST_extent(point) FROM geoapp_city WHERE (name='Houston' or name='Dallas');`
+        #   =>  BOX(-96.8016128540039 29.7633724212646,-95.3631439208984 32.7820587158203)
+        expected = (-96.8016128540039, 29.7633724212646, -95.3631439208984, 32.782058715820)
+
+        qs = City.objects.filter(name__in=('Houston', 'Dallas'))
+        extent = qs.extent()
+
+        for val, exp in zip(extent, expected):
+            self.assertAlmostEqual(exp, val, 8)
+
+    @no_oracle
+    def test06_make_line(self):
+        "Testing the `make_line` GeoQuerySet method."
+        if DISABLE: return
+        # Ensuring that a `TypeError` is raised on models without PointFields.
+        self.assertRaises(TypeError, State.objects.make_line)
+        self.assertRaises(TypeError, Country.objects.make_line)
+        # Reference query:
+        # SELECT AsText(ST_MakeLine(geoapp_city.point)) FROM geoapp_city;
+        self.assertEqual(GEOSGeometry('LINESTRING(-95.363151 29.763374,-96.801611 32.782057,-97.521157 34.464642,174.783117 -41.315268,-104.609252 38.255001,-95.23506 38.971823,-87.650175 41.850385,-123.305196 48.462611)', srid=4326),
+                         City.objects.make_line())
+
+    def test09_disjoint(self):
+        "Testing the `disjoint` lookup type."
+        if DISABLE: return
+        ptown = City.objects.get(name='Pueblo')
+        qs1 = City.objects.filter(point__disjoint=ptown.point)
+        self.assertEqual(7, qs1.count())
+
+        if not postgis:
+            # TODO: Do NULL columns bork queries on PostGIS?  The following
+            # error is encountered:
+            #  psycopg2.ProgrammingError: invalid memory alloc request size 4294957297
+            qs2 = State.objects.filter(poly__disjoint=ptown.point)
+            self.assertEqual(1, qs2.count())
+            self.assertEqual('Kansas', qs2[0].name)
+
+    def test10_contains_contained(self):
+        "Testing the 'contained', 'contains', and 'bbcontains' lookup types."
+        if DISABLE: return
+        # Getting Texas, yes we were a country -- once ;)
+        texas = Country.objects.get(name='Texas')
+        
+        # Seeing what cities are in Texas, should get Houston and Dallas,
+        #  and Oklahoma City because 'contained' only checks on the
+        #  _bounding box_ of the Geometries.
+        if not oracle:
+            qs = City.objects.filter(point__contained=texas.mpoly)
+            self.assertEqual(3, qs.count())
+            cities = ['Houston', 'Dallas', 'Oklahoma City']
+            for c in qs: self.assertEqual(True, c.name in cities)
+
+        # Pulling out some cities.
+        houston = City.objects.get(name='Houston')
+        wellington = City.objects.get(name='Wellington')
+        pueblo = City.objects.get(name='Pueblo')
+        okcity = City.objects.get(name='Oklahoma City')
+        lawrence = City.objects.get(name='Lawrence')
+
+        # Now testing contains on the countries using the points for
+        #  Houston and Wellington.
+        tx = Country.objects.get(mpoly__contains=houston.point) # Query w/GEOSGeometry
+        nz = Country.objects.get(mpoly__contains=wellington.point.hex) # Query w/EWKBHEX
+        ks = State.objects.get(poly__contains=lawrence.point)
+        self.assertEqual('Texas', tx.name)
+        self.assertEqual('New Zealand', nz.name)
+        self.assertEqual('Kansas', ks.name)
+
+        # Pueblo and Oklahoma City (even though OK City is within the bounding box of Texas)
+        #  are not contained in Texas or New Zealand.
+        self.assertEqual(0, len(Country.objects.filter(mpoly__contains=pueblo.point))) # Query w/GEOSGeometry object
+        self.assertEqual(0, len(Country.objects.filter(mpoly__contains=okcity.point.wkt))) # Qeury w/WKT
+
+        # OK City is contained w/in bounding box of Texas.
+        if not oracle:
+            qs = Country.objects.filter(mpoly__bbcontains=okcity.point)
+            self.assertEqual(1, len(qs))
+            self.assertEqual('Texas', qs[0].name)
+
+    def test11_lookup_insert_transform(self):
+        "Testing automatic transform for lookups and inserts."
+        if DISABLE: return
+        # San Antonio in 'WGS84' (SRID 4326)
+        sa_4326 = 'POINT (-98.493183 29.424170)'
+        wgs_pnt = fromstr(sa_4326, srid=4326) # Our reference point in WGS84
+
+        # Oracle doesn't have SRID 3084, using 41157.
+        if oracle:
+            # San Antonio in 'Texas 4205, Southern Zone (1983, meters)' (SRID 41157)
+            # Used the following Oracle SQL to get this value:
+            #  SELECT SDO_UTIL.TO_WKTGEOMETRY(SDO_CS.TRANSFORM(SDO_GEOMETRY('POINT (-98.493183 29.424170)', 4326), 41157)) FROM DUAL;
+            nad_wkt  = 'POINT (300662.034646583 5416427.45974934)'
+            nad_srid = 41157
+        else:
+            # San Antonio in 'NAD83(HARN) / Texas Centric Lambert Conformal' (SRID 3084)
+            nad_wkt = 'POINT (1645978.362408288754523 6276356.025927528738976)' # Used ogr.py in gdal 1.4.1 for this transform
+            nad_srid = 3084
+
+        # Constructing & querying with a point from a different SRID. Oracle
+        # `SDO_OVERLAPBDYINTERSECT` operates differently from
+        # `ST_Intersects`, so contains is used instead.
+        nad_pnt = fromstr(nad_wkt, srid=nad_srid)
+        if oracle:
+            tx = Country.objects.get(mpoly__contains=nad_pnt) 
+        else:
+            tx = Country.objects.get(mpoly__intersects=nad_pnt)
+        self.assertEqual('Texas', tx.name)
+        
+        # Creating San Antonio.  Remember the Alamo.
+        sa = City(name='San Antonio', point=nad_pnt)
+        sa.save()
+        
+        # Now verifying that San Antonio was transformed correctly
+        sa = City.objects.get(name='San Antonio')
+        self.assertAlmostEqual(wgs_pnt.x, sa.point.x, 6)
+        self.assertAlmostEqual(wgs_pnt.y, sa.point.y, 6)
+
+        # If the GeometryField SRID is -1, then we shouldn't perform any
+        # transformation if the SRID of the input geometry is different.
+        m1 = MinusOneSRID(geom=Point(17, 23, srid=4326))
+        m1.save()
+        self.assertEqual(-1, m1.geom.srid)
+
+    # Oracle does not support NULL geometries in its spatial index for
+    # some routines (e.g., SDO_GEOM.RELATE).
+    @no_oracle
+    def test12_null_geometries(self):
+        "Testing NULL geometry support, and the `isnull` lookup type."
+        if DISABLE: return
+        # Querying for both NULL and Non-NULL values.
+        nullqs = State.objects.filter(poly__isnull=True)
+        validqs = State.objects.filter(poly__isnull=False)
+
+        # Puerto Rico should be NULL (it's a commonwealth unincorporated territory)
+        self.assertEqual(1, len(nullqs))
+        self.assertEqual('Puerto Rico', nullqs[0].name)
+        
+        # The valid states should be Colorado & Kansas
+        self.assertEqual(2, len(validqs))
+        state_names = [s.name for s in validqs]
+        self.assertEqual(True, 'Colorado' in state_names)
+        self.assertEqual(True, 'Kansas' in state_names)
+
+        # Saving another commonwealth w/a NULL geometry.
+        if not oracle:
+            # TODO: Fix saving w/NULL geometry on Oracle.
+            State(name='Northern Mariana Islands', poly=None).save()
+
+    @no_oracle # No specific `left` or `right` operators in Oracle.
+    def test13_left_right(self):
+        "Testing the 'left' and 'right' lookup types."
+        if DISABLE: return
+        # Left: A << B => true if xmax(A) < xmin(B)
+        # Right: A >> B => true if xmin(A) > xmax(B) 
+        #  See: BOX2D_left() and BOX2D_right() in lwgeom_box2dfloat4.c in PostGIS source.
+        
+        # Getting the borders for Colorado & Kansas
+        co_border = State.objects.get(name='Colorado').poly
+        ks_border = State.objects.get(name='Kansas').poly
+
+        # Note: Wellington has an 'X' value of 174, so it will not be considered
+        #  to the left of CO.
+        
+        # These cities should be strictly to the right of the CO border.
+        cities = ['Houston', 'Dallas', 'San Antonio', 'Oklahoma City', 
+                  'Lawrence', 'Chicago', 'Wellington']
+        qs = City.objects.filter(point__right=co_border)
+        self.assertEqual(7, len(qs))
+        for c in qs: self.assertEqual(True, c.name in cities)
+
+        # These cities should be strictly to the right of the KS border.
+        cities = ['Chicago', 'Wellington']
+        qs = City.objects.filter(point__right=ks_border)
+        self.assertEqual(2, len(qs))
+        for c in qs: self.assertEqual(True, c.name in cities)
+
+        # Note: Wellington has an 'X' value of 174, so it will not be considered
+        #  to the left of CO.
+        vic = City.objects.get(point__left=co_border)
+        self.assertEqual('Victoria', vic.name)
+        
+        cities = ['Pueblo', 'Victoria']
+        qs = City.objects.filter(point__left=ks_border)
+        self.assertEqual(2, len(qs))
+        for c in qs: self.assertEqual(True, c.name in cities)
+
+    def test14_equals(self):
+        "Testing the 'same_as' and 'equals' lookup types."
+        if DISABLE: return
+        pnt = fromstr('POINT (-95.363151 29.763374)', srid=4326)
+        c1 = City.objects.get(point=pnt)
+        c2 = City.objects.get(point__same_as=pnt)
+        c3 = City.objects.get(point__equals=pnt)
+        for c in [c1, c2, c3]: self.assertEqual('Houston', c.name)
+
+    def test15_relate(self):
+        "Testing the 'relate' lookup type."
+        if DISABLE: return
+        # To make things more interesting, we will have our Texas reference point in 
+        # different SRIDs.
+        pnt1 = fromstr('POINT (649287.0363174 4177429.4494686)', srid=2847)
+        pnt2 = fromstr('POINT(-98.4919715741052 29.4333344025053)', srid=4326)
+
+        # Not passing in a geometry as first param shoud 
+        # raise a type error when initializing the GeoQuerySet
+        self.assertRaises(TypeError, Country.objects.filter, mpoly__relate=(23, 'foo'))
+        # Making sure the right exception is raised for the given
+        # bad arguments.
+        for bad_args, e in [((pnt1, 0), TypeError), ((pnt2, 'T*T***FF*', 0), ValueError)]:
+            qs = Country.objects.filter(mpoly__relate=bad_args)
+            self.assertRaises(e, qs.count)
+
+        # Relate works differently for the different backends.
+        if postgis:
+            contains_mask = 'T*T***FF*'
+            within_mask = 'T*F**F***'
+            intersects_mask = 'T********'
+        elif oracle:
+            contains_mask = 'contains'
+            within_mask = 'inside'
+            # TODO: This is not quite the same as the PostGIS mask above
+            intersects_mask = 'overlapbdyintersect'
+
+        # Testing contains relation mask.
+        self.assertEqual('Texas', Country.objects.get(mpoly__relate=(pnt1, contains_mask)).name)
+        self.assertEqual('Texas', Country.objects.get(mpoly__relate=(pnt2, contains_mask)).name)
+
+        # Testing within relation mask.
+        ks = State.objects.get(name='Kansas')
+        self.assertEqual('Lawrence', City.objects.get(point__relate=(ks.poly, within_mask)).name)
+
+        # Testing intersection relation mask.
+        if not oracle:
+            self.assertEqual('Texas', Country.objects.get(mpoly__relate=(pnt1, intersects_mask)).name)
+            self.assertEqual('Texas', Country.objects.get(mpoly__relate=(pnt2, intersects_mask)).name)
+            self.assertEqual('Lawrence', City.objects.get(point__relate=(ks.poly, intersects_mask)).name)
+
+    def test16_createnull(self):
+        "Testing creating a model instance and the geometry being None"
+        if DISABLE: return
+        c = City()
+        self.assertEqual(c.point, None)
+
+    def test17_unionagg(self):
+        "Testing the `unionagg` (aggregate union) GeoManager method."
+        if DISABLE: return
+        tx = Country.objects.get(name='Texas').mpoly
+        # Houston, Dallas, San Antonio -- Oracle has different order.
+        union1 = fromstr('MULTIPOINT(-98.493183 29.424170,-96.801611 32.782057,-95.363151 29.763374)')
+        union2 = fromstr('MULTIPOINT(-96.801611 32.782057,-95.363151 29.763374,-98.493183 29.424170)')
+        qs = City.objects.filter(point__within=tx)
+        self.assertRaises(TypeError, qs.unionagg, 'name')
+        # Using `field_name` keyword argument in one query and specifying an
+        # order in the other (which should not be used because this is
+        # an aggregate method on a spatial column)
+        u1 = qs.unionagg(field_name='point') 
+        u2 = qs.order_by('name').unionagg()
+        tol = 0.00001
+        if SpatialBackend.oracle:
+            union = union2
+        else:
+            union = union1
+        self.assertEqual(True, union.equals_exact(u1, tol))
+        self.assertEqual(True, union.equals_exact(u2, tol))
+        qs = City.objects.filter(name='NotACity')
+        self.assertEqual(None, qs.unionagg(field_name='point'))
+
+    def test18_geometryfield(self):
+        "Testing GeometryField."
+        if DISABLE: return
+        Feature(name='Point', geom=Point(1, 1)).save()
+        Feature(name='LineString', geom=LineString((0, 0), (1, 1), (5, 5))).save()
+        Feature(name='Polygon', geom=Polygon(LinearRing((0, 0), (0, 5), (5, 5), (5, 0), (0, 0)))).save()
+        Feature(name='GeometryCollection', 
+                geom=GeometryCollection(Point(2, 2), LineString((0, 0), (2, 2)), 
+                                        Polygon(LinearRing((0, 0), (0, 5), (5, 5), (5, 0), (0, 0))))).save()
+
+        f_1 = Feature.objects.get(name='Point')
+        self.assertEqual(True, isinstance(f_1.geom, Point))
+        self.assertEqual((1.0, 1.0), f_1.geom.tuple)
+        f_2 = Feature.objects.get(name='LineString')
+        self.assertEqual(True, isinstance(f_2.geom, LineString))
+        self.assertEqual(((0.0, 0.0), (1.0, 1.0), (5.0, 5.0)), f_2.geom.tuple)
+
+        f_3 = Feature.objects.get(name='Polygon')
+        self.assertEqual(True, isinstance(f_3.geom, Polygon))
+        f_4 = Feature.objects.get(name='GeometryCollection')
+        self.assertEqual(True, isinstance(f_4.geom, GeometryCollection))
+        self.assertEqual(f_3.geom, f_4.geom[2])
+    
+    def test19_centroid(self):
+        "Testing the `centroid` GeoQuerySet method."
+        if DISABLE: return
+        qs = State.objects.exclude(poly__isnull=True).centroid()
+        if oracle: tol = 0.1
+        else: tol = 0.000000001
+        for s in qs:
+            self.assertEqual(True, s.poly.centroid.equals_exact(s.centroid, tol))
+
+    def test20_pointonsurface(self):
+        "Testing the `point_on_surface` GeoQuerySet method."
+        if DISABLE: return
+        # Reference values.
+        if SpatialBackend.oracle:
+            # SELECT SDO_UTIL.TO_WKTGEOMETRY(SDO_GEOM.SDO_POINTONSURFACE(GEOAPP_COUNTRY.MPOLY, 0.05)) FROM GEOAPP_COUNTRY;
+            ref = {'New Zealand' : fromstr('POINT (174.616364 -36.100861)', srid=4326),
+                   'Texas' : fromstr('POINT (-103.002434 36.500397)', srid=4326),
+                   }
+        elif SpatialBackend.postgis:
+            # Using GEOSGeometry to compute the reference point on surface values 
+            # -- since PostGIS also uses GEOS these should be the same.
+            ref = {'New Zealand' : Country.objects.get(name='New Zealand').mpoly.point_on_surface,
+                   'Texas' : Country.objects.get(name='Texas').mpoly.point_on_surface
+                   }
+        for cntry in Country.objects.point_on_surface():
+            self.assertEqual(ref[cntry.name], cntry.point_on_surface)
+
+    @no_oracle
+    def test21_scale(self):
+        "Testing the `scale` GeoQuerySet method."
+        if DISABLE: return
+        xfac, yfac = 2, 3
+        qs = Country.objects.scale(xfac, yfac, model_att='scaled')
+        for c in qs:
+            for p1, p2 in zip(c.mpoly, c.scaled):
+                for r1, r2 in zip(p1, p2):
+                    for c1, c2 in zip(r1.coords, r2.coords):
+                        self.assertEqual(c1[0] * xfac, c2[0])
+                        self.assertEqual(c1[1] * yfac, c2[1])
+
+    @no_oracle
+    def test22_translate(self):
+        "Testing the `translate` GeoQuerySet method."
+        if DISABLE: return
+        xfac, yfac = 5, -23
+        qs = Country.objects.translate(xfac, yfac, model_att='translated')
+        for c in qs:
+            for p1, p2 in zip(c.mpoly, c.translated):
+                for r1, r2 in zip(p1, p2):
+                    for c1, c2 in zip(r1.coords, r2.coords):
+                        self.assertEqual(c1[0] + xfac, c2[0])
+                        self.assertEqual(c1[1] + yfac, c2[1])
+
+    def test23_numgeom(self):
+        "Testing the `num_geom` GeoQuerySet method."
+        if DISABLE: return
+        # Both 'countries' only have two geometries.
+        for c in Country.objects.num_geom(): self.assertEqual(2, c.num_geom)
+        for c in City.objects.filter(point__isnull=False).num_geom(): 
+            # Oracle will return 1 for the number of geometries on non-collections,
+            # whereas PostGIS will return None.
+            if postgis: self.assertEqual(None, c.num_geom)
+            else: self.assertEqual(1, c.num_geom)
+
+    def test24_numpoints(self):
+        "Testing the `num_points` GeoQuerySet method."
+        if DISABLE: return
+        for c in Country.objects.num_points(): self.assertEqual(c.mpoly.num_points, c.num_points)
+        if postgis:
+            # Oracle cannot count vertices in Point geometries.
+            for c in City.objects.num_points(): self.assertEqual(1, c.num_points)
+
+    @no_oracle
+    def test25_geoset(self):
+        "Testing the `difference`, `intersection`, `sym_difference`, and `union` GeoQuerySet methods."
+        if DISABLE: return
+        geom = Point(5, 23)
+        for c in Country.objects.all().intersection(geom).difference(geom).sym_difference(geom).union(geom):
+            self.assertEqual(c.mpoly.difference(geom), c.difference)
+            self.assertEqual(c.mpoly.intersection(geom), c.intersection)
+            self.assertEqual(c.mpoly.sym_difference(geom), c.sym_difference)
+            self.assertEqual(c.mpoly.union(geom), c.union)
+
+from test_feeds import GeoFeedTest
+from test_sitemaps import GeoSitemapTest
+def suite():
+    s = unittest.TestSuite()
+    s.addTest(unittest.makeSuite(GeoModelTest))
+    s.addTest(unittest.makeSuite(GeoFeedTest))
+    s.addTest(unittest.makeSuite(GeoSitemapTest))
+    return s
diff --git a/webapp/django/contrib/gis/tests/geoapp/tests_mysql.py b/webapp/django/contrib/gis/tests/geoapp/tests_mysql.py
new file mode 100644
index 0000000..040130c
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/geoapp/tests_mysql.py
@@ -0,0 +1,183 @@
+"""
+ A limited test module is used for a limited spatial database.
+"""
+import os, unittest
+from models import Country, City, State, Feature
+from django.contrib.gis import gdal
+from django.contrib.gis.geos import *
+from django.core.exceptions import ImproperlyConfigured
+
+class GeoModelTest(unittest.TestCase):
+    
+    def test01_initial_sql(self):
+        "Testing geographic initial SQL."
+        # Ensuring that data was loaded from initial SQL.
+        self.assertEqual(2, Country.objects.count())
+        self.assertEqual(8, City.objects.count())
+        self.assertEqual(2, State.objects.count())
+
+    def test02_proxy(self):
+        "Testing Lazy-Geometry support (using the GeometryProxy)."
+        #### Testing on a Point
+        pnt = Point(0, 0)
+        nullcity = City(name='NullCity', point=pnt)
+        nullcity.save()
+
+        # Making sure TypeError is thrown when trying to set with an
+        #  incompatible type.
+        for bad in [5, 2.0, LineString((0, 0), (1, 1))]:
+            try:
+                nullcity.point = bad
+            except TypeError:
+                pass
+            else:
+                self.fail('Should throw a TypeError')
+
+        # Now setting with a compatible GEOS Geometry, saving, and ensuring
+        #  the save took, notice no SRID is explicitly set.
+        new = Point(5, 23)
+        nullcity.point = new
+
+        # Ensuring that the SRID is automatically set to that of the 
+        #  field after assignment, but before saving.
+        self.assertEqual(4326, nullcity.point.srid)
+        nullcity.save()
+
+        # Ensuring the point was saved correctly after saving
+        self.assertEqual(new, City.objects.get(name='NullCity').point)
+
+        # Setting the X and Y of the Point
+        nullcity.point.x = 23
+        nullcity.point.y = 5
+        # Checking assignments pre & post-save.
+        self.assertNotEqual(Point(23, 5), City.objects.get(name='NullCity').point)
+        nullcity.save()
+        self.assertEqual(Point(23, 5), City.objects.get(name='NullCity').point)
+        nullcity.delete()
+
+        #### Testing on a Polygon
+        shell = LinearRing((0, 0), (0, 100), (100, 100), (100, 0), (0, 0))
+        inner = LinearRing((40, 40), (40, 60), (60, 60), (60, 40), (40, 40))
+
+        # Creating a State object using a built Polygon
+        ply = Polygon(shell, inner)
+        nullstate = State(name='NullState', poly=ply)
+        self.assertEqual(4326, nullstate.poly.srid) # SRID auto-set from None
+        nullstate.save()
+
+        ns = State.objects.get(name='NullState')
+        self.assertEqual(ply, ns.poly)
+        
+        # Testing the `ogr` and `srs` lazy-geometry properties.
+        if gdal.HAS_GDAL:
+            self.assertEqual(True, isinstance(ns.poly.ogr, gdal.OGRGeometry))
+            self.assertEqual(ns.poly.wkb, ns.poly.ogr.wkb)
+            self.assertEqual(True, isinstance(ns.poly.srs, gdal.SpatialReference))
+            self.assertEqual('WGS 84', ns.poly.srs.name)
+
+        # Changing the interior ring on the poly attribute.
+        new_inner = LinearRing((30, 30), (30, 70), (70, 70), (70, 30), (30, 30))
+        ns.poly[1] = new_inner
+        ply[1] = new_inner
+        self.assertEqual(4326, ns.poly.srid)
+        ns.save()
+        self.assertEqual(ply, State.objects.get(name='NullState').poly)
+        ns.delete()
+
+    def test03_contains_contained(self):
+        "Testing the 'contained', 'contains', and 'bbcontains' lookup types."
+        # Getting Texas, yes we were a country -- once ;)
+        texas = Country.objects.get(name='Texas')
+        
+        # Seeing what cities are in Texas, should get Houston and Dallas,
+        #  and Oklahoma City because MySQL 'within' only checks on the
+        #  _bounding box_ of the Geometries.
+        qs = City.objects.filter(point__within=texas.mpoly)
+        self.assertEqual(3, qs.count())
+        cities = ['Houston', 'Dallas', 'Oklahoma City']
+        for c in qs: self.assertEqual(True, c.name in cities)
+
+        # Pulling out some cities.
+        houston = City.objects.get(name='Houston')
+        wellington = City.objects.get(name='Wellington')
+        pueblo = City.objects.get(name='Pueblo')
+        okcity = City.objects.get(name='Oklahoma City')
+        lawrence = City.objects.get(name='Lawrence')
+
+        # Now testing contains on the countries using the points for
+        #  Houston and Wellington.
+        tx = Country.objects.get(mpoly__contains=houston.point) # Query w/GEOSGeometry
+        nz = Country.objects.get(mpoly__contains=wellington.point.hex) # Query w/EWKBHEX
+        ks = State.objects.get(poly__contains=lawrence.point)
+        self.assertEqual('Texas', tx.name)
+        self.assertEqual('New Zealand', nz.name)
+        self.assertEqual('Kansas', ks.name)
+
+        # Pueblo is not contained in Texas or New Zealand.
+        self.assertEqual(0, len(Country.objects.filter(mpoly__contains=pueblo.point))) # Query w/GEOSGeometry object
+
+        # OK City is contained w/in bounding box of Texas.
+        qs = Country.objects.filter(mpoly__bbcontains=okcity.point)
+        self.assertEqual(1, len(qs))
+        self.assertEqual('Texas', qs[0].name)
+
+    def test04_disjoint(self):
+        "Testing the `disjoint` lookup type."
+        ptown = City.objects.get(name='Pueblo')
+        qs1 = City.objects.filter(point__disjoint=ptown.point)
+        self.assertEqual(7, qs1.count())
+        # TODO: This query should work in MySQL, but it appears the
+        # `MBRDisjoint` function doesn't work properly (I went down
+        # to the SQL level for debugging and still got bogus answers).
+        #qs2 = State.objects.filter(poly__disjoint=ptown.point)
+        #self.assertEqual(1, qs2.count())
+        #self.assertEqual('Kansas', qs2[0].name)
+
+    def test05_equals(self):
+        "Testing the 'same_as' and 'equals' lookup types."
+        pnt = fromstr('POINT (-95.363151 29.763374)', srid=4326)
+        c1 = City.objects.get(point=pnt)
+        c2 = City.objects.get(point__same_as=pnt)
+        c3 = City.objects.get(point__equals=pnt)
+        for c in [c1, c2, c3]: self.assertEqual('Houston', c.name)
+
+    def test06_geometryfield(self):
+        "Testing GeometryField."
+        f1 = Feature(name='Point', geom=Point(1, 1))
+        f2 = Feature(name='LineString', geom=LineString((0, 0), (1, 1), (5, 5)))
+        f3 = Feature(name='Polygon', geom=Polygon(LinearRing((0, 0), (0, 5), (5, 5), (5, 0), (0, 0))))
+        f4 = Feature(name='GeometryCollection', 
+                     geom=GeometryCollection(Point(2, 2), LineString((0, 0), (2, 2)), 
+                                             Polygon(LinearRing((0, 0), (0, 5), (5, 5), (5, 0), (0, 0)))))
+        f1.save()
+        f2.save()
+        f3.save()
+        f4.save()
+
+        f_1 = Feature.objects.get(name='Point')
+        self.assertEqual(True, isinstance(f_1.geom, Point))
+        self.assertEqual((1.0, 1.0), f_1.geom.tuple)
+        f_2 = Feature.objects.get(name='LineString')
+        self.assertEqual(True, isinstance(f_2.geom, LineString))
+        self.assertEqual(((0.0, 0.0), (1.0, 1.0), (5.0, 5.0)), f_2.geom.tuple)
+
+        f_3 = Feature.objects.get(name='Polygon')
+        self.assertEqual(True, isinstance(f_3.geom, Polygon))
+        f_4 = Feature.objects.get(name='GeometryCollection')
+        self.assertEqual(True, isinstance(f_4.geom, GeometryCollection))
+        self.assertEqual(f_3.geom, f_4.geom[2])
+    
+    def test07_mysql_limitations(self):
+        "Testing that union(), kml(), gml() raise exceptions."
+        self.assertRaises(ImproperlyConfigured, City.objects.union, Point(5, 23), field_name='point')
+        self.assertRaises(ImproperlyConfigured, State.objects.all().kml, field_name='poly')
+        self.assertRaises(ImproperlyConfigured, Country.objects.all().gml, field_name='mpoly')
+
+from test_feeds import GeoFeedTest
+from test_sitemaps import GeoSitemapTest
+def suite():
+    s = unittest.TestSuite()
+    s.addTest(unittest.makeSuite(GeoModelTest))
+    s.addTest(unittest.makeSuite(GeoFeedTest))
+    s.addTest(unittest.makeSuite(GeoSitemapTest))
+    return s
diff --git a/webapp/django/contrib/gis/tests/geoapp/urls.py b/webapp/django/contrib/gis/tests/geoapp/urls.py
new file mode 100644
index 0000000..edaf280
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/geoapp/urls.py
@@ -0,0 +1,14 @@
+from django.conf.urls.defaults import *
+from feeds import feed_dict
+
+urlpatterns = patterns('',
+    (r'^feeds/(?P<url>.*)/$', 'django.contrib.syndication.views.feed', {'feed_dict': feed_dict}),
+)
+
+from sitemaps import sitemaps
+urlpatterns += patterns('django.contrib.gis.sitemaps.views',
+    (r'^sitemap.xml$', 'index', {'sitemaps' : sitemaps}),
+    (r'^sitemaps/(?P<section>\w+)\.xml$', 'sitemap', {'sitemaps' : sitemaps}),
+    (r'^sitemaps/kml/(?P<label>\w+)/(?P<model>\w+)/(?P<field_name>\w+)\.kml$', 'kml'),
+    (r'^sitemaps/kml/(?P<label>\w+)/(?P<model>\w+)/(?P<field_name>\w+)\.kmz$', 'kmz'),                
+)
diff --git a/webapp/django/contrib/gis/tests/geometries.py b/webapp/django/contrib/gis/tests/geometries.py
new file mode 100644
index 0000000..e9bc6f6
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/geometries.py
@@ -0,0 +1,157 @@
+import re
+
+wkt_regex = re.compile(r'^(?P<type>[A-Z]+) ?\(')
+
+class TestGeom:
+    "The Test Geometry class container."
+    def __init__(self, wkt, **kwargs):
+        self.wkt = wkt
+
+        self.bad = kwargs.pop('bad', False)
+
+        if not self.bad:
+            m = wkt_regex.match(wkt)
+            if not m:
+                raise Exception, 'Improper WKT: "%s"' % wkt
+            self.geo_type = m.group('type')
+
+        for key, value in kwargs.items():
+            setattr(self, key, value)
+
+# For the old tests
+swig_geoms = (TestGeom('POLYGON ((0 0, 0 100, 100 100, 100 0, 0 0))', ncoords=5),
+              TestGeom('POLYGON ((0 0, 0 100, 100 100, 100 0, 0 0), (10 10, 10 90, 90 90, 90 10, 10 10) ))', ncoords=10),
+              )
+
+# Testing WKT & HEX
+hex_wkt = (TestGeom('POINT(0 1)', hex='01010000000000000000000000000000000000F03F'),
+           TestGeom('LINESTRING(0 1, 2 3, 4 5)', hex='0102000000030000000000000000000000000000000000F03F0000000000000040000000000000084000000000000010400000000000001440'),
+           TestGeom('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))', hex='010300000001000000050000000000000000000000000000000000000000000000000024400000000000000000000000000000244000000000000024400000000000000000000000000000244000000000000000000000000000000000'),
+           TestGeom('MULTIPOINT(0 0, 10 0, 10 10, 0 10, 0 0)', hex='010400000005000000010100000000000000000000000000000000000000010100000000000000000024400000000000000000010100000000000000000024400000000000002440010100000000000000000000000000000000002440010100000000000000000000000000000000000000'),
+           TestGeom('MULTILINESTRING((0 0, 10 0, 10 10, 0 10),(20 20, 30 20))', hex='01050000000200000001020000000400000000000000000000000000000000000000000000000000244000000000000000000000000000002440000000000000244000000000000000000000000000002440010200000002000000000000000000344000000000000034400000000000003E400000000000003440'),
+           TestGeom('MULTIPOLYGON(((0 0, 10 0, 10 10, 0 10, 0 0)),((20 20, 20 30, 30 30, 30 20, 20 20),(25 25, 25 26, 26 26, 26 25, 25 25)))', hex='010600000002000000010300000001000000050000000000000000000000000000000000000000000000000024400000000000000000000000000000244000000000000024400000000000000000000000000000244000000000000000000000000000000000010300000002000000050000000000000000003440000000000000344000000000000034400000000000003E400000000000003E400000000000003E400000000000003E40000000000000344000000000000034400000000000003440050000000000000000003940000000000000394000000000000039400000000000003A400000000000003A400000000000003A400000000000003A40000000000000394000000000000039400000000000003940'),
+           TestGeom('GEOMETRYCOLLECTION(MULTIPOLYGON(((0 0, 10 0, 10 10, 0 10, 0 0)),((20 20, 20 30, 30 30, 30 20, 20 20),(25 25, 25 26, 26 26, 26 25, 25 25))),MULTILINESTRING((0 0, 10 0, 10 10, 0 10),(20 20, 30 20)),MULTIPOINT(0 0, 10 0, 10 10, 0 10, 0 0))', hex='010700000003000000010600000002000000010300000001000000050000000000000000000000000000000000000000000000000024400000000000000000000000000000244000000000000024400000000000000000000000000000244000000000000000000000000000000000010300000002000000050000000000000000003440000000000000344000000000000034400000000000003E400000000000003E400000000000003E400000000000003E40000000000000344000000000000034400000000000003440050000000000000000003940000000000000394000000000000039400000000000003A400000000000003A400000000000003A400000000000003A4000000000000039400000000000003940000000000000394001050000000200000001020000000400000000000000000000000000000000000000000000000000244000000000000000000000000000002440000000000000244000000000000000000000000000002440010200000002000000000000000000344000000000000034400000000000003E400000000000003440010400000005000000010100000000000000000000000000000000000000010100000000000000000024400000000000000000010100000000000000000024400000000000002440010100000000000000000000000000000000002440010100000000000000000000000000000000000000'),
+           )
+
+# WKT, GML, KML output
+wkt_out = (TestGeom('POINT (110 130)', ewkt='POINT (110.0000000000000000 130.0000000000000000)', kml='<Point><coordinates>110.0,130.0,0</coordinates></Point>', gml='<gml:Point><gml:coordinates>110,130</gml:coordinates></gml:Point>'),
+           TestGeom('LINESTRING (40 40,50 130,130 130)', ewkt='LINESTRING (40.0000000000000000 40.0000000000000000, 50.0000000000000000 130.0000000000000000, 130.0000000000000000 130.0000000000000000)', kml='<LineString><coordinates>40.0,40.0,0 50.0,130.0,0 130.0,130.0,0</coordinates></LineString>', gml='<gml:LineString><gml:coordinates>40,40 50,130 130,130</gml:coordinates></gml:LineString>'),
+           TestGeom('POLYGON ((150 150,410 150,280 20,20 20,150 150),(170 120,330 120,260 50,100 50,170 120))', ewkt='POLYGON ((150.0000000000000000 150.0000000000000000, 410.0000000000000000 150.0000000000000000, 280.0000000000000000 20.0000000000000000, 20.0000000000000000 20.0000000000000000, 150.0000000000000000 150.0000000000000000), (170.0000000000000000 120.0000000000000000, 330.0000000000000000 120.0000000000000000, 260.0000000000000000 50.0000000000000000, 100.0000000000000000 50.0000000000000000, 170.0000000000000000 120.0000000000000000))', kml='<Polygon><outerBoundaryIs><LinearRing><coordinates>150.0,150.0,0 410.0,150.0,0 280.0,20.0,0 20.0,20.0,0 150.0,150.0,0</coordinates></LinearRing></outerBoundaryIs><innerBoundaryIs><LinearRing><coordinates>170.0,120.0,0 330.0,120.0,0 260.0,50.0,0 100.0,50.0,0 170.0,120.0,0</coordinates></LinearRing></innerBoundaryIs></Polygon>', gml='<gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>150,150 410,150 280,20 20,20 150,150</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs><gml:innerBoundaryIs><gml:LinearRing><gml:coordinates>170,120 330,120 260,50 100,50 170,120</gml:coordinates></gml:LinearRing></gml:innerBoundaryIs></gml:Polygon>'),
+           TestGeom('MULTIPOINT (10 80,110 170,110 120)', ewkt='MULTIPOINT (10.0000000000000000 80.0000000000000000, 110.0000000000000000 170.0000000000000000, 110.0000000000000000 120.0000000000000000)', kml='<MultiGeometry><Point><coordinates>10.0,80.0,0</coordinates></Point><Point><coordinates>110.0,170.0,0</coordinates></Point><Point><coordinates>110.0,120.0,0</coordinates></Point></MultiGeometry>', gml='<gml:MultiPoint><gml:pointMember><gml:Point><gml:coordinates>10,80</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>110,170</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates>110,120</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint>'),
+           TestGeom('MULTILINESTRING ((110 100,40 30,180 30),(170 30,110 90,50 30))', ewkt='MULTILINESTRING ((110.0000000000000000 100.0000000000000000, 40.0000000000000000 30.0000000000000000, 180.0000000000000000 30.0000000000000000), (170.0000000000000000 30.0000000000000000, 110.0000000000000000 90.0000000000000000, 50.0000000000000000 30.0000000000000000))', kml='<MultiGeometry><LineString><coordinates>110.0,100.0,0 40.0,30.0,0 180.0,30.0,0</coordinates></LineString><LineString><coordinates>170.0,30.0,0 110.0,90.0,0 50.0,30.0,0</coordinates></LineString></MultiGeometry>', gml='<gml:MultiLineString><gml:lineStringMember><gml:LineString><gml:coordinates>110,100 40,30 180,30</gml:coordinates></gml:LineString></gml:lineStringMember><gml:lineStringMember><gml:LineString><gml:coordinates>170,30 110,90 50,30</gml:coordinates></gml:LineString></gml:lineStringMember></gml:MultiLineString>'),
+           TestGeom('MULTIPOLYGON (((110 110,70 200,150 200,110 110),(110 110,100 180,120 180,110 110)),((110 110,150 20,70 20,110 110),(110 110,120 40,100 40,110 110)))', ewkt='MULTIPOLYGON (((110.0000000000000000 110.0000000000000000, 70.0000000000000000 200.0000000000000000, 150.0000000000000000 200.0000000000000000, 110.0000000000000000 110.0000000000000000), (110.0000000000000000 110.0000000000000000, 100.0000000000000000 180.0000000000000000, 120.0000000000000000 180.0000000000000000, 110.0000000000000000 110.0000000000000000)), ((110.0000000000000000 110.0000000000000000, 150.0000000000000000 20.0000000000000000, 70.0000000000000000 20.0000000000000000, 110.0000000000000000 110.0000000000000000), (110.0000000000000000 110.0000000000000000, 120.0000000000000000 40.0000000000000000, 100.0000000000000000 40.0000000000000000, 110.0000000000000000 110.0000000000000000)))', kml='<MultiGeometry><Polygon><outerBoundaryIs><LinearRing><coordinates>110.0,110.0,0 70.0,200.0,0 150.0,200.0,0 110.0,110.0,0</coordinates></LinearRing></outerBoundaryIs><innerBoundaryIs><LinearRing><coordinates>110.0,110.0,0 100.0,180.0,0 120.0,180.0,0 110.0,110.0,0</coordinates></LinearRing></innerBoundaryIs></Polygon><Polygon><outerBoundaryIs><LinearRing><coordinates>110.0,110.0,0 150.0,20.0,0 70.0,20.0,0 110.0,110.0,0</coordinates></LinearRing></outerBoundaryIs><innerBoundaryIs><LinearRing><coordinates>110.0,110.0,0 120.0,40.0,0 100.0,40.0,0 110.0,110.0,0</coordinates></LinearRing></innerBoundaryIs></Polygon></MultiGeometry>', gml='<gml:MultiPolygon><gml:polygonMember><gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>110,110 70,200 150,200 110,110</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs><gml:innerBoundaryIs><gml:LinearRing><gml:coordinates>110,110 100,180 120,180 110,110</gml:coordinates></gml:LinearRing></gml:innerBoundaryIs></gml:Polygon></gml:polygonMember><gml:polygonMember><gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>110,110 150,20 70,20 110,110</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs><gml:innerBoundaryIs><gml:LinearRing><gml:coordinates>110,110 120,40 100,40 110,110</gml:coordinates></gml:LinearRing></gml:innerBoundaryIs></gml:Polygon></gml:polygonMember></gml:MultiPolygon>'),
+           TestGeom('GEOMETRYCOLLECTION (POINT (110 260),LINESTRING (110 0,110 60))', ewkt='GEOMETRYCOLLECTION (POINT (110.0000000000000000 260.0000000000000000), LINESTRING (110.0000000000000000 0.0000000000000000, 110.0000000000000000 60.0000000000000000))', kml='<MultiGeometry><Point><coordinates>110.0,260.0,0</coordinates></Point><LineString><coordinates>110.0,0.0,0 110.0,60.0,0</coordinates></LineString></MultiGeometry>', gml='<gml:GeometryCollection><gml:geometryMember><gml:Point><gml:coordinates>110,260</gml:coordinates></gml:Point></gml:geometryMember><gml:geometryMember><gml:LineString><gml:coordinates>110,0 110,60</gml:coordinates></gml:LineString></gml:geometryMember></gml:GeometryCollection>'),
+           )
+
+# Errors
+errors = (TestGeom('GEOMETR##!@#%#............a32515', bad=True, hex=False),
+          TestGeom('Foo.Bar', bad=True, hex=False),
+          TestGeom('POINT (5, 23)', bad=True, hex=False),
+          TestGeom('AAABBBDDDAAD##@#1113511111-098111111111111111533333333333333', bad=True, hex=True),
+          TestGeom('FFFFFFFFFFFFFFFFF1355555555555555555565111', bad=True, hex=True),
+          TestGeom('', bad=True, hex=False),
+          )
+
+# Polygons
+polygons = (TestGeom('POLYGON ((0 0, 0 100, 100 100, 100 0, 0 0), (10 10, 10 90, 90 90, 90 10, 10 10))',
+                     n_i=1, ext_ring_cs=((0, 0), (0, 100), (100, 100), (100, 0), (0, 0)), n_p=10, area=3600.0, centroid=(50., 50.),
+                     ),
+            TestGeom('POLYGON ((0 0, 0 100, 100 100, 100 0, 0 0), (10 10, 10 20, 20 20, 20 10, 10 10), (80 80, 80 90, 90 90, 90 80, 80 80))',
+                     n_i=2, ext_ring_cs=((0, 0), (0, 100), (100, 100), (100, 0), (0, 0)), n_p=15, area=9800.0, centroid=(50., 50.),
+                     ),
+            TestGeom('POLYGON ((0 0, 0 100, 100 100, 100 0, 0 0))',
+                     n_i=0, ext_ring_cs=((0, 0), (0, 100), (100, 100), (100, 0), (0, 0)), n_p=5, area=10000.0, centroid=(50., 50.),
+                     ),
+            TestGeom('POLYGON ((-95.3848703124799471 29.7056021479768511, -95.3851905195191847 29.7046588196500281, -95.3859356966379011 29.7025053545605502, -95.3860723000647539 29.7020963367038391, -95.3871517697222089 29.6989779021280995, -95.3865578518265522 29.6990856888057202, -95.3862634205175226 29.6999471753441782, -95.3861991779541967 29.6999591988978615, -95.3856773799358137 29.6998323107113578, -95.3856209915427229 29.6998005235473741, -95.3855833545501639 29.6996619391729801, -95.3855776331865002 29.6996232659570047, -95.3850162731712885 29.6997236706530536, -95.3831047357410284 29.7000847603095082, -95.3829800724914776 29.7000676365023502, -95.3828084594470909 29.6999969684031200, -95.3828131504821499 29.6999090511531065, -95.3828022942979601 29.6998152117366025, -95.3827893930918833 29.6997790953076759, -95.3825174668099862 29.6998267772748825, -95.3823521544804862 29.7000451723151606, -95.3820491918785223 29.6999682034582335, -95.3817932841505893 29.6999640407204772, -95.3815438924600443 29.7005983712500630, -95.3807812390843424 29.7007538492921590, -95.3778578936435935 29.7012966201172048, -95.3770817300034679 29.7010555145969093, -95.3772763716395957 29.7004995005932031, -95.3769891024414420 29.7005797730360186, -95.3759855007185990 29.7007754783987821, -95.3759516423090474 29.7007305400669388, -95.3765252155960042 29.6989549173240874, -95.3766842746727832 29.6985134987163164, -95.3768510987262914 29.6980530300744938, -95.3769198676258014 29.6977137204527573, -95.3769616670751930 29.6973351617272172, -95.3770309229297766 29.6969821084304186, -95.3772352596880637 29.6959751305871613, -95.3776232419333354 29.6945439060847463, -95.3776849628727064 29.6943364710766069, -95.3779699491714723 29.6926548349458947, -95.3781945479573494 29.6920088336742545, -95.3785807118394189 29.6908279316076005, -95.3787441368896651 29.6908846275832197, -95.3787903214163890 29.6907152912461640, -95.3791765069353659 29.6893335376821526, -95.3794935959513026 29.6884781789101595, -95.3796592071232112 29.6880066681407619, -95.3799788182090111 29.6873687353035081, -95.3801545516183893 29.6868782380716993, -95.3801258908302145 29.6867756621337762, -95.3801104284899566 29.6867229678809572, -95.3803803523746154 29.6863753372986459, -95.3821028558287622 29.6837392961470421, -95.3827289584682205 29.6828097375216160, -95.3827494698109035 29.6790739156259278, -95.3826022014838486 29.6776502228345507, -95.3825047356438063 29.6765773006280753, -95.3823473035336917 29.6750405250369127, -95.3824540163482055 29.6750076408228587, -95.3838984230304305 29.6745679207378679, -95.3916547074937426 29.6722459226508377, -95.3926154662749468 29.6719609085105489, -95.3967246645118081 29.6707316485589736, -95.3974588054406780 29.6705065336410989, -95.3978523748756828 29.6703795547846845, -95.3988598162279970 29.6700874981900853, -95.3995628600665952 29.6698505300412414, -95.4134721665944170 29.6656841279906232, -95.4143262068232616 29.6654291174019278, -95.4159685142480214 29.6649750989232288, -95.4180067396277565 29.6643253024318021, -95.4185886692196590 29.6641482768691063, -95.4234155309609662 29.6626925393704788, -95.4287785503196346 29.6611023620959706, -95.4310287312749352 29.6604222580752648, -95.4320295629628959 29.6603361318136720, -95.4332899683975739 29.6600560661713608, -95.4342675748811047 29.6598454934599900, -95.4343110414310871 29.6598411486215490, -95.4345576779282538 29.6598147020668499, -95.4348823041721630 29.6597875803673112, -95.4352827715209457 29.6597762346946681, -95.4355290431309982 29.6597827926562374, -95.4359197997999331 29.6598014511782715, -95.4361907884752156 29.6598444333523368, -95.4364608955807228 29.6598901433108217, -95.4367250147512323 29.6599494499910712, -95.4364898759758091 29.6601880616540186, -95.4354501111810691 29.6616378572201107, -95.4381459623171224 29.6631265631655126, -95.4367852490863129 29.6642266600024023, -95.4370040894557263 29.6643425389568769, -95.4367078350812648 29.6645492592343238, -95.4366081749871285 29.6646291473027297, -95.4358539359938192 29.6652308742342932, -95.4350327668927889 29.6658995989314462, -95.4350580905272921 29.6678812477895271, -95.4349710541447536 29.6680054925936965, -95.4349500440473548 29.6671410080890006, -95.4341492724148850 29.6678790545191688, -95.4340248868274728 29.6680353198492135, -95.4333227845797438 29.6689245624945990, -95.4331325652123326 29.6691616138940901, -95.4321314741096955 29.6704473333237253, -95.4320435792664341 29.6702578985411982, -95.4320147929883547 29.6701800936425109, -95.4319764538662980 29.6683246590817085, -95.4317490976340679 29.6684974372577166, -95.4305958185342718 29.6694049049170374, -95.4296600735653016 29.6701723430938493, -95.4284928989940937 29.6710931793380972, -95.4274630532378580 29.6719378813640091, -95.4273056811974811 29.6720684984625791, -95.4260554084574864 29.6730668861566969, -95.4253558063699643 29.6736342467365724, -95.4249278826026028 29.6739557343648919, -95.4248648873821423 29.6745400910786152, -95.4260016131471929 29.6750987014005858, -95.4258567183010911 29.6753452063069929, -95.4260238081486847 29.6754322077221353, -95.4258707374502393 29.6756647377294307, -95.4257951755816691 29.6756407098663360, -95.4257701599566985 29.6761077719536068, -95.4257726684792260 29.6761711204603955, -95.4257980187195614 29.6770219651929423, -95.4252712669032519 29.6770161558853758, -95.4249234392992065 29.6770068683962300, -95.4249574272905789 29.6779707498635759, -95.4244725881033702 29.6779825646764159, -95.4222269476429545 29.6780711474441716, -95.4223032371999267 29.6796029391538809, -95.4239133706588945 29.6795331493690355, -95.4224579084327331 29.6813706893847780, -95.4224290108823965 29.6821953228763924, -95.4230916478977349 29.6822130268724109, -95.4222928279595521 29.6832041816675343, -95.4228763710016352 29.6832087677714505, -95.4223401691637179 29.6838987872753748, -95.4211655906087088 29.6838784024852984, -95.4201984153205558 29.6851319258758082, -95.4206156387716362 29.6851623398125319, -95.4213438084897660 29.6851763011334739, -95.4212071118618752 29.6853679931624974, -95.4202651399651245 29.6865313962980508, -95.4172061157659783 29.6865816431043932, -95.4182217951255183 29.6872251197301544, -95.4178664826439160 29.6876750901471631, -95.4180678442928780 29.6877960336377207, -95.4188763472917572 29.6882826379510938, -95.4185374500596311 29.6887137897831934, -95.4182121713132290 29.6885097429738813, -95.4179857231741551 29.6888118367840086, -95.4183106010563620 29.6890048676118212, -95.4179489865331334 29.6894546700979056, -95.4175581746284820 29.6892323606815438, -95.4173439957341571 29.6894990139807007, -95.4177411199311081 29.6897435034738422, -95.4175789200209721 29.6899207529979208, -95.4170598559864800 29.6896042165807508, -95.4166733682539814 29.6900891174451367, -95.4165941362704331 29.6900347214235047, -95.4163537218065301 29.6903529467753238, -95.4126843270708775 29.6881086357212780, -95.4126604121378392 29.6880942378803496, -95.4126672298953338 29.6885951670109982, -95.4126680884821923 29.6887052446594275, -95.4158080137241882 29.6906382377959339, -95.4152061403821961 29.6910871045531586, -95.4155842583188161 29.6917382915894308, -95.4157426793520358 29.6920726941677096, -95.4154520563662203 29.6922052332446427, -95.4151389936167078 29.6923261661269571, -95.4148649784384872 29.6924343866430256, -95.4144051352401590 29.6925623927348106, -95.4146792019416665 29.6926770338507744, -95.4148824479948985 29.6928117893696388, -95.4149851734360226 29.6929823719519774, -95.4140436551925291 29.6929626643100946, -95.4140465993023241 29.6926545917254892, -95.4137269186733334 29.6927395764256090, -95.4137372859685513 29.6935432485666624, -95.4135702836218655 29.6933186678088283, -95.4133925235973237 29.6930415229852152, -95.4133017035615580 29.6928685062036166, -95.4129588921634593 29.6929391128977862, -95.4125107395559695 29.6930481664661485, -95.4102647423187307 29.6935850183258019, -95.4081931340840157 29.6940907430947760, -95.4078783596459772 29.6941703429951609, -95.4049213975000043 29.6948723732981961, -95.4045944244127071 29.6949626434239207, -95.4045865139788134 29.6954109019001358, -95.4045953345484037 29.6956972800496963, -95.4038879332535146 29.6958296089365490, -95.4040366394459340 29.6964389004769842, -95.4032774779020798 29.6965643341263892, -95.4026066501239853 29.6966646227683881, -95.4024991226393837 29.6961389766619703, -95.4011781398631911 29.6963566063186377, -95.4011524097636112 29.6962596176762190, -95.4018184046368276 29.6961399466727336, -95.4016995838361908 29.6956442609415099, -95.4007100753964608 29.6958900524002978, -95.4008032469935188 29.6962639900781404, -95.3995660267125487 29.6965636449370329, -95.3996140564775601 29.6967877962763644, -95.3996364430014410 29.6968901984825280, -95.3984003269631842 29.6968679634805746, -95.3981442026887265 29.6983660679730335, -95.3980178461957706 29.6990890276252415, -95.3977097967130163 29.7008526152273049, -95.3962347157626027 29.7009697553607630, -95.3951949050136250 29.7004740386619019, -95.3957564950617183 29.6990281830553187, -95.3965927101519924 29.6968771129030706, -95.3957496517238184 29.6970800358387095, -95.3957720559467361 29.6972264611230727, -95.3957391586571788 29.6973548894558732, -95.3956286413405365 29.6974949857280883, -95.3955111053256957 29.6975661086270186, -95.3953215342724121 29.6976022763384790, -95.3951795558443365 29.6975846977491038, -95.3950369632041060 29.6975175779330200, -95.3949401089966500 29.6974269267953304, -95.3948740281415581 29.6972903308506346, -95.3946650813866910 29.6973397326847923, -95.3947654059391112 29.6974882560192022, -95.3949627316619768 29.6980355864961858, -95.3933200807862249 29.6984590863712796, -95.3932606497523494 29.6984464798710839, -95.3932983699113350 29.6983154306484352, -95.3933058014696655 29.6982165816983610, -95.3932946347785133 29.6981089778195759, -95.3931780601756287 29.6977068906794841, -95.3929928222970602 29.6977541771878180, -95.3930873169846478 29.6980676264932946, -95.3932743746374570 29.6981249406449663, -95.3929512584706316 29.6989526513922222, -95.3919850280655197 29.7014358632108646, -95.3918950918929056 29.7014169320765724, -95.3916928317890296 29.7019232352846423, -95.3915424614970959 29.7022988712928289, -95.3901530441668939 29.7058519502930061, -95.3899656322116698 29.7059156823562418, -95.3897628748670883 29.7059900058266777, -95.3896062677805787 29.7060738276384946, -95.3893941800512266 29.7061891695242046, -95.3892150365492455 29.7062641292949436, -95.3890502563035199 29.7063339729630940, -95.3888717930715586 29.7063896908080736, -95.3886925428988945 29.7064453871994978, -95.3885376849411983 29.7064797304524149, -95.3883284158984139 29.7065153575050189, -95.3881046767627794 29.7065368368267357, -95.3878809284696132 29.7065363048447537, -95.3876046356120924 29.7065288525102424, -95.3873060894974714 29.7064822806001452, -95.3869851943158409 29.7063993367575350, -95.3865967896568065 29.7062870572919202, -95.3861785624983156 29.7061492099008184, -95.3857375009733488 29.7059887337478798, -95.3854573290902152 29.7058683664514618, -95.3848703124799471 29.7056021479768511))',
+                     n_i=0, ext_ring_cs=False, n_p=264, area=0.00129917360654, centroid=(-95.403569179437341, 29.681772571690402),
+                     ),
+            )
+
+# MultiPolygons
+multipolygons = (TestGeom('MULTIPOLYGON (((100 20, 180 20, 180 100, 100 100, 100 20)), ((20 100, 100 100, 100 180, 20 180, 20 100)), ((100 180, 180 180, 180 260, 100 260, 100 180)), ((180 100, 260 100, 260 180, 180 180, 180 100)))', valid=True, num_geom=4, n_p=20),
+                 TestGeom('MULTIPOLYGON (((60 300, 320 220, 260 60, 60 100, 60 300)), ((60 300, 320 220, 260 60, 60 100, 60 300)))', valid=False),
+                 TestGeom('MULTIPOLYGON (((180 60, 240 160, 300 60, 180 60)), ((80 80, 180 60, 160 140, 240 160, 360 140, 300 60, 420 100, 320 280, 120 260, 80 80)))', valid=True, num_geom=2, n_p=14),
+                 )
+
+# Points
+points = (TestGeom('POINT (5 23)', x=5.0, y=23.0, centroid=(5.0, 23.0)),
+          TestGeom('POINT (-95.338492 29.723893)', x=-95.338492, y=29.723893, centroid=(-95.338492, 29.723893)),
+          TestGeom('POINT(1.234 5.678)', x=1.234, y=5.678, centroid=(1.234, 5.678)),
+          TestGeom('POINT(4.321 8.765)', x=4.321, y=8.765, centroid=(4.321, 8.765)),
+          TestGeom('POINT(10 10)', x=10, y=10, centroid=(10., 10.)),
+          TestGeom('POINT (5 23 8)', x=5.0, y=23.0, z=8.0, centroid=(5.0, 23.0)),
+          )
+
+# MultiPoints
+multipoints = (TestGeom('MULTIPOINT(10 10, 20 20 )', n_p=2, points=((10., 10.), (20., 20.)), centroid=(15., 15.)),
+               TestGeom('MULTIPOINT(10 10, 20 20, 10 20, 20 10)',
+                        n_p=4, points=((10., 10.), (20., 20.), (10., 20.), (20., 10.)),
+                        centroid=(15., 15.)),
+               )
+
+# LineStrings
+linestrings = (TestGeom('LINESTRING (60 180, 120 100, 180 180)', n_p=3, centroid=(120, 140), tup=((60, 180), (120, 100), (180, 180))),
+               TestGeom('LINESTRING (0 0, 5 5, 10 5, 10 10)', n_p=4, centroid=(6.1611652351681556, 4.6966991411008934), tup=((0, 0), (5, 5), (10, 5), (10, 10)),),
+               )
+
+# Linear Rings
+linearrings = (TestGeom('LINEARRING (649899.3065171393100172 4176512.3807915160432458, 649902.7294133581453934 4176512.7834989596158266, 649906.5550170192727819 4176514.3942507002502680, 649910.5820134161040187 4176516.0050024418160319, 649914.4076170771149918 4176518.0184616246260703, 649917.2264131171396002 4176519.4278986593708396, 649920.0452871860470623 4176521.6427505780011415, 649922.0587463703704998 4176522.8507948759943247, 649924.2735982896992937 4176524.4616246484220028, 649926.2870574744883925 4176525.4683542405255139, 649927.8978092158213258 4176526.8777912775985897, 649929.3072462501004338 4176528.0858355751261115, 649930.1126611357321963 4176529.4952726080082357, 649927.4951798024121672 4176506.9444361114874482, 649899.3065171393100172 4176512.3807915160432458)', n_p=15),
+               )
+
+# MultiLineStrings
+multilinestrings = (TestGeom('MULTILINESTRING ((0 0, 0 100), (100 0, 100 100))', n_p=4, centroid=(50, 50), tup=(((0, 0), (0, 100)), ((100, 0), (100, 100)))),
+                    TestGeom('MULTILINESTRING ((20 20, 60 60), (20 -20, 60 -60), (-20 -20, -60 -60), (-20 20, -60 60), (-80 0, 0 80, 80 0, 0 -80, -80 0), (-40 20, -40 -20), (-20 40, 20 40), (40 20, 40 -20), (20 -40, -20 -40))',
+                             n_p=21, centroid=(0, 0), tup=(((20., 20.), (60., 60.)), ((20., -20.), (60., -60.)), ((-20., -20.), (-60., -60.)), ((-20., 20.), (-60., 60.)), ((-80., 0.), (0., 80.), (80., 0.), (0., -80.), (-80., 0.)), ((-40., 20.), (-40., -20.)), ((-20., 40.), (20., 40.)), ((40., 20.), (40., -20.)), ((20., -40.), (-20., -40.))))
+                    )
+
+# ====================================================
+# Topology Operations
+
+topology_geoms = ( (TestGeom('POLYGON ((-5.0 0.0, -5.0 10.0, 5.0 10.0, 5.0 0.0, -5.0 0.0))'),
+                    TestGeom('POLYGON ((0.0 -5.0, 0.0 5.0, 10.0 5.0, 10.0 -5.0, 0.0 -5.0))')
+                    ),
+                   (TestGeom('POLYGON ((2 0, 18 0, 18 15, 2 15, 2 0))'),
+                    TestGeom('POLYGON ((10 1, 11 3, 13 4, 15 6, 16 8, 16 10, 15 12, 13 13, 11 12, 10 10, 9 12, 7 13, 5 12, 4 10, 4 8, 5 6, 7 4, 9 3, 10 1))'),
+                    ),
+                   )
+
+intersect_geoms = ( TestGeom('POLYGON ((5 5,5 0,0 0,0 5,5 5))'),
+                    TestGeom('POLYGON ((10 1, 9 3, 7 4, 5 6, 4 8, 4 10, 5 12, 7 13, 9 12, 10 10, 11 12, 13 13, 15 12, 16 10, 16 8, 15 6, 13 4, 11 3, 10 1))'),
+                    )
+
+union_geoms = ( TestGeom('POLYGON ((-5 0,-5 10,5 10,5 5,10 5,10 -5,0 -5,0 0,-5 0))'),
+                TestGeom('POLYGON ((2 0, 2 15, 18 15, 18 0, 2 0))'),
+                )
+
+diff_geoms = ( TestGeom('POLYGON ((-5 0,-5 10,5 10,5 5,0 5,0 0,-5 0))'),
+               TestGeom('POLYGON ((2 0, 2 15, 18 15, 18 0, 2 0), (10 1, 11 3, 13 4, 15 6, 16 8, 16 10, 15 12, 13 13, 11 12, 10 10, 9 12, 7 13, 5 12, 4 10, 4 8, 5 6, 7 4, 9 3, 10 1))'),
+               )
+
+sdiff_geoms = ( TestGeom('MULTIPOLYGON (((-5 0,-5 10,5 10,5 5,0 5,0 0,-5 0)),((0 0,5 0,5 5,10 5,10 -5,0 -5,0 0)))'),
+                TestGeom('POLYGON ((2 0, 2 15, 18 15, 18 0, 2 0), (10 1, 11 3, 13 4, 15 6, 16 8, 16 10, 15 12, 13 13, 11 12, 10 10, 9 12, 7 13, 5 12, 4 10, 4 8, 5 6, 7 4, 9 3, 10 1))'),
+                )
+
+relate_geoms = ( (TestGeom('MULTIPOINT(80 70, 20 20, 200 170, 140 120)'),
+                  TestGeom('MULTIPOINT(80 170, 140 120, 200 80, 80 70)'),
+                  '0F0FFF0F2', True,),
+                 (TestGeom('POINT(20 20)'), TestGeom('POINT(40 60)'),
+                  'FF0FFF0F2', True,),
+                 (TestGeom('POINT(110 110)'), TestGeom('LINESTRING(200 200, 110 110, 200 20, 20 20, 110 110, 20 200, 200 200)'),
+                  '0FFFFF1F2', True,),
+                 (TestGeom('MULTILINESTRING((20 20, 90 20, 170 20), (90 20, 90 80, 90 140))'),
+                  TestGeom('MULTILINESTRING((90 20, 170 100, 170 140), (130 140, 130 60, 90 20, 20 90, 90 20))'),
+                  'FF10F0102', True,),
+                 )
+
+buffer_geoms = ( (TestGeom('POINT(0 0)'),
+                  TestGeom('POLYGON ((5 0,4.903926402016153 -0.97545161008064,4.619397662556435 -1.913417161825447,4.157348061512728 -2.777851165098009,3.53553390593274 -3.535533905932735,2.777851165098015 -4.157348061512724,1.913417161825454 -4.619397662556431,0.975451610080648 -4.903926402016151,0.000000000000008 -5.0,-0.975451610080632 -4.903926402016154,-1.913417161825439 -4.619397662556437,-2.777851165098002 -4.157348061512732,-3.53553390593273 -3.535533905932746,-4.157348061512719 -2.777851165098022,-4.619397662556429 -1.913417161825462,-4.903926402016149 -0.975451610080656,-5.0 -0.000000000000016,-4.903926402016156 0.975451610080624,-4.619397662556441 1.913417161825432,-4.157348061512737 2.777851165097995,-3.535533905932752 3.535533905932723,-2.777851165098029 4.157348061512714,-1.913417161825468 4.619397662556426,-0.975451610080661 4.903926402016149,-0.000000000000019 5.0,0.975451610080624 4.903926402016156,1.913417161825434 4.61939766255644,2.777851165097998 4.157348061512735,3.535533905932727 3.535533905932748,4.157348061512719 2.777851165098022,4.619397662556429 1.91341716182546,4.90392640201615 0.975451610080652,5 0))'),
+                  5.0, 8),
+                 (TestGeom('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))'),
+                  TestGeom('POLYGON ((-2 0,-2 10,-1.961570560806461 10.390180644032258,-1.847759065022573 10.765366864730179,-1.662939224605091 11.111140466039204,-1.414213562373095 11.414213562373096,-1.111140466039204 11.662939224605092,-0.765366864730179 11.847759065022574,-0.390180644032256 11.961570560806461,0 12,10 12,10.390180644032256 11.961570560806461,10.765366864730179 11.847759065022574,11.111140466039204 11.66293922460509,11.414213562373096 11.414213562373096,11.66293922460509 11.111140466039204,11.847759065022574 10.765366864730179,11.961570560806461 10.390180644032256,12 10,12 0,11.961570560806461 -0.390180644032256,11.847759065022574 -0.76536686473018,11.66293922460509 -1.111140466039204,11.414213562373096 -1.414213562373095,11.111140466039204 -1.66293922460509,10.765366864730179 -1.847759065022573,10.390180644032256 -1.961570560806461,10 -2,0.0 -2.0,-0.390180644032255 -1.961570560806461,-0.765366864730177 -1.847759065022575,-1.1111404660392 -1.662939224605093,-1.41421356237309 -1.4142135623731,-1.662939224605086 -1.111140466039211,-1.84775906502257 -0.765366864730189,-1.961570560806459 -0.390180644032268,-2 0))'),
+                  2.0, 8),
+                 )
+
+json_geoms = (TestGeom('POINT(100 0)', json='{ "type": "Point", "coordinates": [ 100.000000, 0.000000 ] }'),
+              TestGeom('POLYGON((0 0, -10 0, -10 -10, 0 -10, 0 0))', json='{ "type": "Polygon", "coordinates": [ [ [ 0.000000, 0.000000 ], [ -10.000000, 0.000000 ], [ -10.000000, -10.000000 ], [ 0.000000, -10.000000 ], [ 0.000000, 0.000000 ] ] ] }'),
+              TestGeom('MULTIPOLYGON(((102 2, 103 2, 103 3, 102 3, 102 2)), ((100.0 0.0, 101.0 0.0, 101.0 1.0, 100.0 1.0, 100.0 0.0), (100.2 0.2, 100.8 0.2, 100.8 0.8, 100.2 0.8, 100.2 0.2)))', json='{ "type": "MultiPolygon", "coordinates": [ [ [ [ 102.000000, 2.000000 ], [ 103.000000, 2.000000 ], [ 103.000000, 3.000000 ], [ 102.000000, 3.000000 ], [ 102.000000, 2.000000 ] ] ], [ [ [ 100.000000, 0.000000 ], [ 101.000000, 0.000000 ], [ 101.000000, 1.000000 ], [ 100.000000, 1.000000 ], [ 100.000000, 0.000000 ] ], [ [ 100.200000, 0.200000 ], [ 100.800000, 0.200000 ], [ 100.800000, 0.800000 ], [ 100.200000, 0.800000 ], [ 100.200000, 0.200000 ] ] ] ] }'),
+              )
diff --git a/webapp/django/contrib/gis/tests/layermap/__init__.py b/webapp/django/contrib/gis/tests/layermap/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/layermap/__init__.py
diff --git a/webapp/django/contrib/gis/tests/layermap/cities/cities.dbf b/webapp/django/contrib/gis/tests/layermap/cities/cities.dbf
new file mode 100644
index 0000000..8b27633
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/layermap/cities/cities.dbf
Binary files differ
diff --git a/webapp/django/contrib/gis/tests/layermap/cities/cities.prj b/webapp/django/contrib/gis/tests/layermap/cities/cities.prj
new file mode 100644
index 0000000..a30c00a
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/layermap/cities/cities.prj
@@ -0,0 +1 @@
+GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]
\ No newline at end of file
diff --git a/webapp/django/contrib/gis/tests/layermap/cities/cities.shp b/webapp/django/contrib/gis/tests/layermap/cities/cities.shp
new file mode 100644
index 0000000..1c46ccc
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/layermap/cities/cities.shp
Binary files differ
diff --git a/webapp/django/contrib/gis/tests/layermap/cities/cities.shx b/webapp/django/contrib/gis/tests/layermap/cities/cities.shx
new file mode 100644
index 0000000..6be3fd6
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/layermap/cities/cities.shx
Binary files differ
diff --git a/webapp/django/contrib/gis/tests/layermap/counties/counties.dbf b/webapp/django/contrib/gis/tests/layermap/counties/counties.dbf
new file mode 100644
index 0000000..ccdbb26
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/layermap/counties/counties.dbf
Binary files differ
diff --git a/webapp/django/contrib/gis/tests/layermap/counties/counties.shp b/webapp/django/contrib/gis/tests/layermap/counties/counties.shp
new file mode 100644
index 0000000..2e7dca5
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/layermap/counties/counties.shp
Binary files differ
diff --git a/webapp/django/contrib/gis/tests/layermap/counties/counties.shx b/webapp/django/contrib/gis/tests/layermap/counties/counties.shx
new file mode 100644
index 0000000..46ed3bb
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/layermap/counties/counties.shx
Binary files differ
diff --git a/webapp/django/contrib/gis/tests/layermap/interstates/interstates.dbf b/webapp/django/contrib/gis/tests/layermap/interstates/interstates.dbf
new file mode 100644
index 0000000..a88d171
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/layermap/interstates/interstates.dbf
Binary files differ
diff --git a/webapp/django/contrib/gis/tests/layermap/interstates/interstates.prj b/webapp/django/contrib/gis/tests/layermap/interstates/interstates.prj
new file mode 100644
index 0000000..a30c00a
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/layermap/interstates/interstates.prj
@@ -0,0 +1 @@
+GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]
\ No newline at end of file
diff --git a/webapp/django/contrib/gis/tests/layermap/interstates/interstates.shp b/webapp/django/contrib/gis/tests/layermap/interstates/interstates.shp
new file mode 100644
index 0000000..6d93de7
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/layermap/interstates/interstates.shp
Binary files differ
diff --git a/webapp/django/contrib/gis/tests/layermap/interstates/interstates.shx b/webapp/django/contrib/gis/tests/layermap/interstates/interstates.shx
new file mode 100644
index 0000000..7b9088a
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/layermap/interstates/interstates.shx
Binary files differ
diff --git a/webapp/django/contrib/gis/tests/layermap/models.py b/webapp/django/contrib/gis/tests/layermap/models.py
new file mode 100644
index 0000000..5dbd528
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/layermap/models.py
@@ -0,0 +1,52 @@
+from django.contrib.gis.db import models
+
+class State(models.Model):
+    name = models.CharField(max_length=20)
+    objects = models.GeoManager()
+
+class County(models.Model):
+    name = models.CharField(max_length=25)
+    state = models.ForeignKey(State)
+    mpoly = models.MultiPolygonField(srid=4269) # Multipolygon in NAD83
+    objects = models.GeoManager()
+
+class CountyFeat(models.Model):
+    name = models.CharField(max_length=25)
+    poly = models.PolygonField(srid=4269)
+    objects = models.GeoManager()
+
+class City(models.Model):
+    name = models.CharField(max_length=25)
+    population = models.IntegerField()
+    density = models.DecimalField(max_digits=7, decimal_places=1)
+    dt = models.DateField()
+    point = models.PointField()
+    objects = models.GeoManager()
+
+class Interstate(models.Model):
+    name = models.CharField(max_length=20)
+    length = models.DecimalField(max_digits=6, decimal_places=2)
+    path = models.LineStringField()
+    objects = models.GeoManager()
+
+# Mapping dictionaries for the models above.
+co_mapping = {'name' : 'Name',
+              'state' : {'name' : 'State'}, # ForeignKey's use another mapping dictionary for the _related_ Model (State in this case).
+              'mpoly' : 'MULTIPOLYGON', # Will convert POLYGON features into MULTIPOLYGONS.
+              }
+
+cofeat_mapping = {'name' : 'Name',
+                  'poly' : 'POLYGON',
+                  }
+
+city_mapping = {'name' : 'Name',
+                'population' : 'Population',
+                'density' : 'Density',
+                'dt' : 'Created',
+                'point' : 'POINT',
+                }
+
+inter_mapping = {'name' : 'Name',
+                 'length' : 'Length',
+                 'path' : 'LINESTRING',
+                 }
diff --git a/webapp/django/contrib/gis/tests/layermap/tests.py b/webapp/django/contrib/gis/tests/layermap/tests.py
new file mode 100644
index 0000000..740ab86
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/layermap/tests.py
@@ -0,0 +1,249 @@
+import os, unittest
+from copy import copy
+from datetime import date
+from decimal import Decimal
+from models import City, County, CountyFeat, Interstate, State, city_mapping, co_mapping, cofeat_mapping, inter_mapping
+from django.contrib.gis.utils.layermapping import LayerMapping, LayerMapError, InvalidDecimal, MissingForeignKey
+from django.contrib.gis.gdal import DataSource
+
+shp_path = os.path.dirname(__file__)
+city_shp = os.path.join(shp_path, 'cities/cities.shp')
+co_shp = os.path.join(shp_path, 'counties/counties.shp')
+inter_shp = os.path.join(shp_path, 'interstates/interstates.shp')
+
+# Dictionaries to hold what's expected in the county shapefile.  
+NAMES  = ['Bexar', 'Galveston', 'Harris', 'Honolulu', 'Pueblo']
+NUMS   = [1, 2, 1, 19, 1] # Number of polygons for each.                                                                                                                                                  
+STATES = ['Texas', 'Texas', 'Texas', 'Hawaii', 'Colorado']
+
+class LayerMapTest(unittest.TestCase):
+
+    def test01_init(self):
+        "Testing LayerMapping initialization."
+
+        # Model field that does not exist.
+        bad1 = copy(city_mapping)
+        bad1['foobar'] = 'FooField'
+
+        # Shapefile field that does not exist.
+        bad2 = copy(city_mapping)
+        bad2['name'] = 'Nombre'
+
+        # Nonexistent geographic field type.
+        bad3 = copy(city_mapping)
+        bad3['point'] = 'CURVE'
+
+        # Incrementing through the bad mapping dictionaries and
+        # ensuring that a LayerMapError is raised.
+        for bad_map in (bad1, bad2, bad3):
+            try:
+                lm = LayerMapping(City, city_shp, bad_map)
+            except LayerMapError:
+                pass
+            else:
+                self.fail('Expected a LayerMapError.')
+
+        # A LookupError should be thrown for bogus encodings.
+        try:
+            lm = LayerMapping(City, city_shp, city_mapping, encoding='foobar')
+        except LookupError:
+            pass
+        else:
+            self.fail('Expected a LookupError')
+
+    def test02_simple_layermap(self):
+        "Test LayerMapping import of a simple point shapefile."
+
+        # Setting up for the LayerMapping.
+        lm = LayerMapping(City, city_shp, city_mapping)
+        lm.save()
+
+        # There should be three cities in the shape file.
+        self.assertEqual(3, City.objects.count())
+
+        # Opening up the shapefile, and verifying the values in each
+        # of the features made it to the model.
+        ds = DataSource(city_shp)
+        layer = ds[0]
+        for feat in layer:
+            city = City.objects.get(name=feat['Name'].value)
+            self.assertEqual(feat['Population'].value, city.population)
+            self.assertEqual(Decimal(str(feat['Density'])), city.density)
+            self.assertEqual(feat['Created'].value, city.dt)
+
+            # Comparing the geometries.
+            pnt1, pnt2 = feat.geom, city.point
+            self.assertAlmostEqual(pnt1.x, pnt2.x, 6)
+            self.assertAlmostEqual(pnt1.y, pnt2.y, 6)
+
+    def test03_layermap_strict(self):
+        "Testing the `strict` keyword, and import of a LineString shapefile."
+
+        # When the `strict` keyword is set an error encountered will force
+        # the importation to stop.
+        try:
+            lm = LayerMapping(Interstate, inter_shp, inter_mapping)
+            lm.save(silent=True, strict=True)
+        except InvalidDecimal:
+            pass
+        else:
+            self.fail('Should have failed on strict import with invalid decimal values.')
+
+        # This LayerMapping should work b/c `strict` is not set.
+        lm = LayerMapping(Interstate, inter_shp, inter_mapping)
+        lm.save(silent=True)
+
+        # Two interstate should have imported correctly.
+        self.assertEqual(2, Interstate.objects.count())
+        
+        # Verifying the values in the layer w/the model.
+        ds = DataSource(inter_shp)
+
+        # Only the first two features of this shapefile are valid.
+        valid_feats = ds[0][:2]
+        for feat in valid_feats:
+            istate = Interstate.objects.get(name=feat['Name'].value)
+            
+            if feat.fid == 0:
+                self.assertEqual(Decimal(str(feat['Length'])), istate.length)
+            elif feat.fid == 1:
+                # Everything but the first two decimal digits were truncated,
+                # because the Interstate model's `length` field has decimal_places=2.
+                self.assertAlmostEqual(feat.get('Length'), float(istate.length), 2)
+
+            for p1, p2 in zip(feat.geom, istate.path):
+                self.assertAlmostEqual(p1[0], p2[0], 6)
+                self.assertAlmostEqual(p1[1], p2[1], 6)
+
+    def county_helper(self, county_feat=True):
+        "Helper function for ensuring the integrity of the mapped County models."
+        
+        for name, n, st in zip(NAMES, NUMS, STATES):
+            # Should only be one record b/c of `unique` keyword.
+            c = County.objects.get(name=name)
+            self.assertEqual(n, len(c.mpoly))
+            self.assertEqual(st, c.state.name) # Checking ForeignKey mapping.
+            
+            # Multiple records because `unique` was not set.
+            if county_feat:
+                qs = CountyFeat.objects.filter(name=name)
+                self.assertEqual(n, qs.count())
+
+    def test04_layermap_unique_multigeometry_fk(self):
+        "Testing the `unique`, and `transform`, geometry collection conversion, and ForeignKey mappings."
+        # All the following should work.
+        try:
+            # Telling LayerMapping that we want no transformations performed on the data.
+            lm = LayerMapping(County, co_shp, co_mapping, transform=False)
+        
+            # Specifying the source spatial reference system via the `source_srs` keyword.
+            lm = LayerMapping(County, co_shp, co_mapping, source_srs=4269)
+            lm = LayerMapping(County, co_shp, co_mapping, source_srs='NAD83')
+
+            # Unique may take tuple or string parameters.
+            for arg in ('name', ('name', 'mpoly')):
+                lm = LayerMapping(County, co_shp, co_mapping, transform=False, unique=arg)
+        except:
+            self.fail('No exception should be raised for proper use of keywords.')
+            
+        # Testing invalid params for the `unique` keyword.
+        for e, arg in ((TypeError, 5.0), (ValueError, 'foobar'), (ValueError, ('name', 'mpolygon'))):
+            self.assertRaises(e, LayerMapping, County, co_shp, co_mapping, transform=False, unique=arg)
+
+        # No source reference system defined in the shapefile, should raise an error.
+        self.assertRaises(LayerMapError, LayerMapping, County, co_shp, co_mapping)
+
+        # Passing in invalid ForeignKey mapping parameters -- must be a dictionary
+        # mapping for the model the ForeignKey points to.
+        bad_fk_map1 = copy(co_mapping); bad_fk_map1['state'] = 'name'
+        bad_fk_map2 = copy(co_mapping); bad_fk_map2['state'] = {'nombre' : 'State'}
+        self.assertRaises(TypeError, LayerMapping, County, co_shp, bad_fk_map1, transform=False)
+        self.assertRaises(LayerMapError, LayerMapping, County, co_shp, bad_fk_map2, transform=False)
+
+        # There exist no State models for the ForeignKey mapping to work -- should raise
+        # a MissingForeignKey exception (this error would be ignored if the `strict`
+        # keyword is not set).
+        lm = LayerMapping(County, co_shp, co_mapping, transform=False, unique='name')
+        self.assertRaises(MissingForeignKey, lm.save, silent=True, strict=True)
+
+        # Now creating the state models so the ForeignKey mapping may work.
+        co, hi, tx = State(name='Colorado'), State(name='Hawaii'), State(name='Texas')
+        co.save(), hi.save(), tx.save()
+
+        # If a mapping is specified as a collection, all OGR fields that
+        # are not collections will be converted into them.  For example,
+        # a Point column would be converted to MultiPoint. Other things being done
+        # w/the keyword args:
+        #  `transform=False`: Specifies that no transform is to be done; this 
+        #    has the effect of ignoring the spatial reference check (because the
+        #    county shapefile does not have implicit spatial reference info).
+        # 
+        #  `unique='name'`: Creates models on the condition that they have 
+        #    unique county names; geometries from each feature however will be
+        #    appended to the geometry collection of the unique model.  Thus,
+        #    all of the various islands in Honolulu county will be in in one
+        #    database record with a MULTIPOLYGON type.
+        lm = LayerMapping(County, co_shp, co_mapping, transform=False, unique='name')
+        lm.save(silent=True, strict=True)
+
+        # A reference that doesn't use the unique keyword; a new database record will
+        # created for each polygon.
+        lm = LayerMapping(CountyFeat, co_shp, cofeat_mapping, transform=False)
+        lm.save(silent=True, strict=True)
+
+        # The county helper is called to ensure integrity of County models.
+        self.county_helper()
+
+    def test05_test_fid_range_step(self):
+        "Tests the `fid_range` keyword and the `step` keyword of .save()."
+        
+        # Function for clearing out all the counties before testing.
+        def clear_counties(): County.objects.all().delete()
+        
+        # Initializing the LayerMapping object to use in these tests.
+        lm = LayerMapping(County, co_shp, co_mapping, transform=False, unique='name')
+
+        # Bad feature id ranges should raise a type error.
+        clear_counties()
+        bad_ranges = (5.0, 'foo', co_shp)
+        for bad in bad_ranges:
+            self.assertRaises(TypeError, lm.save, fid_range=bad)
+
+        # Step keyword should not be allowed w/`fid_range`.
+        fr = (3, 5) # layer[3:5]
+        self.assertRaises(LayerMapError, lm.save, fid_range=fr, step=10) 
+        lm.save(fid_range=fr)
+        
+        # Features IDs 3 & 4 are for Galveston County, Texas -- only
+        # one model is returned because the `unique` keyword was set.
+        qs = County.objects.all()
+        self.assertEqual(1, qs.count())
+        self.assertEqual('Galveston', qs[0].name)
+
+        # Features IDs 5 and beyond for Honolulu County, Hawaii, and
+        # FID 0 is for Pueblo County, Colorado.
+        clear_counties()
+        lm.save(fid_range=slice(5, None), silent=True, strict=True) # layer[5:]
+        lm.save(fid_range=slice(None, 1), silent=True, strict=True) # layer[:1]
+
+        # Only Pueblo & Honolulu counties should be present because of
+        # the `unique` keyword.
+        qs = County.objects.all()
+        self.assertEqual(2, qs.count())
+        hi, co = tuple(qs)
+        hi_idx, co_idx = tuple(map(NAMES.index, ('Honolulu', 'Pueblo')))
+        self.assertEqual('Pueblo', co.name); self.assertEqual(NUMS[co_idx], len(co.mpoly))
+        self.assertEqual('Honolulu', hi.name); self.assertEqual(NUMS[hi_idx], len(hi.mpoly))
+
+        # Testing the `step` keyword -- should get the same counties
+        # regardless of we use a step that divides equally, that is odd,
+        # or that is larger than the dataset.
+        for st in (4,7,1000):
+            clear_counties()
+            lm.save(step=st, strict=True)
+            self.county_helper(county_feat=False)
+
+def suite():
+    s = unittest.TestSuite()
+    s.addTest(unittest.makeSuite(LayerMapTest))
+    return s
diff --git a/webapp/django/contrib/gis/tests/relatedapp/__init__.py b/webapp/django/contrib/gis/tests/relatedapp/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/relatedapp/__init__.py
diff --git a/webapp/django/contrib/gis/tests/relatedapp/models.py b/webapp/django/contrib/gis/tests/relatedapp/models.py
new file mode 100644
index 0000000..8484054
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/relatedapp/models.py
@@ -0,0 +1,12 @@
+from django.contrib.gis.db import models
+
+class Location(models.Model):
+    name = models.CharField(max_length=50)
+    point = models.PointField()
+    objects = models.GeoManager()
+
+class City(models.Model):
+    name = models.CharField(max_length=50)
+    state = models.USStateField()
+    location = models.ForeignKey(Location)
+    objects = models.GeoManager()
diff --git a/webapp/django/contrib/gis/tests/relatedapp/tests.py b/webapp/django/contrib/gis/tests/relatedapp/tests.py
new file mode 100644
index 0000000..5fe63cb
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/relatedapp/tests.py
@@ -0,0 +1,98 @@
+import os, unittest
+from django.contrib.gis.geos import *
+from django.contrib.gis.tests.utils import no_mysql, postgis
+from django.conf import settings
+from models import City, Location
+
+cities = (('Aurora', 'TX', -97.516111, 33.058333),
+          ('Roswell', 'NM', -104.528056, 33.387222),
+          ('Kecksburg', 'PA',  -79.460734, 40.18476),
+           )
+
+class RelatedGeoModelTest(unittest.TestCase):
+    
+    def test01_setup(self):
+        "Setting up for related model tests."
+        for name, state, lon, lat in cities:
+            loc = Location(point=Point(lon, lat))
+            loc.save()
+            c = City(name=name, state=state, location=loc)
+            c.save()
+            
+    def test02_select_related(self):
+        "Testing `select_related` on geographic models (see #7126)."
+        qs1 = City.objects.all()
+        qs2 = City.objects.select_related()
+        qs3 = City.objects.select_related('location')
+
+        for qs in (qs1, qs2, qs3):
+            for ref, c in zip(cities, qs):
+                nm, st, lon, lat = ref
+                self.assertEqual(nm, c.name)
+                self.assertEqual(st, c.state)
+                self.assertEqual(Point(lon, lat), c.location.point)
+        
+    @no_mysql
+    def test03_transform_related(self):
+        "Testing the `transform` GeoQuerySet method on related geographic models."
+        # All the transformations are to state plane coordinate systems using
+        # US Survey Feet (thus a tolerance of 0 implies error w/in 1 survey foot).
+        if postgis:
+            tol = 3
+            nqueries = 4 # +1 for `postgis_lib_version`
+        else:
+            tol = 0
+            nqueries = 3
+            
+        def check_pnt(ref, pnt):
+            self.assertAlmostEqual(ref.x, pnt.x, tol)
+            self.assertAlmostEqual(ref.y, pnt.y, tol)
+            self.assertEqual(ref.srid, pnt.srid)
+
+        # Turning on debug so we can manually verify the number of SQL queries issued.
+        # DISABLED: the number of queries count testing mechanism is way too brittle.
+        #dbg = settings.DEBUG
+        #settings.DEBUG = True
+        from django.db import connection
+
+        # Each city transformed to the SRID of their state plane coordinate system.
+        transformed = (('Kecksburg', 2272, 'POINT(1490553.98959621 314792.131023984)'),
+                       ('Roswell', 2257, 'POINT(481902.189077221 868477.766629735)'),
+                       ('Aurora', 2276, 'POINT(2269923.2484839 7069381.28722222)'),
+                       )
+
+        for name, srid, wkt in transformed:
+            # Doing this implicitly sets `select_related` select the location.
+            qs = list(City.objects.filter(name=name).transform(srid, field_name='location__point'))
+            check_pnt(GEOSGeometry(wkt, srid), qs[0].location.point) 
+        #settings.DEBUG= dbg
+
+        # Verifying the number of issued SQL queries.
+        #self.assertEqual(nqueries, len(connection.queries))
+
+    @no_mysql
+    def test04_related_aggregate(self):
+        "Testing the `extent` and `unionagg` GeoQuerySet aggregates on related geographic models."
+        if postgis:
+            # One for all locations, one that excludes Roswell.
+            all_extent = (-104.528060913086, 33.0583305358887,-79.4607315063477, 40.1847610473633)
+            txpa_extent = (-97.51611328125, 33.0583305358887,-79.4607315063477, 40.1847610473633)
+            e1 = City.objects.extent(field_name='location__point')
+            e2 = City.objects.exclude(name='Roswell').extent(field_name='location__point')
+            for ref, e in [(all_extent, e1), (txpa_extent, e2)]:
+                for ref_val, e_val in zip(ref, e): self.assertAlmostEqual(ref_val, e_val)
+
+        # The second union is for a query that has something in the WHERE clause.
+        ref_u1 = GEOSGeometry('MULTIPOINT(-104.528056 33.387222,-97.516111 33.058333,-79.460734 40.18476)', 4326)
+        ref_u2 = GEOSGeometry('MULTIPOINT(-97.516111 33.058333,-79.460734 40.18476)', 4326)
+        u1 = City.objects.unionagg(field_name='location__point')
+        u2 = City.objects.exclude(name='Roswell').unionagg(field_name='location__point')
+        self.assertEqual(ref_u1, u1)
+        self.assertEqual(ref_u2, u2)
+
+    # TODO: Related tests for KML, GML, and distance lookups.
+        
+def suite():
+    s = unittest.TestSuite()
+    s.addTest(unittest.makeSuite(RelatedGeoModelTest))
+    return s
diff --git a/webapp/django/contrib/gis/tests/relatedapp/tests_mysql.py b/webapp/django/contrib/gis/tests/relatedapp/tests_mysql.py
new file mode 100644
index 0000000..ecadf74
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/relatedapp/tests_mysql.py
@@ -0,0 +1 @@
+from tests import *
diff --git a/webapp/django/contrib/gis/tests/test_gdal.py b/webapp/django/contrib/gis/tests/test_gdal.py
new file mode 100644
index 0000000..030ac50
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/test_gdal.py
@@ -0,0 +1,28 @@
+"""
+Module for executing all of the GDAL tests.  None
+of these tests require the use of the database.
+"""
+from unittest import TestSuite, TextTestRunner
+
+# Importing the GDAL test modules.
+from django.contrib.gis.tests import \
+     test_gdal_driver, test_gdal_ds, test_gdal_envelope, \
+     test_gdal_geom, test_gdal_srs
+     
+
+test_suites = [test_gdal_driver.suite(),
+               test_gdal_ds.suite(),
+               test_gdal_envelope.suite(),
+               test_gdal_geom.suite(),
+               test_gdal_srs.suite(),
+               ]
+
+def suite():
+    "Builds a test suite for the GDAL tests."
+    s = TestSuite()
+    map(s.addTest, test_suites)
+    return s
+
+def run(verbosity=1):
+    "Runs the GDAL tests."
+    TextTestRunner(verbosity=verbosity).run(suite())
diff --git a/webapp/django/contrib/gis/tests/test_gdal_driver.py b/webapp/django/contrib/gis/tests/test_gdal_driver.py
new file mode 100644
index 0000000..1ff65ac
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/test_gdal_driver.py
@@ -0,0 +1,40 @@
+import os, os.path, unittest
+from django.contrib.gis.gdal import Driver, OGRException
+
+valid_drivers = ('ESRI Shapefile', 'MapInfo File', 'TIGER', 'S57', 'DGN',
+                 'Memory', 'CSV', 'GML', 'KML')
+
+invalid_drivers = ('Foo baz', 'clucka', 'ESRI Shp')
+
+aliases = {'eSrI' : 'ESRI Shapefile',
+           'TigER/linE' : 'TIGER',
+           'SHAPE' : 'ESRI Shapefile',
+           'sHp' : 'ESRI Shapefile',
+           }
+
+class DriverTest(unittest.TestCase):
+
+    def test01_valid_driver(self):
+        "Testing valid OGR Data Source Drivers."
+        for d in valid_drivers:
+            dr = Driver(d)
+            self.assertEqual(d, str(dr))
+
+    def test02_invalid_driver(self):
+        "Testing invalid OGR Data Source Drivers."
+        for i in invalid_drivers:
+            self.assertRaises(OGRException, Driver, i)
+
+    def test03_aliases(self):
+        "Testing driver aliases."
+        for alias, full_name in aliases.items():
+            dr = Driver(alias)
+            self.assertEqual(full_name, str(dr))
+
+def suite():
+    s = unittest.TestSuite()
+    s.addTest(unittest.makeSuite(DriverTest))
+    return s
+
+def run(verbosity=2):
+    unittest.TextTestRunner(verbosity=verbosity).run(suite())
diff --git a/webapp/django/contrib/gis/tests/test_gdal_ds.py b/webapp/django/contrib/gis/tests/test_gdal_ds.py
new file mode 100644
index 0000000..9b82685
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/test_gdal_ds.py
@@ -0,0 +1,181 @@
+import os, os.path, unittest
+from django.contrib.gis.gdal import DataSource, Envelope, OGRException, OGRIndexError
+from django.contrib.gis.gdal.field import OFTReal, OFTInteger, OFTString
+
+# Path for SHP files
+data_path = os.path.join(os.path.dirname(__file__), 'data')
+def get_ds_file(name, ext):
+    return os.sep.join([data_path, name, name + '.%s' % ext])
+
+# Test SHP data source object
+class TestDS:
+    def __init__(self, name, **kwargs):
+        ext = kwargs.pop('ext', 'shp')
+        self.ds = get_ds_file(name, ext)
+        for key, value in kwargs.items():
+            setattr(self, key, value)
+
+# List of acceptable data sources.
+ds_list = (TestDS('test_point', nfeat=5, nfld=3, geom='POINT', gtype=1, driver='ESRI Shapefile',
+                  fields={'dbl' : OFTReal, 'int' : OFTInteger, 'str' : OFTString,},
+                  extent=(-1.35011,0.166623,-0.524093,0.824508), # Got extent from QGIS
+                  srs_wkt='GEOGCS["GCS_WGS_1984",DATUM["WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]',
+                  field_values={'dbl' : [float(i) for i in range(1, 6)], 'int' : range(1, 6), 'str' : [str(i) for i in range(1, 6)]},
+                  fids=range(5)),
+           TestDS('test_vrt', ext='vrt', nfeat=3, nfld=3, geom='POINT', gtype=1, driver='VRT',
+                  fields={'POINT_X' : OFTString, 'POINT_Y' : OFTString, 'NUM' : OFTString}, # VRT uses CSV, which all types are OFTString.
+                  extent=(1.0, 2.0, 100.0, 523.5), # Min/Max from CSV
+                  field_values={'POINT_X' : ['1.0', '5.0', '100.0'], 'POINT_Y' : ['2.0', '23.0', '523.5'], 'NUM' : ['5', '17', '23']},
+                  fids=range(1,4)),
+           TestDS('test_poly', nfeat=3, nfld=3, geom='POLYGON', gtype=3, 
+                  driver='ESRI Shapefile',
+                  fields={'float' : OFTReal, 'int' : OFTInteger, 'str' : OFTString,},
+                  extent=(-1.01513,-0.558245,0.161876,0.839637), # Got extent from QGIS
+                  srs_wkt='GEOGCS["GCS_WGS_1984",DATUM["WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]'),
+           )
+
+bad_ds = (TestDS('foo'),
+          )
+
+class DataSourceTest(unittest.TestCase):
+
+    def test01_valid_shp(self):
+        "Testing valid SHP Data Source files."
+
+        for source in ds_list:
+            # Loading up the data source
+            ds = DataSource(source.ds)
+
+            # Making sure the layer count is what's expected (only 1 layer in a SHP file)
+            self.assertEqual(1, len(ds))
+
+            # Making sure GetName works
+            self.assertEqual(source.ds, ds.name)
+
+            # Making sure the driver name matches up
+            self.assertEqual(source.driver, str(ds.driver))
+
+            # Making sure indexing works
+            try:
+                ds[len(ds)]
+            except OGRIndexError:
+                pass
+            else:
+                self.fail('Expected an IndexError!')
+                        
+    def test02_invalid_shp(self):
+        "Testing invalid SHP files for the Data Source."
+        for source in bad_ds:
+            self.assertRaises(OGRException, DataSource, source.ds)
+
+    def test03a_layers(self):
+        "Testing Data Source Layers."
+        print "\nBEGIN - expecting out of range feature id error; safe to ignore.\n"
+        for source in ds_list:
+            ds = DataSource(source.ds)
+
+            # Incrementing through each layer, this tests DataSource.__iter__
+            for layer in ds:                
+                # Making sure we get the number of features we expect
+                self.assertEqual(len(layer), source.nfeat)
+
+                # Making sure we get the number of fields we expect
+                self.assertEqual(source.nfld, layer.num_fields)
+                self.assertEqual(source.nfld, len(layer.fields))
+
+                # Testing the layer's extent (an Envelope), and it's properties
+                self.assertEqual(True, isinstance(layer.extent, Envelope))
+                self.assertAlmostEqual(source.extent[0], layer.extent.min_x, 5)
+                self.assertAlmostEqual(source.extent[1], layer.extent.min_y, 5)
+                self.assertAlmostEqual(source.extent[2], layer.extent.max_x, 5)
+                self.assertAlmostEqual(source.extent[3], layer.extent.max_y, 5)
+
+                # Now checking the field names.
+                flds = layer.fields
+                for f in flds: self.assertEqual(True, f in source.fields)
+                
+                # Negative FIDs are not allowed.
+                self.assertRaises(OGRIndexError, layer.__getitem__, -1)
+                self.assertRaises(OGRIndexError, layer.__getitem__, 50000)
+
+                if hasattr(source, 'field_values'):
+                    fld_names = source.field_values.keys()
+
+                    # Testing `Layer.get_fields` (which uses Layer.__iter__)
+                    for fld_name in fld_names:
+                        self.assertEqual(source.field_values[fld_name], layer.get_fields(fld_name))
+
+                    # Testing `Layer.__getitem__`.
+                    for i, fid in enumerate(source.fids):
+                        feat = layer[fid]
+                        self.assertEqual(fid, feat.fid)
+                        # Maybe this should be in the test below, but we might as well test
+                        # the feature values here while in this loop.
+                        for fld_name in fld_names:
+                            self.assertEqual(source.field_values[fld_name][i], feat.get(fld_name))
+        print "\nEND - expecting out of range feature id error; safe to ignore."
+                        
+    def test03b_layer_slice(self):
+        "Test indexing and slicing on Layers."
+        # Using the first data-source because the same slice
+        # can be used for both the layer and the control values.
+        source = ds_list[0]
+        ds = DataSource(source.ds)
+
+        sl = slice(1, 3)
+        feats = ds[0][sl]
+
+        for fld_name in ds[0].fields:
+            test_vals = [feat.get(fld_name) for feat in feats]
+            control_vals = source.field_values[fld_name][sl]
+            self.assertEqual(control_vals, test_vals)
+
+    def test04_features(self):
+        "Testing Data Source Features."
+        for source in ds_list:
+            ds = DataSource(source.ds)
+
+            # Incrementing through each layer
+            for layer in ds:
+                # Incrementing through each feature in the layer
+                for feat in layer:
+                    # Making sure the number of fields, and the geometry type
+                    # are what's expected.
+                    self.assertEqual(source.nfld, len(list(feat)))
+                    self.assertEqual(source.gtype, feat.geom_type)
+
+                    # Making sure the fields match to an appropriate OFT type.
+                    for k, v in source.fields.items():
+                        # Making sure we get the proper OGR Field instance, using
+                        # a string value index for the feature.
+                        self.assertEqual(True, isinstance(feat[k], v))
+
+                    # Testing Feature.__iter__
+                    for fld in feat: self.assertEqual(True, fld.name in source.fields.keys())
+                        
+    def test05_geometries(self):
+        "Testing Geometries from Data Source Features."
+        for source in ds_list:
+            ds = DataSource(source.ds)
+
+            # Incrementing through each layer and feature.
+            for layer in ds:
+                for feat in layer:
+                    g = feat.geom
+
+                    # Making sure we get the right Geometry name & type
+                    self.assertEqual(source.geom, g.geom_name)
+                    self.assertEqual(source.gtype, g.geom_type)
+
+                    # Making sure the SpatialReference is as expected.
+                    if hasattr(source, 'srs_wkt'):
+                        self.assertEqual(source.srs_wkt, g.srs.wkt)
+
+
+def suite():
+    s = unittest.TestSuite()
+    s.addTest(unittest.makeSuite(DataSourceTest))
+    return s
+
+def run(verbosity=2):
+    unittest.TextTestRunner(verbosity=verbosity).run(suite())
diff --git a/webapp/django/contrib/gis/tests/test_gdal_envelope.py b/webapp/django/contrib/gis/tests/test_gdal_envelope.py
new file mode 100644
index 0000000..fda2719
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/test_gdal_envelope.py
@@ -0,0 +1,45 @@
+import unittest
+from django.contrib.gis.gdal import Envelope, OGRException
+
+class EnvelopeTest(unittest.TestCase):
+
+    def test01_init(self):
+        "Testing Envelope initilization."
+        e1 = Envelope((0, 0, 5, 5))
+        e2 = Envelope(0, 0, 5, 5)
+        e3 = Envelope(0, '0', '5', 5) # Thanks to ww for this
+        e4 = Envelope(e1._envelope)
+        self.assertRaises(OGRException, Envelope, (5, 5, 0, 0))
+        self.assertRaises(OGRException, Envelope, 5, 5, 0, 0)
+        self.assertRaises(OGRException, Envelope, (0, 0, 5, 5, 3))
+        self.assertRaises(OGRException, Envelope, ())
+        self.assertRaises(ValueError, Envelope, 0, 'a', 5, 5)
+        self.assertRaises(TypeError, Envelope, u'foo')
+
+    def test02_properties(self):
+        "Testing Envelope properties."
+        e = Envelope(0, 0, 2, 3)
+        self.assertEqual(0, e.min_x)
+        self.assertEqual(0, e.min_y)
+        self.assertEqual(2, e.max_x)
+        self.assertEqual(3, e.max_y)
+        self.assertEqual((0, 0), e.ll)
+        self.assertEqual((2, 3), e.ur)
+        self.assertEqual((0, 0, 2, 3), e.tuple)
+        self.assertEqual('POLYGON((0.0 0.0,0.0 3.0,2.0 3.0,2.0 0.0,0.0 0.0))', e.wkt)
+        self.assertEqual('(0.0, 0.0, 2.0, 3.0)', str(e))
+
+    def test03_equivalence(self):
+        "Testing Envelope equivalence."
+        e1 = Envelope(0.523, 0.217, 253.23, 523.69)
+        e2 = Envelope((0.523, 0.217, 253.23, 523.69))
+        self.assertEqual(e1, e2)
+        self.assertEqual((0.523, 0.217, 253.23, 523.69), e1)
+
+def suite():
+    s = unittest.TestSuite()
+    s.addTest(unittest.makeSuite(EnvelopeTest))
+    return s
+
+def run(verbosity=2):
+    unittest.TextTestRunner(verbosity=verbosity).run(suite())
diff --git a/webapp/django/contrib/gis/tests/test_gdal_geom.py b/webapp/django/contrib/gis/tests/test_gdal_geom.py
new file mode 100644
index 0000000..b0dab0e
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/test_gdal_geom.py
@@ -0,0 +1,403 @@
+import unittest
+from django.contrib.gis.gdal import OGRGeometry, OGRGeomType, \
+    OGRException, OGRIndexError, SpatialReference, CoordTransform, \
+    gdal_version
+from django.contrib.gis.tests.geometries import *
+
+class OGRGeomTest(unittest.TestCase):
+    "This tests the OGR Geometry."
+
+    def test00_geomtype(self):
+        "Testing OGRGeomType object."
+
+        # OGRGeomType should initialize on all these inputs.
+        try:
+            g = OGRGeomType(1)
+            g = OGRGeomType(7)
+            g = OGRGeomType('point')
+            g = OGRGeomType('GeometrycollectioN')
+            g = OGRGeomType('LINearrING')
+            g = OGRGeomType('Unknown')
+        except:
+            self.fail('Could not create an OGRGeomType object!')
+
+        # Should throw TypeError on this input
+        self.assertRaises(TypeError, OGRGeomType.__init__, 23)
+        self.assertRaises(TypeError, OGRGeomType.__init__, 'fooD')
+        self.assertRaises(TypeError, OGRGeomType.__init__, 9)
+
+        # Equivalence can take strings, ints, and other OGRGeomTypes
+        self.assertEqual(True, OGRGeomType(1) == OGRGeomType(1))
+        self.assertEqual(True, OGRGeomType(7) == 'GeometryCollection')
+        self.assertEqual(True, OGRGeomType('point') == 'POINT')
+        self.assertEqual(False, OGRGeomType('point') == 2)
+        self.assertEqual(True, OGRGeomType('unknown') == 0)
+        self.assertEqual(True, OGRGeomType(6) == 'MULtiPolyGON')
+        self.assertEqual(False, OGRGeomType(1) != OGRGeomType('point'))
+        self.assertEqual(True, OGRGeomType('POINT') != OGRGeomType(6))
+
+        # Testing the Django field name equivalent property.
+        self.assertEqual('PointField', OGRGeomType('Point').django)
+        self.assertEqual(None, OGRGeomType('Unknown').django)
+        self.assertEqual(None, OGRGeomType('none').django)
+
+    def test01a_wkt(self):
+        "Testing WKT output."
+        for g in wkt_out:
+            geom = OGRGeometry(g.wkt)
+            self.assertEqual(g.wkt, geom.wkt)
+
+    def test01b_gml(self):
+        "Testing GML output."
+        for g in wkt_out:
+            geom = OGRGeometry(g.wkt)
+            self.assertEqual(g.gml, geom.gml)
+
+    def test01c_hex(self):
+        "Testing HEX input/output."
+        for g in hex_wkt:
+            geom1 = OGRGeometry(g.wkt)
+            self.assertEqual(g.hex, geom1.hex)
+            # Constructing w/HEX
+            geom2 = OGRGeometry(g.hex)
+            self.assertEqual(geom1, geom2)
+
+    def test01d_wkb(self):
+        "Testing WKB input/output."
+        from binascii import b2a_hex
+        for g in hex_wkt:
+            geom1 = OGRGeometry(g.wkt)
+            wkb = geom1.wkb
+            self.assertEqual(b2a_hex(wkb).upper(), g.hex)
+            # Constructing w/WKB.
+            geom2 = OGRGeometry(wkb)
+            self.assertEqual(geom1, geom2)
+
+    def test01e_json(self):
+        "Testing GeoJSON input/output."
+        from django.contrib.gis.gdal.prototypes.geom import GEOJSON
+        if not GEOJSON: return
+        for g in json_geoms:
+            geom = OGRGeometry(g.wkt)
+            self.assertEqual(g.json, geom.json)
+            self.assertEqual(g.json, geom.geojson)
+            self.assertEqual(OGRGeometry(g.wkt), OGRGeometry(geom.json))
+
+    def test02_points(self):
+        "Testing Point objects."
+
+        prev = OGRGeometry('POINT(0 0)')
+        for p in points:
+            if not hasattr(p, 'z'): # No 3D
+                pnt = OGRGeometry(p.wkt)
+                self.assertEqual(1, pnt.geom_type)
+                self.assertEqual('POINT', pnt.geom_name)
+                self.assertEqual(p.x, pnt.x)
+                self.assertEqual(p.y, pnt.y)
+                self.assertEqual((p.x, p.y), pnt.tuple)
+
+    def test03_multipoints(self):
+        "Testing MultiPoint objects."
+
+        for mp in multipoints:
+            mgeom1 = OGRGeometry(mp.wkt) # First one from WKT
+            self.assertEqual(4, mgeom1.geom_type)
+            self.assertEqual('MULTIPOINT', mgeom1.geom_name)
+            mgeom2 = OGRGeometry('MULTIPOINT') # Creating empty multipoint
+            mgeom3 = OGRGeometry('MULTIPOINT')
+            for g in mgeom1:
+                mgeom2.add(g) # adding each point from the multipoints
+                mgeom3.add(g.wkt) # should take WKT as well
+            self.assertEqual(mgeom1, mgeom2) # they should equal
+            self.assertEqual(mgeom1, mgeom3)
+            self.assertEqual(mp.points, mgeom2.tuple)
+            self.assertEqual(mp.n_p, mgeom2.point_count)
+                                                                            
+    def test04_linestring(self):
+        "Testing LineString objects."
+        prev = OGRGeometry('POINT(0 0)')
+        for ls in linestrings:
+            linestr = OGRGeometry(ls.wkt)
+            self.assertEqual(2, linestr.geom_type)
+            self.assertEqual('LINESTRING', linestr.geom_name)
+            self.assertEqual(ls.n_p, linestr.point_count)
+            self.assertEqual(ls.tup, linestr.tuple)
+            self.assertEqual(True, linestr == OGRGeometry(ls.wkt))
+            self.assertEqual(True, linestr != prev)
+            self.assertRaises(OGRIndexError, linestr.__getitem__, len(linestr))
+            prev = linestr
+
+            # Testing the x, y properties.
+            x = [tmpx for tmpx, tmpy in ls.tup]
+            y = [tmpy for tmpx, tmpy in ls.tup]
+            self.assertEqual(x, linestr.x)
+            self.assertEqual(y, linestr.y)
+
+    def test05_multilinestring(self):
+        "Testing MultiLineString objects."
+        prev = OGRGeometry('POINT(0 0)')
+        for mls in multilinestrings:
+            mlinestr = OGRGeometry(mls.wkt)
+            self.assertEqual(5, mlinestr.geom_type)
+            self.assertEqual('MULTILINESTRING', mlinestr.geom_name)
+            self.assertEqual(mls.n_p, mlinestr.point_count)
+            self.assertEqual(mls.tup, mlinestr.tuple)
+            self.assertEqual(True, mlinestr == OGRGeometry(mls.wkt))
+            self.assertEqual(True, mlinestr != prev)
+            prev = mlinestr
+            for ls in mlinestr:
+                self.assertEqual(2, ls.geom_type)
+                self.assertEqual('LINESTRING', ls.geom_name)
+            self.assertRaises(OGRIndexError, mlinestr.__getitem__, len(mlinestr)) 
+
+    def test06_linearring(self):
+        "Testing LinearRing objects."
+        prev = OGRGeometry('POINT(0 0)')
+        for rr in linearrings:
+            lr = OGRGeometry(rr.wkt)
+            #self.assertEqual(101, lr.geom_type.num)
+            self.assertEqual('LINEARRING', lr.geom_name)
+            self.assertEqual(rr.n_p, len(lr))
+            self.assertEqual(True, lr == OGRGeometry(rr.wkt))
+            self.assertEqual(True, lr != prev)
+            prev = lr
+
+    def test07a_polygons(self):
+        "Testing Polygon objects."
+        prev = OGRGeometry('POINT(0 0)')
+        for p in polygons:
+            poly = OGRGeometry(p.wkt)
+            self.assertEqual(3, poly.geom_type)
+            self.assertEqual('POLYGON', poly.geom_name)
+            self.assertEqual(p.n_p, poly.point_count)
+            self.assertEqual(p.n_i + 1, len(poly))
+
+            # Testing area & centroid.
+            self.assertAlmostEqual(p.area, poly.area, 9)
+            x, y = poly.centroid.tuple
+            self.assertAlmostEqual(p.centroid[0], x, 9)
+            self.assertAlmostEqual(p.centroid[1], y, 9)
+
+            # Testing equivalence
+            self.assertEqual(True, poly == OGRGeometry(p.wkt))
+            self.assertEqual(True, poly != prev)
+            
+            if p.ext_ring_cs:
+                ring = poly[0]
+                self.assertEqual(p.ext_ring_cs, ring.tuple)
+                self.assertEqual(p.ext_ring_cs, poly[0].tuple)
+                self.assertEqual(len(p.ext_ring_cs), ring.point_count)
+            
+            for r in poly:
+                self.assertEqual('LINEARRING', r.geom_name)
+
+    def test07b_closepolygons(self):
+        "Testing closing Polygon objects."
+        # Both rings in this geometry are not closed.
+        poly = OGRGeometry('POLYGON((0 0, 5 0, 5 5, 0 5), (1 1, 2 1, 2 2, 2 1))')
+        self.assertEqual(8, poly.point_count)
+        print "\nBEGIN - expecting IllegalArgumentException; safe to ignore.\n"
+        try:
+            c = poly.centroid
+        except OGRException:
+            # Should raise an OGR exception, rings are not closed
+            pass
+        else:
+            self.fail('Should have raised an OGRException!')
+        print "\nEND - expecting IllegalArgumentException; safe to ignore.\n"
+
+        # Closing the rings -- doesn't work on GDAL versions 1.4.1 and below:
+        # http://trac.osgeo.org/gdal/ticket/1673
+        major, minor1, minor2 = gdal_version().split('.')
+        if major == '1':
+            iminor1 = int(minor1)
+            if iminor1 < 4 or (iminor1 == 4 and minor2.startswith('1')): return
+        poly.close_rings()
+        self.assertEqual(10, poly.point_count) # Two closing points should've been added
+        self.assertEqual(OGRGeometry('POINT(2.5 2.5)'), poly.centroid)
+
+    def test08_multipolygons(self):
+        "Testing MultiPolygon objects."
+        prev = OGRGeometry('POINT(0 0)')
+        for mp in multipolygons:
+            mpoly = OGRGeometry(mp.wkt)
+            self.assertEqual(6, mpoly.geom_type)
+            self.assertEqual('MULTIPOLYGON', mpoly.geom_name)
+            if mp.valid:
+                self.assertEqual(mp.n_p, mpoly.point_count)
+                self.assertEqual(mp.num_geom, len(mpoly))
+                self.assertRaises(OGRIndexError, mpoly.__getitem__, len(mpoly))
+                for p in mpoly:
+                    self.assertEqual('POLYGON', p.geom_name)
+                    self.assertEqual(3, p.geom_type)
+            self.assertEqual(mpoly.wkt, OGRGeometry(mp.wkt).wkt)
+
+    def test09a_srs(self):
+        "Testing OGR Geometries with Spatial Reference objects."
+        for mp in multipolygons:
+            # Creating a geometry w/spatial reference
+            sr = SpatialReference('WGS84')
+            mpoly = OGRGeometry(mp.wkt, sr)
+            self.assertEqual(sr.wkt, mpoly.srs.wkt)
+          
+            # Ensuring that SRS is propagated to clones.
+            klone = mpoly.clone()
+            self.assertEqual(sr.wkt, klone.srs.wkt)
+  
+            # Ensuring all children geometries (polygons and their rings) all
+            # return the assigned spatial reference as well.
+            for poly in mpoly:
+                self.assertEqual(sr.wkt, poly.srs.wkt)
+                for ring in poly:
+                    self.assertEqual(sr.wkt, ring.srs.wkt)
+
+            # Ensuring SRS propagate in topological ops.
+            a, b = topology_geoms[0]
+            a, b = OGRGeometry(a.wkt, sr), OGRGeometry(b.wkt, sr)
+            diff = a.difference(b)
+            union = a.union(b)
+            self.assertEqual(sr.wkt, diff.srs.wkt)
+            self.assertEqual(sr.srid, union.srs.srid)
+
+            # Instantiating w/an integer SRID
+            mpoly = OGRGeometry(mp.wkt, 4326)
+            self.assertEqual(4326, mpoly.srid)
+            mpoly.srs = SpatialReference(4269)
+            self.assertEqual(4269, mpoly.srid)
+            self.assertEqual('NAD83', mpoly.srs.name)
+          
+            # Incrementing through the multipolyogn after the spatial reference
+            # has been re-assigned.
+            for poly in mpoly:
+                self.assertEqual(mpoly.srs.wkt, poly.srs.wkt)
+                poly.srs = 32140
+                for ring in poly:
+                    # Changing each ring in the polygon
+                    self.assertEqual(32140, ring.srs.srid)
+                    self.assertEqual('NAD83 / Texas South Central', ring.srs.name)
+                    ring.srs = str(SpatialReference(4326)) # back to WGS84
+                    self.assertEqual(4326, ring.srs.srid)
+
+                    # Using the `srid` property.
+                    ring.srid = 4322
+                    self.assertEqual('WGS 72', ring.srs.name)
+                    self.assertEqual(4322, ring.srid)
+
+    def test09b_srs_transform(self):
+        "Testing transform()."
+        orig = OGRGeometry('POINT (-104.609 38.255)', 4326)
+        trans = OGRGeometry('POINT (992385.4472045 481455.4944650)', 2774)
+
+        # Using an srid, a SpatialReference object, and a CoordTransform object
+        # or transformations.
+        t1, t2, t3 = orig.clone(), orig.clone(), orig.clone()
+        t1.transform(trans.srid)
+        t2.transform(SpatialReference('EPSG:2774'))
+        ct = CoordTransform(SpatialReference('WGS84'), SpatialReference(2774))
+        t3.transform(ct)
+
+        # Testing use of the `clone` keyword.
+        k1 = orig.clone()
+        k2 = k1.transform(trans.srid, clone=True)
+        self.assertEqual(k1, orig)
+        self.assertNotEqual(k1, k2)
+
+        prec = 3
+        for p in (t1, t2, t3, k2):
+            self.assertAlmostEqual(trans.x, p.x, prec)
+            self.assertAlmostEqual(trans.y, p.y, prec)
+
+    def test10_difference(self):
+        "Testing difference()."
+        for i in xrange(len(topology_geoms)):
+            g_tup = topology_geoms[i]
+            a = OGRGeometry(g_tup[0].wkt)
+            b = OGRGeometry(g_tup[1].wkt)
+            d1 = OGRGeometry(diff_geoms[i].wkt)
+            d2 = a.difference(b)
+            self.assertEqual(d1, d2)
+            self.assertEqual(d1, a - b) # __sub__ is difference operator
+            a -= b # testing __isub__
+            self.assertEqual(d1, a)
+
+    def test11_intersection(self):
+        "Testing intersects() and intersection()."
+        for i in xrange(len(topology_geoms)):
+            g_tup = topology_geoms[i]
+            a = OGRGeometry(g_tup[0].wkt)
+            b = OGRGeometry(g_tup[1].wkt)
+            i1 = OGRGeometry(intersect_geoms[i].wkt)
+            self.assertEqual(True, a.intersects(b))
+            i2 = a.intersection(b)
+            self.assertEqual(i1, i2)
+            self.assertEqual(i1, a & b) # __and__ is intersection operator
+            a &= b # testing __iand__
+            self.assertEqual(i1, a)
+
+    def test12_symdifference(self):
+        "Testing sym_difference()."
+        for i in xrange(len(topology_geoms)):
+            g_tup = topology_geoms[i]
+            a = OGRGeometry(g_tup[0].wkt)
+            b = OGRGeometry(g_tup[1].wkt)
+            d1 = OGRGeometry(sdiff_geoms[i].wkt)
+            d2 = a.sym_difference(b)
+            self.assertEqual(d1, d2)
+            self.assertEqual(d1, a ^ b) # __xor__ is symmetric difference operator
+            a ^= b # testing __ixor__
+            self.assertEqual(d1, a)
+            
+    def test13_union(self):
+        "Testing union()."
+        for i in xrange(len(topology_geoms)):
+            g_tup = topology_geoms[i]
+            a = OGRGeometry(g_tup[0].wkt)
+            b = OGRGeometry(g_tup[1].wkt)
+            u1 = OGRGeometry(union_geoms[i].wkt)
+            u2 = a.union(b)
+            self.assertEqual(u1, u2)
+            self.assertEqual(u1, a | b) # __or__ is union operator
+            a |= b # testing __ior__
+            self.assertEqual(u1, a)
+
+    def test14_add(self):
+        "Testing GeometryCollection.add()."
+        # Can't insert a Point into a MultiPolygon.
+        mp = OGRGeometry('MultiPolygon')
+        pnt = OGRGeometry('POINT(5 23)')
+        self.assertRaises(OGRException, mp.add, pnt)
+
+        # GeometryCollection.add may take an OGRGeometry (if another collection
+        # of the same type all child geoms will be added individually) or WKT.
+        for mp in multipolygons:
+            mpoly = OGRGeometry(mp.wkt)
+            mp1 = OGRGeometry('MultiPolygon')
+            mp2 = OGRGeometry('MultiPolygon')
+            mp3 = OGRGeometry('MultiPolygon')
+
+            for poly in mpoly:
+                mp1.add(poly) # Adding a geometry at a time
+                mp2.add(poly.wkt) # Adding WKT
+            mp3.add(mpoly) # Adding a MultiPolygon's entire contents at once.
+            for tmp in (mp1, mp2, mp3): self.assertEqual(mpoly, tmp)
+
+    def test15_extent(self):
+        "Testing `extent` property."
+        # The xmin, ymin, xmax, ymax of the MultiPoint should be returned.
+        mp = OGRGeometry('MULTIPOINT(5 23, 0 0, 10 50)')
+        self.assertEqual((0.0, 0.0, 10.0, 50.0), mp.extent)
+        # Testing on the 'real world' Polygon.
+        poly = OGRGeometry(polygons[3].wkt)
+        ring = poly.shell
+        x, y = ring.x, ring.y
+        xmin, ymin = min(x), min(y)
+        xmax, ymax = max(x), max(y)
+        self.assertEqual((xmin, ymin, xmax, ymax), poly.extent)
+
+def suite():
+    s = unittest.TestSuite()
+    s.addTest(unittest.makeSuite(OGRGeomTest))
+    return s
+
+def run(verbosity=2):
+    unittest.TextTestRunner(verbosity=verbosity).run(suite())
diff --git a/webapp/django/contrib/gis/tests/test_gdal_srs.py b/webapp/django/contrib/gis/tests/test_gdal_srs.py
new file mode 100644
index 0000000..2742c7a
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/test_gdal_srs.py
@@ -0,0 +1,169 @@
+import unittest
+from django.contrib.gis.gdal import SpatialReference, CoordTransform, OGRException, SRSException
+
+class TestSRS:
+    def __init__(self, wkt, **kwargs):
+        self.wkt = wkt
+        for key, value in kwargs.items():
+            setattr(self, key, value)
+
+# Some Spatial Reference examples
+srlist = (TestSRS('GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]',
+                  proj='+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs ',
+                  epsg=4326, projected=False, geographic=True, local=False,
+                  lin_name='unknown', ang_name='degree', lin_units=1.0, ang_units=0.0174532925199,
+                  auth={'GEOGCS' : ('EPSG', '4326'), 'spheroid' : ('EPSG', '7030')},
+                  attr=(('DATUM', 'WGS_1984'), (('SPHEROID', 1), '6378137'),('primem|authority', 'EPSG'),),
+                  ),
+          TestSRS('PROJCS["NAD83 / Texas South Central",GEOGCS["NAD83",DATUM["North_American_Datum_1983",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],AUTHORITY["EPSG","6269"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4269"]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["standard_parallel_1",30.28333333333333],PARAMETER["standard_parallel_2",28.38333333333333],PARAMETER["latitude_of_origin",27.83333333333333],PARAMETER["central_meridian",-99],PARAMETER["false_easting",600000],PARAMETER["false_northing",4000000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","32140"]]',
+                  proj='+proj=lcc +lat_1=30.28333333333333 +lat_2=28.38333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=4000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs ',
+                  epsg=32140, projected=True, geographic=False, local=False,
+                  lin_name='metre', ang_name='degree', lin_units=1.0, ang_units=0.0174532925199,
+                  auth={'PROJCS' : ('EPSG', '32140'), 'spheroid' : ('EPSG', '7019'), 'unit' : ('EPSG', '9001'),},
+                  attr=(('DATUM', 'North_American_Datum_1983'),(('SPHEROID', 2), '298.257222101'),('PROJECTION','Lambert_Conformal_Conic_2SP'),),
+                  ),
+          TestSRS('PROJCS["NAD_1983_StatePlane_Texas_South_Central_FIPS_4204_Feet",GEOGCS["GCS_North_American_1983",DATUM["North_American_Datum_1983",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["False_Easting",1968500.0],PARAMETER["False_Northing",13123333.33333333],PARAMETER["Central_Meridian",-99.0],PARAMETER["Standard_Parallel_1",28.38333333333333],PARAMETER["Standard_Parallel_2",30.28333333333334],PARAMETER["Latitude_Of_Origin",27.83333333333333],UNIT["Foot_US",0.3048006096012192]]',
+                  proj='+proj=lcc +lat_1=28.38333333333333 +lat_2=30.28333333333334 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=3999999.999999999 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs ',
+                  epsg=None, projected=True, geographic=False, local=False,
+                  lin_name='Foot_US', ang_name='Degree', lin_units=0.3048006096012192, ang_units=0.0174532925199,
+                  auth={'PROJCS' : (None, None),},
+                  attr=(('PROJCS|GeOgCs|spheroid', 'GRS_1980'),(('projcs', 9), 'UNIT'), (('projcs', 11), None),),
+                  ),
+          # This is really ESRI format, not WKT -- but the import should work the same
+          TestSRS('LOCAL_CS["Non-Earth (Meter)",LOCAL_DATUM["Local Datum",0],UNIT["Meter",1.0],AXIS["X",EAST],AXIS["Y",NORTH]]',
+                  esri=True, proj=None, epsg=None, projected=False, geographic=False, local=True,
+                  lin_name='Meter', ang_name='degree', lin_units=1.0, ang_units=0.0174532925199,
+                  attr=(('LOCAL_DATUM', 'Local Datum'), ('unit', 'Meter')),
+                  ),
+          )
+
+# Well-Known Names
+well_known = (TestSRS('GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]', wk='WGS84', name='WGS 84', attrs=(('GEOGCS|AUTHORITY', 1, '4326'), ('SPHEROID', 'WGS 84'))),
+              TestSRS('GEOGCS["WGS 72",DATUM["WGS_1972",SPHEROID["WGS 72",6378135,298.26,AUTHORITY["EPSG","7043"]],AUTHORITY["EPSG","6322"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4322"]]', wk='WGS72', name='WGS 72', attrs=(('GEOGCS|AUTHORITY', 1, '4322'), ('SPHEROID', 'WGS 72'))),
+              TestSRS('GEOGCS["NAD27",DATUM["North_American_Datum_1927",SPHEROID["Clarke 1866",6378206.4,294.9786982138982,AUTHORITY["EPSG","7008"]],AUTHORITY["EPSG","6267"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4267"]]', wk='NAD27', name='NAD27', attrs=(('GEOGCS|AUTHORITY', 1, '4267'), ('SPHEROID', 'Clarke 1866'))),
+              TestSRS('GEOGCS["NAD83",DATUM["North_American_Datum_1983",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],AUTHORITY["EPSG","6269"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4269"]]', wk='NAD83', name='NAD83', attrs=(('GEOGCS|AUTHORITY', 1, '4269'), ('SPHEROID', 'GRS 1980'))),
+              TestSRS('PROJCS["NZGD49 / Karamea Circuit",GEOGCS["NZGD49",DATUM["New_Zealand_Geodetic_Datum_1949",SPHEROID["International 1924",6378388,297,AUTHORITY["EPSG","7022"]],TOWGS84[59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993],AUTHORITY["EPSG","6272"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4272"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",-41.28991152777778],PARAMETER["central_meridian",172.1090281944444],PARAMETER["scale_factor",1],PARAMETER["false_easting",300000],PARAMETER["false_northing",700000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","27216"]]', wk='EPSG:27216', name='NZGD49 / Karamea Circuit', attrs=(('PROJECTION','Transverse_Mercator'), ('SPHEROID', 'International 1924'))),
+              )
+
+bad_srlist = ('Foobar', 'OOJCS["NAD83 / Texas South Central",GEOGCS["NAD83",DATUM["North_American_Datum_1983",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],AUTHORITY["EPSG","6269"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4269"]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["standard_parallel_1",30.28333333333333],PARAMETER["standard_parallel_2",28.38333333333333],PARAMETER["latitude_of_origin",27.83333333333333],PARAMETER["central_meridian",-99],PARAMETER["false_easting",600000],PARAMETER["false_northing",4000000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","32140"]]',)
+
+class SpatialRefTest(unittest.TestCase):
+
+    def test01_wkt(self):
+        "Testing initialization on valid OGC WKT."
+        for s in srlist:
+            srs = SpatialReference(s.wkt)
+
+    def test02_bad_wkt(self):
+        "Testing initialization on invalid WKT."
+        for bad in bad_srlist:
+            try:
+                srs = SpatialReference(bad)
+                srs.validate()
+            except (SRSException, OGRException):
+                pass
+            else:
+                self.fail('Should not have initialized on bad WKT "%s"!')
+
+    def test03_get_wkt(self):
+        "Testing getting the WKT."
+        for s in srlist:
+            srs = SpatialReference(s.wkt)
+            self.assertEqual(s.wkt, srs.wkt)
+
+    def test04_proj(self):
+        "Test PROJ.4 import and export."
+
+        for s in srlist:
+            if s.proj:
+                srs1 = SpatialReference(s.wkt)
+                srs2 = SpatialReference(s.proj)
+                self.assertEqual(srs1.proj, srs2.proj)
+        
+    def test05_epsg(self):
+        "Test EPSG import."
+        for s in srlist:
+            if s.epsg:
+                srs1 = SpatialReference(s.wkt)
+                srs2 = SpatialReference(s.epsg)
+                srs3 = SpatialReference(str(s.epsg))
+                srs4 = SpatialReference('EPSG:%d' % s.epsg)
+                #self.assertEqual(srs1.wkt, srs2.wkt)
+                for srs in (srs1, srs2, srs3, srs4):
+                    for attr, expected in s.attr:
+                        self.assertEqual(expected, srs[attr])
+
+    def test07_boolean_props(self):
+        "Testing the boolean properties."
+        for s in srlist:
+            srs = SpatialReference(s.wkt)
+            self.assertEqual(s.projected, srs.projected)
+            self.assertEqual(s.geographic, srs.geographic)
+
+    def test08_angular_linear(self):
+        "Testing the linear and angular units routines."
+        for s in srlist:
+            srs = SpatialReference(s.wkt)
+            self.assertEqual(s.ang_name, srs.angular_name)
+            self.assertEqual(s.lin_name, srs.linear_name)
+            self.assertAlmostEqual(s.ang_units, srs.angular_units, 9)
+            self.assertAlmostEqual(s.lin_units, srs.linear_units, 9)
+
+    def test09_authority(self):
+        "Testing the authority name & code routines."
+        for s in srlist:
+            if hasattr(s, 'auth'):
+                srs = SpatialReference(s.wkt)
+                for target, tup in s.auth.items():
+                    self.assertEqual(tup[0], srs.auth_name(target))
+                    self.assertEqual(tup[1], srs.auth_code(target))
+
+    def test10_attributes(self):
+        "Testing the attribute retrieval routines."
+        for s in srlist:
+            srs = SpatialReference(s.wkt)
+            for tup in s.attr:
+                att = tup[0] # Attribute to test
+                exp = tup[1] # Expected result
+                self.assertEqual(exp, srs[att])
+
+    def test11_wellknown(self):
+        "Testing Well Known Names of Spatial References."
+        for s in well_known:
+            srs = SpatialReference(s.wk)
+            self.assertEqual(s.name, srs.name)
+            for tup in s.attrs:
+                if len(tup) == 2:
+                    key = tup[0]
+                    exp = tup[1]
+                elif len(tup) == 3:
+                    key = tup[:2]
+                    exp = tup[2]
+                self.assertEqual(srs[key], exp)
+
+    def test12_coordtransform(self):
+        "Testing initialization of a CoordTransform."
+        target = SpatialReference('WGS84')
+        for s in srlist:
+            if s.proj:
+                ct = CoordTransform(SpatialReference(s.wkt), target)
+
+    def test13_attr_value(self):
+        "Testing the attr_value() method."
+        s1 = SpatialReference('WGS84')
+        self.assertRaises(TypeError, s1.__getitem__, 0)
+        self.assertRaises(TypeError, s1.__getitem__, ('GEOGCS', 'foo'))
+        self.assertEqual('WGS 84', s1['GEOGCS'])
+        self.assertEqual('WGS_1984', s1['DATUM'])
+        self.assertEqual('EPSG', s1['AUTHORITY'])
+        self.assertEqual(4326, int(s1['AUTHORITY', 1]))
+        #for i in range(7): self.assertEqual(0, int(s1['TOWGS84', i]))
+        self.assertEqual(None, s1['FOOBAR'])
+    
+def suite():
+    s = unittest.TestSuite()
+    s.addTest(unittest.makeSuite(SpatialRefTest))
+    return s
+
+def run(verbosity=2):
+    unittest.TextTestRunner(verbosity=verbosity).run(suite())
diff --git a/webapp/django/contrib/gis/tests/test_geoip.py b/webapp/django/contrib/gis/tests/test_geoip.py
new file mode 100644
index 0000000..44b0802
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/test_geoip.py
@@ -0,0 +1,104 @@
+import os, unittest
+from django.db import settings
+from django.contrib.gis.geos import GEOSGeometry
+from django.contrib.gis.utils import GeoIP, GeoIPException
+
+# Note: Requires use of both the GeoIP country and city datasets.
+# The GEOIP_DATA path should be the only setting set (the directory
+# should contain links or the actual database files 'GeoIP.dat' and 
+# 'GeoLiteCity.dat'.
+class GeoIPTest(unittest.TestCase):
+    
+    def test01_init(self):
+        "Testing GeoIP initialization."
+        g1 = GeoIP() # Everything inferred from GeoIP path
+        path = settings.GEOIP_PATH
+        g2 = GeoIP(path, 0) # Passing in data path explicitly.
+        g3 = GeoIP.open(path, 0) # MaxMind Python API syntax.
+
+        for g in (g1, g2, g3):
+            self.assertEqual(True, bool(g._country))
+            self.assertEqual(True, bool(g._city))
+        
+        # Only passing in the location of one database.
+        city = os.path.join(path, 'GeoLiteCity.dat')
+        cntry = os.path.join(path, 'GeoIP.dat')
+        g4 = GeoIP(city, country='')
+        self.assertEqual(None, g4._country)
+        g5 = GeoIP(cntry, city='')
+        self.assertEqual(None, g5._city)
+
+        # Improper parameters.
+        bad_params = (23, 'foo', 15.23)
+        for bad in bad_params:
+            self.assertRaises(GeoIPException, GeoIP, cache=bad)
+            if isinstance(bad, basestring):
+                e = GeoIPException
+            else:
+                e = TypeError
+            self.assertRaises(e, GeoIP, bad, 0)
+
+    def test02_bad_query(self):
+        "Testing GeoIP query parameter checking."
+        cntry_g = GeoIP(city='<foo>')
+        # No city database available, these calls should fail.
+        self.assertRaises(GeoIPException, cntry_g.city, 'google.com')
+        self.assertRaises(GeoIPException, cntry_g.coords, 'yahoo.com')
+
+        # Non-string query should raise TypeError
+        self.assertRaises(TypeError, cntry_g.country_code, 17)
+        self.assertRaises(TypeError, cntry_g.country_name, GeoIP)
+
+    def test03_country(self):
+        "Testing GeoIP country querying methods."
+        g = GeoIP(city='<foo>')
+        
+        fqdn = 'www.google.com'
+        addr = '12.215.42.19'
+        
+        for query in (fqdn, addr):
+            for func in (g.country_code, g.country_code_by_addr, g.country_code_by_name):
+                self.assertEqual('US', func(query))
+            for func in (g.country_name, g.country_name_by_addr, g.country_name_by_name):
+                self.assertEqual('United States', func(query))
+            self.assertEqual({'country_code' : 'US', 'country_name' : 'United States'},
+                             g.country(query))
+
+    def test04_city(self):
+        "Testing GeoIP city querying methods."
+        g = GeoIP(country='<foo>')
+        
+        addr = '130.80.29.3'
+        fqdn = 'chron.com'
+        for query in (fqdn, addr):
+            # Country queries should still work.
+            for func in (g.country_code, g.country_code_by_addr, g.country_code_by_name):
+                self.assertEqual('US', func(query))
+            for func in (g.country_name, g.country_name_by_addr, g.country_name_by_name):
+                self.assertEqual('United States', func(query))
+            self.assertEqual({'country_code' : 'US', 'country_name' : 'United States'},
+                             g.country(query))
+            
+            # City information dictionary.
+            d = g.city(query)
+            self.assertEqual('USA', d['country_code3'])
+            self.assertEqual('Houston', d['city'])
+            self.assertEqual('TX', d['region'])
+            self.assertEqual('77002', d['postal_code'])
+            self.assertEqual(713, d['area_code'])
+            geom = g.geos(query)
+            self.failIf(not isinstance(geom, GEOSGeometry))
+            lon, lat = (-95.366996765, 29.752300262)
+            lat_lon = g.lat_lon(query)
+            lat_lon = (lat_lon[1], lat_lon[0])
+            for tup in (geom.tuple, g.coords(query), g.lon_lat(query), lat_lon):
+                self.assertAlmostEqual(lon, tup[0], 9)
+                self.assertAlmostEqual(lat, tup[1], 9)
+
+def suite():
+    s = unittest.TestSuite()
+    s.addTest(unittest.makeSuite(GeoIPTest))
+    return s
+
+def run(verbosity=2):
+    unittest.TextTestRunner(verbosity=verbosity).run(suite())
diff --git a/webapp/django/contrib/gis/tests/test_geos.py b/webapp/django/contrib/gis/tests/test_geos.py
new file mode 100644
index 0000000..8ea4507
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/test_geos.py
@@ -0,0 +1,775 @@
+import random, unittest, sys
+from ctypes import ArgumentError
+from django.contrib.gis.geos import *
+from django.contrib.gis.geos.base import HAS_GDAL
+from django.contrib.gis.tests.geometries import *
+    
+if HAS_NUMPY: from numpy import array
+if HAS_GDAL: from django.contrib.gis.gdal import OGRGeometry, SpatialReference, CoordTransform, GEOJSON
+
+class GEOSTest(unittest.TestCase):
+
+    @property
+    def null_srid(self):
+        """
+        Returns the proper null SRID depending on the GEOS version.
+        See the comments in `test15_srid` for more details. 
+        """
+        info = geos_version_info()
+        if info['version'] == '3.0.0' and info['release_candidate']:
+            return -1
+        else:
+            return None
+
+    def test01a_wkt(self):
+        "Testing WKT output."
+        for g in wkt_out:
+            geom = fromstr(g.wkt)
+            self.assertEqual(g.ewkt, geom.wkt)
+
+    def test01b_hex(self):
+        "Testing HEX output."
+        for g in hex_wkt:
+            geom = fromstr(g.wkt)
+            self.assertEqual(g.hex, geom.hex)
+
+    def test01c_kml(self):
+        "Testing KML output."
+        for tg in wkt_out:
+            geom = fromstr(tg.wkt)
+            kml = getattr(tg, 'kml', False)
+            if kml: self.assertEqual(kml, geom.kml)
+
+    def test01d_errors(self):
+        "Testing the Error handlers."
+        # string-based
+        print "\nBEGIN - expecting GEOS_ERROR; safe to ignore.\n"
+        for err in errors:
+            try:
+                g = fromstr(err.wkt)
+            except (GEOSException, ValueError):
+                pass
+        print "\nEND - expecting GEOS_ERROR; safe to ignore.\n"
+        
+        class NotAGeometry(object):
+            pass
+        
+        # Some other object
+        self.assertRaises(TypeError, GEOSGeometry, NotAGeometry())
+        # None
+        self.assertRaises(TypeError, GEOSGeometry, None)
+        # Bad WKB
+        self.assertRaises(GEOSException, GEOSGeometry, buffer('0'))
+                
+    def test01e_wkb(self):
+        "Testing WKB output."
+        from binascii import b2a_hex
+        for g in hex_wkt:
+            geom = fromstr(g.wkt)
+            wkb = geom.wkb
+            self.assertEqual(b2a_hex(wkb).upper(), g.hex)
+
+    def test01f_create_hex(self):
+        "Testing creation from HEX."
+        for g in hex_wkt:
+            geom_h = GEOSGeometry(g.hex)
+            # we need to do this so decimal places get normalised
+            geom_t = fromstr(g.wkt)
+            self.assertEqual(geom_t.wkt, geom_h.wkt)
+
+    def test01g_create_wkb(self):
+        "Testing creation from WKB."
+        from binascii import a2b_hex
+        for g in hex_wkt:
+            wkb = buffer(a2b_hex(g.hex))
+            geom_h = GEOSGeometry(wkb)
+            # we need to do this so decimal places get normalised
+            geom_t = fromstr(g.wkt)
+            self.assertEqual(geom_t.wkt, geom_h.wkt)
+
+    def test01h_ewkt(self):
+        "Testing EWKT."
+        srid = 32140
+        for p in polygons:
+            ewkt = 'SRID=%d;%s' % (srid, p.wkt)
+            poly = fromstr(ewkt)
+            self.assertEqual(srid, poly.srid)
+            self.assertEqual(srid, poly.shell.srid)
+            self.assertEqual(srid, fromstr(poly.ewkt).srid) # Checking export
+    
+    def test01i_json(self):
+        "Testing GeoJSON input/output (via GDAL)."
+        if not HAS_GDAL or not GEOJSON: return
+        for g in json_geoms:
+            geom = GEOSGeometry(g.wkt)
+            self.assertEqual(g.json, geom.json)
+            self.assertEqual(g.json, geom.geojson)
+            self.assertEqual(GEOSGeometry(g.wkt), GEOSGeometry(geom.json))
+
+    def test01j_eq(self):
+        "Testing equivalence."
+        p = fromstr('POINT(5 23)')
+        self.assertEqual(p, p.wkt)
+        self.assertNotEqual(p, 'foo')
+        ls = fromstr('LINESTRING(0 0, 1 1, 5 5)')
+        self.assertEqual(ls, ls.wkt)
+        self.assertNotEqual(p, 'bar')
+        # Error shouldn't be raise on equivalence testing with 
+        # an invalid type.
+        for g in (p, ls):
+            self.assertNotEqual(g, None)
+            self.assertNotEqual(g, {'foo' : 'bar'})
+            self.assertNotEqual(g, False)
+
+    def test02a_points(self):
+        "Testing Point objects."
+        prev = fromstr('POINT(0 0)')
+        for p in points:
+            # Creating the point from the WKT
+            pnt = fromstr(p.wkt)
+            self.assertEqual(pnt.geom_type, 'Point')
+            self.assertEqual(pnt.geom_typeid, 0)
+            self.assertEqual(p.x, pnt.x)
+            self.assertEqual(p.y, pnt.y)
+            self.assertEqual(True, pnt == fromstr(p.wkt))
+            self.assertEqual(False, pnt == prev)
+
+            # Making sure that the point's X, Y components are what we expect
+            self.assertAlmostEqual(p.x, pnt.tuple[0], 9)
+            self.assertAlmostEqual(p.y, pnt.tuple[1], 9)
+
+            # Testing the third dimension, and getting the tuple arguments
+            if hasattr(p, 'z'):
+                self.assertEqual(True, pnt.hasz)
+                self.assertEqual(p.z, pnt.z)
+                self.assertEqual(p.z, pnt.tuple[2], 9)
+                tup_args = (p.x, p.y, p.z)
+                set_tup1 = (2.71, 3.14, 5.23)
+                set_tup2 = (5.23, 2.71, 3.14)
+            else:
+                self.assertEqual(False, pnt.hasz)
+                self.assertEqual(None, pnt.z)
+                tup_args = (p.x, p.y)
+                set_tup1 = (2.71, 3.14)
+                set_tup2 = (3.14, 2.71)
+
+            # Centroid operation on point should be point itself
+            self.assertEqual(p.centroid, pnt.centroid.tuple)
+
+            # Now testing the different constructors
+            pnt2 = Point(tup_args)  # e.g., Point((1, 2))
+            pnt3 = Point(*tup_args) # e.g., Point(1, 2)
+            self.assertEqual(True, pnt == pnt2)
+            self.assertEqual(True, pnt == pnt3)
+
+            # Now testing setting the x and y
+            pnt.y = 3.14
+            pnt.x = 2.71
+            self.assertEqual(3.14, pnt.y)
+            self.assertEqual(2.71, pnt.x)
+
+            # Setting via the tuple/coords property
+            pnt.tuple = set_tup1
+            self.assertEqual(set_tup1, pnt.tuple)
+            pnt.coords = set_tup2
+            self.assertEqual(set_tup2, pnt.coords)
+            
+            prev = pnt # setting the previous geometry
+
+    def test02b_multipoints(self):
+        "Testing MultiPoint objects."
+        for mp in multipoints:
+            mpnt = fromstr(mp.wkt)
+            self.assertEqual(mpnt.geom_type, 'MultiPoint')
+            self.assertEqual(mpnt.geom_typeid, 4)
+
+            self.assertAlmostEqual(mp.centroid[0], mpnt.centroid.tuple[0], 9)
+            self.assertAlmostEqual(mp.centroid[1], mpnt.centroid.tuple[1], 9)
+
+            self.assertRaises(GEOSIndexError, mpnt.__getitem__, len(mpnt))
+            self.assertEqual(mp.centroid, mpnt.centroid.tuple)
+            self.assertEqual(mp.points, tuple(m.tuple for m in mpnt))
+            for p in mpnt:
+                self.assertEqual(p.geom_type, 'Point')
+                self.assertEqual(p.geom_typeid, 0)
+                self.assertEqual(p.empty, False)
+                self.assertEqual(p.valid, True)
+
+    def test03a_linestring(self):
+        "Testing LineString objects."
+        prev = fromstr('POINT(0 0)')
+        for l in linestrings:
+            ls = fromstr(l.wkt)
+            self.assertEqual(ls.geom_type, 'LineString')
+            self.assertEqual(ls.geom_typeid, 1)
+            self.assertEqual(ls.empty, False)
+            self.assertEqual(ls.ring, False)
+            if hasattr(l, 'centroid'):
+                self.assertEqual(l.centroid, ls.centroid.tuple)
+            if hasattr(l, 'tup'):
+                self.assertEqual(l.tup, ls.tuple)
+                
+            self.assertEqual(True, ls == fromstr(l.wkt))
+            self.assertEqual(False, ls == prev)
+            self.assertRaises(GEOSIndexError, ls.__getitem__, len(ls))
+            prev = ls
+
+            # Creating a LineString from a tuple, list, and numpy array
+            self.assertEqual(ls, LineString(ls.tuple))  # tuple
+            self.assertEqual(ls, LineString(*ls.tuple)) # as individual arguments
+            self.assertEqual(ls, LineString([list(tup) for tup in ls.tuple])) # as list
+            self.assertEqual(ls.wkt, LineString(*tuple(Point(tup) for tup in ls.tuple)).wkt) # Point individual arguments
+            if HAS_NUMPY: self.assertEqual(ls, LineString(array(ls.tuple))) # as numpy array
+
+    def test03b_multilinestring(self):
+        "Testing MultiLineString objects."
+        prev = fromstr('POINT(0 0)')
+        for l in multilinestrings:
+            ml = fromstr(l.wkt)
+            self.assertEqual(ml.geom_type, 'MultiLineString')
+            self.assertEqual(ml.geom_typeid, 5)
+
+            self.assertAlmostEqual(l.centroid[0], ml.centroid.x, 9)
+            self.assertAlmostEqual(l.centroid[1], ml.centroid.y, 9)
+
+            self.assertEqual(True, ml == fromstr(l.wkt))
+            self.assertEqual(False, ml == prev)
+            prev = ml
+
+            for ls in ml:
+                self.assertEqual(ls.geom_type, 'LineString')
+                self.assertEqual(ls.geom_typeid, 1)
+                self.assertEqual(ls.empty, False)
+
+            self.assertRaises(GEOSIndexError, ml.__getitem__, len(ml))
+            self.assertEqual(ml.wkt, MultiLineString(*tuple(s.clone() for s in ml)).wkt)
+            self.assertEqual(ml, MultiLineString(*tuple(LineString(s.tuple) for s in ml)))
+
+    def test04_linearring(self):
+        "Testing LinearRing objects."
+        for rr in linearrings:
+            lr = fromstr(rr.wkt)
+            self.assertEqual(lr.geom_type, 'LinearRing')
+            self.assertEqual(lr.geom_typeid, 2)
+            self.assertEqual(rr.n_p, len(lr))
+            self.assertEqual(True, lr.valid)
+            self.assertEqual(False, lr.empty)
+
+            # Creating a LinearRing from a tuple, list, and numpy array
+            self.assertEqual(lr, LinearRing(lr.tuple))
+            self.assertEqual(lr, LinearRing(*lr.tuple))
+            self.assertEqual(lr, LinearRing([list(tup) for tup in lr.tuple]))
+            if HAS_NUMPY: self.assertEqual(lr, LinearRing(array(lr.tuple)))
+    
+    def test05a_polygons(self):
+        "Testing Polygon objects."
+        prev = fromstr('POINT(0 0)')
+        for p in polygons:
+            # Creating the Polygon, testing its properties.
+            poly = fromstr(p.wkt)
+            self.assertEqual(poly.geom_type, 'Polygon')
+            self.assertEqual(poly.geom_typeid, 3)
+            self.assertEqual(poly.empty, False)
+            self.assertEqual(poly.ring, False)
+            self.assertEqual(p.n_i, poly.num_interior_rings)
+            self.assertEqual(p.n_i + 1, len(poly)) # Testing __len__
+            self.assertEqual(p.n_p, poly.num_points)
+
+            # Area & Centroid
+            self.assertAlmostEqual(p.area, poly.area, 9)
+            self.assertAlmostEqual(p.centroid[0], poly.centroid.tuple[0], 9)
+            self.assertAlmostEqual(p.centroid[1], poly.centroid.tuple[1], 9)
+
+            # Testing the geometry equivalence
+            self.assertEqual(True, poly == fromstr(p.wkt))
+            self.assertEqual(False, poly == prev) # Should not be equal to previous geometry
+            self.assertEqual(True, poly != prev)
+
+            # Testing the exterior ring
+            ring = poly.exterior_ring
+            self.assertEqual(ring.geom_type, 'LinearRing')
+            self.assertEqual(ring.geom_typeid, 2)
+            if p.ext_ring_cs:
+                self.assertEqual(p.ext_ring_cs, ring.tuple)
+                self.assertEqual(p.ext_ring_cs, poly[0].tuple) # Testing __getitem__
+
+            # Testing __getitem__ and __setitem__ on invalid indices
+            self.assertRaises(GEOSIndexError, poly.__getitem__, len(poly))
+            self.assertRaises(GEOSIndexError, poly.__setitem__, len(poly), False)
+            self.assertRaises(GEOSIndexError, poly.__getitem__, -1)
+
+            # Testing __iter__ 
+            for r in poly:
+                self.assertEqual(r.geom_type, 'LinearRing')
+                self.assertEqual(r.geom_typeid, 2)
+
+            # Testing polygon construction.
+            self.assertRaises(TypeError, Polygon.__init__, 0, [1, 2, 3])
+            self.assertRaises(TypeError, Polygon.__init__, 'foo')
+            
+            # Polygon(shell, (hole1, ... holeN))
+            rings = tuple(r for r in poly)
+            self.assertEqual(poly, Polygon(rings[0], rings[1:]))
+            
+            # Polygon(shell_tuple, hole_tuple1, ... , hole_tupleN)
+            ring_tuples = tuple(r.tuple for r in poly)
+            self.assertEqual(poly, Polygon(*ring_tuples))
+
+            # Constructing with tuples of LinearRings.
+            self.assertEqual(poly.wkt, Polygon(*tuple(r for r in poly)).wkt)
+            self.assertEqual(poly.wkt, Polygon(*tuple(LinearRing(r.tuple) for r in poly)).wkt)
+
+    def test05b_multipolygons(self):
+        "Testing MultiPolygon objects."
+        print "\nBEGIN - expecting GEOS_NOTICE; safe to ignore.\n"
+        prev = fromstr('POINT (0 0)')
+        for mp in multipolygons:
+            mpoly = fromstr(mp.wkt)
+            self.assertEqual(mpoly.geom_type, 'MultiPolygon')
+            self.assertEqual(mpoly.geom_typeid, 6)
+            self.assertEqual(mp.valid, mpoly.valid)
+
+            if mp.valid:
+                self.assertEqual(mp.num_geom, mpoly.num_geom)
+                self.assertEqual(mp.n_p, mpoly.num_coords)
+                self.assertEqual(mp.num_geom, len(mpoly))
+                self.assertRaises(GEOSIndexError, mpoly.__getitem__, len(mpoly))
+                for p in mpoly:
+                    self.assertEqual(p.geom_type, 'Polygon')
+                    self.assertEqual(p.geom_typeid, 3)
+                    self.assertEqual(p.valid, True)
+                self.assertEqual(mpoly.wkt, MultiPolygon(*tuple(poly.clone() for poly in mpoly)).wkt)
+
+        print "\nEND - expecting GEOS_NOTICE; safe to ignore.\n"  
+
+    def test06a_memory_hijinks(self):
+        "Testing Geometry __del__() on rings and polygons."
+        #### Memory issues with rings and polygons
+
+        # These tests are needed to ensure sanity with writable geometries.
+
+        # Getting a polygon with interior rings, and pulling out the interior rings
+        poly = fromstr(polygons[1].wkt)
+        ring1 = poly[0]
+        ring2 = poly[1]
+
+        # These deletes should be 'harmless' since they are done on child geometries
+        del ring1 
+        del ring2
+        ring1 = poly[0]
+        ring2 = poly[1]
+
+        # Deleting the polygon
+        del poly
+
+        # Access to these rings is OK since they are clones.
+        s1, s2 = str(ring1), str(ring2)
+
+        # The previous hijinks tests are now moot because only clones are 
+        # now used =)
+
+    def test08_coord_seq(self):
+        "Testing Coordinate Sequence objects."
+        for p in polygons:
+            if p.ext_ring_cs:
+                # Constructing the polygon and getting the coordinate sequence
+                poly = fromstr(p.wkt)
+                cs = poly.exterior_ring.coord_seq
+
+                self.assertEqual(p.ext_ring_cs, cs.tuple) # done in the Polygon test too.
+                self.assertEqual(len(p.ext_ring_cs), len(cs)) # Making sure __len__ works
+
+                # Checks __getitem__ and __setitem__
+                for i in xrange(len(p.ext_ring_cs)):
+                    c1 = p.ext_ring_cs[i] # Expected value
+                    c2 = cs[i] # Value from coordseq
+                    self.assertEqual(c1, c2)
+
+                    # Constructing the test value to set the coordinate sequence with
+                    if len(c1) == 2: tset = (5, 23)
+                    else: tset = (5, 23, 8)
+                    cs[i] = tset
+                    
+                    # Making sure every set point matches what we expect
+                    for j in range(len(tset)):
+                        cs[i] = tset
+                        self.assertEqual(tset[j], cs[i][j])
+
+    def test09_relate_pattern(self):
+        "Testing relate() and relate_pattern()."
+        g = fromstr('POINT (0 0)')
+        self.assertRaises(GEOSException, g.relate_pattern, 0, 'invalid pattern, yo')
+        for i in xrange(len(relate_geoms)):
+            g_tup = relate_geoms[i]
+            a = fromstr(g_tup[0].wkt)
+            b = fromstr(g_tup[1].wkt)
+            pat = g_tup[2]
+            result = g_tup[3]
+            self.assertEqual(result, a.relate_pattern(b, pat))
+            self.assertEqual(pat, a.relate(b))
+
+    def test10_intersection(self):
+        "Testing intersects() and intersection()."
+        for i in xrange(len(topology_geoms)):
+            g_tup = topology_geoms[i]
+            a = fromstr(g_tup[0].wkt)
+            b = fromstr(g_tup[1].wkt)
+            i1 = fromstr(intersect_geoms[i].wkt) 
+            self.assertEqual(True, a.intersects(b))
+            i2 = a.intersection(b)
+            self.assertEqual(i1, i2)
+            self.assertEqual(i1, a & b) # __and__ is intersection operator
+            a &= b # testing __iand__
+            self.assertEqual(i1, a)
+
+    def test11_union(self):
+        "Testing union()."
+        for i in xrange(len(topology_geoms)):
+            g_tup = topology_geoms[i]
+            a = fromstr(g_tup[0].wkt)
+            b = fromstr(g_tup[1].wkt)
+            u1 = fromstr(union_geoms[i].wkt)
+            u2 = a.union(b)
+            self.assertEqual(u1, u2)
+            self.assertEqual(u1, a | b) # __or__ is union operator
+            a |= b # testing __ior__
+            self.assertEqual(u1, a) 
+
+    def test12_difference(self):
+        "Testing difference()."
+        for i in xrange(len(topology_geoms)):
+            g_tup = topology_geoms[i]
+            a = fromstr(g_tup[0].wkt)
+            b = fromstr(g_tup[1].wkt)
+            d1 = fromstr(diff_geoms[i].wkt)
+            d2 = a.difference(b)
+            self.assertEqual(d1, d2)
+            self.assertEqual(d1, a - b) # __sub__ is difference operator
+            a -= b # testing __isub__
+            self.assertEqual(d1, a)
+
+    def test13_symdifference(self):
+        "Testing sym_difference()."
+        for i in xrange(len(topology_geoms)):
+            g_tup = topology_geoms[i]
+            a = fromstr(g_tup[0].wkt)
+            b = fromstr(g_tup[1].wkt)
+            d1 = fromstr(sdiff_geoms[i].wkt)
+            d2 = a.sym_difference(b)
+            self.assertEqual(d1, d2)
+            self.assertEqual(d1, a ^ b) # __xor__ is symmetric difference operator
+            a ^= b # testing __ixor__
+            self.assertEqual(d1, a)
+
+    def test14_buffer(self):
+        "Testing buffer()."
+        for i in xrange(len(buffer_geoms)):
+            g_tup = buffer_geoms[i]
+            g = fromstr(g_tup[0].wkt)
+
+            # The buffer we expect
+            exp_buf = fromstr(g_tup[1].wkt)
+
+            # Can't use a floating-point for the number of quadsegs.
+            self.assertRaises(ArgumentError, g.buffer, g_tup[2], float(g_tup[3]))
+
+            # Constructing our buffer
+            buf = g.buffer(g_tup[2], g_tup[3])
+            self.assertEqual(exp_buf.num_coords, buf.num_coords)
+            self.assertEqual(len(exp_buf), len(buf))
+
+            # Now assuring that each point in the buffer is almost equal
+            for j in xrange(len(exp_buf)):
+                exp_ring = exp_buf[j]
+                buf_ring = buf[j]
+                self.assertEqual(len(exp_ring), len(buf_ring))
+                for k in xrange(len(exp_ring)):
+                    # Asserting the X, Y of each point are almost equal (due to floating point imprecision)
+                    self.assertAlmostEqual(exp_ring[k][0], buf_ring[k][0], 9)
+                    self.assertAlmostEqual(exp_ring[k][1], buf_ring[k][1], 9)
+
+    def test15_srid(self):
+        "Testing the SRID property and keyword."
+        # Testing SRID keyword on Point
+        pnt = Point(5, 23, srid=4326)
+        self.assertEqual(4326, pnt.srid)
+        pnt.srid = 3084
+        self.assertEqual(3084, pnt.srid)
+        self.assertRaises(ArgumentError, pnt.set_srid, '4326')
+
+        # Testing SRID keyword on fromstr(), and on Polygon rings.
+        poly = fromstr(polygons[1].wkt, srid=4269)
+        self.assertEqual(4269, poly.srid)
+        for ring in poly: self.assertEqual(4269, ring.srid)
+        poly.srid = 4326
+        self.assertEqual(4326, poly.shell.srid)
+
+        # Testing SRID keyword on GeometryCollection
+        gc = GeometryCollection(Point(5, 23), LineString((0, 0), (1.5, 1.5), (3, 3)), srid=32021)
+        self.assertEqual(32021, gc.srid)
+        for i in range(len(gc)): self.assertEqual(32021, gc[i].srid)
+
+        # GEOS may get the SRID from HEXEWKB
+        # 'POINT(5 23)' at SRID=4326 in hex form -- obtained from PostGIS
+        # using `SELECT GeomFromText('POINT (5 23)', 4326);`.
+        hex = '0101000020E610000000000000000014400000000000003740'
+        p1 = fromstr(hex)
+        self.assertEqual(4326, p1.srid)
+
+        # In GEOS 3.0.0rc1-4  when the EWKB and/or HEXEWKB is exported,
+        # the SRID information is lost and set to -1 -- this is not a
+        # problem on the 3.0.0 version (another reason to upgrade).  
+        exp_srid = self.null_srid
+
+        p2 = fromstr(p1.hex)
+        self.assertEqual(exp_srid, p2.srid)
+        p3 = fromstr(p1.hex, srid=-1) # -1 is intended.
+        self.assertEqual(-1, p3.srid)
+
+    def test16_mutable_geometries(self):
+        "Testing the mutability of Polygons and Geometry Collections."
+        ### Testing the mutability of Polygons ###
+        for p in polygons:
+            poly = fromstr(p.wkt)
+
+            # Should only be able to use __setitem__ with LinearRing geometries.
+            self.assertRaises(TypeError, poly.__setitem__, 0, LineString((1, 1), (2, 2)))
+
+            # Constructing the new shell by adding 500 to every point in the old shell.
+            shell_tup = poly.shell.tuple
+            new_coords = []
+            for point in shell_tup: new_coords.append((point[0] + 500., point[1] + 500.))
+            new_shell = LinearRing(*tuple(new_coords))
+
+            # Assigning polygon's exterior ring w/the new shell
+            poly.exterior_ring = new_shell
+            s = str(new_shell) # new shell is still accessible
+            self.assertEqual(poly.exterior_ring, new_shell)
+            self.assertEqual(poly[0], new_shell)
+
+        ### Testing the mutability of Geometry Collections
+        for tg in multipoints:
+            mp = fromstr(tg.wkt)
+            for i in range(len(mp)):
+                # Creating a random point.
+                pnt = mp[i]
+                new = Point(random.randint(1, 100), random.randint(1, 100))
+                # Testing the assignment
+                mp[i] = new
+                s = str(new) # what was used for the assignment is still accessible
+                self.assertEqual(mp[i], new)
+                self.assertEqual(mp[i].wkt, new.wkt)
+                self.assertNotEqual(pnt, mp[i])
+
+        # MultiPolygons involve much more memory management because each
+        # Polygon w/in the collection has its own rings.
+        for tg in multipolygons:
+            mpoly = fromstr(tg.wkt)
+            for i in xrange(len(mpoly)):
+                poly = mpoly[i]
+                old_poly = mpoly[i]
+                # Offsetting the each ring in the polygon by 500.
+                for j in xrange(len(poly)):
+                    r = poly[j]
+                    for k in xrange(len(r)): r[k] = (r[k][0] + 500., r[k][1] + 500.)
+                    poly[j] = r
+                
+                self.assertNotEqual(mpoly[i], poly)
+                # Testing the assignment
+                mpoly[i] = poly
+                s = str(poly) # Still accessible
+                self.assertEqual(mpoly[i], poly)
+                self.assertNotEqual(mpoly[i], old_poly)
+
+        # Extreme (!!) __setitem__ -- no longer works, have to detect
+        # in the first object that __setitem__ is called in the subsequent
+        # objects -- maybe mpoly[0, 0, 0] = (3.14, 2.71)?
+        #mpoly[0][0][0] = (3.14, 2.71)
+        #self.assertEqual((3.14, 2.71), mpoly[0][0][0])
+        # Doing it more slowly..
+        #self.assertEqual((3.14, 2.71), mpoly[0].shell[0])
+        #del mpoly
+    
+    def test17_threed(self):
+        "Testing three-dimensional geometries."
+        # Testing a 3D Point
+        pnt = Point(2, 3, 8)
+        self.assertEqual((2.,3.,8.), pnt.coords)
+        self.assertRaises(TypeError, pnt.set_coords, (1.,2.))
+        pnt.coords = (1.,2.,3.)
+        self.assertEqual((1.,2.,3.), pnt.coords)
+
+        # Testing a 3D LineString
+        ls = LineString((2., 3., 8.), (50., 250., -117.))
+        self.assertEqual(((2.,3.,8.), (50.,250.,-117.)), ls.tuple)
+        self.assertRaises(TypeError, ls.__setitem__, 0, (1.,2.))
+        ls[0] = (1.,2.,3.)
+        self.assertEqual((1.,2.,3.), ls[0])
+            
+    def test18_distance(self):
+        "Testing the distance() function."
+        # Distance to self should be 0. 
+        pnt = Point(0, 0)
+        self.assertEqual(0.0, pnt.distance(Point(0, 0)))
+    
+        # Distance should be 1
+        self.assertEqual(1.0, pnt.distance(Point(0, 1)))
+
+        # Distance should be ~ sqrt(2)
+        self.assertAlmostEqual(1.41421356237, pnt.distance(Point(1, 1)), 11)
+
+        # Distances are from the closest vertex in each geometry --
+        #  should be 3 (distance from (2, 2) to (5, 2)).
+        ls1 = LineString((0, 0), (1, 1), (2, 2))
+        ls2 = LineString((5, 2), (6, 1), (7, 0))
+        self.assertEqual(3, ls1.distance(ls2))
+
+    def test19_length(self):
+        "Testing the length property."
+        # Points have 0 length.
+        pnt = Point(0, 0)
+        self.assertEqual(0.0, pnt.length)
+        
+        # Should be ~ sqrt(2)
+        ls = LineString((0, 0), (1, 1))
+        self.assertAlmostEqual(1.41421356237, ls.length, 11)
+
+        # Should be circumfrence of Polygon
+        poly = Polygon(LinearRing((0, 0), (0, 1), (1, 1), (1, 0), (0, 0)))
+        self.assertEqual(4.0, poly.length)
+
+        # Should be sum of each element's length in collection.
+        mpoly = MultiPolygon(poly.clone(), poly)
+        self.assertEqual(8.0, mpoly.length)
+
+    def test20_emptyCollections(self):
+        "Testing empty geometries and collections."
+        gc1 = GeometryCollection([])
+        gc2 = fromstr('GEOMETRYCOLLECTION EMPTY')
+        pnt = fromstr('POINT EMPTY')
+        ls = fromstr('LINESTRING EMPTY')
+        poly = fromstr('POLYGON EMPTY')
+        mls = fromstr('MULTILINESTRING EMPTY')
+        mpoly1 = fromstr('MULTIPOLYGON EMPTY')
+        mpoly2 = MultiPolygon(())
+
+        for g in [gc1, gc2, pnt, ls, poly, mls, mpoly1, mpoly2]:
+            self.assertEqual(True, g.empty)
+
+            # Testing len() and num_geom.
+            if isinstance(g, Polygon):
+                self.assertEqual(1, len(g)) # Has one empty linear ring
+                self.assertEqual(1, g.num_geom)
+                self.assertEqual(0, len(g[0]))
+            elif isinstance(g, (Point, LineString)):
+                self.assertEqual(1, g.num_geom)
+                self.assertEqual(0, len(g))
+            else:
+                self.assertEqual(0, g.num_geom)
+                self.assertEqual(0, len(g))
+
+            # Testing __getitem__ (doesn't work on Point or Polygon)
+            if isinstance(g, Point):
+                self.assertRaises(GEOSIndexError, g.get_x)
+            elif isinstance(g, Polygon):
+                lr = g.shell
+                self.assertEqual('LINEARRING EMPTY', lr.wkt)
+                self.assertEqual(0, len(lr))
+                self.assertEqual(True, lr.empty)
+                self.assertRaises(GEOSIndexError, lr.__getitem__, 0)
+            else:
+                self.assertRaises(GEOSIndexError, g.__getitem__, 0)
+
+    def test21_test_gdal(self):
+        "Testing `ogr` and `srs` properties."
+        if not HAS_GDAL: return
+        g1 = fromstr('POINT(5 23)')
+        self.assertEqual(True, isinstance(g1.ogr, OGRGeometry))
+        self.assertEqual(g1.srs, None)
+        
+        g2 = fromstr('LINESTRING(0 0, 5 5, 23 23)', srid=4326)
+        self.assertEqual(True, isinstance(g2.ogr, OGRGeometry))
+        self.assertEqual(True, isinstance(g2.srs, SpatialReference))
+        self.assertEqual(g2.hex, g2.ogr.hex)
+        self.assertEqual('WGS 84', g2.srs.name)
+
+    def test22_copy(self):
+        "Testing use with the Python `copy` module."
+        import copy
+        poly = GEOSGeometry('POLYGON((0 0, 0 23, 23 23, 23 0, 0 0), (5 5, 5 10, 10 10, 10 5, 5 5))')
+        cpy1 = copy.copy(poly)
+        cpy2 = copy.deepcopy(poly)
+        self.assertNotEqual(poly._ptr, cpy1._ptr)
+        self.assertNotEqual(poly._ptr, cpy2._ptr)
+
+    def test23_transform(self):
+        "Testing `transform` method."
+        if not HAS_GDAL: return
+        orig = GEOSGeometry('POINT (-104.609 38.255)', 4326)
+        trans = GEOSGeometry('POINT (992385.4472045 481455.4944650)', 2774)
+
+        # Using a srid, a SpatialReference object, and a CoordTransform object
+        # for transformations.
+        t1, t2, t3 = orig.clone(), orig.clone(), orig.clone()
+        t1.transform(trans.srid)
+        t2.transform(SpatialReference('EPSG:2774'))
+        ct = CoordTransform(SpatialReference('WGS84'), SpatialReference(2774))
+        t3.transform(ct)
+
+        # Testing use of the `clone` keyword.
+        k1 = orig.clone()
+        k2 = k1.transform(trans.srid, clone=True)
+        self.assertEqual(k1, orig)
+        self.assertNotEqual(k1, k2)
+
+        prec = 3
+        for p in (t1, t2, t3, k2):
+            self.assertAlmostEqual(trans.x, p.x, prec)
+            self.assertAlmostEqual(trans.y, p.y, prec)
+
+    def test24_extent(self):
+        "Testing `extent` method."
+        # The xmin, ymin, xmax, ymax of the MultiPoint should be returned.
+        mp = MultiPoint(Point(5, 23), Point(0, 0), Point(10, 50))
+        self.assertEqual((0.0, 0.0, 10.0, 50.0), mp.extent)
+        pnt = Point(5.23, 17.8)
+        # Extent of points is just the point itself repeated.
+        self.assertEqual((5.23, 17.8, 5.23, 17.8), pnt.extent)
+        # Testing on the 'real world' Polygon.
+        poly = fromstr(polygons[3].wkt)
+        ring = poly.shell
+        x, y = ring.x, ring.y
+        xmin, ymin = min(x), min(y)
+        xmax, ymax = max(x), max(y)
+        self.assertEqual((xmin, ymin, xmax, ymax), poly.extent)
+
+    def test25_pickle(self):
+        "Testing pickling and unpickling support."
+        # Using both pickle and cPickle -- just 'cause.
+        import pickle, cPickle
+
+        # Creating a list of test geometries for pickling, 
+        # and setting the SRID on some of them.
+        def get_geoms(lst, srid=None):
+            return [GEOSGeometry(tg.wkt, srid) for tg in lst]
+        tgeoms = get_geoms(points)
+        tgeoms.extend(get_geoms(multilinestrings, 4326))
+        tgeoms.extend(get_geoms(polygons, 3084))
+        tgeoms.extend(get_geoms(multipolygons, 900913))
+
+        # The SRID won't be exported in GEOS 3.0 release candidates.
+        no_srid = self.null_srid == -1 
+        for geom in tgeoms:
+            s1, s2 = cPickle.dumps(geom), pickle.dumps(geom)
+            g1, g2 = cPickle.loads(s1), pickle.loads(s2)
+            for tmpg in (g1, g2):
+                self.assertEqual(geom, tmpg)
+                if not no_srid: self.assertEqual(geom.srid, tmpg.srid)
+
+def suite():
+    s = unittest.TestSuite()
+    s.addTest(unittest.makeSuite(GEOSTest))
+    return s
+
+def run(verbosity=2):
+    unittest.TextTestRunner(verbosity=verbosity).run(suite())
diff --git a/webapp/django/contrib/gis/tests/test_measure.py b/webapp/django/contrib/gis/tests/test_measure.py
new file mode 100644
index 0000000..43bc8ae
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/test_measure.py
@@ -0,0 +1,333 @@
+"""
+Distance and Area objects to allow for sensible and convienient calculation 
+and conversions. Here are some tests.
+"""
+
+import unittest
+from django.contrib.gis.measure import Distance, Area, D, A
+
+class DistanceTest(unittest.TestCase):
+    "Testing the Distance object"
+
+    def testInit(self):
+        "Testing initialisation from valid units"
+        d = Distance(m=100)
+        self.assertEqual(d.m, 100)
+
+        d1, d2, d3 = D(m=100), D(meter=100), D(metre=100)
+        for d in (d1, d2, d3):
+            self.assertEqual(d.m, 100)
+
+        d = D(nm=100)
+        self.assertEqual(d.m, 185200)
+
+        y1, y2, y3 = D(yd=100), D(yard=100), D(Yard=100)
+        for d in (y1, y2, y3):
+            self.assertEqual(d.yd, 100)
+
+        mm1, mm2 = D(millimeter=1000), D(MiLLiMeTeR=1000)
+        for d in (mm1, mm2):
+            self.assertEqual(d.m, 1.0)
+            self.assertEqual(d.mm, 1000.0)
+
+    
+    def testInitInvalid(self):
+        "Testing initialisation from invalid units"
+        self.assertRaises(AttributeError, D, banana=100)
+
+    def testAccess(self):
+        "Testing access in different units"
+        d = D(m=100)
+        self.assertEqual(d.km, 0.1)
+        self.assertAlmostEqual(d.ft, 328.084, 3)
+    
+    def testAccessInvalid(self):
+        "Testing access in invalid units"
+        d = D(m=100)
+        self.failIf(hasattr(d, 'banana'))
+
+    def testAddition(self):
+        "Test addition & subtraction"
+        d1 = D(m=100)
+        d2 = D(m=200)
+
+        d3 = d1 + d2
+        self.assertEqual(d3.m, 300)
+        d3 += d1
+        self.assertEqual(d3.m, 400)
+        
+        d4 = d1 - d2
+        self.assertEqual(d4.m, -100)
+        d4 -= d1
+        self.assertEqual(d4.m, -200)
+        
+        try:
+            d5 = d1 + 1
+        except TypeError, e:
+            pass
+        else:
+            self.fail('Distance + number should raise TypeError')
+
+        try:
+            d5 = d1 - 1
+        except TypeError, e:
+            pass
+        else:
+            self.fail('Distance - number should raise TypeError')
+
+        try:
+            d1 += 1
+        except TypeError, e:
+            pass
+        else:
+            self.fail('Distance += number should raise TypeError')
+
+        try:
+            d1 -= 1
+        except TypeError, e:
+            pass
+        else:
+            self.fail('Distance -= number should raise TypeError')
+            
+    def testMultiplication(self):
+        "Test multiplication & division"
+        d1 = D(m=100)
+
+        d3 = d1 * 2
+        self.assertEqual(d3.m, 200)
+        d3 *= 5
+        self.assertEqual(d3.m, 1000)
+        
+        d4 = d1 / 2
+        self.assertEqual(d4.m, 50)
+        d4 /= 5
+        self.assertEqual(d4.m, 10)
+        
+        a5 = d1 * D(m=10)
+        self.assert_(isinstance(a5, Area))
+        self.assertEqual(a5.sq_m, 100*10)
+
+        try:
+            d1 *= D(m=1)
+        except TypeError, e:
+            pass
+        else:
+            self.fail('Distance *= Distance should raise TypeError')
+            
+        try:
+            d5 = d1 / D(m=1)
+        except TypeError, e:
+            pass
+        else:
+            self.fail('Distance / Distance should raise TypeError')
+
+        try:
+            d1 /= D(m=1)
+        except TypeError, e:
+            pass
+        else:
+            self.fail('Distance /= Distance should raise TypeError')
+
+    def testUnitConversions(self):
+        "Testing default units during maths"
+        d1 = D(m=100)
+        d2 = D(km=1)
+
+        d3 = d1 + d2
+        self.assertEqual(d3._default_unit, 'm')
+        d4 = d2 + d1
+        self.assertEqual(d4._default_unit, 'km')
+        d5 = d1 * 2
+        self.assertEqual(d5._default_unit, 'm')
+        d6 = d1 / 2
+        self.assertEqual(d6._default_unit, 'm')
+    
+    def testComparisons(self):
+        "Testing comparisons"
+        d1 = D(m=100)
+        d2 = D(km=1)
+        d3 = D(km=0)
+        
+        self.assert_(d2 > d1)
+        self.assert_(d1 == d1)
+        self.assert_(d1 < d2)
+        self.failIf(d3)
+        
+    def testUnitsStr(self):
+        "Testing conversion to strings"
+        d1 = D(m=100)
+        d2 = D(km=3.5)
+        
+        self.assertEqual(str(d1), '100.0 m')
+        self.assertEqual(str(d2), '3.5 km')
+        self.assertEqual(repr(d1), 'Distance(m=100.0)')
+        self.assertEqual(repr(d2), 'Distance(km=3.5)')
+
+    def testUnitAttName(self):
+        "Testing the `unit_attname` class method"
+        unit_tuple = [('Yard', 'yd'), ('Nautical Mile', 'nm'), ('German legal metre', 'german_m'),
+                      ('Indian yard', 'indian_yd'), ('Chain (Sears)', 'chain_sears'), ('Chain', 'chain')]
+        for nm, att in unit_tuple:
+            self.assertEqual(att, D.unit_attname(nm))
+
+class AreaTest(unittest.TestCase):
+    "Testing the Area object"
+
+    def testInit(self):
+        "Testing initialisation from valid units"
+        a = Area(sq_m=100)
+        self.assertEqual(a.sq_m, 100)
+
+        a = A(sq_m=100)
+        self.assertEqual(a.sq_m, 100)
+
+        a = A(sq_mi=100)
+        self.assertEqual(a.sq_m, 258998811.0336)
+    
+    def testInitInvaliA(self):
+        "Testing initialisation from invalid units"
+        self.assertRaises(AttributeError, A, banana=100)
+
+    def testAccess(self):
+        "Testing access in different units"
+        a = A(sq_m=100)
+        self.assertEqual(a.sq_km, 0.0001)
+        self.assertAlmostEqual(a.sq_ft, 1076.391, 3)
+    
+    def testAccessInvaliA(self):
+        "Testing access in invalid units"
+        a = A(sq_m=100)
+        self.failIf(hasattr(a, 'banana'))
+
+    def testAddition(self):
+        "Test addition & subtraction"
+        a1 = A(sq_m=100)
+        a2 = A(sq_m=200)
+
+        a3 = a1 + a2
+        self.assertEqual(a3.sq_m, 300)
+        a3 += a1
+        self.assertEqual(a3.sq_m, 400)
+        
+        a4 = a1 - a2
+        self.assertEqual(a4.sq_m, -100)
+        a4 -= a1
+        self.assertEqual(a4.sq_m, -200)
+        
+        try:
+            a5 = a1 + 1
+        except TypeError, e:
+            pass
+        else:
+            self.fail('Area + number should raise TypeError')
+
+        try:
+            a5 = a1 - 1
+        except TypeError, e:
+            pass
+        else:
+            self.fail('Area - number should raise TypeError')
+
+        try:
+            a1 += 1
+        except TypeError, e:
+            pass
+        else:
+            self.fail('Area += number should raise TypeError')
+
+        try:
+            a1 -= 1
+        except TypeError, e:
+            pass
+        else:
+            self.fail('Area -= number should raise TypeError')
+            
+    def testMultiplication(self):
+        "Test multiplication & division"
+        a1 = A(sq_m=100)
+
+        a3 = a1 * 2
+        self.assertEqual(a3.sq_m, 200)
+        a3 *= 5
+        self.assertEqual(a3.sq_m, 1000)
+        
+        a4 = a1 / 2
+        self.assertEqual(a4.sq_m, 50)
+        a4 /= 5
+        self.assertEqual(a4.sq_m, 10)
+        
+        try:
+            a5 = a1 * A(sq_m=1)
+        except TypeError, e:
+            pass
+        else:
+            self.fail('Area * Area should raise TypeError')
+
+        try:
+            a1 *= A(sq_m=1)
+        except TypeError, e:
+            pass
+        else:
+            self.fail('Area *= Area should raise TypeError')
+            
+        try:
+            a5 = a1 / A(sq_m=1)
+        except TypeError, e:
+            pass
+        else:
+            self.fail('Area / Area should raise TypeError')
+
+        try:
+            a1 /= A(sq_m=1)
+        except TypeError, e:
+            pass
+        else:
+            self.fail('Area /= Area should raise TypeError')
+
+    def testUnitConversions(self):
+        "Testing default units during maths"
+        a1 = A(sq_m=100)
+        a2 = A(sq_km=1)
+
+        a3 = a1 + a2
+        self.assertEqual(a3._default_unit, 'sq_m')
+        a4 = a2 + a1
+        self.assertEqual(a4._default_unit, 'sq_km')
+        a5 = a1 * 2
+        self.assertEqual(a5._default_unit, 'sq_m')
+        a6 = a1 / 2
+        self.assertEqual(a6._default_unit, 'sq_m')
+    
+    def testComparisons(self):
+        "Testing comparisons"
+        a1 = A(sq_m=100)
+        a2 = A(sq_km=1)
+        a3 = A(sq_km=0)
+        
+        self.assert_(a2 > a1)
+        self.assert_(a1 == a1)
+        self.assert_(a1 < a2)
+        self.failIf(a3)
+        
+    def testUnitsStr(self):
+        "Testing conversion to strings"
+        a1 = A(sq_m=100)
+        a2 = A(sq_km=3.5)
+        
+        self.assertEqual(str(a1), '100.0 sq_m')
+        self.assertEqual(str(a2), '3.5 sq_km')
+        self.assertEqual(repr(a1), 'Area(sq_m=100.0)')
+        self.assertEqual(repr(a2), 'Area(sq_km=3.5)')
+
+        
+def suite():
+    s = unittest.TestSuite()
+    s.addTest(unittest.makeSuite(DistanceTest))
+    s.addTest(unittest.makeSuite(AreaTest))
+    return s
+
+def run(verbosity=2):
+    unittest.TextTestRunner(verbosity=verbosity).run(suite())
+
+if __name__=="__main__":
+    run()
diff --git a/webapp/django/contrib/gis/tests/test_spatialrefsys.py b/webapp/django/contrib/gis/tests/test_spatialrefsys.py
new file mode 100644
index 0000000..0b133a1
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/test_spatialrefsys.py
@@ -0,0 +1,90 @@
+import unittest
+from django.contrib.gis.tests.utils import mysql, no_mysql, oracle, postgis
+if not mysql:
+    from django.contrib.gis.models import SpatialRefSys
+
+test_srs = ({'srid' : 4326,
+             'auth_name' : ('EPSG', True),
+             'auth_srid' : 4326,
+             'srtext' : 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]',
+             'proj4' : '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs ',
+             'spheroid' : 'WGS 84', 'name' : 'WGS 84', 
+             'geographic' : True, 'projected' : False,
+             'ellipsoid' : (6378137.0, 6356752.3, 298.257223563), # From proj's "cs2cs -le" and Wikipedia (semi-minor only)
+             'eprec' : (1, 1, 9),
+             },
+            {'srid' : 32140,
+             'auth_name' : ('EPSG', False),
+             'auth_srid' : 32140,
+             'srtext' : 'PROJCS["NAD83 / Texas South Central",GEOGCS["NAD83",DATUM["North_American_Datum_1983",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],AUTHORITY["EPSG","6269"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4269"]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["standard_parallel_1",30.28333333333333],PARAMETER["standard_parallel_2",28.38333333333333],PARAMETER["latitude_of_origin",27.83333333333333],PARAMETER["central_meridian",-99],PARAMETER["false_easting",600000],PARAMETER["false_northing",4000000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AUTHORITY["EPSG","32140"]]',
+             'proj4' : '+proj=lcc +lat_1=30.28333333333333 +lat_2=28.38333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=4000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs ',
+             'spheroid' : 'GRS 1980', 'name' : 'NAD83 / Texas South Central',
+             'geographic' : False, 'projected' : True,
+             'ellipsoid' : (6378137.0, 6356752.31414, 298.257222101), # From proj's "cs2cs -le" and Wikipedia (semi-minor only)
+             'eprec' : (1, 5, 10),
+             },
+            )
+
+class SpatialRefSysTest(unittest.TestCase):
+
+    @no_mysql
+    def test01_retrieve(self):
+        "Testing retrieval of SpatialRefSys model objects."
+        for sd in test_srs:
+            srs = SpatialRefSys.objects.get(srid=sd['srid'])
+            self.assertEqual(sd['srid'], srs.srid)
+
+            # Some of the authority names are borked on Oracle, e.g., SRID=32140.
+            #  also, Oracle Spatial seems to add extraneous info to fields, hence the
+            #  the testing with the 'startswith' flag.
+            auth_name, oracle_flag = sd['auth_name']
+            if postgis or (oracle and oracle_flag):
+                self.assertEqual(True, srs.auth_name.startswith(auth_name))
+                
+            self.assertEqual(sd['auth_srid'], srs.auth_srid)
+
+            # No proj.4 and different srtext on oracle backends :(
+            if postgis:
+                self.assertEqual(sd['srtext'], srs.wkt)
+                self.assertEqual(sd['proj4'], srs.proj4text)
+
+    @no_mysql
+    def test02_osr(self):
+        "Testing getting OSR objects from SpatialRefSys model objects."
+        for sd in test_srs:
+            sr = SpatialRefSys.objects.get(srid=sd['srid'])
+            self.assertEqual(True, sr.spheroid.startswith(sd['spheroid']))
+            self.assertEqual(sd['geographic'], sr.geographic)
+            self.assertEqual(sd['projected'], sr.projected)
+            self.assertEqual(True, sr.name.startswith(sd['name']))
+
+            # Testing the SpatialReference object directly.
+            if postgis:
+                srs = sr.srs
+                self.assertEqual(sd['proj4'], srs.proj4)
+                self.assertEqual(sd['srtext'], srs.wkt)
+
+    @no_mysql
+    def test03_ellipsoid(self):
+        "Testing the ellipsoid property."
+        for sd in test_srs:
+            # Getting the ellipsoid and precision parameters.
+            ellps1 = sd['ellipsoid']
+            prec = sd['eprec']
+
+            # Getting our spatial reference and its ellipsoid
+            srs = SpatialRefSys.objects.get(srid=sd['srid'])
+            ellps2 = srs.ellipsoid
+
+            for i in range(3):
+                param1 = ellps1[i]
+                param2 = ellps2[i]
+                self.assertAlmostEqual(ellps1[i], ellps2[i], prec[i])
+
+def suite():
+    s = unittest.TestSuite()
+    s.addTest(unittest.makeSuite(SpatialRefSysTest))
+    return s
+
+def run(verbosity=2):
+    unittest.TextTestRunner(verbosity=verbosity).run(suite())
diff --git a/webapp/django/contrib/gis/tests/urls.py b/webapp/django/contrib/gis/tests/urls.py
new file mode 100644
index 0000000..95e36c2
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/urls.py
@@ -0,0 +1,6 @@
+from django.conf.urls.defaults import *
+
+urlpatterns = patterns('',
+                       (r'^geoapp/', include('django.contrib.gis.tests.geoapp.urls')),
+                       )
+                        
diff --git a/webapp/django/contrib/gis/tests/utils.py b/webapp/django/contrib/gis/tests/utils.py
new file mode 100644
index 0000000..0b368f1
--- /dev/null
+++ b/webapp/django/contrib/gis/tests/utils.py
@@ -0,0 +1,22 @@
+from django.conf import settings
+
+# function that will pass a test.
+def pass_test(*args): return
+
+def no_backend(test_func, backend):
+    "Use this decorator to disable test on specified backend."
+    if settings.DATABASE_ENGINE == backend:
+        return pass_test
+    else:
+        return test_func
+
+# Decorators to disable entire test functions for specific
+# spatial backends.
+def no_oracle(func): return no_backend(func, 'oracle')
+def no_postgis(func): return no_backend(func, 'postgresql_psycopg2')
+def no_mysql(func): return no_backend(func, 'mysql')
+
+# Shortcut booleans to omit only portions of tests.
+oracle  = settings.DATABASE_ENGINE == 'oracle'
+postgis = settings.DATABASE_ENGINE == 'postgresql_psycopg2' 
+mysql   = settings.DATABASE_ENGINE == 'mysql'
diff --git a/webapp/django/contrib/gis/utils/__init__.py b/webapp/django/contrib/gis/utils/__init__.py
new file mode 100644
index 0000000..2c9f2f3
--- /dev/null
+++ b/webapp/django/contrib/gis/utils/__init__.py
@@ -0,0 +1,25 @@
+"""
+ This module contains useful utilities for GeoDjango.
+"""
+# Importing the utilities that depend on GDAL, if available.
+from django.contrib.gis.gdal import HAS_GDAL
+if HAS_GDAL:
+    from django.contrib.gis.utils.ogrinfo import ogrinfo, sample
+    from django.contrib.gis.utils.ogrinspect import mapping, ogrinspect
+    from django.contrib.gis.utils.srs import add_postgis_srs
+    try:
+        # LayerMapping requires DJANGO_SETTINGS_MODULE to be set, 
+        # so this needs to be in try/except.
+        from django.contrib.gis.utils.layermapping import LayerMapping
+    except:
+        pass
+    
+# Attempting to import the GeoIP class.
+try:
+    from django.contrib.gis.utils.geoip import GeoIP, GeoIPException
+    HAS_GEOIP = True
+except:
+    HAS_GEOIP = False
+
+from django.contrib.gis.utils.wkt import precision_wkt
+
diff --git a/webapp/django/contrib/gis/utils/geoip.py b/webapp/django/contrib/gis/utils/geoip.py
new file mode 100644
index 0000000..4d163aa
--- /dev/null
+++ b/webapp/django/contrib/gis/utils/geoip.py
@@ -0,0 +1,344 @@
+"""
+ This module houses the GeoIP object, a ctypes wrapper for the MaxMind GeoIP(R)
+ C API (http://www.maxmind.com/app/c).  This is an alternative to the GPL
+ licensed Python GeoIP interface provided by MaxMind.
+
+ GeoIP(R) is a registered trademark of MaxMind, LLC of Boston, Massachusetts.
+
+ For IP-based geolocation, this module requires the GeoLite Country and City
+ datasets, in binary format (CSV will not work!).  The datasets may be 
+ downloaded from MaxMind at http://www.maxmind.com/download/geoip/database/.
+ Grab GeoIP.dat.gz and GeoLiteCity.dat.gz, and unzip them in the directory
+ corresponding to settings.GEOIP_PATH.  See the GeoIP docstring and examples
+ below for more details.
+
+ TODO: Verify compatibility with Windows.
+
+ Example:
+
+ >>> from django.contrib.gis.utils import GeoIP
+ >>> g = GeoIP()
+ >>> g.country('google.com')
+ {'country_code': 'US', 'country_name': 'United States'}
+ >>> g.city('72.14.207.99')
+ {'area_code': 650,
+ 'city': 'Mountain View',
+ 'country_code': 'US',
+ 'country_code3': 'USA',
+ 'country_name': 'United States',
+ 'dma_code': 807,
+ 'latitude': 37.419200897216797,
+ 'longitude': -122.05740356445312,
+ 'postal_code': '94043',
+ 'region': 'CA'}
+ >>> g.lat_lon('salon.com')
+ (37.789798736572266, -122.39420318603516)
+ >>> g.lon_lat('uh.edu')
+ (-95.415199279785156, 29.77549934387207) 
+ >>> g.geos('24.124.1.80').wkt
+ 'POINT (-95.2087020874023438 39.0392990112304688)'
+"""
+import os, re
+from ctypes import c_char_p, c_float, c_int, Structure, CDLL, POINTER
+from ctypes.util import find_library
+from django.conf import settings
+if not settings._target: settings.configure()
+
+# Creating the settings dictionary with any settings, if needed.
+GEOIP_SETTINGS = dict((key, getattr(settings, key)) 
+                      for key in ('GEOIP_PATH', 'GEOIP_LIBRARY_PATH', 'GEOIP_COUNTRY', 'GEOIP_CITY')
+                      if hasattr(settings, key))
+lib_path = GEOIP_SETTINGS.get('GEOIP_LIBRARY_PATH', None)
+
+# GeoIP Exception class.
+class GeoIPException(Exception): pass
+
+# The shared library for the GeoIP C API.  May be downloaded
+#  from http://www.maxmind.com/download/geoip/api/c/
+if lib_path:
+    lib_name = None
+else:
+    # TODO: Is this really the library name for Windows?
+    lib_name = 'GeoIP'
+
+# Getting the path to the GeoIP library.
+if lib_name: lib_path = find_library(lib_name)
+if lib_path is None: raise GeoIPException('Could not find the GeoIP library (tried "%s"). '
+                                          'Try setting GEOIP_LIBRARY_PATH in your settings.' % lib_name)
+lgeoip = CDLL(lib_path)
+
+# Regular expressions for recognizing IP addresses and the GeoIP
+# free database editions.
+ipregex = re.compile(r'^(?P<w>\d\d?\d?)\.(?P<x>\d\d?\d?)\.(?P<y>\d\d?\d?)\.(?P<z>\d\d?\d?)$')
+free_regex = re.compile(r'^GEO-\d{3}FREE')
+lite_regex = re.compile(r'^GEO-\d{3}LITE')
+
+#### GeoIP C Structure definitions ####
+class GeoIPRecord(Structure):
+    _fields_ = [('country_code', c_char_p),
+                ('country_code3', c_char_p),
+                ('country_name', c_char_p),
+                ('region', c_char_p),
+                ('city', c_char_p),
+                ('postal_code', c_char_p),
+                ('latitude', c_float),
+                ('longitude', c_float),
+                ('dma_code', c_int),
+                ('area_code', c_int),
+                ]
+class GeoIPTag(Structure): pass
+
+#### ctypes function prototypes ####
+RECTYPE = POINTER(GeoIPRecord)
+DBTYPE = POINTER(GeoIPTag)
+
+# For retrieving records by name or address.
+def record_output(func):
+    func.restype = RECTYPE
+    return func
+rec_by_addr = record_output(lgeoip.GeoIP_record_by_addr)
+rec_by_name = record_output(lgeoip.GeoIP_record_by_name)
+
+# For opening up GeoIP databases.
+geoip_open = lgeoip.GeoIP_open
+geoip_open.restype = DBTYPE
+
+# String output routines.
+def string_output(func):
+    func.restype = c_char_p
+    return func
+geoip_dbinfo = string_output(lgeoip.GeoIP_database_info)
+cntry_code_by_addr = string_output(lgeoip.GeoIP_country_code_by_addr)
+cntry_code_by_name = string_output(lgeoip.GeoIP_country_code_by_name)
+cntry_name_by_addr = string_output(lgeoip.GeoIP_country_name_by_addr)
+cntry_name_by_name = string_output(lgeoip.GeoIP_country_name_by_name)
+
+#### GeoIP class ####
+class GeoIP(object):
+    # The flags for GeoIP memory caching.
+    # GEOIP_STANDARD - read database from filesystem, uses least memory.
+    #
+    # GEOIP_MEMORY_CACHE - load database into memory, faster performance
+    #        but uses more memory
+    #
+    # GEOIP_CHECK_CACHE - check for updated database.  If database has been updated,
+    #        reload filehandle and/or memory cache.
+    #
+    # GEOIP_INDEX_CACHE - just cache
+    #        the most frequently accessed index portion of the database, resulting
+    #        in faster lookups than GEOIP_STANDARD, but less memory usage than
+    #        GEOIP_MEMORY_CACHE - useful for larger databases such as
+    #        GeoIP Organization and GeoIP City.  Note, for GeoIP Country, Region
+    #        and Netspeed databases, GEOIP_INDEX_CACHE is equivalent to GEOIP_MEMORY_CACHE
+    #
+    GEOIP_STANDARD = 0
+    GEOIP_MEMORY_CACHE = 1
+    GEOIP_CHECK_CACHE = 2
+    GEOIP_INDEX_CACHE = 4
+    cache_options = dict((opt, None) for opt in (0, 1, 2, 4))
+
+    def __init__(self, path=None, cache=0, country=None, city=None):
+        """
+        Initializes the GeoIP object, no parameters are required to use default
+        settings.  Keyword arguments may be passed in to customize the locations
+        of the GeoIP data sets.
+
+        * path: Base directory to where GeoIP data is located or the full path
+            to where the city or country data files (*.dat) are located.
+            Assumes that both the city and country data sets are located in
+            this directory; overrides the GEOIP_PATH settings attribute.
+
+        * cache: The cache settings when opening up the GeoIP datasets,
+            and may be an integer in (0, 1, 2, 4) corresponding to
+            the GEOIP_STANDARD, GEOIP_MEMORY_CACHE, GEOIP_CHECK_CACHE,
+            and GEOIP_INDEX_CACHE `GeoIPOptions` C API settings,
+            respectively.  Defaults to 0, meaning that the data is read
+            from the disk.
+
+        * country: The name of the GeoIP country data file.  Defaults to
+            'GeoIP.dat'; overrides the GEOIP_COUNTRY settings attribute.
+
+        * city: The name of the GeoIP city data file.  Defaults to
+            'GeoLiteCity.dat'; overrides the GEOIP_CITY settings attribute.
+        """
+        # Checking the given cache option.
+        if cache in self.cache_options:
+            self._cache = self.cache_options[cache]
+        else:
+            raise GeoIPException('Invalid caching option: %s' % cache)
+
+        # Getting the GeoIP data path.
+        if not path:
+            path = GEOIP_SETTINGS.get('GEOIP_PATH', None)
+            if not path: raise GeoIPException('GeoIP path must be provided via parameter or the GEOIP_PATH setting.')
+        if not isinstance(path, basestring):
+            raise TypeError('Invalid path type: %s' % type(path).__name__)
+
+        cntry_ptr, city_ptr = (None, None)
+        if os.path.isdir(path):
+            # Getting the country and city files using the settings
+            # dictionary.  If no settings are provided, default names
+            # are assigned.
+            country = os.path.join(path, country or GEOIP_SETTINGS.get('GEOIP_COUNTRY', 'GeoIP.dat'))
+            city = os.path.join(path, city or GEOIP_SETTINGS.get('GEOIP_CITY', 'GeoLiteCity.dat'))
+        elif os.path.isfile(path):
+            # Otherwise, some detective work will be needed to figure
+            # out whether the given database path is for the GeoIP country
+            # or city databases.
+            ptr = geoip_open(path, cache)
+            info = geoip_dbinfo(ptr)
+            if lite_regex.match(info):
+                # GeoLite City database.
+                city, city_ptr = path, ptr
+            elif free_regex.match(info):
+                # GeoIP Country database.
+                country, cntry_ptr = path, ptr
+            else:
+                raise GeoIPException('Unable to recognize database edition: %s' % info)
+        else:
+            raise GeoIPException('GeoIP path must be a valid file or directory.')
+        
+        # `_init_db` does the dirty work.
+        self._init_db(country, cache, '_country', cntry_ptr)
+        self._init_db(city, cache, '_city', city_ptr)
+
+    def _init_db(self, db_file, cache, attname, ptr=None):
+        "Helper routine for setting GeoIP ctypes database properties."
+        if ptr:
+            # Pointer already retrieved.
+            pass
+        elif os.path.isfile(db_file or ''):
+            ptr = geoip_open(db_file, cache)
+        setattr(self, attname, ptr)
+        setattr(self, '%s_file' % attname, db_file)
+
+    def _check_query(self, query, country=False, city=False, city_or_country=False):
+        "Helper routine for checking the query and database availability."
+        # Making sure a string was passed in for the query.
+        if not isinstance(query, basestring):
+            raise TypeError('GeoIP query must be a string, not type %s' % type(query).__name__)
+
+        # Extra checks for the existence of country and city databases.
+        if city_or_country and self._country is None and self._city is None:
+            raise GeoIPException('Invalid GeoIP country and city data files.')
+        elif country and self._country is None:
+            raise GeoIPException('Invalid GeoIP country data file: %s' % self._country_file)
+        elif city and self._city is None:
+            raise GeoIPException('Invalid GeoIP city data file: %s' % self._city_file)
+
+    def city(self, query):
+        """
+        Returns a dictionary of city information for the given IP address or
+        Fully Qualified Domain Name (FQDN).  Some information in the dictionary
+        may be undefined (None).
+        """
+        self._check_query(query, city=True)
+        if ipregex.match(query):
+            # If an IP address was passed in
+            ptr = rec_by_addr(self._city, c_char_p(query))
+        else:
+            # If a FQDN was passed in.
+            ptr = rec_by_name(self._city, c_char_p(query))
+
+        # Checking the pointer to the C structure, if valid pull out elements
+        # into a dicionary and return.
+        if bool(ptr):
+            record = ptr.contents
+            return dict((tup[0], getattr(record, tup[0])) for tup in record._fields_)
+        else:
+            return None
+    
+    def country_code(self, query):
+        "Returns the country code for the given IP Address or FQDN."
+        self._check_query(query, city_or_country=True)
+        if self._country:
+            if ipregex.match(query): return cntry_code_by_addr(self._country, query)
+            else: return cntry_code_by_name(self._country, query)
+        else:
+            return self.city(query)['country_code']
+
+    def country_name(self, query):
+        "Returns the country name for the given IP Address or FQDN."
+        self._check_query(query, city_or_country=True)
+        if self._country:
+            if ipregex.match(query): return cntry_name_by_addr(self._country, query)
+            else: return cntry_name_by_name(self._country, query)
+        else:
+            return self.city(query)['country_name']
+
+    def country(self, query):
+        """
+        Returns a dictonary with with the country code and name when given an 
+        IP address or a Fully Qualified Domain Name (FQDN).  For example, both
+        '24.124.1.80' and 'djangoproject.com' are valid parameters.
+        """
+        # Returning the country code and name
+        return {'country_code' : self.country_code(query), 
+                'country_name' : self.country_name(query),
+                }
+
+    #### Coordinate retrieval routines ####
+    def coords(self, query, ordering=('longitude', 'latitude')):
+        cdict = self.city(query)
+        if cdict is None: return None
+        else: return tuple(cdict[o] for o in ordering)
+
+    def lon_lat(self, query):
+        "Returns a tuple of the (longitude, latitude) for the given query."
+        return self.coords(query)
+
+    def lat_lon(self, query):
+        "Returns a tuple of the (latitude, longitude) for the given query."
+        return self.coords(query, ('latitude', 'longitude'))
+
+    def geos(self, query):
+        "Returns a GEOS Point object for the given query."
+        ll = self.lon_lat(query)
+        if ll:
+            from django.contrib.gis.geos import Point
+            return Point(ll, srid=4326)
+        else:
+            return None
+
+    #### GeoIP Database Information Routines ####
+    def country_info(self):
+        "Returns information about the GeoIP country database."
+        if self._country is None:
+            ci = 'No GeoIP Country data in "%s"' % self._country_file
+        else:
+            ci = geoip_dbinfo(self._country)
+        return ci
+    country_info = property(country_info)
+
+    def city_info(self):
+        "Retuns information about the GeoIP city database."
+        if self._city is None:
+            ci = 'No GeoIP City data in "%s"' % self._city_file
+        else:
+            ci = geoip_dbinfo(self._city)
+        return ci
+    city_info = property(city_info)
+        
+    def info(self):
+        "Returns information about all GeoIP databases in use."
+        return 'Country:\n\t%s\nCity:\n\t%s' % (self.country_info, self.city_info)
+    info = property(info)
+
+    #### Methods for compatibility w/the GeoIP-Python API. ####
+    @classmethod
+    def open(cls, full_path, cache):
+        return GeoIP(full_path, cache)
+
+    def _rec_by_arg(self, arg):
+        if self._city:
+            return self.city(arg)
+        else:
+            return self.country(arg)
+    region_by_addr = city
+    region_by_name = city
+    record_by_addr = _rec_by_arg
+    record_by_name = _rec_by_arg
+    country_code_by_addr = country_code
+    country_code_by_name = country_code
+    country_name_by_addr = country_name
+    country_name_by_name = country_name
diff --git a/webapp/django/contrib/gis/utils/layermapping.py b/webapp/django/contrib/gis/utils/layermapping.py
new file mode 100644
index 0000000..40d2e97
--- /dev/null
+++ b/webapp/django/contrib/gis/utils/layermapping.py
@@ -0,0 +1,677 @@
+# LayerMapping -- A Django Model/OGR Layer Mapping Utility
+"""
+ The LayerMapping class provides a way to map the contents of OGR
+ vector files (e.g. SHP files) to Geographic-enabled Django models.
+
+ This grew out of my personal needs, specifically the code repetition
+ that went into pulling geometries and fields out of an OGR layer,
+ converting to another coordinate system (e.g. WGS84), and then inserting
+ into a GeoDjango model.
+
+ Please report any bugs encountered using this utility.
+
+ Requirements:  OGR C Library (from GDAL) required.
+
+ Usage: 
+  lm = LayerMapping(model, source_file, mapping) where,
+
+  model:
+   GeoDjango model (not an instance)
+
+  data:
+   OGR-supported data source file (e.g. a shapefile) or
+    gdal.DataSource instance
+
+  mapping:
+   A python dictionary, keys are strings corresponding
+   to the GeoDjango model field, and values correspond to
+   string field names for the OGR feature, or if the model field
+   is a geographic then it should correspond to the OGR
+   geometry type, e.g. 'POINT', 'LINESTRING', 'POLYGON'.
+
+ Keyword Args:
+  layer:
+   The index of the layer to use from the Data Source (defaults to 0)
+
+  source_srs:
+   Use this to specify the source SRS manually (for example, 
+   some shapefiles don't come with a '.prj' file).  An integer SRID,
+   a string WKT, and SpatialReference objects are valid parameters.
+
+  encoding:
+   Specifies the encoding of the string in the OGR data source.
+   For example, 'latin-1', 'utf-8', and 'cp437' are all valid
+   encoding parameters.
+
+  transaction_mode:
+   May be 'commit_on_success' (default) or 'autocommit'.
+
+  transform:
+   Setting this to False will disable all coordinate transformations.  
+
+  unique:
+   Setting this to the name, or a tuple of names, from the given
+   model will create models unique only to the given name(s).
+   Geometries will from each feature will be added into the collection
+   associated with the unique model.  Forces transaction mode to
+   be 'autocommit'.
+
+Example:
+
+ 1. You need a GDAL-supported data source, like a shapefile.
+
+  Assume we're using the test_poly SHP file:
+  >>> from django.contrib.gis.gdal import DataSource
+  >>> ds = DataSource('test_poly.shp')
+  >>> layer = ds[0]
+  >>> print layer.fields # Exploring the fields in the layer, we only want the 'str' field.
+  ['float', 'int', 'str']
+  >>> print len(layer) # getting the number of features in the layer (should be 3)
+  3
+  >>> print layer.geom_type # Should be 3 (a Polygon)
+  3
+  >>> print layer.srs # WGS84
+  GEOGCS["GCS_WGS_1984",
+      DATUM["WGS_1984",
+          SPHEROID["WGS_1984",6378137,298.257223563]],
+      PRIMEM["Greenwich",0],
+      UNIT["Degree",0.017453292519943295]]
+
+ 2. Now we define our corresponding Django model (make sure to use syncdb):
+
+  from django.contrib.gis.db import models
+  class TestGeo(models.Model, models.GeoMixin):
+      name = models.CharField(maxlength=25) # corresponds to the 'str' field
+      poly = models.PolygonField(srid=4269) # we want our model in a different SRID
+      objects = models.GeoManager()
+      def __str__(self):
+          return 'Name: %s' % self.name
+
+ 3. Use LayerMapping to extract all the features and place them in the database:
+
+  >>> from django.contrib.gis.utils import LayerMapping
+  >>> from geoapp.models import TestGeo
+  >>> mapping = {'name' : 'str', # The 'name' model field maps to the 'str' layer field.
+                 'poly' : 'POLYGON', # For geometry fields use OGC name.
+                 } # The mapping is a dictionary
+  >>> lm = LayerMapping(TestGeo, 'test_poly.shp', mapping) 
+  >>> lm.save(verbose=True) # Save the layermap, imports the data. 
+  Saved: Name: 1
+  Saved: Name: 2
+  Saved: Name: 3
+
+ LayerMapping just transformed the three geometries from the SHP file from their
+ source spatial reference system (WGS84) to the spatial reference system of
+ the GeoDjango model (NAD83).  If no spatial reference system is defined for
+ the layer, use the `source_srs` keyword with a SpatialReference object to
+ specify one.
+"""
+import sys
+from datetime import date, datetime
+from decimal import Decimal
+from django.core.exceptions import ObjectDoesNotExist
+from django.contrib.gis.db.models import GeometryField
+from django.contrib.gis.db.backend import SpatialBackend
+from django.contrib.gis.gdal import CoordTransform, DataSource, \
+    OGRException, OGRGeometry, OGRGeomType, SpatialReference
+from django.contrib.gis.gdal.field import \
+    OFTDate, OFTDateTime, OFTInteger, OFTReal, OFTString, OFTTime
+from django.contrib.gis.models import GeometryColumns, SpatialRefSys
+from django.db import models, transaction
+
+# LayerMapping exceptions.
+class LayerMapError(Exception): pass
+class InvalidString(LayerMapError): pass
+class InvalidDecimal(LayerMapError): pass
+class InvalidInteger(LayerMapError): pass
+class MissingForeignKey(LayerMapError): pass
+
+class LayerMapping(object):
+    "A class that maps OGR Layers to GeoDjango Models."
+    
+    # Acceptable 'base' types for a multi-geometry type.
+    MULTI_TYPES = {1 : OGRGeomType('MultiPoint'),
+                   2 : OGRGeomType('MultiLineString'),
+                   3 : OGRGeomType('MultiPolygon'),
+                   }
+
+    # Acceptable Django field types and corresponding acceptable OGR
+    # counterparts.
+    FIELD_TYPES = {
+        models.AutoField : OFTInteger,
+        models.IntegerField : (OFTInteger, OFTReal, OFTString),
+        models.FloatField : (OFTInteger, OFTReal),
+        models.DateField : OFTDate,
+        models.DateTimeField : OFTDateTime,
+        models.EmailField : OFTString,
+        models.TimeField : OFTTime,
+        models.DecimalField : (OFTInteger, OFTReal),
+        models.CharField : OFTString,
+        models.SlugField : OFTString,
+        models.TextField : OFTString,
+        models.URLField : OFTString,
+        models.USStateField : OFTString,
+        models.XMLField : OFTString,
+        models.SmallIntegerField : (OFTInteger, OFTReal, OFTString),
+        models.PositiveSmallIntegerField : (OFTInteger, OFTReal, OFTString),
+        }
+
+    # The acceptable transaction modes.
+    TRANSACTION_MODES = {'autocommit' : transaction.autocommit,
+                         'commit_on_success' : transaction.commit_on_success,
+                         }
+
+    def __init__(self, model, data, mapping, layer=0, 
+                 source_srs=None, encoding=None,
+                 transaction_mode='commit_on_success', 
+                 transform=True, unique=None):
+        """
+        A LayerMapping object is initialized using the given Model (not an instance),
+        a DataSource (or string path to an OGR-supported data file), and a mapping
+        dictionary.  See the module level docstring for more details and keyword
+        argument usage.
+        """
+        # Getting the DataSource and the associated Layer.
+        if isinstance(data, basestring):
+            self.ds = DataSource(data)
+        else:
+            self.ds = data
+        self.layer = self.ds[layer]
+
+        # Setting the mapping
+        self.mapping = mapping
+
+        # Setting the model, and getting the geometry column associated 
+        # with the model (an exception will be raised if there is no 
+        # geometry column).
+        self.model = model
+        self.geo_col = self.geometry_column()
+
+        # Checking the source spatial reference system, and getting
+        # the coordinate transformation object (unless the `transform`
+        # keyword is set to False)
+        if transform:
+            self.source_srs = self.check_srs(source_srs)
+            self.transform = self.coord_transform()
+        else:
+            self.transform = transform
+
+        # Checking the layer -- intitialization of the object will fail if
+        # things don't check out before hand.
+        self.check_layer()
+
+        # Setting the encoding for OFTString fields, if specified.
+        if encoding:
+            # Making sure the encoding exists, if not a LookupError
+            # exception will be thrown.
+            from codecs import lookup
+            lookup(encoding)
+            self.encoding = encoding
+        else:
+            self.encoding = None
+
+        if unique:
+            self.check_unique(unique)
+            transaction_mode = 'autocommit' # Has to be set to autocommit.
+            self.unique = unique
+        else:
+            self.unique = None
+
+        # Setting the transaction decorator with the function in the 
+        # transaction modes dictionary.
+        if transaction_mode in self.TRANSACTION_MODES:
+            self.transaction_decorator = self.TRANSACTION_MODES[transaction_mode]
+            self.transaction_mode = transaction_mode
+        else:
+            raise LayerMapError('Unrecognized transaction mode: %s' % transaction_mode)
+    
+    #### Checking routines used during initialization ####
+    def check_fid_range(self, fid_range):
+        "This checks the `fid_range` keyword."
+        if fid_range:
+            if isinstance(fid_range, (tuple, list)):
+                return slice(*fid_range)
+            elif isinstance(fid_range, slice):
+                return fid_range
+            else:
+                raise TypeError
+        else:
+            return None
+
+    def check_layer(self):
+        """
+        This checks the Layer metadata, and ensures that it is compatible
+        with the mapping information and model.  Unlike previous revisions,
+        there is no need to increment through each feature in the Layer.
+        """
+        # The geometry field of the model is set here.
+        # TODO: Support more than one geometry field / model.
+        self.geom_field = False
+        self.fields = {}
+
+        # Getting lists of the field names and the field types available in
+        # the OGR Layer.
+        ogr_fields = self.layer.fields
+        ogr_field_types = self.layer.field_types
+
+        # Function for determining if the OGR mapping field is in the Layer.
+        def check_ogr_fld(ogr_map_fld):
+            try:
+                idx = ogr_fields.index(ogr_map_fld)
+            except ValueError:
+                raise LayerMapError('Given mapping OGR field "%s" not found in OGR Layer.' % ogr_map_fld)
+            return idx
+
+        # No need to increment through each feature in the model, simply check
+        # the Layer metadata against what was given in the mapping dictionary.
+        for field_name, ogr_name in self.mapping.items():
+            # Ensuring that a corresponding field exists in the model
+            # for the given field name in the mapping.
+            try:
+                model_field = self.model._meta.get_field(field_name)
+            except models.fields.FieldDoesNotExist:
+                raise LayerMapError('Given mapping field "%s" not in given Model fields.' % field_name)
+
+            # Getting the string name for the Django field class (e.g., 'PointField').
+            fld_name = model_field.__class__.__name__
+
+            if isinstance(model_field, GeometryField):
+                if self.geom_field:
+                    raise LayerMapError('LayerMapping does not support more than one GeometryField per model.')
+
+                try:
+                    gtype = OGRGeomType(ogr_name)
+                except OGRException:
+                    raise LayerMapError('Invalid mapping for GeometryField "%s".' % field_name)
+
+                # Making sure that the OGR Layer's Geometry is compatible.
+                ltype = self.layer.geom_type
+                if not (gtype == ltype or self.make_multi(ltype, model_field)):
+                    raise LayerMapError('Invalid mapping geometry; model has %s, feature has %s.' % (fld_name, gtype))
+
+                # Setting the `geom_field` attribute w/the name of the model field
+                # that is a Geometry.
+                self.geom_field = field_name
+                fields_val = model_field
+            elif isinstance(model_field, models.ForeignKey):
+                if isinstance(ogr_name, dict):
+                    # Is every given related model mapping field in the Layer?
+                    rel_model = model_field.rel.to
+                    for rel_name, ogr_field in ogr_name.items(): 
+                        idx = check_ogr_fld(ogr_field)
+                        try:
+                            rel_field = rel_model._meta.get_field(rel_name)
+                        except models.fields.FieldDoesNotExist:
+                            raise LayerMapError('ForeignKey mapping field "%s" not in %s fields.' % 
+                                                (rel_name, rel_model.__class__.__name__))
+                    fields_val = rel_model
+                else:
+                    raise TypeError('ForeignKey mapping must be of dictionary type.')
+            else:
+                # Is the model field type supported by LayerMapping?
+                if not model_field.__class__ in self.FIELD_TYPES:
+                    raise LayerMapError('Django field type "%s" has no OGR mapping (yet).' % fld_name)
+
+                # Is the OGR field in the Layer?
+                idx = check_ogr_fld(ogr_name)
+                ogr_field = ogr_field_types[idx]
+
+                # Can the OGR field type be mapped to the Django field type?
+                if not issubclass(ogr_field, self.FIELD_TYPES[model_field.__class__]):
+                    raise LayerMapError('OGR field "%s" (of type %s) cannot be mapped to Django %s.' % 
+                                        (ogr_field, ogr_field.__name__, fld_name))
+                fields_val = model_field
+        
+            self.fields[field_name] = fields_val
+
+    def check_srs(self, source_srs):
+        "Checks the compatibility of the given spatial reference object."
+        if isinstance(source_srs, SpatialReference):
+            sr = source_srs
+        elif isinstance(source_srs, SpatialRefSys):
+            sr = source_srs.srs
+        elif isinstance(source_srs, (int, basestring)):
+            sr = SpatialReference(source_srs)
+        else:
+            # Otherwise just pulling the SpatialReference from the layer
+            sr = self.layer.srs
+        
+        if not sr:
+            raise LayerMapError('No source reference system defined.')
+        else:
+            return sr
+
+    def check_unique(self, unique):
+        "Checks the `unique` keyword parameter -- may be a sequence or string."
+        if isinstance(unique, (list, tuple)):
+            # List of fields to determine uniqueness with
+            for attr in unique: 
+                if not attr in self.mapping: raise ValueError
+        elif isinstance(unique, basestring):
+            # Only a single field passed in.
+            if unique not in self.mapping: raise ValueError
+        else:
+            raise TypeError('Unique keyword argument must be set with a tuple, list, or string.')
+
+    #### Keyword argument retrieval routines ####
+    def feature_kwargs(self, feat):
+        """
+        Given an OGR Feature, this will return a dictionary of keyword arguments
+        for constructing the mapped model.
+        """
+        # The keyword arguments for model construction.
+        kwargs = {}
+
+        # Incrementing through each model field and OGR field in the
+        # dictionary mapping.
+        for field_name, ogr_name in self.mapping.items():
+            model_field = self.fields[field_name]
+            
+            if isinstance(model_field, GeometryField):
+                # Verify OGR geometry.
+                val = self.verify_geom(feat.geom, model_field)
+            elif isinstance(model_field, models.base.ModelBase):
+                # The related _model_, not a field was passed in -- indicating
+                # another mapping for the related Model.
+                val = self.verify_fk(feat, model_field, ogr_name)
+            else:
+                # Otherwise, verify OGR Field type.
+                val = self.verify_ogr_field(feat[ogr_name], model_field)
+
+            # Setting the keyword arguments for the field name with the
+            # value obtained above.
+            kwargs[field_name] = val
+            
+        return kwargs
+
+    def unique_kwargs(self, kwargs):
+        """
+        Given the feature keyword arguments (from `feature_kwargs`) this routine
+        will construct and return the uniqueness keyword arguments -- a subset
+        of the feature kwargs.
+        """
+        if isinstance(self.unique, basestring):
+            return {self.unique : kwargs[self.unique]}
+        else:
+            return dict((fld, kwargs[fld]) for fld in self.unique)
+
+    #### Verification routines used in constructing model keyword arguments. ####
+    def verify_ogr_field(self, ogr_field, model_field):
+        """
+        Verifies if the OGR Field contents are acceptable to the Django
+        model field.  If they are, the verified value is returned, 
+        otherwise the proper exception is raised.
+        """
+        if (isinstance(ogr_field, OFTString) and 
+            isinstance(model_field, (models.CharField, models.TextField))): 
+            if self.encoding:
+                # The encoding for OGR data sources may be specified here
+                # (e.g., 'cp437' for Census Bureau boundary files).
+                val = unicode(ogr_field.value, self.encoding)
+            else:
+                val = ogr_field.value
+                if len(val) > model_field.max_length:
+                    raise InvalidString('%s model field maximum string length is %s, given %s characters.' %
+                                        (model_field.name, model_field.max_length, len(val)))
+        elif isinstance(ogr_field, OFTReal) and isinstance(model_field, models.DecimalField):
+            try:
+                # Creating an instance of the Decimal value to use.
+                d = Decimal(str(ogr_field.value))
+            except:
+                raise InvalidDecimal('Could not construct decimal from: %s' % ogr_field.value)
+
+            # Getting the decimal value as a tuple.
+            dtup = d.as_tuple()
+            digits = dtup[1]
+            d_idx = dtup[2] # index where the decimal is
+
+            # Maximum amount of precision, or digits to the left of the decimal.
+            max_prec = model_field.max_digits - model_field.decimal_places
+
+            # Getting the digits to the left of the decimal place for the 
+            # given decimal.
+            if d_idx < 0:
+                n_prec = len(digits[:d_idx])
+            else:
+                n_prec = len(digits) + d_idx
+
+            # If we have more than the maximum digits allowed, then throw an 
+            # InvalidDecimal exception.
+            if n_prec > max_prec:
+                raise InvalidDecimal('A DecimalField with max_digits %d, decimal_places %d must round to an absolute value less than 10^%d.' %
+                                     (model_field.max_digits, model_field.decimal_places, max_prec))
+            val = d
+        elif isinstance(ogr_field, (OFTReal, OFTString)) and isinstance(model_field, models.IntegerField):
+            # Attempt to convert any OFTReal and OFTString value to an OFTInteger.
+            try:
+                val = int(ogr_field.value)
+            except:
+                raise InvalidInteger('Could not construct integer from: %s' % ogr_field.value)
+        else:
+            val = ogr_field.value
+        return val
+
+    def verify_fk(self, feat, rel_model, rel_mapping):
+        """
+        Given an OGR Feature, the related model and its dictionary mapping,
+        this routine will retrieve the related model for the ForeignKey
+        mapping.
+        """
+        # TODO: It is expensive to retrieve a model for every record --
+        #  explore if an efficient mechanism exists for caching related 
+        #  ForeignKey models.
+
+        # Constructing and verifying the related model keyword arguments.
+        fk_kwargs = {}
+        for field_name, ogr_name in rel_mapping.items():
+            fk_kwargs[field_name] = self.verify_ogr_field(feat[ogr_name], rel_model._meta.get_field(field_name))
+
+        # Attempting to retrieve and return the related model.
+        try:
+            return rel_model.objects.get(**fk_kwargs)
+        except ObjectDoesNotExist:
+            raise MissingForeignKey('No ForeignKey %s model found with keyword arguments: %s' % (rel_model.__name__, fk_kwargs))
+            
+    def verify_geom(self, geom, model_field):
+        """
+        Verifies the geometry -- will construct and return a GeometryCollection
+        if necessary (for example if the model field is MultiPolygonField while
+        the mapped shapefile only contains Polygons).
+        """
+        if self.make_multi(geom.geom_type, model_field):
+            # Constructing a multi-geometry type to contain the single geometry
+            multi_type = self.MULTI_TYPES[geom.geom_type.num]
+            g = OGRGeometry(multi_type)
+            g.add(geom)
+        else:
+            g = geom
+
+        # Transforming the geometry with our Coordinate Transformation object,
+        # but only if the class variable `transform` is set w/a CoordTransform 
+        # object.
+        if self.transform: g.transform(self.transform)
+        
+        # Returning the WKT of the geometry.
+        return g.wkt
+
+    #### Other model methods ####
+    def coord_transform(self):
+        "Returns the coordinate transformation object."
+        try:
+            # Getting the target spatial reference system
+            target_srs = SpatialRefSys.objects.get(srid=self.geo_col.srid).srs
+
+            # Creating the CoordTransform object
+            return CoordTransform(self.source_srs, target_srs)
+        except Exception, msg:
+            raise LayerMapError('Could not translate between the data source and model geometry: %s' % msg)
+
+    def geometry_column(self):
+        "Returns the GeometryColumn model associated with the geographic column."
+        # Getting the GeometryColumn object.
+        try:
+            db_table = self.model._meta.db_table
+            if SpatialBackend.name == 'oracle': db_table = db_table.upper()
+            gc_kwargs = {GeometryColumns.table_name_col() : db_table}
+            return GeometryColumns.objects.get(**gc_kwargs)
+        except Exception, msg:
+            raise LayerMapError('Geometry column does not exist for model. (did you run syncdb?):\n %s' % msg)
+
+    def make_multi(self, geom_type, model_field):
+        """
+        Given the OGRGeomType for a geometry and its associated GeometryField, 
+        determine whether the geometry should be turned into a GeometryCollection.
+        """
+        return (geom_type.num in self.MULTI_TYPES and 
+                model_field.__class__.__name__ == 'Multi%s' % geom_type.django)
+
+    def save(self, verbose=False, fid_range=False, step=False, 
+             progress=False, silent=False, stream=sys.stdout, strict=False):
+        """
+        Saves the contents from the OGR DataSource Layer into the database
+        according to the mapping dictionary given at initialization. 
+        
+        Keyword Parameters:
+         verbose:
+           If set, information will be printed subsequent to each model save 
+           executed on the database.
+
+         fid_range:
+           May be set with a slice or tuple of (begin, end) feature ID's to map
+           from the data source.  In other words, this keyword enables the user
+           to selectively import a subset range of features in the geographic
+           data source.
+
+         step:
+           If set with an integer, transactions will occur at every step 
+           interval. For example, if step=1000, a commit would occur after 
+           the 1,000th feature, the 2,000th feature etc.
+
+         progress:
+           When this keyword is set, status information will be printed giving 
+           the number of features processed and sucessfully saved.  By default, 
+           progress information will pe printed every 1000 features processed, 
+           however, this default may be overridden by setting this keyword with an 
+           integer for the desired interval.
+
+         stream:
+           Status information will be written to this file handle.  Defaults to 
+           using `sys.stdout`, but any object with a `write` method is supported.
+
+         silent:
+           By default, non-fatal error notifications are printed to stdout, but 
+           this keyword may be set to disable these notifications.
+
+         strict:
+           Execution of the model mapping will cease upon the first error 
+           encountered.  The default behavior is to attempt to continue.
+        """
+        # Getting the default Feature ID range.
+        default_range = self.check_fid_range(fid_range)
+    
+        # Setting the progress interval, if requested.
+        if progress:
+            if progress is True or not isinstance(progress, int):
+                progress_interval = 1000
+            else:
+                progress_interval = progress
+
+        # Defining the 'real' save method, utilizing the transaction 
+        # decorator created during initialization.
+        @self.transaction_decorator
+        def _save(feat_range=default_range, num_feat=0, num_saved=0):
+            if feat_range:
+                layer_iter = self.layer[feat_range]
+            else:
+                layer_iter = self.layer
+
+            for feat in layer_iter:
+                num_feat += 1
+                # Getting the keyword arguments
+                try:
+                    kwargs = self.feature_kwargs(feat)
+                except LayerMapError, msg:
+                    # Something borked the validation
+                    if strict: raise
+                    elif not silent: 
+                        stream.write('Ignoring Feature ID %s because: %s\n' % (feat.fid, msg))
+                else:
+                    # Constructing the model using the keyword args
+                    is_update = False
+                    if self.unique:
+                        # If we want unique models on a particular field, handle the
+                        # geometry appropriately.
+                        try:
+                            # Getting the keyword arguments and retrieving
+                            # the unique model.
+                            u_kwargs = self.unique_kwargs(kwargs)
+                            m = self.model.objects.get(**u_kwargs)
+                            is_update = True
+                                
+                            # Getting the geometry (in OGR form), creating 
+                            # one from the kwargs WKT, adding in additional 
+                            # geometries, and update the attribute with the 
+                            # just-updated geometry WKT.
+                            geom = getattr(m, self.geom_field).ogr
+                            new = OGRGeometry(kwargs[self.geom_field])
+                            for g in new: geom.add(g) 
+                            setattr(m, self.geom_field, geom.wkt)
+                        except ObjectDoesNotExist:
+                            # No unique model exists yet, create.
+                            m = self.model(**kwargs)
+                    else:
+                        m = self.model(**kwargs)
+
+                    try:
+                        # Attempting to save.
+                        m.save()
+                        num_saved += 1
+                        if verbose: stream.write('%s: %s\n' % (is_update and 'Updated' or 'Saved', m))
+                    except SystemExit:
+                        raise
+                    except Exception, msg:
+                        if self.transaction_mode == 'autocommit':
+                            # Rolling back the transaction so that other model saves
+                            # will work.
+                            transaction.rollback_unless_managed()
+                        if strict: 
+                            # Bailing out if the `strict` keyword is set.
+                            if not silent:
+                                stream.write('Failed to save the feature (id: %s) into the model with the keyword arguments:\n' % feat.fid)
+                                stream.write('%s\n' % kwargs)
+                            raise
+                        elif not silent:
+                            stream.write('Failed to save %s:\n %s\nContinuing\n' % (kwargs, msg))
+
+                # Printing progress information, if requested.
+                if progress and num_feat % progress_interval == 0:
+                    stream.write('Processed %d features, saved %d ...\n' % (num_feat, num_saved))
+        
+            # Only used for status output purposes -- incremental saving uses the
+            # values returned here.
+            return num_saved, num_feat
+
+        nfeat = self.layer.num_feat
+        if step and isinstance(step, int) and step < nfeat:
+            # Incremental saving is requested at the given interval (step) 
+            if default_range: 
+                raise LayerMapError('The `step` keyword may not be used in conjunction with the `fid_range` keyword.')
+            beg, num_feat, num_saved = (0, 0, 0)
+            indices = range(step, nfeat, step)
+            n_i = len(indices)
+
+            for i, end in enumerate(indices):
+                # Constructing the slice to use for this step; the last slice is
+                # special (e.g, [100:] instead of [90:100]).
+                if i+1 == n_i: step_slice = slice(beg, None)
+                else: step_slice = slice(beg, end)
+            
+                try:
+                    num_feat, num_saved = _save(step_slice, num_feat, num_saved)
+                    beg = end
+                except:
+                    stream.write('%s\nFailed to save slice: %s\n' % ('=-' * 20, step_slice))
+                    raise
+        else:
+            # Otherwise, just calling the previously defined _save() function.
+            _save()
diff --git a/webapp/django/contrib/gis/utils/ogrinfo.py b/webapp/django/contrib/gis/utils/ogrinfo.py
new file mode 100644
index 0000000..f9b389c
--- /dev/null
+++ b/webapp/django/contrib/gis/utils/ogrinfo.py
@@ -0,0 +1,53 @@
+"""
+This module includes some utility functions for inspecting the layout
+of a GDAL data source -- the functionality is analogous to the output
+produced by the `ogrinfo` utility.
+"""
+
+from django.contrib.gis.gdal import DataSource
+from django.contrib.gis.gdal.geometries import GEO_CLASSES
+
+def ogrinfo(data_source, num_features=10):
+    """
+    Walks the available layers in the supplied `data_source`, displaying
+    the fields for the first `num_features` features.
+    """
+
+    # Checking the parameters.
+    if isinstance(data_source, str):
+        data_source = DataSource(data_source)
+    elif isinstance(data_source, DataSource):
+        pass
+    else:
+        raise Exception, 'Data source parameter must be a string or a DataSource object.'
+
+    for i, layer in enumerate(data_source):
+        print "data source : %s" % data_source.name
+        print "==== layer %s" % i
+        print "  shape type: %s" % GEO_CLASSES[layer.geom_type.num].__name__
+        print "  # features: %s" % len(layer)
+        print "         srs: %s" % layer.srs
+        extent_tup = layer.extent.tuple
+        print "      extent: %s - %s" % (extent_tup[0:2], extent_tup[2:4])
+        print "Displaying the first %s features ====" % num_features
+
+        width = max(*map(len,layer.fields))
+        fmt = " %%%ss: %%s" % width
+        for j, feature in enumerate(layer[:num_features]):
+            print "=== Feature %s" % j
+            for fld_name in layer.fields:
+                type_name = feature[fld_name].type_name
+                output = fmt % (fld_name, type_name)
+                val = feature.get(fld_name)
+                if val:
+                    if isinstance(val, str):
+                        val_fmt = ' ("%s")'
+                    else:
+                        val_fmt = ' (%s)'
+                    output += val_fmt % val
+                else:
+                    output += ' (None)'
+                print output
+
+# For backwards compatibility.
+sample = ogrinfo
diff --git a/webapp/django/contrib/gis/utils/ogrinspect.py b/webapp/django/contrib/gis/utils/ogrinspect.py
new file mode 100644
index 0000000..c0c3c40
--- /dev/null
+++ b/webapp/django/contrib/gis/utils/ogrinspect.py
@@ -0,0 +1,225 @@
+"""
+This module is for inspecting OGR data sources and generating either
+models for GeoDjango and/or mapping dictionaries for use with the
+`LayerMapping` utility.
+
+Author: Travis Pinney, Dane Springmeyer, & Justin Bronn
+"""
+from itertools import izip
+# Requires GDAL to use.
+from django.contrib.gis.gdal import DataSource
+from django.contrib.gis.gdal.field import OFTDate, OFTDateTime, OFTInteger, OFTReal, OFTString, OFTTime
+
+def mapping(data_source, geom_name='geom', layer_key=0, multi_geom=False):
+    """
+    Given a DataSource, generates a dictionary that may be used 
+    for invoking the LayerMapping utility.
+
+    Keyword Arguments:
+     `geom_name` => The name of the geometry field to use for the model.
+     
+     `layer_key` => The key for specifying which layer in the DataSource to use;
+       defaults to 0 (the first layer).  May be an integer index or a string
+       identifier for the layer.
+
+     `multi_geom` => Boolean (default: False) - specify as multigeometry.
+    """
+    if isinstance(data_source, basestring):
+        # Instantiating the DataSource from the string.
+        data_source = DataSource(data_source)
+    elif isinstance(data_source, DataSource):
+        pass
+    else:
+        raise TypeError('Data source parameter must be a string or a DataSource object.')
+    
+    # Creating the dictionary.
+    _mapping = {}
+
+    # Generating the field name for each field in the layer.
+    for field in data_source[layer_key].fields:
+        mfield = field.lower()
+        if mfield[-1:] == '_': mfield += 'field'
+        _mapping[mfield] = field
+    gtype = data_source[layer_key].geom_type
+    if multi_geom and gtype.num in (1, 2, 3): prefix = 'MULTI'
+    else: prefix = ''
+    _mapping[geom_name] = prefix + str(gtype).upper()
+    return _mapping
+
+def ogrinspect(*args, **kwargs):
+    """
+    Given a data source (either a string or a DataSource object) and a string
+    model name this function will generate a GeoDjango model.
+
+    Usage:
+    
+    >>> from django.contrib.gis.utils import ogrinspect
+    >>> ogrinspect('/path/to/shapefile.shp','NewModel')
+    
+    ...will print model definition to stout
+    
+    or put this in a python script and use to redirect the output to a new
+    model like:
+    
+    $ python generate_model.py > myapp/models.py
+    
+    # generate_model.py 
+    from django.contrib.gis.utils import ogrinspect
+    shp_file = 'data/mapping_hacks/world_borders.shp'
+    model_name = 'WorldBorders'
+
+    print ogrinspect(shp_file, model_name, multi_geom=True, srid=4326,
+                     geom_name='shapes', blank=True)
+                     
+    Required Arguments
+     `datasource` => string or DataSource object to file pointer
+     
+     `model name` => string of name of new model class to create
+      
+    Optional Keyword Arguments
+     `geom_name` => For specifying the model name for the Geometry Field. 
+       Otherwise will default to `geom`
+
+     `layer_key` => The key for specifying which layer in the DataSource to use;
+       defaults to 0 (the first layer).  May be an integer index or a string
+       identifier for the layer.
+
+     `srid` => The SRID to use for the Geometry Field.  If it can be determined,
+       the SRID of the datasource is used.
+      
+     `multi_geom` => Boolean (default: False) - specify as multigeometry.
+     
+     `name_field` => String - specifies a field name to return for the
+       `__unicode__` function (which will be generated if specified).
+     
+     `imports` => Boolean (default: True) - set to False to omit the 
+       `from django.contrib.gis.db import models` code from the 
+       autogenerated models thus avoiding duplicated imports when building
+       more than one model by batching ogrinspect()
+     
+     `decimal` => Boolean or sequence (default: False).  When set to True
+       all generated model fields corresponding to the `OFTReal` type will
+       be `DecimalField` instead of `FloatField`.  A sequence of specific
+       field names to generate as `DecimalField` may also be used.
+
+     `blank` => Boolean or sequence (default: False).  When set to True all
+       generated model fields will have `blank=True`.  If the user wants to 
+       give specific fields to have blank, then a list/tuple of OGR field
+       names may be used.
+
+     `null` => Boolean (default: False) - When set to True all generated
+       model fields will have `null=True`.  If the user wants to specify
+       give specific fields to have null, then a list/tuple of OGR field
+       names may be used.
+     
+    Note: This routine calls the _ogrinspect() helper to do the heavy lifting.
+    """
+    return '\n'.join(s for s in _ogrinspect(*args, **kwargs))
+
+def _ogrinspect(data_source, model_name, geom_name='geom', layer_key=0, srid=None,
+                multi_geom=False, name_field=None, imports=True, 
+                decimal=False, blank=False, null=False):
+    """
+    Helper routine for `ogrinspect` that generates GeoDjango models corresponding
+    to the given data source.  See the `ogrinspect` docstring for more details.
+    """
+    # Getting the DataSource
+    if isinstance(data_source, str):
+        data_source = DataSource(data_source)
+    elif isinstance(data_source, DataSource):
+        pass
+    else:
+        raise TypeError('Data source parameter must be a string or a DataSource object.')
+
+    # Getting the layer corresponding to the layer key and getting
+    # a string listing of all OGR fields in the Layer.
+    layer = data_source[layer_key]
+    ogr_fields = layer.fields
+
+    # Creating lists from the `null`, `blank`, and `decimal`
+    # keyword arguments.
+    def process_kwarg(kwarg):
+        if isinstance(kwarg, (list, tuple)):
+            return [s.lower() for s in kwarg] 
+        elif kwarg:
+            return [s.lower() for s in ogr_fields]
+        else:
+            return []
+    null_fields = process_kwarg(null)
+    blank_fields = process_kwarg(blank)
+    decimal_fields = process_kwarg(decimal)
+
+    # Gets the `null` and `blank` keywords for the given field name.
+    def get_kwargs_str(field_name):
+        kwlist = []
+        if field_name.lower() in null_fields: kwlist.append('null=True')
+        if field_name.lower() in blank_fields: kwlist.append('blank=True')
+        if kwlist: return ', ' + ', '.join(kwlist)
+        else: return ''
+
+    # For those wishing to disable the imports.
+    if imports:
+        yield '# This is an auto-generated Django model module created by ogrinspect.'
+        yield 'from django.contrib.gis.db import models'
+        yield ''
+
+    yield 'class %s(models.Model):' % model_name
+    
+    for field_name, width, precision, field_type in izip(ogr_fields, layer.field_widths, layer.field_precisions, layer.field_types):
+        # The model field name.
+        mfield = field_name.lower()
+        if mfield[-1:] == '_': mfield += 'field'
+        
+        # Getting the keyword args string.
+        kwargs_str = get_kwargs_str(field_name)
+
+        if field_type is OFTReal:
+            # By default OFTReals are mapped to `FloatField`, however, they
+            # may also be mapped to `DecimalField` if specified in the 
+            # `decimal` keyword.
+            if field_name.lower() in decimal_fields:
+                yield '    %s = models.DecimalField(max_digits=%d, decimal_places=%d%s)' % (mfield, width, precision, kwargs_str)
+            else:
+                yield '    %s = models.FloatField(%s)' % (mfield, kwargs_str[2:])
+        elif field_type is OFTInteger:
+            yield '    %s = models.IntegerField(%s)' % (mfield, kwargs_str[2:])
+        elif field_type is OFTString:
+            yield '    %s = models.CharField(max_length=%s%s)' % (mfield, width, kwargs_str)
+        elif field_type is OFTDate:
+            yield '    %s = models.DateField(%s)' % (mfield, kwargs_str[2:])
+        elif field_type is OFTDateTime:
+            yield '    %s = models.DateTimeField(%s)' % (mfield, kwargs_str[2:])
+        elif field_type is OFTDate:
+            yield '    %s = models.TimeField(%s)' % (mfield, kwargs_str[2:])
+        else:
+            raise TypeError('Unknown field type %s in %s' % (fld_type, mfield))
+    
+    # TODO: Autodetection of multigeometry types (see #7218).
+    gtype = layer.geom_type
+    if multi_geom and gtype.num in (1, 2, 3):
+        geom_field = 'Multi%s' % gtype.django
+    else:
+        geom_field = gtype.django
+
+    # Setting up the SRID keyword string.
+    if srid is None:
+        if layer.srs is None:
+            srid_str = 'srid=-1'
+        else:
+            srid = layer.srs.srid
+            if srid is None:
+                srid_str = 'srid=-1'
+            elif srid == 4326:
+                # WGS84 is already the default.
+                srid_str = ''
+            else:
+                srid_str = 'srid=%s' % srid
+    else:
+        srid_str = 'srid=%s' % srid
+
+    yield '    %s = models.%s(%s)' % (geom_name, geom_field, srid_str)
+    yield '    objects = models.GeoManager()'
+
+    if name_field:
+        yield ''
+        yield '    def __unicode__(self): return self.%s' % name_field
diff --git a/webapp/django/contrib/gis/utils/srs.py b/webapp/django/contrib/gis/utils/srs.py
new file mode 100644
index 0000000..4df2796
--- /dev/null
+++ b/webapp/django/contrib/gis/utils/srs.py
@@ -0,0 +1,27 @@
+def add_postgis_srs(srs):
+    """
+    This function takes a GDAL SpatialReference system and adds its
+    information to the PostGIS `spatial_ref_sys` table -- enabling
+    spatial transformations with PostGIS.  This is handy for adding
+    spatial reference systems not included by default with PostGIS.  
+    For example, the following adds the so-called "Google Maps Mercator 
+    Projection" (available in GDAL 1.5):
+    
+    >>> add_postgis_srs(SpatialReference(900913))
+
+    Note: By default, the `auth_name` is set to 'EPSG' -- this should
+    probably be changed.
+    """
+    from django.contrib.gis.models import SpatialRefSys
+    from django.contrib.gis.gdal import SpatialReference
+
+    if not isinstance(srs, SpatialReference):
+        srs = SpatialReference(srs)
+
+    if srs.srid is None:
+        raise Exception('Spatial reference requires an SRID to be compatible with PostGIS.')
+   
+    # Creating the spatial_ref_sys model.
+    sr, created = SpatialRefSys.objects.get_or_create(
+        srid=srs.srid, auth_name='EPSG', auth_srid=srs.srid, 
+        srtext=srs.wkt, proj4text=srs.proj4)
diff --git a/webapp/django/contrib/gis/utils/wkt.py b/webapp/django/contrib/gis/utils/wkt.py
new file mode 100644
index 0000000..4aecc62
--- /dev/null
+++ b/webapp/django/contrib/gis/utils/wkt.py
@@ -0,0 +1,55 @@
+"""
+ Utilities for manipulating Geometry WKT.
+"""
+
+def precision_wkt(geom, prec):
+    """
+    Returns WKT text of the geometry according to the given precision (an 
+    integer or a string).  If the precision is an integer, then the decimal
+    places of coordinates WKT will be truncated to that number:
+
+     >>> pnt = Point(5, 23)
+     >>> pnt.wkt
+     'POINT (5.0000000000000000 23.0000000000000000)'
+     >>> precision(geom, 1)
+     'POINT (5.0 23.0)'
+
+    If the precision is a string, it must be valid Python format string 
+    (e.g., '%20.7f') -- thus, you should know what you're doing.
+    """
+    if isinstance(prec, int):
+        num_fmt = '%%.%df' % prec
+    elif isinstance(prec, basestring):
+        num_fmt = prec
+    else:
+        raise TypeError
+
+    # TODO: Support 3D geometries.
+    coord_fmt = ' '.join([num_fmt, num_fmt])
+
+    def formatted_coords(coords):
+        return ','.join([coord_fmt % c[:2] for c in coords])
+
+    def formatted_poly(poly):
+        return ','.join(['(%s)' % formatted_coords(r) for r in poly])
+
+    def formatted_geom(g):
+        gtype = str(g.geom_type).upper()
+        yield '%s(' % gtype
+        if gtype == 'POINT':
+            yield formatted_coords((g.coords,))
+        elif gtype in ('LINESTRING', 'LINEARRING'):
+            yield formatted_coords(g.coords)
+        elif gtype in ('POLYGON', 'MULTILINESTRING'):
+            yield formatted_poly(g)
+        elif gtype == 'MULTIPOINT':
+            yield formatted_coords(g.coords)
+        elif gtype == 'MULTIPOLYGON':
+            yield ','.join(['(%s)' % formatted_poly(p) for p in g])
+        elif gtype == 'GEOMETRYCOLLECTION':
+            yield ','.join([''.join([wkt for wkt in formatted_geom(child)]) for child in g])
+        else:
+            raise TypeError
+        yield ')'
+
+    return ''.join([wkt for wkt in formatted_geom(geom)])
diff --git a/webapp/django/contrib/humanize/__init__.py b/webapp/django/contrib/humanize/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/humanize/__init__.py
diff --git a/webapp/django/contrib/humanize/templatetags/__init__.py b/webapp/django/contrib/humanize/templatetags/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/humanize/templatetags/__init__.py
diff --git a/webapp/django/contrib/humanize/templatetags/humanize.py b/webapp/django/contrib/humanize/templatetags/humanize.py
new file mode 100644
index 0000000..05d3223
--- /dev/null
+++ b/webapp/django/contrib/humanize/templatetags/humanize.py
@@ -0,0 +1,99 @@
+from django.utils.translation import ungettext, ugettext as _
+from django.utils.encoding import force_unicode
+from django import template
+from django.template import defaultfilters
+from datetime import date
+import re
+
+register = template.Library()
+
+def ordinal(value):
+    """
+    Converts an integer to its ordinal as a string. 1 is '1st', 2 is '2nd',
+    3 is '3rd', etc. Works for any integer.
+    """
+    try:
+        value = int(value)
+    except ValueError:
+        return value
+    t = (_('th'), _('st'), _('nd'), _('rd'), _('th'), _('th'), _('th'), _('th'), _('th'), _('th'))
+    if value % 100 in (11, 12, 13): # special case
+        return u"%d%s" % (value, t[0])
+    return u'%d%s' % (value, t[value % 10])
+ordinal.is_safe = True
+register.filter(ordinal)
+
+def intcomma(value):
+    """
+    Converts an integer to a string containing commas every three digits.
+    For example, 3000 becomes '3,000' and 45000 becomes '45,000'.
+    """
+    orig = force_unicode(value)
+    new = re.sub("^(-?\d+)(\d{3})", '\g<1>,\g<2>', orig)
+    if orig == new:
+        return new
+    else:
+        return intcomma(new)
+intcomma.is_safe = True
+register.filter(intcomma)
+
+def intword(value):
+    """
+    Converts a large integer to a friendly text representation. Works best for
+    numbers over 1 million. For example, 1000000 becomes '1.0 million', 1200000
+    becomes '1.2 million' and '1200000000' becomes '1.2 billion'.
+    """
+    value = int(value)
+    if value < 1000000:
+        return value
+    if value < 1000000000:
+        new_value = value / 1000000.0
+        return ungettext('%(value).1f million', '%(value).1f million', new_value) % {'value': new_value}
+    if value < 1000000000000:
+        new_value = value / 1000000000.0
+        return ungettext('%(value).1f billion', '%(value).1f billion', new_value) % {'value': new_value}
+    if value < 1000000000000000:
+        new_value = value / 1000000000000.0
+        return ungettext('%(value).1f trillion', '%(value).1f trillion', new_value) % {'value': new_value}
+    return value
+intword.is_safe = False
+register.filter(intword)
+
+def apnumber(value):
+    """
+    For numbers 1-9, returns the number spelled out. Otherwise, returns the
+    number. This follows Associated Press style.
+    """
+    try:
+        value = int(value)
+    except ValueError:
+        return value
+    if not 0 < value < 10:
+        return value
+    return (_('one'), _('two'), _('three'), _('four'), _('five'), _('six'), _('seven'), _('eight'), _('nine'))[value-1]
+apnumber.is_safe = True
+register.filter(apnumber)
+
+def naturalday(value, arg=None):
+    """
+    For date values that are tomorrow, today or yesterday compared to
+    present day returns representing string. Otherwise, returns a string
+    formatted according to settings.DATE_FORMAT.
+    """
+    try: 
+        value = date(value.year, value.month, value.day)
+    except AttributeError:
+        # Passed value wasn't a date object
+        return value
+    except ValueError:
+        # Date arguments out of range
+        return value
+    delta = value - date.today()
+    if delta.days == 0:
+        return _(u'today')
+    elif delta.days == 1:
+        return _(u'tomorrow')
+    elif delta.days == -1:
+        return _(u'yesterday')
+    return defaultfilters.date(value, arg)
+register.filter(naturalday)
diff --git a/webapp/django/contrib/localflavor/__init__.py b/webapp/django/contrib/localflavor/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/localflavor/__init__.py
diff --git a/webapp/django/contrib/localflavor/ar/__init__.py b/webapp/django/contrib/localflavor/ar/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/localflavor/ar/__init__.py
diff --git a/webapp/django/contrib/localflavor/ar/ar_provinces.py b/webapp/django/contrib/localflavor/ar/ar_provinces.py
new file mode 100644
index 0000000..a0efd4b
--- /dev/null
+++ b/webapp/django/contrib/localflavor/ar/ar_provinces.py
@@ -0,0 +1,36 @@
+# -*- coding: utf-8 -*-
+"""
+A list of Argentinean provinces and autonomous cities as `choices` in a
+formfield. From
+http://www.argentina.gov.ar/argentina/portal/paginas.dhtml?pagina=425
+
+This exists in this standalone file so that it's only imported into memory
+when explicitly needed.
+"""
+
+PROVINCE_CHOICES = (
+    ('B', u'Buenos Aires'),
+    ('K', u'Catamarca'),
+    ('H', u'Chaco'),
+    ('U', u'Chubut'),
+    ('C', u'Ciudad Autónoma de Buenos Aires'),
+    ('X', u'Córdoba'),
+    ('W', u'Corrientes'),
+    ('E', u'Entre Ríos'),
+    ('P', u'Formosa'),
+    ('Y', u'Jujuy'),
+    ('L', u'La Pampa'),
+    ('F', u'La Rioja'),
+    ('M', u'Mendoza'),
+    ('N', u'Misiones'),
+    ('Q', u'Neuquén'),
+    ('R', u'Río Negro'),
+    ('A', u'Salta'),
+    ('J', u'San Juan'),
+    ('D', u'San Luis'),
+    ('Z', u'Santa Cruz'),
+    ('S', u'Santa Fe'),
+    ('G', u'Santiago del Estero'),
+    ('V', u'Tierra del Fuego, Antártida e Islas del Atlántico Sur'),
+    ('T', u'Tucumán'),
+)
diff --git a/webapp/django/contrib/localflavor/ar/forms.py b/webapp/django/contrib/localflavor/ar/forms.py
new file mode 100644
index 0000000..8e8e1af
--- /dev/null
+++ b/webapp/django/contrib/localflavor/ar/forms.py
@@ -0,0 +1,114 @@
+# -*- coding: utf-8 -*-
+"""
+AR-specific Form helpers.
+"""
+
+from django.forms import ValidationError
+from django.forms.fields import RegexField, CharField, Select, EMPTY_VALUES
+from django.utils.encoding import smart_unicode
+from django.utils.translation import ugettext_lazy as _
+
+class ARProvinceSelect(Select):
+    """
+    A Select widget that uses a list of Argentinean provinces/autonomous cities
+    as its choices.
+    """
+    def __init__(self, attrs=None):
+        from ar_provinces import PROVINCE_CHOICES
+        super(ARProvinceSelect, self).__init__(attrs, choices=PROVINCE_CHOICES)
+
+class ARPostalCodeField(RegexField):
+    """
+    A field that accepts a 'classic' NNNN Postal Code or a CPA.
+
+    See http://www.correoargentino.com.ar/consulta_cpa/home.php
+    """
+    default_error_messages = {
+        'invalid': _("Enter a postal code in the format NNNN or ANNNNAAA."),
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(ARPostalCodeField, self).__init__(r'^\d{4}$|^[A-HJ-NP-Za-hj-np-z]\d{4}\D{3}$',
+            min_length=4, max_length=8, *args, **kwargs)
+
+    def clean(self, value):
+        value = super(ARPostalCodeField, self).clean(value)
+        if value in EMPTY_VALUES:
+            return u''
+        if len(value) not in (4, 8):
+            raise ValidationError(self.error_messages['invalid'])
+        if len(value) == 8:
+            return u'%s%s%s' % (value[0].upper(), value[1:5], value[5:].upper())
+        return value
+
+class ARDNIField(CharField):
+    """
+    A field that validates 'Documento Nacional de Identidad' (DNI) numbers.
+    """
+    default_error_messages = {
+        'invalid': _("This field requires only numbers."),
+        'max_digits': _("This field requires 7 or 8 digits."),
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(ARDNIField, self).__init__(max_length=10, min_length=7, *args,
+                **kwargs)
+
+    def clean(self, value):
+        """
+        Value can be a string either in the [X]X.XXX.XXX or [X]XXXXXXX formats.
+        """
+        value = super(ARDNIField, self).clean(value)
+        if value in EMPTY_VALUES:
+            return u''
+        if not value.isdigit():
+            value = value.replace('.', '')
+        if not value.isdigit():
+            raise ValidationError(self.error_messages['invalid'])
+        if len(value) not in (7, 8):
+            raise ValidationError(self.error_messages['max_digits'])
+
+        return value
+
+class ARCUITField(RegexField):
+    """
+    This field validates a CUIT (Código Único de Identificación Tributaria). A
+    CUIT is of the form XX-XXXXXXXX-V. The last digit is a check digit.
+    """
+    default_error_messages = {
+        'invalid': _('Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format.'),
+        'checksum': _("Invalid CUIT."),
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(ARCUITField, self).__init__(r'^\d{2}-?\d{8}-?\d$',
+            *args, **kwargs)
+
+    def clean(self, value):
+        """
+        Value can be either a string in the format XX-XXXXXXXX-X or an
+        11-digit number.
+        """
+        value = super(ARCUITField, self).clean(value)
+        if value in EMPTY_VALUES:
+            return u''
+        value, cd = self._canon(value)
+        if self._calc_cd(value) != cd:
+            raise ValidationError(self.error_messages['checksum'])
+        return self._format(value, cd)
+
+    def _canon(self, cuit):
+        cuit = cuit.replace('-', '')
+        return cuit[:-1], cuit[-1]
+
+    def _calc_cd(self, cuit):
+        mults = (5, 4, 3, 2, 7, 6, 5, 4, 3, 2)
+        tmp = sum([m * int(cuit[idx]) for idx, m in enumerate(mults)])
+        return str(11 - tmp % 11)
+
+    def _format(self, cuit, check_digit=None):
+        if check_digit == None:
+            check_digit = cuit[-1]
+            cuit = cuit[:-1]
+        return u'%s-%s-%s' % (cuit[:2], cuit[2:], check_digit)
+
diff --git a/webapp/django/contrib/localflavor/at/__init__.py b/webapp/django/contrib/localflavor/at/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/localflavor/at/__init__.py
diff --git a/webapp/django/contrib/localflavor/at/at_states.py b/webapp/django/contrib/localflavor/at/at_states.py
new file mode 100644
index 0000000..d4b4d8a
--- /dev/null
+++ b/webapp/django/contrib/localflavor/at/at_states.py
@@ -0,0 +1,14 @@
+# -*- coding: utf-8 -*
+from django.utils.translation import ugettext_lazy as _
+
+STATE_CHOICES = (
+    ('BL', _('Burgenland')),
+    ('KA', _('Carinthia')),
+    ('NO', _('Lower Austria')),
+    ('OO', _('Upper Austria')),
+    ('SA', _('Salzburg')),
+    ('ST', _('Styria')),
+    ('TI', _('Tyrol')),
+    ('VO', _('Vorarlberg')),
+    ('WI', _('Vienna')),
+)
\ No newline at end of file
diff --git a/webapp/django/contrib/localflavor/at/forms.py b/webapp/django/contrib/localflavor/at/forms.py
new file mode 100644
index 0000000..e428fda
--- /dev/null
+++ b/webapp/django/contrib/localflavor/at/forms.py
@@ -0,0 +1,65 @@
+"""
+AT-specific Form helpers
+"""
+
+import re
+
+from django.utils.translation import ugettext_lazy as _
+from django.forms.fields import Field, RegexField, Select
+from django.forms import ValidationError
+
+re_ssn = re.compile(r'^\d{4} \d{6}')
+
+class ATZipCodeField(RegexField):
+    """
+    A form field that validates its input is an Austrian postcode.
+
+    Accepts 4 digits.
+    """
+    default_error_messages = {
+        'invalid': _('Enter a zip code in the format XXXX.'),
+    }
+    def __init__(self, *args, **kwargs):
+        super(ATZipCodeField, self).__init__(r'^\d{4}$',
+                max_length=None, min_length=None, *args, **kwargs)
+
+class ATStateSelect(Select):
+    """
+    A Select widget that uses a list of AT states as its choices.
+    """
+    def __init__(self, attrs=None):
+        from django.contrib.localflavor.at.at_states import STATE_CHOICES
+        super(ATStateSelect, self).__init__(attrs, choices=STATE_CHOICES)
+
+class ATSocialSecurityNumberField(Field):
+    """
+    Austrian Social Security numbers are composed of a 4 digits and 6 digits
+    field. The latter represents in most cases the person's birthdate while
+    the first 4 digits represent a 3-digits counter and a one-digit checksum.
+
+    The 6-digits field can also differ from the person's birthdate if the
+    3-digits counter suffered an overflow.
+
+    This code is based on information available on
+    http://de.wikipedia.org/wiki/Sozialversicherungsnummer#.C3.96sterreich
+    """
+
+    default_error_messages = {
+        'invalid': _(u'Enter a valid Austrian Social Security Number in XXXX XXXXXX format.'),
+    }
+
+    def clean(self, value):
+        if not re_ssn.search(value):
+            raise ValidationError(self.error_messages['invalid'])
+        sqnr, date = value.split(" ")
+        sqnr, check = (sqnr[:3], (sqnr[3]))
+        if int(sqnr) < 100:
+           raise ValidationError(self.error_messages['invalid'])
+        res = int(sqnr[0])*3 + int(sqnr[1])*7 + int(sqnr[2])*9 \
+           + int(date[0])*5 + int(date[1])*8 + int(date[2])*4 \
+           + int(date[3])*2 + int(date[4])*1 + int(date[5])*6
+        res = res % 11
+        if res != int(check):
+           raise ValidationError(self.error_messages['invalid'])
+        return u'%s%s %s'%(sqnr, check, date,)
+
diff --git a/webapp/django/contrib/localflavor/au/__init__.py b/webapp/django/contrib/localflavor/au/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/localflavor/au/__init__.py
diff --git a/webapp/django/contrib/localflavor/au/au_states.py b/webapp/django/contrib/localflavor/au/au_states.py
new file mode 100644
index 0000000..578d61b
--- /dev/null
+++ b/webapp/django/contrib/localflavor/au/au_states.py
@@ -0,0 +1,17 @@
+"""
+An alphabetical list of states for use as `choices` in a formfield.
+
+This exists in this standalone file so that it's only imported into memory
+when explicitly needed.
+"""
+
+STATE_CHOICES = (
+    ('ACT', 'Australian Capital Territory'),
+    ('NSW', 'New South Wales'),
+    ('NT', 'Northern Territory'),
+    ('QLD', 'Queensland'),
+    ('SA', 'South Australia'),
+    ('TAS', 'Tasmania'),
+    ('VIC', 'Victoria'),
+    ('WA', 'Western Australia'),
+)
diff --git a/webapp/django/contrib/localflavor/au/forms.py b/webapp/django/contrib/localflavor/au/forms.py
new file mode 100644
index 0000000..afc3a0c
--- /dev/null
+++ b/webapp/django/contrib/localflavor/au/forms.py
@@ -0,0 +1,49 @@
+"""
+Australian-specific Form helpers
+"""
+
+from django.forms import ValidationError
+from django.forms.fields import Field, RegexField, Select, EMPTY_VALUES
+from django.forms.util import smart_unicode
+from django.utils.translation import ugettext_lazy as _
+import re
+
+PHONE_DIGITS_RE = re.compile(r'^(\d{10})$')
+
+class AUPostCodeField(RegexField):
+    """Australian post code field."""
+    default_error_messages = {
+        'invalid': _('Enter a 4 digit post code.'),
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(AUPostCodeField, self).__init__(r'^\d{4}$',
+            max_length=None, min_length=None, *args, **kwargs)
+
+class AUPhoneNumberField(Field):
+    """Australian phone number field."""
+    default_error_messages = {
+        'invalid': u'Phone numbers must contain 10 digits.',
+    }
+
+    def clean(self, value):
+        """
+        Validate a phone number. Strips parentheses, whitespace and hyphens.
+        """
+        super(AUPhoneNumberField, self).clean(value)
+        if value in EMPTY_VALUES:
+            return u''
+        value = re.sub('(\(|\)|\s+|-)', '', smart_unicode(value))
+        phone_match = PHONE_DIGITS_RE.search(value)
+        if phone_match:
+            return u'%s' % phone_match.group(1)
+        raise ValidationError(self.error_messages['invalid'])
+
+class AUStateSelect(Select):
+    """
+    A Select widget that uses a list of Australian states/territories as its
+    choices.
+    """
+    def __init__(self, attrs=None):
+        from au_states import STATE_CHOICES
+        super(AUStateSelect, self).__init__(attrs, choices=STATE_CHOICES)
diff --git a/webapp/django/contrib/localflavor/br/__init__.py b/webapp/django/contrib/localflavor/br/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/localflavor/br/__init__.py
diff --git a/webapp/django/contrib/localflavor/br/br_states.py b/webapp/django/contrib/localflavor/br/br_states.py
new file mode 100644
index 0000000..98e54bc
--- /dev/null
+++ b/webapp/django/contrib/localflavor/br/br_states.py
@@ -0,0 +1,37 @@
+# -*- coding: utf-8 -*-
+"""
+An alphabetical list of Brazilian states for use as `choices` in a formfield.
+
+This exists in this standalone file so that it's only imported into memory
+when explicitly needed.
+"""
+
+STATE_CHOICES = (
+    ('AC', 'Acre'),
+    ('AL', 'Alagoas'),
+    ('AP', u'Amapá'),
+    ('AM', 'Amazonas'),
+    ('BA', 'Bahia'),
+    ('CE', u'Ceará'),
+    ('DF', 'Distrito Federal'),
+    ('ES', u'Espírito Santo'),
+    ('GO', u'Goiás'),
+    ('MA', u'Maranhão'),
+    ('MT', 'Mato Grosso'),
+    ('MS', 'Mato Grosso do Sul'),
+    ('MG', 'Minas Gerais'),
+    ('PA', u'Pará'),
+    ('PB', u'Paraíba'),
+    ('PR', u'Paraná'),
+    ('PE', 'Pernambuco'),
+    ('PI', u'Piauí'),
+    ('RJ', 'Rio de Janeiro'),
+    ('RN', 'Rio Grande do Norte'),
+    ('RS', 'Rio Grande do Sul'),
+    ('RO', u'Rondônia'),
+    ('RR', 'Roraima'),
+    ('SC', 'Santa Catarina'),
+    ('SP', u'São Paulo'),
+    ('SE', 'Sergipe'),
+    ('TO', 'Tocantins'),
+)
diff --git a/webapp/django/contrib/localflavor/br/forms.py b/webapp/django/contrib/localflavor/br/forms.py
new file mode 100644
index 0000000..6d0a038
--- /dev/null
+++ b/webapp/django/contrib/localflavor/br/forms.py
@@ -0,0 +1,167 @@
+# -*- coding: utf-8 -*-
+"""
+BR-specific Form helpers
+"""
+
+from django.forms import ValidationError
+from django.forms.fields import Field, RegexField, CharField, Select, EMPTY_VALUES
+from django.utils.encoding import smart_unicode
+from django.utils.translation import ugettext_lazy as _
+import re
+
+try:
+    set
+except NameError:
+    from sets import Set as set     # For Python 2.3
+
+phone_digits_re = re.compile(r'^(\d{2})[-\.]?(\d{4})[-\.]?(\d{4})$')
+
+class BRZipCodeField(RegexField):
+    default_error_messages = {
+        'invalid': _('Enter a zip code in the format XXXXX-XXX.'),
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(BRZipCodeField, self).__init__(r'^\d{5}-\d{3}$',
+            max_length=None, min_length=None, *args, **kwargs)
+
+class BRPhoneNumberField(Field):
+    default_error_messages = {
+        'invalid': _('Phone numbers must be in XX-XXXX-XXXX format.'),
+    }
+
+    def clean(self, value):
+        super(BRPhoneNumberField, self).clean(value)
+        if value in EMPTY_VALUES:
+            return u''
+        value = re.sub('(\(|\)|\s+)', '', smart_unicode(value))
+        m = phone_digits_re.search(value)
+        if m:
+            return u'%s-%s-%s' % (m.group(1), m.group(2), m.group(3))
+        raise ValidationError(self.error_messages['invalid'])
+
+class BRStateSelect(Select):
+    """
+    A Select widget that uses a list of Brazilian states/territories
+    as its choices.
+    """
+    def __init__(self, attrs=None):
+        from br_states import STATE_CHOICES
+        super(BRStateSelect, self).__init__(attrs, choices=STATE_CHOICES)
+
+class BRStateChoiceField(Field):
+    """
+    A choice field that uses a list of Brazilian states as its choices.
+    """
+    widget = Select
+    default_error_messages = {
+        'invalid': _(u'Select a valid brazilian state. That state is not one of the available states.'),
+    }
+
+    def __init__(self, required=True, widget=None, label=None,
+                 initial=None, help_text=None):
+        super(BRStateChoiceField, self).__init__(required, widget, label,
+                                                 initial, help_text)
+        from br_states import STATE_CHOICES
+        self.widget.choices = STATE_CHOICES
+
+    def clean(self, value):
+        value = super(BRStateChoiceField, self).clean(value)
+        if value in EMPTY_VALUES:
+            value = u''
+        value = smart_unicode(value)
+        if value == u'':
+            return value
+        valid_values = set([smart_unicode(k) for k, v in self.widget.choices])
+        if value not in valid_values:
+            raise ValidationError(self.error_messages['invalid'])
+        return value
+
+def DV_maker(v):
+    if v >= 2:
+        return 11 - v
+    return 0
+
+class BRCPFField(CharField):
+    """
+    This field validate a CPF number or a CPF string. A CPF number is
+    compounded by XXX.XXX.XXX-VD. The two last digits are check digits.
+
+    More information:
+    http://en.wikipedia.org/wiki/Cadastro_de_Pessoas_F%C3%ADsicas
+    """
+    default_error_messages = {
+        'invalid': _("Invalid CPF number."),
+        'max_digits': _("This field requires at most 11 digits or 14 characters."),
+        'digits_only': _("This field requires only numbers."),
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(BRCPFField, self).__init__(max_length=14, min_length=11, *args, **kwargs)
+
+    def clean(self, value):
+        """
+        Value can be either a string in the format XXX.XXX.XXX-XX or an
+        11-digit number.
+        """
+        value = super(BRCPFField, self).clean(value)
+        if value in EMPTY_VALUES:
+            return u''
+        orig_value = value[:]
+        if not value.isdigit():
+            value = re.sub("[-\.]", "", value)
+        try:
+            int(value)
+        except ValueError:
+            raise ValidationError(self.error_messages['digits_only'])
+        if len(value) != 11:
+            raise ValidationError(self.error_messages['max_digits'])
+        orig_dv = value[-2:]
+
+        new_1dv = sum([i * int(value[idx]) for idx, i in enumerate(range(10, 1, -1))])
+        new_1dv = DV_maker(new_1dv % 11)
+        value = value[:-2] + str(new_1dv) + value[-1]
+        new_2dv = sum([i * int(value[idx]) for idx, i in enumerate(range(11, 1, -1))])
+        new_2dv = DV_maker(new_2dv % 11)
+        value = value[:-1] + str(new_2dv)
+        if value[-2:] != orig_dv:
+            raise ValidationError(self.error_messages['invalid'])
+
+        return orig_value
+
+class BRCNPJField(Field):
+    default_error_messages = {
+        'invalid': _("Invalid CNPJ number."),
+        'digits_only': _("This field requires only numbers."),
+        'max_digits': _("This field requires at least 14 digits"),
+    }
+
+    def clean(self, value):
+        """
+        Value can be either a string in the format XX.XXX.XXX/XXXX-XX or a
+        group of 14 characters.
+        """
+        value = super(BRCNPJField, self).clean(value)
+        if value in EMPTY_VALUES:
+            return u''
+        orig_value = value[:]
+        if not value.isdigit():
+            value = re.sub("[-/\.]", "", value)
+        try:
+            int(value)
+        except ValueError:
+            raise ValidationError(self.error_messages['digits_only'])
+        if len(value) != 14:
+            raise ValidationError(self.error_messages['max_digits'])
+        orig_dv = value[-2:]
+
+        new_1dv = sum([i * int(value[idx]) for idx, i in enumerate(range(5, 1, -1) + range(9, 1, -1))])
+        new_1dv = DV_maker(new_1dv % 11)
+        value = value[:-2] + str(new_1dv) + value[-1]
+        new_2dv = sum([i * int(value[idx]) for idx, i in enumerate(range(6, 1, -1) + range(9, 1, -1))])
+        new_2dv = DV_maker(new_2dv % 11)
+        value = value[:-1] + str(new_2dv)
+        if value[-2:] != orig_dv:
+            raise ValidationError(self.error_messages['invalid'])
+
+        return orig_value
diff --git a/webapp/django/contrib/localflavor/ca/__init__.py b/webapp/django/contrib/localflavor/ca/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/localflavor/ca/__init__.py
diff --git a/webapp/django/contrib/localflavor/ca/ca_provinces.py b/webapp/django/contrib/localflavor/ca/ca_provinces.py
new file mode 100644
index 0000000..746716f
--- /dev/null
+++ b/webapp/django/contrib/localflavor/ca/ca_provinces.py
@@ -0,0 +1,59 @@
+""" 
+An alphabetical list of provinces and territories for use as `choices` 
+in a formfield., and a mapping of province misspellings/abbreviations to 
+normalized abbreviations
+
+Source: http://www.canada.gc.ca/othergov/prov_e.html 
+
+This exists in this standalone file so that it's only imported into memory 
+when explicitly needed. 
+""" 
+
+PROVINCE_CHOICES = ( 
+    ('AB', 'Alberta'), 
+    ('BC', 'British Columbia'), 
+    ('MB', 'Manitoba'), 
+    ('NB', 'New Brunswick'), 
+    ('NF', 'Newfoundland and Labrador'), 
+    ('NT', 'Northwest Territories'), 
+    ('NS', 'Nova Scotia'), 
+    ('NU', 'Nunavut'), 
+    ('ON', 'Ontario'), 
+    ('PE', 'Prince Edward Island'), 
+    ('QC', 'Quebec'), 
+    ('SK', 'Saskatchewan'), 
+    ('YK', 'Yukon') 
+)
+
+PROVINCES_NORMALIZED = {
+    'ab': 'AB',
+    'alberta': 'AB',
+    'bc': 'BC',
+    'b.c.': 'BC',
+    'british columbia': 'BC',
+    'mb': 'MB',
+    'manitoba': 'MB',
+    'nb': 'NB',
+    'new brunswick': 'NB',
+    'nf': 'NF',
+    'newfoundland': 'NF',
+    'newfoundland and labrador': 'NF',
+    'nt': 'NT',
+    'northwest territories': 'NT',
+    'ns': 'NS',
+    'nova scotia': 'NS',
+    'nu': 'NU',
+    'nunavut': 'NU',
+    'on': 'ON',
+    'ontario': 'ON',
+    'pe': 'PE',
+    'pei': 'PE',
+    'p.e.i.': 'PE',
+    'prince edward island': 'PE',
+    'qc': 'QC',
+    'quebec': 'QC',
+    'sk': 'SK',
+    'saskatchewan': 'SK',
+    'yk': 'YK',
+    'yukon': 'YK',
+}
\ No newline at end of file
diff --git a/webapp/django/contrib/localflavor/ca/forms.py b/webapp/django/contrib/localflavor/ca/forms.py
new file mode 100644
index 0000000..327d938
--- /dev/null
+++ b/webapp/django/contrib/localflavor/ca/forms.py
@@ -0,0 +1,126 @@
+"""
+Canada-specific Form helpers
+"""
+
+from django.forms import ValidationError
+from django.forms.fields import Field, RegexField, Select, EMPTY_VALUES
+from django.forms.util import smart_unicode
+from django.utils.translation import ugettext_lazy as _
+import re
+
+phone_digits_re = re.compile(r'^(?:1-?)?(\d{3})[-\.]?(\d{3})[-\.]?(\d{4})$')
+sin_re = re.compile(r"^(\d{3})-(\d{3})-(\d{3})$")
+
+class CAPostalCodeField(RegexField):
+    """Canadian postal code field."""
+    default_error_messages = {
+        'invalid': _(u'Enter a postal code in the format XXX XXX.'),
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(CAPostalCodeField, self).__init__(r'^[ABCEGHJKLMNPRSTVXYZ]\d[A-Z] \d[A-Z]\d$',
+            max_length=None, min_length=None, *args, **kwargs)
+
+class CAPhoneNumberField(Field):
+    """Canadian phone number field."""
+    default_error_messages = {
+        'invalid': u'Phone numbers must be in XXX-XXX-XXXX format.',
+    }
+
+    def clean(self, value):
+        """Validate a phone number.
+        """
+        super(CAPhoneNumberField, self).clean(value)
+        if value in EMPTY_VALUES:
+            return u''
+        value = re.sub('(\(|\)|\s+)', '', smart_unicode(value))
+        m = phone_digits_re.search(value)
+        if m:
+            return u'%s-%s-%s' % (m.group(1), m.group(2), m.group(3))
+        raise ValidationError(self.error_messages['invalid'])
+
+class CAProvinceField(Field):
+    """
+    A form field that validates its input is a Canadian province name or abbreviation.
+    It normalizes the input to the standard two-leter postal service
+    abbreviation for the given province.
+    """
+    default_error_messages = {
+        'invalid': u'Enter a Canadian province or territory.',
+    }
+
+    def clean(self, value):
+        from ca_provinces import PROVINCES_NORMALIZED
+        super(CAProvinceField, self).clean(value)
+        if value in EMPTY_VALUES:
+            return u''
+        try:
+            value = value.strip().lower()
+        except AttributeError:
+            pass
+        else:
+            try:
+                return PROVINCES_NORMALIZED[value.strip().lower()].decode('ascii')
+            except KeyError:
+                pass
+        raise ValidationError(self.error_messages['invalid'])
+
+class CAProvinceSelect(Select):
+    """
+    A Select widget that uses a list of Canadian provinces and
+    territories as its choices.
+    """
+    def __init__(self, attrs=None):
+        from ca_provinces import PROVINCE_CHOICES # relative import
+        super(CAProvinceSelect, self).__init__(attrs, choices=PROVINCE_CHOICES)
+
+class CASocialInsuranceNumberField(Field):
+    """
+    A Canadian Social Insurance Number (SIN).
+
+    Checks the following rules to determine whether the number is valid:
+
+        * Conforms to the XXX-XXX-XXX format.
+        * Passes the check digit process "Luhn Algorithm"
+             See: http://en.wikipedia.org/wiki/Social_Insurance_Number
+    """
+    default_error_messages = {
+        'invalid': _('Enter a valid Canadian Social Insurance number in XXX-XXX-XXX format.'),
+    }
+
+    def clean(self, value):
+        super(CASocialInsuranceNumberField, self).clean(value)
+        if value in EMPTY_VALUES:
+            return u''
+
+        match = re.match(sin_re, value)
+        if not match:
+            raise ValidationError(self.error_messages['invalid'])
+
+        number = u'%s-%s-%s' % (match.group(1), match.group(2), match.group(3))
+        check_number = u'%s%s%s' % (match.group(1), match.group(2), match.group(3))
+        if not self.luhn_checksum_is_valid(check_number):
+            raise ValidationError(self.error_messages['invalid'])
+        return number
+
+    def luhn_checksum_is_valid(self, number):
+        """
+        Checks to make sure that the SIN passes a luhn mod-10 checksum
+        See: http://en.wikipedia.org/wiki/Luhn_algorithm
+        """
+
+        sum = 0
+        num_digits = len(number)
+        oddeven = num_digits & 1
+
+        for count in range(0, num_digits):
+            digit = int(number[count])
+
+            if not (( count & 1 ) ^ oddeven ):
+                digit = digit * 2
+            if digit > 9:
+                digit = digit - 9
+
+            sum = sum + digit
+
+        return ( (sum % 10) == 0 )
diff --git a/webapp/django/contrib/localflavor/ch/__init__.py b/webapp/django/contrib/localflavor/ch/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/localflavor/ch/__init__.py
diff --git a/webapp/django/contrib/localflavor/ch/ch_states.py b/webapp/django/contrib/localflavor/ch/ch_states.py
new file mode 100644
index 0000000..ba5934a
--- /dev/null
+++ b/webapp/django/contrib/localflavor/ch/ch_states.py
@@ -0,0 +1,31 @@
+# -*- coding: utf-8 -*
+from django.utils.translation import ugettext_lazy as _
+
+STATE_CHOICES = (
+    ('AG', _('Aargau')),
+    ('AI', _('Appenzell Innerrhoden')),
+    ('AR', _('Appenzell Ausserrhoden')),
+    ('BS', _('Basel-Stadt')),
+    ('BL', _('Basel-Land')),
+    ('BE', _('Berne')),
+    ('FR', _('Fribourg')),
+    ('GE', _('Geneva')),
+    ('GL', _('Glarus')),
+    ('GR', _('Graubuenden')),
+    ('JU', _('Jura')),
+    ('LU', _('Lucerne')),
+    ('NE', _('Neuchatel')),
+    ('NW', _('Nidwalden')),
+    ('OW', _('Obwalden')),
+    ('SH', _('Schaffhausen')),
+    ('SZ', _('Schwyz')),
+    ('SO', _('Solothurn')),
+    ('SG', _('St. Gallen')),
+    ('TG', _('Thurgau')),
+    ('TI', _('Ticino')),
+    ('UR', _('Uri')),
+    ('VS', _('Valais')),
+    ('VD', _('Vaud')),
+    ('ZG', _('Zug')),
+    ('ZH', _('Zurich'))
+)
diff --git a/webapp/django/contrib/localflavor/ch/forms.py b/webapp/django/contrib/localflavor/ch/forms.py
new file mode 100644
index 0000000..bd92fca
--- /dev/null
+++ b/webapp/django/contrib/localflavor/ch/forms.py
@@ -0,0 +1,118 @@
+"""
+Swiss-specific Form helpers
+"""
+
+from django.forms import ValidationError
+from django.forms.fields import Field, RegexField, Select, EMPTY_VALUES
+from django.utils.encoding import smart_unicode
+from django.utils.translation import ugettext_lazy as _
+import re
+
+id_re = re.compile(r"^(?P<idnumber>\w{8})(?P<pos9>(\d{1}|<))(?P<checksum>\d{1})$")
+phone_digits_re = re.compile(r'^0([1-9]{1})\d{8}$')
+
+class CHZipCodeField(RegexField):
+    default_error_messages = {
+        'invalid': _('Enter a zip code in the format XXXX.'),
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(CHZipCodeField, self).__init__(r'^\d{4}$',
+        max_length=None, min_length=None, *args, **kwargs)
+
+class CHPhoneNumberField(Field):
+    """
+    Validate local Swiss phone number (not international ones)
+    The correct format is '0XX XXX XX XX'.
+    '0XX.XXX.XX.XX' and '0XXXXXXXXX' validate but are corrected to
+    '0XX XXX XX XX'.
+    """
+    default_error_messages = {
+        'invalid': 'Phone numbers must be in 0XX XXX XX XX format.',
+    }
+
+    def clean(self, value):
+        super(CHPhoneNumberField, self).clean(value)
+        if value in EMPTY_VALUES:
+            return u''
+        value = re.sub('(\.|\s|/|-)', '', smart_unicode(value))
+        m = phone_digits_re.search(value)
+        if m:
+            return u'%s %s %s %s' % (value[0:3], value[3:6], value[6:8], value[8:10])
+        raise ValidationError(self.error_messages['invalid'])
+
+class CHStateSelect(Select):
+    """
+    A Select widget that uses a list of CH states as its choices.
+    """
+    def __init__(self, attrs=None):
+        from ch_states import STATE_CHOICES # relative import
+        super(CHStateSelect, self).__init__(attrs, choices=STATE_CHOICES)
+
+class CHIdentityCardNumberField(Field):
+    """
+    A Swiss identity card number.
+
+    Checks the following rules to determine whether the number is valid:
+
+        * Conforms to the X1234567<0 or 1234567890 format.
+        * Included checksums match calculated checksums
+
+    Algorithm is documented at http://adi.kousz.ch/artikel/IDCHE.htm
+    """
+    default_error_messages = {
+        'invalid': _('Enter a valid Swiss identity or passport card number in X1234567<0 or 1234567890 format.'),
+    }
+
+    def has_valid_checksum(self, number):
+        given_number, given_checksum = number[:-1], number[-1]
+        new_number = given_number
+        calculated_checksum = 0
+        fragment = ""
+        parameter = 7
+
+        first = str(number[:1])
+        if first.isalpha():
+            num = ord(first.upper()) - 65
+            if num < 0 or num > 8:
+                return False
+            new_number = str(num) + new_number[1:]
+            new_number = new_number[:8] + '0'
+
+        if not new_number.isdigit():
+            return False
+
+        for i in range(len(new_number)):
+          fragment = int(new_number[i])*parameter
+          calculated_checksum += fragment
+
+          if parameter == 1:
+            parameter = 7
+          elif parameter == 3:
+            parameter = 1
+          elif parameter ==7:
+            parameter = 3
+
+        return str(calculated_checksum)[-1] == given_checksum
+
+    def clean(self, value):
+        super(CHIdentityCardNumberField, self).clean(value)
+        if value in EMPTY_VALUES:
+            return u''
+
+        match = re.match(id_re, value)
+        if not match:
+            raise ValidationError(self.error_messages['invalid'])
+
+        idnumber, pos9, checksum = match.groupdict()['idnumber'], match.groupdict()['pos9'], match.groupdict()['checksum']
+
+        if idnumber == '00000000' or \
+           idnumber == 'A0000000':
+            raise ValidationError(self.error_messages['invalid'])
+
+        all_digits = "%s%s%s" % (idnumber, pos9, checksum)
+        if not self.has_valid_checksum(all_digits):
+            raise ValidationError(self.error_messages['invalid'])
+
+        return u'%s%s%s' % (idnumber, pos9, checksum)
+
diff --git a/webapp/django/contrib/localflavor/cl/__init__.py b/webapp/django/contrib/localflavor/cl/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/localflavor/cl/__init__.py
diff --git a/webapp/django/contrib/localflavor/cl/cl_regions.py b/webapp/django/contrib/localflavor/cl/cl_regions.py
new file mode 100644
index 0000000..47db6d3
--- /dev/null
+++ b/webapp/django/contrib/localflavor/cl/cl_regions.py
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+"""
+A list of Chilean regions as `choices` in a formfield.
+
+This exists in this standalone file so that it's only imported into memory
+when explicitly needed.
+"""
+
+REGION_CHOICES = (
+    ('RM',  u'Región Metropolitana de Santiago'),
+    ('I',   u'Región de Tarapacá'),
+    ('II',  u'Región de Antofagasta'),
+    ('III', u'Región de Atacama'),
+    ('IV',  u'Región de Coquimbo'),
+    ('V',   u'Región de Valparaíso'),
+    ('VI',  u'Región del Libertador Bernardo O\'Higgins'),
+    ('VII', u'Región del Maule'),
+    ('VIII',u'Región del Bío Bío'),
+    ('IX',  u'Región de la Araucanía'),
+    ('X',   u'Región de los Lagos'),
+    ('XI',  u'Región de Aysén del General Carlos Ibáñez del Campo'),
+    ('XII', u'Región de Magallanes y la Antártica Chilena'),
+    ('XIV', u'Región de Los Ríos'),
+    ('XV',  u'Región de Arica-Parinacota'),
+)
diff --git a/webapp/django/contrib/localflavor/cl/forms.py b/webapp/django/contrib/localflavor/cl/forms.py
new file mode 100644
index 0000000..61b3ab7
--- /dev/null
+++ b/webapp/django/contrib/localflavor/cl/forms.py
@@ -0,0 +1,94 @@
+"""
+Chile specific form helpers.
+"""
+
+from django.forms import ValidationError
+from django.forms.fields import RegexField, Select, EMPTY_VALUES
+from django.utils.translation import ugettext_lazy as _
+from django.utils.encoding import smart_unicode
+
+
+class CLRegionSelect(Select):
+    """
+    A Select widget that uses a list of Chilean Regions (Regiones)
+    as its choices.
+    """
+    def __init__(self, attrs=None):
+        from cl_regions import REGION_CHOICES
+        super(CLRegionSelect, self).__init__(attrs, choices=REGION_CHOICES)
+
+class CLRutField(RegexField):
+    """
+    Chilean "Rol Unico Tributario" (RUT) field. This is the Chilean national
+    identification number.
+
+    Samples for testing are available from
+    https://palena.sii.cl/cvc/dte/ee_empresas_emisoras.html
+    """
+    default_error_messages = {
+        'invalid': _('Enter a valid Chilean RUT.'),
+        'strict': _('Enter a valid Chilean RUT. The format is XX.XXX.XXX-X.'),
+        'checksum': _('The Chilean RUT is not valid.'),
+    }
+
+    def __init__(self, *args, **kwargs):
+        if 'strict' in kwargs:
+            del kwargs['strict']
+            super(CLRutField, self).__init__(r'^(\d{1,2}\.)?\d{3}\.\d{3}-[\dkK]$',
+                error_message=self.default_error_messages['strict'], *args, **kwargs)
+        else:
+            # In non-strict mode, accept RUTs that validate but do not exist in
+            # the real world.
+            super(CLRutField, self).__init__(r'^[\d\.]{1,11}-?[\dkK]$', *args, **kwargs)
+
+    def clean(self, value):
+        """
+        Check and clean the Chilean RUT.
+        """
+        super(CLRutField, self).clean(value)
+        if value in EMPTY_VALUES:
+            return u''
+        rut, verificador = self._canonify(value)
+        if self._algorithm(rut) == verificador:
+            return self._format(rut, verificador)
+        else:
+            raise ValidationError(self.error_messages['checksum'])
+
+    def _algorithm(self, rut):
+        """
+        Takes RUT in pure canonical form, calculates the verifier digit.
+        """
+        suma  = 0
+        multi = 2
+        for r in rut[::-1]:
+            suma  += int(r) * multi
+            multi += 1
+            if multi == 8:
+                multi = 2
+        return u'0123456789K0'[11 - suma % 11]
+
+    def _canonify(self, rut):
+        """
+        Turns the RUT into one normalized format. Returns a (rut, verifier)
+        tuple.
+        """
+        rut = smart_unicode(rut).replace(' ', '').replace('.', '').replace('-', '')
+        return rut[:-1], rut[-1]
+
+    def _format(self, code, verifier=None):
+        """
+        Formats the RUT from canonical form to the common string representation.
+        If verifier=None, then the last digit in 'code' is the verifier.
+        """
+        if verifier is None:
+            verifier = code[-1]
+            code = code[:-1]
+        while len(code) > 3 and '.' not in code[:3]:
+            pos = code.find('.')
+            if pos == -1:
+                new_dot = -3
+            else:
+                new_dot = pos - 3
+            code = code[:new_dot] + '.' + code[new_dot:]
+        return u'%s-%s' % (code, verifier)
+
diff --git a/webapp/django/contrib/localflavor/de/__init__.py b/webapp/django/contrib/localflavor/de/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/localflavor/de/__init__.py
diff --git a/webapp/django/contrib/localflavor/de/de_states.py b/webapp/django/contrib/localflavor/de/de_states.py
new file mode 100644
index 0000000..2872a78
--- /dev/null
+++ b/webapp/django/contrib/localflavor/de/de_states.py
@@ -0,0 +1,21 @@
+# -*- coding: utf-8 -*
+from django.utils.translation import ugettext_lazy as _
+
+STATE_CHOICES = (
+    ('BW', _('Baden-Wuerttemberg')),
+    ('BY', _('Bavaria')),
+    ('BE', _('Berlin')),
+    ('BB', _('Brandenburg')),
+    ('HB', _('Bremen')),
+    ('HH', _('Hamburg')),
+    ('HE', _('Hessen')),
+    ('MV', _('Mecklenburg-Western Pomerania')),
+    ('NI', _('Lower Saxony')),
+    ('NW', _('North Rhine-Westphalia')),
+    ('RP', _('Rhineland-Palatinate')),
+    ('SL', _('Saarland')),
+    ('SN', _('Saxony')),
+    ('ST', _('Saxony-Anhalt')),
+    ('SH', _('Schleswig-Holstein')),
+    ('TH', _('Thuringia')),
+)
diff --git a/webapp/django/contrib/localflavor/de/forms.py b/webapp/django/contrib/localflavor/de/forms.py
new file mode 100644
index 0000000..7a1b7c0
--- /dev/null
+++ b/webapp/django/contrib/localflavor/de/forms.py
@@ -0,0 +1,83 @@
+"""
+DE-specific Form helpers
+"""
+
+from django.forms import ValidationError
+from django.forms.fields import Field, RegexField, Select, EMPTY_VALUES
+from django.utils.translation import ugettext_lazy as _
+import re
+
+id_re = re.compile(r"^(?P<residence>\d{10})(?P<origin>\w{1,3})[-\ ]?(?P<birthday>\d{7})[-\ ]?(?P<validity>\d{7})[-\ ]?(?P<checksum>\d{1})$")
+
+class DEZipCodeField(RegexField):
+    default_error_messages = {
+        'invalid': _('Enter a zip code in the format XXXXX.'),
+    }
+    def __init__(self, *args, **kwargs):
+        super(DEZipCodeField, self).__init__(r'^\d{5}$',
+            max_length=None, min_length=None, *args, **kwargs)
+
+class DEStateSelect(Select):
+    """
+    A Select widget that uses a list of DE states as its choices.
+    """
+    def __init__(self, attrs=None):
+        from de_states import STATE_CHOICES
+        super(DEStateSelect, self).__init__(attrs, choices=STATE_CHOICES)
+
+class DEIdentityCardNumberField(Field):
+    """
+    A German identity card number.
+
+    Checks the following rules to determine whether the number is valid:
+
+        * Conforms to the XXXXXXXXXXX-XXXXXXX-XXXXXXX-X format.
+        * No group consists entirely of zeroes.
+        * Included checksums match calculated checksums
+
+    Algorithm is documented at http://de.wikipedia.org/wiki/Personalausweis
+    """
+    default_error_messages = {
+        'invalid': _('Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X format.'),
+    }
+
+    def has_valid_checksum(self, number):
+        given_number, given_checksum = number[:-1], number[-1]
+        calculated_checksum = 0
+        fragment = ""
+        parameter = 7
+
+        for i in range(len(given_number)):
+            fragment = str(int(given_number[i]) * parameter)
+            if fragment.isalnum():
+                calculated_checksum += int(fragment[-1])
+            if parameter == 1:
+                parameter = 7
+            elif parameter == 3:
+                parameter = 1
+            elif parameter ==7:
+                parameter = 3
+
+        return str(calculated_checksum)[-1] == given_checksum
+
+    def clean(self, value):
+        super(DEIdentityCardNumberField, self).clean(value)
+        if value in EMPTY_VALUES:
+            return u''
+        match = re.match(id_re, value)
+        if not match:
+            raise ValidationError(self.error_messages['invalid'])
+
+        gd = match.groupdict()
+        residence, origin = gd['residence'], gd['origin']
+        birthday, validity, checksum = gd['birthday'], gd['validity'], gd['checksum']
+
+        if residence == '0000000000' or birthday == '0000000' or validity == '0000000':
+            raise ValidationError(self.error_messages['invalid'])
+
+        all_digits = u"%s%s%s%s" % (residence, birthday, validity, checksum)
+        if not self.has_valid_checksum(residence) or not self.has_valid_checksum(birthday) or \
+            not self.has_valid_checksum(validity) or not self.has_valid_checksum(all_digits):
+                raise ValidationError(self.error_messages['invalid'])
+
+        return u'%s%s-%s-%s-%s' % (residence, origin, birthday, validity, checksum)
diff --git a/webapp/django/contrib/localflavor/es/__init__.py b/webapp/django/contrib/localflavor/es/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/localflavor/es/__init__.py
diff --git a/webapp/django/contrib/localflavor/es/es_provinces.py b/webapp/django/contrib/localflavor/es/es_provinces.py
new file mode 100644
index 0000000..9f5e126
--- /dev/null
+++ b/webapp/django/contrib/localflavor/es/es_provinces.py
@@ -0,0 +1,58 @@
+# -*- coding: utf-8 -*-
+from django.utils.translation import ugettext_lazy as _
+
+PROVINCE_CHOICES = (
+    ('01', _('Arava')),
+    ('02', _('Albacete')),
+    ('03', _('Alacant')),
+    ('04', _('Almeria')),
+    ('05', _('Avila')),
+    ('06', _('Badajoz')),
+    ('07', _('Illes Balears')),
+    ('08', _('Barcelona')),
+    ('09', _('Burgos')),
+    ('10', _('Caceres')),
+    ('11', _('Cadiz')),
+    ('12', _('Castello')),
+    ('13', _('Ciudad Real')),
+    ('14', _('Cordoba')),
+    ('15', _('A Coruna')),
+    ('16', _('Cuenca')),
+    ('17', _('Girona')),
+    ('18', _('Granada')),
+    ('19', _('Guadalajara')),
+    ('20', _('Guipuzkoa')),
+    ('21', _('Huelva')),
+    ('22', _('Huesca')),
+    ('23', _('Jaen')),
+    ('24', _('Leon')),
+    ('25', _('Lleida')),
+    ('26', _('La Rioja')),
+    ('27', _('Lugo')),
+    ('28', _('Madrid')),
+    ('29', _('Malaga')),
+    ('30', _('Murcia')),
+    ('31', _('Navarre')),
+    ('32', _('Ourense')),
+    ('33', _('Asturias')),
+    ('34', _('Palencia')),
+    ('35', _('Las Palmas')),
+    ('36', _('Pontevedra')),
+    ('37', _('Salamanca')),
+    ('38', _('Santa Cruz de Tenerife')),
+    ('39', _('Cantabria')),
+    ('40', _('Segovia')),
+    ('41', _('Seville')),
+    ('42', _('Soria')),
+    ('43', _('Tarragona')),
+    ('44', _('Teruel')),
+    ('45', _('Toledo')),
+    ('46', _('Valencia')),
+    ('47', _('Valladolid')),
+    ('48', _('Bizkaia')),
+    ('49', _('Zamora')),
+    ('50', _('Zaragoza')),
+    ('51', _('Ceuta')),
+    ('52', _('Melilla')),
+)
+
diff --git a/webapp/django/contrib/localflavor/es/es_regions.py b/webapp/django/contrib/localflavor/es/es_regions.py
new file mode 100644
index 0000000..3c1ea0e
--- /dev/null
+++ b/webapp/django/contrib/localflavor/es/es_regions.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+from django.utils.translation import ugettext_lazy as _
+
+REGION_CHOICES = (
+    ('AN', _('Andalusia')),
+    ('AR', _('Aragon')),
+    ('O', _('Principality of Asturias')),
+    ('IB', _('Balearic Islands')),
+    ('PV', _('Basque Country')),
+    ('CN', _('Canary Islands')),
+    ('S', _('Cantabria')),
+    ('CM', _('Castile-La Mancha')),
+    ('CL', _('Castile and Leon')),
+    ('CT', _('Catalonia')),
+    ('EX', _('Extremadura')),
+    ('GA', _('Galicia')),
+    ('LO', _('La Rioja')),
+    ('M', _('Madrid')),
+    ('MU', _('Region of Murcia')),
+    ('NA', _('Foral Community of Navarre')),
+    ('VC', _('Valencian Community')),
+)
+
diff --git a/webapp/django/contrib/localflavor/es/forms.py b/webapp/django/contrib/localflavor/es/forms.py
new file mode 100644
index 0000000..145bf90
--- /dev/null
+++ b/webapp/django/contrib/localflavor/es/forms.py
@@ -0,0 +1,184 @@
+# -*- coding: utf-8 -*-
+"""
+Spanish-specific Form helpers
+"""
+
+from django.forms import ValidationError
+from django.forms.fields import RegexField, Select, EMPTY_VALUES
+from django.utils.translation import ugettext_lazy as _
+import re
+
+class ESPostalCodeField(RegexField):
+    """
+    A form field that validates its input as a spanish postal code.
+
+    Spanish postal code is a five digits string, with two first digits
+    between 01 and 52, assigned to provinces code.
+    """
+    default_error_messages = {
+        'invalid': _('Enter a valid postal code in the range and format 01XXX - 52XXX.'),
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(ESPostalCodeField, self).__init__(
+                r'^(0[1-9]|[1-4][0-9]|5[0-2])\d{3}$',
+                max_length=None, min_length=None, *args, **kwargs)
+
+class ESPhoneNumberField(RegexField):
+    """
+    A form field that validates its input as a Spanish phone number.
+    Information numbers are ommited.
+
+    Spanish phone numbers are nine digit numbers, where first digit is 6 (for
+    cell phones), 8 (for special phones), or 9 (for landlines and special
+    phones)
+
+    TODO: accept and strip characters like dot, hyphen... in phone number
+    """
+    default_error_messages = {
+        'invalid': _('Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or 9XXXXXXXX.'),
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(ESPhoneNumberField, self).__init__(r'^(6|8|9)\d{8}$',
+                max_length=None, min_length=None, *args, **kwargs)
+
+class ESIdentityCardNumberField(RegexField):
+    """
+    Spanish NIF/NIE/CIF (Fiscal Identification Number) code.
+
+    Validates three diferent formats:
+
+        NIF (individuals): 12345678A
+        CIF (companies): A12345678
+        NIE (foreigners): X12345678A
+
+    according to a couple of simple checksum algorithms.
+
+    Value can include a space or hyphen separator between number and letters.
+    Number length is not checked for NIF (or NIE), old values start with a 1,
+    and future values can contain digits greater than 8. The CIF control digit
+    can be a number or a letter depending on company type. Algorithm is not
+    public, and different authors have different opinions on which ones allows
+    letters, so both validations are assumed true for all types.
+    """
+    default_error_messages = {
+        'invalid': _('Please enter a valid NIF, NIE, or CIF.'),
+        'invalid_only_nif': _('Please enter a valid NIF or NIE.'),
+        'invalid_nif': _('Invalid checksum for NIF.'),
+        'invalid_nie': _('Invalid checksum for NIE.'),
+        'invalid_cif': _('Invalid checksum for CIF.'),
+    }
+
+    def __init__(self, only_nif=False, *args, **kwargs):
+        self.only_nif = only_nif
+        self.nif_control = 'TRWAGMYFPDXBNJZSQVHLCKE'
+        self.cif_control = 'JABCDEFGHI'
+        self.cif_types = 'ABCDEFGHKLMNPQS'
+        self.nie_types = 'XT'
+        super(ESIdentityCardNumberField, self).__init__(r'^([%s]?)[ -]?(\d+)[ -]?([%s]?)$' % (self.cif_types + self.nie_types + self.cif_types.lower() + self.nie_types.lower(), self.nif_control + self.nif_control.lower()),
+                max_length=None, min_length=None,
+                error_message=self.default_error_messages['invalid%s' % (self.only_nif and '_only_nif' or '')],
+                *args, **kwargs)
+
+    def clean(self, value):
+        super(ESIdentityCardNumberField, self).clean(value)
+        if value in EMPTY_VALUES:
+            return u''
+        nif_get_checksum = lambda d: self.nif_control[int(d)%23]
+
+        value = value.upper().replace(' ', '').replace('-', '')
+        m = re.match(r'^([%s]?)[ -]?(\d+)[ -]?([%s]?)$' % (self.cif_types + self.nie_types, self.nif_control), value)
+        letter1, number, letter2 = m.groups()
+
+        if not letter1 and letter2:
+            # NIF
+            if letter2 == nif_get_checksum(number):
+                return value
+            else:
+                raise ValidationError, self.error_messages['invalid_nif']
+        elif letter1 in self.nie_types and letter2:
+            # NIE
+            if letter2 == nif_get_checksum(number):
+                return value
+            else:
+                raise ValidationError, self.error_messages['invalid_nie']
+        elif not self.only_nif and letter1 in self.cif_types and len(number) in [7, 8]:
+            # CIF
+            if not letter2:
+                number, letter2 = number[:-1], int(number[-1])
+            checksum = cif_get_checksum(number)
+            if letter2 in (checksum, self.cif_control[checksum]):
+                return value
+            else:
+                raise ValidationError, self.error_messages['invalid_cif']
+        else:
+            raise ValidationError, self.error_messages['invalid']
+
+class ESCCCField(RegexField):
+    """
+    A form field that validates its input as a Spanish bank account or CCC
+    (Codigo Cuenta Cliente).
+
+        Spanish CCC is in format EEEE-OOOO-CC-AAAAAAAAAA where:
+
+            E = entity
+            O = office
+            C = checksum
+            A = account
+
+        It's also valid to use a space as delimiter, or to use no delimiter.
+
+        First checksum digit validates entity and office, and last one
+        validates account. Validation is done multiplying every digit of 10
+        digit value (with leading 0 if necessary) by number in its position in
+        string 1, 2, 4, 8, 5, 10, 9, 7, 3, 6. Sum resulting numbers and extract
+        it from 11.  Result is checksum except when 10 then is 1, or when 11
+        then is 0.
+
+        TODO: allow IBAN validation too
+    """
+    default_error_messages = {
+        'invalid': _('Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX.'),
+        'checksum': _('Invalid checksum for bank account number.'),
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(ESCCCField, self).__init__(r'^\d{4}[ -]?\d{4}[ -]?\d{2}[ -]?\d{10}$',
+            max_length=None, min_length=None, *args, **kwargs)
+
+    def clean(self, value):
+        super(ESCCCField, self).clean(value)
+        if value in EMPTY_VALUES:
+            return u''
+        control_str = [1, 2, 4, 8, 5, 10, 9, 7, 3, 6]
+        m = re.match(r'^(\d{4})[ -]?(\d{4})[ -]?(\d{2})[ -]?(\d{10})$', value)
+        entity, office, checksum, account = m.groups()
+        get_checksum = lambda d: str(11 - sum([int(digit) * int(control) for digit, control in zip(d, control_str)]) % 11).replace('10', '1').replace('11', '0')
+        if get_checksum('00' + entity + office) + get_checksum(account) == checksum:
+            return value
+        else:
+            raise ValidationError, self.error_messages['checksum']
+
+class ESRegionSelect(Select):
+    """
+    A Select widget that uses a list of spanish regions as its choices.
+    """
+    def __init__(self, attrs=None):
+        from es_regions import REGION_CHOICES
+        super(ESRegionSelect, self).__init__(attrs, choices=REGION_CHOICES)
+
+class ESProvinceSelect(Select):
+    """
+    A Select widget that uses a list of spanish provinces as its choices.
+    """
+    def __init__(self, attrs=None):
+        from es_provinces import PROVINCE_CHOICES
+        super(ESProvinceSelect, self).__init__(attrs, choices=PROVINCE_CHOICES)
+
+
+def cif_get_checksum(number):
+    s1 = sum([int(digit) for pos, digit in enumerate(number) if int(pos) % 2])
+    s2 = sum([sum([int(unit) for unit in str(int(digit) * 2)]) for pos, digit in enumerate(number) if not int(pos) % 2])
+    return (10 - ((s1 + s2) % 10)) % 10
+
diff --git a/webapp/django/contrib/localflavor/fi/__init__.py b/webapp/django/contrib/localflavor/fi/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/localflavor/fi/__init__.py
diff --git a/webapp/django/contrib/localflavor/fi/fi_municipalities.py b/webapp/django/contrib/localflavor/fi/fi_municipalities.py
new file mode 100644
index 0000000..965a52d
--- /dev/null
+++ b/webapp/django/contrib/localflavor/fi/fi_municipalities.py
@@ -0,0 +1,427 @@
+# -*- coding: utf-8 -*-
+"""
+An alphabetical list of Finnish municipalities for use as `choices` in a
+formfield.
+
+This exists in this standalone file so that it's only imported into memory
+when explicitly needed.
+"""
+
+MUNICIPALITY_CHOICES = (
+    ('akaa', u"Akaa"),
+    ('alaharma', u"Alahärmä"),
+    ('alajarvi', u"Alajärvi"),
+    ('alastaro', u"Alastaro"),
+    ('alavieska', u"Alavieska"),
+    ('alavus', u"Alavus"),
+    ('anjalankoski', u"Anjalankoski"),
+    ('artjarvi', u"Artjärvi"),
+    ('asikkala', u"Asikkala"),
+    ('askainen', u"Askainen"),
+    ('askola', u"Askola"),
+    ('aura', u"Aura"),
+    ('brando', u"Brändö"),
+    ('dragsfjard', u"Dragsfjärd"),
+    ('eckero', u"Eckerö"),
+    ('elimaki', u"Elimäki"),
+    ('eno', u"Eno"),
+    ('enonkoski', u"Enonkoski"),
+    ('enontekio', u"Enontekiö"),
+    ('espoo', u"Espoo"),
+    ('eura', u"Eura"),
+    ('eurajoki', u"Eurajoki"),
+    ('evijarvi', u"Evijärvi"),
+    ('finstrom', u"Finström"),
+    ('forssa', u"Forssa"),
+    ('foglo', u"Föglö"),
+    ('geta', u"Geta"),
+    ('haapajarvi', u"Haapajärvi"),
+    ('haapavesi', u"Haapavesi"),
+    ('hailuoto', u"Hailuoto"),
+    ('halikko', u"Halikko"),
+    ('halsua', u"Halsua"),
+    ('hamina', u"Hamina"),
+    ('hammarland', u"Hammarland"),
+    ('hankasalmi', u"Hankasalmi"),
+    ('hanko', u"Hanko"),
+    ('harjavalta', u"Harjavalta"),
+    ('hartola', u"Hartola"),
+    ('hattula', u"Hattula"),
+    ('hauho', u"Hauho"),
+    ('haukipudas', u"Haukipudas"),
+    ('hausjarvi', u"Hausjärvi"),
+    ('heinola', u"Heinola"),
+    ('heinavesi', u"Heinävesi"),
+    ('helsinki', u"Helsinki"),
+    ('himanka', u"Himanka"),
+    ('hirvensalmi', u"Hirvensalmi"),
+    ('hollola', u"Hollola"),
+    ('honkajoki', u"Honkajoki"),
+    ('houtskari', u"Houtskari"),
+    ('huittinen', u"Huittinen"),
+    ('humppila', u"Humppila"),
+    ('hyrynsalmi', u"Hyrynsalmi"),
+    ('hyvinkaa', u"Hyvinkää"),
+    ('hameenkoski', u"Hämeenkoski"),
+    ('hameenkyro', u"Hämeenkyrö"),
+    ('hameenlinna', u"Hämeenlinna"),
+    ('ii', u"Ii"),
+    ('iisalmi', u"Iisalmi"),
+    ('iitti', u"Iitti"),
+    ('ikaalinen', u"Ikaalinen"),
+    ('ilmajoki', u"Ilmajoki"),
+    ('ilomantsi', u"Ilomantsi"),
+    ('imatra', u"Imatra"),
+    ('inari', u"Inari"),
+    ('inio', u"Iniö"),
+    ('inkoo', u"Inkoo"),
+    ('isojoki', u"Isojoki"),
+    ('isokyro', u"Isokyrö"),
+    ('jaala', u"Jaala"),
+    ('jalasjarvi', u"Jalasjärvi"),
+    ('janakkala', u"Janakkala"),
+    ('joensuu', u"Joensuu"),
+    ('jokioinen', u"Jokioinen"),
+    ('jomala', u"Jomala"),
+    ('joroinen', u"Joroinen"),
+    ('joutsa', u"Joutsa"),
+    ('joutseno', u"Joutseno"),
+    ('juankoski', u"Juankoski"),
+    ('jurva', u"Jurva"),
+    ('juuka', u"Juuka"),
+    ('juupajoki', u"Juupajoki"),
+    ('juva', u"Juva"),
+    ('jyvaskyla', u"Jyväskylä"),
+    ('jyvaskylan_mlk', u"Jyväskylän maalaiskunta"),
+    ('jamijarvi', u"Jämijärvi"),
+    ('jamsa', u"Jämsä"),
+    ('jamsankoski', u"Jämsänkoski"),
+    ('jarvenpaa', u"Järvenpää"),
+    ('kaarina', u"Kaarina"),
+    ('kaavi', u"Kaavi"),
+    ('kajaani', u"Kajaani"),
+    ('kalajoki', u"Kalajoki"),
+    ('kalvola', u"Kalvola"),
+    ('kangasala', u"Kangasala"),
+    ('kangasniemi', u"Kangasniemi"),
+    ('kankaanpaa', u"Kankaanpää"),
+    ('kannonkoski', u"Kannonkoski"),
+    ('kannus', u"Kannus"),
+    ('karijoki', u"Karijoki"),
+    ('karjaa', u"Karjaa"),
+    ('karjalohja', u"Karjalohja"),
+    ('karkkila', u"Karkkila"),
+    ('karstula', u"Karstula"),
+    ('karttula', u"Karttula"),
+    ('karvia', u"Karvia"),
+    ('kaskinen', u"Kaskinen"),
+    ('kauhajoki', u"Kauhajoki"),
+    ('kauhava', u"Kauhava"),
+    ('kauniainen', u"Kauniainen"),
+    ('kaustinen', u"Kaustinen"),
+    ('keitele', u"Keitele"),
+    ('kemi', u"Kemi"),
+    ('kemijarvi', u"Kemijärvi"),
+    ('keminmaa', u"Keminmaa"),
+    ('kemio', u"Kemiö"),
+    ('kempele', u"Kempele"),
+    ('kerava', u"Kerava"),
+    ('kerimaki', u"Kerimäki"),
+    ('kestila', u"Kestilä"),
+    ('kesalahti', u"Kesälahti"),
+    ('keuruu', u"Keuruu"),
+    ('kihnio', u"Kihniö"),
+    ('kiikala', u"Kiikala"),
+    ('kiikoinen', u"Kiikoinen"),
+    ('kiiminki', u"Kiiminki"),
+    ('kinnula', u"Kinnula"),
+    ('kirkkonummi', u"Kirkkonummi"),
+    ('kisko', u"Kisko"),
+    ('kitee', u"Kitee"),
+    ('kittila', u"Kittilä"),
+    ('kiukainen', u"Kiukainen"),
+    ('kiuruvesi', u"Kiuruvesi"),
+    ('kivijarvi', u"Kivijärvi"),
+    ('kokemaki', u"Kokemäki"),
+    ('kokkola', u"Kokkola"),
+    ('kolari', u"Kolari"),
+    ('konnevesi', u"Konnevesi"),
+    ('kontiolahti', u"Kontiolahti"),
+    ('korpilahti', u"Korpilahti"),
+    ('korppoo', u"Korppoo"),
+    ('korsnas', u"Korsnäs"),
+    ('kortesjarvi', u"Kortesjärvi"),
+    ('koskitl', u"KoskiTl"),
+    ('kotka', u"Kotka"),
+    ('kouvola', u"Kouvola"),
+    ('kristiinankaupunki', u"Kristiinankaupunki"),
+    ('kruunupyy', u"Kruunupyy"),
+    ('kuhmalahti', u"Kuhmalahti"),
+    ('kuhmo', u"Kuhmo"),
+    ('kuhmoinen', u"Kuhmoinen"),
+    ('kumlinge', u"Kumlinge"),
+    ('kuopio', u"Kuopio"),
+    ('kuortane', u"Kuortane"),
+    ('kurikka', u"Kurikka"),
+    ('kuru', u"Kuru"),
+    ('kustavi', u"Kustavi"),
+    ('kuusamo', u"Kuusamo"),
+    ('kuusankoski', u"Kuusankoski"),
+    ('kuusjoki', u"Kuusjoki"),
+    ('kylmakoski', u"Kylmäkoski"),
+    ('kyyjarvi', u"Kyyjärvi"),
+    ('kalvia', u"Kälviä"),
+    ('karkola', u"Kärkölä"),
+    ('karsamaki', u"Kärsämäki"),
+    ('kokar', u"Kökar"),
+    ('koylio', u"Köyliö"),
+    ('lahti', u"Lahti"),
+    ('laihia', u"Laihia"),
+    ('laitila', u"Laitila"),
+    ('lammi', u"Lammi"),
+    ('lapinjarvi', u"Lapinjärvi"),
+    ('lapinlahti', u"Lapinlahti"),
+    ('lappajarvi', u"Lappajärvi"),
+    ('lappeenranta', u"Lappeenranta"),
+    ('lappi', u"Lappi"),
+    ('lapua', u"Lapua"),
+    ('laukaa', u"Laukaa"),
+    ('lavia', u"Lavia"),
+    ('lehtimaki', u"Lehtimäki"),
+    ('leivonmaki', u"Leivonmäki"),
+    ('lemi', u"Lemi"),
+    ('lemland', u"Lemland"),
+    ('lempaala', u"Lempäälä"),
+    ('lemu', u"Lemu"),
+    ('leppavirta', u"Leppävirta"),
+    ('lestijarvi', u"Lestijärvi"),
+    ('lieksa', u"Lieksa"),
+    ('lieto', u"Lieto"),
+    ('liljendal', u"Liljendal"),
+    ('liminka', u"Liminka"),
+    ('liperi', u"Liperi"),
+    ('lohja', u"Lohja"),
+    ('lohtaja', u"Lohtaja"),
+    ('loimaa', u"Loimaa"),
+    ('loppi', u"Loppi"),
+    ('loviisa', u"Loviisa"),
+    ('luhanka', u"Luhanka"),
+    ('lumijoki', u"Lumijoki"),
+    ('lumparland', u"Lumparland"),
+    ('luoto', u"Luoto"),
+    ('luumaki', u"Luumäki"),
+    ('luvia', u"Luvia"),
+    ('maalahti', u"Maalahti"),
+    ('maaninka', u"Maaninka"),
+    ('maarianhamina', u"Maarianhamina"),
+    ('marttila', u"Marttila"),
+    ('masku', u"Masku"),
+    ('mellila', u"Mellilä"),
+    ('merijarvi', u"Merijärvi"),
+    ('merikarvia', u"Merikarvia"),
+    ('merimasku', u"Merimasku"),
+    ('miehikkala', u"Miehikkälä"),
+    ('mikkeli', u"Mikkeli"),
+    ('mouhijarvi', u"Mouhijärvi"),
+    ('muhos', u"Muhos"),
+    ('multia', u"Multia"),
+    ('muonio', u"Muonio"),
+    ('mustasaari', u"Mustasaari"),
+    ('muurame', u"Muurame"),
+    ('muurla', u"Muurla"),
+    ('mynamaki', u"Mynämäki"),
+    ('myrskyla', u"Myrskylä"),
+    ('mantsala', u"Mäntsälä"),
+    ('mantta', u"Mänttä"),
+    ('mantyharju', u"Mäntyharju"),
+    ('naantali', u"Naantali"),
+    ('nakkila', u"Nakkila"),
+    ('nastola', u"Nastola"),
+    ('nauvo', u"Nauvo"),
+    ('nilsia', u"Nilsiä"),
+    ('nivala', u"Nivala"),
+    ('nokia', u"Nokia"),
+    ('noormarkku', u"Noormarkku"),
+    ('nousiainen', u"Nousiainen"),
+    ('nummi-pusula', u"Nummi-Pusula"),
+    ('nurmes', u"Nurmes"),
+    ('nurmijarvi', u"Nurmijärvi"),
+    ('nurmo', u"Nurmo"),
+    ('narpio', u"Närpiö"),
+    ('oravainen', u"Oravainen"),
+    ('orimattila', u"Orimattila"),
+    ('oripaa', u"Oripää"),
+    ('orivesi', u"Orivesi"),
+    ('oulainen', u"Oulainen"),
+    ('oulu', u"Oulu"),
+    ('oulunsalo', u"Oulunsalo"),
+    ('outokumpu', u"Outokumpu"),
+    ('padasjoki', u"Padasjoki"),
+    ('paimio', u"Paimio"),
+    ('paltamo', u"Paltamo"),
+    ('parainen', u"Parainen"),
+    ('parikkala', u"Parikkala"),
+    ('parkano', u"Parkano"),
+    ('pedersore', u"Pedersöre"),
+    ('pelkosenniemi', u"Pelkosenniemi"),
+    ('pello', u"Pello"),
+    ('perho', u"Perho"),
+    ('pernaja', u"Pernaja"),
+    ('pernio', u"Perniö"),
+    ('pertteli', u"Pertteli"),
+    ('pertunmaa', u"Pertunmaa"),
+    ('petajavesi', u"Petäjävesi"),
+    ('pieksamaki', u"Pieksämäki"),
+    ('pielavesi', u"Pielavesi"),
+    ('pietarsaari', u"Pietarsaari"),
+    ('pihtipudas', u"Pihtipudas"),
+    ('piikkio', u"Piikkiö"),
+    ('piippola', u"Piippola"),
+    ('pirkkala', u"Pirkkala"),
+    ('pohja', u"Pohja"),
+    ('polvijarvi', u"Polvijärvi"),
+    ('pomarkku', u"Pomarkku"),
+    ('pori', u"Pori"),
+    ('pornainen', u"Pornainen"),
+    ('porvoo', u"Porvoo"),
+    ('posio', u"Posio"),
+    ('pudasjarvi', u"Pudasjärvi"),
+    ('pukkila', u"Pukkila"),
+    ('pulkkila', u"Pulkkila"),
+    ('punkaharju', u"Punkaharju"),
+    ('punkalaidun', u"Punkalaidun"),
+    ('puolanka', u"Puolanka"),
+    ('puumala', u"Puumala"),
+    ('pyhtaa', u"Pyhtää"),
+    ('pyhajoki', u"Pyhäjoki"),
+    ('pyhajarvi', u"Pyhäjärvi"),
+    ('pyhanta', u"Pyhäntä"),
+    ('pyharanta', u"Pyhäranta"),
+    ('pyhaselka', u"Pyhäselkä"),
+    ('pylkonmaki', u"Pylkönmäki"),
+    ('palkane', u"Pälkäne"),
+    ('poytya', u"Pöytyä"),
+    ('raahe', u"Raahe"),
+    ('raisio', u"Raisio"),
+    ('rantasalmi', u"Rantasalmi"),
+    ('rantsila', u"Rantsila"),
+    ('ranua', u"Ranua"),
+    ('rauma', u"Rauma"),
+    ('rautalampi', u"Rautalampi"),
+    ('rautavaara', u"Rautavaara"),
+    ('rautjarvi', u"Rautjärvi"),
+    ('reisjarvi', u"Reisjärvi"),
+    ('renko', u"Renko"),
+    ('riihimaki', u"Riihimäki"),
+    ('ristiina', u"Ristiina"),
+    ('ristijarvi', u"Ristijärvi"),
+    ('rovaniemi', u"Rovaniemi"),
+    ('ruokolahti', u"Ruokolahti"),
+    ('ruotsinpyhtaa', u"Ruotsinpyhtää"),
+    ('ruovesi', u"Ruovesi"),
+    ('rusko', u"Rusko"),
+    ('rymattyla', u"Rymättylä"),
+    ('raakkyla', u"Rääkkylä"),
+    ('saarijarvi', u"Saarijärvi"),
+    ('salla', u"Salla"),
+    ('salo', u"Salo"),
+    ('saltvik', u"Saltvik"),
+    ('sammatti', u"Sammatti"),
+    ('sauvo', u"Sauvo"),
+    ('savitaipale', u"Savitaipale"),
+    ('savonlinna', u"Savonlinna"),
+    ('savonranta', u"Savonranta"),
+    ('savukoski', u"Savukoski"),
+    ('seinajoki', u"Seinäjoki"),
+    ('sievi', u"Sievi"),
+    ('siikainen', u"Siikainen"),
+    ('siikajoki', u"Siikajoki"),
+    ('siilinjarvi', u"Siilinjärvi"),
+    ('simo', u"Simo"),
+    ('sipoo', u"Sipoo"),
+    ('siuntio', u"Siuntio"),
+    ('sodankyla', u"Sodankylä"),
+    ('soini', u"Soini"),
+    ('somero', u"Somero"),
+    ('sonkajarvi', u"Sonkajärvi"),
+    ('sotkamo', u"Sotkamo"),
+    ('sottunga', u"Sottunga"),
+    ('sulkava', u"Sulkava"),
+    ('sund', u"Sund"),
+    ('suomenniemi', u"Suomenniemi"),
+    ('suomusjarvi', u"Suomusjärvi"),
+    ('suomussalmi', u"Suomussalmi"),
+    ('suonenjoki', u"Suonenjoki"),
+    ('sysma', u"Sysmä"),
+    ('sakyla', u"Säkylä"),
+    ('sarkisalo', u"Särkisalo"),
+    ('taipalsaari', u"Taipalsaari"),
+    ('taivalkoski', u"Taivalkoski"),
+    ('taivassalo', u"Taivassalo"),
+    ('tammela', u"Tammela"),
+    ('tammisaari', u"Tammisaari"),
+    ('tampere', u"Tampere"),
+    ('tarvasjoki', u"Tarvasjoki"),
+    ('tervo', u"Tervo"),
+    ('tervola', u"Tervola"),
+    ('teuva', u"Teuva"),
+    ('tohmajarvi', u"Tohmajärvi"),
+    ('toholampi', u"Toholampi"),
+    ('toivakka', u"Toivakka"),
+    ('tornio', u"Tornio"),
+    ('turku', u"Turku"),
+    ('tuulos', u"Tuulos"),
+    ('tuusniemi', u"Tuusniemi"),
+    ('tuusula', u"Tuusula"),
+    ('tyrnava', u"Tyrnävä"),
+    ('toysa', u"Töysä"),
+    ('ullava', u"Ullava"),
+    ('ulvila', u"Ulvila"),
+    ('urjala', u"Urjala"),
+    ('utajarvi', u"Utajärvi"),
+    ('utsjoki', u"Utsjoki"),
+    ('uurainen', u"Uurainen"),
+    ('uusikaarlepyy', u"Uusikaarlepyy"),
+    ('uusikaupunki', u"Uusikaupunki"),
+    ('vaala', u"Vaala"),
+    ('vaasa', u"Vaasa"),
+    ('vahto', u"Vahto"),
+    ('valkeakoski', u"Valkeakoski"),
+    ('valkeala', u"Valkeala"),
+    ('valtimo', u"Valtimo"),
+    ('vammala', u"Vammala"),
+    ('vampula', u"Vampula"),
+    ('vantaa', u"Vantaa"),
+    ('varkaus', u"Varkaus"),
+    ('varpaisjarvi', u"Varpaisjärvi"),
+    ('vehmaa', u"Vehmaa"),
+    ('velkua', u"Velkua"),
+    ('vesanto', u"Vesanto"),
+    ('vesilahti', u"Vesilahti"),
+    ('veteli', u"Veteli"),
+    ('vierema', u"Vieremä"),
+    ('vihanti', u"Vihanti"),
+    ('vihti', u"Vihti"),
+    ('viitasaari', u"Viitasaari"),
+    ('vilppula', u"Vilppula"),
+    ('vimpeli', u"Vimpeli"),
+    ('virolahti', u"Virolahti"),
+    ('virrat', u"Virrat"),
+    ('vardo', u"Vårdö"),
+    ('vahakyro', u"Vähäkyrö"),
+    ('vastanfjard', u"Västanfjärd"),
+    ('voyri-maksamaa', u"Vöyri-Maksamaa"),
+    ('yliharma', u"Ylihärmä"),
+    ('yli-ii', u"Yli-Ii"),
+    ('ylikiiminki', u"Ylikiiminki"),
+    ('ylistaro', u"Ylistaro"),
+    ('ylitornio', u"Ylitornio"),
+    ('ylivieska', u"Ylivieska"),
+    ('ylamaa', u"Ylämaa"),
+    ('ylane', u"Yläne"),
+    ('ylojarvi', u"Ylöjärvi"),
+    ('ypaja', u"Ypäjä"),
+    ('aetsa', u"Äetsä"),
+    ('ahtari', u"Ähtäri"),
+    ('aanekoski', u"Äänekoski")
+)
\ No newline at end of file
diff --git a/webapp/django/contrib/localflavor/fi/forms.py b/webapp/django/contrib/localflavor/fi/forms.py
new file mode 100644
index 0000000..2b82a79
--- /dev/null
+++ b/webapp/django/contrib/localflavor/fi/forms.py
@@ -0,0 +1,50 @@
+"""
+FI-specific Form helpers
+"""
+
+import re
+from django.forms import ValidationError
+from django.forms.fields import Field, RegexField, Select, EMPTY_VALUES
+from django.utils.translation import ugettext_lazy as _
+
+class FIZipCodeField(RegexField):
+    default_error_messages = {
+        'invalid': _('Enter a zip code in the format XXXXX.'),
+    }
+    def __init__(self, *args, **kwargs):
+        super(FIZipCodeField, self).__init__(r'^\d{5}$',
+            max_length=None, min_length=None, *args, **kwargs)
+
+class FIMunicipalitySelect(Select):
+    """
+    A Select widget that uses a list of Finnish municipalities as its choices.
+    """
+    def __init__(self, attrs=None):
+        from fi_municipalities import MUNICIPALITY_CHOICES
+        super(FIMunicipalitySelect, self).__init__(attrs, choices=MUNICIPALITY_CHOICES)
+
+class FISocialSecurityNumber(Field):
+    default_error_messages = {
+        'invalid': _('Enter a valid Finnish social security number.'),
+    }
+
+    def clean(self, value):
+        super(FISocialSecurityNumber, self).clean(value)
+        if value in EMPTY_VALUES:
+            return u''
+
+        checkmarks = "0123456789ABCDEFHJKLMNPRSTUVWXY"
+        result = re.match(r"""^
+            (?P<date>([0-2]\d|3[01])
+            (0\d|1[012])
+            (\d{2}))
+            [A+-]
+            (?P<serial>(\d{3}))
+            (?P<checksum>[%s])$""" % checkmarks, value, re.VERBOSE | re.IGNORECASE)
+        if not result:
+            raise ValidationError(self.error_messages['invalid'])
+        gd = result.groupdict()
+        checksum = int(gd['date'] + gd['serial'])
+        if checkmarks[checksum % len(checkmarks)] == gd['checksum'].upper():
+            return u'%s' % value.upper()
+        raise ValidationError(self.error_messages['invalid'])
diff --git a/webapp/django/contrib/localflavor/fr/__init__.py b/webapp/django/contrib/localflavor/fr/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/localflavor/fr/__init__.py
diff --git a/webapp/django/contrib/localflavor/fr/forms.py b/webapp/django/contrib/localflavor/fr/forms.py
new file mode 100644
index 0000000..8d9d9d7
--- /dev/null
+++ b/webapp/django/contrib/localflavor/fr/forms.py
@@ -0,0 +1,50 @@
+"""
+FR-specific Form helpers
+"""
+
+from django.forms import ValidationError
+from django.forms.fields import Field, RegexField, Select, EMPTY_VALUES
+from django.utils.encoding import smart_unicode
+from django.utils.translation import ugettext_lazy as _
+import re
+
+phone_digits_re = re.compile(r'^0\d(\s|\.)?(\d{2}(\s|\.)?){3}\d{2}$')
+
+class FRZipCodeField(RegexField):
+    default_error_messages = {
+        'invalid': _('Enter a zip code in the format XXXXX.'),
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(FRZipCodeField, self).__init__(r'^\d{5}$',
+            max_length=None, min_length=None, *args, **kwargs)
+
+class FRPhoneNumberField(Field):
+    """
+    Validate local French phone number (not international ones)
+    The correct format is '0X XX XX XX XX'.
+    '0X.XX.XX.XX.XX' and '0XXXXXXXXX' validate but are corrected to
+    '0X XX XX XX XX'.
+    """
+    default_error_messages = {
+        'invalid': u'Phone numbers must be in 0X XX XX XX XX format.',
+    }
+
+    def clean(self, value):
+        super(FRPhoneNumberField, self).clean(value)
+        if value in EMPTY_VALUES:
+            return u''
+        value = re.sub('(\.|\s)', '', smart_unicode(value))
+        m = phone_digits_re.search(value)
+        if m:
+            return u'%s %s %s %s %s' % (value[0:2], value[2:4], value[4:6], value[6:8], value[8:10])
+        raise ValidationError(self.error_messages['invalid'])
+
+class FRDepartmentSelect(Select):
+    """
+    A Select widget that uses a list of FR departments as its choices.
+    """
+    def __init__(self, attrs=None):
+        from fr_department import DEPARTMENT_ASCII_CHOICES
+        super(FRDepartmentSelect, self).__init__(attrs, choices=DEPARTMENT_ASCII_CHOICES)
+
diff --git a/webapp/django/contrib/localflavor/fr/fr_department.py b/webapp/django/contrib/localflavor/fr/fr_department.py
new file mode 100644
index 0000000..02de295
--- /dev/null
+++ b/webapp/django/contrib/localflavor/fr/fr_department.py
@@ -0,0 +1,112 @@
+# -*- coding: utf-8 -*-
+
+DEPARTMENT_ASCII_CHOICES = (
+    ('01', '01 - Ain'),
+    ('02', '02 - Aisne'),
+    ('03', '03 - Allier'),
+    ('04', '04 - Alpes-de-Haute-Provence'),
+    ('05', '05 - Hautes-Alpes'),
+    ('06', '06 - Alpes-Maritimes'),
+    ('07', '07 - Ardeche'),
+    ('08', '08 - Ardennes'),
+    ('09', '09 - Ariege'),
+    ('10', '10 - Aube'),
+    ('11', '11 - Aude'),
+    ('12', '12 - Aveyron'),
+    ('13', '13 - Bouches-du-Rhone'),
+    ('14', '14 - Calvados'),
+    ('15', '15 - Cantal'),
+    ('16', '16 - Charente'),
+    ('17', '17 - Charente-Maritime'),
+    ('18', '18 - Cher'),
+    ('19', '19 - Correze'),
+    ('21', '21 - Cote-d\'Or'),
+    ('22', '22 - Cotes-d\'Armor'),
+    ('23', '23 - Creuse'),
+    ('24', '24 - Dordogne'),
+    ('25', '25 - Doubs'),
+    ('26', '26 - Drome'),
+    ('27', '27 - Eure'),
+    ('28', '28 - Eure-et-Loire'),
+    ('29', '29 - Finistere'),
+    ('2A', '2A - Corse-du-Sud'),
+    ('2B', '2B - Haute-Corse'),
+    ('30', '30 - Gard'),
+    ('31', '31 - Haute-Garonne'),
+    ('32', '32 - Gers'),
+    ('33', '33 - Gironde'),
+    ('34', '34 - Herault'),
+    ('35', '35 - Ille-et-Vilaine'),
+    ('36', '36 - Indre'),
+    ('37', '37 - Indre-et-Loire'),
+    ('38', '38 - Isere'),
+    ('39', '39 - Jura'),
+    ('40', '40 - Landes'),
+    ('41', '41 - Loir-et-Cher'),
+    ('42', '42 - Loire'),
+    ('43', '43 - Haute-Loire'),
+    ('44', '44 - Loire-Atlantique'),
+    ('45', '45 - Loiret'),
+    ('46', '46 - Lot'),
+    ('47', '47 - Lot-et-Garonne'),
+    ('48', '48 - Lozere'),
+    ('49', '49 - Maine-et-Loire'),
+    ('50', '50 - Manche'),
+    ('51', '51 - Marne'),
+    ('52', '52 - Haute-Marne'),
+    ('53', '53 - Mayenne'),
+    ('54', '54 - Meurthe-et-Moselle'),
+    ('55', '55 - Meuse'),
+    ('56', '56 - Morbihan'),
+    ('57', '57 - Moselle'),
+    ('58', '58 - Nievre'),
+    ('59', '59 - Nord'),
+    ('60', '60 - Oise'),
+    ('61', '61 - Orne'),
+    ('62', '62 - Pas-de-Calais'),
+    ('63', '63 - Puy-de-Dome'),
+    ('64', '64 - Pyrenees-Atlantiques'),
+    ('65', '65 - Hautes-Pyrenees'),
+    ('66', '66 - Pyrenees-Orientales'),
+    ('67', '67 - Bas-Rhin'),
+    ('68', '68 - Haut-Rhin'),
+    ('69', '69 - Rhone'),
+    ('70', '70 - Haute-Saone'),
+    ('71', '71 - Saone-et-Loire'),
+    ('72', '72 - Sarthe'),
+    ('73', '73 - Savoie'),
+    ('74', '74 - Haute-Savoie'),
+    ('75', '75 - Paris'),
+    ('76', '76 - Seine-Maritime'),
+    ('77', '77 - Seine-et-Marne'),
+    ('78', '78 - Yvelines'),
+    ('79', '79 - Deux-Sevres'),
+    ('80', '80 - Somme'),
+    ('81', '81 - Tarn'),
+    ('82', '82 - Tarn-et-Garonne'),
+    ('83', '83 - Var'),
+    ('84', '84 - Vaucluse'),
+    ('85', '85 - Vendee'),
+    ('86', '86 - Vienne'),
+    ('87', '87 - Haute-Vienne'),
+    ('88', '88 - Vosges'),
+    ('89', '89 - Yonne'),
+    ('90', '90 - Territoire de Belfort'),
+    ('91', '91 - Essonne'),
+    ('92', '92 - Hauts-de-Seine'),
+    ('93', '93 - Seine-Saint-Denis'),
+    ('94', '94 - Val-de-Marne'),
+    ('95', '95 - Val-d\'Oise'),
+    ('2A', '2A - Corse du sud'),
+    ('2B', '2B - Haute Corse'),
+    ('971', '971 - Guadeloupe'),
+    ('972', '972 - Martinique'),
+    ('973', '973 - Guyane'),
+    ('974', '974 - La Reunion'),
+    ('975', '975 - Saint-Pierre-et-Miquelon'),
+    ('976', '976 - Mayotte'),
+    ('984', '984 - Terres Australes et Antarctiques'),
+    ('986', '986 - Wallis et Futuna'),
+    ('987', '987 - Polynesie Francaise'),
+    ('988', '988 - Nouvelle-Caledonie'),
+)
diff --git a/webapp/django/contrib/localflavor/generic/__init__.py b/webapp/django/contrib/localflavor/generic/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/localflavor/generic/__init__.py
diff --git a/webapp/django/contrib/localflavor/generic/forms.py b/webapp/django/contrib/localflavor/generic/forms.py
new file mode 100644
index 0000000..8bafce7
--- /dev/null
+++ b/webapp/django/contrib/localflavor/generic/forms.py
@@ -0,0 +1,38 @@
+from django import forms
+
+DEFAULT_DATE_INPUT_FORMATS = (
+    '%Y-%m-%d', '%d/%m/%Y', '%d/%m/%y', # '2006-10-25', '25/10/2006', '25/10/06'
+    '%b %d %Y', '%b %d, %Y',            # 'Oct 25 2006', 'Oct 25, 2006'
+    '%d %b %Y', '%d %b, %Y',            # '25 Oct 2006', '25 Oct, 2006'
+    '%B %d %Y', '%B %d, %Y',            # 'October 25 2006', 'October 25, 2006'
+    '%d %B %Y', '%d %B, %Y',            # '25 October 2006', '25 October, 2006'
+)
+
+DEFAULT_DATETIME_INPUT_FORMATS = (
+    '%Y-%m-%d %H:%M:%S',     # '2006-10-25 14:30:59'
+    '%Y-%m-%d %H:%M',        # '2006-10-25 14:30'
+    '%Y-%m-%d',              # '2006-10-25'
+    '%d/%m/%Y %H:%M:%S',     # '25/10/2006 14:30:59'
+    '%d/%m/%Y %H:%M',        # '25/10/2006 14:30'
+    '%d/%m/%Y',              # '25/10/2006'
+    '%d/%m/%y %H:%M:%S',     # '25/10/06 14:30:59'
+    '%d/%m/%y %H:%M',        # '25/10/06 14:30'
+    '%d/%m/%y',              # '25/10/06'
+)
+
+class DateField(forms.DateField):
+    """
+    A date input field which uses non-US date input formats by default.
+    """
+    def __init__(self, input_formats=None, *args, **kwargs):
+        input_formats = input_formats or DEFAULT_DATE_INPUT_FORMATS
+        super(DateField, self).__init__(input_formats=input_formats, *args, **kwargs)
+
+class DateTimeField(forms.DateTimeField):
+    """
+    A date and time input field which uses non-US date and time input formats
+    by default.
+    """
+    def __init__(self, input_formats=None, *args, **kwargs):
+        input_formats = input_formats or DEFAULT_DATETIME_INPUT_FORMATS
+        super(DateTimeField, self).__init__(input_formats=input_formats, *args, **kwargs)
diff --git a/webapp/django/contrib/localflavor/in_/__init__.py b/webapp/django/contrib/localflavor/in_/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/localflavor/in_/__init__.py
diff --git a/webapp/django/contrib/localflavor/in_/forms.py b/webapp/django/contrib/localflavor/in_/forms.py
new file mode 100644
index 0000000..270b0a0
--- /dev/null
+++ b/webapp/django/contrib/localflavor/in_/forms.py
@@ -0,0 +1,55 @@
+"""
+India-specific Form helpers.
+"""
+
+from django.forms import ValidationError
+from django.forms.fields import Field, RegexField, Select, EMPTY_VALUES
+from django.utils.encoding import smart_unicode
+from django.utils.translation import gettext
+import re
+
+
+class INZipCodeField(RegexField):
+    default_error_messages = {
+        'invalid': gettext(u'Enter a zip code in the format XXXXXXX.'),
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(INZipCodeField, self).__init__(r'^\d{6}$',
+            max_length=None, min_length=None, *args, **kwargs)
+
+class INStateField(Field):
+    """
+    A form field that validates its input is a Indian state name or
+    abbreviation. It normalizes the input to the standard two-letter vehicle
+    registration abbreviation for the given state or union territory
+    """
+    default_error_messages = {
+        'invalid': u'Enter a Indian state or territory.',
+    }
+
+    def clean(self, value):
+        from in_states import STATES_NORMALIZED
+        super(INStateField, self).clean(value)
+        if value in EMPTY_VALUES:
+            return u''
+        try:
+            value = value.strip().lower()
+        except AttributeError:
+            pass
+        else:
+            try:
+                return smart_unicode(STATES_NORMALIZED[value.strip().lower()])
+            except KeyError:
+                pass
+        raise ValidationError(self.error_messages['invalid'])
+
+class INStateSelect(Select):
+    """
+    A Select widget that uses a list of Indian states/territories as its
+    choices.
+    """
+    def __init__(self, attrs=None):
+        from in_states import STATE_CHOICES
+        super(INStateSelect, self).__init__(attrs, choices=STATE_CHOICES)
+
diff --git a/webapp/django/contrib/localflavor/in_/in_states.py b/webapp/django/contrib/localflavor/in_/in_states.py
new file mode 100644
index 0000000..498efe7
--- /dev/null
+++ b/webapp/django/contrib/localflavor/in_/in_states.py
@@ -0,0 +1,84 @@
+"""
+A mapping of state misspellings/abbreviations to normalized abbreviations, and
+an alphabetical list of states for use as `choices` in a formfield.
+
+This exists in this standalone file so that it's only imported into memory
+when explicitly needed.
+"""
+
+STATE_CHOICES = (
+    'KA', 'Karnataka',
+    'AP', 'Andhra Pradesh',
+    'KL', 'Kerala',
+    'TN', 'Tamil Nadu',
+    'MH', 'Maharashtra',
+    'UP', 'Uttar Pradesh',
+    'GA', 'Goa',
+    'GJ', 'Gujarat',
+    'RJ', 'Rajasthan',
+    'HP', 'Himachal Pradesh',
+    'JK', 'Jammu and Kashmir',
+    'AR', 'Arunachal Pradesh',
+    'AS', 'Assam',
+    'BR', 'Bihar',
+    'CG', 'Chattisgarh',
+    'HR', 'Haryana',
+    'JH', 'Jharkhand',
+    'MP', 'Madhya Pradesh',
+    'MN', 'Manipur',
+    'ML', 'Meghalaya',
+    'MZ', 'Mizoram',
+    'NL', 'Nagaland',
+    'OR', 'Orissa',
+    'PB', 'Punjab',
+    'SK', 'Sikkim',
+    'TR', 'Tripura',
+    'UA', 'Uttarakhand',
+    'WB', 'West Bengal',
+
+    # Union Territories
+    'AN', 'Andaman and Nicobar',
+    'CH', 'Chandigarh',
+    'DN', 'Dadra and Nagar Haveli',
+    'DD', 'Daman and Diu',
+    'DL', 'Delhi',
+    'LD', 'Lakshadweep',
+    'PY', 'Pondicherry',
+)
+
+STATES_NORMALIZED = {
+    'ka': 'KA',
+    'karnatka': 'KA',
+    'tn': 'TN',
+    'tamilnad': 'TN',
+    'tamilnadu': 'TN',
+    'andra pradesh': 'AP',
+    'andrapradesh': 'AP',
+    'andhrapradesh': 'AP',
+    'maharastra': 'MH',
+    'mh': 'MH',
+    'ap': 'AP',
+    'dl': 'DL',
+    'dd': 'DD',
+    'br': 'BR',
+    'ar': 'AR',
+    'sk': 'SK',
+    'kl': 'KL',
+    'ga': 'GA',
+    'rj': 'RJ',
+    'rajastan': 'RJ',
+    'rajasthan': 'RJ',
+    'hp': 'HP',
+    'ua': 'UA',
+    'up': 'UP',
+    'mp': 'MP',
+    'mz': 'MZ',
+    'bengal': 'WB',
+    'westbengal': 'WB',
+    'mizo': 'MZ',
+    'orisa': 'OR',
+    'odisa': 'OR',
+    'or': 'OR',
+    'ar': 'AR',
+}
+
diff --git a/webapp/django/contrib/localflavor/is_/__init__.py b/webapp/django/contrib/localflavor/is_/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/localflavor/is_/__init__.py
diff --git a/webapp/django/contrib/localflavor/is_/forms.py b/webapp/django/contrib/localflavor/is_/forms.py
new file mode 100644
index 0000000..cab6eb1
--- /dev/null
+++ b/webapp/django/contrib/localflavor/is_/forms.py
@@ -0,0 +1,82 @@
+"""
+Iceland specific form helpers.
+"""
+
+from django.forms import ValidationError
+from django.forms.fields import RegexField, EMPTY_VALUES
+from django.forms.widgets import Select
+from django.utils.translation import ugettext_lazy as _
+from django.utils.encoding import smart_unicode
+
+class ISIdNumberField(RegexField):
+    """
+    Icelandic identification number (kennitala). This is a number every citizen
+    of Iceland has.
+    """
+    default_error_messages = {
+        'invalid': _('Enter a valid Icelandic identification number. The format is XXXXXX-XXXX.'),
+        'checksum': _(u'The Icelandic identification number is not valid.'),
+    }
+
+    def __init__(self, *args, **kwargs):
+        kwargs['min_length'],kwargs['max_length'] = 10,11
+        super(ISIdNumberField, self).__init__(r'^\d{6}(-| )?\d{4}$', *args, **kwargs)
+
+    def clean(self, value):
+        value = super(ISIdNumberField, self).clean(value)
+
+        if value in EMPTY_VALUES:
+            return u''
+
+        value = self._canonify(value)
+        if self._validate(value):
+            return self._format(value)
+        else:
+            raise ValidationError(self.error_messages['checksum'])
+
+    def _canonify(self, value):
+        """
+        Returns the value as only digits.
+        """
+        return value.replace('-', '').replace(' ', '')
+
+    def _validate(self, value):
+        """
+        Takes in the value in canonical form and checks the verifier digit. The
+        method is modulo 11.
+        """
+        check = [3, 2, 7, 6, 5, 4, 3, 2, 1, 0]
+        return sum([int(value[i]) * check[i] for i in range(10)]) % 11 == 0
+
+    def _format(self, value):
+        """
+        Takes in the value in canonical form and returns it in the common
+        display format.
+        """
+        return smart_unicode(value[:6]+'-'+value[6:])
+
+class ISPhoneNumberField(RegexField):
+    """
+    Icelandic phone number. Seven digits with an optional hyphen or space after
+    the first three digits.
+    """
+    def __init__(self, *args, **kwargs):
+        kwargs['min_length'], kwargs['max_length'] = 7,8
+        super(ISPhoneNumberField, self).__init__(r'^\d{3}(-| )?\d{4}$', *args, **kwargs)
+
+    def clean(self, value):
+        value = super(ISPhoneNumberField, self).clean(value)
+
+        if value in EMPTY_VALUES:
+            return u''
+
+        return value.replace('-', '').replace(' ', '')
+
+class ISPostalCodeSelect(Select):
+    """
+    A Select widget that uses a list of Icelandic postal codes as its choices.
+    """
+    def __init__(self, attrs=None):
+        from is_postalcodes import IS_POSTALCODES
+        super(ISPostalCodeSelect, self).__init__(attrs, choices=IS_POSTALCODES)
+
diff --git a/webapp/django/contrib/localflavor/is_/is_postalcodes.py b/webapp/django/contrib/localflavor/is_/is_postalcodes.py
new file mode 100644
index 0000000..4feca9c
--- /dev/null
+++ b/webapp/django/contrib/localflavor/is_/is_postalcodes.py
@@ -0,0 +1,151 @@
+# -*- coding: utf-8 -*-
+
+IS_POSTALCODES = (
+    ('101', u'101 Reykjavík'),
+    ('103', u'103 Reykjavík'),
+    ('104', u'104 Reykjavík'),
+    ('105', u'105 Reykjavík'),
+    ('107', u'107 Reykjavík'),
+    ('108', u'108 Reykjavík'),
+    ('109', u'109 Reykjavík'),
+    ('110', u'110 Reykjavík'),
+    ('111', u'111 Reykjavík'),
+    ('112', u'112 Reykjavík'),
+    ('113', u'113 Reykjavík'),
+    ('116', u'116 Kjalarnes'),
+    ('121', u'121 Reykjavík'),
+    ('123', u'123 Reykjavík'),
+    ('124', u'124 Reykjavík'),
+    ('125', u'125 Reykjavík'),
+    ('127', u'127 Reykjavík'),
+    ('128', u'128 Reykjavík'),
+    ('129', u'129 Reykjavík'),
+    ('130', u'130 Reykjavík'),
+    ('132', u'132 Reykjavík'),
+    ('150', u'150 Reykjavík'),
+    ('155', u'155 Reykjavík'),
+    ('170', u'170 Seltjarnarnes'),
+    ('172', u'172 Seltjarnarnes'),
+    ('190', u'190 Vogar'),
+    ('200', u'200 Kópavogur'),
+    ('201', u'201 Kópavogur'),
+    ('202', u'202 Kópavogur'),
+    ('203', u'203 Kópavogur'),
+    ('210', u'210 Garðabær'),
+    ('212', u'212 Garðabær'),
+    ('220', u'220 Hafnarfjörður'),
+    ('221', u'221 Hafnarfjörður'),
+    ('222', u'222 Hafnarfjörður'),
+    ('225', u'225 Álftanes'),
+    ('230', u'230 Reykjanesbær'),
+    ('232', u'232 Reykjanesbær'),
+    ('233', u'233 Reykjanesbær'),
+    ('235', u'235 Keflavíkurflugvöllur'),
+    ('240', u'240 Grindavík'),
+    ('245', u'245 Sandgerði'),
+    ('250', u'250 Garður'),
+    ('260', u'260 Reykjanesbær'),
+    ('270', u'270 Mosfellsbær'),
+    ('300', u'300 Akranes'),
+    ('301', u'301 Akranes'),
+    ('302', u'302 Akranes'),
+    ('310', u'310 Borgarnes'),
+    ('311', u'311 Borgarnes'),
+    ('320', u'320 Reykholt í Borgarfirði'),
+    ('340', u'340 Stykkishólmur'),
+    ('345', u'345 Flatey á Breiðafirði'),
+    ('350', u'350 Grundarfjörður'),
+    ('355', u'355 Ólafsvík'),
+    ('356', u'356 Snæfellsbær'),
+    ('360', u'360 Hellissandur'),
+    ('370', u'370 Búðardalur'),
+    ('371', u'371 Búðardalur'),
+    ('380', u'380 Reykhólahreppur'),
+    ('400', u'400 Ísafjörður'),
+    ('401', u'401 Ísafjörður'),
+    ('410', u'410 Hnífsdalur'),
+    ('415', u'415 Bolungarvík'),
+    ('420', u'420 Súðavík'),
+    ('425', u'425 Flateyri'),
+    ('430', u'430 Suðureyri'),
+    ('450', u'450 Patreksfjörður'),
+    ('451', u'451 Patreksfjörður'),
+    ('460', u'460 Tálknafjörður'),
+    ('465', u'465 Bíldudalur'),
+    ('470', u'470 Þingeyri'),
+    ('471', u'471 Þingeyri'),
+    ('500', u'500 Staður'),
+    ('510', u'510 Hólmavík'),
+    ('512', u'512 Hólmavík'),
+    ('520', u'520 Drangsnes'),
+    ('522', u'522 Kjörvogur'),
+    ('523', u'523 Bær'),
+    ('524', u'524 Norðurfjörður'),
+    ('530', u'530 Hvammstangi'),
+    ('531', u'531 Hvammstangi'),
+    ('540', u'540 Blönduós'),
+    ('541', u'541 Blönduós'),
+    ('545', u'545 Skagaströnd'),
+    ('550', u'550 Sauðárkrókur'),
+    ('551', u'551 Sauðárkrókur'),
+    ('560', u'560 Varmahlíð'),
+    ('565', u'565 Hofsós'),
+    ('566', u'566 Hofsós'),
+    ('570', u'570 Fljót'),
+    ('580', u'580 Siglufjörður'),
+    ('600', u'600 Akureyri'),
+    ('601', u'601 Akureyri'),
+    ('602', u'602 Akureyri'),
+    ('603', u'603 Akureyri'),
+    ('610', u'610 Grenivík'),
+    ('611', u'611 Grímsey'),
+    ('620', u'620 Dalvík'),
+    ('621', u'621 Dalvík'),
+    ('625', u'625 Ólafsfjörður'),
+    ('630', u'630 Hrísey'),
+    ('640', u'640 Húsavík'),
+    ('641', u'641 Húsavík'),
+    ('645', u'645 Fosshóll'),
+    ('650', u'650 Laugar'),
+    ('660', u'660 Mývatn'),
+    ('670', u'670 Kópasker'),
+    ('671', u'671 Kópasker'),
+    ('675', u'675 Raufarhöfn'),
+    ('680', u'680 Þórshöfn'),
+    ('681', u'681 Þórshöfn'),
+    ('685', u'685 Bakkafjörður'),
+    ('690', u'690 Vopnafjörður'),
+    ('700', u'700 Egilsstaðir'),
+    ('701', u'701 Egilsstaðir'),
+    ('710', u'710 Seyðisfjörður'),
+    ('715', u'715 Mjóifjörður'),
+    ('720', u'720 Borgarfjörður eystri'),
+    ('730', u'730 Reyðarfjörður'),
+    ('735', u'735 Eskifjörður'),
+    ('740', u'740 Neskaupstaður'),
+    ('750', u'750 Fáskrúðsfjörður'),
+    ('755', u'755 Stöðvarfjörður'),
+    ('760', u'760 Breiðdalsvík'),
+    ('765', u'765 Djúpivogur'),
+    ('780', u'780 Höfn í Hornafirði'),
+    ('781', u'781 Höfn í Hornafirði'),
+    ('785', u'785 Öræfi'),
+    ('800', u'800 Selfoss'),
+    ('801', u'801 Selfoss'),
+    ('802', u'802 Selfoss'),
+    ('810', u'810 Hveragerði'),
+    ('815', u'815 Þorlákshöfn'),
+    ('820', u'820 Eyrarbakki'),
+    ('825', u'825 Stokkseyri'),
+    ('840', u'840 Laugarvatn'),
+    ('845', u'845 Flúðir'),
+    ('850', u'850 Hella'),
+    ('851', u'851 Hella'),
+    ('860', u'860 Hvolsvöllur'),
+    ('861', u'861 Hvolsvöllur'),
+    ('870', u'870 Vík'),
+    ('871', u'871 Vík'),
+    ('880', u'880 Kirkjubæjarklaustur'),
+    ('900', u'900 Vestmannaeyjar'),
+    ('902', u'902 Vestmannaeyjar')
+)
diff --git a/webapp/django/contrib/localflavor/it/__init__.py b/webapp/django/contrib/localflavor/it/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/localflavor/it/__init__.py
diff --git a/webapp/django/contrib/localflavor/it/forms.py b/webapp/django/contrib/localflavor/it/forms.py
new file mode 100644
index 0000000..d2d6519
--- /dev/null
+++ b/webapp/django/contrib/localflavor/it/forms.py
@@ -0,0 +1,83 @@
+"""
+IT-specific Form helpers
+"""
+
+from django.forms import ValidationError
+from django.forms.fields import Field, RegexField, Select, EMPTY_VALUES
+from django.utils.translation import ugettext_lazy as _
+from django.utils.encoding import smart_unicode
+from django.contrib.localflavor.it.util import ssn_check_digit, vat_number_check_digit
+import re
+
+class ITZipCodeField(RegexField):
+    default_error_messages = {
+        'invalid': _('Enter a valid zip code.'),
+    }
+    def __init__(self, *args, **kwargs):
+        super(ITZipCodeField, self).__init__(r'^\d{5}$',
+        max_length=None, min_length=None, *args, **kwargs)
+
+class ITRegionSelect(Select):
+    """
+    A Select widget that uses a list of IT regions as its choices.
+    """
+    def __init__(self, attrs=None):
+        from it_region import REGION_CHOICES
+        super(ITRegionSelect, self).__init__(attrs, choices=REGION_CHOICES)
+
+class ITProvinceSelect(Select):
+    """
+    A Select widget that uses a list of IT provinces as its choices.
+    """
+    def __init__(self, attrs=None):
+        from it_province import PROVINCE_CHOICES
+        super(ITProvinceSelect, self).__init__(attrs, choices=PROVINCE_CHOICES)
+
+class ITSocialSecurityNumberField(RegexField):
+    """
+    A form field that validates Italian Social Security numbers (codice fiscale).
+    For reference see http://www.agenziaentrate.it/ and search for
+    'Informazioni sulla codificazione delle persone fisiche'.
+    """
+    default_error_messages = {
+        'invalid': _(u'Enter a valid Social Security number.'),
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(ITSocialSecurityNumberField, self).__init__(r'^\w{3}\s*\w{3}\s*\w{5}\s*\w{5}$',
+        max_length=None, min_length=None, *args, **kwargs)
+
+    def clean(self, value):
+        value = super(ITSocialSecurityNumberField, self).clean(value)
+        if value == u'':
+            return value
+        value = re.sub('\s', u'', value).upper()
+        try:
+            check_digit = ssn_check_digit(value)
+        except ValueError:
+            raise ValidationError(self.error_messages['invalid'])
+        if not value[15] == check_digit:
+            raise ValidationError(self.error_messages['invalid'])
+        return value
+
+class ITVatNumberField(Field):
+    """
+    A form field that validates Italian VAT numbers (partita IVA).
+    """
+    default_error_messages = {
+        'invalid': _(u'Enter a valid VAT number.'),
+    }
+
+    def clean(self, value):
+        value = super(ITVatNumberField, self).clean(value)
+        if value == u'':
+            return value
+        try:
+            vat_number = int(value)
+        except ValueError:
+            raise ValidationError(self.error_messages['invalid'])
+        vat_number = str(vat_number).zfill(11)
+        check_digit = vat_number_check_digit(vat_number[0:10])
+        if not vat_number[10] == check_digit:
+            raise ValidationError(self.error_messages['invalid'])
+        return smart_unicode(vat_number)
diff --git a/webapp/django/contrib/localflavor/it/it_province.py b/webapp/django/contrib/localflavor/it/it_province.py
new file mode 100644
index 0000000..8737335
--- /dev/null
+++ b/webapp/django/contrib/localflavor/it/it_province.py
@@ -0,0 +1,114 @@
+# -*- coding: utf-8 -*
+
+PROVINCE_CHOICES = (
+    ('AG', 'Agrigento'),
+    ('AL', 'Alessandria'),
+    ('AN', 'Ancona'),
+    ('AO', 'Aosta'),
+    ('AR', 'Arezzo'),
+    ('AP', 'Ascoli Piceno'),
+    ('AT', 'Asti'),
+    ('AV', 'Avellino'),
+    ('BA', 'Bari'),
+#    ('BT', 'Barletta-Andria-Trani'), # active starting from 2009
+    ('BL', 'Belluno'),
+    ('BN', 'Benevento'),
+    ('BG', 'Bergamo'),
+    ('BI', 'Biella'),
+    ('BO', 'Bologna'),
+    ('BZ', 'Bolzano/Bozen'),
+    ('BS', 'Brescia'),
+    ('BR', 'Brindisi'),
+    ('CA', 'Cagliari'),
+    ('CL', 'Caltanissetta'),
+    ('CB', 'Campobasso'),
+    ('CI', 'Carbonia-Iglesias'),
+    ('CE', 'Caserta'),
+    ('CT', 'Catania'),
+    ('CZ', 'Catanzaro'),
+    ('CH', 'Chieti'),
+    ('CO', 'Como'),
+    ('CS', 'Cosenza'),
+    ('CR', 'Cremona'),
+    ('KR', 'Crotone'),
+    ('CN', 'Cuneo'),
+    ('EN', 'Enna'),
+#    ('FM', 'Fermo'), # active starting from 2009
+    ('FE', 'Ferrara'),
+    ('FI', 'Firenze'),
+    ('FG', 'Foggia'),
+    ('FC', 'Forlì-Cesena'),
+    ('FR', 'Frosinone'),
+    ('GE', 'Genova'),
+    ('GO', 'Gorizia'),
+    ('GR', 'Grosseto'),
+    ('IM', 'Imperia'),
+    ('IS', 'Isernia'),
+    ('SP', 'La Spezia'),
+    ('AQ', u'L’Aquila'),
+    ('LT', 'Latina'),
+    ('LE', 'Lecce'),
+    ('LC', 'Lecco'),
+    ('LI', 'Livorno'),
+    ('LO', 'Lodi'),
+    ('LU', 'Lucca'),
+    ('MC', 'Macerata'),
+    ('MN', 'Mantova'),
+    ('MS', 'Massa-Carrara'),
+    ('MT', 'Matera'),
+    ('VS', 'Medio Campidano'),
+    ('ME', 'Messina'),
+    ('MI', 'Milano'),
+    ('MO', 'Modena'),
+#    ('MB', 'Monza e Brianza'), # active starting from 2009
+    ('NA', 'Napoli'),
+    ('NO', 'Novara'),
+    ('NU', 'Nuoro'),
+    ('OG', 'Ogliastra'),
+    ('OT', 'Olbia-Tempio'),
+    ('OR', 'Oristano'),
+    ('PD', 'Padova'),
+    ('PA', 'Palermo'),
+    ('PR', 'Parma'),
+    ('PV', 'Pavia'),
+    ('PG', 'Perugia'),
+    ('PU', 'Pesaro e Urbino'),
+    ('PE', 'Pescara'),
+    ('PC', 'Piacenza'),
+    ('PI', 'Pisa'),
+    ('PT', 'Pistoia'),
+    ('PN', 'Pordenone'),
+    ('PZ', 'Potenza'),
+    ('PO', 'Prato'),
+    ('RG', 'Ragusa'),
+    ('RA', 'Ravenna'),
+    ('RC', 'Reggio Calabria'),
+    ('RE', 'Reggio Emilia'),
+    ('RI', 'Rieti'),
+    ('RN', 'Rimini'),
+    ('RM', 'Roma'),
+    ('RO', 'Rovigo'),
+    ('SA', 'Salerno'),
+    ('SS', 'Sassari'),
+    ('SV', 'Savona'),
+    ('SI', 'Siena'),
+    ('SR', 'Siracusa'),
+    ('SO', 'Sondrio'),
+    ('TA', 'Taranto'),
+    ('TE', 'Teramo'),
+    ('TR', 'Terni'),
+    ('TO', 'Torino'),
+    ('TP', 'Trapani'),
+    ('TN', 'Trento'),
+    ('TV', 'Treviso'),
+    ('TS', 'Trieste'),
+    ('UD', 'Udine'),
+    ('VA', 'Varese'),
+    ('VE', 'Venezia'),
+    ('VB', 'Verbano Cusio Ossola'),
+    ('VC', 'Vercelli'),
+    ('VR', 'Verona'),
+    ('VV', 'Vibo Valentia'),
+    ('VI', 'Vicenza'),
+    ('VT', 'Viterbo'),
+)
diff --git a/webapp/django/contrib/localflavor/it/it_region.py b/webapp/django/contrib/localflavor/it/it_region.py
new file mode 100644
index 0000000..0700b46
--- /dev/null
+++ b/webapp/django/contrib/localflavor/it/it_region.py
@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*
+
+REGION_CHOICES = (
+    ('ABR', 'Abruzzo'),
+    ('BAS', 'Basilicata'),
+    ('CAL', 'Calabria'),
+    ('CAM', 'Campania'),
+    ('EMR', 'Emilia-Romagna'),
+    ('FVG', 'Friuli-Venezia Giulia'),
+    ('LAZ', 'Lazio'),
+    ('LIG', 'Liguria'),
+    ('LOM', 'Lombardia'),
+    ('MAR', 'Marche'),
+    ('MOL', 'Molise'),
+    ('PMN', 'Piemonte'),
+    ('PUG', 'Puglia'),
+    ('SAR', 'Sardegna'),
+    ('SIC', 'Sicilia'),
+    ('TOS', 'Toscana'),
+    ('TAA', 'Trentino-Alto Adige'),
+    ('UMB', 'Umbria'),
+    ('VAO', u'Valle d’Aosta'),
+    ('VEN', 'Veneto'),
+)
diff --git a/webapp/django/contrib/localflavor/it/util.py b/webapp/django/contrib/localflavor/it/util.py
new file mode 100644
index 0000000..c162ff7
--- /dev/null
+++ b/webapp/django/contrib/localflavor/it/util.py
@@ -0,0 +1,44 @@
+from django.utils.encoding import smart_str, smart_unicode
+
+def ssn_check_digit(value):
+    "Calculate Italian social security number check digit."
+    ssn_even_chars = {
+        '0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8,
+        '9': 9, 'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': 4, 'F': 5, 'G': 6, 'H': 7,
+        'I': 8, 'J': 9, 'K': 10, 'L': 11, 'M': 12, 'N': 13, 'O': 14, 'P': 15,
+        'Q': 16, 'R': 17, 'S': 18, 'T': 19, 'U': 20, 'V': 21, 'W': 22, 'X': 23,
+        'Y': 24, 'Z': 25
+    }
+    ssn_odd_chars = {
+        '0': 1, '1': 0, '2': 5, '3': 7, '4': 9, '5': 13, '6': 15, '7': 17, '8':
+        19, '9': 21, 'A': 1, 'B': 0, 'C': 5, 'D': 7, 'E': 9, 'F': 13, 'G': 15,
+        'H': 17, 'I': 19, 'J': 21, 'K': 2, 'L': 4, 'M': 18, 'N': 20, 'O': 11,
+        'P': 3, 'Q': 6, 'R': 8, 'S': 12, 'T': 14, 'U': 16, 'V': 10, 'W': 22,
+        'X': 25, 'Y': 24, 'Z': 23
+    }
+    # Chars from 'A' to 'Z'
+    ssn_check_digits = [chr(x) for x in range(65, 91)]
+
+    ssn = value.upper()
+    total = 0
+    for i in range(0, 15):
+        try:
+            if i % 2 == 0:
+                total += ssn_odd_chars[ssn[i]]
+            else:
+                total += ssn_even_chars[ssn[i]]
+        except KeyError:
+            msg = "Character '%(char)s' is not allowed." % {'char': ssn[i]}
+            raise ValueError(msg)
+    return ssn_check_digits[total % 26]
+
+def vat_number_check_digit(vat_number):
+    "Calculate Italian VAT number check digit."
+    normalized_vat_number = smart_str(vat_number).zfill(10)
+    total = 0
+    for i in range(0, 10, 2):
+        total += int(normalized_vat_number[i])
+    for i in range(1, 11, 2):
+        quotient , remainder = divmod(int(normalized_vat_number[i]) * 2, 10)
+        total += quotient + remainder
+    return smart_unicode((10 - total % 10) % 10)
diff --git a/webapp/django/contrib/localflavor/jp/__init__.py b/webapp/django/contrib/localflavor/jp/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/localflavor/jp/__init__.py
diff --git a/webapp/django/contrib/localflavor/jp/forms.py b/webapp/django/contrib/localflavor/jp/forms.py
new file mode 100644
index 0000000..c86dbaf
--- /dev/null
+++ b/webapp/django/contrib/localflavor/jp/forms.py
@@ -0,0 +1,38 @@
+"""
+JP-specific Form helpers
+"""
+
+from django.core import validators
+from django.forms import ValidationError
+from django.utils.translation import ugettext_lazy as _
+from django.forms.fields import RegexField, Select
+
+class JPPostalCodeField(RegexField):
+    """
+    A form field that validates its input is a Japanese postcode.
+
+    Accepts 7 digits, with or without a hyphen.
+    """
+    default_error_messages = {
+        'invalid': _('Enter a postal code in the format XXXXXXX or XXX-XXXX.'),
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(JPPostalCodeField, self).__init__(r'^\d{3}-\d{4}$|^\d{7}$',
+            max_length=None, min_length=None, *args, **kwargs)
+
+    def clean(self, value):
+        """
+        Validates the input and returns a string that contains only numbers.
+        Returns an empty string for empty values.
+        """
+        v = super(JPPostalCodeField, self).clean(value)
+        return v.replace('-', '')
+
+class JPPrefectureSelect(Select):
+    """
+    A Select widget that uses a list of Japanese prefectures as its choices.
+    """
+    def __init__(self, attrs=None):
+        from jp_prefectures import JP_PREFECTURES
+        super(JPPrefectureSelect, self).__init__(attrs, choices=JP_PREFECTURES)
diff --git a/webapp/django/contrib/localflavor/jp/jp_prefectures.py b/webapp/django/contrib/localflavor/jp/jp_prefectures.py
new file mode 100644
index 0000000..f079fe6
--- /dev/null
+++ b/webapp/django/contrib/localflavor/jp/jp_prefectures.py
@@ -0,0 +1,51 @@
+from django.utils.translation import ugettext_lazy
+
+JP_PREFECTURES = (
+    ('hokkaido', ugettext_lazy('Hokkaido'),),
+    ('aomori', ugettext_lazy('Aomori'),),
+    ('iwate', ugettext_lazy('Iwate'),),
+    ('miyagi', ugettext_lazy('Miyagi'),),
+    ('akita', ugettext_lazy('Akita'),),
+    ('yamagata', ugettext_lazy('Yamagata'),),
+    ('fukushima', ugettext_lazy('Fukushima'),),
+    ('ibaraki', ugettext_lazy('Ibaraki'),),
+    ('tochigi', ugettext_lazy('Tochigi'),),
+    ('gunma', ugettext_lazy('Gunma'),),
+    ('saitama', ugettext_lazy('Saitama'),),
+    ('chiba', ugettext_lazy('Chiba'),),
+    ('tokyo', ugettext_lazy('Tokyo'),),
+    ('kanagawa', ugettext_lazy('Kanagawa'),),
+    ('yamanashi', ugettext_lazy('Yamanashi'),),
+    ('nagano', ugettext_lazy('Nagano'),),
+    ('niigata', ugettext_lazy('Niigata'),),
+    ('toyama', ugettext_lazy('Toyama'),),
+    ('ishikawa', ugettext_lazy('Ishikawa'),),
+    ('fukui', ugettext_lazy('Fukui'),),
+    ('gifu', ugettext_lazy('Gifu'),),
+    ('shizuoka', ugettext_lazy('Shizuoka'),),
+    ('aichi', ugettext_lazy('Aichi'),),
+    ('mie', ugettext_lazy('Mie'),),
+    ('shiga', ugettext_lazy('Shiga'),),
+    ('kyoto', ugettext_lazy('Kyoto'),),
+    ('osaka', ugettext_lazy('Osaka'),),
+    ('hyogo', ugettext_lazy('Hyogo'),),
+    ('nara', ugettext_lazy('Nara'),),
+    ('wakayama', ugettext_lazy('Wakayama'),),
+    ('tottori', ugettext_lazy('Tottori'),),
+    ('shimane', ugettext_lazy('Shimane'),),
+    ('okayama', ugettext_lazy('Okayama'),),
+    ('hiroshima', ugettext_lazy('Hiroshima'),),
+    ('yamaguchi', ugettext_lazy('Yamaguchi'),),
+    ('tokushima', ugettext_lazy('Tokushima'),),
+    ('kagawa', ugettext_lazy('Kagawa'),),
+    ('ehime', ugettext_lazy('Ehime'),),
+    ('kochi', ugettext_lazy('Kochi'),),
+    ('fukuoka', ugettext_lazy('Fukuoka'),),
+    ('saga', ugettext_lazy('Saga'),),
+    ('nagasaki', ugettext_lazy('Nagasaki'),),
+    ('kumamoto', ugettext_lazy('Kumamoto'),),
+    ('oita', ugettext_lazy('Oita'),),
+    ('miyazaki', ugettext_lazy('Miyazaki'),),
+    ('kagoshima', ugettext_lazy('Kagoshima'),),
+    ('okinawa', ugettext_lazy('Okinawa'),),
+)
diff --git a/webapp/django/contrib/localflavor/mx/__init__.py b/webapp/django/contrib/localflavor/mx/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/localflavor/mx/__init__.py
diff --git a/webapp/django/contrib/localflavor/mx/forms.py b/webapp/django/contrib/localflavor/mx/forms.py
new file mode 100644
index 0000000..9581937
--- /dev/null
+++ b/webapp/django/contrib/localflavor/mx/forms.py
@@ -0,0 +1,14 @@
+"""
+Mexican-specific form helpers.
+"""
+
+from django.forms.fields import Select
+
+class MXStateSelect(Select):
+    """
+    A Select widget that uses a list of Mexican states as its choices.
+    """
+    def __init__(self, attrs=None):
+        from mx_states import STATE_CHOICES
+        super(MXStateSelect, self).__init__(attrs, choices=STATE_CHOICES)
+
diff --git a/webapp/django/contrib/localflavor/mx/mx_states.py b/webapp/django/contrib/localflavor/mx/mx_states.py
new file mode 100644
index 0000000..eed1700
--- /dev/null
+++ b/webapp/django/contrib/localflavor/mx/mx_states.py
@@ -0,0 +1,45 @@
+# -*- coding: utf-8 -*-
+"""
+A list of Mexican states for use as `choices` in a formfield.
+
+This exists in this standalone file so that it's only imported into memory
+when explicitly needed.
+"""
+
+from django.utils.translation import ugettext_lazy as _
+
+STATE_CHOICES = (
+    ('AGU', _(u'Aguascalientes')),
+    ('BCN', _(u'Baja California')),
+    ('BCS', _(u'Baja California Sur')),
+    ('CAM', _(u'Campeche')),
+    ('CHH', _(u'Chihuahua')),
+    ('CHP', _(u'Chiapas')),
+    ('COA', _(u'Coahuila')),
+    ('COL', _(u'Colima')),
+    ('DIF', _(u'Distrito Federal')),
+    ('DUR', _(u'Durango')),
+    ('GRO', _(u'Guerrero')),
+    ('GUA', _(u'Guanajuato')),
+    ('HID', _(u'Hidalgo')),
+    ('JAL', _(u'Jalisco')),
+    ('MEX', _(u'Estado de México')),
+    ('MIC', _(u'Michoacán')),
+    ('MOR', _(u'Morelos')),
+    ('NAY', _(u'Nayarit')),
+    ('NLE', _(u'Nuevo León')),
+    ('OAX', _(u'Oaxaca')),
+    ('PUE', _(u'Puebla')),
+    ('QUE', _(u'Querétaro')),
+    ('ROO', _(u'Quintana Roo')),
+    ('SIN', _(u'Sinaloa')),
+    ('SLP', _(u'San Luis Potosí')),
+    ('SON', _(u'Sonora')),
+    ('TAB', _(u'Tabasco')),
+    ('TAM', _(u'Tamaulipas')),
+    ('TLA', _(u'Tlaxcala')),
+    ('VER', _(u'Veracruz')),
+    ('YUC', _(u'Yucatán')),
+    ('ZAC', _(u'Zacatecas')),
+)
+
diff --git a/webapp/django/contrib/localflavor/nl/__init__.py b/webapp/django/contrib/localflavor/nl/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/localflavor/nl/__init__.py
diff --git a/webapp/django/contrib/localflavor/nl/forms.py b/webapp/django/contrib/localflavor/nl/forms.py
new file mode 100644
index 0000000..6dc5319
--- /dev/null
+++ b/webapp/django/contrib/localflavor/nl/forms.py
@@ -0,0 +1,100 @@
+"""
+NL-specific Form helpers
+"""
+
+import re
+
+from django.forms import ValidationError
+from django.forms.fields import Field, Select, EMPTY_VALUES
+from django.utils.translation import ugettext_lazy as _
+from django.utils.encoding import smart_unicode
+
+pc_re = re.compile('^\d{4}[A-Z]{2}$')
+sofi_re = re.compile('^\d{9}$')
+numeric_re = re.compile('^\d+$')
+
+class NLZipCodeField(Field):
+    """
+    A Dutch postal code field.
+    """
+    default_error_messages = {
+        'invalid': _('Enter a valid postal code'),
+    }
+
+    def clean(self, value):
+        super(NLZipCodeField, self).clean(value)
+        if value in EMPTY_VALUES:
+            return u''
+
+        value = value.strip().upper().replace(' ', '')
+        if not pc_re.search(value):
+            raise ValidationError(self.error_messages['invalid'])
+
+        if int(value[:4]) < 1000:
+            raise ValidationError(self.error_messages['invalid'])
+
+        return u'%s %s' % (value[:4], value[4:])
+
+class NLProvinceSelect(Select):
+    """
+    A Select widget that uses a list of provinces of the Netherlands as its
+    choices.
+    """
+    def __init__(self, attrs=None):
+        from nl_provinces import PROVINCE_CHOICES
+        super(NLProvinceSelect, self).__init__(attrs, choices=PROVINCE_CHOICES)
+
+class NLPhoneNumberField(Field):
+    """
+    A Dutch telephone number field.
+    """
+    default_error_messages = {
+        'invalid': _('Enter a valid phone number'),
+    }
+
+    def clean(self, value):
+        super(NLPhoneNumberField, self).clean(value)
+        if value in EMPTY_VALUES:
+            return u''
+
+        phone_nr = re.sub('[\-\s\(\)]', '', smart_unicode(value))
+
+        if len(phone_nr) == 10 and numeric_re.search(phone_nr):
+            return value
+
+        if phone_nr[:3] == '+31' and len(phone_nr) == 12 and \
+           numeric_re.search(phone_nr[3:]):
+            return value
+
+        raise ValidationError(self.error_messages['invalid'])
+
+class NLSoFiNumberField(Field):
+    """
+    A Dutch social security number (SoFi/BSN) field.
+
+    http://nl.wikipedia.org/wiki/Sofinummer
+    """
+    default_error_messages = {
+        'invalid': _('Enter a valid SoFi number'),
+    }
+
+    def clean(self, value):
+        super(NLSoFiNumberField, self).clean(value)
+        if value in EMPTY_VALUES:
+            return u''
+
+        if not sofi_re.search(value):
+            raise ValidationError(self.error_messages['invalid'])
+
+        if int(value) == 0:
+            raise ValidationError(self.error_messages['invalid'])
+
+        checksum = 0
+        for i in range(9, 1, -1):
+            checksum += int(value[9-i]) * i
+        checksum -= int(value[-1])
+
+        if checksum % 11 != 0:
+            raise ValidationError(self.error_messages['invalid'])
+
+        return value
diff --git a/webapp/django/contrib/localflavor/nl/nl_provinces.py b/webapp/django/contrib/localflavor/nl/nl_provinces.py
new file mode 100644
index 0000000..602917d
--- /dev/null
+++ b/webapp/django/contrib/localflavor/nl/nl_provinces.py
@@ -0,0 +1,16 @@
+from django.utils.translation import ugettext_lazy as _
+
+PROVINCE_CHOICES = (
+    ('DR', _('Drenthe')),
+    ('FL', _('Flevoland')),
+    ('FR', _('Friesland')),
+    ('GL', _('Gelderland')),
+    ('GR', _('Groningen')),
+    ('LB', _('Limburg')),
+    ('NB', _('Noord-Brabant')),
+    ('NH', _('Noord-Holland')),
+    ('OV', _('Overijssel')),
+    ('UT', _('Utrecht')),
+    ('ZE', _('Zeeland')),
+    ('ZH', _('Zuid-Holland')),
+)
diff --git a/webapp/django/contrib/localflavor/no/__init__.py b/webapp/django/contrib/localflavor/no/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/localflavor/no/__init__.py
diff --git a/webapp/django/contrib/localflavor/no/forms.py b/webapp/django/contrib/localflavor/no/forms.py
new file mode 100644
index 0000000..0fe55ad
--- /dev/null
+++ b/webapp/django/contrib/localflavor/no/forms.py
@@ -0,0 +1,81 @@
+"""
+Norwegian-specific Form helpers
+"""
+
+import re, datetime
+from django.forms import ValidationError
+from django.forms.fields import Field, RegexField, Select, EMPTY_VALUES
+from django.utils.translation import ugettext_lazy as _
+
+class NOZipCodeField(RegexField):
+    default_error_messages = {
+        'invalid': _('Enter a zip code in the format XXXX.'),
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(NOZipCodeField, self).__init__(r'^\d{4}$',
+            max_length=None, min_length=None, *args, **kwargs)
+
+class NOMunicipalitySelect(Select):
+    """
+    A Select widget that uses a list of Norwegian municipalities (fylker)
+    as its choices.
+    """
+    def __init__(self, attrs=None):
+        from no_municipalities import MUNICIPALITY_CHOICES
+        super(NOMunicipalitySelect, self).__init__(attrs, choices=MUNICIPALITY_CHOICES)
+
+class NOSocialSecurityNumber(Field):
+    """
+    Algorithm is documented at http://no.wikipedia.org/wiki/Personnummer
+    """
+    default_error_messages = {
+        'invalid': _(u'Enter a valid Norwegian social security number.'),
+    }
+
+    def clean(self, value):
+        super(NOSocialSecurityNumber, self).clean(value)
+        if value in EMPTY_VALUES:
+            return u''
+
+        if not re.match(r'^\d{11}$', value):
+            raise ValidationError(self.error_messages['invalid'])
+
+        day = int(value[:2])
+        month = int(value[2:4])
+        year2 = int(value[4:6])
+
+        inum = int(value[6:9])
+        self.birthday = None
+        try:
+            if 000 <= inum < 500:
+                self.birthday = datetime.date(1900+year2, month, day)
+            if 500 <= inum < 750 and year2 > 54:
+                self.birthday = datetime.date(1800+year2, month, day)
+            if 500 <= inum < 1000 and year2 < 40:
+                self.birthday = datetime.date(2000+year2, month, day)
+            if 900 <= inum < 1000 and year2 > 39:
+                self.birthday = datetime.date(1900+year2, month, day)
+        except ValueError:
+            raise ValidationError(self.error_messages['invalid'])
+
+        sexnum = int(value[8])
+        if sexnum % 2 == 0:
+            self.gender = 'F'
+        else:
+            self.gender = 'M'
+
+        digits = map(int, list(value))
+        weight_1 = [3, 7, 6, 1, 8, 9, 4, 5, 2, 1, 0]
+        weight_2 = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2, 1]
+
+        def multiply_reduce(aval, bval):
+            return sum([(a * b) for (a, b) in zip(aval, bval)])
+
+        if multiply_reduce(digits, weight_1) % 11 != 0:
+            raise ValidationError(self.error_messages['invalid'])
+        if multiply_reduce(digits, weight_2) % 11 != 0:
+            raise ValidationError(self.error_messages['invalid'])
+
+        return value
+
diff --git a/webapp/django/contrib/localflavor/no/no_municipalities.py b/webapp/django/contrib/localflavor/no/no_municipalities.py
new file mode 100644
index 0000000..d6bacda
--- /dev/null
+++ b/webapp/django/contrib/localflavor/no/no_municipalities.py
@@ -0,0 +1,32 @@
+# -*- coding: utf-8 -*-
+"""
+An alphabetical list of Norwegian municipalities (fylker) fro use as `choices`
+in a formfield.
+
+This exists in this standalone file so that it's on ly imported into memory
+when explicitly needed.
+"""
+
+MUNICIPALITY_CHOICES = (
+    ('akershus', u'Akershus'),
+    ('austagder', u'Aust-Agder'),
+    ('buskerud', u'Buskerud'),
+    ('finnmark', u'Finnmark'),
+    ('hedmark', u'Hedmark'),
+    ('hordaland', u'Hordaland'),
+    ('janmayen', u'Jan Mayen'),
+    ('moreogromsdal', u'Møre og Romsdal'),
+    ('nordtrondelag', u'Nord-Trøndelag'),
+    ('nordland', u'Nordland'),
+    ('oppland', u'Oppland'),
+    ('oslo', u'Oslo'),
+    ('rogaland', u'Rogaland'),
+    ('sognogfjordane', u'Sogn og Fjordane'),
+    ('svalbard', u'Svalbard'),
+    ('sortrondelag', u'Sør-Trøndelag'),
+    ('telemark', u'Telemark'),
+    ('troms', u'Troms'),
+    ('vestagder', u'Vest-Agder'),
+    ('vestfold', u'Vestfold'),
+    ('ostfold', u'Østfold')
+)
diff --git a/webapp/django/contrib/localflavor/pe/__init__.py b/webapp/django/contrib/localflavor/pe/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/localflavor/pe/__init__.py
diff --git a/webapp/django/contrib/localflavor/pe/forms.py b/webapp/django/contrib/localflavor/pe/forms.py
new file mode 100644
index 0000000..d83a222
--- /dev/null
+++ b/webapp/django/contrib/localflavor/pe/forms.py
@@ -0,0 +1,71 @@
+# -*- coding: utf-8 -*-
+"""
+PE-specific Form helpers.
+"""
+
+from django.forms import ValidationError
+from django.forms.fields import RegexField, CharField, Select, EMPTY_VALUES
+from django.utils.translation import ugettext_lazy as _
+
+class PERegionSelect(Select):
+    """
+    A Select widget that uses a list of Peruvian Regions as its choices.
+    """
+    def __init__(self, attrs=None):
+        from pe_region import REGION_CHOICES
+        super(PERegionSelect, self).__init__(attrs, choices=REGION_CHOICES)
+
+class PEDNIField(CharField):
+    """
+    A field that validates `Documento Nacional de IdentidadŽ (DNI) numbers.
+    """
+    default_error_messages = {
+        'invalid': _("This field requires only numbers."),
+        'max_digits': _("This field requires 8 digits."),
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(PEDNIField, self).__init__(max_length=8, min_length=8, *args,
+                **kwargs)
+
+    def clean(self, value):
+        """
+        Value must be a string in the XXXXXXXX formats.
+        """
+        value = super(PEDNIField, self).clean(value)
+        if value in EMPTY_VALUES:
+            return u''
+        if not value.isdigit():
+            raise ValidationError(self.error_messages['invalid'])
+        if len(value) != 8:
+            raise ValidationError(self.error_messages['max_digits'])
+
+        return value
+
+class PERUCField(RegexField):
+    """
+    This field validates a RUC (Registro Unico de Contribuyentes). A RUC is of
+    the form XXXXXXXXXXX.
+    """
+    default_error_messages = {
+        'invalid': _("This field requires only numbers."),
+        'max_digits': _("This field requires 11 digits."),
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(PERUCField, self).__init__(max_length=11, min_length=11, *args,
+            **kwargs)
+
+    def clean(self, value):
+        """
+        Value must be an 11-digit number.
+        """
+        value = super(PERUCField, self).clean(value)
+        if value in EMPTY_VALUES:
+            return u''
+        if not value.isdigit():
+            raise ValidationError(self.error_messages['invalid'])
+        if len(value) != 11:
+            raise ValidationError(self.error_messages['max_digits'])
+        return value
+
diff --git a/webapp/django/contrib/localflavor/pe/pe_region.py b/webapp/django/contrib/localflavor/pe/pe_region.py
new file mode 100644
index 0000000..9863bd3
--- /dev/null
+++ b/webapp/django/contrib/localflavor/pe/pe_region.py
@@ -0,0 +1,35 @@
+# -*- coding: utf-8 -*-
+"""
+A list of Peru regions as `choices` in a formfield.
+
+This exists in this standalone file so that it's only imported into memory
+when explicitly needed.
+"""
+
+REGION_CHOICES = (
+    ('AMA', u'Amazonas'),
+    ('ANC', u'Ancash'),
+    ('APU', u'Apurímac'),
+    ('ARE', u'Arequipa'),
+    ('AYA', u'Ayacucho'),
+    ('CAJ', u'Cajamarca'),
+    ('CAL', u'Callao'),
+    ('CUS', u'Cusco'),
+    ('HUV', u'Huancavelica'),
+    ('HUC', u'Huánuco'),
+    ('ICA', u'Ica'),
+    ('JUN', u'Junín'),
+    ('LAL', u'La Libertad'),
+    ('LAM', u'Lambayeque'),
+    ('LIM', u'Lima'),
+    ('LOR', u'Loreto'),
+    ('MDD', u'Madre de Dios'),
+    ('MOQ', u'Moquegua'),
+    ('PAS', u'Pasco'),
+    ('PIU', u'Piura'),
+    ('PUN', u'Puno'),
+    ('SAM', u'San Martín'),
+    ('TAC', u'Tacna'),
+    ('TUM', u'Tumbes'),
+    ('UCA', u'Ucayali'),
+)
diff --git a/webapp/django/contrib/localflavor/pl/__init__.py b/webapp/django/contrib/localflavor/pl/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/localflavor/pl/__init__.py
diff --git a/webapp/django/contrib/localflavor/pl/forms.py b/webapp/django/contrib/localflavor/pl/forms.py
new file mode 100644
index 0000000..5532eb8
--- /dev/null
+++ b/webapp/django/contrib/localflavor/pl/forms.py
@@ -0,0 +1,160 @@
+"""
+Polish-specific form helpers
+"""
+
+import re
+
+from django.forms import ValidationError
+from django.forms.fields import Select, RegexField
+from django.utils.translation import ugettext_lazy as _
+
+class PLProvinceSelect(Select):
+    """
+    A select widget with list of Polish administrative provinces as choices.
+    """
+    def __init__(self, attrs=None):
+        from pl_voivodeships import VOIVODESHIP_CHOICES
+        super(PLProvinceSelect, self).__init__(attrs, choices=VOIVODESHIP_CHOICES)
+
+class PLCountiesSelect(Select):
+    """
+    A select widget with list of Polish administrative units as choices.
+    """
+    def __init__(self, attrs=None):
+        from pl_administrativeunits import ADMINISTRATIVE_UNIT_CHOICES
+        super(PLCountiesSelect, self).__init__(attrs, choices=ADMINISTRATIVE_UNIT_CHOICES)
+
+class PLPESELField(RegexField):
+    """
+    A form field that validates as Polish Identification Number (PESEL).
+
+    Checks the following rules:
+        * the length consist of 11 digits
+        * has a valid checksum
+
+    The algorithm is documented at http://en.wikipedia.org/wiki/PESEL.
+    """
+    default_error_messages = {
+        'invalid': _(u'National Identification Number consists of 11 digits.'),
+        'checksum': _(u'Wrong checksum for the National Identification Number.'),
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(PLPESELField, self).__init__(r'^\d{11}$',
+            max_length=None, min_length=None, *args, **kwargs)
+
+    def clean(self,value):
+        super(PLPESELField, self).clean(value)
+        if not self.has_valid_checksum(value):
+            raise ValidationError(self.error_messages['checksum'])
+        return u'%s' % value
+
+    def has_valid_checksum(self, number):
+        """
+        Calculates a checksum with the provided algorithm.
+        """
+        multiple_table = (1, 3, 7, 9, 1, 3, 7, 9, 1, 3, 1)
+        result = 0
+        for i in range(len(number)):
+            result += int(number[i]) * multiple_table[i]
+        return result % 10 == 0
+
+class PLNIPField(RegexField):
+    """
+    A form field that validates as Polish Tax Number (NIP).
+    Valid forms are: XXX-XXX-YY-YY or XX-XX-YYY-YYY.
+
+    Checksum algorithm based on documentation at
+    http://wipos.p.lodz.pl/zylla/ut/nip-rego.html
+    """
+    default_error_messages = {
+        'invalid': _(u'Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX.'),
+        'checksum': _(u'Wrong checksum for the Tax Number (NIP).'),
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(PLNIPField, self).__init__(r'^\d{3}-\d{3}-\d{2}-\d{2}$|^\d{2}-\d{2}-\d{3}-\d{3}$',
+            max_length=None, min_length=None, *args, **kwargs)
+
+    def clean(self,value):
+        super(PLNIPField, self).clean(value)
+        value = re.sub("[-]", "", value)
+        if not self.has_valid_checksum(value):
+            raise ValidationError(self.error_messages['checksum'])
+        return u'%s' % value
+
+    def has_valid_checksum(self, number):
+        """
+        Calculates a checksum with the provided algorithm.
+        """
+        multiple_table = (6, 5, 7, 2, 3, 4, 5, 6, 7)
+        result = 0
+        for i in range(len(number)-1):
+            result += int(number[i]) * multiple_table[i]
+
+        result %= 11
+        if result == int(number[-1]):
+            return True
+        else:
+            return False
+
+class PLREGONField(RegexField):
+    """
+    A form field that validated as Polish National Official Business Register
+    Number (REGON). Valid numbers contain 7 or 9 digits.
+
+    More on the field: http://www.stat.gov.pl/bip/regon_ENG_HTML.htm
+
+    The checksum algorithm is documented at http://wipos.p.lodz.pl/zylla/ut/nip-rego.html
+    """
+    default_error_messages = {
+        'invalid': _(u'National Business Register Number (REGON) consists of 7 or 9 digits.'),
+        'checksum': _(u'Wrong checksum for the National Business Register Number (REGON).'),
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(PLREGONField, self).__init__(r'^\d{7,9}$',
+            max_length=None, min_length=None, *args, **kwargs)
+
+    def clean(self,value):
+        super(PLREGONField, self).clean(value)
+        if not self.has_valid_checksum(value):
+            raise ValidationError(self.error_messages['checksum'])
+        return u'%s' % value
+
+    def has_valid_checksum(self, number):
+        """
+        Calculates a checksum with the provided algorithm.
+        """
+        multiple_table_7 = (2, 3, 4, 5, 6, 7)
+        multiple_table_9 = (8, 9, 2, 3, 4, 5, 6, 7)
+        result = 0
+
+        if len(number) == 7:
+            multiple_table = multiple_table_7
+        else:
+            multiple_table = multiple_table_9
+
+        for i in range(len(number)-1):
+            result += int(number[i]) * multiple_table[i]
+
+        result %= 11
+        if result == 10:
+            result = 0
+        if result  == int(number[-1]):
+            return True
+        else:
+            return False
+
+class PLPostalCodeField(RegexField):
+    """
+    A form field that validates as Polish postal code.
+    Valid code is XX-XXX where X is digit.
+    """
+    default_error_messages = {
+        'invalid': _(u'Enter a postal code in the format XX-XXX.'),
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(PLPostalCodeField, self).__init__(r'^\d{2}-\d{3}$',
+            max_length=None, min_length=None, *args, **kwargs)
diff --git a/webapp/django/contrib/localflavor/pl/pl_administrativeunits.py b/webapp/django/contrib/localflavor/pl/pl_administrativeunits.py
new file mode 100644
index 0000000..9777ea2
--- /dev/null
+++ b/webapp/django/contrib/localflavor/pl/pl_administrativeunits.py
@@ -0,0 +1,385 @@
+# -*- coding: utf-8 -*-
+"""
+Polish administrative units as in http://pl.wikipedia.org/wiki/Podzia%C5%82_administracyjny_Polski
+"""
+
+
+ADMINISTRATIVE_UNIT_CHOICES = (
+    ('wroclaw', u'Wrocław'),
+    ('jeleniagora', u'Jelenia Góra'),
+    ('legnica', u'Legnica'),
+    ('boleslawiecki', u'bolesławiecki'),
+    ('dzierzoniowski', u'dzierżoniowski'),
+    ('glogowski', u'głogowski'),
+    ('gorowski', u'górowski'),
+    ('jaworski', u'jaworski'),
+    ('jeleniogorski', u'jeleniogórski'),
+    ('kamiennogorski', u'kamiennogórski'),
+    ('klodzki', u'kłodzki'),
+    ('legnicki', u'legnicki'),
+    ('lubanski', u'lubański'),
+    ('lubinski', u'lubiński'),
+    ('lwowecki', u'lwówecki'),
+    ('milicki', u'milicki'),
+    ('olesnicki', u'oleśnicki'),
+    ('olawski', u'oławski'),
+    ('polkowicki', u'polkowicki'),
+    ('strzelinski', u'strzeliński'),
+    ('sredzki', u'średzki'),
+    ('swidnicki', u'świdnicki'),
+    ('trzebnicki', u'trzebnicki'),
+    ('walbrzyski', u'wałbrzyski'),
+    ('wolowski', u'wołowski'),
+    ('wroclawski', u'wrocławski'),
+    ('zabkowicki', u'ząbkowicki'),
+    ('zgorzelecki', u'zgorzelecki'),
+    ('zlotoryjski', u'złotoryjski'),
+    ('bydgoszcz', u'Bydgoszcz'),
+    ('torun', u'Toruń'),
+    ('wloclawek', u'Włocławek'),
+    ('grudziadz', u'Grudziądz'),
+    ('aleksandrowski', u'aleksandrowski'),
+    ('brodnicki', u'brodnicki'),
+    ('bydgoski', u'bydgoski'),
+    ('chelminski', u'chełmiński'),
+    ('golubsko-dobrzynski', u'golubsko-dobrzyński'),
+    ('grudziadzki', u'grudziądzki'),
+    ('inowroclawski', u'inowrocławski'),
+    ('lipnowski', u'lipnowski'),
+    ('mogilenski', u'mogileński'),
+    ('nakielski', u'nakielski'),
+    ('radziejowski', u'radziejowski'),
+    ('rypinski', u'rypiński'),
+    ('sepolenski', u'sępoleński'),
+    ('swiecki', u'świecki'),
+    ('torunski', u'toruński'),
+    ('tucholski', u'tucholski'),
+    ('wabrzeski', u'wąbrzeski'),
+    ('wloclawski', u'wrocławski'),
+    ('zninski', u'źniński'),
+    ('lublin', u'Lublin'),
+    ('biala-podlaska', u'Biała Podlaska'),
+    ('chelm', u'Chełm'),
+    ('zamosc', u'Zamość'),
+    ('bialski', u'bialski'),
+    ('bilgorajski', u'biłgorajski'),
+    ('chelmski', u'chełmski'),
+    ('hrubieszowski', u'hrubieszowski'),
+    ('janowski', u'janowski'),
+    ('krasnostawski', u'krasnostawski'),
+    ('krasnicki', u'kraśnicki'),
+    ('lubartowski', u'lubartowski'),
+    ('lubelski', u'lubelski'),
+    ('leczynski', u'łęczyński'),
+    ('lukowski', u'łukowski'),
+    ('opolski', u'opolski'),
+    ('parczewski', u'parczewski'),
+    ('pulawski', u'puławski'),
+    ('radzynski', u'radzyński'),
+    ('rycki', u'rycki'),
+    ('swidnicki', u'świdnicki'),
+    ('tomaszowski', u'tomaszowski'),
+    ('wlodawski', u'włodawski'),
+    ('zamojski', u'zamojski'),
+    ('gorzow-wielkopolski', u'Gorzów Wielkopolski'),
+    ('zielona-gora', u'Zielona Góra'),
+    ('gorzowski', u'gorzowski'),
+    ('krosnienski', u'krośnieński'),
+    ('miedzyrzecki', u'międzyrzecki'),
+    ('nowosolski', u'nowosolski'),
+    ('slubicki', u'słubicki'),
+    ('strzelecko-drezdenecki', u'strzelecko-drezdenecki'),
+    ('sulecinski', u'suleńciński'),
+    ('swiebodzinski', u'świebodziński'),
+    ('wschowski', u'wschowski'),
+    ('zielonogorski', u'zielonogórski'),
+    ('zaganski', u'żagański'),
+    ('zarski', u'żarski'),
+    ('lodz', u'Łódź'),
+    ('piotrkow-trybunalski', u'Piotrków Trybunalski'),
+    ('skierniewice', u'Skierniewice'),
+    ('belchatowski', u'bełchatowski'),
+    ('brzezinski', u'brzeziński'),
+    ('kutnowski', u'kutnowski'),
+    ('laski', u'łaski'),
+    ('leczycki', u'łęczycki'),
+    ('lowicki', u'łowicki'),
+    ('lodzki wschodni', u'łódzki wschodni'),
+    ('opoczynski', u'opoczyński'),
+    ('pabianicki', u'pabianicki'),
+    ('pajeczanski', u'pajęczański'),
+    ('piotrkowski', u'piotrkowski'),
+    ('poddebicki', u'poddębicki'),
+    ('radomszczanski', u'radomszczański'),
+    ('rawski', u'rawski'),
+    ('sieradzki', u'sieradzki'),
+    ('skierniewicki', u'skierniewicki'),
+    ('tomaszowski', u'tomaszowski'),
+    ('wielunski', u'wieluński'),
+    ('wieruszowski', u'wieruszowski'),
+    ('zdunskowolski', u'zduńskowolski'),
+    ('zgierski', u'zgierski'),
+    ('krakow', u'Kraków'),
+    ('tarnow', u'Tarnów'),
+    ('nowy-sacz', u'Nowy Sącz'),
+    ('bochenski', u'bocheński'),
+    ('brzeski', u'brzeski'),
+    ('chrzanowski', u'chrzanowski'),
+    ('dabrowski', u'dąbrowski'),
+    ('gorlicki', u'gorlicki'),
+    ('krakowski', u'krakowski'),
+    ('limanowski', u'limanowski'),
+    ('miechowski', u'miechowski'),
+    ('myslenicki', u'myślenicki'),
+    ('nowosadecki', u'nowosądecki'),
+    ('nowotarski', u'nowotarski'),
+    ('olkuski', u'olkuski'),
+    ('oswiecimski', u'oświęcimski'),
+    ('proszowicki', u'proszowicki'),
+    ('suski', u'suski'),
+    ('tarnowski', u'tarnowski'),
+    ('tatrzanski', u'tatrzański'),
+    ('wadowicki', u'wadowicki'),
+    ('wielicki', u'wielicki'),
+    ('warszawa', u'Warszawa'),
+    ('ostroleka', u'Ostrołęka'),
+    ('plock', u'Płock'),
+    ('radom', u'Radom'),
+    ('siedlce', u'Siedlce'),
+    ('bialobrzeski', u'białobrzeski'),
+    ('ciechanowski', u'ciechanowski'),
+    ('garwolinski', u'garwoliński'),
+    ('gostyninski', u'gostyniński'),
+    ('grodziski', u'grodziski'),
+    ('grojecki', u'grójecki'),
+    ('kozienicki', u'kozenicki'),
+    ('legionowski', u'legionowski'),
+    ('lipski', u'lipski'),
+    ('losicki', u'łosicki'),
+    ('makowski', u'makowski'),
+    ('minski', u'miński'),
+    ('mlawski', u'mławski'),
+    ('nowodworski', u'nowodworski'),
+    ('ostrolecki', u'ostrołęcki'),
+    ('ostrowski', u'ostrowski'),
+    ('otwocki', u'otwocki'),
+    ('piaseczynski', u'piaseczyński'),
+    ('plocki', u'płocki'),
+    ('plonski', u'płoński'),
+    ('pruszkowski', u'pruszkowski'),
+    ('przasnyski', u'przasnyski'),
+    ('przysuski', u'przysuski'),
+    ('pultuski', u'pułtuski'),
+    ('radomski', u'radomski'),
+    ('siedlecki', u'siedlecki'),
+    ('sierpecki', u'sierpecki'),
+    ('sochaczewski', u'sochaczewski'),
+    ('sokolowski', u'sokołowski'),
+    ('szydlowiecki', u'szydłowiecki'),
+    ('warszawski-zachodni', u'warszawski zachodni'),
+    ('wegrowski', u'węgrowski'),
+    ('wolominski', u'wołomiński'),
+    ('wyszkowski', u'wyszkowski'),
+    ('zwolenski', u'zwoleński'),
+    ('zurominski', u'żuromiński'),
+    ('zyrardowski', u'żyrardowski'),
+    ('opole', u'Opole'),
+    ('brzeski', u'brzeski'),
+    ('glubczycki', u'głubczyski'),
+    ('kedzierzynsko-kozielski', u'kędzierzyński-kozielski'),
+    ('kluczborski', u'kluczborski'),
+    ('krapkowicki', u'krapkowicki'),
+    ('namyslowski', u'namysłowski'),
+    ('nyski', u'nyski'),
+    ('oleski', u'oleski'),
+    ('opolski', u'opolski'),
+    ('prudnicki', u'prudnicki'),
+    ('strzelecki', u'strzelecki'),
+    ('rzeszow', u'Rzeszów'),
+    ('krosno', u'Krosno'),
+    ('przemysl', u'Przemyśl'),
+    ('tarnobrzeg', u'Tarnobrzeg'),
+    ('bieszczadzki', u'bieszczadzki'),
+    ('brzozowski', u'brzozowski'),
+    ('debicki', u'dębicki'),
+    ('jaroslawski', u'jarosławski'),
+    ('jasielski', u'jasielski'),
+    ('kolbuszowski', u'kolbuszowski'),
+    ('krosnienski', u'krośnieński'),
+    ('leski', u'leski'),
+    ('lezajski', u'leżajski'),
+    ('lubaczowski', u'lubaczowski'),
+    ('lancucki', u'łańcucki'),
+    ('mielecki', u'mielecki'),
+    ('nizanski', u'niżański'),
+    ('przemyski', u'przemyski'),
+    ('przeworski', u'przeworski'),
+    ('ropczycko-sedziszowski', u'ropczycko-sędziszowski'),
+    ('rzeszowski', u'rzeszowski'),
+    ('sanocki', u'sanocki'),
+    ('stalowowolski', u'stalowowolski'),
+    ('strzyzowski', u'strzyżowski'),
+    ('tarnobrzeski', u'tarnobrzeski'),
+    ('bialystok', u'Białystok'),
+    ('lomza', u'Łomża'),
+    ('suwalki', u'Suwałki'),
+    ('augustowski', u'augustowski'),
+    ('bialostocki', u'białostocki'),
+    ('bielski', u'bielski'),
+    ('grajewski', u'grajewski'),
+    ('hajnowski', u'hajnowski'),
+    ('kolnenski', u'kolneński'),
+    ('łomzynski', u'łomżyński'),
+    ('moniecki', u'moniecki'),
+    ('sejnenski', u'sejneński'),
+    ('siemiatycki', u'siematycki'),
+    ('sokolski', u'sokólski'),
+    ('suwalski', u'suwalski'),
+    ('wysokomazowiecki', u'wysokomazowiecki'),
+    ('zambrowski', u'zambrowski'),
+    ('gdansk', u'Gdańsk'),
+    ('gdynia', u'Gdynia'),
+    ('slupsk', u'Słupsk'),
+    ('sopot', u'Sopot'),
+    ('bytowski', u'bytowski'),
+    ('chojnicki', u'chojnicki'),
+    ('czluchowski', u'człuchowski'),
+    ('kartuski', u'kartuski'),
+    ('koscierski', u'kościerski'),
+    ('kwidzynski', u'kwidzyński'),
+    ('leborski', u'lęborski'),
+    ('malborski', u'malborski'),
+    ('nowodworski', u'nowodworski'),
+    ('gdanski', u'gdański'),
+    ('pucki', u'pucki'),
+    ('slupski', u'słupski'),
+    ('starogardzki', u'starogardzki'),
+    ('sztumski', u'sztumski'),
+    ('tczewski', u'tczewski'),
+    ('wejherowski', u'wejcherowski'),
+    ('katowice', u'Katowice'),
+    ('bielsko-biala', u'Bielsko-Biała'),
+    ('bytom', u'Bytom'),
+    ('chorzow', u'Chorzów'),
+    ('czestochowa', u'Częstochowa'),
+    ('dabrowa-gornicza', u'Dąbrowa Górnicza'),
+    ('gliwice', u'Gliwice'),
+    ('jastrzebie-zdroj', u'Jastrzębie Zdrój'),
+    ('jaworzno', u'Jaworzno'),
+    ('myslowice', u'Mysłowice'),
+    ('piekary-slaskie', u'Piekary Śląskie'),
+    ('ruda-slaska', u'Ruda Śląska'),
+    ('rybnik', u'Rybnik'),
+    ('siemianowice-slaskie', u'Siemianowice Śląskie'),
+    ('sosnowiec', u'Sosnowiec'),
+    ('swietochlowice', u'Świętochłowice'),
+    ('tychy', u'Tychy'),
+    ('zabrze', u'Zabrze'),
+    ('zory', u'Żory'),
+    ('bedzinski', u'będziński'),
+    ('bielski', u'bielski'),
+    ('bierunsko-ledzinski', u'bieruńsko-lędziński'),
+    ('cieszynski', u'cieszyński'),
+    ('czestochowski', u'częstochowski'),
+    ('gliwicki', u'gliwicki'),
+    ('klobucki', u'kłobucki'),
+    ('lubliniecki', u'lubliniecki'),
+    ('mikolowski', u'mikołowski'),
+    ('myszkowski', u'myszkowski'),
+    ('pszczynski', u'pszczyński'),
+    ('raciborski', u'raciborski'),
+    ('rybnicki', u'rybnicki'),
+    ('tarnogorski', u'tarnogórski'),
+    ('wodzislawski', u'wodzisławski'),
+    ('zawiercianski', u'zawierciański'),
+    ('zywiecki', u'żywiecki'),
+    ('kielce', u'Kielce'),
+    ('buski', u'buski'),
+    ('jedrzejowski', u'jędrzejowski'),
+    ('kazimierski', u'kazimierski'),
+    ('kielecki', u'kielecki'),
+    ('konecki', u'konecki'),
+    ('opatowski', u'opatowski'),
+    ('ostrowiecki', u'ostrowiecki'),
+    ('pinczowski', u'pińczowski'),
+    ('sandomierski', u'sandomierski'),
+    ('skarzyski', u'skarżyski'),
+    ('starachowicki', u'starachowicki'),
+    ('staszowski', u'staszowski'),
+    ('wloszczowski', u'włoszczowski'),
+    ('olsztyn', u'Olsztyn'),
+    ('elblag', u'Elbląg'),
+    ('bartoszycki', u'bartoszycki'),
+    ('braniewski', u'braniewski'),
+    ('dzialdowski', u'działdowski'),
+    ('elblaski', u'elbląski'),
+    ('elcki', u'ełcki'),
+    ('gizycki', u'giżycki'),
+    ('goldapski', u'gołdapski'),
+    ('ilawski', u'iławski'),
+    ('ketrzynski', u'kętrzyński'),
+    ('lidzbarski', u'lidzbarski'),
+    ('mragowski', u'mrągowski'),
+    ('nidzicki', u'nidzicki'),
+    ('nowomiejski', u'nowomiejski'),
+    ('olecki', u'olecki'),
+    ('olsztynski', u'olsztyński'),
+    ('ostrodzki', u'ostródzki'),
+    ('piski', u'piski'),
+    ('szczycienski', u'szczycieński'),
+    ('wegorzewski', u'węgorzewski'),
+    ('poznan', u'Poznań'),
+    ('kalisz', u'Kalisz'),
+    ('konin', u'Konin'),
+    ('leszno', u'Leszno'),
+    ('chodzieski', u'chodziejski'),
+    ('czarnkowsko-trzcianecki', u'czarnkowsko-trzcianecki'),
+    ('gnieznienski', u'gnieźnieński'),
+    ('gostynski', u'gostyński'),
+    ('grodziski', u'grodziski'),
+    ('jarocinski', u'jarociński'),
+    ('kaliski', u'kaliski'),
+    ('kepinski', u'kępiński'),
+    ('kolski', u'kolski'),
+    ('koninski', u'koniński'),
+    ('koscianski', u'kościański'),
+    ('krotoszynski', u'krotoszyński'),
+    ('leszczynski', u'leszczyński'),
+    ('miedzychodzki', u'międzychodzki'),
+    ('nowotomyski', u'nowotomyski'),
+    ('obornicki', u'obornicki'),
+    ('ostrowski', u'ostrowski'),
+    ('ostrzeszowski', u'ostrzeszowski'),
+    ('pilski', u'pilski'),
+    ('pleszewski', u'pleszewski'),
+    ('poznanski', u'poznański'),
+    ('rawicki', u'rawicki'),
+    ('slupecki', u'słupecki'),
+    ('szamotulski', u'szamotulski'),
+    ('sredzki', u'średzki'),
+    ('sremski', u'śremski'),
+    ('turecki', u'turecki'),
+    ('wagrowiecki', u'wągrowiecki'),
+    ('wolsztynski', u'wolsztyński'),
+    ('wrzesinski', u'wrzesiński'),
+    ('zlotowski', u'złotowski'),
+    ('bialogardzki', u'białogardzki'),
+    ('choszczenski', u'choszczeński'),
+    ('drawski', u'drawski'),
+    ('goleniowski', u'goleniowski'),
+    ('gryficki', u'gryficki'),
+    ('gryfinski', u'gryfiński'),
+    ('kamienski', u'kamieński'),
+    ('kolobrzeski', u'kołobrzeski'),
+    ('koszalinski', u'koszaliński'),
+    ('lobeski', u'łobeski'),
+    ('mysliborski', u'myśliborski'),
+    ('policki', u'policki'),
+    ('pyrzycki', u'pyrzycki'),
+    ('slawienski', u'sławieński'),
+    ('stargardzki', u'stargardzki'),
+    ('szczecinecki', u'szczecinecki'),
+    ('swidwinski', u'świdwiński'),
+    ('walecki', u'wałecki'),
+)
+
diff --git a/webapp/django/contrib/localflavor/pl/pl_voivodeships.py b/webapp/django/contrib/localflavor/pl/pl_voivodeships.py
new file mode 100644
index 0000000..d8caede
--- /dev/null
+++ b/webapp/django/contrib/localflavor/pl/pl_voivodeships.py
@@ -0,0 +1,24 @@
+"""
+Polish voivodeship as in http://en.wikipedia.org/wiki/Poland#Administrative_division
+"""
+
+from django.utils.translation import ugettext_lazy as _
+
+VOIVODESHIP_CHOICES = (
+    ('lower_silesia', _('Lower Silesia')),
+    ('kuyavia-pomerania', _('Kuyavia-Pomerania')),
+    ('lublin', _('Lublin')),
+    ('lubusz', _('Lubusz')),
+    ('lodz', _('Lodz')),
+    ('lesser_poland', _('Lesser Poland')),
+    ('masovia', _('Masovia')),
+    ('opole', _('Opole')),
+    ('subcarpatia', _('Subcarpatia')),
+    ('podlasie', _('Podlasie')),
+    ('pomerania', _('Pomerania')),
+    ('silesia', _('Silesia')),
+    ('swietokrzyskie', _('Swietokrzyskie')),
+    ('warmia-masuria', _('Warmia-Masuria')),
+    ('greater_poland', _('Greater Poland')),
+    ('west_pomerania', _('West Pomerania')),
+)
diff --git a/webapp/django/contrib/localflavor/ro/__init__.py b/webapp/django/contrib/localflavor/ro/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/localflavor/ro/__init__.py
diff --git a/webapp/django/contrib/localflavor/ro/forms.py b/webapp/django/contrib/localflavor/ro/forms.py
new file mode 100644
index 0000000..ca51d91
--- /dev/null
+++ b/webapp/django/contrib/localflavor/ro/forms.py
@@ -0,0 +1,200 @@
+# -*- coding: utf-8 -*-
+"""
+Romanian specific form helpers.
+"""
+
+import re
+
+from django.forms import ValidationError, Field, RegexField, Select
+from django.forms.fields import EMPTY_VALUES
+from django.utils.translation import ugettext_lazy as _
+
+class ROCIFField(RegexField):
+    """
+    A Romanian fiscal identity code (CIF) field
+
+    For CIF validation algorithm see http://www.validari.ro/cui.html
+    """
+    default_error_messages = {
+        'invalid': _("Enter a valid CIF."),
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(ROCIFField, self).__init__(r'^[0-9]{2,10}', max_length=10,
+                min_length=2, *args, **kwargs)
+
+    def clean(self, value):
+        """
+        CIF validation
+        """
+        value = super(ROCIFField, self).clean(value)
+        if value in EMPTY_VALUES:
+            return u''
+        # strip RO part
+        if value[0:2] == 'RO':
+            value = value[2:]
+        key = '753217532'[::-1]
+        value = value[::-1]
+        key_iter = iter(key)
+        checksum = 0
+        for digit in value[1:]:
+            checksum += int(digit) * int(key_iter.next())
+        checksum = checksum * 10 % 11
+        if checksum == 10:
+            checksum = 0
+        if checksum != int(value[0]):
+            raise ValidationError(self.error_messages['invalid'])
+        return value[::-1]
+
+class ROCNPField(RegexField):
+    """
+    A Romanian personal identity code (CNP) field
+
+    For CNP validation algorithm see http://www.validari.ro/cnp.html
+    """
+    default_error_messages = {
+        'invalid': _("Enter a valid CNP."),
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(ROCNPField, self).__init__(r'^[1-9][0-9]{12}', max_length=13,
+            min_length=13, *args, **kwargs)
+
+    def clean(self, value):
+        """
+        CNP validations
+        """
+        value = super(ROCNPField, self).clean(value)
+        # check birthdate digits
+        import datetime
+        try:
+            datetime.date(int(value[1:3]),int(value[3:5]),int(value[5:7]))
+        except:
+            raise ValidationError(self.error_messages['invalid'])
+        # checksum
+        key = '279146358279'
+        checksum = 0
+        value_iter = iter(value)
+        for digit in key:
+            checksum += int(digit) * int(value_iter.next())
+        checksum %= 11
+        if checksum == 10:
+            checksum = 1
+        if checksum != int(value[12]):
+            raise ValidationError(self.error_messages['invalid'])
+        return value
+
+class ROCountyField(Field):
+    """
+    A form field that validates its input is a Romanian county name or
+    abbreviation. It normalizes the input to the standard vehicle registration
+    abbreviation for the given county
+
+    WARNING: This field will only accept names written with diacritics; consider
+    using ROCountySelect if this behavior is unnaceptable for you
+    Example:
+        Argeş => valid
+        Arges => invalid
+    """
+    default_error_messages = {
+        'invalid': u'Enter a Romanian county code or name.',
+    }
+
+    def clean(self, value):
+        from ro_counties import COUNTIES_CHOICES
+        super(ROCountyField, self).clean(value)
+        if value in EMPTY_VALUES:
+            return u''
+        try:
+            value = value.strip().upper()
+        except AttributeError:
+            pass
+        # search for county code
+        for entry in COUNTIES_CHOICES:
+            if value in entry:
+                return value
+        # search for county name
+        normalized_CC = []
+        for entry in COUNTIES_CHOICES:
+            normalized_CC.append((entry[0],entry[1].upper()))
+        for entry in normalized_CC:
+            if entry[1] == value:
+                return entry[0]
+        raise ValidationError(self.error_messages['invalid'])
+
+class ROCountySelect(Select):
+    """
+    A Select widget that uses a list of Romanian counties (judete) as its
+    choices.
+    """
+    def __init__(self, attrs=None):
+        from ro_counties import COUNTIES_CHOICES
+        super(ROCountySelect, self).__init__(attrs, choices=COUNTIES_CHOICES)
+
+class ROIBANField(RegexField):
+    """
+    Romanian International Bank Account Number (IBAN) field
+
+    For Romanian IBAN validation algorithm see http://validari.ro/iban.html
+    """
+    default_error_messages = {
+        'invalid': _('Enter a valid IBAN in ROXX-XXXX-XXXX-XXXX-XXXX-XXXX format'),
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(ROIBANField, self).__init__(r'^[0-9A-Za-z\-\s]{24,40}$',
+                max_length=40, min_length=24, *args, **kwargs)
+
+    def clean(self, value):
+        """
+        Strips - and spaces, performs country code and checksum validation
+        """
+        value = super(ROIBANField, self).clean(value)
+        value = value.replace('-','')
+        value = value.replace(' ','')
+        value = value.upper()
+        if value[0:2] != 'RO':
+            raise ValidationError(self.error_messages['invalid'])
+        numeric_format = ''
+        for char in value[4:] + value[0:4]:
+            if char.isalpha():
+                numeric_format += str(ord(char) - 55)
+            else:
+                numeric_format += char
+        if int(numeric_format) % 97 != 1:
+            raise ValidationError(self.error_messages['invalid'])
+        return value
+
+class ROPhoneNumberField(RegexField):
+    """Romanian phone number field"""
+    default_error_messages = {
+        'invalid': _('Phone numbers must be in XXXX-XXXXXX format.'),
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(ROPhoneNumberField, self).__init__(r'^[0-9\-\(\)\s]{10,20}$',
+                max_length=20, min_length=10, *args, **kwargs)
+
+    def clean(self, value):
+        """
+        Strips -, (, ) and spaces. Checks the final length.
+        """
+        value = super(ROPhoneNumberField, self).clean(value)
+        value = value.replace('-','')
+        value = value.replace('(','')
+        value = value.replace(')','')
+        value = value.replace(' ','')
+        if len(value) != 10:
+            raise ValidationError(self.error_messages['invalid'])
+        return value
+
+class ROPostalCodeField(RegexField):
+    """Romanian postal code field."""
+    default_error_messages = {
+        'invalid': _('Enter a valid postal code in the format XXXXXX'),
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(ROPostalCodeField, self).__init__(r'^[0-9][0-8][0-9]{4}$',
+                max_length=6, min_length=6, *args, **kwargs)
+
diff --git a/webapp/django/contrib/localflavor/ro/ro_counties.py b/webapp/django/contrib/localflavor/ro/ro_counties.py
new file mode 100644
index 0000000..40423dd
--- /dev/null
+++ b/webapp/django/contrib/localflavor/ro/ro_counties.py
@@ -0,0 +1,52 @@
+# -*- coding: utf-8 -*-
+"""
+A list of Romanian counties as `choices` in a formfield.
+
+This exists as a standalone file so that it's only imported into memory when
+explicitly needed.
+"""
+
+COUNTIES_CHOICES = (
+    ('AB', u'Alba'),
+    ('AR', u'Arad'),
+    ('AG', u'Argeş'),
+    ('BC', u'Bacău'),
+    ('BH', u'Bihor'),
+    ('BN', u'Bistriţa-Năsăud'),
+    ('BT', u'Botoşani'),
+    ('BV', u'Braşov'),
+    ('BR', u'Brăila'),
+    ('B',  u'Bucureşti'),
+    ('BZ', u'Buzău'),
+    ('CS', u'Caraş-Severin'),
+    ('CL', u'Călăraşi'),
+    ('CJ', u'Cluj'),
+    ('CT', u'Constanţa'),
+    ('CV', u'Covasna'),
+    ('DB', u'Dâmboviţa'),
+    ('DJ', u'Dolj'),
+    ('GL', u'Galaţi'),
+    ('GR', u'Giurgiu'),
+    ('GJ', u'Gorj'),
+    ('HR', u'Harghita'),
+    ('HD', u'Hunedoara'),
+    ('IL', u'Ialomiţa'),
+    ('IS', u'Iaşi'),
+    ('IF', u'Ilfov'),
+    ('MM', u'Maramureş'),
+    ('MH', u'Mehedinţi'),
+    ('MS', u'Mureş'),
+    ('NT', u'Neamţ'),
+    ('OT', u'Olt'),
+    ('PH', u'Prahova'),
+    ('SM', u'Satu Mare'),
+    ('SJ', u'Sălaj'),
+    ('SB', u'Sibiu'),
+    ('SV', u'Suceava'),
+    ('TR', u'Teleorman'),
+    ('TM', u'Timiş'),
+    ('TL', u'Tulcea'),
+    ('VS', u'Vaslui'),
+    ('VL', u'Vâlcea'),
+    ('VN', u'Vrancea'),
+)
diff --git a/webapp/django/contrib/localflavor/sk/__init__.py b/webapp/django/contrib/localflavor/sk/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/localflavor/sk/__init__.py
diff --git a/webapp/django/contrib/localflavor/sk/forms.py b/webapp/django/contrib/localflavor/sk/forms.py
new file mode 100644
index 0000000..863a612
--- /dev/null
+++ b/webapp/django/contrib/localflavor/sk/forms.py
@@ -0,0 +1,43 @@
+"""
+Slovak-specific form helpers
+"""
+
+from django.forms.fields import Select, RegexField
+from django.utils.translation import ugettext_lazy as _
+
+class SKRegionSelect(Select):
+    """
+    A select widget widget with list of Slovak regions as choices.
+    """
+    def __init__(self, attrs=None):
+        from sk_regions import REGION_CHOICES
+        super(SKRegionSelect, self).__init__(attrs, choices=REGION_CHOICES)
+
+class SKDistrictSelect(Select):
+    """
+    A select widget with list of Slovak districts as choices.
+    """
+    def __init__(self, attrs=None):
+        from sk_districts import DISTRICT_CHOICES
+        super(SKDistrictSelect, self).__init__(attrs, choices=DISTRICT_CHOICES)
+
+class SKPostalCodeField(RegexField):
+    """
+    A form field that validates its input as Slovak postal code.
+    Valid form is XXXXX or XXX XX, where X represents integer.
+    """
+    default_error_messages = {
+        'invalid': _(u'Enter a postal code in the format XXXXX or XXX XX.'),
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(SKPostalCodeField, self).__init__(r'^\d{5}$|^\d{3} \d{2}$',
+            max_length=None, min_length=None, *args, **kwargs)
+
+    def clean(self, value):
+        """
+        Validates the input and returns a string that contains only numbers.
+        Returns an empty string for empty values.
+        """
+        v = super(SKPostalCodeField, self).clean(value)
+        return v.replace(' ', '')
diff --git a/webapp/django/contrib/localflavor/sk/sk_districts.py b/webapp/django/contrib/localflavor/sk/sk_districts.py
new file mode 100644
index 0000000..95e8796
--- /dev/null
+++ b/webapp/django/contrib/localflavor/sk/sk_districts.py
@@ -0,0 +1,87 @@
+"""
+Slovak districts according to http://sk.wikipedia.org/wiki/Administrat%C3%ADvne_%C4%8Dlenenie_Slovenska
+"""
+
+from django.utils.translation import ugettext_lazy as _
+
+DISTRICT_CHOICES = (
+    ('BB', _('Banska Bystrica')),
+    ('BS', _('Banska Stiavnica')),
+    ('BJ', _('Bardejov')),
+    ('BN', _('Banovce nad Bebravou')),
+    ('BR', _('Brezno')),
+    ('BA1', _('Bratislava I')),
+    ('BA2', _('Bratislava II')),
+    ('BA3', _('Bratislava III')),
+    ('BA4', _('Bratislava IV')),
+    ('BA5', _('Bratislava V')),
+    ('BY', _('Bytca')),
+    ('CA', _('Cadca')),
+    ('DT', _('Detva')),
+    ('DK', _('Dolny Kubin')),
+    ('DS', _('Dunajska Streda')),
+    ('GA', _('Galanta')),
+    ('GL', _('Gelnica')),
+    ('HC', _('Hlohovec')),
+    ('HE', _('Humenne')),
+    ('IL', _('Ilava')),
+    ('KK', _('Kezmarok')),
+    ('KN', _('Komarno')),
+    ('KE1', _('Kosice I')),
+    ('KE2', _('Kosice II')),
+    ('KE3', _('Kosice III')),
+    ('KE4', _('Kosice IV')),
+    ('KEO', _('Kosice - okolie')),
+    ('KA', _('Krupina')),
+    ('KM', _('Kysucke Nove Mesto')),
+    ('LV', _('Levice')),
+    ('LE', _('Levoca')),
+    ('LM', _('Liptovsky Mikulas')),
+    ('LC', _('Lucenec')),
+    ('MA', _('Malacky')),
+    ('MT', _('Martin')),
+    ('ML', _('Medzilaborce')),
+    ('MI', _('Michalovce')),
+    ('MY', _('Myjava')),
+    ('NO', _('Namestovo')),
+    ('NR', _('Nitra')),
+    ('NM', _('Nove Mesto nad Vahom')),
+    ('NZ', _('Nove Zamky')),
+    ('PE', _('Partizanske')),
+    ('PK', _('Pezinok')),
+    ('PN', _('Piestany')),
+    ('PT', _('Poltar')),
+    ('PP', _('Poprad')),
+    ('PB', _('Povazska Bystrica')),
+    ('PO', _('Presov')),
+    ('PD', _('Prievidza')),
+    ('PU', _('Puchov')),
+    ('RA', _('Revuca')),
+    ('RS', _('Rimavska Sobota')),
+    ('RV', _('Roznava')),
+    ('RK', _('Ruzomberok')),
+    ('SB', _('Sabinov')),
+    ('SC', _('Senec')),
+    ('SE', _('Senica')),
+    ('SI', _('Skalica')),
+    ('SV', _('Snina')),
+    ('SO', _('Sobrance')),
+    ('SN', _('Spisska Nova Ves')),
+    ('SL', _('Stara Lubovna')),
+    ('SP', _('Stropkov')),
+    ('SK', _('Svidnik')),
+    ('SA', _('Sala')),
+    ('TO', _('Topolcany')),
+    ('TV', _('Trebisov')),
+    ('TN', _('Trencin')),
+    ('TT', _('Trnava')),
+    ('TR', _('Turcianske Teplice')),
+    ('TS', _('Tvrdosin')),
+    ('VK', _('Velky Krtis')),
+    ('VT', _('Vranov nad Toplou')),
+    ('ZM', _('Zlate Moravce')),
+    ('ZV', _('Zvolen')),
+    ('ZC', _('Zarnovica')),
+    ('ZH', _('Ziar nad Hronom')),
+    ('ZA', _('Zilina')),
+)
diff --git a/webapp/django/contrib/localflavor/sk/sk_regions.py b/webapp/django/contrib/localflavor/sk/sk_regions.py
new file mode 100644
index 0000000..66de814
--- /dev/null
+++ b/webapp/django/contrib/localflavor/sk/sk_regions.py
@@ -0,0 +1,16 @@
+"""
+Slovak regions according to http://sk.wikipedia.org/wiki/Administrat%C3%ADvne_%C4%8Dlenenie_Slovenska
+"""
+
+from django.utils.translation import ugettext_lazy as _
+
+REGION_CHOICES = (
+    ('BB', _('Banska Bystrica region')),
+    ('BA', _('Bratislava region')),
+    ('KE', _('Kosice region')),
+    ('NR', _('Nitra region')),
+    ('PO', _('Presov region')),
+    ('TN', _('Trencin region')),
+    ('TT', _('Trnava region')),
+    ('ZA', _('Zilina region')),
+)
diff --git a/webapp/django/contrib/localflavor/uk/__init__.py b/webapp/django/contrib/localflavor/uk/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/localflavor/uk/__init__.py
diff --git a/webapp/django/contrib/localflavor/uk/forms.py b/webapp/django/contrib/localflavor/uk/forms.py
new file mode 100644
index 0000000..7df7364
--- /dev/null
+++ b/webapp/django/contrib/localflavor/uk/forms.py
@@ -0,0 +1,53 @@
+"""
+UK-specific Form helpers
+"""
+
+import re
+
+from django.forms.fields import CharField, Select
+from django.forms import ValidationError
+from django.utils.translation import ugettext_lazy as _
+
+class UKPostcodeField(CharField):
+    """
+    A form field that validates its input is a UK postcode.
+
+    The regular expression used is sourced from the schema for British Standard
+    BS7666 address types: http://www.govtalk.gov.uk/gdsc/schemas/bs7666-v2-0.xsd
+
+    The value is uppercased and a space added in the correct place, if required.
+    """
+    default_error_messages = {
+        'invalid': _(u'Enter a valid postcode.'),
+    }
+    outcode_pattern = '[A-PR-UWYZ]([0-9]{1,2}|([A-HIK-Y][0-9](|[0-9]|[ABEHMNPRVWXY]))|[0-9][A-HJKSTUW])'
+    incode_pattern = '[0-9][ABD-HJLNP-UW-Z]{2}'
+    postcode_regex = re.compile(r'^(GIR 0AA|%s %s)$' % (outcode_pattern, incode_pattern))
+    space_regex = re.compile(r' *(%s)$' % incode_pattern)
+
+    def clean(self, value):
+        value = super(UKPostcodeField, self).clean(value)
+        if value == u'':
+            return value
+        postcode = value.upper().strip()
+        # Put a single space before the incode (second part).
+        postcode = self.space_regex.sub(r' \1', postcode)
+        if not self.postcode_regex.search(postcode):
+            raise ValidationError(self.default_error_messages['invalid'])
+        return postcode
+
+class UKCountySelect(Select):
+    """
+    A Select widget that uses a list of UK Counties/Regions as its choices.
+    """
+    def __init__(self, attrs=None):
+        from uk_regions import UK_REGION_CHOICES
+        super(UKCountySelect, self).__init__(attrs, choices=UK_REGION_CHOICES)
+
+class UKNationSelect(Select):
+    """
+    A Select widget that uses a list of UK Nations as its choices.
+    """
+    def __init__(self, attrs=None):
+        from uk_regions import UK_NATIONS_CHOICES
+        super(UKNationSelect, self).__init__(attrs, choices=UK_NATIONS_CHOICES)
diff --git a/webapp/django/contrib/localflavor/uk/uk_regions.py b/webapp/django/contrib/localflavor/uk/uk_regions.py
new file mode 100644
index 0000000..dd92f5e
--- /dev/null
+++ b/webapp/django/contrib/localflavor/uk/uk_regions.py
@@ -0,0 +1,97 @@
+"""
+Sources:
+    English regions: http://www.statistics.gov.uk/geography/downloads/31_10_01_REGION_names_and_codes_12_00.xls
+    Northern Ireland regions: http://en.wikipedia.org/wiki/List_of_Irish_counties_by_area
+    Welsh regions: http://en.wikipedia.org/wiki/Preserved_counties_of_Wales
+    Scottish regions: http://en.wikipedia.org/wiki/Regions_and_districts_of_Scotland
+"""
+from django.utils.translation import ugettext_lazy as _
+
+ENGLAND_REGION_CHOICES = (
+    ("Bedfordshire", _("Bedfordshire")),
+    ("Buckinghamshire", _("Buckinghamshire")),
+    ("Cambridgeshire", ("Cambridgeshire")),
+    ("Cheshire", _("Cheshire")),
+    ("Cornwall and Isles of Scilly", _("Cornwall and Isles of Scilly")),
+    ("Cumbria", _("Cumbria")),
+    ("Derbyshire", _("Derbyshire")),
+    ("Devon", _("Devon")),
+    ("Dorset", _("Dorset")),
+    ("Durham", _("Durham")),
+    ("East Sussex", _("East Sussex")),
+    ("Essex", _("Essex")),
+    ("Gloucestershire", _("Gloucestershire")),
+    ("Greater London", _("Greater London")),
+    ("Greater Manchester", _("Greater Manchester")),
+    ("Hampshire", _("Hampshire")),
+    ("Hertfordshire", _("Hertfordshire")),
+    ("Kent", _("Kent")),
+    ("Lancashire", _("Lancashire")),
+    ("Leicestershire", _("Leicestershire")),
+    ("Lincolnshire", _("Lincolnshire")),
+    ("Merseyside", _("Merseyside")),
+    ("Norfolk", _("Norfolk")),
+    ("North Yorkshire", _("North Yorkshire")),
+    ("Northamptonshire", _("Northamptonshire")),
+    ("Northumberland", _("Northumberland")),
+    ("Nottinghamshire", _("Nottinghamshire")),
+    ("Oxfordshire", _("Oxfordshire")),
+    ("Shropshire", _("Shropshire")),
+    ("Somerset", _("Somerset")),
+    ("South Yorkshire", _("South Yorkshire")),
+    ("Staffordshire", _("Staffordshire")),
+    ("Suffolk", _("Suffolk")),
+    ("Surrey", _("Surrey")),
+    ("Tyne and Wear", _("Tyne and Wear")),
+    ("Warwickshire", _("Warwickshire")),
+    ("West Midlands", _("West Midlands")),
+    ("West Sussex", _("West Sussex")),
+    ("West Yorkshire", _("West Yorkshire")),
+    ("Wiltshire", _("Wiltshire")),
+    ("Worcestershire", _("Worcestershire")),
+)
+
+NORTHERN_IRELAND_REGION_CHOICES = (
+    ("County Antrim", _("County Antrim")),
+    ("County Armagh", _("County Armagh")),
+    ("County Down", _("County Down")),
+    ("County Fermanagh", _("County Fermanagh")),
+    ("County Londonderry", _("County Londonderry")),
+    ("County Tyrone", _("County Tyrone")),
+)
+
+WALES_REGION_CHOICES = (
+    ("Clwyd", _("Clwyd")),
+    ("Dyfed", _("Dyfed")),
+    ("Gwent", _("Gwent")),
+    ("Gwynedd", _("Gwynedd")),
+    ("Mid Glamorgan", _("Mid Glamorgan")),
+    ("Powys", _("Powys")),
+    ("South Glamorgan", _("South Glamorgan")),
+    ("West Glamorgan", _("West Glamorgan")),
+)
+
+SCOTTISH_REGION_CHOICES = (
+    ("Borders", _("Borders")),
+    ("Central Scotland", _("Central Scotland")),
+    ("Dumfries and Galloway", _("Dumfries and Galloway")),
+    ("Fife", _("Fife")),
+    ("Grampian", _("Grampian")),
+    ("Highland", _("Highland")),
+    ("Lothian", _("Lothian")),
+    ("Orkney Islands", _("Orkney Islands")),
+    ("Shetland Islands", _("Shetland Islands")),
+    ("Strathclyde", _("Strathclyde")),
+    ("Tayside", _("Tayside")),
+    ("Western Isles", _("Western Isles")),
+)
+
+UK_NATIONS_CHOICES = (
+    ("England", _("England")),
+    ("Northern Ireland", _("Northern Ireland")),
+    ("Scotland", _("Scotland")),
+    ("Wales", _("Wales")),
+)
+
+UK_REGION_CHOICES = ENGLAND_REGION_CHOICES + NORTHERN_IRELAND_REGION_CHOICES + WALES_REGION_CHOICES + SCOTTISH_REGION_CHOICES
+
diff --git a/webapp/django/contrib/localflavor/us/__init__.py b/webapp/django/contrib/localflavor/us/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/localflavor/us/__init__.py
diff --git a/webapp/django/contrib/localflavor/us/forms.py b/webapp/django/contrib/localflavor/us/forms.py
new file mode 100644
index 0000000..a744edc
--- /dev/null
+++ b/webapp/django/contrib/localflavor/us/forms.py
@@ -0,0 +1,112 @@
+"""
+USA-specific Form helpers
+"""
+
+from django.forms import ValidationError
+from django.forms.fields import Field, RegexField, Select, EMPTY_VALUES
+from django.utils.encoding import smart_unicode
+from django.utils.translation import ugettext_lazy as _
+import re
+
+phone_digits_re = re.compile(r'^(?:1-?)?(\d{3})[-\.]?(\d{3})[-\.]?(\d{4})$')
+ssn_re = re.compile(r"^(?P<area>\d{3})[-\ ]?(?P<group>\d{2})[-\ ]?(?P<serial>\d{4})$")
+
+class USZipCodeField(RegexField):
+    default_error_messages = {
+        'invalid': _('Enter a zip code in the format XXXXX or XXXXX-XXXX.'),
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(USZipCodeField, self).__init__(r'^\d{5}(?:-\d{4})?$',
+            max_length=None, min_length=None, *args, **kwargs)
+
+class USPhoneNumberField(Field):
+    default_error_messages = {
+        'invalid': u'Phone numbers must be in XXX-XXX-XXXX format.',
+    }
+
+    def clean(self, value):
+        super(USPhoneNumberField, self).clean(value)
+        if value in EMPTY_VALUES:
+            return u''
+        value = re.sub('(\(|\)|\s+)', '', smart_unicode(value))
+        m = phone_digits_re.search(value)
+        if m:
+            return u'%s-%s-%s' % (m.group(1), m.group(2), m.group(3))
+        raise ValidationError(self.error_messages['invalid'])
+
+class USSocialSecurityNumberField(Field):
+    """
+    A United States Social Security number.
+
+    Checks the following rules to determine whether the number is valid:
+
+        * Conforms to the XXX-XX-XXXX format.
+        * No group consists entirely of zeroes.
+        * The leading group is not "666" (block "666" will never be allocated).
+        * The number is not in the promotional block 987-65-4320 through
+          987-65-4329, which are permanently invalid.
+        * The number is not one known to be invalid due to otherwise widespread
+          promotional use or distribution (e.g., the Woolworth's number or the
+          1962 promotional number).
+    """
+    default_error_messages = {
+        'invalid': _('Enter a valid U.S. Social Security number in XXX-XX-XXXX format.'),
+    }
+
+    def clean(self, value):
+        super(USSocialSecurityNumberField, self).clean(value)
+        if value in EMPTY_VALUES:
+            return u''
+        match = re.match(ssn_re, value)
+        if not match:
+            raise ValidationError(self.error_messages['invalid'])
+        area, group, serial = match.groupdict()['area'], match.groupdict()['group'], match.groupdict()['serial']
+
+        # First pass: no blocks of all zeroes.
+        if area == '000' or \
+           group == '00' or \
+           serial == '0000':
+            raise ValidationError(self.error_messages['invalid'])
+
+        # Second pass: promotional and otherwise permanently invalid numbers.
+        if area == '666' or \
+           (area == '987' and group == '65' and 4320 <= int(serial) <= 4329) or \
+           value == '078-05-1120' or \
+           value == '219-09-9999':
+            raise ValidationError(self.error_messages['invalid'])
+        return u'%s-%s-%s' % (area, group, serial)
+
+class USStateField(Field):
+    """
+    A form field that validates its input is a U.S. state name or abbreviation.
+    It normalizes the input to the standard two-leter postal service
+    abbreviation for the given state.
+    """
+    default_error_messages = {
+        'invalid': u'Enter a U.S. state or territory.',
+    }
+
+    def clean(self, value):
+        from us_states import STATES_NORMALIZED
+        super(USStateField, self).clean(value)
+        if value in EMPTY_VALUES:
+            return u''
+        try:
+            value = value.strip().lower()
+        except AttributeError:
+            pass
+        else:
+            try:
+                return STATES_NORMALIZED[value.strip().lower()].decode('ascii')
+            except KeyError:
+                pass
+        raise ValidationError(self.error_messages['invalid'])
+
+class USStateSelect(Select):
+    """
+    A Select widget that uses a list of U.S. states/territories as its choices.
+    """
+    def __init__(self, attrs=None):
+        from us_states import STATE_CHOICES
+        super(USStateSelect, self).__init__(attrs, choices=STATE_CHOICES)
diff --git a/webapp/django/contrib/localflavor/us/us_states.py b/webapp/django/contrib/localflavor/us/us_states.py
new file mode 100644
index 0000000..c84facc
--- /dev/null
+++ b/webapp/django/contrib/localflavor/us/us_states.py
@@ -0,0 +1,240 @@
+"""
+A mapping of state misspellings/abbreviations to normalized abbreviations, and
+an alphabetical list of states for use as `choices` in a formfield.
+
+This exists in this standalone file so that it's only imported into memory
+when explicitly needed.
+"""
+
+STATE_CHOICES = (
+    ('AL', 'Alabama'),
+    ('AK', 'Alaska'),
+    ('AS', 'American Samoa'),
+    ('AZ', 'Arizona'),
+    ('AR', 'Arkansas'),
+    ('CA', 'California'),
+    ('CO', 'Colorado'),
+    ('CT', 'Connecticut'),
+    ('DE', 'Delaware'),
+    ('DC', 'District of Columbia'),
+    ('FM', 'Federated States of Micronesia'),
+    ('FL', 'Florida'),
+    ('GA', 'Georgia'),
+    ('GU', 'Guam'),
+    ('HI', 'Hawaii'),
+    ('ID', 'Idaho'),
+    ('IL', 'Illinois'),
+    ('IN', 'Indiana'),
+    ('IA', 'Iowa'),
+    ('KS', 'Kansas'),
+    ('KY', 'Kentucky'),
+    ('LA', 'Louisiana'),
+    ('ME', 'Maine'),
+    ('MH', 'Marshall Islands'),
+    ('MD', 'Maryland'),
+    ('MA', 'Massachusetts'),
+    ('MI', 'Michigan'),
+    ('MN', 'Minnesota'),
+    ('MS', 'Mississippi'),
+    ('MO', 'Missouri'),
+    ('MT', 'Montana'),
+    ('NE', 'Nebraska'),
+    ('NV', 'Nevada'),
+    ('NH', 'New Hampshire'),
+    ('NJ', 'New Jersey'),
+    ('NM', 'New Mexico'),
+    ('NY', 'New York'),
+    ('NC', 'North Carolina'),
+    ('ND', 'North Dakota'),
+    ('MP', 'Northern Mariana Islands'),
+    ('OH', 'Ohio'),
+    ('OK', 'Oklahoma'),
+    ('OR', 'Oregon'),
+    ('PW', 'Palau'),
+    ('PA', 'Pennsylvania'),
+    ('PR', 'Puerto Rico'),
+    ('RI', 'Rhode Island'),
+    ('SC', 'South Carolina'),
+    ('SD', 'South Dakota'),
+    ('TN', 'Tennessee'),
+    ('TX', 'Texas'),
+    ('UT', 'Utah'),
+    ('VT', 'Vermont'),
+    ('VI', 'Virgin Islands'),
+    ('VA', 'Virginia'),
+    ('WA', 'Washington'),
+    ('WV', 'West Virginia'),
+    ('WI', 'Wisconsin'),
+    ('WY', 'Wyoming'),
+)
+
+STATES_NORMALIZED = {
+    'ak': 'AK',
+    'al': 'AL',
+    'ala': 'AL',
+    'alabama': 'AL',
+    'alaska': 'AK',
+    'american samao': 'AS',
+    'american samoa': 'AS',
+    'ar': 'AR',
+    'ariz': 'AZ',
+    'arizona': 'AZ',
+    'ark': 'AR',
+    'arkansas': 'AR',
+    'as': 'AS',
+    'az': 'AZ',
+    'ca': 'CA',
+    'calf': 'CA',
+    'calif': 'CA',
+    'california': 'CA',
+    'co': 'CO',
+    'colo': 'CO',
+    'colorado': 'CO',
+    'conn': 'CT',
+    'connecticut': 'CT',
+    'ct': 'CT',
+    'dc': 'DC',
+    'de': 'DE',
+    'del': 'DE',
+    'delaware': 'DE',
+    'deleware': 'DE',
+    'district of columbia': 'DC',
+    'federated states of micronesia': 'FM',
+    'fl': 'FL',
+    'fla': 'FL',
+    'florida': 'FL',
+    'fm': 'FM',
+    'ga': 'GA',
+    'georgia': 'GA',
+    'gu': 'GU',
+    'guam': 'GU',
+    'hawaii': 'HI',
+    'hi': 'HI',
+    'ia': 'IA',
+    'id': 'ID',
+    'idaho': 'ID',
+    'il': 'IL',
+    'ill': 'IL',
+    'illinois': 'IL',
+    'in': 'IN',
+    'ind': 'IN',
+    'indiana': 'IN',
+    'iowa': 'IA',
+    'kan': 'KS',
+    'kans': 'KS',
+    'kansas': 'KS',
+    'kentucky': 'KY',
+    'ks': 'KS',
+    'ky': 'KY',
+    'la': 'LA',
+    'louisiana': 'LA',
+    'ma': 'MA',
+    'maine': 'ME',
+    'marianas islands': 'MP',
+    'marianas islands of the pacific': 'MP',
+    'marinas islands of the pacific': 'MP',
+    'maryland': 'MD',
+    'mass': 'MA',
+    'massachusetts': 'MA',
+    'massachussetts': 'MA',
+    'md': 'MD',
+    'me': 'ME',
+    'mi': 'MI',
+    'mich': 'MI',
+    'michigan': 'MI',
+    'micronesia': 'FM',
+    'minn': 'MN',
+    'minnesota': 'MN',
+    'miss': 'MS',
+    'mississippi': 'MS',
+    'missouri': 'MO',
+    'mn': 'MN',
+    'mo': 'MO',
+    'mont': 'MT',
+    'montana': 'MT',
+    'mp': 'MP',
+    'ms': 'MS',
+    'mt': 'MT',
+    'n d': 'ND',
+    'n dak': 'ND',
+    'n h': 'NH',
+    'n j': 'NJ',
+    'n m': 'NM',
+    'n mex': 'NM',
+    'nc': 'NC',
+    'nd': 'ND',
+    'ne': 'NE',
+    'neb': 'NE',
+    'nebr': 'NE',
+    'nebraska': 'NE',
+    'nev': 'NV',
+    'nevada': 'NV',
+    'new hampshire': 'NH',
+    'new jersey': 'NJ',
+    'new mexico': 'NM',
+    'new york': 'NY',
+    'nh': 'NH',
+    'nj': 'NJ',
+    'nm': 'NM',
+    'nmex': 'NM',
+    'north carolina': 'NC',
+    'north dakota': 'ND',
+    'northern mariana islands': 'MP',
+    'nv': 'NV',
+    'ny': 'NY',
+    'oh': 'OH',
+    'ohio': 'OH',
+    'ok': 'OK',
+    'okla': 'OK',
+    'oklahoma': 'OK',
+    'or': 'OR',
+    'ore': 'OR',
+    'oreg': 'OR',
+    'oregon': 'OR',
+    'pa': 'PA',
+    'penn': 'PA',
+    'pennsylvania': 'PA',
+    'pr': 'PR',
+    'puerto rico': 'PR',
+    'rhode island': 'RI',
+    'ri': 'RI',
+    's dak': 'SD',
+    'sc': 'SC',
+    'sd': 'SD',
+    'sdak': 'SD',
+    'south carolina': 'SC',
+    'south dakota': 'SD',
+    'tenn': 'TN',
+    'tennessee': 'TN',
+    'territory of hawaii': 'HI',
+    'tex': 'TX',
+    'texas': 'TX',
+    'tn': 'TN',
+    'tx': 'TX',
+    'us virgin islands': 'VI',
+    'usvi': 'VI',
+    'ut': 'UT',
+    'utah': 'UT',
+    'va': 'VA',
+    'vermont': 'VT',
+    'vi': 'VI',
+    'viginia': 'VA',
+    'virgin islands': 'VI',
+    'virgina': 'VA',
+    'virginia': 'VA',
+    'vt': 'VT',
+    'w va': 'WV',
+    'wa': 'WA',
+    'wash': 'WA',
+    'washington': 'WA',
+    'west virginia': 'WV',
+    'wi': 'WI',
+    'wis': 'WI',
+    'wisc': 'WI',
+    'wisconsin': 'WI',
+    'wv': 'WV',
+    'wva': 'WV',
+    'wy': 'WY',
+    'wyo': 'WY',
+    'wyoming': 'WY',
+}
diff --git a/webapp/django/contrib/localflavor/za/__init__.py b/webapp/django/contrib/localflavor/za/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/localflavor/za/__init__.py
diff --git a/webapp/django/contrib/localflavor/za/forms.py b/webapp/django/contrib/localflavor/za/forms.py
new file mode 100644
index 0000000..7b7b714
--- /dev/null
+++ b/webapp/django/contrib/localflavor/za/forms.py
@@ -0,0 +1,59 @@
+"""
+South Africa-specific Form helpers
+"""
+
+from django.forms import ValidationError
+from django.forms.fields import Field, RegexField, EMPTY_VALUES
+from django.utils.checksums import luhn
+from django.utils.translation import gettext as _
+import re
+from datetime import date
+
+id_re = re.compile(r'^(?P<yy>\d\d)(?P<mm>\d\d)(?P<dd>\d\d)(?P<mid>\d{4})(?P<end>\d{3})')
+
+class ZAIDField(Field):
+    """A form field for South African ID numbers -- the checksum is validated
+    using the Luhn checksum, and uses a simlistic (read: not entirely accurate)
+    check for the birthdate
+    """
+    default_error_messages = {
+        'invalid': _(u'Enter a valid South African ID number'),
+    }
+
+    def clean(self, value):
+        # strip spaces and dashes
+        value = value.strip().replace(' ', '').replace('-', '')
+
+        super(ZAIDField, self).clean(value)
+
+        if value in EMPTY_VALUES:
+            return u''
+
+        match = re.match(id_re, value)
+
+        if not match:
+            raise ValidationError(self.error_messages['invalid'])
+
+        g = match.groupdict()
+
+        try:
+            # The year 2000 is conveniently a leapyear.
+            # This algorithm will break in xx00 years which aren't leap years
+            # There is no way to guess the century of a ZA ID number
+            d = date(int(g['yy']) + 2000, int(g['mm']), int(g['dd']))
+        except ValueError:
+            raise ValidationError(self.error_messages['invalid'])
+
+        if not luhn(value):
+            raise ValidationError(self.error_messages['invalid'])
+
+        return value
+
+class ZAPostCodeField(RegexField):
+    default_error_messages = {
+        'invalid': _(u'Enter a valid South African postal code'),
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(ZAPostCodeField, self).__init__(r'^\d{4}$',
+            max_length=None, min_length=None)
diff --git a/webapp/django/contrib/localflavor/za/za_provinces.py b/webapp/django/contrib/localflavor/za/za_provinces.py
new file mode 100644
index 0000000..0bc6fe1
--- /dev/null
+++ b/webapp/django/contrib/localflavor/za/za_provinces.py
@@ -0,0 +1,13 @@
+from django.utils.translation import gettext_lazy as _
+
+PROVINCE_CHOICES = (
+    ('EC', _('Eastern Cape')),
+    ('FS', _('Free State')),
+    ('GP', _('Gauteng')),
+    ('KN', _('KwaZulu-Natal')),
+    ('LP', _('Limpopo')),
+    ('MP', _('Mpumalanga')),
+    ('NC', _('Northern Cape')),
+    ('NW', _('North West')),
+    ('WC', _('Western Cape')),
+)
diff --git a/webapp/django/contrib/markup/__init__.py b/webapp/django/contrib/markup/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/markup/__init__.py
diff --git a/webapp/django/contrib/markup/models.py b/webapp/django/contrib/markup/models.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/markup/models.py
diff --git a/webapp/django/contrib/markup/templatetags/__init__.py b/webapp/django/contrib/markup/templatetags/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/markup/templatetags/__init__.py
diff --git a/webapp/django/contrib/markup/templatetags/markup.py b/webapp/django/contrib/markup/templatetags/markup.py
new file mode 100644
index 0000000..982620b
--- /dev/null
+++ b/webapp/django/contrib/markup/templatetags/markup.py
@@ -0,0 +1,94 @@
+"""
+Set of "markup" template filters for Django.  These filters transform plain text
+markup syntaxes to HTML; currently there is support for:
+
+    * Textile, which requires the PyTextile library available at
+      http://dealmeida.net/projects/textile/
+
+    * Markdown, which requires the Python-markdown library from
+      http://www.freewisdom.org/projects/python-markdown
+
+    * ReStructuredText, which requires docutils from http://docutils.sf.net/
+
+In each case, if the required library is not installed, the filter will
+silently fail and return the un-marked-up text.
+"""
+
+from django import template
+from django.conf import settings
+from django.utils.encoding import smart_str, force_unicode
+from django.utils.safestring import mark_safe
+
+register = template.Library()
+
+def textile(value):
+    try:
+        import textile
+    except ImportError:
+        if settings.DEBUG:
+            raise template.TemplateSyntaxError, "Error in {% textile %} filter: The Python textile library isn't installed."
+        return force_unicode(value)
+    else:
+        return mark_safe(force_unicode(textile.textile(smart_str(value), encoding='utf-8', output='utf-8')))
+textile.is_safe = True
+
+def markdown(value, arg=''):
+    """
+    Runs Markdown over a given value, optionally using various
+    extensions python-markdown supports.
+
+    Syntax::
+
+        {{ value|markdown:"extension1_name,extension2_name..." }}
+
+    To enable safe mode, which strips raw HTML and only returns HTML
+    generated by actual Markdown syntax, pass "safe" as the first
+    extension in the list.
+
+    If the version of Markdown in use does not support extensions,
+    they will be silently ignored.
+
+    """
+    try:
+        import markdown
+    except ImportError:
+        if settings.DEBUG:
+            raise template.TemplateSyntaxError, "Error in {% markdown %} filter: The Python markdown library isn't installed."
+        return force_unicode(value)
+    else:
+        # markdown.version was first added in 1.6b. The only version of markdown
+        # to fully support extensions before 1.6b was the shortlived 1.6a.
+        if hasattr(markdown, 'version'):
+            extensions = [e for e in arg.split(",") if e]
+            if len(extensions) > 0 and extensions[0] == "safe":
+                extensions = extensions[1:]
+                safe_mode = True
+            else:
+                safe_mode = False
+
+            # Unicode support only in markdown v1.7 or above. Version_info
+            # exist only in markdown v1.6.2rc-2 or above.
+            if getattr(markdown, "version_info", None) < (1,7):
+                return mark_safe(force_unicode(markdown.markdown(smart_str(value), extensions, safe_mode=safe_mode)))
+            else:
+                return mark_safe(markdown.markdown(force_unicode(value), extensions, safe_mode=safe_mode))
+        else:
+            return mark_safe(force_unicode(markdown.markdown(smart_str(value))))
+markdown.is_safe = True
+
+def restructuredtext(value):
+    try:
+        from docutils.core import publish_parts
+    except ImportError:
+        if settings.DEBUG:
+            raise template.TemplateSyntaxError, "Error in {% restructuredtext %} filter: The Python docutils library isn't installed."
+        return force_unicode(value)
+    else:
+        docutils_settings = getattr(settings, "RESTRUCTUREDTEXT_FILTER_SETTINGS", {})
+        parts = publish_parts(source=smart_str(value), writer_name="html4css1", settings_overrides=docutils_settings)
+        return mark_safe(force_unicode(parts["fragment"]))
+restructuredtext.is_safe = True
+
+register.filter(textile)
+register.filter(markdown)
+register.filter(restructuredtext)
diff --git a/webapp/django/contrib/markup/tests.py b/webapp/django/contrib/markup/tests.py
new file mode 100644
index 0000000..9a96f8c
--- /dev/null
+++ b/webapp/django/contrib/markup/tests.py
@@ -0,0 +1,78 @@
+# Quick tests for the markup templatetags (django.contrib.markup)
+
+import re
+import unittest
+
+from django.template import Template, Context, add_to_builtins
+from django.utils.html import escape
+
+add_to_builtins('django.contrib.markup.templatetags.markup')
+
+class Templates(unittest.TestCase):
+    def test_textile(self):
+        try:
+            import textile
+        except ImportError:
+            textile = None
+
+        textile_content = """Paragraph 1
+
+Paragraph 2 with "quotes" and @code@"""
+
+        t = Template("{{ textile_content|textile }}")
+        rendered = t.render(Context(locals())).strip()
+        if textile:
+            self.assertEqual(rendered, """<p>Paragraph 1</p>
+
+<p>Paragraph 2 with &#8220;quotes&#8221; and <code>code</code></p>""")
+        else:
+            self.assertEqual(rendered, escape(textile_content))
+
+    def test_markdown(self):
+        try:
+            import markdown
+        except ImportError:
+            markdown = None
+
+        markdown_content = """Paragraph 1
+
+## An h2"""
+
+        t = Template("{{ markdown_content|markdown }}")
+        rendered = t.render(Context(locals())).strip()
+        if markdown:
+            pattern = re.compile("""<p>Paragraph 1\s*</p>\s*<h2>\s*An h2</h2>""")
+            self.assert_(pattern.match(rendered))
+        else:
+            self.assertEqual(rendered, markdown_content)
+
+    def test_docutils(self):
+        try:
+            import docutils
+        except ImportError:
+            docutils = None
+
+        rest_content = """Paragraph 1
+
+Paragraph 2 with a link_
+
+.. _link: http://www.example.com/"""
+
+        t = Template("{{ rest_content|restructuredtext }}")
+        rendered = t.render(Context(locals())).strip()
+        if docutils:
+            # Different versions of docutils return slightly different HTML
+            try:
+                # Docutils v0.4 and earlier
+                self.assertEqual(rendered, """<p>Paragraph 1</p>
+<p>Paragraph 2 with a <a class="reference" href="http://www.example.com/">link</a></p>""")
+            except AssertionError, e:
+                # Docutils from SVN (which will become 0.5)
+                self.assertEqual(rendered, """<p>Paragraph 1</p>
+<p>Paragraph 2 with a <a class="reference external" href="http://www.example.com/">link</a></p>""")
+        else:
+            self.assertEqual(rendered, rest_content)
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/webapp/django/contrib/redirects/README.TXT b/webapp/django/contrib/redirects/README.TXT
new file mode 100644
index 0000000..3544904
--- /dev/null
+++ b/webapp/django/contrib/redirects/README.TXT
@@ -0,0 +1,8 @@
+This is an optional add-on app, redirects.
+
+For full documentation, see either of these:
+
+    * The file django/docs/redirects.txt in the Django distribution
+    * http://www.djangoproject.com/documentation/redirects/ on the Web
+
+Both have identical content.
\ No newline at end of file
diff --git a/webapp/django/contrib/redirects/__init__.py b/webapp/django/contrib/redirects/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/redirects/__init__.py
diff --git a/webapp/django/contrib/redirects/admin.py b/webapp/django/contrib/redirects/admin.py
new file mode 100644
index 0000000..a9b2a32
--- /dev/null
+++ b/webapp/django/contrib/redirects/admin.py
@@ -0,0 +1,11 @@
+
+from django.contrib import admin
+from django.contrib.redirects.models import Redirect
+
+class RedirectAdmin(admin.ModelAdmin):
+    list_display = ('old_path', 'new_path')
+    list_filter = ('site',)
+    search_fields = ('old_path', 'new_path')
+    radio_fields = {'site': admin.VERTICAL}
+
+admin.site.register(Redirect, RedirectAdmin)
\ No newline at end of file
diff --git a/webapp/django/contrib/redirects/middleware.py b/webapp/django/contrib/redirects/middleware.py
new file mode 100644
index 0000000..8998c2c
--- /dev/null
+++ b/webapp/django/contrib/redirects/middleware.py
@@ -0,0 +1,27 @@
+from django.contrib.redirects.models import Redirect
+from django import http
+from django.conf import settings
+
+class RedirectFallbackMiddleware(object):
+    def process_response(self, request, response):
+        if response.status_code != 404:
+            return response # No need to check for a redirect for non-404 responses.
+        path = request.get_full_path()
+        try:
+            r = Redirect.objects.get(site__id__exact=settings.SITE_ID, old_path=path)
+        except Redirect.DoesNotExist:
+            r = None
+        if r is None and settings.APPEND_SLASH:
+            # Try removing the trailing slash.
+            try:
+                r = Redirect.objects.get(site__id__exact=settings.SITE_ID,
+                    old_path=path[:path.rfind('/')]+path[path.rfind('/')+1:])
+            except Redirect.DoesNotExist:
+                pass
+        if r is not None:
+            if r.new_path == '':
+                return http.HttpResponseGone()
+            return http.HttpResponsePermanentRedirect(r.new_path)
+
+        # No redirect was found. Return the response.
+        return response
diff --git a/webapp/django/contrib/redirects/models.py b/webapp/django/contrib/redirects/models.py
new file mode 100644
index 0000000..4233d55
--- /dev/null
+++ b/webapp/django/contrib/redirects/models.py
@@ -0,0 +1,20 @@
+from django.db import models
+from django.contrib.sites.models import Site
+from django.utils.translation import ugettext_lazy as _
+
+class Redirect(models.Model):
+    site = models.ForeignKey(Site)
+    old_path = models.CharField(_('redirect from'), max_length=200, db_index=True,
+        help_text=_("This should be an absolute path, excluding the domain name. Example: '/events/search/'."))
+    new_path = models.CharField(_('redirect to'), max_length=200, blank=True,
+        help_text=_("This can be either an absolute path (as above) or a full URL starting with 'http://'."))
+
+    class Meta:
+        verbose_name = _('redirect')
+        verbose_name_plural = _('redirects')
+        db_table = 'django_redirect'
+        unique_together=(('site', 'old_path'),)
+        ordering = ('old_path',)
+    
+    def __unicode__(self):
+        return "%s ---> %s" % (self.old_path, self.new_path)
diff --git a/webapp/django/contrib/sessions/__init__.py b/webapp/django/contrib/sessions/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/sessions/__init__.py
diff --git a/webapp/django/contrib/sessions/backends/__init__.py b/webapp/django/contrib/sessions/backends/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/sessions/backends/__init__.py
diff --git a/webapp/django/contrib/sessions/backends/base.py b/webapp/django/contrib/sessions/backends/base.py
new file mode 100644
index 0000000..b4cdead
--- /dev/null
+++ b/webapp/django/contrib/sessions/backends/base.py
@@ -0,0 +1,287 @@
+import base64
+import os
+import random
+import sys
+import time
+from datetime import datetime, timedelta
+try:
+    import cPickle as pickle
+except ImportError:
+    import pickle
+
+from django.conf import settings
+from django.core.exceptions import SuspiciousOperation
+from django.utils.hashcompat import md5_constructor
+
+# Use the system (hardware-based) random number generator if it exists.
+if hasattr(random, 'SystemRandom'):
+    randrange = random.SystemRandom().randrange
+else:
+    randrange = random.randrange
+MAX_SESSION_KEY = 18446744073709551616L     # 2 << 63
+
+class CreateError(Exception):
+    """
+    Used internally as a consistent exception type to catch from save (see the
+    docstring for SessionBase.save() for details).
+    """
+    pass
+
+class SessionBase(object):
+    """
+    Base class for all Session classes.
+    """
+    TEST_COOKIE_NAME = 'testcookie'
+    TEST_COOKIE_VALUE = 'worked'
+
+    def __init__(self, session_key=None):
+        self._session_key = session_key
+        self.accessed = False
+        self.modified = False
+
+    def __contains__(self, key):
+        return key in self._session
+
+    def __getitem__(self, key):
+        return self._session[key]
+
+    def __setitem__(self, key, value):
+        self._session[key] = value
+        self.modified = True
+
+    def __delitem__(self, key):
+        del self._session[key]
+        self.modified = True
+
+    def keys(self):
+        return self._session.keys()
+
+    def items(self):
+        return self._session.items()
+
+    def get(self, key, default=None):
+        return self._session.get(key, default)
+
+    def pop(self, key, *args):
+        self.modified = self.modified or key in self._session
+        return self._session.pop(key, *args)
+
+    def setdefault(self, key, value):
+        if key in self._session:
+            return self._session[key]
+        else:
+            self.modified = True
+            self._session[key] = value
+            return value
+
+    def set_test_cookie(self):
+        self[self.TEST_COOKIE_NAME] = self.TEST_COOKIE_VALUE
+
+    def test_cookie_worked(self):
+        return self.get(self.TEST_COOKIE_NAME) == self.TEST_COOKIE_VALUE
+
+    def delete_test_cookie(self):
+        del self[self.TEST_COOKIE_NAME]
+
+    def encode(self, session_dict):
+        "Returns the given session dictionary pickled and encoded as a string."
+        pickled = pickle.dumps(session_dict, pickle.HIGHEST_PROTOCOL)
+        pickled_md5 = md5_constructor(pickled + settings.SECRET_KEY).hexdigest()
+        return base64.encodestring(pickled + pickled_md5)
+
+    def decode(self, session_data):
+        encoded_data = base64.decodestring(session_data)
+        pickled, tamper_check = encoded_data[:-32], encoded_data[-32:]
+        if md5_constructor(pickled + settings.SECRET_KEY).hexdigest() != tamper_check:
+            raise SuspiciousOperation("User tampered with session cookie.")
+        try:
+            return pickle.loads(pickled)
+        # Unpickling can cause a variety of exceptions. If something happens,
+        # just return an empty dictionary (an empty session).
+        except:
+            return {}
+
+    def update(self, dict_):
+        self._session.update(dict_)
+        self.modified = True
+
+    def has_key(self, key):
+        return self._session.has_key(key)
+
+    def values(self):
+        return self._session.values()
+
+    def iterkeys(self):
+        return self._session.iterkeys()
+
+    def itervalues(self):
+        return self._session.itervalues()
+
+    def iteritems(self):
+        return self._session.iteritems()
+
+    def clear(self):
+        # To avoid unnecessary persistent storage accesses, we set up the
+        # internals directly (loading data wastes time, since we are going to
+        # set it to an empty dict anyway).
+        self._session_cache = {}
+        self.accessed = True
+        self.modified = True
+
+    def _get_new_session_key(self):
+        "Returns session key that isn't being used."
+        # The random module is seeded when this Apache child is created.
+        # Use settings.SECRET_KEY as added salt.
+        try:
+            pid = os.getpid()
+        except AttributeError:
+            # No getpid() in Jython, for example
+            pid = 1
+        while 1:
+            session_key = md5_constructor("%s%s%s%s"
+                    % (randrange(0, MAX_SESSION_KEY), pid, time.time(),
+                       settings.SECRET_KEY)).hexdigest()
+            if not self.exists(session_key):
+                break
+        return session_key
+
+    def _get_session_key(self):
+        if self._session_key:
+            return self._session_key
+        else:
+            self._session_key = self._get_new_session_key()
+            return self._session_key
+
+    def _set_session_key(self, session_key):
+        self._session_key = session_key
+
+    session_key = property(_get_session_key, _set_session_key)
+
+    def _get_session(self, no_load=False):
+        """
+        Lazily loads session from storage (unless "no_load" is True, when only
+        an empty dict is stored) and stores it in the current instance.
+        """
+        self.accessed = True
+        try:
+            return self._session_cache
+        except AttributeError:
+            if self._session_key is None or no_load:
+                self._session_cache = {}
+            else:
+                self._session_cache = self.load()
+        return self._session_cache
+
+    _session = property(_get_session)
+
+    def get_expiry_age(self):
+        """Get the number of seconds until the session expires."""
+        expiry = self.get('_session_expiry')
+        if not expiry:   # Checks both None and 0 cases
+            return settings.SESSION_COOKIE_AGE
+        if not isinstance(expiry, datetime):
+            return expiry
+        delta = expiry - datetime.now()
+        return delta.days * 86400 + delta.seconds
+
+    def get_expiry_date(self):
+        """Get session the expiry date (as a datetime object)."""
+        expiry = self.get('_session_expiry')
+        if isinstance(expiry, datetime):
+            return expiry
+        if not expiry:   # Checks both None and 0 cases
+            expiry = settings.SESSION_COOKIE_AGE
+        return datetime.now() + timedelta(seconds=expiry)
+
+    def set_expiry(self, value):
+        """
+        Sets a custom expiration for the session. ``value`` can be an integer,
+        a Python ``datetime`` or ``timedelta`` object or ``None``.
+
+        If ``value`` is an integer, the session will expire after that many
+        seconds of inactivity. If set to ``0`` then the session will expire on
+        browser close.
+
+        If ``value`` is a ``datetime`` or ``timedelta`` object, the session
+        will expire at that specific future time.
+
+        If ``value`` is ``None``, the session uses the global session expiry
+        policy.
+        """
+        if value is None:
+            # Remove any custom expiration for this session.
+            try:
+                del self['_session_expiry']
+            except KeyError:
+                pass
+            return
+        if isinstance(value, timedelta):
+            value = datetime.now() + value
+        self['_session_expiry'] = value
+
+    def get_expire_at_browser_close(self):
+        """
+        Returns ``True`` if the session is set to expire when the browser
+        closes, and ``False`` if there's an expiry date. Use
+        ``get_expiry_date()`` or ``get_expiry_age()`` to find the actual expiry
+        date/age, if there is one.
+        """
+        if self.get('_session_expiry') is None:
+            return settings.SESSION_EXPIRE_AT_BROWSER_CLOSE
+        return self.get('_session_expiry') == 0
+
+    def flush(self):
+        """
+        Removes the current session data from the database and regenerates the
+        key.
+        """
+        self.clear()
+        self.delete()
+        self.create()
+
+    def cycle_key(self):
+        """
+        Creates a new session key, whilst retaining the current session data.
+        """
+        data = self._session_cache
+        key = self.session_key
+        self.create()
+        self._session_cache = data
+        self.delete(key)
+
+    # Methods that child classes must implement.
+
+    def exists(self, session_key):
+        """
+        Returns True if the given session_key already exists.
+        """
+        raise NotImplementedError
+
+    def create(self):
+        """
+        Creates a new session instance. Guaranteed to create a new object with
+        a unique key and will have saved the result once (with empty data)
+        before the method returns.
+        """
+        raise NotImplementedError
+
+    def save(self, must_create=False):
+        """
+        Saves the session data. If 'must_create' is True, a new session object
+        is created (otherwise a CreateError exception is raised). Otherwise,
+        save() can update an existing object with the same key.
+        """
+        raise NotImplementedError
+
+    def delete(self, session_key=None):
+        """
+        Deletes the session data under this key. If the key is None, the
+        current session key value is used.
+        """
+        raise NotImplementedError
+
+    def load(self):
+        """
+        Loads the session data and returns a dictionary.
+        """
+        raise NotImplementedError
diff --git a/webapp/django/contrib/sessions/backends/cache.py b/webapp/django/contrib/sessions/backends/cache.py
new file mode 100644
index 0000000..94ae448
--- /dev/null
+++ b/webapp/django/contrib/sessions/backends/cache.py
@@ -0,0 +1,50 @@
+from django.contrib.sessions.backends.base import SessionBase, CreateError
+from django.core.cache import cache
+
+class SessionStore(SessionBase):
+    """
+    A cache-based session store.
+    """
+    def __init__(self, session_key=None):
+        self._cache = cache
+        super(SessionStore, self).__init__(session_key)
+
+    def load(self):
+        session_data = self._cache.get(self.session_key)
+        if session_data is not None:
+            return session_data
+        self.create()
+        return {}
+
+    def create(self):
+        while True:
+            self.session_key = self._get_new_session_key()
+            try:
+                self.save(must_create=True)
+            except CreateError:
+                continue
+            self.modified = True
+            return
+
+    def save(self, must_create=False):
+        if must_create:
+            func = self._cache.add
+        else:
+            func = self._cache.set
+        result = func(self.session_key, self._get_session(no_load=must_create),
+                self.get_expiry_age())
+        if must_create and not result:
+            raise CreateError
+
+    def exists(self, session_key):
+        if self._cache.get(session_key):
+            return True
+        return False
+
+    def delete(self, session_key=None):
+        if session_key is None:
+            if self._session_key is None:
+                return
+            session_key = self._session_key
+        self._cache.delete(session_key)
+
diff --git a/webapp/django/contrib/sessions/backends/db.py b/webapp/django/contrib/sessions/backends/db.py
new file mode 100644
index 0000000..85c4a0d
--- /dev/null
+++ b/webapp/django/contrib/sessions/backends/db.py
@@ -0,0 +1,73 @@
+import datetime
+from django.contrib.sessions.models import Session
+from django.contrib.sessions.backends.base import SessionBase, CreateError
+from django.core.exceptions import SuspiciousOperation
+from django.db import IntegrityError, transaction
+from django.utils.encoding import force_unicode
+
+class SessionStore(SessionBase):
+    """
+    Implements database session store.
+    """
+    def load(self):
+        try:
+            s = Session.objects.get(
+                session_key = self.session_key,
+                expire_date__gt=datetime.datetime.now()
+            )
+            return self.decode(force_unicode(s.session_data))
+        except (Session.DoesNotExist, SuspiciousOperation):
+            self.create()
+            return {}
+
+    def exists(self, session_key):
+        try:
+            Session.objects.get(session_key=session_key)
+        except Session.DoesNotExist:
+            return False
+        return True
+
+    def create(self):
+        while True:
+            self.session_key = self._get_new_session_key()
+            try:
+                # Save immediately to ensure we have a unique entry in the
+                # database.
+                self.save(must_create=True)
+            except CreateError:
+                # Key wasn't unique. Try again.
+                continue
+            self.modified = True
+            self._session_cache = {}
+            return
+
+    def save(self, must_create=False):
+        """
+        Saves the current session data to the database. If 'must_create' is
+        True, a database error will be raised if the saving operation doesn't
+        create a *new* entry (as opposed to possibly updating an existing
+        entry).
+        """
+        obj = Session(
+            session_key = self.session_key,
+            session_data = self.encode(self._get_session(no_load=must_create)),
+            expire_date = self.get_expiry_date()
+        )
+        sid = transaction.savepoint()
+        try:
+            obj.save(force_insert=must_create)
+        except IntegrityError:
+            if must_create:
+                transaction.savepoint_rollback(sid)
+                raise CreateError
+            raise
+
+    def delete(self, session_key=None):
+        if session_key is None:
+            if self._session_key is None:
+                return
+            session_key = self._session_key
+        try:
+            Session.objects.get(session_key=session_key).delete()
+        except Session.DoesNotExist:
+            pass
diff --git a/webapp/django/contrib/sessions/backends/file.py b/webapp/django/contrib/sessions/backends/file.py
new file mode 100644
index 0000000..36a03b6
--- /dev/null
+++ b/webapp/django/contrib/sessions/backends/file.py
@@ -0,0 +1,107 @@
+import errno
+import os
+import tempfile
+
+from django.conf import settings
+from django.contrib.sessions.backends.base import SessionBase, CreateError
+from django.core.exceptions import SuspiciousOperation, ImproperlyConfigured
+
+
+class SessionStore(SessionBase):
+    """
+    Implements a file based session store.
+    """
+    def __init__(self, session_key=None):
+        self.storage_path = getattr(settings, "SESSION_FILE_PATH", None)
+        if not self.storage_path:
+            self.storage_path = tempfile.gettempdir()
+
+        # Make sure the storage path is valid.
+        if not os.path.isdir(self.storage_path):
+            raise ImproperlyConfigured(
+                "The session storage path %r doesn't exist. Please set your"
+                " SESSION_FILE_PATH setting to an existing directory in which"
+                " Django can store session data." % self.storage_path)
+
+        self.file_prefix = settings.SESSION_COOKIE_NAME
+        super(SessionStore, self).__init__(session_key)
+
+    def _key_to_file(self, session_key=None):
+        """
+        Get the file associated with this session key.
+        """
+        if session_key is None:
+            session_key = self.session_key
+
+        # Make sure we're not vulnerable to directory traversal. Session keys
+        # should always be md5s, so they should never contain directory
+        # components.
+        if os.path.sep in session_key:
+            raise SuspiciousOperation(
+                "Invalid characters (directory components) in session key")
+
+        return os.path.join(self.storage_path, self.file_prefix + session_key)
+
+    def load(self):
+        session_data = {}
+        try:
+            session_file = open(self._key_to_file(), "rb")
+            try:
+                try:
+                    session_data = self.decode(session_file.read())
+                except (EOFError, SuspiciousOperation):
+                    self.create()
+            finally:
+                session_file.close()
+        except IOError:
+            pass
+        return session_data
+
+    def create(self):
+        while True:
+            self._session_key = self._get_new_session_key()
+            try:
+                self.save(must_create=True)
+            except CreateError:
+                continue
+            self.modified = True
+            self._session_cache = {}
+            return
+
+    def save(self, must_create=False):
+        flags = os.O_WRONLY | os.O_CREAT | os.O_TRUNC | getattr(os, 'O_BINARY', 0)
+        if must_create:
+            flags |= os.O_EXCL
+        # Because this may trigger a load from storage, we must do it before
+        # truncating the file to save.
+        session_data = self._get_session(no_load=must_create)
+        try:
+            fd = os.open(self._key_to_file(self.session_key), flags)
+            try:
+                os.write(fd, self.encode(session_data))
+            finally:
+                os.close(fd)
+        except OSError, e:
+            if must_create and e.errno == errno.EEXIST:
+                raise CreateError
+            raise
+        except (IOError, EOFError):
+            pass
+
+    def exists(self, session_key):
+        if os.path.exists(self._key_to_file(session_key)):
+            return True
+        return False
+
+    def delete(self, session_key=None):
+        if session_key is None:
+            if self._session_key is None:
+                return
+            session_key = self._session_key
+        try:
+            os.unlink(self._key_to_file(session_key))
+        except OSError:
+            pass
+
+    def clean(self):
+        pass
diff --git a/webapp/django/contrib/sessions/middleware.py b/webapp/django/contrib/sessions/middleware.py
new file mode 100644
index 0000000..ce6e678
--- /dev/null
+++ b/webapp/django/contrib/sessions/middleware.py
@@ -0,0 +1,39 @@
+import time
+
+from django.conf import settings
+from django.utils.cache import patch_vary_headers
+from django.utils.http import cookie_date
+
+class SessionMiddleware(object):
+    def process_request(self, request):
+        engine = __import__(settings.SESSION_ENGINE, {}, {}, [''])
+        session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME, None)
+        request.session = engine.SessionStore(session_key)
+
+    def process_response(self, request, response):
+        # If request.session was modified, or if response.session was set, save
+        # those changes and set a session cookie.
+        try:
+            accessed = request.session.accessed
+            modified = request.session.modified
+        except AttributeError:
+            pass
+        else:
+            if accessed:
+                patch_vary_headers(response, ('Cookie',))
+            if modified or settings.SESSION_SAVE_EVERY_REQUEST:
+                if request.session.get_expire_at_browser_close():
+                    max_age = None
+                    expires = None
+                else:
+                    max_age = request.session.get_expiry_age()
+                    expires_time = time.time() + max_age
+                    expires = cookie_date(expires_time)
+                # Save the session data and refresh the client cookie.
+                request.session.save()
+                response.set_cookie(settings.SESSION_COOKIE_NAME,
+                        request.session.session_key, max_age=max_age,
+                        expires=expires, domain=settings.SESSION_COOKIE_DOMAIN,
+                        path=settings.SESSION_COOKIE_PATH,
+                        secure=settings.SESSION_COOKIE_SECURE or None)
+        return response
diff --git a/webapp/django/contrib/sessions/models.py b/webapp/django/contrib/sessions/models.py
new file mode 100644
index 0000000..cf2865f
--- /dev/null
+++ b/webapp/django/contrib/sessions/models.py
@@ -0,0 +1,67 @@
+import base64
+import cPickle as pickle
+
+from django.db import models
+from django.utils.translation import ugettext_lazy as _
+from django.conf import settings
+from django.utils.hashcompat import md5_constructor
+
+
+class SessionManager(models.Manager):
+    def encode(self, session_dict):
+        """
+        Returns the given session dictionary pickled and encoded as a string.
+        """
+        pickled = pickle.dumps(session_dict)
+        pickled_md5 = md5_constructor(pickled + settings.SECRET_KEY).hexdigest()
+        return base64.encodestring(pickled + pickled_md5)
+
+    def save(self, session_key, session_dict, expire_date):
+        s = self.model(session_key, self.encode(session_dict), expire_date)
+        if session_dict:
+            s.save()
+        else:
+            s.delete() # Clear sessions with no data.
+        return s
+
+
+class Session(models.Model):
+    """
+    Django provides full support for anonymous sessions. The session
+    framework lets you store and retrieve arbitrary data on a
+    per-site-visitor basis. It stores data on the server side and
+    abstracts the sending and receiving of cookies. Cookies contain a
+    session ID -- not the data itself.
+
+    The Django sessions framework is entirely cookie-based. It does
+    not fall back to putting session IDs in URLs. This is an intentional
+    design decision. Not only does that behavior make URLs ugly, it makes
+    your site vulnerable to session-ID theft via the "Referer" header.
+
+    For complete documentation on using Sessions in your code, consult
+    the sessions documentation that is shipped with Django (also available
+    on the Django website).
+    """
+    session_key = models.CharField(_('session key'), max_length=40,
+                                   primary_key=True)
+    session_data = models.TextField(_('session data'))
+    expire_date = models.DateTimeField(_('expire date'))
+    objects = SessionManager()
+
+    class Meta:
+        db_table = 'django_session'
+        verbose_name = _('session')
+        verbose_name_plural = _('sessions')
+
+    def get_decoded(self):
+        encoded_data = base64.decodestring(self.session_data)
+        pickled, tamper_check = encoded_data[:-32], encoded_data[-32:]
+        if md5_constructor(pickled + settings.SECRET_KEY).hexdigest() != tamper_check:
+            from django.core.exceptions import SuspiciousOperation
+            raise SuspiciousOperation, "User tampered with session cookie."
+        try:
+            return pickle.loads(pickled)
+        # Unpickling can cause a variety of exceptions. If something happens,
+        # just return an empty dictionary (an empty session).
+        except:
+            return {}
diff --git a/webapp/django/contrib/sessions/tests.py b/webapp/django/contrib/sessions/tests.py
new file mode 100644
index 0000000..5efc17d
--- /dev/null
+++ b/webapp/django/contrib/sessions/tests.py
@@ -0,0 +1,341 @@
+r"""
+
+>>> from django.conf import settings
+>>> from django.contrib.sessions.backends.db import SessionStore as DatabaseSession
+>>> from django.contrib.sessions.backends.cache import SessionStore as CacheSession
+>>> from django.contrib.sessions.backends.file import SessionStore as FileSession
+>>> from django.contrib.sessions.backends.base import SessionBase
+>>> from django.contrib.sessions.models import Session
+
+>>> db_session = DatabaseSession()
+>>> db_session.modified
+False
+>>> db_session.get('cat')
+>>> db_session['cat'] = "dog"
+>>> db_session.modified
+True
+>>> db_session.pop('cat')
+'dog'
+>>> db_session.pop('some key', 'does not exist')
+'does not exist'
+>>> db_session.save()
+>>> db_session.exists(db_session.session_key)
+True
+>>> db_session.delete(db_session.session_key)
+>>> db_session.exists(db_session.session_key)
+False
+
+>>> db_session['foo'] = 'bar'
+>>> db_session.save()
+>>> db_session.exists(db_session.session_key)
+True
+>>> prev_key = db_session.session_key
+>>> db_session.flush()
+>>> db_session.exists(prev_key)
+False
+>>> db_session.session_key == prev_key
+False
+>>> db_session.modified, db_session.accessed
+(True, True)
+>>> db_session['a'], db_session['b'] = 'c', 'd'
+>>> db_session.save()
+>>> prev_key = db_session.session_key
+>>> prev_data = db_session.items()
+>>> db_session.cycle_key()
+>>> db_session.session_key == prev_key
+False
+>>> db_session.items() == prev_data
+True
+
+# Submitting an invalid session key (either by guessing, or if the db has
+# removed the key) results in a new key being generated.
+>>> Session.objects.filter(pk=db_session.session_key).delete()
+>>> db_session = DatabaseSession(db_session.session_key)
+>>> db_session.save()
+>>> DatabaseSession('1').get('cat')
+
+>>> file_session = FileSession()
+>>> file_session.modified
+False
+>>> file_session['cat'] = "dog"
+>>> file_session.modified
+True
+>>> file_session.pop('cat')
+'dog'
+>>> file_session.pop('some key', 'does not exist')
+'does not exist'
+>>> file_session.save()
+>>> file_session.exists(file_session.session_key)
+True
+>>> file_session.delete(file_session.session_key)
+>>> file_session.exists(file_session.session_key)
+False
+>>> FileSession('1').get('cat')
+
+>>> file_session['foo'] = 'bar'
+>>> file_session.save()
+>>> file_session.exists(file_session.session_key)
+True
+>>> prev_key = file_session.session_key
+>>> file_session.flush()
+>>> file_session.exists(prev_key)
+False
+>>> file_session.session_key == prev_key
+False
+>>> file_session.modified, file_session.accessed
+(True, True)
+>>> file_session['a'], file_session['b'] = 'c', 'd'
+>>> file_session.save()
+>>> prev_key = file_session.session_key
+>>> prev_data = file_session.items()
+>>> file_session.cycle_key()
+>>> file_session.session_key == prev_key
+False
+>>> file_session.items() == prev_data
+True
+
+>>> Session.objects.filter(pk=file_session.session_key).delete()
+>>> file_session = FileSession(file_session.session_key)
+>>> file_session.save()
+
+# Make sure the file backend checks for a good storage dir
+>>> settings.SESSION_FILE_PATH = "/if/this/directory/exists/you/have/a/weird/computer"
+>>> FileSession()
+Traceback (innermost last):
+    ...
+ImproperlyConfigured: The session storage path '/if/this/directory/exists/you/have/a/weird/computer' doesn't exist. Please set your SESSION_FILE_PATH setting to an existing directory in which Django can store session data.
+
+>>> cache_session = CacheSession()
+>>> cache_session.modified
+False
+>>> cache_session['cat'] = "dog"
+>>> cache_session.modified
+True
+>>> cache_session.pop('cat')
+'dog'
+>>> cache_session.pop('some key', 'does not exist')
+'does not exist'
+>>> cache_session.save()
+>>> cache_session.delete(cache_session.session_key)
+>>> cache_session.exists(cache_session.session_key)
+False
+>>> cache_session['foo'] = 'bar'
+>>> cache_session.save()
+>>> cache_session.exists(cache_session.session_key)
+True
+>>> prev_key = cache_session.session_key
+>>> cache_session.flush()
+>>> cache_session.exists(prev_key)
+False
+>>> cache_session.session_key == prev_key
+False
+>>> cache_session.modified, cache_session.accessed
+(True, True)
+>>> cache_session['a'], cache_session['b'] = 'c', 'd'
+>>> cache_session.save()
+>>> prev_key = cache_session.session_key
+>>> prev_data = cache_session.items()
+>>> cache_session.cycle_key()
+>>> cache_session.session_key == prev_key
+False
+>>> cache_session.items() == prev_data
+True
+
+>>> Session.objects.filter(pk=cache_session.session_key).delete()
+>>> cache_session = CacheSession(cache_session.session_key)
+>>> cache_session.save()
+>>> CacheSession('1').get('cat')
+
+>>> s = SessionBase()
+>>> s._session['some key'] = 'exists' # Pre-populate the session with some data
+>>> s.accessed = False   # Reset to pretend this wasn't accessed previously
+
+>>> s.accessed, s.modified
+(False, False)
+
+>>> s.pop('non existant key', 'does not exist')
+'does not exist'
+>>> s.accessed, s.modified
+(True, False)
+
+>>> s.setdefault('foo', 'bar')
+'bar'
+>>> s.setdefault('foo', 'baz')
+'bar'
+
+>>> s.accessed = False  # Reset the accessed flag
+
+>>> s.pop('some key')
+'exists'
+>>> s.accessed, s.modified
+(True, True)
+
+>>> s.pop('some key', 'does not exist')
+'does not exist'
+
+
+>>> s.get('update key', None)
+
+# test .update()
+>>> s.modified = s.accessed = False   # Reset to pretend this wasn't accessed previously
+>>> s.update({'update key':1})
+>>> s.accessed, s.modified
+(True, True)
+>>> s.get('update key', None)
+1
+
+# test .has_key()
+>>> s.modified = s.accessed = False   # Reset to pretend this wasn't accessed previously
+>>> s.has_key('update key')
+True
+>>> s.accessed, s.modified
+(True, False)
+
+# test .values()
+>>> s = SessionBase()
+>>> s.values()
+[]
+>>> s.accessed
+True
+>>> s['x'] = 1
+>>> s.values()
+[1]
+
+# test .iterkeys()
+>>> s.accessed = False
+>>> i = s.iterkeys()
+>>> hasattr(i,'__iter__')
+True
+>>> s.accessed
+True
+>>> list(i)
+['x']
+
+# test .itervalues()
+>>> s.accessed = False
+>>> i = s.itervalues()
+>>> hasattr(i,'__iter__')
+True
+>>> s.accessed
+True
+>>> list(i)
+[1]
+
+# test .iteritems()
+>>> s.accessed = False
+>>> i = s.iteritems()
+>>> hasattr(i,'__iter__')
+True
+>>> s.accessed
+True
+>>> list(i)
+[('x', 1)]
+
+# test .clear()
+>>> s.modified = s.accessed = False
+>>> s.items()
+[('x', 1)]
+>>> s.clear()
+>>> s.items()
+[]
+>>> s.accessed, s.modified
+(True, True)
+
+#########################
+# Custom session expiry #
+#########################
+
+>>> from django.conf import settings
+>>> from datetime import datetime, timedelta
+
+>>> td10 = timedelta(seconds=10)
+
+# A normal session has a max age equal to settings
+>>> s.get_expiry_age() == settings.SESSION_COOKIE_AGE
+True
+
+# So does a custom session with an idle expiration time of 0 (but it'll expire
+# at browser close)
+>>> s.set_expiry(0)
+>>> s.get_expiry_age() == settings.SESSION_COOKIE_AGE
+True
+
+# Custom session idle expiration time
+>>> s.set_expiry(10)
+>>> delta = s.get_expiry_date() - datetime.now()
+>>> delta.seconds in (9, 10)
+True
+>>> age = s.get_expiry_age()
+>>> age in (9, 10)
+True
+
+# Custom session fixed expiry date (timedelta)
+>>> s.set_expiry(td10)
+>>> delta = s.get_expiry_date() - datetime.now()
+>>> delta.seconds in (9, 10)
+True
+>>> age = s.get_expiry_age()
+>>> age in (9, 10)
+True
+
+# Custom session fixed expiry date (fixed datetime)
+>>> s.set_expiry(datetime.now() + td10)
+>>> delta = s.get_expiry_date() - datetime.now()
+>>> delta.seconds in (9, 10)
+True
+>>> age = s.get_expiry_age()
+>>> age in (9, 10)
+True
+
+# Set back to default session age
+>>> s.set_expiry(None)
+>>> s.get_expiry_age() == settings.SESSION_COOKIE_AGE
+True
+
+# Allow to set back to default session age even if no alternate has been set
+>>> s.set_expiry(None)
+
+
+# We're changing the setting then reverting back to the original setting at the
+# end of these tests.
+>>> original_expire_at_browser_close = settings.SESSION_EXPIRE_AT_BROWSER_CLOSE
+>>> settings.SESSION_EXPIRE_AT_BROWSER_CLOSE = False
+
+# Custom session age
+>>> s.set_expiry(10)
+>>> s.get_expire_at_browser_close()
+False
+
+# Custom expire-at-browser-close
+>>> s.set_expiry(0)
+>>> s.get_expire_at_browser_close()
+True
+
+# Default session age
+>>> s.set_expiry(None)
+>>> s.get_expire_at_browser_close()
+False
+
+>>> settings.SESSION_EXPIRE_AT_BROWSER_CLOSE = True
+
+# Custom session age
+>>> s.set_expiry(10)
+>>> s.get_expire_at_browser_close()
+False
+
+# Custom expire-at-browser-close
+>>> s.set_expiry(0)
+>>> s.get_expire_at_browser_close()
+True
+
+# Default session age
+>>> s.set_expiry(None)
+>>> s.get_expire_at_browser_close()
+True
+
+>>> settings.SESSION_EXPIRE_AT_BROWSER_CLOSE = original_expire_at_browser_close
+"""
+
+if __name__ == '__main__':
+    import doctest
+    doctest.testmod()
diff --git a/webapp/django/contrib/sitemaps/__init__.py b/webapp/django/contrib/sitemaps/__init__.py
new file mode 100644
index 0000000..2d0e047
--- /dev/null
+++ b/webapp/django/contrib/sitemaps/__init__.py
@@ -0,0 +1,100 @@
+from django.core import urlresolvers, paginator
+import urllib
+
+PING_URL = "http://www.google.com/webmasters/tools/ping"
+
+class SitemapNotFound(Exception):
+    pass
+
+def ping_google(sitemap_url=None, ping_url=PING_URL):
+    """
+    Alerts Google that the sitemap for the current site has been updated.
+    If sitemap_url is provided, it should be an absolute path to the sitemap
+    for this site -- e.g., '/sitemap.xml'. If sitemap_url is not provided, this
+    function will attempt to deduce it by using urlresolvers.reverse().
+    """
+    if sitemap_url is None:
+        try:
+            # First, try to get the "index" sitemap URL.
+            sitemap_url = urlresolvers.reverse('django.contrib.sitemaps.views.index')
+        except urlresolvers.NoReverseMatch:
+            try:
+                # Next, try for the "global" sitemap URL.
+                sitemap_url = urlresolvers.reverse('django.contrib.sitemaps.views.sitemap')
+            except urlresolvers.NoReverseMatch:
+                pass
+
+    if sitemap_url is None:
+        raise SitemapNotFound("You didn't provide a sitemap_url, and the sitemap URL couldn't be auto-detected.")
+
+    from django.contrib.sites.models import Site
+    current_site = Site.objects.get_current()
+    url = "http://%s%s" % (current_site.domain, sitemap_url)
+    params = urllib.urlencode({'sitemap':url})
+    urllib.urlopen("%s?%s" % (ping_url, params))
+
+class Sitemap:
+    # This limit is defined by Google. See the index documentation at
+    # http://sitemaps.org/protocol.php#index.
+    limit = 50000
+
+    def __get(self, name, obj, default=None):
+        try:
+            attr = getattr(self, name)
+        except AttributeError:
+            return default
+        if callable(attr):
+            return attr(obj)
+        return attr
+
+    def items(self):
+        return []
+
+    def location(self, obj):
+        return obj.get_absolute_url()
+
+    def _get_paginator(self):
+        if not hasattr(self, "_paginator"):
+            self._paginator = paginator.Paginator(self.items(), self.limit)
+        return self._paginator
+    paginator = property(_get_paginator)
+
+    def get_urls(self, page=1):
+        from django.contrib.sites.models import Site
+        current_site = Site.objects.get_current()
+        urls = []
+        for item in self.paginator.page(page).object_list:
+            loc = "http://%s%s" % (current_site.domain, self.__get('location', item))
+            url_info = {
+                'location':   loc,
+                'lastmod':    self.__get('lastmod', item, None),
+                'changefreq': self.__get('changefreq', item, None),
+                'priority':   self.__get('priority', item, None)
+            }
+            urls.append(url_info)
+        return urls
+
+class FlatPageSitemap(Sitemap):
+    def items(self):
+        from django.contrib.sites.models import Site
+        current_site = Site.objects.get_current()
+        return current_site.flatpage_set.all()
+
+class GenericSitemap(Sitemap):
+    priority = None
+    changefreq = None
+
+    def __init__(self, info_dict, priority=None, changefreq=None):
+        self.queryset = info_dict['queryset']
+        self.date_field = info_dict.get('date_field', None)
+        self.priority = priority
+        self.changefreq = changefreq
+
+    def items(self):
+        # Make sure to return a clone; we don't want premature evaluation.
+        return self.queryset.filter()
+
+    def lastmod(self, item):
+        if self.date_field is not None:
+            return getattr(item, self.date_field)
+        return None
diff --git a/webapp/django/contrib/sitemaps/management/__init__.py b/webapp/django/contrib/sitemaps/management/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/sitemaps/management/__init__.py
diff --git a/webapp/django/contrib/sitemaps/management/commands/__init__.py b/webapp/django/contrib/sitemaps/management/commands/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/sitemaps/management/commands/__init__.py
diff --git a/webapp/django/contrib/sitemaps/management/commands/ping_google.py b/webapp/django/contrib/sitemaps/management/commands/ping_google.py
new file mode 100644
index 0000000..afff04b
--- /dev/null
+++ b/webapp/django/contrib/sitemaps/management/commands/ping_google.py
@@ -0,0 +1,14 @@
+from django.core.management.base import BaseCommand
+from django.contrib.sitemaps import ping_google
+
+
+class Command(BaseCommand):
+    help = "Ping google with an updated sitemap, pass optional url of sitemap"
+
+    def execute(self, *args, **options):
+        if len(args) == 1:
+            sitemap_url = args[0]
+        else:
+            sitemap_url = None
+        ping_google(sitemap_url=sitemap_url)
+
diff --git a/webapp/django/contrib/sitemaps/templates/sitemap.xml b/webapp/django/contrib/sitemaps/templates/sitemap.xml
new file mode 100644
index 0000000..c0d529d
--- /dev/null
+++ b/webapp/django/contrib/sitemaps/templates/sitemap.xml
@@ -0,0 +1,14 @@
+{% autoescape off %}<?xml version="1.0" encoding="UTF-8"?>
+<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
+{% spaceless %}
+{% for url in urlset %}
+  <url>
+    <loc>{{ url.location|escape }}</loc>
+    {% if url.lastmod %}<lastmod>{{ url.lastmod|date:"Y-m-d" }}</lastmod>{% endif %}
+    {% if url.changefreq %}<changefreq>{{ url.changefreq }}</changefreq>{% endif %}
+    {% if url.priority %}<priority>{{ url.priority }}</priority>{% endif %}
+   </url>
+{% endfor %}
+{% endspaceless %}
+</urlset>
+{% endautoescape %}
diff --git a/webapp/django/contrib/sitemaps/templates/sitemap_index.xml b/webapp/django/contrib/sitemaps/templates/sitemap_index.xml
new file mode 100644
index 0000000..497ae8b
--- /dev/null
+++ b/webapp/django/contrib/sitemaps/templates/sitemap_index.xml
@@ -0,0 +1,5 @@
+{% autoescape off %}<?xml version="1.0" encoding="UTF-8"?>
+<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
+{% for location in sitemaps %}<sitemap><loc>{{ location|escape }}</loc></sitemap>{% endfor %}
+</sitemapindex>
+{% endautoescape %}
diff --git a/webapp/django/contrib/sitemaps/views.py b/webapp/django/contrib/sitemaps/views.py
new file mode 100644
index 0000000..7a5fe38
--- /dev/null
+++ b/webapp/django/contrib/sitemaps/views.py
@@ -0,0 +1,45 @@
+from django.http import HttpResponse, Http404
+from django.template import loader
+from django.contrib.sites.models import Site
+from django.core import urlresolvers
+from django.utils.encoding import smart_str
+from django.core.paginator import EmptyPage, PageNotAnInteger
+
+def index(request, sitemaps):
+    current_site = Site.objects.get_current()
+    sites = []
+    protocol = request.is_secure() and 'https' or 'http'
+    for section, site in sitemaps.items():
+        if callable(site):
+            pages = site().paginator.num_pages
+        else:
+            pages = site.paginator.num_pages
+        sitemap_url = urlresolvers.reverse('django.contrib.sitemaps.views.sitemap', kwargs={'section': section})
+        sites.append('%s://%s%s' % (protocol, current_site.domain, sitemap_url))
+        if pages > 1:
+            for page in range(2, pages+1):
+                sites.append('%s://%s%s?p=%s' % (protocol, current_site.domain, sitemap_url, page))
+    xml = loader.render_to_string('sitemap_index.xml', {'sitemaps': sites})
+    return HttpResponse(xml, mimetype='application/xml')
+
+def sitemap(request, sitemaps, section=None):
+    maps, urls = [], []
+    if section is not None:
+        if section not in sitemaps:
+            raise Http404("No sitemap available for section: %r" % section)
+        maps.append(sitemaps[section])
+    else:
+        maps = sitemaps.values()
+    page = request.GET.get("p", 1)
+    for site in maps:
+        try:
+            if callable(site):
+                urls.extend(site().get_urls(page))
+            else:
+                urls.extend(site.get_urls(page))
+        except EmptyPage:
+            raise Http404("Page %s empty" % page)
+        except PageNotAnInteger:
+            raise Http404("No page '%s'" % page)
+    xml = smart_str(loader.render_to_string('sitemap.xml', {'urlset': urls}))
+    return HttpResponse(xml, mimetype='application/xml')
diff --git a/webapp/django/contrib/sites/__init__.py b/webapp/django/contrib/sites/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/sites/__init__.py
diff --git a/webapp/django/contrib/sites/admin.py b/webapp/django/contrib/sites/admin.py
new file mode 100644
index 0000000..2442c24
--- /dev/null
+++ b/webapp/django/contrib/sites/admin.py
@@ -0,0 +1,9 @@
+from django.contrib import admin
+from django.contrib.sites.models import Site
+
+
+class SiteAdmin(admin.ModelAdmin):
+    list_display = ('domain', 'name')
+    search_fields = ('domain', 'name')
+
+admin.site.register(Site, SiteAdmin)
\ No newline at end of file
diff --git a/webapp/django/contrib/sites/management.py b/webapp/django/contrib/sites/management.py
new file mode 100644
index 0000000..25c0760
--- /dev/null
+++ b/webapp/django/contrib/sites/management.py
@@ -0,0 +1,17 @@
+"""
+Creates the default Site object.
+"""
+
+from django.db.models import signals
+from django.contrib.sites.models import Site
+from django.contrib.sites import models as site_app
+
+def create_default_site(app, created_models, verbosity, **kwargs):
+    if Site in created_models:
+        if verbosity >= 2:
+            print "Creating example.com Site object"
+        s = Site(domain="example.com", name="example.com")
+        s.save()
+    Site.objects.clear_cache()
+
+signals.post_syncdb.connect(create_default_site, sender=site_app)
diff --git a/webapp/django/contrib/sites/managers.py b/webapp/django/contrib/sites/managers.py
new file mode 100644
index 0000000..d49244f
--- /dev/null
+++ b/webapp/django/contrib/sites/managers.py
@@ -0,0 +1,20 @@
+from django.conf import settings
+from django.db import models
+from django.db.models.fields import FieldDoesNotExist
+
+class CurrentSiteManager(models.Manager):
+    "Use this to limit objects to those associated with the current site."
+    def __init__(self, field_name='site'):
+        super(CurrentSiteManager, self).__init__()
+        self.__field_name = field_name
+        self.__is_validated = False
+
+    def get_query_set(self):
+        if not self.__is_validated:
+            try:
+                self.model._meta.get_field(self.__field_name)
+            except FieldDoesNotExist:
+                raise ValueError, "%s couldn't find a field named %s in %s." % \
+                    (self.__class__.__name__, self.__field_name, self.model._meta.object_name)
+            self.__is_validated = True
+        return super(CurrentSiteManager, self).get_query_set().filter(**{self.__field_name + '__id__exact': settings.SITE_ID})
diff --git a/webapp/django/contrib/sites/models.py b/webapp/django/contrib/sites/models.py
new file mode 100644
index 0000000..c44e5ce
--- /dev/null
+++ b/webapp/django/contrib/sites/models.py
@@ -0,0 +1,71 @@
+from django.db import models
+from django.utils.translation import ugettext_lazy as _
+
+SITE_CACHE = {}
+
+class SiteManager(models.Manager):
+    def get_current(self):
+        """
+        Returns the current ``Site`` based on the SITE_ID in the
+        project's settings. The ``Site`` object is cached the first
+        time it's retrieved from the database.
+        """
+        from django.conf import settings
+        try:
+            sid = settings.SITE_ID
+        except AttributeError:
+            from django.core.exceptions import ImproperlyConfigured
+            raise ImproperlyConfigured("You're using the Django \"sites framework\" without having set the SITE_ID setting. Create a site in your database and set the SITE_ID setting to fix this error.")
+        try:
+            current_site = SITE_CACHE[sid]
+        except KeyError:
+            current_site = self.get(pk=sid)
+            SITE_CACHE[sid] = current_site
+        return current_site
+
+    def clear_cache(self):
+        """Clears the ``Site`` object cache."""
+        global SITE_CACHE
+        SITE_CACHE = {}
+
+class Site(models.Model):
+    domain = models.CharField(_('domain name'), max_length=100)
+    name = models.CharField(_('display name'), max_length=50)
+    objects = SiteManager()
+
+    class Meta:
+        db_table = 'django_site'
+        verbose_name = _('site')
+        verbose_name_plural = _('sites')
+        ordering = ('domain',)
+
+    def __unicode__(self):
+        return self.domain
+    
+    def delete(self):
+        pk = self.pk
+        super(Site, self).delete()
+        try:
+            del(SITE_CACHE[pk])
+        except KeyError:
+            pass
+
+class RequestSite(object):
+    """
+    A class that shares the primary interface of Site (i.e., it has
+    ``domain`` and ``name`` attributes) but gets its data from a Django
+    HttpRequest object rather than from a database.
+
+    The save() and delete() methods raise NotImplementedError.
+    """
+    def __init__(self, request):
+        self.domain = self.name = request.get_host()
+
+    def __unicode__(self):
+        return self.domain
+
+    def save(self):
+        raise NotImplementedError('RequestSite cannot be saved.')
+
+    def delete(self):
+        raise NotImplementedError('RequestSite cannot be deleted.')
diff --git a/webapp/django/contrib/sites/tests.py b/webapp/django/contrib/sites/tests.py
new file mode 100644
index 0000000..f39f7a2
--- /dev/null
+++ b/webapp/django/contrib/sites/tests.py
@@ -0,0 +1,16 @@
+"""
+>>> from django.contrib.sites.models import Site
+>>> from django.conf import settings
+>>> Site(id=settings.SITE_ID, domain="example.com", name="example.com").save()
+ 	
+>>> # Make sure that get_current() does not return a deleted Site object.
+>>> s = Site.objects.get_current()
+>>> isinstance(s, Site)
+True
+
+>>> s.delete()
+>>> Site.objects.get_current()
+Traceback (most recent call last):
+...
+DoesNotExist: Site matching query does not exist.
+"""
diff --git a/webapp/django/contrib/syndication/__init__.py b/webapp/django/contrib/syndication/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/syndication/__init__.py
diff --git a/webapp/django/contrib/syndication/feeds.py b/webapp/django/contrib/syndication/feeds.py
new file mode 100644
index 0000000..a1f0810
--- /dev/null
+++ b/webapp/django/contrib/syndication/feeds.py
@@ -0,0 +1,178 @@
+from datetime import datetime, timedelta
+
+from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist
+from django.template import loader, Template, TemplateDoesNotExist
+from django.contrib.sites.models import Site, RequestSite
+from django.utils import feedgenerator
+from django.utils.tzinfo import FixedOffset
+from django.utils.encoding import smart_unicode, iri_to_uri
+from django.conf import settings         
+from django.template import RequestContext
+
+def add_domain(domain, url):
+    if not (url.startswith('http://') or url.startswith('https://')):
+        # 'url' must already be ASCII and URL-quoted, so no need for encoding
+        # conversions here.
+        url = iri_to_uri(u'http://%s%s' % (domain, url))
+    return url
+
+class FeedDoesNotExist(ObjectDoesNotExist):
+    pass
+
+class Feed(object):
+    item_pubdate = None
+    item_enclosure_url = None
+    feed_type = feedgenerator.DefaultFeed
+    title_template = None
+    description_template = None
+
+    def __init__(self, slug, request):
+        self.slug = slug
+        self.request = request
+        self.feed_url = request.path
+        self.title_template_name = self.title_template or ('feeds/%s_title.html' % slug)
+        self.description_template_name = self.description_template or ('feeds/%s_description.html' % slug)
+
+    def item_link(self, item):
+        try:
+            return item.get_absolute_url()
+        except AttributeError:
+            raise ImproperlyConfigured, "Give your %s class a get_absolute_url() method, or define an item_link() method in your Feed class." % item.__class__.__name__
+
+    def __get_dynamic_attr(self, attname, obj, default=None):
+        try:
+            attr = getattr(self, attname)
+        except AttributeError:
+            return default
+        if callable(attr):
+            # Check func_code.co_argcount rather than try/excepting the
+            # function and catching the TypeError, because something inside
+            # the function may raise the TypeError. This technique is more
+            # accurate.
+            if hasattr(attr, 'func_code'):
+                argcount = attr.func_code.co_argcount
+            else:
+                argcount = attr.__call__.func_code.co_argcount
+            if argcount == 2: # one argument is 'self'
+                return attr(obj)
+            else:
+                return attr()
+        return attr
+
+    def feed_extra_kwargs(self, obj):
+        """
+        Returns an extra keyword arguments dictionary that is used when
+        initializing the feed generator.
+        """
+        return {}
+
+    def item_extra_kwargs(self, item):
+        """
+        Returns an extra keyword arguments dictionary that is used with
+        the `add_item` call of the feed generator.
+        """
+        return {}
+
+    def get_object(self, bits):
+        return None
+
+    def get_feed(self, url=None):
+        """
+        Returns a feedgenerator.DefaultFeed object, fully populated, for
+        this feed. Raises FeedDoesNotExist for invalid parameters.
+        """
+        if url:
+            bits = url.split('/')
+        else:
+            bits = []
+
+        try:
+            obj = self.get_object(bits)
+        except ObjectDoesNotExist:
+            raise FeedDoesNotExist
+
+        if Site._meta.installed:
+            current_site = Site.objects.get_current()
+        else:
+            current_site = RequestSite(self.request)
+        
+        link = self.__get_dynamic_attr('link', obj)
+        link = add_domain(current_site.domain, link)
+
+        feed = self.feed_type(
+            title = self.__get_dynamic_attr('title', obj),
+            subtitle = self.__get_dynamic_attr('subtitle', obj),
+            link = link,
+            description = self.__get_dynamic_attr('description', obj),
+            language = settings.LANGUAGE_CODE.decode(),
+            feed_url = add_domain(current_site.domain,
+                                  self.__get_dynamic_attr('feed_url', obj)),
+            author_name = self.__get_dynamic_attr('author_name', obj),
+            author_link = self.__get_dynamic_attr('author_link', obj),
+            author_email = self.__get_dynamic_attr('author_email', obj),
+            categories = self.__get_dynamic_attr('categories', obj),
+            feed_copyright = self.__get_dynamic_attr('feed_copyright', obj),
+            feed_guid = self.__get_dynamic_attr('feed_guid', obj),
+            ttl = self.__get_dynamic_attr('ttl', obj),
+            **self.feed_extra_kwargs(obj)
+        )
+
+        try:
+            title_tmp = loader.get_template(self.title_template_name)
+        except TemplateDoesNotExist:
+            title_tmp = Template('{{ obj }}')
+        try:
+            description_tmp = loader.get_template(self.description_template_name)
+        except TemplateDoesNotExist:
+            description_tmp = Template('{{ obj }}')
+
+        for item in self.__get_dynamic_attr('items', obj):
+            link = add_domain(current_site.domain, self.__get_dynamic_attr('item_link', item))
+            enc = None
+            enc_url = self.__get_dynamic_attr('item_enclosure_url', item)
+            if enc_url:
+                enc = feedgenerator.Enclosure(
+                    url = smart_unicode(enc_url),
+                    length = smart_unicode(self.__get_dynamic_attr('item_enclosure_length', item)),
+                    mime_type = smart_unicode(self.__get_dynamic_attr('item_enclosure_mime_type', item))
+                )
+            author_name = self.__get_dynamic_attr('item_author_name', item)
+            if author_name is not None:
+                author_email = self.__get_dynamic_attr('item_author_email', item)
+                author_link = self.__get_dynamic_attr('item_author_link', item)
+            else:
+                author_email = author_link = None
+
+            pubdate = self.__get_dynamic_attr('item_pubdate', item)
+            if pubdate:
+                now = datetime.now()
+                utcnow = datetime.utcnow()
+
+                # Must always subtract smaller time from larger time here.
+                if utcnow > now:
+                    sign = -1
+                    tzDifference = (utcnow - now)
+                else:
+                    sign = 1
+                    tzDifference = (now - utcnow)
+
+                # Round the timezone offset to the nearest half hour.
+                tzOffsetMinutes = sign * ((tzDifference.seconds / 60 + 15) / 30) * 30
+                tzOffset = timedelta(minutes=tzOffsetMinutes)
+                pubdate = pubdate.replace(tzinfo=FixedOffset(tzOffset))
+
+            feed.add_item(
+                title = title_tmp.render(RequestContext(self.request, {'obj': item, 'site': current_site})),
+                link = link,
+                description = description_tmp.render(RequestContext(self.request, {'obj': item, 'site': current_site})),
+                unique_id = self.__get_dynamic_attr('item_guid', item, link),
+                enclosure = enc,
+                pubdate = pubdate,
+                author_name = author_name,
+                author_email = author_email,
+                author_link = author_link,
+                categories = self.__get_dynamic_attr('item_categories', item),
+                item_copyright = self.__get_dynamic_attr('item_copyright', item),
+                **self.item_extra_kwargs(item)
+            )
+        return feed
diff --git a/webapp/django/contrib/syndication/views.py b/webapp/django/contrib/syndication/views.py
new file mode 100644
index 0000000..423d333
--- /dev/null
+++ b/webapp/django/contrib/syndication/views.py
@@ -0,0 +1,25 @@
+from django.contrib.syndication import feeds
+from django.http import HttpResponse, Http404
+
+def feed(request, url, feed_dict=None):
+    if not feed_dict:
+        raise Http404, "No feeds are registered."
+
+    try:
+        slug, param = url.split('/', 1)
+    except ValueError:
+        slug, param = url, ''
+
+    try:
+        f = feed_dict[slug]
+    except KeyError:
+        raise Http404, "Slug %r isn't registered." % slug
+
+    try:
+        feedgen = f(slug, request).get_feed(param)
+    except feeds.FeedDoesNotExist:
+        raise Http404, "Invalid feed parameters. Slug %r is valid, but other parameters, or lack thereof, are not." % slug
+
+    response = HttpResponse(mimetype=feedgen.mime_type)
+    feedgen.write(response, 'utf-8')
+    return response
diff --git a/webapp/django/contrib/webdesign/__init__.py b/webapp/django/contrib/webdesign/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/webdesign/__init__.py
diff --git a/webapp/django/contrib/webdesign/lorem_ipsum.py b/webapp/django/contrib/webdesign/lorem_ipsum.py
new file mode 100644
index 0000000..4ad175d
--- /dev/null
+++ b/webapp/django/contrib/webdesign/lorem_ipsum.py
@@ -0,0 +1,101 @@
+"""
+Utility functions for generating "lorem ipsum" Latin text.
+"""
+
+import random
+
+COMMON_P = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'
+
+WORDS = ('exercitationem', 'perferendis', 'perspiciatis', 'laborum', 'eveniet',
+        'sunt', 'iure', 'nam', 'nobis', 'eum', 'cum', 'officiis', 'excepturi',
+        'odio', 'consectetur', 'quasi', 'aut', 'quisquam', 'vel', 'eligendi',
+        'itaque', 'non', 'odit', 'tempore', 'quaerat', 'dignissimos',
+        'facilis', 'neque', 'nihil', 'expedita', 'vitae', 'vero', 'ipsum',
+        'nisi', 'animi', 'cumque', 'pariatur', 'velit', 'modi', 'natus',
+        'iusto', 'eaque', 'sequi', 'illo', 'sed', 'ex', 'et', 'voluptatibus',
+        'tempora', 'veritatis', 'ratione', 'assumenda', 'incidunt', 'nostrum',
+        'placeat', 'aliquid', 'fuga', 'provident', 'praesentium', 'rem',
+        'necessitatibus', 'suscipit', 'adipisci', 'quidem', 'possimus',
+        'voluptas', 'debitis', 'sint', 'accusantium', 'unde', 'sapiente',
+        'voluptate', 'qui', 'aspernatur', 'laudantium', 'soluta', 'amet',
+        'quo', 'aliquam', 'saepe', 'culpa', 'libero', 'ipsa', 'dicta',
+        'reiciendis', 'nesciunt', 'doloribus', 'autem', 'impedit', 'minima',
+        'maiores', 'repudiandae', 'ipsam', 'obcaecati', 'ullam', 'enim',
+        'totam', 'delectus', 'ducimus', 'quis', 'voluptates', 'dolores',
+        'molestiae', 'harum', 'dolorem', 'quia', 'voluptatem', 'molestias',
+        'magni', 'distinctio', 'omnis', 'illum', 'dolorum', 'voluptatum', 'ea',
+        'quas', 'quam', 'corporis', 'quae', 'blanditiis', 'atque', 'deserunt',
+        'laboriosam', 'earum', 'consequuntur', 'hic', 'cupiditate',
+        'quibusdam', 'accusamus', 'ut', 'rerum', 'error', 'minus', 'eius',
+        'ab', 'ad', 'nemo', 'fugit', 'officia', 'at', 'in', 'id', 'quos',
+        'reprehenderit', 'numquam', 'iste', 'fugiat', 'sit', 'inventore',
+        'beatae', 'repellendus', 'magnam', 'recusandae', 'quod', 'explicabo',
+        'doloremque', 'aperiam', 'consequatur', 'asperiores', 'commodi',
+        'optio', 'dolor', 'labore', 'temporibus', 'repellat', 'veniam',
+        'architecto', 'est', 'esse', 'mollitia', 'nulla', 'a', 'similique',
+        'eos', 'alias', 'dolore', 'tenetur', 'deleniti', 'porro', 'facere',
+        'maxime', 'corrupti')
+
+COMMON_WORDS = ('lorem', 'ipsum', 'dolor', 'sit', 'amet', 'consectetur',
+        'adipisicing', 'elit', 'sed', 'do', 'eiusmod', 'tempor', 'incididunt',
+        'ut', 'labore', 'et', 'dolore', 'magna', 'aliqua')
+
+def sentence():
+    """
+    Returns a randomly generated sentence of lorem ipsum text.
+
+    The first word is capitalized, and the sentence ends in either a period or
+    question mark. Commas are added at random.
+    """
+    # Determine the number of comma-separated sections and number of words in
+    # each section for this sentence.
+    sections = [u' '.join(random.sample(WORDS, random.randint(3, 12))) for i in range(random.randint(1, 5))]
+    s = u', '.join(sections)
+    # Convert to sentence case and add end punctuation.
+    return u'%s%s%s' % (s[0].upper(), s[1:], random.choice('?.'))
+
+def paragraph():
+    """
+    Returns a randomly generated paragraph of lorem ipsum text.
+
+    The paragraph consists of between 1 and 4 sentences, inclusive.
+    """
+    return u' '.join([sentence() for i in range(random.randint(1, 4))])
+
+def paragraphs(count, common=True):
+    """
+    Returns a list of paragraphs as returned by paragraph().
+
+    If `common` is True, then the first paragraph will be the standard
+    'lorem ipsum' paragraph. Otherwise, the first paragraph will be random
+    Latin text. Either way, subsequent paragraphs will be random Latin text.
+    """
+    paras = []
+    for i in range(count):
+        if common and i == 0:
+            paras.append(COMMON_P)
+        else:
+            paras.append(paragraph())
+    return paras
+
+def words(count, common=True):
+    """
+    Returns a string of `count` lorem ipsum words separated by a single space.
+
+    If `common` is True, then the first 19 words will be the standard
+    'lorem ipsum' words. Otherwise, all words will be selected randomly.
+    """
+    if common:
+        word_list = list(COMMON_WORDS)
+    else:
+        word_list = []
+    c = len(word_list)
+    if count > c:
+        count -= c
+        while count > 0:
+            c = min(count, len(WORDS))
+            count -= c
+            word_list += random.sample(WORDS, c)
+    else:
+        word_list = word_list[:count]
+    return u' '.join(word_list)
diff --git a/webapp/django/contrib/webdesign/models.py b/webapp/django/contrib/webdesign/models.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/webdesign/models.py
diff --git a/webapp/django/contrib/webdesign/templatetags/__init__.py b/webapp/django/contrib/webdesign/templatetags/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/contrib/webdesign/templatetags/__init__.py
diff --git a/webapp/django/contrib/webdesign/templatetags/webdesign.py b/webapp/django/contrib/webdesign/templatetags/webdesign.py
new file mode 100644
index 0000000..1eb1790
--- /dev/null
+++ b/webapp/django/contrib/webdesign/templatetags/webdesign.py
@@ -0,0 +1,67 @@
+from django.contrib.webdesign.lorem_ipsum import words, paragraphs
+from django import template
+
+register = template.Library()
+
+class LoremNode(template.Node):
+    def __init__(self, count, method, common):
+        self.count, self.method, self.common = count, method, common
+
+    def render(self, context):
+        try:
+            count = int(self.count.resolve(context))
+        except (ValueError, TypeError):
+            count = 1
+        if self.method == 'w':
+            return words(count, common=self.common)
+        else:
+            paras = paragraphs(count, common=self.common)
+        if self.method == 'p':
+            paras = ['<p>%s</p>' % p for p in paras]
+        return u'\n\n'.join(paras)
+
+#@register.tag
+def lorem(parser, token):
+    """
+    Creates random Latin text useful for providing test data in templates.
+
+    Usage format::
+
+        {% lorem [count] [method] [random] %}
+
+    ``count`` is a number (or variable) containing the number of paragraphs or
+    words to generate (default is 1).
+
+    ``method`` is either ``w`` for words, ``p`` for HTML paragraphs, ``b`` for
+    plain-text paragraph blocks (default is ``b``).
+
+    ``random`` is the word ``random``, which if given, does not use the common
+    paragraph (starting "Lorem ipsum dolor sit amet, consectetuer...").
+
+    Examples:
+        * ``{% lorem %}`` will output the common "lorem ipsum" paragraph
+        * ``{% lorem 3 p %}`` will output the common "lorem ipsum" paragraph
+          and two random paragraphs each wrapped in HTML ``<p>`` tags
+        * ``{% lorem 2 w random %}`` will output two random latin words
+    """
+    bits = list(token.split_contents())
+    tagname = bits[0]
+    # Random bit
+    common = bits[-1] != 'random'
+    if not common:
+        bits.pop()
+    # Method bit
+    if bits[-1] in ('w', 'p', 'b'):
+        method = bits.pop()
+    else:
+        method = 'b'
+    # Count bit
+    if len(bits) > 1:
+        count = bits.pop()
+    else:
+        count = '1'
+    count = parser.compile_filter(count)
+    if len(bits) != 1:
+        raise template.TemplateSyntaxError("Incorrect format for %r tag" % tagname)
+    return LoremNode(count, method, common)
+lorem = register.tag(lorem)
diff --git a/webapp/django/contrib/webdesign/tests.py b/webapp/django/contrib/webdesign/tests.py
new file mode 100644
index 0000000..d155620
--- /dev/null
+++ b/webapp/django/contrib/webdesign/tests.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+
+r"""
+>>> words(7)
+u'lorem ipsum dolor sit amet consectetur adipisicing'
+
+>>> paragraphs(1)
+['Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.']
+
+>>> from django.template import loader, Context
+>>> t = loader.get_template_from_string("{% load webdesign %}{% lorem 3 w %}")
+>>> t.render(Context({}))
+u'lorem ipsum dolor'
+"""
+
+from django.contrib.webdesign.lorem_ipsum import *
+
+if __name__ == '__main__':
+    import doctest
+    doctest.testmod()
diff --git a/webapp/django/core/__init__.py b/webapp/django/core/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/core/__init__.py
diff --git a/webapp/django/core/cache/__init__.py b/webapp/django/core/cache/__init__.py
new file mode 100644
index 0000000..93e7adb
--- /dev/null
+++ b/webapp/django/core/cache/__init__.py
@@ -0,0 +1,64 @@
+"""
+Caching framework.
+
+This package defines set of cache backends that all conform to a simple API.
+In a nutshell, a cache is a set of values -- which can be any object that
+may be pickled -- identified by string keys.  For the complete API, see
+the abstract BaseCache class in django.core.cache.backends.base.
+
+Client code should not access a cache backend directly; instead it should
+either use the "cache" variable made available here, or it should use the
+get_cache() function made available here. get_cache() takes a backend URI
+(e.g. "memcached://127.0.0.1:11211/") and returns an instance of a backend
+cache class.
+
+See docs/cache.txt for information on the public API.
+"""
+
+from cgi import parse_qsl
+from django.conf import settings
+from django.core import signals
+from django.core.cache.backends.base import InvalidCacheBackendError
+
+# Name for use in settings file --> name of module in "backends" directory.
+# Any backend scheme that is not in this dictionary is treated as a Python
+# import path to a custom backend.
+BACKENDS = {
+    'memcached': 'memcached',
+    'locmem': 'locmem',
+    'file': 'filebased',
+    'db': 'db',
+    'dummy': 'dummy',
+}
+
+def get_cache(backend_uri):
+    if backend_uri.find(':') == -1:
+        raise InvalidCacheBackendError, "Backend URI must start with scheme://"
+    scheme, rest = backend_uri.split(':', 1)
+    if not rest.startswith('//'):
+        raise InvalidCacheBackendError, "Backend URI must start with scheme://"
+
+    host = rest[2:]
+    qpos = rest.find('?')
+    if qpos != -1:
+        params = dict(parse_qsl(rest[qpos+1:]))
+        host = rest[2:qpos]
+    else:
+        params = {}
+    if host.endswith('/'):
+        host = host[:-1]
+
+    if scheme in BACKENDS:
+        module = __import__('django.core.cache.backends.%s' % BACKENDS[scheme], {}, {}, [''])
+    else:
+        module = __import__(scheme, {}, {}, [''])
+    return getattr(module, 'CacheClass')(host, params)
+
+cache = get_cache(settings.CACHE_BACKEND)
+
+# Some caches -- pythont-memcached in particular -- need to do a cleanup at the
+# end of a request cycle. If the cache provides a close() method, wire it up
+# here.
+if hasattr(cache, 'close'):
+    signals.request_finished.connect(cache.close)
+
diff --git a/webapp/django/core/cache/backends/__init__.py b/webapp/django/core/cache/backends/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/core/cache/backends/__init__.py
diff --git a/webapp/django/core/cache/backends/base.py b/webapp/django/core/cache/backends/base.py
new file mode 100644
index 0000000..cb5fe06
--- /dev/null
+++ b/webapp/django/core/cache/backends/base.py
@@ -0,0 +1,75 @@
+"Base Cache class."
+
+from django.core.exceptions import ImproperlyConfigured
+
+class InvalidCacheBackendError(ImproperlyConfigured):
+    pass
+
+class BaseCache(object):
+    def __init__(self, params):
+        timeout = params.get('timeout', 300)
+        try:
+            timeout = int(timeout)
+        except (ValueError, TypeError):
+            timeout = 300
+        self.default_timeout = timeout
+
+    def add(self, key, value, timeout=None):
+        """
+        Set a value in the cache if the key does not already exist. If
+        timeout is given, that timeout will be used for the key; otherwise
+        the default cache timeout will be used.
+
+        Returns True if the value was stored, False otherwise.
+        """
+        raise NotImplementedError
+
+    def get(self, key, default=None):
+        """
+        Fetch a given key from the cache. If the key does not exist, return
+        default, which itself defaults to None.
+        """
+        raise NotImplementedError
+
+    def set(self, key, value, timeout=None):
+        """
+        Set a value in the cache. If timeout is given, that timeout will be
+        used for the key; otherwise the default cache timeout will be used.
+        """
+        raise NotImplementedError
+
+    def delete(self, key):
+        """
+        Delete a key from the cache, failing silently.
+        """
+        raise NotImplementedError
+
+    def get_many(self, keys):
+        """
+        Fetch a bunch of keys from the cache. For certain backends (memcached,
+        pgsql) this can be *much* faster when fetching multiple values.
+
+        Returns a dict mapping each key in keys to its value. If the given
+        key is missing, it will be missing from the response dict.
+        """
+        d = {}
+        for k in keys:
+            val = self.get(k)
+            if val is not None:
+                d[k] = val
+        return d
+
+    def has_key(self, key):
+        """
+        Returns True if the key is in the cache and has not expired.
+        """
+        return self.get(key) is not None
+
+    def __contains__(self, key):
+        """
+        Returns True if the key is in the cache and has not expired.
+        """
+        # This is a separate method, rather than just a copy of has_key(),
+        # so that it always has the same functionality as has_key(), even
+        # if a subclass overrides it.
+        return self.has_key(key)
diff --git a/webapp/django/core/cache/backends/db.py b/webapp/django/core/cache/backends/db.py
new file mode 100644
index 0000000..d2b422a
--- /dev/null
+++ b/webapp/django/core/cache/backends/db.py
@@ -0,0 +1,89 @@
+"Database cache backend."
+
+from django.core.cache.backends.base import BaseCache
+from django.db import connection, transaction, DatabaseError
+import base64, time
+from datetime import datetime
+try:
+    import cPickle as pickle
+except ImportError:
+    import pickle
+
+class CacheClass(BaseCache):
+    def __init__(self, table, params):
+        BaseCache.__init__(self, params)
+        self._table = table
+        max_entries = params.get('max_entries', 300)
+        try:
+            self._max_entries = int(max_entries)
+        except (ValueError, TypeError):
+            self._max_entries = 300
+        cull_frequency = params.get('cull_frequency', 3)
+        try:
+            self._cull_frequency = int(cull_frequency)
+        except (ValueError, TypeError):
+            self._cull_frequency = 3
+
+    def get(self, key, default=None):
+        cursor = connection.cursor()
+        cursor.execute("SELECT cache_key, value, expires FROM %s WHERE cache_key = %%s" % self._table, [key])
+        row = cursor.fetchone()
+        if row is None:
+            return default
+        now = datetime.now()
+        if row[2] < now:
+            cursor.execute("DELETE FROM %s WHERE cache_key = %%s" % self._table, [key])
+            transaction.commit_unless_managed()
+            return default
+        return pickle.loads(base64.decodestring(row[1]))
+
+    def set(self, key, value, timeout=None):
+        self._base_set('set', key, value, timeout)
+
+    def add(self, key, value, timeout=None):
+        return self._base_set('add', key, value, timeout)
+
+    def _base_set(self, mode, key, value, timeout=None):
+        if timeout is None:
+            timeout = self.default_timeout
+        cursor = connection.cursor()
+        cursor.execute("SELECT COUNT(*) FROM %s" % self._table)
+        num = cursor.fetchone()[0]
+        now = datetime.now().replace(microsecond=0)
+        exp = datetime.fromtimestamp(time.time() + timeout).replace(microsecond=0)
+        if num > self._max_entries:
+            self._cull(cursor, now)
+        encoded = base64.encodestring(pickle.dumps(value, 2)).strip()
+        cursor.execute("SELECT cache_key FROM %s WHERE cache_key = %%s" % self._table, [key])
+        try:
+            if mode == 'set' and cursor.fetchone():
+                cursor.execute("UPDATE %s SET value = %%s, expires = %%s WHERE cache_key = %%s" % self._table, [encoded, str(exp), key])
+            else:
+                cursor.execute("INSERT INTO %s (cache_key, value, expires) VALUES (%%s, %%s, %%s)" % self._table, [key, encoded, str(exp)])
+        except DatabaseError:
+            # To be threadsafe, updates/inserts are allowed to fail silently
+            return False
+        else:
+            transaction.commit_unless_managed()
+            return True
+
+    def delete(self, key):
+        cursor = connection.cursor()
+        cursor.execute("DELETE FROM %s WHERE cache_key = %%s" % self._table, [key])
+        transaction.commit_unless_managed()
+
+    def has_key(self, key):
+        cursor = connection.cursor()
+        cursor.execute("SELECT cache_key FROM %s WHERE cache_key = %%s" % self._table, [key])
+        return cursor.fetchone() is not None
+
+    def _cull(self, cursor, now):
+        if self._cull_frequency == 0:
+            cursor.execute("DELETE FROM %s" % self._table)
+        else:
+            cursor.execute("DELETE FROM %s WHERE expires < %%s" % self._table, [str(now)])
+            cursor.execute("SELECT COUNT(*) FROM %s" % self._table)
+            num = cursor.fetchone()[0]
+            if num > self._max_entries:
+                cursor.execute("SELECT cache_key FROM %s ORDER BY cache_key LIMIT 1 OFFSET %%s" % self._table, [num / self._cull_frequency])
+                cursor.execute("DELETE FROM %s WHERE cache_key < %%s" % self._table, [cursor.fetchone()[0]])
diff --git a/webapp/django/core/cache/backends/dummy.py b/webapp/django/core/cache/backends/dummy.py
new file mode 100644
index 0000000..e479703
--- /dev/null
+++ b/webapp/django/core/cache/backends/dummy.py
@@ -0,0 +1,25 @@
+"Dummy cache backend"
+
+from django.core.cache.backends.base import BaseCache
+
+class CacheClass(BaseCache):
+    def __init__(self, *args, **kwargs):
+        pass
+
+    def add(self, *args, **kwargs):
+        return True
+
+    def get(self, key, default=None):
+        return default
+
+    def set(self, *args, **kwargs):
+        pass
+
+    def delete(self, *args, **kwargs):
+        pass
+
+    def get_many(self, *args, **kwargs):
+        return {}
+
+    def has_key(self, *args, **kwargs):
+        return False
diff --git a/webapp/django/core/cache/backends/filebased.py b/webapp/django/core/cache/backends/filebased.py
new file mode 100644
index 0000000..181197a
--- /dev/null
+++ b/webapp/django/core/cache/backends/filebased.py
@@ -0,0 +1,152 @@
+"File-based cache backend"
+
+import os
+import time
+try:
+    import cPickle as pickle
+except ImportError:
+    import pickle
+
+from django.core.cache.backends.base import BaseCache
+from django.utils.hashcompat import md5_constructor
+
+class CacheClass(BaseCache):
+    def __init__(self, dir, params):
+        BaseCache.__init__(self, params)
+
+        max_entries = params.get('max_entries', 300)
+        try:
+            self._max_entries = int(max_entries)
+        except (ValueError, TypeError):
+            self._max_entries = 300
+
+        cull_frequency = params.get('cull_frequency', 3)
+        try:
+            self._cull_frequency = int(cull_frequency)
+        except (ValueError, TypeError):
+            self._cull_frequency = 3
+
+        self._dir = dir
+        if not os.path.exists(self._dir):
+            self._createdir()
+
+    def add(self, key, value, timeout=None):
+        if self.has_key(key):
+            return False
+
+        self.set(key, value, timeout)
+        return True
+
+    def get(self, key, default=None):
+        fname = self._key_to_file(key)
+        try:
+            f = open(fname, 'rb')
+            exp = pickle.load(f)
+            now = time.time()
+            if exp < now:
+                f.close()
+                self._delete(fname)
+            else:
+                return pickle.load(f)
+        except (IOError, OSError, EOFError, pickle.PickleError):
+            pass
+        return default
+
+    def set(self, key, value, timeout=None):
+        fname = self._key_to_file(key)
+        dirname = os.path.dirname(fname)
+
+        if timeout is None:
+            timeout = self.default_timeout
+
+        self._cull()
+
+        try:
+            if not os.path.exists(dirname):
+                os.makedirs(dirname)
+
+            f = open(fname, 'wb')
+            now = time.time()
+            pickle.dump(now + timeout, f, pickle.HIGHEST_PROTOCOL)
+            pickle.dump(value, f, pickle.HIGHEST_PROTOCOL)
+        except (IOError, OSError):
+            pass
+
+    def delete(self, key):
+        try:
+            self._delete(self._key_to_file(key))
+        except (IOError, OSError):
+            pass
+
+    def _delete(self, fname):
+        os.remove(fname)
+        try:
+            # Remove the 2 subdirs if they're empty
+            dirname = os.path.dirname(fname)
+            os.rmdir(dirname)
+            os.rmdir(os.path.dirname(dirname))
+        except (IOError, OSError):
+            pass
+
+    def has_key(self, key):
+        fname = self._key_to_file(key)
+        try:
+            f = open(fname, 'rb')
+            exp = pickle.load(f)
+            now = time.time()
+            if exp < now:
+                f.close()
+                self._delete(fname)
+                return False
+            else:
+                return True
+        except (IOError, OSError, EOFError, pickle.PickleError):
+            return False
+
+    def _cull(self):
+        if int(self._num_entries) < self._max_entries:
+            return
+
+        try:
+            filelist = os.listdir(self._dir)
+        except (IOError, OSError):
+            return
+
+        if self._cull_frequency == 0:
+            doomed = filelist
+        else:
+            doomed = [os.path.join(self._dir, k) for (i, k) in enumerate(filelist) if i % self._cull_frequency == 0]
+
+        for topdir in doomed:
+            try:
+                for root, _, files in os.walk(topdir):
+                    for f in files:
+                        self._delete(os.path.join(root, f))
+            except (IOError, OSError):
+                pass
+
+    def _createdir(self):
+        try:
+            os.makedirs(self._dir)
+        except OSError:
+            raise EnvironmentError, "Cache directory '%s' does not exist and could not be created'" % self._dir
+
+    def _key_to_file(self, key):
+        """
+        Convert the filename into an md5 string. We'll turn the first couple
+        bits of the path into directory prefixes to be nice to filesystems
+        that have problems with large numbers of files in a directory.
+
+        Thus, a cache key of "foo" gets turnned into a file named
+        ``{cache-dir}ac/bd/18db4cc2f85cedef654fccc4a4d8``.
+        """
+        path = md5_constructor(key.encode('utf-8')).hexdigest()
+        path = os.path.join(path[:2], path[2:4], path[4:])
+        return os.path.join(self._dir, path)
+
+    def _get_num_entries(self):
+        count = 0
+        for _,_,files in os.walk(self._dir):
+            count += len(files)
+        return count
+    _num_entries = property(_get_num_entries)
diff --git a/webapp/django/core/cache/backends/locmem.py b/webapp/django/core/cache/backends/locmem.py
new file mode 100644
index 0000000..15a169d
--- /dev/null
+++ b/webapp/django/core/cache/backends/locmem.py
@@ -0,0 +1,129 @@
+"Thread-safe in-memory cache backend."
+
+import time
+try:
+    import cPickle as pickle
+except ImportError:
+    import pickle
+
+from django.core.cache.backends.base import BaseCache
+from django.utils.synch import RWLock
+
+class CacheClass(BaseCache):
+    def __init__(self, _, params):
+        BaseCache.__init__(self, params)
+        self._cache = {}
+        self._expire_info = {}
+
+        max_entries = params.get('max_entries', 300)
+        try:
+            self._max_entries = int(max_entries)
+        except (ValueError, TypeError):
+            self._max_entries = 300
+
+        cull_frequency = params.get('cull_frequency', 3)
+        try:
+            self._cull_frequency = int(cull_frequency)
+        except (ValueError, TypeError):
+            self._cull_frequency = 3
+
+        self._lock = RWLock()
+
+    def add(self, key, value, timeout=None):
+        self._lock.writer_enters()
+        try:
+            exp = self._expire_info.get(key)
+            if exp is None or exp <= time.time():
+                try:
+                    self._set(key, pickle.dumps(value), timeout)
+                    return True
+                except pickle.PickleError:
+                    pass
+            return False
+        finally:
+            self._lock.writer_leaves()
+
+    def get(self, key, default=None):
+        self._lock.reader_enters()
+        try:
+            exp = self._expire_info.get(key)
+            if exp is None:
+                return default
+            elif exp > time.time():
+                try:
+                    return pickle.loads(self._cache[key])
+                except pickle.PickleError:
+                    return default
+        finally:
+            self._lock.reader_leaves()
+        self._lock.writer_enters()
+        try:
+            del self._cache[key]
+            del self._expire_info[key]
+            return default
+        finally:
+            self._lock.writer_leaves()
+
+    def _set(self, key, value, timeout=None):
+        if len(self._cache) >= self._max_entries:
+            self._cull()
+        if timeout is None:
+            timeout = self.default_timeout
+        self._cache[key] = value
+        self._expire_info[key] = time.time() + timeout
+
+    def set(self, key, value, timeout=None):
+        self._lock.writer_enters()
+        # Python 2.3 and 2.4 don't allow combined try-except-finally blocks.
+        try:
+            try:
+                self._set(key, pickle.dumps(value), timeout)
+            except pickle.PickleError:
+                pass
+        finally:
+            self._lock.writer_leaves()
+
+    def has_key(self, key):
+        self._lock.reader_enters()
+        try:
+            exp = self._expire_info.get(key)
+            if exp is None:
+                return False
+            elif exp > time.time():
+                return True
+        finally:
+            self._lock.reader_leaves()
+
+        self._lock.writer_enters()
+        try:
+            del self._cache[key]
+            del self._expire_info[key]
+            return False
+        finally:
+            self._lock.writer_leaves()
+
+    def _cull(self):
+        if self._cull_frequency == 0:
+            self._cache.clear()
+            self._expire_info.clear()
+        else:
+            doomed = [k for (i, k) in enumerate(self._cache) if i % self._cull_frequency == 0]
+            for k in doomed:
+                self._delete(k)
+
+    def _delete(self, key):
+        try:
+            del self._cache[key]
+        except KeyError:
+            pass
+        try:
+            del self._expire_info[key]
+        except KeyError:
+            pass
+
+    def delete(self, key):
+        self._lock.writer_enters()
+        try:
+            self._delete(key)
+        finally:
+            self._lock.writer_leaves()
diff --git a/webapp/django/core/cache/backends/memcached.py b/webapp/django/core/cache/backends/memcached.py
new file mode 100644
index 0000000..beb8844
--- /dev/null
+++ b/webapp/django/core/cache/backends/memcached.py
@@ -0,0 +1,47 @@
+"Memcached cache backend"
+
+from django.core.cache.backends.base import BaseCache, InvalidCacheBackendError
+from django.utils.encoding import smart_unicode, smart_str
+
+try:
+    import cmemcache as memcache
+except ImportError:
+    try:
+        import memcache
+    except:
+        raise InvalidCacheBackendError("Memcached cache backend requires either the 'memcache' or 'cmemcache' library")
+
+class CacheClass(BaseCache):
+    def __init__(self, server, params):
+        BaseCache.__init__(self, params)
+        self._cache = memcache.Client(server.split(';'))
+
+    def add(self, key, value, timeout=0):
+        if isinstance(value, unicode):
+            value = value.encode('utf-8')
+        return self._cache.add(smart_str(key), value, timeout or self.default_timeout)
+
+    def get(self, key, default=None):
+        val = self._cache.get(smart_str(key))
+        if val is None:
+            return default
+        else:
+            if isinstance(val, basestring):
+                return smart_unicode(val)
+            else:
+                return val
+
+    def set(self, key, value, timeout=0):
+        if isinstance(value, unicode):
+            value = value.encode('utf-8')
+        self._cache.set(smart_str(key), value, timeout or self.default_timeout)
+
+    def delete(self, key):
+        self._cache.delete(smart_str(key))
+
+    def get_many(self, keys):
+        return self._cache.get_multi(map(smart_str,keys))
+
+    def close(self, **kwargs):
+        self._cache.disconnect_all()
+
diff --git a/webapp/django/core/context_processors.py b/webapp/django/core/context_processors.py
new file mode 100644
index 0000000..cb07125
--- /dev/null
+++ b/webapp/django/core/context_processors.py
@@ -0,0 +1,85 @@
+"""
+A set of request processors that return dictionaries to be merged into a
+template context. Each function takes the request object as its only parameter
+and returns a dictionary to add to the context.
+
+These are referenced from the setting TEMPLATE_CONTEXT_PROCESSORS and used by
+RequestContext.
+"""
+
+from django.conf import settings
+
+def auth(request):
+    """
+    Returns context variables required by apps that use Django's authentication
+    system.
+
+    If there is no 'user' attribute in the request, uses AnonymousUser (from
+    django.contrib.auth).
+    """
+    if hasattr(request, 'user'):
+        user = request.user
+    else:
+        from django.contrib.auth.models import AnonymousUser
+        user = AnonymousUser()
+    return {
+        'user': user,
+        'messages': user.get_and_delete_messages(),
+        'perms': PermWrapper(user),
+    }
+
+def debug(request):
+    "Returns context variables helpful for debugging."
+    context_extras = {}
+    if settings.DEBUG and request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS:
+        context_extras['debug'] = True
+        from django.db import connection
+        context_extras['sql_queries'] = connection.queries
+    return context_extras
+
+def i18n(request):
+    from django.utils import translation
+
+    context_extras = {}
+    context_extras['LANGUAGES'] = settings.LANGUAGES
+    context_extras['LANGUAGE_CODE'] = translation.get_language()
+    context_extras['LANGUAGE_BIDI'] = translation.get_language_bidi()
+
+    return context_extras
+
+def media(request):
+    """
+    Adds media-related context variables to the context.
+
+    """
+    return {'MEDIA_URL': settings.MEDIA_URL}
+
+def request(request):
+    return {'request': request}
+
+# PermWrapper and PermLookupDict proxy the permissions system into objects that
+# the template system can understand.
+
+class PermLookupDict(object):
+    def __init__(self, user, module_name):
+        self.user, self.module_name = user, module_name
+
+    def __repr__(self):
+        return str(self.user.get_all_permissions())
+
+    def __getitem__(self, perm_name):
+        return self.user.has_perm("%s.%s" % (self.module_name, perm_name))
+
+    def __nonzero__(self):
+        return self.user.has_module_perms(self.module_name)
+
+class PermWrapper(object):
+    def __init__(self, user):
+        self.user = user
+
+    def __getitem__(self, module_name):
+        return PermLookupDict(self.user, module_name)
+        
+    def __iter__(self):
+        # I am large, I contain multitudes.
+        raise TypeError("PermWrapper is not iterable.")
diff --git a/webapp/django/core/exceptions.py b/webapp/django/core/exceptions.py
new file mode 100644
index 0000000..e5df8ca
--- /dev/null
+++ b/webapp/django/core/exceptions.py
@@ -0,0 +1,34 @@
+"Global Django exceptions"
+
+class ObjectDoesNotExist(Exception):
+    "The requested object does not exist"
+    silent_variable_failure = True
+
+class MultipleObjectsReturned(Exception):
+    "The query returned multiple objects when only one was expected."
+    pass
+
+class SuspiciousOperation(Exception):
+    "The user did something suspicious"
+    pass
+
+class PermissionDenied(Exception):
+    "The user did not have permission to do that"
+    pass
+
+class ViewDoesNotExist(Exception):
+    "The requested view does not exist"
+    pass
+
+class MiddlewareNotUsed(Exception):
+    "This middleware is not used in this server configuration"
+    pass
+
+class ImproperlyConfigured(Exception):
+    "Django is somehow improperly configured"
+    pass
+
+class FieldError(Exception):
+    """Some kind of problem with a model field."""
+    pass
+
diff --git a/webapp/django/core/files/__init__.py b/webapp/django/core/files/__init__.py
new file mode 100644
index 0000000..0c3ef57
--- /dev/null
+++ b/webapp/django/core/files/__init__.py
@@ -0,0 +1 @@
+from django.core.files.base import File
diff --git a/webapp/django/core/files/base.py b/webapp/django/core/files/base.py
new file mode 100644
index 0000000..69739d6
--- /dev/null
+++ b/webapp/django/core/files/base.py
@@ -0,0 +1,169 @@
+import os
+
+from django.utils.encoding import smart_str, smart_unicode
+
+try:
+    from cStringIO import StringIO
+except ImportError:
+    from StringIO import StringIO
+
+class File(object):
+    DEFAULT_CHUNK_SIZE = 64 * 2**10
+
+    def __init__(self, file):
+        self.file = file
+        self._name = file.name
+        self._mode = file.mode
+        self._closed = False
+
+    def __str__(self):
+        return smart_str(self.name or '')
+
+    def __unicode__(self):
+        return smart_unicode(self.name or u'')
+
+    def __repr__(self):
+        return "<%s: %s>" % (self.__class__.__name__, self or "None")
+
+    def __nonzero__(self):
+        return not not self.name
+
+    def __len__(self):
+        return self.size
+
+    def _get_name(self):
+        return self._name
+    name = property(_get_name)
+
+    def _get_mode(self):
+        return self._mode
+    mode = property(_get_mode)
+
+    def _get_closed(self):
+        return self._closed
+    closed = property(_get_closed)
+
+    def _get_size(self):
+        if not hasattr(self, '_size'):
+            if hasattr(self.file, 'size'):
+                self._size = self.file.size
+            elif os.path.exists(self.file.name):
+                self._size = os.path.getsize(self.file.name)
+            else:
+                raise AttributeError("Unable to determine the file's size.")
+        return self._size
+
+    def _set_size(self, size):
+        self._size = size
+
+    size = property(_get_size, _set_size)
+
+    def chunks(self, chunk_size=None):
+        """
+        Read the file and yield chucks of ``chunk_size`` bytes (defaults to
+        ``UploadedFile.DEFAULT_CHUNK_SIZE``).
+        """
+        if not chunk_size:
+            chunk_size = self.__class__.DEFAULT_CHUNK_SIZE
+
+        if hasattr(self, 'seek'):
+            self.seek(0)
+        # Assume the pointer is at zero...
+        counter = self.size
+
+        while counter > 0:
+            yield self.read(chunk_size)
+            counter -= chunk_size
+
+    def multiple_chunks(self, chunk_size=None):
+        """
+        Returns ``True`` if you can expect multiple chunks.
+
+        NB: If a particular file representation is in memory, subclasses should
+        always return ``False`` -- there's no good reason to read from memory in
+        chunks.
+        """
+        if not chunk_size:
+            chunk_size = self.DEFAULT_CHUNK_SIZE
+        return self.size > chunk_size
+
+    def xreadlines(self):
+        return iter(self)
+
+    def readlines(self):
+        return list(self.xreadlines())
+
+    def __iter__(self):
+        # Iterate over this file-like object by newlines
+        buffer_ = None
+        for chunk in self.chunks():
+            chunk_buffer = StringIO(chunk)
+
+            for line in chunk_buffer:
+                if buffer_:
+                    line = buffer_ + line
+                    buffer_ = None
+
+                # If this is the end of a line, yield
+                # otherwise, wait for the next round
+                if line[-1] in ('\n', '\r'):
+                    yield line
+                else:
+                    buffer_ = line
+
+        if buffer_ is not None:
+            yield buffer_
+
+    def open(self, mode=None):
+        if not self.closed:
+            self.seek(0)
+        elif os.path.exists(self.file.name):
+            self.file = open(self.file.name, mode or self.file.mode)
+        else:
+            raise ValueError("The file cannot be reopened.")
+
+    def seek(self, position):
+        self.file.seek(position)
+
+    def tell(self):
+        return self.file.tell()
+
+    def read(self, num_bytes=None):
+        if num_bytes is None:
+            return self.file.read()
+        return self.file.read(num_bytes)
+
+    def write(self, content):
+        if not self.mode.startswith('w'):
+            raise IOError("File was not opened with write access.")
+        self.file.write(content)
+
+    def flush(self):
+        if not self.mode.startswith('w'):
+            raise IOError("File was not opened with write access.")
+        self.file.flush()
+
+    def close(self):
+        self.file.close()
+        self._closed = True
+
+class ContentFile(File):
+    """
+    A File-like object that takes just raw content, rather than an actual file.
+    """
+    def __init__(self, content):
+        self.file = StringIO(content or '')
+        self.size = len(content or '')
+        self.file.seek(0)
+        self._closed = False
+
+    def __str__(self):
+        return 'Raw content'
+
+    def __nonzero__(self):
+        return True
+
+    def open(self, mode=None):
+        if self._closed:
+            self._closed = False
+        self.seek(0)
diff --git a/webapp/django/core/files/images.py b/webapp/django/core/files/images.py
new file mode 100644
index 0000000..5ddcdd4
--- /dev/null
+++ b/webapp/django/core/files/images.py
@@ -0,0 +1,42 @@
+"""
+Utility functions for handling images.
+
+Requires PIL, as you might imagine.
+"""
+
+from django.core.files import File
+
+class ImageFile(File):
+    """
+    A mixin for use alongside django.core.files.base.File, which provides
+    additional features for dealing with images.
+    """
+    def _get_width(self):
+        return self._get_image_dimensions()[0]
+    width = property(_get_width)
+
+    def _get_height(self):
+        return self._get_image_dimensions()[1]
+    height = property(_get_height)
+
+    def _get_image_dimensions(self):
+        if not hasattr(self, '_dimensions_cache'):
+            self._dimensions_cache = get_image_dimensions(self)
+        return self._dimensions_cache
+
+def get_image_dimensions(file_or_path):
+    """Returns the (width, height) of an image, given an open file or a path."""
+    from PIL import ImageFile as PILImageFile
+    p = PILImageFile.Parser()
+    if hasattr(file_or_path, 'read'):
+        file = file_or_path
+    else:
+        file = open(file_or_path, 'rb')
+    while 1:
+        data = file.read(1024)
+        if not data:
+            break
+        p.feed(data)
+        if p.image:
+            return p.image.size
+    return None
diff --git a/webapp/django/core/files/locks.py b/webapp/django/core/files/locks.py
new file mode 100644
index 0000000..98a1155
--- /dev/null
+++ b/webapp/django/core/files/locks.py
@@ -0,0 +1,70 @@
+"""
+Portable file locking utilities.
+
+Based partially on example by Jonathan Feignberg <jdf@pobox.com> in the Python
+Cookbook, licensed under the Python Software License.
+
+    http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/65203
+
+Example Usage::
+
+    >>> from django.core.files import locks
+    >>> f = open('./file', 'wb')
+    >>> locks.lock(f, locks.LOCK_EX)
+    >>> f.write('Django')
+    >>> f.close()
+"""
+
+__all__ = ('LOCK_EX','LOCK_SH','LOCK_NB','lock','unlock')
+
+system_type = None
+
+try:
+    import win32con
+    import win32file
+    import pywintypes
+    LOCK_EX = win32con.LOCKFILE_EXCLUSIVE_LOCK
+    LOCK_SH = 0
+    LOCK_NB = win32con.LOCKFILE_FAIL_IMMEDIATELY
+    __overlapped = pywintypes.OVERLAPPED()
+    system_type = 'nt'
+except (ImportError, AttributeError):
+    pass
+
+try:
+    import fcntl
+    LOCK_EX = fcntl.LOCK_EX
+    LOCK_SH = fcntl.LOCK_SH
+    LOCK_NB = fcntl.LOCK_NB
+    system_type = 'posix'
+except (ImportError, AttributeError):
+    pass
+
+def fd(f):
+    """Get a filedescriptor from something which could be a file or an fd."""
+    return hasattr(f, 'fileno') and f.fileno() or f
+
+if system_type == 'nt':
+    def lock(file, flags):
+        hfile = win32file._get_osfhandle(fd(file))
+        win32file.LockFileEx(hfile, flags, 0, -0x10000, __overlapped)
+
+    def unlock(file):
+        hfile = win32file._get_osfhandle(fd(file))
+        win32file.UnlockFileEx(hfile, 0, -0x10000, __overlapped)
+elif system_type == 'posix':
+    def lock(file, flags):
+        fcntl.flock(fd(file), flags)
+
+    def unlock(file):
+        fcntl.flock(fd(file), fcntl.LOCK_UN)
+else:
+    # File locking is not supported.
+    LOCK_EX = LOCK_SH = LOCK_NB = None
+
+    # Dummy functions that don't do anything.
+    def lock(file, flags):
+        pass
+
+    def unlock(file):
+        pass
diff --git a/webapp/django/core/files/move.py b/webapp/django/core/files/move.py
new file mode 100644
index 0000000..58a0ab1
--- /dev/null
+++ b/webapp/django/core/files/move.py
@@ -0,0 +1,88 @@
+"""
+Move a file in the safest way possible::
+
+    >>> from django.core.files.move import file_move_save
+    >>> file_move_save("/tmp/old_file", "/tmp/new_file")
+"""
+
+import os
+from django.core.files import locks
+
+try:
+    from shutil import copystat
+except ImportError:
+    def copystat(src, dst):
+        """Copy all stat info (mode bits, atime and mtime) from src to dst"""
+        st = os.stat(src)
+        mode = stat.S_IMODE(st.st_mode)
+        if hasattr(os, 'utime'):
+            os.utime(dst, (st.st_atime, st.st_mtime))
+        if hasattr(os, 'chmod'):
+            os.chmod(dst, mode)
+
+__all__ = ['file_move_safe']
+
+def _samefile(src, dst):
+    # Macintosh, Unix.
+    if hasattr(os.path,'samefile'):
+        try:
+            return os.path.samefile(src, dst)
+        except OSError:
+            return False
+
+    # All other platforms: check for same pathname.
+    return (os.path.normcase(os.path.abspath(src)) ==
+            os.path.normcase(os.path.abspath(dst)))
+
+def file_move_safe(old_file_name, new_file_name, chunk_size = 1024*64, allow_overwrite=False):
+    """
+    Moves a file from one location to another in the safest way possible.
+
+    First, try using ``shutils.move``, which is OS-dependent but doesn't break
+    if moving across filesystems. Then, try ``os.rename``, which will break
+    across filesystems. Finally, streams manually from one file to another in
+    pure Python.
+
+    If the destination file exists and ``allow_overwrite`` is ``False``, this
+    function will throw an ``IOError``.
+    """
+
+    # There's no reason to move if we don't have to.
+    if _samefile(old_file_name, new_file_name):
+        return
+
+    try:
+        os.rename(old_file_name, new_file_name)
+        return
+    except OSError:
+        # This will happen with os.rename if moving to another filesystem
+        # or when moving opened files on certain operating systems
+        pass
+
+    # first open the old file, so that it won't go away
+    old_file = open(old_file_name, 'rb')
+    try:
+        # now open the new file, not forgetting allow_overwrite
+        fd = os.open(new_file_name, os.O_WRONLY | os.O_CREAT | getattr(os, 'O_BINARY', 0) |
+                                    (not allow_overwrite and os.O_EXCL or 0))
+        try:
+            locks.lock(fd, locks.LOCK_EX)
+            current_chunk = None
+            while current_chunk != '':
+                current_chunk = old_file.read(chunk_size)
+                os.write(fd, current_chunk)
+        finally:
+            locks.unlock(fd)
+            os.close(fd)
+    finally:
+        old_file.close()
+    copystat(old_file_name, new_file_name)
+
+    try:
+        os.remove(old_file_name)
+    except OSError, e:
+        # Certain operating systems (Cygwin and Windows)
+        # fail when deleting opened files, ignore it
+        if getattr(e, 'winerror', 0) != 32:
+            # FIXME: should we also ignore errno 13?
+            raise
diff --git a/webapp/django/core/files/storage.py b/webapp/django/core/files/storage.py
new file mode 100644
index 0000000..30d9be9
--- /dev/null
+++ b/webapp/django/core/files/storage.py
@@ -0,0 +1,224 @@
+import os
+import urlparse
+
+from django.conf import settings
+from django.core.exceptions import ImproperlyConfigured, SuspiciousOperation
+from django.utils.encoding import force_unicode
+from django.utils.text import get_valid_filename
+from django.utils._os import safe_join
+from django.core.files import locks, File
+from django.core.files.move import file_move_safe
+
+__all__ = ('Storage', 'FileSystemStorage', 'DefaultStorage', 'default_storage')
+
+class Storage(object):
+    """
+    A base storage class, providing some default behaviors that all other
+    storage systems can inherit or override, as necessary.
+    """
+
+    # The following methods represent a public interface to private methods.
+    # These shouldn't be overridden by subclasses unless absolutely necessary.
+
+    def open(self, name, mode='rb', mixin=None):
+        """
+        Retrieves the specified file from storage, using the optional mixin
+        class to customize what features are available on the File returned.
+        """
+        file = self._open(name, mode)
+        if mixin:
+            # Add the mixin as a parent class of the File returned from storage.
+            file.__class__ = type(mixin.__name__, (mixin, file.__class__), {})
+        return file
+
+    def save(self, name, content):
+        """
+        Saves new content to the file specified by name. The content should be a
+        proper File object, ready to be read from the beginning.
+        """
+        # Get the proper name for the file, as it will actually be saved.
+        if name is None:
+            name = content.name
+        
+        name = self.get_available_name(name)
+        name = self._save(name, content)
+
+        # Store filenames with forward slashes, even on Windows
+        return force_unicode(name.replace('\\', '/'))
+
+    # These methods are part of the public API, with default implementations.
+
+    def get_valid_name(self, name):
+        """
+        Returns a filename, based on the provided filename, that's suitable for
+        use in the target storage system.
+        """
+        return get_valid_filename(name)
+
+    def get_available_name(self, name):
+        """
+        Returns a filename that's free on the target storage system, and
+        available for new content to be written to.
+        """
+        # If the filename already exists, keep adding an underscore to the name
+        # of the file until the filename doesn't exist.
+        while self.exists(name):
+            try:
+                dot_index = name.rindex('.')
+            except ValueError: # filename has no dot
+                name += '_'
+            else:
+                name = name[:dot_index] + '_' + name[dot_index:]
+        return name
+
+    def path(self, name):
+        """
+        Returns a local filesystem path where the file can be retrieved using
+        Python's built-in open() function. Storage systems that can't be
+        accessed using open() should *not* implement this method.
+        """
+        raise NotImplementedError("This backend doesn't support absolute paths.")
+
+    # The following methods form the public API for storage systems, but with
+    # no default implementations. Subclasses must implement *all* of these.
+
+    def delete(self, name):
+        """
+        Deletes the specified file from the storage system.
+        """
+        raise NotImplementedError()
+
+    def exists(self, name):
+        """
+        Returns True if a file referened by the given name already exists in the
+        storage system, or False if the name is available for a new file.
+        """
+        raise NotImplementedError()
+
+    def listdir(self, path):
+        """
+        Lists the contents of the specified path, returning a 2-tuple of lists;
+        the first item being directories, the second item being files.
+        """
+        raise NotImplementedError()
+
+    def size(self, name):
+        """
+        Returns the total size, in bytes, of the file specified by name.
+        """
+        raise NotImplementedError()
+
+    def url(self, name):
+        """
+        Returns an absolute URL where the file's contents can be accessed
+        directly by a web browser.
+        """
+        raise NotImplementedError()
+
+class FileSystemStorage(Storage):
+    """
+    Standard filesystem storage
+    """
+
+    def __init__(self, location=settings.MEDIA_ROOT, base_url=settings.MEDIA_URL):
+        self.location = os.path.abspath(location)
+        self.base_url = base_url
+
+    def _open(self, name, mode='rb'):
+        return File(open(self.path(name), mode))
+
+    def _save(self, name, content):
+        full_path = self.path(name)
+
+        directory = os.path.dirname(full_path)
+        if not os.path.exists(directory):
+            os.makedirs(directory)
+        elif not os.path.isdir(directory):
+            raise IOError("%s exists and is not a directory." % directory)
+
+        # There's a potential race condition between get_available_name and
+        # saving the file; it's possible that two threads might return the
+        # same name, at which point all sorts of fun happens. So we need to
+        # try to create the file, but if it already exists we have to go back
+        # to get_available_name() and try again.
+
+        while True:
+            try:
+                # This file has a file path that we can move.
+                if hasattr(content, 'temporary_file_path'):
+                    file_move_safe(content.temporary_file_path(), full_path)
+                    content.close()
+
+                # This is a normal uploadedfile that we can stream.
+                else:
+                    # This fun binary flag incantation makes os.open throw an
+                    # OSError if the file already exists before we open it.
+                    fd = os.open(full_path, os.O_WRONLY | os.O_CREAT | os.O_EXCL | getattr(os, 'O_BINARY', 0))
+                    try:
+                        locks.lock(fd, locks.LOCK_EX)
+                        for chunk in content.chunks():
+                            os.write(fd, chunk)
+                    finally:
+                        locks.unlock(fd)
+                        os.close(fd)
+            except OSError:
+                # Ooops, we need a new file name.
+                name = self.get_available_name(name)
+                full_path = self.path(name)
+            else:
+                # OK, the file save worked. Break out of the loop.
+                break
+                
+        return name
+
+    def delete(self, name):
+        name = self.path(name)
+        # If the file exists, delete it from the filesystem.
+        if os.path.exists(name):
+            os.remove(name)
+
+    def exists(self, name):
+        return os.path.exists(self.path(name))
+
+    def listdir(self, path):
+        path = self.path(path)
+        directories, files = [], []
+        for entry in os.listdir(path):
+            if os.path.isdir(os.path.join(path, entry)):
+                directories.append(entry)
+            else:
+                files.append(entry)
+        return directories, files
+
+    def path(self, name):
+        try:
+            path = safe_join(self.location, name)
+        except ValueError:
+            raise SuspiciousOperation("Attempted access to '%s' denied." % name)
+        return os.path.normpath(path)
+
+    def size(self, name):
+        return os.path.getsize(self.path(name))
+
+    def url(self, name):
+        if self.base_url is None:
+            raise ValueError("This file is not accessible via a URL.")
+        return urlparse.urljoin(self.base_url, name).replace('\\', '/')
+
+def get_storage_class(import_path):
+    try:
+        dot = import_path.rindex('.')
+    except ValueError:
+        raise ImproperlyConfigured("%s isn't a storage module." % import_path)
+    module, classname = import_path[:dot], import_path[dot+1:]
+    try:
+        mod = __import__(module, {}, {}, [''])
+    except ImportError, e:
+        raise ImproperlyConfigured('Error importing storage module %s: "%s"' % (module, e))
+    try:
+        return getattr(mod, classname)
+    except AttributeError:
+        raise ImproperlyConfigured('Storage module "%s" does not define a "%s" class.' % (module, classname))
+
+DefaultStorage = get_storage_class(settings.DEFAULT_FILE_STORAGE)
+default_storage = DefaultStorage()
diff --git a/webapp/django/core/files/temp.py b/webapp/django/core/files/temp.py
new file mode 100644
index 0000000..f0d7d74
--- /dev/null
+++ b/webapp/django/core/files/temp.py
@@ -0,0 +1,62 @@
+"""
+The temp module provides a NamedTemporaryFile that can be re-opened on any
+platform. Most platforms use the standard Python tempfile.TemporaryFile class,
+but MS Windows users are given a custom class.
+
+This is needed because in Windows NT, the default implementation of
+NamedTemporaryFile uses the O_TEMPORARY flag, and thus cannot be reopened [1].
+
+1: http://mail.python.org/pipermail/python-list/2005-December/359474.html
+"""
+
+import os
+import tempfile
+
+__all__ = ('NamedTemporaryFile', 'gettempdir',)
+
+if os.name == 'nt':
+    class TemporaryFile(object):
+        """
+        Temporary file object constructor that works in Windows and supports
+        reopening of the temporary file in windows.
+        """
+        def __init__(self, mode='w+b', bufsize=-1, suffix='', prefix='',
+                dir=None):
+            fd, name = tempfile.mkstemp(suffix=suffix, prefix=prefix,
+                                          dir=dir)
+            self.name = name
+            self.file = os.fdopen(fd, mode, bufsize)
+            self.close_called = False
+
+        # Because close can be called during shutdown
+        # we need to cache os.unlink and access it
+        # as self.unlink only
+        unlink = os.unlink
+
+        def close(self):
+            if not self.close_called:
+                self.close_called = True
+                try:
+                    self.file.close()
+                except (OSError, IOError):
+                    pass
+                try:
+                    self.unlink(self.name)
+                except (OSError):
+                    pass
+
+        def __del__(self):
+            self.close()
+
+        def read(self, *args):          return self.file.read(*args)
+        def seek(self, offset):         return self.file.seek(offset)
+        def write(self, s):             return self.file.write(s)
+        def __iter__(self):             return iter(self.file)
+        def readlines(self, size=None): return self.file.readlines(size)
+        def xreadlines(self):           return self.file.xreadlines()
+
+    NamedTemporaryFile = TemporaryFile
+else:
+    NamedTemporaryFile = tempfile.NamedTemporaryFile
+
+gettempdir = tempfile.gettempdir
diff --git a/webapp/django/core/files/uploadedfile.py b/webapp/django/core/files/uploadedfile.py
new file mode 100644
index 0000000..afbcdba
--- /dev/null
+++ b/webapp/django/core/files/uploadedfile.py
@@ -0,0 +1,156 @@
+"""
+Classes representing uploaded files.
+"""
+
+import os
+try:
+    from cStringIO import StringIO
+except ImportError:
+    from StringIO import StringIO
+
+from django.conf import settings
+from django.core.files.base import File
+from django.core.files import temp as tempfile
+
+__all__ = ('UploadedFile', 'TemporaryUploadedFile', 'InMemoryUploadedFile',
+           'SimpleUploadedFile')
+
+class UploadedFile(File):
+    """
+    A abstract uploaded file (``TemporaryUploadedFile`` and
+    ``InMemoryUploadedFile`` are the built-in concrete subclasses).
+
+    An ``UploadedFile`` object behaves somewhat like a file object and
+    represents some file data that the user submitted with a form.
+    """
+    DEFAULT_CHUNK_SIZE = 64 * 2**10
+
+    def __init__(self, name=None, content_type=None, size=None, charset=None):
+        self.name = name
+        self.size = size
+        self.content_type = content_type
+        self.charset = charset
+
+    def __repr__(self):
+        return "<%s: %s (%s)>" % (self.__class__.__name__, self.name, self.content_type)
+
+    def _get_name(self):
+        return self._name
+
+    def _set_name(self, name):
+        # Sanitize the file name so that it can't be dangerous.
+        if name is not None:
+            # Just use the basename of the file -- anything else is dangerous.
+            name = os.path.basename(name)
+
+            # File names longer than 255 characters can cause problems on older OSes.
+            if len(name) > 255:
+                name, ext = os.path.splitext(name)
+                name = name[:255 - len(ext)] + ext
+
+        self._name = name
+
+    name = property(_get_name, _set_name)
+
+    # Abstract methods; subclasses *must* define read() and probably should
+    # define open/close.
+    def read(self, num_bytes=None):
+        raise NotImplementedError()
+
+    def open(self):
+        pass
+
+    def close(self):
+        pass
+
+class TemporaryUploadedFile(UploadedFile):
+    """
+    A file uploaded to a temporary location (i.e. stream-to-disk).
+    """
+    def __init__(self, name, content_type, size, charset):
+        super(TemporaryUploadedFile, self).__init__(name, content_type, size, charset)
+        if settings.FILE_UPLOAD_TEMP_DIR:
+            self._file = tempfile.NamedTemporaryFile(suffix='.upload', dir=settings.FILE_UPLOAD_TEMP_DIR)
+        else:
+            self._file = tempfile.NamedTemporaryFile(suffix='.upload')
+
+    def temporary_file_path(self):
+        """
+        Returns the full path of this file.
+        """
+        return self._file.name
+
+    # Most methods on this object get proxied to NamedTemporaryFile.
+    # We can't directly subclass because NamedTemporaryFile is actually a
+    # factory function
+    def read(self, *args):          return self._file.read(*args)
+    def seek(self, offset):         return self._file.seek(offset)
+    def write(self, s):             return self._file.write(s)
+    def __iter__(self):             return iter(self._file)
+    def readlines(self, size=None): return self._file.readlines(size)
+    def xreadlines(self):           return self._file.xreadlines()
+    def close(self):
+        try:
+            return self._file.close()
+        except OSError, e:
+            if e.errno == 2:
+                # Means the file was moved or deleted before the tempfile could unlink it.
+                # Still sets self._file.close_called and calls self._file.file.close()
+                # before the exception
+                return
+            else:
+                raise e
+
+class InMemoryUploadedFile(UploadedFile):
+    """
+    A file uploaded into memory (i.e. stream-to-memory).
+    """
+    def __init__(self, file, field_name, name, content_type, size, charset):
+        super(InMemoryUploadedFile, self).__init__(name, content_type, size, charset)
+        self.file = file
+        self.field_name = field_name
+        self.file.seek(0)
+
+    def seek(self, *args, **kwargs):
+        self.file.seek(*args, **kwargs)
+
+    def open(self):
+        self.seek(0)
+
+    def read(self, *args, **kwargs):
+        return self.file.read(*args, **kwargs)
+
+    def chunks(self, chunk_size=None):
+        self.file.seek(0)
+        yield self.read()
+
+    def multiple_chunks(self, chunk_size=None):
+        # Since it's in memory, we'll never have multiple chunks.
+        return False
+
+class SimpleUploadedFile(InMemoryUploadedFile):
+    """
+    A simple representation of a file, which just has content, size, and a name.
+    """
+    def __init__(self, name, content, content_type='text/plain'):
+        self.file = StringIO(content or '')
+        self.name = name
+        self.field_name = None
+        self.size = len(content or '')
+        self.content_type = content_type
+        self.charset = None
+        self.file.seek(0)
+
+    def from_dict(cls, file_dict):
+        """
+        Creates a SimpleUploadedFile object from
+        a dictionary object with the following keys:
+           - filename
+           - content-type
+           - content
+        """
+        return cls(file_dict['filename'],
+                   file_dict['content'],
+                   file_dict.get('content-type', 'text/plain'))
+
+    from_dict = classmethod(from_dict)
diff --git a/webapp/django/core/files/uploadhandler.py b/webapp/django/core/files/uploadhandler.py
new file mode 100644
index 0000000..fa4d2df
--- /dev/null
+++ b/webapp/django/core/files/uploadhandler.py
@@ -0,0 +1,213 @@
+"""
+Base file upload handler classes, and the built-in concrete subclasses
+"""
+
+try:
+    from cStringIO import StringIO
+except ImportError:
+    from StringIO import StringIO
+
+from django.conf import settings
+from django.core.exceptions import ImproperlyConfigured
+from django.core.files.uploadedfile import TemporaryUploadedFile, InMemoryUploadedFile
+
+__all__ = ['UploadFileException','StopUpload', 'SkipFile', 'FileUploadHandler',
+           'TemporaryFileUploadHandler', 'MemoryFileUploadHandler',
+           'load_handler']
+
+class UploadFileException(Exception):
+    """
+    Any error having to do with uploading files.
+    """
+    pass
+
+class StopUpload(UploadFileException):
+    """
+    This exception is raised when an upload must abort.
+    """
+    def __init__(self, connection_reset=False):
+        """
+        If ``connection_reset`` is ``True``, Django knows will halt the upload
+        without consuming the rest of the upload. This will cause the browser to
+        show a "connection reset" error.
+        """
+        self.connection_reset = connection_reset
+
+    def __unicode__(self):
+        if self.connection_reset:
+            return u'StopUpload: Halt current upload.'
+        else:
+            return u'StopUpload: Consume request data, then halt.'
+
+class SkipFile(UploadFileException):
+    """
+    This exception is raised by an upload handler that wants to skip a given file.
+    """
+    pass
+    
+class StopFutureHandlers(UploadFileException):
+    """
+    Upload handers that have handled a file and do not want future handlers to
+    run should raise this exception instead of returning None.
+    """
+    pass
+
+class FileUploadHandler(object):
+    """
+    Base class for streaming upload handlers.
+    """
+    chunk_size = 64 * 2 ** 10 #: The default chunk size is 64 KB.
+
+    def __init__(self, request=None):
+        self.file_name = None
+        self.content_type = None
+        self.content_length = None
+        self.charset = None
+        self.request = request
+
+    def handle_raw_input(self, input_data, META, content_length, boundary, encoding=None):
+        """
+        Handle the raw input from the client.
+
+        Parameters:
+
+            :input_data:
+                An object that supports reading via .read().
+            :META:
+                ``request.META``.
+            :content_length:
+                The (integer) value of the Content-Length header from the
+                client.
+            :boundary: The boundary from the Content-Type header. Be sure to
+                prepend two '--'.
+        """
+        pass
+
+    def new_file(self, field_name, file_name, content_type, content_length, charset=None):
+        """
+        Signal that a new file has been started.
+
+        Warning: As with any data from the client, you should not trust
+        content_length (and sometimes won't even get it).
+        """
+        self.field_name = field_name
+        self.file_name = file_name
+        self.content_type = content_type
+        self.content_length = content_length
+        self.charset = charset
+
+    def receive_data_chunk(self, raw_data, start):
+        """
+        Receive data from the streamed upload parser. ``start`` is the position
+        in the file of the chunk.
+        """
+        raise NotImplementedError()
+
+    def file_complete(self, file_size):
+        """
+        Signal that a file has completed. File size corresponds to the actual
+        size accumulated by all the chunks.
+
+        Subclasses must should return a valid ``UploadedFile`` object.
+        """
+        raise NotImplementedError()
+
+    def upload_complete(self):
+        """
+        Signal that the upload is complete. Subclasses should perform cleanup
+        that is necessary for this handler.
+        """
+        pass
+
+class TemporaryFileUploadHandler(FileUploadHandler):
+    """
+    Upload handler that streams data into a temporary file.
+    """
+    def __init__(self, *args, **kwargs):
+        super(TemporaryFileUploadHandler, self).__init__(*args, **kwargs)
+
+    def new_file(self, file_name, *args, **kwargs):
+        """
+        Create the file object to append to as data is coming in.
+        """
+        super(TemporaryFileUploadHandler, self).new_file(file_name, *args, **kwargs)
+        self.file = TemporaryUploadedFile(self.file_name, self.content_type, 0, self.charset)
+
+    def receive_data_chunk(self, raw_data, start):
+        self.file.write(raw_data)
+
+    def file_complete(self, file_size):
+        self.file.seek(0)
+        self.file.size = file_size
+        return self.file
+
+class MemoryFileUploadHandler(FileUploadHandler):
+    """
+    File upload handler to stream uploads into memory (used for small files).
+    """
+
+    def handle_raw_input(self, input_data, META, content_length, boundary, encoding=None):
+        """
+        Use the content_length to signal whether or not this handler should be in use.
+        """
+        # Check the content-length header to see if we should
+        # If the the post is too large, we cannot use the Memory handler.
+        if content_length > settings.FILE_UPLOAD_MAX_MEMORY_SIZE:
+            self.activated = False
+        else:
+            self.activated = True
+
+    def new_file(self, *args, **kwargs):
+        super(MemoryFileUploadHandler, self).new_file(*args, **kwargs)
+        if self.activated:
+            self.file = StringIO()
+            raise StopFutureHandlers()
+
+    def receive_data_chunk(self, raw_data, start):
+        """
+        Add the data to the StringIO file.
+        """
+        if self.activated:
+            self.file.write(raw_data)
+        else:
+            return raw_data
+
+    def file_complete(self, file_size):
+        """
+        Return a file object if we're activated.
+        """
+        if not self.activated:
+            return
+
+        return InMemoryUploadedFile(
+            file = self.file,
+            field_name = self.field_name,
+            name = self.file_name,
+            content_type = self.content_type,
+            size = file_size,
+            charset = self.charset
+        )
+
+
+def load_handler(path, *args, **kwargs):
+    """
+    Given a path to a handler, return an instance of that handler.
+
+    E.g.::
+        >>> load_handler('django.core.files.uploadhandler.TemporaryFileUploadHandler', request)
+        <TemporaryFileUploadHandler object at 0x...>
+
+    """
+    i = path.rfind('.')
+    module, attr = path[:i], path[i+1:]
+    try:
+        mod = __import__(module, {}, {}, [attr])
+    except ImportError, e:
+        raise ImproperlyConfigured('Error importing upload handler module %s: "%s"' % (module, e))
+    except ValueError, e:
+        raise ImproperlyConfigured('Error importing upload handler module. Is FILE_UPLOAD_HANDLERS a correctly defined list or tuple?')
+    try:
+        cls = getattr(mod, attr)
+    except AttributeError:
+        raise ImproperlyConfigured('Module "%s" does not define a "%s" upload handler backend' % (module, attr))
+    return cls(*args, **kwargs)
diff --git a/webapp/django/core/handlers/__init__.py b/webapp/django/core/handlers/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/core/handlers/__init__.py
diff --git a/webapp/django/core/handlers/base.py b/webapp/django/core/handlers/base.py
new file mode 100644
index 0000000..b34d0e0
--- /dev/null
+++ b/webapp/django/core/handlers/base.py
@@ -0,0 +1,200 @@
+import sys
+
+from django import http
+from django.core import signals
+from django.utils.encoding import force_unicode
+
+class BaseHandler(object):
+    # Changes that are always applied to a response (in this order).
+    response_fixes = [
+        http.fix_location_header,
+        http.conditional_content_removal,
+        http.fix_IE_for_attach,
+        http.fix_IE_for_vary,
+    ]
+
+    def __init__(self):
+        self._request_middleware = self._view_middleware = self._response_middleware = self._exception_middleware = None
+
+    def load_middleware(self):
+        """
+        Populate middleware lists from settings.MIDDLEWARE_CLASSES.
+
+        Must be called after the environment is fixed (see __call__).
+        """
+        from django.conf import settings
+        from django.core import exceptions
+        self._request_middleware = []
+        self._view_middleware = []
+        self._response_middleware = []
+        self._exception_middleware = []
+        for middleware_path in settings.MIDDLEWARE_CLASSES:
+            try:
+                dot = middleware_path.rindex('.')
+            except ValueError:
+                raise exceptions.ImproperlyConfigured, '%s isn\'t a middleware module' % middleware_path
+            mw_module, mw_classname = middleware_path[:dot], middleware_path[dot+1:]
+            try:
+                mod = __import__(mw_module, {}, {}, [''])
+            except ImportError, e:
+                raise exceptions.ImproperlyConfigured, 'Error importing middleware %s: "%s"' % (mw_module, e)
+            try:
+                mw_class = getattr(mod, mw_classname)
+            except AttributeError:
+                raise exceptions.ImproperlyConfigured, 'Middleware module "%s" does not define a "%s" class' % (mw_module, mw_classname)
+
+            try:
+                mw_instance = mw_class()
+            except exceptions.MiddlewareNotUsed:
+                continue
+
+            if hasattr(mw_instance, 'process_request'):
+                self._request_middleware.append(mw_instance.process_request)
+            if hasattr(mw_instance, 'process_view'):
+                self._view_middleware.append(mw_instance.process_view)
+            if hasattr(mw_instance, 'process_response'):
+                self._response_middleware.insert(0, mw_instance.process_response)
+            if hasattr(mw_instance, 'process_exception'):
+                self._exception_middleware.insert(0, mw_instance.process_exception)
+
+    def get_response(self, request):
+        "Returns an HttpResponse object for the given HttpRequest"
+        from django.core import exceptions, urlresolvers
+        from django.conf import settings
+
+        # Apply request middleware
+        for middleware_method in self._request_middleware:
+            response = middleware_method(request)
+            if response:
+                return response
+
+        # Get urlconf from request object, if available.  Otherwise use default.
+        urlconf = getattr(request, "urlconf", settings.ROOT_URLCONF)
+
+        resolver = urlresolvers.RegexURLResolver(r'^/', urlconf)
+        try:
+            callback, callback_args, callback_kwargs = resolver.resolve(
+                    request.path_info)
+
+            # Apply view middleware
+            for middleware_method in self._view_middleware:
+                response = middleware_method(request, callback, callback_args, callback_kwargs)
+                if response:
+                    return response
+
+            try:
+                response = callback(request, *callback_args, **callback_kwargs)
+            except Exception, e:
+                # If the view raised an exception, run it through exception
+                # middleware, and if the exception middleware returns a
+                # response, use that. Otherwise, reraise the exception.
+                for middleware_method in self._exception_middleware:
+                    response = middleware_method(request, e)
+                    if response:
+                        return response
+                raise
+
+            # Complain if the view returned None (a common error).
+            if response is None:
+                try:
+                    view_name = callback.func_name # If it's a function
+                except AttributeError:
+                    view_name = callback.__class__.__name__ + '.__call__' # If it's a class
+                raise ValueError, "The view %s.%s didn't return an HttpResponse object." % (callback.__module__, view_name)
+
+            return response
+        except http.Http404, e:
+            if settings.DEBUG:
+                from django.views import debug
+                return debug.technical_404_response(request, e)
+            else:
+                try:
+                    callback, param_dict = resolver.resolve404()
+                    return callback(request, **param_dict)
+                except:
+                    try:
+                        return self.handle_uncaught_exception(request, resolver, sys.exc_info())
+                    finally:
+                        receivers = signals.got_request_exception.send(sender=self.__class__, request=request)
+        except exceptions.PermissionDenied:
+            return http.HttpResponseForbidden('<h1>Permission denied</h1>')
+        except SystemExit:
+            # Allow sys.exit() to actually exit. See tickets #1023 and #4701
+            raise
+        except: # Handle everything else, including SuspiciousOperation, etc.
+            # Get the exception info now, in case another exception is thrown later.
+            exc_info = sys.exc_info()
+            receivers = signals.got_request_exception.send(sender=self.__class__, request=request)
+            return self.handle_uncaught_exception(request, resolver, exc_info)
+
+    def handle_uncaught_exception(self, request, resolver, exc_info):
+        """
+        Processing for any otherwise uncaught exceptions (those that will
+        generate HTTP 500 responses). Can be overridden by subclasses who want
+        customised 500 handling.
+
+        Be *very* careful when overriding this because the error could be
+        caused by anything, so assuming something like the database is always
+        available would be an error.
+        """
+        from django.conf import settings
+        from django.core.mail import mail_admins
+
+        if settings.DEBUG_PROPAGATE_EXCEPTIONS:
+            raise
+
+        if settings.DEBUG:
+            from django.views import debug
+            return debug.technical_500_response(request, *exc_info)
+
+        # When DEBUG is False, send an error message to the admins.
+        subject = 'Error (%s IP): %s' % ((request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS and 'internal' or 'EXTERNAL'), request.path)
+        try:
+            request_repr = repr(request)
+        except:
+            request_repr = "Request repr() unavailable"
+        message = "%s\n\n%s" % (self._get_traceback(exc_info), request_repr)
+        mail_admins(subject, message, fail_silently=True)
+        # Return an HttpResponse that displays a friendly error message.
+        callback, param_dict = resolver.resolve500()
+        return callback(request, **param_dict)
+
+    def _get_traceback(self, exc_info=None):
+        "Helper function to return the traceback as a string"
+        import traceback
+        return '\n'.join(traceback.format_exception(*(exc_info or sys.exc_info())))
+
+    def apply_response_fixes(self, request, response):
+        """
+        Applies each of the functions in self.response_fixes to the request and
+        response, modifying the response in the process. Returns the new
+        response.
+        """
+        for func in self.response_fixes:
+            response = func(request, response)
+        return response
+
+def get_script_name(environ):
+    """
+    Returns the equivalent of the HTTP request's SCRIPT_NAME environment
+    variable. If Apache mod_rewrite has been used, returns what would have been
+    the script name prior to any rewriting (so it's the script name as seen
+    from the client's perspective), unless DJANGO_USE_POST_REWRITE is set (to
+    anything).
+    """
+    from django.conf import settings
+    if settings.FORCE_SCRIPT_NAME is not None:
+        return force_unicode(settings.FORCE_SCRIPT_NAME)
+
+    # If Apache's mod_rewrite had a whack at the URL, Apache set either
+    # SCRIPT_URL or REDIRECT_URL to the full resource URL before applying any
+    # rewrites. Unfortunately not every webserver (lighttpd!) passes this
+    # information through all the time, so FORCE_SCRIPT_NAME, above, is still
+    # needed.
+    script_url = environ.get('SCRIPT_URL', u'')
+    if not script_url:
+        script_url = environ.get('REDIRECT_URL', u'')
+    if script_url:
+        return force_unicode(script_url[:-len(environ.get('PATH_INFO', ''))])
+    return force_unicode(environ.get('SCRIPT_NAME', u''))
+
diff --git a/webapp/django/core/handlers/modpython.py b/webapp/django/core/handlers/modpython.py
new file mode 100644
index 0000000..aa3fb23
--- /dev/null
+++ b/webapp/django/core/handlers/modpython.py
@@ -0,0 +1,210 @@
+import os
+from pprint import pformat
+
+from django import http
+from django.core import signals
+from django.core.handlers.base import BaseHandler
+from django.core.urlresolvers import set_script_prefix
+from django.utils import datastructures
+from django.utils.encoding import force_unicode, smart_str
+
+# NOTE: do *not* import settings (or any module which eventually imports
+# settings) until after ModPythonHandler has been called; otherwise os.environ
+# won't be set up correctly (with respect to settings).
+
+class ModPythonRequest(http.HttpRequest):
+    def __init__(self, req):
+        self._req = req
+        # FIXME: This isn't ideal. The request URI may be encoded (it's
+        # non-normalized) slightly differently to the "real" SCRIPT_NAME
+        # and PATH_INFO values. This causes problems when we compute path_info,
+        # below. For now, don't use script names that will be subject to
+        # encoding/decoding.
+        self.path = force_unicode(req.uri)
+        root = req.get_options().get('django.root', '')
+        self.django_root = root
+        # req.path_info isn't necessarily computed correctly in all
+        # circumstances (it's out of mod_python's control a bit), so we use
+        # req.uri and some string manipulations to get the right value.
+        if root and req.uri.startswith(root):
+            self.path_info = force_unicode(req.uri[len(root):])
+        else:
+            self.path_info = self.path
+        if not self.path_info:
+            # Django prefers empty paths to be '/', rather than '', to give us
+            # a common start character for URL patterns. So this is a little
+            # naughty, but also pretty harmless.
+            self.path_info = u'/'
+
+    def __repr__(self):
+        # Since this is called as part of error handling, we need to be very
+        # robust against potentially malformed input.
+        try:
+            get = pformat(self.GET)
+        except:
+            get = '<could not parse>'
+        try:
+            post = pformat(self.POST)
+        except:
+            post = '<could not parse>'
+        try:
+            cookies = pformat(self.COOKIES)
+        except:
+            cookies = '<could not parse>'
+        try:
+            meta = pformat(self.META)
+        except:
+            meta = '<could not parse>'
+        return smart_str(u'<ModPythonRequest\npath:%s,\nGET:%s,\nPOST:%s,\nCOOKIES:%s,\nMETA:%s>' %
+                         (self.path, unicode(get), unicode(post),
+                          unicode(cookies), unicode(meta)))
+
+    def get_full_path(self):
+        return '%s%s' % (self.path, self._req.args and ('?' + self._req.args) or '')
+
+    def is_secure(self):
+        try:
+            return self._req.is_https()
+        except AttributeError:
+            # mod_python < 3.2.10 doesn't have req.is_https().
+            return self._req.subprocess_env.get('HTTPS', '').lower() in ('on', '1')
+
+    def _load_post_and_files(self):
+        "Populates self._post and self._files"
+        if 'content-type' in self._req.headers_in and self._req.headers_in['content-type'].startswith('multipart'):
+            self._raw_post_data = ''
+            self._post, self._files = self.parse_file_upload(self.META, self._req)
+        else:
+            self._post, self._files = http.QueryDict(self.raw_post_data, encoding=self._encoding), datastructures.MultiValueDict()
+
+    def _get_request(self):
+        if not hasattr(self, '_request'):
+            self._request = datastructures.MergeDict(self.POST, self.GET)
+        return self._request
+
+    def _get_get(self):
+        if not hasattr(self, '_get'):
+            self._get = http.QueryDict(self._req.args, encoding=self._encoding)
+        return self._get
+
+    def _set_get(self, get):
+        self._get = get
+
+    def _get_post(self):
+        if not hasattr(self, '_post'):
+            self._load_post_and_files()
+        return self._post
+
+    def _set_post(self, post):
+        self._post = post
+
+    def _get_cookies(self):
+        if not hasattr(self, '_cookies'):
+            self._cookies = http.parse_cookie(self._req.headers_in.get('cookie', ''))
+        return self._cookies
+
+    def _set_cookies(self, cookies):
+        self._cookies = cookies
+
+    def _get_files(self):
+        if not hasattr(self, '_files'):
+            self._load_post_and_files()
+        return self._files
+
+    def _get_meta(self):
+        "Lazy loader that returns self.META dictionary"
+        if not hasattr(self, '_meta'):
+            self._meta = {
+                'AUTH_TYPE':         self._req.ap_auth_type,
+                'CONTENT_LENGTH':    self._req.clength, # This may be wrong
+                'CONTENT_TYPE':      self._req.content_type, # This may be wrong
+                'GATEWAY_INTERFACE': 'CGI/1.1',
+                'PATH_INFO':         self.path_info,
+                'PATH_TRANSLATED':   None, # Not supported
+                'QUERY_STRING':      self._req.args,
+                'REMOTE_ADDR':       self._req.connection.remote_ip,
+                'REMOTE_HOST':       None, # DNS lookups not supported
+                'REMOTE_IDENT':      self._req.connection.remote_logname,
+                'REMOTE_USER':       self._req.user,
+                'REQUEST_METHOD':    self._req.method,
+                'SCRIPT_NAME':       self.django_root,
+                'SERVER_NAME':       self._req.server.server_hostname,
+                'SERVER_PORT':       self._req.server.port,
+                'SERVER_PROTOCOL':   self._req.protocol,
+                'SERVER_SOFTWARE':   'mod_python'
+            }
+            for key, value in self._req.headers_in.items():
+                key = 'HTTP_' + key.upper().replace('-', '_')
+                self._meta[key] = value
+        return self._meta
+
+    def _get_raw_post_data(self):
+        try:
+            return self._raw_post_data
+        except AttributeError:
+            self._raw_post_data = self._req.read()
+            return self._raw_post_data
+
+    def _get_method(self):
+        return self.META['REQUEST_METHOD'].upper()
+
+    GET = property(_get_get, _set_get)
+    POST = property(_get_post, _set_post)
+    COOKIES = property(_get_cookies, _set_cookies)
+    FILES = property(_get_files)
+    META = property(_get_meta)
+    REQUEST = property(_get_request)
+    raw_post_data = property(_get_raw_post_data)
+    method = property(_get_method)
+
+class ModPythonHandler(BaseHandler):
+    request_class = ModPythonRequest
+
+    def __call__(self, req):
+        # mod_python fakes the environ, and thus doesn't process SetEnv.  This fixes that
+        os.environ.update(req.subprocess_env)
+
+        # now that the environ works we can see the correct settings, so imports
+        # that use settings now can work
+        from django.conf import settings
+
+        # if we need to set up middleware, now that settings works we can do it now.
+        if self._request_middleware is None:
+            self.load_middleware()
+
+        set_script_prefix(req.get_options().get('django.root', ''))
+        signals.request_started.send(sender=self.__class__)
+        try:
+            try:
+                request = self.request_class(req)
+            except UnicodeDecodeError:
+                response = http.HttpResponseBadRequest()
+            else:
+                response = self.get_response(request)
+
+                # Apply response middleware
+                for middleware_method in self._response_middleware:
+                    response = middleware_method(request, response)
+                response = self.apply_response_fixes(request, response)
+        finally:
+            signals.request_finished.send(sender=self.__class__)
+
+        # Convert our custom HttpResponse object back into the mod_python req.
+        req.content_type = response['Content-Type']
+        for key, value in response.items():
+            if key != 'content-type':
+                req.headers_out[str(key)] = str(value)
+        for c in response.cookies.values():
+            req.headers_out.add('Set-Cookie', c.output(header=''))
+        req.status = response.status_code
+        try:
+            for chunk in response:
+                req.write(chunk)
+        finally:
+            response.close()
+
+        return 0 # mod_python.apache.OK
+
+def handler(req):
+    # mod_python hooks into this function.
+    return ModPythonHandler()(req)
diff --git a/webapp/django/core/handlers/profiler-hotshot.py b/webapp/django/core/handlers/profiler-hotshot.py
new file mode 100644
index 0000000..6cf94b0
--- /dev/null
+++ b/webapp/django/core/handlers/profiler-hotshot.py
@@ -0,0 +1,22 @@
+import hotshot, time, os
+from django.core.handlers.modpython import ModPythonHandler
+
+PROFILE_DATA_DIR = "/var/log/cmsprofile"
+
+def handler(req):
+    '''
+    Handler that uses hotshot to store profile data.
+
+    Stores profile data in PROFILE_DATA_DIR.  Since hotshot has no way (that I
+    know of) to append profile data to a single file, each request gets its own
+    profile.  The file names are in the format <url>.<n>.prof where <url> is
+    the request path with "/" replaced by ".", and <n> is a timestamp with
+    microseconds to prevent overwriting files.
+
+    Use the gather_profile_stats.py script to gather these individual request
+    profiles into aggregated profiles by request path.
+    '''
+    profname = "%s.%.3f.prof" % (req.uri.strip("/").replace('/', '.'), time.time())
+    profname = os.path.join(PROFILE_DATA_DIR, profname)
+    prof = hotshot.Profile(profname)
+    return prof.runcall(ModPythonHandler(), req)
diff --git a/webapp/django/core/handlers/wsgi.py b/webapp/django/core/handlers/wsgi.py
new file mode 100644
index 0000000..d1336b3
--- /dev/null
+++ b/webapp/django/core/handlers/wsgi.py
@@ -0,0 +1,238 @@
+from threading import Lock
+from pprint import pformat
+try:
+    from cStringIO import StringIO
+except ImportError:
+    from StringIO import StringIO
+
+from django import http
+from django.core import signals
+from django.core.handlers import base
+from django.core.urlresolvers import set_script_prefix
+from django.utils import datastructures
+from django.utils.encoding import force_unicode
+
+# See http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
+STATUS_CODE_TEXT = {
+    100: 'CONTINUE',
+    101: 'SWITCHING PROTOCOLS',
+    200: 'OK',
+    201: 'CREATED',
+    202: 'ACCEPTED',
+    203: 'NON-AUTHORITATIVE INFORMATION',
+    204: 'NO CONTENT',
+    205: 'RESET CONTENT',
+    206: 'PARTIAL CONTENT',
+    300: 'MULTIPLE CHOICES',
+    301: 'MOVED PERMANENTLY',
+    302: 'FOUND',
+    303: 'SEE OTHER',
+    304: 'NOT MODIFIED',
+    305: 'USE PROXY',
+    306: 'RESERVED',
+    307: 'TEMPORARY REDIRECT',
+    400: 'BAD REQUEST',
+    401: 'UNAUTHORIZED',
+    402: 'PAYMENT REQUIRED',
+    403: 'FORBIDDEN',
+    404: 'NOT FOUND',
+    405: 'METHOD NOT ALLOWED',
+    406: 'NOT ACCEPTABLE',
+    407: 'PROXY AUTHENTICATION REQUIRED',
+    408: 'REQUEST TIMEOUT',
+    409: 'CONFLICT',
+    410: 'GONE',
+    411: 'LENGTH REQUIRED',
+    412: 'PRECONDITION FAILED',
+    413: 'REQUEST ENTITY TOO LARGE',
+    414: 'REQUEST-URI TOO LONG',
+    415: 'UNSUPPORTED MEDIA TYPE',
+    416: 'REQUESTED RANGE NOT SATISFIABLE',
+    417: 'EXPECTATION FAILED',
+    500: 'INTERNAL SERVER ERROR',
+    501: 'NOT IMPLEMENTED',
+    502: 'BAD GATEWAY',
+    503: 'SERVICE UNAVAILABLE',
+    504: 'GATEWAY TIMEOUT',
+    505: 'HTTP VERSION NOT SUPPORTED',
+}
+
+def safe_copyfileobj(fsrc, fdst, length=16*1024, size=0):
+    """
+    A version of shutil.copyfileobj that will not read more than 'size' bytes.
+    This makes it safe from clients sending more than CONTENT_LENGTH bytes of
+    data in the body.
+    """
+    if not size:
+        return
+    while size > 0:
+        buf = fsrc.read(min(length, size))
+        if not buf:
+            break
+        fdst.write(buf)
+        size -= len(buf)
+
+class WSGIRequest(http.HttpRequest):
+    def __init__(self, environ):
+        script_name = base.get_script_name(environ)
+        path_info = force_unicode(environ.get('PATH_INFO', u'/'))
+        if not path_info:
+            # Sometimes PATH_INFO exists, but is empty (e.g. accessing
+            # the SCRIPT_NAME URL without a trailing slash). We really need to
+            # operate as if they'd requested '/'. Not amazingly nice to force
+            # the path like this, but should be harmless.
+            path_info = u'/'
+        self.environ = environ
+        self.path_info = path_info
+        self.path = '%s%s' % (script_name, path_info)
+        self.META = environ
+        self.META['PATH_INFO'] = path_info
+        self.META['SCRIPT_NAME'] = script_name
+        self.method = environ['REQUEST_METHOD'].upper()
+
+    def __repr__(self):
+        # Since this is called as part of error handling, we need to be very
+        # robust against potentially malformed input.
+        try:
+            get = pformat(self.GET)
+        except:
+            get = '<could not parse>'
+        try:
+            post = pformat(self.POST)
+        except:
+            post = '<could not parse>'
+        try:
+            cookies = pformat(self.COOKIES)
+        except:
+            cookies = '<could not parse>'
+        try:
+            meta = pformat(self.META)
+        except:
+            meta = '<could not parse>'
+        return '<WSGIRequest\nGET:%s,\nPOST:%s,\nCOOKIES:%s,\nMETA:%s>' % \
+            (get, post, cookies, meta)
+
+    def get_full_path(self):
+        return '%s%s' % (self.path, self.environ.get('QUERY_STRING', '') and ('?' + self.environ.get('QUERY_STRING', '')) or '')
+
+    def is_secure(self):
+        return 'wsgi.url_scheme' in self.environ \
+            and self.environ['wsgi.url_scheme'] == 'https'
+
+    def _load_post_and_files(self):
+        # Populates self._post and self._files
+        if self.method == 'POST':
+            if self.environ.get('CONTENT_TYPE', '').startswith('multipart'):
+                self._raw_post_data = ''
+                self._post, self._files = self.parse_file_upload(self.META, self.environ['wsgi.input'])
+            else:
+                self._post, self._files = http.QueryDict(self.raw_post_data, encoding=self._encoding), datastructures.MultiValueDict()
+        else:
+            self._post, self._files = http.QueryDict('', encoding=self._encoding), datastructures.MultiValueDict()
+
+    def _get_request(self):
+        if not hasattr(self, '_request'):
+            self._request = datastructures.MergeDict(self.POST, self.GET)
+        return self._request
+
+    def _get_get(self):
+        if not hasattr(self, '_get'):
+            # The WSGI spec says 'QUERY_STRING' may be absent.
+            self._get = http.QueryDict(self.environ.get('QUERY_STRING', ''), encoding=self._encoding)
+        return self._get
+
+    def _set_get(self, get):
+        self._get = get
+
+    def _get_post(self):
+        if not hasattr(self, '_post'):
+            self._load_post_and_files()
+        return self._post
+
+    def _set_post(self, post):
+        self._post = post
+
+    def _get_cookies(self):
+        if not hasattr(self, '_cookies'):
+            self._cookies = http.parse_cookie(self.environ.get('HTTP_COOKIE', ''))
+        return self._cookies
+
+    def _set_cookies(self, cookies):
+        self._cookies = cookies
+
+    def _get_files(self):
+        if not hasattr(self, '_files'):
+            self._load_post_and_files()
+        return self._files
+
+    def _get_raw_post_data(self):
+        try:
+            return self._raw_post_data
+        except AttributeError:
+            buf = StringIO()
+            try:
+                # CONTENT_LENGTH might be absent if POST doesn't have content at all (lighttpd)
+                content_length = int(self.environ.get('CONTENT_LENGTH', 0))
+            except (ValueError, TypeError):
+                # If CONTENT_LENGTH was empty string or not an integer, don't
+                # error out. We've also seen None passed in here (against all
+                # specs, but see ticket #8259), so we handle TypeError as well.
+                content_length = 0
+            if content_length > 0:
+                safe_copyfileobj(self.environ['wsgi.input'], buf,
+                        size=content_length)
+            self._raw_post_data = buf.getvalue()
+            buf.close()
+            return self._raw_post_data
+
+    GET = property(_get_get, _set_get)
+    POST = property(_get_post, _set_post)
+    COOKIES = property(_get_cookies, _set_cookies)
+    FILES = property(_get_files)
+    REQUEST = property(_get_request)
+    raw_post_data = property(_get_raw_post_data)
+
+class WSGIHandler(base.BaseHandler):
+    initLock = Lock()
+    request_class = WSGIRequest
+
+    def __call__(self, environ, start_response):
+        from django.conf import settings
+
+        # Set up middleware if needed. We couldn't do this earlier, because
+        # settings weren't available.
+        if self._request_middleware is None:
+            self.initLock.acquire()
+            # Check that middleware is still uninitialised.
+            if self._request_middleware is None:
+                self.load_middleware()
+            self.initLock.release()
+
+        set_script_prefix(base.get_script_name(environ))
+        signals.request_started.send(sender=self.__class__)
+        try:
+            try:
+                request = self.request_class(environ)
+            except UnicodeDecodeError:
+                response = http.HttpResponseBadRequest()
+            else:
+                response = self.get_response(request)
+
+                # Apply response middleware
+                for middleware_method in self._response_middleware:
+                    response = middleware_method(request, response)
+                response = self.apply_response_fixes(request, response)
+        finally:
+            signals.request_finished.send(sender=self.__class__)
+
+        try:
+            status_text = STATUS_CODE_TEXT[response.status_code]
+        except KeyError:
+            status_text = 'UNKNOWN STATUS CODE'
+        status = '%s %s' % (response.status_code, status_text)
+        response_headers = [(str(k), str(v)) for k, v in response.items()]
+        for c in response.cookies.values():
+            response_headers.append(('Set-Cookie', str(c.output(header=''))))
+        start_response(status, response_headers)
+        return response
+
diff --git a/webapp/django/core/mail.py b/webapp/django/core/mail.py
new file mode 100644
index 0000000..1ac2a39
--- /dev/null
+++ b/webapp/django/core/mail.py
@@ -0,0 +1,371 @@
+"""
+Tools for sending email.
+"""
+
+import mimetypes
+import os
+import smtplib
+import socket
+import time
+import random
+from email import Charset, Encoders
+from email.MIMEText import MIMEText
+from email.MIMEMultipart import MIMEMultipart
+from email.MIMEBase import MIMEBase
+from email.Header import Header
+from email.Utils import formatdate, parseaddr, formataddr
+
+from django.conf import settings
+from django.utils.encoding import smart_str, force_unicode
+
+# Don't BASE64-encode UTF-8 messages so that we avoid unwanted attention from
+# some spam filters.
+Charset.add_charset('utf-8', Charset.SHORTEST, Charset.QP, 'utf-8')
+
+# Default MIME type to use on attachments (if it is not explicitly given
+# and cannot be guessed).
+DEFAULT_ATTACHMENT_MIME_TYPE = 'application/octet-stream'
+
+# Cache the hostname, but do it lazily: socket.getfqdn() can take a couple of
+# seconds, which slows down the restart of the server.
+class CachedDnsName(object):
+    def __str__(self):
+        return self.get_fqdn()
+
+    def get_fqdn(self):
+        if not hasattr(self, '_fqdn'):
+            self._fqdn = socket.getfqdn()
+        return self._fqdn
+
+DNS_NAME = CachedDnsName()
+
+# Copied from Python standard library, with the following modifications:
+# * Used cached hostname for performance.
+# * Added try/except to support lack of getpid() in Jython (#5496).
+def make_msgid(idstring=None):
+    """Returns a string suitable for RFC 2822 compliant Message-ID, e.g:
+
+    <20020201195627.33539.96671@nightshade.la.mastaler.com>
+
+    Optional idstring if given is a string used to strengthen the
+    uniqueness of the message id.
+    """
+    timeval = time.time()
+    utcdate = time.strftime('%Y%m%d%H%M%S', time.gmtime(timeval))
+    try:
+        pid = os.getpid()
+    except AttributeError:
+        # No getpid() in Jython, for example.
+        pid = 1
+    randint = random.randrange(100000)
+    if idstring is None:
+        idstring = ''
+    else:
+        idstring = '.' + idstring
+    idhost = DNS_NAME
+    msgid = '<%s.%s.%s%s@%s>' % (utcdate, pid, randint, idstring, idhost)
+    return msgid
+
+class BadHeaderError(ValueError):
+    pass
+
+def forbid_multi_line_headers(name, val):
+    """Forbids multi-line headers, to prevent header injection."""
+    val = force_unicode(val)
+    if '\n' in val or '\r' in val:
+        raise BadHeaderError("Header values can't contain newlines (got %r for header %r)" % (val, name))
+    try:
+        val = val.encode('ascii')
+    except UnicodeEncodeError:
+        if name.lower() in ('to', 'from', 'cc'):
+            result = []
+            for item in val.split(', '):
+                nm, addr = parseaddr(item)
+                nm = str(Header(nm, settings.DEFAULT_CHARSET))
+                result.append(formataddr((nm, str(addr))))
+            val = ', '.join(result)
+        else:
+            val = Header(val, settings.DEFAULT_CHARSET)
+    else:
+        if name.lower() == 'subject':
+            val = Header(val)
+    return name, val
+
+class SafeMIMEText(MIMEText):
+    def __setitem__(self, name, val):
+        name, val = forbid_multi_line_headers(name, val)
+        MIMEText.__setitem__(self, name, val)
+
+class SafeMIMEMultipart(MIMEMultipart):
+    def __setitem__(self, name, val):
+        name, val = forbid_multi_line_headers(name, val)
+        MIMEMultipart.__setitem__(self, name, val)
+
+class SMTPConnection(object):
+    """
+    A wrapper that manages the SMTP network connection.
+    """
+
+    def __init__(self, host=None, port=None, username=None, password=None,
+                 use_tls=None, fail_silently=False):
+        self.host = host or settings.EMAIL_HOST
+        self.port = port or settings.EMAIL_PORT
+        self.username = username or settings.EMAIL_HOST_USER
+        self.password = password or settings.EMAIL_HOST_PASSWORD
+        self.use_tls = (use_tls is not None) and use_tls or settings.EMAIL_USE_TLS
+        self.fail_silently = fail_silently
+        self.connection = None
+
+    def open(self):
+        """
+        Ensures we have a connection to the email server. Returns whether or
+        not a new connection was required (True or False).
+        """
+        if self.connection:
+            # Nothing to do if the connection is already open.
+            return False
+        try:
+            # If local_hostname is not specified, socket.getfqdn() gets used.
+            # For performance, we use the cached FQDN for local_hostname.
+            self.connection = smtplib.SMTP(self.host, self.port,
+                                           local_hostname=DNS_NAME.get_fqdn())
+            if self.use_tls:
+                self.connection.ehlo()
+                self.connection.starttls()
+                self.connection.ehlo()
+            if self.username and self.password:
+                self.connection.login(self.username, self.password)
+            return True
+        except:
+            if not self.fail_silently:
+                raise
+
+    def close(self):
+        """Closes the connection to the email server."""
+        try:
+            try:
+                self.connection.quit()
+            except socket.sslerror:
+                # This happens when calling quit() on a TLS connection
+                # sometimes.
+                self.connection.close()
+            except:
+                if self.fail_silently:
+                    return
+                raise
+        finally:
+            self.connection = None
+
+    def send_messages(self, email_messages):
+        """
+        Sends one or more EmailMessage objects and returns the number of email
+        messages sent.
+        """
+        if not email_messages:
+            return
+        new_conn_created = self.open()
+        if not self.connection:
+            # We failed silently on open(). Trying to send would be pointless.
+            return
+        num_sent = 0
+        for message in email_messages:
+            sent = self._send(message)
+            if sent:
+                num_sent += 1
+        if new_conn_created:
+            self.close()
+        return num_sent
+
+    def _send(self, email_message):
+        """A helper method that does the actual sending."""
+        if not email_message.recipients():
+            return False
+        try:
+            self.connection.sendmail(email_message.from_email,
+                    email_message.recipients(),
+                    email_message.message().as_string())
+        except:
+            if not self.fail_silently:
+                raise
+            return False
+        return True
+
+class EmailMessage(object):
+    """
+    A container for email information.
+    """
+    content_subtype = 'plain'
+    multipart_subtype = 'mixed'
+    encoding = None     # None => use settings default
+
+    def __init__(self, subject='', body='', from_email=None, to=None, bcc=None,
+            connection=None, attachments=None, headers=None):
+        """
+        Initialize a single email message (which can be sent to multiple
+        recipients).
+
+        All strings used to create the message can be unicode strings (or UTF-8
+        bytestrings). The SafeMIMEText class will handle any necessary encoding
+        conversions.
+        """
+        if to:
+            assert not isinstance(to, basestring), '"to" argument must be a list or tuple'
+            self.to = list(to)
+        else:
+            self.to = []
+        if bcc:
+            assert not isinstance(bcc, basestring), '"bcc" argument must be a list or tuple'
+            self.bcc = list(bcc)
+        else:
+            self.bcc = []
+        self.from_email = from_email or settings.DEFAULT_FROM_EMAIL
+        self.subject = subject
+        self.body = body
+        self.attachments = attachments or []
+        self.extra_headers = headers or {}
+        self.connection = connection
+
+    def get_connection(self, fail_silently=False):
+        if not self.connection:
+            self.connection = SMTPConnection(fail_silently=fail_silently)
+        return self.connection
+
+    def message(self):
+        encoding = self.encoding or settings.DEFAULT_CHARSET
+        msg = SafeMIMEText(smart_str(self.body, settings.DEFAULT_CHARSET),
+                           self.content_subtype, encoding)
+        if self.attachments:
+            body_msg = msg
+            msg = SafeMIMEMultipart(_subtype=self.multipart_subtype)
+            if self.body:
+                msg.attach(body_msg)
+            for attachment in self.attachments:
+                if isinstance(attachment, MIMEBase):
+                    msg.attach(attachment)
+                else:
+                    msg.attach(self._create_attachment(*attachment))
+        msg['Subject'] = self.subject
+        msg['From'] = self.from_email
+        msg['To'] = ', '.join(self.to)
+        msg['Date'] = formatdate()
+        msg['Message-ID'] = make_msgid()
+        for name, value in self.extra_headers.items():
+            msg[name] = value
+        return msg
+
+    def recipients(self):
+        """
+        Returns a list of all recipients of the email (includes direct
+        addressees as well as Bcc entries).
+        """
+        return self.to + self.bcc
+
+    def send(self, fail_silently=False):
+        """Sends the email message."""
+        return self.get_connection(fail_silently).send_messages([self])
+
+    def attach(self, filename=None, content=None, mimetype=None):
+        """
+        Attaches a file with the given filename and content. The filename can
+        be omitted (useful for multipart/alternative messages) and the mimetype
+        is guessed, if not provided.
+
+        If the first parameter is a MIMEBase subclass it is inserted directly
+        into the resulting message attachments.
+        """
+        if isinstance(filename, MIMEBase):
+            assert content == mimetype == None
+            self.attachments.append(filename)
+        else:
+            assert content is not None
+            self.attachments.append((filename, content, mimetype))
+
+    def attach_file(self, path, mimetype=None):
+        """Attaches a file from the filesystem."""
+        filename = os.path.basename(path)
+        content = open(path, 'rb').read()
+        self.attach(filename, content, mimetype)
+
+    def _create_attachment(self, filename, content, mimetype=None):
+        """
+        Converts the filename, content, mimetype triple into a MIME attachment
+        object.
+        """
+        if mimetype is None:
+            mimetype, _ = mimetypes.guess_type(filename)
+            if mimetype is None:
+                mimetype = DEFAULT_ATTACHMENT_MIME_TYPE
+        basetype, subtype = mimetype.split('/', 1)
+        if basetype == 'text':
+            attachment = SafeMIMEText(smart_str(content,
+                settings.DEFAULT_CHARSET), subtype, settings.DEFAULT_CHARSET)
+        else:
+            # Encode non-text attachments with base64.
+            attachment = MIMEBase(basetype, subtype)
+            attachment.set_payload(content)
+            Encoders.encode_base64(attachment)
+        if filename:
+            attachment.add_header('Content-Disposition', 'attachment',
+                                  filename=filename)
+        return attachment
+
+class EmailMultiAlternatives(EmailMessage):
+    """
+    A version of EmailMessage that makes it easy to send multipart/alternative
+    messages. For example, including text and HTML versions of the text is
+    made easier.
+    """
+    multipart_subtype = 'alternative'
+
+    def attach_alternative(self, content, mimetype=None):
+        """Attach an alternative content representation."""
+        self.attach(content=content, mimetype=mimetype)
+
+def send_mail(subject, message, from_email, recipient_list,
+              fail_silently=False, auth_user=None, auth_password=None):
+    """
+    Easy wrapper for sending a single message to a recipient list. All members
+    of the recipient list will see the other recipients in the 'To' field.
+
+    If auth_user is None, the EMAIL_HOST_USER setting is used.
+    If auth_password is None, the EMAIL_HOST_PASSWORD setting is used.
+
+    Note: The API for this method is frozen. New code wanting to extend the
+    functionality should use the EmailMessage class directly.
+    """
+    connection = SMTPConnection(username=auth_user, password=auth_password,
+                                fail_silently=fail_silently)
+    return EmailMessage(subject, message, from_email, recipient_list,
+                        connection=connection).send()
+
+def send_mass_mail(datatuple, fail_silently=False, auth_user=None,
+                   auth_password=None):
+    """
+    Given a datatuple of (subject, message, from_email, recipient_list), sends
+    each message to each recipient list. Returns the number of e-mails sent.
+
+    If from_email is None, the DEFAULT_FROM_EMAIL setting is used.
+    If auth_user and auth_password are set, they're used to log in.
+    If auth_user is None, the EMAIL_HOST_USER setting is used.
+    If auth_password is None, the EMAIL_HOST_PASSWORD setting is used.
+
+    Note: The API for this method is frozen. New code wanting to extend the
+    functionality should use the EmailMessage class directly.
+    """
+    connection = SMTPConnection(username=auth_user, password=auth_password,
+                                fail_silently=fail_silently)
+    messages = [EmailMessage(subject, message, sender, recipient)
+                for subject, message, sender, recipient in datatuple]
+    return connection.send_messages(messages)
+
+def mail_admins(subject, message, fail_silently=False):
+    """Sends a message to the admins, as defined by the ADMINS setting."""
+    EmailMessage(settings.EMAIL_SUBJECT_PREFIX + subject, message,
+                 settings.SERVER_EMAIL, [a[1] for a in settings.ADMINS]
+                 ).send(fail_silently=fail_silently)
+
+def mail_managers(subject, message, fail_silently=False):
+    """Sends a message to the managers, as defined by the MANAGERS setting."""
+    EmailMessage(settings.EMAIL_SUBJECT_PREFIX + subject, message,
+                 settings.SERVER_EMAIL, [a[1] for a in settings.MANAGERS]
+                 ).send(fail_silently=fail_silently)
diff --git a/webapp/django/core/management/__init__.py b/webapp/django/core/management/__init__.py
new file mode 100644
index 0000000..fc1e82b
--- /dev/null
+++ b/webapp/django/core/management/__init__.py
@@ -0,0 +1,334 @@
+import os
+import sys
+from optparse import OptionParser
+import imp
+
+import django
+from django.core.management.base import BaseCommand, CommandError, handle_default_options
+
+# For backwards compatibility: get_version() used to be in this module.
+get_version = django.get_version
+
+# A cache of loaded commands, so that call_command
+# doesn't have to reload every time it's called.
+_commands = None
+
+def find_commands(management_dir):
+    """
+    Given a path to a management directory, returns a list of all the command
+    names that are available.
+
+    Returns an empty list if no commands are defined.
+    """
+    command_dir = os.path.join(management_dir, 'commands')
+    try:
+        return [f[:-3] for f in os.listdir(command_dir)
+                if not f.startswith('_') and f.endswith('.py')]
+    except OSError:
+        return []
+
+def find_management_module(app_name):
+    """
+    Determines the path to the management module for the given app_name,
+    without actually importing the application or the management module.
+
+    Raises ImportError if the management module cannot be found for any reason.
+    """
+    parts = app_name.split('.')
+    parts.append('management')
+    parts.reverse()
+    part = parts.pop()
+    path = None
+    
+    # When using manage.py, the project module is added to the path,
+    # loaded, then removed from the path. This means that 
+    # testproject.testapp.models can be loaded in future, even if
+    # testproject isn't in the path. When looking for the management
+    # module, we need look for the case where the project name is part
+    # of the app_name but the project directory itself isn't on the path.
+    try:
+        f, path, descr = imp.find_module(part,path)
+    except ImportError,e:
+        if os.path.basename(os.getcwd()) != part:
+            raise e
+        
+    while parts:
+        part = parts.pop()
+        f, path, descr = imp.find_module(part, path and [path] or None)
+    return path
+
+def load_command_class(app_name, name):
+    """
+    Given a command name and an application name, returns the Command
+    class instance. All errors raised by the import process
+    (ImportError, AttributeError) are allowed to propagate.
+    """
+    return getattr(__import__('%s.management.commands.%s' % (app_name, name),
+                   {}, {}, ['Command']), 'Command')()
+
+def get_commands():
+    """
+    Returns a dictionary mapping command names to their callback applications.
+
+    This works by looking for a management.commands package in django.core, and
+    in each installed application -- if a commands package exists, all commands
+    in that package are registered.
+
+    Core commands are always included. If a settings module has been
+    specified, user-defined commands will also be included, the
+    startproject command will be disabled, and the startapp command
+    will be modified to use the directory in which the settings module appears.
+
+    The dictionary is in the format {command_name: app_name}. Key-value
+    pairs from this dictionary can then be used in calls to
+    load_command_class(app_name, command_name)
+
+    If a specific version of a command must be loaded (e.g., with the
+    startapp command), the instantiated module can be placed in the
+    dictionary in place of the application name.
+
+    The dictionary is cached on the first call and reused on subsequent
+    calls.
+    """
+    global _commands
+    if _commands is None:
+        _commands = dict([(name, 'django.core') for name in find_commands(__path__[0])])
+
+        # Find the installed apps
+        try:
+            from django.conf import settings
+            apps = settings.INSTALLED_APPS
+        except (AttributeError, EnvironmentError, ImportError):
+            apps = []
+
+        # Find the project directory
+        try:
+            from django.conf import settings
+            project_directory = setup_environ(
+                __import__(
+                    settings.SETTINGS_MODULE, {}, {}, 
+                    (settings.SETTINGS_MODULE.split(".")[-1],)
+                )
+            )
+        except (AttributeError, EnvironmentError, ImportError):
+            project_directory = None
+
+        # Find and load the management module for each installed app.
+        for app_name in apps:
+            try:
+                path = find_management_module(app_name)
+                _commands.update(dict([(name, app_name)
+                                       for name in find_commands(path)]))
+            except ImportError:
+                pass # No management module - ignore this app
+
+        if project_directory:
+            # Remove the "startproject" command from self.commands, because
+            # that's a django-admin.py command, not a manage.py command.
+            del _commands['startproject']
+
+            # Override the startapp command so that it always uses the
+            # project_directory, not the current working directory
+            # (which is default).
+            from django.core.management.commands.startapp import ProjectCommand
+            _commands['startapp'] = ProjectCommand(project_directory)
+
+    return _commands
+
+def call_command(name, *args, **options):
+    """
+    Calls the given command, with the given options and args/kwargs.
+
+    This is the primary API you should use for calling specific commands.
+
+    Some examples:
+        call_command('syncdb')
+        call_command('shell', plain=True)
+        call_command('sqlall', 'myapp')
+    """
+    try:
+        app_name = get_commands()[name]
+        if isinstance(app_name, BaseCommand):
+            # If the command is already loaded, use it directly.
+            klass = app_name
+        else:
+            klass = load_command_class(app_name, name)
+    except KeyError:
+        raise CommandError, "Unknown command: %r" % name
+    return klass.execute(*args, **options)
+
+class LaxOptionParser(OptionParser):
+    """
+    An option parser that doesn't raise any errors on unknown options.
+
+    This is needed because the --settings and --pythonpath options affect
+    the commands (and thus the options) that are available to the user.
+    """
+    def error(self, msg):
+        pass
+    
+    def print_help(self):
+        """Output nothing.
+        
+        The lax options are included in the normal option parser, so under
+        normal usage, we don't need to print the lax options.
+        """
+        pass
+    
+    def print_lax_help(self):
+        """Output the basic options available to every command.
+        
+        This just redirects to the default print_help() behaviour.
+        """
+        OptionParser.print_help(self)
+        
+    def _process_args(self, largs, rargs, values):
+        """
+        Overrides OptionParser._process_args to exclusively handle default
+        options and ignore args and other options. 
+        
+        This overrides the behavior of the super class, which stop parsing 
+        at the first unrecognized option.
+        """
+        while rargs:
+            arg = rargs[0]
+            try:
+                if arg[0:2] == "--" and len(arg) > 2:
+                    # process a single long option (possibly with value(s))
+                    # the superclass code pops the arg off rargs
+                    self._process_long_opt(rargs, values)
+                elif arg[:1] == "-" and len(arg) > 1:
+                    # process a cluster of short options (possibly with
+                    # value(s) for the last one only)
+                    # the superclass code pops the arg off rargs
+                    self._process_short_opts(rargs, values)
+                else:
+                    # it's either a non-default option or an arg
+                    # either way, add it to the args list so we can keep
+                    # dealing with options
+                    del rargs[0]
+                    raise error
+            except:
+                largs.append(arg)
+
+class ManagementUtility(object):
+    """
+    Encapsulates the logic of the django-admin.py and manage.py utilities.
+
+    A ManagementUtility has a number of commands, which can be manipulated
+    by editing the self.commands dictionary.
+    """
+    def __init__(self, argv=None):
+        self.argv = argv or sys.argv[:]
+        self.prog_name = os.path.basename(self.argv[0])
+
+    def main_help_text(self):
+        """
+        Returns the script's main help text, as a string.
+        """
+        usage = ['',"Type '%s help <subcommand>' for help on a specific subcommand." % self.prog_name,'']
+        usage.append('Available subcommands:')
+        commands = get_commands().keys()
+        commands.sort()
+        for cmd in commands:
+            usage.append('  %s' % cmd)
+        return '\n'.join(usage)
+
+    def fetch_command(self, subcommand):
+        """
+        Tries to fetch the given subcommand, printing a message with the
+        appropriate command called from the command line (usually
+        "django-admin.py" or "manage.py") if it can't be found.
+        """
+        try:
+            app_name = get_commands()[subcommand]
+            if isinstance(app_name, BaseCommand):
+                # If the command is already loaded, use it directly.
+                klass = app_name
+            else:
+                klass = load_command_class(app_name, subcommand)
+        except KeyError:
+            sys.stderr.write("Unknown command: %r\nType '%s help' for usage.\n" % \
+                (subcommand, self.prog_name))
+            sys.exit(1)
+        return klass
+
+    def execute(self):
+        """
+        Given the command-line arguments, this figures out which subcommand is
+        being run, creates a parser appropriate to that command, and runs it.
+        """
+        # Preprocess options to extract --settings and --pythonpath.
+        # These options could affect the commands that are available, so they
+        # must be processed early.
+        parser = LaxOptionParser(usage="%prog subcommand [options] [args]",
+                                 version=get_version(), 
+                                 option_list=BaseCommand.option_list)
+        try:
+            options, args = parser.parse_args(self.argv)
+            handle_default_options(options)
+        except:
+            pass # Ignore any option errors at this point.
+
+        try:
+            subcommand = self.argv[1]
+        except IndexError:
+            sys.stderr.write("Type '%s help' for usage.\n" % self.prog_name)
+            sys.exit(1)
+
+        if subcommand == 'help':
+            if len(args) > 2:
+                self.fetch_command(args[2]).print_help(self.prog_name, args[2])
+            else:
+                parser.print_lax_help()
+                sys.stderr.write(self.main_help_text() + '\n')
+                sys.exit(1)
+        # Special-cases: We want 'django-admin.py --version' and
+        # 'django-admin.py --help' to work, for backwards compatibility.
+        elif self.argv[1:] == ['--version']:
+            # LaxOptionParser already takes care of printing the version.
+            pass
+        elif self.argv[1:] == ['--help']:
+            parser.print_lax_help()
+            sys.stderr.write(self.main_help_text() + '\n')
+        else:
+            self.fetch_command(subcommand).run_from_argv(self.argv)
+
+def setup_environ(settings_mod):
+    """
+    Configures the runtime environment. This can also be used by external
+    scripts wanting to set up a similar environment to manage.py.
+    Returns the project directory (assuming the passed settings module is
+    directly in the project directory).
+    """
+    # Add this project to sys.path so that it's importable in the conventional
+    # way. For example, if this file (manage.py) lives in a directory
+    # "myproject", this code would add "/path/to/myproject" to sys.path.
+    project_directory, settings_filename = os.path.split(settings_mod.__file__)
+    if project_directory == os.curdir or not project_directory:
+        project_directory = os.getcwd()
+    project_name = os.path.basename(project_directory)
+    settings_name = os.path.splitext(settings_filename)[0]
+    sys.path.append(os.path.join(project_directory, os.pardir))
+    project_module = __import__(project_name, {}, {}, [''])
+    sys.path.pop()
+
+    # Set DJANGO_SETTINGS_MODULE appropriately.
+    os.environ['DJANGO_SETTINGS_MODULE'] = '%s.%s' % (project_name, settings_name)
+    return project_directory
+
+def execute_from_command_line(argv=None):
+    """
+    A simple method that runs a ManagementUtility.
+    """
+    utility = ManagementUtility(argv)
+    utility.execute()
+
+def execute_manager(settings_mod, argv=None):
+    """
+    Like execute_from_command_line(), but for use by manage.py, a
+    project-specific django-admin.py utility.
+    """
+    setup_environ(settings_mod)
+    utility = ManagementUtility(argv)
+    utility.execute()
diff --git a/webapp/django/core/management/base.py b/webapp/django/core/management/base.py
new file mode 100644
index 0000000..20cc7c0
--- /dev/null
+++ b/webapp/django/core/management/base.py
@@ -0,0 +1,242 @@
+import os
+import sys
+from optparse import make_option, OptionParser
+
+import django
+from django.core.exceptions import ImproperlyConfigured
+from django.core.management.color import color_style
+
+try:
+    set
+except NameError:
+    from sets import Set as set     # For Python 2.3
+
+class CommandError(Exception):
+    pass
+
+def handle_default_options(options):
+    """
+    Include any default options that all commands should accept
+    here so that ManagementUtility can handle them before searching
+    for user commands.
+    """
+    if options.settings:
+        os.environ['DJANGO_SETTINGS_MODULE'] = options.settings
+    if options.pythonpath:
+        sys.path.insert(0, options.pythonpath)
+
+class BaseCommand(object):
+    # Metadata about this command.
+    option_list = (
+        make_option('--settings',
+            help='The Python path to a settings module, e.g. "myproject.settings.main". If this isn\'t provided, the DJANGO_SETTINGS_MODULE environment variable will be used.'),
+        make_option('--pythonpath',
+            help='A directory to add to the Python path, e.g. "/home/djangoprojects/myproject".'),
+        make_option('--traceback', action='store_true',
+            help='Print traceback on exception'),
+    )
+    help = ''
+    args = ''
+
+    # Configuration shortcuts that alter various logic.
+    can_import_settings = True
+    requires_model_validation = True
+    output_transaction = False # Whether to wrap the output in a "BEGIN; COMMIT;"
+
+    def __init__(self):
+        self.style = color_style()
+
+    def get_version(self):
+        """
+        Returns the Django version, which should be correct for all built-in
+        Django commands. User-supplied commands should override this method.
+        """
+        return django.get_version()
+
+    def usage(self, subcommand):
+        usage = '%%prog %s [options] %s' % (subcommand, self.args)
+        if self.help:
+            return '%s\n\n%s' % (usage, self.help)
+        else:
+            return usage
+
+    def create_parser(self, prog_name, subcommand):
+        return OptionParser(prog=prog_name,
+                            usage=self.usage(subcommand),
+                            version=self.get_version(),
+                            option_list=self.option_list)
+
+    def print_help(self, prog_name, subcommand):
+        parser = self.create_parser(prog_name, subcommand)
+        parser.print_help()
+
+    def run_from_argv(self, argv):
+        parser = self.create_parser(argv[0], argv[1])
+        options, args = parser.parse_args(argv[2:])
+        handle_default_options(options)
+        self.execute(*args, **options.__dict__)
+
+    def execute(self, *args, **options):
+        # Switch to English, because django-admin.py creates database content
+        # like permissions, and those shouldn't contain any translations.
+        # But only do this if we can assume we have a working settings file,
+        # because django.utils.translation requires settings.
+        if self.can_import_settings:
+            try:
+                from django.utils import translation
+                translation.activate('en-us')
+            except ImportError, e:
+                # If settings should be available, but aren't, 
+                # raise the error and quit.
+                sys.stderr.write(self.style.ERROR(str('Error: %s\n' % e)))
+                sys.exit(1)
+        try:
+            if self.requires_model_validation:
+                self.validate()
+            output = self.handle(*args, **options)
+            if output:
+                if self.output_transaction:
+                    # This needs to be imported here, because it relies on settings.
+                    from django.db import connection
+                    if connection.ops.start_transaction_sql():
+                        print self.style.SQL_KEYWORD(connection.ops.start_transaction_sql())
+                print output
+                if self.output_transaction:
+                    print self.style.SQL_KEYWORD("COMMIT;")
+        except CommandError, e:
+            sys.stderr.write(self.style.ERROR(str('Error: %s\n' % e)))
+            sys.exit(1)
+
+    def validate(self, app=None, display_num_errors=False):
+        """
+        Validates the given app, raising CommandError for any errors.
+
+        If app is None, then this will validate all installed apps.
+        """
+        from django.core.management.validation import get_validation_errors
+        try:
+            from cStringIO import StringIO
+        except ImportError:
+            from StringIO import StringIO
+        s = StringIO()
+        num_errors = get_validation_errors(s, app)
+        if num_errors:
+            s.seek(0)
+            error_text = s.read()
+            raise CommandError("One or more models did not validate:\n%s" % error_text)
+        if display_num_errors:
+            print "%s error%s found" % (num_errors, num_errors != 1 and 's' or '')
+
+    def handle(self, *args, **options):
+        raise NotImplementedError()
+
+class AppCommand(BaseCommand):
+    args = '<appname appname ...>'
+
+    def handle(self, *app_labels, **options):
+        from django.db import models
+        if not app_labels:
+            raise CommandError('Enter at least one appname.')
+        try:
+            app_list = [models.get_app(app_label) for app_label in app_labels]
+        except (ImproperlyConfigured, ImportError), e:
+            raise CommandError("%s. Are you sure your INSTALLED_APPS setting is correct?" % e)
+        output = []
+        for app in app_list:
+            app_output = self.handle_app(app, **options)
+            if app_output:
+                output.append(app_output)
+        return '\n'.join(output)
+
+    def handle_app(self, app, **options):
+        raise NotImplementedError()
+
+class LabelCommand(BaseCommand):
+    args = '<label label ...>'
+    label = 'label'
+
+    def handle(self, *labels, **options):
+        if not labels:
+            raise CommandError('Enter at least one %s.' % self.label)
+
+        output = []
+        for label in labels:
+            label_output = self.handle_label(label, **options)
+            if label_output:
+                output.append(label_output)
+        return '\n'.join(output)
+
+    def handle_label(self, label, **options):
+        raise NotImplementedError()
+
+class NoArgsCommand(BaseCommand):
+    args = ''
+
+    def handle(self, *args, **options):
+        if args:
+            raise CommandError("Command doesn't accept any arguments")
+        return self.handle_noargs(**options)
+
+    def handle_noargs(self, **options):
+        raise NotImplementedError()
+
+def copy_helper(style, app_or_project, name, directory, other_name=''):
+    """
+    Copies either a Django application layout template or a Django project
+    layout template into the specified directory.
+    """
+    # style -- A color style object (see django.core.management.color).
+    # app_or_project -- The string 'app' or 'project'.
+    # name -- The name of the application or project.
+    # directory -- The directory to which the layout template should be copied.
+    # other_name -- When copying an application layout, this should be the name
+    #               of the project.
+    import re
+    import shutil
+    other = {'project': 'app', 'app': 'project'}[app_or_project]
+    if not re.search(r'^\w+$', name): # If it's not a valid directory name.
+        raise CommandError("%r is not a valid %s name. Please use only numbers, letters and underscores." % (name, app_or_project))
+    top_dir = os.path.join(directory, name)
+    try:
+        os.mkdir(top_dir)
+    except OSError, e:
+        raise CommandError(e)
+
+    # Determine where the app or project templates are. Use
+    # django.__path__[0] because we don't know into which directory
+    # django has been installed.
+    template_dir = os.path.join(django.__path__[0], 'conf', '%s_template' % app_or_project)
+
+    for d, subdirs, files in os.walk(template_dir):
+        relative_dir = d[len(template_dir)+1:].replace('%s_name' % app_or_project, name)
+        if relative_dir:
+            os.mkdir(os.path.join(top_dir, relative_dir))
+        for i, subdir in enumerate(subdirs):
+            if subdir.startswith('.'):
+                del subdirs[i]
+        for f in files:
+            if f.endswith('.pyc'):
+                continue
+            path_old = os.path.join(d, f)
+            path_new = os.path.join(top_dir, relative_dir, f.replace('%s_name' % app_or_project, name))
+            fp_old = open(path_old, 'r')
+            fp_new = open(path_new, 'w')
+            fp_new.write(fp_old.read().replace('{{ %s_name }}' % app_or_project, name).replace('{{ %s_name }}' % other, other_name))
+            fp_old.close()
+            fp_new.close()
+            try:
+                shutil.copymode(path_old, path_new)
+                _make_writeable(path_new)
+            except OSError:
+                sys.stderr.write(style.NOTICE("Notice: Couldn't set permission bits on %s. You're probably using an uncommon filesystem setup. No problem.\n" % path_new))
+
+def _make_writeable(filename):
+    "Makes sure that the file is writeable. Useful if our source is read-only."
+    import stat
+    if sys.platform.startswith('java'):
+        # On Jython there is no os.access()
+        return
+    if not os.access(filename, os.W_OK):
+        st = os.stat(filename)
+        new_permissions = stat.S_IMODE(st.st_mode) | stat.S_IWUSR
+        os.chmod(filename, new_permissions)
diff --git a/webapp/django/core/management/color.py b/webapp/django/core/management/color.py
new file mode 100644
index 0000000..f5e3939
--- /dev/null
+++ b/webapp/django/core/management/color.py
@@ -0,0 +1,41 @@
+"""
+Sets up the terminal color scheme.
+"""
+
+import sys
+
+from django.utils import termcolors
+
+def supports_color():
+    """
+    Returns True if the running system's terminal supports color, and False
+    otherwise.
+    """
+    unsupported_platform = (sys.platform in ('win32', 'Pocket PC'))
+    # isatty is not always implemented, #6223.
+    is_a_tty = hasattr(sys.stdout, 'isatty') and sys.stdout.isatty()
+    if unsupported_platform or not is_a_tty:
+        return False
+    return True
+
+def color_style():
+    """Returns a Style object with the Django color scheme."""
+    if not supports_color():
+        return no_style()
+    class dummy: pass
+    style = dummy()
+    style.ERROR = termcolors.make_style(fg='red', opts=('bold',))
+    style.ERROR_OUTPUT = termcolors.make_style(fg='red', opts=('bold',))
+    style.NOTICE = termcolors.make_style(fg='red')
+    style.SQL_FIELD = termcolors.make_style(fg='green', opts=('bold',))
+    style.SQL_COLTYPE = termcolors.make_style(fg='green')
+    style.SQL_KEYWORD = termcolors.make_style(fg='yellow')
+    style.SQL_TABLE = termcolors.make_style(opts=('bold',))
+    return style
+
+def no_style():
+    """Returns a Style object that has no colors."""
+    class dummy:
+        def __getattr__(self, attr):
+            return lambda x: x
+    return dummy()
diff --git a/webapp/django/core/management/commands/__init__.py b/webapp/django/core/management/commands/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/core/management/commands/__init__.py
diff --git a/webapp/django/core/management/commands/adminindex.py b/webapp/django/core/management/commands/adminindex.py
new file mode 100644
index 0000000..4f38913
--- /dev/null
+++ b/webapp/django/core/management/commands/adminindex.py
@@ -0,0 +1,34 @@
+from django.core.management.base import AppCommand
+from django.utils.encoding import force_unicode
+from django.utils.text import capfirst
+
+MODULE_TEMPLATE = '''    {%% if perms.%(app)s.%(addperm)s or perms.%(app)s.%(changeperm)s %%}
+    <tr>
+        <th>{%% if perms.%(app)s.%(changeperm)s %%}<a href="%(app)s/%(mod)s/">{%% endif %%}%(name)s{%% if perms.%(app)s.%(changeperm)s %%}</a>{%% endif %%}</th>
+        <td class="x50">{%% if perms.%(app)s.%(addperm)s %%}<a href="%(app)s/%(mod)s/add/" class="addlink">{%% endif %%}Add{%% if perms.%(app)s.%(addperm)s %%}</a>{%% endif %%}</td>
+        <td class="x75">{%% if perms.%(app)s.%(changeperm)s %%}<a href="%(app)s/%(mod)s/" class="changelink">{%% endif %%}Change{%% if perms.%(app)s.%(changeperm)s %%}</a>{%% endif %%}</td>
+    </tr>
+    {%% endif %%}'''
+
+class Command(AppCommand):
+    help = 'Prints the admin-index template snippet for the given app name(s).'
+
+    def handle_app(self, app, **options):
+        from django.db.models import get_models
+        output = []
+        app_models = get_models(app)
+        app_label = app_models[0]._meta.app_label
+        output.append('{%% if perms.%s %%}' % app_label)
+        output.append('<div class="module"><h2>%s</h2><table>' % app_label.title())
+        for model in app_models:
+            if model._meta.admin:
+                output.append(MODULE_TEMPLATE % {
+                    'app': app_label,
+                    'mod': model._meta.module_name,
+                    'name': force_unicode(capfirst(model._meta.verbose_name_plural)),
+                    'addperm': model._meta.get_add_permission(),
+                    'changeperm': model._meta.get_change_permission(),
+                })
+        output.append('</table></div>')
+        output.append('{% endif %}')
+        return '\n'.join(output)
diff --git a/webapp/django/core/management/commands/cleanup.py b/webapp/django/core/management/commands/cleanup.py
new file mode 100644
index 0000000..a5c932b
--- /dev/null
+++ b/webapp/django/core/management/commands/cleanup.py
@@ -0,0 +1,11 @@
+import datetime
+from django.core.management.base import NoArgsCommand
+
+class Command(NoArgsCommand):
+    help = "Can be run as a cronjob or directly to clean out old data from the database (only expired sessions at the moment)."
+
+    def handle_noargs(self, **options):
+        from django.db import transaction
+        from django.contrib.sessions.models import Session
+        Session.objects.filter(expire_date__lt=datetime.datetime.now()).delete()
+        transaction.commit_unless_managed()
diff --git a/webapp/django/core/management/commands/compilemessages.py b/webapp/django/core/management/commands/compilemessages.py
new file mode 100644
index 0000000..d1f1647
--- /dev/null
+++ b/webapp/django/core/management/commands/compilemessages.py
@@ -0,0 +1,57 @@
+import os
+import sys
+from optparse import make_option
+from django.core.management.base import BaseCommand, CommandError
+
+try:
+    set
+except NameError:
+    from sets import Set as set     # For Python 2.3
+
+def compile_messages(locale=None):
+    basedirs = [os.path.join('conf', 'locale'), 'locale']
+    if os.environ.get('DJANGO_SETTINGS_MODULE'):
+        from django.conf import settings
+        basedirs.extend(settings.LOCALE_PATHS)
+
+    # Gather existing directories.
+    basedirs = set(map(os.path.abspath, filter(os.path.isdir, basedirs)))
+
+    if not basedirs:
+        raise CommandError("This script should be run from the Django SVN tree or your project or app tree, or with the settings module specified.")
+
+    for basedir in basedirs:
+        if locale:
+            basedir = os.path.join(basedir, locale, 'LC_MESSAGES')
+        for dirpath, dirnames, filenames in os.walk(basedir):
+            for f in filenames:
+                if f.endswith('.po'):
+                    sys.stderr.write('processing file %s in %s\n' % (f, dirpath))
+                    pf = os.path.splitext(os.path.join(dirpath, f))[0]
+                    # Store the names of the .mo and .po files in an environment
+                    # variable, rather than doing a string replacement into the
+                    # command, so that we can take advantage of shell quoting, to
+                    # quote any malicious characters/escaping.
+                    # See http://cyberelk.net/tim/articles/cmdline/ar01s02.html
+                    os.environ['djangocompilemo'] = pf + '.mo'
+                    os.environ['djangocompilepo'] = pf + '.po'
+                    if sys.platform == 'win32': # Different shell-variable syntax
+                        cmd = 'msgfmt --check-format -o "%djangocompilemo%" "%djangocompilepo%"'
+                    else:
+                        cmd = 'msgfmt --check-format -o "$djangocompilemo" "$djangocompilepo"'
+                    os.system(cmd)
+
+
+class Command(BaseCommand):
+    option_list = BaseCommand.option_list + (
+        make_option('--locale', '-l', dest='locale',
+            help='The locale to process. Default is to process all.'),
+    )
+    help = 'Compiles .po files to .mo files for use with builtin gettext support.'
+
+    requires_model_validation = False
+    can_import_settings = False
+
+    def handle(self, **options):
+        locale = options.get('locale')
+        compile_messages(locale)
diff --git a/webapp/django/core/management/commands/createcachetable.py b/webapp/django/core/management/commands/createcachetable.py
new file mode 100644
index 0000000..098bca7
--- /dev/null
+++ b/webapp/django/core/management/commands/createcachetable.py
@@ -0,0 +1,42 @@
+from django.core.management.base import LabelCommand
+
+class Command(LabelCommand):
+    help = "Creates the table needed to use the SQL cache backend."
+    args = "<tablename>"
+    label = 'tablename'
+
+    requires_model_validation = False
+
+    def handle_label(self, tablename, **options):
+        from django.db import connection, transaction, models
+        fields = (
+            # "key" is a reserved word in MySQL, so use "cache_key" instead.
+            models.CharField(name='cache_key', max_length=255, unique=True, primary_key=True),
+            models.TextField(name='value'),
+            models.DateTimeField(name='expires', db_index=True),
+        )
+        table_output = []
+        index_output = []
+        qn = connection.ops.quote_name
+        for f in fields:
+            field_output = [qn(f.name), f.db_type()]
+            field_output.append("%sNULL" % (not f.null and "NOT " or ""))
+            if f.primary_key:
+                field_output.append("PRIMARY KEY")
+            elif f.unique:
+                field_output.append("UNIQUE")
+            if f.db_index:
+                unique = f.unique and "UNIQUE " or ""
+                index_output.append("CREATE %sINDEX %s_%s ON %s (%s);" % \
+                    (unique, tablename, f.name, qn(tablename),
+                    qn(f.name)))
+            table_output.append(" ".join(field_output))
+        full_statement = ["CREATE TABLE %s (" % qn(tablename)]
+        for i, line in enumerate(table_output):
+            full_statement.append('    %s%s' % (line, i < len(table_output)-1 and ',' or ''))
+        full_statement.append(');')
+        curs = connection.cursor()
+        curs.execute("\n".join(full_statement))
+        for statement in index_output:
+            curs.execute(statement)
+        transaction.commit_unless_managed()
diff --git a/webapp/django/core/management/commands/dbshell.py b/webapp/django/core/management/commands/dbshell.py
new file mode 100644
index 0000000..18faa6a
--- /dev/null
+++ b/webapp/django/core/management/commands/dbshell.py
@@ -0,0 +1,10 @@
+from django.core.management.base import NoArgsCommand
+
+class Command(NoArgsCommand):
+    help = "Runs the command-line client for the current DATABASE_ENGINE."
+
+    requires_model_validation = False
+
+    def handle_noargs(self, **options):
+        from django.db import connection
+        connection.client.runshell()
diff --git a/webapp/django/core/management/commands/diffsettings.py b/webapp/django/core/management/commands/diffsettings.py
new file mode 100644
index 0000000..2459f11
--- /dev/null
+++ b/webapp/django/core/management/commands/diffsettings.py
@@ -0,0 +1,32 @@
+from django.core.management.base import NoArgsCommand
+
+def module_to_dict(module, omittable=lambda k: k.startswith('_')):
+    "Converts a module namespace to a Python dictionary. Used by get_settings_diff."
+    return dict([(k, repr(v)) for k, v in module.__dict__.items() if not omittable(k)])
+
+class Command(NoArgsCommand):
+    help = """Displays differences between the current settings.py and Django's
+    default settings. Settings that don't appear in the defaults are
+    followed by "###"."""
+
+    requires_model_validation = False
+
+    def handle_noargs(self, **options):
+        # Inspired by Postfix's "postconf -n".
+        from django.conf import settings, global_settings
+
+        # Because settings are imported lazily, we need to explicitly load them.
+        settings._import_settings()
+
+        user_settings = module_to_dict(settings._target)
+        default_settings = module_to_dict(global_settings)
+
+        output = []
+        keys = user_settings.keys()
+        keys.sort()
+        for key in keys:
+            if key not in default_settings:
+                output.append("%s = %s  ###" % (key, user_settings[key]))
+            elif user_settings[key] != default_settings[key]:
+                output.append("%s = %s" % (key, user_settings[key]))
+        print '\n'.join(output)
diff --git a/webapp/django/core/management/commands/dumpdata.py b/webapp/django/core/management/commands/dumpdata.py
new file mode 100644
index 0000000..2559d57
--- /dev/null
+++ b/webapp/django/core/management/commands/dumpdata.py
@@ -0,0 +1,52 @@
+from django.core.management.base import BaseCommand, CommandError
+from django.core import serializers
+
+from optparse import make_option
+
+class Command(BaseCommand):
+    option_list = BaseCommand.option_list + (
+        make_option('--format', default='json', dest='format',
+            help='Specifies the output serialization format for fixtures.'),
+        make_option('--indent', default=None, dest='indent', type='int',
+            help='Specifies the indent level to use when pretty-printing output'),
+        make_option('-e', '--exclude', dest='exclude',action='append', default=[], 
+            help='App to exclude (use multiple --exclude to exclude multiple apps).'),
+    )
+    help = 'Output the contents of the database as a fixture of the given format.'
+    args = '[appname ...]'
+
+    def handle(self, *app_labels, **options):
+        from django.db.models import get_app, get_apps, get_models
+
+        format = options.get('format','json')
+        indent = options.get('indent',None)
+        exclude = options.get('exclude',[])
+        show_traceback = options.get('traceback', False)
+
+        excluded_apps = [get_app(app_label) for app_label in exclude]
+
+        if len(app_labels) == 0:
+            app_list = [app for app in get_apps() if app not in excluded_apps]
+        else:
+            app_list = [get_app(app_label) for app_label in app_labels]
+
+        # Check that the serialization format exists; this is a shortcut to
+        # avoid collating all the objects and _then_ failing.
+        if format not in serializers.get_public_serializer_formats():
+            raise CommandError("Unknown serialization format: %s" % format)
+
+        try:
+            serializers.get_serializer(format)
+        except KeyError:
+            raise CommandError("Unknown serialization format: %s" % format)
+
+        objects = []
+        for app in app_list:
+            for model in get_models(app):
+                objects.extend(model._default_manager.all())
+        try:
+            return serializers.serialize(format, objects, indent=indent)
+        except Exception, e:
+            if show_traceback:
+                raise
+            raise CommandError("Unable to serialize database: %s" % e)
diff --git a/webapp/django/core/management/commands/flush.py b/webapp/django/core/management/commands/flush.py
new file mode 100644
index 0000000..51d5034
--- /dev/null
+++ b/webapp/django/core/management/commands/flush.py
@@ -0,0 +1,70 @@
+from django.core.management.base import NoArgsCommand, CommandError
+from django.core.management.color import no_style
+from optparse import make_option
+
+class Command(NoArgsCommand):
+    option_list = NoArgsCommand.option_list + (
+        make_option('--verbosity', action='store', dest='verbosity', default='1',
+            type='choice', choices=['0', '1', '2'],
+            help='Verbosity level; 0=minimal output, 1=normal output, 2=all output'),
+        make_option('--noinput', action='store_false', dest='interactive', default=True,
+            help='Tells Django to NOT prompt the user for input of any kind.'),
+    )
+    help = "Executes ``sqlflush`` on the current database."
+
+    def handle_noargs(self, **options):
+        from django.conf import settings
+        from django.db import connection, transaction, models
+        from django.core.management.sql import sql_flush, emit_post_sync_signal
+
+        verbosity = int(options.get('verbosity', 1))
+        interactive = options.get('interactive')
+
+        self.style = no_style()
+
+        # Import the 'management' module within each installed app, to register
+        # dispatcher events.
+        for app_name in settings.INSTALLED_APPS:
+            try:
+                __import__(app_name + '.management', {}, {}, [''])
+            except ImportError:
+                pass
+
+        sql_list = sql_flush(self.style, only_django=True)
+
+        if interactive:
+            confirm = raw_input("""You have requested a flush of the database.
+This will IRREVERSIBLY DESTROY all data currently in the %r database,
+and return each table to the state it was in after syncdb.
+Are you sure you want to do this?
+
+    Type 'yes' to continue, or 'no' to cancel: """ % settings.DATABASE_NAME)
+        else:
+            confirm = 'yes'
+
+        if confirm == 'yes':
+            try:
+                cursor = connection.cursor()
+                for sql in sql_list:
+                    cursor.execute(sql)
+            except Exception, e:
+                transaction.rollback_unless_managed()
+                raise CommandError("""Database %s couldn't be flushed. Possible reasons:
+      * The database isn't running or isn't configured correctly.
+      * At least one of the expected database tables doesn't exist.
+      * The SQL was invalid.
+    Hint: Look at the output of 'django-admin.py sqlflush'. That's the SQL this command wasn't able to run.
+    The full error: %s""" % (settings.DATABASE_NAME, e))
+            transaction.commit_unless_managed()
+
+            # Emit the post sync signal. This allows individual
+            # applications to respond as if the database had been
+            # sync'd from scratch.
+            emit_post_sync_signal(models.get_models(), verbosity, interactive)
+
+            # Reinstall the initial_data fixture.
+            from django.core.management import call_command
+            call_command('loaddata', 'initial_data', **options)
+
+        else:
+            print "Flush cancelled."
diff --git a/webapp/django/core/management/commands/inspectdb.py b/webapp/django/core/management/commands/inspectdb.py
new file mode 100644
index 0000000..6e84ed6
--- /dev/null
+++ b/webapp/django/core/management/commands/inspectdb.py
@@ -0,0 +1,125 @@
+from django.core.management.base import NoArgsCommand, CommandError
+
+class Command(NoArgsCommand):
+    help = "Introspects the database tables in the given database and outputs a Django model module."
+
+    requires_model_validation = False
+
+    def handle_noargs(self, **options):
+        try:
+            for line in self.handle_inspection():
+                print line
+        except NotImplementedError:
+            raise CommandError("Database inspection isn't supported for the currently selected database backend.")
+
+    def handle_inspection(self):
+        from django.db import connection
+        import keyword
+
+        table2model = lambda table_name: table_name.title().replace('_', '').replace(' ', '').replace('-', '')
+
+        cursor = connection.cursor()
+        yield "# This is an auto-generated Django model module."
+        yield "# You'll have to do the following manually to clean this up:"
+        yield "#     * Rearrange models' order"
+        yield "#     * Make sure each model has one field with primary_key=True"
+        yield "# Feel free to rename the models, but don't rename db_table values or field names."
+        yield "#"
+        yield "# Also note: You'll have to insert the output of 'django-admin.py sqlcustom [appname]'"
+        yield "# into your database."
+        yield ''
+        yield 'from django.db import models'
+        yield ''
+        for table_name in connection.introspection.get_table_list(cursor):
+            yield 'class %s(models.Model):' % table2model(table_name)
+            try:
+                relations = connection.introspection.get_relations(cursor, table_name)
+            except NotImplementedError:
+                relations = {}
+            try:
+                indexes = connection.introspection.get_indexes(cursor, table_name)
+            except NotImplementedError:
+                indexes = {}
+            for i, row in enumerate(connection.introspection.get_table_description(cursor, table_name)):
+                att_name = row[0].lower()
+                comment_notes = [] # Holds Field notes, to be displayed in a Python comment.
+                extra_params = {}  # Holds Field parameters such as 'db_column'.
+
+                # If we need to do field name modifiations, 
+                # remember the original field name
+                if ' ' in att_name or '-' in att_name or keyword.iskeyword(att_name):
+                    extra_params['db_column'] = att_name
+                  
+                # Now modify the field name to make it python compatible.  
+                if ' ' in att_name:
+                    att_name = att_name.replace(' ', '_')
+                    comment_notes.append('Field renamed to remove spaces.')
+                if '-' in att_name:
+                    att_name = att_name.replace('-', '_')
+                    comment_notes.append('Field renamed to remove dashes.')
+                if keyword.iskeyword(att_name):
+                    att_name += '_field'
+                    comment_notes.append('Field renamed because it was a Python reserved word.')
+
+                if i in relations:
+                    rel_to = relations[i][1] == table_name and "'self'" or table2model(relations[i][1])
+                    field_type = 'ForeignKey(%s' % rel_to
+                    if att_name.endswith('_id'):
+                        att_name = att_name[:-3]
+                    else:
+                        extra_params['db_column'] = att_name
+                else:
+                    try:
+                        field_type = connection.introspection.data_types_reverse[row[1]]
+                    except KeyError:
+                        field_type = 'TextField'
+                        comment_notes.append('This field type is a guess.')
+
+                    # This is a hook for DATA_TYPES_REVERSE to return a tuple of
+                    # (field_type, extra_params_dict).
+                    if type(field_type) is tuple:
+                        field_type, new_params = field_type
+                        extra_params.update(new_params)
+
+                    # Add max_length for all CharFields.
+                    if field_type == 'CharField' and row[3]:
+                        extra_params['max_length'] = row[3]
+
+                    if field_type == 'DecimalField':
+                        extra_params['max_digits'] = row[4]
+                        extra_params['decimal_places'] = row[5]
+
+                    # Add primary_key and unique, if necessary.
+                    column_name = extra_params.get('db_column', att_name)
+                    if column_name in indexes:
+                        if indexes[column_name]['primary_key']:
+                            extra_params['primary_key'] = True
+                        elif indexes[column_name]['unique']:
+                            extra_params['unique'] = True
+
+                    field_type += '('
+
+                # Don't output 'id = meta.AutoField(primary_key=True)', because
+                # that's assumed if it doesn't exist.
+                if att_name == 'id' and field_type == 'AutoField(' and extra_params == {'primary_key': True}:
+                    continue
+
+                # Add 'null' and 'blank', if the 'null_ok' flag was present in the
+                # table description.
+                if row[6]: # If it's NULL...
+                    extra_params['blank'] = True
+                    if not field_type in ('TextField(', 'CharField('):
+                        extra_params['null'] = True
+
+                field_desc = '%s = models.%s' % (att_name, field_type)
+                if extra_params:
+                    if not field_desc.endswith('('):
+                        field_desc += ', '
+                    field_desc += ', '.join(['%s=%r' % (k, v) for k, v in extra_params.items()])
+                field_desc += ')'
+                if comment_notes:
+                    field_desc += ' # ' + ' '.join(comment_notes)
+                yield '    %s' % field_desc
+            yield '    class Meta:'
+            yield '        db_table = %r' % table_name
+            yield ''
diff --git a/webapp/django/core/management/commands/loaddata.py b/webapp/django/core/management/commands/loaddata.py
new file mode 100644
index 0000000..c69eeb9
--- /dev/null
+++ b/webapp/django/core/management/commands/loaddata.py
@@ -0,0 +1,181 @@
+from django.core.management.base import BaseCommand
+from django.core.management.color import no_style
+from optparse import make_option
+import sys
+import os
+
+try:
+    set
+except NameError:
+    from sets import Set as set   # Python 2.3 fallback
+
+class Command(BaseCommand):
+    option_list = BaseCommand.option_list + (
+        make_option('--verbosity', action='store', dest='verbosity', default='1',
+            type='choice', choices=['0', '1', '2'],
+            help='Verbosity level; 0=minimal output, 1=normal output, 2=all output'),
+    )
+    help = 'Installs the named fixture(s) in the database.'
+    args = "fixture [fixture ...]"
+
+    def handle(self, *fixture_labels, **options):
+        from django.db.models import get_apps
+        from django.core import serializers
+        from django.db import connection, transaction
+        from django.conf import settings
+
+        self.style = no_style()
+
+        verbosity = int(options.get('verbosity', 1))
+        show_traceback = options.get('traceback', False)
+        
+        # commit is a stealth option - it isn't really useful as 
+        # a command line option, but it can be useful when invoking
+        # loaddata from within another script. 
+        # If commit=True, loaddata will use its own transaction;
+        # if commit=False, the data load SQL will become part of
+        # the transaction in place when loaddata was invoked.
+        commit = options.get('commit', True)
+        
+        # Keep a count of the installed objects and fixtures
+        fixture_count = 0
+        object_count = 0
+        objects_per_fixture = []
+        models = set()
+
+        humanize = lambda dirname: dirname and "'%s'" % dirname or 'absolute path'
+
+        # Get a cursor (even though we don't need one yet). This has
+        # the side effect of initializing the test database (if
+        # it isn't already initialized).
+        cursor = connection.cursor()
+
+        # Start transaction management. All fixtures are installed in a
+        # single transaction to ensure that all references are resolved.
+        if commit:
+            transaction.commit_unless_managed()
+            transaction.enter_transaction_management()
+            transaction.managed(True)
+
+        app_fixtures = [os.path.join(os.path.dirname(app.__file__), 'fixtures') for app in get_apps()]
+        for fixture_label in fixture_labels:
+            parts = fixture_label.split('.')
+            if len(parts) == 1:
+                fixture_name = fixture_label
+                formats = serializers.get_public_serializer_formats()
+            else:
+                fixture_name, format = '.'.join(parts[:-1]), parts[-1]
+                if format in serializers.get_public_serializer_formats():
+                    formats = [format]
+                else:
+                    formats = []
+
+            if formats:
+                if verbosity > 1:
+                    print "Loading '%s' fixtures..." % fixture_name
+            else:
+                sys.stderr.write(
+                    self.style.ERROR("Problem installing fixture '%s': %s is not a known serialization format." %
+                        (fixture_name, format)))
+                transaction.rollback()
+                transaction.leave_transaction_management()
+                return
+
+            if os.path.isabs(fixture_name):
+                fixture_dirs = [fixture_name]
+            else:
+                fixture_dirs = app_fixtures + list(settings.FIXTURE_DIRS) + ['']
+
+            for fixture_dir in fixture_dirs:
+                if verbosity > 1:
+                    print "Checking %s for fixtures..." % humanize(fixture_dir)
+
+                label_found = False
+                for format in formats:
+                    serializer = serializers.get_serializer(format)
+                    if verbosity > 1:
+                        print "Trying %s for %s fixture '%s'..." % \
+                            (humanize(fixture_dir), format, fixture_name)
+                    try:
+                        full_path = os.path.join(fixture_dir, '.'.join([fixture_name, format]))
+                        fixture = open(full_path, 'r')
+                        if label_found:
+                            fixture.close()
+                            print self.style.ERROR("Multiple fixtures named '%s' in %s. Aborting." %
+                                (fixture_name, humanize(fixture_dir)))
+                            transaction.rollback()
+                            transaction.leave_transaction_management()
+                            return
+                        else:
+                            fixture_count += 1
+                            objects_per_fixture.append(0)
+                            if verbosity > 0:
+                                print "Installing %s fixture '%s' from %s." % \
+                                    (format, fixture_name, humanize(fixture_dir))
+                            try:
+                                objects = serializers.deserialize(format, fixture)
+                                for obj in objects:
+                                    object_count += 1
+                                    objects_per_fixture[-1] += 1
+                                    models.add(obj.object.__class__)
+                                    obj.save()
+                                label_found = True
+                            except (SystemExit, KeyboardInterrupt):
+                                raise
+                            except Exception:
+                                import traceback
+                                fixture.close()
+                                transaction.rollback()
+                                transaction.leave_transaction_management()
+                                if show_traceback:
+                                    import traceback
+                                    traceback.print_exc()
+                                else:
+                                    sys.stderr.write(
+                                        self.style.ERROR("Problem installing fixture '%s': %s\n" %
+                                             (full_path, traceback.format_exc())))
+                                return
+                            fixture.close()
+                    except:
+                        if verbosity > 1:
+                            print "No %s fixture '%s' in %s." % \
+                                (format, fixture_name, humanize(fixture_dir))
+
+
+        # If any of the fixtures we loaded contain 0 objects, assume that an
+        # error was encountered during fixture loading.
+        if 0 in objects_per_fixture:
+            sys.stderr.write(
+                self.style.ERROR("No fixture data found for '%s'. (File format may be invalid.)" %
+                    (fixture_name)))
+            transaction.rollback()
+            transaction.leave_transaction_management()
+            return
+            
+        # If we found even one object in a fixture, we need to reset the
+        # database sequences.
+        if object_count > 0:
+            sequence_sql = connection.ops.sequence_reset_sql(self.style, models)
+            if sequence_sql:
+                if verbosity > 1:
+                    print "Resetting sequences"
+                for line in sequence_sql:
+                    cursor.execute(line)
+        
+        if commit:
+            transaction.commit()
+            transaction.leave_transaction_management()
+
+        if object_count == 0:
+            if verbosity > 1:
+                print "No fixtures found."
+        else:
+            if verbosity > 0:
+                print "Installed %d object(s) from %d fixture(s)" % (object_count, fixture_count)
+                
+        # Close the DB connection. This is required as a workaround for an
+        # edge case in MySQL: if the same connection is used to
+        # create tables, load data, and query, the query can return
+        # incorrect results. See Django #7572, MySQL #37735.
+        if commit:
+            connection.close()
diff --git a/webapp/django/core/management/commands/makemessages.py b/webapp/django/core/management/commands/makemessages.py
new file mode 100644
index 0000000..aaa99ee
--- /dev/null
+++ b/webapp/django/core/management/commands/makemessages.py
@@ -0,0 +1,205 @@
+import re
+import os
+import sys
+from itertools import dropwhile
+from optparse import make_option
+from django.core.management.base import CommandError, BaseCommand
+
+try:
+    set
+except NameError:
+    from sets import Set as set     # For Python 2.3
+
+pythonize_re = re.compile(r'\n\s*//')
+
+def handle_extensions(extensions=('html',)):
+    """
+    organizes multiple extensions that are separated with commas or passed by
+    using --extension/-e multiple times.
+
+    for example: running 'django-admin makemessages -e js,txt -e xhtml -a'
+    would result in a extension list: ['.js', '.txt', '.xhtml']
+
+    >>> handle_extensions(['.html', 'html,js,py,py,py,.py', 'py,.py'])
+    ['.html', '.js']
+    >>> handle_extensions(['.html, txt,.tpl'])
+    ['.html', '.tpl', '.txt']
+    """
+    ext_list = []
+    for ext in extensions:
+        ext_list.extend(ext.replace(' ','').split(','))
+    for i, ext in enumerate(ext_list):
+        if not ext.startswith('.'):
+            ext_list[i] = '.%s' % ext_list[i]
+
+    # we don't want *.py files here because of the way non-*.py files
+    # are handled in make_messages() (they are copied to file.ext.py files to
+    # trick xgettext to parse them as Python files)
+    return set([x for x in ext_list if x != '.py'])
+
+def make_messages(locale=None, domain='django', verbosity='1', all=False, extensions=None):
+    """
+    Uses the locale directory from the Django SVN tree or an application/
+    project to process all
+    """
+    # Need to ensure that the i18n framework is enabled
+    from django.conf import settings
+    if settings.configured:
+        settings.USE_I18N = True
+    else:
+        settings.configure(USE_I18N = True)
+
+    from django.utils.translation import templatize
+
+    if os.path.isdir(os.path.join('conf', 'locale')):
+        localedir = os.path.abspath(os.path.join('conf', 'locale'))
+    elif os.path.isdir('locale'):
+        localedir = os.path.abspath('locale')
+    else:
+        raise CommandError("This script should be run from the Django SVN tree or your project or app tree. If you did indeed run it from the SVN checkout or your project or application, maybe you are just missing the conf/locale (in the django tree) or locale (for project and application) directory? It is not created automatically, you have to create it by hand if you want to enable i18n for your project or application.")
+
+    if domain not in ('django', 'djangojs'):
+        raise CommandError("currently makemessages only supports domains 'django' and 'djangojs'")
+
+    if (locale is None and not all) or domain is None:
+        # backwards compatible error message
+        if not sys.argv[0].endswith("make-messages.py"):
+            message = "Type '%s help %s' for usage.\n" % (os.path.basename(sys.argv[0]), sys.argv[1])
+        else:
+            message = "usage: make-messages.py -l <language>\n   or: make-messages.py -a\n"
+        raise CommandError(message)
+
+    languages = []
+    if locale is not None:
+        languages.append(locale)
+    elif all:
+        languages = [el for el in os.listdir(localedir) if not el.startswith('.')]
+
+    for locale in languages:
+        if verbosity > 0:
+            print "processing language", locale
+        basedir = os.path.join(localedir, locale, 'LC_MESSAGES')
+        if not os.path.isdir(basedir):
+            os.makedirs(basedir)
+
+        pofile = os.path.join(basedir, '%s.po' % domain)
+        potfile = os.path.join(basedir, '%s.pot' % domain)
+
+        if os.path.exists(potfile):
+            os.unlink(potfile)
+
+        all_files = []
+        for (dirpath, dirnames, filenames) in os.walk("."):
+            all_files.extend([(dirpath, f) for f in filenames])
+        all_files.sort()
+        for dirpath, file in all_files:
+            file_base, file_ext = os.path.splitext(file)
+            if domain == 'djangojs' and file_ext == '.js':
+                if verbosity > 1:
+                    sys.stdout.write('processing file %s in %s\n' % (file, dirpath))
+                src = open(os.path.join(dirpath, file), "rb").read()
+                src = pythonize_re.sub('\n#', src)
+                open(os.path.join(dirpath, '%s.py' % file), "wb").write(src)
+                thefile = '%s.py' % file
+                cmd = 'xgettext -d %s -L Perl --keyword=gettext_noop --keyword=gettext_lazy --keyword=ngettext_lazy:1,2 --from-code UTF-8 -o - "%s"' % (domain, os.path.join(dirpath, thefile))
+                (stdin, stdout, stderr) = os.popen3(cmd, 't')
+                msgs = stdout.read()
+                errors = stderr.read()
+                if errors:
+                    raise CommandError("errors happened while running xgettext on %s\n%s" % (file, errors))
+                old = '#: '+os.path.join(dirpath, thefile)[2:]
+                new = '#: '+os.path.join(dirpath, file)[2:]
+                msgs = msgs.replace(old, new)
+                if os.path.exists(potfile):
+                    # Strip the header
+                    msgs = '\n'.join(dropwhile(len, msgs.split('\n')))
+                else:
+                    msgs = msgs.replace('charset=CHARSET', 'charset=UTF-8')
+                if msgs:
+                    open(potfile, 'ab').write(msgs)
+                os.unlink(os.path.join(dirpath, thefile))
+            elif domain == 'django' and (file_ext == '.py' or file_ext in extensions):
+                thefile = file
+                if file_ext in extensions:
+                    src = open(os.path.join(dirpath, file), "rb").read()
+                    thefile = '%s.py' % file
+                    open(os.path.join(dirpath, thefile), "wb").write(templatize(src))
+                if verbosity > 1:
+                    sys.stdout.write('processing file %s in %s\n' % (file, dirpath))
+                cmd = 'xgettext -d %s -L Python --keyword=gettext_noop --keyword=gettext_lazy --keyword=ngettext_lazy:1,2 --keyword=ugettext_noop --keyword=ugettext_lazy --keyword=ungettext_lazy:1,2 --from-code UTF-8 -o - "%s"' % (
+                    domain, os.path.join(dirpath, thefile))
+                (stdin, stdout, stderr) = os.popen3(cmd, 't')
+                msgs = stdout.read()
+                errors = stderr.read()
+                if errors:
+                    raise CommandError("errors happened while running xgettext on %s\n%s" % (file, errors))
+                if thefile != file:
+                    old = '#: '+os.path.join(dirpath, thefile)[2:]
+                    new = '#: '+os.path.join(dirpath, file)[2:]
+                    msgs = msgs.replace(old, new)
+                if os.path.exists(potfile):
+                    # Strip the header
+                    msgs = '\n'.join(dropwhile(len, msgs.split('\n')))
+                else:
+                    msgs = msgs.replace('charset=CHARSET', 'charset=UTF-8')
+                if msgs:
+                    open(potfile, 'ab').write(msgs)
+                if thefile != file:
+                    os.unlink(os.path.join(dirpath, thefile))
+
+        if os.path.exists(potfile):
+            (stdin, stdout, stderr) = os.popen3('msguniq --to-code=utf-8 "%s"' % potfile, 'b')
+            msgs = stdout.read()
+            errors = stderr.read()
+            if errors:
+                raise CommandError("errors happened while running msguniq\n%s" % errors)
+            open(potfile, 'w').write(msgs)
+            if os.path.exists(pofile):
+                (stdin, stdout, stderr) = os.popen3('msgmerge -q "%s" "%s"' % (pofile, potfile), 'b')
+                msgs = stdout.read()
+                errors = stderr.read()
+                if errors:
+                    raise CommandError("errors happened while running msgmerge\n%s" % errors)
+            open(pofile, 'wb').write(msgs)
+            os.unlink(potfile)
+
+
+class Command(BaseCommand):
+    option_list = BaseCommand.option_list + (
+        make_option('--locale', '-l', default=None, dest='locale',
+            help='Creates or updates the message files only for the given locale (e.g. pt_BR).'),
+        make_option('--domain', '-d', default='django', dest='domain',
+            help='The domain of the message files (default: "django").'),
+        make_option('--verbosity', '-v', action='store', dest='verbosity',
+            default='1', type='choice', choices=['0', '1', '2'],
+            help='Verbosity level; 0=minimal output, 1=normal output, 2=all output'),
+        make_option('--all', '-a', action='store_true', dest='all',
+            default=False, help='Reexamines all source code and templates for new translation strings and updates all message files for all available languages.'),
+        make_option('--extension', '-e', dest='extensions',
+            help='The file extension(s) to examine (default: ".html", separate multiple extensions with commas, or use -e multiple times)',
+            action='append'),
+    )
+    help = "Runs over the entire source tree of the current directory and pulls out all strings marked for translation. It creates (or updates) a message file in the conf/locale (in the django tree) or locale (for project and application) directory."
+
+    requires_model_validation = False
+    can_import_settings = False
+
+    def handle(self, *args, **options):
+        if len(args) != 0:
+            raise CommandError("Command doesn't accept any arguments")
+
+        locale = options.get('locale')
+        domain = options.get('domain')
+        verbosity = int(options.get('verbosity'))
+        process_all = options.get('all')
+        extensions = options.get('extensions') or ['html']
+
+        if domain == 'djangojs':
+            extensions = []
+        else:
+            extensions = handle_extensions(extensions)
+
+        if '.js' in extensions:
+            raise CommandError("JavaScript files should be examined by using the special 'djangojs' domain only.")
+
+        make_messages(locale, domain, verbosity, process_all, extensions)
diff --git a/webapp/django/core/management/commands/reset.py b/webapp/django/core/management/commands/reset.py
new file mode 100644
index 0000000..3e7ca9f
--- /dev/null
+++ b/webapp/django/core/management/commands/reset.py
@@ -0,0 +1,52 @@
+from django.core.management.base import AppCommand, CommandError
+from django.core.management.color import no_style
+from optparse import make_option
+
+class Command(AppCommand):
+    option_list = AppCommand.option_list + (
+        make_option('--noinput', action='store_false', dest='interactive', default=True,
+            help='Tells Django to NOT prompt the user for input of any kind.'),
+    )
+    help = "Executes ``sqlreset`` for the given app(s) in the current database."
+    args = '[appname ...]'
+
+    output_transaction = True
+
+    def handle_app(self, app, **options):
+        from django.db import connection, transaction
+        from django.conf import settings
+        from django.core.management.sql import sql_reset
+
+        app_name = app.__name__.split('.')[-2]
+
+        self.style = no_style()
+
+        sql_list = sql_reset(app, self.style)
+
+        if options.get('interactive'):
+            confirm = raw_input("""
+You have requested a database reset.
+This will IRREVERSIBLY DESTROY any data for
+the "%s" application in the database "%s".
+Are you sure you want to do this?
+
+Type 'yes' to continue, or 'no' to cancel: """ % (app_name, settings.DATABASE_NAME))
+        else:
+            confirm = 'yes'
+
+        if confirm == 'yes':
+            try:
+                cursor = connection.cursor()
+                for sql in sql_list:
+                    cursor.execute(sql)
+            except Exception, e:
+                transaction.rollback_unless_managed()
+                raise CommandError("""Error: %s couldn't be reset. Possible reasons:
+  * The database isn't running or isn't configured correctly.
+  * At least one of the database tables doesn't exist.
+  * The SQL was invalid.
+Hint: Look at the output of 'django-admin.py sqlreset %s'. That's the SQL this command wasn't able to run.
+The full error: %s""" % (app_name, app_name, e))
+            transaction.commit_unless_managed()
+        else:
+            print "Reset cancelled."
diff --git a/webapp/django/core/management/commands/runfcgi.py b/webapp/django/core/management/commands/runfcgi.py
new file mode 100644
index 0000000..a60d4eb
--- /dev/null
+++ b/webapp/django/core/management/commands/runfcgi.py
@@ -0,0 +1,20 @@
+from django.core.management.base import BaseCommand
+
+class Command(BaseCommand):
+    help = "Runs this project as a FastCGI application. Requires flup."
+    args = '[various KEY=val options, use `runfcgi help` for help]'
+
+    def handle(self, *args, **options):
+        from django.conf import settings
+        from django.utils import translation
+        # Activate the current language, because it won't get activated later.
+        try:
+            translation.activate(settings.LANGUAGE_CODE)
+        except AttributeError:
+            pass
+        from django.core.servers.fastcgi import runfastcgi
+        runfastcgi(args)
+        
+    def usage(self, subcommand):
+        from django.core.servers.fastcgi import FASTCGI_HELP
+        return FASTCGI_HELP
diff --git a/webapp/django/core/management/commands/runserver.py b/webapp/django/core/management/commands/runserver.py
new file mode 100644
index 0000000..12808bc
--- /dev/null
+++ b/webapp/django/core/management/commands/runserver.py
@@ -0,0 +1,77 @@
+from django.core.management.base import BaseCommand, CommandError
+from optparse import make_option
+import os
+import sys
+
+class Command(BaseCommand):
+    option_list = BaseCommand.option_list + (
+        make_option('--noreload', action='store_false', dest='use_reloader', default=True,
+            help='Tells Django to NOT use the auto-reloader.'),
+        make_option('--adminmedia', dest='admin_media_path', default='',
+            help='Specifies the directory from which to serve admin media.'),
+    )
+    help = "Starts a lightweight Web server for development."
+    args = '[optional port number, or ipaddr:port]'
+
+    # Validation is called explicitly each time the server is reloaded.
+    requires_model_validation = False
+
+    def handle(self, addrport='', *args, **options):
+        import django
+        from django.core.servers.basehttp import run, AdminMediaHandler, WSGIServerException
+        from django.core.handlers.wsgi import WSGIHandler
+        if args:
+            raise CommandError('Usage is runserver %s' % self.args)
+        if not addrport:
+            addr = ''
+            port = '8000'
+        else:
+            try:
+                addr, port = addrport.split(':')
+            except ValueError:
+                addr, port = '', addrport
+        if not addr:
+            addr = '127.0.0.1'
+
+        if not port.isdigit():
+            raise CommandError("%r is not a valid port number." % port)
+
+        use_reloader = options.get('use_reloader', True)
+        admin_media_path = options.get('admin_media_path', '')
+        shutdown_message = options.get('shutdown_message', '')
+        quit_command = (sys.platform == 'win32') and 'CTRL-BREAK' or 'CONTROL-C'
+
+        def inner_run():
+            from django.conf import settings
+            print "Validating models..."
+            self.validate(display_num_errors=True)
+            print "\nDjango version %s, using settings %r" % (django.get_version(), settings.SETTINGS_MODULE)
+            print "Development server is running at http://%s:%s/" % (addr, port)
+            print "Quit the server with %s." % quit_command
+            try:
+                path = admin_media_path or django.__path__[0] + '/contrib/admin/media'
+                handler = AdminMediaHandler(WSGIHandler(), path)
+                run(addr, int(port), handler)
+            except WSGIServerException, e:
+                # Use helpful error messages instead of ugly tracebacks.
+                ERRORS = {
+                    13: "You don't have permission to access that port.",
+                    98: "That port is already in use.",
+                    99: "That IP address can't be assigned-to.",
+                }
+                try:
+                    error_text = ERRORS[e.args[0].args[0]]
+                except (AttributeError, KeyError):
+                    error_text = str(e)
+                sys.stderr.write(self.style.ERROR("Error: %s" % error_text) + '\n')
+                # Need to use an OS exit because sys.exit doesn't work in a thread
+                os._exit(1)
+            except KeyboardInterrupt:
+                if shutdown_message:
+                    print shutdown_message
+                sys.exit(0)
+        if use_reloader:
+            from django.utils import autoreload
+            autoreload.main(inner_run)
+        else:
+            inner_run()
diff --git a/webapp/django/core/management/commands/shell.py b/webapp/django/core/management/commands/shell.py
new file mode 100644
index 0000000..9616902
--- /dev/null
+++ b/webapp/django/core/management/commands/shell.py
@@ -0,0 +1,59 @@
+import os
+from django.core.management.base import NoArgsCommand
+from optparse import make_option
+
+class Command(NoArgsCommand):
+    option_list = NoArgsCommand.option_list + (
+        make_option('--plain', action='store_true', dest='plain',
+            help='Tells Django to use plain Python, not IPython.'),
+    )
+    help = "Runs a Python interactive interpreter. Tries to use IPython, if it's available."
+
+    requires_model_validation = False
+
+    def handle_noargs(self, **options):
+        # XXX: (Temporary) workaround for ticket #1796: force early loading of all
+        # models from installed apps.
+        from django.db.models.loading import get_models
+        loaded_models = get_models()
+
+        use_plain = options.get('plain', False)
+
+        try:
+            if use_plain:
+                # Don't bother loading IPython, because the user wants plain Python.
+                raise ImportError
+            import IPython
+            # Explicitly pass an empty list as arguments, because otherwise IPython
+            # would use sys.argv from this script.
+            shell = IPython.Shell.IPShell(argv=[])
+            shell.mainloop()
+        except ImportError:
+            import code
+            # Set up a dictionary to serve as the environment for the shell, so
+            # that tab completion works on objects that are imported at runtime.
+            # See ticket 5082.
+            imported_objects = {}
+            try: # Try activating rlcompleter, because it's handy.
+                import readline
+            except ImportError:
+                pass
+            else:
+                # We don't have to wrap the following import in a 'try', because
+                # we already know 'readline' was imported successfully.
+                import rlcompleter
+                readline.set_completer(rlcompleter.Completer(imported_objects).complete)
+                readline.parse_and_bind("tab:complete")
+
+            # We want to honor both $PYTHONSTARTUP and .pythonrc.py, so follow system
+            # conventions and get $PYTHONSTARTUP first then import user.
+            if not use_plain: 
+                pythonrc = os.environ.get("PYTHONSTARTUP") 
+                if pythonrc and os.path.isfile(pythonrc): 
+                    try: 
+                        execfile(pythonrc) 
+                    except NameError: 
+                        pass
+                # This will import .pythonrc.py as a side-effect
+                import user
+            code.interact(local=imported_objects)
diff --git a/webapp/django/core/management/commands/sql.py b/webapp/django/core/management/commands/sql.py
new file mode 100644
index 0000000..bc68a1e
--- /dev/null
+++ b/webapp/django/core/management/commands/sql.py
@@ -0,0 +1,10 @@
+from django.core.management.base import AppCommand
+
+class Command(AppCommand):
+    help = "Prints the CREATE TABLE SQL statements for the given app name(s)."
+
+    output_transaction = True
+
+    def handle_app(self, app, **options):
+        from django.core.management.sql import sql_create
+        return u'\n'.join(sql_create(app, self.style)).encode('utf-8')
diff --git a/webapp/django/core/management/commands/sqlall.py b/webapp/django/core/management/commands/sqlall.py
new file mode 100644
index 0000000..5d510f1
--- /dev/null
+++ b/webapp/django/core/management/commands/sqlall.py
@@ -0,0 +1,10 @@
+from django.core.management.base import AppCommand
+
+class Command(AppCommand):
+    help = "Prints the CREATE TABLE, custom SQL and CREATE INDEX SQL statements for the given model module name(s)."
+
+    output_transaction = True
+
+    def handle_app(self, app, **options):
+        from django.core.management.sql import sql_all
+        return u'\n'.join(sql_all(app, self.style)).encode('utf-8')
diff --git a/webapp/django/core/management/commands/sqlclear.py b/webapp/django/core/management/commands/sqlclear.py
new file mode 100644
index 0000000..8550e88
--- /dev/null
+++ b/webapp/django/core/management/commands/sqlclear.py
@@ -0,0 +1,10 @@
+from django.core.management.base import AppCommand
+
+class Command(AppCommand):
+    help = "Prints the DROP TABLE SQL statements for the given app name(s)."
+
+    output_transaction = True
+
+    def handle_app(self, app, **options):
+        from django.core.management.sql import sql_delete
+        return u'\n'.join(sql_delete(app, self.style)).encode('utf-8')
diff --git a/webapp/django/core/management/commands/sqlcustom.py b/webapp/django/core/management/commands/sqlcustom.py
new file mode 100644
index 0000000..465330d
--- /dev/null
+++ b/webapp/django/core/management/commands/sqlcustom.py
@@ -0,0 +1,10 @@
+from django.core.management.base import AppCommand
+
+class Command(AppCommand):
+    help = "Prints the custom table modifying SQL statements for the given app name(s)."
+
+    output_transaction = True
+
+    def handle_app(self, app, **options):
+        from django.core.management.sql import sql_custom
+        return u'\n'.join(sql_custom(app, self.style)).encode('utf-8')
diff --git a/webapp/django/core/management/commands/sqlflush.py b/webapp/django/core/management/commands/sqlflush.py
new file mode 100644
index 0000000..d0f71d3
--- /dev/null
+++ b/webapp/django/core/management/commands/sqlflush.py
@@ -0,0 +1,10 @@
+from django.core.management.base import NoArgsCommand
+
+class Command(NoArgsCommand):
+    help = "Returns a list of the SQL statements required to return all tables in the database to the state they were in just after they were installed."
+
+    output_transaction = True
+
+    def handle_noargs(self, **options):
+        from django.core.management.sql import sql_flush
+        return u'\n'.join(sql_flush(self.style, only_django=True)).encode('utf-8')
diff --git a/webapp/django/core/management/commands/sqlindexes.py b/webapp/django/core/management/commands/sqlindexes.py
new file mode 100644
index 0000000..9693588
--- /dev/null
+++ b/webapp/django/core/management/commands/sqlindexes.py
@@ -0,0 +1,10 @@
+from django.core.management.base import AppCommand
+
+class Command(AppCommand):
+    help = "Prints the CREATE INDEX SQL statements for the given model module name(s)."
+
+    output_transaction = True
+
+    def handle_app(self, app, **options):
+        from django.core.management.sql import sql_indexes
+        return u'\n'.join(sql_indexes(app, self.style)).encode('utf-8')
diff --git a/webapp/django/core/management/commands/sqlinitialdata.py b/webapp/django/core/management/commands/sqlinitialdata.py
new file mode 100644
index 0000000..b9e2249
--- /dev/null
+++ b/webapp/django/core/management/commands/sqlinitialdata.py
@@ -0,0 +1,7 @@
+from django.core.management.base import AppCommand, CommandError
+
+class Command(AppCommand):
+    help = "RENAMED: see 'sqlcustom'"
+
+    def handle(self, *apps, **options):
+        raise CommandError("This command has been renamed. Use the 'sqlcustom' command instead.")
diff --git a/webapp/django/core/management/commands/sqlreset.py b/webapp/django/core/management/commands/sqlreset.py
new file mode 100644
index 0000000..ec40848
--- /dev/null
+++ b/webapp/django/core/management/commands/sqlreset.py
@@ -0,0 +1,10 @@
+from django.core.management.base import AppCommand
+
+class Command(AppCommand):
+    help = "Prints the DROP TABLE SQL, then the CREATE TABLE SQL, for the given app name(s)."
+
+    output_transaction = True
+
+    def handle_app(self, app, **options):
+        from django.core.management.sql import sql_reset
+        return u'\n'.join(sql_reset(app, self.style)).encode('utf-8')
diff --git a/webapp/django/core/management/commands/sqlsequencereset.py b/webapp/django/core/management/commands/sqlsequencereset.py
new file mode 100644
index 0000000..e8dad0b
--- /dev/null
+++ b/webapp/django/core/management/commands/sqlsequencereset.py
@@ -0,0 +1,9 @@
+from django.core.management.base import AppCommand
+
+class Command(AppCommand):
+    help = 'Prints the SQL statements for resetting sequences for the given app name(s).'
+    output_transaction = True
+
+    def handle_app(self, app, **options):
+        from django.db import connection, models
+        return u'\n'.join(connection.ops.sequence_reset_sql(self.style, models.get_models(app))).encode('utf-8')
diff --git a/webapp/django/core/management/commands/startapp.py b/webapp/django/core/management/commands/startapp.py
new file mode 100644
index 0000000..a81c427
--- /dev/null
+++ b/webapp/django/core/management/commands/startapp.py
@@ -0,0 +1,46 @@
+import os
+
+from django.core.management.base import copy_helper, CommandError, LabelCommand
+
+class Command(LabelCommand):
+    help = "Creates a Django app directory structure for the given app name in the current directory."
+    args = "[appname]"
+    label = 'application name'
+
+    requires_model_validation = False
+    # Can't import settings during this command, because they haven't
+    # necessarily been created.
+    can_import_settings = False
+
+    def handle_label(self, app_name, directory=None, **options):
+        if directory is None:
+            directory = os.getcwd()
+
+        # Determine the project_name by using the basename of directory,
+        # which should be the full path of the project directory (or the
+        # current directory if no directory was passed).
+        project_name = os.path.basename(directory)
+        if app_name == project_name:
+            raise CommandError("You cannot create an app with the same name"
+                               " (%r) as your project." % app_name)
+
+        # Check that the app_name cannot be imported.
+        try:
+            __import__(app_name)
+        except ImportError:
+            pass
+        else:
+            raise CommandError("%r conflicts with the name of an existing Python module and cannot be used as an app name. Please try another name." % app_name)
+
+        copy_helper(self.style, 'app', app_name, directory, project_name)
+
+class ProjectCommand(Command):
+    help = ("Creates a Django app directory structure for the given app name"
+            " in this project's directory.")
+
+    def __init__(self, project_directory):
+        super(ProjectCommand, self).__init__()
+        self.project_directory = project_directory
+
+    def handle_label(self, app_name, **options):
+        super(ProjectCommand, self).handle_label(app_name, self.project_directory, **options)
diff --git a/webapp/django/core/management/commands/startproject.py b/webapp/django/core/management/commands/startproject.py
new file mode 100644
index 0000000..540a64d
--- /dev/null
+++ b/webapp/django/core/management/commands/startproject.py
@@ -0,0 +1,38 @@
+from django.core.management.base import copy_helper, CommandError, LabelCommand
+import os
+import re
+from random import choice
+
+class Command(LabelCommand):
+    help = "Creates a Django project directory structure for the given project name in the current directory."
+    args = "[projectname]"
+    label = 'project name'
+
+    requires_model_validation = False
+    # Can't import settings during this command, because they haven't
+    # necessarily been created.
+    can_import_settings = False
+
+    def handle_label(self, project_name, **options):
+        # Determine the project_name a bit naively -- by looking at the name of
+        # the parent directory.
+        directory = os.getcwd()
+
+        # Check that the project_name cannot be imported.
+        try:
+            __import__(project_name)
+        except ImportError:
+            pass
+        else:
+            raise CommandError("%r conflicts with the name of an existing Python module and cannot be used as a project name. Please try another name." % project_name)
+
+        copy_helper(self.style, 'project', project_name, directory)
+
+        # Create a random SECRET_KEY hash, and put it in the main settings.
+        main_settings_file = os.path.join(directory, project_name, 'settings.py')
+        settings_contents = open(main_settings_file, 'r').read()
+        fp = open(main_settings_file, 'w')
+        secret_key = ''.join([choice('abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=+)') for i in range(50)])
+        settings_contents = re.sub(r"(?<=SECRET_KEY = ')'", secret_key + "'", settings_contents)
+        fp.write(settings_contents)
+        fp.close()
diff --git a/webapp/django/core/management/commands/syncdb.py b/webapp/django/core/management/commands/syncdb.py
new file mode 100644
index 0000000..7aeed49
--- /dev/null
+++ b/webapp/django/core/management/commands/syncdb.py
@@ -0,0 +1,152 @@
+from django.core.management.base import NoArgsCommand
+from django.core.management.color import no_style
+from optparse import make_option
+import sys
+
+try:
+    set
+except NameError:
+    from sets import Set as set   # Python 2.3 fallback
+
+class Command(NoArgsCommand):
+    option_list = NoArgsCommand.option_list + (
+        make_option('--verbosity', action='store', dest='verbosity', default='1',
+            type='choice', choices=['0', '1', '2'],
+            help='Verbosity level; 0=minimal output, 1=normal output, 2=all output'),
+        make_option('--noinput', action='store_false', dest='interactive', default=True,
+            help='Tells Django to NOT prompt the user for input of any kind.'),
+    )
+    help = "Create the database tables for all apps in INSTALLED_APPS whose tables haven't already been created."
+
+    def handle_noargs(self, **options):
+        from django.db import connection, transaction, models
+        from django.conf import settings
+        from django.core.management.sql import custom_sql_for_model, emit_post_sync_signal
+
+        verbosity = int(options.get('verbosity', 1))
+        interactive = options.get('interactive')
+        show_traceback = options.get('traceback', False)
+
+        self.style = no_style()
+
+        # Import the 'management' module within each installed app, to register
+        # dispatcher events.
+        for app_name in settings.INSTALLED_APPS:
+            try:
+                __import__(app_name + '.management', {}, {}, [''])
+            except ImportError, exc:
+                # This is slightly hackish. We want to ignore ImportErrors
+                # if the "management" module itself is missing -- but we don't
+                # want to ignore the exception if the management module exists
+                # but raises an ImportError for some reason. The only way we
+                # can do this is to check the text of the exception. Note that
+                # we're a bit broad in how we check the text, because different
+                # Python implementations may not use the same text. 
+                # CPython uses the text "No module named management"
+                # PyPy uses "No module named myproject.myapp.management"
+                msg = exc.args[0]
+                if not msg.startswith('No module named') or 'management' not in msg:
+                    raise
+
+        cursor = connection.cursor()
+
+        # Get a list of already installed *models* so that references work right.
+        tables = connection.introspection.table_names()
+        seen_models = connection.introspection.installed_models(tables)
+        created_models = set()
+        pending_references = {}
+
+        # Create the tables for each model
+        for app in models.get_apps():
+            app_name = app.__name__.split('.')[-2]
+            model_list = models.get_models(app)
+            for model in model_list:
+                # Create the model's database table, if it doesn't already exist.
+                if verbosity >= 2:
+                    print "Processing %s.%s model" % (app_name, model._meta.object_name)
+                if connection.introspection.table_name_converter(model._meta.db_table) in tables:
+                    continue
+                sql, references = connection.creation.sql_create_model(model, self.style, seen_models)
+                seen_models.add(model)
+                created_models.add(model)
+                for refto, refs in references.items():
+                    pending_references.setdefault(refto, []).extend(refs)
+                    if refto in seen_models:
+                        sql.extend(connection.creation.sql_for_pending_references(refto, self.style, pending_references))
+                sql.extend(connection.creation.sql_for_pending_references(model, self.style, pending_references))
+                if verbosity >= 1:
+                    print "Creating table %s" % model._meta.db_table
+                for statement in sql:
+                    cursor.execute(statement)
+                tables.append(connection.introspection.table_name_converter(model._meta.db_table))
+
+        # Create the m2m tables. This must be done after all tables have been created
+        # to ensure that all referred tables will exist.
+        for app in models.get_apps():
+            app_name = app.__name__.split('.')[-2]
+            model_list = models.get_models(app)
+            for model in model_list:
+                if model in created_models:
+                    sql = connection.creation.sql_for_many_to_many(model, self.style)
+                    if sql:
+                        if verbosity >= 2:
+                            print "Creating many-to-many tables for %s.%s model" % (app_name, model._meta.object_name)
+                        for statement in sql:
+                            cursor.execute(statement)
+
+        transaction.commit_unless_managed()
+
+        # Send the post_syncdb signal, so individual apps can do whatever they need
+        # to do at this point.
+        emit_post_sync_signal(created_models, verbosity, interactive)
+        
+        # The connection may have been closed by a syncdb handler.
+        cursor = connection.cursor()
+        
+        # Install custom SQL for the app (but only if this
+        # is a model we've just created)
+        for app in models.get_apps():
+            app_name = app.__name__.split('.')[-2]
+            for model in models.get_models(app):
+                if model in created_models:
+                    custom_sql = custom_sql_for_model(model, self.style)
+                    if custom_sql:
+                        if verbosity >= 1:
+                            print "Installing custom SQL for %s.%s model" % (app_name, model._meta.object_name)
+                        try:
+                            for sql in custom_sql:
+                                cursor.execute(sql)
+                        except Exception, e:
+                            sys.stderr.write("Failed to install custom SQL for %s.%s model: %s\n" % \
+                                                (app_name, model._meta.object_name, e))
+                            if show_traceback:
+                                import traceback
+                                traceback.print_exc()
+                            transaction.rollback_unless_managed()
+                        else:
+                            transaction.commit_unless_managed()
+                    else:
+                        if verbosity >= 2:
+                            print "No custom SQL for %s.%s model" % (app_name, model._meta.object_name)
+        # Install SQL indicies for all newly created models
+        for app in models.get_apps():
+            app_name = app.__name__.split('.')[-2]
+            for model in models.get_models(app):
+                if model in created_models:
+                    index_sql = connection.creation.sql_indexes_for_model(model, self.style)
+                    if index_sql:
+                        if verbosity >= 1:
+                            print "Installing index for %s.%s model" % (app_name, model._meta.object_name)
+                        try:
+                            for sql in index_sql:
+                                cursor.execute(sql)
+                        except Exception, e:
+                            sys.stderr.write("Failed to install index for %s.%s model: %s\n" % \
+                                                (app_name, model._meta.object_name, e))
+                            transaction.rollback_unless_managed()
+                        else:
+                            transaction.commit_unless_managed()
+
+        # Install the 'initial_data' fixture, using format discovery
+        from django.core.management import call_command
+        call_command('loaddata', 'initial_data', verbosity=verbosity)
diff --git a/webapp/django/core/management/commands/test.py b/webapp/django/core/management/commands/test.py
new file mode 100644
index 0000000..ef7b197
--- /dev/null
+++ b/webapp/django/core/management/commands/test.py
@@ -0,0 +1,35 @@
+from django.core.management.base import BaseCommand
+from optparse import make_option
+import sys
+
+class Command(BaseCommand):
+    option_list = BaseCommand.option_list + (
+        make_option('--verbosity', action='store', dest='verbosity', default='1',
+            type='choice', choices=['0', '1', '2'],
+            help='Verbosity level; 0=minimal output, 1=normal output, 2=all output'),
+        make_option('--noinput', action='store_false', dest='interactive', default=True,
+            help='Tells Django to NOT prompt the user for input of any kind.'),
+    )
+    help = 'Runs the test suite for the specified applications, or the entire site if no apps are specified.'
+    args = '[appname ...]'
+
+    requires_model_validation = False
+
+    def handle(self, *test_labels, **options):
+        from django.conf import settings
+
+        verbosity = int(options.get('verbosity', 1))
+        interactive = options.get('interactive', True)
+    
+        test_path = settings.TEST_RUNNER.split('.')
+        # Allow for Python 2.5 relative paths
+        if len(test_path) > 1:
+            test_module_name = '.'.join(test_path[:-1])
+        else:
+            test_module_name = '.'
+        test_module = __import__(test_module_name, {}, {}, test_path[-1])
+        test_runner = getattr(test_module, test_path[-1])
+
+        failures = test_runner(test_labels, verbosity=verbosity, interactive=interactive)
+        if failures:
+            sys.exit(failures)
diff --git a/webapp/django/core/management/commands/testserver.py b/webapp/django/core/management/commands/testserver.py
new file mode 100644
index 0000000..78983e7
--- /dev/null
+++ b/webapp/django/core/management/commands/testserver.py
@@ -0,0 +1,36 @@
+from django.core.management.base import BaseCommand
+
+from optparse import make_option
+
+class Command(BaseCommand):
+    option_list = BaseCommand.option_list + (
+        make_option('--verbosity', action='store', dest='verbosity', default='1',
+            type='choice', choices=['0', '1', '2'],
+            help='Verbosity level; 0=minimal output, 1=normal output, 2=all output'),
+        make_option('--addrport', action='store', dest='addrport', 
+            type='string', default='',
+            help='port number or ipaddr:port to run the server on'),
+    )
+    help = 'Runs a development server with data from the given fixture(s).'
+    args = '[fixture ...]'
+
+    requires_model_validation = False
+
+    def handle(self, *fixture_labels, **options):
+        from django.core.management import call_command
+        from django.db import connection
+
+        verbosity = int(options.get('verbosity', 1))
+        addrport = options.get('addrport')
+
+        # Create a test database.
+        db_name = connection.creation.create_test_db(verbosity=verbosity)
+
+        # Import the fixture data into the test database.
+        call_command('loaddata', *fixture_labels, **{'verbosity': verbosity})
+
+        # Run the development server. Turn off auto-reloading because it causes
+        # a strange error -- it causes this handle() method to be called
+        # multiple times.
+        shutdown_message = '\nServer stopped.\nNote that the test database, %r, has not been deleted. You can explore it on your own.' % db_name
+        call_command('runserver', addrport=addrport, shutdown_message=shutdown_message, use_reloader=False)
diff --git a/webapp/django/core/management/commands/validate.py b/webapp/django/core/management/commands/validate.py
new file mode 100644
index 0000000..760d41c
--- /dev/null
+++ b/webapp/django/core/management/commands/validate.py
@@ -0,0 +1,9 @@
+from django.core.management.base import NoArgsCommand
+
+class Command(NoArgsCommand):
+    help = "Validates all installed models."
+
+    requires_model_validation = False
+
+    def handle_noargs(self, **options):
+        self.validate(display_num_errors=True)
diff --git a/webapp/django/core/management/sql.py b/webapp/django/core/management/sql.py
new file mode 100644
index 0000000..4874a49
--- /dev/null
+++ b/webapp/django/core/management/sql.py
@@ -0,0 +1,205 @@
+from django.core.management.base import CommandError
+import os
+import re
+
+try:
+    set
+except NameError:
+    from sets import Set as set   # Python 2.3 fallback
+
+def sql_create(app, style):
+    "Returns a list of the CREATE TABLE SQL statements for the given app."
+    from django.db import connection, models
+    from django.conf import settings
+
+    if settings.DATABASE_ENGINE == 'dummy':
+        # This must be the "dummy" database backend, which means the user
+        # hasn't set DATABASE_ENGINE.
+        raise CommandError("Django doesn't know which syntax to use for your SQL statements,\n" +
+            "because you haven't specified the DATABASE_ENGINE setting.\n" +
+            "Edit your settings file and change DATABASE_ENGINE to something like 'postgresql' or 'mysql'.")
+
+    # Get installed models, so we generate REFERENCES right.
+    # We trim models from the current app so that the sqlreset command does not
+    # generate invalid SQL (leaving models out of known_models is harmless, so
+    # we can be conservative).
+    app_models = models.get_models(app)
+    final_output = []
+    tables = connection.introspection.table_names()
+    known_models = set([model for model in connection.introspection.installed_models(tables) if model not in app_models])
+    pending_references = {}
+
+    for model in app_models:
+        output, references = connection.creation.sql_create_model(model, style, known_models)
+        final_output.extend(output)
+        for refto, refs in references.items():
+            pending_references.setdefault(refto, []).extend(refs)
+            if refto in known_models:
+                final_output.extend(connection.creation.sql_for_pending_references(refto, style, pending_references))
+        final_output.extend(connection.creation.sql_for_pending_references(model, style, pending_references))
+        # Keep track of the fact that we've created the table for this model.
+        known_models.add(model)
+
+    # Create the many-to-many join tables.
+    for model in app_models:
+        final_output.extend(connection.creation.sql_for_many_to_many(model, style))
+
+    # Handle references to tables that are from other apps
+    # but don't exist physically.
+    not_installed_models = set(pending_references.keys())
+    if not_installed_models:
+        alter_sql = []
+        for model in not_installed_models:
+            alter_sql.extend(['-- ' + sql for sql in
+                connection.creation.sql_for_pending_references(model, style, pending_references)])
+        if alter_sql:
+            final_output.append('-- The following references should be added but depend on non-existent tables:')
+            final_output.extend(alter_sql)
+
+    return final_output
+
+def sql_delete(app, style):
+    "Returns a list of the DROP TABLE SQL statements for the given app."
+    from django.db import connection, models
+    from django.db.backends.util import truncate_name
+    from django.contrib.contenttypes import generic
+
+    # This should work even if a connection isn't available
+    try:
+        cursor = connection.cursor()
+    except:
+        cursor = None
+
+    # Figure out which tables already exist
+    if cursor:
+        table_names = connection.introspection.get_table_list(cursor)
+    else:
+        table_names = []
+
+    output = []
+
+    # Output DROP TABLE statements for standard application tables.
+    to_delete = set()
+
+    references_to_delete = {}
+    app_models = models.get_models(app)
+    for model in app_models:
+        if cursor and connection.introspection.table_name_converter(model._meta.db_table) in table_names:
+            # The table exists, so it needs to be dropped
+            opts = model._meta
+            for f in opts.local_fields:
+                if f.rel and f.rel.to not in to_delete:
+                    references_to_delete.setdefault(f.rel.to, []).append( (model, f) )
+
+            to_delete.add(model)
+
+    for model in app_models:
+        if connection.introspection.table_name_converter(model._meta.db_table) in table_names:
+            output.extend(connection.creation.sql_destroy_model(model, references_to_delete, style))
+
+    # Output DROP TABLE statements for many-to-many tables.
+    for model in app_models:
+        opts = model._meta
+        for f in opts.local_many_to_many:
+            if cursor and connection.introspection.table_name_converter(f.m2m_db_table()) in table_names:
+                output.extend(connection.creation.sql_destroy_many_to_many(model, f, style))
+
+    # Close database connection explicitly, in case this output is being piped
+    # directly into a database client, to avoid locking issues.
+    if cursor:
+        cursor.close()
+        connection.close()
+
+    return output[::-1] # Reverse it, to deal with table dependencies.
+
+def sql_reset(app, style):
+    "Returns a list of the DROP TABLE SQL, then the CREATE TABLE SQL, for the given module."
+    return sql_delete(app, style) + sql_all(app, style)
+
+def sql_flush(style, only_django=False):
+    """
+    Returns a list of the SQL statements used to flush the database.
+    
+    If only_django is True, then only table names that have associated Django
+    models and are in INSTALLED_APPS will be included.
+    """
+    from django.db import connection
+    if only_django:
+        tables = connection.introspection.django_table_names()
+    else:
+        tables = connection.introspection.table_names()
+    statements = connection.ops.sql_flush(style, tables, connection.introspection.sequence_list())
+    return statements
+
+def sql_custom(app, style):
+    "Returns a list of the custom table modifying SQL statements for the given app."
+    from django.db.models import get_models
+    output = []
+
+    app_models = get_models(app)
+    app_dir = os.path.normpath(os.path.join(os.path.dirname(app.__file__), 'sql'))
+
+    for model in app_models:
+        output.extend(custom_sql_for_model(model, style))
+
+    return output
+
+def sql_indexes(app, style):
+    "Returns a list of the CREATE INDEX SQL statements for all models in the given app."
+    from django.db import connection, models
+    output = []
+    for model in models.get_models(app):
+        output.extend(connection.creation.sql_indexes_for_model(model, style))
+    return output
+
+def sql_all(app, style):
+    "Returns a list of CREATE TABLE SQL, initial-data inserts, and CREATE INDEX SQL for the given module."
+    return sql_create(app, style) + sql_custom(app, style) + sql_indexes(app, style)
+
+def custom_sql_for_model(model, style):
+    from django.db import models
+    from django.conf import settings
+
+    opts = model._meta
+    app_dir = os.path.normpath(os.path.join(os.path.dirname(models.get_app(model._meta.app_label).__file__), 'sql'))
+    output = []
+
+    # Post-creation SQL should come before any initial SQL data is loaded.
+    # However, this should not be done for fields that are part of a a parent
+    # model (via model inheritance).
+    nm = opts.init_name_map()
+    post_sql_fields = [f for f in opts.local_fields if hasattr(f, 'post_create_sql')]
+    for f in post_sql_fields:
+        output.extend(f.post_create_sql(style, model._meta.db_table))
+
+    # Some backends can't execute more than one SQL statement at a time,
+    # so split into separate statements.
+    statements = re.compile(r";[ \t]*$", re.M)
+
+    # Find custom SQL, if it's available.
+    sql_files = [os.path.join(app_dir, "%s.%s.sql" % (opts.object_name.lower(), settings.DATABASE_ENGINE)),
+                 os.path.join(app_dir, "%s.sql" % opts.object_name.lower())]
+    for sql_file in sql_files:
+        if os.path.exists(sql_file):
+            fp = open(sql_file, 'U')
+            for statement in statements.split(fp.read().decode(settings.FILE_CHARSET)):
+                # Remove any comments from the file
+                statement = re.sub(ur"--.*([\n\Z]|$)", "", statement)
+                if statement.strip():
+                    output.append(statement + u";")
+            fp.close()
+
+    return output
+
+
+def emit_post_sync_signal(created_models, verbosity, interactive):
+    from django.db import models
+    from django.dispatch import dispatcher
+    # Emit the post_sync signal for every application.
+    for app in models.get_apps():
+        app_name = app.__name__.split('.')[-2]
+        if verbosity >= 2:
+            print "Running post-sync handlers for application", app_name
+        models.signals.post_syncdb.send(sender=app, app=app,
+            created_models=created_models, verbosity=verbosity,
+            interactive=interactive)
diff --git a/webapp/django/core/management/validation.py b/webapp/django/core/management/validation.py
new file mode 100644
index 0000000..0b3542c
--- /dev/null
+++ b/webapp/django/core/management/validation.py
@@ -0,0 +1,221 @@
+import sys
+from django.core.management.color import color_style
+from django.utils.itercompat import is_iterable
+
+class ModelErrorCollection:
+    def __init__(self, outfile=sys.stdout):
+        self.errors = []
+        self.outfile = outfile
+        self.style = color_style()
+
+    def add(self, context, error):
+        self.errors.append((context, error))
+        self.outfile.write(self.style.ERROR("%s: %s\n" % (context, error)))
+
+def get_validation_errors(outfile, app=None):
+    """
+    Validates all models that are part of the specified app. If no app name is provided,
+    validates all models of all installed apps. Writes errors, if any, to outfile.
+    Returns number of errors.
+    """
+    from django.conf import settings
+    from django.db import models, connection
+    from django.db.models.loading import get_app_errors
+    from django.db.models.fields.related import RelatedObject
+
+    e = ModelErrorCollection(outfile)
+
+    for (app_name, error) in get_app_errors().items():
+        e.add(app_name, error)
+
+    for cls in models.get_models(app):
+        opts = cls._meta
+
+        # Do field-specific validation.
+        for f in opts.local_fields:
+            if f.name == 'id' and not f.primary_key and opts.pk.name == 'id':
+                e.add(opts, '"%s": You can\'t use "id" as a field name, because each model automatically gets an "id" field if none of the fields have primary_key=True. You need to either remove/rename your "id" field or add primary_key=True to a field.' % f.name)
+            if f.name.endswith('_'):
+                e.add(opts, '"%s": Field names cannot end with underscores, because this would lead to ambiguous queryset filters.' % f.name)
+            if isinstance(f, models.CharField) and f.max_length in (None, 0):
+                e.add(opts, '"%s": CharFields require a "max_length" attribute.' % f.name)
+            if isinstance(f, models.DecimalField):
+                if f.decimal_places is None:
+                    e.add(opts, '"%s": DecimalFields require a "decimal_places" attribute.' % f.name)
+                if f.max_digits is None:
+                    e.add(opts, '"%s": DecimalFields require a "max_digits" attribute.' % f.name)
+            if isinstance(f, models.FileField) and not f.upload_to:
+                e.add(opts, '"%s": FileFields require an "upload_to" attribute.' % f.name)
+            if isinstance(f, models.ImageField):
+                try:
+                    from PIL import Image
+                except ImportError:
+                    e.add(opts, '"%s": To use ImageFields, you need to install the Python Imaging Library. Get it at http://www.pythonware.com/products/pil/ .' % f.name)
+            if f.choices:
+                if isinstance(f.choices, basestring) or not is_iterable(f.choices):
+                    e.add(opts, '"%s": "choices" should be iterable (e.g., a tuple or list).' % f.name)
+                else:
+                    for c in f.choices:
+                        if not type(c) in (tuple, list) or len(c) != 2:
+                            e.add(opts, '"%s": "choices" should be a sequence of two-tuples.' % f.name)
+            if f.db_index not in (None, True, False):
+                e.add(opts, '"%s": "db_index" should be either None, True or False.' % f.name)
+
+            # Perform any backend-specific field validation.
+            connection.validation.validate_field(e, opts, f)
+
+            # Check to see if the related field will clash with any existing
+            # fields, m2m fields, m2m related objects or related objects
+            if f.rel:
+                if f.rel.to not in models.get_models():
+                    e.add(opts, "'%s' has a relation with model %s, which has either not been installed or is abstract." % (f.name, f.rel.to))
+                # it is a string and we could not find the model it refers to
+                # so skip the next section
+                if isinstance(f.rel.to, (str, unicode)):
+                    continue
+
+                rel_opts = f.rel.to._meta
+                rel_name = RelatedObject(f.rel.to, cls, f).get_accessor_name()
+                rel_query_name = f.related_query_name()
+                for r in rel_opts.fields:
+                    if r.name == rel_name:
+                        e.add(opts, "Accessor for field '%s' clashes with field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
+                    if r.name == rel_query_name:
+                        e.add(opts, "Reverse query name for field '%s' clashes with field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
+                for r in rel_opts.local_many_to_many:
+                    if r.name == rel_name:
+                        e.add(opts, "Accessor for field '%s' clashes with m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
+                    if r.name == rel_query_name:
+                        e.add(opts, "Reverse query name for field '%s' clashes with m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
+                for r in rel_opts.get_all_related_many_to_many_objects():
+                    if r.get_accessor_name() == rel_name:
+                        e.add(opts, "Accessor for field '%s' clashes with related m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
+                    if r.get_accessor_name() == rel_query_name:
+                        e.add(opts, "Reverse query name for field '%s' clashes with related m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
+                for r in rel_opts.get_all_related_objects():
+                    if r.field is not f:
+                        if r.get_accessor_name() == rel_name:
+                            e.add(opts, "Accessor for field '%s' clashes with related field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
+                        if r.get_accessor_name() == rel_query_name:
+                            e.add(opts, "Reverse query name for field '%s' clashes with related field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
+
+        seen_intermediary_signatures = []
+        for i, f in enumerate(opts.local_many_to_many):
+            # Check to see if the related m2m field will clash with any
+            # existing fields, m2m fields, m2m related objects or related
+            # objects
+            if f.rel.to not in models.get_models():
+                e.add(opts, "'%s' has an m2m relation with model %s, which has either not been installed or is abstract." % (f.name, f.rel.to))
+                # it is a string and we could not find the model it refers to
+                # so skip the next section
+                if isinstance(f.rel.to, (str, unicode)):
+                    continue
+
+            # Check that the field is not set to unique.  ManyToManyFields do not support unique.
+            if f.unique:
+                e.add(opts, "ManyToManyFields cannot be unique.  Remove the unique argument on '%s'." % f.name)
+
+            if getattr(f.rel, 'through', None) is not None:
+                if hasattr(f.rel, 'through_model'):
+                    from_model, to_model = cls, f.rel.to
+                    if from_model == to_model and f.rel.symmetrical:
+                        e.add(opts, "Many-to-many fields with intermediate tables cannot be symmetrical.")
+                    seen_from, seen_to, seen_self = False, False, 0
+                    for inter_field in f.rel.through_model._meta.fields:
+                        rel_to = getattr(inter_field.rel, 'to', None)
+                        if from_model == to_model: # relation to self
+                            if rel_to == from_model:
+                                seen_self += 1
+                            if seen_self > 2:
+                                e.add(opts, "Intermediary model %s has more than two foreign keys to %s, which is ambiguous and is not permitted." % (f.rel.through_model._meta.object_name, from_model._meta.object_name))
+                        else:
+                            if rel_to == from_model:
+                                if seen_from:
+                                    e.add(opts, "Intermediary model %s has more than one foreign key to %s, which is ambiguous and is not permitted." % (f.rel.through_model._meta.object_name, rel_from._meta.object_name))
+                                else:
+                                    seen_from = True
+                            elif rel_to == to_model:
+                                if seen_to:
+                                    e.add(opts, "Intermediary model %s has more than one foreign key to %s, which is ambiguous and is not permitted." % (f.rel.through_model._meta.object_name, rel_to._meta.object_name))
+                                else:
+                                    seen_to = True
+                    if f.rel.through_model not in models.get_models():
+                        e.add(opts, "'%s' specifies an m2m relation through model %s, which has not been installed." % (f.name, f.rel.through))
+                    signature = (f.rel.to, cls, f.rel.through_model)
+                    if signature in seen_intermediary_signatures:
+                        e.add(opts, "The model %s has two manually-defined m2m relations through the model %s, which is not permitted. Please consider using an extra field on your intermediary model instead." % (cls._meta.object_name, f.rel.through_model._meta.object_name))
+                    else:
+                        seen_intermediary_signatures.append(signature)
+                    seen_related_fk, seen_this_fk = False, False
+                    for field in f.rel.through_model._meta.fields:
+                        if field.rel:
+                            if not seen_related_fk and field.rel.to == f.rel.to:
+                                seen_related_fk = True
+                            elif field.rel.to == cls:
+                                seen_this_fk = True
+                    if not seen_related_fk or not seen_this_fk:
+                        e.add(opts, "'%s' has a manually-defined m2m relation through model %s, which does not have foreign keys to %s and %s" % (f.name, f.rel.through, f.rel.to._meta.object_name, cls._meta.object_name))
+                else:
+                    e.add(opts, "'%s' specifies an m2m relation through model %s, which has not been installed" % (f.name, f.rel.through))
+
+            rel_opts = f.rel.to._meta
+            rel_name = RelatedObject(f.rel.to, cls, f).get_accessor_name()
+            rel_query_name = f.related_query_name()
+            # If rel_name is none, there is no reverse accessor (this only
+            # occurs for symmetrical m2m relations to self). If this is the
+            # case, there are no clashes to check for this field, as there are
+            # no reverse descriptors for this field.
+            if rel_name is not None:
+                for r in rel_opts.fields:
+                    if r.name == rel_name:
+                        e.add(opts, "Accessor for m2m field '%s' clashes with field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
+                    if r.name == rel_query_name:
+                        e.add(opts, "Reverse query name for m2m field '%s' clashes with field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
+                for r in rel_opts.local_many_to_many:
+                    if r.name == rel_name:
+                        e.add(opts, "Accessor for m2m field '%s' clashes with m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
+                    if r.name == rel_query_name:
+                        e.add(opts, "Reverse query name for m2m field '%s' clashes with m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
+                for r in rel_opts.get_all_related_many_to_many_objects():
+                    if r.field is not f:
+                        if r.get_accessor_name() == rel_name:
+                            e.add(opts, "Accessor for m2m field '%s' clashes with related m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
+                        if r.get_accessor_name() == rel_query_name:
+                            e.add(opts, "Reverse query name for m2m field '%s' clashes with related m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
+                for r in rel_opts.get_all_related_objects():
+                    if r.get_accessor_name() == rel_name:
+                        e.add(opts, "Accessor for m2m field '%s' clashes with related field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
+                    if r.get_accessor_name() == rel_query_name:
+                        e.add(opts, "Reverse query name for m2m field '%s' clashes with related field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
+
+        # Check ordering attribute.
+        if opts.ordering:
+            for field_name in opts.ordering:
+                if field_name == '?': continue
+                if field_name.startswith('-'):
+                    field_name = field_name[1:]
+                if opts.order_with_respect_to and field_name == '_order':
+                    continue
+                # Skip ordering in the format field1__field2 (FIXME: checking
+                # this format would be nice, but it's a little fiddly).
+                if '_' in field_name:
+                    continue
+                try:
+                    opts.get_field(field_name, many_to_many=False)
+                except models.FieldDoesNotExist:
+                    e.add(opts, '"ordering" refers to "%s", a field that doesn\'t exist.' % field_name)
+
+        # Check unique_together.
+        for ut in opts.unique_together:
+            for field_name in ut:
+                try:
+                    f = opts.get_field(field_name, many_to_many=True)
+                except models.FieldDoesNotExist:
+                    e.add(opts, '"unique_together" refers to %s, a field that doesn\'t exist. Check your syntax.' % field_name)
+                else:
+                    if isinstance(f.rel, models.ManyToManyRel):
+                        e.add(opts, '"unique_together" refers to %s. ManyToManyFields are not supported in unique_together.' % f.name)
+                    if f not in opts.local_fields:
+                        e.add(opts, '"unique_together" refers to %s. This is not in the same model as the unique_together statement.' % f.name)
+
+    return len(e.errors)
diff --git a/webapp/django/core/paginator.py b/webapp/django/core/paginator.py
new file mode 100644
index 0000000..495cdf2
--- /dev/null
+++ b/webapp/django/core/paginator.py
@@ -0,0 +1,120 @@
+from math import ceil
+
+class InvalidPage(Exception):
+    pass
+
+class PageNotAnInteger(InvalidPage):
+    pass
+
+class EmptyPage(InvalidPage):
+    pass
+
+class Paginator(object):
+    def __init__(self, object_list, per_page, orphans=0, allow_empty_first_page=True):
+        self.object_list = object_list
+        self.per_page = per_page
+        self.orphans = orphans
+        self.allow_empty_first_page = allow_empty_first_page
+        self._num_pages = self._count = None
+
+    def validate_number(self, number):
+        "Validates the given 1-based page number."
+        try:
+            number = int(number)
+        except ValueError:
+            raise PageNotAnInteger('That page number is not an integer')
+        if number < 1:
+            raise EmptyPage('That page number is less than 1')
+        if number > self.num_pages:
+            if number == 1 and self.allow_empty_first_page:
+                pass
+            else:
+                raise EmptyPage('That page contains no results')
+        return number
+
+    def page(self, number):
+        "Returns a Page object for the given 1-based page number."
+        number = self.validate_number(number)
+        bottom = (number - 1) * self.per_page
+        top = bottom + self.per_page
+        if top + self.orphans >= self.count:
+            top = self.count
+        return Page(self.object_list[bottom:top], number, self)
+
+    def _get_count(self):
+        "Returns the total number of objects, across all pages."
+        if self._count is None:
+            try:
+                self._count = self.object_list.count()
+            except (AttributeError, TypeError):
+                # AttributeError if object_list has no count() method.
+                # TypeError if object_list.count() requires arguments
+                # (i.e. is of type list).
+                self._count = len(self.object_list)
+        return self._count
+    count = property(_get_count)
+
+    def _get_num_pages(self):
+        "Returns the total number of pages."
+        if self._num_pages is None:
+            if self.count == 0 and not self.allow_empty_first_page:
+                self._num_pages = 0
+            else:
+                hits = max(1, self.count - self.orphans)
+                self._num_pages = int(ceil(hits / float(self.per_page)))
+        return self._num_pages
+    num_pages = property(_get_num_pages)
+
+    def _get_page_range(self):
+        """
+        Returns a 1-based range of pages for iterating through within
+        a template for loop.
+        """
+        return range(1, self.num_pages + 1)
+    page_range = property(_get_page_range)
+
+QuerySetPaginator = Paginator # For backwards-compatibility.
+
+class Page(object):
+    def __init__(self, object_list, number, paginator):
+        self.object_list = object_list
+        self.number = number
+        self.paginator = paginator
+
+    def __repr__(self):
+        return '<Page %s of %s>' % (self.number, self.paginator.num_pages)
+
+    def has_next(self):
+        return self.number < self.paginator.num_pages
+
+    def has_previous(self):
+        return self.number > 1
+
+    def has_other_pages(self):
+        return self.has_previous() or self.has_next()
+
+    def next_page_number(self):
+        return self.number + 1
+
+    def previous_page_number(self):
+        return self.number - 1
+
+    def start_index(self):
+        """
+        Returns the 1-based index of the first object on this page,
+        relative to total objects in the paginator.
+        """
+        # Special case, return zero if no items.
+        if self.paginator.count == 0:
+            return 0
+        return (self.paginator.per_page * (self.number - 1)) + 1
+
+    def end_index(self):
+        """
+        Returns the 1-based index of the last object on this page,
+        relative to total objects found (hits).
+        """
+        # Special case for the last page because there can be orphans.
+        if self.number == self.paginator.num_pages:
+            return self.paginator.count
+        return self.number * self.paginator.per_page
diff --git a/webapp/django/core/serializers/__init__.py b/webapp/django/core/serializers/__init__.py
new file mode 100644
index 0000000..5365efe
--- /dev/null
+++ b/webapp/django/core/serializers/__init__.py
@@ -0,0 +1,112 @@
+"""
+Interfaces for serializing Django objects.
+
+Usage::
+
+    from django.core import serializers
+    json = serializers.serialize("json", some_query_set)
+    objects = list(serializers.deserialize("json", json))
+
+To add your own serializers, use the SERIALIZATION_MODULES setting::
+
+    SERIALIZATION_MODULES = {
+        "csv" : "path.to.csv.serializer",
+        "txt" : "path.to.txt.serializer",
+    }
+
+"""
+
+from django.conf import settings
+
+# Built-in serializers
+BUILTIN_SERIALIZERS = {
+    "xml"    : "django.core.serializers.xml_serializer",
+    "python" : "django.core.serializers.python",
+    "json"   : "django.core.serializers.json",
+}
+
+# Check for PyYaml and register the serializer if it's available.
+try:
+    import yaml
+    BUILTIN_SERIALIZERS["yaml"] = "django.core.serializers.pyyaml"
+except ImportError:
+    pass
+
+_serializers = {}
+
+def register_serializer(format, serializer_module, serializers=None):
+    """"Register a new serializer. 
+    
+    ``serializer_module`` should be the fully qualified module name
+    for the serializer.
+    
+    If ``serializers`` is provided, the registration will be added
+    to the provided dictionary.
+    
+    If ``serializers`` is not provided, the registration will be made
+    directly into the global register of serializers. Adding serializers
+    directly is not a thread-safe operation.
+    """
+    module = __import__(serializer_module, {}, {}, [''])
+    if serializers is None:
+        _serializers[format] = module
+    else:
+        serializers[format] = module
+        
+def unregister_serializer(format):
+    "Unregister a given serializer. This is not a thread-safe operation."
+    del _serializers[format]
+
+def get_serializer(format):
+    if not _serializers:
+        _load_serializers()
+    return _serializers[format].Serializer
+
+def get_serializer_formats():
+    if not _serializers:
+        _load_serializers()
+    return _serializers.keys()
+
+def get_public_serializer_formats():
+    if not _serializers:
+        _load_serializers()
+    return [k for k, v in _serializers.iteritems() if not v.Serializer.internal_use_only]
+
+def get_deserializer(format):
+    if not _serializers:
+        _load_serializers()
+    return _serializers[format].Deserializer
+
+def serialize(format, queryset, **options):
+    """
+    Serialize a queryset (or any iterator that returns database objects) using
+    a certain serializer.
+    """
+    s = get_serializer(format)()
+    s.serialize(queryset, **options)
+    return s.getvalue()
+
+def deserialize(format, stream_or_string):
+    """
+    Deserialize a stream or a string. Returns an iterator that yields ``(obj,
+    m2m_relation_dict)``, where ``obj`` is a instantiated -- but *unsaved* --
+    object, and ``m2m_relation_dict`` is a dictionary of ``{m2m_field_name :
+    list_of_related_objects}``.
+    """
+    d = get_deserializer(format)
+    return d(stream_or_string)
+
+def _load_serializers():
+    """
+    Register built-in and settings-defined serializers. This is done lazily so
+    that user code has a chance to (e.g.) set up custom settings without
+    needing to be careful of import order.
+    """
+    global _serializers
+    serializers = {}
+    for format in BUILTIN_SERIALIZERS:
+        register_serializer(format, BUILTIN_SERIALIZERS[format], serializers)
+    if hasattr(settings, "SERIALIZATION_MODULES"):
+        for format in settings.SERIALIZATION_MODULES:
+            register_serializer(format, settings.SERIALIZATION_MODULES[format], serializers)
+    _serializers = serializers
diff --git a/webapp/django/core/serializers/base.py b/webapp/django/core/serializers/base.py
new file mode 100644
index 0000000..bfd785a
--- /dev/null
+++ b/webapp/django/core/serializers/base.py
@@ -0,0 +1,175 @@
+"""
+Module for abstract serializer/unserializer base classes.
+"""
+
+from StringIO import StringIO
+
+from django.db import models
+from django.utils.encoding import smart_str, smart_unicode
+from django.utils import datetime_safe
+
+class SerializationError(Exception):
+    """Something bad happened during serialization."""
+    pass
+
+class DeserializationError(Exception):
+    """Something bad happened during deserialization."""
+    pass
+
+class Serializer(object):
+    """
+    Abstract serializer base class.
+    """
+
+    # Indicates if the implemented serializer is only available for
+    # internal Django use.
+    internal_use_only = False
+
+    def serialize(self, queryset, **options):
+        """
+        Serialize a queryset.
+        """
+        self.options = options
+
+        self.stream = options.get("stream", StringIO())
+        self.selected_fields = options.get("fields")
+
+        self.start_serialization()
+        for obj in queryset:
+            self.start_object(obj)
+            for field in obj._meta.local_fields:
+                if field.serialize:
+                    if field.rel is None:
+                        if self.selected_fields is None or field.attname in self.selected_fields:
+                            self.handle_field(obj, field)
+                    else:
+                        if self.selected_fields is None or field.attname[:-3] in self.selected_fields:
+                            self.handle_fk_field(obj, field)
+            for field in obj._meta.many_to_many:
+                if field.serialize:
+                    if self.selected_fields is None or field.attname in self.selected_fields:
+                        self.handle_m2m_field(obj, field)
+            self.end_object(obj)
+        self.end_serialization()
+        return self.getvalue()
+
+    def get_string_value(self, obj, field):
+        """
+        Convert a field's value to a string.
+        """
+        if isinstance(field, models.DateTimeField):
+            d = datetime_safe.new_datetime(getattr(obj, field.name))
+            value = d.strftime("%Y-%m-%d %H:%M:%S")
+        else:
+            value = field.flatten_data(follow=None, obj=obj).get(field.name, "")
+        return smart_unicode(value)
+
+    def start_serialization(self):
+        """
+        Called when serializing of the queryset starts.
+        """
+        raise NotImplementedError
+
+    def end_serialization(self):
+        """
+        Called when serializing of the queryset ends.
+        """
+        pass
+
+    def start_object(self, obj):
+        """
+        Called when serializing of an object starts.
+        """
+        raise NotImplementedError
+
+    def end_object(self, obj):
+        """
+        Called when serializing of an object ends.
+        """
+        pass
+
+    def handle_field(self, obj, field):
+        """
+        Called to handle each individual (non-relational) field on an object.
+        """
+        raise NotImplementedError
+
+    def handle_fk_field(self, obj, field):
+        """
+        Called to handle a ForeignKey field.
+        """
+        raise NotImplementedError
+
+    def handle_m2m_field(self, obj, field):
+        """
+        Called to handle a ManyToManyField.
+        """
+        raise NotImplementedError
+
+    def getvalue(self):
+        """
+        Return the fully serialized queryset (or None if the output stream is
+        not seekable).
+        """
+        if callable(getattr(self.stream, 'getvalue', None)):
+            return self.stream.getvalue()
+
+class Deserializer(object):
+    """
+    Abstract base deserializer class.
+    """
+
+    def __init__(self, stream_or_string, **options):
+        """
+        Init this serializer given a stream or a string
+        """
+        self.options = options
+        if isinstance(stream_or_string, basestring):
+            self.stream = StringIO(stream_or_string)
+        else:
+            self.stream = stream_or_string
+        # hack to make sure that the models have all been loaded before
+        # deserialization starts (otherwise subclass calls to get_model()
+        # and friends might fail...)
+        models.get_apps()
+
+    def __iter__(self):
+        return self
+
+    def next(self):
+        """Iteration iterface -- return the next item in the stream"""
+        raise NotImplementedError
+
+class DeserializedObject(object):
+    """
+    A deserialized model.
+
+    Basically a container for holding the pre-saved deserialized data along
+    with the many-to-many data saved with the object.
+
+    Call ``save()`` to save the object (with the many-to-many data) to the
+    database; call ``save(save_m2m=False)`` to save just the object fields
+    (and not touch the many-to-many stuff.)
+    """
+
+    def __init__(self, obj, m2m_data=None):
+        self.object = obj
+        self.m2m_data = m2m_data
+
+    def __repr__(self):
+        return "<DeserializedObject: %s>" % smart_str(self.object)
+
+    def save(self, save_m2m=True):
+        # Call save on the Model baseclass directly. This bypasses any
+        # model-defined save. The save is also forced to be raw.
+        # This ensures that the data that is deserialized is literally
+        # what came from the file, not post-processed by pre_save/save
+        # methods.
+        models.Model.save_base(self.object, raw=True)
+        if self.m2m_data and save_m2m:
+            for accessor_name, object_list in self.m2m_data.items():
+                setattr(self.object, accessor_name, object_list)
+
+        # prevent a second (possibly accidental) call to save() from saving
+        # the m2m data twice.
+        self.m2m_data = None
diff --git a/webapp/django/core/serializers/json.py b/webapp/django/core/serializers/json.py
new file mode 100644
index 0000000..97e5bc9
--- /dev/null
+++ b/webapp/django/core/serializers/json.py
@@ -0,0 +1,68 @@
+"""
+Serialize data to/from JSON
+"""
+
+import datetime
+from StringIO import StringIO
+
+from django.core.serializers.python import Serializer as PythonSerializer
+from django.core.serializers.python import Deserializer as PythonDeserializer
+from django.utils import datetime_safe
+from django.utils import simplejson
+
+try:
+    import decimal
+except ImportError:
+    from django.utils import _decimal as decimal    # Python 2.3 fallback
+
+class Serializer(PythonSerializer):
+    """
+    Convert a queryset to JSON.
+    """
+    internal_use_only = False
+
+    def end_serialization(self):
+        self.options.pop('stream', None)
+        self.options.pop('fields', None)
+        simplejson.dump(self.objects, self.stream, cls=DjangoJSONEncoder, **self.options)
+
+    def getvalue(self):
+        if callable(getattr(self.stream, 'getvalue', None)):
+            return self.stream.getvalue()
+
+def Deserializer(stream_or_string, **options):
+    """
+    Deserialize a stream or string of JSON data.
+    """
+    if isinstance(stream_or_string, basestring):
+        stream = StringIO(stream_or_string)
+    else:
+        stream = stream_or_string
+    for obj in PythonDeserializer(simplejson.load(stream)):
+        yield obj
+
+class DjangoJSONEncoder(simplejson.JSONEncoder):
+    """
+    JSONEncoder subclass that knows how to encode date/time and decimal types.
+    """
+
+    DATE_FORMAT = "%Y-%m-%d"
+    TIME_FORMAT = "%H:%M:%S"
+
+    def default(self, o):
+        if isinstance(o, datetime.datetime):
+            d = datetime_safe.new_datetime(o)
+            return d.strftime("%s %s" % (self.DATE_FORMAT, self.TIME_FORMAT))
+        elif isinstance(o, datetime.date):
+            d = datetime_safe.new_date(o)
+            return d.strftime(self.DATE_FORMAT)
+        elif isinstance(o, datetime.time):
+            return o.strftime(self.TIME_FORMAT)
+        elif isinstance(o, decimal.Decimal):
+            return str(o)
+        else:
+            return super(DjangoJSONEncoder, self).default(o)
+
+# Older, deprecated class name (for backwards compatibility purposes).
+DateTimeAwareJSONEncoder = DjangoJSONEncoder
+
diff --git a/webapp/django/core/serializers/python.py b/webapp/django/core/serializers/python.py
new file mode 100644
index 0000000..c129c06
--- /dev/null
+++ b/webapp/django/core/serializers/python.py
@@ -0,0 +1,108 @@
+"""
+A Python "serializer". Doesn't do much serializing per se -- just converts to
+and from basic Python data types (lists, dicts, strings, etc.). Useful as a basis for
+other serializers.
+"""
+
+from django.conf import settings
+from django.core.serializers import base
+from django.db import models
+from django.utils.encoding import smart_unicode
+
+class Serializer(base.Serializer):
+    """
+    Serializes a QuerySet to basic Python objects.
+    """
+    
+    internal_use_only = True
+    
+    def start_serialization(self):
+        self._current = None
+        self.objects = []
+
+    def end_serialization(self):
+        pass
+
+    def start_object(self, obj):
+        self._current = {}
+
+    def end_object(self, obj):
+        self.objects.append({
+            "model"  : smart_unicode(obj._meta),
+            "pk"     : smart_unicode(obj._get_pk_val(), strings_only=True),
+            "fields" : self._current
+        })
+        self._current = None
+
+    def handle_field(self, obj, field):
+        self._current[field.name] = smart_unicode(getattr(obj, field.name), strings_only=True)
+
+    def handle_fk_field(self, obj, field):
+        related = getattr(obj, field.name)
+        if related is not None:
+            if field.rel.field_name == related._meta.pk.name:
+                # Related to remote object via primary key
+                related = related._get_pk_val()
+            else:
+                # Related to remote object via other field
+                related = getattr(related, field.rel.field_name)
+        self._current[field.name] = smart_unicode(related, strings_only=True)
+
+    def handle_m2m_field(self, obj, field):
+        if field.creates_table:
+            self._current[field.name] = [smart_unicode(related._get_pk_val(), strings_only=True)
+                               for related in getattr(obj, field.name).iterator()]
+
+    def getvalue(self):
+        return self.objects
+
+def Deserializer(object_list, **options):
+    """
+    Deserialize simple Python objects back into Django ORM instances.
+
+    It's expected that you pass the Python objects themselves (instead of a
+    stream or a string) to the constructor
+    """
+    models.get_apps()
+    for d in object_list:
+        # Look up the model and starting build a dict of data for it.
+        Model = _get_model(d["model"])
+        data = {Model._meta.pk.attname : Model._meta.pk.to_python(d["pk"])}
+        m2m_data = {}
+
+        # Handle each field
+        for (field_name, field_value) in d["fields"].iteritems():
+            if isinstance(field_value, str):
+                field_value = smart_unicode(field_value, options.get("encoding", settings.DEFAULT_CHARSET), strings_only=True)
+
+            field = Model._meta.get_field(field_name)
+
+            # Handle M2M relations
+            if field.rel and isinstance(field.rel, models.ManyToManyRel):
+                m2m_convert = field.rel.to._meta.pk.to_python
+                m2m_data[field.name] = [m2m_convert(smart_unicode(pk)) for pk in field_value]
+
+            # Handle FK fields
+            elif field.rel and isinstance(field.rel, models.ManyToOneRel):
+                if field_value:
+                    data[field.attname] = field.rel.to._meta.get_field(field.rel.field_name).to_python(field_value)
+                else:
+                    data[field.attname] = None
+
+            # Handle all other fields
+            else:
+                data[field.name] = field.to_python(field_value)
+
+        yield base.DeserializedObject(Model(**data), m2m_data)
+
+def _get_model(model_identifier):
+    """
+    Helper to look up a model from an "app_label.module_name" string.
+    """
+    try:
+        Model = models.get_model(*model_identifier.split("."))
+    except TypeError:
+        Model = None
+    if Model is None:
+        raise base.DeserializationError(u"Invalid model identifier: '%s'" % model_identifier)
+    return Model
diff --git a/webapp/django/core/serializers/pyyaml.py b/webapp/django/core/serializers/pyyaml.py
new file mode 100644
index 0000000..ac77166
--- /dev/null
+++ b/webapp/django/core/serializers/pyyaml.py
@@ -0,0 +1,51 @@
+"""
+YAML serializer.
+
+Requires PyYaml (http://pyyaml.org/), but that's checked for in __init__.
+"""
+
+from StringIO import StringIO
+import yaml
+
+from django.db import models
+from django.core.serializers.python import Serializer as PythonSerializer
+from django.core.serializers.python import Deserializer as PythonDeserializer
+
+class Serializer(PythonSerializer):
+    """
+    Convert a queryset to YAML.
+    """
+    
+    internal_use_only = False
+    
+    def handle_field(self, obj, field):
+        # A nasty special case: base YAML doesn't support serialization of time
+        # types (as opposed to dates or datetimes, which it does support). Since
+        # we want to use the "safe" serializer for better interoperability, we
+        # need to do something with those pesky times. Converting 'em to strings
+        # isn't perfect, but it's better than a "!!python/time" type which would
+        # halt deserialization under any other language.
+        if isinstance(field, models.TimeField) and getattr(obj, field.name) is not None:
+            self._current[field.name] = str(getattr(obj, field.name))
+        else:
+            super(Serializer, self).handle_field(obj, field)
+    
+    def end_serialization(self):
+        self.options.pop('stream', None)
+        self.options.pop('fields', None)
+        yaml.safe_dump(self.objects, self.stream, **self.options)
+
+    def getvalue(self):
+        return self.stream.getvalue()
+
+def Deserializer(stream_or_string, **options):
+    """
+    Deserialize a stream or string of YAML data.
+    """
+    if isinstance(stream_or_string, basestring):
+        stream = StringIO(stream_or_string)
+    else:
+        stream = stream_or_string
+    for obj in PythonDeserializer(yaml.load(stream)):
+        yield obj
+
diff --git a/webapp/django/core/serializers/xml_serializer.py b/webapp/django/core/serializers/xml_serializer.py
new file mode 100644
index 0000000..04498db
--- /dev/null
+++ b/webapp/django/core/serializers/xml_serializer.py
@@ -0,0 +1,238 @@
+"""
+XML serializer.
+"""
+
+from django.conf import settings
+from django.core.serializers import base
+from django.db import models
+from django.utils.xmlutils import SimplerXMLGenerator
+from django.utils.encoding import smart_unicode
+from xml.dom import pulldom
+
+class Serializer(base.Serializer):
+    """
+    Serializes a QuerySet to XML.
+    """
+
+    def indent(self, level):
+        if self.options.get('indent', None) is not None:
+            self.xml.ignorableWhitespace('\n' + ' ' * self.options.get('indent', None) * level)
+
+    def start_serialization(self):
+        """
+        Start serialization -- open the XML document and the root element.
+        """
+        self.xml = SimplerXMLGenerator(self.stream, self.options.get("encoding", settings.DEFAULT_CHARSET))
+        self.xml.startDocument()
+        self.xml.startElement("django-objects", {"version" : "1.0"})
+
+    def end_serialization(self):
+        """
+        End serialization -- end the document.
+        """
+        self.indent(0)
+        self.xml.endElement("django-objects")
+        self.xml.endDocument()
+
+    def start_object(self, obj):
+        """
+        Called as each object is handled.
+        """
+        if not hasattr(obj, "_meta"):
+            raise base.SerializationError("Non-model object (%s) encountered during serialization" % type(obj))
+
+        self.indent(1)
+        self.xml.startElement("object", {
+            "pk"    : smart_unicode(obj._get_pk_val()),
+            "model" : smart_unicode(obj._meta),
+        })
+
+    def end_object(self, obj):
+        """
+        Called after handling all fields for an object.
+        """
+        self.indent(1)
+        self.xml.endElement("object")
+
+    def handle_field(self, obj, field):
+        """
+        Called to handle each field on an object (except for ForeignKeys and
+        ManyToManyFields)
+        """
+        self.indent(2)
+        self.xml.startElement("field", {
+            "name" : field.name,
+            "type" : field.get_internal_type()
+        })
+
+        # Get a "string version" of the object's data (this is handled by the
+        # serializer base class).
+        if getattr(obj, field.name) is not None:
+            value = self.get_string_value(obj, field)
+            self.xml.characters(smart_unicode(value))
+        else:
+            self.xml.addQuickElement("None")
+
+        self.xml.endElement("field")
+
+    def handle_fk_field(self, obj, field):
+        """
+        Called to handle a ForeignKey (we need to treat them slightly
+        differently from regular fields).
+        """
+        self._start_relational_field(field)
+        related = getattr(obj, field.name)
+        if related is not None:
+            if field.rel.field_name == related._meta.pk.name:
+                # Related to remote object via primary key
+                related = related._get_pk_val()
+            else:
+                # Related to remote object via other field
+                related = getattr(related, field.rel.field_name)
+            self.xml.characters(smart_unicode(related))
+        else:
+            self.xml.addQuickElement("None")
+        self.xml.endElement("field")
+
+    def handle_m2m_field(self, obj, field):
+        """
+        Called to handle a ManyToManyField. Related objects are only
+        serialized as references to the object's PK (i.e. the related *data*
+        is not dumped, just the relation).
+        """
+        if field.creates_table:
+            self._start_relational_field(field)
+            for relobj in getattr(obj, field.name).iterator():
+                self.xml.addQuickElement("object", attrs={"pk" : smart_unicode(relobj._get_pk_val())})
+            self.xml.endElement("field")
+
+    def _start_relational_field(self, field):
+        """
+        Helper to output the <field> element for relational fields
+        """
+        self.indent(2)
+        self.xml.startElement("field", {
+            "name" : field.name,
+            "rel"  : field.rel.__class__.__name__,
+            "to"   : smart_unicode(field.rel.to._meta),
+        })
+
+class Deserializer(base.Deserializer):
+    """
+    Deserialize XML.
+    """
+
+    def __init__(self, stream_or_string, **options):
+        super(Deserializer, self).__init__(stream_or_string, **options)
+        self.event_stream = pulldom.parse(self.stream)
+
+    def next(self):
+        for event, node in self.event_stream:
+            if event == "START_ELEMENT" and node.nodeName == "object":
+                self.event_stream.expandNode(node)
+                return self._handle_object(node)
+        raise StopIteration
+
+    def _handle_object(self, node):
+        """
+        Convert an <object> node to a DeserializedObject.
+        """
+        # Look up the model using the model loading mechanism. If this fails,
+        # bail.
+        Model = self._get_model_from_node(node, "model")
+
+        # Start building a data dictionary from the object.  If the node is
+        # missing the pk attribute, bail.
+        pk = node.getAttribute("pk")
+        if not pk:
+            raise base.DeserializationError("<object> node is missing the 'pk' attribute")
+
+        data = {Model._meta.pk.attname : Model._meta.pk.to_python(pk)}
+
+        # Also start building a dict of m2m data (this is saved as
+        # {m2m_accessor_attribute : [list_of_related_objects]})
+        m2m_data = {}
+
+        # Deseralize each field.
+        for field_node in node.getElementsByTagName("field"):
+            # If the field is missing the name attribute, bail (are you
+            # sensing a pattern here?)
+            field_name = field_node.getAttribute("name")
+            if not field_name:
+                raise base.DeserializationError("<field> node is missing the 'name' attribute")
+
+            # Get the field from the Model. This will raise a
+            # FieldDoesNotExist if, well, the field doesn't exist, which will
+            # be propagated correctly.
+            field = Model._meta.get_field(field_name)
+
+            # As is usually the case, relation fields get the special treatment.
+            if field.rel and isinstance(field.rel, models.ManyToManyRel):
+                m2m_data[field.name] = self._handle_m2m_field_node(field_node, field)
+            elif field.rel and isinstance(field.rel, models.ManyToOneRel):
+                data[field.attname] = self._handle_fk_field_node(field_node, field)
+            else:
+                if field_node.getElementsByTagName('None'):
+                    value = None
+                else:
+                    value = field.to_python(getInnerText(field_node).strip())
+                data[field.name] = value
+
+        # Return a DeserializedObject so that the m2m data has a place to live.
+        return base.DeserializedObject(Model(**data), m2m_data)
+
+    def _handle_fk_field_node(self, node, field):
+        """
+        Handle a <field> node for a ForeignKey
+        """
+        # Check if there is a child node named 'None', returning None if so.
+        if node.getElementsByTagName('None'):
+            return None
+        else:
+            return field.rel.to._meta.get_field(field.rel.field_name).to_python(
+                       getInnerText(node).strip())
+
+    def _handle_m2m_field_node(self, node, field):
+        """
+        Handle a <field> node for a ManyToManyField.
+        """
+        return [field.rel.to._meta.pk.to_python(
+                    c.getAttribute("pk"))
+                    for c in node.getElementsByTagName("object")]
+
+    def _get_model_from_node(self, node, attr):
+        """
+        Helper to look up a model from a <object model=...> or a <field
+        rel=... to=...> node.
+        """
+        model_identifier = node.getAttribute(attr)
+        if not model_identifier:
+            raise base.DeserializationError(
+                "<%s> node is missing the required '%s' attribute" \
+                    % (node.nodeName, attr))
+        try:
+            Model = models.get_model(*model_identifier.split("."))
+        except TypeError:
+            Model = None
+        if Model is None:
+            raise base.DeserializationError(
+                "<%s> node has invalid model identifier: '%s'" % \
+                    (node.nodeName, model_identifier))
+        return Model
+
+
+def getInnerText(node):
+    """
+    Get all the inner text of a DOM node (recursively).
+    """
+    # inspired by http://mail.python.org/pipermail/xml-sig/2005-March/011022.html
+    inner_text = []
+    for child in node.childNodes:
+        if child.nodeType == child.TEXT_NODE or child.nodeType == child.CDATA_SECTION_NODE:
+            inner_text.append(child.data)
+        elif child.nodeType == child.ELEMENT_NODE:
+            inner_text.extend(getInnerText(child))
+        else:
+           pass
+    return u"".join(inner_text)
+
diff --git a/webapp/django/core/servers/__init__.py b/webapp/django/core/servers/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/core/servers/__init__.py
diff --git a/webapp/django/core/servers/basehttp.py b/webapp/django/core/servers/basehttp.py
new file mode 100644
index 0000000..f88f8c7
--- /dev/null
+++ b/webapp/django/core/servers/basehttp.py
@@ -0,0 +1,665 @@
+"""
+BaseHTTPServer that implements the Python WSGI protocol (PEP 333, rev 1.21).
+
+Adapted from wsgiref.simple_server: http://svn.eby-sarna.com/wsgiref/
+
+This is a simple server for use in testing or debugging Django apps. It hasn't
+been reviewed for security issues. Don't use it for production use.
+"""
+
+from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
+import mimetypes
+import os
+import re
+import sys
+import urllib
+
+from django.utils.http import http_date
+
+__version__ = "0.1"
+__all__ = ['WSGIServer','WSGIRequestHandler']
+
+server_version = "WSGIServer/" + __version__
+sys_version = "Python/" + sys.version.split()[0]
+software_version = server_version + ' ' + sys_version
+
+class WSGIServerException(Exception):
+    pass
+
+class FileWrapper(object):
+    """Wrapper to convert file-like objects to iterables"""
+
+    def __init__(self, filelike, blksize=8192):
+        self.filelike = filelike
+        self.blksize = blksize
+        if hasattr(filelike,'close'):
+            self.close = filelike.close
+
+    def __getitem__(self,key):
+        data = self.filelike.read(self.blksize)
+        if data:
+            return data
+        raise IndexError
+
+    def __iter__(self):
+        return self
+
+    def next(self):
+        data = self.filelike.read(self.blksize)
+        if data:
+            return data
+        raise StopIteration
+
+# Regular expression that matches `special' characters in parameters, the
+# existence of which force quoting of the parameter value.
+tspecials = re.compile(r'[ \(\)<>@,;:\\"/\[\]\?=]')
+
+def _formatparam(param, value=None, quote=1):
+    """Convenience function to format and return a key=value pair.
+
+    This will quote the value if needed or if quote is true.
+    """
+    if value is not None and len(value) > 0:
+        if quote or tspecials.search(value):
+            value = value.replace('\\', '\\\\').replace('"', r'\"')
+            return '%s="%s"' % (param, value)
+        else:
+            return '%s=%s' % (param, value)
+    else:
+        return param
+
+class Headers(object):
+    """Manage a collection of HTTP response headers"""
+    def __init__(self,headers):
+        if not isinstance(headers, list):
+            raise TypeError("Headers must be a list of name/value tuples")
+        self._headers = headers
+
+    def __len__(self):
+        """Return the total number of headers, including duplicates."""
+        return len(self._headers)
+
+    def __setitem__(self, name, val):
+        """Set the value of a header."""
+        del self[name]
+        self._headers.append((name, val))
+
+    def __delitem__(self,name):
+        """Delete all occurrences of a header, if present.
+
+        Does *not* raise an exception if the header is missing.
+        """
+        name = name.lower()
+        self._headers[:] = [kv for kv in self._headers if kv[0].lower()<>name]
+
+    def __getitem__(self,name):
+        """Get the first header value for 'name'
+
+        Return None if the header is missing instead of raising an exception.
+
+        Note that if the header appeared multiple times, the first exactly which
+        occurrance gets returned is undefined.  Use getall() to get all
+        the values matching a header field name.
+        """
+        return self.get(name)
+
+    def has_key(self, name):
+        """Return true if the message contains the header."""
+        return self.get(name) is not None
+
+    __contains__ = has_key
+
+    def get_all(self, name):
+        """Return a list of all the values for the named field.
+
+        These will be sorted in the order they appeared in the original header
+        list or were added to this instance, and may contain duplicates.  Any
+        fields deleted and re-inserted are always appended to the header list.
+        If no fields exist with the given name, returns an empty list.
+        """
+        name = name.lower()
+        return [kv[1] for kv in self._headers if kv[0].lower()==name]
+
+
+    def get(self,name,default=None):
+        """Get the first header value for 'name', or return 'default'"""
+        name = name.lower()
+        for k,v in self._headers:
+            if k.lower()==name:
+                return v
+        return default
+
+    def keys(self):
+        """Return a list of all the header field names.
+
+        These will be sorted in the order they appeared in the original header
+        list, or were added to this instance, and may contain duplicates.
+        Any fields deleted and re-inserted are always appended to the header
+        list.
+        """
+        return [k for k, v in self._headers]
+
+    def values(self):
+        """Return a list of all header values.
+
+        These will be sorted in the order they appeared in the original header
+        list, or were added to this instance, and may contain duplicates.
+        Any fields deleted and re-inserted are always appended to the header
+        list.
+        """
+        return [v for k, v in self._headers]
+
+    def items(self):
+        """Get all the header fields and values.
+
+        These will be sorted in the order they were in the original header
+        list, or were added to this instance, and may contain duplicates.
+        Any fields deleted and re-inserted are always appended to the header
+        list.
+        """
+        return self._headers[:]
+
+    def __repr__(self):
+        return "Headers(%s)" % `self._headers`
+
+    def __str__(self):
+        """str() returns the formatted headers, complete with end line,
+        suitable for direct HTTP transmission."""
+        return '\r\n'.join(["%s: %s" % kv for kv in self._headers]+['',''])
+
+    def setdefault(self,name,value):
+        """Return first matching header value for 'name', or 'value'
+
+        If there is no header named 'name', add a new header with name 'name'
+        and value 'value'."""
+        result = self.get(name)
+        if result is None:
+            self._headers.append((name,value))
+            return value
+        else:
+            return result
+
+    def add_header(self, _name, _value, **_params):
+        """Extended header setting.
+
+        _name is the header field to add.  keyword arguments can be used to set
+        additional parameters for the header field, with underscores converted
+        to dashes.  Normally the parameter will be added as key="value" unless
+        value is None, in which case only the key will be added.
+
+        Example:
+
+        h.add_header('content-disposition', 'attachment', filename='bud.gif')
+
+        Note that unlike the corresponding 'email.Message' method, this does
+        *not* handle '(charset, language, value)' tuples: all values must be
+        strings or None.
+        """
+        parts = []
+        if _value is not None:
+            parts.append(_value)
+        for k, v in _params.items():
+            if v is None:
+                parts.append(k.replace('_', '-'))
+            else:
+                parts.append(_formatparam(k.replace('_', '-'), v))
+        self._headers.append((_name, "; ".join(parts)))
+
+def guess_scheme(environ):
+    """Return a guess for whether 'wsgi.url_scheme' should be 'http' or 'https'
+    """
+    if environ.get("HTTPS") in ('yes','on','1'):
+        return 'https'
+    else:
+        return 'http'
+
+_hop_headers = {
+    'connection':1, 'keep-alive':1, 'proxy-authenticate':1,
+    'proxy-authorization':1, 'te':1, 'trailers':1, 'transfer-encoding':1,
+    'upgrade':1
+}
+
+def is_hop_by_hop(header_name):
+    """Return true if 'header_name' is an HTTP/1.1 "Hop-by-Hop" header"""
+    return header_name.lower() in _hop_headers
+
+class ServerHandler(object):
+    """Manage the invocation of a WSGI application"""
+
+    # Configuration parameters; can override per-subclass or per-instance
+    wsgi_version = (1,0)
+    wsgi_multithread = True
+    wsgi_multiprocess = True
+    wsgi_run_once = False
+
+    origin_server = True    # We are transmitting direct to client
+    http_version  = "1.0"   # Version that should be used for response
+    server_software = software_version
+
+    # os_environ is used to supply configuration from the OS environment:
+    # by default it's a copy of 'os.environ' as of import time, but you can
+    # override this in e.g. your __init__ method.
+    os_environ = dict(os.environ.items())
+
+    # Collaborator classes
+    wsgi_file_wrapper = FileWrapper     # set to None to disable
+    headers_class = Headers             # must be a Headers-like class
+
+    # Error handling (also per-subclass or per-instance)
+    traceback_limit = None  # Print entire traceback to self.get_stderr()
+    error_status = "500 INTERNAL SERVER ERROR"
+    error_headers = [('Content-Type','text/plain')]
+
+    # State variables (don't mess with these)
+    status = result = None
+    headers_sent = False
+    headers = None
+    bytes_sent = 0
+
+    def __init__(self, stdin, stdout, stderr, environ, multithread=True,
+        multiprocess=False):
+        self.stdin = stdin
+        self.stdout = stdout
+        self.stderr = stderr
+        self.base_env = environ
+        self.wsgi_multithread = multithread
+        self.wsgi_multiprocess = multiprocess
+
+    def run(self, application):
+        """Invoke the application"""
+        # Note to self: don't move the close()!  Asynchronous servers shouldn't
+        # call close() from finish_response(), so if you close() anywhere but
+        # the double-error branch here, you'll break asynchronous servers by
+        # prematurely closing.  Async servers must return from 'run()' without
+        # closing if there might still be output to iterate over.
+        try:
+            self.setup_environ()
+            self.result = application(self.environ, self.start_response)
+            self.finish_response()
+        except:
+            try:
+                self.handle_error()
+            except:
+                # If we get an error handling an error, just give up already!
+                self.close()
+                raise   # ...and let the actual server figure it out.
+
+    def setup_environ(self):
+        """Set up the environment for one request"""
+
+        env = self.environ = self.os_environ.copy()
+        self.add_cgi_vars()
+
+        env['wsgi.input']        = self.get_stdin()
+        env['wsgi.errors']       = self.get_stderr()
+        env['wsgi.version']      = self.wsgi_version
+        env['wsgi.run_once']     = self.wsgi_run_once
+        env['wsgi.url_scheme']   = self.get_scheme()
+        env['wsgi.multithread']  = self.wsgi_multithread
+        env['wsgi.multiprocess'] = self.wsgi_multiprocess
+
+        if self.wsgi_file_wrapper is not None:
+            env['wsgi.file_wrapper'] = self.wsgi_file_wrapper
+
+        if self.origin_server and self.server_software:
+            env.setdefault('SERVER_SOFTWARE',self.server_software)
+
+    def finish_response(self):
+        """Send any iterable data, then close self and the iterable
+
+        Subclasses intended for use in asynchronous servers will
+        want to redefine this method, such that it sets up callbacks
+        in the event loop to iterate over the data, and to call
+        'self.close()' once the response is finished.
+        """
+        if not self.result_is_file() and not self.sendfile():
+            for data in self.result:
+                self.write(data)
+            self.finish_content()
+        self.close()
+
+    def get_scheme(self):
+        """Return the URL scheme being used"""
+        return guess_scheme(self.environ)
+
+    def set_content_length(self):
+        """Compute Content-Length or switch to chunked encoding if possible"""
+        try:
+            blocks = len(self.result)
+        except (TypeError, AttributeError, NotImplementedError):
+            pass
+        else:
+            if blocks==1:
+                self.headers['Content-Length'] = str(self.bytes_sent)
+                return
+        # XXX Try for chunked encoding if origin server and client is 1.1
+
+    def cleanup_headers(self):
+        """Make any necessary header changes or defaults
+
+        Subclasses can extend this to add other defaults.
+        """
+        if 'Content-Length' not in self.headers:
+            self.set_content_length()
+
+    def start_response(self, status, headers,exc_info=None):
+        """'start_response()' callable as specified by PEP 333"""
+
+        if exc_info:
+            try:
+                if self.headers_sent:
+                    # Re-raise original exception if headers sent
+                    raise exc_info[0], exc_info[1], exc_info[2]
+            finally:
+                exc_info = None        # avoid dangling circular ref
+        elif self.headers is not None:
+            raise AssertionError("Headers already set!")
+
+        assert isinstance(status, str),"Status must be a string"
+        assert len(status)>=4,"Status must be at least 4 characters"
+        assert int(status[:3]),"Status message must begin w/3-digit code"
+        assert status[3]==" ", "Status message must have a space after code"
+        if __debug__:
+            for name,val in headers:
+                assert isinstance(name, str),"Header names must be strings"
+                assert isinstance(val, str),"Header values must be strings"
+                assert not is_hop_by_hop(name),"Hop-by-hop headers not allowed"
+        self.status = status
+        self.headers = self.headers_class(headers)
+        return self.write
+
+    def send_preamble(self):
+        """Transmit version/status/date/server, via self._write()"""
+        if self.origin_server:
+            if self.client_is_modern():
+                self._write('HTTP/%s %s\r\n' % (self.http_version,self.status))
+                if 'Date' not in self.headers:
+                    self._write(
+                        'Date: %s\r\n' % http_date()
+                    )
+                if self.server_software and 'Server' not in self.headers:
+                    self._write('Server: %s\r\n' % self.server_software)
+        else:
+            self._write('Status: %s\r\n' % self.status)
+
+    def write(self, data):
+        """'write()' callable as specified by PEP 333"""
+
+        assert isinstance(data, str), "write() argument must be string"
+
+        if not self.status:
+            raise AssertionError("write() before start_response()")
+
+        elif not self.headers_sent:
+            # Before the first output, send the stored headers
+            self.bytes_sent = len(data)    # make sure we know content-length
+            self.send_headers()
+        else:
+            self.bytes_sent += len(data)
+
+        # XXX check Content-Length and truncate if too many bytes written?
+
+        # If data is too large, socket will choke, so write chunks no larger
+        # than 32MB at a time.
+        length = len(data)
+        if length > 33554432:
+            offset = 0
+            while offset < length:
+                chunk_size = min(33554432, length)
+                self._write(data[offset:offset+chunk_size])
+                self._flush()
+                offset += chunk_size
+        else:
+            self._write(data)
+            self._flush()
+
+    def sendfile(self):
+        """Platform-specific file transmission
+
+        Override this method in subclasses to support platform-specific
+        file transmission.  It is only called if the application's
+        return iterable ('self.result') is an instance of
+        'self.wsgi_file_wrapper'.
+
+        This method should return a true value if it was able to actually
+        transmit the wrapped file-like object using a platform-specific
+        approach.  It should return a false value if normal iteration
+        should be used instead.  An exception can be raised to indicate
+        that transmission was attempted, but failed.
+
+        NOTE: this method should call 'self.send_headers()' if
+        'self.headers_sent' is false and it is going to attempt direct
+        transmission of the file1.
+        """
+        return False   # No platform-specific transmission by default
+
+    def finish_content(self):
+        """Ensure headers and content have both been sent"""
+        if not self.headers_sent:
+            self.headers['Content-Length'] = "0"
+            self.send_headers()
+        else:
+            pass # XXX check if content-length was too short?
+
+    def close(self):
+        try:
+            self.request_handler.log_request(self.status.split(' ',1)[0], self.bytes_sent)
+        finally:
+            try:
+                if hasattr(self.result,'close'):
+                    self.result.close()
+            finally:
+                self.result = self.headers = self.status = self.environ = None
+                self.bytes_sent = 0; self.headers_sent = False
+
+    def send_headers(self):
+        """Transmit headers to the client, via self._write()"""
+        self.cleanup_headers()
+        self.headers_sent = True
+        if not self.origin_server or self.client_is_modern():
+            self.send_preamble()
+            self._write(str(self.headers))
+
+    def result_is_file(self):
+        """True if 'self.result' is an instance of 'self.wsgi_file_wrapper'"""
+        wrapper = self.wsgi_file_wrapper
+        return wrapper is not None and isinstance(self.result,wrapper)
+
+    def client_is_modern(self):
+        """True if client can accept status and headers"""
+        return self.environ['SERVER_PROTOCOL'].upper() != 'HTTP/0.9'
+
+    def log_exception(self,exc_info):
+        """Log the 'exc_info' tuple in the server log
+
+        Subclasses may override to retarget the output or change its format.
+        """
+        try:
+            from traceback import print_exception
+            stderr = self.get_stderr()
+            print_exception(
+                exc_info[0], exc_info[1], exc_info[2],
+                self.traceback_limit, stderr
+            )
+            stderr.flush()
+        finally:
+            exc_info = None
+
+    def handle_error(self):
+        """Log current error, and send error output to client if possible"""
+        self.log_exception(sys.exc_info())
+        if not self.headers_sent:
+            self.result = self.error_output(self.environ, self.start_response)
+            self.finish_response()
+        # XXX else: attempt advanced recovery techniques for HTML or text?
+
+    def error_output(self, environ, start_response):
+        import traceback
+        start_response(self.error_status, self.error_headers[:], sys.exc_info())
+        return ['\n'.join(traceback.format_exception(*sys.exc_info()))]
+
+    # Pure abstract methods; *must* be overridden in subclasses
+
+    def _write(self,data):
+        self.stdout.write(data)
+        self._write = self.stdout.write
+
+    def _flush(self):
+        self.stdout.flush()
+        self._flush = self.stdout.flush
+
+    def get_stdin(self):
+        return self.stdin
+
+    def get_stderr(self):
+        return self.stderr
+
+    def add_cgi_vars(self):
+        self.environ.update(self.base_env)
+
+class WSGIServer(HTTPServer):
+    """BaseHTTPServer that implements the Python WSGI protocol"""
+    application = None
+
+    def server_bind(self):
+        """Override server_bind to store the server name."""
+        try:
+            HTTPServer.server_bind(self)
+        except Exception, e:
+            raise WSGIServerException, e
+        self.setup_environ()
+
+    def setup_environ(self):
+        # Set up base environment
+        env = self.base_environ = {}
+        env['SERVER_NAME'] = self.server_name
+        env['GATEWAY_INTERFACE'] = 'CGI/1.1'
+        env['SERVER_PORT'] = str(self.server_port)
+        env['REMOTE_HOST']=''
+        env['CONTENT_LENGTH']=''
+        env['SCRIPT_NAME'] = ''
+
+    def get_app(self):
+        return self.application
+
+    def set_app(self,application):
+        self.application = application
+
+class WSGIRequestHandler(BaseHTTPRequestHandler):
+    server_version = "WSGIServer/" + __version__
+
+    def __init__(self, *args, **kwargs):
+        from django.conf import settings
+        self.admin_media_prefix = settings.ADMIN_MEDIA_PREFIX
+        # We set self.path to avoid crashes in log_message() on unsupported
+        # requests (like "OPTIONS").
+        self.path = ''
+        BaseHTTPRequestHandler.__init__(self, *args, **kwargs)
+
+    def get_environ(self):
+        env = self.server.base_environ.copy()
+        env['SERVER_PROTOCOL'] = self.request_version
+        env['REQUEST_METHOD'] = self.command
+        if '?' in self.path:
+            path,query = self.path.split('?',1)
+        else:
+            path,query = self.path,''
+
+        env['PATH_INFO'] = urllib.unquote(path)
+        env['QUERY_STRING'] = query
+        env['REMOTE_ADDR'] = self.client_address[0]
+
+        if self.headers.typeheader is None:
+            env['CONTENT_TYPE'] = self.headers.type
+        else:
+            env['CONTENT_TYPE'] = self.headers.typeheader
+
+        length = self.headers.getheader('content-length')
+        if length:
+            env['CONTENT_LENGTH'] = length
+
+        for h in self.headers.headers:
+            k,v = h.split(':',1)
+            k=k.replace('-','_').upper(); v=v.strip()
+            if k in env:
+                continue                    # skip content length, type,etc.
+            if 'HTTP_'+k in env:
+                env['HTTP_'+k] += ','+v     # comma-separate multiple headers
+            else:
+                env['HTTP_'+k] = v
+        return env
+
+    def get_stderr(self):
+        return sys.stderr
+
+    def handle(self):
+        """Handle a single HTTP request"""
+        self.raw_requestline = self.rfile.readline()
+        if not self.parse_request(): # An error code has been sent, just exit
+            return
+        handler = ServerHandler(self.rfile, self.wfile, self.get_stderr(), self.get_environ())
+        handler.request_handler = self      # backpointer for logging
+        handler.run(self.server.get_app())
+
+    def log_message(self, format, *args):
+        # Don't bother logging requests for admin images or the favicon.
+        if self.path.startswith(self.admin_media_prefix) or self.path == '/favicon.ico':
+            return
+        sys.stderr.write("[%s] %s\n" % (self.log_date_time_string(), format % args))
+
+class AdminMediaHandler(object):
+    """
+    WSGI middleware that intercepts calls to the admin media directory, as
+    defined by the ADMIN_MEDIA_PREFIX setting, and serves those images.
+    Use this ONLY LOCALLY, for development! This hasn't been tested for
+    security and is not super efficient.
+    """
+    def __init__(self, application, media_dir=None):
+        from django.conf import settings
+        self.application = application
+        if not media_dir:
+            import django
+            self.media_dir = django.__path__[0] + '/contrib/admin/media'
+        else:
+            self.media_dir = media_dir
+        self.media_url = settings.ADMIN_MEDIA_PREFIX
+
+    def __call__(self, environ, start_response):
+        import os.path
+
+        # Ignore requests that aren't under ADMIN_MEDIA_PREFIX. Also ignore
+        # all requests if ADMIN_MEDIA_PREFIX isn't a relative URL.
+        if self.media_url.startswith('http://') or self.media_url.startswith('https://') \
+            or not environ['PATH_INFO'].startswith(self.media_url):
+            return self.application(environ, start_response)
+
+        # Find the admin file and serve it up, if it exists and is readable.
+        relative_url = environ['PATH_INFO'][len(self.media_url):]
+        file_path = os.path.join(self.media_dir, relative_url)
+        if not os.path.exists(file_path):
+            status = '404 NOT FOUND'
+            headers = {'Content-type': 'text/plain'}
+            output = ['Page not found: %s' % file_path]
+        else:
+            try:
+                fp = open(file_path, 'rb')
+            except IOError:
+                status = '401 UNAUTHORIZED'
+                headers = {'Content-type': 'text/plain'}
+                output = ['Permission denied: %s' % file_path]
+            else:
+                status = '200 OK'
+                headers = {}
+                mime_type = mimetypes.guess_type(file_path)[0]
+                if mime_type:
+                    headers['Content-Type'] = mime_type
+                output = [fp.read()]
+                fp.close()
+        start_response(status, headers.items())
+        return output
+
+def run(addr, port, wsgi_handler):
+    server_address = (addr, port)
+    httpd = WSGIServer(server_address, WSGIRequestHandler)
+    httpd.set_app(wsgi_handler)
+    httpd.serve_forever()
diff --git a/webapp/django/core/servers/fastcgi.py b/webapp/django/core/servers/fastcgi.py
new file mode 100644
index 0000000..dc4c35b
--- /dev/null
+++ b/webapp/django/core/servers/fastcgi.py
@@ -0,0 +1,179 @@
+"""
+FastCGI (or SCGI, or AJP1.3 ...) server that implements the WSGI protocol.
+
+Uses the flup python package: http://www.saddi.com/software/flup/
+
+This is a adaptation of the flup package to add FastCGI server support
+to run Django apps from Web servers that support the FastCGI protocol.
+This module can be run standalone or from the django-admin / manage.py
+scripts using the "runfcgi" directive.
+
+Run with the extra option "help" for a list of additional options you can
+pass to this server.
+"""
+
+import sys, os
+
+__version__ = "0.1"
+__all__ = ["runfastcgi"]
+
+FASTCGI_HELP = r"""
+  Run this project as a fastcgi (or some other protocol supported
+  by flup) application. To do this, the flup package from
+  http://www.saddi.com/software/flup/ is required.
+
+   runfcgi [options] [fcgi settings]
+
+Optional Fcgi settings: (setting=value)
+  protocol=PROTOCOL    fcgi, scgi, ajp, ... (default fcgi)
+  host=HOSTNAME        hostname to listen on..
+  port=PORTNUM         port to listen on.
+  socket=FILE          UNIX socket to listen on.
+  method=IMPL          prefork or threaded (default prefork)
+  maxrequests=NUMBER   number of requests a child handles before it is 
+                       killed and a new child is forked (0 = no limit).
+  maxspare=NUMBER      max number of spare processes / threads
+  minspare=NUMBER      min number of spare processes / threads.
+  maxchildren=NUMBER   hard limit number of processes / threads
+  daemonize=BOOL       whether to detach from terminal.
+  pidfile=FILE         write the spawned process-id to this file.
+  workdir=DIRECTORY    change to this directory when daemonizing.
+  outlog=FILE          write stdout to this file.
+  errlog=FILE          write stderr to this file.
+  umask=UMASK          umask to use when daemonizing (default 022).
+
+Examples:
+  Run a "standard" fastcgi process on a file-descriptor
+  (for webservers which spawn your processes for you)
+    $ manage.py runfcgi method=threaded
+
+  Run a scgi server on a TCP host/port
+    $ manage.py runfcgi protocol=scgi method=prefork host=127.0.0.1 port=8025
+
+  Run a fastcgi server on a UNIX domain socket (posix platforms only)
+    $ manage.py runfcgi method=prefork socket=/tmp/fcgi.sock
+
+  Run a fastCGI as a daemon and write the spawned PID in a file
+    $ manage.py runfcgi socket=/tmp/fcgi.sock method=prefork \
+        daemonize=true pidfile=/var/run/django-fcgi.pid
+
+"""
+
+FASTCGI_OPTIONS = {
+    'protocol': 'fcgi',
+    'host': None,
+    'port': None,
+    'socket': None,
+    'method': 'fork',
+    'daemonize': None,
+    'workdir': '/',
+    'pidfile': None,
+    'maxspare': 5,
+    'minspare': 2,
+    'maxchildren': 50,
+    'maxrequests': 0,
+    'outlog': None,
+    'errlog': None,
+    'umask': None,
+}
+
+def fastcgi_help(message=None):
+    print FASTCGI_HELP
+    if message:
+        print message
+    return False
+
+def runfastcgi(argset=[], **kwargs):
+    options = FASTCGI_OPTIONS.copy()
+    options.update(kwargs)
+    for x in argset:
+        if "=" in x:
+            k, v = x.split('=', 1)
+        else:
+            k, v = x, True
+        options[k.lower()] = v
+
+    if "help" in options:
+        return fastcgi_help()
+
+    try:
+        import flup
+    except ImportError, e:
+        print >> sys.stderr, "ERROR: %s" % e
+        print >> sys.stderr, "  Unable to load the flup package.  In order to run django"
+        print >> sys.stderr, "  as a FastCGI application, you will need to get flup from"
+        print >> sys.stderr, "  http://www.saddi.com/software/flup/   If you've already"
+        print >> sys.stderr, "  installed flup, then make sure you have it in your PYTHONPATH."
+        return False
+
+    flup_module = 'server.' + options['protocol']
+
+    if options['method'] in ('prefork', 'fork'):
+        wsgi_opts = {
+            'maxSpare': int(options["maxspare"]),
+            'minSpare': int(options["minspare"]),
+            'maxChildren': int(options["maxchildren"]),
+            'maxRequests': int(options["maxrequests"]), 
+        }
+        flup_module += '_fork'
+    elif options['method'] in ('thread', 'threaded'):
+        wsgi_opts = {
+            'maxSpare': int(options["maxspare"]),
+            'minSpare': int(options["minspare"]),
+            'maxThreads': int(options["maxchildren"]),
+        }
+    else:
+        return fastcgi_help("ERROR: Implementation must be one of prefork or thread.")
+
+    wsgi_opts['debug'] = False # Turn off flup tracebacks
+
+    try:
+        WSGIServer = getattr(__import__('flup.' + flup_module, '', '', flup_module), 'WSGIServer')
+    except:
+        print "Can't import flup." + flup_module
+        return False
+
+    # Prep up and go
+    from django.core.handlers.wsgi import WSGIHandler
+
+    if options["host"] and options["port"] and not options["socket"]:
+        wsgi_opts['bindAddress'] = (options["host"], int(options["port"]))
+    elif options["socket"] and not options["host"] and not options["port"]:
+        wsgi_opts['bindAddress'] = options["socket"]
+    elif not options["socket"] and not options["host"] and not options["port"]:
+        wsgi_opts['bindAddress'] = None
+    else:
+        return fastcgi_help("Invalid combination of host, port, socket.")
+
+    if options["daemonize"] is None:
+        # Default to daemonizing if we're running on a socket/named pipe.
+        daemonize = (wsgi_opts['bindAddress'] is not None)
+    else:
+        if options["daemonize"].lower() in ('true', 'yes', 't'):
+            daemonize = True
+        elif options["daemonize"].lower() in ('false', 'no', 'f'):
+            daemonize = False
+        else:
+            return fastcgi_help("ERROR: Invalid option for daemonize parameter.")
+
+    daemon_kwargs = {}
+    if options['outlog']:
+        daemon_kwargs['out_log'] = options['outlog']
+    if options['errlog']:
+        daemon_kwargs['err_log'] = options['errlog']
+    if options['umask']:
+        daemon_kwargs['umask'] = int(options['umask'])
+
+    if daemonize:
+        from django.utils.daemonize import become_daemon
+        become_daemon(our_home_dir=options["workdir"], **daemon_kwargs)
+
+    if options["pidfile"]:
+        fp = open(options["pidfile"], "w")
+        fp.write("%d\n" % os.getpid())
+        fp.close()
+
+    WSGIServer(WSGIHandler(), **wsgi_opts).run()
+
+if __name__ == '__main__':
+    runfastcgi(sys.argv[1:])
diff --git a/webapp/django/core/signals.py b/webapp/django/core/signals.py
new file mode 100644
index 0000000..a14af00
--- /dev/null
+++ b/webapp/django/core/signals.py
@@ -0,0 +1,5 @@
+from django.dispatch import Signal
+
+request_started = Signal()
+request_finished = Signal()
+got_request_exception = Signal(providing_args=["request"])
diff --git a/webapp/django/core/template_loader.py b/webapp/django/core/template_loader.py
new file mode 100644
index 0000000..ee86178
--- /dev/null
+++ b/webapp/django/core/template_loader.py
@@ -0,0 +1,7 @@
+# This module is DEPRECATED!
+#
+# You should no longer be using django.template_loader.
+#
+# Use django.template.loader instead.
+
+from django.template.loader import *
diff --git a/webapp/django/core/urlresolvers.py b/webapp/django/core/urlresolvers.py
new file mode 100644
index 0000000..f6e09c1
--- /dev/null
+++ b/webapp/django/core/urlresolvers.py
@@ -0,0 +1,330 @@
+"""
+This module converts requested URLs to callback view functions.
+
+RegexURLResolver is the main class here. Its resolve() method takes a URL (as
+a string) and returns a tuple in this format:
+
+    (view_function, function_args, function_kwargs)
+"""
+
+import re
+
+from django.http import Http404
+from django.core.exceptions import ImproperlyConfigured, ViewDoesNotExist
+from django.utils.encoding import iri_to_uri, force_unicode, smart_str
+from django.utils.functional import memoize
+from django.utils.thread_support import currentThread
+
+try:
+    reversed
+except NameError:
+    from django.utils.itercompat import reversed     # Python 2.3 fallback
+
+_resolver_cache = {} # Maps urlconf modules to RegexURLResolver instances.
+_callable_cache = {} # Maps view and url pattern names to their view functions.
+
+# SCRIPT_NAME prefixes for each thread are stored here. If there's no entry for
+# the current thread (which is the only one we ever access), it is assumed to
+# be empty.
+_prefixes = {}
+
+class Resolver404(Http404):
+    pass
+
+class NoReverseMatch(Exception):
+    # Don't make this raise an error when used in a template.
+    silent_variable_failure = True
+
+def get_callable(lookup_view, can_fail=False):
+    """
+    Convert a string version of a function name to the callable object.
+
+    If the lookup_view is not an import path, it is assumed to be a URL pattern
+    label and the original string is returned.
+
+    If can_fail is True, lookup_view might be a URL pattern label, so errors
+    during the import fail and the string is returned.
+    """
+    if not callable(lookup_view):
+        try:
+            # Bail early for non-ASCII strings (they can't be functions).
+            lookup_view = lookup_view.encode('ascii')
+            mod_name, func_name = get_mod_func(lookup_view)
+            if func_name != '':
+                lookup_view = getattr(__import__(mod_name, {}, {}, ['']), func_name)
+        except (ImportError, AttributeError):
+            if not can_fail:
+                raise
+        except UnicodeEncodeError:
+            pass
+    return lookup_view
+get_callable = memoize(get_callable, _callable_cache, 1)
+
+def get_resolver(urlconf):
+    if urlconf is None:
+        from django.conf import settings
+        urlconf = settings.ROOT_URLCONF
+    return RegexURLResolver(r'^/', urlconf)
+get_resolver = memoize(get_resolver, _resolver_cache, 1)
+
+def get_mod_func(callback):
+    # Converts 'django.views.news.stories.story_detail' to
+    # ['django.views.news.stories', 'story_detail']
+    try:
+        dot = callback.rindex('.')
+    except ValueError:
+        return callback, ''
+    return callback[:dot], callback[dot+1:]
+
+def reverse_helper(regex, *args, **kwargs):
+    """
+    Does a "reverse" lookup -- returns the URL for the given args/kwargs.
+    The args/kwargs are applied to the given compiled regular expression.
+    For example:
+
+        >>> reverse_helper(re.compile('^places/(\d+)/$'), 3)
+        'places/3/'
+        >>> reverse_helper(re.compile('^places/(?P<id>\d+)/$'), id=3)
+        'places/3/'
+        >>> reverse_helper(re.compile('^people/(?P<state>\w\w)/(\w+)/$'), 'adrian', state='il')
+        'people/il/adrian/'
+
+    Raises NoReverseMatch if the args/kwargs aren't valid for the regex.
+    """
+    # TODO: Handle nested parenthesis in the following regex.
+    result = re.sub(r'\(([^)]+)\)', MatchChecker(args, kwargs), regex.pattern)
+    return result.replace('^', '').replace('$', '').replace('\\', '')
+
+class MatchChecker(object):
+    "Class used in reverse RegexURLPattern lookup."
+    def __init__(self, args, kwargs):
+        self.args, self.kwargs = args, kwargs
+        self.current_arg = 0
+
+    def __call__(self, match_obj):
+        # match_obj.group(1) is the contents of the parenthesis.
+        # First we need to figure out whether it's a named or unnamed group.
+        #
+        grouped = match_obj.group(1)
+        m = re.search(r'^\?P<(\w+)>(.*?)$', grouped, re.UNICODE)
+        if m: # If this was a named group...
+            # m.group(1) is the name of the group
+            # m.group(2) is the regex.
+            try:
+                value = self.kwargs[m.group(1)]
+            except KeyError:
+                # It was a named group, but the arg was passed in as a
+                # positional arg or not at all.
+                try:
+                    value = self.args[self.current_arg]
+                    self.current_arg += 1
+                except IndexError:
+                    # The arg wasn't passed in.
+                    raise NoReverseMatch('Not enough positional arguments passed in')
+            test_regex = m.group(2)
+        else: # Otherwise, this was a positional (unnamed) group.
+            try:
+                value = self.args[self.current_arg]
+                self.current_arg += 1
+            except IndexError:
+                # The arg wasn't passed in.
+                raise NoReverseMatch('Not enough positional arguments passed in')
+            test_regex = grouped
+        # Note we're using re.match here on purpose because the start of
+        # to string needs to match.
+        if not re.match(test_regex + '$', force_unicode(value), re.UNICODE):
+            raise NoReverseMatch("Value %r didn't match regular expression %r" % (value, test_regex))
+        return force_unicode(value)
+
+class RegexURLPattern(object):
+    def __init__(self, regex, callback, default_args=None, name=None):
+        # regex is a string representing a regular expression.
+        # callback is either a string like 'foo.views.news.stories.story_detail'
+        # which represents the path to a module and a view function name, or a
+        # callable object (view).
+        self.regex = re.compile(regex, re.UNICODE)
+        if callable(callback):
+            self._callback = callback
+        else:
+            self._callback = None
+            self._callback_str = callback
+        self.default_args = default_args or {}
+        self.name = name
+
+    def __repr__(self):
+        return '<%s %s %s>' % (self.__class__.__name__, self.name, self.regex.pattern)
+
+    def add_prefix(self, prefix):
+        """
+        Adds the prefix string to a string-based callback.
+        """
+        if not prefix or not hasattr(self, '_callback_str'):
+            return
+        self._callback_str = prefix + '.' + self._callback_str
+
+    def resolve(self, path):
+        match = self.regex.search(path)
+        if match:
+            # If there are any named groups, use those as kwargs, ignoring
+            # non-named groups. Otherwise, pass all non-named arguments as
+            # positional arguments.
+            kwargs = match.groupdict()
+            if kwargs:
+                args = ()
+            else:
+                args = match.groups()
+            # In both cases, pass any extra_kwargs as **kwargs.
+            kwargs.update(self.default_args)
+
+            return self.callback, args, kwargs
+
+    def _get_callback(self):
+        if self._callback is not None:
+            return self._callback
+        try:
+            self._callback = get_callable(self._callback_str)
+        except ImportError, e:
+            mod_name, _ = get_mod_func(self._callback_str)
+            raise ViewDoesNotExist, "Could not import %s. Error was: %s" % (mod_name, str(e))
+        except AttributeError, e:
+            mod_name, func_name = get_mod_func(self._callback_str)
+            raise ViewDoesNotExist, "Tried %s in module %s. Error was: %s" % (func_name, mod_name, str(e))
+        return self._callback
+    callback = property(_get_callback)
+
+    def reverse(self, viewname, *args, **kwargs):
+        mod_name, func_name = get_mod_func(viewname)
+        try:
+            lookup_view = getattr(__import__(mod_name, {}, {}, ['']), func_name)
+        except (ImportError, AttributeError):
+            raise NoReverseMatch
+        if lookup_view != self.callback:
+            raise NoReverseMatch
+        return self.reverse_helper(*args, **kwargs)
+
+    def reverse_helper(self, *args, **kwargs):
+        return reverse_helper(self.regex, *args, **kwargs)
+
+class RegexURLResolver(object):
+    def __init__(self, regex, urlconf_name, default_kwargs=None):
+        # regex is a string representing a regular expression.
+        # urlconf_name is a string representing the module containing urlconfs.
+        self.regex = re.compile(regex, re.UNICODE)
+        self.urlconf_name = urlconf_name
+        self.callback = None
+        self.default_kwargs = default_kwargs or {}
+        self._reverse_dict = {}
+
+    def __repr__(self):
+        return '<%s %s %s>' % (self.__class__.__name__, self.urlconf_name, self.regex.pattern)
+
+    def _get_reverse_dict(self):
+        if not self._reverse_dict and hasattr(self.urlconf_module, 'urlpatterns'):
+            for pattern in reversed(self.urlconf_module.urlpatterns):
+                if isinstance(pattern, RegexURLResolver):
+                    for key, value in pattern.reverse_dict.iteritems():
+                        self._reverse_dict[key] = (pattern,) + value
+                else:
+                    self._reverse_dict[pattern.callback] = (pattern,)
+                    self._reverse_dict[pattern.name] = (pattern,)
+        return self._reverse_dict
+    reverse_dict = property(_get_reverse_dict)
+
+    def resolve(self, path):
+        tried = []
+        match = self.regex.search(path)
+        if match:
+            new_path = path[match.end():]
+            for pattern in self.urlconf_module.urlpatterns:
+                try:
+                    sub_match = pattern.resolve(new_path)
+                except Resolver404, e:
+                    tried.extend([(pattern.regex.pattern + '   ' + t) for t in e.args[0]['tried']])
+                else:
+                    if sub_match:
+                        sub_match_dict = dict([(smart_str(k), v) for k, v in match.groupdict().items()])
+                        sub_match_dict.update(self.default_kwargs)
+                        for k, v in sub_match[2].iteritems():
+                            sub_match_dict[smart_str(k)] = v
+                        return sub_match[0], sub_match[1], sub_match_dict
+                    tried.append(pattern.regex.pattern)
+            raise Resolver404, {'tried': tried, 'path': new_path}
+
+    def _get_urlconf_module(self):
+        try:
+            return self._urlconf_module
+        except AttributeError:
+            try:
+                self._urlconf_module = __import__(self.urlconf_name, {}, {}, [''])
+            except Exception, e:
+                # Either an invalid urlconf_name, such as "foo.bar.", or some
+                # kind of problem during the actual import.
+                raise ImproperlyConfigured, "Error while importing URLconf %r: %s" % (self.urlconf_name, e)
+            return self._urlconf_module
+    urlconf_module = property(_get_urlconf_module)
+
+    def _get_url_patterns(self):
+        return self.urlconf_module.urlpatterns
+    url_patterns = property(_get_url_patterns)
+
+    def _resolve_special(self, view_type):
+        callback = getattr(self.urlconf_module, 'handler%s' % view_type)
+        mod_name, func_name = get_mod_func(callback)
+        try:
+            return getattr(__import__(mod_name, {}, {}, ['']), func_name), {}
+        except (ImportError, AttributeError), e:
+            raise ViewDoesNotExist, "Tried %s. Error was: %s" % (callback, str(e))
+
+    def resolve404(self):
+        return self._resolve_special('404')
+
+    def resolve500(self):
+        return self._resolve_special('500')
+
+    def reverse(self, lookup_view, *args, **kwargs):
+        try:
+            lookup_view = get_callable(lookup_view, True)
+        except (ImportError, AttributeError):
+            raise NoReverseMatch("'%s' is not a callable." % lookup_view)
+        if lookup_view in self.reverse_dict:
+            return u''.join([reverse_helper(part.regex, *args, **kwargs) for part in self.reverse_dict[lookup_view]])
+        raise NoReverseMatch("Reverse for '%s' not found." % lookup_view)
+
+    def reverse_helper(self, lookup_view, *args, **kwargs):
+        sub_match = self.reverse(lookup_view, *args, **kwargs)
+        result = reverse_helper(self.regex, *args, **kwargs)
+        return result + sub_match
+
+def resolve(path, urlconf=None):
+    return get_resolver(urlconf).resolve(path)
+
+def reverse(viewname, urlconf=None, args=None, kwargs=None, prefix=None):
+    args = args or []
+    kwargs = kwargs or {}
+    if prefix is None:
+        prefix = get_script_prefix()
+    return iri_to_uri(u'%s%s' % (prefix, get_resolver(urlconf).reverse(viewname,
+            *args, **kwargs)))
+
+def clear_url_caches():
+    global _resolver_cache
+    global _callable_cache
+    _resolver_cache.clear()
+    _callable_cache.clear()
+
+def set_script_prefix(prefix):
+    """
+    Sets the script prefix for the current thread.
+    """
+    if not prefix.endswith('/'):
+        prefix += '/'
+    _prefixes[currentThread()] = prefix
+
+def get_script_prefix():
+    """
+    Returns the currently active script prefix. Useful for client code that
+    wishes to construct their own URLs manually (although accessing the request
+    instance is normally going to be a lot cleaner).
+    """
+    return _prefixes.get(currentThread(), u'/')
+
diff --git a/webapp/django/core/validators.py b/webapp/django/core/validators.py
new file mode 100644
index 0000000..f94db40
--- /dev/null
+++ b/webapp/django/core/validators.py
@@ -0,0 +1,598 @@
+"""
+A library of validators that return None and raise ValidationError when the
+provided data isn't valid.
+
+Validators may be callable classes, and they may have an 'always_test'
+attribute. If an 'always_test' attribute exists (regardless of value), the
+validator will *always* be run, regardless of whether its associated
+form field is required.
+"""
+
+import urllib2
+import re
+try:
+    from decimal import Decimal, DecimalException
+except ImportError:
+    from django.utils._decimal import Decimal, DecimalException    # Python 2.3
+
+from django.conf import settings
+from django.utils.translation import ugettext as _, ugettext_lazy, ungettext
+from django.utils.functional import Promise, lazy
+from django.utils.encoding import force_unicode, smart_str
+
+_datere = r'\d{4}-\d{1,2}-\d{1,2}'
+_timere = r'(?:[01]?[0-9]|2[0-3]):[0-5][0-9](?::[0-5][0-9])?'
+alnum_re = re.compile(r'^\w+$')
+alnumurl_re = re.compile(r'^[-\w/]+$')
+ansi_date_re = re.compile('^%s$' % _datere)
+ansi_time_re = re.compile('^%s$' % _timere)
+ansi_datetime_re = re.compile('^%s %s$' % (_datere, _timere))
+email_re = re.compile(
+    r"(^[-!#$%&'*+/=?^_`{}|~0-9A-Z]+(\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*"  # dot-atom
+    r'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-\011\013\014\016-\177])*"' # quoted-string
+    r')@(?:[A-Z0-9-]+\.)+[A-Z]{2,6}$', re.IGNORECASE)  # domain
+integer_re = re.compile(r'^-?\d+$')
+ip4_re = re.compile(r'^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$')
+phone_re = re.compile(r'^[A-PR-Y0-9]{3}-[A-PR-Y0-9]{3}-[A-PR-Y0-9]{4}$', re.IGNORECASE)
+slug_re = re.compile(r'^[-\w]+$')
+url_re = re.compile(r'^https?://\S+$')
+
+lazy_inter = lazy(lambda a,b: force_unicode(a) % b, unicode)
+
+class ValidationError(Exception):
+    def __init__(self, message):
+        "ValidationError can be passed a string or a list."
+        if isinstance(message, list):
+            self.messages = [force_unicode(msg) for msg in message]
+        else:
+            assert isinstance(message, (basestring, Promise)), ("%s should be a string" % repr(message))
+            self.messages = [force_unicode(message)]
+
+    def __str__(self):
+        # This is needed because, without a __str__(), printing an exception
+        # instance would result in this:
+        # AttributeError: ValidationError instance has no attribute 'args'
+        # See http://www.python.org/doc/current/tut/node10.html#handling
+        return str(self.messages)
+
+class CriticalValidationError(Exception):
+    def __init__(self, message):
+        "ValidationError can be passed a string or a list."
+        if isinstance(message, list):
+            self.messages = [force_unicode(msg) for msg in message]
+        else:
+            assert isinstance(message, (basestring, Promise)), ("'%s' should be a string" % message)
+            self.messages = [force_unicode(message)]
+
+    def __str__(self):
+        return str(self.messages)
+
+def isAlphaNumeric(field_data, all_data):
+    if not alnum_re.search(field_data):
+        raise ValidationError, _("This value must contain only letters, numbers and underscores.")
+
+def isAlphaNumericURL(field_data, all_data):
+    if not alnumurl_re.search(field_data):
+        raise ValidationError, _("This value must contain only letters, numbers, underscores, dashes or slashes.")
+
+def isSlug(field_data, all_data):
+    if not slug_re.search(field_data):
+        raise ValidationError, _("This value must contain only letters, numbers, underscores or hyphens.")
+
+def isLowerCase(field_data, all_data):
+    if field_data.lower() != field_data:
+        raise ValidationError, _("Uppercase letters are not allowed here.")
+
+def isUpperCase(field_data, all_data):
+    if field_data.upper() != field_data:
+        raise ValidationError, _("Lowercase letters are not allowed here.")
+
+def isCommaSeparatedIntegerList(field_data, all_data):
+    for supposed_int in field_data.split(','):
+        try:
+            int(supposed_int)
+        except ValueError:
+            raise ValidationError, _("Enter only digits separated by commas.")
+
+def isCommaSeparatedEmailList(field_data, all_data):
+    """
+    Checks that field_data is a string of e-mail addresses separated by commas.
+    Blank field_data values will not throw a validation error, and whitespace
+    is allowed around the commas.
+    """
+    for supposed_email in field_data.split(','):
+        try:
+            isValidEmail(supposed_email.strip(), '')
+        except ValidationError:
+            raise ValidationError, _("Enter valid e-mail addresses separated by commas.")
+
+def isValidIPAddress4(field_data, all_data):
+    if not ip4_re.search(field_data):
+        raise ValidationError, _("Please enter a valid IP address.")
+
+def isNotEmpty(field_data, all_data):
+    if field_data.strip() == '':
+        raise ValidationError, _("Empty values are not allowed here.")
+
+def isOnlyDigits(field_data, all_data):
+    if not field_data.isdigit():
+        raise ValidationError, _("Non-numeric characters aren't allowed here.")
+
+def isNotOnlyDigits(field_data, all_data):
+    if field_data.isdigit():
+        raise ValidationError, _("This value can't be comprised solely of digits.")
+
+def isInteger(field_data, all_data):
+    # This differs from isOnlyDigits because this accepts the negative sign
+    if not integer_re.search(field_data):
+        raise ValidationError, _("Enter a whole number.")
+
+def isOnlyLetters(field_data, all_data):
+    if not field_data.isalpha():
+        raise ValidationError, _("Only alphabetical characters are allowed here.")
+
+def _isValidDate(date_string):
+    """
+    A helper function used by isValidANSIDate and isValidANSIDatetime to
+    check if the date is valid.  The date string is assumed to already be in
+    YYYY-MM-DD format.
+    """
+    from datetime import date
+    # Could use time.strptime here and catch errors, but datetime.date below
+    # produces much friendlier error messages.
+    year, month, day = map(int, date_string.split('-'))
+    try:
+        date(year, month, day)
+    except ValueError, e:
+        msg = _('Invalid date: %s') % _(str(e))
+        raise ValidationError, msg
+
+def isValidANSIDate(field_data, all_data):
+    if not ansi_date_re.search(field_data):
+        raise ValidationError, _('Enter a valid date in YYYY-MM-DD format.')
+    _isValidDate(field_data)
+
+def isValidANSITime(field_data, all_data):
+    if not ansi_time_re.search(field_data):
+        raise ValidationError, _('Enter a valid time in HH:MM format.')
+
+def isValidANSIDatetime(field_data, all_data):
+    if not ansi_datetime_re.search(field_data):
+        raise ValidationError, _('Enter a valid date/time in YYYY-MM-DD HH:MM format.')
+    _isValidDate(field_data.split()[0])
+
+def isValidEmail(field_data, all_data):
+    if not email_re.search(field_data):
+        raise ValidationError, _('Enter a valid e-mail address.')
+
+def isValidImage(field_data, all_data):
+    """
+    Checks that the file-upload field data contains a valid image (GIF, JPG,
+    PNG, possibly others -- whatever the Python Imaging Library supports).
+    """
+    from PIL import Image
+    from cStringIO import StringIO
+    try:
+        content = field_data.read()
+    except TypeError:
+        raise ValidationError, _("No file was submitted. Check the encoding type on the form.")
+    try:
+        # load() is the only method that can spot a truncated JPEG,
+        #  but it cannot be called sanely after verify()
+        trial_image = Image.open(StringIO(content))
+        trial_image.load()
+        # verify() is the only method that can spot a corrupt PNG,
+        #  but it must be called immediately after the constructor
+        trial_image = Image.open(StringIO(content))
+        trial_image.verify()
+    except Exception: # Python Imaging Library doesn't recognize it as an image
+        raise ValidationError, _("Upload a valid image. The file you uploaded was either not an image or a corrupted image.")
+
+def isValidImageURL(field_data, all_data):
+    uc = URLMimeTypeCheck(('image/jpeg', 'image/gif', 'image/png'))
+    try:
+        uc(field_data, all_data)
+    except URLMimeTypeCheck.InvalidContentType:
+        raise ValidationError, _("The URL %s does not point to a valid image.") % field_data
+
+def isValidPhone(field_data, all_data):
+    if not phone_re.search(field_data):
+        raise ValidationError, _('Phone numbers must be in XXX-XXX-XXXX format. "%s" is invalid.') % field_data
+
+def isValidQuicktimeVideoURL(field_data, all_data):
+    "Checks that the given URL is a video that can be played by QuickTime (qt, mpeg)"
+    uc = URLMimeTypeCheck(('video/quicktime', 'video/mpeg',))
+    try:
+        uc(field_data, all_data)
+    except URLMimeTypeCheck.InvalidContentType:
+        raise ValidationError, _("The URL %s does not point to a valid QuickTime video.") % field_data
+
+def isValidURL(field_data, all_data):
+    if not url_re.search(field_data):
+        raise ValidationError, _("A valid URL is required.")
+
+def isValidHTML(field_data, all_data):
+    import urllib, urllib2
+    try:
+        u = urllib2.urlopen('http://validator.w3.org/check', urllib.urlencode({'fragment': field_data, 'output': 'xml'}))
+    except:
+        # Validator or Internet connection is unavailable. Fail silently.
+        return
+    html_is_valid = (u.headers.get('x-w3c-validator-status', 'Invalid') == 'Valid')
+    if html_is_valid:
+        return
+    from xml.dom.minidom import parseString
+    error_messages = [e.firstChild.wholeText for e in parseString(u.read()).getElementsByTagName('messages')[0].getElementsByTagName('msg')]
+    raise ValidationError, _("Valid HTML is required. Specific errors are:\n%s") % "\n".join(error_messages)
+
+def isWellFormedXml(field_data, all_data):
+    from xml.dom.minidom import parseString
+    try:
+        parseString(field_data)
+    except Exception, e: # Naked except because we're not sure what will be thrown
+        raise ValidationError, _("Badly formed XML: %s") % str(e)
+
+def isWellFormedXmlFragment(field_data, all_data):
+    isWellFormedXml('<root>%s</root>' % field_data, all_data)
+
+def isExistingURL(field_data, all_data):
+    try:
+        headers = {
+            "Accept" : "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5",
+            "Accept-Language" : "en-us,en;q=0.5",
+            "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7",
+            "Connection" : "close",
+            "User-Agent": settings.URL_VALIDATOR_USER_AGENT
+            }
+        req = urllib2.Request(field_data,None, headers)
+        u = urllib2.urlopen(req)
+    except ValueError:
+        raise ValidationError, _("Invalid URL: %s") % field_data
+    except urllib2.HTTPError, e:
+        # 401s are valid; they just mean authorization is required.
+        # 301 and 302 are redirects; they just mean look somewhere else.
+        if str(e.code) not in ('401','301','302'):
+            raise ValidationError, _("The URL %s is a broken link.") % field_data
+    except: # urllib2.URLError, httplib.InvalidURL, etc.
+        raise ValidationError, _("The URL %s is a broken link.") % field_data
+
+def isValidUSState(field_data, all_data):
+    "Checks that the given string is a valid two-letter U.S. state abbreviation"
+    states = ['AA', 'AE', 'AK', 'AL', 'AP', 'AR', 'AS', 'AZ', 'CA', 'CO', 'CT', 'DC', 'DE', 'FL', 'FM', 'GA', 'GU', 'HI', 'IA', 'ID', 'IL', 'IN', 'KS', 'KY', 'LA', 'MA', 'MD', 'ME', 'MH', 'MI', 'MN', 'MO', 'MP', 'MS', 'MT', 'NC', 'ND', 'NE', 'NH', 'NJ', 'NM', 'NV', 'NY', 'OH', 'OK', 'OR', 'PA', 'PR', 'PW', 'RI', 'SC', 'SD', 'TN', 'TX', 'UT', 'VA', 'VI', 'VT', 'WA', 'WI', 'WV', 'WY']
+    if field_data.upper() not in states:
+        raise ValidationError, _("Enter a valid U.S. state abbreviation.")
+
+def hasNoProfanities(field_data, all_data):
+    """
+    Checks that the given string has no profanities in it. This does a simple
+    check for whether each profanity exists within the string, so 'fuck' will
+    catch 'motherfucker' as well. Raises a ValidationError such as:
+        Watch your mouth! The words "f--k" and "s--t" are not allowed here.
+    """
+    field_data = field_data.lower() # normalize
+    words_seen = [w for w in settings.PROFANITIES_LIST if w in field_data]
+    if words_seen:
+        from django.utils.text import get_text_list
+        plural = len(words_seen)
+        raise ValidationError, ungettext("Watch your mouth! The word %s is not allowed here.",
+            "Watch your mouth! The words %s are not allowed here.", plural) % \
+            get_text_list(['"%s%s%s"' % (i[0], '-'*(len(i)-2), i[-1]) for i in words_seen], _('and'))
+
+class AlwaysMatchesOtherField(object):
+    def __init__(self, other_field_name, error_message=None):
+        self.other = other_field_name
+        self.error_message = error_message or lazy_inter(ugettext_lazy("This field must match the '%s' field."), self.other)
+        self.always_test = True
+
+    def __call__(self, field_data, all_data):
+        if field_data != all_data[self.other]:
+            raise ValidationError, self.error_message
+
+class ValidateIfOtherFieldEquals(object):
+    def __init__(self, other_field, other_value, validator_list):
+        self.other_field, self.other_value = other_field, other_value
+        self.validator_list = validator_list
+        self.always_test = True
+
+    def __call__(self, field_data, all_data):
+        if self.other_field in all_data and all_data[self.other_field] == self.other_value:
+            for v in self.validator_list:
+                v(field_data, all_data)
+
+class RequiredIfOtherFieldNotGiven(object):
+    def __init__(self, other_field_name, error_message=ugettext_lazy("Please enter something for at least one field.")):
+        self.other, self.error_message = other_field_name, error_message
+        self.always_test = True
+
+    def __call__(self, field_data, all_data):
+        if not all_data.get(self.other, False) and not field_data:
+            raise ValidationError, self.error_message
+
+class RequiredIfOtherFieldsGiven(object):
+    def __init__(self, other_field_names, error_message=ugettext_lazy("Please enter both fields or leave them both empty.")):
+        self.other, self.error_message = other_field_names, error_message
+        self.always_test = True
+
+    def __call__(self, field_data, all_data):
+        for field in self.other:
+            if all_data.get(field, False) and not field_data:
+                raise ValidationError, self.error_message
+
+class RequiredIfOtherFieldGiven(RequiredIfOtherFieldsGiven):
+    "Like RequiredIfOtherFieldsGiven, but takes a single field name instead of a list."
+    def __init__(self, other_field_name, error_message=ugettext_lazy("Please enter both fields or leave them both empty.")):
+        RequiredIfOtherFieldsGiven.__init__(self, [other_field_name], error_message)
+
+class RequiredIfOtherFieldEquals(object):
+    def __init__(self, other_field, other_value, error_message=None, other_label=None):
+        self.other_field = other_field
+        self.other_value = other_value
+        other_label = other_label or other_value
+        self.error_message = error_message or lazy_inter(ugettext_lazy("This field must be given if %(field)s is %(value)s"), {
+            'field': other_field, 'value': other_label})
+        self.always_test = True
+
+    def __call__(self, field_data, all_data):
+        if self.other_field in all_data and all_data[self.other_field] == self.other_value and not field_data:
+            raise ValidationError(self.error_message)
+
+class RequiredIfOtherFieldDoesNotEqual(object):
+    def __init__(self, other_field, other_value, other_label=None, error_message=None):
+        self.other_field = other_field
+        self.other_value = other_value
+        other_label = other_label or other_value
+        self.error_message = error_message or lazy_inter(ugettext_lazy("This field must be given if %(field)s is not %(value)s"), {
+            'field': other_field, 'value': other_label})
+        self.always_test = True
+
+    def __call__(self, field_data, all_data):
+        if self.other_field in all_data and all_data[self.other_field] != self.other_value and not field_data:
+            raise ValidationError(self.error_message)
+
+class IsLessThanOtherField(object):
+    def __init__(self, other_field_name, error_message):
+        self.other, self.error_message = other_field_name, error_message
+
+    def __call__(self, field_data, all_data):
+        if field_data > all_data[self.other]:
+            raise ValidationError, self.error_message
+
+class UniqueAmongstFieldsWithPrefix(object):
+    def __init__(self, field_name, prefix, error_message):
+        self.field_name, self.prefix = field_name, prefix
+        self.error_message = error_message or ugettext_lazy("Duplicate values are not allowed.")
+
+    def __call__(self, field_data, all_data):
+        for field_name, value in all_data.items():
+            if field_name != self.field_name and value == field_data:
+                raise ValidationError, self.error_message
+
+class NumberIsInRange(object):
+    """
+    Validator that tests if a value is in a range (inclusive).
+    """
+    def __init__(self, lower=None, upper=None, error_message=''):
+        self.lower, self.upper = lower, upper
+        if not error_message:
+            if lower and upper:
+                 self.error_message = _("This value must be between %(lower)s and %(upper)s.") % {'lower': lower, 'upper': upper}
+            elif lower:
+                self.error_message = _("This value must be at least %s.") % lower
+            elif upper:
+                self.error_message = _("This value must be no more than %s.") % upper
+        else:
+            self.error_message = error_message
+
+    def __call__(self, field_data, all_data):
+        # Try to make the value numeric. If this fails, we assume another
+        # validator will catch the problem.
+        try:
+            val = float(field_data)
+        except ValueError:
+            return
+
+        # Now validate
+        if self.lower and self.upper and (val < self.lower or val > self.upper):
+            raise ValidationError(self.error_message)
+        elif self.lower and val < self.lower:
+            raise ValidationError(self.error_message)
+        elif self.upper and val > self.upper:
+            raise ValidationError(self.error_message)
+
+class IsAPowerOf(object):
+    """
+    Usage: If you create an instance of the IsPowerOf validator:
+        v = IsAPowerOf(2)
+
+    The following calls will succeed:
+        v(4, None)
+        v(8, None)
+        v(16, None)
+
+    But this call:
+        v(17, None)
+    will raise "django.core.validators.ValidationError: ['This value must be a power of 2.']"
+    """
+    def __init__(self, power_of):
+        self.power_of = power_of
+
+    def __call__(self, field_data, all_data):
+        from math import log
+        val = log(int(field_data)) / log(self.power_of)
+        if val != int(val):
+            raise ValidationError, _("This value must be a power of %s.") % self.power_of
+
+class IsValidDecimal(object):
+    def __init__(self, max_digits, decimal_places):
+        self.max_digits, self.decimal_places = max_digits, decimal_places
+
+    def __call__(self, field_data, all_data):
+        try:
+            val = Decimal(field_data)
+        except DecimalException:
+            raise ValidationError, _("Please enter a valid decimal number.")
+
+        pieces = str(val).lstrip("-").split('.')
+        decimals = (len(pieces) == 2) and len(pieces[1]) or 0
+        digits = len(pieces[0])
+
+        if digits + decimals > self.max_digits:
+            raise ValidationError, ungettext("Please enter a valid decimal number with at most %s total digit.",
+                "Please enter a valid decimal number with at most %s total digits.", self.max_digits) % self.max_digits
+        if digits > (self.max_digits - self.decimal_places):
+            raise ValidationError, ungettext( "Please enter a valid decimal number with a whole part of at most %s digit.",
+                "Please enter a valid decimal number with a whole part of at most %s digits.", str(self.max_digits-self.decimal_places)) % str(self.max_digits-self.decimal_places)
+        if decimals > self.decimal_places:
+            raise ValidationError, ungettext("Please enter a valid decimal number with at most %s decimal place.",
+                "Please enter a valid decimal number with at most %s decimal places.", self.decimal_places) % self.decimal_places
+
+def isValidFloat(field_data, all_data):
+    data = smart_str(field_data)
+    try:
+        float(data)
+    except ValueError:
+        raise ValidationError, _("Please enter a valid floating point number.")
+
+class HasAllowableSize(object):
+    """
+    Checks that the file-upload field data is a certain size. min_size and
+    max_size are measurements in bytes.
+    """
+    def __init__(self, min_size=None, max_size=None, min_error_message=None, max_error_message=None):
+        self.min_size, self.max_size = min_size, max_size
+        self.min_error_message = min_error_message or lazy_inter(ugettext_lazy("Make sure your uploaded file is at least %s bytes big."), min_size)
+        self.max_error_message = max_error_message or lazy_inter(ugettext_lazy("Make sure your uploaded file is at most %s bytes big."), max_size)
+
+    def __call__(self, field_data, all_data):
+        try:
+            content = field_data.read()
+        except TypeError:
+            raise ValidationError, ugettext_lazy("No file was submitted. Check the encoding type on the form.")
+        if self.min_size is not None and len(content) < self.min_size:
+            raise ValidationError, self.min_error_message
+        if self.max_size is not None and len(content) > self.max_size:
+            raise ValidationError, self.max_error_message
+
+class MatchesRegularExpression(object):
+    """
+    Checks that the field matches the given regular-expression. The regex
+    should be in string format, not already compiled.
+    """
+    def __init__(self, regexp, error_message=ugettext_lazy("The format for this field is wrong.")):
+        self.regexp = re.compile(regexp)
+        self.error_message = error_message
+
+    def __call__(self, field_data, all_data):
+        if not self.regexp.search(field_data):
+            raise ValidationError(self.error_message)
+
+class AnyValidator(object):
+    """
+    This validator tries all given validators. If any one of them succeeds,
+    validation passes. If none of them succeeds, the given message is thrown
+    as a validation error. The message is rather unspecific, so it's best to
+    specify one on instantiation.
+    """
+    def __init__(self, validator_list=None, error_message=ugettext_lazy("This field is invalid.")):
+        if validator_list is None: validator_list = []
+        self.validator_list = validator_list
+        self.error_message = error_message
+        for v in validator_list:
+            if hasattr(v, 'always_test'):
+                self.always_test = True
+
+    def __call__(self, field_data, all_data):
+        for v in self.validator_list:
+            try:
+                v(field_data, all_data)
+                return
+            except ValidationError, e:
+                pass
+        raise ValidationError(self.error_message)
+
+class URLMimeTypeCheck(object):
+    "Checks that the provided URL points to a document with a listed mime type"
+    class CouldNotRetrieve(ValidationError):
+        pass
+    class InvalidContentType(ValidationError):
+        pass
+
+    def __init__(self, mime_type_list):
+        self.mime_type_list = mime_type_list
+
+    def __call__(self, field_data, all_data):
+        import urllib2
+        try:
+            isValidURL(field_data, all_data)
+        except ValidationError:
+            raise
+        try:
+            info = urllib2.urlopen(field_data).info()
+        except (urllib2.HTTPError, urllib2.URLError):
+            raise URLMimeTypeCheck.CouldNotRetrieve, _("Could not retrieve anything from %s.") % field_data
+        content_type = info['content-type']
+        if content_type not in self.mime_type_list:
+            raise URLMimeTypeCheck.InvalidContentType, _("The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'.") % {
+                'url': field_data, 'contenttype': content_type}
+
+class RelaxNGCompact(object):
+    "Validate against a Relax NG compact schema"
+    def __init__(self, schema_path, additional_root_element=None):
+        self.schema_path = schema_path
+        self.additional_root_element = additional_root_element
+
+    def __call__(self, field_data, all_data):
+        import os, tempfile
+        if self.additional_root_element:
+            field_data = '<%(are)s>%(data)s\n</%(are)s>' % {
+                'are': self.additional_root_element,
+                'data': field_data
+            }
+        filename = tempfile.mktemp() # Insecure, but nothing else worked
+        fp = open(filename, 'w')
+        fp.write(field_data)
+        fp.close()
+        if not os.path.exists(settings.JING_PATH):
+            raise Exception, "%s not found!" % settings.JING_PATH
+        p = os.popen('%s -c %s %s' % (settings.JING_PATH, self.schema_path, filename))
+        errors = [line.strip() for line in p.readlines()]
+        p.close()
+        os.unlink(filename)
+        display_errors = []
+        lines = field_data.split('\n')
+        for error in errors:
+            ignored, line, level, message = error.split(':', 3)
+            # Scrape the Jing error messages to reword them more nicely.
+            m = re.search(r'Expected "(.*?)" to terminate element starting on line (\d+)', message)
+            if m:
+                display_errors.append(_('Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "%(start)s".)') % \
+                    {'tag':m.group(1).replace('/', ''), 'line':m.group(2), 'start':lines[int(m.group(2)) - 1][:30]})
+                continue
+            if message.strip() == 'text not allowed here':
+                display_errors.append(_('Some text starting on line %(line)s is not allowed in that context. (Line starts with "%(start)s".)') % \
+                    {'line':line, 'start':lines[int(line) - 1][:30]})
+                continue
+            m = re.search(r'\s*attribute "(.*?)" not allowed at this point; ignored', message)
+            if m:
+                display_errors.append(_('"%(attr)s" on line %(line)s is an invalid attribute. (Line starts with "%(start)s".)') % \
+                    {'attr':m.group(1), 'line':line, 'start':lines[int(line) - 1][:30]})
+                continue
+            m = re.search(r'\s*unknown element "(.*?)"', message)
+            if m:
+                display_errors.append(_('"<%(tag)s>" on line %(line)s is an invalid tag. (Line starts with "%(start)s".)') % \
+                    {'tag':m.group(1), 'line':line, 'start':lines[int(line) - 1][:30]})
+                continue
+            if message.strip() == 'required attributes missing':
+                display_errors.append(_('A tag on line %(line)s is missing one or more required attributes. (Line starts with "%(start)s".)') % \
+                    {'line':line, 'start':lines[int(line) - 1][:30]})
+                continue
+            m = re.search(r'\s*bad value for attribute "(.*?)"', message)
+            if m:
+                display_errors.append(_('The "%(attr)s" attribute on line %(line)s has an invalid value. (Line starts with "%(start)s".)') % \
+                    {'attr':m.group(1), 'line':line, 'start':lines[int(line) - 1][:30]})
+                continue
+            # Failing all those checks, use the default error message.
+            display_error = 'Line %s: %s [%s]' % (line, message, level.strip())
+            display_errors.append(display_error)
+        if len(display_errors) > 0:
+            raise ValidationError, display_errors
diff --git a/webapp/django/core/xheaders.py b/webapp/django/core/xheaders.py
new file mode 100644
index 0000000..34335f1
--- /dev/null
+++ b/webapp/django/core/xheaders.py
@@ -0,0 +1,24 @@
+"""
+Pages in Django can are served up with custom HTTP headers containing useful
+information about those pages -- namely, the content type and object ID.
+
+This module contains utility functions for retrieving and doing interesting
+things with these special "X-Headers" (so called because the HTTP spec demands
+that custom headers are prefixed with "X-").
+
+Next time you're at slashdot.org, watch out for X-Fry and X-Bender. :)
+"""
+
+def populate_xheaders(request, response, model, object_id):
+    """
+    Adds the "X-Object-Type" and "X-Object-Id" headers to the given
+    HttpResponse according to the given model and object_id -- but only if the
+    given HttpRequest object has an IP address within the INTERNAL_IPS setting
+    or if the request is from a logged in staff member.
+    """
+    from django.conf import settings
+    if (request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS
+            or (hasattr(request, 'user') and request.user.is_authenticated()
+                and request.user.is_staff)):
+        response['X-Object-Type'] = "%s.%s" % (model._meta.app_label, model._meta.object_name.lower())
+        response['X-Object-Id'] = str(object_id)
diff --git a/webapp/django/db/__init__.py b/webapp/django/db/__init__.py
new file mode 100644
index 0000000..d15fd32
--- /dev/null
+++ b/webapp/django/db/__init__.py
@@ -0,0 +1,63 @@
+import os
+from django.conf import settings
+from django.core import signals
+from django.core.exceptions import ImproperlyConfigured
+from django.utils.functional import curry
+
+__all__ = ('backend', 'connection', 'DatabaseError', 'IntegrityError')
+
+if not settings.DATABASE_ENGINE:
+    settings.DATABASE_ENGINE = 'dummy'
+
+try:
+    # Most of the time, the database backend will be one of the official
+    # backends that ships with Django, so look there first.
+    _import_path = 'django.db.backends.'
+    backend = __import__('%s%s.base' % (_import_path, settings.DATABASE_ENGINE), {}, {}, [''])
+except ImportError, e:
+    # If the import failed, we might be looking for a database backend
+    # distributed external to Django. So we'll try that next.
+    try:
+        _import_path = ''
+        backend = __import__('%s.base' % settings.DATABASE_ENGINE, {}, {}, [''])
+    except ImportError, e_user:
+        # The database backend wasn't found. Display a helpful error message
+        # listing all possible (built-in) database backends.
+        backend_dir = os.path.join(__path__[0], 'backends')
+        try:
+            available_backends = [f for f in os.listdir(backend_dir) if not f.startswith('_') and not f.startswith('.') and not f.endswith('.py') and not f.endswith('.pyc')]
+        except EnvironmentError:
+            available_backends = []
+        available_backends.sort()
+        if settings.DATABASE_ENGINE not in available_backends:
+            raise ImproperlyConfigured, "%r isn't an available database backend. Available options are: %s\nError was: %s" % \
+                (settings.DATABASE_ENGINE, ", ".join(map(repr, available_backends)), e_user)
+        else:
+            raise # If there's some other error, this must be an error in Django itself.
+
+# Convenient aliases for backend bits.
+connection = backend.DatabaseWrapper(**settings.DATABASE_OPTIONS)
+DatabaseError = backend.DatabaseError
+IntegrityError = backend.IntegrityError
+
+# Register an event that closes the database connection
+# when a Django request is finished.
+def close_connection(**kwargs):
+    connection.close()
+signals.request_finished.connect(close_connection)
+
+# Register an event that resets connection.queries
+# when a Django request is started.
+def reset_queries(**kwargs):
+    connection.queries = []
+signals.request_started.connect(reset_queries)
+
+# Register an event that rolls back the connection
+# when a Django request has an exception.
+def _rollback_on_exception(**kwargs):
+    from django.db import transaction
+    try:
+        transaction.rollback_unless_managed()
+    except DatabaseError:
+        pass
+signals.got_request_exception.connect(_rollback_on_exception)
diff --git a/webapp/django/db/backends/__init__.py b/webapp/django/db/backends/__init__.py
new file mode 100644
index 0000000..074fa0e
--- /dev/null
+++ b/webapp/django/db/backends/__init__.py
@@ -0,0 +1,448 @@
+try:
+    # Only exists in Python 2.4+
+    from threading import local
+except ImportError:
+    # Import copy of _thread_local.py from Python 2.4
+    from django.utils._threading_local import local
+try:
+    set
+except NameError:
+    # Python 2.3 compat
+    from sets import Set as set
+
+from django.db.backends import util
+from django.utils import datetime_safe
+
+class BaseDatabaseWrapper(local):
+    """
+    Represents a database connection.
+    """
+    ops = None
+    def __init__(self, **kwargs):
+        self.connection = None
+        self.queries = []
+        self.options = kwargs
+
+    def _commit(self):
+        if self.connection is not None:
+            return self.connection.commit()
+
+    def _rollback(self):
+        if self.connection is not None:
+            return self.connection.rollback()
+
+    def _savepoint(self, sid):
+        if not self.features.uses_savepoints:
+            return
+        self.connection.cursor().execute(self.ops.savepoint_create_sql(sid))
+
+    def _savepoint_rollback(self, sid):
+        if not self.features.uses_savepoints:
+            return
+        self.connection.cursor().execute(self.ops.savepoint_rollback_sql(sid))
+
+    def _savepoint_commit(self, sid):
+        if not self.features.uses_savepoints:
+            return
+        self.connection.cursor().execute(self.ops.savepoint_commit_sql(sid))
+
+    def close(self):
+        if self.connection is not None:
+            self.connection.close()
+            self.connection = None
+
+    def cursor(self):
+        from django.conf import settings
+        cursor = self._cursor(settings)
+        if settings.DEBUG:
+            return self.make_debug_cursor(cursor)
+        return cursor
+
+    def make_debug_cursor(self, cursor):
+        return util.CursorDebugWrapper(cursor, self)
+
+class BaseDatabaseFeatures(object):
+    # True if django.db.backend.utils.typecast_timestamp is used on values
+    # returned from dates() calls.
+    needs_datetime_string_cast = True
+    uses_custom_query_class = False
+    empty_fetchmany_value = []
+    update_can_self_select = True
+    interprets_empty_strings_as_nulls = False
+    can_use_chunked_reads = True
+    uses_savepoints = False
+
+class BaseDatabaseOperations(object):
+    """
+    This class encapsulates all backend-specific differences, such as the way
+    a backend performs ordering or calculates the ID of a recently-inserted
+    row.
+    """
+    def autoinc_sql(self, table, column):
+        """
+        Returns any SQL needed to support auto-incrementing primary keys, or
+        None if no SQL is necessary.
+
+        This SQL is executed when a table is created.
+        """
+        return None
+
+    def date_extract_sql(self, lookup_type, field_name):
+        """
+        Given a lookup_type of 'year', 'month' or 'day', returns the SQL that
+        extracts a value from the given date field field_name.
+        """
+        raise NotImplementedError()
+
+    def date_trunc_sql(self, lookup_type, field_name):
+        """
+        Given a lookup_type of 'year', 'month' or 'day', returns the SQL that
+        truncates the given date field field_name to a DATE object with only
+        the given specificity.
+        """
+        raise NotImplementedError()
+
+    def datetime_cast_sql(self):
+        """
+        Returns the SQL necessary to cast a datetime value so that it will be
+        retrieved as a Python datetime object instead of a string.
+
+        This SQL should include a '%s' in place of the field's name.
+        """
+        return "%s"
+
+    def deferrable_sql(self):
+        """
+        Returns the SQL necessary to make a constraint "initially deferred"
+        during a CREATE TABLE statement.
+        """
+        return ''
+
+    def drop_foreignkey_sql(self):
+        """
+        Returns the SQL command that drops a foreign key.
+        """
+        return "DROP CONSTRAINT"
+
+    def drop_sequence_sql(self, table):
+        """
+        Returns any SQL necessary to drop the sequence for the given table.
+        Returns None if no SQL is necessary.
+        """
+        return None
+
+    def field_cast_sql(self, db_type):
+        """
+        Given a column type (e.g. 'BLOB', 'VARCHAR'), returns the SQL necessary
+        to cast it before using it in a WHERE statement. Note that the
+        resulting string should contain a '%s' placeholder for the column being
+        searched against.
+        """
+        return '%s'
+
+    def fulltext_search_sql(self, field_name):
+        """
+        Returns the SQL WHERE clause to use in order to perform a full-text
+        search of the given field_name. Note that the resulting string should
+        contain a '%s' placeholder for the value being searched against.
+        """
+        raise NotImplementedError('Full-text search is not implemented for this database backend')
+
+    def last_executed_query(self, cursor, sql, params):
+        """
+        Returns a string of the query last executed by the given cursor, with
+        placeholders replaced with actual values.
+
+        `sql` is the raw query containing placeholders, and `params` is the
+        sequence of parameters. These are used by default, but this method
+        exists for database backends to provide a better implementation
+        according to their own quoting schemes.
+        """
+        from django.utils.encoding import smart_unicode, force_unicode
+
+        # Convert params to contain Unicode values.
+        to_unicode = lambda s: force_unicode(s, strings_only=True)
+        if isinstance(params, (list, tuple)):
+            u_params = tuple([to_unicode(val) for val in params])
+        else:
+            u_params = dict([(to_unicode(k), to_unicode(v)) for k, v in params.items()])
+
+        return smart_unicode(sql) % u_params
+
+    def last_insert_id(self, cursor, table_name, pk_name):
+        """
+        Given a cursor object that has just performed an INSERT statement into
+        a table that has an auto-incrementing ID, returns the newly created ID.
+
+        This method also receives the table name and the name of the primary-key
+        column.
+        """
+        return cursor.lastrowid
+
+    def lookup_cast(self, lookup_type):
+        """
+        Returns the string to use in a query when performing lookups
+        ("contains", "like", etc). The resulting string should contain a '%s'
+        placeholder for the column being searched against.
+        """
+        return "%s"
+
+    def max_name_length(self):
+        """
+        Returns the maximum length of table and column names, or None if there
+        is no limit.
+        """
+        return None
+
+    def no_limit_value(self):
+        """
+        Returns the value to use for the LIMIT when we are wanting "LIMIT
+        infinity". Returns None if the limit clause can be omitted in this case.
+        """
+        # FIXME: API may need to change once Oracle backend is repaired.
+        raise NotImplementedError()
+
+    def pk_default_value(self):
+        """
+        Returns the value to use during an INSERT statement to specify that
+        the field should use its default value.
+        """
+        return 'DEFAULT'
+
+    def query_class(self, DefaultQueryClass):
+        """
+        Given the default Query class, returns a custom Query class
+        to use for this backend. Returns None if a custom Query isn't used.
+        See also BaseDatabaseFeatures.uses_custom_query_class, which regulates
+        whether this method is called at all.
+        """
+        return None
+
+    def quote_name(self, name):
+        """
+        Returns a quoted version of the given table, index or column name. Does
+        not quote the given name if it's already been quoted.
+        """
+        raise NotImplementedError()
+
+    def random_function_sql(self):
+        """
+        Returns a SQL expression that returns a random value.
+        """
+        return 'RANDOM()'
+
+    def regex_lookup(self, lookup_type):
+        """
+        Returns the string to use in a query when performing regular expression
+        lookups (using "regex" or "iregex"). The resulting string should
+        contain a '%s' placeholder for the column being searched against.
+
+        If the feature is not supported (or part of it is not supported), a
+        NotImplementedError exception can be raised.
+        """
+        raise NotImplementedError
+
+    def savepoint_create_sql(self, sid):
+        """
+        Returns the SQL for starting a new savepoint. Only required if the
+        "uses_savepoints" feature is True. The "sid" parameter is a string
+        for the savepoint id.
+        """
+        raise NotImplementedError
+
+    def savepoint_commit_sql(self, sid):
+        """
+        Returns the SQL for committing the given savepoint.
+        """
+        raise NotImplementedError
+
+    def savepoint_rollback_sql(self, sid):
+        """
+        Returns the SQL for rolling back the given savepoint.
+        """
+        raise NotImplementedError
+
+    def sql_flush(self, style, tables, sequences):
+        """
+        Returns a list of SQL statements required to remove all data from
+        the given database tables (without actually removing the tables
+        themselves).
+
+        The `style` argument is a Style object as returned by either
+        color_style() or no_style() in django.core.management.color.
+        """
+        raise NotImplementedError()
+
+    def sequence_reset_sql(self, style, model_list):
+        """
+        Returns a list of the SQL statements required to reset sequences for
+        the given models.
+
+        The `style` argument is a Style object as returned by either
+        color_style() or no_style() in django.core.management.color.
+        """
+        return [] # No sequence reset required by default.
+
+    def start_transaction_sql(self):
+        """
+        Returns the SQL statement required to start a transaction.
+        """
+        return "BEGIN;"
+
+    def sql_for_tablespace(self, tablespace, inline=False):
+        """
+        Returns the SQL that will be appended to tables or rows to define
+        a tablespace. Returns '' if the backend doesn't use tablespaces.
+        """
+        return ''
+
+    def prep_for_like_query(self, x):
+        """Prepares a value for use in a LIKE query."""
+        from django.utils.encoding import smart_unicode
+        return smart_unicode(x).replace("\\", "\\\\").replace("%", "\%").replace("_", "\_")
+
+    def value_to_db_date(self, value):
+        """
+        Transform a date value to an object compatible with what is expected
+        by the backend driver for date columns.
+        """
+        if value is None:
+            return None
+        return datetime_safe.new_date(value).strftime('%Y-%m-%d')
+
+    def value_to_db_datetime(self, value):
+        """
+        Transform a datetime value to an object compatible with what is expected
+        by the backend driver for datetime columns.
+        """
+        if value is None:
+            return None
+        return unicode(value)
+
+    def value_to_db_time(self, value):
+        """
+        Transform a datetime value to an object compatible with what is expected
+        by the backend driver for time columns.
+        """
+        if value is None:
+            return None
+        return unicode(value)
+
+    def value_to_db_decimal(self, value, max_digits, decimal_places):
+        """
+        Transform a decimal.Decimal value to an object compatible with what is
+        expected by the backend driver for decimal (numeric) columns.
+        """
+        if value is None:
+            return None
+        return util.format_number(value, max_digits, decimal_places)
+
+    def year_lookup_bounds(self, value):
+        """
+        Returns a two-elements list with the lower and upper bound to be used
+        with a BETWEEN operator to query a field value using a year lookup
+
+        `value` is an int, containing the looked-up year.
+        """
+        first = '%s-01-01 00:00:00'
+        second = '%s-12-31 23:59:59.999999'
+        return [first % value, second % value]
+
+    def year_lookup_bounds_for_date_field(self, value):
+        """
+        Returns a two-elements list with the lower and upper bound to be used
+        with a BETWEEN operator to query a DateField value using a year lookup
+
+        `value` is an int, containing the looked-up year.
+
+        By default, it just calls `self.year_lookup_bounds`. Some backends need
+        this hook because on their DB date fields can't be compared to values
+        which include a time part.
+        """
+        return self.year_lookup_bounds(value)
+
+class BaseDatabaseIntrospection(object):
+    """
+    This class encapsulates all backend-specific introspection utilities
+    """
+    data_types_reverse = {}
+
+    def __init__(self, connection):
+        self.connection = connection
+
+    def table_name_converter(self, name):
+        """Apply a conversion to the name for the purposes of comparison.
+
+        The default table name converter is for case sensitive comparison.
+        """
+        return name
+
+    def table_names(self):
+        "Returns a list of names of all tables that exist in the database."
+        cursor = self.connection.cursor()
+        return self.get_table_list(cursor)
+
+    def django_table_names(self, only_existing=False):
+        """
+        Returns a list of all table names that have associated Django models and
+        are in INSTALLED_APPS.
+
+        If only_existing is True, the resulting list will only include the tables
+        that actually exist in the database.
+        """
+        from django.db import models
+        tables = set()
+        for app in models.get_apps():
+            for model in models.get_models(app):
+                tables.add(model._meta.db_table)
+                tables.update([f.m2m_db_table() for f in model._meta.local_many_to_many])
+        if only_existing:
+            tables = [t for t in tables if t in self.table_names()]
+        return tables
+
+    def installed_models(self, tables):
+        "Returns a set of all models represented by the provided list of table names."
+        from django.db import models
+        all_models = []
+        for app in models.get_apps():
+            for model in models.get_models(app):
+                all_models.append(model)
+        return set([m for m in all_models
+            if self.table_name_converter(m._meta.db_table) in map(self.table_name_converter, tables)
+        ])
+
+    def sequence_list(self):
+        "Returns a list of information about all DB sequences for all models in all apps."
+        from django.db import models
+
+        apps = models.get_apps()
+        sequence_list = []
+
+        for app in apps:
+            for model in models.get_models(app):
+                for f in model._meta.local_fields:
+                    if isinstance(f, models.AutoField):
+                        sequence_list.append({'table': model._meta.db_table, 'column': f.column})
+                        break # Only one AutoField is allowed per model, so don't bother continuing.
+
+                for f in model._meta.local_many_to_many:
+                    sequence_list.append({'table': f.m2m_db_table(), 'column': None})
+
+        return sequence_list
+
+class BaseDatabaseClient(object):
+    """
+    This class encapsualtes all backend-specific methods for opening a
+    client shell
+    """
+    def runshell(self):
+        raise NotImplementedError()
+
+class BaseDatabaseValidation(object):
+    """
+    This class encapsualtes all backend-specific model validation.
+    """
+    def validate_field(self, errors, opts, f):
+        "By default, there is no backend-specific validation"
+        pass
+
diff --git a/webapp/django/db/backends/creation.py b/webapp/django/db/backends/creation.py
new file mode 100644
index 0000000..e746035
--- /dev/null
+++ b/webapp/django/db/backends/creation.py
@@ -0,0 +1,404 @@
+import sys
+import time
+try:
+    set
+except NameError:
+    # Python 2.3 compat
+    from sets import Set as set
+
+from django.conf import settings
+from django.core.management import call_command
+
+# The prefix to put on the default database name when creating
+# the test database.
+TEST_DATABASE_PREFIX = 'test_'
+
+class BaseDatabaseCreation(object):
+    """
+    This class encapsulates all backend-specific differences that pertain to
+    database *creation*, such as the column types to use for particular Django
+    Fields, the SQL used to create and destroy tables, and the creation and
+    destruction of test databases.
+    """
+    data_types = {}
+
+    def __init__(self, connection):
+        self.connection = connection
+
+    def sql_create_model(self, model, style, known_models=set()):
+        """
+        Returns the SQL required to create a single model, as a tuple of:
+            (list_of_sql, pending_references_dict)
+        """
+        from django.db import models
+
+        opts = model._meta
+        final_output = []
+        table_output = []
+        pending_references = {}
+        qn = self.connection.ops.quote_name
+        for f in opts.local_fields:
+            col_type = f.db_type()
+            tablespace = f.db_tablespace or opts.db_tablespace
+            if col_type is None:
+                # Skip ManyToManyFields, because they're not represented as
+                # database columns in this table.
+                continue
+            # Make the definition (e.g. 'foo VARCHAR(30)') for this field.
+            field_output = [style.SQL_FIELD(qn(f.column)),
+                style.SQL_COLTYPE(col_type)]
+            field_output.append(style.SQL_KEYWORD('%sNULL' % (not f.null and 'NOT ' or '')))
+            if f.primary_key:
+                field_output.append(style.SQL_KEYWORD('PRIMARY KEY'))
+            elif f.unique:
+                field_output.append(style.SQL_KEYWORD('UNIQUE'))
+            if tablespace and f.unique:
+                # We must specify the index tablespace inline, because we
+                # won't be generating a CREATE INDEX statement for this field.
+                field_output.append(self.connection.ops.tablespace_sql(tablespace, inline=True))
+            if f.rel:
+                ref_output, pending = self.sql_for_inline_foreign_key_references(f, known_models, style)
+                if pending:
+                    pr = pending_references.setdefault(f.rel.to, []).append((model, f))
+                else:
+                    field_output.extend(ref_output)
+            table_output.append(' '.join(field_output))
+        if opts.order_with_respect_to:
+            table_output.append(style.SQL_FIELD(qn('_order')) + ' ' + \
+                style.SQL_COLTYPE(models.IntegerField().db_type()) + ' ' + \
+                style.SQL_KEYWORD('NULL'))
+        for field_constraints in opts.unique_together:
+            table_output.append(style.SQL_KEYWORD('UNIQUE') + ' (%s)' % \
+                ", ".join([style.SQL_FIELD(qn(opts.get_field(f).column)) for f in field_constraints]))
+
+        full_statement = [style.SQL_KEYWORD('CREATE TABLE') + ' ' + style.SQL_TABLE(qn(opts.db_table)) + ' (']
+        for i, line in enumerate(table_output): # Combine and add commas.
+            full_statement.append('    %s%s' % (line, i < len(table_output)-1 and ',' or ''))
+        full_statement.append(')')
+        if opts.db_tablespace:
+            full_statement.append(self.connection.ops.tablespace_sql(opts.db_tablespace))
+        full_statement.append(';')
+        final_output.append('\n'.join(full_statement))
+
+        if opts.has_auto_field:
+            # Add any extra SQL needed to support auto-incrementing primary keys.
+            auto_column = opts.auto_field.db_column or opts.auto_field.name
+            autoinc_sql = self.connection.ops.autoinc_sql(opts.db_table, auto_column)
+            if autoinc_sql:
+                for stmt in autoinc_sql:
+                    final_output.append(stmt)
+
+        return final_output, pending_references
+
+    def sql_for_inline_foreign_key_references(self, field, known_models, style):
+        "Return the SQL snippet defining the foreign key reference for a field"
+        qn = self.connection.ops.quote_name
+        if field.rel.to in known_models:
+            output = [style.SQL_KEYWORD('REFERENCES') + ' ' + \
+                style.SQL_TABLE(qn(field.rel.to._meta.db_table)) + ' (' + \
+                style.SQL_FIELD(qn(field.rel.to._meta.get_field(field.rel.field_name).column)) + ')' +
+                self.connection.ops.deferrable_sql()
+            ]
+            pending = False
+        else:
+            # We haven't yet created the table to which this field
+            # is related, so save it for later.
+            output = []
+            pending = True
+
+        return output, pending
+
+    def sql_for_pending_references(self, model, style, pending_references):
+        "Returns any ALTER TABLE statements to add constraints after the fact."
+        from django.db.backends.util import truncate_name
+
+        qn = self.connection.ops.quote_name
+        final_output = []
+        opts = model._meta
+        if model in pending_references:
+            for rel_class, f in pending_references[model]:
+                rel_opts = rel_class._meta
+                r_table = rel_opts.db_table
+                r_col = f.column
+                table = opts.db_table
+                col = opts.get_field(f.rel.field_name).column
+                # For MySQL, r_name must be unique in the first 64 characters.
+                # So we are careful with character usage here.
+                r_name = '%s_refs_%s_%x' % (r_col, col, abs(hash((r_table, table))))
+                final_output.append(style.SQL_KEYWORD('ALTER TABLE') + ' %s ADD CONSTRAINT %s FOREIGN KEY (%s) REFERENCES %s (%s)%s;' % \
+                    (qn(r_table), truncate_name(r_name, self.connection.ops.max_name_length()),
+                    qn(r_col), qn(table), qn(col),
+                    self.connection.ops.deferrable_sql()))
+            del pending_references[model]
+        return final_output
+
+    def sql_for_many_to_many(self, model, style):
+        "Return the CREATE TABLE statments for all the many-to-many tables defined on a model"
+        output = []
+        for f in model._meta.local_many_to_many:
+            output.extend(self.sql_for_many_to_many_field(model, f, style))
+        return output
+
+    def sql_for_many_to_many_field(self, model, f, style):
+        "Return the CREATE TABLE statements for a single m2m field"
+        from django.db import models
+        from django.db.backends.util import truncate_name
+
+        output = []
+        if f.creates_table:
+            opts = model._meta
+            qn = self.connection.ops.quote_name
+            tablespace = f.db_tablespace or opts.db_tablespace
+            if tablespace:
+                sql = self.connection.ops.tablespace_sql(tablespace, inline=True)
+                if sql:
+                    tablespace_sql = ' ' + sql
+                else:
+                    tablespace_sql = ''
+            else:
+                tablespace_sql = ''
+            table_output = [style.SQL_KEYWORD('CREATE TABLE') + ' ' + \
+                style.SQL_TABLE(qn(f.m2m_db_table())) + ' (']
+            table_output.append('    %s %s %s%s,' %
+                (style.SQL_FIELD(qn('id')),
+                style.SQL_COLTYPE(models.AutoField(primary_key=True).db_type()),
+                style.SQL_KEYWORD('NOT NULL PRIMARY KEY'),
+                tablespace_sql))
+
+            deferred = []
+            inline_output, deferred = self.sql_for_inline_many_to_many_references(model, f, style)
+            table_output.extend(inline_output)
+
+            table_output.append('    %s (%s, %s)%s' %
+                (style.SQL_KEYWORD('UNIQUE'),
+                style.SQL_FIELD(qn(f.m2m_column_name())),
+                style.SQL_FIELD(qn(f.m2m_reverse_name())),
+                tablespace_sql))
+            table_output.append(')')
+            if opts.db_tablespace:
+                # f.db_tablespace is only for indices, so ignore its value here.
+                table_output.append(self.connection.ops.tablespace_sql(opts.db_tablespace))
+            table_output.append(';')
+            output.append('\n'.join(table_output))
+
+            for r_table, r_col, table, col in deferred:
+                r_name = '%s_refs_%s_%x' % (r_col, col,
+                        abs(hash((r_table, table))))
+                output.append(style.SQL_KEYWORD('ALTER TABLE') + ' %s ADD CONSTRAINT %s FOREIGN KEY (%s) REFERENCES %s (%s)%s;' %
+                (qn(r_table),
+                truncate_name(r_name, self.connection.ops.max_name_length()),
+                qn(r_col), qn(table), qn(col),
+                self.connection.ops.deferrable_sql()))
+
+            # Add any extra SQL needed to support auto-incrementing PKs
+            autoinc_sql = self.connection.ops.autoinc_sql(f.m2m_db_table(), 'id')
+            if autoinc_sql:
+                for stmt in autoinc_sql:
+                    output.append(stmt)
+        return output
+
+    def sql_for_inline_many_to_many_references(self, model, field, style):
+        "Create the references to other tables required by a many-to-many table"
+        from django.db import models
+        opts = model._meta
+        qn = self.connection.ops.quote_name
+
+        table_output = [
+            '    %s %s %s %s (%s)%s,' %
+                (style.SQL_FIELD(qn(field.m2m_column_name())),
+                style.SQL_COLTYPE(models.ForeignKey(model).db_type()),
+                style.SQL_KEYWORD('NOT NULL REFERENCES'),
+                style.SQL_TABLE(qn(opts.db_table)),
+                style.SQL_FIELD(qn(opts.pk.column)),
+                self.connection.ops.deferrable_sql()),
+            '    %s %s %s %s (%s)%s,' %
+                (style.SQL_FIELD(qn(field.m2m_reverse_name())),
+                style.SQL_COLTYPE(models.ForeignKey(field.rel.to).db_type()),
+                style.SQL_KEYWORD('NOT NULL REFERENCES'),
+                style.SQL_TABLE(qn(field.rel.to._meta.db_table)),
+                style.SQL_FIELD(qn(field.rel.to._meta.pk.column)),
+                self.connection.ops.deferrable_sql())
+        ]
+        deferred = []
+
+        return table_output, deferred
+
+    def sql_indexes_for_model(self, model, style):
+        "Returns the CREATE INDEX SQL statements for a single model"
+        output = []
+        for f in model._meta.local_fields:
+            output.extend(self.sql_indexes_for_field(model, f, style))
+        return output
+
+    def sql_indexes_for_field(self, model, f, style):
+        "Return the CREATE INDEX SQL statements for a single model field"
+        if f.db_index and not f.unique:
+            qn = self.connection.ops.quote_name
+            tablespace = f.db_tablespace or model._meta.db_tablespace
+            if tablespace:
+                sql = self.connection.ops.tablespace_sql(tablespace)
+                if sql:
+                    tablespace_sql = ' ' + sql
+                else:
+                    tablespace_sql = ''
+            else:
+                tablespace_sql = ''
+            output = [style.SQL_KEYWORD('CREATE INDEX') + ' ' +
+                style.SQL_TABLE(qn('%s_%s' % (model._meta.db_table, f.column))) + ' ' +
+                style.SQL_KEYWORD('ON') + ' ' +
+                style.SQL_TABLE(qn(model._meta.db_table)) + ' ' +
+                "(%s)" % style.SQL_FIELD(qn(f.column)) +
+                "%s;" % tablespace_sql]
+        else:
+            output = []
+        return output
+
+    def sql_destroy_model(self, model, references_to_delete, style):
+        "Return the DROP TABLE and restraint dropping statements for a single model"
+        # Drop the table now
+        qn = self.connection.ops.quote_name
+        output = ['%s %s;' % (style.SQL_KEYWORD('DROP TABLE'),
+                              style.SQL_TABLE(qn(model._meta.db_table)))]
+        if model in references_to_delete:
+            output.extend(self.sql_remove_table_constraints(model, references_to_delete, style))
+
+        if model._meta.has_auto_field:
+            ds = self.connection.ops.drop_sequence_sql(model._meta.db_table)
+            if ds:
+                output.append(ds)
+        return output
+
+    def sql_remove_table_constraints(self, model, references_to_delete, style):
+        from django.db.backends.util import truncate_name
+
+        output = []
+        qn = self.connection.ops.quote_name
+        for rel_class, f in references_to_delete[model]:
+            table = rel_class._meta.db_table
+            col = f.column
+            r_table = model._meta.db_table
+            r_col = model._meta.get_field(f.rel.field_name).column
+            r_name = '%s_refs_%s_%x' % (col, r_col, abs(hash((table, r_table))))
+            output.append('%s %s %s %s;' % \
+                (style.SQL_KEYWORD('ALTER TABLE'),
+                style.SQL_TABLE(qn(table)),
+                style.SQL_KEYWORD(self.connection.ops.drop_foreignkey_sql()),
+                style.SQL_FIELD(truncate_name(r_name, self.connection.ops.max_name_length()))))
+        del references_to_delete[model]
+        return output
+
+    def sql_destroy_many_to_many(self, model, f, style):
+        "Returns the DROP TABLE statements for a single m2m field"
+        qn = self.connection.ops.quote_name
+        output = []
+        if f.creates_table:
+            output.append("%s %s;" % (style.SQL_KEYWORD('DROP TABLE'),
+                style.SQL_TABLE(qn(f.m2m_db_table()))))
+            ds = self.connection.ops.drop_sequence_sql("%s_%s" % (model._meta.db_table, f.column))
+            if ds:
+                output.append(ds)
+        return output
+
+    def create_test_db(self, verbosity=1, autoclobber=False):
+        """
+        Creates a test database, prompting the user for confirmation if the
+        database already exists. Returns the name of the test database created.
+        """
+        if verbosity >= 1:
+            print "Creating test database..."
+
+        test_database_name = self._create_test_db(verbosity, autoclobber)
+
+        self.connection.close()
+        settings.DATABASE_NAME = test_database_name
+
+        call_command('syncdb', verbosity=verbosity, interactive=False)
+
+        if settings.CACHE_BACKEND.startswith('db://'):
+            cache_name = settings.CACHE_BACKEND[len('db://'):]
+            call_command('createcachetable', cache_name)
+
+        # Get a cursor (even though we don't need one yet). This has
+        # the side effect of initializing the test database.
+        cursor = self.connection.cursor()
+
+        return test_database_name
+
+    def _create_test_db(self, verbosity, autoclobber):
+        "Internal implementation - creates the test db tables."
+        suffix = self.sql_table_creation_suffix()
+
+        if settings.TEST_DATABASE_NAME:
+            test_database_name = settings.TEST_DATABASE_NAME
+        else:
+            test_database_name = TEST_DATABASE_PREFIX + settings.DATABASE_NAME
+
+        qn = self.connection.ops.quote_name
+
+        # Create the test database and connect to it. We need to autocommit
+        # if the database supports it because PostgreSQL doesn't allow
+        # CREATE/DROP DATABASE statements within transactions.
+        cursor = self.connection.cursor()
+        self.set_autocommit()
+        try:
+            cursor.execute("CREATE DATABASE %s %s" % (qn(test_database_name), suffix))
+        except Exception, e:
+            sys.stderr.write("Got an error creating the test database: %s\n" % e)
+            if not autoclobber:
+                confirm = raw_input("Type 'yes' if you would like to try deleting the test database '%s', or 'no' to cancel: " % test_database_name)
+            if autoclobber or confirm == 'yes':
+                try:
+                    if verbosity >= 1:
+                        print "Destroying old test database..."
+                    cursor.execute("DROP DATABASE %s" % qn(test_database_name))
+                    if verbosity >= 1:
+                        print "Creating test database..."
+                    cursor.execute("CREATE DATABASE %s %s" % (qn(test_database_name), suffix))
+                except Exception, e:
+                    sys.stderr.write("Got an error recreating the test database: %s\n" % e)
+                    sys.exit(2)
+            else:
+                print "Tests cancelled."
+                sys.exit(1)
+
+        return test_database_name
+
+    def destroy_test_db(self, old_database_name, verbosity=1):
+        """
+        Destroy a test database, prompting the user for confirmation if the
+        database already exists. Returns the name of the test database created.
+        """
+        if verbosity >= 1:
+            print "Destroying test database..."
+        self.connection.close()
+        test_database_name = settings.DATABASE_NAME
+        settings.DATABASE_NAME = old_database_name
+
+        self._destroy_test_db(test_database_name, verbosity)
+
+    def _destroy_test_db(self, test_database_name, verbosity):
+        "Internal implementation - remove the test db tables."
+        # Remove the test database to clean up after
+        # ourselves. Connect to the previous database (not the test database)
+        # to do so, because it's not allowed to delete a database while being
+        # connected to it.
+        cursor = self.connection.cursor()
+        self.set_autocommit()
+        time.sleep(1) # To avoid "database is being accessed by other users" errors.
+        cursor.execute("DROP DATABASE %s" % self.connection.ops.quote_name(test_database_name))
+        self.connection.close()
+
+    def set_autocommit(self):
+        "Make sure a connection is in autocommit mode."
+        if hasattr(self.connection.connection, "autocommit"):
+            if callable(self.connection.connection.autocommit):
+                self.connection.connection.autocommit(True)
+            else:
+                self.connection.connection.autocommit = True
+        elif hasattr(self.connection.connection, "set_isolation_level"):
+            self.connection.connection.set_isolation_level(0)
+
+    def sql_table_creation_suffix(self):
+        "SQL to append to the end of the test table creation statements"
+        return ''
+
diff --git a/webapp/django/db/backends/dummy/__init__.py b/webapp/django/db/backends/dummy/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/db/backends/dummy/__init__.py
diff --git a/webapp/django/db/backends/dummy/base.py b/webapp/django/db/backends/dummy/base.py
new file mode 100644
index 0000000..530ea9c
--- /dev/null
+++ b/webapp/django/db/backends/dummy/base.py
@@ -0,0 +1,55 @@
+"""
+Dummy database backend for Django.
+
+Django uses this if the DATABASE_ENGINE setting is empty (None or empty string).
+
+Each of these API functions, except connection.close(), raises
+ImproperlyConfigured.
+"""
+
+from django.core.exceptions import ImproperlyConfigured
+from django.db.backends import *
+from django.db.backends.creation import BaseDatabaseCreation
+
+def complain(*args, **kwargs):
+    raise ImproperlyConfigured, "You haven't set the DATABASE_ENGINE setting yet."
+
+def ignore(*args, **kwargs):
+    pass
+
+class DatabaseError(Exception):
+    pass
+
+class IntegrityError(DatabaseError):
+    pass
+
+class DatabaseOperations(BaseDatabaseOperations):
+    quote_name = complain
+
+class DatabaseClient(BaseDatabaseClient):
+    runshell = complain
+    
+class DatabaseIntrospection(BaseDatabaseIntrospection):
+    get_table_list = complain
+    get_table_description = complain
+    get_relations = complain
+    get_indexes = complain
+    
+class DatabaseWrapper(object):    
+    operators = {}
+    cursor = complain
+    _commit = complain
+    _rollback = ignore
+
+    def __init__(self, *args, **kwargs):
+        super(DatabaseWrapper, self).__init__(*args, **kwargs)
+
+        self.features = BaseDatabaseFeatures()
+        self.ops = DatabaseOperations()
+        self.client = DatabaseClient()
+        self.creation = BaseDatabaseCreation(self)
+        self.introspection = DatabaseIntrospection(self)
+        self.validation = BaseDatabaseValidation()
+
+    def close(self):
+        pass
diff --git a/webapp/django/db/backends/mysql/__init__.py b/webapp/django/db/backends/mysql/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/db/backends/mysql/__init__.py
diff --git a/webapp/django/db/backends/mysql/base.py b/webapp/django/db/backends/mysql/base.py
new file mode 100644
index 0000000..07fb700
--- /dev/null
+++ b/webapp/django/db/backends/mysql/base.py
@@ -0,0 +1,227 @@
+"""
+MySQL database backend for Django.
+
+Requires MySQLdb: http://sourceforge.net/projects/mysql-python
+"""
+
+import re
+
+try:
+    import MySQLdb as Database
+except ImportError, e:
+    from django.core.exceptions import ImproperlyConfigured
+    raise ImproperlyConfigured("Error loading MySQLdb module: %s" % e)
+
+# We want version (1, 2, 1, 'final', 2) or later. We can't just use
+# lexicographic ordering in this check because then (1, 2, 1, 'gamma')
+# inadvertently passes the version test.
+version = Database.version_info
+if (version < (1,2,1) or (version[:3] == (1, 2, 1) and
+        (len(version) < 5 or version[3] != 'final' or version[4] < 2))):
+    from django.core.exceptions import ImproperlyConfigured
+    raise ImproperlyConfigured("MySQLdb-1.2.1p2 or newer is required; you have %s" % Database.__version__)
+
+from MySQLdb.converters import conversions
+from MySQLdb.constants import FIELD_TYPE, FLAG
+
+from django.db.backends import *
+from django.db.backends.mysql.client import DatabaseClient
+from django.db.backends.mysql.creation import DatabaseCreation
+from django.db.backends.mysql.introspection import DatabaseIntrospection
+from django.db.backends.mysql.validation import DatabaseValidation
+
+# Raise exceptions for database warnings if DEBUG is on
+from django.conf import settings
+if settings.DEBUG:
+    from warnings import filterwarnings
+    filterwarnings("error", category=Database.Warning)
+
+DatabaseError = Database.DatabaseError
+IntegrityError = Database.IntegrityError
+
+# MySQLdb-1.2.1 supports the Python boolean type, and only uses datetime
+# module for time-related columns; older versions could have used mx.DateTime
+# or strings if there were no datetime module. However, MySQLdb still returns
+# TIME columns as timedelta -- they are more like timedelta in terms of actual
+# behavior as they are signed and include days -- and Django expects time, so
+# we still need to override that.
+django_conversions = conversions.copy()
+django_conversions.update({
+    FIELD_TYPE.TIME: util.typecast_time,
+    FIELD_TYPE.DECIMAL: util.typecast_decimal,
+    FIELD_TYPE.NEWDECIMAL: util.typecast_decimal,
+})
+
+# This should match the numerical portion of the version numbers (we can treat
+# versions like 5.0.24 and 5.0.24a as the same). Based on the list of version
+# at http://dev.mysql.com/doc/refman/4.1/en/news.html and
+# http://dev.mysql.com/doc/refman/5.0/en/news.html .
+server_version_re = re.compile(r'(\d{1,2})\.(\d{1,2})\.(\d{1,2})')
+
+# MySQLdb-1.2.1 and newer automatically makes use of SHOW WARNINGS on
+# MySQL-4.1 and newer, so the MysqlDebugWrapper is unnecessary. Since the
+# point is to raise Warnings as exceptions, this can be done with the Python
+# warning module, and this is setup when the connection is created, and the
+# standard util.CursorDebugWrapper can be used. Also, using sql_mode
+# TRADITIONAL will automatically cause most warnings to be treated as errors.
+
+class DatabaseFeatures(BaseDatabaseFeatures):
+    empty_fetchmany_value = ()
+    update_can_self_select = False
+
+class DatabaseOperations(BaseDatabaseOperations):
+    def date_extract_sql(self, lookup_type, field_name):
+        # http://dev.mysql.com/doc/mysql/en/date-and-time-functions.html
+        return "EXTRACT(%s FROM %s)" % (lookup_type.upper(), field_name)
+
+    def date_trunc_sql(self, lookup_type, field_name):
+        fields = ['year', 'month', 'day', 'hour', 'minute', 'second']
+        format = ('%%Y-', '%%m', '-%%d', ' %%H:', '%%i', ':%%s') # Use double percents to escape.
+        format_def = ('0000-', '01', '-01', ' 00:', '00', ':00')
+        try:
+            i = fields.index(lookup_type) + 1
+        except ValueError:
+            sql = field_name
+        else:
+            format_str = ''.join([f for f in format[:i]] + [f for f in format_def[i:]])
+            sql = "CAST(DATE_FORMAT(%s, '%s') AS DATETIME)" % (field_name, format_str)
+        return sql
+
+    def drop_foreignkey_sql(self):
+        return "DROP FOREIGN KEY"
+
+    def fulltext_search_sql(self, field_name):
+        return 'MATCH (%s) AGAINST (%%s IN BOOLEAN MODE)' % field_name
+
+    def no_limit_value(self):
+        # 2**64 - 1, as recommended by the MySQL documentation
+        return 18446744073709551615L
+
+    def quote_name(self, name):
+        if name.startswith("`") and name.endswith("`"):
+            return name # Quoting once is enough.
+        return "`%s`" % name
+
+    def random_function_sql(self):
+        return 'RAND()'
+
+    def sql_flush(self, style, tables, sequences):
+        # NB: The generated SQL below is specific to MySQL
+        # 'TRUNCATE x;', 'TRUNCATE y;', 'TRUNCATE z;'... style SQL statements
+        # to clear all tables of all data
+        if tables:
+            sql = ['SET FOREIGN_KEY_CHECKS = 0;']
+            for table in tables:
+                sql.append('%s %s;' % (style.SQL_KEYWORD('TRUNCATE'), style.SQL_FIELD(self.quote_name(table))))
+            sql.append('SET FOREIGN_KEY_CHECKS = 1;')
+
+            # 'ALTER TABLE table AUTO_INCREMENT = 1;'... style SQL statements
+            # to reset sequence indices
+            sql.extend(["%s %s %s %s %s;" % \
+                (style.SQL_KEYWORD('ALTER'),
+                 style.SQL_KEYWORD('TABLE'),
+                 style.SQL_TABLE(self.quote_name(sequence['table'])),
+                 style.SQL_KEYWORD('AUTO_INCREMENT'),
+                 style.SQL_FIELD('= 1'),
+                ) for sequence in sequences])
+            return sql
+        else:
+            return []
+
+    def value_to_db_datetime(self, value):
+        # MySQL doesn't support microseconds
+        if value is None:
+            return None
+        return unicode(value.replace(microsecond=0))
+
+    def value_to_db_time(self, value):
+        # MySQL doesn't support microseconds
+        if value is None:
+            return None
+        return unicode(value.replace(microsecond=0))
+
+    def year_lookup_bounds(self, value):
+        # Again, no microseconds
+        first = '%s-01-01 00:00:00'
+        second = '%s-12-31 23:59:59.99'
+        return [first % value, second % value]
+
+class DatabaseWrapper(BaseDatabaseWrapper):
+
+    operators = {
+        'exact': '= %s',
+        'iexact': 'LIKE %s',
+        'contains': 'LIKE BINARY %s',
+        'icontains': 'LIKE %s',
+        'regex': 'REGEXP BINARY %s',
+        'iregex': 'REGEXP %s',
+        'gt': '> %s',
+        'gte': '>= %s',
+        'lt': '< %s',
+        'lte': '<= %s',
+        'startswith': 'LIKE BINARY %s',
+        'endswith': 'LIKE BINARY %s',
+        'istartswith': 'LIKE %s',
+        'iendswith': 'LIKE %s',
+    }
+
+    def __init__(self, **kwargs):
+        super(DatabaseWrapper, self).__init__(**kwargs)
+        self.server_version = None
+
+        self.features = DatabaseFeatures()
+        self.ops = DatabaseOperations()
+        self.client = DatabaseClient()
+        self.creation = DatabaseCreation(self)
+        self.introspection = DatabaseIntrospection(self)
+        self.validation = DatabaseValidation()
+
+    def _valid_connection(self):
+        if self.connection is not None:
+            try:
+                self.connection.ping()
+                return True
+            except DatabaseError:
+                self.connection.close()
+                self.connection = None
+        return False
+
+    def _cursor(self, settings):
+        if not self._valid_connection():
+            kwargs = {
+                'conv': django_conversions,
+                'charset': 'utf8',
+                'use_unicode': True,
+            }
+            if settings.DATABASE_USER:
+                kwargs['user'] = settings.DATABASE_USER
+            if settings.DATABASE_NAME:
+                kwargs['db'] = settings.DATABASE_NAME
+            if settings.DATABASE_PASSWORD:
+                kwargs['passwd'] = settings.DATABASE_PASSWORD
+            if settings.DATABASE_HOST.startswith('/'):
+                kwargs['unix_socket'] = settings.DATABASE_HOST
+            elif settings.DATABASE_HOST:
+                kwargs['host'] = settings.DATABASE_HOST
+            if settings.DATABASE_PORT:
+                kwargs['port'] = int(settings.DATABASE_PORT)
+            kwargs.update(self.options)
+            self.connection = Database.connect(**kwargs)
+        cursor = self.connection.cursor()
+        return cursor
+
+    def _rollback(self):
+        try:
+            BaseDatabaseWrapper._rollback(self)
+        except Database.NotSupportedError:
+            pass
+
+    def get_server_version(self):
+        if not self.server_version:
+            if not self._valid_connection():
+                self.cursor()
+            m = server_version_re.match(self.connection.get_server_info())
+            if not m:
+                raise Exception('Unable to determine MySQL version from version string %r' % self.connection.get_server_info())
+            self.server_version = tuple([int(x) for x in m.groups()])
+        return self.server_version
diff --git a/webapp/django/db/backends/mysql/client.py b/webapp/django/db/backends/mysql/client.py
new file mode 100644
index 0000000..2475886
--- /dev/null
+++ b/webapp/django/db/backends/mysql/client.py
@@ -0,0 +1,29 @@
+from django.db.backends import BaseDatabaseClient
+from django.conf import settings
+import os
+
+class DatabaseClient(BaseDatabaseClient):
+    def runshell(self):
+        args = ['']
+        db = settings.DATABASE_OPTIONS.get('db', settings.DATABASE_NAME)
+        user = settings.DATABASE_OPTIONS.get('user', settings.DATABASE_USER)
+        passwd = settings.DATABASE_OPTIONS.get('passwd', settings.DATABASE_PASSWORD)
+        host = settings.DATABASE_OPTIONS.get('host', settings.DATABASE_HOST)
+        port = settings.DATABASE_OPTIONS.get('port', settings.DATABASE_PORT)
+        defaults_file = settings.DATABASE_OPTIONS.get('read_default_file')
+        # Seems to be no good way to set sql_mode with CLI
+    
+        if defaults_file:
+            args += ["--defaults-file=%s" % defaults_file]
+        if user:
+            args += ["--user=%s" % user]
+        if passwd:
+            args += ["--password=%s" % passwd]
+        if host:
+            args += ["--host=%s" % host]
+        if port:
+            args += ["--port=%s" % port]
+        if db:
+            args += [db]
+
+        os.execvp('mysql', args)
diff --git a/webapp/django/db/backends/mysql/creation.py b/webapp/django/db/backends/mysql/creation.py
new file mode 100644
index 0000000..96faaac
--- /dev/null
+++ b/webapp/django/db/backends/mysql/creation.py
@@ -0,0 +1,68 @@
+from django.conf import settings
+from django.db.backends.creation import BaseDatabaseCreation
+
+class DatabaseCreation(BaseDatabaseCreation):
+    # This dictionary maps Field objects to their associated MySQL column
+    # types, as strings. Column-type strings can contain format strings; they'll
+    # be interpolated against the values of Field.__dict__ before being output.
+    # If a column type is set to None, it won't be included in the output.
+    data_types = {
+        'AutoField':         'integer AUTO_INCREMENT',
+        'BooleanField':      'bool',
+        'CharField':         'varchar(%(max_length)s)',
+        'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
+        'DateField':         'date',
+        'DateTimeField':     'datetime',
+        'DecimalField':      'numeric(%(max_digits)s, %(decimal_places)s)',
+        'FileField':         'varchar(%(max_length)s)',
+        'FilePathField':     'varchar(%(max_length)s)',
+        'FloatField':        'double precision',
+        'IntegerField':      'integer',
+        'IPAddressField':    'char(15)',
+        'NullBooleanField':  'bool',
+        'OneToOneField':     'integer',
+        'PhoneNumberField':  'varchar(20)',
+        'PositiveIntegerField': 'integer UNSIGNED',
+        'PositiveSmallIntegerField': 'smallint UNSIGNED',
+        'SlugField':         'varchar(%(max_length)s)',
+        'SmallIntegerField': 'smallint',
+        'TextField':         'longtext',
+        'TimeField':         'time',
+        'USStateField':      'varchar(2)',
+    }
+
+    def sql_table_creation_suffix(self):
+        suffix = []
+        if settings.TEST_DATABASE_CHARSET:
+            suffix.append('CHARACTER SET %s' % settings.TEST_DATABASE_CHARSET)
+        if settings.TEST_DATABASE_COLLATION:
+            suffix.append('COLLATE %s' % settings.TEST_DATABASE_COLLATION)
+        return ' '.join(suffix)
+
+    def sql_for_inline_foreign_key_references(self, field, known_models, style):
+        "All inline references are pending under MySQL"
+        return [], True
+        
+    def sql_for_inline_many_to_many_references(self, model, field, style):
+        from django.db import models
+        opts = model._meta
+        qn = self.connection.ops.quote_name
+        
+        table_output = [
+            '    %s %s %s,' %
+                (style.SQL_FIELD(qn(field.m2m_column_name())),
+                style.SQL_COLTYPE(models.ForeignKey(model).db_type()),
+                style.SQL_KEYWORD('NOT NULL')),
+            '    %s %s %s,' %
+            (style.SQL_FIELD(qn(field.m2m_reverse_name())),
+            style.SQL_COLTYPE(models.ForeignKey(field.rel.to).db_type()),
+            style.SQL_KEYWORD('NOT NULL'))
+        ]
+        deferred = [
+            (field.m2m_db_table(), field.m2m_column_name(), opts.db_table,
+                opts.pk.column),
+            (field.m2m_db_table(), field.m2m_reverse_name(),
+                field.rel.to._meta.db_table, field.rel.to._meta.pk.column)
+            ]
+        return table_output, deferred
+        
\ No newline at end of file
diff --git a/webapp/django/db/backends/mysql/introspection.py b/webapp/django/db/backends/mysql/introspection.py
new file mode 100644
index 0000000..d8d59b7
--- /dev/null
+++ b/webapp/django/db/backends/mysql/introspection.py
@@ -0,0 +1,98 @@
+from django.db.backends import BaseDatabaseIntrospection
+from MySQLdb import ProgrammingError, OperationalError
+from MySQLdb.constants import FIELD_TYPE
+import re
+
+foreign_key_re = re.compile(r"\sCONSTRAINT `[^`]*` FOREIGN KEY \(`([^`]*)`\) REFERENCES `([^`]*)` \(`([^`]*)`\)")
+
+class DatabaseIntrospection(BaseDatabaseIntrospection):
+    data_types_reverse = {
+        FIELD_TYPE.BLOB: 'TextField',
+        FIELD_TYPE.CHAR: 'CharField',
+        FIELD_TYPE.DECIMAL: 'DecimalField',
+        FIELD_TYPE.NEWDECIMAL: 'DecimalField',
+        FIELD_TYPE.DATE: 'DateField',
+        FIELD_TYPE.DATETIME: 'DateTimeField',
+        FIELD_TYPE.DOUBLE: 'FloatField',
+        FIELD_TYPE.FLOAT: 'FloatField',
+        FIELD_TYPE.INT24: 'IntegerField',
+        FIELD_TYPE.LONG: 'IntegerField',
+        FIELD_TYPE.LONGLONG: 'IntegerField',
+        FIELD_TYPE.SHORT: 'IntegerField',
+        FIELD_TYPE.STRING: 'CharField',
+        FIELD_TYPE.TIMESTAMP: 'DateTimeField',
+        FIELD_TYPE.TINY: 'IntegerField',
+        FIELD_TYPE.TINY_BLOB: 'TextField',
+        FIELD_TYPE.MEDIUM_BLOB: 'TextField',
+        FIELD_TYPE.LONG_BLOB: 'TextField',
+        FIELD_TYPE.VAR_STRING: 'CharField',
+    }
+
+    def get_table_list(self, cursor):
+        "Returns a list of table names in the current database."
+        cursor.execute("SHOW TABLES")
+        return [row[0] for row in cursor.fetchall()]
+
+    def get_table_description(self, cursor, table_name):
+        "Returns a description of the table, with the DB-API cursor.description interface."
+        cursor.execute("SELECT * FROM %s LIMIT 1" % self.connection.ops.quote_name(table_name))
+        return cursor.description
+
+    def _name_to_index(self, cursor, table_name):
+        """
+        Returns a dictionary of {field_name: field_index} for the given table.
+        Indexes are 0-based.
+        """
+        return dict([(d[0], i) for i, d in enumerate(self.get_table_description(cursor, table_name))])
+
+    def get_relations(self, cursor, table_name):
+        """
+        Returns a dictionary of {field_index: (field_index_other_table, other_table)}
+        representing all relationships to the given table. Indexes are 0-based.
+        """
+        my_field_dict = self._name_to_index(cursor, table_name)
+        constraints = []
+        relations = {}
+        try:
+            # This should work for MySQL 5.0.
+            cursor.execute("""
+                SELECT column_name, referenced_table_name, referenced_column_name
+                FROM information_schema.key_column_usage
+                WHERE table_name = %s
+                    AND table_schema = DATABASE()
+                    AND referenced_table_name IS NOT NULL
+                    AND referenced_column_name IS NOT NULL""", [table_name])
+            constraints.extend(cursor.fetchall())
+        except (ProgrammingError, OperationalError):
+            # Fall back to "SHOW CREATE TABLE", for previous MySQL versions.
+            # Go through all constraints and save the equal matches.
+            cursor.execute("SHOW CREATE TABLE %s" % self.connection.ops.quote_name(table_name))
+            for row in cursor.fetchall():
+                pos = 0
+                while True:
+                    match = foreign_key_re.search(row[1], pos)
+                    if match == None:
+                        break
+                    pos = match.end()
+                    constraints.append(match.groups())
+
+        for my_fieldname, other_table, other_field in constraints:
+            other_field_index = self._name_to_index(cursor, other_table)[other_field]
+            my_field_index = my_field_dict[my_fieldname]
+            relations[my_field_index] = (other_field_index, other_table)
+
+        return relations
+
+    def get_indexes(self, cursor, table_name):
+        """
+        Returns a dictionary of fieldname -> infodict for the given table,
+        where each infodict is in the format:
+            {'primary_key': boolean representing whether it's the primary key,
+             'unique': boolean representing whether it's a unique index}
+        """
+        cursor.execute("SHOW INDEX FROM %s" % self.connection.ops.quote_name(table_name))
+        indexes = {}
+        for row in cursor.fetchall():
+            indexes[row[4]] = {'primary_key': (row[2] == 'PRIMARY'), 'unique': not bool(row[1])}
+        return indexes
+
diff --git a/webapp/django/db/backends/mysql/validation.py b/webapp/django/db/backends/mysql/validation.py
new file mode 100644
index 0000000..85354a8
--- /dev/null
+++ b/webapp/django/db/backends/mysql/validation.py
@@ -0,0 +1,13 @@
+from django.db.backends import BaseDatabaseValidation
+
+class DatabaseValidation(BaseDatabaseValidation):
+    def validate_field(self, errors, opts, f):
+        "Prior to MySQL 5.0.3, character fields could not exceed 255 characters"
+        from django.db import models
+        from django.db import connection
+        db_version = connection.get_server_version()
+        if db_version < (5, 0, 3) and isinstance(f, (models.CharField, models.CommaSeparatedIntegerField, models.SlugField)) and f.max_length > 255:
+            errors.add(opts,
+                '"%s": %s cannot have a "max_length" greater than 255 when you are using a version of MySQL prior to 5.0.3 (you are using %s).' % 
+                (f.name, f.__class__.__name__, '.'.join([str(n) for n in db_version[:3]])))
+    
\ No newline at end of file
diff --git a/webapp/django/db/backends/oracle/__init__.py b/webapp/django/db/backends/oracle/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/db/backends/oracle/__init__.py
diff --git a/webapp/django/db/backends/oracle/base.py b/webapp/django/db/backends/oracle/base.py
new file mode 100644
index 0000000..b8bc6d0
--- /dev/null
+++ b/webapp/django/db/backends/oracle/base.py
@@ -0,0 +1,425 @@
+"""
+Oracle database backend for Django.
+
+Requires cx_Oracle: http://www.python.net/crew/atuining/cx_Oracle/
+"""
+
+import os
+import datetime
+import time
+
+# Oracle takes client-side character set encoding from the environment.
+os.environ['NLS_LANG'] = '.UTF8'
+try:
+    import cx_Oracle as Database
+except ImportError, e:
+    from django.core.exceptions import ImproperlyConfigured
+    raise ImproperlyConfigured("Error loading cx_Oracle module: %s" % e)
+
+from django.db.backends import *
+from django.db.backends.oracle import query
+from django.db.backends.oracle.client import DatabaseClient
+from django.db.backends.oracle.creation import DatabaseCreation
+from django.db.backends.oracle.introspection import DatabaseIntrospection
+from django.utils.encoding import smart_str, force_unicode
+
+DatabaseError = Database.Error
+IntegrityError = Database.IntegrityError
+
+
+class DatabaseFeatures(BaseDatabaseFeatures):
+    empty_fetchmany_value = ()
+    needs_datetime_string_cast = False
+    uses_custom_query_class = True
+    interprets_empty_strings_as_nulls = True
+
+
+class DatabaseOperations(BaseDatabaseOperations):
+    def autoinc_sql(self, table, column):
+        # To simulate auto-incrementing primary keys in Oracle, we have to
+        # create a sequence and a trigger.
+        sq_name = get_sequence_name(table)
+        tr_name = get_trigger_name(table)
+        tbl_name = self.quote_name(table)
+        col_name = self.quote_name(column)
+        sequence_sql = """
+            DECLARE
+                i INTEGER;
+            BEGIN
+                SELECT COUNT(*) INTO i FROM USER_CATALOG
+                    WHERE TABLE_NAME = '%(sq_name)s' AND TABLE_TYPE = 'SEQUENCE';
+                IF i = 0 THEN
+                    EXECUTE IMMEDIATE 'CREATE SEQUENCE %(sq_name)s';
+                END IF;
+            END;
+            /""" % locals()
+        trigger_sql = """
+            CREATE OR REPLACE TRIGGER %(tr_name)s
+            BEFORE INSERT ON %(tbl_name)s
+            FOR EACH ROW
+            WHEN (new.%(col_name)s IS NULL)
+                BEGIN
+                    SELECT %(sq_name)s.nextval
+                    INTO :new.%(col_name)s FROM dual;
+                END;
+                /""" % locals()
+        return sequence_sql, trigger_sql
+
+    def date_extract_sql(self, lookup_type, field_name):
+        # http://download-east.oracle.com/docs/cd/B10501_01/server.920/a96540/functions42a.htm#1017163
+        return "EXTRACT(%s FROM %s)" % (lookup_type, field_name)
+
+    def date_trunc_sql(self, lookup_type, field_name):
+        # Oracle uses TRUNC() for both dates and numbers.
+        # http://download-east.oracle.com/docs/cd/B10501_01/server.920/a96540/functions155a.htm#SQLRF06151
+        if lookup_type == 'day':
+            sql = 'TRUNC(%s)' % field_name
+        else:
+            sql = "TRUNC(%s, '%s')" % (field_name, lookup_type)
+        return sql
+
+    def datetime_cast_sql(self):
+        return "TO_TIMESTAMP(%s, 'YYYY-MM-DD HH24:MI:SS.FF')"
+
+    def deferrable_sql(self):
+        return " DEFERRABLE INITIALLY DEFERRED"
+
+    def drop_sequence_sql(self, table):
+        return "DROP SEQUENCE %s;" % self.quote_name(get_sequence_name(table))
+
+    def field_cast_sql(self, db_type):
+        if db_type and db_type.endswith('LOB'):
+            return "DBMS_LOB.SUBSTR(%s)"
+        else:
+            return "%s"
+
+    def last_insert_id(self, cursor, table_name, pk_name):
+        sq_name = util.truncate_name(table_name, self.max_name_length() - 3)
+        cursor.execute('SELECT %s_sq.currval FROM dual' % sq_name)
+        return cursor.fetchone()[0]
+
+    def lookup_cast(self, lookup_type):
+        if lookup_type in ('iexact', 'icontains', 'istartswith', 'iendswith'):
+            return "UPPER(%s)"
+        return "%s"
+
+    def max_name_length(self):
+        return 30
+
+    def query_class(self, DefaultQueryClass):
+        return query.query_class(DefaultQueryClass, Database)
+
+    def quote_name(self, name):
+        # SQL92 requires delimited (quoted) names to be case-sensitive.  When
+        # not quoted, Oracle has case-insensitive behavior for identifiers, but
+        # always defaults to uppercase.
+        # We simplify things by making Oracle identifiers always uppercase.
+        if not name.startswith('"') and not name.endswith('"'):
+            name = '"%s"' % util.truncate_name(name.upper(), self.max_name_length())
+        return name.upper()
+
+    def random_function_sql(self):
+        return "DBMS_RANDOM.RANDOM"
+
+    def regex_lookup_9(self, lookup_type):
+        raise NotImplementedError("Regexes are not supported in Oracle before version 10g.")
+
+    def regex_lookup_10(self, lookup_type):
+        if lookup_type == 'regex':
+            match_option = "'c'"
+        else:
+            match_option = "'i'"
+        return 'REGEXP_LIKE(%%s, %%s, %s)' % match_option
+
+    def regex_lookup(self, lookup_type):
+        # If regex_lookup is called before it's been initialized, then create
+        # a cursor to initialize it and recur.
+        from django.db import connection
+        connection.cursor()
+        return connection.ops.regex_lookup(lookup_type)
+
+    def sql_flush(self, style, tables, sequences):
+        # Return a list of 'TRUNCATE x;', 'TRUNCATE y;',
+        # 'TRUNCATE z;'... style SQL statements
+        if tables:
+            # Oracle does support TRUNCATE, but it seems to get us into
+            # FK referential trouble, whereas DELETE FROM table works.
+            sql = ['%s %s %s;' % \
+                    (style.SQL_KEYWORD('DELETE'),
+                     style.SQL_KEYWORD('FROM'),
+                     style.SQL_FIELD(self.quote_name(table))
+                     ) for table in tables]
+            # Since we've just deleted all the rows, running our sequence
+            # ALTER code will reset the sequence to 0.
+            for sequence_info in sequences:
+                sequence_name = get_sequence_name(sequence_info['table'])
+                table_name = self.quote_name(sequence_info['table'])
+                column_name = self.quote_name(sequence_info['column'] or 'id')
+                query = _get_sequence_reset_sql() % {'sequence': sequence_name,
+                                                     'table': table_name,
+                                                     'column': column_name}
+                sql.append(query)
+            return sql
+        else:
+            return []
+
+    def sequence_reset_sql(self, style, model_list):
+        from django.db import models
+        output = []
+        query = _get_sequence_reset_sql()
+        for model in model_list:
+            for f in model._meta.local_fields:
+                if isinstance(f, models.AutoField):
+                    table_name = self.quote_name(model._meta.db_table)
+                    sequence_name = get_sequence_name(model._meta.db_table)
+                    column_name = self.quote_name(f.column)
+                    output.append(query % {'sequence': sequence_name,
+                                           'table': table_name,
+                                           'column': column_name})
+                    break # Only one AutoField is allowed per model, so don't bother continuing.
+            for f in model._meta.many_to_many:
+                table_name = self.quote_name(f.m2m_db_table())
+                sequence_name = get_sequence_name(f.m2m_db_table())
+                column_name = self.quote_name('id')
+                output.append(query % {'sequence': sequence_name,
+                                       'table': table_name,
+                                       'column': column_name})
+        return output
+
+    def start_transaction_sql(self):
+        return ''
+
+    def tablespace_sql(self, tablespace, inline=False):
+        return "%sTABLESPACE %s" % ((inline and "USING INDEX " or ""), self.quote_name(tablespace))
+
+    def value_to_db_time(self, value):
+        if value is None:
+            return None
+        if isinstance(value, basestring):
+            return datetime.datetime(*(time.strptime(value, '%H:%M:%S')[:6]))
+        return datetime.datetime(1900, 1, 1, value.hour, value.minute,
+                                 value.second, value.microsecond)
+
+    def year_lookup_bounds_for_date_field(self, value):
+        first = '%s-01-01'
+        second = '%s-12-31'
+        return [first % value, second % value]
+
+
+class DatabaseWrapper(BaseDatabaseWrapper):
+
+    operators = {
+        'exact': '= %s',
+        'iexact': '= UPPER(%s)',
+        'contains': "LIKEC %s ESCAPE '\\'",
+        'icontains': "LIKEC UPPER(%s) ESCAPE '\\'",
+        'gt': '> %s',
+        'gte': '>= %s',
+        'lt': '< %s',
+        'lte': '<= %s',
+        'startswith': "LIKEC %s ESCAPE '\\'",
+        'endswith': "LIKEC %s ESCAPE '\\'",
+        'istartswith': "LIKEC UPPER(%s) ESCAPE '\\'",
+        'iendswith': "LIKEC UPPER(%s) ESCAPE '\\'",
+    }
+    oracle_version = None
+
+    def __init__(self, *args, **kwargs):
+        super(DatabaseWrapper, self).__init__(*args, **kwargs)
+
+        self.features = DatabaseFeatures()
+        self.ops = DatabaseOperations()
+        self.client = DatabaseClient()
+        self.creation = DatabaseCreation(self)
+        self.introspection = DatabaseIntrospection(self)
+        self.validation = BaseDatabaseValidation()
+
+    def _valid_connection(self):
+        return self.connection is not None
+
+    def _cursor(self, settings):
+        cursor = None
+        if not self._valid_connection():
+            if len(settings.DATABASE_HOST.strip()) == 0:
+                settings.DATABASE_HOST = 'localhost'
+            if len(settings.DATABASE_PORT.strip()) != 0:
+                dsn = Database.makedsn(settings.DATABASE_HOST, int(settings.DATABASE_PORT), settings.DATABASE_NAME)
+                self.connection = Database.connect(settings.DATABASE_USER, settings.DATABASE_PASSWORD, dsn, **self.options)
+            else:
+                conn_string = "%s/%s@%s" % (settings.DATABASE_USER, settings.DATABASE_PASSWORD, settings.DATABASE_NAME)
+                self.connection = Database.connect(conn_string, **self.options)
+            cursor = FormatStylePlaceholderCursor(self.connection)
+            # Set oracle date to ansi date format.  This only needs to execute
+            # once when we create a new connection.
+            cursor.execute("ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD' "
+                           "NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF'")
+            try:
+                self.oracle_version = int(self.connection.version.split('.')[0])
+                # There's no way for the DatabaseOperations class to know the
+                # currently active Oracle version, so we do some setups here.
+                # TODO: Multi-db support will need a better solution (a way to
+                # communicate the current version).
+                if self.oracle_version <= 9:
+                    self.ops.regex_lookup = self.ops.regex_lookup_9
+                else:
+                    self.ops.regex_lookup = self.ops.regex_lookup_10
+            except ValueError:
+                pass
+            try:
+                self.connection.stmtcachesize = 20
+            except:
+                # Django docs specify cx_Oracle version 4.3.1 or higher, but
+                # stmtcachesize is available only in 4.3.2 and up.
+                pass
+        if not cursor:
+            cursor = FormatStylePlaceholderCursor(self.connection)
+        # Default arraysize of 1 is highly sub-optimal.
+        cursor.arraysize = 100
+        return cursor
+
+
+class OracleParam(object):
+    """
+    Wrapper object for formatting parameters for Oracle. If the string
+    representation of the value is large enough (greater than 4000 characters)
+    the input size needs to be set as NCLOB. Alternatively, if the parameter has
+    an `input_size` attribute, then the value of the `input_size` attribute will
+    be used instead. Otherwise, no input size will be set for the parameter when
+    executing the query.
+    """
+    def __init__(self, param, charset, strings_only=False):
+        self.smart_str = smart_str(param, charset, strings_only)
+        if hasattr(param, 'input_size'):
+            # If parameter has `input_size` attribute, use that.
+            self.input_size = param.input_size
+        elif isinstance(param, basestring) and len(param) > 4000:
+            # Mark any string parameter greater than 4000 characters as an NCLOB.
+            self.input_size = Database.NCLOB
+        else:
+            self.input_size = None
+
+
+class FormatStylePlaceholderCursor(Database.Cursor):
+    """
+    Django uses "format" (e.g. '%s') style placeholders, but Oracle uses ":var"
+    style. This fixes it -- but note that if you want to use a literal "%s" in
+    a query, you'll need to use "%%s".
+
+    We also do automatic conversion between Unicode on the Python side and
+    UTF-8 -- for talking to Oracle -- in here.
+    """
+    charset = 'utf-8'
+
+    def _format_params(self, params):
+        if isinstance(params, dict):
+            result = {}
+            for key, value in params.items():
+                result[smart_str(key, self.charset)] = OracleParam(param, self.charset)
+            return result
+        else:
+            return tuple([OracleParam(p, self.charset, True) for p in params])
+
+    def _guess_input_sizes(self, params_list):
+        if isinstance(params_list[0], dict):
+            sizes = {}
+            iterators = [params.iteritems() for params in params_list]
+        else:
+            sizes = [None] * len(params_list[0])
+            iterators = [enumerate(params) for params in params_list]
+        for iterator in iterators:
+            for key, value in iterator:
+                if value.input_size: sizes[key] = value.input_size
+        if isinstance(sizes, dict):
+            self.setinputsizes(**sizes)
+        else:
+            self.setinputsizes(*sizes)
+
+    def _param_generator(self, params):
+        if isinstance(params, dict):
+            return dict([(k, p.smart_str) for k, p in params.iteritems()])
+        else:
+            return [p.smart_str for p in params]
+
+    def execute(self, query, params=None):
+        if params is None:
+            params = []
+        else:
+            params = self._format_params(params)
+        args = [(':arg%d' % i) for i in range(len(params))]
+        # cx_Oracle wants no trailing ';' for SQL statements.  For PL/SQL, it
+        # it does want a trailing ';' but not a trailing '/'.  However, these
+        # characters must be included in the original query in case the query
+        # is being passed to SQL*Plus.
+        if query.endswith(';') or query.endswith('/'):
+            query = query[:-1]
+        query = smart_str(query, self.charset) % tuple(args)
+        self._guess_input_sizes([params])
+        return Database.Cursor.execute(self, query, self._param_generator(params))
+
+    def executemany(self, query, params=None):
+        try:
+          args = [(':arg%d' % i) for i in range(len(params[0]))]
+        except (IndexError, TypeError):
+          # No params given, nothing to do
+          return None
+        # cx_Oracle wants no trailing ';' for SQL statements.  For PL/SQL, it
+        # it does want a trailing ';' but not a trailing '/'.  However, these
+        # characters must be included in the original query in case the query
+        # is being passed to SQL*Plus.
+        if query.endswith(';') or query.endswith('/'):
+            query = query[:-1]
+        query = smart_str(query, self.charset) % tuple(args)
+        formatted = [self._format_params(i) for i in params]
+        self._guess_input_sizes(formatted)
+        return Database.Cursor.executemany(self, query, [self._param_generator(p) for p in formatted])
+
+    def fetchone(self):
+        row = Database.Cursor.fetchone(self)
+        if row is None:
+            return row
+        return tuple([to_unicode(e) for e in row])
+
+    def fetchmany(self, size=None):
+        if size is None:
+            size = self.arraysize
+        return tuple([tuple([to_unicode(e) for e in r]) for r in Database.Cursor.fetchmany(self, size)])
+
+    def fetchall(self):
+        return tuple([tuple([to_unicode(e) for e in r]) for r in Database.Cursor.fetchall(self)])
+
+def to_unicode(s):
+    """
+    Convert strings to Unicode objects (and return all other data types
+    unchanged).
+    """
+    if isinstance(s, basestring):
+        return force_unicode(s)
+    return s
+
+def _get_sequence_reset_sql():
+    # TODO: colorize this SQL code with style.SQL_KEYWORD(), etc.
+    return """
+        DECLARE
+            startvalue integer;
+            cval integer;
+        BEGIN
+            LOCK TABLE %(table)s IN SHARE MODE;
+            SELECT NVL(MAX(%(column)s), 0) INTO startvalue FROM %(table)s;
+            SELECT %(sequence)s.nextval INTO cval FROM dual;
+            cval := startvalue - cval;
+            IF cval != 0 THEN
+                EXECUTE IMMEDIATE 'ALTER SEQUENCE %(sequence)s MINVALUE 0 INCREMENT BY '||cval;
+                SELECT %(sequence)s.nextval INTO cval FROM dual;
+                EXECUTE IMMEDIATE 'ALTER SEQUENCE %(sequence)s INCREMENT BY 1';
+            END IF;
+            COMMIT;
+        END;
+        /"""
+
+def get_sequence_name(table):
+    name_length = DatabaseOperations().max_name_length() - 3
+    return '%s_SQ' % util.truncate_name(table, name_length).upper()
+
+def get_trigger_name(table):
+    name_length = DatabaseOperations().max_name_length() - 3
+    return '%s_TR' % util.truncate_name(table, name_length).upper()
diff --git a/webapp/django/db/backends/oracle/client.py b/webapp/django/db/backends/oracle/client.py
new file mode 100644
index 0000000..77fc9b9
--- /dev/null
+++ b/webapp/django/db/backends/oracle/client.py
@@ -0,0 +1,13 @@
+from django.db.backends import BaseDatabaseClient
+from django.conf import settings
+import os
+
+class DatabaseClient(BaseDatabaseClient):
+    def runshell(self):
+        dsn = settings.DATABASE_USER
+        if settings.DATABASE_PASSWORD:
+            dsn += "/%s" % settings.DATABASE_PASSWORD
+        if settings.DATABASE_NAME:
+            dsn += "@%s" % settings.DATABASE_NAME
+        args = ["sqlplus", "-L", dsn]
+        os.execvp("sqlplus", args)
diff --git a/webapp/django/db/backends/oracle/creation.py b/webapp/django/db/backends/oracle/creation.py
new file mode 100644
index 0000000..99c1b11
--- /dev/null
+++ b/webapp/django/db/backends/oracle/creation.py
@@ -0,0 +1,291 @@
+import sys, time
+from django.conf import settings
+from django.core import management
+from django.db.backends.creation import BaseDatabaseCreation
+
+TEST_DATABASE_PREFIX = 'test_'
+PASSWORD = 'Im_a_lumberjack'
+
+class DatabaseCreation(BaseDatabaseCreation):
+    # This dictionary maps Field objects to their associated Oracle column
+    # types, as strings. Column-type strings can contain format strings; they'll
+    # be interpolated against the values of Field.__dict__ before being output.
+    # If a column type is set to None, it won't be included in the output.
+    #
+    # Any format strings starting with "qn_" are quoted before being used in the
+    # output (the "qn_" prefix is stripped before the lookup is performed.
+
+    data_types = {
+        'AutoField':                    'NUMBER(11)',
+        'BooleanField':                 'NUMBER(1) CHECK (%(qn_column)s IN (0,1))',
+        'CharField':                    'NVARCHAR2(%(max_length)s)',
+        'CommaSeparatedIntegerField':   'VARCHAR2(%(max_length)s)',
+        'DateField':                    'DATE',
+        'DateTimeField':                'TIMESTAMP',
+        'DecimalField':                 'NUMBER(%(max_digits)s, %(decimal_places)s)',
+        'FileField':                    'NVARCHAR2(%(max_length)s)',
+        'FilePathField':                'NVARCHAR2(%(max_length)s)',
+        'FloatField':                   'DOUBLE PRECISION',
+        'IntegerField':                 'NUMBER(11)',
+        'IPAddressField':               'VARCHAR2(15)',
+        'NullBooleanField':             'NUMBER(1) CHECK ((%(qn_column)s IN (0,1)) OR (%(qn_column)s IS NULL))',
+        'OneToOneField':                'NUMBER(11)',
+        'PhoneNumberField':             'VARCHAR2(20)',
+        'PositiveIntegerField':         'NUMBER(11) CHECK (%(qn_column)s >= 0)',
+        'PositiveSmallIntegerField':    'NUMBER(11) CHECK (%(qn_column)s >= 0)',
+        'SlugField':                    'NVARCHAR2(50)',
+        'SmallIntegerField':            'NUMBER(11)',
+        'TextField':                    'NCLOB',
+        'TimeField':                    'TIMESTAMP',
+        'URLField':                     'VARCHAR2(%(max_length)s)',
+        'USStateField':                 'CHAR(2)',
+    }
+
+    remember = {}
+
+    def _create_test_db(self, verbosity=1, autoclobber=False):
+        TEST_DATABASE_NAME = self._test_database_name(settings)
+        TEST_DATABASE_USER = self._test_database_user(settings)
+        TEST_DATABASE_PASSWD = self._test_database_passwd(settings)
+        TEST_DATABASE_TBLSPACE = self._test_database_tblspace(settings)
+        TEST_DATABASE_TBLSPACE_TMP = self._test_database_tblspace_tmp(settings)
+
+        parameters = {
+            'dbname': TEST_DATABASE_NAME,
+            'user': TEST_DATABASE_USER,
+            'password': TEST_DATABASE_PASSWD,
+            'tblspace': TEST_DATABASE_TBLSPACE,
+            'tblspace_temp': TEST_DATABASE_TBLSPACE_TMP,
+        }
+
+        self.remember['user'] = settings.DATABASE_USER
+        self.remember['passwd'] = settings.DATABASE_PASSWORD
+
+        cursor = self.connection.cursor()
+        if self._test_database_create(settings):
+            if verbosity >= 1:
+                print 'Creating test database...'
+            try:
+                self._execute_test_db_creation(cursor, parameters, verbosity)
+            except Exception, e:
+                sys.stderr.write("Got an error creating the test database: %s\n" % e)
+                if not autoclobber:
+                    confirm = raw_input("It appears the test database, %s, already exists. Type 'yes' to delete it, or 'no' to cancel: " % TEST_DATABASE_NAME)
+                if autoclobber or confirm == 'yes':
+                    try:
+                        if verbosity >= 1:
+                            print "Destroying old test database..."
+                        self._execute_test_db_destruction(cursor, parameters, verbosity)
+                        if verbosity >= 1:
+                            print "Creating test database..."
+                        self._execute_test_db_creation(cursor, parameters, verbosity)
+                    except Exception, e:
+                        sys.stderr.write("Got an error recreating the test database: %s\n" % e)
+                        sys.exit(2)
+                else:
+                    print "Tests cancelled."
+                    sys.exit(1)
+
+        if self._test_user_create(settings):
+            if verbosity >= 1:
+                print "Creating test user..."
+            try:
+                self._create_test_user(cursor, parameters, verbosity)
+            except Exception, e:
+                sys.stderr.write("Got an error creating the test user: %s\n" % e)
+                if not autoclobber:
+                    confirm = raw_input("It appears the test user, %s, already exists. Type 'yes' to delete it, or 'no' to cancel: " % TEST_DATABASE_USER)
+                if autoclobber or confirm == 'yes':
+                    try:
+                        if verbosity >= 1:
+                            print "Destroying old test user..."
+                        self._destroy_test_user(cursor, parameters, verbosity)
+                        if verbosity >= 1:
+                            print "Creating test user..."
+                        self._create_test_user(cursor, parameters, verbosity)
+                    except Exception, e:
+                        sys.stderr.write("Got an error recreating the test user: %s\n" % e)
+                        sys.exit(2)
+                else:
+                    print "Tests cancelled."
+                    sys.exit(1)
+
+        settings.DATABASE_USER = TEST_DATABASE_USER
+        settings.DATABASE_PASSWORD = TEST_DATABASE_PASSWD
+
+        return settings.DATABASE_NAME
+
+    def _destroy_test_db(self, test_database_name, verbosity=1):
+        """
+        Destroy a test database, prompting the user for confirmation if the
+        database already exists. Returns the name of the test database created.
+        """
+        TEST_DATABASE_NAME = self._test_database_name(settings)
+        TEST_DATABASE_USER = self._test_database_user(settings)
+        TEST_DATABASE_PASSWD = self._test_database_passwd(settings)
+        TEST_DATABASE_TBLSPACE = self._test_database_tblspace(settings)
+        TEST_DATABASE_TBLSPACE_TMP = self._test_database_tblspace_tmp(settings)
+
+        settings.DATABASE_USER = self.remember['user']
+        settings.DATABASE_PASSWORD = self.remember['passwd']
+
+        parameters = {
+            'dbname': TEST_DATABASE_NAME,
+            'user': TEST_DATABASE_USER,
+            'password': TEST_DATABASE_PASSWD,
+            'tblspace': TEST_DATABASE_TBLSPACE,
+            'tblspace_temp': TEST_DATABASE_TBLSPACE_TMP,
+        }
+
+        self.remember['user'] = settings.DATABASE_USER
+        self.remember['passwd'] = settings.DATABASE_PASSWORD
+
+        cursor = self.connection.cursor()
+        time.sleep(1) # To avoid "database is being accessed by other users" errors.
+        if self._test_user_create(settings):
+            if verbosity >= 1:
+                print 'Destroying test user...'
+            self._destroy_test_user(cursor, parameters, verbosity)
+        if self._test_database_create(settings):
+            if verbosity >= 1:
+                print 'Destroying test database tables...'
+            self._execute_test_db_destruction(cursor, parameters, verbosity)
+        self.connection.close()
+
+    def _execute_test_db_creation(self, cursor, parameters, verbosity):
+        if verbosity >= 2:
+            print "_create_test_db(): dbname = %s" % parameters['dbname']
+        statements = [
+            """CREATE TABLESPACE %(tblspace)s
+               DATAFILE '%(tblspace)s.dbf' SIZE 20M
+               REUSE AUTOEXTEND ON NEXT 10M MAXSIZE 100M
+            """,
+            """CREATE TEMPORARY TABLESPACE %(tblspace_temp)s
+               TEMPFILE '%(tblspace_temp)s.dbf' SIZE 20M
+               REUSE AUTOEXTEND ON NEXT 10M MAXSIZE 100M
+            """,
+        ]
+        self._execute_statements(cursor, statements, parameters, verbosity)
+
+    def _create_test_user(self, cursor, parameters, verbosity):
+        if verbosity >= 2:
+            print "_create_test_user(): username = %s" % parameters['user']
+        statements = [
+            """CREATE USER %(user)s
+               IDENTIFIED BY %(password)s
+               DEFAULT TABLESPACE %(tblspace)s
+               TEMPORARY TABLESPACE %(tblspace_temp)s
+            """,
+            """GRANT CONNECT, RESOURCE TO %(user)s""",
+        ]
+        self._execute_statements(cursor, statements, parameters, verbosity)
+
+    def _execute_test_db_destruction(self, cursor, parameters, verbosity):
+        if verbosity >= 2:
+            print "_execute_test_db_destruction(): dbname=%s" % parameters['dbname']
+        statements = [
+            'DROP TABLESPACE %(tblspace)s INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS',
+            'DROP TABLESPACE %(tblspace_temp)s INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS',
+            ]
+        self._execute_statements(cursor, statements, parameters, verbosity)
+
+    def _destroy_test_user(self, cursor, parameters, verbosity):
+        if verbosity >= 2:
+            print "_destroy_test_user(): user=%s" % parameters['user']
+            print "Be patient.  This can take some time..."
+        statements = [
+            'DROP USER %(user)s CASCADE',
+        ]
+        self._execute_statements(cursor, statements, parameters, verbosity)
+
+    def _execute_statements(self, cursor, statements, parameters, verbosity):
+        for template in statements:
+            stmt = template % parameters
+            if verbosity >= 2:
+                print stmt
+            try:
+                cursor.execute(stmt)
+            except Exception, err:
+                sys.stderr.write("Failed (%s)\n" % (err))
+                raise
+
+    def _test_database_name(self, settings):
+        name = TEST_DATABASE_PREFIX + settings.DATABASE_NAME
+        try:
+            if settings.TEST_DATABASE_NAME:
+                name = settings.TEST_DATABASE_NAME
+        except AttributeError:
+            pass
+        except:
+            raise
+        return name
+
+    def _test_database_create(self, settings):
+        name = True
+        try:
+            if settings.TEST_DATABASE_CREATE:
+                name = True
+            else:
+                name = False
+        except AttributeError:
+            pass
+        except:
+            raise
+        return name
+
+    def _test_user_create(self, settings):
+        name = True
+        try:
+            if settings.TEST_USER_CREATE:
+                name = True
+            else:
+                name = False
+        except AttributeError:
+            pass
+        except:
+            raise
+        return name
+
+    def _test_database_user(self, ettings):
+        name = TEST_DATABASE_PREFIX + settings.DATABASE_NAME
+        try:
+            if settings.TEST_DATABASE_USER:
+                name = settings.TEST_DATABASE_USER
+        except AttributeError:
+            pass
+        except:
+            raise
+        return name
+
+    def _test_database_passwd(self, settings):
+        name = PASSWORD
+        try:
+            if settings.TEST_DATABASE_PASSWD:
+                name = settings.TEST_DATABASE_PASSWD
+        except AttributeError:
+            pass
+        except:
+            raise
+        return name
+
+    def _test_database_tblspace(self, settings):
+        name = TEST_DATABASE_PREFIX + settings.DATABASE_NAME
+        try:
+            if settings.TEST_DATABASE_TBLSPACE:
+                name = settings.TEST_DATABASE_TBLSPACE
+        except AttributeError:
+            pass
+        except:
+            raise
+        return name
+
+    def _test_database_tblspace_tmp(self, settings):
+        name = TEST_DATABASE_PREFIX + settings.DATABASE_NAME + '_temp'
+        try:
+            if settings.TEST_DATABASE_TBLSPACE_TMP:
+                name = settings.TEST_DATABASE_TBLSPACE_TMP
+        except AttributeError:
+            pass
+        except:
+            raise
+        return name
diff --git a/webapp/django/db/backends/oracle/introspection.py b/webapp/django/db/backends/oracle/introspection.py
new file mode 100644
index 0000000..890e30a
--- /dev/null
+++ b/webapp/django/db/backends/oracle/introspection.py
@@ -0,0 +1,103 @@
+from django.db.backends import BaseDatabaseIntrospection
+import cx_Oracle
+import re
+
+foreign_key_re = re.compile(r"\sCONSTRAINT `[^`]*` FOREIGN KEY \(`([^`]*)`\) REFERENCES `([^`]*)` \(`([^`]*)`\)")
+
+class DatabaseIntrospection(BaseDatabaseIntrospection):
+    # Maps type objects to Django Field types.
+    data_types_reverse = {
+        cx_Oracle.CLOB: 'TextField',
+        cx_Oracle.DATETIME: 'DateTimeField',
+        cx_Oracle.FIXED_CHAR: 'CharField',
+        cx_Oracle.NCLOB: 'TextField',
+        cx_Oracle.NUMBER: 'DecimalField',
+        cx_Oracle.STRING: 'CharField',
+        cx_Oracle.TIMESTAMP: 'DateTimeField',
+    }
+
+    def get_table_list(self, cursor):
+        "Returns a list of table names in the current database."
+        cursor.execute("SELECT TABLE_NAME FROM USER_TABLES")
+        return [row[0].upper() for row in cursor.fetchall()]
+
+    def get_table_description(self, cursor, table_name):
+        "Returns a description of the table, with the DB-API cursor.description interface."
+        cursor.execute("SELECT * FROM %s WHERE ROWNUM < 2" % self.connection.ops.quote_name(table_name))
+        return cursor.description
+
+    def table_name_converter(self, name):
+        "Table name comparison is case insensitive under Oracle"
+        return name.upper()
+        
+    def _name_to_index(self, cursor, table_name):
+        """
+        Returns a dictionary of {field_name: field_index} for the given table.
+        Indexes are 0-based.
+        """
+        return dict([(d[0], i) for i, d in enumerate(self.get_table_description(cursor, table_name))])
+
+    def get_relations(self, cursor, table_name):
+        """
+        Returns a dictionary of {field_index: (field_index_other_table, other_table)}
+        representing all relationships to the given table. Indexes are 0-based.
+        """
+        cursor.execute("""
+    SELECT ta.column_id - 1, tb.table_name, tb.column_id - 1
+    FROM   user_constraints, USER_CONS_COLUMNS ca, USER_CONS_COLUMNS cb,
+           user_tab_cols ta, user_tab_cols tb
+    WHERE  user_constraints.table_name = %s AND
+           ta.table_name = %s AND
+           ta.column_name = ca.column_name AND
+           ca.table_name = %s AND
+           user_constraints.constraint_name = ca.constraint_name AND
+           user_constraints.r_constraint_name = cb.constraint_name AND
+           cb.table_name = tb.table_name AND
+           cb.column_name = tb.column_name AND
+           ca.position = cb.position""", [table_name, table_name, table_name])
+
+        relations = {}
+        for row in cursor.fetchall():
+            relations[row[0]] = (row[2], row[1])
+        return relations
+
+    def get_indexes(self, cursor, table_name):
+        """
+        Returns a dictionary of fieldname -> infodict for the given table,
+        where each infodict is in the format:
+            {'primary_key': boolean representing whether it's the primary key,
+             'unique': boolean representing whether it's a unique index}
+        """
+        # This query retrieves each index on the given table, including the
+        # first associated field name
+        # "We were in the nick of time; you were in great peril!"
+        sql = """
+    WITH primarycols AS (
+     SELECT user_cons_columns.table_name, user_cons_columns.column_name, 1 AS PRIMARYCOL
+     FROM   user_cons_columns, user_constraints
+     WHERE  user_cons_columns.constraint_name = user_constraints.constraint_name AND
+            user_constraints.constraint_type = 'P' AND
+            user_cons_columns.table_name = %s),
+     uniquecols AS (
+     SELECT user_ind_columns.table_name, user_ind_columns.column_name, 1 AS UNIQUECOL
+     FROM   user_indexes, user_ind_columns
+     WHERE  uniqueness = 'UNIQUE' AND
+            user_indexes.index_name = user_ind_columns.index_name AND
+            user_ind_columns.table_name = %s)
+    SELECT allcols.column_name, primarycols.primarycol, uniquecols.UNIQUECOL
+    FROM   (SELECT column_name FROM primarycols UNION SELECT column_name FROM
+    uniquecols) allcols,
+          primarycols, uniquecols
+    WHERE  allcols.column_name = primarycols.column_name (+) AND
+          allcols.column_name = uniquecols.column_name (+)
+        """
+        cursor.execute(sql, [table_name, table_name])
+        indexes = {}
+        for row in cursor.fetchall():
+            # row[1] (idx.indkey) is stored in the DB as an array. It comes out as
+            # a string of space-separated integers. This designates the field
+            # indexes (1-based) of the fields that have indexes on the table.
+            # Here, we skip any indexes across multiple fields.
+            indexes[row[0]] = {'primary_key': row[1], 'unique': row[2]}
+        return indexes
+
diff --git a/webapp/django/db/backends/oracle/query.py b/webapp/django/db/backends/oracle/query.py
new file mode 100644
index 0000000..85e2f68
--- /dev/null
+++ b/webapp/django/db/backends/oracle/query.py
@@ -0,0 +1,145 @@
+"""
+Custom Query class for Oracle.
+Derives from: django.db.models.sql.query.Query
+"""
+
+import datetime
+
+from django.db.backends import util
+
+# Cache. Maps default query class to new Oracle query class.
+_classes = {}
+
+def query_class(QueryClass, Database):
+    """
+    Returns a custom django.db.models.sql.query.Query subclass that is
+    appropriate for Oracle.
+
+    The 'Database' module (cx_Oracle) is passed in here so that all the setup
+    required to import it only needs to be done by the calling module.
+    """
+    global _classes
+    try:
+        return _classes[QueryClass]
+    except KeyError:
+        pass
+
+    class OracleQuery(QueryClass):
+        def resolve_columns(self, row, fields=()):
+            index_start = len(self.extra_select.keys())
+            values = [self.convert_values(v, None) for v in row[:index_start]]
+            for value, field in map(None, row[index_start:], fields):
+                values.append(self.convert_values(value, field))
+            return values
+
+        def convert_values(self, value, field):
+            from django.db.models.fields import DateField, DateTimeField, \
+                 TimeField, BooleanField, NullBooleanField, DecimalField, Field
+            if isinstance(value, Database.LOB):
+                value = value.read()
+            # Oracle stores empty strings as null. We need to undo this in
+            # order to adhere to the Django convention of using the empty
+            # string instead of null, but only if the field accepts the
+            # empty string.
+            if value is None and isinstance(field, Field) and field.empty_strings_allowed:
+                value = u''
+            # Convert 1 or 0 to True or False
+            elif value in (1, 0) and isinstance(field, (BooleanField, NullBooleanField)):
+                value = bool(value)
+            # Convert floats to decimals
+            elif value is not None and isinstance(field, DecimalField):
+                value = util.typecast_decimal(field.format_number(value))
+            # cx_Oracle always returns datetime.datetime objects for
+            # DATE and TIMESTAMP columns, but Django wants to see a
+            # python datetime.date, .time, or .datetime.  We use the type
+            # of the Field to determine which to cast to, but it's not
+            # always available.
+            # As a workaround, we cast to date if all the time-related
+            # values are 0, or to time if the date is 1/1/1900.
+            # This could be cleaned a bit by adding a method to the Field
+            # classes to normalize values from the database (the to_python
+            # method is used for validation and isn't what we want here).
+            elif isinstance(value, Database.Timestamp):
+                # In Python 2.3, the cx_Oracle driver returns its own
+                # Timestamp object that we must convert to a datetime class.
+                if not isinstance(value, datetime.datetime):
+                    value = datetime.datetime(value.year, value.month,
+                            value.day, value.hour, value.minute, value.second,
+                            value.fsecond)
+                if isinstance(field, DateTimeField):
+                    # DateTimeField subclasses DateField so must be checked
+                    # first.
+                    pass
+                elif isinstance(field, DateField):
+                    value = value.date()
+                elif isinstance(field, TimeField) or (value.year == 1900 and value.month == value.day == 1):
+                    value = value.time()
+                elif value.hour == value.minute == value.second == value.microsecond == 0:
+                    value = value.date()
+            return value
+
+        def as_sql(self, with_limits=True, with_col_aliases=False):
+            """
+            Creates the SQL for this query. Returns the SQL string and list
+            of parameters.  This is overriden from the original Query class
+            to handle the additional SQL Oracle requires to emulate LIMIT
+            and OFFSET.
+
+            If 'with_limits' is False, any limit/offset information is not
+            included in the query.
+            """
+
+            # The `do_offset` flag indicates whether we need to construct
+            # the SQL needed to use limit/offset with Oracle.
+            do_offset = with_limits and (self.high_mark is not None
+                                         or self.low_mark)
+            if not do_offset:
+                sql, params = super(OracleQuery, self).as_sql(with_limits=False,
+                        with_col_aliases=with_col_aliases)
+            else:
+                # `get_columns` needs to be called before `get_ordering` to
+                # populate `_select_alias`.
+                self.pre_sql_setup()
+                self.get_columns()
+                ordering = self.get_ordering()
+
+                # Oracle's ROW_NUMBER() function requires an ORDER BY clause.
+                if ordering:
+                    rn_orderby = ', '.join(ordering)
+                else:
+                    # Create a default ORDER BY since none was specified.
+                    qn = self.quote_name_unless_alias
+                    opts = self.model._meta
+                    rn_orderby = '%s.%s' % (qn(opts.db_table),
+                        qn(opts.fields[0].db_column or opts.fields[0].column))
+
+                # Ensure the base query SELECTs our special "_RN" column
+                self.extra_select['_RN'] = ('ROW_NUMBER() OVER (ORDER BY %s)'
+                                            % rn_orderby, '')
+                sql, params = super(OracleQuery, self).as_sql(with_limits=False,
+                                                        with_col_aliases=True)
+
+                # Wrap the base query in an outer SELECT * with boundaries on
+                # the "_RN" column.  This is the canonical way to emulate LIMIT
+                # and OFFSET on Oracle.
+                sql = 'SELECT * FROM (%s) WHERE "_RN" > %d' % (sql, self.low_mark)
+                if self.high_mark is not None:
+                    sql = '%s AND "_RN" <= %d' % (sql, self.high_mark)
+
+            return sql, params
+
+        def set_limits(self, low=None, high=None):
+            super(OracleQuery, self).set_limits(low, high)
+            # We need to select the row number for the LIMIT/OFFSET sql.
+            # A placeholder is added to extra_select now, because as_sql is
+            # too late to be modifying extra_select.  However, the actual sql
+            # depends on the ordering, so that is generated in as_sql.
+            self.extra_select['_RN'] = ('1', '')
+
+        def clear_limits(self):
+            super(OracleQuery, self).clear_limits()
+            if '_RN' in self.extra_select:
+                del self.extra_select['_RN']
+
+    _classes[QueryClass] = OracleQuery
+    return OracleQuery
diff --git a/webapp/django/db/backends/postgresql/__init__.py b/webapp/django/db/backends/postgresql/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/db/backends/postgresql/__init__.py
diff --git a/webapp/django/db/backends/postgresql/base.py b/webapp/django/db/backends/postgresql/base.py
new file mode 100644
index 0000000..376d7ba
--- /dev/null
+++ b/webapp/django/db/backends/postgresql/base.py
@@ -0,0 +1,148 @@
+"""
+PostgreSQL database backend for Django.
+
+Requires psycopg 1: http://initd.org/projects/psycopg1
+"""
+
+from django.db.backends import *
+from django.db.backends.postgresql.client import DatabaseClient
+from django.db.backends.postgresql.creation import DatabaseCreation
+from django.db.backends.postgresql.introspection import DatabaseIntrospection
+from django.db.backends.postgresql.operations import DatabaseOperations
+from django.db.backends.postgresql.version import get_version
+from django.utils.encoding import smart_str, smart_unicode
+
+try:
+    import psycopg as Database
+except ImportError, e:
+    from django.core.exceptions import ImproperlyConfigured
+    raise ImproperlyConfigured("Error loading psycopg module: %s" % e)
+
+DatabaseError = Database.DatabaseError
+IntegrityError = Database.IntegrityError
+
+class UnicodeCursorWrapper(object):
+    """
+    A thin wrapper around psycopg cursors that allows them to accept Unicode
+    strings as params.
+
+    This is necessary because psycopg doesn't apply any DB quoting to
+    parameters that are Unicode strings. If a param is Unicode, this will
+    convert it to a bytestring using database client's encoding before passing
+    it to psycopg.
+
+    All results retrieved from the database are converted into Unicode strings
+    before being returned to the caller.
+    """
+    def __init__(self, cursor, charset):
+        self.cursor = cursor
+        self.charset = charset
+
+    def format_params(self, params):
+        if isinstance(params, dict):
+            result = {}
+            charset = self.charset
+            for key, value in params.items():
+                result[smart_str(key, charset)] = smart_str(value, charset)
+            return result
+        else:
+            return tuple([smart_str(p, self.charset, True) for p in params])
+
+    def execute(self, sql, params=()):
+        return self.cursor.execute(smart_str(sql, self.charset), self.format_params(params))
+
+    def executemany(self, sql, param_list):
+        new_param_list = [self.format_params(params) for params in param_list]
+        return self.cursor.executemany(sql, new_param_list)
+
+    def __getattr__(self, attr):
+        if attr in self.__dict__:
+            return self.__dict__[attr]
+        else:
+            return getattr(self.cursor, attr)
+
+    def __iter__(self):
+        return iter(self.cursor)
+
+class DatabaseFeatures(BaseDatabaseFeatures):
+    uses_savepoints = True
+
+class DatabaseWrapper(BaseDatabaseWrapper):
+    operators = {
+        'exact': '= %s',
+        'iexact': '= UPPER(%s)',
+        'contains': 'LIKE %s',
+        'icontains': 'LIKE UPPER(%s)',
+        'regex': '~ %s',
+        'iregex': '~* %s',
+        'gt': '> %s',
+        'gte': '>= %s',
+        'lt': '< %s',
+        'lte': '<= %s',
+        'startswith': 'LIKE %s',
+        'endswith': 'LIKE %s',
+        'istartswith': 'LIKE UPPER(%s)',
+        'iendswith': 'LIKE UPPER(%s)',
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(DatabaseWrapper, self).__init__(*args, **kwargs)
+
+        self.features = DatabaseFeatures()
+        self.ops = DatabaseOperations()
+        self.client = DatabaseClient()
+        self.creation = DatabaseCreation(self)
+        self.introspection = DatabaseIntrospection(self)
+        self.validation = BaseDatabaseValidation()
+
+    def _cursor(self, settings):
+        set_tz = False
+        if self.connection is None:
+            set_tz = True
+            if settings.DATABASE_NAME == '':
+                from django.core.exceptions import ImproperlyConfigured
+                raise ImproperlyConfigured("You need to specify DATABASE_NAME in your Django settings file.")
+            conn_string = "dbname=%s" % settings.DATABASE_NAME
+            if settings.DATABASE_USER:
+                conn_string = "user=%s %s" % (settings.DATABASE_USER, conn_string)
+            if settings.DATABASE_PASSWORD:
+                conn_string += " password='%s'" % settings.DATABASE_PASSWORD
+            if settings.DATABASE_HOST:
+                conn_string += " host=%s" % settings.DATABASE_HOST
+            if settings.DATABASE_PORT:
+                conn_string += " port=%s" % settings.DATABASE_PORT
+            self.connection = Database.connect(conn_string, **self.options)
+            self.connection.set_isolation_level(1) # make transactions transparent to all cursors
+        cursor = self.connection.cursor()
+        if set_tz:
+            cursor.execute("SET TIME ZONE %s", [settings.TIME_ZONE])
+            if not hasattr(self, '_version'):
+                version = get_version(cursor)
+                self.__class__._version = version
+                if version < (8, 0):
+                    # No savepoint support for earlier version of PostgreSQL.
+                    self.features.uses_savepoints = False
+        cursor.execute("SET client_encoding to 'UNICODE'")
+        cursor = UnicodeCursorWrapper(cursor, 'utf-8')
+        return cursor
+
+def typecast_string(s):
+    """
+    Cast all returned strings to unicode strings.
+    """
+    if not s and not isinstance(s, str):
+        return s
+    return smart_unicode(s)
+
+# Register these custom typecasts, because Django expects dates/times to be
+# in Python's native (standard-library) datetime/time format, whereas psycopg
+# use mx.DateTime by default.
+try:
+    Database.register_type(Database.new_type((1082,), "DATE", util.typecast_date))
+except AttributeError:
+    raise Exception("You appear to be using psycopg version 2. Set your DATABASE_ENGINE to 'postgresql_psycopg2' instead of 'postgresql'.")
+Database.register_type(Database.new_type((1083,1266), "TIME", util.typecast_time))
+Database.register_type(Database.new_type((1114,1184), "TIMESTAMP", util.typecast_timestamp))
+Database.register_type(Database.new_type((16,), "BOOLEAN", util.typecast_boolean))
+Database.register_type(Database.new_type((1700,), "NUMERIC", util.typecast_decimal))
+Database.register_type(Database.new_type(Database.types[1043].values, 'STRING', typecast_string))
diff --git a/webapp/django/db/backends/postgresql/client.py b/webapp/django/db/backends/postgresql/client.py
new file mode 100644
index 0000000..28daed8
--- /dev/null
+++ b/webapp/django/db/backends/postgresql/client.py
@@ -0,0 +1,17 @@
+from django.db.backends import BaseDatabaseClient
+from django.conf import settings
+import os
+
+class DatabaseClient(BaseDatabaseClient):
+    def runshell(self):
+        args = ['psql']
+        if settings.DATABASE_USER:
+            args += ["-U", settings.DATABASE_USER]
+        if settings.DATABASE_PASSWORD:
+            args += ["-W"]
+        if settings.DATABASE_HOST:
+            args.extend(["-h", settings.DATABASE_HOST])
+        if settings.DATABASE_PORT:
+            args.extend(["-p", str(settings.DATABASE_PORT)])
+        args += [settings.DATABASE_NAME]
+        os.execvp('psql', args)
diff --git a/webapp/django/db/backends/postgresql/creation.py b/webapp/django/db/backends/postgresql/creation.py
new file mode 100644
index 0000000..3e537e3
--- /dev/null
+++ b/webapp/django/db/backends/postgresql/creation.py
@@ -0,0 +1,38 @@
+from django.conf import settings
+from django.db.backends.creation import BaseDatabaseCreation
+
+class DatabaseCreation(BaseDatabaseCreation):
+    # This dictionary maps Field objects to their associated PostgreSQL column
+    # types, as strings. Column-type strings can contain format strings; they'll
+    # be interpolated against the values of Field.__dict__ before being output.
+    # If a column type is set to None, it won't be included in the output.
+    data_types = {
+        'AutoField':         'serial',
+        'BooleanField':      'boolean',
+        'CharField':         'varchar(%(max_length)s)',
+        'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
+        'DateField':         'date',
+        'DateTimeField':     'timestamp with time zone',
+        'DecimalField':      'numeric(%(max_digits)s, %(decimal_places)s)',
+        'FileField':         'varchar(%(max_length)s)',
+        'FilePathField':     'varchar(%(max_length)s)',
+        'FloatField':        'double precision',
+        'IntegerField':      'integer',
+        'IPAddressField':    'inet',
+        'NullBooleanField':  'boolean',
+        'OneToOneField':     'integer',
+        'PhoneNumberField':  'varchar(20)',
+        'PositiveIntegerField': 'integer CHECK ("%(column)s" >= 0)',
+        'PositiveSmallIntegerField': 'smallint CHECK ("%(column)s" >= 0)',
+        'SlugField':         'varchar(%(max_length)s)',
+        'SmallIntegerField': 'smallint',
+        'TextField':         'text',
+        'TimeField':         'time',
+        'USStateField':      'varchar(2)',
+    }
+
+    def sql_table_creation_suffix(self):
+        assert settings.TEST_DATABASE_COLLATION is None, "PostgreSQL does not support collation setting at database creation time."
+        if settings.TEST_DATABASE_CHARSET:
+            return "WITH ENCODING '%s'" % settings.TEST_DATABASE_CHARSET
+        return ''
diff --git a/webapp/django/db/backends/postgresql/introspection.py b/webapp/django/db/backends/postgresql/introspection.py
new file mode 100644
index 0000000..7b3ab3b
--- /dev/null
+++ b/webapp/django/db/backends/postgresql/introspection.py
@@ -0,0 +1,86 @@
+from django.db.backends import BaseDatabaseIntrospection
+
+class DatabaseIntrospection(BaseDatabaseIntrospection):
+    # Maps type codes to Django Field types.
+    data_types_reverse = {
+        16: 'BooleanField',
+        21: 'SmallIntegerField',
+        23: 'IntegerField',
+        25: 'TextField',
+        701: 'FloatField',
+        869: 'IPAddressField',
+        1043: 'CharField',
+        1082: 'DateField',
+        1083: 'TimeField',
+        1114: 'DateTimeField',
+        1184: 'DateTimeField',
+        1266: 'TimeField',
+        1700: 'DecimalField',
+    }
+        
+    def get_table_list(self, cursor):
+        "Returns a list of table names in the current database."
+        cursor.execute("""
+            SELECT c.relname
+            FROM pg_catalog.pg_class c
+            LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
+            WHERE c.relkind IN ('r', 'v', '')
+                AND n.nspname NOT IN ('pg_catalog', 'pg_toast')
+                AND pg_catalog.pg_table_is_visible(c.oid)""")
+        return [row[0] for row in cursor.fetchall()]
+
+    def get_table_description(self, cursor, table_name):
+        "Returns a description of the table, with the DB-API cursor.description interface."
+        cursor.execute("SELECT * FROM %s LIMIT 1" % self.connection.ops.quote_name(table_name))
+        return cursor.description
+
+    def get_relations(self, cursor, table_name):
+        """
+        Returns a dictionary of {field_index: (field_index_other_table, other_table)}
+        representing all relationships to the given table. Indexes are 0-based.
+        """
+        cursor.execute("""
+            SELECT con.conkey, con.confkey, c2.relname
+            FROM pg_constraint con, pg_class c1, pg_class c2
+            WHERE c1.oid = con.conrelid
+                AND c2.oid = con.confrelid
+                AND c1.relname = %s
+                AND con.contype = 'f'""", [table_name])
+        relations = {}
+        for row in cursor.fetchall():
+            try:
+                # row[0] and row[1] are like "{2}", so strip the curly braces.
+                relations[int(row[0][1:-1]) - 1] = (int(row[1][1:-1]) - 1, row[2])
+            except ValueError:
+                continue
+        return relations
+
+    def get_indexes(self, cursor, table_name):
+        """
+        Returns a dictionary of fieldname -> infodict for the given table,
+        where each infodict is in the format:
+            {'primary_key': boolean representing whether it's the primary key,
+             'unique': boolean representing whether it's a unique index}
+        """
+        # This query retrieves each index on the given table, including the
+        # first associated field name
+        cursor.execute("""
+            SELECT attr.attname, idx.indkey, idx.indisunique, idx.indisprimary
+            FROM pg_catalog.pg_class c, pg_catalog.pg_class c2,
+                pg_catalog.pg_index idx, pg_catalog.pg_attribute attr
+            WHERE c.oid = idx.indrelid
+                AND idx.indexrelid = c2.oid
+                AND attr.attrelid = c.oid
+                AND attr.attnum = idx.indkey[0]
+                AND c.relname = %s""", [table_name])
+        indexes = {}
+        for row in cursor.fetchall():
+            # row[1] (idx.indkey) is stored in the DB as an array. It comes out as
+            # a string of space-separated integers. This designates the field
+            # indexes (1-based) of the fields that have indexes on the table.
+            # Here, we skip any indexes across multiple fields.
+            if ' ' in row[1]:
+                continue
+            indexes[row[0]] = {'primary_key': row[3], 'unique': row[2]}
+        return indexes
+
diff --git a/webapp/django/db/backends/postgresql/operations.py b/webapp/django/db/backends/postgresql/operations.py
new file mode 100644
index 0000000..01cc1fc
--- /dev/null
+++ b/webapp/django/db/backends/postgresql/operations.py
@@ -0,0 +1,144 @@
+import re
+
+from django.db.backends import BaseDatabaseOperations
+
+server_version_re = re.compile(r'PostgreSQL (\d{1,2})\.(\d{1,2})\.?(\d{1,2})?')
+
+# This DatabaseOperations class lives in here instead of base.py because it's
+# used by both the 'postgresql' and 'postgresql_psycopg2' backends.
+
+class DatabaseOperations(BaseDatabaseOperations):
+    def __init__(self):
+        self._postgres_version = None
+
+    def _get_postgres_version(self):
+        if self._postgres_version is None:
+            from django.db import connection
+            cursor = connection.cursor()
+            cursor.execute("SELECT version()")
+            version_string = cursor.fetchone()[0]
+            m = server_version_re.match(version_string)
+            if not m:
+                raise Exception('Unable to determine PostgreSQL version from version() function string: %r' % version_string)
+            self._postgres_version = [int(val) for val in m.groups() if val]
+        return self._postgres_version
+    postgres_version = property(_get_postgres_version)
+
+    def date_extract_sql(self, lookup_type, field_name):
+        # http://www.postgresql.org/docs/8.0/static/functions-datetime.html#FUNCTIONS-DATETIME-EXTRACT
+        return "EXTRACT('%s' FROM %s)" % (lookup_type, field_name)
+
+    def date_trunc_sql(self, lookup_type, field_name):
+        # http://www.postgresql.org/docs/8.0/static/functions-datetime.html#FUNCTIONS-DATETIME-TRUNC
+        return "DATE_TRUNC('%s', %s)" % (lookup_type, field_name)
+
+    def deferrable_sql(self):
+        return " DEFERRABLE INITIALLY DEFERRED"
+
+    def lookup_cast(self, lookup_type):
+        lookup = '%s'
+
+        # Cast text lookups to text to allow things like filter(x__contains=4)
+        if lookup_type in ('iexact', 'contains', 'icontains', 'startswith',
+                           'istartswith', 'endswith', 'iendswith'):
+            lookup = "%s::text"
+
+        # Use UPPER(x) for case-insensitive lookups; it's faster.
+        if lookup_type in ('iexact', 'icontains', 'istartswith', 'iendswith'):
+            lookup = 'UPPER(%s)' % lookup
+
+        return lookup
+
+    def field_cast_sql(self, db_type):
+        if db_type == 'inet':
+            return 'HOST(%s)'
+        return '%s'
+
+    def last_insert_id(self, cursor, table_name, pk_name):
+        cursor.execute("SELECT CURRVAL('\"%s_%s_seq\"')" % (table_name, pk_name))
+        return cursor.fetchone()[0]
+
+    def no_limit_value(self):
+        return None
+
+    def quote_name(self, name):
+        if name.startswith('"') and name.endswith('"'):
+            return name # Quoting once is enough.
+        return '"%s"' % name
+
+    def sql_flush(self, style, tables, sequences):
+        if tables:
+            if self.postgres_version[0] >= 8 and self.postgres_version[1] >= 1:
+                # Postgres 8.1+ can do 'TRUNCATE x, y, z...;'. In fact, it *has to*
+                # in order to be able to truncate tables referenced by a foreign
+                # key in any other table. The result is a single SQL TRUNCATE
+                # statement.
+                sql = ['%s %s;' % \
+                    (style.SQL_KEYWORD('TRUNCATE'),
+                     style.SQL_FIELD(', '.join([self.quote_name(table) for table in tables]))
+                )]
+            else:
+                # Older versions of Postgres can't do TRUNCATE in a single call, so
+                # they must use a simple delete.
+                sql = ['%s %s %s;' % \
+                        (style.SQL_KEYWORD('DELETE'),
+                         style.SQL_KEYWORD('FROM'),
+                         style.SQL_FIELD(self.quote_name(table))
+                         ) for table in tables]
+
+            # 'ALTER SEQUENCE sequence_name RESTART WITH 1;'... style SQL statements
+            # to reset sequence indices
+            for sequence_info in sequences:
+                table_name = sequence_info['table']
+                column_name = sequence_info['column']
+                if column_name and len(column_name) > 0:
+                    sequence_name = '%s_%s_seq' % (table_name, column_name)
+                else:
+                    sequence_name = '%s_id_seq' % table_name
+                sql.append("%s setval('%s', 1, false);" % \
+                    (style.SQL_KEYWORD('SELECT'),
+                    style.SQL_FIELD(self.quote_name(sequence_name)))
+                )
+            return sql
+        else:
+            return []
+
+    def sequence_reset_sql(self, style, model_list):
+        from django.db import models
+        output = []
+        qn = self.quote_name
+        for model in model_list:
+            # Use `coalesce` to set the sequence for each model to the max pk value if there are records,
+            # or 1 if there are none. Set the `is_called` property (the third argument to `setval`) to true
+            # if there are records (as the max pk value is already in use), otherwise set it to false.
+            for f in model._meta.local_fields:
+                if isinstance(f, models.AutoField):
+                    output.append("%s setval('%s', coalesce(max(%s), 1), max(%s) %s null) %s %s;" % \
+                        (style.SQL_KEYWORD('SELECT'),
+                        style.SQL_FIELD(qn('%s_%s_seq' % (model._meta.db_table, f.column))),
+                        style.SQL_FIELD(qn(f.column)),
+                        style.SQL_FIELD(qn(f.column)),
+                        style.SQL_KEYWORD('IS NOT'),
+                        style.SQL_KEYWORD('FROM'),
+                        style.SQL_TABLE(qn(model._meta.db_table))))
+                    break # Only one AutoField is allowed per model, so don't bother continuing.
+            for f in model._meta.many_to_many:
+                output.append("%s setval('%s', coalesce(max(%s), 1), max(%s) %s null) %s %s;" % \
+                    (style.SQL_KEYWORD('SELECT'),
+                    style.SQL_FIELD(qn('%s_id_seq' % f.m2m_db_table())),
+                    style.SQL_FIELD(qn('id')),
+                    style.SQL_FIELD(qn('id')),
+                    style.SQL_KEYWORD('IS NOT'),
+                    style.SQL_KEYWORD('FROM'),
+                    style.SQL_TABLE(qn(f.m2m_db_table()))))
+        return output
+
+    def savepoint_create_sql(self, sid):
+        return "SAVEPOINT %s" % sid
+
+    def savepoint_commit_sql(self, sid):
+        return "RELEASE SAVEPOINT %s" % sid
+
+    def savepoint_rollback_sql(self, sid):
+        return "ROLLBACK TO SAVEPOINT %s" % sid
+
diff --git a/webapp/django/db/backends/postgresql/version.py b/webapp/django/db/backends/postgresql/version.py
new file mode 100644
index 0000000..e14d791
--- /dev/null
+++ b/webapp/django/db/backends/postgresql/version.py
@@ -0,0 +1,18 @@
+"""
+Extracts the version of the PostgreSQL server.
+"""
+
+import re
+
+VERSION_RE = re.compile(r'PostgreSQL (\d+)\.(\d+)\.')
+
+def get_version(cursor):
+    """
+    Returns a tuple representing the major and minor version number of the
+    server. For example, (7, 4) or (8, 3).
+    """
+    cursor.execute("SELECT version()")
+    version = cursor.fetchone()[0]
+    major, minor = VERSION_RE.search(version).groups()
+    return int(major), int(minor)
+
diff --git a/webapp/django/db/backends/postgresql_psycopg2/__init__.py b/webapp/django/db/backends/postgresql_psycopg2/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/db/backends/postgresql_psycopg2/__init__.py
diff --git a/webapp/django/db/backends/postgresql_psycopg2/base.py b/webapp/django/db/backends/postgresql_psycopg2/base.py
new file mode 100644
index 0000000..6ecf86b
--- /dev/null
+++ b/webapp/django/db/backends/postgresql_psycopg2/base.py
@@ -0,0 +1,97 @@
+"""
+PostgreSQL database backend for Django.
+
+Requires psycopg 2: http://initd.org/projects/psycopg2
+"""
+
+from django.db.backends import *
+from django.db.backends.postgresql.operations import DatabaseOperations as PostgresqlDatabaseOperations
+from django.db.backends.postgresql.client import DatabaseClient
+from django.db.backends.postgresql.creation import DatabaseCreation
+from django.db.backends.postgresql.version import get_version
+from django.db.backends.postgresql_psycopg2.introspection import DatabaseIntrospection
+from django.utils.safestring import SafeUnicode, SafeString
+
+try:
+    import psycopg2 as Database
+    import psycopg2.extensions
+except ImportError, e:
+    from django.core.exceptions import ImproperlyConfigured
+    raise ImproperlyConfigured("Error loading psycopg2 module: %s" % e)
+
+DatabaseError = Database.DatabaseError
+IntegrityError = Database.IntegrityError
+
+psycopg2.extensions.register_type(psycopg2.extensions.UNICODE)
+psycopg2.extensions.register_adapter(SafeString, psycopg2.extensions.QuotedString)
+psycopg2.extensions.register_adapter(SafeUnicode, psycopg2.extensions.QuotedString)
+
+class DatabaseFeatures(BaseDatabaseFeatures):
+    needs_datetime_string_cast = False
+    uses_savepoints = True
+
+class DatabaseOperations(PostgresqlDatabaseOperations):
+    def last_executed_query(self, cursor, sql, params):
+        # With psycopg2, cursor objects have a "query" attribute that is the
+        # exact query sent to the database. See docs here:
+        # http://www.initd.org/tracker/psycopg/wiki/psycopg2_documentation#postgresql-status-message-and-executed-query
+        return cursor.query
+
+class DatabaseWrapper(BaseDatabaseWrapper):
+    operators = {
+        'exact': '= %s',
+        'iexact': '= UPPER(%s)',
+        'contains': 'LIKE %s',
+        'icontains': 'LIKE UPPER(%s)',
+        'regex': '~ %s',
+        'iregex': '~* %s',
+        'gt': '> %s',
+        'gte': '>= %s',
+        'lt': '< %s',
+        'lte': '<= %s',
+        'startswith': 'LIKE %s',
+        'endswith': 'LIKE %s',
+        'istartswith': 'LIKE UPPER(%s)',
+        'iendswith': 'LIKE UPPER(%s)',
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(DatabaseWrapper, self).__init__(*args, **kwargs)
+        
+        self.features = DatabaseFeatures()
+        self.ops = DatabaseOperations()
+        self.client = DatabaseClient()
+        self.creation = DatabaseCreation(self)
+        self.introspection = DatabaseIntrospection(self)
+        self.validation = BaseDatabaseValidation()
+
+    def _cursor(self, settings):
+        set_tz = False
+        if self.connection is None:
+            set_tz = True
+            if settings.DATABASE_NAME == '':
+                from django.core.exceptions import ImproperlyConfigured
+                raise ImproperlyConfigured("You need to specify DATABASE_NAME in your Django settings file.")
+            conn_string = "dbname=%s" % settings.DATABASE_NAME
+            if settings.DATABASE_USER:
+                conn_string = "user=%s %s" % (settings.DATABASE_USER, conn_string)
+            if settings.DATABASE_PASSWORD:
+                conn_string += " password='%s'" % settings.DATABASE_PASSWORD
+            if settings.DATABASE_HOST:
+                conn_string += " host=%s" % settings.DATABASE_HOST
+            if settings.DATABASE_PORT:
+                conn_string += " port=%s" % settings.DATABASE_PORT
+            self.connection = Database.connect(conn_string, **self.options)
+            self.connection.set_isolation_level(1) # make transactions transparent to all cursors
+            self.connection.set_client_encoding('UTF8')
+        cursor = self.connection.cursor()
+        cursor.tzinfo_factory = None
+        if set_tz:
+            cursor.execute("SET TIME ZONE %s", [settings.TIME_ZONE])
+            if not hasattr(self, '_version'):
+                version = get_version(cursor)
+                self.__class__._version = version
+                if version < (8, 0):
+                    # No savepoint support for earlier version of PostgreSQL.
+                    self.features.uses_savepoints = False
+        return cursor
diff --git a/webapp/django/db/backends/postgresql_psycopg2/introspection.py b/webapp/django/db/backends/postgresql_psycopg2/introspection.py
new file mode 100644
index 0000000..83bd9b4
--- /dev/null
+++ b/webapp/django/db/backends/postgresql_psycopg2/introspection.py
@@ -0,0 +1,21 @@
+from django.db.backends.postgresql.introspection import DatabaseIntrospection as PostgresDatabaseIntrospection
+
+class DatabaseIntrospection(PostgresDatabaseIntrospection):
+
+    def get_relations(self, cursor, table_name):
+        """
+        Returns a dictionary of {field_index: (field_index_other_table, other_table)}
+        representing all relationships to the given table. Indexes are 0-based.
+        """
+        cursor.execute("""
+            SELECT con.conkey, con.confkey, c2.relname
+            FROM pg_constraint con, pg_class c1, pg_class c2
+            WHERE c1.oid = con.conrelid
+                AND c2.oid = con.confrelid
+                AND c1.relname = %s
+                AND con.contype = 'f'""", [table_name])
+        relations = {}
+        for row in cursor.fetchall():
+            # row[0] and row[1] are single-item lists, so grab the single item.
+            relations[row[0][0] - 1] = (row[1][0] - 1, row[2])
+        return relations
diff --git a/webapp/django/db/backends/sqlite3/__init__.py b/webapp/django/db/backends/sqlite3/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/db/backends/sqlite3/__init__.py
diff --git a/webapp/django/db/backends/sqlite3/base.py b/webapp/django/db/backends/sqlite3/base.py
new file mode 100644
index 0000000..64da52e
--- /dev/null
+++ b/webapp/django/db/backends/sqlite3/base.py
@@ -0,0 +1,204 @@
+"""
+SQLite3 backend for django.
+
+Python 2.3 and 2.4 require pysqlite2 (http://pysqlite.org/).
+
+Python 2.5 and later use the sqlite3 module in the standard library.
+"""
+
+from django.db.backends import *
+from django.db.backends.sqlite3.client import DatabaseClient
+from django.db.backends.sqlite3.creation import DatabaseCreation
+from django.db.backends.sqlite3.introspection import DatabaseIntrospection
+
+try:
+    try:
+        from sqlite3 import dbapi2 as Database
+    except ImportError:
+        from pysqlite2 import dbapi2 as Database
+except ImportError, e:
+    import sys
+    from django.core.exceptions import ImproperlyConfigured
+    if sys.version_info < (2, 5, 0):
+        module = 'pysqlite2'
+    else:
+        module = 'sqlite3'
+    raise ImproperlyConfigured, "Error loading %s module: %s" % (module, e)
+
+try:
+    import decimal
+except ImportError:
+    from django.utils import _decimal as decimal # for Python 2.3
+
+DatabaseError = Database.DatabaseError
+IntegrityError = Database.IntegrityError
+
+Database.register_converter("bool", lambda s: str(s) == '1')
+Database.register_converter("time", util.typecast_time)
+Database.register_converter("date", util.typecast_date)
+Database.register_converter("datetime", util.typecast_timestamp)
+Database.register_converter("timestamp", util.typecast_timestamp)
+Database.register_converter("TIMESTAMP", util.typecast_timestamp)
+Database.register_converter("decimal", util.typecast_decimal)
+Database.register_adapter(decimal.Decimal, util.rev_typecast_decimal)
+if Database.version_info >= (2,4,1):
+    # Starting in 2.4.1, the str type is not accepted anymore, therefore,
+    # we convert all str objects to Unicode
+    # As registering a adapter for a primitive type causes a small
+    # slow-down, this adapter is only registered for sqlite3 versions
+    # needing it.
+    Database.register_adapter(str, lambda s:s.decode('utf-8'))
+
+class DatabaseFeatures(BaseDatabaseFeatures):
+    # SQLite cannot handle us only partially reading from a cursor's result set
+    # and then writing the same rows to the database in another cursor. This
+    # setting ensures we always read result sets fully into memory all in one
+    # go.
+    can_use_chunked_reads = False
+
+class DatabaseOperations(BaseDatabaseOperations):
+    def date_extract_sql(self, lookup_type, field_name):
+        # sqlite doesn't support extract, so we fake it with the user-defined
+        # function django_extract that's registered in connect().
+        return 'django_extract("%s", %s)' % (lookup_type.lower(), field_name)
+
+    def date_trunc_sql(self, lookup_type, field_name):
+        # sqlite doesn't support DATE_TRUNC, so we fake it with a user-defined
+        # function django_date_trunc that's registered in connect().
+        return 'django_date_trunc("%s", %s)' % (lookup_type.lower(), field_name)
+
+    def drop_foreignkey_sql(self):
+        return ""
+
+    def pk_default_value(self):
+        return 'NULL'
+
+    def quote_name(self, name):
+        if name.startswith('"') and name.endswith('"'):
+            return name # Quoting once is enough.
+        return '"%s"' % name
+
+    def no_limit_value(self):
+        return -1
+
+    def sql_flush(self, style, tables, sequences):
+        # NB: The generated SQL below is specific to SQLite
+        # Note: The DELETE FROM... SQL generated below works for SQLite databases
+        # because constraints don't exist
+        sql = ['%s %s %s;' % \
+                (style.SQL_KEYWORD('DELETE'),
+                 style.SQL_KEYWORD('FROM'),
+                 style.SQL_FIELD(self.quote_name(table))
+                 ) for table in tables]
+        # Note: No requirement for reset of auto-incremented indices (cf. other
+        # sql_flush() implementations). Just return SQL at this point
+        return sql
+
+    def year_lookup_bounds(self, value):
+        first = '%s-01-01'
+        second = '%s-12-31 23:59:59.999999'
+        return [first % value, second % value]
+
+class DatabaseWrapper(BaseDatabaseWrapper):
+    
+    # SQLite requires LIKE statements to include an ESCAPE clause if the value
+    # being escaped has a percent or underscore in it.
+    # See http://www.sqlite.org/lang_expr.html for an explanation.
+    operators = {
+        'exact': '= %s',
+        'iexact': "LIKE %s ESCAPE '\\'",
+        'contains': "LIKE %s ESCAPE '\\'",
+        'icontains': "LIKE %s ESCAPE '\\'",
+        'regex': 'REGEXP %s',
+        'iregex': "REGEXP '(?i)' || %s",
+        'gt': '> %s',
+        'gte': '>= %s',
+        'lt': '< %s',
+        'lte': '<= %s',
+        'startswith': "LIKE %s ESCAPE '\\'",
+        'endswith': "LIKE %s ESCAPE '\\'",
+        'istartswith': "LIKE %s ESCAPE '\\'",
+        'iendswith': "LIKE %s ESCAPE '\\'",
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(DatabaseWrapper, self).__init__(*args, **kwargs)
+        
+        self.features = DatabaseFeatures()
+        self.ops = DatabaseOperations()
+        self.client = DatabaseClient()
+        self.creation = DatabaseCreation(self)
+        self.introspection = DatabaseIntrospection(self)
+        self.validation = BaseDatabaseValidation()
+
+    def _cursor(self, settings):
+        if self.connection is None:
+            if not settings.DATABASE_NAME:
+                from django.core.exceptions import ImproperlyConfigured
+                raise ImproperlyConfigured, "Please fill out DATABASE_NAME in the settings module before using the database."
+            kwargs = {
+                'database': settings.DATABASE_NAME,
+                'detect_types': Database.PARSE_DECLTYPES | Database.PARSE_COLNAMES,
+            }
+            kwargs.update(self.options)
+            self.connection = Database.connect(**kwargs)
+            # Register extract, date_trunc, and regexp functions.
+            self.connection.create_function("django_extract", 2, _sqlite_extract)
+            self.connection.create_function("django_date_trunc", 2, _sqlite_date_trunc)
+            self.connection.create_function("regexp", 2, _sqlite_regexp)
+        return self.connection.cursor(factory=SQLiteCursorWrapper)
+
+    def close(self):
+        from django.conf import settings
+        # If database is in memory, closing the connection destroys the
+        # database. To prevent accidental data loss, ignore close requests on
+        # an in-memory db.
+        if settings.DATABASE_NAME != ":memory:":
+            BaseDatabaseWrapper.close(self)
+
+class SQLiteCursorWrapper(Database.Cursor):
+    """
+    Django uses "format" style placeholders, but pysqlite2 uses "qmark" style.
+    This fixes it -- but note that if you want to use a literal "%s" in a query,
+    you'll need to use "%%s".
+    """
+    def execute(self, query, params=()):
+        query = self.convert_query(query, len(params))
+        return Database.Cursor.execute(self, query, params)
+
+    def executemany(self, query, param_list):
+        try:
+          query = self.convert_query(query, len(param_list[0]))
+          return Database.Cursor.executemany(self, query, param_list)
+        except (IndexError,TypeError):
+          # No parameter list provided
+          return None
+
+    def convert_query(self, query, num_params):
+        return query % tuple("?" * num_params)
+
+def _sqlite_extract(lookup_type, dt):
+    try:
+        dt = util.typecast_timestamp(dt)
+    except (ValueError, TypeError):
+        return None
+    return unicode(getattr(dt, lookup_type))
+
+def _sqlite_date_trunc(lookup_type, dt):
+    try:
+        dt = util.typecast_timestamp(dt)
+    except (ValueError, TypeError):
+        return None
+    if lookup_type == 'year':
+        return "%i-01-01 00:00:00" % dt.year
+    elif lookup_type == 'month':
+        return "%i-%02i-01 00:00:00" % (dt.year, dt.month)
+    elif lookup_type == 'day':
+        return "%i-%02i-%02i 00:00:00" % (dt.year, dt.month, dt.day)
+
+def _sqlite_regexp(re_pattern, re_string):
+    import re
+    try:
+        return bool(re.search(re_pattern, re_string))
+    except:
+        return False
diff --git a/webapp/django/db/backends/sqlite3/client.py b/webapp/django/db/backends/sqlite3/client.py
new file mode 100644
index 0000000..affb1c2
--- /dev/null
+++ b/webapp/django/db/backends/sqlite3/client.py
@@ -0,0 +1,8 @@
+from django.db.backends import BaseDatabaseClient
+from django.conf import settings
+import os
+
+class DatabaseClient(BaseDatabaseClient):
+    def runshell(self):
+        args = ['', settings.DATABASE_NAME]
+        os.execvp('sqlite3', args)
diff --git a/webapp/django/db/backends/sqlite3/creation.py b/webapp/django/db/backends/sqlite3/creation.py
new file mode 100644
index 0000000..8943854
--- /dev/null
+++ b/webapp/django/db/backends/sqlite3/creation.py
@@ -0,0 +1,72 @@
+import os
+import sys
+from django.conf import settings
+from django.db.backends.creation import BaseDatabaseCreation
+
+class DatabaseCreation(BaseDatabaseCreation):
+    # SQLite doesn't actually support most of these types, but it "does the right
+    # thing" given more verbose field definitions, so leave them as is so that
+    # schema inspection is more useful.
+    data_types = {
+        'AutoField':                    'integer',
+        'BooleanField':                 'bool',
+        'CharField':                    'varchar(%(max_length)s)',
+        'CommaSeparatedIntegerField':   'varchar(%(max_length)s)',
+        'DateField':                    'date',
+        'DateTimeField':                'datetime',
+        'DecimalField':                 'decimal',
+        'FileField':                    'varchar(%(max_length)s)',
+        'FilePathField':                'varchar(%(max_length)s)',
+        'FloatField':                   'real',
+        'IntegerField':                 'integer',
+        'IPAddressField':               'char(15)',
+        'NullBooleanField':             'bool',
+        'OneToOneField':                'integer',
+        'PhoneNumberField':             'varchar(20)',
+        'PositiveIntegerField':         'integer unsigned',
+        'PositiveSmallIntegerField':    'smallint unsigned',
+        'SlugField':                    'varchar(%(max_length)s)',
+        'SmallIntegerField':            'smallint',
+        'TextField':                    'text',
+        'TimeField':                    'time',
+        'USStateField':                 'varchar(2)',
+    }
+    
+    def sql_for_pending_references(self, model, style, pending_references):
+        "SQLite3 doesn't support constraints"
+        return []
+
+    def sql_remove_table_constraints(self, model, references_to_delete, style):
+        "SQLite3 doesn't support constraints"
+        return []
+        
+    def _create_test_db(self, verbosity, autoclobber):
+        if settings.TEST_DATABASE_NAME and settings.TEST_DATABASE_NAME != ":memory:":
+            test_database_name = settings.TEST_DATABASE_NAME
+            # Erase the old test database
+            if verbosity >= 1:
+                print "Destroying old test database..."
+            if os.access(test_database_name, os.F_OK):
+                if not autoclobber:
+                    confirm = raw_input("Type 'yes' if you would like to try deleting the test database '%s', or 'no' to cancel: " % test_database_name)
+                if autoclobber or confirm == 'yes':
+                  try:
+                      if verbosity >= 1:
+                          print "Destroying old test database..."
+                      os.remove(test_database_name)
+                  except Exception, e:
+                      sys.stderr.write("Got an error deleting the old test database: %s\n" % e)
+                      sys.exit(2)
+                else:
+                    print "Tests cancelled."
+                    sys.exit(1)
+            if verbosity >= 1:
+                print "Creating test database..."
+        else:
+            test_database_name = ":memory:"
+        return test_database_name
+        
+    def _destroy_test_db(self, test_database_name, verbosity):
+        if test_database_name and test_database_name != ":memory:":
+            # Remove the SQLite database file
+            os.remove(test_database_name)
diff --git a/webapp/django/db/backends/sqlite3/introspection.py b/webapp/django/db/backends/sqlite3/introspection.py
new file mode 100644
index 0000000..5e26f33
--- /dev/null
+++ b/webapp/django/db/backends/sqlite3/introspection.py
@@ -0,0 +1,89 @@
+from django.db.backends import BaseDatabaseIntrospection
+
+# This light wrapper "fakes" a dictionary interface, because some SQLite data
+# types include variables in them -- e.g. "varchar(30)" -- and can't be matched
+# as a simple dictionary lookup.
+class FlexibleFieldLookupDict:
+    # Maps SQL types to Django Field types. Some of the SQL types have multiple
+    # entries here because SQLite allows for anything and doesn't normalize the
+    # field type; it uses whatever was given.
+    base_data_types_reverse = {
+        'bool': 'BooleanField',
+        'boolean': 'BooleanField',
+        'smallint': 'SmallIntegerField',
+        'smallinteger': 'SmallIntegerField',
+        'int': 'IntegerField',
+        'integer': 'IntegerField',
+        'text': 'TextField',
+        'char': 'CharField',
+        'date': 'DateField',
+        'datetime': 'DateTimeField',
+        'time': 'TimeField',
+    }
+
+    def __getitem__(self, key):
+        key = key.lower()
+        try:
+            return self.base_data_types_reverse[key]
+        except KeyError:
+            import re
+            m = re.search(r'^\s*(?:var)?char\s*\(\s*(\d+)\s*\)\s*$', key)
+            if m:
+                return ('CharField', {'max_length': int(m.group(1))})
+            raise KeyError
+
+class DatabaseIntrospection(BaseDatabaseIntrospection):
+    data_types_reverse = FlexibleFieldLookupDict()
+        
+    def get_table_list(self, cursor):
+        "Returns a list of table names in the current database."
+        # Skip the sqlite_sequence system table used for autoincrement key
+        # generation.
+        cursor.execute("""
+            SELECT name FROM sqlite_master
+            WHERE type='table' AND NOT name='sqlite_sequence'
+            ORDER BY name""")
+        return [row[0] for row in cursor.fetchall()]
+
+    def get_table_description(self, cursor, table_name):
+        "Returns a description of the table, with the DB-API cursor.description interface."
+        return [(info['name'], info['type'], None, None, None, None,
+                 info['null_ok']) for info in self._table_info(cursor, table_name)]
+
+    def get_relations(self, cursor, table_name):
+        raise NotImplementedError
+
+    def get_indexes(self, cursor, table_name):
+        """
+        Returns a dictionary of fieldname -> infodict for the given table,
+        where each infodict is in the format:
+            {'primary_key': boolean representing whether it's the primary key,
+             'unique': boolean representing whether it's a unique index}
+        """
+        indexes = {}
+        for info in self._table_info(cursor, table_name):
+            indexes[info['name']] = {'primary_key': info['pk'] != 0,
+                                     'unique': False}
+        cursor.execute('PRAGMA index_list(%s)' % self.connection.ops.quote_name(table_name))
+        # seq, name, unique
+        for index, unique in [(field[1], field[2]) for field in cursor.fetchall()]:
+            if not unique:
+                continue
+            cursor.execute('PRAGMA index_info(%s)' % self.connection.ops.quote_name(index))
+            info = cursor.fetchall()
+            # Skip indexes across multiple fields
+            if len(info) != 1:
+                continue
+            name = info[0][2] # seqno, cid, name
+            indexes[name]['unique'] = True
+        return indexes
+
+    def _table_info(self, cursor, name):
+        cursor.execute('PRAGMA table_info(%s)' % self.connection.ops.quote_name(name))
+        # cid, name, type, notnull, dflt_value, pk
+        return [{'name': field[1],
+                 'type': field[2],
+                 'null_ok': not field[3],
+                 'pk': field[5]     # undocumented
+                 } for field in cursor.fetchall()]
+
diff --git a/webapp/django/db/backends/util.py b/webapp/django/db/backends/util.py
new file mode 100644
index 0000000..7228b40
--- /dev/null
+++ b/webapp/django/db/backends/util.py
@@ -0,0 +1,127 @@
+import datetime
+from time import time
+
+from django.utils.hashcompat import md5_constructor
+
+try:
+    import decimal
+except ImportError:
+    from django.utils import _decimal as decimal    # for Python 2.3
+
+class CursorDebugWrapper(object):
+    def __init__(self, cursor, db):
+        self.cursor = cursor
+        self.db = db # Instance of a BaseDatabaseWrapper subclass
+
+    def execute(self, sql, params=()):
+        start = time()
+        try:
+            return self.cursor.execute(sql, params)
+        finally:
+            stop = time()
+            sql = self.db.ops.last_executed_query(self.cursor, sql, params)
+            self.db.queries.append({
+                'sql': sql,
+                'time': "%.3f" % (stop - start),
+            })
+
+    def executemany(self, sql, param_list):
+        start = time()
+        try:
+            return self.cursor.executemany(sql, param_list)
+        finally:
+            stop = time()
+            self.db.queries.append({
+                'sql': '%s times: %s' % (len(param_list), sql),
+                'time': "%.3f" % (stop - start),
+            })
+
+    def __getattr__(self, attr):
+        if attr in self.__dict__:
+            return self.__dict__[attr]
+        else:
+            return getattr(self.cursor, attr)
+
+    def __iter__(self):
+        return iter(self.cursor)
+
+###############################################
+# Converters from database (string) to Python #
+###############################################
+
+def typecast_date(s):
+    return s and datetime.date(*map(int, s.split('-'))) or None # returns None if s is null
+
+def typecast_time(s): # does NOT store time zone information
+    if not s: return None
+    hour, minutes, seconds = s.split(':')
+    if '.' in seconds: # check whether seconds have a fractional part
+        seconds, microseconds = seconds.split('.')
+    else:
+        microseconds = '0'
+    return datetime.time(int(hour), int(minutes), int(seconds), int(float('.'+microseconds) * 1000000))
+
+def typecast_timestamp(s): # does NOT store time zone information
+    # "2005-07-29 15:48:00.590358-05"
+    # "2005-07-29 09:56:00-05"
+    if not s: return None
+    if not ' ' in s: return typecast_date(s)
+    d, t = s.split()
+    # Extract timezone information, if it exists. Currently we just throw
+    # it away, but in the future we may make use of it.
+    if '-' in t:
+        t, tz = t.split('-', 1)
+        tz = '-' + tz
+    elif '+' in t:
+        t, tz = t.split('+', 1)
+        tz = '+' + tz
+    else:
+        tz = ''
+    dates = d.split('-')
+    times = t.split(':')
+    seconds = times[2]
+    if '.' in seconds: # check whether seconds have a fractional part
+        seconds, microseconds = seconds.split('.')
+    else:
+        microseconds = '0'
+    return datetime.datetime(int(dates[0]), int(dates[1]), int(dates[2]),
+        int(times[0]), int(times[1]), int(seconds), int(float('.'+microseconds) * 1000000))
+
+def typecast_boolean(s):
+    if s is None: return None
+    if not s: return False
+    return str(s)[0].lower() == 't'
+
+def typecast_decimal(s):
+    if s is None or s == '':
+        return None
+    return decimal.Decimal(s)
+
+###############################################
+# Converters from Python to database (string) #
+###############################################
+
+def rev_typecast_boolean(obj, d):
+    return obj and '1' or '0'
+
+def rev_typecast_decimal(d):
+    if d is None:
+        return None
+    return str(d)
+
+def truncate_name(name, length=None):
+    """Shortens a string to a repeatable mangled version with the given length.
+    """
+    if length is None or len(name) <= length:
+        return name
+
+    hash = md5_constructor(name).hexdigest()[:4]
+
+    return '%s%s' % (name[:length-4], hash)
+
+def format_number(value, max_digits, decimal_places):
+    """
+    Formats a number into a string with the requisite number of digits and
+    decimal places.
+    """
+    return u"%.*f" % (decimal_places, value)
diff --git a/webapp/django/db/models/__init__.py b/webapp/django/db/models/__init__.py
new file mode 100644
index 0000000..cbd6855
--- /dev/null
+++ b/webapp/django/db/models/__init__.py
@@ -0,0 +1,32 @@
+from django.conf import settings
+from django.core.exceptions import ObjectDoesNotExist, ImproperlyConfigured
+from django.core import validators
+from django.db import connection
+from django.db.models.loading import get_apps, get_app, get_models, get_model, register_models
+from django.db.models.query import Q
+from django.db.models.manager import Manager
+from django.db.models.base import Model
+from django.db.models.fields import *
+from django.db.models.fields.subclassing import SubfieldBase
+from django.db.models.fields.files import FileField, ImageField
+from django.db.models.fields.related import ForeignKey, OneToOneField, ManyToManyField, ManyToOneRel, ManyToManyRel, OneToOneRel, TABULAR, STACKED
+from django.db.models import signals
+
+# Admin stages.
+ADD, CHANGE, BOTH = 1, 2, 3
+
+def permalink(func):
+    """
+    Decorator that calls urlresolvers.reverse() to return a URL using
+    parameters returned by the decorated function "func".
+
+    "func" should be a function that returns a tuple in one of the
+    following formats:
+        (viewname, viewargs)
+        (viewname, viewargs, viewkwargs)
+    """
+    from django.core.urlresolvers import reverse
+    def inner(*args, **kwargs):
+        bits = func(*args, **kwargs)
+        return reverse(bits[0], None, *bits[1:3])
+    return inner
diff --git a/webapp/django/db/models/base.py b/webapp/django/db/models/base.py
new file mode 100644
index 0000000..115d82b
--- /dev/null
+++ b/webapp/django/db/models/base.py
@@ -0,0 +1,504 @@
+import copy
+import types
+import sys
+import os
+from itertools import izip
+try:
+    set
+except NameError:
+    from sets import Set as set     # Python 2.3 fallback.
+
+import django.db.models.manipulators    # Imported to register signal handler.
+import django.db.models.manager         # Ditto.
+from django.core import validators
+from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned, FieldError
+from django.db.models.fields import AutoField
+from django.db.models.fields.related import OneToOneRel, ManyToOneRel, OneToOneField
+from django.db.models.query import delete_objects, Q, CollectedObjects
+from django.db.models.options import Options
+from django.db import connection, transaction, DatabaseError
+from django.db.models import signals
+from django.db.models.loading import register_models, get_model
+from django.utils.functional import curry
+from django.utils.encoding import smart_str, force_unicode, smart_unicode
+from django.core.files.move import file_move_safe
+from django.core.files import locks
+from django.conf import settings
+
+
+class ModelBase(type):
+    """
+    Metaclass for all models.
+    """
+    def __new__(cls, name, bases, attrs):
+        super_new = super(ModelBase, cls).__new__
+        parents = [b for b in bases if isinstance(b, ModelBase)]
+        if not parents:
+            # If this isn't a subclass of Model, don't do anything special.
+            return super_new(cls, name, bases, attrs)
+
+        # Create the class.
+        module = attrs.pop('__module__')
+        new_class = super_new(cls, name, bases, {'__module__': module})
+        attr_meta = attrs.pop('Meta', None)
+        abstract = getattr(attr_meta, 'abstract', False)
+        if not attr_meta:
+            meta = getattr(new_class, 'Meta', None)
+        else:
+            meta = attr_meta
+        base_meta = getattr(new_class, '_meta', None)
+
+        if getattr(meta, 'app_label', None) is None:
+            # Figure out the app_label by looking one level up.
+            # For 'django.contrib.sites.models', this would be 'sites'.
+            model_module = sys.modules[new_class.__module__]
+            kwargs = {"app_label": model_module.__name__.split('.')[-2]}
+        else:
+            kwargs = {}
+
+        new_class.add_to_class('_meta', Options(meta, **kwargs))
+        if not abstract:
+            new_class.add_to_class('DoesNotExist',
+                    subclass_exception('DoesNotExist', ObjectDoesNotExist, module))
+            new_class.add_to_class('MultipleObjectsReturned',
+                    subclass_exception('MultipleObjectsReturned', MultipleObjectsReturned, module))
+            if base_meta and not base_meta.abstract:
+                # Non-abstract child classes inherit some attributes from their
+                # non-abstract parent (unless an ABC comes before it in the
+                # method resolution order).
+                if not hasattr(meta, 'ordering'):
+                    new_class._meta.ordering = base_meta.ordering
+                if not hasattr(meta, 'get_latest_by'):
+                    new_class._meta.get_latest_by = base_meta.get_latest_by
+
+        old_default_mgr = None
+        if getattr(new_class, '_default_manager', None):
+            # We have a parent who set the default manager.
+            if new_class._default_manager.model._meta.abstract:
+                old_default_mgr = new_class._default_manager
+            new_class._default_manager = None
+
+        # Bail out early if we have already created this class.
+        m = get_model(new_class._meta.app_label, name, False)
+        if m is not None:
+            return m
+
+        # Add all attributes to the class.
+        for obj_name, obj in attrs.items():
+            new_class.add_to_class(obj_name, obj)
+
+        # Do the appropriate setup for any model parents.
+        o2o_map = dict([(f.rel.to, f) for f in new_class._meta.local_fields
+                if isinstance(f, OneToOneField)])
+        for base in parents:
+            if not hasattr(base, '_meta'):
+                # Things without _meta aren't functional models, so they're
+                # uninteresting parents.
+                continue
+            if not base._meta.abstract:
+                if base in o2o_map:
+                    field = o2o_map[base]
+                    field.primary_key = True
+                    new_class._meta.setup_pk(field)
+                else:
+                    attr_name = '%s_ptr' % base._meta.module_name
+                    field = OneToOneField(base, name=attr_name,
+                            auto_created=True, parent_link=True)
+                    new_class.add_to_class(attr_name, field)
+                new_class._meta.parents[base] = field
+            else:
+                # The abstract base class case.
+                names = set([f.name for f in new_class._meta.local_fields + new_class._meta.many_to_many])
+                for field in base._meta.local_fields + base._meta.local_many_to_many:
+                    if field.name in names:
+                        raise FieldError('Local field %r in class %r clashes with field of similar name from abstract base class %r'
+                                % (field.name, name, base.__name__))
+                    new_class.add_to_class(field.name, copy.deepcopy(field))
+
+        if abstract:
+            # Abstract base models can't be instantiated and don't appear in
+            # the list of models for an app. We do the final setup for them a
+            # little differently from normal models.
+            attr_meta.abstract = False
+            new_class.Meta = attr_meta
+            return new_class
+
+        if old_default_mgr and not new_class._default_manager:
+            new_class._default_manager = old_default_mgr._copy_to_model(new_class)
+        new_class._prepare()
+        register_models(new_class._meta.app_label, new_class)
+
+        # Because of the way imports happen (recursively), we may or may not be
+        # the first time this model tries to register with the framework. There
+        # should only be one class for each model, so we always return the
+        # registered version.
+        return get_model(new_class._meta.app_label, name, False)
+
+    def add_to_class(cls, name, value):
+        if hasattr(value, 'contribute_to_class'):
+            value.contribute_to_class(cls, name)
+        else:
+            setattr(cls, name, value)
+
+    def _prepare(cls):
+        """
+        Creates some methods once self._meta has been populated.
+        """
+        opts = cls._meta
+        opts._prepare(cls)
+
+        if opts.order_with_respect_to:
+            cls.get_next_in_order = curry(cls._get_next_or_previous_in_order, is_next=True)
+            cls.get_previous_in_order = curry(cls._get_next_or_previous_in_order, is_next=False)
+            setattr(opts.order_with_respect_to.rel.to, 'get_%s_order' % cls.__name__.lower(), curry(method_get_order, cls))
+            setattr(opts.order_with_respect_to.rel.to, 'set_%s_order' % cls.__name__.lower(), curry(method_set_order, cls))
+
+        # Give the class a docstring -- its definition.
+        if cls.__doc__ is None:
+            cls.__doc__ = "%s(%s)" % (cls.__name__, ", ".join([f.attname for f in opts.fields]))
+
+        if hasattr(cls, 'get_absolute_url'):
+            cls.get_absolute_url = curry(get_absolute_url, opts, cls.get_absolute_url)
+
+        signals.class_prepared.send(sender=cls)
+
+
+class Model(object):
+    __metaclass__ = ModelBase
+
+    def __init__(self, *args, **kwargs):
+        signals.pre_init.send(sender=self.__class__, args=args, kwargs=kwargs)
+
+        # There is a rather weird disparity here; if kwargs, it's set, then args
+        # overrides it. It should be one or the other; don't duplicate the work
+        # The reason for the kwargs check is that standard iterator passes in by
+        # args, and instantiation for iteration is 33% faster.
+        args_len = len(args)
+        if args_len > len(self._meta.fields):
+            # Daft, but matches old exception sans the err msg.
+            raise IndexError("Number of args exceeds number of fields")
+
+        fields_iter = iter(self._meta.fields)
+        if not kwargs:
+            # The ordering of the izip calls matter - izip throws StopIteration
+            # when an iter throws it. So if the first iter throws it, the second
+            # is *not* consumed. We rely on this, so don't change the order
+            # without changing the logic.
+            for val, field in izip(args, fields_iter):
+                setattr(self, field.attname, val)
+        else:
+            # Slower, kwargs-ready version.
+            for val, field in izip(args, fields_iter):
+                setattr(self, field.attname, val)
+                kwargs.pop(field.name, None)
+                # Maintain compatibility with existing calls.
+                if isinstance(field.rel, ManyToOneRel):
+                    kwargs.pop(field.attname, None)
+
+        # Now we're left with the unprocessed fields that *must* come from
+        # keywords, or default.
+
+        for field in fields_iter:
+            rel_obj = None
+            if kwargs:
+                if isinstance(field.rel, ManyToOneRel):
+                    try:
+                        # Assume object instance was passed in.
+                        rel_obj = kwargs.pop(field.name)
+                    except KeyError:
+                        try:
+                            # Object instance wasn't passed in -- must be an ID.
+                            val = kwargs.pop(field.attname)
+                        except KeyError:
+                            val = field.get_default()
+                    else:
+                        # Object instance was passed in. Special case: You can
+                        # pass in "None" for related objects if it's allowed.
+                        if rel_obj is None and field.null:
+                            val = None
+                else:
+                    val = kwargs.pop(field.attname, field.get_default())
+            else:
+                val = field.get_default()
+            # If we got passed a related instance, set it using the field.name
+            # instead of field.attname (e.g. "user" instead of "user_id") so
+            # that the object gets properly cached (and type checked) by the
+            # RelatedObjectDescriptor.
+            if rel_obj:
+                setattr(self, field.name, rel_obj)
+            else:
+                setattr(self, field.attname, val)
+
+        if kwargs:
+            for prop in kwargs.keys():
+                try:
+                    if isinstance(getattr(self.__class__, prop), property):
+                        setattr(self, prop, kwargs.pop(prop))
+                except AttributeError:
+                    pass
+            if kwargs:
+                raise TypeError, "'%s' is an invalid keyword argument for this function" % kwargs.keys()[0]
+        signals.post_init.send(sender=self.__class__, instance=self)
+
+    def __repr__(self):
+        return smart_str(u'<%s: %s>' % (self.__class__.__name__, unicode(self)))
+
+    def __str__(self):
+        if hasattr(self, '__unicode__'):
+            return force_unicode(self).encode('utf-8')
+        return '%s object' % self.__class__.__name__
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self._get_pk_val() == other._get_pk_val()
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __hash__(self):
+        return hash(self._get_pk_val())
+
+    def _get_pk_val(self, meta=None):
+        if not meta:
+            meta = self._meta
+        return getattr(self, meta.pk.attname)
+
+    def _set_pk_val(self, value):
+        return setattr(self, self._meta.pk.attname, value)
+
+    pk = property(_get_pk_val, _set_pk_val)
+
+    def save(self, force_insert=False, force_update=False):
+        """
+        Saves the current instance. Override this in a subclass if you want to
+        control the saving process.
+
+        The 'force_insert' and 'force_update' parameters can be used to insist
+        that the "save" must be an SQL insert or update (or equivalent for
+        non-SQL backends), respectively. Normally, they should not be set.
+        """
+        if force_insert and force_update:
+            raise ValueError("Cannot force both insert and updating in "
+                    "model saving.")
+        self.save_base(force_insert=force_insert, force_update=force_update)
+
+    save.alters_data = True
+
+    def save_base(self, raw=False, cls=None, force_insert=False,
+            force_update=False):
+        """
+        Does the heavy-lifting involved in saving. Subclasses shouldn't need to
+        override this method. It's separate from save() in order to hide the
+        need for overrides of save() to pass around internal-only parameters
+        ('raw' and 'cls').
+        """
+        assert not (force_insert and force_update)
+        if not cls:
+            cls = self.__class__
+            meta = self._meta
+            signal = True
+            signals.pre_save.send(sender=self.__class__, instance=self, raw=raw)
+        else:
+            meta = cls._meta
+            signal = False
+
+        # If we are in a raw save, save the object exactly as presented.
+        # That means that we don't try to be smart about saving attributes
+        # that might have come from the parent class - we just save the
+        # attributes we have been given to the class we have been given.
+        if not raw:
+            for parent, field in meta.parents.items():
+                # At this point, parent's primary key field may be unknown
+                # (for example, from administration form which doesn't fill
+                # this field). If so, fill it.
+                if getattr(self, parent._meta.pk.attname) is None and getattr(self, field.attname) is not None:
+                    setattr(self, parent._meta.pk.attname, getattr(self, field.attname))
+
+                self.save_base(raw, parent)
+                setattr(self, field.attname, self._get_pk_val(parent._meta))
+
+        non_pks = [f for f in meta.local_fields if not f.primary_key]
+
+        # First, try an UPDATE. If that doesn't update anything, do an INSERT.
+        pk_val = self._get_pk_val(meta)
+        # Note: the comparison with '' is required for compatibility with
+        # oldforms-style model creation.
+        pk_set = pk_val is not None and smart_unicode(pk_val) != u''
+        record_exists = True
+        manager = cls._default_manager
+        if pk_set:
+            # Determine whether a record with the primary key already exists.
+            if (force_update or (not force_insert and
+                    manager.filter(pk=pk_val).extra(select={'a': 1}).values('a').order_by())):
+                # It does already exist, so do an UPDATE.
+                if force_update or non_pks:
+                    values = [(f, None, f.get_db_prep_save(raw and getattr(self, f.attname) or f.pre_save(self, False))) for f in non_pks]
+                    rows = manager.filter(pk=pk_val)._update(values)
+                    if force_update and not rows:
+                        raise DatabaseError("Forced update did not affect any rows.")
+            else:
+                record_exists = False
+        if not pk_set or not record_exists:
+            if not pk_set:
+                if force_update:
+                    raise ValueError("Cannot force an update in save() with no primary key.")
+                values = [(f, f.get_db_prep_save(raw and getattr(self, f.attname) or f.pre_save(self, True))) for f in meta.local_fields if not isinstance(f, AutoField)]
+            else:
+                values = [(f, f.get_db_prep_save(raw and getattr(self, f.attname) or f.pre_save(self, True))) for f in meta.local_fields]
+
+            if meta.order_with_respect_to:
+                field = meta.order_with_respect_to
+                values.append((meta.get_field_by_name('_order')[0], manager.filter(**{field.name: getattr(self, field.attname)}).count()))
+            record_exists = False
+
+            update_pk = bool(meta.has_auto_field and not pk_set)
+            if values:
+                # Create a new record.
+                result = manager._insert(values, return_id=update_pk)
+            else:
+                # Create a new record with defaults for everything.
+                result = manager._insert([(meta.pk, connection.ops.pk_default_value())], return_id=update_pk, raw_values=True)
+
+            if update_pk:
+                setattr(self, meta.pk.attname, result)
+        transaction.commit_unless_managed()
+
+        if signal:
+            signals.post_save.send(sender=self.__class__, instance=self,
+                created=(not record_exists), raw=raw)
+
+    save_base.alters_data = True
+
+    def _collect_sub_objects(self, seen_objs, parent=None, nullable=False):
+        """
+        Recursively populates seen_objs with all objects related to this
+        object.
+
+        When done, seen_objs.items() will be in the format:
+            [(model_class, {pk_val: obj, pk_val: obj, ...}),
+             (model_class, {pk_val: obj, pk_val: obj, ...}), ...]
+        """
+        pk_val = self._get_pk_val()
+        if seen_objs.add(self.__class__, pk_val, self, parent, nullable):
+            return
+
+        for related in self._meta.get_all_related_objects():
+            rel_opts_name = related.get_accessor_name()
+            if isinstance(related.field.rel, OneToOneRel):
+                try:
+                    sub_obj = getattr(self, rel_opts_name)
+                except ObjectDoesNotExist:
+                    pass
+                else:
+                    sub_obj._collect_sub_objects(seen_objs, self.__class__, related.field.null)
+            else:
+                for sub_obj in getattr(self, rel_opts_name).all():
+                    sub_obj._collect_sub_objects(seen_objs, self.__class__, related.field.null)
+
+        # Handle any ancestors (for the model-inheritance case). We do this by
+        # traversing to the most remote parent classes -- those with no parents
+        # themselves -- and then adding those instances to the collection. That
+        # will include all the child instances down to "self".
+        parent_stack = self._meta.parents.values()
+        while parent_stack:
+            link = parent_stack.pop()
+            parent_obj = getattr(self, link.name)
+            if parent_obj._meta.parents:
+                parent_stack.extend(parent_obj._meta.parents.values())
+                continue
+            # At this point, parent_obj is base class (no ancestor models). So
+            # delete it and all its descendents.
+            parent_obj._collect_sub_objects(seen_objs)
+
+    def delete(self):
+        assert self._get_pk_val() is not None, "%s object can't be deleted because its %s attribute is set to None." % (self._meta.object_name, self._meta.pk.attname)
+
+        # Find all the objects than need to be deleted.
+        seen_objs = CollectedObjects()
+        self._collect_sub_objects(seen_objs)
+
+        # Actually delete the objects.
+        delete_objects(seen_objs)
+
+    delete.alters_data = True
+
+    def _get_FIELD_display(self, field):
+        value = getattr(self, field.attname)
+        return force_unicode(dict(field.flatchoices).get(value, value), strings_only=True)
+
+    def _get_next_or_previous_by_FIELD(self, field, is_next, **kwargs):
+        op = is_next and 'gt' or 'lt'
+        order = not is_next and '-' or ''
+        param = smart_str(getattr(self, field.attname))
+        q = Q(**{'%s__%s' % (field.name, op): param})
+        q = q|Q(**{field.name: param, 'pk__%s' % op: self.pk})
+        qs = self.__class__._default_manager.filter(**kwargs).filter(q).order_by('%s%s' % (order, field.name), '%spk' % order)
+        try:
+            return qs[0]
+        except IndexError:
+            raise self.DoesNotExist, "%s matching query does not exist." % self.__class__._meta.object_name
+
+    def _get_next_or_previous_in_order(self, is_next):
+        cachename = "__%s_order_cache" % is_next
+        if not hasattr(self, cachename):
+            qn = connection.ops.quote_name
+            op = is_next and '>' or '<'
+            order = not is_next and '-_order' or '_order'
+            order_field = self._meta.order_with_respect_to
+            # FIXME: When querysets support nested queries, this can be turned
+            # into a pure queryset operation.
+            where = ['%s %s (SELECT %s FROM %s WHERE %s=%%s)' % \
+                (qn('_order'), op, qn('_order'),
+                qn(self._meta.db_table), qn(self._meta.pk.column))]
+            params = [self.pk]
+            obj = self._default_manager.filter(**{order_field.name: getattr(self, order_field.attname)}).extra(where=where, params=params).order_by(order)[:1].get()
+            setattr(self, cachename, obj)
+        return getattr(self, cachename)
+
+
+
+############################################
+# HELPER FUNCTIONS (CURRIED MODEL METHODS) #
+############################################
+
+# ORDERING METHODS #########################
+
+def method_set_order(ordered_obj, self, id_list):
+    rel_val = getattr(self, ordered_obj._meta.order_with_respect_to.rel.field_name)
+    order_name = ordered_obj._meta.order_with_respect_to.name
+    # FIXME: It would be nice if there was an "update many" version of update
+    # for situations like this.
+    for i, j in enumerate(id_list):
+        ordered_obj.objects.filter(**{'pk': j, order_name: rel_val}).update(_order=i)
+    transaction.commit_unless_managed()
+
+
+def method_get_order(ordered_obj, self):
+    rel_val = getattr(self, ordered_obj._meta.order_with_respect_to.rel.field_name)
+    order_name = ordered_obj._meta.order_with_respect_to.name
+    pk_name = ordered_obj._meta.pk.name
+    return [r[pk_name] for r in
+            ordered_obj.objects.filter(**{order_name: rel_val}).values(pk_name)]
+
+
+##############################################
+# HELPER FUNCTIONS (CURRIED MODEL FUNCTIONS) #
+##############################################
+
+def get_absolute_url(opts, func, self, *args, **kwargs):
+    return settings.ABSOLUTE_URL_OVERRIDES.get('%s.%s' % (opts.app_label, opts.module_name), func)(self, *args, **kwargs)
+
+
+########
+# MISC #
+########
+
+class Empty(object):
+    pass
+
+if sys.version_info < (2, 5):
+    # Prior to Python 2.5, Exception was an old-style class
+    def subclass_exception(name, parent, unused):
+        return types.ClassType(name, (parent,), {})
+else:
+    def subclass_exception(name, parent, module):
+        return type(name, (parent,), {'__module__': module})
diff --git a/webapp/django/db/models/fields/__init__.py b/webapp/django/db/models/fields/__init__.py
new file mode 100644
index 0000000..b8d0567
--- /dev/null
+++ b/webapp/django/db/models/fields/__init__.py
@@ -0,0 +1,1035 @@
+import copy
+import datetime
+import os
+import time
+try:
+    import decimal
+except ImportError:
+    from django.utils import _decimal as decimal    # for Python 2.3
+
+from django.db import connection
+from django.db.models import signals
+from django.db.models.query_utils import QueryWrapper
+from django.dispatch import dispatcher
+from django.conf import settings
+from django.core import validators
+from django import oldforms
+from django import forms
+from django.core.exceptions import ObjectDoesNotExist
+from django.utils.datastructures import DictWrapper
+from django.utils.functional import curry
+from django.utils.itercompat import tee
+from django.utils.text import capfirst
+from django.utils.translation import ugettext_lazy, ugettext as _
+from django.utils.encoding import smart_unicode, force_unicode, smart_str
+from django.utils import datetime_safe
+
+class NOT_PROVIDED:
+    pass
+
+# The values to use for "blank" in SelectFields. Will be appended to the start of most "choices" lists.
+BLANK_CHOICE_DASH = [("", "---------")]
+BLANK_CHOICE_NONE = [("", "None")]
+
+class FieldDoesNotExist(Exception):
+    pass
+
+def manipulator_validator_unique(f, opts, self, field_data, all_data):
+    "Validates that the value is unique for this field."
+    lookup_type = f.get_validator_unique_lookup_type()
+    try:
+        old_obj = self.manager.get(**{lookup_type: field_data})
+    except ObjectDoesNotExist:
+        return
+    if getattr(self, 'original_object', None) and self.original_object._get_pk_val() == old_obj._get_pk_val():
+        return
+    raise validators.ValidationError, _("%(optname)s with this %(fieldname)s already exists.") % {'optname': capfirst(opts.verbose_name), 'fieldname': f.verbose_name}
+
+# A guide to Field parameters:
+#
+#   * name:      The name of the field specifed in the model.
+#   * attname:   The attribute to use on the model object. This is the same as
+#                "name", except in the case of ForeignKeys, where "_id" is
+#                appended.
+#   * db_column: The db_column specified in the model (or None).
+#   * column:    The database column for this field. This is the same as
+#                "attname", except if db_column is specified.
+#
+# Code that introspects values, or does other dynamic things, should use
+# attname. For example, this gets the primary key value of object "obj":
+#
+#     getattr(obj, opts.pk.attname)
+
+class Field(object):
+    # Designates whether empty strings fundamentally are allowed at the
+    # database level.
+    empty_strings_allowed = True
+
+    # These track each time a Field instance is created. Used to retain order.
+    # The auto_creation_counter is used for fields that Django implicitly
+    # creates, creation_counter is used for all user-specified fields.
+    creation_counter = 0
+    auto_creation_counter = -1
+
+    def __init__(self, verbose_name=None, name=None, primary_key=False,
+            max_length=None, unique=False, blank=False, null=False,
+            db_index=False, core=False, rel=None, default=NOT_PROVIDED,
+            editable=True, serialize=True, unique_for_date=None,
+            unique_for_month=None, unique_for_year=None, validator_list=None,
+            choices=None, help_text='', db_column=None, db_tablespace=None,
+            auto_created=False):
+        self.name = name
+        self.verbose_name = verbose_name
+        self.primary_key = primary_key
+        self.max_length, self._unique = max_length, unique
+        self.blank, self.null = blank, null
+        # Oracle treats the empty string ('') as null, so coerce the null
+        # option whenever '' is a possible value.
+        if self.empty_strings_allowed and connection.features.interprets_empty_strings_as_nulls:
+            self.null = True
+        self.core, self.rel, self.default = core, rel, default
+        self.editable = editable
+        self.serialize = serialize
+        self.validator_list = validator_list or []
+        self.unique_for_date, self.unique_for_month = unique_for_date, unique_for_month
+        self.unique_for_year = unique_for_year
+        self._choices = choices or []
+        self.help_text = help_text
+        self.db_column = db_column
+        self.db_tablespace = db_tablespace or settings.DEFAULT_INDEX_TABLESPACE
+        self.auto_created = auto_created
+
+        # Set db_index to True if the field has a relationship and doesn't explicitly set db_index.
+        self.db_index = db_index
+
+        # Adjust the appropriate creation counter, and save our local copy.
+        if auto_created:
+            self.creation_counter = Field.auto_creation_counter
+            Field.auto_creation_counter -= 1
+        else:
+            self.creation_counter = Field.creation_counter
+            Field.creation_counter += 1
+
+    def __cmp__(self, other):
+        # This is needed because bisect does not take a comparison function.
+        return cmp(self.creation_counter, other.creation_counter)
+
+    def __deepcopy__(self, memodict):
+        # We don't have to deepcopy very much here, since most things are not
+        # intended to be altered after initial creation.
+        obj = copy.copy(self)
+        if self.rel:
+            obj.rel = copy.copy(self.rel)
+        memodict[id(self)] = obj
+        return obj
+
+    def to_python(self, value):
+        """
+        Converts the input value into the expected Python data type, raising
+        validators.ValidationError if the data can't be converted. Returns the
+        converted value. Subclasses should override this.
+        """
+        return value
+
+    def db_type(self):
+        """
+        Returns the database column data type for this field, taking into
+        account the DATABASE_ENGINE setting.
+        """
+        # The default implementation of this method looks at the
+        # backend-specific DATA_TYPES dictionary, looking up the field by its
+        # "internal type".
+        #
+        # A Field class can implement the get_internal_type() method to specify
+        # which *preexisting* Django Field class it's most similar to -- i.e.,
+        # an XMLField is represented by a TEXT column type, which is the same
+        # as the TextField Django field type, which means XMLField's
+        # get_internal_type() returns 'TextField'.
+        #
+        # But the limitation of the get_internal_type() / data_types approach
+        # is that it cannot handle database column types that aren't already
+        # mapped to one of the built-in Django field types. In this case, you
+        # can implement db_type() instead of get_internal_type() to specify
+        # exactly which wacky database column type you want to use.
+        data = DictWrapper(self.__dict__, connection.ops.quote_name, "qn_")
+        try:
+            return connection.creation.data_types[self.get_internal_type()] % data
+        except KeyError:
+            return None
+
+    def unique(self):
+        return self._unique or self.primary_key
+    unique = property(unique)
+
+    def set_attributes_from_name(self, name):
+        self.name = name
+        self.attname, self.column = self.get_attname_column()
+        if self.verbose_name is None and name:
+            self.verbose_name = name.replace('_', ' ')
+
+    def contribute_to_class(self, cls, name):
+        self.set_attributes_from_name(name)
+        cls._meta.add_field(self)
+        if self.choices:
+            setattr(cls, 'get_%s_display' % self.name, curry(cls._get_FIELD_display, field=self))
+
+    def get_attname(self):
+        return self.name
+
+    def get_attname_column(self):
+        attname = self.get_attname()
+        column = self.db_column or attname
+        return attname, column
+
+    def get_cache_name(self):
+        return '_%s_cache' % self.name
+
+    def get_internal_type(self):
+        return self.__class__.__name__
+
+    def pre_save(self, model_instance, add):
+        "Returns field's value just before saving."
+        return getattr(model_instance, self.attname)
+
+    def get_db_prep_value(self, value):
+        """Returns field's value prepared for interacting with the database
+        backend.
+
+        Used by the default implementations of ``get_db_prep_save``and
+        `get_db_prep_lookup```
+        """
+        return value
+
+    def get_db_prep_save(self, value):
+        "Returns field's value prepared for saving into a database."
+        return self.get_db_prep_value(value)
+
+    def get_db_prep_lookup(self, lookup_type, value):
+        "Returns field's value prepared for database lookup."
+        if hasattr(value, 'as_sql'):
+            sql, params = value.as_sql()
+            return QueryWrapper(('(%s)' % sql), params)
+        if lookup_type in ('regex', 'iregex', 'month', 'day', 'search'):
+            return [value]
+        elif lookup_type in ('exact', 'gt', 'gte', 'lt', 'lte'):
+            return [self.get_db_prep_value(value)]
+        elif lookup_type in ('range', 'in'):
+            return [self.get_db_prep_value(v) for v in value]
+        elif lookup_type in ('contains', 'icontains'):
+            return ["%%%s%%" % connection.ops.prep_for_like_query(value)]
+        elif lookup_type == 'iexact':
+            return [connection.ops.prep_for_like_query(value)]
+        elif lookup_type in ('startswith', 'istartswith'):
+            return ["%s%%" % connection.ops.prep_for_like_query(value)]
+        elif lookup_type in ('endswith', 'iendswith'):
+            return ["%%%s" % connection.ops.prep_for_like_query(value)]
+        elif lookup_type == 'isnull':
+            return []
+        elif lookup_type == 'year':
+            try:
+                value = int(value)
+            except ValueError:
+                raise ValueError("The __year lookup type requires an integer argument")
+
+            if self.get_internal_type() == 'DateField':
+                return connection.ops.year_lookup_bounds_for_date_field(value)
+            else:
+                return connection.ops.year_lookup_bounds(value)
+
+        raise TypeError("Field has invalid lookup: %s" % lookup_type)
+
+    def has_default(self):
+        "Returns a boolean of whether this field has a default value."
+        return self.default is not NOT_PROVIDED
+
+    def get_default(self):
+        "Returns the default value for this field."
+        if self.default is not NOT_PROVIDED:
+            if callable(self.default):
+                return self.default()
+            return force_unicode(self.default, strings_only=True)
+        if not self.empty_strings_allowed or (self.null and not connection.features.interprets_empty_strings_as_nulls):
+            return None
+        return ""
+
+    def get_manipulator_field_names(self, name_prefix):
+        """
+        Returns a list of field names that this object adds to the manipulator.
+        """
+        return [name_prefix + self.name]
+
+    def prepare_field_objs_and_params(self, manipulator, name_prefix):
+        params = {'validator_list': self.validator_list[:]}
+        if self.max_length and not self.choices: # Don't give SelectFields a max_length parameter.
+            params['max_length'] = self.max_length
+
+        if self.choices:
+            field_objs = [oldforms.SelectField]
+
+            params['choices'] = self.get_flatchoices()
+        else:
+            field_objs = self.get_manipulator_field_objs()
+        return (field_objs, params)
+
+    def get_manipulator_fields(self, opts, manipulator, change, name_prefix='', rel=False, follow=True):
+        """
+        Returns a list of oldforms.FormField instances for this field. It
+        calculates the choices at runtime, not at compile time.
+
+        name_prefix is a prefix to prepend to the "field_name" argument.
+        rel is a boolean specifying whether this field is in a related context.
+        """
+        field_objs, params = self.prepare_field_objs_and_params(manipulator, name_prefix)
+
+        # Add the "unique" validator(s).
+        for field_name_list in opts.unique_together:
+            if field_name_list[0] == self.name:
+                params['validator_list'].append(getattr(manipulator, 'isUnique%s' % '_'.join(field_name_list)))
+
+        # Add the "unique for..." validator(s).
+        if self.unique_for_date:
+            params['validator_list'].append(getattr(manipulator, 'isUnique%sFor%s' % (self.name, self.unique_for_date)))
+        if self.unique_for_month:
+            params['validator_list'].append(getattr(manipulator, 'isUnique%sFor%s' % (self.name, self.unique_for_month)))
+        if self.unique_for_year:
+            params['validator_list'].append(getattr(manipulator, 'isUnique%sFor%s' % (self.name, self.unique_for_year)))
+        if self.unique and not rel:
+            params['validator_list'].append(curry(manipulator_validator_unique, self, opts, manipulator))
+
+        # Only add is_required=True if the field cannot be blank. Primary keys
+        # are a special case, and fields in a related context should set this
+        # as False, because they'll be caught by a separate validator --
+        # RequiredIfOtherFieldGiven.
+        params['is_required'] = not self.blank and not self.primary_key and not rel
+
+        # BooleanFields (CheckboxFields) are a special case. They don't take
+        # is_required.
+        if isinstance(self, BooleanField):
+            del params['is_required']
+
+        # If this field is in a related context, check whether any other fields
+        # in the related object have core=True. If so, add a validator --
+        # RequiredIfOtherFieldsGiven -- to this FormField.
+        if rel and not self.blank and not isinstance(self, AutoField) and not isinstance(self, FileField):
+            # First, get the core fields, if any.
+            core_field_names = []
+            for f in opts.fields:
+                if f.core and f != self:
+                    core_field_names.extend(f.get_manipulator_field_names(name_prefix))
+            # Now, if there are any, add the validator to this FormField.
+            if core_field_names:
+                params['validator_list'].append(validators.RequiredIfOtherFieldsGiven(core_field_names, ugettext_lazy("This field is required.")))
+
+        # Finally, add the field_names.
+        field_names = self.get_manipulator_field_names(name_prefix)
+        return [man(field_name=field_names[i], **params) for i, man in enumerate(field_objs)]
+
+    def get_validator_unique_lookup_type(self):
+        return '%s__exact' % self.name
+
+    def get_manipulator_new_data(self, new_data, rel=False):
+        """
+        Given the full new_data dictionary (from the manipulator), returns this
+        field's data.
+        """
+        if rel:
+            return new_data.get(self.name, [self.get_default()])[0]
+        val = new_data.get(self.name, self.get_default())
+        if not self.empty_strings_allowed and val == '' and self.null:
+            val = None
+        return val
+
+    def get_choices(self, include_blank=True, blank_choice=BLANK_CHOICE_DASH):
+        """Returns choices with a default blank choices included, for use
+        as SelectField choices for this field."""
+        first_choice = include_blank and blank_choice or []
+        if self.choices:
+            return first_choice + list(self.choices)
+        rel_model = self.rel.to
+        if hasattr(self.rel, 'get_related_field'):
+            lst = [(getattr(x, self.rel.get_related_field().attname), smart_unicode(x)) for x in rel_model._default_manager.complex_filter(self.rel.limit_choices_to)]
+        else:
+            lst = [(x._get_pk_val(), smart_unicode(x)) for x in rel_model._default_manager.complex_filter(self.rel.limit_choices_to)]
+        return first_choice + lst
+
+    def get_choices_default(self):
+        return self.get_choices()
+
+    def get_flatchoices(self, include_blank=True, blank_choice=BLANK_CHOICE_DASH):
+        "Returns flattened choices with a default blank choice included."
+        first_choice = include_blank and blank_choice or []
+        return first_choice + list(self.flatchoices)
+
+    def _get_val_from_obj(self, obj):
+        if obj:
+            return getattr(obj, self.attname)
+        else:
+            return self.get_default()
+
+    def flatten_data(self, follow, obj=None):
+        """
+        Returns a dictionary mapping the field's manipulator field names to its
+        "flattened" string values for the admin view. obj is the instance to
+        extract the values from.
+        """
+        return {self.attname: self._get_val_from_obj(obj)}
+
+    def get_follow(self, override=None):
+        if override != None:
+            return override
+        else:
+            return self.editable
+
+    def bind(self, fieldmapping, original, bound_field_class):
+        return bound_field_class(self, fieldmapping, original)
+
+    def _get_choices(self):
+        if hasattr(self._choices, 'next'):
+            choices, self._choices = tee(self._choices)
+            return choices
+        else:
+            return self._choices
+    choices = property(_get_choices)
+
+    def _get_flatchoices(self):
+        """Flattened version of choices tuple."""
+        flat = []
+        for choice, value in self.choices:
+            if type(value) in (list, tuple):
+                flat.extend(value)
+            else:
+                flat.append((choice,value))
+        return flat
+    flatchoices = property(_get_flatchoices)
+
+    def save_form_data(self, instance, data):
+        setattr(instance, self.name, data)
+
+    def formfield(self, form_class=forms.CharField, **kwargs):
+        "Returns a django.forms.Field instance for this database Field."
+        defaults = {'required': not self.blank, 'label': capfirst(self.verbose_name), 'help_text': self.help_text}
+        if self.choices:
+            defaults['widget'] = forms.Select(choices=self.get_choices(include_blank=self.blank or not (self.has_default() or 'initial' in kwargs)))
+        if self.has_default():
+            defaults['initial'] = self.get_default()
+        defaults.update(kwargs)
+        return form_class(**defaults)
+
+    def value_from_object(self, obj):
+        "Returns the value of this field in the given model instance."
+        return getattr(obj, self.attname)
+
+class AutoField(Field):
+    empty_strings_allowed = False
+    def __init__(self, *args, **kwargs):
+        assert kwargs.get('primary_key', False) is True, "%ss must have primary_key=True." % self.__class__.__name__
+        kwargs['blank'] = True
+        Field.__init__(self, *args, **kwargs)
+
+    def to_python(self, value):
+        if value is None:
+            return value
+        try:
+            return int(value)
+        except (TypeError, ValueError):
+            raise validators.ValidationError, _("This value must be an integer.")
+
+    def get_db_prep_value(self, value):
+        if value is None:
+            return None
+        return int(value)
+
+    def get_manipulator_fields(self, opts, manipulator, change, name_prefix='', rel=False, follow=True):
+        if not rel:
+            return [] # Don't add a FormField unless it's in a related context.
+        return Field.get_manipulator_fields(self, opts, manipulator, change, name_prefix, rel, follow)
+
+    def get_manipulator_field_objs(self):
+        return [oldforms.HiddenField]
+
+    def get_manipulator_new_data(self, new_data, rel=False):
+        # Never going to be called
+        # Not in main change pages
+        # ignored in related context
+        if not rel:
+            return None
+        return Field.get_manipulator_new_data(self, new_data, rel)
+
+    def contribute_to_class(self, cls, name):
+        assert not cls._meta.has_auto_field, "A model can't have more than one AutoField."
+        super(AutoField, self).contribute_to_class(cls, name)
+        cls._meta.has_auto_field = True
+        cls._meta.auto_field = self
+
+    def formfield(self, **kwargs):
+        return None
+
+class BooleanField(Field):
+    def __init__(self, *args, **kwargs):
+        kwargs['blank'] = True
+        if 'default' not in kwargs and not kwargs.get('null'):
+            kwargs['default'] = False
+        Field.__init__(self, *args, **kwargs)
+
+    def get_internal_type(self):
+        return "BooleanField"
+
+    def to_python(self, value):
+        if value in (True, False): return value
+        if value in ('t', 'True', '1'): return True
+        if value in ('f', 'False', '0'): return False
+        raise validators.ValidationError, _("This value must be either True or False.")
+
+    def get_db_prep_value(self, value):
+        if value is None:
+            return None
+        return bool(value)
+
+    def get_manipulator_field_objs(self):
+        return [oldforms.CheckboxField]
+
+    def formfield(self, **kwargs):
+        defaults = {'form_class': forms.BooleanField}
+        defaults.update(kwargs)
+        return super(BooleanField, self).formfield(**defaults)
+
+class CharField(Field):
+    def get_manipulator_field_objs(self):
+        return [oldforms.TextField]
+
+    def get_internal_type(self):
+        return "CharField"
+
+    def to_python(self, value):
+        if isinstance(value, basestring):
+            return value
+        if value is None:
+            if self.null:
+                return value
+            else:
+                raise validators.ValidationError, ugettext_lazy("This field cannot be null.")
+        return smart_unicode(value)
+
+    def formfield(self, **kwargs):
+        defaults = {'max_length': self.max_length}
+        defaults.update(kwargs)
+        return super(CharField, self).formfield(**defaults)
+
+# TODO: Maybe move this into contrib, because it's specialized.
+class CommaSeparatedIntegerField(CharField):
+    def get_manipulator_field_objs(self):
+        return [oldforms.CommaSeparatedIntegerField]
+
+class DateField(Field):
+    empty_strings_allowed = False
+    def __init__(self, verbose_name=None, name=None, auto_now=False, auto_now_add=False, **kwargs):
+        self.auto_now, self.auto_now_add = auto_now, auto_now_add
+        #HACKs : auto_now_add/auto_now should be done as a default or a pre_save.
+        if auto_now or auto_now_add:
+            kwargs['editable'] = False
+            kwargs['blank'] = True
+        Field.__init__(self, verbose_name, name, **kwargs)
+
+    def get_internal_type(self):
+        return "DateField"
+
+    def to_python(self, value):
+        if value is None:
+            return value
+        if isinstance(value, datetime.datetime):
+            return value.date()
+        if isinstance(value, datetime.date):
+            return value
+        validators.isValidANSIDate(value, None)
+        try:
+            return datetime.date(*time.strptime(value, '%Y-%m-%d')[:3])
+        except ValueError:
+            raise validators.ValidationError, _('Enter a valid date in YYYY-MM-DD format.')
+
+    def pre_save(self, model_instance, add):
+        if self.auto_now or (self.auto_now_add and add):
+            value = datetime.datetime.now()
+            setattr(model_instance, self.attname, value)
+            return value
+        else:
+            return super(DateField, self).pre_save(model_instance, add)
+
+    def contribute_to_class(self, cls, name):
+        super(DateField,self).contribute_to_class(cls, name)
+        if not self.null:
+            setattr(cls, 'get_next_by_%s' % self.name,
+                curry(cls._get_next_or_previous_by_FIELD, field=self, is_next=True))
+            setattr(cls, 'get_previous_by_%s' % self.name,
+                curry(cls._get_next_or_previous_by_FIELD, field=self, is_next=False))
+
+    # Needed because of horrible auto_now[_add] behaviour wrt. editable
+    def get_follow(self, override=None):
+        if override != None:
+            return override
+        else:
+            return self.editable or self.auto_now or self.auto_now_add
+
+    def get_db_prep_lookup(self, lookup_type, value):
+        # For "__month" and "__day" lookups, convert the value to a string so
+        # the database backend always sees a consistent type.
+        if lookup_type in ('month', 'day'):
+            return [force_unicode(value)]
+        return super(DateField, self).get_db_prep_lookup(lookup_type, value)
+
+    def get_db_prep_value(self, value):
+        # Casts dates into the format expected by the backend
+        return connection.ops.value_to_db_date(self.to_python(value))
+
+    def get_manipulator_field_objs(self):
+        return [oldforms.DateField]
+
+    def flatten_data(self, follow, obj=None):
+        val = self._get_val_from_obj(obj)
+        if val is None:
+            data = ''
+        else:
+            data = datetime_safe.new_date(val).strftime("%Y-%m-%d")
+        return {self.attname: data}
+
+    def formfield(self, **kwargs):
+        defaults = {'form_class': forms.DateField}
+        defaults.update(kwargs)
+        return super(DateField, self).formfield(**defaults)
+
+class DateTimeField(DateField):
+    def get_internal_type(self):
+        return "DateTimeField"
+
+    def to_python(self, value):
+        if value is None:
+            return value
+        if isinstance(value, datetime.datetime):
+            return value
+        if isinstance(value, datetime.date):
+            return datetime.datetime(value.year, value.month, value.day)
+
+        # Attempt to parse a datetime:
+        value = smart_str(value)
+        # split usecs, because they are not recognized by strptime.
+        if '.' in value:
+            try:
+                value, usecs = value.split('.')
+                usecs = int(usecs)
+            except ValueError:
+                raise validators.ValidationError, _('Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format.')
+        else:
+            usecs = 0
+        kwargs = {'microsecond': usecs}
+        try: # Seconds are optional, so try converting seconds first.
+            return datetime.datetime(*time.strptime(value, '%Y-%m-%d %H:%M:%S')[:6],
+                                     **kwargs)
+
+        except ValueError:
+            try: # Try without seconds.
+                return datetime.datetime(*time.strptime(value, '%Y-%m-%d %H:%M')[:5],
+                                         **kwargs)
+            except ValueError: # Try without hour/minutes/seconds.
+                try:
+                    return datetime.datetime(*time.strptime(value, '%Y-%m-%d')[:3],
+                                             **kwargs)
+                except ValueError:
+                    raise validators.ValidationError, _('Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format.')
+
+    def get_db_prep_value(self, value):
+        # Casts dates into the format expected by the backend
+        return connection.ops.value_to_db_datetime(self.to_python(value))
+
+    def get_manipulator_field_objs(self):
+        return [oldforms.DateField, oldforms.TimeField]
+
+    def get_manipulator_field_names(self, name_prefix):
+        return [name_prefix + self.name + '_date', name_prefix + self.name + '_time']
+
+    def get_manipulator_new_data(self, new_data, rel=False):
+        date_field, time_field = self.get_manipulator_field_names('')
+        if rel:
+            d = new_data.get(date_field, [None])[0]
+            t = new_data.get(time_field, [None])[0]
+        else:
+            d = new_data.get(date_field, None)
+            t = new_data.get(time_field, None)
+        if d is not None and t is not None:
+            return datetime.datetime.combine(d, t)
+        return self.get_default()
+
+    def flatten_data(self,follow, obj = None):
+        val = self._get_val_from_obj(obj)
+        date_field, time_field = self.get_manipulator_field_names('')
+        if val is None:
+            date_data = time_data = ''
+        else:
+            d = datetime_safe.new_datetime(val)
+            date_data = d.strftime('%Y-%m-%d')
+            time_data = d.strftime('%H:%M:%S')
+        return {date_field: date_data, time_field: time_data}
+
+    def formfield(self, **kwargs):
+        defaults = {'form_class': forms.DateTimeField}
+        defaults.update(kwargs)
+        return super(DateTimeField, self).formfield(**defaults)
+
+class DecimalField(Field):
+    empty_strings_allowed = False
+    def __init__(self, verbose_name=None, name=None, max_digits=None, decimal_places=None, **kwargs):
+        self.max_digits, self.decimal_places = max_digits, decimal_places
+        Field.__init__(self, verbose_name, name, **kwargs)
+
+    def get_internal_type(self):
+        return "DecimalField"
+
+    def to_python(self, value):
+        if value is None:
+            return value
+        try:
+            return decimal.Decimal(value)
+        except decimal.InvalidOperation:
+            raise validators.ValidationError(
+                _("This value must be a decimal number."))
+
+    def _format(self, value):
+        if isinstance(value, basestring) or value is None:
+            return value
+        else:
+            return self.format_number(value)
+
+    def format_number(self, value):
+        """
+        Formats a number into a string with the requisite number of digits and
+        decimal places.
+        """
+        # Method moved to django.db.backends.util.
+        #
+        # It is preserved because it is used by the oracle backend
+        # (django.db.backends.oracle.query), and also for
+        # backwards-compatibility with any external code which may have used
+        # this method.
+        from django.db.backends import util
+        return util.format_number(value, self.max_digits, self.decimal_places)
+
+    def get_db_prep_value(self, value):
+        return connection.ops.value_to_db_decimal(self.to_python(value),
+                self.max_digits, self.decimal_places)
+
+    def get_manipulator_field_objs(self):
+        return [curry(oldforms.DecimalField, max_digits=self.max_digits, decimal_places=self.decimal_places)]
+
+    def formfield(self, **kwargs):
+        defaults = {
+            'max_digits': self.max_digits,
+            'decimal_places': self.decimal_places,
+            'form_class': forms.DecimalField,
+        }
+        defaults.update(kwargs)
+        return super(DecimalField, self).formfield(**defaults)
+
+class EmailField(CharField):
+    def __init__(self, *args, **kwargs):
+        kwargs['max_length'] = kwargs.get('max_length', 75)
+        CharField.__init__(self, *args, **kwargs)
+
+    def get_manipulator_field_objs(self):
+        return [oldforms.EmailField]
+
+    def formfield(self, **kwargs):
+        defaults = {'form_class': forms.EmailField}
+        defaults.update(kwargs)
+        return super(EmailField, self).formfield(**defaults)
+
+class FilePathField(Field):
+    def __init__(self, verbose_name=None, name=None, path='', match=None, recursive=False, **kwargs):
+        self.path, self.match, self.recursive = path, match, recursive
+        kwargs['max_length'] = kwargs.get('max_length', 100)
+        Field.__init__(self, verbose_name, name, **kwargs)
+
+    def formfield(self, **kwargs):
+        defaults = {
+            'path': self.path,
+            'match': self.match,
+            'recursive': self.recursive,
+            'form_class': forms.FilePathField,
+        }
+        defaults.update(kwargs)
+        return super(FilePathField, self).formfield(**defaults)
+
+    def get_manipulator_field_objs(self):
+        return [curry(oldforms.FilePathField, path=self.path, match=self.match, recursive=self.recursive)]
+
+    def get_internal_type(self):
+        return "FilePathField"
+
+class FloatField(Field):
+    empty_strings_allowed = False
+
+    def get_db_prep_value(self, value):
+        if value is None:
+            return None
+        return float(value)
+
+    def get_manipulator_field_objs(self):
+        return [oldforms.FloatField]
+
+    def get_internal_type(self):
+        return "FloatField"
+
+    def formfield(self, **kwargs):
+        defaults = {'form_class': forms.FloatField}
+        defaults.update(kwargs)
+        return super(FloatField, self).formfield(**defaults)
+
+class IntegerField(Field):
+    empty_strings_allowed = False
+    def get_db_prep_value(self, value):
+        if value is None:
+            return None
+        return int(value)
+
+    def get_manipulator_field_objs(self):
+        return [oldforms.IntegerField]
+
+    def get_internal_type(self):
+        return "IntegerField"
+
+    def to_python(self, value):
+        if value is None:
+            return value
+        try:
+            return int(value)
+        except (TypeError, ValueError):
+            raise validators.ValidationError, _("This value must be an integer.")
+                
+    def formfield(self, **kwargs):
+        defaults = {'form_class': forms.IntegerField}
+        defaults.update(kwargs)
+        return super(IntegerField, self).formfield(**defaults)
+
+class IPAddressField(Field):
+    empty_strings_allowed = False
+    def __init__(self, *args, **kwargs):
+        kwargs['max_length'] = 15
+        Field.__init__(self, *args, **kwargs)
+
+    def get_manipulator_field_objs(self):
+        return [oldforms.IPAddressField]
+
+    def get_internal_type(self):
+        return "IPAddressField"
+
+    def formfield(self, **kwargs):
+        defaults = {'form_class': forms.IPAddressField}
+        defaults.update(kwargs)
+        return super(IPAddressField, self).formfield(**defaults)
+
+class NullBooleanField(Field):
+    empty_strings_allowed = False
+    def __init__(self, *args, **kwargs):
+        kwargs['null'] = True
+        Field.__init__(self, *args, **kwargs)
+
+    def get_internal_type(self):
+        return "NullBooleanField"
+
+    def to_python(self, value):
+        if value in (None, True, False): return value
+        if value in ('None'): return None
+        if value in ('t', 'True', '1'): return True
+        if value in ('f', 'False', '0'): return False
+        raise validators.ValidationError, _("This value must be either None, True or False.")
+
+    def get_db_prep_value(self, value):
+        if value is None:
+            return None
+        return bool(value)
+
+    def get_manipulator_field_objs(self):
+        return [oldforms.NullBooleanField]
+
+    def formfield(self, **kwargs):
+        defaults = {
+            'form_class': forms.NullBooleanField,
+            'required': not self.blank,
+            'label': capfirst(self.verbose_name),
+            'help_text': self.help_text}
+        defaults.update(kwargs)
+        return super(NullBooleanField, self).formfield(**defaults)
+
+class PhoneNumberField(Field):
+    def get_manipulator_field_objs(self):
+        return [oldforms.PhoneNumberField]
+
+    def get_internal_type(self):
+        return "PhoneNumberField"
+
+    def formfield(self, **kwargs):
+        from django.contrib.localflavor.us.forms import USPhoneNumberField
+        defaults = {'form_class': USPhoneNumberField}
+        defaults.update(kwargs)
+        return super(PhoneNumberField, self).formfield(**defaults)
+
+class PositiveIntegerField(IntegerField):
+    def get_manipulator_field_objs(self):
+        return [oldforms.PositiveIntegerField]
+
+    def get_internal_type(self):
+        return "PositiveIntegerField"
+
+    def formfield(self, **kwargs):
+        defaults = {'min_value': 0}
+        defaults.update(kwargs)
+        return super(PositiveIntegerField, self).formfield(**defaults)
+
+class PositiveSmallIntegerField(IntegerField):
+    def get_manipulator_field_objs(self):
+        return [oldforms.PositiveSmallIntegerField]
+
+    def get_internal_type(self):
+        return "PositiveSmallIntegerField"
+
+    def formfield(self, **kwargs):
+        defaults = {'min_value': 0}
+        defaults.update(kwargs)
+        return super(PositiveSmallIntegerField, self).formfield(**defaults)
+
+class SlugField(CharField):
+    def __init__(self, *args, **kwargs):
+        kwargs['max_length'] = kwargs.get('max_length', 50)
+        kwargs.setdefault('validator_list', []).append(validators.isSlug)
+        # Set db_index=True unless it's been set manually.
+        if 'db_index' not in kwargs:
+            kwargs['db_index'] = True
+        super(SlugField, self).__init__(*args, **kwargs)
+
+    def get_internal_type(self):
+        return "SlugField"
+
+    def formfield(self, **kwargs):
+        defaults = {'form_class': forms.RegexField, 'regex': r'^[a-zA-Z0-9_-]+$',
+            'error_messages': {'invalid': _(u"Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.")},
+        }
+        defaults.update(kwargs)
+        return super(SlugField, self).formfield(**defaults)
+
+class SmallIntegerField(IntegerField):
+    def get_manipulator_field_objs(self):
+        return [oldforms.SmallIntegerField]
+
+    def get_internal_type(self):
+        return "SmallIntegerField"
+
+class TextField(Field):
+    def get_manipulator_field_objs(self):
+        return [oldforms.LargeTextField]
+
+    def get_internal_type(self):
+        return "TextField"
+
+    def formfield(self, **kwargs):
+        defaults = {'widget': forms.Textarea}
+        defaults.update(kwargs)
+        return super(TextField, self).formfield(**defaults)
+
+class TimeField(Field):
+    empty_strings_allowed = False
+    def __init__(self, verbose_name=None, name=None, auto_now=False, auto_now_add=False, **kwargs):
+        self.auto_now, self.auto_now_add = auto_now, auto_now_add
+        if auto_now or auto_now_add:
+            kwargs['editable'] = False
+        Field.__init__(self, verbose_name, name, **kwargs)
+
+    def get_internal_type(self):
+        return "TimeField"
+
+    def to_python(self, value):
+        if value is None:
+            return None
+        if isinstance(value, datetime.time):
+            return value
+
+        # Attempt to parse a datetime:
+        value = smart_str(value)
+        # split usecs, because they are not recognized by strptime.
+        if '.' in value:
+            try:
+                value, usecs = value.split('.')
+                usecs = int(usecs)
+            except ValueError:
+                raise validators.ValidationError, _('Enter a valid time in HH:MM[:ss[.uuuuuu]] format.')
+        else:
+            usecs = 0
+        kwargs = {'microsecond': usecs}
+
+        try: # Seconds are optional, so try converting seconds first.
+            return datetime.time(*time.strptime(value, '%H:%M:%S')[3:6],
+                                 **kwargs)
+        except ValueError:
+            try: # Try without seconds.
+                return datetime.time(*time.strptime(value, '%H:%M')[3:5],
+                                         **kwargs)
+            except ValueError:
+                raise validators.ValidationError, _('Enter a valid time in HH:MM[:ss[.uuuuuu]] format.')
+
+    def pre_save(self, model_instance, add):
+        if self.auto_now or (self.auto_now_add and add):
+            value = datetime.datetime.now().time()
+            setattr(model_instance, self.attname, value)
+            return value
+        else:
+            return super(TimeField, self).pre_save(model_instance, add)
+
+    def get_db_prep_value(self, value):
+        # Casts times into the format expected by the backend
+        return connection.ops.value_to_db_time(self.to_python(value))
+
+    def get_manipulator_field_objs(self):
+        return [oldforms.TimeField]
+
+    def flatten_data(self,follow, obj = None):
+        val = self._get_val_from_obj(obj)
+        return {self.attname: (val is not None and val.strftime("%H:%M:%S") or '')}
+
+    def formfield(self, **kwargs):
+        defaults = {'form_class': forms.TimeField}
+        defaults.update(kwargs)
+        return super(TimeField, self).formfield(**defaults)
+
+class URLField(CharField):
+    def __init__(self, verbose_name=None, name=None, verify_exists=True, **kwargs):
+        kwargs['max_length'] = kwargs.get('max_length', 200)
+        if verify_exists:
+            kwargs.setdefault('validator_list', []).append(validators.isExistingURL)
+        self.verify_exists = verify_exists
+        CharField.__init__(self, verbose_name, name, **kwargs)
+
+    def get_manipulator_field_objs(self):
+        return [oldforms.URLField]
+
+    def formfield(self, **kwargs):
+        defaults = {'form_class': forms.URLField, 'verify_exists': self.verify_exists}
+        defaults.update(kwargs)
+        return super(URLField, self).formfield(**defaults)
+
+class USStateField(Field):
+    def get_manipulator_field_objs(self):
+        return [oldforms.USStateField]
+
+    def get_internal_type(self):
+        return "USStateField"
+
+    def formfield(self, **kwargs):
+        from django.contrib.localflavor.us.forms import USStateSelect
+        defaults = {'widget': USStateSelect}
+        defaults.update(kwargs)
+        return super(USStateField, self).formfield(**defaults)
+
+class XMLField(TextField):
+    def __init__(self, verbose_name=None, name=None, schema_path=None, **kwargs):
+        self.schema_path = schema_path
+        Field.__init__(self, verbose_name, name, **kwargs)
+
+    def get_manipulator_field_objs(self):
+        return [curry(oldforms.XMLLargeTextField, schema_path=self.schema_path)]
+
diff --git a/webapp/django/db/models/fields/files.py b/webapp/django/db/models/fields/files.py
new file mode 100644
index 0000000..935dee6
--- /dev/null
+++ b/webapp/django/db/models/fields/files.py
@@ -0,0 +1,291 @@
+import datetime
+import os
+
+from django.conf import settings
+from django.db.models.fields import Field
+from django.core.files.base import File, ContentFile
+from django.core.files.storage import default_storage
+from django.core.files.images import ImageFile, get_image_dimensions
+from django.core.files.uploadedfile import UploadedFile
+from django.utils.functional import curry
+from django.db.models import signals
+from django.utils.encoding import force_unicode, smart_str
+from django.utils.translation import ugettext_lazy, ugettext as _
+from django import oldforms
+from django import forms
+from django.core import validators
+from django.db.models.loading import cache
+
+class FieldFile(File):
+    def __init__(self, instance, field, name):
+        self.instance = instance
+        self.field = field
+        self.storage = field.storage
+        self._name = name or u''
+        self._closed = False
+
+    def __eq__(self, other):
+        # Older code may be expecting FileField values to be simple strings.
+        # By overriding the == operator, it can remain backwards compatibility.
+        if hasattr(other, 'name'):
+            return self.name == other.name
+        return self.name == other
+
+    # The standard File contains most of the necessary properties, but
+    # FieldFiles can be instantiated without a name, so that needs to
+    # be checked for here.
+
+    def _require_file(self):
+        if not self:
+            raise ValueError("The '%s' attribute has no file associated with it." % self.field.name)
+
+    def _get_file(self):
+        self._require_file()
+        if not hasattr(self, '_file'):
+            self._file = self.storage.open(self.name, 'rb')
+        return self._file
+    file = property(_get_file)
+
+    def _get_path(self):
+        self._require_file()
+        return self.storage.path(self.name)
+    path = property(_get_path)
+
+    def _get_url(self):
+        self._require_file()
+        return self.storage.url(self.name)
+    url = property(_get_url)
+
+    def open(self, mode='rb'):
+        self._require_file()
+        return super(FieldFile, self).open(mode)
+    # open() doesn't alter the file's contents, but it does reset the pointer
+    open.alters_data = True
+
+    # In addition to the standard File API, FieldFiles have extra methods
+    # to further manipulate the underlying file, as well as update the
+    # associated model instance.
+
+    def save(self, name, content, save=True):
+        name = self.field.generate_filename(self.instance, name)
+        self._name = self.storage.save(name, content)
+        setattr(self.instance, self.field.name, self.name)
+
+        # Update the filesize cache
+        self._size = len(content)
+
+        # Save the object because it has changed, unless save is False
+        if save:
+            self.instance.save()
+    save.alters_data = True
+
+    def delete(self, save=True):
+        self.close()
+        self.storage.delete(self.name)
+
+        self._name = None
+        setattr(self.instance, self.field.name, self.name)
+
+        # Delete the filesize cache
+        if hasattr(self, '_size'):
+            del self._size
+
+        if save:
+            self.instance.save()
+    delete.alters_data = True
+
+    def __getstate__(self):
+        # FieldFile needs access to its associated model field and an instance
+        # it's attached to in order to work properly, but the only necessary
+        # data to be pickled is the file's name itself. Everything else will
+        # be restored later, by FileDescriptor below.
+        return {'_name': self.name, '_closed': False}
+
+class FileDescriptor(object):
+    def __init__(self, field):
+        self.field = field
+
+    def __get__(self, instance=None, owner=None):
+        if instance is None:
+            raise AttributeError, "%s can only be accessed from %s instances." % (self.field.name(self.owner.__name__))
+        file = instance.__dict__[self.field.name]
+        if not isinstance(file, FieldFile):
+            # Create a new instance of FieldFile, based on a given file name
+            instance.__dict__[self.field.name] = self.field.attr_class(instance, self.field, file)
+        elif not hasattr(file, 'field'):
+            # The FieldFile was pickled, so some attributes need to be reset.
+            file.instance = instance
+            file.field = self.field
+            file.storage = self.field.storage
+        return instance.__dict__[self.field.name]
+
+    def __set__(self, instance, value):
+        instance.__dict__[self.field.name] = value
+
+class FileField(Field):
+    attr_class = FieldFile
+
+    def __init__(self, verbose_name=None, name=None, upload_to='', storage=None, **kwargs):
+        for arg in ('core', 'primary_key', 'unique'):
+            if arg in kwargs:
+                raise TypeError("'%s' is not a valid argument for %s." % (arg, self.__class__))
+
+        self.storage = storage or default_storage
+        self.upload_to = upload_to
+        if callable(upload_to):
+            self.generate_filename = upload_to
+
+        kwargs['max_length'] = kwargs.get('max_length', 100)
+        super(FileField, self).__init__(verbose_name, name, **kwargs)
+
+    def get_internal_type(self):
+        return "FileField"
+
+    def get_db_prep_lookup(self, lookup_type, value):
+        if hasattr(value, 'name'):
+            value = value.name
+        return super(FileField, self).get_db_prep_lookup(lookup_type, value)
+
+    def get_db_prep_value(self, value):
+        "Returns field's value prepared for saving into a database."
+        # Need to convert File objects provided via a form to unicode for database insertion
+        if value is None:
+            return None
+        return unicode(value)
+
+    def get_manipulator_fields(self, opts, manipulator, change, name_prefix='', rel=False, follow=True):
+        field_list = Field.get_manipulator_fields(self, opts, manipulator, change, name_prefix, rel, follow)
+        if not self.blank:
+            if rel:
+                # This validator makes sure FileFields work in a related context.
+                class RequiredFileField(object):
+                    def __init__(self, other_field_names, other_file_field_name):
+                        self.other_field_names = other_field_names
+                        self.other_file_field_name = other_file_field_name
+                        self.always_test = True
+                    def __call__(self, field_data, all_data):
+                        if not all_data.get(self.other_file_field_name, False):
+                            c = validators.RequiredIfOtherFieldsGiven(self.other_field_names, ugettext_lazy("This field is required."))
+                            c(field_data, all_data)
+                # First, get the core fields, if any.
+                core_field_names = []
+                for f in opts.fields:
+                    if f.core and f != self:
+                        core_field_names.extend(f.get_manipulator_field_names(name_prefix))
+                # Now, if there are any, add the validator to this FormField.
+                if core_field_names:
+                    field_list[0].validator_list.append(RequiredFileField(core_field_names, field_list[1].field_name))
+            else:
+                v = validators.RequiredIfOtherFieldNotGiven(field_list[1].field_name, ugettext_lazy("This field is required."))
+                v.always_test = True
+                field_list[0].validator_list.append(v)
+                field_list[0].is_required = field_list[1].is_required = False
+
+        # If the raw path is passed in, validate it's under the MEDIA_ROOT.
+        def isWithinMediaRoot(field_data, all_data):
+            f = os.path.abspath(os.path.join(settings.MEDIA_ROOT, field_data))
+            if not f.startswith(os.path.abspath(os.path.normpath(settings.MEDIA_ROOT))):
+                raise validators.ValidationError(_("Enter a valid filename."))
+        field_list[1].validator_list.append(isWithinMediaRoot)
+        return field_list
+
+    def contribute_to_class(self, cls, name):
+        super(FileField, self).contribute_to_class(cls, name)
+        setattr(cls, self.name, FileDescriptor(self))
+        signals.post_delete.connect(self.delete_file, sender=cls)
+
+    def delete_file(self, instance, sender, **kwargs):
+        file = getattr(instance, self.attname)
+        # If no other object of this type references the file,
+        # and it's not the default value for future objects,
+        # delete it from the backend.
+        if file and file.name != self.default and \
+            not sender._default_manager.filter(**{self.name: file.name}):
+                file.delete(save=False)
+        elif file:
+            # Otherwise, just close the file, so it doesn't tie up resources.
+            file.close()
+
+    def get_manipulator_field_objs(self):
+        return [oldforms.FileUploadField, oldforms.HiddenField]
+
+    def get_manipulator_field_names(self, name_prefix):
+        return [name_prefix + self.name + '_file', name_prefix + self.name]
+
+    def save_file(self, new_data, new_object, original_object, change, rel, save=True):
+        upload_field_name = self.get_manipulator_field_names('')[0]
+        if new_data.get(upload_field_name, False):
+            if rel:
+                file = new_data[upload_field_name][0]
+            else:
+                file = new_data[upload_field_name]
+
+            # Backwards-compatible support for files-as-dictionaries.
+            # We don't need to raise a warning because the storage backend will
+            # do so for us.
+            try:
+                filename = file.name
+            except AttributeError:
+                filename = file['filename']
+            filename = self.get_filename(filename)
+
+            getattr(new_object, self.attname).save(filename, file, save)
+
+    def get_directory_name(self):
+        return os.path.normpath(force_unicode(datetime.datetime.now().strftime(smart_str(self.upload_to))))
+
+    def get_filename(self, filename):
+        return os.path.normpath(self.storage.get_valid_name(os.path.basename(filename)))
+
+    def generate_filename(self, instance, filename):
+        return os.path.join(self.get_directory_name(), self.get_filename(filename))
+
+    def save_form_data(self, instance, data):
+        if data and isinstance(data, UploadedFile):
+            getattr(instance, self.name).save(data.name, data, save=False)
+
+    def formfield(self, **kwargs):
+        defaults = {'form_class': forms.FileField}
+        # If a file has been provided previously, then the form doesn't require
+        # that a new file is provided this time.
+        # The code to mark the form field as not required is used by
+        # form_for_instance, but can probably be removed once form_for_instance
+        # is gone. ModelForm uses a different method to check for an existing file.
+        if 'initial' in kwargs:
+            defaults['required'] = False
+        defaults.update(kwargs)
+        return super(FileField, self).formfield(**defaults)
+
+class ImageFieldFile(ImageFile, FieldFile):
+    def save(self, name, content, save=True):
+        # Repopulate the image dimension cache.
+        self._dimensions_cache = get_image_dimensions(content)
+
+        # Update width/height fields, if needed
+        if self.field.width_field:
+            setattr(self.instance, self.field.width_field, self.width)
+        if self.field.height_field:
+            setattr(self.instance, self.field.height_field, self.height)
+
+        super(ImageFieldFile, self).save(name, content, save)
+
+    def delete(self, save=True):
+        # Clear the image dimensions cache
+        if hasattr(self, '_dimensions_cache'):
+            del self._dimensions_cache
+        super(ImageFieldFile, self).delete(save)
+
+class ImageField(FileField):
+    attr_class = ImageFieldFile
+
+    def __init__(self, verbose_name=None, name=None, width_field=None, height_field=None, **kwargs):
+        self.width_field, self.height_field = width_field, height_field
+        FileField.__init__(self, verbose_name, name, **kwargs)
+
+    def get_manipulator_field_objs(self):
+        return [oldforms.ImageUploadField, oldforms.HiddenField]
+
+    def formfield(self, **kwargs):
+        defaults = {'form_class': forms.ImageField}
+        defaults.update(kwargs)
+        return super(ImageField, self).formfield(**defaults)
diff --git a/webapp/django/db/models/fields/proxy.py b/webapp/django/db/models/fields/proxy.py
new file mode 100644
index 0000000..31a31e3
--- /dev/null
+++ b/webapp/django/db/models/fields/proxy.py
@@ -0,0 +1,16 @@
+"""
+Field-like classes that aren't really fields. It's easier to use objects that
+have the same attributes as fields sometimes (avoids a lot of special casing).
+"""
+
+from django.db.models import fields
+
+class OrderWrt(fields.IntegerField):
+    """
+    A proxy for the _order database field that is used when
+    Meta.order_with_respect_to is specified.
+    """
+    name = '_order'
+    attname = '_order'
+    column = '_order'
+
diff --git a/webapp/django/db/models/fields/related.py b/webapp/django/db/models/fields/related.py
new file mode 100644
index 0000000..b09412a
--- /dev/null
+++ b/webapp/django/db/models/fields/related.py
@@ -0,0 +1,944 @@
+from django.db import connection, transaction
+from django.db.models import signals, get_model
+from django.db.models.fields import AutoField, Field, IntegerField, PositiveIntegerField, PositiveSmallIntegerField, FieldDoesNotExist
+from django.db.models.related import RelatedObject
+from django.db.models.query import QuerySet
+from django.db.models.query_utils import QueryWrapper
+from django.utils.translation import ugettext_lazy, string_concat, ungettext, ugettext as _
+from django.utils.functional import curry
+from django.core import validators
+from django import oldforms
+from django import forms
+
+try:
+    set
+except NameError:
+    from sets import Set as set   # Python 2.3 fallback
+
+# Values for Relation.edit_inline.
+TABULAR, STACKED = 1, 2
+
+RECURSIVE_RELATIONSHIP_CONSTANT = 'self'
+
+pending_lookups = {}
+
+def add_lazy_relation(cls, field, relation, operation):
+    """
+    Adds a lookup on ``cls`` when a related field is defined using a string,
+    i.e.::
+
+        class MyModel(Model):
+            fk = ForeignKey("AnotherModel")
+
+    This string can be:
+
+        * RECURSIVE_RELATIONSHIP_CONSTANT (i.e. "self") to indicate a recursive
+          relation.
+
+        * The name of a model (i.e "AnotherModel") to indicate another model in
+          the same app.
+
+        * An app-label and model name (i.e. "someapp.AnotherModel") to indicate
+          another model in a different app.
+
+    If the other model hasn't yet been loaded -- almost a given if you're using
+    lazy relationships -- then the relation won't be set up until the
+    class_prepared signal fires at the end of model initialization.
+    
+    operation is the work that must be performed once the relation can be resolved.
+    """
+    # Check for recursive relations
+    if relation == RECURSIVE_RELATIONSHIP_CONSTANT:
+        app_label = cls._meta.app_label
+        model_name = cls.__name__
+
+    else:
+        # Look for an "app.Model" relation
+        try:
+            app_label, model_name = relation.split(".")
+        except ValueError:
+            # If we can't split, assume a model in current app
+            app_label = cls._meta.app_label
+            model_name = relation
+
+    # Try to look up the related model, and if it's already loaded resolve the
+    # string right away. If get_model returns None, it means that the related
+    # model isn't loaded yet, so we need to pend the relation until the class
+    # is prepared.
+    model = get_model(app_label, model_name, False)
+    if model:
+        operation(field, model, cls)
+    else:
+        key = (app_label, model_name)
+        value = (cls, field, operation)
+        pending_lookups.setdefault(key, []).append(value)
+
+def do_pending_lookups(sender, **kwargs):
+    """
+    Handle any pending relations to the sending model. Sent from class_prepared.
+    """
+    key = (sender._meta.app_label, sender.__name__)
+    for cls, field, operation in pending_lookups.pop(key, []):
+        operation(field, sender, cls)
+
+signals.class_prepared.connect(do_pending_lookups)
+
+def manipulator_valid_rel_key(f, self, field_data, all_data):
+    "Validates that the value is a valid foreign key"
+    klass = f.rel.to
+    try:
+        klass._default_manager.get(**{f.rel.field_name: field_data})
+    except klass.DoesNotExist:
+        raise validators.ValidationError, _("Please enter a valid %s.") % f.verbose_name
+
+#HACK
+class RelatedField(object):
+    def contribute_to_class(self, cls, name):
+        sup = super(RelatedField, self)
+
+        # Add an accessor to allow easy determination of the related query path for this field
+        self.related_query_name = curry(self._get_related_query_name, cls._meta)
+
+        if hasattr(sup, 'contribute_to_class'):
+            sup.contribute_to_class(cls, name)
+
+        if not cls._meta.abstract and self.rel.related_name:
+            self.rel.related_name = self.rel.related_name % {'class': cls.__name__.lower()}
+
+        other = self.rel.to
+        if isinstance(other, basestring):
+            def resolve_related_class(field, model, cls):
+                field.rel.to = model
+                field.do_related_class(model, cls)
+            add_lazy_relation(cls, self, other, resolve_related_class)
+        else:
+            self.do_related_class(other, cls)
+
+    def set_attributes_from_rel(self):
+        self.name = self.name or (self.rel.to._meta.object_name.lower() + '_' + self.rel.to._meta.pk.name)
+        if self.verbose_name is None:
+            self.verbose_name = self.rel.to._meta.verbose_name
+        self.rel.field_name = self.rel.field_name or self.rel.to._meta.pk.name
+
+    def do_related_class(self, other, cls):
+        self.set_attributes_from_rel()
+        related = RelatedObject(other, cls, self)
+        if not cls._meta.abstract:
+            self.contribute_to_related_class(other, related)
+
+    def get_db_prep_lookup(self, lookup_type, value):
+        # If we are doing a lookup on a Related Field, we must be
+        # comparing object instances. The value should be the PK of value,
+        # not value itself.
+        def pk_trace(value):
+            # Value may be a primary key, or an object held in a relation.
+            # If it is an object, then we need to get the primary key value for
+            # that object. In certain conditions (especially one-to-one relations),
+            # the primary key may itself be an object - so we need to keep drilling
+            # down until we hit a value that can be used for a comparison.
+            v = value
+            try:
+                while True:
+                    v = getattr(v, v._meta.pk.name)
+            except AttributeError:
+                pass
+            return v
+
+        if hasattr(value, 'as_sql'):
+            sql, params = value.as_sql()
+            return QueryWrapper(('(%s)' % sql), params)
+        if lookup_type == 'exact':
+            return [pk_trace(value)]
+        if lookup_type == 'in':
+            return [pk_trace(v) for v in value]
+        elif lookup_type == 'isnull':
+            return []
+        raise TypeError, "Related Field has invalid lookup: %s" % lookup_type
+
+    def _get_related_query_name(self, opts):
+        # This method defines the name that can be used to identify this
+        # related object in a table-spanning query. It uses the lower-cased
+        # object_name by default, but this can be overridden with the
+        # "related_name" option.
+        return self.rel.related_name or opts.object_name.lower()
+
+class SingleRelatedObjectDescriptor(object):
+    # This class provides the functionality that makes the related-object
+    # managers available as attributes on a model class, for fields that have
+    # a single "remote" value, on the class pointed to by a related field.
+    # In the example "place.restaurant", the restaurant attribute is a
+    # SingleRelatedObjectDescriptor instance.
+    def __init__(self, related):
+        self.related = related
+        self.cache_name = '_%s_cache' % related.get_accessor_name()
+
+    def __get__(self, instance, instance_type=None):
+        if instance is None:
+            raise AttributeError, "%s must be accessed via instance" % self.related.opts.object_name
+
+        try:
+            return getattr(instance, self.cache_name)
+        except AttributeError:
+            params = {'%s__pk' % self.related.field.name: instance._get_pk_val()}
+            rel_obj = self.related.model._default_manager.get(**params)
+            setattr(instance, self.cache_name, rel_obj)
+            return rel_obj
+
+    def __set__(self, instance, value):
+        if instance is None:
+            raise AttributeError, "%s must be accessed via instance" % self.related.opts.object_name
+
+        # The similarity of the code below to the code in
+        # ReverseSingleRelatedObjectDescriptor is annoying, but there's a bunch
+        # of small differences that would make a common base class convoluted.
+
+        # If null=True, we can assign null here, but otherwise the value needs
+        # to be an instance of the related class.
+        if value is None and self.related.field.null == False:
+            raise ValueError('Cannot assign None: "%s.%s" does not allow null values.' %
+                                (instance._meta.object_name, self.related.get_accessor_name()))
+        elif value is not None and not isinstance(value, self.related.model):
+            raise ValueError('Cannot assign "%r": "%s.%s" must be a "%s" instance.' %
+                                (value, instance._meta.object_name,
+                                 self.related.get_accessor_name(), self.related.opts.object_name))
+
+        # Set the value of the related field
+        setattr(value, self.related.field.rel.get_related_field().attname, instance)
+
+        # Since we already know what the related object is, seed the related
+        # object caches now, too. This avoids another db hit if you get the
+        # object you just set.
+        setattr(instance, self.cache_name, value)
+        setattr(value, self.related.field.get_cache_name(), instance)
+
+class ReverseSingleRelatedObjectDescriptor(object):
+    # This class provides the functionality that makes the related-object
+    # managers available as attributes on a model class, for fields that have
+    # a single "remote" value, on the class that defines the related field.
+    # In the example "choice.poll", the poll attribute is a
+    # ReverseSingleRelatedObjectDescriptor instance.
+    def __init__(self, field_with_rel):
+        self.field = field_with_rel
+
+    def __get__(self, instance, instance_type=None):
+        if instance is None:
+            raise AttributeError, "%s must be accessed via instance" % self.field.name
+        cache_name = self.field.get_cache_name()
+        try:
+            return getattr(instance, cache_name)
+        except AttributeError:
+            val = getattr(instance, self.field.attname)
+            if val is None:
+                # If NULL is an allowed value, return it.
+                if self.field.null:
+                    return None
+                raise self.field.rel.to.DoesNotExist
+            other_field = self.field.rel.get_related_field()
+            if other_field.rel:
+                params = {'%s__pk' % self.field.rel.field_name: val}
+            else:
+                params = {'%s__exact' % self.field.rel.field_name: val}
+
+            # If the related manager indicates that it should be used for
+            # related fields, respect that.
+            rel_mgr = self.field.rel.to._default_manager
+            if getattr(rel_mgr, 'use_for_related_fields', False):
+                rel_obj = rel_mgr.get(**params)
+            else:
+                rel_obj = QuerySet(self.field.rel.to).get(**params)
+            setattr(instance, cache_name, rel_obj)
+            return rel_obj
+
+    def __set__(self, instance, value):
+        if instance is None:
+            raise AttributeError, "%s must be accessed via instance" % self._field.name
+
+        # If null=True, we can assign null here, but otherwise the value needs
+        # to be an instance of the related class.
+        if value is None and self.field.null == False:
+            raise ValueError('Cannot assign None: "%s.%s" does not allow null values.' %
+                                (instance._meta.object_name, self.field.name))
+        elif value is not None and not isinstance(value, self.field.rel.to):
+            raise ValueError('Cannot assign "%r": "%s.%s" must be a "%s" instance.' %
+                                (value, instance._meta.object_name,
+                                 self.field.name, self.field.rel.to._meta.object_name))
+
+        # Set the value of the related field
+        try:
+            val = getattr(value, self.field.rel.get_related_field().attname)
+        except AttributeError:
+            val = None
+        setattr(instance, self.field.attname, val)
+
+        # Since we already know what the related object is, seed the related
+        # object cache now, too. This avoids another db hit if you get the
+        # object you just set.
+        setattr(instance, self.field.get_cache_name(), value)
+
+class ForeignRelatedObjectsDescriptor(object):
+    # This class provides the functionality that makes the related-object
+    # managers available as attributes on a model class, for fields that have
+    # multiple "remote" values and have a ForeignKey pointed at them by
+    # some other model. In the example "poll.choice_set", the choice_set
+    # attribute is a ForeignRelatedObjectsDescriptor instance.
+    def __init__(self, related):
+        self.related = related   # RelatedObject instance
+
+    def __get__(self, instance, instance_type=None):
+        if instance is None:
+            raise AttributeError, "Manager must be accessed via instance"
+
+        rel_field = self.related.field
+        rel_model = self.related.model
+
+        # Dynamically create a class that subclasses the related
+        # model's default manager.
+        superclass = self.related.model._default_manager.__class__
+
+        class RelatedManager(superclass):
+            def get_query_set(self):
+                return superclass.get_query_set(self).filter(**(self.core_filters))
+
+            def add(self, *objs):
+                for obj in objs:
+                    setattr(obj, rel_field.name, instance)
+                    obj.save()
+            add.alters_data = True
+
+            def create(self, **kwargs):
+                new_obj = self.model(**kwargs)
+                self.add(new_obj)
+                return new_obj
+            create.alters_data = True
+
+            def get_or_create(self, **kwargs):
+                # Update kwargs with the related object that this
+                # ForeignRelatedObjectsDescriptor knows about.
+                kwargs.update({rel_field.name: instance})
+                return super(RelatedManager, self).get_or_create(**kwargs)
+            get_or_create.alters_data = True
+
+            # remove() and clear() are only provided if the ForeignKey can have a value of null.
+            if rel_field.null:
+                def remove(self, *objs):
+                    val = getattr(instance, rel_field.rel.get_related_field().attname)
+                    for obj in objs:
+                        # Is obj actually part of this descriptor set?
+                        if getattr(obj, rel_field.attname) == val:
+                            setattr(obj, rel_field.name, None)
+                            obj.save()
+                        else:
+                            raise rel_field.rel.to.DoesNotExist, "%r is not related to %r." % (obj, instance)
+                remove.alters_data = True
+
+                def clear(self):
+                    for obj in self.all():
+                        setattr(obj, rel_field.name, None)
+                        obj.save()
+                clear.alters_data = True
+
+        manager = RelatedManager()
+        attname = rel_field.rel.get_related_field().name
+        manager.core_filters = {'%s__%s' % (rel_field.name, attname):
+                getattr(instance, attname)}
+        manager.model = self.related.model
+
+        return manager
+
+    def __set__(self, instance, value):
+        if instance is None:
+            raise AttributeError, "Manager must be accessed via instance"
+
+        manager = self.__get__(instance)
+        # If the foreign key can support nulls, then completely clear the related set.
+        # Otherwise, just move the named objects into the set.
+        if self.related.field.null:
+            manager.clear()
+        manager.add(*value)
+
+def create_many_related_manager(superclass, through=False):
+    """Creates a manager that subclasses 'superclass' (which is a Manager)
+    and adds behavior for many-to-many related objects."""
+    class ManyRelatedManager(superclass):
+        def __init__(self, model=None, core_filters=None, instance=None, symmetrical=None,
+                join_table=None, source_col_name=None, target_col_name=None):
+            super(ManyRelatedManager, self).__init__()
+            self.core_filters = core_filters
+            self.model = model
+            self.symmetrical = symmetrical
+            self.instance = instance
+            self.join_table = join_table
+            self.source_col_name = source_col_name
+            self.target_col_name = target_col_name
+            self.through = through
+            self._pk_val = self.instance._get_pk_val()
+            if self._pk_val is None:
+                raise ValueError("%r instance needs to have a primary key value before a many-to-many relationship can be used." % instance.__class__.__name__)
+
+        def get_query_set(self):
+            return superclass.get_query_set(self)._next_is_sticky().filter(**(self.core_filters))
+
+        # If the ManyToMany relation has an intermediary model, 
+        # the add and remove methods do not exist.
+        if through is None:
+            def add(self, *objs):
+                self._add_items(self.source_col_name, self.target_col_name, *objs)
+
+                # If this is a symmetrical m2m relation to self, add the mirror entry in the m2m table
+                if self.symmetrical:
+                    self._add_items(self.target_col_name, self.source_col_name, *objs)
+            add.alters_data = True
+
+            def remove(self, *objs):
+                self._remove_items(self.source_col_name, self.target_col_name, *objs)
+
+                # If this is a symmetrical m2m relation to self, remove the mirror entry in the m2m table
+                if self.symmetrical:
+                    self._remove_items(self.target_col_name, self.source_col_name, *objs)
+            remove.alters_data = True
+
+        def clear(self):
+            self._clear_items(self.source_col_name)
+
+            # If this is a symmetrical m2m relation to self, clear the mirror entry in the m2m table
+            if self.symmetrical:
+                self._clear_items(self.target_col_name)
+        clear.alters_data = True
+
+        def create(self, **kwargs):
+            # This check needs to be done here, since we can't later remove this
+            # from the method lookup table, as we do with add and remove.
+            if through is not None:
+                raise AttributeError, "Cannot use create() on a ManyToManyField which specifies an intermediary model. Use %s's Manager instead." % through
+            new_obj = self.model(**kwargs)
+            new_obj.save()
+            self.add(new_obj)
+            return new_obj
+        create.alters_data = True
+
+        def get_or_create(self, **kwargs):
+            obj, created = \
+                    super(ManyRelatedManager, self).get_or_create(**kwargs)
+            # We only need to add() if created because if we got an object back
+            # from get() then the relationship already exists.
+            if created:
+                self.add(obj)
+            return obj, created
+        get_or_create.alters_data = True
+
+        def _add_items(self, source_col_name, target_col_name, *objs):
+            # join_table: name of the m2m link table
+            # source_col_name: the PK colname in join_table for the source object
+            # target_col_name: the PK colname in join_table for the target object
+            # *objs - objects to add. Either object instances, or primary keys of object instances.
+
+            # If there aren't any objects, there is nothing to do.
+            if objs:
+                # Check that all the objects are of the right type
+                new_ids = set()
+                for obj in objs:
+                    if isinstance(obj, self.model):
+                        new_ids.add(obj._get_pk_val())
+                    else:
+                        new_ids.add(obj)
+                # Add the newly created or already existing objects to the join table.
+                # First find out which items are already added, to avoid adding them twice
+                cursor = connection.cursor()
+                cursor.execute("SELECT %s FROM %s WHERE %s = %%s AND %s IN (%s)" % \
+                    (target_col_name, self.join_table, source_col_name,
+                    target_col_name, ",".join(['%s'] * len(new_ids))),
+                    [self._pk_val] + list(new_ids))
+                existing_ids = set([row[0] for row in cursor.fetchall()])
+
+                # Add the ones that aren't there already
+                for obj_id in (new_ids - existing_ids):
+                    cursor.execute("INSERT INTO %s (%s, %s) VALUES (%%s, %%s)" % \
+                        (self.join_table, source_col_name, target_col_name),
+                        [self._pk_val, obj_id])
+                transaction.commit_unless_managed()
+
+        def _remove_items(self, source_col_name, target_col_name, *objs):
+            # source_col_name: the PK colname in join_table for the source object
+            # target_col_name: the PK colname in join_table for the target object
+            # *objs - objects to remove
+
+            # If there aren't any objects, there is nothing to do.
+            if objs:
+                # Check that all the objects are of the right type
+                old_ids = set()
+                for obj in objs:
+                    if isinstance(obj, self.model):
+                        old_ids.add(obj._get_pk_val())
+                    else:
+                        old_ids.add(obj)
+                # Remove the specified objects from the join table
+                cursor = connection.cursor()
+                cursor.execute("DELETE FROM %s WHERE %s = %%s AND %s IN (%s)" % \
+                    (self.join_table, source_col_name,
+                    target_col_name, ",".join(['%s'] * len(old_ids))),
+                    [self._pk_val] + list(old_ids))
+                transaction.commit_unless_managed()
+
+        def _clear_items(self, source_col_name):
+            # source_col_name: the PK colname in join_table for the source object
+            cursor = connection.cursor()
+            cursor.execute("DELETE FROM %s WHERE %s = %%s" % \
+                (self.join_table, source_col_name),
+                [self._pk_val])
+            transaction.commit_unless_managed()
+
+    return ManyRelatedManager
+
+class ManyRelatedObjectsDescriptor(object):
+    # This class provides the functionality that makes the related-object
+    # managers available as attributes on a model class, for fields that have
+    # multiple "remote" values and have a ManyToManyField pointed at them by
+    # some other model (rather than having a ManyToManyField themselves).
+    # In the example "publication.article_set", the article_set attribute is a
+    # ManyRelatedObjectsDescriptor instance.
+    def __init__(self, related):
+        self.related = related   # RelatedObject instance
+
+    def __get__(self, instance, instance_type=None):
+        if instance is None:
+            raise AttributeError, "Manager must be accessed via instance"
+
+        # Dynamically create a class that subclasses the related
+        # model's default manager.
+        rel_model = self.related.model
+        superclass = rel_model._default_manager.__class__
+        RelatedManager = create_many_related_manager(superclass, self.related.field.rel.through)
+
+        qn = connection.ops.quote_name
+        manager = RelatedManager(
+            model=rel_model,
+            core_filters={'%s__pk' % self.related.field.name: instance._get_pk_val()},
+            instance=instance,
+            symmetrical=False,
+            join_table=qn(self.related.field.m2m_db_table()),
+            source_col_name=qn(self.related.field.m2m_reverse_name()),
+            target_col_name=qn(self.related.field.m2m_column_name())
+        )
+
+        return manager
+
+    def __set__(self, instance, value):
+        if instance is None:
+            raise AttributeError, "Manager must be accessed via instance"
+
+        through = getattr(self.related.field.rel, 'through', None)
+        if through is not None:
+            raise AttributeError, "Cannot set values on a ManyToManyField which specifies an intermediary model. Use %s's Manager instead." % through
+
+        manager = self.__get__(instance)
+        manager.clear()
+        manager.add(*value)
+
+class ReverseManyRelatedObjectsDescriptor(object):
+    # This class provides the functionality that makes the related-object
+    # managers available as attributes on a model class, for fields that have
+    # multiple "remote" values and have a ManyToManyField defined in their
+    # model (rather than having another model pointed *at* them).
+    # In the example "article.publications", the publications attribute is a
+    # ReverseManyRelatedObjectsDescriptor instance.
+    def __init__(self, m2m_field):
+        self.field = m2m_field
+
+    def __get__(self, instance, instance_type=None):
+        if instance is None:
+            raise AttributeError, "Manager must be accessed via instance"
+
+        # Dynamically create a class that subclasses the related
+        # model's default manager.
+        rel_model=self.field.rel.to
+        superclass = rel_model._default_manager.__class__
+        RelatedManager = create_many_related_manager(superclass, self.field.rel.through)
+
+        qn = connection.ops.quote_name
+        manager = RelatedManager(
+            model=rel_model,
+            core_filters={'%s__pk' % self.field.related_query_name(): instance._get_pk_val()},
+            instance=instance,
+            symmetrical=(self.field.rel.symmetrical and instance.__class__ == rel_model),
+            join_table=qn(self.field.m2m_db_table()),
+            source_col_name=qn(self.field.m2m_column_name()),
+            target_col_name=qn(self.field.m2m_reverse_name())
+        )
+
+        return manager
+
+    def __set__(self, instance, value):
+        if instance is None:
+            raise AttributeError, "Manager must be accessed via instance"
+
+        through = getattr(self.field.rel, 'through', None)
+        if through is not None:
+            raise AttributeError, "Cannot set values on a ManyToManyField which specifies an intermediary model.  Use %s's Manager instead." % through
+
+        manager = self.__get__(instance)
+        manager.clear()
+        manager.add(*value)
+
+class ManyToOneRel(object):
+    def __init__(self, to, field_name, num_in_admin=3, min_num_in_admin=None,
+            max_num_in_admin=None, num_extra_on_change=1, edit_inline=False,
+            related_name=None, limit_choices_to=None, lookup_overrides=None,
+            parent_link=False):
+        try:
+            to._meta
+        except AttributeError: # to._meta doesn't exist, so it must be RECURSIVE_RELATIONSHIP_CONSTANT
+            assert isinstance(to, basestring), "'to' must be either a model, a model name or the string %r" % RECURSIVE_RELATIONSHIP_CONSTANT
+        self.to, self.field_name = to, field_name
+        self.num_in_admin, self.edit_inline = num_in_admin, edit_inline
+        self.min_num_in_admin, self.max_num_in_admin = min_num_in_admin, max_num_in_admin
+        self.num_extra_on_change, self.related_name = num_extra_on_change, related_name
+        if limit_choices_to is None:
+            limit_choices_to = {}
+        self.limit_choices_to = limit_choices_to
+        self.lookup_overrides = lookup_overrides or {}
+        self.multiple = True
+        self.parent_link = parent_link
+
+    def get_related_field(self):
+        """
+        Returns the Field in the 'to' object to which this relationship is
+        tied.
+        """
+        data = self.to._meta.get_field_by_name(self.field_name)
+        if not data[2]:
+            raise FieldDoesNotExist("No related field named '%s'" %
+                    self.field_name)
+        return data[0]
+
+class OneToOneRel(ManyToOneRel):
+    def __init__(self, to, field_name, num_in_admin=0, min_num_in_admin=None,
+            max_num_in_admin=None, num_extra_on_change=None, edit_inline=False,
+            related_name=None, limit_choices_to=None, lookup_overrides=None,
+            parent_link=False):
+        # NOTE: *_num_in_admin and num_extra_on_change are intentionally
+        # ignored here. We accept them as parameters only to match the calling
+        # signature of ManyToOneRel.__init__().
+        super(OneToOneRel, self).__init__(to, field_name, num_in_admin,
+                edit_inline=edit_inline, related_name=related_name,
+                limit_choices_to=limit_choices_to,
+                lookup_overrides=lookup_overrides, parent_link=parent_link)
+        self.multiple = False
+
+class ManyToManyRel(object):
+    def __init__(self, to, num_in_admin=0, related_name=None,
+        limit_choices_to=None, symmetrical=True, through=None):
+        self.to = to
+        self.num_in_admin = num_in_admin
+        self.related_name = related_name
+        if limit_choices_to is None:
+            limit_choices_to = {}
+        self.limit_choices_to = limit_choices_to
+        self.edit_inline = False
+        self.symmetrical = symmetrical
+        self.multiple = True
+        self.through = through
+
+class ForeignKey(RelatedField, Field):
+    empty_strings_allowed = False
+    def __init__(self, to, to_field=None, rel_class=ManyToOneRel, **kwargs):
+        try:
+            to_name = to._meta.object_name.lower()
+        except AttributeError: # to._meta doesn't exist, so it must be RECURSIVE_RELATIONSHIP_CONSTANT
+            assert isinstance(to, basestring), "%s(%r) is invalid. First parameter to ForeignKey must be either a model, a model name, or the string %r" % (self.__class__.__name__, to, RECURSIVE_RELATIONSHIP_CONSTANT)
+        else:
+            assert not to._meta.abstract, "%s cannot define a relation with abstract class %s" % (self.__class__.__name__, to._meta.object_name)
+            to_field = to_field or to._meta.pk.name
+        kwargs['verbose_name'] = kwargs.get('verbose_name', None)
+
+        kwargs['rel'] = rel_class(to, to_field,
+            num_in_admin=kwargs.pop('num_in_admin', 3),
+            min_num_in_admin=kwargs.pop('min_num_in_admin', None),
+            max_num_in_admin=kwargs.pop('max_num_in_admin', None),
+            num_extra_on_change=kwargs.pop('num_extra_on_change', 1),
+            edit_inline=kwargs.pop('edit_inline', False),
+            related_name=kwargs.pop('related_name', None),
+            limit_choices_to=kwargs.pop('limit_choices_to', None),
+            lookup_overrides=kwargs.pop('lookup_overrides', None),
+            parent_link=kwargs.pop('parent_link', False))
+        Field.__init__(self, **kwargs)
+
+        self.db_index = True
+
+    def get_attname(self):
+        return '%s_id' % self.name
+
+    def get_validator_unique_lookup_type(self):
+        return '%s__%s__exact' % (self.name, self.rel.get_related_field().name)
+
+    def prepare_field_objs_and_params(self, manipulator, name_prefix):
+        params = {'validator_list': self.validator_list[:], 'member_name': name_prefix + self.attname}
+        if self.null:
+            field_objs = [oldforms.NullSelectField]
+        else:
+            field_objs = [oldforms.SelectField]
+        params['choices'] = self.get_choices_default()
+        return field_objs, params
+
+    def get_default(self):
+        "Here we check if the default value is an object and return the to_field if so."
+        field_default = super(ForeignKey, self).get_default()
+        if isinstance(field_default, self.rel.to):
+            return getattr(field_default, self.rel.get_related_field().attname)
+        return field_default
+
+    def get_manipulator_field_objs(self):
+        rel_field = self.rel.get_related_field()
+        return [oldforms.IntegerField]
+
+    def get_db_prep_save(self, value):
+        if value == '' or value == None:
+            return None
+        else:
+            return self.rel.get_related_field().get_db_prep_save(value)
+
+    def flatten_data(self, follow, obj=None):
+        if not obj:
+            # In required many-to-one fields with only one available choice,
+            # select that one available choice. Note: For SelectFields
+            # we have to check that the length of choices is *2*, not 1,
+            # because SelectFields always have an initial "blank" value.
+            if not self.blank and self.choices:
+                choice_list = self.get_choices_default()
+                if len(choice_list) == 2:
+                    return {self.attname: choice_list[1][0]}
+        return Field.flatten_data(self, follow, obj)
+
+    def contribute_to_class(self, cls, name):
+        super(ForeignKey, self).contribute_to_class(cls, name)
+        setattr(cls, self.name, ReverseSingleRelatedObjectDescriptor(self))
+        if isinstance(self.rel.to, basestring):
+            target = self.rel.to
+        else:
+            target = self.rel.to._meta.db_table
+        cls._meta.duplicate_targets[self.column] = (target, "o2m")
+
+    def contribute_to_related_class(self, cls, related):
+        setattr(cls, related.get_accessor_name(), ForeignRelatedObjectsDescriptor(related))
+
+    def formfield(self, **kwargs):
+        defaults = {'form_class': forms.ModelChoiceField, 'queryset': self.rel.to._default_manager.complex_filter(self.rel.limit_choices_to)}
+        defaults.update(kwargs)
+        return super(ForeignKey, self).formfield(**defaults)
+
+    def db_type(self):
+        # The database column type of a ForeignKey is the column type
+        # of the field to which it points. An exception is if the ForeignKey
+        # points to an AutoField/PositiveIntegerField/PositiveSmallIntegerField,
+        # in which case the column type is simply that of an IntegerField.
+        rel_field = self.rel.get_related_field()
+        if isinstance(rel_field, (AutoField, PositiveIntegerField, PositiveSmallIntegerField)):
+            return IntegerField().db_type()
+        return rel_field.db_type()
+
+class OneToOneField(ForeignKey):
+    """
+    A OneToOneField is essentially the same as a ForeignKey, with the exception
+    that always carries a "unique" constraint with it and the reverse relation
+    always returns the object pointed to (since there will only ever be one),
+    rather than returning a list.
+    """
+    def __init__(self, to, to_field=None, **kwargs):
+        kwargs['unique'] = True
+        if 'num_in_admin' not in kwargs:
+            kwargs['num_in_admin'] = 0
+        super(OneToOneField, self).__init__(to, to_field, OneToOneRel, **kwargs)
+
+    def contribute_to_related_class(self, cls, related):
+        setattr(cls, related.get_accessor_name(),
+                SingleRelatedObjectDescriptor(related))
+        if not cls._meta.one_to_one_field:
+            cls._meta.one_to_one_field = self
+    
+    def formfield(self, **kwargs):
+        if self.rel.parent_link:
+            return None
+        return super(OneToOneField, self).formfield(**kwargs)
+
+class ManyToManyField(RelatedField, Field):
+    def __init__(self, to, **kwargs):
+        try:
+            assert not to._meta.abstract, "%s cannot define a relation with abstract class %s" % (self.__class__.__name__, to._meta.object_name)
+        except AttributeError: # to._meta doesn't exist, so it must be RECURSIVE_RELATIONSHIP_CONSTANT
+            assert isinstance(to, basestring), "%s(%r) is invalid. First parameter to ManyToManyField must be either a model, a model name, or the string %r" % (self.__class__.__name__, to, RECURSIVE_RELATIONSHIP_CONSTANT)
+
+        kwargs['verbose_name'] = kwargs.get('verbose_name', None)
+        kwargs['rel'] = ManyToManyRel(to,
+            num_in_admin=kwargs.pop('num_in_admin', 0),
+            related_name=kwargs.pop('related_name', None),
+            limit_choices_to=kwargs.pop('limit_choices_to', None),
+            symmetrical=kwargs.pop('symmetrical', True),
+            through=kwargs.pop('through', None))
+            
+        self.db_table = kwargs.pop('db_table', None)
+        if kwargs['rel'].through is not None:
+            self.creates_table = False
+            assert self.db_table is None, "Cannot specify a db_table if an intermediary model is used."
+        else:
+            self.creates_table = True
+
+        Field.__init__(self, **kwargs)
+
+        msg = ugettext_lazy('Hold down "Control", or "Command" on a Mac, to select more than one.')
+        self.help_text = string_concat(self.help_text, ' ', msg)
+
+    def get_manipulator_field_objs(self):
+        choices = self.get_choices_default()
+        return [curry(oldforms.SelectMultipleField, size=min(max(len(choices), 5), 15), choices=choices)]
+
+    def get_choices_default(self):
+        return Field.get_choices(self, include_blank=False)
+
+    def _get_m2m_db_table(self, opts):
+        "Function that can be curried to provide the m2m table name for this relation"
+        if self.rel.through is not None:
+            return self.rel.through_model._meta.db_table
+        elif self.db_table:
+            return self.db_table
+        else:
+            return '%s_%s' % (opts.db_table, self.name)
+
+    def _get_m2m_column_name(self, related):
+        "Function that can be curried to provide the source column name for the m2m table"
+        try:
+            return self._m2m_column_name_cache
+        except:
+            if self.rel.through is not None:
+                for f in self.rel.through_model._meta.fields:
+                    if hasattr(f,'rel') and f.rel and f.rel.to == related.model:
+                        self._m2m_column_name_cache = f.column
+                        break
+            # If this is an m2m relation to self, avoid the inevitable name clash
+            elif related.model == related.parent_model:
+                self._m2m_column_name_cache = 'from_' + related.model._meta.object_name.lower() + '_id'
+            else:
+                self._m2m_column_name_cache = related.model._meta.object_name.lower() + '_id'
+                
+            # Return the newly cached value
+            return self._m2m_column_name_cache
+
+    def _get_m2m_reverse_name(self, related):
+        "Function that can be curried to provide the related column name for the m2m table"
+        try:
+            return self._m2m_reverse_name_cache
+        except:
+            if self.rel.through is not None:
+                found = False
+                for f in self.rel.through_model._meta.fields:
+                    if hasattr(f,'rel') and f.rel and f.rel.to == related.parent_model:
+                        if related.model == related.parent_model:
+                            # If this is an m2m-intermediate to self, 
+                            # the first foreign key you find will be 
+                            # the source column. Keep searching for
+                            # the second foreign key.
+                            if found:
+                                self._m2m_reverse_name_cache = f.column
+                                break
+                            else:
+                                found = True
+                        else:
+                            self._m2m_reverse_name_cache = f.column
+                            break
+            # If this is an m2m relation to self, avoid the inevitable name clash
+            elif related.model == related.parent_model:
+                self._m2m_reverse_name_cache = 'to_' + related.parent_model._meta.object_name.lower() + '_id'
+            else:
+                self._m2m_reverse_name_cache = related.parent_model._meta.object_name.lower() + '_id'
+
+            # Return the newly cached value
+            return self._m2m_reverse_name_cache
+
+    def isValidIDList(self, field_data, all_data):
+        "Validates that the value is a valid list of foreign keys"
+        mod = self.rel.to
+        try:
+            pks = map(int, field_data.split(','))
+        except ValueError:
+            # the CommaSeparatedIntegerField validator will catch this error
+            return
+        objects = mod._default_manager.in_bulk(pks)
+        if len(objects) != len(pks):
+            badkeys = [k for k in pks if k not in objects]
+            raise validators.ValidationError, ungettext("Please enter valid %(self)s IDs. The value %(value)r is invalid.",
+                    "Please enter valid %(self)s IDs. The values %(value)r are invalid.", len(badkeys)) % {
+                'self': self.verbose_name,
+                'value': len(badkeys) == 1 and badkeys[0] or tuple(badkeys),
+            }
+
+    def flatten_data(self, follow, obj = None):
+        new_data = {}
+        if obj:
+            instance_ids = [instance._get_pk_val() for instance in getattr(obj, self.name).all()]
+            new_data[self.name] = instance_ids
+        else:
+            # In required many-to-many fields with only one available choice,
+            # select that one available choice.
+            if not self.blank and not self.rel.edit_inline:
+                choices_list = self.get_choices_default()
+                if len(choices_list) == 1:
+                    new_data[self.name] = [choices_list[0][0]]
+        return new_data
+
+    def contribute_to_class(self, cls, name):
+        super(ManyToManyField, self).contribute_to_class(cls, name)        
+        # Add the descriptor for the m2m relation
+        setattr(cls, self.name, ReverseManyRelatedObjectsDescriptor(self))
+
+        # Set up the accessor for the m2m table name for the relation
+        self.m2m_db_table = curry(self._get_m2m_db_table, cls._meta)
+        
+        # Populate some necessary rel arguments so that cross-app relations
+        # work correctly.
+        if isinstance(self.rel.through, basestring):
+            def resolve_through_model(field, model, cls):
+                field.rel.through_model = model
+            add_lazy_relation(cls, self, self.rel.through, resolve_through_model)
+        elif self.rel.through:
+            self.rel.through_model = self.rel.through
+            self.rel.through = self.rel.through._meta.object_name
+            
+        if isinstance(self.rel.to, basestring):
+            target = self.rel.to
+        else:
+            target = self.rel.to._meta.db_table
+        cls._meta.duplicate_targets[self.column] = (target, "m2m")
+
+    def contribute_to_related_class(self, cls, related):
+        # m2m relations to self do not have a ManyRelatedObjectsDescriptor,
+        # as it would be redundant - unless the field is non-symmetrical.
+        if related.model != related.parent_model or not self.rel.symmetrical:
+            # Add the descriptor for the m2m relation
+            setattr(cls, related.get_accessor_name(), ManyRelatedObjectsDescriptor(related))
+
+        # Set up the accessors for the column names on the m2m table
+        self.m2m_column_name = curry(self._get_m2m_column_name, related)
+        self.m2m_reverse_name = curry(self._get_m2m_reverse_name, related)
+
+    def set_attributes_from_rel(self):
+        pass
+
+    def value_from_object(self, obj):
+        "Returns the value of this field in the given model instance."
+        return getattr(obj, self.attname).all()
+
+    def save_form_data(self, instance, data):
+        setattr(instance, self.attname, data)
+
+    def formfield(self, **kwargs):
+        defaults = {'form_class': forms.ModelMultipleChoiceField, 'queryset': self.rel.to._default_manager.complex_filter(self.rel.limit_choices_to)}
+        defaults.update(kwargs)
+        # If initial is passed in, it's a list of related objects, but the
+        # MultipleChoiceField takes a list of IDs.
+        if defaults.get('initial') is not None:
+            defaults['initial'] = [i._get_pk_val() for i in defaults['initial']]
+        return super(ManyToManyField, self).formfield(**defaults)
+
+    def db_type(self):
+        # A ManyToManyField is not represented by a single column,
+        # so return None.
+        return None
+
diff --git a/webapp/django/db/models/fields/subclassing.py b/webapp/django/db/models/fields/subclassing.py
new file mode 100644
index 0000000..10add10
--- /dev/null
+++ b/webapp/django/db/models/fields/subclassing.py
@@ -0,0 +1,50 @@
+"""
+Convenience routines for creating non-trivial Field subclasses.
+
+Add SubfieldBase as the __metaclass__ for your Field subclass, implement
+to_python() and the other necessary methods and everything will work seamlessly.
+"""
+
+class SubfieldBase(type):
+    """
+    A metaclass for custom Field subclasses. This ensures the model's attribute
+    has the descriptor protocol attached to it.
+    """
+    def __new__(cls, base, name, attrs):
+        new_class = super(SubfieldBase, cls).__new__(cls, base, name, attrs)
+        new_class.contribute_to_class = make_contrib(
+                attrs.get('contribute_to_class'))
+        return new_class
+
+class Creator(object):
+    """
+    A placeholder class that provides a way to set the attribute on the model.
+    """
+    def __init__(self, field):
+        self.field = field
+
+    def __get__(self, obj, type=None):
+        if obj is None:
+            raise AttributeError('Can only be accessed via an instance.')
+        return obj.__dict__[self.field.name]        
+
+    def __set__(self, obj, value):
+        obj.__dict__[self.field.name] = self.field.to_python(value)
+
+def make_contrib(func=None):
+    """
+    Returns a suitable contribute_to_class() method for the Field subclass.
+
+    If 'func' is passed in, it is the existing contribute_to_class() method on
+    the subclass and it is called before anything else. It is assumed in this
+    case that the existing contribute_to_class() calls all the necessary
+    superclass methods.
+    """
+    def contribute_to_class(self, cls, name):
+        if func:
+            func(self, cls, name)
+        else:
+            super(self.__class__, self).contribute_to_class(cls, name)
+        setattr(cls, self.name, Creator(self))
+
+    return contribute_to_class
diff --git a/webapp/django/db/models/loading.py b/webapp/django/db/models/loading.py
new file mode 100644
index 0000000..6837e07
--- /dev/null
+++ b/webapp/django/db/models/loading.py
@@ -0,0 +1,189 @@
+"Utilities for loading models and the modules that contain them."
+
+from django.conf import settings
+from django.core.exceptions import ImproperlyConfigured
+from django.utils.datastructures import SortedDict
+
+import sys
+import os
+import threading
+
+__all__ = ('get_apps', 'get_app', 'get_models', 'get_model', 'register_models',
+        'load_app', 'app_cache_ready')
+
+class AppCache(object):
+    """
+    A cache that stores installed applications and their models. Used to
+    provide reverse-relations and for app introspection (e.g. admin).
+    """
+    # Use the Borg pattern to share state between all instances. Details at
+    # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66531.
+    __shared_state = dict(
+        # Keys of app_store are the model modules for each application.
+        app_store = SortedDict(),
+
+        # Mapping of app_labels to a dictionary of model names to model code.
+        app_models = SortedDict(),
+
+        # Mapping of app_labels to errors raised when trying to import the app.
+        app_errors = {},
+
+        # -- Everything below here is only used when populating the cache --
+        loaded = False,
+        handled = {},
+        postponed = [],
+        nesting_level = 0,
+        write_lock = threading.RLock(),
+    )
+
+    def __init__(self):
+        self.__dict__ = self.__shared_state
+
+    def _populate(self):
+        """
+        Fill in all the cache information. This method is threadsafe, in the
+        sense that every caller will see the same state upon return, and if the
+        cache is already initialised, it does no work.
+        """
+        if self.loaded:
+            return
+        self.write_lock.acquire()
+        try:
+            if self.loaded:
+                return
+            for app_name in settings.INSTALLED_APPS:
+                if app_name in self.handled:
+                    continue
+                self.load_app(app_name, True)
+            if not self.nesting_level:
+                for app_name in self.postponed:
+                    self.load_app(app_name)
+                self.loaded = True
+        finally:
+            self.write_lock.release()
+
+    def load_app(self, app_name, can_postpone=False):
+        """
+        Loads the app with the provided fully qualified name, and returns the
+        model module.
+        """
+        self.handled[app_name] = None
+        self.nesting_level += 1
+        mod = __import__(app_name, {}, {}, ['models'])
+        self.nesting_level -= 1
+        if not hasattr(mod, 'models'):
+            if can_postpone:
+                # Either the app has no models, or the package is still being
+                # imported by Python and the model module isn't available yet.
+                # We will check again once all the recursion has finished (in
+                # populate).
+                self.postponed.append(app_name)
+            return None
+        if mod.models not in self.app_store:
+            self.app_store[mod.models] = len(self.app_store)
+        return mod.models
+
+    def app_cache_ready(self):
+        """
+        Returns true if the model cache is fully populated.
+
+        Useful for code that wants to cache the results of get_models() for
+        themselves once it is safe to do so.
+        """
+        return self.loaded
+
+    def get_apps(self):
+        "Returns a list of all installed modules that contain models."
+        self._populate()
+
+        # Ensure the returned list is always in the same order (with new apps
+        # added at the end). This avoids unstable ordering on the admin app
+        # list page, for example.
+        apps = [(v, k) for k, v in self.app_store.items()]
+        apps.sort()
+        return [elt[1] for elt in apps]
+
+    def get_app(self, app_label, emptyOK=False):
+        """
+        Returns the module containing the models for the given app_label. If
+        the app has no models in it and 'emptyOK' is True, returns None.
+        """
+        self._populate()
+        self.write_lock.acquire()
+        try:
+            for app_name in settings.INSTALLED_APPS:
+                if app_label == app_name.split('.')[-1]:
+                    mod = self.load_app(app_name, False)
+                    if mod is None:
+                        if emptyOK:
+                            return None
+                    else:
+                        return mod
+            raise ImproperlyConfigured, "App with label %s could not be found" % app_label
+        finally:
+            self.write_lock.release()
+
+    def get_app_errors(self):
+        "Returns the map of known problems with the INSTALLED_APPS."
+        self._populate()
+        return self.app_errors
+
+    def get_models(self, app_mod=None):
+        """
+        Given a module containing models, returns a list of the models.
+        Otherwise returns a list of all installed models.
+        """
+        self._populate()
+        if app_mod:
+            return self.app_models.get(app_mod.__name__.split('.')[-2], SortedDict()).values()
+        else:
+            model_list = []
+            for app_entry in self.app_models.itervalues():
+                model_list.extend(app_entry.values())
+            return model_list
+
+    def get_model(self, app_label, model_name, seed_cache=True):
+        """
+        Returns the model matching the given app_label and case-insensitive
+        model_name.
+
+        Returns None if no model is found.
+        """
+        if seed_cache:
+            self._populate()
+        return self.app_models.get(app_label, SortedDict()).get(model_name.lower())
+
+    def register_models(self, app_label, *models):
+        """
+        Register a set of models as belonging to an app.
+        """
+        for model in models:
+            # Store as 'name: model' pair in a dictionary
+            # in the app_models dictionary
+            model_name = model._meta.object_name.lower()
+            model_dict = self.app_models.setdefault(app_label, SortedDict())
+            if model_name in model_dict:
+                # The same model may be imported via different paths (e.g.
+                # appname.models and project.appname.models). We use the source
+                # filename as a means to detect identity.
+                fname1 = os.path.abspath(sys.modules[model.__module__].__file__)
+                fname2 = os.path.abspath(sys.modules[model_dict[model_name].__module__].__file__)
+                # Since the filename extension could be .py the first time and
+                # .pyc or .pyo the second time, ignore the extension when
+                # comparing.
+                if os.path.splitext(fname1)[0] == os.path.splitext(fname2)[0]:
+                    continue
+            model_dict[model_name] = model
+
+cache = AppCache()
+
+# These methods were always module level, so are kept that way for backwards
+# compatibility.
+get_apps = cache.get_apps
+get_app = cache.get_app
+get_app_errors = cache.get_app_errors
+get_models = cache.get_models
+get_model = cache.get_model
+register_models = cache.register_models
+load_app = cache.load_app
+app_cache_ready = cache.app_cache_ready
diff --git a/webapp/django/db/models/manager.py b/webapp/django/db/models/manager.py
new file mode 100644
index 0000000..96bd53f
--- /dev/null
+++ b/webapp/django/db/models/manager.py
@@ -0,0 +1,144 @@
+import copy
+
+from django.db.models.query import QuerySet, EmptyQuerySet, insert_query
+from django.db.models import signals
+from django.db.models.fields import FieldDoesNotExist
+
+def ensure_default_manager(sender, **kwargs):
+    cls = sender
+    if not getattr(cls, '_default_manager', None) and not cls._meta.abstract:
+        # Create the default manager, if needed.
+        try:
+            cls._meta.get_field('objects')
+            raise ValueError, "Model %s must specify a custom Manager, because it has a field named 'objects'" % cls.__name__
+        except FieldDoesNotExist:
+            pass
+        cls.add_to_class('objects', Manager())
+
+signals.class_prepared.connect(ensure_default_manager)
+
+class Manager(object):
+    # Tracks each time a Manager instance is created. Used to retain order.
+    creation_counter = 0
+
+    def __init__(self):
+        super(Manager, self).__init__()
+        # Increase the creation counter, and save our local copy.
+        self.creation_counter = Manager.creation_counter
+        Manager.creation_counter += 1
+        self.model = None
+
+    def contribute_to_class(self, model, name):
+        # TODO: Use weakref because of possible memory leak / circular reference.
+        self.model = model
+        setattr(model, name, ManagerDescriptor(self))
+        if not getattr(model, '_default_manager', None) or self.creation_counter < model._default_manager.creation_counter:
+            model._default_manager = self
+
+    def _copy_to_model(self, model):
+        """
+        Makes a copy of the manager and assigns it to 'model', which should be
+        a child of the existing model (used when inheriting a manager from an
+        abstract base class).
+        """
+        assert issubclass(model, self.model)
+        mgr = copy.copy(self)
+        mgr.model = model
+        return mgr
+
+    #######################
+    # PROXIES TO QUERYSET #
+    #######################
+
+    def get_empty_query_set(self):
+        return EmptyQuerySet(self.model)
+
+    def get_query_set(self):
+        """Returns a new QuerySet object.  Subclasses can override this method
+        to easily customize the behavior of the Manager.
+        """
+        return QuerySet(self.model)
+
+    def none(self):
+        return self.get_empty_query_set()
+
+    def all(self):
+        return self.get_query_set()
+
+    def count(self):
+        return self.get_query_set().count()
+
+    def dates(self, *args, **kwargs):
+        return self.get_query_set().dates(*args, **kwargs)
+
+    def distinct(self, *args, **kwargs):
+        return self.get_query_set().distinct(*args, **kwargs)
+
+    def extra(self, *args, **kwargs):
+        return self.get_query_set().extra(*args, **kwargs)
+
+    def get(self, *args, **kwargs):
+        return self.get_query_set().get(*args, **kwargs)
+
+    def get_or_create(self, **kwargs):
+        return self.get_query_set().get_or_create(**kwargs)
+
+    def create(self, **kwargs):
+        return self.get_query_set().create(**kwargs)
+
+    def filter(self, *args, **kwargs):
+        return self.get_query_set().filter(*args, **kwargs)
+
+    def complex_filter(self, *args, **kwargs):
+        return self.get_query_set().complex_filter(*args, **kwargs)
+
+    def exclude(self, *args, **kwargs):
+        return self.get_query_set().exclude(*args, **kwargs)
+
+    def in_bulk(self, *args, **kwargs):
+        return self.get_query_set().in_bulk(*args, **kwargs)
+
+    def iterator(self, *args, **kwargs):
+        return self.get_query_set().iterator(*args, **kwargs)
+
+    def latest(self, *args, **kwargs):
+        return self.get_query_set().latest(*args, **kwargs)
+
+    def order_by(self, *args, **kwargs):
+        return self.get_query_set().order_by(*args, **kwargs)
+
+    def select_related(self, *args, **kwargs):
+        return self.get_query_set().select_related(*args, **kwargs)
+
+    def values(self, *args, **kwargs):
+        return self.get_query_set().values(*args, **kwargs)
+
+    def values_list(self, *args, **kwargs):
+        return self.get_query_set().values_list(*args, **kwargs)
+
+    def update(self, *args, **kwargs):
+        return self.get_query_set().update(*args, **kwargs)
+
+    def reverse(self, *args, **kwargs):
+        return self.get_query_set().reverse(*args, **kwargs)
+
+    def _insert(self, values, **kwargs):
+        return insert_query(self.model, values, **kwargs)
+
+    def _update(self, values, **kwargs):
+        return self.get_query_set()._update(values, **kwargs)
+
+class ManagerDescriptor(object):
+    # This class ensures managers aren't accessible via model instances.
+    # For example, Poll.objects works, but poll_obj.objects raises AttributeError.
+    def __init__(self, manager):
+        self.manager = manager
+
+    def __get__(self, instance, type=None):
+        if instance != None:
+            raise AttributeError, "Manager isn't accessible via %s instances" % type.__name__
+        return self.manager
+
+class EmptyManager(Manager):
+    def get_query_set(self):
+        return self.get_empty_query_set()
diff --git a/webapp/django/db/models/manipulators.py b/webapp/django/db/models/manipulators.py
new file mode 100644
index 0000000..c657d01
--- /dev/null
+++ b/webapp/django/db/models/manipulators.py
@@ -0,0 +1,333 @@
+from django.core.exceptions import ObjectDoesNotExist
+from django import oldforms
+from django.core import validators
+from django.db.models.fields import AutoField
+from django.db.models.fields.files import FileField
+from django.db.models import signals
+from django.utils.functional import curry
+from django.utils.datastructures import DotExpandedDict
+from django.utils.text import capfirst
+from django.utils.encoding import smart_str
+from django.utils.translation import ugettext as _
+from django.utils import datetime_safe
+
+def add_manipulators(sender, **kwargs):
+    cls = sender
+    cls.add_to_class('AddManipulator', AutomaticAddManipulator)
+    cls.add_to_class('ChangeManipulator', AutomaticChangeManipulator)
+
+signals.class_prepared.connect(add_manipulators)
+
+class ManipulatorDescriptor(object):
+    # This class provides the functionality that makes the default model
+    # manipulators (AddManipulator and ChangeManipulator) available via the
+    # model class.
+    def __init__(self, name, base):
+        self.man = None # Cache of the manipulator class.
+        self.name = name
+        self.base = base
+
+    def __get__(self, instance, model=None):
+        if instance != None:
+            raise AttributeError, "Manipulator cannot be accessed via instance"
+        else:
+            if not self.man:
+                # Create a class that inherits from the "Manipulator" class
+                # given in the model class (if specified) and the automatic
+                # manipulator.
+                bases = [self.base]
+                if hasattr(model, 'Manipulator'):
+                    bases = [model.Manipulator] + bases
+                self.man = type(self.name, tuple(bases), {})
+                self.man._prepare(model)
+            return self.man
+
+class AutomaticManipulator(oldforms.Manipulator):
+    def _prepare(cls, model):
+        cls.model = model
+        cls.manager = model._default_manager
+        cls.opts = model._meta
+        for field_name_list in cls.opts.unique_together:
+            setattr(cls, 'isUnique%s' % '_'.join(field_name_list), curry(manipulator_validator_unique_together, field_name_list, cls.opts))
+        for f in cls.opts.fields:
+            if f.unique_for_date:
+                setattr(cls, 'isUnique%sFor%s' % (f.name, f.unique_for_date), curry(manipulator_validator_unique_for_date, f, cls.opts.get_field(f.unique_for_date), cls.opts, 'date'))
+            if f.unique_for_month:
+                setattr(cls, 'isUnique%sFor%s' % (f.name, f.unique_for_month), curry(manipulator_validator_unique_for_date, f, cls.opts.get_field(f.unique_for_month), cls.opts, 'month'))
+            if f.unique_for_year:
+                setattr(cls, 'isUnique%sFor%s' % (f.name, f.unique_for_year), curry(manipulator_validator_unique_for_date, f, cls.opts.get_field(f.unique_for_year), cls.opts, 'year'))
+    _prepare = classmethod(_prepare)
+
+    def contribute_to_class(cls, other_cls, name):
+        setattr(other_cls, name, ManipulatorDescriptor(name, cls))
+    contribute_to_class = classmethod(contribute_to_class)
+
+    def __init__(self, follow=None):
+        self.follow = self.opts.get_follow(follow)
+        self.fields = []
+
+        for f in self.opts.fields + self.opts.many_to_many:
+            if self.follow.get(f.name, False):
+                self.fields.extend(f.get_manipulator_fields(self.opts, self, self.change))
+
+        # Add fields for related objects.
+        for f in self.opts.get_all_related_objects():
+            if self.follow.get(f.name, False):
+                fol = self.follow[f.name]
+                self.fields.extend(f.get_manipulator_fields(self.opts, self, self.change, fol))
+
+        # Add field for ordering.
+        if self.change and self.opts.get_ordered_objects():
+            self.fields.append(oldforms.CommaSeparatedIntegerField(field_name="order_"))
+
+    def save(self, new_data):
+        # TODO: big cleanup when core fields go -> use recursive manipulators.
+        params = {}
+        for f in self.opts.fields:
+            # Fields with auto_now_add should keep their original value in the change stage.
+            auto_now_add = self.change and getattr(f, 'auto_now_add', False)
+            if self.follow.get(f.name, None) and not auto_now_add:
+                param = f.get_manipulator_new_data(new_data)
+            else:
+                if self.change:
+                    param = getattr(self.original_object, f.attname)
+                else:
+                    param = f.get_default()
+            params[f.attname] = param
+
+        if self.change:
+            params[self.opts.pk.attname] = self.obj_key
+
+        # First, create the basic object itself.
+        new_object = self.model(**params)
+
+        # Now that the object's been created, save any uploaded files.
+        for f in self.opts.fields:
+            if isinstance(f, FileField):
+                f.save_file(new_data, new_object, self.change and self.original_object or None, self.change, rel=False, save=False)
+
+        # Now save the object
+        new_object.save()
+
+        # Calculate which primary fields have changed.
+        if self.change:
+            self.fields_added, self.fields_changed, self.fields_deleted = [], [], []
+            for f in self.opts.fields:
+                if not f.primary_key and smart_str(getattr(self.original_object, f.attname)) != smart_str(getattr(new_object, f.attname)):
+                    self.fields_changed.append(f.verbose_name)
+
+        # Save many-to-many objects. Example: Set sites for a poll.
+        for f in self.opts.many_to_many:
+            if self.follow.get(f.name, None):
+                if not f.rel.edit_inline:
+                    new_vals = new_data.getlist(f.name)
+                    # First, clear the existing values.
+                    rel_manager = getattr(new_object, f.name)
+                    rel_manager.clear()
+                    # Then, set the new values.
+                    for n in new_vals:
+                        rel_manager.add(f.rel.to._default_manager.get(pk=n))
+                    # TODO: Add to 'fields_changed'
+
+        expanded_data = DotExpandedDict(dict(new_data))
+        # Save many-to-one objects. Example: Add the Choice objects for a Poll.
+        for related in self.opts.get_all_related_objects():
+            # Create obj_list, which is a DotExpandedDict such as this:
+            # [('0', {'id': ['940'], 'choice': ['This is the first choice']}),
+            #  ('1', {'id': ['941'], 'choice': ['This is the second choice']}),
+            #  ('2', {'id': [''], 'choice': ['']})]
+            child_follow = self.follow.get(related.name, None)
+
+            if child_follow:
+                obj_list = expanded_data.get(related.var_name, {}).items()
+                if not obj_list:
+                    continue
+
+                obj_list.sort(lambda x, y: cmp(int(x[0]), int(y[0])))
+
+                # For each related item...
+                for _, rel_new_data in obj_list:
+
+                    params = {}
+
+                    # Keep track of which core=True fields were provided.
+                    # If all core fields were given, the related object will be saved.
+                    # If none of the core fields were given, the object will be deleted.
+                    # If some, but not all, of the fields were given, the validator would
+                    # have caught that.
+                    all_cores_given, all_cores_blank = True, True
+
+                    # Get a reference to the old object. We'll use it to compare the
+                    # old to the new, to see which fields have changed.
+                    old_rel_obj = None
+                    if self.change:
+                        if rel_new_data[related.opts.pk.name][0]:
+                            try:
+                                old_rel_obj = getattr(self.original_object, related.get_accessor_name()).get(**{'%s__exact' % related.opts.pk.name: rel_new_data[related.opts.pk.attname][0]})
+                            except ObjectDoesNotExist:
+                                pass
+
+                    for f in related.opts.fields:
+                        if f.core and not isinstance(f, FileField) and f.get_manipulator_new_data(rel_new_data, rel=True) in (None, ''):
+                            all_cores_given = False
+                        elif f.core and not isinstance(f, FileField) and f.get_manipulator_new_data(rel_new_data, rel=True) not in (None, ''):
+                            all_cores_blank = False
+                        # If this field isn't editable, give it the same value it had
+                        # previously, according to the given ID. If the ID wasn't
+                        # given, use a default value. FileFields are also a special
+                        # case, because they'll be dealt with later.
+
+                        if f == related.field:
+                            param = getattr(new_object, related.field.rel.get_related_field().attname)
+                        elif (not self.change) and isinstance(f, AutoField):
+                            param = None
+                        elif self.change and (isinstance(f, FileField) or not child_follow.get(f.name, None)):
+                            if old_rel_obj:
+                                param = getattr(old_rel_obj, f.column)
+                            else:
+                                param = f.get_default()
+                        else:
+                            param = f.get_manipulator_new_data(rel_new_data, rel=True)
+                        if param != None:
+                            params[f.attname] = param
+
+                    # Create the related item.
+                    new_rel_obj = related.model(**params)
+
+                    # If all the core fields were provided (non-empty), save the item.
+                    if all_cores_given:
+                        new_rel_obj.save()
+
+                        # Save any uploaded files.
+                        for f in related.opts.fields:
+                            if child_follow.get(f.name, None):
+                                if isinstance(f, FileField) and rel_new_data.get(f.name, False):
+                                    f.save_file(rel_new_data, new_rel_obj, self.change and old_rel_obj or None, old_rel_obj is not None, rel=True)
+
+                        # Calculate whether any fields have changed.
+                        if self.change:
+                            if not old_rel_obj: # This object didn't exist before.
+                                self.fields_added.append('%s "%s"' % (related.opts.verbose_name, new_rel_obj))
+                            else:
+                                for f in related.opts.fields:
+                                    if not f.primary_key and f != related.field and smart_str(getattr(old_rel_obj, f.attname)) != smart_str(getattr(new_rel_obj, f.attname)):
+                                        self.fields_changed.append('%s for %s "%s"' % (f.verbose_name, related.opts.verbose_name, new_rel_obj))
+
+                        # Save many-to-many objects.
+                        for f in related.opts.many_to_many:
+                            if child_follow.get(f.name, None) and not f.rel.edit_inline:
+                                new_value = rel_new_data[f.attname]
+                                setattr(new_rel_obj, f.name, f.rel.to.objects.filter(pk__in=new_value))
+                                if self.change:
+                                    self.fields_changed.append('%s for %s "%s"' % (f.verbose_name, related.opts.verbose_name, new_rel_obj))
+
+                    # If, in the change stage, all of the core fields were blank and
+                    # the primary key (ID) was provided, delete the item.
+                    if self.change and all_cores_blank and old_rel_obj:
+                        new_rel_obj.delete()
+                        self.fields_deleted.append('%s "%s"' % (related.opts.verbose_name, old_rel_obj))
+
+        # Save the order, if applicable.
+        if self.change and self.opts.get_ordered_objects():
+            order = new_data['order_'] and map(int, new_data['order_'].split(',')) or []
+            for rel_opts in self.opts.get_ordered_objects():
+                getattr(new_object, 'set_%s_order' % rel_opts.object_name.lower())(order)
+        return new_object
+
+    def get_related_objects(self):
+        return self.opts.get_followed_related_objects(self.follow)
+
+    def flatten_data(self):
+        new_data = {}
+        obj = self.change and self.original_object or None
+        for f in self.opts.get_data_holders(self.follow):
+            fol = self.follow.get(f.name)
+            new_data.update(f.flatten_data(fol, obj))
+        return new_data
+
+class AutomaticAddManipulator(AutomaticManipulator):
+    change = False
+
+class AutomaticChangeManipulator(AutomaticManipulator):
+    change = True
+    def __init__(self, obj_key, follow=None):
+        self.obj_key = obj_key
+        try:
+            self.original_object = self.manager.get(pk=obj_key)
+        except ObjectDoesNotExist:
+            # If the object doesn't exist, this might be a manipulator for a
+            # one-to-one related object that hasn't created its subobject yet.
+            # For example, this might be a Restaurant for a Place that doesn't
+            # yet have restaurant information.
+            if self.opts.one_to_one_field:
+                # Sanity check -- Make sure the "parent" object exists.
+                # For example, make sure the Place exists for the Restaurant.
+                # Let the ObjectDoesNotExist exception propagate up.
+                limit_choices_to = self.opts.one_to_one_field.rel.limit_choices_to
+                lookup_kwargs = {'%s__exact' % self.opts.one_to_one_field.rel.field_name: obj_key}
+                self.opts.one_to_one_field.rel.to.get_model_module().complex_filter(limit_choices_to).get(**lookup_kwargs)
+                params = dict([(f.attname, f.get_default()) for f in self.opts.fields])
+                params[self.opts.pk.attname] = obj_key
+                self.original_object = self.opts.get_model_module().Klass(**params)
+            else:
+                raise
+        super(AutomaticChangeManipulator, self).__init__(follow=follow)
+
+def manipulator_validator_unique_together(field_name_list, opts, self, field_data, all_data):
+    from django.db.models.fields.related import ManyToOneRel
+    from django.utils.text import get_text_list
+    field_list = [opts.get_field(field_name) for field_name in field_name_list]
+    if isinstance(field_list[0].rel, ManyToOneRel):
+        kwargs = {'%s__%s__iexact' % (field_name_list[0], field_list[0].rel.field_name): field_data}
+    else:
+        kwargs = {'%s__iexact' % field_name_list[0]: field_data}
+    for f in field_list[1:]:
+        # This is really not going to work for fields that have different
+        # form fields, e.g. DateTime.
+        # This validation needs to occur after html2python to be effective.
+        field_val = all_data.get(f.name, None)
+        if field_val is None:
+            # This will be caught by another validator, assuming the field
+            # doesn't have blank=True.
+            return
+        if isinstance(f.rel, ManyToOneRel):
+            kwargs['%s__pk' % f.name] = field_val
+        else:
+            kwargs['%s__iexact' % f.name] = field_val
+    try:
+        old_obj = self.manager.get(**kwargs)
+    except ObjectDoesNotExist:
+        return
+    if hasattr(self, 'original_object') and self.original_object._get_pk_val() == old_obj._get_pk_val():
+        pass
+    else:
+        raise validators.ValidationError, _("%(object)s with this %(type)s already exists for the given %(field)s.") % \
+            {'object': capfirst(opts.verbose_name), 'type': field_list[0].verbose_name, 'field': get_text_list([f.verbose_name for f in field_list[1:]], _('and'))}
+
+def manipulator_validator_unique_for_date(from_field, date_field, opts, lookup_type, self, field_data, all_data):
+    from django.db.models.fields.related import ManyToOneRel
+    date_str = all_data.get(date_field.get_manipulator_field_names('')[0], None)
+    date_val = oldforms.DateField.html2python(date_str)
+    if date_val is None:
+        return # Date was invalid. This will be caught by another validator.
+    lookup_kwargs = {'%s__year' % date_field.name: date_val.year}
+    if isinstance(from_field.rel, ManyToOneRel):
+        lookup_kwargs['%s__pk' % from_field.name] = field_data
+    else:
+        lookup_kwargs['%s__iexact' % from_field.name] = field_data
+    if lookup_type in ('month', 'date'):
+        lookup_kwargs['%s__month' % date_field.name] = date_val.month
+    if lookup_type == 'date':
+        lookup_kwargs['%s__day' % date_field.name] = date_val.day
+    try:
+        old_obj = self.manager.get(**lookup_kwargs)
+    except ObjectDoesNotExist:
+        return
+    else:
+        if hasattr(self, 'original_object') and self.original_object._get_pk_val() == old_obj._get_pk_val():
+            pass
+        else:
+            format_string = (lookup_type == 'date') and '%B %d, %Y' or '%B %Y'
+            date_val = datetime_safe.new_datetime(date_val)
+            raise validators.ValidationError, "Please enter a different %s. The one you entered is already being used for %s." % \
+                (from_field.verbose_name, date_val.strftime(format_string))
diff --git a/webapp/django/db/models/options.py b/webapp/django/db/models/options.py
new file mode 100644
index 0000000..ffea6d5
--- /dev/null
+++ b/webapp/django/db/models/options.py
@@ -0,0 +1,486 @@
+import re
+from bisect import bisect
+try:
+    set
+except NameError:
+    from sets import Set as set     # Python 2.3 fallback
+
+from django.conf import settings
+from django.db.models.related import RelatedObject
+from django.db.models.fields.related import ManyToManyRel
+from django.db.models.fields import AutoField, FieldDoesNotExist
+from django.db.models.fields.proxy import OrderWrt
+from django.db.models.loading import get_models, app_cache_ready
+from django.utils.translation import activate, deactivate_all, get_language, string_concat
+from django.utils.encoding import force_unicode, smart_str
+from django.utils.datastructures import SortedDict
+
+# Calculate the verbose_name by converting from InitialCaps to "lowercase with spaces".
+get_verbose_name = lambda class_name: re.sub('(((?<=[a-z])[A-Z])|([A-Z](?![A-Z]|$)))', ' \\1', class_name).lower().strip()
+
+DEFAULT_NAMES = ('verbose_name', 'db_table', 'ordering',
+                 'unique_together', 'permissions', 'get_latest_by',
+                 'order_with_respect_to', 'app_label', 'db_tablespace',
+                 'abstract')
+
+class Options(object):
+    def __init__(self, meta, app_label=None):
+        self.local_fields, self.local_many_to_many = [], []
+        self.module_name, self.verbose_name = None, None
+        self.verbose_name_plural = None
+        self.db_table = ''
+        self.ordering = []
+        self.unique_together =  []
+        self.permissions =  []
+        self.object_name, self.app_label = None, app_label
+        self.get_latest_by = None
+        self.order_with_respect_to = None
+        self.db_tablespace = settings.DEFAULT_TABLESPACE
+        self.admin = None
+        self.meta = meta
+        self.pk = None
+        self.has_auto_field, self.auto_field = False, None
+        self.one_to_one_field = None
+        self.abstract = False
+        self.parents = SortedDict()
+        self.duplicate_targets = {}
+
+    def contribute_to_class(self, cls, name):
+        from django.db import connection
+        from django.db.backends.util import truncate_name
+
+        cls._meta = self
+        self.installed = re.sub('\.models$', '', cls.__module__) in settings.INSTALLED_APPS
+        # First, construct the default values for these options.
+        self.object_name = cls.__name__
+        self.module_name = self.object_name.lower()
+        self.verbose_name = get_verbose_name(self.object_name)
+
+        # Next, apply any overridden values from 'class Meta'.
+        if self.meta:
+            meta_attrs = self.meta.__dict__.copy()
+            for name in self.meta.__dict__:
+                # Ignore any private attributes that Django doesn't care about.
+                # NOTE: We can't modify a dictionary's contents while looping
+                # over it, so we loop over the *original* dictionary instead.
+                if name.startswith('_'):
+                    del meta_attrs[name]
+            for attr_name in DEFAULT_NAMES:
+                if attr_name in meta_attrs:
+                    setattr(self, attr_name, meta_attrs.pop(attr_name))
+                elif hasattr(self.meta, attr_name):
+                    setattr(self, attr_name, getattr(self.meta, attr_name))
+
+            # unique_together can be either a tuple of tuples, or a single
+            # tuple of two strings. Normalize it to a tuple of tuples, so that
+            # calling code can uniformly expect that.
+            ut = meta_attrs.pop('unique_together', getattr(self, 'unique_together'))
+            if ut and not isinstance(ut[0], (tuple, list)):
+                ut = (ut,)
+            setattr(self, 'unique_together', ut)
+
+            # verbose_name_plural is a special case because it uses a 's'
+            # by default.
+            setattr(self, 'verbose_name_plural', meta_attrs.pop('verbose_name_plural', string_concat(self.verbose_name, 's')))
+
+            # Any leftover attributes must be invalid.
+            if meta_attrs != {}:
+                raise TypeError, "'class Meta' got invalid attribute(s): %s" % ','.join(meta_attrs.keys())
+        else:
+            self.verbose_name_plural = string_concat(self.verbose_name, 's')
+        del self.meta
+
+        # If the db_table wasn't provided, use the app_label + module_name.
+        if not self.db_table:
+            self.db_table = "%s_%s" % (self.app_label, self.module_name)
+            self.db_table = truncate_name(self.db_table, connection.ops.max_name_length())
+
+
+    def _prepare(self, model):
+        if self.order_with_respect_to:
+            self.order_with_respect_to = self.get_field(self.order_with_respect_to)
+            self.ordering = ('_order',)
+        else:
+            self.order_with_respect_to = None
+
+        if self.pk is None:
+            if self.parents:
+                # Promote the first parent link in lieu of adding yet another
+                # field.
+                field = self.parents.value_for_index(0)
+                field.primary_key = True
+                self.setup_pk(field)
+            else:
+                auto = AutoField(verbose_name='ID', primary_key=True,
+                        auto_created=True)
+                model.add_to_class('id', auto)
+
+        # Determine any sets of fields that are pointing to the same targets
+        # (e.g. two ForeignKeys to the same remote model). The query
+        # construction code needs to know this. At the end of this,
+        # self.duplicate_targets will map each duplicate field column to the
+        # columns it duplicates.
+        collections = {}
+        for column, target in self.duplicate_targets.iteritems():
+            try:
+                collections[target].add(column)
+            except KeyError:
+                collections[target] = set([column])
+        self.duplicate_targets = {}
+        for elt in collections.itervalues():
+            if len(elt) == 1:
+                continue
+            for column in elt:
+                self.duplicate_targets[column] = elt.difference(set([column]))
+
+    def add_field(self, field):
+        # Insert the given field in the order in which it was created, using
+        # the "creation_counter" attribute of the field.
+        # Move many-to-many related fields from self.fields into
+        # self.many_to_many.
+        if field.rel and isinstance(field.rel, ManyToManyRel):
+            self.local_many_to_many.insert(bisect(self.local_many_to_many, field), field)
+            if hasattr(self, '_m2m_cache'):
+                del self._m2m_cache
+        else:
+            self.local_fields.insert(bisect(self.local_fields, field), field)
+            self.setup_pk(field)
+            if hasattr(self, '_field_cache'):
+                del self._field_cache
+                del self._field_name_cache
+
+        if hasattr(self, '_name_map'):
+            del self._name_map
+
+    def setup_pk(self, field):
+        if not self.pk and field.primary_key:
+            self.pk = field
+            field.serialize = False
+
+    def __repr__(self):
+        return '<Options for %s>' % self.object_name
+
+    def __str__(self):
+        return "%s.%s" % (smart_str(self.app_label), smart_str(self.module_name))
+
+    def verbose_name_raw(self):
+        """
+        There are a few places where the untranslated verbose name is needed
+        (so that we get the same value regardless of currently active
+        locale).
+        """
+        lang = get_language()
+        deactivate_all()
+        raw = force_unicode(self.verbose_name)
+        activate(lang)
+        return raw
+    verbose_name_raw = property(verbose_name_raw)
+
+    def _fields(self):
+        """
+        The getter for self.fields. This returns the list of field objects
+        available to this model (including through parent models).
+
+        Callers are not permitted to modify this list, since it's a reference
+        to this instance (not a copy).
+        """
+        try:
+            self._field_name_cache
+        except AttributeError:
+            self._fill_fields_cache()
+        return self._field_name_cache
+    fields = property(_fields)
+
+    def get_fields_with_model(self):
+        """
+        Returns a sequence of (field, model) pairs for all fields. The "model"
+        element is None for fields on the current model. Mostly of use when
+        constructing queries so that we know which model a field belongs to.
+        """
+        try:
+            self._field_cache
+        except AttributeError:
+            self._fill_fields_cache()
+        return self._field_cache
+
+    def _fill_fields_cache(self):
+        cache = []
+        for parent in self.parents:
+            for field, model in parent._meta.get_fields_with_model():
+                if model:
+                    cache.append((field, model))
+                else:
+                    cache.append((field, parent))
+        cache.extend([(f, None) for f in self.local_fields])
+        self._field_cache = tuple(cache)
+        self._field_name_cache = [x for x, _ in cache]
+
+    def _many_to_many(self):
+        try:
+            self._m2m_cache
+        except AttributeError:
+            self._fill_m2m_cache()
+        return self._m2m_cache.keys()
+    many_to_many = property(_many_to_many)
+
+    def get_m2m_with_model(self):
+        """
+        The many-to-many version of get_fields_with_model().
+        """
+        try:
+            self._m2m_cache
+        except AttributeError:
+            self._fill_m2m_cache()
+        return self._m2m_cache.items()
+
+    def _fill_m2m_cache(self):
+        cache = SortedDict()
+        for parent in self.parents:
+            for field, model in parent._meta.get_m2m_with_model():
+                if model:
+                    cache[field] = model
+                else:
+                    cache[field] = parent
+        for field in self.local_many_to_many:
+            cache[field] = None
+        self._m2m_cache = cache
+
+    def get_field(self, name, many_to_many=True):
+        """
+        Returns the requested field by name. Raises FieldDoesNotExist on error.
+        """
+        to_search = many_to_many and (self.fields + self.many_to_many) or self.fields
+        for f in to_search:
+            if f.name == name:
+                return f
+        raise FieldDoesNotExist, '%s has no field named %r' % (self.object_name, name)
+
+    def get_field_by_name(self, name):
+        """
+        Returns the (field_object, model, direct, m2m), where field_object is
+        the Field instance for the given name, model is the model containing
+        this field (None for local fields), direct is True if the field exists
+        on this model, and m2m is True for many-to-many relations. When
+        'direct' is False, 'field_object' is the corresponding RelatedObject
+        for this field (since the field doesn't have an instance associated
+        with it).
+
+        Uses a cache internally, so after the first access, this is very fast.
+        """
+        try:
+            try:
+                return self._name_map[name]
+            except AttributeError:
+                cache = self.init_name_map()
+                return cache[name]
+        except KeyError:
+            raise FieldDoesNotExist('%s has no field named %r'
+                    % (self.object_name, name))
+
+    def get_all_field_names(self):
+        """
+        Returns a list of all field names that are possible for this model
+        (including reverse relation names).
+        """
+        try:
+            cache = self._name_map
+        except AttributeError:
+            cache = self.init_name_map()
+        names = cache.keys()
+        names.sort()
+        return names
+
+    def init_name_map(self):
+        """
+        Initialises the field name -> field object mapping.
+        """
+        cache = {}
+        # We intentionally handle related m2m objects first so that symmetrical
+        # m2m accessor names can be overridden, if necessary.
+        for f, model in self.get_all_related_m2m_objects_with_model():
+            cache[f.field.related_query_name()] = (f, model, False, True)
+        for f, model in self.get_all_related_objects_with_model():
+            cache[f.field.related_query_name()] = (f, model, False, False)
+        for f, model in self.get_m2m_with_model():
+            cache[f.name] = (f, model, True, True)
+        for f, model in self.get_fields_with_model():
+            cache[f.name] = (f, model, True, False)
+        if self.order_with_respect_to:
+            cache['_order'] = OrderWrt(), None, True, False
+        if app_cache_ready():
+            self._name_map = cache
+        return cache
+
+    def get_add_permission(self):
+        return 'add_%s' % self.object_name.lower()
+
+    def get_change_permission(self):
+        return 'change_%s' % self.object_name.lower()
+
+    def get_delete_permission(self):
+        return 'delete_%s' % self.object_name.lower()
+
+    def get_all_related_objects(self, local_only=False):
+        try:
+            self._related_objects_cache
+        except AttributeError:
+            self._fill_related_objects_cache()
+        if local_only:
+            return [k for k, v in self._related_objects_cache.items() if not v]
+        return self._related_objects_cache.keys()
+
+    def get_all_related_objects_with_model(self):
+        """
+        Returns a list of (related-object, model) pairs. Similar to
+        get_fields_with_model().
+        """
+        try:
+            self._related_objects_cache
+        except AttributeError:
+            self._fill_related_objects_cache()
+        return self._related_objects_cache.items()
+
+    def _fill_related_objects_cache(self):
+        cache = SortedDict()
+        parent_list = self.get_parent_list()
+        for parent in self.parents:
+            for obj, model in parent._meta.get_all_related_objects_with_model():
+                if (obj.field.creation_counter < 0 or obj.field.rel.parent_link) and obj.model not in parent_list:
+                    continue
+                if not model:
+                    cache[obj] = parent
+                else:
+                    cache[obj] = model
+        for klass in get_models():
+            for f in klass._meta.local_fields:
+                if f.rel and not isinstance(f.rel.to, str) and self == f.rel.to._meta:
+                    cache[RelatedObject(f.rel.to, klass, f)] = None
+        self._related_objects_cache = cache
+
+    def get_all_related_many_to_many_objects(self, local_only=False):
+        try:
+            cache = self._related_many_to_many_cache
+        except AttributeError:
+            cache = self._fill_related_many_to_many_cache()
+        if local_only:
+            return [k for k, v in cache.items() if not v]
+        return cache.keys()
+
+    def get_all_related_m2m_objects_with_model(self):
+        """
+        Returns a list of (related-m2m-object, model) pairs. Similar to
+        get_fields_with_model().
+        """
+        try:
+            cache = self._related_many_to_many_cache
+        except AttributeError:
+            cache = self._fill_related_many_to_many_cache()
+        return cache.items()
+
+    def _fill_related_many_to_many_cache(self):
+        cache = SortedDict()
+        parent_list = self.get_parent_list()
+        for parent in self.parents:
+            for obj, model in parent._meta.get_all_related_m2m_objects_with_model():
+                if obj.field.creation_counter < 0 and obj.model not in parent_list:
+                    continue
+                if not model:
+                    cache[obj] = parent
+                else:
+                    cache[obj] = model
+        for klass in get_models():
+            for f in klass._meta.local_many_to_many:
+                if f.rel and not isinstance(f.rel.to, str) and self == f.rel.to._meta:
+                    cache[RelatedObject(f.rel.to, klass, f)] = None
+        if app_cache_ready():
+            self._related_many_to_many_cache = cache
+        return cache
+
+    def get_followed_related_objects(self, follow=None):
+        if follow == None:
+            follow = self.get_follow()
+        return [f for f in self.get_all_related_objects() if follow.get(f.name, None)]
+
+    def get_data_holders(self, follow=None):
+        if follow == None:
+            follow = self.get_follow()
+        return [f for f in self.fields + self.many_to_many + self.get_all_related_objects() if follow.get(f.name, None)]
+
+    def get_follow(self, override=None):
+        follow = {}
+        for f in self.fields + self.many_to_many + self.get_all_related_objects():
+            if override and f.name in override:
+                child_override = override[f.name]
+            else:
+                child_override = None
+            fol = f.get_follow(child_override)
+            if fol != None:
+                follow[f.name] = fol
+        return follow
+
+    def get_base_chain(self, model):
+        """
+        Returns a list of parent classes leading to 'model' (order from closet
+        to most distant ancestor). This has to handle the case were 'model' is
+        a granparent or even more distant relation.
+        """
+        if not self.parents:
+            return
+        if model in self.parents:
+            return [model]
+        for parent in self.parents:
+            res = parent._meta.get_base_chain(model)
+            if res:
+                res.insert(0, parent)
+                return res
+        raise TypeError('%r is not an ancestor of this model'
+                % model._meta.module_name)
+
+    def get_parent_list(self):
+        """
+        Returns a list of all the ancestor of this model as a list. Useful for
+        determining if something is an ancestor, regardless of lineage.
+        """
+        result = set()
+        for parent in self.parents:
+            result.add(parent)
+            result.update(parent._meta.get_parent_list())
+        return result
+
+    def get_ordered_objects(self):
+        "Returns a list of Options objects that are ordered with respect to this object."
+        if not hasattr(self, '_ordered_objects'):
+            objects = []
+            # TODO
+            #for klass in get_models(get_app(self.app_label)):
+            #    opts = klass._meta
+            #    if opts.order_with_respect_to and opts.order_with_respect_to.rel \
+            #        and self == opts.order_with_respect_to.rel.to._meta:
+            #        objects.append(opts)
+            self._ordered_objects = objects
+        return self._ordered_objects
+
+    def has_field_type(self, field_type, follow=None):
+        """
+        Returns True if this object's admin form has at least one of the given
+        field_type (e.g. FileField).
+        """
+        # TODO: follow
+        if not hasattr(self, '_field_types'):
+            self._field_types = {}
+        if field_type not in self._field_types:
+            try:
+                # First check self.fields.
+                for f in self.fields:
+                    if isinstance(f, field_type):
+                        raise StopIteration
+                # Failing that, check related fields.
+                for related in self.get_followed_related_objects(follow):
+                    for f in related.opts.fields:
+                        if isinstance(f, field_type):
+                            raise StopIteration
+            except StopIteration:
+                self._field_types[field_type] = True
+            else:
+                self._field_types[field_type] = False
+        return self._field_types[field_type]
diff --git a/webapp/django/db/models/query.py b/webapp/django/db/models/query.py
new file mode 100644
index 0000000..2ff1c26
--- /dev/null
+++ b/webapp/django/db/models/query.py
@@ -0,0 +1,884 @@
+try:
+    set
+except NameError:
+    from sets import Set as set     # Python 2.3 fallback
+
+from django.db import connection, transaction, IntegrityError
+from django.db.models.fields import DateField
+from django.db.models.query_utils import Q, select_related_descend
+from django.db.models import signals, sql
+from django.utils.datastructures import SortedDict
+
+
+# Used to control how many objects are worked with at once in some cases (e.g.
+# when deleting objects).
+CHUNK_SIZE = 100
+ITER_CHUNK_SIZE = CHUNK_SIZE
+
+# Pull into this namespace for backwards compatibility.
+EmptyResultSet = sql.EmptyResultSet
+
+
+class CyclicDependency(Exception):
+    """
+    An error when dealing with a collection of objects that have a cyclic
+    dependency, i.e. when deleting multiple objects.
+    """
+    pass
+
+
+class CollectedObjects(object):
+    """
+    A container that stores keys and lists of values along with remembering the
+    parent objects for all the keys.
+
+    This is used for the database object deletion routines so that we can
+    calculate the 'leaf' objects which should be deleted first.
+    """
+
+    def __init__(self):
+        self.data = {}
+        self.children = {}
+
+    def add(self, model, pk, obj, parent_model, nullable=False):
+        """
+        Adds an item to the container.
+
+        Arguments:
+        * model - the class of the object being added.
+        * pk - the primary key.
+        * obj - the object itself.
+        * parent_model - the model of the parent object that this object was
+          reached through.
+        * nullable - should be True if this relation is nullable.
+
+        Returns True if the item already existed in the structure and
+        False otherwise.
+        """
+        d = self.data.setdefault(model, SortedDict())
+        retval = pk in d
+        d[pk] = obj
+        # Nullable relationships can be ignored -- they are nulled out before
+        # deleting, and therefore do not affect the order in which objects
+        # have to be deleted.
+        if parent_model is not None and not nullable:
+            self.children.setdefault(parent_model, []).append(model)
+        return retval
+
+    def __contains__(self, key):
+        return self.data.__contains__(key)
+
+    def __getitem__(self, key):
+        return self.data[key]
+
+    def __nonzero__(self):
+        return bool(self.data)
+
+    def iteritems(self):
+        for k in self.ordered_keys():
+            yield k, self[k]
+
+    def items(self):
+        return list(self.iteritems())
+
+    def keys(self):
+        return self.ordered_keys()
+
+    def ordered_keys(self):
+        """
+        Returns the models in the order that they should be dealt with (i.e.
+        models with no dependencies first).
+        """
+        dealt_with = SortedDict()
+        # Start with items that have no children
+        models = self.data.keys()
+        while len(dealt_with) < len(models):
+            found = False
+            for model in models:
+                children = self.children.setdefault(model, [])
+                if len([c for c in children if c not in dealt_with]) == 0:
+                    dealt_with[model] = None
+                    found = True
+            if not found:
+                raise CyclicDependency(
+                    "There is a cyclic dependency of items to be processed.")
+
+        return dealt_with.keys()
+
+    def unordered_keys(self):
+        """
+        Fallback for the case where is a cyclic dependency but we don't  care.
+        """
+        return self.data.keys()
+
+
+class QuerySet(object):
+    """
+    Represents a lazy database lookup for a set of objects.
+    """
+    def __init__(self, model=None, query=None):
+        self.model = model
+        self.query = query or sql.Query(self.model, connection)
+        self._result_cache = None
+        self._iter = None
+        self._sticky_filter = False
+
+    ########################
+    # PYTHON MAGIC METHODS #
+    ########################
+
+    def __getstate__(self):
+        """
+        Allows the QuerySet to be pickled.
+        """
+        # Force the cache to be fully populated.
+        len(self)
+
+        obj_dict = self.__dict__.copy()
+        obj_dict['_iter'] = None
+        return obj_dict
+
+    def __repr__(self):
+        return repr(list(self))
+
+    def __len__(self):
+        # Since __len__ is called quite frequently (for example, as part of
+        # list(qs), we make some effort here to be as efficient as possible
+        # whilst not messing up any existing iterators against the QuerySet.
+        if self._result_cache is None:
+            if self._iter:
+                self._result_cache = list(self._iter)
+            else:
+                self._result_cache = list(self.iterator())
+        elif self._iter:
+            self._result_cache.extend(list(self._iter))
+        return len(self._result_cache)
+
+    def __iter__(self):
+        if self._result_cache is None:
+            self._iter = self.iterator()
+            self._result_cache = []
+        if self._iter:
+            return self._result_iter()
+        # Python's list iterator is better than our version when we're just
+        # iterating over the cache.
+        return iter(self._result_cache)
+
+    def _result_iter(self):
+        pos = 0
+        while 1:
+            upper = len(self._result_cache)
+            while pos < upper:
+                yield self._result_cache[pos]
+                pos = pos + 1
+            if not self._iter:
+                raise StopIteration
+            if len(self._result_cache) <= pos:
+                self._fill_cache()
+
+    def __nonzero__(self):
+        if self._result_cache is not None:
+            return bool(self._result_cache)
+        try:
+            iter(self).next()
+        except StopIteration:
+            return False
+        return True
+
+    def __getitem__(self, k):
+        """
+        Retrieves an item or slice from the set of results.
+        """
+        if not isinstance(k, (slice, int, long)):
+            raise TypeError
+        assert ((not isinstance(k, slice) and (k >= 0))
+                or (isinstance(k, slice) and (k.start is None or k.start >= 0)
+                    and (k.stop is None or k.stop >= 0))), \
+                "Negative indexing is not supported."
+
+        if self._result_cache is not None:
+            if self._iter is not None:
+                # The result cache has only been partially populated, so we may
+                # need to fill it out a bit more.
+                if isinstance(k, slice):
+                    if k.stop is not None:
+                        # Some people insist on passing in strings here.
+                        bound = int(k.stop)
+                    else:
+                        bound = None
+                else:
+                    bound = k + 1
+                if len(self._result_cache) < bound:
+                    self._fill_cache(bound - len(self._result_cache))
+            return self._result_cache[k]
+
+        if isinstance(k, slice):
+            qs = self._clone()
+            if k.start is not None:
+                start = int(k.start)
+            else:
+                start = None
+            if k.stop is not None:
+                stop = int(k.stop)
+            else:
+                stop = None
+            qs.query.set_limits(start, stop)
+            return k.step and list(qs)[::k.step] or qs
+        try:
+            qs = self._clone()
+            qs.query.set_limits(k, k + 1)
+            return list(qs)[0]
+        except self.model.DoesNotExist, e:
+            raise IndexError, e.args
+
+    def __and__(self, other):
+        self._merge_sanity_check(other)
+        if isinstance(other, EmptyQuerySet):
+            return other._clone()
+        combined = self._clone()
+        combined.query.combine(other.query, sql.AND)
+        return combined
+
+    def __or__(self, other):
+        self._merge_sanity_check(other)
+        combined = self._clone()
+        if isinstance(other, EmptyQuerySet):
+            return combined
+        combined.query.combine(other.query, sql.OR)
+        return combined
+
+    ####################################
+    # METHODS THAT DO DATABASE QUERIES #
+    ####################################
+
+    def iterator(self):
+        """
+        An iterator over the results from applying this QuerySet to the
+        database.
+        """
+        fill_cache = self.query.select_related
+        if isinstance(fill_cache, dict):
+            requested = fill_cache
+        else:
+            requested = None
+        max_depth = self.query.max_depth
+        extra_select = self.query.extra_select.keys()
+        index_start = len(extra_select)
+        for row in self.query.results_iter():
+            if fill_cache:
+                obj, _ = get_cached_row(self.model, row, index_start,
+                        max_depth, requested=requested)
+            else:
+                obj = self.model(*row[index_start:])
+            for i, k in enumerate(extra_select):
+                setattr(obj, k, row[i])
+            yield obj
+
+    def count(self):
+        """
+        Performs a SELECT COUNT() and returns the number of records as an
+        integer.
+
+        If the QuerySet is already fully cached this simply returns the length
+        of the cached results set to avoid multiple SELECT COUNT(*) calls.
+        """
+        if self._result_cache is not None and not self._iter:
+            return len(self._result_cache)
+
+        return self.query.get_count()
+
+    def get(self, *args, **kwargs):
+        """
+        Performs the query and returns a single object matching the given
+        keyword arguments.
+        """
+        clone = self.filter(*args, **kwargs)
+        num = len(clone)
+        if num == 1:
+            return clone._result_cache[0]
+        if not num:
+            raise self.model.DoesNotExist("%s matching query does not exist."
+                    % self.model._meta.object_name)
+        raise self.model.MultipleObjectsReturned("get() returned more than one %s -- it returned %s! Lookup parameters were %s"
+                % (self.model._meta.object_name, num, kwargs))
+
+    def create(self, **kwargs):
+        """
+        Creates a new object with the given kwargs, saving it to the database
+        and returning the created object.
+        """
+        obj = self.model(**kwargs)
+        obj.save()
+        return obj
+
+    def get_or_create(self, **kwargs):
+        """
+        Looks up an object with the given kwargs, creating one if necessary.
+        Returns a tuple of (object, created), where created is a boolean
+        specifying whether an object was created.
+        """
+        assert kwargs, \
+                'get_or_create() must be passed at least one keyword argument'
+        defaults = kwargs.pop('defaults', {})
+        try:
+            return self.get(**kwargs), False
+        except self.model.DoesNotExist:
+            try:
+                params = dict([(k, v) for k, v in kwargs.items() if '__' not in k])
+                params.update(defaults)
+                obj = self.model(**params)
+                sid = transaction.savepoint()
+                obj.save()
+                transaction.savepoint_commit(sid)
+                return obj, True
+            except IntegrityError, e:
+                transaction.savepoint_rollback(sid)
+                try:
+                    return self.get(**kwargs), False
+                except self.model.DoesNotExist:
+                    raise e
+
+    def latest(self, field_name=None):
+        """
+        Returns the latest object, according to the model's 'get_latest_by'
+        option or optional given field_name.
+        """
+        latest_by = field_name or self.model._meta.get_latest_by
+        assert bool(latest_by), "latest() requires either a field_name parameter or 'get_latest_by' in the model"
+        assert self.query.can_filter(), \
+                "Cannot change a query once a slice has been taken."
+        obj = self._clone()
+        obj.query.set_limits(high=1)
+        obj.query.add_ordering('-%s' % latest_by)
+        return obj.get()
+
+    def in_bulk(self, id_list):
+        """
+        Returns a dictionary mapping each of the given IDs to the object with
+        that ID.
+        """
+        assert self.query.can_filter(), \
+                "Cannot use 'limit' or 'offset' with in_bulk"
+        assert isinstance(id_list, (tuple,  list)), \
+                "in_bulk() must be provided with a list of IDs."
+        if not id_list:
+            return {}
+        qs = self._clone()
+        qs.query.add_filter(('pk__in', id_list))
+        return dict([(obj._get_pk_val(), obj) for obj in qs.iterator()])
+
+    def delete(self):
+        """
+        Deletes the records in the current QuerySet.
+        """
+        assert self.query.can_filter(), \
+                "Cannot use 'limit' or 'offset' with delete."
+
+        del_query = self._clone()
+
+        # Disable non-supported fields.
+        del_query.query.select_related = False
+        del_query.query.clear_ordering()
+
+        # Delete objects in chunks to prevent the list of related objects from
+        # becoming too long.
+        while 1:
+            # Collect all the objects to be deleted in this chunk, and all the
+            # objects that are related to the objects that are to be deleted.
+            seen_objs = CollectedObjects()
+            for object in del_query[:CHUNK_SIZE]:
+                object._collect_sub_objects(seen_objs)
+
+            if not seen_objs:
+                break
+            delete_objects(seen_objs)
+
+        # Clear the result cache, in case this QuerySet gets reused.
+        self._result_cache = None
+    delete.alters_data = True
+
+    def update(self, **kwargs):
+        """
+        Updates all elements in the current QuerySet, setting all the given
+        fields to the appropriate values.
+        """
+        assert self.query.can_filter(), \
+                "Cannot update a query once a slice has been taken."
+        query = self.query.clone(sql.UpdateQuery)
+        query.add_update_values(kwargs)
+        rows = query.execute_sql(None)
+        transaction.commit_unless_managed()
+        self._result_cache = None
+        return rows
+    update.alters_data = True
+
+    def _update(self, values):
+        """
+        A version of update that accepts field objects instead of field names.
+        Used primarily for model saving and not intended for use by general
+        code (it requires too much poking around at model internals to be
+        useful at that level).
+        """
+        assert self.query.can_filter(), \
+                "Cannot update a query once a slice has been taken."
+        query = self.query.clone(sql.UpdateQuery)
+        query.add_update_fields(values)
+        self._result_cache = None
+        return query.execute_sql(None)
+    _update.alters_data = True
+
+    ##################################################
+    # PUBLIC METHODS THAT RETURN A QUERYSET SUBCLASS #
+    ##################################################
+
+    def values(self, *fields):
+        return self._clone(klass=ValuesQuerySet, setup=True, _fields=fields)
+
+    def values_list(self, *fields, **kwargs):
+        flat = kwargs.pop('flat', False)
+        if kwargs:
+            raise TypeError('Unexpected keyword arguments to values_list: %s'
+                    % (kwargs.keys(),))
+        if flat and len(fields) > 1:
+            raise TypeError("'flat' is not valid when values_list is called with more than one field.")
+        return self._clone(klass=ValuesListQuerySet, setup=True, flat=flat,
+                _fields=fields)
+
+    def dates(self, field_name, kind, order='ASC'):
+        """
+        Returns a list of datetime objects representing all available dates for
+        the given field_name, scoped to 'kind'.
+        """
+        assert kind in ("month", "year", "day"), \
+                "'kind' must be one of 'year', 'month' or 'day'."
+        assert order in ('ASC', 'DESC'), \
+                "'order' must be either 'ASC' or 'DESC'."
+        return self._clone(klass=DateQuerySet, setup=True,
+                _field_name=field_name, _kind=kind, _order=order)
+
+    def none(self):
+        """
+        Returns an empty QuerySet.
+        """
+        return self._clone(klass=EmptyQuerySet)
+
+    ##################################################################
+    # PUBLIC METHODS THAT ALTER ATTRIBUTES AND RETURN A NEW QUERYSET #
+    ##################################################################
+
+    def all(self):
+        """
+        Returns a new QuerySet that is a copy of the current one. This allows a
+        QuerySet to proxy for a model manager in some cases.
+        """
+        return self._clone()
+
+    def filter(self, *args, **kwargs):
+        """
+        Returns a new QuerySet instance with the args ANDed to the existing
+        set.
+        """
+        return self._filter_or_exclude(False, *args, **kwargs)
+
+    def exclude(self, *args, **kwargs):
+        """
+        Returns a new QuerySet instance with NOT (args) ANDed to the existing
+        set.
+        """
+        return self._filter_or_exclude(True, *args, **kwargs)
+
+    def _filter_or_exclude(self, negate, *args, **kwargs):
+        if args or kwargs:
+            assert self.query.can_filter(), \
+                    "Cannot filter a query once a slice has been taken."
+
+        clone = self._clone()
+        if negate:
+            clone.query.add_q(~Q(*args, **kwargs))
+        else:
+            clone.query.add_q(Q(*args, **kwargs))
+        return clone
+
+    def complex_filter(self, filter_obj):
+        """
+        Returns a new QuerySet instance with filter_obj added to the filters.
+
+        filter_obj can be a Q object (or anything with an add_to_query()
+        method) or a dictionary of keyword lookup arguments.
+
+        This exists to support framework features such as 'limit_choices_to',
+        and usually it will be more natural to use other methods.
+        """
+        if isinstance(filter_obj, Q) or hasattr(filter_obj, 'add_to_query'):
+            clone = self._clone()
+            clone.query.add_q(filter_obj)
+            return clone
+        else:
+            return self._filter_or_exclude(None, **filter_obj)
+
+    def select_related(self, *fields, **kwargs):
+        """
+        Returns a new QuerySet instance that will select related objects.
+
+        If fields are specified, they must be ForeignKey fields and only those
+        related objects are included in the selection.
+        """
+        depth = kwargs.pop('depth', 0)
+        if kwargs:
+            raise TypeError('Unexpected keyword arguments to select_related: %s'
+                    % (kwargs.keys(),))
+        obj = self._clone()
+        if fields:
+            if depth:
+                raise TypeError('Cannot pass both "depth" and fields to select_related()')
+            obj.query.add_select_related(fields)
+        else:
+            obj.query.select_related = True
+        if depth:
+            obj.query.max_depth = depth
+        return obj
+
+    def dup_select_related(self, other):
+        """
+        Copies the related selection status from the QuerySet 'other' to the
+        current QuerySet.
+        """
+        self.query.select_related = other.query.select_related
+
+    def order_by(self, *field_names):
+        """
+        Returns a new QuerySet instance with the ordering changed.
+        """
+        assert self.query.can_filter(), \
+                "Cannot reorder a query once a slice has been taken."
+        obj = self._clone()
+        obj.query.clear_ordering()
+        obj.query.add_ordering(*field_names)
+        return obj
+
+    def distinct(self, true_or_false=True):
+        """
+        Returns a new QuerySet instance that will select only distinct results.
+        """
+        obj = self._clone()
+        obj.query.distinct = true_or_false
+        return obj
+
+    def extra(self, select=None, where=None, params=None, tables=None,
+              order_by=None, select_params=None):
+        """
+        Adds extra SQL fragments to the query.
+        """
+        assert self.query.can_filter(), \
+                "Cannot change a query once a slice has been taken"
+        clone = self._clone()
+        clone.query.add_extra(select, select_params, where, params, tables, order_by)
+        return clone
+
+    def reverse(self):
+        """
+        Reverses the ordering of the QuerySet.
+        """
+        clone = self._clone()
+        clone.query.standard_ordering = not clone.query.standard_ordering
+        return clone
+
+    ###################
+    # PRIVATE METHODS #
+    ###################
+
+    def _clone(self, klass=None, setup=False, **kwargs):
+        if klass is None:
+            klass = self.__class__
+        query = self.query.clone()
+        if self._sticky_filter:
+            query.filter_is_sticky = True
+        c = klass(model=self.model, query=query)
+        c.__dict__.update(kwargs)
+        if setup and hasattr(c, '_setup_query'):
+            c._setup_query()
+        return c
+
+    def _fill_cache(self, num=None):
+        """
+        Fills the result cache with 'num' more entries (or until the results
+        iterator is exhausted).
+        """
+        if self._iter:
+            try:
+                for i in range(num or ITER_CHUNK_SIZE):
+                    self._result_cache.append(self._iter.next())
+            except StopIteration:
+                self._iter = None
+
+    def _next_is_sticky(self):
+        """
+        Indicates that the next filter call and the one following that should
+        be treated as a single filter. This is only important when it comes to
+        determining when to reuse tables for many-to-many filters. Required so
+        that we can filter naturally on the results of related managers.
+
+        This doesn't return a clone of the current QuerySet (it returns
+        "self"). The method is only used internally and should be immediately
+        followed by a filter() that does create a clone.
+        """
+        self._sticky_filter = True
+        return self
+
+    def _merge_sanity_check(self, other):
+        """
+        Checks that we are merging two comparable QuerySet classes. By default
+        this does nothing, but see the ValuesQuerySet for an example of where
+        it's useful.
+        """
+        pass
+
+
+class ValuesQuerySet(QuerySet):
+    def __init__(self, *args, **kwargs):
+        super(ValuesQuerySet, self).__init__(*args, **kwargs)
+        # select_related isn't supported in values(). (FIXME -#3358)
+        self.query.select_related = False
+
+        # QuerySet.clone() will also set up the _fields attribute with the
+        # names of the model fields to select.
+
+    def iterator(self):
+        if (not self.extra_names and
+            len(self.field_names) != len(self.model._meta.fields)):
+            self.query.trim_extra_select(self.extra_names)
+        names = self.query.extra_select.keys() + self.field_names
+        for row in self.query.results_iter():
+            yield dict(zip(names, row))
+
+    def _setup_query(self):
+        """
+        Constructs the field_names list that the values query will be
+        retrieving.
+
+        Called by the _clone() method after initializing the rest of the
+        instance.
+        """
+        self.extra_names = []
+        if self._fields:
+            if not self.query.extra_select:
+                field_names = list(self._fields)
+            else:
+                field_names = []
+                for f in self._fields:
+                    if self.query.extra_select.has_key(f):
+                        self.extra_names.append(f)
+                    else:
+                        field_names.append(f)
+        else:
+            # Default to all fields.
+            field_names = [f.attname for f in self.model._meta.fields]
+
+        self.query.add_fields(field_names, False)
+        self.query.default_cols = False
+        self.field_names = field_names
+
+    def _clone(self, klass=None, setup=False, **kwargs):
+        """
+        Cloning a ValuesQuerySet preserves the current fields.
+        """
+        c = super(ValuesQuerySet, self)._clone(klass, **kwargs)
+        c._fields = self._fields[:]
+        c.field_names = self.field_names
+        c.extra_names = self.extra_names
+        if setup and hasattr(c, '_setup_query'):
+            c._setup_query()
+        return c
+
+    def _merge_sanity_check(self, other):
+        super(ValuesQuerySet, self)._merge_sanity_check(other)
+        if (set(self.extra_names) != set(other.extra_names) or
+                set(self.field_names) != set(other.field_names)):
+            raise TypeError("Merging '%s' classes must involve the same values in each case."
+                    % self.__class__.__name__)
+
+
+class ValuesListQuerySet(ValuesQuerySet):
+    def iterator(self):
+        self.query.trim_extra_select(self.extra_names)
+        if self.flat and len(self._fields) == 1:
+            for row in self.query.results_iter():
+                yield row[0]
+        elif not self.query.extra_select:
+            for row in self.query.results_iter():
+                yield tuple(row)
+        else:
+            # When extra(select=...) is involved, the extra cols come are
+            # always at the start of the row, so we need to reorder the fields
+            # to match the order in self._fields.
+            names = self.query.extra_select.keys() + self.field_names
+            for row in self.query.results_iter():
+                data = dict(zip(names, row))
+                yield tuple([data[f] for f in self._fields])
+
+    def _clone(self, *args, **kwargs):
+        clone = super(ValuesListQuerySet, self)._clone(*args, **kwargs)
+        clone.flat = self.flat
+        return clone
+
+
+class DateQuerySet(QuerySet):
+    def iterator(self):
+        return self.query.results_iter()
+
+    def _setup_query(self):
+        """
+        Sets up any special features of the query attribute.
+
+        Called by the _clone() method after initializing the rest of the
+        instance.
+        """
+        self.query = self.query.clone(klass=sql.DateQuery, setup=True)
+        self.query.select = []
+        field = self.model._meta.get_field(self._field_name, many_to_many=False)
+        assert isinstance(field, DateField), "%r isn't a DateField." \
+                % field_name
+        self.query.add_date_select(field, self._kind, self._order)
+        if field.null:
+            self.query.add_filter(('%s__isnull' % field.name, False))
+
+    def _clone(self, klass=None, setup=False, **kwargs):
+        c = super(DateQuerySet, self)._clone(klass, False, **kwargs)
+        c._field_name = self._field_name
+        c._kind = self._kind
+        if setup and hasattr(c, '_setup_query'):
+            c._setup_query()
+        return c
+
+
+class EmptyQuerySet(QuerySet):
+    def __init__(self, model=None, query=None):
+        super(EmptyQuerySet, self).__init__(model, query)
+        self._result_cache = []
+
+    def __and__(self, other):
+        return self._clone()
+
+    def __or__(self, other):
+        return other._clone()
+
+    def count(self):
+        return 0
+
+    def delete(self):
+        pass
+
+    def _clone(self, klass=None, setup=False, **kwargs):
+        c = super(EmptyQuerySet, self)._clone(klass, **kwargs)
+        c._result_cache = []
+        return c
+
+    def iterator(self):
+        # This slightly odd construction is because we need an empty generator
+        # (it raises StopIteration immediately).
+        yield iter([]).next()
+
+
+def get_cached_row(klass, row, index_start, max_depth=0, cur_depth=0,
+                   requested=None):
+    """
+    Helper function that recursively returns an object with the specified
+    related attributes already populated.
+    """
+    if max_depth and requested is None and cur_depth > max_depth:
+        # We've recursed deeply enough; stop now.
+        return None
+
+    restricted = requested is not None
+    index_end = index_start + len(klass._meta.fields)
+    fields = row[index_start:index_end]
+    if not [x for x in fields if x is not None]:
+        # If we only have a list of Nones, there was not related object.
+        return None, index_end
+    obj = klass(*fields)
+    for f in klass._meta.fields:
+        if not select_related_descend(f, restricted, requested):
+            continue
+        if restricted:
+            next = requested[f.name]
+        else:
+            next = None
+        cached_row = get_cached_row(f.rel.to, row, index_end, max_depth,
+                cur_depth+1, next)
+        if cached_row:
+            rel_obj, index_end = cached_row
+            setattr(obj, f.get_cache_name(), rel_obj)
+    return obj, index_end
+
+
+def delete_objects(seen_objs):
+    """
+    Iterate through a list of seen classes, and remove any instances that are
+    referred to.
+    """
+    try:
+        ordered_classes = seen_objs.keys()
+    except CyclicDependency:
+        # If there is a cyclic dependency, we cannot in general delete the
+        # objects.  However, if an appropriate transaction is set up, or if the
+        # database is lax enough, it will succeed. So for now, we go ahead and
+        # try anyway.
+        ordered_classes = seen_objs.unordered_keys()
+
+    obj_pairs = {}
+    for cls in ordered_classes:
+        items = seen_objs[cls].items()
+        items.sort()
+        obj_pairs[cls] = items
+
+        # Pre-notify all instances to be deleted.
+        for pk_val, instance in items:
+            signals.pre_delete.send(sender=cls, instance=instance)
+
+        pk_list = [pk for pk,instance in items]
+        del_query = sql.DeleteQuery(cls, connection)
+        del_query.delete_batch_related(pk_list)
+
+        update_query = sql.UpdateQuery(cls, connection)
+        for field, model in cls._meta.get_fields_with_model():
+            if (field.rel and field.null and field.rel.to in seen_objs and
+                    filter(lambda f: f.column == field.column,
+                    field.rel.to._meta.fields)):
+                if model:
+                    sql.UpdateQuery(model, connection).clear_related(field,
+                            pk_list)
+                else:
+                    update_query.clear_related(field, pk_list)
+
+    # Now delete the actual data.
+    for cls in ordered_classes:
+        items = obj_pairs[cls]
+        items.reverse()
+
+        pk_list = [pk for pk,instance in items]
+        del_query = sql.DeleteQuery(cls, connection)
+        del_query.delete_batch(pk_list)
+
+        # Last cleanup; set NULLs where there once was a reference to the
+        # object, NULL the primary key of the found objects, and perform
+        # post-notification.
+        for pk_val, instance in items:
+            for field in cls._meta.fields:
+                if field.rel and field.null and field.rel.to in seen_objs:
+                    setattr(instance, field.attname, None)
+
+            signals.post_delete.send(sender=cls, instance=instance)
+            setattr(instance, cls._meta.pk.attname, None)
+
+    transaction.commit_unless_managed()
+
+
+def insert_query(model, values, return_id=False, raw_values=False):
+    """
+    Inserts a new record for the given model. This provides an interface to
+    the InsertQuery class and is how Model.save() is implemented. It is not
+    part of the public API.
+    """
+    query = sql.InsertQuery(model, connection)
+    query.insert_values(values, raw_values)
+    return query.execute_sql(return_id)
diff --git a/webapp/django/db/models/query_utils.py b/webapp/django/db/models/query_utils.py
new file mode 100644
index 0000000..8dbb1ec
--- /dev/null
+++ b/webapp/django/db/models/query_utils.py
@@ -0,0 +1,67 @@
+"""
+Various data structures used in query construction.
+
+Factored out from django.db.models.query so that they can also be used by other
+modules without getting into circular import difficulties.
+"""
+
+from copy import deepcopy
+
+from django.utils import tree
+
+class QueryWrapper(object):
+    """
+    A type that indicates the contents are an SQL fragment and the associate
+    parameters. Can be used to pass opaque data to a where-clause, for example.
+    """
+    def __init__(self, sql, params):
+        self.data = sql, params
+
+class Q(tree.Node):
+    """
+    Encapsulates filters as objects that can then be combined logically (using
+    & and |).
+    """
+    # Connection types
+    AND = 'AND'
+    OR = 'OR'
+    default = AND
+
+    def __init__(self, *args, **kwargs):
+        super(Q, self).__init__(children=list(args) + kwargs.items())
+
+    def _combine(self, other, conn):
+        if not isinstance(other, Q):
+            raise TypeError(other)
+        obj = deepcopy(self)
+        obj.add(other, conn)
+        return obj
+
+    def __or__(self, other):
+        return self._combine(other, self.OR)
+
+    def __and__(self, other):
+        return self._combine(other, self.AND)
+
+    def __invert__(self):
+        obj = deepcopy(self)
+        obj.negate()
+        return obj
+
+def select_related_descend(field, restricted, requested):
+    """
+    Returns True if this field should be used to descend deeper for
+    select_related() purposes. Used by both the query construction code
+    (sql.query.fill_related_selections()) and the model instance creation code
+    (query.get_cached_row()).
+    """
+    if not field.rel:
+        return False
+    if field.rel.parent_link:
+        return False
+    if restricted and field.name not in requested:
+        return False
+    if not restricted and field.null:
+        return False
+    return True
+
diff --git a/webapp/django/db/models/related.py b/webapp/django/db/models/related.py
new file mode 100644
index 0000000..2c1dc5c
--- /dev/null
+++ b/webapp/django/db/models/related.py
@@ -0,0 +1,142 @@
+class BoundRelatedObject(object):
+    def __init__(self, related_object, field_mapping, original):
+        self.relation = related_object
+        self.field_mappings = field_mapping[related_object.name]
+
+    def template_name(self):
+        raise NotImplementedError
+
+    def __repr__(self):
+        return repr(self.__dict__)
+
+class RelatedObject(object):
+    def __init__(self, parent_model, model, field):
+        self.parent_model = parent_model
+        self.model = model
+        self.opts = model._meta
+        self.field = field
+        self.edit_inline = field.rel.edit_inline
+        self.name = '%s:%s' % (self.opts.app_label, self.opts.module_name)
+        self.var_name = self.opts.object_name.lower()
+
+    def flatten_data(self, follow, obj=None):
+        new_data = {}
+        rel_instances = self.get_list(obj)
+        for i, rel_instance in enumerate(rel_instances):
+            instance_data = {}
+            for f in self.opts.fields + self.opts.many_to_many:
+                # TODO: Fix for recursive manipulators.
+                fol = follow.get(f.name, None)
+                if fol:
+                    field_data = f.flatten_data(fol, rel_instance)
+                    for name, value in field_data.items():
+                        instance_data['%s.%d.%s' % (self.var_name, i, name)] = value
+            new_data.update(instance_data)
+        return new_data
+
+    def extract_data(self, data):
+        """
+        Pull out the data meant for inline objects of this class,
+        i.e. anything starting with our module name.
+        """
+        return data # TODO
+
+    def get_list(self, parent_instance=None):
+        "Get the list of this type of object from an instance of the parent class."
+        if parent_instance is not None:
+            attr = getattr(parent_instance, self.get_accessor_name())
+            if self.field.rel.multiple:
+                # For many-to-many relationships, return a list of objects
+                # corresponding to the xxx_num_in_admin options of the field
+                objects = list(attr.all())
+
+                count = len(objects) + self.field.rel.num_extra_on_change
+                if self.field.rel.min_num_in_admin:
+                    count = max(count, self.field.rel.min_num_in_admin)
+                if self.field.rel.max_num_in_admin:
+                    count = min(count, self.field.rel.max_num_in_admin)
+
+                change = count - len(objects)
+                if change > 0:
+                    return objects + [None] * change
+                if change < 0:
+                    return objects[:change]
+                else: # Just right
+                    return objects
+            else:
+                # A one-to-one relationship, so just return the single related
+                # object
+                return [attr]
+        else:
+            if self.field.rel.min_num_in_admin:
+                return [None] * max(self.field.rel.num_in_admin, self.field.rel.min_num_in_admin)
+            else:
+                return [None] * self.field.rel.num_in_admin
+
+    def get_db_prep_lookup(self, lookup_type, value):
+        # Defer to the actual field definition for db prep
+        return self.field.get_db_prep_lookup(lookup_type, value)
+        
+    def editable_fields(self):
+        "Get the fields in this class that should be edited inline."
+        return [f for f in self.opts.fields + self.opts.many_to_many if f.editable and f != self.field]
+
+    def get_follow(self, override=None):
+        if isinstance(override, bool):
+            if override:
+                over = {}
+            else:
+                return None
+        else:
+            if override:
+                over = override.copy()
+            elif self.edit_inline:
+                over = {}
+            else:
+                return None
+
+        over[self.field.name] = False
+        return self.opts.get_follow(over)
+
+    def get_manipulator_fields(self, opts, manipulator, change, follow):
+        if self.field.rel.multiple:
+            if change:
+                attr = getattr(manipulator.original_object, self.get_accessor_name())
+                count = attr.count()
+                count += self.field.rel.num_extra_on_change
+            else:
+                count = self.field.rel.num_in_admin
+            if self.field.rel.min_num_in_admin:
+                count = max(count, self.field.rel.min_num_in_admin)
+            if self.field.rel.max_num_in_admin:
+                count = min(count, self.field.rel.max_num_in_admin)
+        else:
+            count = 1
+
+        fields = []
+        for i in range(count):
+            for f in self.opts.fields + self.opts.many_to_many:
+                if follow.get(f.name, False):
+                    prefix = '%s.%d.' % (self.var_name, i)
+                    fields.extend(f.get_manipulator_fields(self.opts, manipulator, change,
+                                                           name_prefix=prefix, rel=True))
+        return fields
+
+    def __repr__(self):
+        return "<RelatedObject: %s related to %s>" % (self.name, self.field.name)
+
+    def bind(self, field_mapping, original, bound_related_object_class=BoundRelatedObject):
+        return bound_related_object_class(self, field_mapping, original)
+
+    def get_accessor_name(self):
+        # This method encapsulates the logic that decides what name to give an
+        # accessor descriptor that retrieves related many-to-one or
+        # many-to-many objects. It uses the lower-cased object_name + "_set",
+        # but this can be overridden with the "related_name" option.
+        if self.field.rel.multiple:
+            # If this is a symmetrical m2m relation on self, there is no reverse accessor.
+            if getattr(self.field.rel, 'symmetrical', False) and self.model == self.parent_model:
+                return None
+            return self.field.rel.related_name or (self.opts.object_name.lower() + '_set')
+        else:
+            return self.field.rel.related_name or (self.opts.object_name.lower())
diff --git a/webapp/django/db/models/signals.py b/webapp/django/db/models/signals.py
new file mode 100644
index 0000000..0455336
--- /dev/null
+++ b/webapp/django/db/models/signals.py
@@ -0,0 +1,14 @@
+from django.dispatch import Signal
+
+class_prepared = Signal(providing_args=["class"])
+
+pre_init = Signal(providing_args=["instance", "args", "kwargs"])
+post_init = Signal(providing_args=["instance"])
+
+pre_save = Signal(providing_args=["instance", "raw"])
+post_save = Signal(providing_args=["instance", "raw", "created"])
+
+pre_delete = Signal(providing_args=["instance"])
+post_delete = Signal(providing_args=["instance"])
+
+post_syncdb = Signal(providing_args=["class", "app", "created_models", "verbosity", "interactive"])
diff --git a/webapp/django/db/models/sql/__init__.py b/webapp/django/db/models/sql/__init__.py
new file mode 100644
index 0000000..7310982
--- /dev/null
+++ b/webapp/django/db/models/sql/__init__.py
@@ -0,0 +1,7 @@
+from query import *
+from subqueries import *
+from where import AND, OR
+from datastructures import EmptyResultSet
+
+__all__ = ['Query', 'AND', 'OR', 'EmptyResultSet']
+
diff --git a/webapp/django/db/models/sql/constants.py b/webapp/django/db/models/sql/constants.py
new file mode 100644
index 0000000..129a592
--- /dev/null
+++ b/webapp/django/db/models/sql/constants.py
@@ -0,0 +1,36 @@
+import re
+
+# Valid query types (a dictionary is used for speedy lookups).
+QUERY_TERMS = dict([(x, None) for x in (
+    'exact', 'iexact', 'contains', 'icontains', 'gt', 'gte', 'lt', 'lte', 'in',
+    'startswith', 'istartswith', 'endswith', 'iendswith', 'range', 'year',
+    'month', 'day', 'isnull', 'search', 'regex', 'iregex',
+    )])
+
+# Size of each "chunk" for get_iterator calls.
+# Larger values are slightly faster at the expense of more storage space.
+GET_ITERATOR_CHUNK_SIZE = 100
+
+# Separator used to split filter strings apart.
+LOOKUP_SEP = '__'
+
+# Constants to make looking up tuple values clearer.
+# Join lists
+TABLE_NAME = 0
+RHS_ALIAS = 1
+JOIN_TYPE = 2
+LHS_ALIAS = 3
+LHS_JOIN_COL = 4
+RHS_JOIN_COL = 5
+NULLABLE = 6
+
+# How many results to expect from a cursor.execute call
+MULTI = 'multi'
+SINGLE = 'single'
+
+ORDER_PATTERN = re.compile(r'\?|[-+]?[.\w]+$')
+ORDER_DIR = {
+    'ASC': ('ASC', 'DESC'),
+    'DESC': ('DESC', 'ASC')}
+
+
diff --git a/webapp/django/db/models/sql/datastructures.py b/webapp/django/db/models/sql/datastructures.py
new file mode 100644
index 0000000..913d8fd
--- /dev/null
+++ b/webapp/django/db/models/sql/datastructures.py
@@ -0,0 +1,103 @@
+"""
+Useful auxilliary data structures for query construction. Not useful outside
+the SQL domain.
+"""
+
+class EmptyResultSet(Exception):
+    pass
+
+class FullResultSet(Exception):
+    pass
+
+class MultiJoin(Exception):
+    """
+    Used by join construction code to indicate the point at which a
+    multi-valued join was attempted (if the caller wants to treat that
+    exceptionally).
+    """
+    def __init__(self, level):
+        self.level = level
+
+class Empty(object):
+    pass
+
+class RawValue(object):
+    def __init__(self, value):
+        self.value = value
+
+class Aggregate(object):
+    """
+    Base class for all aggregate-related classes (min, max, avg, count, sum).
+    """
+    def relabel_aliases(self, change_map):
+        """
+        Relabel the column alias, if necessary. Must be implemented by
+        subclasses.
+        """
+        raise NotImplementedError
+
+    def as_sql(self, quote_func=None):
+        """
+        Returns the SQL string fragment for this object.
+
+        The quote_func function is used to quote the column components. If
+        None, it defaults to doing nothing.
+
+        Must be implemented by subclasses.
+        """
+        raise NotImplementedError
+
+class Count(Aggregate):
+    """
+    Perform a count on the given column.
+    """
+    def __init__(self, col='*', distinct=False):
+        """
+        Set the column to count on (defaults to '*') and set whether the count
+        should be distinct or not.
+        """
+        self.col = col
+        self.distinct = distinct
+
+    def relabel_aliases(self, change_map):
+        c = self.col
+        if isinstance(c, (list, tuple)):
+            self.col = (change_map.get(c[0], c[0]), c[1])
+
+    def as_sql(self, quote_func=None):
+        if not quote_func:
+            quote_func = lambda x: x
+        if isinstance(self.col, (list, tuple)):
+            col = ('%s.%s' % tuple([quote_func(c) for c in self.col]))
+        elif hasattr(self.col, 'as_sql'):
+            col = self.col.as_sql(quote_func)
+        else:
+            col = self.col
+        if self.distinct:
+            return 'COUNT(DISTINCT %s)' % col
+        else:
+            return 'COUNT(%s)' % col
+
+class Date(object):
+    """
+    Add a date selection column.
+    """
+    def __init__(self, col, lookup_type, date_sql_func):
+        self.col = col
+        self.lookup_type = lookup_type
+        self.date_sql_func = date_sql_func
+
+    def relabel_aliases(self, change_map):
+        c = self.col
+        if isinstance(c, (list, tuple)):
+            self.col = (change_map.get(c[0], c[0]), c[1])
+
+    def as_sql(self, quote_func=None):
+        if not quote_func:
+            quote_func = lambda x: x
+        if isinstance(self.col, (list, tuple)):
+            col = '%s.%s' % tuple([quote_func(c) for c in self.col])
+        else:
+            col = self.col
+        return self.date_sql_func(self.lookup_type, col)
+
diff --git a/webapp/django/db/models/sql/query.py b/webapp/django/db/models/sql/query.py
new file mode 100644
index 0000000..287890a
--- /dev/null
+++ b/webapp/django/db/models/sql/query.py
@@ -0,0 +1,1705 @@
+"""
+Create SQL statements for QuerySets.
+
+The code in here encapsulates all of the SQL construction so that QuerySets
+themselves do not have to (and could be backed by things other than SQL
+databases). The abstraction barrier only works one way: this module has to know
+all about the internals of models in order to get the information it needs.
+"""
+
+from copy import deepcopy
+
+from django.utils.tree import Node
+from django.utils.datastructures import SortedDict
+from django.utils.encoding import force_unicode
+from django.db import connection
+from django.db.models import signals
+from django.db.models.fields import FieldDoesNotExist
+from django.db.models.query_utils import select_related_descend
+from django.db.models.sql.where import WhereNode, EverythingNode, AND, OR
+from django.db.models.sql.datastructures import Count
+from django.core.exceptions import FieldError
+from datastructures import EmptyResultSet, Empty, MultiJoin
+from constants import *
+
+try:
+    set
+except NameError:
+    from sets import Set as set     # Python 2.3 fallback
+
+__all__ = ['Query']
+
+class Query(object):
+    """
+    A single SQL query.
+    """
+    # SQL join types. These are part of the class because their string forms
+    # vary from database to database and can be customised by a subclass.
+    INNER = 'INNER JOIN'
+    LOUTER = 'LEFT OUTER JOIN'
+
+    alias_prefix = 'T'
+    query_terms = QUERY_TERMS
+
+    def __init__(self, model, connection, where=WhereNode):
+        self.model = model
+        self.connection = connection
+        self.alias_refcount = {}
+        self.alias_map = {}     # Maps alias to join information
+        self.table_map = {}     # Maps table names to list of aliases.
+        self.join_map = {}
+        self.rev_join_map = {}  # Reverse of join_map.
+        self.quote_cache = {}
+        self.default_cols = True
+        self.default_ordering = True
+        self.standard_ordering = True
+        self.ordering_aliases = []
+        self.start_meta = None
+        self.select_fields = []
+        self.related_select_fields = []
+        self.dupe_avoidance = {}
+        self.used_aliases = set()
+        self.filter_is_sticky = False
+
+        # SQL-related attributes
+        self.select = []
+        self.tables = []    # Aliases in the order they are created.
+        self.where = where()
+        self.where_class = where
+        self.group_by = []
+        self.having = []
+        self.order_by = []
+        self.low_mark, self.high_mark = 0, None  # Used for offset/limit
+        self.distinct = False
+        self.select_related = False
+        self.related_select_cols = []
+
+        # Arbitrary maximum limit for select_related. Prevents infinite
+        # recursion. Can be changed by the depth parameter to select_related().
+        self.max_depth = 5
+
+        # These are for extensions. The contents are more or less appended
+        # verbatim to the appropriate clause.
+        self.extra_select = SortedDict()  # Maps col_alias -> (col_sql, params).
+        self.extra_tables = ()
+        self.extra_where = ()
+        self.extra_params = ()
+        self.extra_order_by = ()
+
+    def __str__(self):
+        """
+        Returns the query as a string of SQL with the parameter values
+        substituted in.
+
+        Parameter values won't necessarily be quoted correctly, since that is
+        done by the database interface at execution time.
+        """
+        sql, params = self.as_sql()
+        return sql % params
+
+    def __deepcopy__(self, memo):
+        result= self.clone()
+        memo[id(self)] = result
+        return result
+
+    def __getstate__(self):
+        """
+        Pickling support.
+        """
+        obj_dict = self.__dict__.copy()
+        obj_dict['related_select_fields'] = []
+        obj_dict['related_select_cols'] = []
+        del obj_dict['connection']
+        return obj_dict
+
+    def __setstate__(self, obj_dict):
+        """
+        Unpickling support.
+        """
+        self.__dict__.update(obj_dict)
+        # XXX: Need a better solution for this when multi-db stuff is
+        # supported. It's the only class-reference to the module-level
+        # connection variable.
+        self.connection = connection
+
+    def get_meta(self):
+        """
+        Returns the Options instance (the model._meta) from which to start
+        processing. Normally, this is self.model._meta, but it can change.
+        """
+        if self.start_meta:
+            return self.start_meta
+        return self.model._meta
+
+    def quote_name_unless_alias(self, name):
+        """
+        A wrapper around connection.ops.quote_name that doesn't quote aliases
+        for table names. This avoids problems with some SQL dialects that treat
+        quoted strings specially (e.g. PostgreSQL).
+        """
+        if name in self.quote_cache:
+            return self.quote_cache[name]
+        if ((name in self.alias_map and name not in self.table_map) or
+                name in self.extra_select):
+            self.quote_cache[name] = name
+            return name
+        r = self.connection.ops.quote_name(name)
+        self.quote_cache[name] = r
+        return r
+
+    def clone(self, klass=None, **kwargs):
+        """
+        Creates a copy of the current instance. The 'kwargs' parameter can be
+        used by clients to update attributes after copying has taken place.
+        """
+        obj = Empty()
+        obj.__class__ = klass or self.__class__
+        obj.model = self.model
+        obj.connection = self.connection
+        obj.alias_refcount = self.alias_refcount.copy()
+        obj.alias_map = self.alias_map.copy()
+        obj.table_map = self.table_map.copy()
+        obj.join_map = self.join_map.copy()
+        obj.rev_join_map = self.rev_join_map.copy()
+        obj.quote_cache = {}
+        obj.default_cols = self.default_cols
+        obj.default_ordering = self.default_ordering
+        obj.standard_ordering = self.standard_ordering
+        obj.ordering_aliases = []
+        obj.start_meta = self.start_meta
+        obj.select_fields = self.select_fields[:]
+        obj.related_select_fields = self.related_select_fields[:]
+        obj.dupe_avoidance = self.dupe_avoidance.copy()
+        obj.select = self.select[:]
+        obj.tables = self.tables[:]
+        obj.where = deepcopy(self.where)
+        obj.where_class = self.where_class
+        obj.group_by = self.group_by[:]
+        obj.having = self.having[:]
+        obj.order_by = self.order_by[:]
+        obj.low_mark, obj.high_mark = self.low_mark, self.high_mark
+        obj.distinct = self.distinct
+        obj.select_related = self.select_related
+        obj.related_select_cols = []
+        obj.max_depth = self.max_depth
+        obj.extra_select = self.extra_select.copy()
+        obj.extra_tables = self.extra_tables
+        obj.extra_where = self.extra_where
+        obj.extra_params = self.extra_params
+        obj.extra_order_by = self.extra_order_by
+        if self.filter_is_sticky and self.used_aliases:
+            obj.used_aliases = self.used_aliases.copy()
+        else:
+            obj.used_aliases = set()
+        obj.filter_is_sticky = False
+        obj.__dict__.update(kwargs)
+        if hasattr(obj, '_setup_query'):
+            obj._setup_query()
+        return obj
+
+    def results_iter(self):
+        """
+        Returns an iterator over the results from executing this query.
+        """
+        resolve_columns = hasattr(self, 'resolve_columns')
+        fields = None
+        for rows in self.execute_sql(MULTI):
+            for row in rows:
+                if resolve_columns:
+                    if fields is None:
+                        # We only set this up here because
+                        # related_select_fields isn't populated until
+                        # execute_sql() has been called.
+                        if self.select_fields:
+                            fields = self.select_fields + self.related_select_fields
+                        else:
+                            fields = self.model._meta.fields
+                    row = self.resolve_columns(row, fields)
+                yield row
+
+    def get_count(self):
+        """
+        Performs a COUNT() query using the current filter constraints.
+        """
+        from subqueries import CountQuery
+        obj = self.clone()
+        obj.clear_ordering(True)
+        obj.clear_limits()
+        obj.select_related = False
+        obj.related_select_cols = []
+        obj.related_select_fields = []
+        if len(obj.select) > 1:
+            obj = self.clone(CountQuery, _query=obj, where=self.where_class(),
+                    distinct=False)
+            obj.select = []
+            obj.extra_select = SortedDict()
+        obj.add_count_column()
+        data = obj.execute_sql(SINGLE)
+        if not data:
+            return 0
+        number = data[0]
+
+        # Apply offset and limit constraints manually, since using LIMIT/OFFSET
+        # in SQL (in variants that provide them) doesn't change the COUNT
+        # output.
+        number = max(0, number - self.low_mark)
+        if self.high_mark:
+            number = min(number, self.high_mark - self.low_mark)
+
+        return number
+
+    def as_sql(self, with_limits=True, with_col_aliases=False):
+        """
+        Creates the SQL for this query. Returns the SQL string and list of
+        parameters.
+
+        If 'with_limits' is False, any limit/offset information is not included
+        in the query.
+        """
+        self.pre_sql_setup()
+        out_cols = self.get_columns(with_col_aliases)
+        ordering = self.get_ordering()
+
+        # This must come after 'select' and 'ordering' -- see docstring of
+        # get_from_clause() for details.
+        from_, f_params = self.get_from_clause()
+
+        where, w_params = self.where.as_sql(qn=self.quote_name_unless_alias)
+        params = []
+        for val in self.extra_select.itervalues():
+            params.extend(val[1])
+
+        result = ['SELECT']
+        if self.distinct:
+            result.append('DISTINCT')
+        result.append(', '.join(out_cols + self.ordering_aliases))
+
+        result.append('FROM')
+        result.extend(from_)
+        params.extend(f_params)
+
+        if where:
+            result.append('WHERE %s' % where)
+            params.extend(w_params)
+        if self.extra_where:
+            if not where:
+                result.append('WHERE')
+            else:
+                result.append('AND')
+            result.append(' AND '.join(self.extra_where))
+
+        if self.group_by:
+            grouping = self.get_grouping()
+            result.append('GROUP BY %s' % ', '.join(grouping))
+
+        if ordering:
+            result.append('ORDER BY %s' % ', '.join(ordering))
+
+        if with_limits:
+            if self.high_mark is not None:
+                result.append('LIMIT %d' % (self.high_mark - self.low_mark))
+            if self.low_mark:
+                if self.high_mark is None:
+                    val = self.connection.ops.no_limit_value()
+                    if val:
+                        result.append('LIMIT %d' % val)
+                result.append('OFFSET %d' % self.low_mark)
+
+        params.extend(self.extra_params)
+        return ' '.join(result), tuple(params)
+
+    def combine(self, rhs, connector):
+        """
+        Merge the 'rhs' query into the current one (with any 'rhs' effects
+        being applied *after* (that is, "to the right of") anything in the
+        current query. 'rhs' is not modified during a call to this function.
+
+        The 'connector' parameter describes how to connect filters from the
+        'rhs' query.
+        """
+        assert self.model == rhs.model, \
+                "Cannot combine queries on two different base models."
+        assert self.can_filter(), \
+                "Cannot combine queries once a slice has been taken."
+        assert self.distinct == rhs.distinct, \
+            "Cannot combine a unique query with a non-unique query."
+
+        # Work out how to relabel the rhs aliases, if necessary.
+        change_map = {}
+        used = set()
+        conjunction = (connector == AND)
+        first = True
+        for alias in rhs.tables:
+            if not rhs.alias_refcount[alias]:
+                # An unused alias.
+                continue
+            promote = (rhs.alias_map[alias][JOIN_TYPE] == self.LOUTER)
+            new_alias = self.join(rhs.rev_join_map[alias],
+                    (conjunction and not first), used, promote, not conjunction)
+            used.add(new_alias)
+            change_map[alias] = new_alias
+            first = False
+
+        # So that we don't exclude valid results in an "or" query combination,
+        # the first join that is exclusive to the lhs (self) must be converted
+        # to an outer join.
+        if not conjunction:
+            for alias in self.tables[1:]:
+                if self.alias_refcount[alias] == 1:
+                    self.promote_alias(alias, True)
+                    break
+
+        # Now relabel a copy of the rhs where-clause and add it to the current
+        # one.
+        if rhs.where:
+            w = deepcopy(rhs.where)
+            w.relabel_aliases(change_map)
+            if not self.where:
+                # Since 'self' matches everything, add an explicit "include
+                # everything" where-constraint so that connections between the
+                # where clauses won't exclude valid results.
+                self.where.add(EverythingNode(), AND)
+        elif self.where:
+            # rhs has an empty where clause.
+            w = self.where_class()
+            w.add(EverythingNode(), AND)
+        else:
+            w = self.where_class()
+        self.where.add(w, connector)
+
+        # Selection columns and extra extensions are those provided by 'rhs'.
+        self.select = []
+        for col in rhs.select:
+            if isinstance(col, (list, tuple)):
+                self.select.append((change_map.get(col[0], col[0]), col[1]))
+            else:
+                item = deepcopy(col)
+                item.relabel_aliases(change_map)
+                self.select.append(item)
+        self.select_fields = rhs.select_fields[:]
+
+        if connector == OR:
+            # It would be nice to be able to handle this, but the queries don't
+            # really make sense (or return consistent value sets). Not worth
+            # the extra complexity when you can write a real query instead.
+            if self.extra_select and rhs.extra_select:
+                raise ValueError("When merging querysets using 'or', you "
+                        "cannot have extra(select=...) on both sides.")
+            if self.extra_where and rhs.extra_where:
+                raise ValueError("When merging querysets using 'or', you "
+                        "cannot have extra(where=...) on both sides.")
+        self.extra_select.update(rhs.extra_select)
+        self.extra_tables += rhs.extra_tables
+        self.extra_where += rhs.extra_where
+        self.extra_params += rhs.extra_params
+
+        # Ordering uses the 'rhs' ordering, unless it has none, in which case
+        # the current ordering is used.
+        self.order_by = rhs.order_by and rhs.order_by[:] or self.order_by
+        self.extra_order_by = rhs.extra_order_by or self.extra_order_by
+
+    def pre_sql_setup(self):
+        """
+        Does any necessary class setup immediately prior to producing SQL. This
+        is for things that can't necessarily be done in __init__ because we
+        might not have all the pieces in place at that time.
+        """
+        if not self.tables:
+            self.join((None, self.model._meta.db_table, None, None))
+        if self.select_related and not self.related_select_cols:
+            self.fill_related_selections()
+
+    def get_columns(self, with_aliases=False):
+        """
+        Return the list of columns to use in the select statement. If no
+        columns have been specified, returns all columns relating to fields in
+        the model.
+
+        If 'with_aliases' is true, any column names that are duplicated
+        (without the table names) are given unique aliases. This is needed in
+        some cases to avoid ambiguitity with nested queries.
+        """
+        qn = self.quote_name_unless_alias
+        qn2 = self.connection.ops.quote_name
+        result = ['(%s) AS %s' % (col[0], qn2(alias)) for alias, col in self.extra_select.iteritems()]
+        aliases = set(self.extra_select.keys())
+        if with_aliases:
+            col_aliases = aliases.copy()
+        else:
+            col_aliases = set()
+        if self.select:
+            for col in self.select:
+                if isinstance(col, (list, tuple)):
+                    r = '%s.%s' % (qn(col[0]), qn(col[1]))
+                    if with_aliases and col[1] in col_aliases:
+                        c_alias = 'Col%d' % len(col_aliases)
+                        result.append('%s AS %s' % (r, c_alias))
+                        aliases.add(c_alias)
+                        col_aliases.add(c_alias)
+                    else:
+                        result.append(r)
+                        aliases.add(r)
+                        col_aliases.add(col[1])
+                else:
+                    result.append(col.as_sql(quote_func=qn))
+                    if hasattr(col, 'alias'):
+                        aliases.add(col.alias)
+                        col_aliases.add(col.alias)
+        elif self.default_cols:
+            cols, new_aliases = self.get_default_columns(with_aliases,
+                    col_aliases)
+            result.extend(cols)
+            aliases.update(new_aliases)
+        for table, col in self.related_select_cols:
+            r = '%s.%s' % (qn(table), qn(col))
+            if with_aliases and col in col_aliases:
+                c_alias = 'Col%d' % len(col_aliases)
+                result.append('%s AS %s' % (r, c_alias))
+                aliases.add(c_alias)
+                col_aliases.add(c_alias)
+            else:
+                result.append(r)
+                aliases.add(r)
+                col_aliases.add(col)
+
+        self._select_aliases = aliases
+        return result
+
+    def get_default_columns(self, with_aliases=False, col_aliases=None,
+            start_alias=None, opts=None, as_pairs=False):
+        """
+        Computes the default columns for selecting every field in the base
+        model.
+
+        Returns a list of strings, quoted appropriately for use in SQL
+        directly, as well as a set of aliases used in the select statement (if
+        'as_pairs' is True, returns a list of (alias, col_name) pairs instead
+        of strings as the first component and None as the second component).
+        """
+        result = []
+        if opts is None:
+            opts = self.model._meta
+        if start_alias:
+            table_alias = start_alias
+        else:
+            table_alias = self.tables[0]
+        root_pk = opts.pk.column
+        seen = {None: table_alias}
+        qn = self.quote_name_unless_alias
+        qn2 = self.connection.ops.quote_name
+        aliases = set()
+        for field, model in opts.get_fields_with_model():
+            try:
+                alias = seen[model]
+            except KeyError:
+                alias = self.join((table_alias, model._meta.db_table,
+                        root_pk, model._meta.pk.column))
+                seen[model] = alias
+            if as_pairs:
+                result.append((alias, field.column))
+                continue
+            if with_aliases and field.column in col_aliases:
+                c_alias = 'Col%d' % len(col_aliases)
+                result.append('%s.%s AS %s' % (qn(alias),
+                    qn2(field.column), c_alias))
+                col_aliases.add(c_alias)
+                aliases.add(c_alias)
+            else:
+                r = '%s.%s' % (qn(alias), qn2(field.column))
+                result.append(r)
+                aliases.add(r)
+                if with_aliases:
+                    col_aliases.add(field.column)
+        if as_pairs:
+            return result, None
+        return result, aliases
+
+    def get_from_clause(self):
+        """
+        Returns a list of strings that are joined together to go after the
+        "FROM" part of the query, as well as a list any extra parameters that
+        need to be included. Sub-classes, can override this to create a
+        from-clause via a "select", for example (e.g. CountQuery).
+
+        This should only be called after any SQL construction methods that
+        might change the tables we need. This means the select columns and
+        ordering must be done first.
+        """
+        result = []
+        qn = self.quote_name_unless_alias
+        qn2 = self.connection.ops.quote_name
+        first = True
+        for alias in self.tables:
+            if not self.alias_refcount[alias]:
+                continue
+            try:
+                name, alias, join_type, lhs, lhs_col, col, nullable = self.alias_map[alias]
+            except KeyError:
+                # Extra tables can end up in self.tables, but not in the
+                # alias_map if they aren't in a join. That's OK. We skip them.
+                continue
+            alias_str = (alias != name and ' %s' % alias or '')
+            if join_type and not first:
+                result.append('%s %s%s ON (%s.%s = %s.%s)'
+                        % (join_type, qn(name), alias_str, qn(lhs),
+                           qn2(lhs_col), qn(alias), qn2(col)))
+            else:
+                connector = not first and ', ' or ''
+                result.append('%s%s%s' % (connector, qn(name), alias_str))
+            first = False
+        for t in self.extra_tables:
+            alias, unused = self.table_alias(t)
+            # Only add the alias if it's not already present (the table_alias()
+            # calls increments the refcount, so an alias refcount of one means
+            # this is the only reference.
+            if alias not in self.alias_map or self.alias_refcount[alias] == 1:
+                connector = not first and ', ' or ''
+                result.append('%s%s' % (connector, qn(alias)))
+                first = False
+        return result, []
+
+    def get_grouping(self):
+        """
+        Returns a tuple representing the SQL elements in the "group by" clause.
+        """
+        qn = self.quote_name_unless_alias
+        result = []
+        for col in self.group_by:
+            if isinstance(col, (list, tuple)):
+                result.append('%s.%s' % (qn(col[0]), qn(col[1])))
+            elif hasattr(col, 'as_sql'):
+                result.append(col.as_sql(qn))
+            else:
+                result.append(str(col))
+        return result
+
+    def get_ordering(self):
+        """
+        Returns list representing the SQL elements in the "order by" clause.
+        Also sets the ordering_aliases attribute on this instance to a list of
+        extra aliases needed in the select.
+
+        Determining the ordering SQL can change the tables we need to include,
+        so this should be run *before* get_from_clause().
+        """
+        if self.extra_order_by:
+            ordering = self.extra_order_by
+        elif not self.default_ordering:
+            ordering = []
+        else:
+            ordering = self.order_by or self.model._meta.ordering
+        qn = self.quote_name_unless_alias
+        qn2 = self.connection.ops.quote_name
+        distinct = self.distinct
+        select_aliases = self._select_aliases
+        result = []
+        ordering_aliases = []
+        if self.standard_ordering:
+            asc, desc = ORDER_DIR['ASC']
+        else:
+            asc, desc = ORDER_DIR['DESC']
+        for field in ordering:
+            if field == '?':
+                result.append(self.connection.ops.random_function_sql())
+                continue
+            if isinstance(field, int):
+                if field < 0:
+                    order = desc
+                    field = -field
+                else:
+                    order = asc
+                result.append('%s %s' % (field, order))
+                continue
+            if '.' in field:
+                # This came in through an extra(order_by=...) addition. Pass it
+                # on verbatim.
+                col, order = get_order_dir(field, asc)
+                table, col = col.split('.', 1)
+                elt = '%s.%s' % (qn(table), col)
+                if not distinct or elt in select_aliases:
+                    result.append('%s %s' % (elt, order))
+            elif get_order_dir(field)[0] not in self.extra_select:
+                # 'col' is of the form 'field' or 'field1__field2' or
+                # '-field1__field2__field', etc.
+                for table, col, order in self.find_ordering_name(field,
+                        self.model._meta, default_order=asc):
+                    elt = '%s.%s' % (qn(table), qn2(col))
+                    if distinct and elt not in select_aliases:
+                        ordering_aliases.append(elt)
+                    result.append('%s %s' % (elt, order))
+            else:
+                col, order = get_order_dir(field, asc)
+                elt = qn(col)
+                if distinct and elt not in select_aliases:
+                    ordering_aliases.append(elt)
+                result.append('%s %s' % (elt, order))
+        self.ordering_aliases = ordering_aliases
+        return result
+
+    def find_ordering_name(self, name, opts, alias=None, default_order='ASC',
+            already_seen=None):
+        """
+        Returns the table alias (the name might be ambiguous, the alias will
+        not be) and column name for ordering by the given 'name' parameter.
+        The 'name' is of the form 'field1__field2__...__fieldN'.
+        """
+        name, order = get_order_dir(name, default_order)
+        pieces = name.split(LOOKUP_SEP)
+        if not alias:
+            alias = self.get_initial_alias()
+        field, target, opts, joins, last = self.setup_joins(pieces, opts,
+                alias, False)
+        alias = joins[-1]
+        col = target.column
+        if not field.rel:
+            # To avoid inadvertent trimming of a necessary alias, use the
+            # refcount to show that we are referencing a non-relation field on
+            # the model.
+            self.ref_alias(alias)
+
+        # Must use left outer joins for nullable fields.
+        for join in joins:
+            self.promote_alias(join)
+
+        # If we get to this point and the field is a relation to another model,
+        # append the default ordering for that model.
+        if field.rel and len(joins) > 1 and opts.ordering:
+            # Firstly, avoid infinite loops.
+            if not already_seen:
+                already_seen = set()
+            join_tuple = tuple([self.alias_map[j][TABLE_NAME] for j in joins])
+            if join_tuple in already_seen:
+                raise FieldError('Infinite loop caused by ordering.')
+            already_seen.add(join_tuple)
+
+            results = []
+            for item in opts.ordering:
+                results.extend(self.find_ordering_name(item, opts, alias,
+                        order, already_seen))
+            return results
+
+        if alias:
+            # We have to do the same "final join" optimisation as in
+            # add_filter, since the final column might not otherwise be part of
+            # the select set (so we can't order on it).
+            while 1:
+                join = self.alias_map[alias]
+                if col != join[RHS_JOIN_COL]:
+                    break
+                self.unref_alias(alias)
+                alias = join[LHS_ALIAS]
+                col = join[LHS_JOIN_COL]
+        return [(alias, col, order)]
+
+    def table_alias(self, table_name, create=False):
+        """
+        Returns a table alias for the given table_name and whether this is a
+        new alias or not.
+
+        If 'create' is true, a new alias is always created. Otherwise, the
+        most recently created alias for the table (if one exists) is reused.
+        """
+        current = self.table_map.get(table_name)
+        if not create and current:
+            alias = current[0]
+            self.alias_refcount[alias] += 1
+            return alias, False
+
+        # Create a new alias for this table.
+        if current:
+            alias = '%s%d' % (self.alias_prefix, len(self.alias_map) + 1)
+            current.append(alias)
+        else:
+            # The first occurence of a table uses the table name directly.
+            alias = table_name
+            self.table_map[alias] = [alias]
+        self.alias_refcount[alias] = 1
+        #self.alias_map[alias] = None
+        self.tables.append(alias)
+        return alias, True
+
+    def ref_alias(self, alias):
+        """ Increases the reference count for this alias. """
+        self.alias_refcount[alias] += 1
+
+    def unref_alias(self, alias):
+        """ Decreases the reference count for this alias. """
+        self.alias_refcount[alias] -= 1
+
+    def promote_alias(self, alias, unconditional=False):
+        """
+        Promotes the join type of an alias to an outer join if it's possible
+        for the join to contain NULL values on the left. If 'unconditional' is
+        False, the join is only promoted if it is nullable, otherwise it is
+        always promoted.
+
+        Returns True if the join was promoted.
+        """
+        if ((unconditional or self.alias_map[alias][NULLABLE]) and
+                self.alias_map[alias] != self.LOUTER):
+            data = list(self.alias_map[alias])
+            data[JOIN_TYPE] = self.LOUTER
+            self.alias_map[alias] = tuple(data)
+            return True
+        return False
+
+    def change_aliases(self, change_map):
+        """
+        Changes the aliases in change_map (which maps old-alias -> new-alias),
+        relabelling any references to them in select columns and the where
+        clause.
+        """
+        assert set(change_map.keys()).intersection(set(change_map.values())) == set()
+
+        # 1. Update references in "select" and "where".
+        self.where.relabel_aliases(change_map)
+        for pos, col in enumerate(self.select):
+            if isinstance(col, (list, tuple)):
+                self.select[pos] = (change_map.get(old_alias, old_alias), col[1])
+            else:
+                col.relabel_aliases(change_map)
+
+        # 2. Rename the alias in the internal table/alias datastructures.
+        for old_alias, new_alias in change_map.iteritems():
+            alias_data = list(self.alias_map[old_alias])
+            alias_data[RHS_ALIAS] = new_alias
+
+            t = self.rev_join_map[old_alias]
+            data = list(self.join_map[t])
+            data[data.index(old_alias)] = new_alias
+            self.join_map[t] = tuple(data)
+            self.rev_join_map[new_alias] = t
+            del self.rev_join_map[old_alias]
+            self.alias_refcount[new_alias] = self.alias_refcount[old_alias]
+            del self.alias_refcount[old_alias]
+            self.alias_map[new_alias] = tuple(alias_data)
+            del self.alias_map[old_alias]
+
+            table_aliases = self.table_map[alias_data[TABLE_NAME]]
+            for pos, alias in enumerate(table_aliases):
+                if alias == old_alias:
+                    table_aliases[pos] = new_alias
+                    break
+            for pos, alias in enumerate(self.tables):
+                if alias == old_alias:
+                    self.tables[pos] = new_alias
+                    break
+
+        # 3. Update any joins that refer to the old alias.
+        for alias, data in self.alias_map.iteritems():
+            lhs = data[LHS_ALIAS]
+            if lhs in change_map:
+                data = list(data)
+                data[LHS_ALIAS] = change_map[lhs]
+                self.alias_map[alias] = tuple(data)
+
+    def bump_prefix(self, exceptions=()):
+        """
+        Changes the alias prefix to the next letter in the alphabet and
+        relabels all the aliases. Even tables that previously had no alias will
+        get an alias after this call (it's mostly used for nested queries and
+        the outer query will already be using the non-aliased table name).
+
+        Subclasses who create their own prefix should override this method to
+        produce a similar result (a new prefix and relabelled aliases).
+
+        The 'exceptions' parameter is a container that holds alias names which
+        should not be changed.
+        """
+        assert ord(self.alias_prefix) < ord('Z')
+        self.alias_prefix = chr(ord(self.alias_prefix) + 1)
+        change_map = {}
+        prefix = self.alias_prefix
+        for pos, alias in enumerate(self.tables):
+            if alias in exceptions:
+                continue
+            new_alias = '%s%d' % (prefix, pos)
+            change_map[alias] = new_alias
+            self.tables[pos] = new_alias
+        self.change_aliases(change_map)
+
+    def get_initial_alias(self):
+        """
+        Returns the first alias for this query, after increasing its reference
+        count.
+        """
+        if self.tables:
+            alias = self.tables[0]
+            self.ref_alias(alias)
+        else:
+            alias = self.join((None, self.model._meta.db_table, None, None))
+        return alias
+
+    def count_active_tables(self):
+        """
+        Returns the number of tables in this query with a non-zero reference
+        count.
+        """
+        return len([1 for count in self.alias_refcount.itervalues() if count])
+
+    def join(self, connection, always_create=False, exclusions=(),
+            promote=False, outer_if_first=False, nullable=False, reuse=None):
+        """
+        Returns an alias for the join in 'connection', either reusing an
+        existing alias for that join or creating a new one. 'connection' is a
+        tuple (lhs, table, lhs_col, col) where 'lhs' is either an existing
+        table alias or a table name. The join correspods to the SQL equivalent
+        of::
+
+            lhs.lhs_col = table.col
+
+        If 'always_create' is True and 'reuse' is None, a new alias is always
+        created, regardless of whether one already exists or not. Otherwise
+        'reuse' must be a set and a new join is created unless one of the
+        aliases in `reuse` can be used.
+
+        If 'exclusions' is specified, it is something satisfying the container
+        protocol ("foo in exclusions" must work) and specifies a list of
+        aliases that should not be returned, even if they satisfy the join.
+
+        If 'promote' is True, the join type for the alias will be LOUTER (if
+        the alias previously existed, the join type will be promoted from INNER
+        to LOUTER, if necessary).
+
+        If 'outer_if_first' is True and a new join is created, it will have the
+        LOUTER join type. This is used when joining certain types of querysets
+        and Q-objects together.
+
+        If 'nullable' is True, the join can potentially involve NULL values and
+        is a candidate for promotion (to "left outer") when combining querysets.
+        """
+        lhs, table, lhs_col, col = connection
+        if lhs in self.alias_map:
+            lhs_table = self.alias_map[lhs][TABLE_NAME]
+        else:
+            lhs_table = lhs
+
+        if reuse and always_create and table in self.table_map:
+            # Convert the 'reuse' to case to be "exclude everything but the
+            # reusable set, minus exclusions, for this table".
+            exclusions = set(self.table_map[table]).difference(reuse).union(set(exclusions))
+            always_create = False
+        t_ident = (lhs_table, table, lhs_col, col)
+        if not always_create:
+            for alias in self.join_map.get(t_ident, ()):
+                if alias not in exclusions:
+                    if lhs_table and not self.alias_refcount[self.alias_map[alias][LHS_ALIAS]]:
+                        # The LHS of this join tuple is no longer part of the
+                        # query, so skip this possibility.
+                        continue
+                    self.ref_alias(alias)
+                    if promote:
+                        self.promote_alias(alias)
+                    return alias
+
+        # No reuse is possible, so we need a new alias.
+        alias, _ = self.table_alias(table, True)
+        if not lhs:
+            # Not all tables need to be joined to anything. No join type
+            # means the later columns are ignored.
+            join_type = None
+        elif promote or outer_if_first:
+            join_type = self.LOUTER
+        else:
+            join_type = self.INNER
+        join = (table, alias, join_type, lhs, lhs_col, col, nullable)
+        self.alias_map[alias] = join
+        if t_ident in self.join_map:
+            self.join_map[t_ident] += (alias,)
+        else:
+            self.join_map[t_ident] = (alias,)
+        self.rev_join_map[alias] = t_ident
+        return alias
+
+    def fill_related_selections(self, opts=None, root_alias=None, cur_depth=1,
+            used=None, requested=None, restricted=None, nullable=None,
+            dupe_set=None):
+        """
+        Fill in the information needed for a select_related query. The current
+        depth is measured as the number of connections away from the root model
+        (for example, cur_depth=1 means we are looking at models with direct
+        connections to the root model).
+        """
+        if not restricted and self.max_depth and cur_depth > self.max_depth:
+            # We've recursed far enough; bail out.
+            return
+
+        if not opts:
+            opts = self.get_meta()
+            root_alias = self.get_initial_alias()
+            self.related_select_cols = []
+            self.related_select_fields = []
+        if not used:
+            used = set()
+        if dupe_set is None:
+            dupe_set = set()
+        orig_dupe_set = dupe_set
+        orig_used = used
+
+        # Setup for the case when only particular related fields should be
+        # included in the related selection.
+        if requested is None and restricted is not False:
+            if isinstance(self.select_related, dict):
+                requested = self.select_related
+                restricted = True
+            else:
+                restricted = False
+
+        for f, model in opts.get_fields_with_model():
+            if not select_related_descend(f, restricted, requested):
+                continue
+            dupe_set = orig_dupe_set.copy()
+            used = orig_used.copy()
+            table = f.rel.to._meta.db_table
+            if nullable or f.null:
+                promote = True
+            else:
+                promote = False
+            if model:
+                int_opts = opts
+                alias = root_alias
+                for int_model in opts.get_base_chain(model):
+                    lhs_col = int_opts.parents[int_model].column
+                    dedupe = lhs_col in opts.duplicate_targets
+                    if dedupe:
+                        used.update(self.dupe_avoidance.get(id(opts), lhs_col),
+                                ())
+                        dupe_set.add((opts, lhs_col))
+                    int_opts = int_model._meta
+                    alias = self.join((alias, int_opts.db_table, lhs_col,
+                            int_opts.pk.column), exclusions=used,
+                            promote=promote)
+                    for (dupe_opts, dupe_col) in dupe_set:
+                        self.update_dupe_avoidance(dupe_opts, dupe_col, alias)
+            else:
+                alias = root_alias
+
+            dedupe = f.column in opts.duplicate_targets
+            if dupe_set or dedupe:
+                used.update(self.dupe_avoidance.get((id(opts), f.column), ()))
+                if dedupe:
+                    dupe_set.add((opts, f.column))
+
+            alias = self.join((alias, table, f.column,
+                    f.rel.get_related_field().column), exclusions=used,
+                    promote=promote)
+            used.add(alias)
+            self.related_select_cols.extend(self.get_default_columns(
+                start_alias=alias, opts=f.rel.to._meta, as_pairs=True)[0])
+            self.related_select_fields.extend(f.rel.to._meta.fields)
+            if restricted:
+                next = requested.get(f.name, {})
+            else:
+                next = False
+            if f.null is not None:
+                new_nullable = f.null
+            else:
+                new_nullable = None
+            for dupe_opts, dupe_col in dupe_set:
+                self.update_dupe_avoidance(dupe_opts, dupe_col, alias)
+            self.fill_related_selections(f.rel.to._meta, alias, cur_depth + 1,
+                    used, next, restricted, new_nullable, dupe_set)
+
+    def add_filter(self, filter_expr, connector=AND, negate=False, trim=False,
+            can_reuse=None):
+        """
+        Add a single filter to the query. The 'filter_expr' is a pair:
+        (filter_string, value). E.g. ('name__contains', 'fred')
+
+        If 'negate' is True, this is an exclude() filter. It's important to
+        note that this method does not negate anything in the where-clause
+        object when inserting the filter constraints. This is because negated
+        filters often require multiple calls to add_filter() and the negation
+        should only happen once. So the caller is responsible for this (the
+        caller will normally be add_q(), so that as an example).
+
+        If 'trim' is True, we automatically trim the final join group (used
+        internally when constructing nested queries).
+
+        If 'can_reuse' is a set, we are processing a component of a
+        multi-component filter (e.g. filter(Q1, Q2)). In this case, 'can_reuse'
+        will be a set of table aliases that can be reused in this filter, even
+        if we would otherwise force the creation of new aliases for a join
+        (needed for nested Q-filters). The set is updated by this method.
+        """
+        arg, value = filter_expr
+        parts = arg.split(LOOKUP_SEP)
+        if not parts:
+            raise FieldError("Cannot parse keyword query %r" % arg)
+
+        # Work out the lookup type and remove it from 'parts', if necessary.
+        if len(parts) == 1 or parts[-1] not in self.query_terms:
+            lookup_type = 'exact'
+        else:
+            lookup_type = parts.pop()
+
+        # Interpret '__exact=None' as the sql 'is NULL'; otherwise, reject all
+        # uses of None as a query value.
+        if value is None:
+            if lookup_type != 'exact':
+                raise ValueError("Cannot use None as a query value")
+            lookup_type = 'isnull'
+            value = True
+        elif callable(value):
+            value = value()
+
+        opts = self.get_meta()
+        alias = self.get_initial_alias()
+        allow_many = trim or not negate
+
+        try:
+            field, target, opts, join_list, last = self.setup_joins(parts, opts,
+                    alias, True, allow_many, can_reuse=can_reuse)
+        except MultiJoin, e:
+            self.split_exclude(filter_expr, LOOKUP_SEP.join(parts[:e.level]))
+            return
+        final = len(join_list)
+        penultimate = last.pop()
+        if penultimate == final:
+            penultimate = last.pop()
+        if trim and len(join_list) > 1:
+            extra = join_list[penultimate:]
+            join_list = join_list[:penultimate]
+            final = penultimate
+            penultimate = last.pop()
+            col = self.alias_map[extra[0]][LHS_JOIN_COL]
+            for alias in extra:
+                self.unref_alias(alias)
+        else:
+            col = target.column
+        alias = join_list[-1]
+
+        while final > 1:
+            # An optimization: if the final join is against the same column as
+            # we are comparing against, we can go back one step in the join
+            # chain and compare against the lhs of the join instead (and then
+            # repeat the optimization). The result, potentially, involves less
+            # table joins.
+            join = self.alias_map[alias]
+            if col != join[RHS_JOIN_COL]:
+                break
+            self.unref_alias(alias)
+            alias = join[LHS_ALIAS]
+            col = join[LHS_JOIN_COL]
+            join_list = join_list[:-1]
+            final -= 1
+            if final == penultimate:
+                penultimate = last.pop()
+
+        if (lookup_type == 'isnull' and value is True and not negate and
+                final > 1):
+            # If the comparison is against NULL, we need to use a left outer
+            # join when connecting to the previous model. We make that
+            # adjustment here. We don't do this unless needed as it's less
+            # efficient at the database level.
+            self.promote_alias(join_list[penultimate])
+
+        if connector == OR:
+            # Some joins may need to be promoted when adding a new filter to a
+            # disjunction. We walk the list of new joins and where it diverges
+            # from any previous joins (ref count is 1 in the table list), we
+            # make the new additions (and any existing ones not used in the new
+            # join list) an outer join.
+            join_it = iter(join_list)
+            table_it = iter(self.tables)
+            join_it.next(), table_it.next()
+            table_promote = False
+            for join in join_it:
+                table = table_it.next()
+                if join == table and self.alias_refcount[join] > 1:
+                    continue
+                join_promote = self.promote_alias(join)
+                if table != join:
+                    table_promote = self.promote_alias(table)
+                break
+            for join in join_it:
+                if self.promote_alias(join, join_promote):
+                    join_promote = True
+            for table in table_it:
+                # Some of these will have been promoted from the join_list, but
+                # that's harmless.
+                if self.promote_alias(table, table_promote):
+                    table_promote = True
+
+        self.where.add((alias, col, field, lookup_type, value), connector)
+
+        if negate:
+            for alias in join_list:
+                self.promote_alias(alias)
+            if lookup_type != 'isnull':
+                if final > 1:
+                    for alias in join_list:
+                        if self.alias_map[alias][JOIN_TYPE] == self.LOUTER:
+                            j_col = self.alias_map[alias][RHS_JOIN_COL]
+                            entry = self.where_class()
+                            entry.add((alias, j_col, None, 'isnull', True), AND)
+                            entry.negate()
+                            self.where.add(entry, AND)
+                            break
+                elif not (lookup_type == 'in' and not value) and field.null:
+                    # Leaky abstraction artifact: We have to specifically
+                    # exclude the "foo__in=[]" case from this handling, because
+                    # it's short-circuited in the Where class.
+                    entry = self.where_class()
+                    entry.add((alias, col, None, 'isnull', True), AND)
+                    entry.negate()
+                    self.where.add(entry, AND)
+
+        if can_reuse is not None:
+            can_reuse.update(join_list)
+
+    def add_q(self, q_object, used_aliases=None):
+        """
+        Adds a Q-object to the current filter.
+
+        Can also be used to add anything that has an 'add_to_query()' method.
+        """
+        if used_aliases is None:
+            used_aliases = self.used_aliases
+        if hasattr(q_object, 'add_to_query'):
+            # Complex custom objects are responsible for adding themselves.
+            q_object.add_to_query(self, used_aliases)
+        else:
+            if self.where and q_object.connector != AND and len(q_object) > 1:
+                self.where.start_subtree(AND)
+                subtree = True
+            else:
+                subtree = False
+            connector = AND
+            for child in q_object.children:
+                if isinstance(child, Node):
+                    self.where.start_subtree(connector)
+                    self.add_q(child, used_aliases)
+                    self.where.end_subtree()
+                else:
+                    self.add_filter(child, connector, q_object.negated,
+                            can_reuse=used_aliases)
+                connector = q_object.connector
+            if q_object.negated:
+                self.where.negate()
+            if subtree:
+                self.where.end_subtree()
+        if self.filter_is_sticky:
+            self.used_aliases = used_aliases
+
+    def setup_joins(self, names, opts, alias, dupe_multis, allow_many=True,
+            allow_explicit_fk=False, can_reuse=None):
+        """
+        Compute the necessary table joins for the passage through the fields
+        given in 'names'. 'opts' is the Options class for the current model
+        (which gives the table we are joining to), 'alias' is the alias for the
+        table we are joining to. If dupe_multis is True, any many-to-many or
+        many-to-one joins will always create a new alias (necessary for
+        disjunctive filters). If can_reuse is not None, it's a list of aliases
+        that can be reused in these joins (nothing else can be reused in this
+        case).
+
+        Returns the final field involved in the join, the target database
+        column (used for any 'where' constraint), the final 'opts' value and the
+        list of tables joined.
+        """
+        joins = [alias]
+        last = [0]
+        dupe_set = set()
+        exclusions = set()
+        for pos, name in enumerate(names):
+            try:
+                exclusions.add(int_alias)
+            except NameError:
+                pass
+            exclusions.add(alias)
+            last.append(len(joins))
+            if name == 'pk':
+                name = opts.pk.name
+
+            try:
+                field, model, direct, m2m = opts.get_field_by_name(name)
+            except FieldDoesNotExist:
+                for f in opts.fields:
+                    if allow_explicit_fk and name == f.attname:
+                        # XXX: A hack to allow foo_id to work in values() for
+                        # backwards compatibility purposes. If we dropped that
+                        # feature, this could be removed.
+                        field, model, direct, m2m = opts.get_field_by_name(f.name)
+                        break
+                else:
+                    names = opts.get_all_field_names()
+                    raise FieldError("Cannot resolve keyword %r into field. "
+                            "Choices are: %s" % (name, ", ".join(names)))
+
+            if not allow_many and (m2m or not direct):
+                for alias in joins:
+                    self.unref_alias(alias)
+                raise MultiJoin(pos + 1)
+            if model:
+                # The field lives on a base class of the current model.
+                for int_model in opts.get_base_chain(model):
+                    lhs_col = opts.parents[int_model].column
+                    dedupe = lhs_col in opts.duplicate_targets
+                    if dedupe:
+                        exclusions.update(self.dupe_avoidance.get(
+                                (id(opts), lhs_col), ()))
+                        dupe_set.add((opts, lhs_col))
+                    opts = int_model._meta
+                    alias = self.join((alias, opts.db_table, lhs_col,
+                            opts.pk.column), exclusions=exclusions)
+                    joins.append(alias)
+                    exclusions.add(alias)
+                    for (dupe_opts, dupe_col) in dupe_set:
+                        self.update_dupe_avoidance(dupe_opts, dupe_col, alias)
+            cached_data = opts._join_cache.get(name)
+            orig_opts = opts
+            dupe_col = direct and field.column or field.field.column
+            dedupe = dupe_col in opts.duplicate_targets
+            if dupe_set or dedupe:
+                if dedupe:
+                    dupe_set.add((opts, dupe_col))
+                exclusions.update(self.dupe_avoidance.get((id(opts), dupe_col),
+                        ()))
+
+            if direct:
+                if m2m:
+                    # Many-to-many field defined on the current model.
+                    if cached_data:
+                        (table1, from_col1, to_col1, table2, from_col2,
+                                to_col2, opts, target) = cached_data
+                    else:
+                        table1 = field.m2m_db_table()
+                        from_col1 = opts.pk.column
+                        to_col1 = field.m2m_column_name()
+                        opts = field.rel.to._meta
+                        table2 = opts.db_table
+                        from_col2 = field.m2m_reverse_name()
+                        to_col2 = opts.pk.column
+                        target = opts.pk
+                        orig_opts._join_cache[name] = (table1, from_col1,
+                                to_col1, table2, from_col2, to_col2, opts,
+                                target)
+
+                    int_alias = self.join((alias, table1, from_col1, to_col1),
+                            dupe_multis, exclusions, nullable=True,
+                            reuse=can_reuse)
+                    alias = self.join((int_alias, table2, from_col2, to_col2),
+                            dupe_multis, exclusions, nullable=True,
+                            reuse=can_reuse)
+                    joins.extend([int_alias, alias])
+                elif field.rel:
+                    # One-to-one or many-to-one field
+                    if cached_data:
+                        (table, from_col, to_col, opts, target) = cached_data
+                    else:
+                        opts = field.rel.to._meta
+                        target = field.rel.get_related_field()
+                        table = opts.db_table
+                        from_col = field.column
+                        to_col = target.column
+                        orig_opts._join_cache[name] = (table, from_col, to_col,
+                                opts, target)
+
+                    alias = self.join((alias, table, from_col, to_col),
+                            exclusions=exclusions, nullable=field.null)
+                    joins.append(alias)
+                else:
+                    # Non-relation fields.
+                    target = field
+                    break
+            else:
+                orig_field = field
+                field = field.field
+                if m2m:
+                    # Many-to-many field defined on the target model.
+                    if cached_data:
+                        (table1, from_col1, to_col1, table2, from_col2,
+                                to_col2, opts, target) = cached_data
+                    else:
+                        table1 = field.m2m_db_table()
+                        from_col1 = opts.pk.column
+                        to_col1 = field.m2m_reverse_name()
+                        opts = orig_field.opts
+                        table2 = opts.db_table
+                        from_col2 = field.m2m_column_name()
+                        to_col2 = opts.pk.column
+                        target = opts.pk
+                        orig_opts._join_cache[name] = (table1, from_col1,
+                                to_col1, table2, from_col2, to_col2, opts,
+                                target)
+
+                    int_alias = self.join((alias, table1, from_col1, to_col1),
+                            dupe_multis, exclusions, nullable=True,
+                            reuse=can_reuse)
+                    alias = self.join((int_alias, table2, from_col2, to_col2),
+                            dupe_multis, exclusions, nullable=True,
+                            reuse=can_reuse)
+                    joins.extend([int_alias, alias])
+                else:
+                    # One-to-many field (ForeignKey defined on the target model)
+                    if cached_data:
+                        (table, from_col, to_col, opts, target) = cached_data
+                    else:
+                        local_field = opts.get_field_by_name(
+                                field.rel.field_name)[0]
+                        opts = orig_field.opts
+                        table = opts.db_table
+                        from_col = local_field.column
+                        to_col = field.column
+                        target = opts.pk
+                        orig_opts._join_cache[name] = (table, from_col, to_col,
+                                opts, target)
+
+                    alias = self.join((alias, table, from_col, to_col),
+                            dupe_multis, exclusions, nullable=True,
+                            reuse=can_reuse)
+                    joins.append(alias)
+
+            for (dupe_opts, dupe_col) in dupe_set:
+                try:
+                    self.update_dupe_avoidance(dupe_opts, dupe_col, int_alias)
+                except NameError:
+                    self.update_dupe_avoidance(dupe_opts, dupe_col, alias)
+
+        if pos != len(names) - 1:
+            raise FieldError("Join on field %r not permitted." % name)
+
+        return field, target, opts, joins, last
+
+    def update_dupe_avoidance(self, opts, col, alias):
+        """
+        For a column that is one of multiple pointing to the same table, update
+        the internal data structures to note that this alias shouldn't be used
+        for those other columns.
+        """
+        ident = id(opts)
+        for name in opts.duplicate_targets[col]:
+            try:
+                self.dupe_avoidance[ident, name].add(alias)
+            except KeyError:
+                self.dupe_avoidance[ident, name] = set([alias])
+
+    def split_exclude(self, filter_expr, prefix):
+        """
+        When doing an exclude against any kind of N-to-many relation, we need
+        to use a subquery. This method constructs the nested query, given the
+        original exclude filter (filter_expr) and the portion up to the first
+        N-to-many relation field.
+        """
+        query = Query(self.model, self.connection)
+        query.add_filter(filter_expr)
+        query.set_start(prefix)
+        query.clear_ordering(True)
+        self.add_filter(('%s__in' % prefix, query), negate=True, trim=True)
+
+    def set_limits(self, low=None, high=None):
+        """
+        Adjusts the limits on the rows retrieved. We use low/high to set these,
+        as it makes it more Pythonic to read and write. When the SQL query is
+        created, they are converted to the appropriate offset and limit values.
+
+        Any limits passed in here are applied relative to the existing
+        constraints. So low is added to the current low value and both will be
+        clamped to any existing high value.
+        """
+        if high is not None:
+            if self.high_mark:
+                self.high_mark = min(self.high_mark, self.low_mark + high)
+            else:
+                self.high_mark = self.low_mark + high
+        if low is not None:
+            if self.high_mark:
+                self.low_mark = min(self.high_mark, self.low_mark + low)
+            else:
+                self.low_mark = self.low_mark + low
+
+    def clear_limits(self):
+        """
+        Clears any existing limits.
+        """
+        self.low_mark, self.high_mark = 0, None
+
+    def can_filter(self):
+        """
+        Returns True if adding filters to this instance is still possible.
+
+        Typically, this means no limits or offsets have been put on the results.
+        """
+        return not (self.low_mark or self.high_mark)
+
+    def add_fields(self, field_names, allow_m2m=True):
+        """
+        Adds the given (model) fields to the select set. The field names are
+        added in the order specified.
+        """
+        alias = self.get_initial_alias()
+        opts = self.get_meta()
+        try:
+            for name in field_names:
+                field, target, u2, joins, u3 = self.setup_joins(
+                        name.split(LOOKUP_SEP), opts, alias, False, allow_m2m,
+                        True)
+                final_alias = joins[-1]
+                col = target.column
+                if len(joins) > 1:
+                    join = self.alias_map[final_alias]
+                    if col == join[RHS_JOIN_COL]:
+                        self.unref_alias(final_alias)
+                        final_alias = join[LHS_ALIAS]
+                        col = join[LHS_JOIN_COL]
+                        joins = joins[:-1]
+                promote = False
+                for join in joins[1:]:
+                    # Only nullable aliases are promoted, so we don't end up
+                    # doing unnecessary left outer joins here.
+                    if self.promote_alias(join, promote):
+                        promote = True
+                self.select.append((final_alias, col))
+                self.select_fields.append(field)
+        except MultiJoin:
+            raise FieldError("Invalid field name: '%s'" % name)
+        except FieldError:
+            names = opts.get_all_field_names() + self.extra_select.keys()
+            names.sort()
+            raise FieldError("Cannot resolve keyword %r into field. "
+                    "Choices are: %s" % (name, ", ".join(names)))
+
+    def add_ordering(self, *ordering):
+        """
+        Adds items from the 'ordering' sequence to the query's "order by"
+        clause. These items are either field names (not column names) --
+        possibly with a direction prefix ('-' or '?') -- or ordinals,
+        corresponding to column positions in the 'select' list.
+
+        If 'ordering' is empty, all ordering is cleared from the query.
+        """
+        errors = []
+        for item in ordering:
+            if not ORDER_PATTERN.match(item):
+                errors.append(item)
+        if errors:
+            raise FieldError('Invalid order_by arguments: %s' % errors)
+        if ordering:
+            self.order_by.extend(ordering)
+        else:
+            self.default_ordering = False
+
+    def clear_ordering(self, force_empty=False):
+        """
+        Removes any ordering settings. If 'force_empty' is True, there will be
+        no ordering in the resulting query (not even the model's default).
+        """
+        self.order_by = []
+        self.extra_order_by = ()
+        if force_empty:
+            self.default_ordering = False
+
+    def add_count_column(self):
+        """
+        Converts the query to do count(...) or count(distinct(pk)) in order to
+        get its size.
+        """
+        # TODO: When group_by support is added, this needs to be adjusted so
+        # that it doesn't totally overwrite the select list.
+        if not self.distinct:
+            if not self.select:
+                select = Count()
+            else:
+                assert len(self.select) == 1, \
+                        "Cannot add count col with multiple cols in 'select': %r" % self.select
+                select = Count(self.select[0])
+        else:
+            opts = self.model._meta
+            if not self.select:
+                select = Count((self.join((None, opts.db_table, None, None)),
+                        opts.pk.column), True)
+            else:
+                # Because of SQL portability issues, multi-column, distinct
+                # counts need a sub-query -- see get_count() for details.
+                assert len(self.select) == 1, \
+                        "Cannot add count col with multiple cols in 'select'."
+                select = Count(self.select[0], True)
+
+            # Distinct handling is done in Count(), so don't do it at this
+            # level.
+            self.distinct = False
+        self.select = [select]
+        self.select_fields = [None]
+        self.extra_select = {}
+
+    def add_select_related(self, fields):
+        """
+        Sets up the select_related data structure so that we only select
+        certain related models (as opposed to all models, when
+        self.select_related=True).
+        """
+        field_dict = {}
+        for field in fields:
+            d = field_dict
+            for part in field.split(LOOKUP_SEP):
+                d = d.setdefault(part, {})
+        self.select_related = field_dict
+        self.related_select_cols = []
+        self.related_select_fields = []
+
+    def add_extra(self, select, select_params, where, params, tables, order_by):
+        """
+        Adds data to the various extra_* attributes for user-created additions
+        to the query.
+        """
+        if select:
+            # We need to pair any placeholder markers in the 'select'
+            # dictionary with their parameters in 'select_params' so that
+            # subsequent updates to the select dictionary also adjust the
+            # parameters appropriately.
+            select_pairs = SortedDict()
+            if select_params:
+                param_iter = iter(select_params)
+            else:
+                param_iter = iter([])
+            for name, entry in select.items():
+                entry = force_unicode(entry)
+                entry_params = []
+                pos = entry.find("%s")
+                while pos != -1:
+                    entry_params.append(param_iter.next())
+                    pos = entry.find("%s", pos + 2)
+                select_pairs[name] = (entry, entry_params)
+            # This is order preserving, since self.extra_select is a SortedDict.
+            self.extra_select.update(select_pairs)
+        if where:
+            self.extra_where += tuple(where)
+        if params:
+            self.extra_params += tuple(params)
+        if tables:
+            self.extra_tables += tuple(tables)
+        if order_by:
+            self.extra_order_by = order_by
+
+    def trim_extra_select(self, names):
+        """
+        Removes any aliases in the extra_select dictionary that aren't in
+        'names'.
+
+        This is needed if we are selecting certain values that don't incldue
+        all of the extra_select names.
+        """
+        for key in set(self.extra_select).difference(set(names)):
+            del self.extra_select[key]
+
+    def set_start(self, start):
+        """
+        Sets the table from which to start joining. The start position is
+        specified by the related attribute from the base model. This will
+        automatically set to the select column to be the column linked from the
+        previous table.
+
+        This method is primarily for internal use and the error checking isn't
+        as friendly as add_filter(). Mostly useful for querying directly
+        against the join table of many-to-many relation in a subquery.
+        """
+        opts = self.model._meta
+        alias = self.get_initial_alias()
+        field, col, opts, joins, last = self.setup_joins(
+                start.split(LOOKUP_SEP), opts, alias, False)
+        alias = joins[last[-1]]
+        self.select = [(alias, self.alias_map[alias][RHS_JOIN_COL])]
+        self.select_fields = [field]
+        self.start_meta = opts
+
+        # The call to setup_joins add an extra reference to everything in
+        # joins. So we need to unref everything once, and everything prior to
+        # the final join a second time.
+        for alias in joins:
+            self.unref_alias(alias)
+        for alias in joins[:last[-1]]:
+            self.unref_alias(alias)
+
+    def execute_sql(self, result_type=MULTI):
+        """
+        Run the query against the database and returns the result(s). The
+        return value is a single data item if result_type is SINGLE, or an
+        iterator over the results if the result_type is MULTI.
+
+        result_type is either MULTI (use fetchmany() to retrieve all rows),
+        SINGLE (only retrieve a single row), or None (no results expected, but
+        the cursor is returned, since it's used by subclasses such as
+        InsertQuery).
+        """
+        try:
+            sql, params = self.as_sql()
+            if not sql:
+                raise EmptyResultSet
+        except EmptyResultSet:
+            if result_type == MULTI:
+                return empty_iter()
+            else:
+                return
+
+        cursor = self.connection.cursor()
+        cursor.execute(sql, params)
+
+        if not result_type:
+            return cursor
+        if result_type == SINGLE:
+            if self.ordering_aliases:
+                return cursor.fetchone()[:-len(results.ordering_aliases)]
+            return cursor.fetchone()
+
+        # The MULTI case.
+        if self.ordering_aliases:
+            result = order_modified_iter(cursor, len(self.ordering_aliases),
+                    self.connection.features.empty_fetchmany_value)
+        else:
+            result = iter((lambda: cursor.fetchmany(GET_ITERATOR_CHUNK_SIZE)),
+                    self.connection.features.empty_fetchmany_value)
+        if not self.connection.features.can_use_chunked_reads:
+            # If we are using non-chunked reads, we return the same data
+            # structure as normally, but ensure it is all read into memory
+            # before going any further.
+            return list(result)
+        return result
+
+# Use the backend's custom Query class if it defines one. Otherwise, use the
+# default.
+if connection.features.uses_custom_query_class:
+    Query = connection.ops.query_class(Query)
+
+def get_order_dir(field, default='ASC'):
+    """
+    Returns the field name and direction for an order specification. For
+    example, '-foo' is returned as ('foo', 'DESC').
+
+    The 'default' param is used to indicate which way no prefix (or a '+'
+    prefix) should sort. The '-' prefix always sorts the opposite way.
+    """
+    dirn = ORDER_DIR[default]
+    if field[0] == '-':
+        return field[1:], dirn[1]
+    return field, dirn[0]
+
+def empty_iter():
+    """
+    Returns an iterator containing no results.
+    """
+    yield iter([]).next()
+
+def order_modified_iter(cursor, trim, sentinel):
+    """
+    Yields blocks of rows from a cursor. We use this iterator in the special
+    case when extra output columns have been added to support ordering
+    requirements. We must trim those extra columns before anything else can use
+    the results, since they're only needed to make the SQL valid.
+    """
+    for rows in iter((lambda: cursor.fetchmany(GET_ITERATOR_CHUNK_SIZE)),
+            sentinel):
+        yield [r[:-trim] for r in rows]
+
+def setup_join_cache(sender, **kwargs):
+    """
+    The information needed to join between model fields is something that is
+    invariant over the life of the model, so we cache it in the model's Options
+    class, rather than recomputing it all the time.
+
+    This method initialises the (empty) cache when the model is created.
+    """
+    sender._meta._join_cache = {}
+
+signals.class_prepared.connect(setup_join_cache)
+
diff --git a/webapp/django/db/models/sql/subqueries.py b/webapp/django/db/models/sql/subqueries.py
new file mode 100644
index 0000000..cea2a58
--- /dev/null
+++ b/webapp/django/db/models/sql/subqueries.py
@@ -0,0 +1,411 @@
+"""
+Query subclasses which provide extra functionality beyond simple data retrieval.
+"""
+
+from django.core.exceptions import FieldError
+from django.db.models.sql.constants import *
+from django.db.models.sql.datastructures import Date
+from django.db.models.sql.query import Query
+from django.db.models.sql.where import AND
+
+__all__ = ['DeleteQuery', 'UpdateQuery', 'InsertQuery', 'DateQuery',
+        'CountQuery']
+
+class DeleteQuery(Query):
+    """
+    Delete queries are done through this class, since they are more constrained
+    than general queries.
+    """
+    def as_sql(self):
+        """
+        Creates the SQL for this query. Returns the SQL string and list of
+        parameters.
+        """
+        assert len(self.tables) == 1, \
+                "Can only delete from one table at a time."
+        result = ['DELETE FROM %s' % self.quote_name_unless_alias(self.tables[0])]
+        where, params = self.where.as_sql()
+        result.append('WHERE %s' % where)
+        return ' '.join(result), tuple(params)
+
+    def do_query(self, table, where):
+        self.tables = [table]
+        self.where = where
+        self.execute_sql(None)
+
+    def delete_batch_related(self, pk_list):
+        """
+        Set up and execute delete queries for all the objects related to the
+        primary key values in pk_list. To delete the objects themselves, use
+        the delete_batch() method.
+
+        More than one physical query may be executed if there are a
+        lot of values in pk_list.
+        """
+        from django.contrib.contenttypes import generic
+        cls = self.model
+        for related in cls._meta.get_all_related_many_to_many_objects():
+            if not isinstance(related.field, generic.GenericRelation):
+                for offset in range(0, len(pk_list), GET_ITERATOR_CHUNK_SIZE):
+                    where = self.where_class()
+                    where.add((None, related.field.m2m_reverse_name(),
+                            related.field, 'in',
+                            pk_list[offset : offset+GET_ITERATOR_CHUNK_SIZE]),
+                            AND)
+                    self.do_query(related.field.m2m_db_table(), where)
+
+        for f in cls._meta.many_to_many:
+            w1 = self.where_class()
+            if isinstance(f, generic.GenericRelation):
+                from django.contrib.contenttypes.models import ContentType
+                field = f.rel.to._meta.get_field(f.content_type_field_name)
+                w1.add((None, field.column, field, 'exact',
+                        ContentType.objects.get_for_model(cls).id), AND)
+            for offset in range(0, len(pk_list), GET_ITERATOR_CHUNK_SIZE):
+                where = self.where_class()
+                where.add((None, f.m2m_column_name(), f, 'in',
+                        pk_list[offset : offset + GET_ITERATOR_CHUNK_SIZE]),
+                        AND)
+                if w1:
+                    where.add(w1, AND)
+                self.do_query(f.m2m_db_table(), where)
+
+    def delete_batch(self, pk_list):
+        """
+        Set up and execute delete queries for all the objects in pk_list. This
+        should be called after delete_batch_related(), if necessary.
+
+        More than one physical query may be executed if there are a
+        lot of values in pk_list.
+        """
+        for offset in range(0, len(pk_list), GET_ITERATOR_CHUNK_SIZE):
+            where = self.where_class()
+            field = self.model._meta.pk
+            where.add((None, field.column, field, 'in',
+                    pk_list[offset : offset + GET_ITERATOR_CHUNK_SIZE]), AND)
+            self.do_query(self.model._meta.db_table, where)
+
+class UpdateQuery(Query):
+    """
+    Represents an "update" SQL query.
+    """
+    def __init__(self, *args, **kwargs):
+        super(UpdateQuery, self).__init__(*args, **kwargs)
+        self._setup_query()
+
+    def _setup_query(self):
+        """
+        Runs on initialization and after cloning. Any attributes that would
+        normally be set in __init__ should go in here, instead, so that they
+        are also set up after a clone() call.
+        """
+        self.values = []
+        self.related_ids = None
+        if not hasattr(self, 'related_updates'):
+            self.related_updates = {}
+
+    def clone(self, klass=None, **kwargs):
+        return super(UpdateQuery, self).clone(klass,
+                related_updates=self.related_updates.copy, **kwargs)
+
+    def execute_sql(self, result_type=None):
+        """
+        Execute the specified update. Returns the number of rows affected by
+        the primary update query (there could be other updates on related
+        tables, but their rowcounts are not returned).
+        """
+        cursor = super(UpdateQuery, self).execute_sql(result_type)
+        rows = cursor.rowcount
+        del cursor
+        for query in self.get_related_updates():
+            query.execute_sql(result_type)
+        return rows
+
+    def as_sql(self):
+        """
+        Creates the SQL for this query. Returns the SQL string and list of
+        parameters.
+        """
+        self.pre_sql_setup()
+        if not self.values:
+            return '', ()
+        table = self.tables[0]
+        qn = self.quote_name_unless_alias
+        result = ['UPDATE %s' % qn(table)]
+        result.append('SET')
+        values, update_params = [], []
+        for name, val, placeholder in self.values:
+            if val is not None:
+                values.append('%s = %s' % (qn(name), placeholder))
+                update_params.append(val)
+            else:
+                values.append('%s = NULL' % qn(name))
+        result.append(', '.join(values))
+        where, params = self.where.as_sql()
+        if where:
+            result.append('WHERE %s' % where)
+        return ' '.join(result), tuple(update_params + params)
+
+    def pre_sql_setup(self):
+        """
+        If the update depends on results from other tables, we need to do some
+        munging of the "where" conditions to match the format required for
+        (portable) SQL updates. That is done here.
+
+        Further, if we are going to be running multiple updates, we pull out
+        the id values to update at this point so that they don't change as a
+        result of the progressive updates.
+        """
+        self.select_related = False
+        self.clear_ordering(True)
+        super(UpdateQuery, self).pre_sql_setup()
+        count = self.count_active_tables()
+        if not self.related_updates and count == 1:
+            return
+
+        # We need to use a sub-select in the where clause to filter on things
+        # from other tables.
+        query = self.clone(klass=Query)
+        query.bump_prefix()
+        query.extra_select = {}
+        first_table = query.tables[0]
+        if query.alias_refcount[first_table] == 1:
+            # We can remove one table from the inner query.
+            query.unref_alias(first_table)
+            for i in xrange(1, len(query.tables)):
+                table = query.tables[i]
+                if query.alias_refcount[table]:
+                    break
+            join_info = query.alias_map[table]
+            query.select = [(join_info[RHS_ALIAS], join_info[RHS_JOIN_COL])]
+            must_pre_select = False
+        else:
+            query.select = []
+            query.add_fields([query.model._meta.pk.name])
+            must_pre_select = not self.connection.features.update_can_self_select
+
+        # Now we adjust the current query: reset the where clause and get rid
+        # of all the tables we don't need (since they're in the sub-select).
+        self.where = self.where_class()
+        if self.related_updates or must_pre_select:
+            # Either we're using the idents in multiple update queries (so
+            # don't want them to change), or the db backend doesn't support
+            # selecting from the updating table (e.g. MySQL).
+            idents = []
+            for rows in query.execute_sql(MULTI):
+                idents.extend([r[0] for r in rows])
+            self.add_filter(('pk__in', idents))
+            self.related_ids = idents
+        else:
+            # The fast path. Filters and updates in one query.
+            self.add_filter(('pk__in', query))
+        for alias in self.tables[1:]:
+            self.alias_refcount[alias] = 0
+
+    def clear_related(self, related_field, pk_list):
+        """
+        Set up and execute an update query that clears related entries for the
+        keys in pk_list.
+
+        This is used by the QuerySet.delete_objects() method.
+        """
+        for offset in range(0, len(pk_list), GET_ITERATOR_CHUNK_SIZE):
+            self.where = self.where_class()
+            f = self.model._meta.pk
+            self.where.add((None, f.column, f, 'in',
+                    pk_list[offset : offset + GET_ITERATOR_CHUNK_SIZE]),
+                    AND)
+            self.values = [(related_field.column, None, '%s')]
+            self.execute_sql(None)
+
+    def add_update_values(self, values):
+        """
+        Convert a dictionary of field name to value mappings into an update
+        query. This is the entry point for the public update() method on
+        querysets.
+        """
+        values_seq = []
+        for name, val in values.iteritems():
+            field, model, direct, m2m = self.model._meta.get_field_by_name(name)
+            if not direct or m2m:
+                raise FieldError('Cannot update model field %r (only non-relations and foreign keys permitted).' % field)
+            values_seq.append((field, model, val))
+        return self.add_update_fields(values_seq)
+
+    def add_update_fields(self, values_seq):
+        """
+        Turn a sequence of (field, model, value) triples into an update query.
+        Used by add_update_values() as well as the "fast" update path when
+        saving models.
+        """
+        from django.db.models.base import Model
+        for field, model, val in values_seq:
+            # FIXME: Some sort of db_prep_* is probably more appropriate here.
+            if field.rel and isinstance(val, Model):
+                val = val.pk
+
+            # Getting the placeholder for the field.
+            if hasattr(field, 'get_placeholder'):
+                placeholder = field.get_placeholder(val)
+            else:
+                placeholder = '%s'
+
+            if model:
+                self.add_related_update(model, field.column, val, placeholder)
+            else:
+                self.values.append((field.column, val, placeholder))
+
+    def add_related_update(self, model, column, value, placeholder):
+        """
+        Adds (name, value) to an update query for an ancestor model.
+
+        Updates are coalesced so that we only run one update query per ancestor.
+        """
+        try:
+            self.related_updates[model].append((column, value, placeholder))
+        except KeyError:
+            self.related_updates[model] = [(column, value, placeholder)]
+
+    def get_related_updates(self):
+        """
+        Returns a list of query objects: one for each update required to an
+        ancestor model. Each query will have the same filtering conditions as
+        the current query but will only update a single table.
+        """
+        if not self.related_updates:
+            return []
+        result = []
+        for model, values in self.related_updates.iteritems():
+            query = UpdateQuery(model, self.connection)
+            query.values = values
+            if self.related_ids:
+                query.add_filter(('pk__in', self.related_ids))
+            result.append(query)
+        return result
+
+class InsertQuery(Query):
+    def __init__(self, *args, **kwargs):
+        super(InsertQuery, self).__init__(*args, **kwargs)
+        self.columns = []
+        self.values = []
+        self.params = ()
+
+    def clone(self, klass=None, **kwargs):
+        extras = {'columns': self.columns[:], 'values': self.values[:],
+                'params': self.params}
+        return super(InsertQuery, self).clone(klass, extras)
+
+    def as_sql(self):
+        # We don't need quote_name_unless_alias() here, since these are all
+        # going to be column names (so we can avoid the extra overhead).
+        qn = self.connection.ops.quote_name
+        result = ['INSERT INTO %s' % qn(self.model._meta.db_table)]
+        result.append('(%s)' % ', '.join([qn(c) for c in self.columns]))
+        result.append('VALUES (%s)' % ', '.join(self.values))
+        return ' '.join(result), self.params
+
+    def execute_sql(self, return_id=False):
+        cursor = super(InsertQuery, self).execute_sql(None)
+        if return_id:
+            return self.connection.ops.last_insert_id(cursor,
+                    self.model._meta.db_table, self.model._meta.pk.column)
+
+    def insert_values(self, insert_values, raw_values=False):
+        """
+        Set up the insert query from the 'insert_values' dictionary. The
+        dictionary gives the model field names and their target values.
+
+        If 'raw_values' is True, the values in the 'insert_values' dictionary
+        are inserted directly into the query, rather than passed as SQL
+        parameters. This provides a way to insert NULL and DEFAULT keywords
+        into the query, for example.
+        """
+        placeholders, values = [], []
+        for field, val in insert_values:
+            if hasattr(field, 'get_placeholder'):
+                # Some fields (e.g. geo fields) need special munging before
+                # they can be inserted.
+                placeholders.append(field.get_placeholder(val))
+            else:
+                placeholders.append('%s')
+
+            self.columns.append(field.column)
+            values.append(val)
+        if raw_values:
+            self.values.extend(values)
+        else:
+            self.params += tuple(values)
+            self.values.extend(placeholders)
+
+class DateQuery(Query):
+    """
+    A DateQuery is a normal query, except that it specifically selects a single
+    date field. This requires some special handling when converting the results
+    back to Python objects, so we put it in a separate class.
+    """
+    def __getstate__(self):
+        """
+        Special DateQuery-specific pickle handling.
+        """
+        for elt in self.select:
+            if isinstance(elt, Date):
+                # Eliminate a method reference that can't be pickled. The
+                # __setstate__ method restores this.
+                elt.date_sql_func = None
+        return super(DateQuery, self).__getstate__()
+
+    def __setstate__(self, obj_dict):
+        super(DateQuery, self).__setstate__(obj_dict)
+        for elt in self.select:
+            if isinstance(elt, Date):
+                self.date_sql_func = self.connection.ops.date_trunc_sql
+
+    def results_iter(self):
+        """
+        Returns an iterator over the results from executing this query.
+        """
+        resolve_columns = hasattr(self, 'resolve_columns')
+        if resolve_columns:
+            from django.db.models.fields import DateTimeField
+            fields = [DateTimeField()]
+        else:
+            from django.db.backends.util import typecast_timestamp
+            needs_string_cast = self.connection.features.needs_datetime_string_cast
+
+        offset = len(self.extra_select)
+        for rows in self.execute_sql(MULTI):
+            for row in rows:
+                date = row[offset]
+                if resolve_columns:
+                    date = self.resolve_columns([date], fields)[0]
+                elif needs_string_cast:
+                    date = typecast_timestamp(str(date))
+                yield date
+
+    def add_date_select(self, field, lookup_type, order='ASC'):
+        """
+        Converts the query into a date extraction query.
+        """
+        result = self.setup_joins([field.name], self.get_meta(),
+                self.get_initial_alias(), False)
+        alias = result[3][-1]
+        select = Date((alias, field.column), lookup_type,
+                self.connection.ops.date_trunc_sql)
+        self.select = [select]
+        self.select_fields = [None]
+        self.select_related = False # See #7097.
+        self.distinct = True
+        self.order_by = order == 'ASC' and [1] or [-1]
+
+class CountQuery(Query):
+    """
+    A CountQuery knows how to take a normal query which would select over
+    multiple distinct columns and turn it into SQL that can be used on a
+    variety of backends (it requires a select in the FROM clause).
+    """
+    def get_from_clause(self):
+        result, params = self._query.as_sql()
+        return ['(%s) A1' % result], params
+
+    def get_ordering(self):
+        return ()
diff --git a/webapp/django/db/models/sql/where.py b/webapp/django/db/models/sql/where.py
new file mode 100644
index 0000000..662d99a
--- /dev/null
+++ b/webapp/django/db/models/sql/where.py
@@ -0,0 +1,213 @@
+"""
+Code to manage the creation and SQL rendering of 'where' constraints.
+"""
+import datetime
+
+from django.utils import tree
+from django.db import connection
+from django.db.models.fields import Field
+from django.db.models.query_utils import QueryWrapper
+from datastructures import EmptyResultSet, FullResultSet
+
+# Connection types
+AND = 'AND'
+OR = 'OR'
+
+class WhereNode(tree.Node):
+    """
+    Used to represent the SQL where-clause.
+
+    The class is tied to the Query class that created it (in order to create
+    the correct SQL).
+
+    The children in this tree are usually either Q-like objects or lists of
+    [table_alias, field_name, db_type, lookup_type, value_annotation,
+    params]. However, a child could also be any class with as_sql() and
+    relabel_aliases() methods.
+    """
+    default = AND
+
+    def add(self, data, connector):
+        """
+        Add a node to the where-tree. If the data is a list or tuple, it is
+        expected to be of the form (alias, col_name, field_obj, lookup_type,
+        value), which is then slightly munged before being stored (to avoid
+        storing any reference to field objects). Otherwise, the 'data' is
+        stored unchanged and can be anything with an 'as_sql()' method.
+        """
+        # Because of circular imports, we need to import this here.
+        from django.db.models.base import ObjectDoesNotExist
+
+        if not isinstance(data, (list, tuple)):
+            super(WhereNode, self).add(data, connector)
+            return
+
+        alias, col, field, lookup_type, value = data
+        try:
+            if field:
+                params = field.get_db_prep_lookup(lookup_type, value)
+                db_type = field.db_type()
+            else:
+                # This is possible when we add a comparison to NULL sometimes
+                # (we don't really need to waste time looking up the associated
+                # field object).
+                params = Field().get_db_prep_lookup(lookup_type, value)
+                db_type = None
+        except ObjectDoesNotExist:
+            # This can happen when trying to insert a reference to a null pk.
+            # We break out of the normal path and indicate there's nothing to
+            # match.
+            super(WhereNode, self).add(NothingNode(), connector)
+            return
+        if isinstance(value, datetime.datetime):
+            annotation = datetime.datetime
+        else:
+            annotation = bool(value)
+        super(WhereNode, self).add((alias, col, db_type, lookup_type,
+                annotation, params), connector)
+
+    def as_sql(self, qn=None):
+        """
+        Returns the SQL version of the where clause and the value to be
+        substituted in. Returns None, None if this node is empty.
+
+        If 'node' is provided, that is the root of the SQL generation
+        (generally not needed except by the internal implementation for
+        recursion).
+        """
+        if not qn:
+            qn = connection.ops.quote_name
+        if not self.children:
+            return None, []
+        result = []
+        result_params = []
+        empty = True
+        for child in self.children:
+            try:
+                if hasattr(child, 'as_sql'):
+                    sql, params = child.as_sql(qn=qn)
+                else:
+                    # A leaf node in the tree.
+                    sql, params = self.make_atom(child, qn)
+            except EmptyResultSet:
+                if self.connector == AND and not self.negated:
+                    # We can bail out early in this particular case (only).
+                    raise
+                elif self.negated:
+                    empty = False
+                continue
+            except FullResultSet:
+                if self.connector == OR:
+                    if self.negated:
+                        empty = True
+                        break
+                    # We match everything. No need for any constraints.
+                    return '', []
+                if self.negated:
+                    empty = True
+                continue
+            empty = False
+            if sql:
+                result.append(sql)
+                result_params.extend(params)
+        if empty:
+            raise EmptyResultSet
+
+        conn = ' %s ' % self.connector
+        sql_string = conn.join(result)
+        if sql_string:
+            if self.negated:
+                sql_string = 'NOT (%s)' % sql_string
+            elif len(self.children) != 1:
+                sql_string = '(%s)' % sql_string
+        return sql_string, result_params
+
+    def make_atom(self, child, qn):
+        """
+        Turn a tuple (table_alias, column_name, db_type, lookup_type,
+        value_annot, params) into valid SQL.
+
+        Returns the string for the SQL fragment and the parameters to use for
+        it.
+        """
+        table_alias, name, db_type, lookup_type, value_annot, params = child
+        if table_alias:
+            lhs = '%s.%s' % (qn(table_alias), qn(name))
+        else:
+            lhs = qn(name)
+        field_sql = connection.ops.field_cast_sql(db_type) % lhs
+
+        if value_annot is datetime.datetime:
+            cast_sql = connection.ops.datetime_cast_sql()
+        else:
+            cast_sql = '%s'
+
+        if isinstance(params, QueryWrapper):
+            extra, params = params.data
+        else:
+            extra = ''
+
+        if lookup_type in connection.operators:
+            format = "%s %%s %s" % (connection.ops.lookup_cast(lookup_type),
+                    extra)
+            return (format % (field_sql,
+                    connection.operators[lookup_type] % cast_sql), params)
+
+        if lookup_type == 'in':
+            if not value_annot:
+                raise EmptyResultSet
+            if extra:
+                return ('%s IN %s' % (field_sql, extra), params)
+            return ('%s IN (%s)' % (field_sql, ', '.join(['%s'] * len(params))),
+                    params)
+        elif lookup_type in ('range', 'year'):
+            return ('%s BETWEEN %%s and %%s' % field_sql, params)
+        elif lookup_type in ('month', 'day'):
+            return ('%s = %%s' % connection.ops.date_extract_sql(lookup_type,
+                    field_sql), params)
+        elif lookup_type == 'isnull':
+            return ('%s IS %sNULL' % (field_sql,
+                (not value_annot and 'NOT ' or '')), ())
+        elif lookup_type == 'search':
+            return (connection.ops.fulltext_search_sql(field_sql), params)
+        elif lookup_type in ('regex', 'iregex'):
+            return connection.ops.regex_lookup(lookup_type) % (field_sql, cast_sql), params
+
+        raise TypeError('Invalid lookup_type: %r' % lookup_type)
+
+    def relabel_aliases(self, change_map, node=None):
+        """
+        Relabels the alias values of any children. 'change_map' is a dictionary
+        mapping old (current) alias values to the new values.
+        """
+        if not node:
+            node = self
+        for pos, child in enumerate(node.children):
+            if hasattr(child, 'relabel_aliases'):
+                child.relabel_aliases(change_map)
+            elif isinstance(child, tree.Node):
+                self.relabel_aliases(change_map, child)
+            else:
+                if child[0] in change_map:
+                    node.children[pos] = (change_map[child[0]],) + child[1:]
+
+class EverythingNode(object):
+    """
+    A node that matches everything.
+    """
+    def as_sql(self, qn=None):
+        raise FullResultSet
+
+    def relabel_aliases(self, change_map, node=None):
+        return
+
+class NothingNode(object):
+    """
+    A node that matches nothing.
+    """
+    def as_sql(self, qn=None):
+        raise EmptyResultSet
+
+    def relabel_aliases(self, change_map, node=None):
+        return
+
diff --git a/webapp/django/db/transaction.py b/webapp/django/db/transaction.py
new file mode 100644
index 0000000..506074f
--- /dev/null
+++ b/webapp/django/db/transaction.py
@@ -0,0 +1,267 @@
+"""
+This module implements a transaction manager that can be used to define
+transaction handling in a request or view function. It is used by transaction
+control middleware and decorators.
+
+The transaction manager can be in managed or in auto state. Auto state means the
+system is using a commit-on-save strategy (actually it's more like
+commit-on-change). As soon as the .save() or .delete() (or related) methods are
+called, a commit is made.
+
+Managed transactions don't do those commits, but will need some kind of manual
+or implicit commits or rollbacks.
+"""
+
+try:
+    import thread
+except ImportError:
+    import dummy_thread as thread
+try:
+    from functools import wraps
+except ImportError:
+    from django.utils.functional import wraps  # Python 2.3, 2.4 fallback.
+from django.db import connection
+from django.conf import settings
+
+class TransactionManagementError(Exception):
+    """
+    This exception is thrown when something bad happens with transaction
+    management.
+    """
+    pass
+
+# The states are dictionaries of lists. The key to the dict is the current
+# thread and the list is handled as a stack of values.
+state = {}
+savepoint_state = {}
+
+# The dirty flag is set by *_unless_managed functions to denote that the
+# code under transaction management has changed things to require a
+# database commit.
+dirty = {}
+
+def enter_transaction_management():
+    """
+    Enters transaction management for a running thread. It must be balanced with
+    the appropriate leave_transaction_management call, since the actual state is
+    managed as a stack.
+
+    The state and dirty flag are carried over from the surrounding block or
+    from the settings, if there is no surrounding block (dirty is always false
+    when no current block is running).
+    """
+    thread_ident = thread.get_ident()
+    if thread_ident in state and state[thread_ident]:
+        state[thread_ident].append(state[thread_ident][-1])
+    else:
+        state[thread_ident] = []
+        state[thread_ident].append(settings.TRANSACTIONS_MANAGED)
+    if thread_ident not in dirty:
+        dirty[thread_ident] = False
+
+def leave_transaction_management():
+    """
+    Leaves transaction management for a running thread. A dirty flag is carried
+    over to the surrounding block, as a commit will commit all changes, even
+    those from outside. (Commits are on connection level.)
+    """
+    thread_ident = thread.get_ident()
+    if thread_ident in state and state[thread_ident]:
+        del state[thread_ident][-1]
+    else:
+        raise TransactionManagementError("This code isn't under transaction management")
+    if dirty.get(thread_ident, False):
+        rollback()
+        raise TransactionManagementError("Transaction managed block ended with pending COMMIT/ROLLBACK")
+    dirty[thread_ident] = False
+
+def is_dirty():
+    """
+    Returns True if the current transaction requires a commit for changes to
+    happen.
+    """
+    return dirty.get(thread.get_ident(), False)
+
+def set_dirty():
+    """
+    Sets a dirty flag for the current thread and code streak. This can be used
+    to decide in a managed block of code to decide whether there are open
+    changes waiting for commit.
+    """
+    thread_ident = thread.get_ident()
+    if thread_ident in dirty:
+        dirty[thread_ident] = True
+    else:
+        raise TransactionManagementError("This code isn't under transaction management")
+
+def set_clean():
+    """
+    Resets a dirty flag for the current thread and code streak. This can be used
+    to decide in a managed block of code to decide whether a commit or rollback
+    should happen.
+    """
+    thread_ident = thread.get_ident()
+    if thread_ident in dirty:
+        dirty[thread_ident] = False
+    else:
+        raise TransactionManagementError("This code isn't under transaction management")
+    clean_savepoints()
+
+def clean_savepoints():
+    thread_ident = thread.get_ident()
+    if thread_ident in savepoint_state:
+        del savepoint_state[thread_ident]
+
+def is_managed():
+    """
+    Checks whether the transaction manager is in manual or in auto state.
+    """
+    thread_ident = thread.get_ident()
+    if thread_ident in state:
+        if state[thread_ident]:
+            return state[thread_ident][-1]
+    return settings.TRANSACTIONS_MANAGED
+
+def managed(flag=True):
+    """
+    Puts the transaction manager into a manual state: managed transactions have
+    to be committed explicitly by the user. If you switch off transaction
+    management and there is a pending commit/rollback, the data will be
+    commited.
+    """
+    thread_ident = thread.get_ident()
+    top = state.get(thread_ident, None)
+    if top:
+        top[-1] = flag
+        if not flag and is_dirty():
+            connection._commit()
+            set_clean()
+    else:
+        raise TransactionManagementError("This code isn't under transaction management")
+
+def commit_unless_managed():
+    """
+    Commits changes if the system is not in managed transaction mode.
+    """
+    if not is_managed():
+        connection._commit()
+        clean_savepoints()
+    else:
+        set_dirty()
+
+def rollback_unless_managed():
+    """
+    Rolls back changes if the system is not in managed transaction mode.
+    """
+    if not is_managed():
+        connection._rollback()
+    else:
+        set_dirty()
+
+def commit():
+    """
+    Does the commit itself and resets the dirty flag.
+    """
+    connection._commit()
+    set_clean()
+
+def rollback():
+    """
+    This function does the rollback itself and resets the dirty flag.
+    """
+    connection._rollback()
+    set_clean()
+
+def savepoint():
+    """
+    Creates a savepoint (if supported and required by the backend) inside the
+    current transaction. Returns an identifier for the savepoint that will be
+    used for the subsequent rollback or commit.
+    """
+    thread_ident = thread.get_ident()
+    if thread_ident in savepoint_state:
+        savepoint_state[thread_ident].append(None)
+    else:
+        savepoint_state[thread_ident] = [None]
+    tid = str(thread_ident).replace('-', '')
+    sid = "s%s_x%d" % (tid, len(savepoint_state[thread_ident]))
+    connection._savepoint(sid)
+    return sid
+
+def savepoint_rollback(sid):
+    """
+    Rolls back the most recent savepoint (if one exists). Does nothing if
+    savepoints are not supported.
+    """
+    if thread.get_ident() in savepoint_state:
+        connection._savepoint_rollback(sid)
+
+def savepoint_commit(sid):
+    """
+    Commits the most recent savepoint (if one exists). Does nothing if
+    savepoints are not supported.
+    """
+    if thread.get_ident() in savepoint_state:
+        connection._savepoint_commit(sid)
+
+##############
+# DECORATORS #
+##############
+
+def autocommit(func):
+    """
+    Decorator that activates commit on save. This is Django's default behavior;
+    this decorator is useful if you globally activated transaction management in
+    your settings file and want the default behavior in some view functions.
+    """
+    def _autocommit(*args, **kw):
+        try:
+            enter_transaction_management()
+            managed(False)
+            return func(*args, **kw)
+        finally:
+            leave_transaction_management()
+    return wraps(func)(_autocommit)
+
+def commit_on_success(func):
+    """
+    This decorator activates commit on response. This way, if the view function
+    runs successfully, a commit is made; if the viewfunc produces an exception,
+    a rollback is made. This is one of the most common ways to do transaction
+    control in web apps.
+    """
+    def _commit_on_success(*args, **kw):
+        try:
+            enter_transaction_management()
+            managed(True)
+            try:
+                res = func(*args, **kw)
+            except:
+                # All exceptions must be handled here (even string ones).
+                if is_dirty():
+                    rollback()
+                raise
+            else:
+                if is_dirty():
+                    commit()
+            return res
+        finally:
+            leave_transaction_management()
+    return wraps(func)(_commit_on_success)
+
+def commit_manually(func):
+    """
+    Decorator that activates manual transaction control. It just disables
+    automatic transaction control and doesn't do any commit/rollback of its
+    own -- it's up to the user to call the commit and rollback functions
+    themselves.
+    """
+    def _commit_manually(*args, **kw):
+        try:
+            enter_transaction_management()
+            managed(True)
+            return func(*args, **kw)
+        finally:
+            leave_transaction_management()
+
+    return wraps(func)(_commit_manually)
diff --git a/webapp/django/dispatch/__init__.py b/webapp/django/dispatch/__init__.py
new file mode 100644
index 0000000..0798acc
--- /dev/null
+++ b/webapp/django/dispatch/__init__.py
@@ -0,0 +1,9 @@
+"""Multi-consumer multi-producer dispatching mechanism
+
+Originally based on pydispatch (BSD) http://pypi.python.org/pypi/PyDispatcher/2.0.1
+See license.txt for original license.
+
+Heavily modified for Django's purposes.
+"""
+
+from django.dispatch.dispatcher import Signal
\ No newline at end of file
diff --git a/webapp/django/dispatch/dispatcher.py b/webapp/django/dispatch/dispatcher.py
new file mode 100644
index 0000000..ff659d3
--- /dev/null
+++ b/webapp/django/dispatch/dispatcher.py
@@ -0,0 +1,198 @@
+import weakref
+try:
+    set
+except NameError:
+    from sets import Set as set # Python 2.3 fallback
+
+from django.dispatch import saferef
+
+WEAKREF_TYPES = (weakref.ReferenceType, saferef.BoundMethodWeakref)
+
+def _make_id(target):
+    if hasattr(target, 'im_func'):
+        return (id(target.im_self), id(target.im_func))
+    return id(target)
+
+class Signal(object):
+    """Base class for all signals
+    
+    Internal attributes:
+        receivers -- { receriverkey (id) : weakref(receiver) }
+    """
+    
+    def __init__(self, providing_args=None):
+        """providing_args -- A list of the arguments this signal can pass along in
+                       a send() call.
+        """
+        self.receivers = []
+        if providing_args is None:
+            providing_args = []
+        self.providing_args = set(providing_args)
+
+    def connect(self, receiver, sender=None, weak=True, dispatch_uid=None):
+        """Connect receiver to sender for signal
+    
+        receiver -- a function or an instance method which is to
+            receive signals.  Receivers must be
+            hashable objects.
+
+            if weak is True, then receiver must be weak-referencable
+            (more precisely saferef.safeRef() must be able to create
+            a reference to the receiver).
+        
+            Receivers must be able to accept keyword arguments.
+
+            If receivers have a dispatch_uid attribute, the receiver will
+              not be added if another receiver already exists with that
+              dispatch_uid.
+
+        sender -- the sender to which the receiver should respond
+            Must either be of type Signal, or None to receive events
+            from any sender.
+
+        weak -- whether to use weak references to the receiver
+            By default, the module will attempt to use weak
+            references to the receiver objects.  If this parameter
+            is false, then strong references will be used.
+        
+        dispatch_uid -- an identifier used to uniquely identify a particular
+            instance of a receiver. This will usually be a string, though it
+            may be anything hashable.
+
+        returns None
+        """
+        from django.conf import settings
+        
+        if settings.DEBUG:
+            import inspect
+            assert inspect.getargspec(receiver)[2] is not None, \
+                "Signal receivers must accept keyword arguments (**kwargs)."
+        
+        if dispatch_uid:
+            lookup_key = (dispatch_uid, _make_id(sender))
+        else:
+            lookup_key = (_make_id(receiver), _make_id(sender))
+
+        if weak:
+            receiver = saferef.safeRef(receiver, onDelete=self._remove_receiver)
+
+        for r_key, _ in self.receivers:
+            if r_key == lookup_key:
+                break
+        else:
+            self.receivers.append((lookup_key, receiver))
+
+    def disconnect(self, receiver=None, sender=None, weak=True, dispatch_uid=None):
+        """Disconnect receiver from sender for signal
+    
+        receiver -- the registered receiver to disconnect. May be none if
+            dispatch_uid is specified.
+        sender -- the registered sender to disconnect
+        weak -- the weakref state to disconnect
+        dispatch_uid -- the unique identifier of the receiver to disconnect
+    
+        disconnect reverses the process of connect.
+
+        If weak references are used, disconnect need not be called.
+          The receiver will be remove from dispatch automatically.
+
+        returns None
+        """
+
+        if dispatch_uid:
+            lookup_key = (dispatch_uid, _make_id(sender))
+        else:
+            lookup_key = (_make_id(receiver), _make_id(sender))
+
+        for idx, (r_key, _) in enumerate(self.receivers):
+            if r_key == lookup_key:
+                del self.receivers[idx]
+
+    def send(self, sender, **named):
+        """Send signal from sender to all connected receivers.
+
+        sender -- the sender of the signal
+            Either a specific object or None.
+    
+        named -- named arguments which will be passed to receivers.
+
+        Returns a list of tuple pairs [(receiver, response), ... ].
+
+        If any receiver raises an error, the error propagates back
+        through send, terminating the dispatch loop, so it is quite
+        possible to not have all receivers called if a raises an
+        error.
+        """
+
+        responses = []
+        if not self.receivers:
+            return responses
+
+        for receiver in self._live_receivers(_make_id(sender)):
+            response = receiver(signal=self, sender=sender, **named)
+            responses.append((receiver, response))
+        return responses
+
+    def send_robust(self, sender, **named):
+        """Send signal from sender to all connected receivers catching errors
+
+        sender -- the sender of the signal
+            Can be any python object (normally one registered with
+            a connect if you actually want something to occur).
+
+        named -- named arguments which will be passed to receivers.
+            These arguments must be a subset of the argument names
+            defined in providing_args.
+
+        Return a list of tuple pairs [(receiver, response), ... ],
+        may raise DispatcherKeyError
+
+        if any receiver raises an error (specifically any subclass of Exception),
+        the error instance is returned as the result for that receiver.
+        """
+
+        responses = []
+        if not self.receivers:
+            return responses
+
+        # Call each receiver with whatever arguments it can accept.
+        # Return a list of tuple pairs [(receiver, response), ... ].
+        for receiver in self._live_receivers(_make_id(sender)):
+            try:
+                response = receiver(signal=self, sender=sender, **named)
+            except Exception, err:
+                responses.append((receiver, err))
+            else:
+                responses.append((receiver, response))
+        return responses
+
+    def _live_receivers(self, senderkey):
+        """Filter sequence of receivers to get resolved, live receivers
+
+        This checks for weak references
+        and resolves them, then returning only live
+        receivers.
+        """
+        none_senderkey = _make_id(None)
+
+        for (receiverkey, r_senderkey), receiver in self.receivers:
+            if r_senderkey == none_senderkey or r_senderkey == senderkey:
+                if isinstance(receiver, WEAKREF_TYPES):
+                    # Dereference the weak reference.
+                    receiver = receiver()
+                    if receiver is not None:
+                        yield receiver
+                else:
+                    yield receiver
+
+    def _remove_receiver(self, receiver):
+        """Remove dead receivers from connections."""
+
+        to_remove = []
+        for key, connected_receiver in self.receivers:
+            if connected_receiver == receiver:
+                to_remove.append(key)
+        for key in to_remove:
+            for idx, (r_key, _) in enumerate(self.receivers):
+                if r_key == key:
+                    del self.receivers[idx]
diff --git a/webapp/django/dispatch/license.txt b/webapp/django/dispatch/license.txt
new file mode 100644
index 0000000..505090d
--- /dev/null
+++ b/webapp/django/dispatch/license.txt
@@ -0,0 +1,36 @@
+django.dispatch was originally forked from PyDispatcher.
+
+PyDispatcher License:
+
+    Copyright (c) 2001-2003, Patrick K. O'Brien and Contributors
+    All rights reserved.
+    
+    Redistribution and use in source and binary forms, with or without
+    modification, are permitted provided that the following conditions
+    are met:
+    
+        Redistributions of source code must retain the above copyright
+        notice, this list of conditions and the following disclaimer.
+    
+        Redistributions in binary form must reproduce the above
+        copyright notice, this list of conditions and the following
+        disclaimer in the documentation and/or other materials
+        provided with the distribution.
+    
+        The name of Patrick K. O'Brien, or the name of any Contributor,
+        may not be used to endorse or promote products derived from this 
+        software without specific prior written permission.
+    
+    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+    ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+    FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+    COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+    INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+    (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+    SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+    STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+    OF THE POSSIBILITY OF SUCH DAMAGE. 
+
diff --git a/webapp/django/dispatch/saferef.py b/webapp/django/dispatch/saferef.py
new file mode 100644
index 0000000..8bcfd8a
--- /dev/null
+++ b/webapp/django/dispatch/saferef.py
@@ -0,0 +1,250 @@
+"""
+"Safe weakrefs", originally from pyDispatcher.
+
+Provides a way to safely weakref any function, including bound methods (which
+aren't handled by the core weakref module).
+"""
+
+import weakref, traceback
+
+def safeRef(target, onDelete = None):
+    """Return a *safe* weak reference to a callable target
+
+    target -- the object to be weakly referenced, if it's a
+        bound method reference, will create a BoundMethodWeakref,
+        otherwise creates a simple weakref.
+    onDelete -- if provided, will have a hard reference stored
+        to the callable to be called after the safe reference
+        goes out of scope with the reference object, (either a
+        weakref or a BoundMethodWeakref) as argument.
+    """
+    if hasattr(target, 'im_self'):
+        if target.im_self is not None:
+            # Turn a bound method into a BoundMethodWeakref instance.
+            # Keep track of these instances for lookup by disconnect().
+            assert hasattr(target, 'im_func'), """safeRef target %r has im_self, but no im_func, don't know how to create reference"""%( target,)
+            reference = get_bound_method_weakref(
+                target=target,
+                onDelete=onDelete
+            )
+            return reference
+    if callable(onDelete):
+        return weakref.ref(target, onDelete)
+    else:
+        return weakref.ref( target )
+
+class BoundMethodWeakref(object):
+    """'Safe' and reusable weak references to instance methods
+
+    BoundMethodWeakref objects provide a mechanism for
+    referencing a bound method without requiring that the
+    method object itself (which is normally a transient
+    object) is kept alive.  Instead, the BoundMethodWeakref
+    object keeps weak references to both the object and the
+    function which together define the instance method.
+
+    Attributes:
+        key -- the identity key for the reference, calculated
+            by the class's calculateKey method applied to the
+            target instance method
+        deletionMethods -- sequence of callable objects taking
+            single argument, a reference to this object which
+            will be called when *either* the target object or
+            target function is garbage collected (i.e. when
+            this object becomes invalid).  These are specified
+            as the onDelete parameters of safeRef calls.
+        weakSelf -- weak reference to the target object
+        weakFunc -- weak reference to the target function
+
+    Class Attributes:
+        _allInstances -- class attribute pointing to all live
+            BoundMethodWeakref objects indexed by the class's
+            calculateKey(target) method applied to the target
+            objects.  This weak value dictionary is used to
+            short-circuit creation so that multiple references
+            to the same (object, function) pair produce the
+            same BoundMethodWeakref instance.
+
+    """
+    
+    _allInstances = weakref.WeakValueDictionary()
+    
+    def __new__( cls, target, onDelete=None, *arguments,**named ):
+        """Create new instance or return current instance
+
+        Basically this method of construction allows us to
+        short-circuit creation of references to already-
+        referenced instance methods.  The key corresponding
+        to the target is calculated, and if there is already
+        an existing reference, that is returned, with its
+        deletionMethods attribute updated.  Otherwise the
+        new instance is created and registered in the table
+        of already-referenced methods.
+        """
+        key = cls.calculateKey(target)
+        current =cls._allInstances.get(key)
+        if current is not None:
+            current.deletionMethods.append( onDelete)
+            return current
+        else:
+            base = super( BoundMethodWeakref, cls).__new__( cls )
+            cls._allInstances[key] = base
+            base.__init__( target, onDelete, *arguments,**named)
+            return base
+    
+    def __init__(self, target, onDelete=None):
+        """Return a weak-reference-like instance for a bound method
+
+        target -- the instance-method target for the weak
+            reference, must have im_self and im_func attributes
+            and be reconstructable via:
+                target.im_func.__get__( target.im_self )
+            which is true of built-in instance methods.
+        onDelete -- optional callback which will be called
+            when this weak reference ceases to be valid
+            (i.e. either the object or the function is garbage
+            collected).  Should take a single argument,
+            which will be passed a pointer to this object.
+        """
+        def remove(weak, self=self):
+            """Set self.isDead to true when method or instance is destroyed"""
+            methods = self.deletionMethods[:]
+            del self.deletionMethods[:]
+            try:
+                del self.__class__._allInstances[ self.key ]
+            except KeyError:
+                pass
+            for function in methods:
+                try:
+                    if callable( function ):
+                        function( self )
+                except Exception, e:
+                    try:
+                        traceback.print_exc()
+                    except AttributeError, err:
+                        print '''Exception during saferef %s cleanup function %s: %s'''%(
+                            self, function, e
+                        )
+        self.deletionMethods = [onDelete]
+        self.key = self.calculateKey( target )
+        self.weakSelf = weakref.ref(target.im_self, remove)
+        self.weakFunc = weakref.ref(target.im_func, remove)
+        self.selfName = str(target.im_self)
+        self.funcName = str(target.im_func.__name__)
+    
+    def calculateKey( cls, target ):
+        """Calculate the reference key for this reference
+
+        Currently this is a two-tuple of the id()'s of the
+        target object and the target function respectively.
+        """
+        return (id(target.im_self),id(target.im_func))
+    calculateKey = classmethod( calculateKey )
+    
+    def __str__(self):
+        """Give a friendly representation of the object"""
+        return """%s( %s.%s )"""%(
+            self.__class__.__name__,
+            self.selfName,
+            self.funcName,
+        )
+    
+    __repr__ = __str__
+    
+    def __nonzero__( self ):
+        """Whether we are still a valid reference"""
+        return self() is not None
+    
+    def __cmp__( self, other ):
+        """Compare with another reference"""
+        if not isinstance (other,self.__class__):
+            return cmp( self.__class__, type(other) )
+        return cmp( self.key, other.key)
+    
+    def __call__(self):
+        """Return a strong reference to the bound method
+
+        If the target cannot be retrieved, then will
+        return None, otherwise returns a bound instance
+        method for our object and function.
+
+        Note:
+            You may call this method any number of times,
+            as it does not invalidate the reference.
+        """
+        target = self.weakSelf()
+        if target is not None:
+            function = self.weakFunc()
+            if function is not None:
+                return function.__get__(target)
+        return None
+
+class BoundNonDescriptorMethodWeakref(BoundMethodWeakref):
+    """A specialized BoundMethodWeakref, for platforms where instance methods
+    are not descriptors.
+
+    It assumes that the function name and the target attribute name are the
+    same, instead of assuming that the function is a descriptor. This approach
+    is equally fast, but not 100% reliable because functions can be stored on an
+    attribute named differenty than the function's name such as in:
+
+    class A: pass
+    def foo(self): return "foo"
+    A.bar = foo
+
+    But this shouldn't be a common use case. So, on platforms where methods
+    aren't descriptors (such as Jython) this implementation has the advantage
+    of working in the most cases.
+    """
+    def __init__(self, target, onDelete=None):
+        """Return a weak-reference-like instance for a bound method
+
+        target -- the instance-method target for the weak
+            reference, must have im_self and im_func attributes
+            and be reconstructable via:
+                target.im_func.__get__( target.im_self )
+            which is true of built-in instance methods.
+        onDelete -- optional callback which will be called
+            when this weak reference ceases to be valid
+            (i.e. either the object or the function is garbage
+            collected).  Should take a single argument,
+            which will be passed a pointer to this object.
+        """
+        assert getattr(target.im_self, target.__name__) == target, \
+               ("method %s isn't available as the attribute %s of %s" %
+                (target, target.__name__, target.im_self))
+        super(BoundNonDescriptorMethodWeakref, self).__init__(target, onDelete)
+
+    def __call__(self):
+        """Return a strong reference to the bound method
+
+        If the target cannot be retrieved, then will
+        return None, otherwise returns a bound instance
+        method for our object and function.
+
+        Note:
+            You may call this method any number of times,
+            as it does not invalidate the reference.
+        """
+        target = self.weakSelf()
+        if target is not None:
+            function = self.weakFunc()
+            if function is not None:
+                # Using curry() would be another option, but it erases the
+                # "signature" of the function. That is, after a function is
+                # curried, the inspect module can't be used to determine how
+                # many arguments the function expects, nor what keyword
+                # arguments it supports, and pydispatcher needs this
+                # information.
+                return getattr(target, function.__name__)
+        return None
+
+def get_bound_method_weakref(target, onDelete):
+    """Instantiates the appropiate BoundMethodWeakRef, depending on the details of
+    the underlying class method implementation"""
+    if hasattr(target, '__get__'):
+        # target method is a descriptor, so the default implementation works:
+        return BoundMethodWeakref(target=target, onDelete=onDelete)
+    else:
+        # no luck, use the alternative implementation:
+        return BoundNonDescriptorMethodWeakref(target=target, onDelete=onDelete)
diff --git a/webapp/django/forms/__init__.py b/webapp/django/forms/__init__.py
new file mode 100644
index 0000000..0d9c68f
--- /dev/null
+++ b/webapp/django/forms/__init__.py
@@ -0,0 +1,17 @@
+"""
+Django validation and HTML form handling.
+
+TODO:
+    Default value for field
+    Field labels
+    Nestable Forms
+    FatalValidationError -- short-circuits all other validators on a form
+    ValidationWarning
+    "This form field requires foo.js" and form.js_includes()
+"""
+
+from util import ValidationError
+from widgets import *
+from fields import *
+from forms import *
+from models import *
diff --git a/webapp/django/forms/extras/__init__.py b/webapp/django/forms/extras/__init__.py
new file mode 100644
index 0000000..a7f6a9b
--- /dev/null
+++ b/webapp/django/forms/extras/__init__.py
@@ -0,0 +1 @@
+from widgets import *
diff --git a/webapp/django/forms/extras/widgets.py b/webapp/django/forms/extras/widgets.py
new file mode 100644
index 0000000..ffa7ba2
--- /dev/null
+++ b/webapp/django/forms/extras/widgets.py
@@ -0,0 +1,79 @@
+"""
+Extra HTML Widget classes
+"""
+
+import datetime
+import re
+
+from django.forms.widgets import Widget, Select
+from django.utils.dates import MONTHS
+from django.utils.safestring import mark_safe
+
+__all__ = ('SelectDateWidget',)
+
+RE_DATE = re.compile(r'(\d{4})-(\d\d?)-(\d\d?)$')
+
+class SelectDateWidget(Widget):
+    """
+    A Widget that splits date input into three <select> boxes.
+
+    This also serves as an example of a Widget that has more than one HTML
+    element and hence implements value_from_datadict.
+    """
+    month_field = '%s_month'
+    day_field = '%s_day'
+    year_field = '%s_year'
+
+    def __init__(self, attrs=None, years=None):
+        # years is an optional list/tuple of years to use in the "year" select box.
+        self.attrs = attrs or {}
+        if years:
+            self.years = years
+        else:
+            this_year = datetime.date.today().year
+            self.years = range(this_year, this_year+10)
+
+    def render(self, name, value, attrs=None):
+        try:
+            year_val, month_val, day_val = value.year, value.month, value.day
+        except AttributeError:
+            year_val = month_val = day_val = None
+            if isinstance(value, basestring):
+                match = RE_DATE.match(value)
+                if match:
+                    year_val, month_val, day_val = [int(v) for v in match.groups()]
+
+        output = []
+
+        if 'id' in self.attrs:
+            id_ = self.attrs['id']
+        else:
+            id_ = 'id_%s' % name
+
+        month_choices = MONTHS.items()
+        month_choices.sort()
+        local_attrs = self.build_attrs(id=self.month_field % id_)
+        select_html = Select(choices=month_choices).render(self.month_field % name, month_val, local_attrs)
+        output.append(select_html)
+
+        day_choices = [(i, i) for i in range(1, 32)]
+        local_attrs['id'] = self.day_field % id_
+        select_html = Select(choices=day_choices).render(self.day_field % name, day_val, local_attrs)
+        output.append(select_html)
+
+        year_choices = [(i, i) for i in self.years]
+        local_attrs['id'] = self.year_field % id_
+        select_html = Select(choices=year_choices).render(self.year_field % name, year_val, local_attrs)
+        output.append(select_html)
+
+        return mark_safe(u'\n'.join(output))
+
+    def id_for_label(self, id_):
+        return '%s_month' % id_
+    id_for_label = classmethod(id_for_label)
+
+    def value_from_datadict(self, data, files, name):
+        y, m, d = data.get(self.year_field % name), data.get(self.month_field % name), data.get(self.day_field % name)
+        if y and m and d:
+            return '%s-%s-%s' % (y, m, d)
+        return data.get(name, None)
diff --git a/webapp/django/forms/fields.py b/webapp/django/forms/fields.py
new file mode 100644
index 0000000..ee9b8c6
--- /dev/null
+++ b/webapp/django/forms/fields.py
@@ -0,0 +1,837 @@
+"""
+Field classes.
+"""
+
+import copy
+import datetime
+import os
+import re
+import time
+import urlparse
+try:
+    from cStringIO import StringIO
+except ImportError:
+    from StringIO import StringIO
+
+# Python 2.3 fallbacks
+try:
+    from decimal import Decimal, DecimalException
+except ImportError:
+    from django.utils._decimal import Decimal, DecimalException
+try:
+    set
+except NameError:
+    from sets import Set as set
+
+from django.utils.translation import ugettext_lazy as _
+from django.utils.encoding import smart_unicode, smart_str
+
+from util import ErrorList, ValidationError
+from widgets import TextInput, PasswordInput, HiddenInput, MultipleHiddenInput, FileInput, CheckboxInput, Select, NullBooleanSelect, SelectMultiple, DateTimeInput, TimeInput
+from django.core.files.uploadedfile import SimpleUploadedFile as UploadedFile
+
+__all__ = (
+    'Field', 'CharField', 'IntegerField',
+    'DEFAULT_DATE_INPUT_FORMATS', 'DateField',
+    'DEFAULT_TIME_INPUT_FORMATS', 'TimeField',
+    'DEFAULT_DATETIME_INPUT_FORMATS', 'DateTimeField', 'TimeField',
+    'RegexField', 'EmailField', 'FileField', 'ImageField', 'URLField',
+    'BooleanField', 'NullBooleanField', 'ChoiceField', 'MultipleChoiceField',
+    'ComboField', 'MultiValueField', 'FloatField', 'DecimalField',
+    'SplitDateTimeField', 'IPAddressField', 'FilePathField',
+)
+
+# These values, if given to to_python(), will trigger the self.required check.
+EMPTY_VALUES = (None, '')
+
+
+class Field(object):
+    widget = TextInput # Default widget to use when rendering this type of Field.
+    hidden_widget = HiddenInput # Default widget to use when rendering this as "hidden".
+    default_error_messages = {
+        'required': _(u'This field is required.'),
+        'invalid': _(u'Enter a valid value.'),
+    }
+
+    # Tracks each time a Field instance is created. Used to retain order.
+    creation_counter = 0
+
+    def __init__(self, required=True, widget=None, label=None, initial=None,
+                 help_text=None, error_messages=None):
+        # required -- Boolean that specifies whether the field is required.
+        #             True by default.
+        # widget -- A Widget class, or instance of a Widget class, that should
+        #           be used for this Field when displaying it. Each Field has a
+        #           default Widget that it'll use if you don't specify this. In
+        #           most cases, the default widget is TextInput.
+        # label -- A verbose name for this field, for use in displaying this
+        #          field in a form. By default, Django will use a "pretty"
+        #          version of the form field name, if the Field is part of a
+        #          Form.
+        # initial -- A value to use in this Field's initial display. This value
+        #            is *not* used as a fallback if data isn't given.
+        # help_text -- An optional string to use as "help text" for this Field.
+        if label is not None:
+            label = smart_unicode(label)
+        self.required, self.label, self.initial = required, label, initial
+        if help_text is None:
+            self.help_text = u''
+        else:
+            self.help_text = smart_unicode(help_text)
+        widget = widget or self.widget
+        if isinstance(widget, type):
+            widget = widget()
+
+        # Hook into self.widget_attrs() for any Field-specific HTML attributes.
+        extra_attrs = self.widget_attrs(widget)
+        if extra_attrs:
+            widget.attrs.update(extra_attrs)
+
+        self.widget = widget
+
+        # Increase the creation counter, and save our local copy.
+        self.creation_counter = Field.creation_counter
+        Field.creation_counter += 1
+
+        def set_class_error_messages(messages, klass):
+            for base_class in klass.__bases__:
+                set_class_error_messages(messages, base_class)
+            messages.update(getattr(klass, 'default_error_messages', {}))
+
+        messages = {}
+        set_class_error_messages(messages, self.__class__)
+        messages.update(error_messages or {})
+        self.error_messages = messages
+
+    def clean(self, value):
+        """
+        Validates the given value and returns its "cleaned" value as an
+        appropriate Python object.
+
+        Raises ValidationError for any errors.
+        """
+        if self.required and value in EMPTY_VALUES:
+            raise ValidationError(self.error_messages['required'])
+        return value
+
+    def widget_attrs(self, widget):
+        """
+        Given a Widget instance (*not* a Widget class), returns a dictionary of
+        any HTML attributes that should be added to the Widget, based on this
+        Field.
+        """
+        return {}
+
+    def __deepcopy__(self, memo):
+        result = copy.copy(self)
+        memo[id(self)] = result
+        result.widget = copy.deepcopy(self.widget, memo)
+        return result
+
+class CharField(Field):
+    default_error_messages = {
+        'max_length': _(u'Ensure this value has at most %(max)d characters (it has %(length)d).'),
+        'min_length': _(u'Ensure this value has at least %(min)d characters (it has %(length)d).'),
+    }
+
+    def __init__(self, max_length=None, min_length=None, *args, **kwargs):
+        self.max_length, self.min_length = max_length, min_length
+        super(CharField, self).__init__(*args, **kwargs)
+
+    def clean(self, value):
+        "Validates max_length and min_length. Returns a Unicode object."
+        super(CharField, self).clean(value)
+        if value in EMPTY_VALUES:
+            return u''
+        value = smart_unicode(value)
+        value_length = len(value)
+        if self.max_length is not None and value_length > self.max_length:
+            raise ValidationError(self.error_messages['max_length'] % {'max': self.max_length, 'length': value_length})
+        if self.min_length is not None and value_length < self.min_length:
+            raise ValidationError(self.error_messages['min_length'] % {'min': self.min_length, 'length': value_length})
+        return value
+
+    def widget_attrs(self, widget):
+        if self.max_length is not None and isinstance(widget, (TextInput, PasswordInput)):
+            # The HTML attribute is maxlength, not max_length.
+            return {'maxlength': str(self.max_length)}
+
+class IntegerField(Field):
+    default_error_messages = {
+        'invalid': _(u'Enter a whole number.'),
+        'max_value': _(u'Ensure this value is less than or equal to %s.'),
+        'min_value': _(u'Ensure this value is greater than or equal to %s.'),
+    }
+
+    def __init__(self, max_value=None, min_value=None, *args, **kwargs):
+        self.max_value, self.min_value = max_value, min_value
+        super(IntegerField, self).__init__(*args, **kwargs)
+
+    def clean(self, value):
+        """
+        Validates that int() can be called on the input. Returns the result
+        of int(). Returns None for empty values.
+        """
+        super(IntegerField, self).clean(value)
+        if value in EMPTY_VALUES:
+            return None
+        try:
+            value = int(str(value))
+        except (ValueError, TypeError):
+            raise ValidationError(self.error_messages['invalid'])
+        if self.max_value is not None and value > self.max_value:
+            raise ValidationError(self.error_messages['max_value'] % self.max_value)
+        if self.min_value is not None and value < self.min_value:
+            raise ValidationError(self.error_messages['min_value'] % self.min_value)
+        return value
+
+class FloatField(Field):
+    default_error_messages = {
+        'invalid': _(u'Enter a number.'),
+        'max_value': _(u'Ensure this value is less than or equal to %s.'),
+        'min_value': _(u'Ensure this value is greater than or equal to %s.'),
+    }
+
+    def __init__(self, max_value=None, min_value=None, *args, **kwargs):
+        self.max_value, self.min_value = max_value, min_value
+        Field.__init__(self, *args, **kwargs)
+
+    def clean(self, value):
+        """
+        Validates that float() can be called on the input. Returns a float.
+        Returns None for empty values.
+        """
+        super(FloatField, self).clean(value)
+        if not self.required and value in EMPTY_VALUES:
+            return None
+        try:
+            value = float(value)
+        except (ValueError, TypeError):
+            raise ValidationError(self.error_messages['invalid'])
+        if self.max_value is not None and value > self.max_value:
+            raise ValidationError(self.error_messages['max_value'] % self.max_value)
+        if self.min_value is not None and value < self.min_value:
+            raise ValidationError(self.error_messages['min_value'] % self.min_value)
+        return value
+
+class DecimalField(Field):
+    default_error_messages = {
+        'invalid': _(u'Enter a number.'),
+        'max_value': _(u'Ensure this value is less than or equal to %s.'),
+        'min_value': _(u'Ensure this value is greater than or equal to %s.'),
+        'max_digits': _('Ensure that there are no more than %s digits in total.'),
+        'max_decimal_places': _('Ensure that there are no more than %s decimal places.'),
+        'max_whole_digits': _('Ensure that there are no more than %s digits before the decimal point.')
+    }
+
+    def __init__(self, max_value=None, min_value=None, max_digits=None, decimal_places=None, *args, **kwargs):
+        self.max_value, self.min_value = max_value, min_value
+        self.max_digits, self.decimal_places = max_digits, decimal_places
+        Field.__init__(self, *args, **kwargs)
+
+    def clean(self, value):
+        """
+        Validates that the input is a decimal number. Returns a Decimal
+        instance. Returns None for empty values. Ensures that there are no more
+        than max_digits in the number, and no more than decimal_places digits
+        after the decimal point.
+        """
+        super(DecimalField, self).clean(value)
+        if not self.required and value in EMPTY_VALUES:
+            return None
+        value = smart_str(value).strip()
+        try:
+            value = Decimal(value)
+        except DecimalException:
+            raise ValidationError(self.error_messages['invalid'])
+
+        sign, digittuple, exponent = value.as_tuple()
+        decimals = abs(exponent)
+        # digittuple doesn't include any leading zeros.
+        digits = len(digittuple)
+        if decimals >= digits:
+            # We have leading zeros up to or past the decimal point.  Count
+            # everything past the decimal point as a digit.  We also add one
+            # for leading zeros before the decimal point (any number of leading
+            # whole zeros collapse to one digit).
+            digits = decimals + 1
+        whole_digits = digits - decimals
+
+        if self.max_value is not None and value > self.max_value:
+            raise ValidationError(self.error_messages['max_value'] % self.max_value)
+        if self.min_value is not None and value < self.min_value:
+            raise ValidationError(self.error_messages['min_value'] % self.min_value)
+        if self.max_digits is not None and digits > self.max_digits:
+            raise ValidationError(self.error_messages['max_digits'] % self.max_digits)
+        if self.decimal_places is not None and decimals > self.decimal_places:
+            raise ValidationError(self.error_messages['max_decimal_places'] % self.decimal_places)
+        if self.max_digits is not None and self.decimal_places is not None and whole_digits > (self.max_digits - self.decimal_places):
+            raise ValidationError(self.error_messages['max_whole_digits'] % (self.max_digits - self.decimal_places))
+        return value
+
+DEFAULT_DATE_INPUT_FORMATS = (
+    '%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', # '2006-10-25', '10/25/2006', '10/25/06'
+    '%b %d %Y', '%b %d, %Y',            # 'Oct 25 2006', 'Oct 25, 2006'
+    '%d %b %Y', '%d %b, %Y',            # '25 Oct 2006', '25 Oct, 2006'
+    '%B %d %Y', '%B %d, %Y',            # 'October 25 2006', 'October 25, 2006'
+    '%d %B %Y', '%d %B, %Y',            # '25 October 2006', '25 October, 2006'
+)
+
+class DateField(Field):
+    default_error_messages = {
+        'invalid': _(u'Enter a valid date.'),
+    }
+
+    def __init__(self, input_formats=None, *args, **kwargs):
+        super(DateField, self).__init__(*args, **kwargs)
+        self.input_formats = input_formats or DEFAULT_DATE_INPUT_FORMATS
+
+    def clean(self, value):
+        """
+        Validates that the input can be converted to a date. Returns a Python
+        datetime.date object.
+        """
+        super(DateField, self).clean(value)
+        if value in EMPTY_VALUES:
+            return None
+        if isinstance(value, datetime.datetime):
+            return value.date()
+        if isinstance(value, datetime.date):
+            return value
+        for format in self.input_formats:
+            try:
+                return datetime.date(*time.strptime(value, format)[:3])
+            except ValueError:
+                continue
+        raise ValidationError(self.error_messages['invalid'])
+
+DEFAULT_TIME_INPUT_FORMATS = (
+    '%H:%M:%S',     # '14:30:59'
+    '%H:%M',        # '14:30'
+)
+
+class TimeField(Field):
+    widget = TimeInput
+    default_error_messages = {
+        'invalid': _(u'Enter a valid time.')
+    }
+
+    def __init__(self, input_formats=None, *args, **kwargs):
+        super(TimeField, self).__init__(*args, **kwargs)
+        self.input_formats = input_formats or DEFAULT_TIME_INPUT_FORMATS
+
+    def clean(self, value):
+        """
+        Validates that the input can be converted to a time. Returns a Python
+        datetime.time object.
+        """
+        super(TimeField, self).clean(value)
+        if value in EMPTY_VALUES:
+            return None
+        if isinstance(value, datetime.time):
+            return value
+        for format in self.input_formats:
+            try:
+                return datetime.time(*time.strptime(value, format)[3:6])
+            except ValueError:
+                continue
+        raise ValidationError(self.error_messages['invalid'])
+
+DEFAULT_DATETIME_INPUT_FORMATS = (
+    '%Y-%m-%d %H:%M:%S',     # '2006-10-25 14:30:59'
+    '%Y-%m-%d %H:%M',        # '2006-10-25 14:30'
+    '%Y-%m-%d',              # '2006-10-25'
+    '%m/%d/%Y %H:%M:%S',     # '10/25/2006 14:30:59'
+    '%m/%d/%Y %H:%M',        # '10/25/2006 14:30'
+    '%m/%d/%Y',              # '10/25/2006'
+    '%m/%d/%y %H:%M:%S',     # '10/25/06 14:30:59'
+    '%m/%d/%y %H:%M',        # '10/25/06 14:30'
+    '%m/%d/%y',              # '10/25/06'
+)
+
+class DateTimeField(Field):
+    widget = DateTimeInput
+    default_error_messages = {
+        'invalid': _(u'Enter a valid date/time.'),
+    }
+
+    def __init__(self, input_formats=None, *args, **kwargs):
+        super(DateTimeField, self).__init__(*args, **kwargs)
+        self.input_formats = input_formats or DEFAULT_DATETIME_INPUT_FORMATS
+
+    def clean(self, value):
+        """
+        Validates that the input can be converted to a datetime. Returns a
+        Python datetime.datetime object.
+        """
+        super(DateTimeField, self).clean(value)
+        if value in EMPTY_VALUES:
+            return None
+        if isinstance(value, datetime.datetime):
+            return value
+        if isinstance(value, datetime.date):
+            return datetime.datetime(value.year, value.month, value.day)
+        if isinstance(value, list):
+            # Input comes from a SplitDateTimeWidget, for example. So, it's two
+            # components: date and time.
+            if len(value) != 2:
+                raise ValidationError(self.error_messages['invalid'])
+            value = '%s %s' % tuple(value)
+        for format in self.input_formats:
+            try:
+                return datetime.datetime(*time.strptime(value, format)[:6])
+            except ValueError:
+                continue
+        raise ValidationError(self.error_messages['invalid'])
+
+class RegexField(CharField):
+    def __init__(self, regex, max_length=None, min_length=None, error_message=None, *args, **kwargs):
+        """
+        regex can be either a string or a compiled regular expression object.
+        error_message is an optional error message to use, if
+        'Enter a valid value' is too generic for you.
+        """
+        # error_message is just kept for backwards compatibility:
+        if error_message:
+            error_messages = kwargs.get('error_messages') or {}
+            error_messages['invalid'] = error_message
+            kwargs['error_messages'] = error_messages
+        super(RegexField, self).__init__(max_length, min_length, *args, **kwargs)
+        if isinstance(regex, basestring):
+            regex = re.compile(regex)
+        self.regex = regex
+
+    def clean(self, value):
+        """
+        Validates that the input matches the regular expression. Returns a
+        Unicode object.
+        """
+        value = super(RegexField, self).clean(value)
+        if value == u'':
+            return value
+        if not self.regex.search(value):
+            raise ValidationError(self.error_messages['invalid'])
+        return value
+
+email_re = re.compile(
+    r"(^[-!#$%&'*+/=?^_`{}|~0-9A-Z]+(\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*"  # dot-atom
+    r'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-011\013\014\016-\177])*"' # quoted-string
+    r')@(?:[A-Z0-9-]+\.)+[A-Z]{2,6}$', re.IGNORECASE)  # domain
+
+class EmailField(RegexField):
+    default_error_messages = {
+        'invalid': _(u'Enter a valid e-mail address.'),
+    }
+
+    def __init__(self, max_length=None, min_length=None, *args, **kwargs):
+        RegexField.__init__(self, email_re, max_length, min_length, *args,
+                            **kwargs)
+
+try:
+    from django.conf import settings
+    URL_VALIDATOR_USER_AGENT = settings.URL_VALIDATOR_USER_AGENT
+except ImportError:
+    # It's OK if Django settings aren't configured.
+    URL_VALIDATOR_USER_AGENT = 'Django (http://www.djangoproject.com/)'
+
+
+class FileField(Field):
+    widget = FileInput
+    default_error_messages = {
+        'invalid': _(u"No file was submitted. Check the encoding type on the form."),
+        'missing': _(u"No file was submitted."),
+        'empty': _(u"The submitted file is empty."),
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(FileField, self).__init__(*args, **kwargs)
+
+    def clean(self, data, initial=None):
+        super(FileField, self).clean(initial or data)
+        if not self.required and data in EMPTY_VALUES:
+            return None
+        elif not data and initial:
+            return initial
+
+        # UploadedFile objects should have name and size attributes.
+        try:
+            file_name = data.name
+            file_size = data.size
+        except AttributeError:
+            raise ValidationError(self.error_messages['invalid'])
+
+        if not file_name:
+            raise ValidationError(self.error_messages['invalid'])
+        if not file_size:
+            raise ValidationError(self.error_messages['empty'])
+
+        return data
+
+class ImageField(FileField):
+    default_error_messages = {
+        'invalid_image': _(u"Upload a valid image. The file you uploaded was either not an image or a corrupted image."),
+    }
+
+    def clean(self, data, initial=None):
+        """
+        Checks that the file-upload field data contains a valid image (GIF, JPG,
+        PNG, possibly others -- whatever the Python Imaging Library supports).
+        """
+        f = super(ImageField, self).clean(data, initial)
+        if f is None:
+            return None
+        elif not data and initial:
+            return initial
+        from PIL import Image
+
+        # We need to get a file object for PIL. We might have a path or we might
+        # have to read the data into memory.
+        if hasattr(data, 'temporary_file_path'):
+            file = data.temporary_file_path()
+        else:
+            if hasattr(data, 'read'):
+                file = StringIO(data.read())
+            else:
+                file = StringIO(data['content'])
+
+        try:
+            # load() is the only method that can spot a truncated JPEG,
+            #  but it cannot be called sanely after verify()
+            trial_image = Image.open(file)
+            trial_image.load()
+
+            # Since we're about to use the file again we have to reset the
+            # file object if possible.
+            if hasattr(file, 'reset'):
+                file.reset()
+
+            # verify() is the only method that can spot a corrupt PNG,
+            #  but it must be called immediately after the constructor
+            trial_image = Image.open(file)
+            trial_image.verify()
+        except ImportError:
+            # Under PyPy, it is possible to import PIL. However, the underlying
+            # _imaging C module isn't available, so an ImportError will be
+            # raised. Catch and re-raise.
+            raise
+        except Exception: # Python Imaging Library doesn't recognize it as an image
+            raise ValidationError(self.error_messages['invalid_image'])
+        if hasattr(f, 'seek') and callable(f.seek):
+            f.seek(0)
+        return f
+
+url_re = re.compile(
+    r'^https?://' # http:// or https://
+    r'(?:(?:[A-Z0-9-]+\.)+[A-Z]{2,6}|' #domain...
+    r'localhost|' #localhost...
+    r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' # ...or ip
+    r'(?::\d+)?' # optional port
+    r'(?:/?|/\S+)$', re.IGNORECASE)
+
+class URLField(RegexField):
+    default_error_messages = {
+        'invalid': _(u'Enter a valid URL.'),
+        'invalid_link': _(u'This URL appears to be a broken link.'),
+    }
+
+    def __init__(self, max_length=None, min_length=None, verify_exists=False,
+            validator_user_agent=URL_VALIDATOR_USER_AGENT, *args, **kwargs):
+        super(URLField, self).__init__(url_re, max_length, min_length, *args,
+                                       **kwargs)
+        self.verify_exists = verify_exists
+        self.user_agent = validator_user_agent
+
+    def clean(self, value):
+        # If no URL scheme given, assume http://
+        if value and '://' not in value:
+            value = u'http://%s' % value
+        # If no URL path given, assume /
+        if value and not urlparse.urlsplit(value)[2]:
+            value += '/'
+        value = super(URLField, self).clean(value)
+        if value == u'':
+            return value
+        if self.verify_exists:
+            import urllib2
+            headers = {
+                "Accept": "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5",
+                "Accept-Language": "en-us,en;q=0.5",
+                "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7",
+                "Connection": "close",
+                "User-Agent": self.user_agent,
+            }
+            try:
+                req = urllib2.Request(value, None, headers)
+                u = urllib2.urlopen(req)
+            except ValueError:
+                raise ValidationError(self.error_messages['invalid'])
+            except: # urllib2.URLError, httplib.InvalidURL, etc.
+                raise ValidationError(self.error_messages['invalid_link'])
+        return value
+
+class BooleanField(Field):
+    widget = CheckboxInput
+
+    def clean(self, value):
+        """Returns a Python boolean object."""
+        # Explicitly check for the string 'False', which is what a hidden field
+        # will submit for False. Because bool("True") == True, we don't need to
+        # handle that explicitly.
+        if value == 'False':
+            value = False
+        else:
+            value = bool(value)
+        super(BooleanField, self).clean(value)
+        if not value and self.required:
+            raise ValidationError(self.error_messages['required'])
+        return value
+
+class NullBooleanField(BooleanField):
+    """
+    A field whose valid values are None, True and False. Invalid values are
+    cleaned to None.
+    """
+    widget = NullBooleanSelect
+
+    def clean(self, value):
+        return {True: True, False: False}.get(value, None)
+
+class ChoiceField(Field):
+    widget = Select
+    default_error_messages = {
+        'invalid_choice': _(u'Select a valid choice. %(value)s is not one of the available choices.'),
+    }
+
+    def __init__(self, choices=(), required=True, widget=None, label=None,
+                 initial=None, help_text=None, *args, **kwargs):
+        super(ChoiceField, self).__init__(required, widget, label, initial,
+                                          help_text, *args, **kwargs)
+        self.choices = choices
+
+    def _get_choices(self):
+        return self._choices
+
+    def _set_choices(self, value):
+        # Setting choices also sets the choices on the widget.
+        # choices can be any iterable, but we call list() on it because
+        # it will be consumed more than once.
+        self._choices = self.widget.choices = list(value)
+
+    choices = property(_get_choices, _set_choices)
+
+    def clean(self, value):
+        """
+        Validates that the input is in self.choices.
+        """
+        value = super(ChoiceField, self).clean(value)
+        if value in EMPTY_VALUES:
+            value = u''
+        value = smart_unicode(value)
+        if value == u'':
+            return value
+        if not self.valid_value(value):
+            raise ValidationError(self.error_messages['invalid_choice'] % {'value': value})
+        return value
+
+    def valid_value(self, value):
+        "Check to see if the provided value is a valid choice"
+        for k, v in self.choices:
+            if type(v) in (tuple, list):
+                # This is an optgroup, so look inside the group for options
+                for k2, v2 in v:
+                    if value == smart_unicode(k2):
+                        return True
+            else:
+                if value == smart_unicode(k):
+                    return True
+        return False
+
+class MultipleChoiceField(ChoiceField):
+    hidden_widget = MultipleHiddenInput
+    widget = SelectMultiple
+    default_error_messages = {
+        'invalid_choice': _(u'Select a valid choice. %(value)s is not one of the available choices.'),
+        'invalid_list': _(u'Enter a list of values.'),
+    }
+
+    def clean(self, value):
+        """
+        Validates that the input is a list or tuple.
+        """
+        if self.required and not value:
+            raise ValidationError(self.error_messages['required'])
+        elif not self.required and not value:
+            return []
+        if not isinstance(value, (list, tuple)):
+            raise ValidationError(self.error_messages['invalid_list'])
+        new_value = [smart_unicode(val) for val in value]
+        # Validate that each value in the value list is in self.choices.
+        for val in new_value:
+            if not self.valid_value(val):
+                raise ValidationError(self.error_messages['invalid_choice'] % {'value': val})
+        return new_value
+
+class ComboField(Field):
+    """
+    A Field whose clean() method calls multiple Field clean() methods.
+    """
+    def __init__(self, fields=(), *args, **kwargs):
+        super(ComboField, self).__init__(*args, **kwargs)
+        # Set 'required' to False on the individual fields, because the
+        # required validation will be handled by ComboField, not by those
+        # individual fields.
+        for f in fields:
+            f.required = False
+        self.fields = fields
+
+    def clean(self, value):
+        """
+        Validates the given value against all of self.fields, which is a
+        list of Field instances.
+        """
+        super(ComboField, self).clean(value)
+        for field in self.fields:
+            value = field.clean(value)
+        return value
+
+class MultiValueField(Field):
+    """
+    A Field that aggregates the logic of multiple Fields.
+
+    Its clean() method takes a "decompressed" list of values, which are then
+    cleaned into a single value according to self.fields. Each value in
+    this list is cleaned by the corresponding field -- the first value is
+    cleaned by the first field, the second value is cleaned by the second
+    field, etc. Once all fields are cleaned, the list of clean values is
+    "compressed" into a single value.
+
+    Subclasses should not have to implement clean(). Instead, they must
+    implement compress(), which takes a list of valid values and returns a
+    "compressed" version of those values -- a single value.
+
+    You'll probably want to use this with MultiWidget.
+    """
+    default_error_messages = {
+        'invalid': _(u'Enter a list of values.'),
+    }
+
+    def __init__(self, fields=(), *args, **kwargs):
+        super(MultiValueField, self).__init__(*args, **kwargs)
+        # Set 'required' to False on the individual fields, because the
+        # required validation will be handled by MultiValueField, not by those
+        # individual fields.
+        for f in fields:
+            f.required = False
+        self.fields = fields
+
+    def clean(self, value):
+        """
+        Validates every value in the given list. A value is validated against
+        the corresponding Field in self.fields.
+
+        For example, if this MultiValueField was instantiated with
+        fields=(DateField(), TimeField()), clean() would call
+        DateField.clean(value[0]) and TimeField.clean(value[1]).
+        """
+        clean_data = []
+        errors = ErrorList()
+        if not value or isinstance(value, (list, tuple)):
+            if not value or not [v for v in value if v not in EMPTY_VALUES]:
+                if self.required:
+                    raise ValidationError(self.error_messages['required'])
+                else:
+                    return self.compress([])
+        else:
+            raise ValidationError(self.error_messages['invalid'])
+        for i, field in enumerate(self.fields):
+            try:
+                field_value = value[i]
+            except IndexError:
+                field_value = None
+            if self.required and field_value in EMPTY_VALUES:
+                raise ValidationError(self.error_messages['required'])
+            try:
+                clean_data.append(field.clean(field_value))
+            except ValidationError, e:
+                # Collect all validation errors in a single list, which we'll
+                # raise at the end of clean(), rather than raising a single
+                # exception for the first error we encounter.
+                errors.extend(e.messages)
+        if errors:
+            raise ValidationError(errors)
+        return self.compress(clean_data)
+
+    def compress(self, data_list):
+        """
+        Returns a single value for the given list of values. The values can be
+        assumed to be valid.
+
+        For example, if this MultiValueField was instantiated with
+        fields=(DateField(), TimeField()), this might return a datetime
+        object created by combining the date and time in data_list.
+        """
+        raise NotImplementedError('Subclasses must implement this method.')
+
+class FilePathField(ChoiceField):
+    def __init__(self, path, match=None, recursive=False, required=True,
+                 widget=None, label=None, initial=None, help_text=None,
+                 *args, **kwargs):
+        self.path, self.match, self.recursive = path, match, recursive
+        super(FilePathField, self).__init__(choices=(), required=required,
+            widget=widget, label=label, initial=initial, help_text=help_text,
+            *args, **kwargs)
+        self.choices = []
+        if self.match is not None:
+            self.match_re = re.compile(self.match)
+        if recursive:
+            for root, dirs, files in os.walk(self.path):
+                for f in files:
+                    if self.match is None or self.match_re.search(f):
+                        f = os.path.join(root, f)
+                        self.choices.append((f, f.replace(path, "", 1)))
+        else:
+            try:
+                for f in os.listdir(self.path):
+                    full_file = os.path.join(self.path, f)
+                    if os.path.isfile(full_file) and (self.match is None or self.match_re.search(f)):
+                        self.choices.append((full_file, f))
+            except OSError:
+                pass
+        self.widget.choices = self.choices
+
+class SplitDateTimeField(MultiValueField):
+    default_error_messages = {
+        'invalid_date': _(u'Enter a valid date.'),
+        'invalid_time': _(u'Enter a valid time.'),
+    }
+
+    def __init__(self, *args, **kwargs):
+        errors = self.default_error_messages.copy()
+        if 'error_messages' in kwargs:
+            errors.update(kwargs['error_messages'])
+        fields = (
+            DateField(error_messages={'invalid': errors['invalid_date']}),
+            TimeField(error_messages={'invalid': errors['invalid_time']}),
+        )
+        super(SplitDateTimeField, self).__init__(fields, *args, **kwargs)
+
+    def compress(self, data_list):
+        if data_list:
+            # Raise a validation error if time or date is empty
+            # (possible if SplitDateTimeField has required=False).
+            if data_list[0] in EMPTY_VALUES:
+                raise ValidationError(self.error_messages['invalid_date'])
+            if data_list[1] in EMPTY_VALUES:
+                raise ValidationError(self.error_messages['invalid_time'])
+            return datetime.datetime.combine(*data_list)
+        return None
+
+ipv4_re = re.compile(r'^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$')
+
+class IPAddressField(RegexField):
+    default_error_messages = {
+        'invalid': _(u'Enter a valid IPv4 address.'),
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(IPAddressField, self).__init__(ipv4_re, *args, **kwargs)
diff --git a/webapp/django/forms/forms.py b/webapp/django/forms/forms.py
new file mode 100644
index 0000000..753ee25
--- /dev/null
+++ b/webapp/django/forms/forms.py
@@ -0,0 +1,396 @@
+"""
+Form classes
+"""
+
+from copy import deepcopy
+
+from django.utils.datastructures import SortedDict
+from django.utils.html import escape
+from django.utils.encoding import StrAndUnicode, smart_unicode, force_unicode
+from django.utils.safestring import mark_safe
+
+from fields import Field, FileField
+from widgets import Media, media_property, TextInput, Textarea
+from util import flatatt, ErrorDict, ErrorList, ValidationError
+
+__all__ = ('BaseForm', 'Form')
+
+NON_FIELD_ERRORS = '__all__'
+
+def pretty_name(name):
+    "Converts 'first_name' to 'First name'"
+    name = name[0].upper() + name[1:]
+    return name.replace('_', ' ')
+
+def get_declared_fields(bases, attrs, with_base_fields=True):
+    """
+    Create a list of form field instances from the passed in 'attrs', plus any
+    similar fields on the base classes (in 'bases'). This is used by both the
+    Form and ModelForm metclasses.
+
+    If 'with_base_fields' is True, all fields from the bases are used.
+    Otherwise, only fields in the 'declared_fields' attribute on the bases are
+    used. The distinction is useful in ModelForm subclassing.
+    Also integrates any additional media definitions
+    """
+    fields = [(field_name, attrs.pop(field_name)) for field_name, obj in attrs.items() if isinstance(obj, Field)]
+    fields.sort(lambda x, y: cmp(x[1].creation_counter, y[1].creation_counter))
+
+    # If this class is subclassing another Form, add that Form's fields.
+    # Note that we loop over the bases in *reverse*. This is necessary in
+    # order to preserve the correct order of fields.
+    if with_base_fields:
+        for base in bases[::-1]:
+            if hasattr(base, 'base_fields'):
+                fields = base.base_fields.items() + fields
+    else:
+        for base in bases[::-1]:
+            if hasattr(base, 'declared_fields'):
+                fields = base.declared_fields.items() + fields
+
+    return SortedDict(fields)
+
+class DeclarativeFieldsMetaclass(type):
+    """
+    Metaclass that converts Field attributes to a dictionary called
+    'base_fields', taking into account parent class 'base_fields' as well.
+    """
+    def __new__(cls, name, bases, attrs):
+        attrs['base_fields'] = get_declared_fields(bases, attrs)
+        new_class = super(DeclarativeFieldsMetaclass,
+                     cls).__new__(cls, name, bases, attrs)
+        if 'media' not in attrs:
+            new_class.media = media_property(new_class)
+        return new_class
+
+class BaseForm(StrAndUnicode):
+    # This is the main implementation of all the Form logic. Note that this
+    # class is different than Form. See the comments by the Form class for more
+    # information. Any improvements to the form API should be made to *this*
+    # class, not to the Form class.
+    def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None,
+                 initial=None, error_class=ErrorList, label_suffix=':',
+                 empty_permitted=False):
+        self.is_bound = data is not None or files is not None
+        self.data = data or {}
+        self.files = files or {}
+        self.auto_id = auto_id
+        self.prefix = prefix
+        self.initial = initial or {}
+        self.error_class = error_class
+        self.label_suffix = label_suffix
+        self.empty_permitted = empty_permitted
+        self._errors = None # Stores the errors after clean() has been called.
+        self._changed_data = None
+
+        # The base_fields class attribute is the *class-wide* definition of
+        # fields. Because a particular *instance* of the class might want to
+        # alter self.fields, we create self.fields here by copying base_fields.
+        # Instances should always modify self.fields; they should not modify
+        # self.base_fields.
+        self.fields = deepcopy(self.base_fields)
+
+    def __unicode__(self):
+        return self.as_table()
+
+    def __iter__(self):
+        for name, field in self.fields.items():
+            yield BoundField(self, field, name)
+
+    def __getitem__(self, name):
+        "Returns a BoundField with the given name."
+        try:
+            field = self.fields[name]
+        except KeyError:
+            raise KeyError('Key %r not found in Form' % name)
+        return BoundField(self, field, name)
+
+    def _get_errors(self):
+        "Returns an ErrorDict for the data provided for the form"
+        if self._errors is None:
+            self.full_clean()
+        return self._errors
+    errors = property(_get_errors)
+
+    def is_valid(self):
+        """
+        Returns True if the form has no errors. Otherwise, False. If errors are
+        being ignored, returns False.
+        """
+        return self.is_bound and not bool(self.errors)
+
+    def add_prefix(self, field_name):
+        """
+        Returns the field name with a prefix appended, if this Form has a
+        prefix set.
+
+        Subclasses may wish to override.
+        """
+        return self.prefix and ('%s-%s' % (self.prefix, field_name)) or field_name
+
+    def _html_output(self, normal_row, error_row, row_ender, help_text_html, errors_on_separate_row):
+        "Helper function for outputting HTML. Used by as_table(), as_ul(), as_p()."
+        top_errors = self.non_field_errors() # Errors that should be displayed above all fields.
+        output, hidden_fields = [], []
+        for name, field in self.fields.items():
+            bf = BoundField(self, field, name)
+            bf_errors = self.error_class([escape(error) for error in bf.errors]) # Escape and cache in local variable.
+            if bf.is_hidden:
+                if bf_errors:
+                    top_errors.extend([u'(Hidden field %s) %s' % (name, force_unicode(e)) for e in bf_errors])
+                hidden_fields.append(unicode(bf))
+            else:
+                if errors_on_separate_row and bf_errors:
+                    output.append(error_row % force_unicode(bf_errors))
+                if bf.label:
+                    label = escape(force_unicode(bf.label))
+                    # Only add the suffix if the label does not end in
+                    # punctuation.
+                    if self.label_suffix:
+                        if label[-1] not in ':?.!':
+                            label += self.label_suffix
+                    label = bf.label_tag(label) or ''
+                else:
+                    label = ''
+                if field.help_text:
+                    help_text = help_text_html % force_unicode(field.help_text)
+                else:
+                    help_text = u''
+                output.append(normal_row % {'errors': force_unicode(bf_errors), 'label': force_unicode(label), 'field': unicode(bf), 'help_text': help_text})
+        if top_errors:
+            output.insert(0, error_row % force_unicode(top_errors))
+        if hidden_fields: # Insert any hidden fields in the last row.
+            str_hidden = u''.join(hidden_fields)
+            if output:
+                last_row = output[-1]
+                # Chop off the trailing row_ender (e.g. '</td></tr>') and
+                # insert the hidden fields.
+                output[-1] = last_row[:-len(row_ender)] + str_hidden + row_ender
+            else:
+                # If there aren't any rows in the output, just append the
+                # hidden fields.
+                output.append(str_hidden)
+        return mark_safe(u'\n'.join(output))
+
+    def as_table(self):
+        "Returns this form rendered as HTML <tr>s -- excluding the <table></table>."
+        return self._html_output(u'<tr><th>%(label)s</th><td>%(errors)s%(field)s%(help_text)s</td></tr>', u'<tr><td colspan="2">%s</td></tr>', '</td></tr>', u'<br />%s', False)
+
+    def as_ul(self):
+        "Returns this form rendered as HTML <li>s -- excluding the <ul></ul>."
+        return self._html_output(u'<li>%(errors)s%(label)s %(field)s%(help_text)s</li>', u'<li>%s</li>', '</li>', u' %s', False)
+
+    def as_p(self):
+        "Returns this form rendered as HTML <p>s."
+        return self._html_output(u'<p>%(label)s %(field)s%(help_text)s</p>', u'%s', '</p>', u' %s', True)
+
+    def non_field_errors(self):
+        """
+        Returns an ErrorList of errors that aren't associated with a particular
+        field -- i.e., from Form.clean(). Returns an empty ErrorList if there
+        are none.
+        """
+        return self.errors.get(NON_FIELD_ERRORS, self.error_class())
+
+    def full_clean(self):
+        """
+        Cleans all of self.data and populates self._errors and
+        self.cleaned_data.
+        """
+        self._errors = ErrorDict()
+        if not self.is_bound: # Stop further processing.
+            return
+        self.cleaned_data = {}
+        # If the form is permitted to be empty, and none of the form data has
+        # changed from the initial data, short circuit any validation.
+        if self.empty_permitted and not self.has_changed():
+            return
+        for name, field in self.fields.items():
+            # value_from_datadict() gets the data from the data dictionaries.
+            # Each widget type knows how to retrieve its own data, because some
+            # widgets split data over several HTML fields.
+            value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))
+            try:
+                if isinstance(field, FileField):
+                    initial = self.initial.get(name, field.initial)
+                    value = field.clean(value, initial)
+                else:
+                    value = field.clean(value)
+                self.cleaned_data[name] = value
+                if hasattr(self, 'clean_%s' % name):
+                    value = getattr(self, 'clean_%s' % name)()
+                    self.cleaned_data[name] = value
+            except ValidationError, e:
+                self._errors[name] = e.messages
+                if name in self.cleaned_data:
+                    del self.cleaned_data[name]
+        try:
+            self.cleaned_data = self.clean()
+        except ValidationError, e:
+            self._errors[NON_FIELD_ERRORS] = e.messages
+        if self._errors:
+            delattr(self, 'cleaned_data')
+
+    def clean(self):
+        """
+        Hook for doing any extra form-wide cleaning after Field.clean() been
+        called on every field. Any ValidationError raised by this method will
+        not be associated with a particular field; it will have a special-case
+        association with the field named '__all__'.
+        """
+        return self.cleaned_data
+
+    def has_changed(self):
+        """
+        Returns True if data differs from initial.
+        """
+        return bool(self.changed_data)
+    
+    def _get_changed_data(self):
+        if self._changed_data is None:
+            self._changed_data = []
+            # XXX: For now we're asking the individual widgets whether or not the
+            # data has changed. It would probably be more efficient to hash the
+            # initial data, store it in a hidden field, and compare a hash of the
+            # submitted data, but we'd need a way to easily get the string value
+            # for a given field. Right now, that logic is embedded in the render
+            # method of each widget.
+            for name, field in self.fields.items():
+                prefixed_name = self.add_prefix(name)
+                data_value = field.widget.value_from_datadict(self.data, self.files, prefixed_name)
+                initial_value = self.initial.get(name, field.initial)
+                if field.widget._has_changed(initial_value, data_value):
+                    self._changed_data.append(name)
+        return self._changed_data
+    changed_data = property(_get_changed_data)
+
+    def _get_media(self):
+        """
+        Provide a description of all media required to render the widgets on this form
+        """
+        media = Media()
+        for field in self.fields.values():
+            media = media + field.widget.media
+        return media
+    media = property(_get_media)
+
+    def is_multipart(self):
+        """
+        Returns True if the form needs to be multipart-encrypted, i.e. it has
+        FileInput. Otherwise, False.
+        """
+        for field in self.fields.values():
+            if field.widget.needs_multipart_form:
+                return True
+        return False
+
+class Form(BaseForm):
+    "A collection of Fields, plus their associated data."
+    # This is a separate class from BaseForm in order to abstract the way
+    # self.fields is specified. This class (Form) is the one that does the
+    # fancy metaclass stuff purely for the semantic sugar -- it allows one
+    # to define a form using declarative syntax.
+    # BaseForm itself has no way of designating self.fields.
+    __metaclass__ = DeclarativeFieldsMetaclass
+
+class BoundField(StrAndUnicode):
+    "A Field plus data"
+    def __init__(self, form, field, name):
+        self.form = form
+        self.field = field
+        self.name = name
+        self.html_name = form.add_prefix(name)
+        if self.field.label is None:
+            self.label = pretty_name(name)
+        else:
+            self.label = self.field.label
+        self.help_text = field.help_text or ''
+
+    def __unicode__(self):
+        """Renders this field as an HTML widget."""
+        return self.as_widget()
+
+    def _errors(self):
+        """
+        Returns an ErrorList for this field. Returns an empty ErrorList
+        if there are none.
+        """
+        return self.form.errors.get(self.name, self.form.error_class())
+    errors = property(_errors)
+
+    def as_widget(self, widget=None, attrs=None):
+        """
+        Renders the field by rendering the passed widget, adding any HTML
+        attributes passed as attrs.  If no widget is specified, then the
+        field's default widget will be used.
+        """
+        if not widget:
+            widget = self.field.widget
+        attrs = attrs or {}
+        auto_id = self.auto_id
+        if auto_id and 'id' not in attrs and 'id' not in widget.attrs:
+            attrs['id'] = auto_id
+        if not self.form.is_bound:
+            data = self.form.initial.get(self.name, self.field.initial)
+            if callable(data):
+                data = data()
+        else:
+            data = self.data
+        return widget.render(self.html_name, data, attrs=attrs)
+
+    def as_text(self, attrs=None):
+        """
+        Returns a string of HTML for representing this as an <input type="text">.
+        """
+        return self.as_widget(TextInput(), attrs)
+
+    def as_textarea(self, attrs=None):
+        "Returns a string of HTML for representing this as a <textarea>."
+        return self.as_widget(Textarea(), attrs)
+
+    def as_hidden(self, attrs=None):
+        """
+        Returns a string of HTML for representing this as an <input type="hidden">.
+        """
+        return self.as_widget(self.field.hidden_widget(), attrs)
+
+    def _data(self):
+        """
+        Returns the data for this BoundField, or None if it wasn't given.
+        """
+        return self.field.widget.value_from_datadict(self.form.data, self.form.files, self.html_name)
+    data = property(_data)
+
+    def label_tag(self, contents=None, attrs=None):
+        """
+        Wraps the given contents in a <label>, if the field has an ID attribute.
+        Does not HTML-escape the contents. If contents aren't given, uses the
+        field's HTML-escaped label.
+
+        If attrs are given, they're used as HTML attributes on the <label> tag.
+        """
+        contents = contents or escape(self.label)
+        widget = self.field.widget
+        id_ = widget.attrs.get('id') or self.auto_id
+        if id_:
+            attrs = attrs and flatatt(attrs) or ''
+            contents = '<label for="%s"%s>%s</label>' % (widget.id_for_label(id_), attrs, contents)
+        return mark_safe(contents)
+
+    def _is_hidden(self):
+        "Returns True if this BoundField's widget is hidden."
+        return self.field.widget.is_hidden
+    is_hidden = property(_is_hidden)
+
+    def _auto_id(self):
+        """
+        Calculates and returns the ID attribute for this BoundField, if the
+        associated Form has specified auto_id. Returns an empty string otherwise.
+        """
+        auto_id = self.form.auto_id
+        if auto_id and '%s' in smart_unicode(auto_id):
+            return smart_unicode(auto_id) % self.html_name
+        elif auto_id:
+            return self.html_name
+        return ''
+    auto_id = property(_auto_id)
diff --git a/webapp/django/forms/formsets.py b/webapp/django/forms/formsets.py
new file mode 100644
index 0000000..2f13bf5
--- /dev/null
+++ b/webapp/django/forms/formsets.py
@@ -0,0 +1,288 @@
+from forms import Form
+from django.utils.encoding import StrAndUnicode
+from django.utils.safestring import mark_safe
+from fields import IntegerField, BooleanField
+from widgets import Media, HiddenInput
+from util import ErrorList, ValidationError
+
+__all__ = ('BaseFormSet', 'all_valid')
+
+# special field names
+TOTAL_FORM_COUNT = 'TOTAL_FORMS'
+INITIAL_FORM_COUNT = 'INITIAL_FORMS'
+ORDERING_FIELD_NAME = 'ORDER'
+DELETION_FIELD_NAME = 'DELETE'
+
+class ManagementForm(Form):
+    """
+    ``ManagementForm`` is used to keep track of how many form instances
+    are displayed on the page. If adding new forms via javascript, you should
+    increment the count field of this form as well.
+    """
+    def __init__(self, *args, **kwargs):
+        self.base_fields[TOTAL_FORM_COUNT] = IntegerField(widget=HiddenInput)
+        self.base_fields[INITIAL_FORM_COUNT] = IntegerField(widget=HiddenInput)
+        super(ManagementForm, self).__init__(*args, **kwargs)
+
+class BaseFormSet(StrAndUnicode):
+    """
+    A collection of instances of the same Form class.
+    """
+    def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None,
+                 initial=None, error_class=ErrorList):
+        self.is_bound = data is not None or files is not None
+        self.prefix = prefix or 'form'
+        self.auto_id = auto_id
+        self.data = data
+        self.files = files
+        self.initial = initial
+        self.error_class = error_class
+        self._errors = None
+        self._non_form_errors = None
+        # initialization is different depending on whether we recieved data, initial, or nothing
+        if data or files:
+            self.management_form = ManagementForm(data, auto_id=self.auto_id, prefix=self.prefix)
+            if self.management_form.is_valid():
+                self._total_form_count = self.management_form.cleaned_data[TOTAL_FORM_COUNT]
+                self._initial_form_count = self.management_form.cleaned_data[INITIAL_FORM_COUNT]
+            else:
+                raise ValidationError('ManagementForm data is missing or has been tampered with')
+        else:
+            if initial:
+                self._initial_form_count = len(initial)
+                if self._initial_form_count > self.max_num and self.max_num > 0:
+                    self._initial_form_count = self.max_num
+                self._total_form_count = self._initial_form_count + self.extra
+            else:
+                self._initial_form_count = 0
+                self._total_form_count = self.extra
+            if self._total_form_count > self.max_num and self.max_num > 0:
+                self._total_form_count = self.max_num
+            initial = {TOTAL_FORM_COUNT: self._total_form_count,
+                       INITIAL_FORM_COUNT: self._initial_form_count}
+            self.management_form = ManagementForm(initial=initial, auto_id=self.auto_id, prefix=self.prefix)
+        
+        # construct the forms in the formset
+        self._construct_forms()
+
+    def __unicode__(self):
+        return self.as_table()
+
+    def _construct_forms(self):
+        # instantiate all the forms and put them in self.forms
+        self.forms = []
+        for i in xrange(self._total_form_count):
+            self.forms.append(self._construct_form(i))
+    
+    def _construct_form(self, i, **kwargs):
+        """
+        Instantiates and returns the i-th form instance in a formset.
+        """
+        defaults = {'auto_id': self.auto_id, 'prefix': self.add_prefix(i)}
+        if self.data or self.files:
+            defaults['data'] = self.data
+            defaults['files'] = self.files
+        if self.initial:
+            try:
+                defaults['initial'] = self.initial[i]
+            except IndexError:
+                pass
+        # Allow extra forms to be empty.
+        if i >= self._initial_form_count:
+            defaults['empty_permitted'] = True
+        defaults.update(kwargs)
+        form = self.form(**defaults)
+        self.add_fields(form, i)
+        return form
+
+    def _get_initial_forms(self):
+        """Return a list of all the intial forms in this formset."""
+        return self.forms[:self._initial_form_count]
+    initial_forms = property(_get_initial_forms)
+
+    def _get_extra_forms(self):
+        """Return a list of all the extra forms in this formset."""
+        return self.forms[self._initial_form_count:]
+    extra_forms = property(_get_extra_forms)
+
+    # Maybe this should just go away?
+    def _get_cleaned_data(self):
+        """
+        Returns a list of form.cleaned_data dicts for every form in self.forms.
+        """
+        if not self.is_valid():
+            raise AttributeError("'%s' object has no attribute 'cleaned_data'" % self.__class__.__name__)
+        return [form.cleaned_data for form in self.forms]
+    cleaned_data = property(_get_cleaned_data)
+
+    def _get_deleted_forms(self):
+        """
+        Returns a list of forms that have been marked for deletion. Raises an 
+        AttributeError is deletion is not allowed.
+        """
+        if not self.is_valid() or not self.can_delete:
+            raise AttributeError("'%s' object has no attribute 'deleted_forms'" % self.__class__.__name__)
+        # construct _deleted_form_indexes which is just a list of form indexes
+        # that have had their deletion widget set to True
+        if not hasattr(self, '_deleted_form_indexes'):
+            self._deleted_form_indexes = []
+            for i in range(0, self._total_form_count):
+                form = self.forms[i]
+                # if this is an extra form and hasn't changed, don't consider it
+                if i >= self._initial_form_count and not form.has_changed():
+                    continue
+                if form.cleaned_data[DELETION_FIELD_NAME]:
+                    self._deleted_form_indexes.append(i)
+        return [self.forms[i] for i in self._deleted_form_indexes]
+    deleted_forms = property(_get_deleted_forms)
+
+    def _get_ordered_forms(self):
+        """
+        Returns a list of form in the order specified by the incoming data.
+        Raises an AttributeError is deletion is not allowed.
+        """
+        if not self.is_valid() or not self.can_order:
+            raise AttributeError("'%s' object has no attribute 'ordered_forms'" % self.__class__.__name__)
+        # Construct _ordering, which is a list of (form_index, order_field_value)
+        # tuples. After constructing this list, we'll sort it by order_field_value
+        # so we have a way to get to the form indexes in the order specified
+        # by the form data.
+        if not hasattr(self, '_ordering'):
+            self._ordering = []
+            for i in range(0, self._total_form_count):
+                form = self.forms[i]
+                # if this is an extra form and hasn't changed, don't consider it
+                if i >= self._initial_form_count and not form.has_changed():
+                    continue
+                # don't add data marked for deletion to self.ordered_data
+                if self.can_delete and form.cleaned_data[DELETION_FIELD_NAME]:
+                    continue
+                # A sort function to order things numerically ascending, but
+                # None should be sorted below anything else. Allowing None as
+                # a comparison value makes it so we can leave ordering fields
+                # blamk.
+                def compare_ordering_values(x, y):
+                    if x[1] is None:
+                        return 1
+                    if y[1] is None:
+                        return -1
+                    return x[1] - y[1]
+                self._ordering.append((i, form.cleaned_data[ORDERING_FIELD_NAME]))
+            # After we're done populating self._ordering, sort it.
+            self._ordering.sort(compare_ordering_values)
+        # Return a list of form.cleaned_data dicts in the order spcified by
+        # the form data.
+        return [self.forms[i[0]] for i in self._ordering]
+    ordered_forms = property(_get_ordered_forms)
+
+    def non_form_errors(self):
+        """
+        Returns an ErrorList of errors that aren't associated with a particular
+        form -- i.e., from formset.clean(). Returns an empty ErrorList if there
+        are none.
+        """
+        if self._non_form_errors is not None:
+            return self._non_form_errors
+        return self.error_class()
+
+    def _get_errors(self):
+        """
+        Returns a list of form.errors for every form in self.forms.
+        """
+        if self._errors is None:
+            self.full_clean()
+        return self._errors
+    errors = property(_get_errors)
+
+    def is_valid(self):
+        """
+        Returns True if form.errors is empty for every form in self.forms.
+        """
+        if not self.is_bound:
+            return False
+        # We loop over every form.errors here rather than short circuiting on the
+        # first failure to make sure validation gets triggered for every form.
+        forms_valid = True
+        for errors in self.errors:
+            if bool(errors):
+                forms_valid = False
+        return forms_valid and not bool(self.non_form_errors())
+
+    def full_clean(self):
+        """
+        Cleans all of self.data and populates self._errors.
+        """
+        self._errors = []
+        if not self.is_bound: # Stop further processing.
+            return
+        for i in range(0, self._total_form_count):
+            form = self.forms[i]
+            self._errors.append(form.errors)
+        # Give self.clean() a chance to do cross-form validation.
+        try:
+            self.clean()
+        except ValidationError, e:
+            self._non_form_errors = e.messages
+
+    def clean(self):
+        """
+        Hook for doing any extra formset-wide cleaning after Form.clean() has
+        been called on every form. Any ValidationError raised by this method
+        will not be associated with a particular form; it will be accesible
+        via formset.non_form_errors()
+        """
+        pass
+
+    def add_fields(self, form, index):
+        """A hook for adding extra fields on to each form instance."""
+        if self.can_order:
+            # Only pre-fill the ordering field for initial forms.
+            if index < self._initial_form_count:
+                form.fields[ORDERING_FIELD_NAME] = IntegerField(label='Order', initial=index+1, required=False)
+            else:
+                form.fields[ORDERING_FIELD_NAME] = IntegerField(label='Order', required=False)
+        if self.can_delete:
+            form.fields[DELETION_FIELD_NAME] = BooleanField(label='Delete', required=False)
+
+    def add_prefix(self, index):
+        return '%s-%s' % (self.prefix, index)
+
+    def is_multipart(self):
+        """
+        Returns True if the formset needs to be multipart-encrypted, i.e. it
+        has FileInput. Otherwise, False.
+        """
+        return self.forms[0].is_multipart()
+
+    def _get_media(self):
+        # All the forms on a FormSet are the same, so you only need to
+        # interrogate the first form for media.
+        if self.forms:
+            return self.forms[0].media
+        else:
+            return Media()
+    media = property(_get_media)
+
+    def as_table(self):
+        "Returns this formset rendered as HTML <tr>s -- excluding the <table></table>."
+        # XXX: there is no semantic division between forms here, there
+        # probably should be. It might make sense to render each form as a
+        # table row with each field as a td.
+        forms = u' '.join([form.as_table() for form in self.forms])
+        return mark_safe(u'\n'.join([unicode(self.management_form), forms]))
+
+def formset_factory(form, formset=BaseFormSet, extra=1, can_order=False,
+                    can_delete=False, max_num=0):
+    """Return a FormSet for the given form class."""
+    attrs = {'form': form, 'extra': extra,
+             'can_order': can_order, 'can_delete': can_delete,
+             'max_num': max_num}
+    return type(form.__name__ + 'FormSet', (formset,), attrs)
+
+def all_valid(formsets):
+    """Returns true if every formset in formsets is valid."""
+    valid = True
+    for formset in formsets:
+        if not formset.is_valid():
+            valid = False
+    return valid
diff --git a/webapp/django/forms/models.py b/webapp/django/forms/models.py
new file mode 100644
index 0000000..677556d
--- /dev/null
+++ b/webapp/django/forms/models.py
@@ -0,0 +1,558 @@
+"""
+Helper functions for creating Form classes from Django models
+and database field objects.
+"""
+
+from django.utils.translation import ugettext_lazy as _
+from django.utils.encoding import smart_unicode
+from django.utils.datastructures import SortedDict
+
+from util import ValidationError, ErrorList
+from forms import BaseForm, get_declared_fields
+from fields import Field, ChoiceField, IntegerField, EMPTY_VALUES
+from widgets import Select, SelectMultiple, HiddenInput, MultipleHiddenInput
+from widgets import media_property
+from formsets import BaseFormSet, formset_factory, DELETION_FIELD_NAME
+
+__all__ = (
+    'ModelForm', 'BaseModelForm', 'model_to_dict', 'fields_for_model',
+    'save_instance', 'form_for_fields', 'ModelChoiceField',
+    'ModelMultipleChoiceField',
+)
+
+def save_instance(form, instance, fields=None, fail_message='saved',
+                  commit=True):
+    """
+    Saves bound Form ``form``'s cleaned_data into model instance ``instance``.
+
+    If commit=True, then the changes to ``instance`` will be saved to the
+    database. Returns ``instance``.
+    """
+    from django.db import models
+    opts = instance._meta
+    if form.errors:
+        raise ValueError("The %s could not be %s because the data didn't"
+                         " validate." % (opts.object_name, fail_message))
+    cleaned_data = form.cleaned_data
+    for f in opts.fields:
+        if not f.editable or isinstance(f, models.AutoField) \
+                or not f.name in cleaned_data:
+            continue
+        if fields and f.name not in fields:
+            continue
+        f.save_form_data(instance, cleaned_data[f.name])
+    # Wrap up the saving of m2m data as a function.
+    def save_m2m():
+        opts = instance._meta
+        cleaned_data = form.cleaned_data
+        for f in opts.many_to_many:
+            if fields and f.name not in fields:
+                continue
+            if f.name in cleaned_data:
+                f.save_form_data(instance, cleaned_data[f.name])
+    if commit:
+        # If we are committing, save the instance and the m2m data immediately.
+        instance.save()
+        save_m2m()
+    else:
+        # We're not committing. Add a method to the form to allow deferred
+        # saving of m2m data.
+        form.save_m2m = save_m2m
+    return instance
+
+def make_model_save(model, fields, fail_message):
+    """Returns the save() method for a Form."""
+    def save(self, commit=True):
+        return save_instance(self, model(), fields, fail_message, commit)
+    return save
+
+def make_instance_save(instance, fields, fail_message):
+    """Returns the save() method for a Form."""
+    def save(self, commit=True):
+        return save_instance(self, instance, fields, fail_message, commit)
+    return save
+
+def form_for_fields(field_list):
+    """
+    Returns a Form class for the given list of Django database field instances.
+    """
+    fields = SortedDict([(f.name, f.formfield())
+                         for f in field_list if f.editable])
+    return type('FormForFields', (BaseForm,), {'base_fields': fields})
+
+
+# ModelForms #################################################################
+
+def model_to_dict(instance, fields=None, exclude=None):
+    """
+    Returns a dict containing the data in ``instance`` suitable for passing as
+    a Form's ``initial`` keyword argument.
+
+    ``fields`` is an optional list of field names. If provided, only the named
+    fields will be included in the returned dict.
+
+    ``exclude`` is an optional list of field names. If provided, the named
+    fields will be excluded from the returned dict, even if they are listed in
+    the ``fields`` argument.
+    """
+    # avoid a circular import
+    from django.db.models.fields.related import ManyToManyField, OneToOneField
+    opts = instance._meta
+    data = {}
+    for f in opts.fields + opts.many_to_many:
+        if not f.editable:
+            continue
+        if fields and not f.name in fields:
+            continue
+        if exclude and f.name in exclude:
+            continue
+        if isinstance(f, ManyToManyField):
+            # If the object doesn't have a primry key yet, just use an empty
+            # list for its m2m fields. Calling f.value_from_object will raise
+            # an exception.
+            if instance.pk is None:
+                data[f.name] = []
+            else:
+                # MultipleChoiceWidget needs a list of pks, not object instances.
+                data[f.name] = [obj.pk for obj in f.value_from_object(instance)]
+        elif isinstance(f, OneToOneField):
+            data[f.attname] = f.value_from_object(instance)
+        else:
+            data[f.name] = f.value_from_object(instance)
+    return data
+
+def fields_for_model(model, fields=None, exclude=None, formfield_callback=lambda f: f.formfield()):
+    """
+    Returns a ``SortedDict`` containing form fields for the given model.
+
+    ``fields`` is an optional list of field names. If provided, only the named
+    fields will be included in the returned fields.
+
+    ``exclude`` is an optional list of field names. If provided, the named
+    fields will be excluded from the returned fields, even if they are listed
+    in the ``fields`` argument.
+    """
+    # TODO: if fields is provided, it would be nice to return fields in that order
+    field_list = []
+    opts = model._meta
+    for f in opts.fields + opts.many_to_many:
+        if not f.editable:
+            continue
+        if fields and not f.name in fields:
+            continue
+        if exclude and f.name in exclude:
+            continue
+        formfield = formfield_callback(f)
+        if formfield:
+            field_list.append((f.name, formfield))
+    return SortedDict(field_list)
+
+class ModelFormOptions(object):
+    def __init__(self, options=None):
+        self.model = getattr(options, 'model', None)
+        self.fields = getattr(options, 'fields', None)
+        self.exclude = getattr(options, 'exclude', None)
+
+
+class ModelFormMetaclass(type):
+    def __new__(cls, name, bases, attrs):
+        formfield_callback = attrs.pop('formfield_callback',
+                lambda f: f.formfield())
+        try:
+            parents = [b for b in bases if issubclass(b, ModelForm)]
+        except NameError:
+            # We are defining ModelForm itself.
+            parents = None
+        new_class = super(ModelFormMetaclass, cls).__new__(cls, name, bases,
+                attrs)
+        if not parents:
+            return new_class
+
+        if 'media' not in attrs:
+            new_class.media = media_property(new_class)
+        declared_fields = get_declared_fields(bases, attrs, False)
+        opts = new_class._meta = ModelFormOptions(getattr(new_class, 'Meta', None))
+        if opts.model:
+            # If a model is defined, extract form fields from it.
+            fields = fields_for_model(opts.model, opts.fields,
+                                      opts.exclude, formfield_callback)
+            # Override default model fields with any custom declared ones
+            # (plus, include all the other declared fields).
+            fields.update(declared_fields)
+        else:
+            fields = declared_fields
+        new_class.declared_fields = declared_fields
+        new_class.base_fields = fields
+        return new_class
+
+class BaseModelForm(BaseForm):
+    def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None,
+                 initial=None, error_class=ErrorList, label_suffix=':',
+                 empty_permitted=False, instance=None):
+        opts = self._meta
+        if instance is None:
+            # if we didn't get an instance, instantiate a new one
+            self.instance = opts.model()
+            object_data = {}
+        else:
+            self.instance = instance
+            object_data = model_to_dict(instance, opts.fields, opts.exclude)
+        # if initial was provided, it should override the values from instance
+        if initial is not None:
+            object_data.update(initial)
+        super(BaseModelForm, self).__init__(data, files, auto_id, prefix, object_data,
+                                            error_class, label_suffix, empty_permitted)
+
+    def save(self, commit=True):
+        """
+        Saves this ``form``'s cleaned_data into model instance
+        ``self.instance``.
+
+        If commit=True, then the changes to ``instance`` will be saved to the
+        database. Returns ``instance``.
+        """
+        if self.instance.pk is None:
+            fail_message = 'created'
+        else:
+            fail_message = 'changed'
+        return save_instance(self, self.instance, self._meta.fields, fail_message, commit)
+
+class ModelForm(BaseModelForm):
+    __metaclass__ = ModelFormMetaclass
+
+def modelform_factory(model, form=ModelForm, fields=None, exclude=None,
+                       formfield_callback=lambda f: f.formfield()):
+    # HACK: we should be able to construct a ModelForm without creating
+    # and passing in a temporary inner class
+    class Meta:
+        pass
+    setattr(Meta, 'model', model)
+    setattr(Meta, 'fields', fields)
+    setattr(Meta, 'exclude', exclude)
+    class_name = model.__name__ + 'Form'
+    return ModelFormMetaclass(class_name, (form,), {'Meta': Meta,
+                              'formfield_callback': formfield_callback})
+
+
+# ModelFormSets ##############################################################
+
+class BaseModelFormSet(BaseFormSet):
+    """
+    A ``FormSet`` for editing a queryset and/or adding new objects to it.
+    """
+    model = None
+
+    def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None,
+                 queryset=None, **kwargs):
+        self.queryset = queryset
+        defaults = {'data': data, 'files': files, 'auto_id': auto_id, 'prefix': prefix}
+        if self.max_num > 0:
+            qs = self.get_queryset()[:self.max_num]
+        else:
+            qs = self.get_queryset()
+        defaults['initial'] = [model_to_dict(obj) for obj in qs]
+        defaults.update(kwargs)
+        super(BaseModelFormSet, self).__init__(**defaults)
+
+    def get_queryset(self):
+        if self.queryset is not None:
+            return self.queryset
+        return self.model._default_manager.get_query_set()
+
+    def save_new(self, form, commit=True):
+        """Saves and returns a new model instance for the given form."""
+        return save_instance(form, self.model(), commit=commit)
+
+    def save_existing(self, form, instance, commit=True):
+        """Saves and returns an existing model instance for the given form."""
+        return save_instance(form, instance, commit=commit)
+
+    def save(self, commit=True):
+        """Saves model instances for every form, adding and changing instances
+        as necessary, and returns the list of instances.
+        """
+        if not commit:
+            self.saved_forms = []
+            def save_m2m():
+                for form in self.saved_forms:
+                    form.save_m2m()
+            self.save_m2m = save_m2m
+        return self.save_existing_objects(commit) + self.save_new_objects(commit)
+
+    def save_existing_objects(self, commit=True):
+        self.changed_objects = []
+        self.deleted_objects = []
+        if not self.get_queryset():
+            return []
+
+        # Put the objects from self.get_queryset into a dict so they are easy to lookup by pk
+        existing_objects = {}
+        for obj in self.get_queryset():
+            existing_objects[obj.pk] = obj
+        saved_instances = []
+        for form in self.initial_forms:
+            obj = existing_objects[form.cleaned_data[self.model._meta.pk.attname]]
+            if self.can_delete and form.cleaned_data[DELETION_FIELD_NAME]:
+                self.deleted_objects.append(obj)
+                obj.delete()
+            else:
+                if form.changed_data:
+                    self.changed_objects.append((obj, form.changed_data))
+                    saved_instances.append(self.save_existing(form, obj, commit=commit))
+                    if not commit:
+                        self.saved_forms.append(form)
+        return saved_instances
+
+    def save_new_objects(self, commit=True):
+        self.new_objects = []
+        for form in self.extra_forms:
+            if not form.has_changed():
+                continue
+            # If someone has marked an add form for deletion, don't save the
+            # object.
+            if self.can_delete and form.cleaned_data[DELETION_FIELD_NAME]:
+                continue
+            self.new_objects.append(self.save_new(form, commit=commit))
+            if not commit:
+                self.saved_forms.append(form)
+        return self.new_objects
+
+    def add_fields(self, form, index):
+        """Add a hidden field for the object's primary key."""
+        if self.model._meta.pk.auto_created:
+            self._pk_field_name = self.model._meta.pk.attname
+            form.fields[self._pk_field_name] = IntegerField(required=False, widget=HiddenInput)
+        super(BaseModelFormSet, self).add_fields(form, index)
+
+def modelformset_factory(model, form=ModelForm, formfield_callback=lambda f: f.formfield(),
+                         formset=BaseModelFormSet,
+                         extra=1, can_delete=False, can_order=False,
+                         max_num=0, fields=None, exclude=None):
+    """
+    Returns a FormSet class for the given Django model class.
+    """
+    form = modelform_factory(model, form=form, fields=fields, exclude=exclude,
+                             formfield_callback=formfield_callback)
+    FormSet = formset_factory(form, formset, extra=extra, max_num=max_num,
+                              can_order=can_order, can_delete=can_delete)
+    FormSet.model = model
+    return FormSet
+
+
+# InlineFormSets #############################################################
+
+class BaseInlineFormSet(BaseModelFormSet):
+    """A formset for child objects related to a parent."""
+    def __init__(self, data=None, files=None, instance=None,
+                 save_as_new=False, prefix=None):
+        from django.db.models.fields.related import RelatedObject
+        self.instance = instance
+        self.save_as_new = save_as_new
+        # is there a better way to get the object descriptor?
+        self.rel_name = RelatedObject(self.fk.rel.to, self.model, self.fk).get_accessor_name()
+        super(BaseInlineFormSet, self).__init__(data, files, prefix=prefix or self.rel_name)
+
+    def _construct_forms(self):
+        if self.save_as_new:
+            self._total_form_count = self._initial_form_count
+            self._initial_form_count = 0
+        super(BaseInlineFormSet, self)._construct_forms()
+
+    def get_queryset(self):
+        """
+        Returns this FormSet's queryset, but restricted to children of
+        self.instance
+        """
+        kwargs = {self.fk.name: self.instance}
+        return self.model._default_manager.filter(**kwargs)
+
+    def save_new(self, form, commit=True):
+        kwargs = {self.fk.get_attname(): self.instance.pk}
+        new_obj = self.model(**kwargs)
+        return save_instance(form, new_obj, commit=commit)
+
+def _get_foreign_key(parent_model, model, fk_name=None):
+    """
+    Finds and returns the ForeignKey from model to parent if there is one.
+    If fk_name is provided, assume it is the name of the ForeignKey field.
+    """
+    # avoid circular import
+    from django.db.models import ForeignKey
+    opts = model._meta
+    if fk_name:
+        fks_to_parent = [f for f in opts.fields if f.name == fk_name]
+        if len(fks_to_parent) == 1:
+            fk = fks_to_parent[0]
+            if not isinstance(fk, ForeignKey) or \
+                    (fk.rel.to != parent_model and
+                     fk.rel.to not in parent_model._meta.parents.keys()):
+                raise Exception("fk_name '%s' is not a ForeignKey to %s" % (fk_name, parent_model))
+        elif len(fks_to_parent) == 0:
+            raise Exception("%s has no field named '%s'" % (model, fk_name))
+    else:
+        # Try to discover what the ForeignKey from model to parent_model is
+        fks_to_parent = [
+            f for f in opts.fields
+            if isinstance(f, ForeignKey)
+            and (f.rel.to == parent_model
+                or f.rel.to in parent_model._meta.parents.keys())
+        ]
+        if len(fks_to_parent) == 1:
+            fk = fks_to_parent[0]
+        elif len(fks_to_parent) == 0:
+            raise Exception("%s has no ForeignKey to %s" % (model, parent_model))
+        else:
+            raise Exception("%s has more than 1 ForeignKey to %s" % (model, parent_model))
+    return fk
+
+
+def inlineformset_factory(parent_model, model, form=ModelForm,
+                          formset=BaseInlineFormSet, fk_name=None,
+                          fields=None, exclude=None,
+                          extra=3, can_order=False, can_delete=True, max_num=0,
+                          formfield_callback=lambda f: f.formfield()):
+    """
+    Returns an ``InlineFormSet`` for the given kwargs.
+
+    You must provide ``fk_name`` if ``model`` has more than one ``ForeignKey``
+    to ``parent_model``.
+    """
+    fk = _get_foreign_key(parent_model, model, fk_name=fk_name)
+    # let the formset handle object deletion by default
+
+    if exclude is not None:
+        exclude.append(fk.name)
+    else:
+        exclude = [fk.name]
+    FormSet = modelformset_factory(model, form=form,
+                                    formfield_callback=formfield_callback,
+                                    formset=formset,
+                                    extra=extra, can_delete=can_delete, can_order=can_order,
+                                    fields=fields, exclude=exclude, max_num=max_num)
+    FormSet.fk = fk
+    return FormSet
+
+
+# Fields #####################################################################
+
+class ModelChoiceIterator(object):
+    def __init__(self, field):
+        self.field = field
+        self.queryset = field.queryset
+
+    def __iter__(self):
+        if self.field.empty_label is not None:
+            yield (u"", self.field.empty_label)
+        if self.field.cache_choices:
+            if self.field.choice_cache is None:
+                self.field.choice_cache = [
+                    (obj.pk, self.field.label_from_instance(obj))
+                    for obj in self.queryset.all()
+                ]
+            for choice in self.field.choice_cache:
+                yield choice
+        else:
+            for obj in self.queryset.all():
+                yield (obj.pk, self.field.label_from_instance(obj))
+
+class ModelChoiceField(ChoiceField):
+    """A ChoiceField whose choices are a model QuerySet."""
+    # This class is a subclass of ChoiceField for purity, but it doesn't
+    # actually use any of ChoiceField's implementation.
+    default_error_messages = {
+        'invalid_choice': _(u'Select a valid choice. That choice is not one of'
+                            u' the available choices.'),
+    }
+
+    def __init__(self, queryset, empty_label=u"---------", cache_choices=False,
+                 required=True, widget=None, label=None, initial=None,
+                 help_text=None, *args, **kwargs):
+        self.empty_label = empty_label
+        self.cache_choices = cache_choices
+
+        # Call Field instead of ChoiceField __init__() because we don't need
+        # ChoiceField.__init__().
+        Field.__init__(self, required, widget, label, initial, help_text,
+                       *args, **kwargs)
+        self.queryset = queryset
+        self.choice_cache = None
+
+    def _get_queryset(self):
+        return self._queryset
+
+    def _set_queryset(self, queryset):
+        self._queryset = queryset
+        self.widget.choices = self.choices
+
+    queryset = property(_get_queryset, _set_queryset)
+
+    # this method will be used to create object labels by the QuerySetIterator.
+    # Override it to customize the label.
+    def label_from_instance(self, obj):
+        """
+        This method is used to convert objects into strings; it's used to
+        generate the labels for the choices presented by this object. Subclasses
+        can override this method to customize the display of the choices.
+        """
+        return smart_unicode(obj)
+
+    def _get_choices(self):
+        # If self._choices is set, then somebody must have manually set
+        # the property self.choices. In this case, just return self._choices.
+        if hasattr(self, '_choices'):
+            return self._choices
+
+        # Otherwise, execute the QuerySet in self.queryset to determine the
+        # choices dynamically. Return a fresh QuerySetIterator that has not been
+        # consumed. Note that we're instantiating a new QuerySetIterator *each*
+        # time _get_choices() is called (and, thus, each time self.choices is
+        # accessed) so that we can ensure the QuerySet has not been consumed. This
+        # construct might look complicated but it allows for lazy evaluation of
+        # the queryset.
+        return ModelChoiceIterator(self)
+
+    choices = property(_get_choices, ChoiceField._set_choices)
+
+    def clean(self, value):
+        Field.clean(self, value)
+        if value in EMPTY_VALUES:
+            return None
+        try:
+            value = self.queryset.get(pk=value)
+        except self.queryset.model.DoesNotExist:
+            raise ValidationError(self.error_messages['invalid_choice'])
+        return value
+
+class ModelMultipleChoiceField(ModelChoiceField):
+    """A MultipleChoiceField whose choices are a model QuerySet."""
+    widget = SelectMultiple
+    hidden_widget = MultipleHiddenInput
+    default_error_messages = {
+        'list': _(u'Enter a list of values.'),
+        'invalid_choice': _(u'Select a valid choice. %s is not one of the'
+                            u' available choices.'),
+    }
+
+    def __init__(self, queryset, cache_choices=False, required=True,
+                 widget=None, label=None, initial=None,
+                 help_text=None, *args, **kwargs):
+        super(ModelMultipleChoiceField, self).__init__(queryset, None,
+            cache_choices, required, widget, label, initial, help_text,
+            *args, **kwargs)
+
+    def clean(self, value):
+        if self.required and not value:
+            raise ValidationError(self.error_messages['required'])
+        elif not self.required and not value:
+            return []
+        if not isinstance(value, (list, tuple)):
+            raise ValidationError(self.error_messages['list'])
+        final_values = []
+        for val in value:
+            try:
+                obj = self.queryset.get(pk=val)
+            except self.queryset.model.DoesNotExist:
+                raise ValidationError(self.error_messages['invalid_choice'] % val)
+            else:
+                final_values.append(obj)
+        return final_values
diff --git a/webapp/django/forms/util.py b/webapp/django/forms/util.py
new file mode 100644
index 0000000..3d80ad2
--- /dev/null
+++ b/webapp/django/forms/util.py
@@ -0,0 +1,68 @@
+from django.utils.html import escape
+from django.utils.encoding import smart_unicode, StrAndUnicode, force_unicode
+from django.utils.safestring import mark_safe
+
+def flatatt(attrs):
+    """
+    Convert a dictionary of attributes to a single string.
+    The returned string will contain a leading space followed by key="value",
+    XML-style pairs.  It is assumed that the keys do not need to be XML-escaped.
+    If the passed dictionary is empty, then return an empty string.
+    """
+    return u''.join([u' %s="%s"' % (k, escape(v)) for k, v in attrs.items()])
+
+class ErrorDict(dict, StrAndUnicode):
+    """
+    A collection of errors that knows how to display itself in various formats.
+
+    The dictionary keys are the field names, and the values are the errors.
+    """
+    def __unicode__(self):
+        return self.as_ul()
+
+    def as_ul(self):
+        if not self: return u''
+        return mark_safe(u'<ul class="errorlist">%s</ul>'
+                % ''.join([u'<li>%s%s</li>' % (k, force_unicode(v))
+                    for k, v in self.items()]))
+
+    def as_text(self):
+        return u'\n'.join([u'* %s\n%s' % (k, u'\n'.join([u'  * %s' % force_unicode(i) for i in v])) for k, v in self.items()])
+
+class ErrorList(list, StrAndUnicode):
+    """
+    A collection of errors that knows how to display itself in various formats.
+    """
+    def __unicode__(self):
+        return self.as_ul()
+
+    def as_ul(self):
+        if not self: return u''
+        return mark_safe(u'<ul class="errorlist">%s</ul>'
+                % ''.join([u'<li>%s</li>' % force_unicode(e) for e in self]))
+
+    def as_text(self):
+        if not self: return u''
+        return u'\n'.join([u'* %s' % force_unicode(e) for e in self])
+
+    def __repr__(self):
+        return repr([force_unicode(e) for e in self])
+
+class ValidationError(Exception):
+    def __init__(self, message):
+        """
+        ValidationError can be passed any object that can be printed (usually
+        a string) or a list of objects.
+        """
+        if isinstance(message, list):
+            self.messages = ErrorList([smart_unicode(msg) for msg in message])
+        else:
+            message = smart_unicode(message)
+            self.messages = ErrorList([message])
+
+    def __str__(self):
+        # This is needed because, without a __str__(), printing an exception
+        # instance would result in this:
+        # AttributeError: ValidationError instance has no attribute 'args'
+        # See http://www.python.org/doc/current/tut/node10.html#handling
+        return repr(self.messages)
diff --git a/webapp/django/forms/widgets.py b/webapp/django/forms/widgets.py
new file mode 100644
index 0000000..2e01634
--- /dev/null
+++ b/webapp/django/forms/widgets.py
@@ -0,0 +1,663 @@
+"""
+HTML Widget classes
+"""
+
+try:
+    set
+except NameError:
+    from sets import Set as set   # Python 2.3 fallback
+
+import copy
+from itertools import chain
+from django.conf import settings
+from django.utils.datastructures import MultiValueDict, MergeDict
+from django.utils.html import escape, conditional_escape
+from django.utils.translation import ugettext
+from django.utils.encoding import StrAndUnicode, force_unicode
+from django.utils.safestring import mark_safe
+from django.utils import datetime_safe
+from util import flatatt
+from urlparse import urljoin
+
+__all__ = (
+    'Media', 'MediaDefiningClass', 'Widget', 'TextInput', 'PasswordInput',
+    'HiddenInput', 'MultipleHiddenInput',
+    'FileInput', 'DateTimeInput', 'TimeInput', 'Textarea', 'CheckboxInput',
+    'Select', 'NullBooleanSelect', 'SelectMultiple', 'RadioSelect',
+    'CheckboxSelectMultiple', 'MultiWidget', 'SplitDateTimeWidget',
+)
+
+MEDIA_TYPES = ('css','js')
+
+class Media(StrAndUnicode):
+    def __init__(self, media=None, **kwargs):
+        if media:
+            media_attrs = media.__dict__
+        else:
+            media_attrs = kwargs
+
+        self._css = {}
+        self._js = []
+
+        for name in MEDIA_TYPES:
+            getattr(self, 'add_' + name)(media_attrs.get(name, None))
+
+        # Any leftover attributes must be invalid.
+        # if media_attrs != {}:
+        #     raise TypeError, "'class Media' has invalid attribute(s): %s" % ','.join(media_attrs.keys())
+
+    def __unicode__(self):
+        return self.render()
+
+    def render(self):
+        return mark_safe(u'\n'.join(chain(*[getattr(self, 'render_' + name)() for name in MEDIA_TYPES])))
+
+    def render_js(self):
+        return [u'<script type="text/javascript" src="%s"></script>' % self.absolute_path(path) for path in self._js]
+
+    def render_css(self):
+        # To keep rendering order consistent, we can't just iterate over items().
+        # We need to sort the keys, and iterate over the sorted list.
+        media = self._css.keys()
+        media.sort()
+        return chain(*[
+            [u'<link href="%s" type="text/css" media="%s" rel="stylesheet" />' % (self.absolute_path(path), medium)
+                    for path in self._css[medium]]
+                for medium in media])
+
+    def absolute_path(self, path):
+        if path.startswith(u'http://') or path.startswith(u'https://') or path.startswith(u'/'):
+            return path
+        return urljoin(settings.MEDIA_URL,path)
+
+    def __getitem__(self, name):
+        "Returns a Media object that only contains media of the given type"
+        if name in MEDIA_TYPES:
+            return Media(**{name: getattr(self, '_' + name)})
+        raise KeyError('Unknown media type "%s"' % name)
+
+    def add_js(self, data):
+        if data:
+            self._js.extend([path for path in data if path not in self._js])
+
+    def add_css(self, data):
+        if data:
+            for medium, paths in data.items():
+                self._css.setdefault(medium, []).extend([path for path in paths if path not in self._css[medium]])
+
+    def __add__(self, other):
+        combined = Media()
+        for name in MEDIA_TYPES:
+            getattr(combined, 'add_' + name)(getattr(self, '_' + name, None))
+            getattr(combined, 'add_' + name)(getattr(other, '_' + name, None))
+        return combined
+
+def media_property(cls):
+    def _media(self):
+        # Get the media property of the superclass, if it exists
+        if hasattr(super(cls, self), 'media'):
+            base = super(cls, self).media
+        else:
+            base = Media()
+
+        # Get the media definition for this class
+        definition = getattr(cls, 'Media', None)
+        if definition:
+            extend = getattr(definition, 'extend', True)
+            if extend:
+                if extend == True:
+                    m = base
+                else:
+                    m = Media()
+                    for medium in extend:
+                        m = m + base[medium]
+                return m + Media(definition)
+            else:
+                return Media(definition)
+        else:
+            return base
+    return property(_media)
+
+class MediaDefiningClass(type):
+    "Metaclass for classes that can have media definitions"
+    def __new__(cls, name, bases, attrs):
+        new_class = super(MediaDefiningClass, cls).__new__(cls, name, bases,
+                                                           attrs)
+        if 'media' not in attrs:
+            new_class.media = media_property(new_class)
+        return new_class
+
+class Widget(object):
+    __metaclass__ = MediaDefiningClass
+    is_hidden = False          # Determines whether this corresponds to an <input type="hidden">.
+    needs_multipart_form = False # Determines does this widget need multipart-encrypted form
+
+    def __init__(self, attrs=None):
+        if attrs is not None:
+            self.attrs = attrs.copy()
+        else:
+            self.attrs = {}
+
+    def __deepcopy__(self, memo):
+        obj = copy.copy(self)
+        obj.attrs = self.attrs.copy()
+        memo[id(self)] = obj
+        return obj
+
+    def render(self, name, value, attrs=None):
+        """
+        Returns this Widget rendered as HTML, as a Unicode string.
+
+        The 'value' given is not guaranteed to be valid input, so subclass
+        implementations should program defensively.
+        """
+        raise NotImplementedError
+
+    def build_attrs(self, extra_attrs=None, **kwargs):
+        "Helper function for building an attribute dictionary."
+        attrs = dict(self.attrs, **kwargs)
+        if extra_attrs:
+            attrs.update(extra_attrs)
+        return attrs
+
+    def value_from_datadict(self, data, files, name):
+        """
+        Given a dictionary of data and this widget's name, returns the value
+        of this widget. Returns None if it's not provided.
+        """
+        return data.get(name, None)
+
+    def _has_changed(self, initial, data):
+        """
+        Return True if data differs from initial.
+        """
+        # For purposes of seeing whether something has changed, None is
+        # the same as an empty string, if the data or inital value we get
+        # is None, replace it w/ u''.
+        if data is None:
+            data_value = u''
+        else:
+            data_value = data
+        if initial is None:
+            initial_value = u''
+        else:
+            initial_value = initial
+        if force_unicode(initial_value) != force_unicode(data_value):
+            return True
+        return False
+
+    def id_for_label(self, id_):
+        """
+        Returns the HTML ID attribute of this Widget for use by a <label>,
+        given the ID of the field. Returns None if no ID is available.
+
+        This hook is necessary because some widgets have multiple HTML
+        elements and, thus, multiple IDs. In that case, this method should
+        return an ID value that corresponds to the first ID in the widget's
+        tags.
+        """
+        return id_
+    id_for_label = classmethod(id_for_label)
+
+class Input(Widget):
+    """
+    Base class for all <input> widgets (except type='checkbox' and
+    type='radio', which are special).
+    """
+    input_type = None # Subclasses must define this.
+
+    def render(self, name, value, attrs=None):
+        if value is None: value = ''
+        final_attrs = self.build_attrs(attrs, type=self.input_type, name=name)
+        if value != '':
+            # Only add the 'value' attribute if a value is non-empty.
+            final_attrs['value'] = force_unicode(value)
+        return mark_safe(u'<input%s />' % flatatt(final_attrs))
+
+class TextInput(Input):
+    input_type = 'text'
+
+class PasswordInput(Input):
+    input_type = 'password'
+
+    def __init__(self, attrs=None, render_value=True):
+        super(PasswordInput, self).__init__(attrs)
+        self.render_value = render_value
+
+    def render(self, name, value, attrs=None):
+        if not self.render_value: value=None
+        return super(PasswordInput, self).render(name, value, attrs)
+
+class HiddenInput(Input):
+    input_type = 'hidden'
+    is_hidden = True
+
+class MultipleHiddenInput(HiddenInput):
+    """
+    A widget that handles <input type="hidden"> for fields that have a list
+    of values.
+    """
+    def __init__(self, attrs=None, choices=()):
+        super(MultipleHiddenInput, self).__init__(attrs)
+        # choices can be any iterable
+        self.choices = choices
+
+    def render(self, name, value, attrs=None, choices=()):
+        if value is None: value = []
+        final_attrs = self.build_attrs(attrs, type=self.input_type, name=name)
+        return mark_safe(u'\n'.join([(u'<input%s />' %
+            flatatt(dict(value=force_unicode(v), **final_attrs)))
+            for v in value]))
+
+    def value_from_datadict(self, data, files, name):
+        if isinstance(data, (MultiValueDict, MergeDict)):
+            return data.getlist(name)
+        return data.get(name, None)
+
+class FileInput(Input):
+    input_type = 'file'
+    needs_multipart_form = True
+
+    def render(self, name, value, attrs=None):
+        return super(FileInput, self).render(name, None, attrs=attrs)
+
+    def value_from_datadict(self, data, files, name):
+        "File widgets take data from FILES, not POST"
+        return files.get(name, None)
+
+    def _has_changed(self, initial, data):
+        if data is None:
+            return False
+        return True
+
+class Textarea(Widget):
+    def __init__(self, attrs=None):
+        # The 'rows' and 'cols' attributes are required for HTML correctness.
+        self.attrs = {'cols': '40', 'rows': '10'}
+        if attrs:
+            self.attrs.update(attrs)
+
+    def render(self, name, value, attrs=None):
+        if value is None: value = ''
+        value = force_unicode(value)
+        final_attrs = self.build_attrs(attrs, name=name)
+        return mark_safe(u'<textarea%s>%s</textarea>' % (flatatt(final_attrs),
+                conditional_escape(force_unicode(value))))
+
+class DateTimeInput(Input):
+    input_type = 'text'
+    format = '%Y-%m-%d %H:%M:%S'     # '2006-10-25 14:30:59'
+
+    def __init__(self, attrs=None, format=None):
+        super(DateTimeInput, self).__init__(attrs)
+        if format:
+            self.format = format
+
+    def render(self, name, value, attrs=None):
+        if value is None:
+            value = ''
+        elif hasattr(value, 'strftime'):
+            value = datetime_safe.new_datetime(value)
+            value = value.strftime(self.format)
+        return super(DateTimeInput, self).render(name, value, attrs)
+
+class TimeInput(Input):
+    input_type = 'text'
+
+    def render(self, name, value, attrs=None):
+        if value is None:
+            value = ''
+        elif hasattr(value, 'replace'):
+            value = value.replace(microsecond=0)
+        return super(TimeInput, self).render(name, value, attrs)
+
+class CheckboxInput(Widget):
+    def __init__(self, attrs=None, check_test=bool):
+        super(CheckboxInput, self).__init__(attrs)
+        # check_test is a callable that takes a value and returns True
+        # if the checkbox should be checked for that value.
+        self.check_test = check_test
+
+    def render(self, name, value, attrs=None):
+        final_attrs = self.build_attrs(attrs, type='checkbox', name=name)
+        try:
+            result = self.check_test(value)
+        except: # Silently catch exceptions
+            result = False
+        if result:
+            final_attrs['checked'] = 'checked'
+        if value not in ('', True, False, None):
+            # Only add the 'value' attribute if a value is non-empty.
+            final_attrs['value'] = force_unicode(value)
+        return mark_safe(u'<input%s />' % flatatt(final_attrs))
+
+    def value_from_datadict(self, data, files, name):
+        if name not in data:
+            # A missing value means False because HTML form submission does not
+            # send results for unselected checkboxes.
+            return False
+        return super(CheckboxInput, self).value_from_datadict(data, files, name)
+
+    def _has_changed(self, initial, data):
+        # Sometimes data or initial could be None or u'' which should be the
+        # same thing as False.
+        return bool(initial) != bool(data)
+
+class Select(Widget):
+    def __init__(self, attrs=None, choices=()):
+        super(Select, self).__init__(attrs)
+        # choices can be any iterable, but we may need to render this widget
+        # multiple times. Thus, collapse it into a list so it can be consumed
+        # more than once.
+        self.choices = list(choices)
+
+    def render(self, name, value, attrs=None, choices=()):
+        if value is None: value = ''
+        final_attrs = self.build_attrs(attrs, name=name)
+        output = [u'<select%s>' % flatatt(final_attrs)]
+        options = self.render_options(choices, [value])
+        if options:
+            output.append(options)
+        output.append('</select>')
+        return mark_safe(u'\n'.join(output))
+
+    def render_options(self, choices, selected_choices):
+        def render_option(option_value, option_label):
+            option_value = force_unicode(option_value)
+            selected_html = (option_value in selected_choices) and u' selected="selected"' or ''
+            return u'<option value="%s"%s>%s</option>' % (
+                escape(option_value), selected_html,
+                conditional_escape(force_unicode(option_label)))
+        # Normalize to strings.
+        selected_choices = set([force_unicode(v) for v in selected_choices])
+        output = []
+        for option_value, option_label in chain(self.choices, choices):
+            if isinstance(option_label, (list, tuple)):
+                output.append(u'<optgroup label="%s">' % escape(force_unicode(option_value)))
+                for option in option_label:
+                    output.append(render_option(*option))
+                output.append(u'</optgroup>')
+            else:
+                output.append(render_option(option_value, option_label))
+        return u'\n'.join(output)
+
+class NullBooleanSelect(Select):
+    """
+    A Select Widget intended to be used with NullBooleanField.
+    """
+    def __init__(self, attrs=None):
+        choices = ((u'1', ugettext('Unknown')), (u'2', ugettext('Yes')), (u'3', ugettext('No')))
+        super(NullBooleanSelect, self).__init__(attrs, choices)
+
+    def render(self, name, value, attrs=None, choices=()):
+        try:
+            value = {True: u'2', False: u'3', u'2': u'2', u'3': u'3'}[value]
+        except KeyError:
+            value = u'1'
+        return super(NullBooleanSelect, self).render(name, value, attrs, choices)
+
+    def value_from_datadict(self, data, files, name):
+        value = data.get(name, None)
+        return {u'2': True, u'3': False, True: True, False: False}.get(value, None)
+
+    def _has_changed(self, initial, data):
+        # Sometimes data or initial could be None or u'' which should be the
+        # same thing as False.
+        return bool(initial) != bool(data)
+
+class SelectMultiple(Select):
+    def render(self, name, value, attrs=None, choices=()):
+        if value is None: value = []
+        final_attrs = self.build_attrs(attrs, name=name)
+        output = [u'<select multiple="multiple"%s>' % flatatt(final_attrs)]
+        options = self.render_options(choices, value)
+        if options:
+            output.append(options)
+        output.append('</select>')
+        return mark_safe(u'\n'.join(output))
+
+    def value_from_datadict(self, data, files, name):
+        if isinstance(data, (MultiValueDict, MergeDict)):
+            return data.getlist(name)
+        return data.get(name, None)
+
+    def _has_changed(self, initial, data):
+        if initial is None:
+            initial = []
+        if data is None:
+            data = []
+        if len(initial) != len(data):
+            return True
+        for value1, value2 in zip(initial, data):
+            if force_unicode(value1) != force_unicode(value2):
+                return True
+        return False
+
+class RadioInput(StrAndUnicode):
+    """
+    An object used by RadioFieldRenderer that represents a single
+    <input type='radio'>.
+    """
+
+    def __init__(self, name, value, attrs, choice, index):
+        self.name, self.value = name, value
+        self.attrs = attrs
+        self.choice_value = force_unicode(choice[0])
+        self.choice_label = force_unicode(choice[1])
+        self.index = index
+
+    def __unicode__(self):
+        if 'id' in self.attrs:
+            label_for = ' for="%s_%s"' % (self.attrs['id'], self.index)
+        else:
+            label_for = ''
+        choice_label = conditional_escape(force_unicode(self.choice_label))
+        return mark_safe(u'<label%s>%s %s</label>' % (label_for, self.tag(), choice_label))
+
+    def is_checked(self):
+        return self.value == self.choice_value
+
+    def tag(self):
+        if 'id' in self.attrs:
+            self.attrs['id'] = '%s_%s' % (self.attrs['id'], self.index)
+        final_attrs = dict(self.attrs, type='radio', name=self.name, value=self.choice_value)
+        if self.is_checked():
+            final_attrs['checked'] = 'checked'
+        return mark_safe(u'<input%s />' % flatatt(final_attrs))
+
+class RadioFieldRenderer(StrAndUnicode):
+    """
+    An object used by RadioSelect to enable customization of radio widgets.
+    """
+
+    def __init__(self, name, value, attrs, choices):
+        self.name, self.value, self.attrs = name, value, attrs
+        self.choices = choices
+
+    def __iter__(self):
+        for i, choice in enumerate(self.choices):
+            yield RadioInput(self.name, self.value, self.attrs.copy(), choice, i)
+
+    def __getitem__(self, idx):
+        choice = self.choices[idx] # Let the IndexError propogate
+        return RadioInput(self.name, self.value, self.attrs.copy(), choice, idx)
+
+    def __unicode__(self):
+        return self.render()
+
+    def render(self):
+        """Outputs a <ul> for this set of radio fields."""
+        return mark_safe(u'<ul>\n%s\n</ul>' % u'\n'.join([u'<li>%s</li>'
+                % force_unicode(w) for w in self]))
+
+class RadioSelect(Select):
+    renderer = RadioFieldRenderer
+
+    def __init__(self, *args, **kwargs):
+        # Override the default renderer if we were passed one.
+        renderer = kwargs.pop('renderer', None)
+        if renderer:
+            self.renderer = renderer
+        super(RadioSelect, self).__init__(*args, **kwargs)
+
+    def get_renderer(self, name, value, attrs=None, choices=()):
+        """Returns an instance of the renderer."""
+        if value is None: value = ''
+        str_value = force_unicode(value) # Normalize to string.
+        final_attrs = self.build_attrs(attrs)
+        choices = list(chain(self.choices, choices))
+        return self.renderer(name, str_value, final_attrs, choices)
+
+    def render(self, name, value, attrs=None, choices=()):
+        return self.get_renderer(name, value, attrs, choices).render()
+
+    def id_for_label(self, id_):
+        # RadioSelect is represented by multiple <input type="radio"> fields,
+        # each of which has a distinct ID. The IDs are made distinct by a "_X"
+        # suffix, where X is the zero-based index of the radio field. Thus,
+        # the label for a RadioSelect should reference the first one ('_0').
+        if id_:
+            id_ += '_0'
+        return id_
+    id_for_label = classmethod(id_for_label)
+
+class CheckboxSelectMultiple(SelectMultiple):
+    def render(self, name, value, attrs=None, choices=()):
+        if value is None: value = []
+        has_id = attrs and 'id' in attrs
+        final_attrs = self.build_attrs(attrs, name=name)
+        output = [u'<ul>']
+        # Normalize to strings
+        str_values = set([force_unicode(v) for v in value])
+        for i, (option_value, option_label) in enumerate(chain(self.choices, choices)):
+            # If an ID attribute was given, add a numeric index as a suffix,
+            # so that the checkboxes don't all have the same ID attribute.
+            if has_id:
+                final_attrs = dict(final_attrs, id='%s_%s' % (attrs['id'], i))
+                label_for = u' for="%s"' % final_attrs['id']
+            else:
+                label_for = ''
+
+            cb = CheckboxInput(final_attrs, check_test=lambda value: value in str_values)
+            option_value = force_unicode(option_value)
+            rendered_cb = cb.render(name, option_value)
+            option_label = conditional_escape(force_unicode(option_label))
+            output.append(u'<li><label%s>%s %s</label></li>' % (label_for, rendered_cb, option_label))
+        output.append(u'</ul>')
+        return mark_safe(u'\n'.join(output))
+
+    def id_for_label(self, id_):
+        # See the comment for RadioSelect.id_for_label()
+        if id_:
+            id_ += '_0'
+        return id_
+    id_for_label = classmethod(id_for_label)
+
+class MultiWidget(Widget):
+    """
+    A widget that is composed of multiple widgets.
+
+    Its render() method is different than other widgets', because it has to
+    figure out how to split a single value for display in multiple widgets.
+    The ``value`` argument can be one of two things:
+
+        * A list.
+        * A normal value (e.g., a string) that has been "compressed" from
+          a list of values.
+
+    In the second case -- i.e., if the value is NOT a list -- render() will
+    first "decompress" the value into a list before rendering it. It does so by
+    calling the decompress() method, which MultiWidget subclasses must
+    implement. This method takes a single "compressed" value and returns a
+    list.
+
+    When render() does its HTML rendering, each value in the list is rendered
+    with the corresponding widget -- the first value is rendered in the first
+    widget, the second value is rendered in the second widget, etc.
+
+    Subclasses may implement format_output(), which takes the list of rendered
+    widgets and returns a string of HTML that formats them any way you'd like.
+
+    You'll probably want to use this class with MultiValueField.
+    """
+    def __init__(self, widgets, attrs=None):
+        self.widgets = [isinstance(w, type) and w() or w for w in widgets]
+        super(MultiWidget, self).__init__(attrs)
+
+    def render(self, name, value, attrs=None):
+        # value is a list of values, each corresponding to a widget
+        # in self.widgets.
+        if not isinstance(value, list):
+            value = self.decompress(value)
+        output = []
+        final_attrs = self.build_attrs(attrs)
+        id_ = final_attrs.get('id', None)
+        for i, widget in enumerate(self.widgets):
+            try:
+                widget_value = value[i]
+            except IndexError:
+                widget_value = None
+            if id_:
+                final_attrs = dict(final_attrs, id='%s_%s' % (id_, i))
+            output.append(widget.render(name + '_%s' % i, widget_value, final_attrs))
+        return mark_safe(self.format_output(output))
+
+    def id_for_label(self, id_):
+        # See the comment for RadioSelect.id_for_label()
+        if id_:
+            id_ += '_0'
+        return id_
+    id_for_label = classmethod(id_for_label)
+
+    def value_from_datadict(self, data, files, name):
+        return [widget.value_from_datadict(data, files, name + '_%s' % i) for i, widget in enumerate(self.widgets)]
+
+    def _has_changed(self, initial, data):
+        if initial is None:
+            initial = [u'' for x in range(0, len(data))]
+        else:
+            initial = self.decompress(initial)
+        for widget, initial, data in zip(self.widgets, initial, data):
+            if widget._has_changed(initial, data):
+                return True
+        return False
+
+    def format_output(self, rendered_widgets):
+        """
+        Given a list of rendered widgets (as strings), returns a Unicode string
+        representing the HTML for the whole lot.
+
+        This hook allows you to format the HTML design of the widgets, if
+        needed.
+        """
+        return u''.join(rendered_widgets)
+
+    def decompress(self, value):
+        """
+        Returns a list of decompressed values for the given compressed value.
+        The given value can be assumed to be valid, but not necessarily
+        non-empty.
+        """
+        raise NotImplementedError('Subclasses must implement this method.')
+
+    def _get_media(self):
+        "Media for a multiwidget is the combination of all media of the subwidgets"
+        media = Media()
+        for w in self.widgets:
+            media = media + w.media
+        return media
+    media = property(_get_media)
+
+class SplitDateTimeWidget(MultiWidget):
+    """
+    A Widget that splits datetime input into two <input type="text"> boxes.
+    """
+    def __init__(self, attrs=None):
+        widgets = (TextInput(attrs=attrs), TextInput(attrs=attrs))
+        super(SplitDateTimeWidget, self).__init__(widgets, attrs)
+
+    def decompress(self, value):
+        if value:
+            return [value.date(), value.time().replace(microsecond=0)]
+        return [None, None]
+
diff --git a/webapp/django/http/__init__.py b/webapp/django/http/__init__.py
new file mode 100644
index 0000000..6d24e0a
--- /dev/null
+++ b/webapp/django/http/__init__.py
@@ -0,0 +1,455 @@
+import os
+import re
+from Cookie import SimpleCookie, CookieError
+from pprint import pformat
+from urllib import urlencode
+from urlparse import urljoin
+try:
+    # The mod_python version is more efficient, so try importing it first.
+    from mod_python.util import parse_qsl
+except ImportError:
+    from cgi import parse_qsl
+
+from django.utils.datastructures import MultiValueDict, ImmutableList
+from django.utils.encoding import smart_str, iri_to_uri, force_unicode
+from django.http.multipartparser import MultiPartParser
+from django.conf import settings
+from django.core.files import uploadhandler
+from utils import *
+
+RESERVED_CHARS="!*'();:@&=+$,/?%#[]"
+
+absolute_http_url_re = re.compile(r"^https?://", re.I)
+
+class Http404(Exception):
+    pass
+
+class HttpRequest(object):
+    """A basic HTTP request."""
+
+    # The encoding used in GET/POST dicts. None means use default setting.
+    _encoding = None
+    _upload_handlers = []
+
+    def __init__(self):
+        self.GET, self.POST, self.COOKIES, self.META, self.FILES = {}, {}, {}, {}, {}
+        self.path = ''
+        self.path_info = ''
+        self.method = None
+
+    def __repr__(self):
+        return '<HttpRequest\nGET:%s,\nPOST:%s,\nCOOKIES:%s,\nMETA:%s>' % \
+            (pformat(self.GET), pformat(self.POST), pformat(self.COOKIES),
+            pformat(self.META))
+
+    def get_host(self):
+        """Returns the HTTP host using the environment or request headers."""
+        # We try three options, in order of decreasing preference.
+        if 'HTTP_X_FORWARDED_HOST' in self.META:
+            host = self.META['HTTP_X_FORWARDED_HOST']
+        elif 'HTTP_HOST' in self.META:
+            host = self.META['HTTP_HOST']
+        else:
+            # Reconstruct the host using the algorithm from PEP 333.
+            host = self.META['SERVER_NAME']
+            server_port = self.META['SERVER_PORT']
+            if server_port != (self.is_secure() and 443 or 80):
+                host = '%s:%s' % (host, server_port)
+        return host
+
+    def get_full_path(self):
+        return ''
+
+    def build_absolute_uri(self, location=None):
+        """
+        Builds an absolute URI from the location and the variables available in
+        this request. If no location is specified, the absolute URI is built on
+        ``request.get_full_path()``.
+        """
+        if not location:
+            location = self.get_full_path()
+        if not absolute_http_url_re.match(location):
+            current_uri = '%s://%s%s' % (self.is_secure() and 'https' or 'http',
+                                         self.get_host(), self.path)
+            location = urljoin(current_uri, location)
+        return location
+
+    def is_secure(self):
+        return os.environ.get("HTTPS") == "on"
+
+    def is_ajax(self):
+        return self.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest'
+
+    def _set_encoding(self, val):
+        """
+        Sets the encoding used for GET/POST accesses. If the GET or POST
+        dictionary has already been created, it is removed and recreated on the
+        next access (so that it is decoded correctly).
+        """
+        self._encoding = val
+        if hasattr(self, '_get'):
+            del self._get
+        if hasattr(self, '_post'):
+            del self._post
+
+    def _get_encoding(self):
+        return self._encoding
+
+    encoding = property(_get_encoding, _set_encoding)
+
+    def _initialize_handlers(self):
+        self._upload_handlers = [uploadhandler.load_handler(handler, self)
+                                 for handler in settings.FILE_UPLOAD_HANDLERS]
+
+    def _set_upload_handlers(self, upload_handlers):
+        if hasattr(self, '_files'):
+            raise AttributeError("You cannot set the upload handlers after the upload has been processed.")
+        self._upload_handlers = upload_handlers
+
+    def _get_upload_handlers(self):
+        if not self._upload_handlers:
+            # If thre are no upload handlers defined, initialize them from settings.
+            self._initialize_handlers()
+        return self._upload_handlers
+
+    upload_handlers = property(_get_upload_handlers, _set_upload_handlers)
+
+    def parse_file_upload(self, META, post_data):
+        """Returns a tuple of (POST QueryDict, FILES MultiValueDict)."""
+        self.upload_handlers = ImmutableList(
+            self.upload_handlers,
+            warning = "You cannot alter upload handlers after the upload has been processed."
+        )
+        parser = MultiPartParser(META, post_data, self.upload_handlers, self.encoding)
+        return parser.parse()
+
+class QueryDict(MultiValueDict):
+    """
+    A specialized MultiValueDict that takes a query string when initialized.
+    This is immutable unless you create a copy of it.
+
+    Values retrieved from this class are converted from the given encoding
+    (DEFAULT_CHARSET by default) to unicode.
+    """
+    # These are both reset in __init__, but is specified here at the class
+    # level so that unpickling will have valid values
+    _mutable = True
+    _encoding = None
+
+    def __init__(self, query_string, mutable=False, encoding=None):
+        MultiValueDict.__init__(self)
+        if not encoding:
+            # *Important*: do not import settings any earlier because of note
+            # in core.handlers.modpython.
+            from django.conf import settings
+            encoding = settings.DEFAULT_CHARSET
+        self.encoding = encoding
+        for key, value in parse_qsl((query_string or ''), True): # keep_blank_values=True
+            self.appendlist(force_unicode(key, encoding, errors='replace'),
+                            force_unicode(value, encoding, errors='replace'))
+        self._mutable = mutable
+
+    def _get_encoding(self):
+        if self._encoding is None:
+            # *Important*: do not import settings at the module level because
+            # of the note in core.handlers.modpython.
+            from django.conf import settings
+            self._encoding = settings.DEFAULT_CHARSET
+        return self._encoding
+
+    def _set_encoding(self, value):
+        self._encoding = value
+
+    encoding = property(_get_encoding, _set_encoding)
+
+    def _assert_mutable(self):
+        if not self._mutable:
+            raise AttributeError("This QueryDict instance is immutable")
+
+    def __setitem__(self, key, value):
+        self._assert_mutable()
+        key = str_to_unicode(key, self.encoding)
+        value = str_to_unicode(value, self.encoding)
+        MultiValueDict.__setitem__(self, key, value)
+
+    def __delitem__(self, key):
+        self._assert_mutable()
+        super(QueryDict, self).__delitem__(key)
+
+    def __copy__(self):
+        result = self.__class__('', mutable=True)
+        for key, value in dict.items(self):
+            dict.__setitem__(result, key, value)
+        return result
+
+    def __deepcopy__(self, memo):
+        import copy
+        result = self.__class__('', mutable=True)
+        memo[id(self)] = result
+        for key, value in dict.items(self):
+            dict.__setitem__(result, copy.deepcopy(key, memo), copy.deepcopy(value, memo))
+        return result
+
+    def setlist(self, key, list_):
+        self._assert_mutable()
+        key = str_to_unicode(key, self.encoding)
+        list_ = [str_to_unicode(elt, self.encoding) for elt in list_]
+        MultiValueDict.setlist(self, key, list_)
+
+    def setlistdefault(self, key, default_list=()):
+        self._assert_mutable()
+        if key not in self:
+            self.setlist(key, default_list)
+        return MultiValueDict.getlist(self, key)
+
+    def appendlist(self, key, value):
+        self._assert_mutable()
+        key = str_to_unicode(key, self.encoding)
+        value = str_to_unicode(value, self.encoding)
+        MultiValueDict.appendlist(self, key, value)
+
+    def update(self, other_dict):
+        self._assert_mutable()
+        f = lambda s: str_to_unicode(s, self.encoding)
+        d = dict([(f(k), f(v)) for k, v in other_dict.items()])
+        MultiValueDict.update(self, d)
+
+    def pop(self, key, *args):
+        self._assert_mutable()
+        return MultiValueDict.pop(self, key, *args)
+
+    def popitem(self):
+        self._assert_mutable()
+        return MultiValueDict.popitem(self)
+
+    def clear(self):
+        self._assert_mutable()
+        MultiValueDict.clear(self)
+
+    def setdefault(self, key, default=None):
+        self._assert_mutable()
+        key = str_to_unicode(key, self.encoding)
+        default = str_to_unicode(default, self.encoding)
+        return MultiValueDict.setdefault(self, key, default)
+
+    def copy(self):
+        """Returns a mutable copy of this object."""
+        return self.__deepcopy__({})
+
+    def urlencode(self):
+        output = []
+        for k, list_ in self.lists():
+            k = smart_str(k, self.encoding)
+            output.extend([urlencode({k: smart_str(v, self.encoding)}) for v in list_])
+        return '&'.join(output)
+
+def parse_cookie(cookie):
+    if cookie == '':
+        return {}
+    try:
+        c = SimpleCookie()
+        c.load(cookie)
+    except CookieError:
+        # Invalid cookie
+        return {}
+
+    cookiedict = {}
+    for key in c.keys():
+        cookiedict[key] = c.get(key).value
+    return cookiedict
+
+class HttpResponse(object):
+    """A basic HTTP response, with content and dictionary-accessed headers."""
+
+    status_code = 200
+
+    def __init__(self, content='', mimetype=None, status=None,
+            content_type=None):
+        from django.conf import settings
+        self._charset = settings.DEFAULT_CHARSET
+        if mimetype:
+            content_type = mimetype     # For backwards compatibility
+        if not content_type:
+            content_type = "%s; charset=%s" % (settings.DEFAULT_CONTENT_TYPE,
+                    settings.DEFAULT_CHARSET)
+        if not isinstance(content, basestring) and hasattr(content, '__iter__'):
+            self._container = content
+            self._is_string = False
+        else:
+            self._container = [content]
+            self._is_string = True
+        self.cookies = SimpleCookie()
+        if status:
+            self.status_code = status
+
+        # _headers is a mapping of the lower-case name to the original case of
+        # the header (required for working with legacy systems) and the header
+        # value.
+        self._headers = {'content-type': ('Content-Type', content_type)}
+
+    def __str__(self):
+        """Full HTTP message, including headers."""
+        return '\n'.join(['%s: %s' % (key, value)
+            for key, value in self._headers.values()]) \
+            + '\n\n' + self.content
+
+    def _convert_to_ascii(self, *values):
+        """Converts all values to ascii strings."""
+        for value in values:
+            if isinstance(value, unicode):
+                try:
+                    yield value.encode('us-ascii')
+                except UnicodeError, e:
+                    e.reason += ', HTTP response headers must be in US-ASCII format'
+                    raise
+            else:
+                yield str(value)
+
+    def __setitem__(self, header, value):
+        header, value = self._convert_to_ascii(header, value)
+        self._headers[header.lower()] = (header, value)
+
+    def __delitem__(self, header):
+        try:
+            del self._headers[header.lower()]
+        except KeyError:
+            pass
+
+    def __getitem__(self, header):
+        return self._headers[header.lower()][1]
+
+    def has_header(self, header):
+        """Case-insensitive check for a header."""
+        return self._headers.has_key(header.lower())
+
+    __contains__ = has_header
+
+    def items(self):
+        return self._headers.values()
+
+    def get(self, header, alternate):
+        return self._headers.get(header.lower(), (None, alternate))[1]
+
+    def set_cookie(self, key, value='', max_age=None, expires=None, path='/',
+                   domain=None, secure=False):
+        self.cookies[key] = value
+        if max_age is not None:
+            self.cookies[key]['max-age'] = max_age
+        if expires is not None:
+            self.cookies[key]['expires'] = expires
+        if path is not None:
+            self.cookies[key]['path'] = path
+        if domain is not None:
+            self.cookies[key]['domain'] = domain
+        if secure:
+            self.cookies[key]['secure'] = True
+
+    def delete_cookie(self, key, path='/', domain=None):
+        self.set_cookie(key, max_age=0, path=path, domain=domain,
+                        expires='Thu, 01-Jan-1970 00:00:00 GMT')
+
+    def _get_content(self):
+        if self.has_header('Content-Encoding'):
+            return ''.join(self._container)
+        return smart_str(''.join(self._container), self._charset)
+
+    def _set_content(self, value):
+        self._container = [value]
+        self._is_string = True
+
+    content = property(_get_content, _set_content)
+
+    def __iter__(self):
+        self._iterator = iter(self._container)
+        return self
+
+    def next(self):
+        chunk = self._iterator.next()
+        if isinstance(chunk, unicode):
+            chunk = chunk.encode(self._charset)
+        return str(chunk)
+
+    def close(self):
+        if hasattr(self._container, 'close'):
+            self._container.close()
+
+    # The remaining methods partially implement the file-like object interface.
+    # See http://docs.python.org/lib/bltin-file-objects.html
+    def write(self, content):
+        if not self._is_string:
+            raise Exception("This %s instance is not writable" % self.__class__)
+        self._container.append(content)
+
+    def flush(self):
+        pass
+
+    def tell(self):
+        if not self._is_string:
+            raise Exception("This %s instance cannot tell its position" % self.__class__)
+        return sum([len(chunk) for chunk in self._container])
+
+class HttpResponseRedirect(HttpResponse):
+    status_code = 302
+
+    def __init__(self, redirect_to):
+        HttpResponse.__init__(self)
+        self['Location'] = iri_to_uri(redirect_to)
+
+class HttpResponsePermanentRedirect(HttpResponse):
+    status_code = 301
+
+    def __init__(self, redirect_to):
+        HttpResponse.__init__(self)
+        self['Location'] = iri_to_uri(redirect_to)
+
+class HttpResponseNotModified(HttpResponse):
+    status_code = 304
+
+class HttpResponseBadRequest(HttpResponse):
+    status_code = 400
+
+class HttpResponseNotFound(HttpResponse):
+    status_code = 404
+
+class HttpResponseForbidden(HttpResponse):
+    status_code = 403
+
+class HttpResponseNotAllowed(HttpResponse):
+    status_code = 405
+
+    def __init__(self, permitted_methods):
+        HttpResponse.__init__(self)
+        self['Allow'] = ', '.join(permitted_methods)
+
+class HttpResponseGone(HttpResponse):
+    status_code = 410
+
+    def __init__(self, *args, **kwargs):
+        HttpResponse.__init__(self, *args, **kwargs)
+
+class HttpResponseServerError(HttpResponse):
+    status_code = 500
+
+    def __init__(self, *args, **kwargs):
+        HttpResponse.__init__(self, *args, **kwargs)
+
+# A backwards compatible alias for HttpRequest.get_host.
+def get_host(request):
+    return request.get_host()
+
+# It's neither necessary nor appropriate to use
+# django.utils.encoding.smart_unicode for parsing URLs and form inputs. Thus,
+# this slightly more restricted function.
+def str_to_unicode(s, encoding):
+    """
+    Converts basestring objects to unicode, using the given encoding. Illegally
+    encoded input characters are replaced with Unicode "unknown" codepoint
+    (\ufffd).
+
+    Returns any non-basestring objects without change.
+    """
+    if isinstance(s, str):
+        return unicode(s, encoding, 'replace')
+    else:
+        return s
+
diff --git a/webapp/django/http/multipartparser.py b/webapp/django/http/multipartparser.py
new file mode 100644
index 0000000..2049289
--- /dev/null
+++ b/webapp/django/http/multipartparser.py
@@ -0,0 +1,639 @@
+"""
+Multi-part parsing for file uploads.
+
+Exposes one class, ``MultiPartParser``, which feeds chunks of uploaded data to
+file upload handlers for processing.
+"""
+
+import cgi
+from django.conf import settings
+from django.core.exceptions import SuspiciousOperation
+from django.utils.datastructures import MultiValueDict
+from django.utils.encoding import force_unicode
+from django.utils.text import unescape_entities
+from django.core.files.uploadhandler import StopUpload, SkipFile, StopFutureHandlers
+
+__all__ = ('MultiPartParser', 'MultiPartParserError', 'InputStreamExhausted')
+
+class MultiPartParserError(Exception):
+    pass
+
+class InputStreamExhausted(Exception):
+    """
+    No more reads are allowed from this device.
+    """
+    pass
+
+RAW = "raw"
+FILE = "file"
+FIELD = "field"
+
+class MultiPartParser(object):
+    """
+    A rfc2388 multipart/form-data parser.
+
+    ``MultiValueDict.parse()`` reads the input stream in ``chunk_size`` chunks
+    and returns a tuple of ``(MultiValueDict(POST), MultiValueDict(FILES))``. If
+    ``file_upload_dir`` is defined files will be streamed to temporary files in
+    that directory.
+    """
+    def __init__(self, META, input_data, upload_handlers, encoding=None):
+        """
+        Initialize the MultiPartParser object.
+
+        :META:
+            The standard ``META`` dictionary in Django request objects.
+        :input_data:
+            The raw post data, as a bytestring.
+        :upload_handler:
+            An UploadHandler instance that performs operations on the uploaded
+            data.
+        :encoding:
+            The encoding with which to treat the incoming data.
+        """
+
+        #
+        # Content-Type should containt multipart and the boundary information.
+        #
+
+        content_type = META.get('HTTP_CONTENT_TYPE', META.get('CONTENT_TYPE', ''))
+        if not content_type.startswith('multipart/'):
+            raise MultiPartParserError('Invalid Content-Type: %s' % content_type)
+
+        # Parse the header to get the boundary to split the parts.
+        ctypes, opts = parse_header(content_type)
+        boundary = opts.get('boundary')
+        if not boundary or not cgi.valid_boundary(boundary):
+            raise MultiPartParserError('Invalid boundary in multipart: %s' % boundary)
+
+
+        #
+        # Content-Length should contain the length of the body we are about
+        # to receive.
+        #
+        try:
+            content_length = int(META.get('HTTP_CONTENT_LENGTH', META.get('CONTENT_LENGTH',0)))
+        except (ValueError, TypeError):
+            # For now set it to 0; we'll try again later on down.
+            content_length = 0
+
+        if content_length <= 0:
+            # This means we shouldn't continue...raise an error.
+            raise MultiPartParserError("Invalid content length: %r" % content_length)
+
+        self._boundary = boundary
+        self._input_data = input_data
+
+        # For compatibility with low-level network APIs (with 32-bit integers),
+        # the chunk size should be < 2^31, but still divisible by 4.
+        self._chunk_size = min(2**31-4, *[x.chunk_size for x in upload_handlers if x.chunk_size])
+
+        self._meta = META
+        self._encoding = encoding or settings.DEFAULT_CHARSET
+        self._content_length = content_length
+        self._upload_handlers = upload_handlers
+
+    def parse(self):
+        """
+        Parse the POST data and break it into a FILES MultiValueDict and a POST
+        MultiValueDict.
+
+        Returns a tuple containing the POST and FILES dictionary, respectively.
+        """
+        # We have to import QueryDict down here to avoid a circular import.
+        from django.http import QueryDict
+
+        encoding = self._encoding
+        handlers = self._upload_handlers
+
+        limited_input_data = LimitBytes(self._input_data, self._content_length)
+
+        # See if the handler will want to take care of the parsing.
+        # This allows overriding everything if somebody wants it.
+        for handler in handlers:
+            result = handler.handle_raw_input(limited_input_data,
+                                              self._meta,
+                                              self._content_length,
+                                              self._boundary,
+                                              encoding)
+            if result is not None:
+                return result[0], result[1]
+
+        # Create the data structures to be used later.
+        self._post = QueryDict('', mutable=True)
+        self._files = MultiValueDict()
+
+        # Instantiate the parser and stream:
+        stream = LazyStream(ChunkIter(limited_input_data, self._chunk_size))
+
+        # Whether or not to signal a file-completion at the beginning of the loop.
+        old_field_name = None
+        counters = [0] * len(handlers)
+
+        try:
+            for item_type, meta_data, field_stream in Parser(stream, self._boundary):
+                if old_field_name:
+                    # We run this at the beginning of the next loop
+                    # since we cannot be sure a file is complete until
+                    # we hit the next boundary/part of the multipart content.
+                    self.handle_file_complete(old_field_name, counters)
+                    old_field_name = None
+
+                try:
+                    disposition = meta_data['content-disposition'][1]
+                    field_name = disposition['name'].strip()
+                except (KeyError, IndexError, AttributeError):
+                    continue
+
+                transfer_encoding = meta_data.get('content-transfer-encoding')
+                field_name = force_unicode(field_name, encoding, errors='replace')
+
+                if item_type == FIELD:
+                    # This is a post field, we can just set it in the post
+                    if transfer_encoding == 'base64':
+                        raw_data = field_stream.read()
+                        try:
+                            data = str(raw_data).decode('base64')
+                        except:
+                            data = raw_data
+                    else:
+                        data = field_stream.read()
+
+                    self._post.appendlist(field_name,
+                                          force_unicode(data, encoding, errors='replace'))
+                elif item_type == FILE:
+                    # This is a file, use the handler...
+                    file_name = disposition.get('filename')
+                    if not file_name:
+                        continue
+                    file_name = force_unicode(file_name, encoding, errors='replace')
+                    file_name = self.IE_sanitize(unescape_entities(file_name))
+
+                    content_type = meta_data.get('content-type', ('',))[0].strip()
+                    try:
+                        charset = meta_data.get('content-type', (0,{}))[1].get('charset', None)
+                    except:
+                        charset = None
+
+                    try:
+                        content_length = int(meta_data.get('content-length')[0])
+                    except (IndexError, TypeError, ValueError):
+                        content_length = None
+
+                    counters = [0] * len(handlers)
+                    try:
+                        for handler in handlers:
+                            try:
+                                handler.new_file(field_name, file_name,
+                                                 content_type, content_length,
+                                                 charset)
+                            except StopFutureHandlers:
+                                break
+
+                        for chunk in field_stream:
+                            if transfer_encoding == 'base64':
+                                # We only special-case base64 transfer encoding
+                                try:
+                                    chunk = str(chunk).decode('base64')
+                                except Exception, e:
+                                    # Since this is only a chunk, any error is an unfixable error.
+                                    raise MultiPartParserError("Could not decode base64 data: %r" % e)
+
+                            for i, handler in enumerate(handlers):
+                                chunk_length = len(chunk)
+                                chunk = handler.receive_data_chunk(chunk,
+                                                                   counters[i])
+                                counters[i] += chunk_length
+                                if chunk is None:
+                                    # If the chunk received by the handler is None, then don't continue.
+                                    break
+
+                    except SkipFile, e:
+                        # Just use up the rest of this file...
+                        exhaust(field_stream)
+                    else:
+                        # Handle file upload completions on next iteration.
+                        old_field_name = field_name
+                else:
+                    # If this is neither a FIELD or a FILE, just exhaust the stream.
+                    exhaust(stream)
+        except StopUpload, e:
+            if not e.connection_reset:
+                exhaust(limited_input_data)
+        else:
+            # Make sure that the request data is all fed
+            exhaust(limited_input_data)
+
+        # Signal that the upload has completed.
+        for handler in handlers:
+            retval = handler.upload_complete()
+            if retval:
+                break
+
+        return self._post, self._files
+
+    def handle_file_complete(self, old_field_name, counters):
+        """
+        Handle all the signalling that takes place when a file is complete.
+        """
+        for i, handler in enumerate(self._upload_handlers):
+            file_obj = handler.file_complete(counters[i])
+            if file_obj:
+                # If it returns a file object, then set the files dict.
+                self._files.appendlist(force_unicode(old_field_name,
+                                                     self._encoding,
+                                                     errors='replace'),
+                                       file_obj)
+                break
+
+    def IE_sanitize(self, filename):
+        """Cleanup filename from Internet Explorer full paths."""
+        return filename and filename[filename.rfind("\\")+1:].strip()
+
+class LazyStream(object):
+    """
+    The LazyStream wrapper allows one to get and "unget" bytes from a stream.
+
+    Given a producer object (an iterator that yields bytestrings), the
+    LazyStream object will support iteration, reading, and keeping a "look-back"
+    variable in case you need to "unget" some bytes.
+    """
+    def __init__(self, producer, length=None):
+        """
+        Every LazyStream must have a producer when instantiated.
+
+        A producer is an iterable that returns a string each time it
+        is called.
+        """
+        self._producer = producer
+        self._empty = False
+        self._leftover = ''
+        self.length = length
+        self.position = 0
+        self._remaining = length
+        self._unget_history = []
+
+    def tell(self):
+        return self.position
+
+    def read(self, size=None):
+        def parts():
+            remaining = (size is not None and [size] or [self._remaining])[0]
+            # do the whole thing in one shot if no limit was provided.
+            if remaining is None:
+                yield ''.join(self)
+                return
+
+            # otherwise do some bookkeeping to return exactly enough
+            # of the stream and stashing any extra content we get from
+            # the producer
+            while remaining != 0:
+                assert remaining > 0, 'remaining bytes to read should never go negative'
+
+                chunk = self.next()
+
+                emitting = chunk[:remaining]
+                self.unget(chunk[remaining:])
+                remaining -= len(emitting)
+                yield emitting
+
+        out = ''.join(parts())
+        return out
+
+    def next(self):
+        """
+        Used when the exact number of bytes to read is unimportant.
+
+        This procedure just returns whatever is chunk is conveniently returned
+        from the iterator instead. Useful to avoid unnecessary bookkeeping if
+        performance is an issue.
+        """
+        if self._leftover:
+            output = self._leftover
+            self._leftover = ''
+        else:
+            output = self._producer.next()
+            self._unget_history = []
+        self.position += len(output)
+        return output
+
+    def close(self):
+        """
+        Used to invalidate/disable this lazy stream.
+
+        Replaces the producer with an empty list. Any leftover bytes that have
+        already been read will still be reported upon read() and/or next().
+        """
+        self._producer = []
+
+    def __iter__(self):
+        return self
+
+    def unget(self, bytes):
+        """
+        Places bytes back onto the front of the lazy stream.
+
+        Future calls to read() will return those bytes first. The
+        stream position and thus tell() will be rewound.
+        """
+        if not bytes:
+            return
+        self._update_unget_history(len(bytes))
+        self.position -= len(bytes)
+        self._leftover = ''.join([bytes, self._leftover])
+
+    def _update_unget_history(self, num_bytes):
+        """
+        Updates the unget history as a sanity check to see if we've pushed
+        back the same number of bytes in one chunk. If we keep ungetting the
+        same number of bytes many times (here, 50), we're mostly likely in an
+        infinite loop of some sort. This is usually caused by a
+        maliciously-malformed MIME request.
+        """
+        self._unget_history = [num_bytes] + self._unget_history[:49]
+        number_equal = len([current_number for current_number in self._unget_history
+                            if current_number == num_bytes])
+
+        if number_equal > 40:
+            raise SuspiciousOperation(
+                "The multipart parser got stuck, which shouldn't happen with"
+                " normal uploaded files. Check for malicious upload activity;"
+                " if there is none, report this to the Django developers."
+            )
+
+class ChunkIter(object):
+    """
+    An iterable that will yield chunks of data. Given a file-like object as the
+    constructor, this object will yield chunks of read operations from that
+    object.
+    """
+    def __init__(self, flo, chunk_size=64 * 1024):
+        self.flo = flo
+        self.chunk_size = chunk_size
+
+    def next(self):
+        try:
+            data = self.flo.read(self.chunk_size)
+        except InputStreamExhausted:
+            raise StopIteration()
+        if data:
+            return data
+        else:
+            raise StopIteration()
+
+    def __iter__(self):
+        return self
+
+class LimitBytes(object):
+    """ Limit bytes for a file object. """
+    def __init__(self, fileobject, length):
+        self._file = fileobject
+        self.remaining = length
+
+    def read(self, num_bytes=None):
+        """
+        Read data from the underlying file.
+        If you ask for too much or there isn't anything left,
+        this will raise an InputStreamExhausted error.
+        """
+        if self.remaining <= 0:
+            raise InputStreamExhausted()
+        if num_bytes is None:
+            num_bytes = self.remaining
+        else:
+            num_bytes = min(num_bytes, self.remaining)
+        self.remaining -= num_bytes
+        return self._file.read(num_bytes)
+
+class InterBoundaryIter(object):
+    """
+    A Producer that will iterate over boundaries.
+    """
+    def __init__(self, stream, boundary):
+        self._stream = stream
+        self._boundary = boundary
+
+    def __iter__(self):
+        return self
+
+    def next(self):
+        try:
+            return LazyStream(BoundaryIter(self._stream, self._boundary))
+        except InputStreamExhausted:
+            raise StopIteration()
+
+class BoundaryIter(object):
+    """
+    A Producer that is sensitive to boundaries.
+
+    Will happily yield bytes until a boundary is found. Will yield the bytes
+    before the boundary, throw away the boundary bytes themselves, and push the
+    post-boundary bytes back on the stream.
+
+    The future calls to .next() after locating the boundary will raise a
+    StopIteration exception.
+    """
+
+    def __init__(self, stream, boundary):
+        self._stream = stream
+        self._boundary = boundary
+        self._done = False
+        # rollback an additional six bytes because the format is like
+        # this: CRLF<boundary>[--CRLF]
+        self._rollback = len(boundary) + 6
+
+        # Try to use mx fast string search if available. Otherwise
+        # use Python find. Wrap the latter for consistency.
+        unused_char = self._stream.read(1)
+        if not unused_char:
+            raise InputStreamExhausted()
+        self._stream.unget(unused_char)
+        try:
+            from mx.TextTools import FS
+            self._fs = FS(boundary).find
+        except ImportError:
+            self._fs = lambda data: data.find(boundary)
+
+    def __iter__(self):
+        return self
+
+    def next(self):
+        if self._done:
+            raise StopIteration()
+
+        stream = self._stream
+        rollback = self._rollback
+
+        bytes_read = 0
+        chunks = []
+        for bytes in stream:
+            bytes_read += len(bytes)
+            chunks.append(bytes)
+            if bytes_read > rollback:
+                break
+            if not bytes:
+                break
+        else:
+            self._done = True
+
+        if not chunks:
+            raise StopIteration()
+
+        chunk = ''.join(chunks)
+        boundary = self._find_boundary(chunk, len(chunk) < self._rollback)
+
+        if boundary:
+            end, next = boundary
+            stream.unget(chunk[next:])
+            self._done = True
+            return chunk[:end]
+        else:
+            # make sure we dont treat a partial boundary (and
+            # its separators) as data
+            if not chunk[:-rollback]:# and len(chunk) >= (len(self._boundary) + 6):
+                # There's nothing left, we should just return and mark as done.
+                self._done = True
+                return chunk
+            else:
+                stream.unget(chunk[-rollback:])
+                return chunk[:-rollback]
+
+    def _find_boundary(self, data, eof = False):
+        """
+        Finds a multipart boundary in data.
+
+        Should no boundry exist in the data None is returned instead. Otherwise
+        a tuple containing the indices of the following are returned:
+
+         * the end of current encapsulation
+         * the start of the next encapsulation
+        """
+        index = self._fs(data)
+        if index < 0:
+            return None
+        else:
+            end = index
+            next = index + len(self._boundary)
+            # backup over CRLF
+            if data[max(0,end-1)] == '\n':
+                end -= 1
+            if data[max(0,end-1)] == '\r':
+                end -= 1
+            return end, next
+
+def exhaust(stream_or_iterable):
+    """
+    Completely exhausts an iterator or stream.
+
+    Raise a MultiPartParserError if the argument is not a stream or an iterable.
+    """
+    iterator = None
+    try:
+        iterator = iter(stream_or_iterable)
+    except TypeError:
+        iterator = ChunkIter(stream_or_iterable, 16384)
+
+    if iterator is None:
+        raise MultiPartParserError('multipartparser.exhaust() was passed a non-iterable or stream parameter')
+
+    for __ in iterator:
+        pass
+
+def parse_boundary_stream(stream, max_header_size):
+    """
+    Parses one and exactly one stream that encapsulates a boundary.
+    """
+    # Stream at beginning of header, look for end of header
+    # and parse it if found. The header must fit within one
+    # chunk.
+    chunk = stream.read(max_header_size)
+
+    # 'find' returns the top of these four bytes, so we'll
+    # need to munch them later to prevent them from polluting
+    # the payload.
+    header_end = chunk.find('\r\n\r\n')
+
+    def _parse_header(line):
+        main_value_pair, params = parse_header(line)
+        try:
+            name, value = main_value_pair.split(':', 1)
+        except:
+            raise ValueError("Invalid header: %r" % line)
+        return name, (value, params)
+
+    if header_end == -1:
+        # we find no header, so we just mark this fact and pass on
+        # the stream verbatim
+        stream.unget(chunk)
+        return (RAW, {}, stream)
+
+    header = chunk[:header_end]
+
+    # here we place any excess chunk back onto the stream, as
+    # well as throwing away the CRLFCRLF bytes from above.
+    stream.unget(chunk[header_end + 4:])
+
+    TYPE = RAW
+    outdict = {}
+
+    # Eliminate blank lines
+    for line in header.split('\r\n'):
+        # This terminology ("main value" and "dictionary of
+        # parameters") is from the Python docs.
+        try:
+            name, (value, params) = _parse_header(line)
+        except:
+            continue
+
+        if name == 'content-disposition':
+            TYPE = FIELD
+            if params.get('filename'):
+                TYPE = FILE
+
+        outdict[name] = value, params
+
+    if TYPE == RAW:
+        stream.unget(chunk)
+
+    return (TYPE, outdict, stream)
+
+class Parser(object):
+    def __init__(self, stream, boundary):
+        self._stream = stream
+        self._separator = '--' + boundary
+
+    def __iter__(self):
+        boundarystream = InterBoundaryIter(self._stream, self._separator)
+        for sub_stream in boundarystream:
+            # Iterate over each part
+            yield parse_boundary_stream(sub_stream, 1024)
+
+def parse_header(line):
+    """ Parse the header into a key-value. """
+    plist = _parse_header_params(';' + line)
+    key = plist.pop(0).lower()
+    pdict = {}
+    for p in plist:
+        i = p.find('=')
+        if i >= 0:
+            name = p[:i].strip().lower()
+            value = p[i+1:].strip()
+            if len(value) >= 2 and value[0] == value[-1] == '"':
+                value = value[1:-1]
+                value = value.replace('\\\\', '\\').replace('\\"', '"')
+            pdict[name] = value
+    return key, pdict
+
+def _parse_header_params(s):
+    plist = []
+    while s[:1] == ';':
+        s = s[1:]
+        end = s.find(';')
+        while end > 0 and s.count('"', 0, end) % 2:
+            end = s.find(';', end + 1)
+        if end < 0:
+            end = len(s)
+        f = s[:end]
+        plist.append(f.strip())
+        s = s[end:]
+    return plist
diff --git a/webapp/django/http/utils.py b/webapp/django/http/utils.py
new file mode 100644
index 0000000..4dc05a2
--- /dev/null
+++ b/webapp/django/http/utils.py
@@ -0,0 +1,84 @@
+"""
+Functions that modify an HTTP request or response in some way.
+"""
+
+# This group of functions are run as part of the response handling, after
+# everything else, including all response middleware. Think of them as
+# "compulsory response middleware". Be careful about what goes here, because
+# it's a little fiddly to override this behavior, so they should be truly
+# universally applicable.
+
+def fix_location_header(request, response):
+    """
+    Ensures that we always use an absolute URI in any location header in the
+    response. This is required by RFC 2616, section 14.30.
+
+    Code constructing response objects is free to insert relative paths, as
+    this function converts them to absolute paths.
+    """
+    if 'Location' in response and request.get_host():
+        response['Location'] = request.build_absolute_uri(response['Location'])
+    return response
+
+def conditional_content_removal(request, response):
+    """
+    Removes the content of responses for HEAD requests, 1xx, 204 and 304
+    responses. Ensures compliance with RFC 2616, section 4.3.
+    """
+    if 100 <= response.status_code < 200 or response.status_code in (204, 304):
+       response.content = ''
+       response['Content-Length'] = 0
+    if request.method == 'HEAD':
+        response.content = ''
+    return response
+
+def fix_IE_for_attach(request, response):
+    """
+    This function will prevent Django from serving a Content-Disposition header
+    while expecting the browser to cache it (only when the browser is IE). This
+    leads to IE not allowing the client to download.
+    """
+    if 'MSIE' not in request.META.get('HTTP_USER_AGENT', '').upper():
+        return response
+
+    offending_headers = ('no-cache', 'no-store')
+    if response.has_header('Content-Disposition'):
+        try:
+            del response['Pragma']
+        except KeyError:
+            pass
+        if response.has_header('Cache-Control'):
+            cache_control_values = [value.strip() for value in
+                    response['Cache-Control'].split(',')
+                    if value.strip().lower() not in offending_headers]
+
+            if not len(cache_control_values):
+                del response['Cache-Control']
+            else:
+                response['Cache-Control'] = ', '.join(cache_control_values)
+
+    return response
+
+def fix_IE_for_vary(request, response):
+    """
+    This function will fix the bug reported at
+    http://support.microsoft.com/kb/824847/en-us?spid=8722&sid=global
+    by clearing the Vary header whenever the mime-type is not safe
+    enough for Internet Explorer to handle.  Poor thing.
+    """
+    if 'MSIE' not in request.META.get('HTTP_USER_AGENT', '').upper():
+        return response
+
+    # These mime-types that are decreed "Vary-safe" for IE:
+    safe_mime_types = ('text/html', 'text/plain', 'text/sgml')
+
+    # The first part of the Content-Type field will be the MIME type,
+    # everything after ';', such as character-set, can be ignored.
+    if response['Content-Type'].split(';')[0] not in safe_mime_types:
+        try:
+            del response['Vary']
+        except KeyError:
+            pass
+
+    return response
+
diff --git a/webapp/django/middleware/__init__.py b/webapp/django/middleware/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/middleware/__init__.py
diff --git a/webapp/django/middleware/cache.py b/webapp/django/middleware/cache.py
new file mode 100644
index 0000000..28e8784
--- /dev/null
+++ b/webapp/django/middleware/cache.py
@@ -0,0 +1,155 @@
+"""
+Cache middleware. If enabled, each Django-powered page will be cached based on
+URL. The canonical way to enable cache middleware is to set
+``UpdateCacheMiddleware`` as your first piece of middleware, and
+``FetchFromCacheMiddleware`` as the last::
+
+    MIDDLEWARE_CLASSES = [
+        'django.middleware.cache.UpdateCacheMiddleware',
+        ...
+        'django.middleware.cache.FetchFromCacheMiddleware'
+    ]
+
+This is counter-intuitive, but correct: ``UpdateCacheMiddleware`` needs to run
+last during the response phase, which processes middleware bottom-up;
+``FetchFromCacheMiddleware`` needs to run last during the request phase, which
+processes middleware top-down.
+
+The single-class ``CacheMiddleware`` can be used for some simple sites.
+However, if any other piece of middleware needs to affect the cache key, you'll
+need to use the two-part ``UpdateCacheMiddleware`` and
+``FetchFromCacheMiddleware``. This'll most often happen when you're using
+Django's ``LocaleMiddleware``.
+
+More details about how the caching works:
+
+* Only parameter-less GET or HEAD-requests with status code 200 are cached.
+
+* The number of seconds each page is stored for is set by the "max-age" section
+  of the response's "Cache-Control" header, falling back to the
+  CACHE_MIDDLEWARE_SECONDS setting if the section was not found.
+
+* If CACHE_MIDDLEWARE_ANONYMOUS_ONLY is set to True, only anonymous requests
+  (i.e., those not made by a logged-in user) will be cached. This is a simple
+  and effective way of avoiding the caching of the Django admin (and any other
+  user-specific content).
+
+* This middleware expects that a HEAD request is answered with a response
+  exactly like the corresponding GET request.
+
+* When a hit occurs, a shallow copy of the original response object is returned
+  from process_request.
+
+* Pages will be cached based on the contents of the request headers listed in
+  the response's "Vary" header.
+
+* This middleware also sets ETag, Last-Modified, Expires and Cache-Control
+  headers on the response object.
+
+"""
+
+from django.conf import settings
+from django.core.cache import cache
+from django.utils.cache import get_cache_key, learn_cache_key, patch_response_headers, get_max_age
+
+class UpdateCacheMiddleware(object):
+    """
+    Response-phase cache middleware that updates the cache if the response is
+    cacheable.
+
+    Must be used as part of the two-part update/fetch cache middleware.
+    UpdateCacheMiddleware must be the first piece of middleware in
+    MIDDLEWARE_CLASSES so that it'll get called last during the response phase.
+    """
+    def __init__(self):
+        self.cache_timeout = settings.CACHE_MIDDLEWARE_SECONDS
+        self.key_prefix = settings.CACHE_MIDDLEWARE_KEY_PREFIX
+        self.cache_anonymous_only = getattr(settings, 'CACHE_MIDDLEWARE_ANONYMOUS_ONLY', False)
+
+    def process_response(self, request, response):
+        """Sets the cache, if needed."""
+        if not hasattr(request, '_cache_update_cache') or not request._cache_update_cache:
+            # We don't need to update the cache, just return.
+            return response
+        if request.method != 'GET':
+            # This is a stronger requirement than above. It is needed
+            # because of interactions between this middleware and the
+            # HTTPMiddleware, which throws the body of a HEAD-request
+            # away before this middleware gets a chance to cache it.
+            return response
+        if not response.status_code == 200:
+            return response
+        # Try to get the timeout from the "max-age" section of the "Cache-
+        # Control" header before reverting to using the default cache_timeout
+        # length.
+        timeout = get_max_age(response)
+        if timeout == None:
+            timeout = self.cache_timeout
+        elif timeout == 0:
+            # max-age was set to 0, don't bother caching.
+            return response
+        patch_response_headers(response, timeout)
+        cache_key = learn_cache_key(request, response, timeout, self.key_prefix)
+        cache.set(cache_key, response, timeout)
+        return response
+
+class FetchFromCacheMiddleware(object):
+    """
+    Request-phase cache middleware that fetches a page from the cache.
+
+    Must be used as part of the two-part update/fetch cache middleware.
+    FetchFromCacheMiddleware must be the last piece of middleware in
+    MIDDLEWARE_CLASSES so that it'll get called last during the request phase.
+    """
+    def __init__(self):
+        self.cache_timeout = settings.CACHE_MIDDLEWARE_SECONDS
+        self.key_prefix = settings.CACHE_MIDDLEWARE_KEY_PREFIX
+        self.cache_anonymous_only = getattr(settings, 'CACHE_MIDDLEWARE_ANONYMOUS_ONLY', False)
+
+    def process_request(self, request):
+        """
+        Checks whether the page is already cached and returns the cached
+        version if available.
+        """
+        if self.cache_anonymous_only:
+            assert hasattr(request, 'user'), "The Django cache middleware with CACHE_MIDDLEWARE_ANONYMOUS_ONLY=True requires authentication middleware to be installed. Edit your MIDDLEWARE_CLASSES setting to insert 'django.contrib.auth.middleware.AuthenticationMiddleware' before the CacheMiddleware."
+
+        if not request.method in ('GET', 'HEAD') or request.GET:
+            request._cache_update_cache = False
+            return None # Don't bother checking the cache.
+
+        if self.cache_anonymous_only and request.user.is_authenticated():
+            request._cache_update_cache = False
+            return None # Don't cache requests from authenticated users.
+
+        cache_key = get_cache_key(request, self.key_prefix)
+        if cache_key is None:
+            request._cache_update_cache = True
+            return None # No cache information available, need to rebuild.
+
+        response = cache.get(cache_key, None)
+        if response is None:
+            request._cache_update_cache = True
+            return None # No cache information available, need to rebuild.
+
+        request._cache_update_cache = False
+        return response
+
+class CacheMiddleware(UpdateCacheMiddleware, FetchFromCacheMiddleware):
+    """
+    Cache middleware that provides basic behavior for many simple sites.
+
+    Also used as the hook point for the cache decorator, which is generated
+    using the decorator-from-middleware utility.
+    """
+    def __init__(self, cache_timeout=None, key_prefix=None, cache_anonymous_only=None):
+        self.cache_timeout = cache_timeout
+        if cache_timeout is None:
+            self.cache_timeout = settings.CACHE_MIDDLEWARE_SECONDS
+        self.key_prefix = key_prefix
+        if key_prefix is None:
+            self.key_prefix = settings.CACHE_MIDDLEWARE_KEY_PREFIX
+        if cache_anonymous_only is None:
+            self.cache_anonymous_only = getattr(settings, 'CACHE_MIDDLEWARE_ANONYMOUS_ONLY', False)
+        else:
+            self.cache_anonymous_only = cache_anonymous_only
diff --git a/webapp/django/middleware/common.py b/webapp/django/middleware/common.py
new file mode 100644
index 0000000..270ab99
--- /dev/null
+++ b/webapp/django/middleware/common.py
@@ -0,0 +1,134 @@
+import re
+
+from django.conf import settings
+from django import http
+from django.core.mail import mail_managers
+from django.utils.http import urlquote
+from django.core import urlresolvers
+from django.utils.hashcompat import md5_constructor
+
+class CommonMiddleware(object):
+    """
+    "Common" middleware for taking care of some basic operations:
+
+        - Forbids access to User-Agents in settings.DISALLOWED_USER_AGENTS
+
+        - URL rewriting: Based on the APPEND_SLASH and PREPEND_WWW settings,
+          this middleware appends missing slashes and/or prepends missing
+          "www."s.
+
+            - If APPEND_SLASH is set and the initial URL doesn't end with a
+              slash, and it is not found in urlpatterns, a new URL is formed by
+              appending a slash at the end. If this new URL is found in
+              urlpatterns, then an HTTP-redirect is returned to this new URL;
+              otherwise the initial URL is processed as usual.
+
+        - ETags: If the USE_ETAGS setting is set, ETags will be calculated from
+          the entire page content and Not Modified responses will be returned
+          appropriately.
+    """
+
+    def process_request(self, request):
+        """
+        Check for denied User-Agents and rewrite the URL based on
+        settings.APPEND_SLASH and settings.PREPEND_WWW
+        """
+
+        # Check for denied User-Agents
+        if 'HTTP_USER_AGENT' in request.META:
+            for user_agent_regex in settings.DISALLOWED_USER_AGENTS:
+                if user_agent_regex.search(request.META['HTTP_USER_AGENT']):
+                    return http.HttpResponseForbidden('<h1>Forbidden</h1>')
+
+        # Check for a redirect based on settings.APPEND_SLASH
+        # and settings.PREPEND_WWW
+        host = request.get_host()
+        old_url = [host, request.path]
+        new_url = old_url[:]
+
+        if (settings.PREPEND_WWW and old_url[0] and
+                not old_url[0].startswith('www.')):
+            new_url[0] = 'www.' + old_url[0]
+
+        # Append a slash if APPEND_SLASH is set and the URL doesn't have a
+        # trailing slash and there is no pattern for the current path
+        if settings.APPEND_SLASH and (not old_url[1].endswith('/')):
+            try:
+                urlresolvers.resolve(request.path_info)
+            except urlresolvers.Resolver404:
+                new_url[1] = new_url[1] + '/'
+                if settings.DEBUG and request.method == 'POST':
+                    raise RuntimeError, (""
+                    "You called this URL via POST, but the URL doesn't end "
+                    "in a slash and you have APPEND_SLASH set. Django can't "
+                    "redirect to the slash URL while maintaining POST data. "
+                    "Change your form to point to %s%s (note the trailing "
+                    "slash), or set APPEND_SLASH=False in your Django "
+                    "settings.") % (new_url[0], new_url[1])
+
+        if new_url != old_url:
+            # Redirect if the target url exists
+            try:
+                urlresolvers.resolve("%s/" % request.path_info)
+            except urlresolvers.Resolver404:
+                pass
+            else:
+                if new_url[0]:
+                    newurl = "%s://%s%s" % (
+                        request.is_secure() and 'https' or 'http',
+                        new_url[0], urlquote(new_url[1]))
+                else:
+                    newurl = urlquote(new_url[1])
+                if request.GET:
+                    newurl += '?' + request.GET.urlencode()
+                return http.HttpResponsePermanentRedirect(newurl)
+
+        return None
+
+    def process_response(self, request, response):
+        "Check for a flat page (for 404s) and calculate the Etag, if needed."
+        if response.status_code == 404:
+            if settings.SEND_BROKEN_LINK_EMAILS:
+                # If the referrer was from an internal link or a non-search-engine site,
+                # send a note to the managers.
+                domain = request.get_host()
+                referer = request.META.get('HTTP_REFERER', None)
+                is_internal = _is_internal_request(domain, referer)
+                path = request.get_full_path()
+                if referer and not _is_ignorable_404(path) and (is_internal or '?' not in referer):
+                    ua = request.META.get('HTTP_USER_AGENT', '<none>')
+                    ip = request.META.get('REMOTE_ADDR', '<none>')
+                    mail_managers("Broken %slink on %s" % ((is_internal and 'INTERNAL ' or ''), domain),
+                        "Referrer: %s\nRequested URL: %s\nUser agent: %s\nIP address: %s\n" \
+                                  % (referer, request.get_full_path(), ua, ip))
+                return response
+
+        # Use ETags, if requested.
+        if settings.USE_ETAGS:
+            if response.has_header('ETag'):
+                etag = response['ETag']
+            else:
+                etag = '"%s"' % md5_constructor(response.content).hexdigest()
+            if response.status_code >= 200 and response.status_code < 300 and request.META.get('HTTP_IF_NONE_MATCH') == etag:
+                cookies = response.cookies
+                response = http.HttpResponseNotModified()
+                response.cookies = cookies
+            else:
+                response['ETag'] = etag
+
+        return response
+
+def _is_ignorable_404(uri):
+    "Returns True if a 404 at the given URL *shouldn't* notify the site managers"
+    for start in settings.IGNORABLE_404_STARTS:
+        if uri.startswith(start):
+            return True
+    for end in settings.IGNORABLE_404_ENDS:
+        if uri.endswith(end):
+            return True
+    return False
+
+def _is_internal_request(domain, referer):
+    "Return true if the referring URL is the same domain as the current request"
+    # Different subdomains are treated as different domains.
+    return referer is not None and re.match("^https?://%s/" % re.escape(domain), referer)
diff --git a/webapp/django/middleware/doc.py b/webapp/django/middleware/doc.py
new file mode 100644
index 0000000..48c155c
--- /dev/null
+++ b/webapp/django/middleware/doc.py
@@ -0,0 +1,18 @@
+from django.conf import settings
+from django import http
+
+class XViewMiddleware(object):
+    """
+    Adds an X-View header to internal HEAD requests -- used by the documentation system.
+    """
+    def process_view(self, request, view_func, view_args, view_kwargs):
+        """
+        If the request method is HEAD and either the IP is internal or the
+        user is a logged-in staff member, quickly return with an x-header
+        indicating the view function.  This is used by the documentation module
+        to lookup the view function for an arbitrary page.
+        """
+        if request.method == 'HEAD' and (request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS or (request.user.is_authenticated() and request.user.is_staff)):
+            response = http.HttpResponse()
+            response['X-View'] = "%s.%s" % (view_func.__module__, view_func.__name__)
+            return response
diff --git a/webapp/django/middleware/gzip.py b/webapp/django/middleware/gzip.py
new file mode 100644
index 0000000..3b84980
--- /dev/null
+++ b/webapp/django/middleware/gzip.py
@@ -0,0 +1,39 @@
+import re
+
+from django.utils.text import compress_string
+from django.utils.cache import patch_vary_headers
+
+re_accepts_gzip = re.compile(r'\bgzip\b')
+
+class GZipMiddleware(object):
+    """
+    This middleware compresses content if the browser allows gzip compression.
+    It sets the Vary header accordingly, so that caches will base their storage
+    on the Accept-Encoding header.
+    """
+    def process_response(self, request, response):
+        # It's not worth compressing non-OK or really short responses.
+        if response.status_code != 200 or len(response.content) < 200:
+            return response
+
+        patch_vary_headers(response, ('Accept-Encoding',))
+
+        # Avoid gzipping if we've already got a content-encoding.
+        if response.has_header('Content-Encoding'):
+            return response
+
+        # Older versions of IE have issues with gzipped pages containing either
+        # Javascript and PDF.
+        if "msie" in request.META.get('HTTP_USER_AGENT', '').lower():
+            ctype = response.get('Content-Type', '').lower()
+            if "javascript" in ctype or ctype == "application/pdf":
+                return response
+
+        ae = request.META.get('HTTP_ACCEPT_ENCODING', '')
+        if not re_accepts_gzip.search(ae):
+            return response
+
+        response.content = compress_string(response.content)
+        response['Content-Encoding'] = 'gzip'
+        response['Content-Length'] = str(len(response.content))
+        return response
diff --git a/webapp/django/middleware/http.py b/webapp/django/middleware/http.py
new file mode 100644
index 0000000..53b65c1
--- /dev/null
+++ b/webapp/django/middleware/http.py
@@ -0,0 +1,55 @@
+from django.utils.http import http_date
+
+class ConditionalGetMiddleware(object):
+    """
+    Handles conditional GET operations. If the response has a ETag or
+    Last-Modified header, and the request has If-None-Match or
+    If-Modified-Since, the response is replaced by an HttpNotModified.
+
+    Also sets the Date and Content-Length response-headers.
+    """
+    def process_response(self, request, response):
+        response['Date'] = http_date()
+        if not response.has_header('Content-Length'):
+            response['Content-Length'] = str(len(response.content))
+
+        if response.has_header('ETag'):
+            if_none_match = request.META.get('HTTP_IF_NONE_MATCH', None)
+            if if_none_match == response['ETag']:
+                # Setting the status is enough here. The response handling path
+                # automatically removes content for this status code (in
+                # http.conditional_content_removal()).
+                response.status_code = 304
+
+        if response.has_header('Last-Modified'):
+            if_modified_since = request.META.get('HTTP_IF_MODIFIED_SINCE', None)
+            if if_modified_since == response['Last-Modified']:
+                # Setting the status code is enough here (same reasons as
+                # above).
+                response.status_code = 304
+
+        return response
+
+class SetRemoteAddrFromForwardedFor(object):
+    """
+    Middleware that sets REMOTE_ADDR based on HTTP_X_FORWARDED_FOR, if the
+    latter is set. This is useful if you're sitting behind a reverse proxy that
+    causes each request's REMOTE_ADDR to be set to 127.0.0.1.
+
+    Note that this does NOT validate HTTP_X_FORWARDED_FOR. If you're not behind
+    a reverse proxy that sets HTTP_X_FORWARDED_FOR automatically, do not use
+    this middleware. Anybody can spoof the value of HTTP_X_FORWARDED_FOR, and
+    because this sets REMOTE_ADDR based on HTTP_X_FORWARDED_FOR, that means
+    anybody can "fake" their IP address. Only use this when you can absolutely
+    trust the value of HTTP_X_FORWARDED_FOR.
+    """
+    def process_request(self, request):
+        try:
+            real_ip = request.META['HTTP_X_FORWARDED_FOR']
+        except KeyError:
+            return None
+        else:
+            # HTTP_X_FORWARDED_FOR can be a comma-separated list of IPs. The
+            # client's IP will be the first one.
+            real_ip = real_ip.split(",")[0].strip()
+            request.META['REMOTE_ADDR'] = real_ip
diff --git a/webapp/django/middleware/locale.py b/webapp/django/middleware/locale.py
new file mode 100644
index 0000000..b5e4949
--- /dev/null
+++ b/webapp/django/middleware/locale.py
@@ -0,0 +1,25 @@
+"this is the locale selecting middleware that will look at accept headers"
+
+from django.utils.cache import patch_vary_headers
+from django.utils import translation
+
+class LocaleMiddleware(object):
+    """
+    This is a very simple middleware that parses a request
+    and decides what translation object to install in the current
+    thread context. This allows pages to be dynamically
+    translated to the language the user desires (if the language
+    is available, of course).
+    """
+
+    def process_request(self, request):
+        language = translation.get_language_from_request(request)
+        translation.activate(language)
+        request.LANGUAGE_CODE = translation.get_language()
+
+    def process_response(self, request, response):
+        patch_vary_headers(response, ('Accept-Language',))
+        if 'Content-Language' not in response:
+            response['Content-Language'] = translation.get_language()
+        translation.deactivate()
+        return response
diff --git a/webapp/django/middleware/transaction.py b/webapp/django/middleware/transaction.py
new file mode 100644
index 0000000..96b1538
--- /dev/null
+++ b/webapp/django/middleware/transaction.py
@@ -0,0 +1,27 @@
+from django.db import transaction
+
+class TransactionMiddleware(object):
+    """
+    Transaction middleware. If this is enabled, each view function will be run
+    with commit_on_response activated - that way a save() doesn't do a direct
+    commit, the commit is done when a successful response is created. If an
+    exception happens, the database is rolled back.
+    """
+    def process_request(self, request):
+        """Enters transaction management"""
+        transaction.enter_transaction_management()
+        transaction.managed(True)
+
+    def process_exception(self, request, exception):
+        """Rolls back the database and leaves transaction management"""
+        if transaction.is_dirty():
+            transaction.rollback()
+        transaction.leave_transaction_management()
+
+    def process_response(self, request, response):
+        """Commits and leaves transaction management."""
+        if transaction.is_managed():
+            if transaction.is_dirty():
+                transaction.commit()
+            transaction.leave_transaction_management()
+        return response
diff --git a/webapp/django/oldforms/__init__.py b/webapp/django/oldforms/__init__.py
new file mode 100644
index 0000000..b5698ab
--- /dev/null
+++ b/webapp/django/oldforms/__init__.py
@@ -0,0 +1,1056 @@
+from django.core import validators
+from django.core.exceptions import PermissionDenied
+from django.utils.html import escape
+from django.utils.safestring import mark_safe
+from django.conf import settings
+from django.utils.translation import ugettext, ungettext
+from django.utils.encoding import smart_unicode, force_unicode
+
+FORM_FIELD_ID_PREFIX = 'id_'
+
+class EmptyValue(Exception):
+    "This is raised when empty data is provided"
+    pass
+
+class Manipulator(object):
+    # List of permission strings. User must have at least one to manipulate.
+    # None means everybody has permission.
+    required_permission = ''
+
+    def __init__(self):
+        # List of FormField objects
+        self.fields = []
+
+    def __getitem__(self, field_name):
+        "Looks up field by field name; raises KeyError on failure"
+        for field in self.fields:
+            if field.field_name == field_name:
+                return field
+        raise KeyError, "Field %s not found\n%s" % (field_name, repr(self.fields))
+
+    def __delitem__(self, field_name):
+        "Deletes the field with the given field name; raises KeyError on failure"
+        for i, field in enumerate(self.fields):
+            if field.field_name == field_name:
+                del self.fields[i]
+                return
+        raise KeyError, "Field %s not found" % field_name
+
+    def check_permissions(self, user):
+        """Confirms user has required permissions to use this manipulator; raises
+        PermissionDenied on failure."""
+        if self.required_permission is None:
+            return
+        if user.has_perm(self.required_permission):
+            return
+        raise PermissionDenied
+
+    def prepare(self, new_data):
+        """
+        Makes any necessary preparations to new_data, in place, before data has
+        been validated.
+        """
+        for field in self.fields:
+            field.prepare(new_data)
+
+    def get_validation_errors(self, new_data):
+        "Returns dictionary mapping field_names to error-message lists"
+        errors = {}
+        self.prepare(new_data)
+        for field in self.fields:
+            errors.update(field.get_validation_errors(new_data))
+            val_name = 'validate_%s' % field.field_name
+            if hasattr(self, val_name):
+                val = getattr(self, val_name)
+                try:
+                    field.run_validator(new_data, val)
+                except (validators.ValidationError, validators.CriticalValidationError), e:
+                    errors.setdefault(field.field_name, []).extend(e.messages)
+
+#            if field.is_required and not new_data.get(field.field_name, False):
+#                errors.setdefault(field.field_name, []).append(ugettext_lazy('This field is required.'))
+#                continue
+#            try:
+#                validator_list = field.validator_list
+#                if hasattr(self, 'validate_%s' % field.field_name):
+#                    validator_list.append(getattr(self, 'validate_%s' % field.field_name))
+#                for validator in validator_list:
+#                    if field.is_required or new_data.get(field.field_name, False) or hasattr(validator, 'always_test'):
+#                        try:
+#                            if hasattr(field, 'requires_data_list'):
+#                                validator(new_data.getlist(field.field_name), new_data)
+#                            else:
+#                                validator(new_data.get(field.field_name, ''), new_data)
+#                        except validators.ValidationError, e:
+#                            errors.setdefault(field.field_name, []).extend(e.messages)
+#            # If a CriticalValidationError is raised, ignore any other ValidationErrors
+#            # for this particular field
+#            except validators.CriticalValidationError, e:
+#                errors.setdefault(field.field_name, []).extend(e.messages)
+        return errors
+
+    def save(self, new_data):
+        "Saves the changes and returns the new object"
+        # changes is a dictionary-like object keyed by field_name
+        raise NotImplementedError
+
+    def do_html2python(self, new_data):
+        """
+        Convert the data from HTML data types to Python datatypes, changing the
+        object in place. This happens after validation but before storage. This
+        must happen after validation because html2python functions aren't
+        expected to deal with invalid input.
+        """
+        for field in self.fields:
+            field.convert_post_data(new_data)
+
+class FormWrapper(object):
+    """
+    A wrapper linking a Manipulator to the template system.
+    This allows dictionary-style lookups of formfields. It also handles feeding
+    prepopulated data and validation error messages to the formfield objects.
+    """
+    def __init__(self, manipulator, data=None, error_dict=None, edit_inline=True):
+        self.manipulator = manipulator
+        if data is None:
+            data = {}
+        if error_dict is None:
+            error_dict = {}
+        self.data = data
+        self.error_dict = error_dict
+        self._inline_collections = None
+        self.edit_inline = edit_inline
+
+    def __repr__(self):
+        return repr(self.__dict__)
+
+    def __getitem__(self, key):
+        for field in self.manipulator.fields:
+            if field.field_name == key:
+                data = field.extract_data(self.data)
+                return FormFieldWrapper(field, data, self.error_dict.get(field.field_name, []))
+        if self.edit_inline:
+            self.fill_inline_collections()
+            for inline_collection in self._inline_collections:
+                # The 'orig_name' comparison is for backwards compatibility
+                # with hand-crafted forms.
+                if inline_collection.name == key or (':' not in key and inline_collection.orig_name == key):
+                    return inline_collection
+        raise KeyError, "Could not find Formfield or InlineObjectCollection named %r" % key
+
+    def fill_inline_collections(self):
+        if not self._inline_collections:
+            ic = []
+            related_objects = self.manipulator.get_related_objects()
+            for rel_obj in related_objects:
+                data = rel_obj.extract_data(self.data)
+                inline_collection = InlineObjectCollection(self.manipulator, rel_obj, data, self.error_dict)
+                ic.append(inline_collection)
+            self._inline_collections = ic
+
+    def has_errors(self):
+        return self.error_dict != {}
+
+    def _get_fields(self):
+        try:
+            return self._fields
+        except AttributeError:
+            self._fields = [self.__getitem__(field.field_name) for field in self.manipulator.fields]
+            return self._fields
+
+    fields = property(_get_fields)
+
+class FormFieldWrapper(object):
+    "A bridge between the template system and an individual form field. Used by FormWrapper."
+    def __init__(self, formfield, data, error_list):
+        self.formfield, self.data, self.error_list = formfield, data, error_list
+        self.field_name = self.formfield.field_name # for convenience in templates
+
+    def __str__(self):
+        "Renders the field"
+        return unicode(self).encode('utf-8')
+
+    def __unicode__(self):
+        "Renders the field"
+        return force_unicode(self.formfield.render(self.data))
+
+    def __repr__(self):
+        return '<FormFieldWrapper for "%s">' % self.formfield.field_name
+
+    def field_list(self):
+        """
+        Like __str__(), but returns a list. Use this when the field's render()
+        method returns a list.
+        """
+        return self.formfield.render(self.data)
+
+    def errors(self):
+        return self.error_list
+
+    def html_error_list(self):
+        if self.errors():
+            return mark_safe('<ul class="errorlist"><li>%s</li></ul>' % '</li><li>'.join([escape(e) for e in self.errors()]))
+        else:
+            return mark_safe('')
+
+    def get_id(self):
+        return self.formfield.get_id()
+
+class FormFieldCollection(FormFieldWrapper):
+    "A utility class that gives the template access to a dict of FormFieldWrappers"
+    def __init__(self, formfield_dict):
+        self.formfield_dict = formfield_dict
+
+    def __str__(self):
+        return unicode(self).encode('utf-8')
+
+    def __unicode__(self):
+        return unicode(self.formfield_dict)
+
+    def __getitem__(self, template_key):
+        "Look up field by template key; raise KeyError on failure"
+        return self.formfield_dict[template_key]
+
+    def __repr__(self):
+        return "<FormFieldCollection: %s>" % self.formfield_dict
+
+    def errors(self):
+        "Returns list of all errors in this collection's formfields"
+        errors = []
+        for field in self.formfield_dict.values():
+            if hasattr(field, 'errors'):
+                errors.extend(field.errors())
+        return errors
+
+    def has_errors(self):
+        return bool(len(self.errors()))
+
+    def html_combined_error_list(self):
+        return mark_safe(''.join([field.html_error_list() for field in self.formfield_dict.values() if hasattr(field, 'errors')]))
+
+class InlineObjectCollection(object):
+    "An object that acts like a sparse list of form field collections."
+    def __init__(self, parent_manipulator, rel_obj, data, errors):
+        self.parent_manipulator = parent_manipulator
+        self.rel_obj = rel_obj
+        self.data = data
+        self.errors = errors
+        self._collections = None
+        self.name = rel_obj.name
+        # This is the name used prior to fixing #1839. Needs for backwards
+        # compatibility.
+        self.orig_name = rel_obj.opts.module_name
+
+    def __len__(self):
+        self.fill()
+        return self._collections.__len__()
+
+    def __getitem__(self, k):
+        self.fill()
+        return self._collections.__getitem__(k)
+
+    def __setitem__(self, k, v):
+        self.fill()
+        return self._collections.__setitem__(k,v)
+
+    def __delitem__(self, k):
+        self.fill()
+        return self._collections.__delitem__(k)
+
+    def __iter__(self):
+        self.fill()
+        return iter(self._collections.values())
+
+    def items(self):
+        self.fill()
+        return self._collections.items()
+
+    def fill(self):
+        if self._collections:
+            return
+        else:
+            var_name = self.rel_obj.opts.object_name.lower()
+            collections = {}
+            orig = None
+            if hasattr(self.parent_manipulator, 'original_object'):
+                orig = self.parent_manipulator.original_object
+            orig_list = self.rel_obj.get_list(orig)
+
+            for i, instance in enumerate(orig_list):
+                collection = {'original': instance}
+                for f in self.rel_obj.editable_fields():
+                    for field_name in f.get_manipulator_field_names(''):
+                        full_field_name = '%s.%d.%s' % (var_name, i, field_name)
+                        field = self.parent_manipulator[full_field_name]
+                        data = field.extract_data(self.data)
+                        errors = self.errors.get(full_field_name, [])
+                        collection[field_name] = FormFieldWrapper(field, data, errors)
+                collections[i] = FormFieldCollection(collection)
+            self._collections = collections
+
+
+class FormField(object):
+    """Abstract class representing a form field.
+
+    Classes that extend FormField should define the following attributes:
+        field_name
+            The field's name for use by programs.
+        validator_list
+            A list of validation tests (callback functions) that the data for
+            this field must pass in order to be added or changed.
+        is_required
+            A Boolean. Is it a required field?
+    Subclasses should also implement a render(data) method, which is responsible
+    for rending the form field in XHTML.
+    """
+
+    def __str__(self):
+        return unicode(self).encode('utf-8')
+
+    def __unicode__(self):
+        return self.render(u'')
+
+    def __repr__(self):
+        return 'FormField "%s"' % self.field_name
+
+    def prepare(self, new_data):
+        "Hook for doing something to new_data (in place) before validation."
+        pass
+
+    def html2python(data):
+        "Hook for converting an HTML datatype (e.g. 'on' for checkboxes) to a Python type"
+        return data
+    html2python = staticmethod(html2python)
+
+    def render(self, data):
+        raise NotImplementedError
+
+    def get_member_name(self):
+        if hasattr(self, 'member_name'):
+            return self.member_name
+        else:
+            return self.field_name
+
+    def extract_data(self, data_dict):
+        if hasattr(self, 'requires_data_list') and hasattr(data_dict, 'getlist'):
+            data = data_dict.getlist(self.get_member_name())
+        else:
+            data = data_dict.get(self.get_member_name(), None)
+        if data is None:
+            data = ''
+        return data
+
+    def convert_post_data(self, new_data):
+        name = self.get_member_name()
+        if self.field_name in new_data:
+            d = new_data.getlist(self.field_name)
+            try:
+                converted_data = [self.__class__.html2python(data) for data in d]
+            except ValueError:
+                converted_data = d
+            new_data.setlist(name, converted_data)
+        else:
+            try:
+                #individual fields deal with None values themselves
+                new_data.setlist(name, [self.__class__.html2python(None)])
+            except EmptyValue:
+                new_data.setlist(name, [])
+
+
+    def run_validator(self, new_data, validator):
+        if self.is_required or new_data.get(self.field_name, False) or hasattr(validator, 'always_test'):
+            if hasattr(self, 'requires_data_list'):
+                validator(new_data.getlist(self.field_name), new_data)
+            else:
+                validator(new_data.get(self.field_name, ''), new_data)
+
+    def get_validation_errors(self, new_data):
+        errors = {}
+        if self.is_required and not new_data.get(self.field_name, False):
+            errors.setdefault(self.field_name, []).append(ugettext('This field is required.'))
+            return errors
+        try:
+            for validator in self.validator_list:
+                try:
+                    self.run_validator(new_data, validator)
+                except validators.ValidationError, e:
+                    errors.setdefault(self.field_name, []).extend(e.messages)
+        # If a CriticalValidationError is raised, ignore any other ValidationErrors
+        # for this particular field
+        except validators.CriticalValidationError, e:
+            errors.setdefault(self.field_name, []).extend(e.messages)
+        return errors
+
+    def get_id(self):
+        "Returns the HTML 'id' attribute for this form field."
+        return FORM_FIELD_ID_PREFIX + self.field_name
+
+####################
+# GENERIC WIDGETS  #
+####################
+
+class TextField(FormField):
+    input_type = "text"
+    def __init__(self, field_name, length=30, max_length=None, is_required=False, validator_list=None, member_name=None):
+        if validator_list is None: validator_list = []
+        self.field_name = field_name
+        self.length, self.max_length = length, max_length
+        self.is_required = is_required
+        self.validator_list = [self.isValidLength, self.hasNoNewlines] + validator_list
+        if member_name != None:
+            self.member_name = member_name
+
+    def isValidLength(self, data, form):
+        if data and self.max_length and len(smart_unicode(data)) > self.max_length:
+            raise validators.ValidationError, ungettext("Ensure your text is less than %s character.",
+                "Ensure your text is less than %s characters.", self.max_length) % self.max_length
+
+    def hasNoNewlines(self, data, form):
+        if data and '\n' in data:
+            raise validators.ValidationError, ugettext("Line breaks are not allowed here.")
+
+    def render(self, data):
+        if data is None:
+            data = u''
+        max_length = u''
+        if self.max_length:
+            max_length = u'maxlength="%s" ' % self.max_length
+        return mark_safe(u'<input type="%s" id="%s" class="v%s%s" name="%s" size="%s" value="%s" %s/>' % \
+            (self.input_type, self.get_id(), self.__class__.__name__, self.is_required and u' required' or '',
+            self.field_name, self.length, escape(data), max_length))
+
+    def html2python(data):
+        return data
+    html2python = staticmethod(html2python)
+
+class PasswordField(TextField):
+    input_type = "password"
+
+class LargeTextField(TextField):
+    def __init__(self, field_name, rows=10, cols=40, is_required=False, validator_list=None, max_length=None):
+        if validator_list is None: validator_list = []
+        self.field_name = field_name
+        self.rows, self.cols, self.is_required = rows, cols, is_required
+        self.validator_list = validator_list[:]
+        if max_length:
+            self.validator_list.append(self.isValidLength)
+            self.max_length = max_length
+
+    def render(self, data):
+        if data is None:
+            data = ''
+        return mark_safe(u'<textarea id="%s" class="v%s%s" name="%s" rows="%s" cols="%s">%s</textarea>' % \
+            (self.get_id(), self.__class__.__name__, self.is_required and u' required' or u'',
+            self.field_name, self.rows, self.cols, escape(data)))
+
+class HiddenField(FormField):
+    def __init__(self, field_name, is_required=False, validator_list=None, max_length=None):
+        if validator_list is None: validator_list = []
+        self.field_name, self.is_required = field_name, is_required
+        self.validator_list = validator_list[:]
+
+    def render(self, data):
+        return mark_safe(u'<input type="hidden" id="%s" name="%s" value="%s" />' % \
+            (self.get_id(), self.field_name, escape(data)))
+
+class CheckboxField(FormField):
+    def __init__(self, field_name, checked_by_default=False, validator_list=None, is_required=False):
+        if validator_list is None: validator_list = []
+        self.field_name = field_name
+        self.checked_by_default = checked_by_default
+        self.is_required = is_required
+        self.validator_list = validator_list[:]
+
+    def render(self, data):
+        checked_html = ''
+        if data or (data is '' and self.checked_by_default):
+            checked_html = ' checked="checked"'
+        return mark_safe(u'<input type="checkbox" id="%s" class="v%s" name="%s"%s />' % \
+            (self.get_id(), self.__class__.__name__,
+            self.field_name, checked_html))
+
+    def html2python(data):
+        "Convert value from browser ('on' or '') to a Python boolean"
+        if data == 'on':
+            return True
+        return False
+    html2python = staticmethod(html2python)
+
+class SelectField(FormField):
+    def __init__(self, field_name, choices=None, size=1, is_required=False, validator_list=None, member_name=None):
+        if validator_list is None: validator_list = []
+        if choices is None: choices = []
+        choices = [(k, smart_unicode(v, strings_only=True)) for k, v in choices]
+        self.field_name = field_name
+        # choices is a list of (value, human-readable key) tuples because order matters
+        self.choices, self.size, self.is_required = choices, size, is_required
+        self.validator_list = [self.isValidChoice] + validator_list
+        if member_name != None:
+            self.member_name = member_name
+
+    def render(self, data):
+        output = [u'<select id="%s" class="v%s%s" name="%s" size="%s">' % \
+            (self.get_id(), self.__class__.__name__,
+             self.is_required and u' required' or u'', self.field_name, self.size)]
+        str_data = smart_unicode(data) # normalize to string
+        for value, display_name in self.choices:
+            selected_html = u''
+            if smart_unicode(value) == str_data:
+                selected_html = u' selected="selected"'
+            output.append(u'    <option value="%s"%s>%s</option>' % (escape(value), selected_html, force_unicode(escape(display_name))))
+        output.append(u'  </select>')
+        return mark_safe(u'\n'.join(output))
+
+    def isValidChoice(self, data, form):
+        str_data = smart_unicode(data)
+        str_choices = [smart_unicode(item[0]) for item in self.choices]
+        if str_data not in str_choices:
+            raise validators.ValidationError, ugettext("Select a valid choice; '%(data)s' is not in %(choices)s.") % {'data': str_data, 'choices': str_choices}
+
+class NullSelectField(SelectField):
+    "This SelectField converts blank fields to None"
+    def html2python(data):
+        if not data:
+            return None
+        return data
+    html2python = staticmethod(html2python)
+
+class RadioSelectField(FormField):
+    def __init__(self, field_name, choices=None, ul_class='', is_required=False, validator_list=None, member_name=None):
+        if validator_list is None: validator_list = []
+        if choices is None: choices = []
+        choices = [(k, smart_unicode(v)) for k, v in choices]
+        self.field_name = field_name
+        # choices is a list of (value, human-readable key) tuples because order matters
+        self.choices, self.is_required = choices, is_required
+        self.validator_list = [self.isValidChoice] + validator_list
+        self.ul_class = ul_class
+        if member_name != None:
+            self.member_name = member_name
+
+    def render(self, data):
+        """
+        Returns a special object, RadioFieldRenderer, that is iterable *and*
+        has a default unicode() rendered output.
+
+        This allows for flexible use in templates. You can just use the default
+        rendering:
+
+            {{ field_name }}
+
+        ...which will output the radio buttons in an unordered list.
+        Or, you can manually traverse each radio option for special layout:
+
+            {% for option in field_name.field_list %}
+                {{ option.field }} {{ option.label }}<br />
+            {% endfor %}
+        """
+        class RadioFieldRenderer:
+            def __init__(self, datalist, ul_class):
+                self.datalist, self.ul_class = datalist, ul_class
+            def __unicode__(self):
+                "Default unicode() output for this radio field -- a <ul>"
+                output = [u'<ul%s>' % (self.ul_class and u' class="%s"' % self.ul_class or u'')]
+                output.extend([u'<li>%s %s</li>' % (d['field'], d['label']) for d in self.datalist])
+                output.append(u'</ul>')
+                return mark_safe(u''.join(output))
+            def __iter__(self):
+                for d in self.datalist:
+                    yield d
+            def __len__(self):
+                return len(self.datalist)
+        datalist = []
+        str_data = smart_unicode(data) # normalize to string
+        for i, (value, display_name) in enumerate(self.choices):
+            selected_html = ''
+            if smart_unicode(value) == str_data:
+                selected_html = u' checked="checked"'
+            datalist.append({
+                'value': value,
+                'name': display_name,
+                'field': mark_safe(u'<input type="radio" id="%s" name="%s" value="%s"%s/>' % \
+                    (self.get_id() + u'_' + unicode(i), self.field_name, value, selected_html)),
+                'label': mark_safe(u'<label for="%s">%s</label>' % \
+                    (self.get_id() + u'_' + unicode(i), display_name),
+            )})
+        return RadioFieldRenderer(datalist, self.ul_class)
+
+    def isValidChoice(self, data, form):
+        str_data = smart_unicode(data)
+        str_choices = [smart_unicode(item[0]) for item in self.choices]
+        if str_data not in str_choices:
+            raise validators.ValidationError, ugettext("Select a valid choice; '%(data)s' is not in %(choices)s.") % {'data':str_data, 'choices':str_choices}
+
+class NullBooleanField(SelectField):
+    "This SelectField provides 'Yes', 'No' and 'Unknown', mapping results to True, False or None"
+    def __init__(self, field_name, is_required=False, validator_list=None):
+        if validator_list is None: validator_list = []
+        SelectField.__init__(self, field_name, choices=[('1', ugettext('Unknown')), ('2', ugettext('Yes')), ('3', ugettext('No'))],
+            is_required=is_required, validator_list=validator_list)
+
+    def render(self, data):
+        if data is None: data = '1'
+        elif data == True: data = '2'
+        elif data == False: data = '3'
+        return SelectField.render(self, data)
+
+    def html2python(data):
+        return {None: None, '1': None, '2': True, '3': False}[data]
+    html2python = staticmethod(html2python)
+
+class SelectMultipleField(SelectField):
+    requires_data_list = True
+    def render(self, data):
+        output = [u'<select id="%s" class="v%s%s" name="%s" size="%s" multiple="multiple">' % \
+            (self.get_id(), self.__class__.__name__, self.is_required and u' required' or u'',
+            self.field_name, self.size)]
+        str_data_list = map(smart_unicode, data) # normalize to strings
+        for value, choice in self.choices:
+            selected_html = u''
+            if smart_unicode(value) in str_data_list:
+                selected_html = u' selected="selected"'
+            output.append(u'    <option value="%s"%s>%s</option>' % (escape(value), selected_html, force_unicode(escape(choice))))
+        output.append(u'  </select>')
+        return mark_safe(u'\n'.join(output))
+
+    def isValidChoice(self, field_data, all_data):
+        # data is something like ['1', '2', '3']
+        str_choices = [smart_unicode(item[0]) for item in self.choices]
+        for val in map(smart_unicode, field_data):
+            if val not in str_choices:
+                raise validators.ValidationError, ugettext("Select a valid choice; '%(data)s' is not in %(choices)s.") % {'data':val, 'choices':str_choices}
+
+    def html2python(data):
+        if data is None:
+            raise EmptyValue
+        return data
+    html2python = staticmethod(html2python)
+
+class CheckboxSelectMultipleField(SelectMultipleField):
+    """
+    This has an identical interface to SelectMultipleField, except the rendered
+    widget is different. Instead of a <select multiple>, this widget outputs a
+    <ul> of <input type="checkbox">es.
+
+    Of course, that results in multiple form elements for the same "single"
+    field, so this class's prepare() method flattens the split data elements
+    back into the single list that validators, renderers and save() expect.
+    """
+    requires_data_list = True
+    def __init__(self, field_name, choices=None, ul_class='', validator_list=None):
+        if validator_list is None: validator_list = []
+        if choices is None: choices = []
+        self.ul_class = ul_class
+        SelectMultipleField.__init__(self, field_name, choices, size=1, is_required=False, validator_list=validator_list)
+
+    def prepare(self, new_data):
+        # new_data has "split" this field into several fields, so flatten it
+        # back into a single list.
+        data_list = []
+        for value, readable_value in self.choices:
+            if new_data.get('%s%s' % (self.field_name, value), '') == 'on':
+                data_list.append(value)
+        new_data.setlist(self.field_name, data_list)
+
+    def render(self, data):
+        output = [u'<ul%s>' % (self.ul_class and u' class="%s"' % self.ul_class or u'')]
+        str_data_list = map(smart_unicode, data) # normalize to strings
+        for value, choice in self.choices:
+            checked_html = u''
+            if smart_unicode(value) in str_data_list:
+                checked_html = u' checked="checked"'
+            field_name = u'%s%s' % (self.field_name, value)
+            output.append(u'<li><input type="checkbox" id="%s" class="v%s" name="%s"%s value="on" /> <label for="%s">%s</label></li>' % \
+                (self.get_id() + escape(value), self.__class__.__name__, field_name, checked_html,
+                self.get_id() + escape(value), choice))
+        output.append(u'</ul>')
+        return mark_safe(u'\n'.join(output))
+
+####################
+# FILE UPLOADS     #
+####################
+
+class FileUploadField(FormField):
+    def __init__(self, field_name, is_required=False, validator_list=None, max_length=None):
+        if validator_list is None: validator_list = []
+        self.field_name, self.is_required = field_name, is_required
+        self.validator_list = [self.isNonEmptyFile] + validator_list
+
+    def isNonEmptyFile(self, new_data, all_data):
+        if hasattr(new_data, 'upload_errors'):
+            upload_errors = new_data.upload_errors()
+            if upload_errors:
+                raise validators.CriticalValidationError, upload_errors
+        try:
+            file_size = new_data.size
+        except AttributeError:
+            file_size = len(new_data['content'])
+        if not file_size:
+            raise validators.CriticalValidationError, ugettext("The submitted file is empty.")
+
+    def render(self, data):
+        return mark_safe(u'<input type="file" id="%s" class="v%s" name="%s" />' % \
+            (self.get_id(), self.__class__.__name__, self.field_name))
+
+    def prepare(self, new_data):
+        if hasattr(new_data, 'upload_errors'):
+            upload_errors = new_data.upload_errors()
+            new_data[self.field_name] = { '_file_upload_error': upload_errors }
+
+    def html2python(data):
+        if data is None:
+            raise EmptyValue
+        return data
+    html2python = staticmethod(html2python)
+
+class ImageUploadField(FileUploadField):
+    "A FileUploadField that raises CriticalValidationError if the uploaded file isn't an image."
+    def __init__(self, *args, **kwargs):
+        FileUploadField.__init__(self, *args, **kwargs)
+        self.validator_list.insert(0, self.isValidImage)
+
+    def isValidImage(self, field_data, all_data):
+        try:
+            validators.isValidImage(field_data, all_data)
+        except validators.ValidationError, e:
+            raise validators.CriticalValidationError, e.messages
+
+####################
+# INTEGERS/FLOATS  #
+####################
+
+class IntegerField(TextField):
+    def __init__(self, field_name, length=10, max_length=None, is_required=False, validator_list=None, member_name=None):
+        if validator_list is None: validator_list = []
+        validator_list = [self.isInteger] + validator_list
+        if member_name is not None:
+            self.member_name = member_name
+        TextField.__init__(self, field_name, length, max_length, is_required, validator_list)
+
+    def isInteger(self, field_data, all_data):
+        try:
+            validators.isInteger(field_data, all_data)
+        except validators.ValidationError, e:
+            raise validators.CriticalValidationError, e.messages
+
+    def html2python(data):
+        if data == '' or data is None:
+            return None
+        return int(data)
+    html2python = staticmethod(html2python)
+
+class SmallIntegerField(IntegerField):
+    def __init__(self, field_name, length=5, max_length=5, is_required=False, validator_list=None):
+        if validator_list is None: validator_list = []
+        validator_list = [self.isSmallInteger] + validator_list
+        IntegerField.__init__(self, field_name, length, max_length, is_required, validator_list)
+
+    def isSmallInteger(self, field_data, all_data):
+        if not -32768 <= int(field_data) <= 32767:
+            raise validators.CriticalValidationError, ugettext("Enter a whole number between -32,768 and 32,767.")
+
+class PositiveIntegerField(IntegerField):
+    def __init__(self, field_name, length=10, max_length=None, is_required=False, validator_list=None):
+        if validator_list is None: validator_list = []
+        validator_list = [self.isPositive] + validator_list
+        IntegerField.__init__(self, field_name, length, max_length, is_required, validator_list)
+
+    def isPositive(self, field_data, all_data):
+        if int(field_data) < 0:
+            raise validators.CriticalValidationError, ugettext("Enter a positive number.")
+
+class PositiveSmallIntegerField(IntegerField):
+    def __init__(self, field_name, length=5, max_length=None, is_required=False, validator_list=None):
+        if validator_list is None: validator_list = []
+        validator_list = [self.isPositiveSmall] + validator_list
+        IntegerField.__init__(self, field_name, length, max_length, is_required, validator_list)
+
+    def isPositiveSmall(self, field_data, all_data):
+        if not 0 <= int(field_data) <= 32767:
+            raise validators.CriticalValidationError, ugettext("Enter a whole number between 0 and 32,767.")
+
+class FloatField(TextField):
+    def __init__(self, field_name, is_required=False, validator_list=None):
+        if validator_list is None: validator_list = []
+        validator_list = [validators.isValidFloat] + validator_list
+        TextField.__init__(self, field_name, is_required=is_required, validator_list=validator_list)
+
+    def html2python(data):
+        if data == '' or data is None:
+            return None
+        return float(data)
+    html2python = staticmethod(html2python)
+
+class DecimalField(TextField):
+    def __init__(self, field_name, max_digits, decimal_places, is_required=False, validator_list=None):
+        if validator_list is None: validator_list = []
+        self.max_digits, self.decimal_places = max_digits, decimal_places
+        validator_list = [self.isValidDecimal] + validator_list
+        # Initialise the TextField, making sure it's large enough to fit the number with a - sign and a decimal point.
+        super(DecimalField, self).__init__(field_name, max_digits+2, max_digits+2, is_required, validator_list)
+
+    def isValidDecimal(self, field_data, all_data):
+        v = validators.IsValidDecimal(self.max_digits, self.decimal_places)
+        try:
+            v(field_data, all_data)
+        except validators.ValidationError, e:
+            raise validators.CriticalValidationError, e.messages
+
+    def html2python(data):
+        if data == '' or data is None:
+            return None
+        try:
+            import decimal
+        except ImportError:
+            from django.utils import _decimal as decimal
+        try:
+            return decimal.Decimal(data)
+        except decimal.InvalidOperation, e:
+            raise ValueError, e
+    html2python = staticmethod(html2python)
+
+####################
+# DATES AND TIMES  #
+####################
+
+class DatetimeField(TextField):
+    """A FormField that automatically converts its data to a datetime.datetime object.
+    The data should be in the format YYYY-MM-DD HH:MM:SS."""
+    def __init__(self, field_name, length=30, max_length=None, is_required=False, validator_list=None):
+        if validator_list is None: validator_list = []
+        self.field_name = field_name
+        self.length, self.max_length = length, max_length
+        self.is_required = is_required
+        self.validator_list = [validators.isValidANSIDatetime] + validator_list
+
+    def html2python(data):
+        "Converts the field into a datetime.datetime object"
+        import datetime
+        try:
+            date, time = data.split()
+            y, m, d = date.split('-')
+            timebits = time.split(':')
+            h, mn = timebits[:2]
+            if len(timebits) > 2:
+                s = int(timebits[2])
+            else:
+                s = 0
+            return datetime.datetime(int(y), int(m), int(d), int(h), int(mn), s)
+        except ValueError:
+            return None
+    html2python = staticmethod(html2python)
+
+class DateField(TextField):
+    """A FormField that automatically converts its data to a datetime.date object.
+    The data should be in the format YYYY-MM-DD."""
+    def __init__(self, field_name, is_required=False, validator_list=None):
+        if validator_list is None: validator_list = []
+        validator_list = [self.isValidDate] + validator_list
+        TextField.__init__(self, field_name, length=10, max_length=10,
+            is_required=is_required, validator_list=validator_list)
+
+    def isValidDate(self, field_data, all_data):
+        try:
+            validators.isValidANSIDate(field_data, all_data)
+        except validators.ValidationError, e:
+            raise validators.CriticalValidationError, e.messages
+
+    def html2python(data):
+        "Converts the field into a datetime.date object"
+        import time, datetime
+        try:
+            time_tuple = time.strptime(data, '%Y-%m-%d')
+            return datetime.date(*time_tuple[0:3])
+        except (ValueError, TypeError):
+            return None
+    html2python = staticmethod(html2python)
+
+class TimeField(TextField):
+    """A FormField that automatically converts its data to a datetime.time object.
+    The data should be in the format HH:MM:SS or HH:MM:SS.mmmmmm."""
+    def __init__(self, field_name, is_required=False, validator_list=None):
+        if validator_list is None: validator_list = []
+        validator_list = [self.isValidTime] + validator_list
+        TextField.__init__(self, field_name, length=8, max_length=8,
+            is_required=is_required, validator_list=validator_list)
+
+    def isValidTime(self, field_data, all_data):
+        try:
+            validators.isValidANSITime(field_data, all_data)
+        except validators.ValidationError, e:
+            raise validators.CriticalValidationError, e.messages
+
+    def html2python(data):
+        "Converts the field into a datetime.time object"
+        import time, datetime
+        try:
+            part_list = data.split('.')
+            try:
+                time_tuple = time.strptime(part_list[0], '%H:%M:%S')
+            except ValueError: # seconds weren't provided
+                time_tuple = time.strptime(part_list[0], '%H:%M')
+            t = datetime.time(*time_tuple[3:6])
+            if (len(part_list) == 2):
+                t = t.replace(microsecond=int(part_list[1]))
+            return t
+        except (ValueError, TypeError, AttributeError):
+            return None
+    html2python = staticmethod(html2python)
+
+####################
+# INTERNET-RELATED #
+####################
+
+class EmailField(TextField):
+    "A convenience FormField for validating e-mail addresses"
+    def __init__(self, field_name, length=50, max_length=75, is_required=False, validator_list=None):
+        if validator_list is None: validator_list = []
+        validator_list = [self.isValidEmail] + validator_list
+        TextField.__init__(self, field_name, length, max_length=max_length,
+            is_required=is_required, validator_list=validator_list)
+
+    def isValidEmail(self, field_data, all_data):
+        try:
+            validators.isValidEmail(field_data, all_data)
+        except validators.ValidationError, e:
+            raise validators.CriticalValidationError, e.messages
+
+class URLField(TextField):
+    "A convenience FormField for validating URLs"
+    def __init__(self, field_name, length=50, max_length=200, is_required=False, validator_list=None):
+        if validator_list is None: validator_list = []
+        validator_list = [self.isValidURL] + validator_list
+        TextField.__init__(self, field_name, length=length, max_length=max_length,
+            is_required=is_required, validator_list=validator_list)
+
+    def isValidURL(self, field_data, all_data):
+        try:
+            validators.isValidURL(field_data, all_data)
+        except validators.ValidationError, e:
+            raise validators.CriticalValidationError, e.messages
+
+class IPAddressField(TextField):
+    def __init__(self, field_name, length=15, max_length=15, is_required=False, validator_list=None):
+        if validator_list is None: validator_list = []
+        validator_list = [self.isValidIPAddress] + validator_list
+        TextField.__init__(self, field_name, length=length, max_length=max_length,
+            is_required=is_required, validator_list=validator_list)
+
+    def isValidIPAddress(self, field_data, all_data):
+        try:
+            validators.isValidIPAddress4(field_data, all_data)
+        except validators.ValidationError, e:
+            raise validators.CriticalValidationError, e.messages
+
+    def html2python(data):
+        return data or None
+    html2python = staticmethod(html2python)
+
+####################
+# MISCELLANEOUS    #
+####################
+
+class FilePathField(SelectField):
+    "A SelectField whose choices are the files in a given directory."
+    def __init__(self, field_name, path, match=None, recursive=False, is_required=False, validator_list=None, max_length=None):
+        import os
+        from django.db.models import BLANK_CHOICE_DASH
+        if match is not None:
+            import re
+            match_re = re.compile(match)
+        choices = not is_required and BLANK_CHOICE_DASH[:] or []
+        if recursive:
+            for root, dirs, files in os.walk(path):
+                for f in files:
+                    if match is None or match_re.search(f):
+                        f = os.path.join(root, f)
+                        choices.append((f, f.replace(path, "", 1)))
+        else:
+            try:
+                for f in os.listdir(path):
+                    full_file = os.path.join(path, f)
+                    if os.path.isfile(full_file) and (match is None or match_re.search(f)):
+                        choices.append((full_file, f))
+            except OSError:
+                pass
+        SelectField.__init__(self, field_name, choices, 1, is_required, validator_list)
+
+class PhoneNumberField(TextField):
+    "A convenience FormField for validating phone numbers (e.g. '630-555-1234')"
+    def __init__(self, field_name, is_required=False, validator_list=None):
+        if validator_list is None: validator_list = []
+        validator_list = [self.isValidPhone] + validator_list
+        TextField.__init__(self, field_name, length=12, max_length=12,
+            is_required=is_required, validator_list=validator_list)
+
+    def isValidPhone(self, field_data, all_data):
+        try:
+            validators.isValidPhone(field_data, all_data)
+        except validators.ValidationError, e:
+            raise validators.CriticalValidationError, e.messages
+
+class USStateField(TextField):
+    "A convenience FormField for validating U.S. states (e.g. 'IL')"
+    def __init__(self, field_name, is_required=False, validator_list=None):
+        if validator_list is None: validator_list = []
+        validator_list = [self.isValidUSState] + validator_list
+        TextField.__init__(self, field_name, length=2, max_length=2,
+            is_required=is_required, validator_list=validator_list)
+
+    def isValidUSState(self, field_data, all_data):
+        try:
+            validators.isValidUSState(field_data, all_data)
+        except validators.ValidationError, e:
+            raise validators.CriticalValidationError, e.messages
+
+    def html2python(data):
+        if data:
+            return data.upper() # Should always be stored in upper case
+        return data
+    html2python = staticmethod(html2python)
+
+class CommaSeparatedIntegerField(TextField):
+    "A convenience FormField for validating comma-separated integer fields"
+    def __init__(self, field_name, max_length=None, is_required=False, validator_list=None):
+        if validator_list is None: validator_list = []
+        validator_list = [self.isCommaSeparatedIntegerList] + validator_list
+        TextField.__init__(self, field_name, length=20, max_length=max_length,
+            is_required=is_required, validator_list=validator_list)
+
+    def isCommaSeparatedIntegerList(self, field_data, all_data):
+        try:
+            validators.isCommaSeparatedIntegerList(field_data, all_data)
+        except validators.ValidationError, e:
+            raise validators.CriticalValidationError, e.messages
+
+    def render(self, data):
+        if data is None:
+            data = u''
+        elif isinstance(data, (list, tuple)):
+            data = u','.join(data)
+        return super(CommaSeparatedIntegerField, self).render(data)
+
+class RawIdAdminField(CommaSeparatedIntegerField):
+    def html2python(data):
+        if data:
+            return data.split(',')
+        else:
+            return []
+    html2python = staticmethod(html2python)
+
+class XMLLargeTextField(LargeTextField):
+    """
+    A LargeTextField with an XML validator. The schema_path argument is the
+    full path to a Relax NG compact schema to validate against.
+    """
+    def __init__(self, field_name, schema_path, **kwargs):
+        self.schema_path = schema_path
+        kwargs.setdefault('validator_list', []).insert(0, self.isValidXML)
+        LargeTextField.__init__(self, field_name, **kwargs)
+
+    def isValidXML(self, field_data, all_data):
+        v = validators.RelaxNGCompact(self.schema_path)
+        try:
+            v(field_data, all_data)
+        except validators.ValidationError, e:
+            raise validators.CriticalValidationError, e.messages
diff --git a/webapp/django/shortcuts/__init__.py b/webapp/django/shortcuts/__init__.py
new file mode 100644
index 0000000..1cece7c
--- /dev/null
+++ b/webapp/django/shortcuts/__init__.py
@@ -0,0 +1,62 @@
+"""
+This module collects helper functions and classes that "span" multiple levels
+of MVC. In other words, these functions/classes introduce controlled coupling
+for convenience's sake.
+"""
+
+from django.template import loader
+from django.http import HttpResponse, Http404
+from django.db.models.manager import Manager
+from django.db.models.query import QuerySet
+
+def render_to_response(*args, **kwargs):
+    """
+    Returns a HttpResponse whose content is filled with the result of calling
+    django.template.loader.render_to_string() with the passed arguments.
+    """
+    httpresponse_kwargs = {'mimetype': kwargs.pop('mimetype', None)}
+    return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs)
+
+def _get_queryset(klass):
+    """
+    Returns a QuerySet from a Model, Manager, or QuerySet. Created to make
+    get_object_or_404 and get_list_or_404 more DRY.
+    """
+    if isinstance(klass, QuerySet):
+        return klass
+    elif isinstance(klass, Manager):
+        manager = klass
+    else:
+        manager = klass._default_manager
+    return manager.all()
+
+def get_object_or_404(klass, *args, **kwargs):
+    """
+    Uses get() to return an object, or raises a Http404 exception if the object
+    does not exist.
+
+    klass may be a Model, Manager, or QuerySet object. All other passed
+    arguments and keyword arguments are used in the get() query.
+
+    Note: Like with get(), an MultipleObjectsReturned will be raised if more than one
+    object is found.
+    """
+    queryset = _get_queryset(klass)
+    try:
+        return queryset.get(*args, **kwargs)
+    except queryset.model.DoesNotExist:
+        raise Http404('No %s matches the given query.' % queryset.model._meta.object_name)
+
+def get_list_or_404(klass, *args, **kwargs):
+    """
+    Uses filter() to return a list of objects, or raise a Http404 exception if
+    the list is empty.
+
+    klass may be a Model, Manager, or QuerySet object. All other passed
+    arguments and keyword arguments are used in the filter() query.
+    """
+    queryset = _get_queryset(klass)
+    obj_list = list(queryset.filter(*args, **kwargs))
+    if not obj_list:
+        raise Http404('No %s matches the given query.' % queryset.model._meta.object_name)
+    return obj_list
diff --git a/webapp/django/template/__init__.py b/webapp/django/template/__init__.py
new file mode 100644
index 0000000..ffdb4e4
--- /dev/null
+++ b/webapp/django/template/__init__.py
@@ -0,0 +1,939 @@
+"""
+This is the Django template system.
+
+How it works:
+
+The Lexer.tokenize() function converts a template string (i.e., a string containing
+markup with custom template tags) to tokens, which can be either plain text
+(TOKEN_TEXT), variables (TOKEN_VAR) or block statements (TOKEN_BLOCK).
+
+The Parser() class takes a list of tokens in its constructor, and its parse()
+method returns a compiled template -- which is, under the hood, a list of
+Node objects.
+
+Each Node is responsible for creating some sort of output -- e.g. simple text
+(TextNode), variable values in a given context (VariableNode), results of basic
+logic (IfNode), results of looping (ForNode), or anything else. The core Node
+types are TextNode, VariableNode, IfNode and ForNode, but plugin modules can
+define their own custom node types.
+
+Each Node has a render() method, which takes a Context and returns a string of
+the rendered node. For example, the render() method of a Variable Node returns
+the variable's value as a string. The render() method of an IfNode returns the
+rendered output of whatever was inside the loop, recursively.
+
+The Template class is a convenient wrapper that takes care of template
+compilation and rendering.
+
+Usage:
+
+The only thing you should ever use directly in this file is the Template class.
+Create a compiled template object with a template_string, then call render()
+with a context. In the compilation stage, the TemplateSyntaxError exception
+will be raised if the template doesn't have proper syntax.
+
+Sample code:
+
+>>> from django import template
+>>> s = u'<html>{% if test %}<h1>{{ varvalue }}</h1>{% endif %}</html>'
+>>> t = template.Template(s)
+
+(t is now a compiled template, and its render() method can be called multiple
+times with multiple contexts)
+
+>>> c = template.Context({'test':True, 'varvalue': 'Hello'})
+>>> t.render(c)
+u'<html><h1>Hello</h1></html>'
+>>> c = template.Context({'test':False, 'varvalue': 'Hello'})
+>>> t.render(c)
+u'<html></html>'
+"""
+import re
+from inspect import getargspec
+from django.conf import settings
+from django.template.context import Context, RequestContext, ContextPopException
+from django.utils.itercompat import is_iterable
+from django.utils.functional import curry, Promise
+from django.utils.text import smart_split
+from django.utils.encoding import smart_unicode, force_unicode
+from django.utils.translation import ugettext as _
+from django.utils.safestring import SafeData, EscapeData, mark_safe, mark_for_escaping
+from django.utils.html import escape
+
+__all__ = ('Template', 'Context', 'RequestContext', 'compile_string')
+
+TOKEN_TEXT = 0
+TOKEN_VAR = 1
+TOKEN_BLOCK = 2
+TOKEN_COMMENT = 3
+
+# template syntax constants
+FILTER_SEPARATOR = '|'
+FILTER_ARGUMENT_SEPARATOR = ':'
+VARIABLE_ATTRIBUTE_SEPARATOR = '.'
+BLOCK_TAG_START = '{%'
+BLOCK_TAG_END = '%}'
+VARIABLE_TAG_START = '{{'
+VARIABLE_TAG_END = '}}'
+COMMENT_TAG_START = '{#'
+COMMENT_TAG_END = '#}'
+SINGLE_BRACE_START = '{'
+SINGLE_BRACE_END = '}'
+
+ALLOWED_VARIABLE_CHARS = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.'
+
+# what to report as the origin for templates that come from non-loader sources
+# (e.g. strings)
+UNKNOWN_SOURCE="&lt;unknown source&gt;"
+
+# match a variable or block tag and capture the entire tag, including start/end delimiters
+tag_re = re.compile('(%s.*?%s|%s.*?%s|%s.*?%s)' % (re.escape(BLOCK_TAG_START), re.escape(BLOCK_TAG_END),
+                                          re.escape(VARIABLE_TAG_START), re.escape(VARIABLE_TAG_END),
+                                          re.escape(COMMENT_TAG_START), re.escape(COMMENT_TAG_END)))
+
+# global dictionary of libraries that have been loaded using get_library
+libraries = {}
+# global list of libraries to load by default for a new parser
+builtins = []
+
+# True if TEMPLATE_STRING_IF_INVALID contains a format string (%s). None means
+# uninitialised.
+invalid_var_format_string = None
+
+class TemplateSyntaxError(Exception):
+    def __str__(self):
+        try:
+            import cStringIO as StringIO
+        except ImportError:
+            import StringIO
+        output = StringIO.StringIO()
+        output.write(Exception.__str__(self))
+        # Check if we wrapped an exception and print that too.
+        if hasattr(self, 'exc_info'):
+            import traceback
+            output.write('\n\nOriginal ')
+            e = self.exc_info
+            traceback.print_exception(e[0], e[1], e[2], 500, output)
+        return output.getvalue()
+
+class TemplateDoesNotExist(Exception):
+    pass
+
+class TemplateEncodingError(Exception):
+    pass
+
+class VariableDoesNotExist(Exception):
+
+    def __init__(self, msg, params=()):
+        self.msg = msg
+        self.params = params
+
+    def __str__(self):
+        return unicode(self).encode('utf-8')
+
+    def __unicode__(self):
+        return self.msg % tuple([force_unicode(p, errors='replace') for p in self.params])
+
+class InvalidTemplateLibrary(Exception):
+    pass
+
+class Origin(object):
+    def __init__(self, name):
+        self.name = name
+
+    def reload(self):
+        raise NotImplementedError
+
+    def __str__(self):
+        return self.name
+
+class StringOrigin(Origin):
+    def __init__(self, source):
+        super(StringOrigin, self).__init__(UNKNOWN_SOURCE)
+        self.source = source
+
+    def reload(self):
+        return self.source
+
+class Template(object):
+    def __init__(self, template_string, origin=None, name='<Unknown Template>'):
+        try:
+            template_string = smart_unicode(template_string)
+        except UnicodeDecodeError:
+            raise TemplateEncodingError("Templates can only be constructed from unicode or UTF-8 strings.")
+        if settings.TEMPLATE_DEBUG and origin is None:
+            origin = StringOrigin(template_string)
+        self.nodelist = compile_string(template_string, origin)
+        self.name = name
+
+    def __iter__(self):
+        for node in self.nodelist:
+            for subnode in node:
+                yield subnode
+
+    def render(self, context):
+        "Display stage -- can be called many times"
+        return self.nodelist.render(context)
+
+def compile_string(template_string, origin):
+    "Compiles template_string into NodeList ready for rendering"
+    if settings.TEMPLATE_DEBUG:
+        from debug import DebugLexer, DebugParser
+        lexer_class, parser_class = DebugLexer, DebugParser
+    else:
+        lexer_class, parser_class = Lexer, Parser
+    lexer = lexer_class(template_string, origin)
+    parser = parser_class(lexer.tokenize())
+    return parser.parse()
+
+class Token(object):
+    def __init__(self, token_type, contents):
+        # token_type must be TOKEN_TEXT, TOKEN_VAR, TOKEN_BLOCK or TOKEN_COMMENT.
+        self.token_type, self.contents = token_type, contents
+
+    def __str__(self):
+        return '<%s token: "%s...">' % \
+            ({TOKEN_TEXT: 'Text', TOKEN_VAR: 'Var', TOKEN_BLOCK: 'Block', TOKEN_COMMENT: 'Comment'}[self.token_type],
+            self.contents[:20].replace('\n', ''))
+
+    def split_contents(self):
+        return list(smart_split(self.contents))
+
+class Lexer(object):
+    def __init__(self, template_string, origin):
+        self.template_string = template_string
+        self.origin = origin
+
+    def tokenize(self):
+        "Return a list of tokens from a given template_string."
+        in_tag = False
+        result = []
+        for bit in tag_re.split(self.template_string):
+            if bit:
+                result.append(self.create_token(bit, in_tag))
+            in_tag = not in_tag
+        return result
+
+    def create_token(self, token_string, in_tag):
+        """
+        Convert the given token string into a new Token object and return it.
+        If in_tag is True, we are processing something that matched a tag,
+        otherwise it should be treated as a literal string.
+        """
+        if in_tag:
+            if token_string.startswith(VARIABLE_TAG_START):
+                token = Token(TOKEN_VAR, token_string[len(VARIABLE_TAG_START):-len(VARIABLE_TAG_END)].strip())
+            elif token_string.startswith(BLOCK_TAG_START):
+                token = Token(TOKEN_BLOCK, token_string[len(BLOCK_TAG_START):-len(BLOCK_TAG_END)].strip())
+            elif token_string.startswith(COMMENT_TAG_START):
+                token = Token(TOKEN_COMMENT, '')
+        else:
+            token = Token(TOKEN_TEXT, token_string)
+        return token
+
+class Parser(object):
+    def __init__(self, tokens):
+        self.tokens = tokens
+        self.tags = {}
+        self.filters = {}
+        for lib in builtins:
+            self.add_library(lib)
+
+    def parse(self, parse_until=None):
+        if parse_until is None: parse_until = []
+        nodelist = self.create_nodelist()
+        while self.tokens:
+            token = self.next_token()
+            if token.token_type == TOKEN_TEXT:
+                self.extend_nodelist(nodelist, TextNode(token.contents), token)
+            elif token.token_type == TOKEN_VAR:
+                if not token.contents:
+                    self.empty_variable(token)
+                filter_expression = self.compile_filter(token.contents)
+                var_node = self.create_variable_node(filter_expression)
+                self.extend_nodelist(nodelist, var_node,token)
+            elif token.token_type == TOKEN_BLOCK:
+                if token.contents in parse_until:
+                    # put token back on token list so calling code knows why it terminated
+                    self.prepend_token(token)
+                    return nodelist
+                try:
+                    command = token.contents.split()[0]
+                except IndexError:
+                    self.empty_block_tag(token)
+                # execute callback function for this tag and append resulting node
+                self.enter_command(command, token)
+                try:
+                    compile_func = self.tags[command]
+                except KeyError:
+                    self.invalid_block_tag(token, command)
+                try:
+                    compiled_result = compile_func(self, token)
+                except TemplateSyntaxError, e:
+                    if not self.compile_function_error(token, e):
+                        raise
+                self.extend_nodelist(nodelist, compiled_result, token)
+                self.exit_command()
+        if parse_until:
+            self.unclosed_block_tag(parse_until)
+        return nodelist
+
+    def skip_past(self, endtag):
+        while self.tokens:
+            token = self.next_token()
+            if token.token_type == TOKEN_BLOCK and token.contents == endtag:
+                return
+        self.unclosed_block_tag([endtag])
+
+    def create_variable_node(self, filter_expression):
+        return VariableNode(filter_expression)
+
+    def create_nodelist(self):
+        return NodeList()
+
+    def extend_nodelist(self, nodelist, node, token):
+        if node.must_be_first and nodelist:
+            try:
+                if nodelist.contains_nontext:
+                    raise AttributeError
+            except AttributeError:
+                raise TemplateSyntaxError("%r must be the first tag in the template." % node)
+        if isinstance(nodelist, NodeList) and not isinstance(node, TextNode):
+            nodelist.contains_nontext = True
+        nodelist.append(node)
+
+    def enter_command(self, command, token):
+        pass
+
+    def exit_command(self):
+        pass
+
+    def error(self, token, msg):
+        return TemplateSyntaxError(msg)
+
+    def empty_variable(self, token):
+        raise self.error(token, "Empty variable tag")
+
+    def empty_block_tag(self, token):
+        raise self.error(token, "Empty block tag")
+
+    def invalid_block_tag(self, token, command):
+        raise self.error(token, "Invalid block tag: '%s'" % command)
+
+    def unclosed_block_tag(self, parse_until):
+        raise self.error(None, "Unclosed tags: %s " %  ', '.join(parse_until))
+
+    def compile_function_error(self, token, e):
+        pass
+
+    def next_token(self):
+        return self.tokens.pop(0)
+
+    def prepend_token(self, token):
+        self.tokens.insert(0, token)
+
+    def delete_first_token(self):
+        del self.tokens[0]
+
+    def add_library(self, lib):
+        self.tags.update(lib.tags)
+        self.filters.update(lib.filters)
+
+    def compile_filter(self, token):
+        "Convenient wrapper for FilterExpression"
+        return FilterExpression(token, self)
+
+    def find_filter(self, filter_name):
+        if filter_name in self.filters:
+            return self.filters[filter_name]
+        else:
+            raise TemplateSyntaxError("Invalid filter: '%s'" % filter_name)
+
+class TokenParser(object):
+    """
+    Subclass this and implement the top() method to parse a template line. When
+    instantiating the parser, pass in the line from the Django template parser.
+
+    The parser's "tagname" instance-variable stores the name of the tag that
+    the filter was called with.
+    """
+    def __init__(self, subject):
+        self.subject = subject
+        self.pointer = 0
+        self.backout = []
+        self.tagname = self.tag()
+
+    def top(self):
+        "Overload this method to do the actual parsing and return the result."
+        raise NotImplementedError()
+
+    def more(self):
+        "Returns True if there is more stuff in the tag."
+        return self.pointer < len(self.subject)
+
+    def back(self):
+        "Undoes the last microparser. Use this for lookahead and backtracking."
+        if not len(self.backout):
+            raise TemplateSyntaxError("back called without some previous parsing")
+        self.pointer = self.backout.pop()
+
+    def tag(self):
+        "A microparser that just returns the next tag from the line."
+        subject = self.subject
+        i = self.pointer
+        if i >= len(subject):
+            raise TemplateSyntaxError("expected another tag, found end of string: %s" % subject)
+        p = i
+        while i < len(subject) and subject[i] not in (' ', '\t'):
+            i += 1
+        s = subject[p:i]
+        while i < len(subject) and subject[i] in (' ', '\t'):
+            i += 1
+        self.backout.append(self.pointer)
+        self.pointer = i
+        return s
+
+    def value(self):
+        "A microparser that parses for a value: some string constant or variable name."
+        subject = self.subject
+        i = self.pointer
+        if i >= len(subject):
+            raise TemplateSyntaxError("Searching for value. Expected another value but found end of string: %s" % subject)
+        if subject[i] in ('"', "'"):
+            p = i
+            i += 1
+            while i < len(subject) and subject[i] != subject[p]:
+                i += 1
+            if i >= len(subject):
+                raise TemplateSyntaxError("Searching for value. Unexpected end of string in column %d: %s" % (i, subject))
+            i += 1
+            res = subject[p:i]
+            while i < len(subject) and subject[i] in (' ', '\t'):
+                i += 1
+            self.backout.append(self.pointer)
+            self.pointer = i
+            return res
+        else:
+            p = i
+            while i < len(subject) and subject[i] not in (' ', '\t'):
+                if subject[i] in ('"', "'"):
+                    c = subject[i]
+                    i += 1
+                    while i < len(subject) and subject[i] != c:
+                        i += 1
+                    if i >= len(subject):
+                        raise TemplateSyntaxError("Searching for value. Unexpected end of string in column %d: %s" % (i, subject))
+                i += 1
+            s = subject[p:i]
+            while i < len(subject) and subject[i] in (' ', '\t'):
+                i += 1
+            self.backout.append(self.pointer)
+            self.pointer = i
+            return s
+
+filter_raw_string = r"""
+^%(i18n_open)s"(?P<i18n_constant>%(str)s)"%(i18n_close)s|
+^"(?P<constant>%(str)s)"|
+^(?P<var>[%(var_chars)s]+)|
+ (?:%(filter_sep)s
+     (?P<filter_name>\w+)
+         (?:%(arg_sep)s
+             (?:
+              %(i18n_open)s"(?P<i18n_arg>%(str)s)"%(i18n_close)s|
+              "(?P<constant_arg>%(str)s)"|
+              (?P<var_arg>[%(var_chars)s]+)
+             )
+         )?
+ )""" % {
+    'str': r"""[^"\\]*(?:\\.[^"\\]*)*""",
+    'var_chars': "\w\." ,
+    'filter_sep': re.escape(FILTER_SEPARATOR),
+    'arg_sep': re.escape(FILTER_ARGUMENT_SEPARATOR),
+    'i18n_open' : re.escape("_("),
+    'i18n_close' : re.escape(")"),
+  }
+
+filter_raw_string = filter_raw_string.replace("\n", "").replace(" ", "")
+filter_re = re.compile(filter_raw_string, re.UNICODE)
+
+class FilterExpression(object):
+    """
+    Parses a variable token and its optional filters (all as a single string),
+    and return a list of tuples of the filter name and arguments.
+    Sample:
+        >>> token = 'variable|default:"Default value"|date:"Y-m-d"'
+        >>> p = Parser('')
+        >>> fe = FilterExpression(token, p)
+        >>> len(fe.filters)
+        2
+        >>> fe.var
+        <Variable: 'variable'>
+
+    This class should never be instantiated outside of the
+    get_filters_from_token helper function.
+    """
+    def __init__(self, token, parser):
+        self.token = token
+        matches = filter_re.finditer(token)
+        var = None
+        filters = []
+        upto = 0
+        for match in matches:
+            start = match.start()
+            if upto != start:
+                raise TemplateSyntaxError("Could not parse some characters: %s|%s|%s"  % \
+                                           (token[:upto], token[upto:start], token[start:]))
+            if var == None:
+                var, constant, i18n_constant = match.group("var", "constant", "i18n_constant")
+                if i18n_constant is not None:
+                    # Don't pass the empty string to gettext, because the empty
+                    # string translates to meta information.
+                    if i18n_constant == "":
+                        var = '""'
+                    else:
+                        var = '"%s"' %  _(i18n_constant.replace(r'\"', '"'))
+                elif constant is not None:
+                    var = '"%s"' % constant.replace(r'\"', '"')
+                upto = match.end()
+                if var == None:
+                    raise TemplateSyntaxError("Could not find variable at start of %s" % token)
+                elif var.find(VARIABLE_ATTRIBUTE_SEPARATOR + '_') > -1 or var[0] == '_':
+                    raise TemplateSyntaxError("Variables and attributes may not begin with underscores: '%s'" % var)
+            else:
+                filter_name = match.group("filter_name")
+                args = []
+                constant_arg, i18n_arg, var_arg = match.group("constant_arg", "i18n_arg", "var_arg")
+                if i18n_arg:
+                    args.append((False, _(i18n_arg.replace(r'\"', '"'))))
+                elif constant_arg is not None:
+                    args.append((False, constant_arg.replace(r'\"', '"')))
+                elif var_arg:
+                    args.append((True, Variable(var_arg)))
+                filter_func = parser.find_filter(filter_name)
+                self.args_check(filter_name,filter_func, args)
+                filters.append( (filter_func,args))
+                upto = match.end()
+        if upto != len(token):
+            raise TemplateSyntaxError("Could not parse the remainder: '%s' from '%s'" % (token[upto:], token))
+        self.filters = filters
+        self.var = Variable(var)
+
+    def resolve(self, context, ignore_failures=False):
+        try:
+            obj = self.var.resolve(context)
+        except VariableDoesNotExist:
+            if ignore_failures:
+                obj = None
+            else:
+                if settings.TEMPLATE_STRING_IF_INVALID:
+                    global invalid_var_format_string
+                    if invalid_var_format_string is None:
+                        invalid_var_format_string = '%s' in settings.TEMPLATE_STRING_IF_INVALID
+                    if invalid_var_format_string:
+                        return settings.TEMPLATE_STRING_IF_INVALID % self.var
+                    return settings.TEMPLATE_STRING_IF_INVALID
+                else:
+                    obj = settings.TEMPLATE_STRING_IF_INVALID
+        for func, args in self.filters:
+            arg_vals = []
+            for lookup, arg in args:
+                if not lookup:
+                    arg_vals.append(mark_safe(arg))
+                else:
+                    arg_vals.append(arg.resolve(context))
+            if getattr(func, 'needs_autoescape', False):
+                new_obj = func(obj, autoescape=context.autoescape, *arg_vals)
+            else:
+                new_obj = func(obj, *arg_vals)
+            if getattr(func, 'is_safe', False) and isinstance(obj, SafeData):
+                obj = mark_safe(new_obj)
+            elif isinstance(obj, EscapeData):
+                obj = mark_for_escaping(new_obj)
+            else:
+                obj = new_obj
+        return obj
+
+    def args_check(name, func, provided):
+        provided = list(provided)
+        plen = len(provided)
+        # Check to see if a decorator is providing the real function.
+        func = getattr(func, '_decorated_function', func)
+        args, varargs, varkw, defaults = getargspec(func)
+        # First argument is filter input.
+        args.pop(0)
+        if defaults:
+            nondefs = args[:-len(defaults)]
+        else:
+            nondefs = args
+        # Args without defaults must be provided.
+        try:
+            for arg in nondefs:
+                provided.pop(0)
+        except IndexError:
+            # Not enough
+            raise TemplateSyntaxError("%s requires %d arguments, %d provided" % (name, len(nondefs), plen))
+
+        # Defaults can be overridden.
+        defaults = defaults and list(defaults) or []
+        try:
+            for parg in provided:
+                defaults.pop(0)
+        except IndexError:
+            # Too many.
+            raise TemplateSyntaxError("%s requires %d arguments, %d provided" % (name, len(nondefs), plen))
+
+        return True
+    args_check = staticmethod(args_check)
+
+    def __str__(self):
+        return self.token
+
+def resolve_variable(path, context):
+    """
+    Returns the resolved variable, which may contain attribute syntax, within
+    the given context.
+
+    Deprecated; use the Variable class instead.
+    """
+    return Variable(path).resolve(context)
+
+class Variable(object):
+    """
+    A template variable, resolvable against a given context. The variable may be
+    a hard-coded string (if it begins and ends with single or double quote
+    marks)::
+
+        >>> c = {'article': {'section':u'News'}}
+        >>> Variable('article.section').resolve(c)
+        u'News'
+        >>> Variable('article').resolve(c)
+        {'section': u'News'}
+        >>> class AClass: pass
+        >>> c = AClass()
+        >>> c.article = AClass()
+        >>> c.article.section = u'News'
+        >>> Variable('article.section').resolve(c)
+        u'News'
+
+    (The example assumes VARIABLE_ATTRIBUTE_SEPARATOR is '.')
+    """
+
+    def __init__(self, var):
+        self.var = var
+        self.literal = None
+        self.lookups = None
+        self.translate = False
+
+        try:
+            # First try to treat this variable as a number.
+            #
+            # Note that this could cause an OverflowError here that we're not
+            # catching. Since this should only happen at compile time, that's
+            # probably OK.
+            self.literal = float(var)
+
+            # So it's a float... is it an int? If the original value contained a
+            # dot or an "e" then it was a float, not an int.
+            if '.' not in var and 'e' not in var.lower():
+                self.literal = int(self.literal)
+
+            # "2." is invalid
+            if var.endswith('.'):
+                raise ValueError
+
+        except ValueError:
+            # A ValueError means that the variable isn't a number.
+            if var.startswith('_(') and var.endswith(')'):
+                # The result of the lookup should be translated at rendering
+                # time.
+                self.translate = True
+                var = var[2:-1]
+            # If it's wrapped with quotes (single or double), then
+            # we're also dealing with a literal.
+            if var[0] in "\"'" and var[0] == var[-1]:
+                self.literal = mark_safe(var[1:-1])
+            else:
+                # Otherwise we'll set self.lookups so that resolve() knows we're
+                # dealing with a bonafide variable
+                self.lookups = tuple(var.split(VARIABLE_ATTRIBUTE_SEPARATOR))
+
+    def resolve(self, context):
+        """Resolve this variable against a given context."""
+        if self.lookups is not None:
+            # We're dealing with a variable that needs to be resolved
+            value = self._resolve_lookup(context)
+        else:
+            # We're dealing with a literal, so it's already been "resolved"
+            value = self.literal
+        if self.translate:
+            return _(value)
+        return value
+
+    def __repr__(self):
+        return "<%s: %r>" % (self.__class__.__name__, self.var)
+
+    def __str__(self):
+        return self.var
+
+    def _resolve_lookup(self, context):
+        """
+        Performs resolution of a real variable (i.e. not a literal) against the
+        given context.
+
+        As indicated by the method's name, this method is an implementation
+        detail and shouldn't be called by external code. Use Variable.resolve()
+        instead.
+        """
+        current = context
+        for bit in self.lookups:
+            try: # dictionary lookup
+                current = current[bit]
+            except (TypeError, AttributeError, KeyError):
+                try: # attribute lookup
+                    current = getattr(current, bit)
+                    if callable(current):
+                        if getattr(current, 'alters_data', False):
+                            current = settings.TEMPLATE_STRING_IF_INVALID
+                        else:
+                            try: # method call (assuming no args required)
+                                current = current()
+                            except TypeError: # arguments *were* required
+                                # GOTCHA: This will also catch any TypeError
+                                # raised in the function itself.
+                                current = settings.TEMPLATE_STRING_IF_INVALID # invalid method call
+                            except Exception, e:
+                                if getattr(e, 'silent_variable_failure', False):
+                                    current = settings.TEMPLATE_STRING_IF_INVALID
+                                else:
+                                    raise
+                except (TypeError, AttributeError):
+                    try: # list-index lookup
+                        current = current[int(bit)]
+                    except (IndexError, # list index out of range
+                            ValueError, # invalid literal for int()
+                            KeyError,   # current is a dict without `int(bit)` key
+                            TypeError,  # unsubscriptable object
+                            ):
+                        raise VariableDoesNotExist("Failed lookup for key [%s] in %r", (bit, current)) # missing attribute
+                except Exception, e:
+                    if getattr(e, 'silent_variable_failure', False):
+                        current = settings.TEMPLATE_STRING_IF_INVALID
+                    else:
+                        raise
+
+        return current
+
+class Node(object):
+    # Set this to True for nodes that must be first in the template (although
+    # they can be preceded by text nodes.
+    must_be_first = False
+
+    def render(self, context):
+        "Return the node rendered as a string"
+        pass
+
+    def __iter__(self):
+        yield self
+
+    def get_nodes_by_type(self, nodetype):
+        "Return a list of all nodes (within this node and its nodelist) of the given type"
+        nodes = []
+        if isinstance(self, nodetype):
+            nodes.append(self)
+        if hasattr(self, 'nodelist'):
+            nodes.extend(self.nodelist.get_nodes_by_type(nodetype))
+        return nodes
+
+class NodeList(list):
+    # Set to True the first time a non-TextNode is inserted by
+    # extend_nodelist().
+    contains_nontext = False
+
+    def render(self, context):
+        bits = []
+        for node in self:
+            if isinstance(node, Node):
+                bits.append(self.render_node(node, context))
+            else:
+                bits.append(node)
+        return mark_safe(''.join([force_unicode(b) for b in bits]))
+
+    def get_nodes_by_type(self, nodetype):
+        "Return a list of all nodes of the given type"
+        nodes = []
+        for node in self:
+            nodes.extend(node.get_nodes_by_type(nodetype))
+        return nodes
+
+    def render_node(self, node, context):
+        return node.render(context)
+
+class TextNode(Node):
+    def __init__(self, s):
+        self.s = s
+
+    def __repr__(self):
+        return "<Text Node: '%s'>" % self.s[:25]
+
+    def render(self, context):
+        return self.s
+
+class VariableNode(Node):
+    def __init__(self, filter_expression):
+        self.filter_expression = filter_expression
+
+    def __repr__(self):
+        return "<Variable Node: %s>" % self.filter_expression
+
+    def render(self, context):
+        try:
+            output = force_unicode(self.filter_expression.resolve(context))
+        except UnicodeDecodeError:
+            # Unicode conversion can fail sometimes for reasons out of our
+            # control (e.g. exception rendering). In that case, we fail quietly.
+            return ''
+        if (context.autoescape and not isinstance(output, SafeData)) or isinstance(output, EscapeData):
+            return force_unicode(escape(output))
+        else:
+            return force_unicode(output)
+
+def generic_tag_compiler(params, defaults, name, node_class, parser, token):
+    "Returns a template.Node subclass."
+    bits = token.split_contents()[1:]
+    bmax = len(params)
+    def_len = defaults and len(defaults) or 0
+    bmin = bmax - def_len
+    if(len(bits) < bmin or len(bits) > bmax):
+        if bmin == bmax:
+            message = "%s takes %s arguments" % (name, bmin)
+        else:
+            message = "%s takes between %s and %s arguments" % (name, bmin, bmax)
+        raise TemplateSyntaxError(message)
+    return node_class(bits)
+
+class Library(object):
+    def __init__(self):
+        self.filters = {}
+        self.tags = {}
+
+    def tag(self, name=None, compile_function=None):
+        if name == None and compile_function == None:
+            # @register.tag()
+            return self.tag_function
+        elif name != None and compile_function == None:
+            if(callable(name)):
+                # @register.tag
+                return self.tag_function(name)
+            else:
+                # @register.tag('somename') or @register.tag(name='somename')
+                def dec(func):
+                    return self.tag(name, func)
+                return dec
+        elif name != None and compile_function != None:
+            # register.tag('somename', somefunc)
+            self.tags[name] = compile_function
+            return compile_function
+        else:
+            raise InvalidTemplateLibrary("Unsupported arguments to Library.tag: (%r, %r)", (name, compile_function))
+
+    def tag_function(self,func):
+        self.tags[getattr(func, "_decorated_function", func).__name__] = func
+        return func
+
+    def filter(self, name=None, filter_func=None):
+        if name == None and filter_func == None:
+            # @register.filter()
+            return self.filter_function
+        elif filter_func == None:
+            if(callable(name)):
+                # @register.filter
+                return self.filter_function(name)
+            else:
+                # @register.filter('somename') or @register.filter(name='somename')
+                def dec(func):
+                    return self.filter(name, func)
+                return dec
+        elif name != None and filter_func != None:
+            # register.filter('somename', somefunc)
+            self.filters[name] = filter_func
+            return filter_func
+        else:
+            raise InvalidTemplateLibrary("Unsupported arguments to Library.filter: (%r, %r)", (name, filter_func))
+
+    def filter_function(self, func):
+        self.filters[getattr(func, "_decorated_function", func).__name__] = func
+        return func
+
+    def simple_tag(self,func):
+        params, xx, xxx, defaults = getargspec(func)
+
+        class SimpleNode(Node):
+            def __init__(self, vars_to_resolve):
+                self.vars_to_resolve = map(Variable, vars_to_resolve)
+
+            def render(self, context):
+                resolved_vars = [var.resolve(context) for var in self.vars_to_resolve]
+                return func(*resolved_vars)
+
+        compile_func = curry(generic_tag_compiler, params, defaults, getattr(func, "_decorated_function", func).__name__, SimpleNode)
+        compile_func.__doc__ = func.__doc__
+        self.tag(getattr(func, "_decorated_function", func).__name__, compile_func)
+        return func
+
+    def inclusion_tag(self, file_name, context_class=Context, takes_context=False):
+        def dec(func):
+            params, xx, xxx, defaults = getargspec(func)
+            if takes_context:
+                if params[0] == 'context':
+                    params = params[1:]
+                else:
+                    raise TemplateSyntaxError("Any tag function decorated with takes_context=True must have a first argument of 'context'")
+
+            class InclusionNode(Node):
+                def __init__(self, vars_to_resolve):
+                    self.vars_to_resolve = map(Variable, vars_to_resolve)
+
+                def render(self, context):
+                    resolved_vars = [var.resolve(context) for var in self.vars_to_resolve]
+                    if takes_context:
+                        args = [context] + resolved_vars
+                    else:
+                        args = resolved_vars
+
+                    dict = func(*args)
+
+                    if not getattr(self, 'nodelist', False):
+                        from django.template.loader import get_template, select_template
+                        if not isinstance(file_name, basestring) and is_iterable(file_name):
+                            t = select_template(file_name)
+                        else:
+                            t = get_template(file_name)
+                        self.nodelist = t.nodelist
+                    return self.nodelist.render(context_class(dict,
+                            autoescape=context.autoescape))
+
+            compile_func = curry(generic_tag_compiler, params, defaults, getattr(func, "_decorated_function", func).__name__, InclusionNode)
+            compile_func.__doc__ = func.__doc__
+            self.tag(getattr(func, "_decorated_function", func).__name__, compile_func)
+            return func
+        return dec
+
+def get_library(module_name):
+    lib = libraries.get(module_name, None)
+    if not lib:
+        try:
+            mod = __import__(module_name, {}, {}, [''])
+        except ImportError, e:
+            raise InvalidTemplateLibrary("Could not load template library from %s, %s" % (module_name, e))
+        try:
+            lib = mod.register
+            libraries[module_name] = lib
+        except AttributeError:
+            raise InvalidTemplateLibrary("Template library %s does not have a variable named 'register'" % module_name)
+    return lib
+
+def add_to_builtins(module_name):
+    builtins.append(get_library(module_name))
+
+add_to_builtins('django.template.defaulttags')
+add_to_builtins('django.template.defaultfilters')
diff --git a/webapp/django/template/context.py b/webapp/django/template/context.py
new file mode 100644
index 0000000..8f16a95
--- /dev/null
+++ b/webapp/django/template/context.py
@@ -0,0 +1,105 @@
+from django.conf import settings
+from django.core.exceptions import ImproperlyConfigured
+
+_standard_context_processors = None
+
+class ContextPopException(Exception):
+    "pop() has been called more times than push()"
+    pass
+
+class Context(object):
+    "A stack container for variable context"
+    def __init__(self, dict_=None, autoescape=True):
+        dict_ = dict_ or {}
+        self.dicts = [dict_]
+        self.autoescape = autoescape
+
+    def __repr__(self):
+        return repr(self.dicts)
+
+    def __iter__(self):
+        for d in self.dicts:
+            yield d
+
+    def push(self):
+        d = {}
+        self.dicts = [d] + self.dicts
+        return d
+
+    def pop(self):
+        if len(self.dicts) == 1:
+            raise ContextPopException
+        return self.dicts.pop(0)
+
+    def __setitem__(self, key, value):
+        "Set a variable in the current context"
+        self.dicts[0][key] = value
+
+    def __getitem__(self, key):
+        "Get a variable's value, starting at the current context and going upward"
+        for d in self.dicts:
+            if key in d:
+                return d[key]
+        raise KeyError(key)
+
+    def __delitem__(self, key):
+        "Delete a variable from the current context"
+        del self.dicts[0][key]
+
+    def has_key(self, key):
+        for d in self.dicts:
+            if key in d:
+                return True
+        return False
+
+    __contains__ = has_key
+
+    def get(self, key, otherwise=None):
+        for d in self.dicts:
+            if key in d:
+                return d[key]
+        return otherwise
+
+    def update(self, other_dict):
+        "Like dict.update(). Pushes an entire dictionary's keys and values onto the context."
+        if not hasattr(other_dict, '__getitem__'): 
+            raise TypeError('other_dict must be a mapping (dictionary-like) object.')
+        self.dicts = [other_dict] + self.dicts
+        return other_dict
+
+# This is a function rather than module-level procedural code because we only
+# want it to execute if somebody uses RequestContext.
+def get_standard_processors():
+    global _standard_context_processors
+    if _standard_context_processors is None:
+        processors = []
+        for path in settings.TEMPLATE_CONTEXT_PROCESSORS:
+            i = path.rfind('.')
+            module, attr = path[:i], path[i+1:]
+            try:
+                mod = __import__(module, {}, {}, [attr])
+            except ImportError, e:
+                raise ImproperlyConfigured('Error importing request processor module %s: "%s"' % (module, e))
+            try:
+                func = getattr(mod, attr)
+            except AttributeError:
+                raise ImproperlyConfigured('Module "%s" does not define a "%s" callable request processor' % (module, attr))
+            processors.append(func)
+        _standard_context_processors = tuple(processors)
+    return _standard_context_processors
+
+class RequestContext(Context):
+    """
+    This subclass of template.Context automatically populates itself using
+    the processors defined in TEMPLATE_CONTEXT_PROCESSORS.
+    Additional processors can be specified as a list of callables
+    using the "processors" keyword argument.
+    """
+    def __init__(self, request, dict=None, processors=None):
+        Context.__init__(self, dict)
+        if processors is None:
+            processors = ()
+        else:
+            processors = tuple(processors)
+        for processor in get_standard_processors() + processors:
+            self.update(processor(request))
diff --git a/webapp/django/template/debug.py b/webapp/django/template/debug.py
new file mode 100644
index 0000000..c58c854
--- /dev/null
+++ b/webapp/django/template/debug.py
@@ -0,0 +1,97 @@
+from django.template import Lexer, Parser, tag_re, NodeList, VariableNode, TemplateSyntaxError
+from django.utils.encoding import force_unicode
+from django.utils.html import escape
+from django.utils.safestring import SafeData, EscapeData
+
+class DebugLexer(Lexer):
+    def __init__(self, template_string, origin):
+        super(DebugLexer, self).__init__(template_string, origin)
+
+    def tokenize(self):
+        "Return a list of tokens from a given template_string"
+        result, upto = [], 0
+        for match in tag_re.finditer(self.template_string):
+            start, end = match.span()
+            if start > upto:
+                result.append(self.create_token(self.template_string[upto:start], (upto, start), False))
+                upto = start
+            result.append(self.create_token(self.template_string[start:end], (start, end), True))
+            upto = end
+        last_bit = self.template_string[upto:]
+        if last_bit:
+            result.append(self.create_token(last_bit, (upto, upto + len(last_bit)), False))
+        return result
+
+    def create_token(self, token_string, source, in_tag):
+        token = super(DebugLexer, self).create_token(token_string, in_tag)
+        token.source = self.origin, source
+        return token
+
+class DebugParser(Parser):
+    def __init__(self, lexer):
+        super(DebugParser, self).__init__(lexer)
+        self.command_stack = []
+
+    def enter_command(self, command, token):
+        self.command_stack.append( (command, token.source) )
+
+    def exit_command(self):
+        self.command_stack.pop()
+
+    def error(self, token, msg):
+        return self.source_error(token.source, msg)
+
+    def source_error(self, source,msg):
+        e = TemplateSyntaxError(msg)
+        e.source = source
+        return e
+
+    def create_nodelist(self):
+        return DebugNodeList()
+
+    def create_variable_node(self, contents):
+        return DebugVariableNode(contents)
+
+    def extend_nodelist(self, nodelist, node, token):
+        node.source = token.source
+        super(DebugParser, self).extend_nodelist(nodelist, node, token)
+
+    def unclosed_block_tag(self, parse_until):
+        command, source = self.command_stack.pop()
+        msg = "Unclosed tag '%s'. Looking for one of: %s " % (command, ', '.join(parse_until))
+        raise self.source_error(source, msg)
+
+    def compile_function_error(self, token, e):
+        if not hasattr(e, 'source'):
+            e.source = token.source
+
+class DebugNodeList(NodeList):
+    def render_node(self, node, context):
+        try:
+            result = node.render(context)
+        except TemplateSyntaxError, e:
+            if not hasattr(e, 'source'):
+                e.source = node.source
+            raise
+        except Exception, e:
+            from sys import exc_info
+            wrapped = TemplateSyntaxError(u'Caught an exception while rendering: %s' % force_unicode(e, errors='replace'))
+            wrapped.source = node.source
+            wrapped.exc_info = exc_info()
+            raise wrapped
+        return result
+
+class DebugVariableNode(VariableNode):
+    def render(self, context):
+        try:
+            output = force_unicode(self.filter_expression.resolve(context))
+        except TemplateSyntaxError, e:
+            if not hasattr(e, 'source'):
+                e.source = self.source
+            raise
+        except UnicodeDecodeError:
+            return ''
+        if (context.autoescape and not isinstance(output, SafeData)) or isinstance(output, EscapeData):
+            return escape(output)
+        else:
+            return output
diff --git a/webapp/django/template/defaultfilters.py b/webapp/django/template/defaultfilters.py
new file mode 100644
index 0000000..1140f7e
--- /dev/null
+++ b/webapp/django/template/defaultfilters.py
@@ -0,0 +1,851 @@
+"""Default variable filters."""
+
+import re
+import random as random_module
+try:
+    from functools import wraps
+except ImportError:
+    from django.utils.functional import wraps  # Python 2.3, 2.4 fallback.
+
+from django.template import Variable, Library
+from django.conf import settings
+from django.utils.translation import ugettext, ungettext
+from django.utils.encoding import force_unicode, iri_to_uri
+from django.utils.safestring import mark_safe, SafeData
+
+register = Library()
+
+#######################
+# STRING DECORATOR    #
+#######################
+
+def stringfilter(func):
+    """
+    Decorator for filters which should only receive unicode objects. The object
+    passed as the first positional argument will be converted to a unicode
+    object.
+    """
+    def _dec(*args, **kwargs):
+        if args:
+            args = list(args)
+            args[0] = force_unicode(args[0])
+            if isinstance(args[0], SafeData) and getattr(func, 'is_safe', False):
+                return mark_safe(func(*args, **kwargs))
+        return func(*args, **kwargs)
+
+    # Include a reference to the real function (used to check original
+    # arguments by the template parser).
+    _dec._decorated_function = getattr(func, '_decorated_function', func)
+    for attr in ('is_safe', 'needs_autoescape'):
+        if hasattr(func, attr):
+            setattr(_dec, attr, getattr(func, attr))
+    return wraps(func)(_dec)
+
+###################
+# STRINGS         #
+###################
+
+
+def addslashes(value):
+    """
+    Adds slashes before quotes. Useful for escaping strings in CSV, for
+    example. Less useful for escaping JavaScript; use the ``escapejs``
+    filter instead.
+    """
+    return value.replace('\\', '\\\\').replace('"', '\\"').replace("'", "\\'")
+addslashes.is_safe = True
+addslashes = stringfilter(addslashes)
+
+def capfirst(value):
+    """Capitalizes the first character of the value."""
+    return value and value[0].upper() + value[1:]
+capfirst.is_safe=True
+capfirst = stringfilter(capfirst)
+
+_js_escapes = (
+    ('\\', '\\\\'),
+    ('"', '\\"'),
+    ("'", "\\'"),
+    ('\n', '\\n'),
+    ('\r', '\\r'),
+    ('\b', '\\b'),
+    ('\f', '\\f'),
+    ('\t', '\\t'),
+    ('\v', '\\v'),
+    ('</', '<\\/'),
+)
+def escapejs(value):
+    """Backslash-escapes characters for use in JavaScript strings."""
+    for bad, good in _js_escapes:
+        value = value.replace(bad, good)
+    return value
+escapejs = stringfilter(escapejs)
+
+def fix_ampersands(value):
+    """Replaces ampersands with ``&amp;`` entities."""
+    from django.utils.html import fix_ampersands
+    return fix_ampersands(value)
+fix_ampersands.is_safe=True
+fix_ampersands = stringfilter(fix_ampersands)
+
+def floatformat(text, arg=-1):
+    """
+    Displays a float to a specified number of decimal places.
+
+    If called without an argument, it displays the floating point number with
+    one decimal place -- but only if there's a decimal place to be displayed:
+
+    * num1 = 34.23234
+    * num2 = 34.00000
+    * num3 = 34.26000
+    * {{ num1|floatformat }} displays "34.2"
+    * {{ num2|floatformat }} displays "34"
+    * {{ num3|floatformat }} displays "34.3"
+
+    If arg is positive, it will always display exactly arg number of decimal
+    places:
+
+    * {{ num1|floatformat:3 }} displays "34.232"
+    * {{ num2|floatformat:3 }} displays "34.000"
+    * {{ num3|floatformat:3 }} displays "34.260"
+
+    If arg is negative, it will display arg number of decimal places -- but
+    only if there are places to be displayed:
+
+    * {{ num1|floatformat:"-3" }} displays "34.232"
+    * {{ num2|floatformat:"-3" }} displays "34"
+    * {{ num3|floatformat:"-3" }} displays "34.260"
+    """
+    try:
+        f = float(text)
+    except (ValueError, TypeError):
+        return u''
+    try:
+        d = int(arg)
+    except ValueError:
+        return force_unicode(f)
+    try:
+        m = f - int(f)
+    except OverflowError:
+        return force_unicode(f)
+    if not m and d < 0:
+        return mark_safe(u'%d' % int(f))
+    else:
+        formatstr = u'%%.%df' % abs(d)
+        return mark_safe(formatstr % f)
+floatformat.is_safe = True
+
+def iriencode(value):
+    """Escapes an IRI value for use in a URL."""
+    return force_unicode(iri_to_uri(value))
+iriencode.is_safe = True
+iriencode = stringfilter(iriencode)
+
+def linenumbers(value, autoescape=None):
+    """Displays text with line numbers."""
+    from django.utils.html import escape
+    lines = value.split(u'\n')
+    # Find the maximum width of the line count, for use with zero padding
+    # string format command
+    width = unicode(len(unicode(len(lines))))
+    if not autoescape or isinstance(value, SafeData):
+        for i, line in enumerate(lines):
+            lines[i] = (u"%0" + width  + u"d. %s") % (i + 1, line)
+    else:
+        for i, line in enumerate(lines):
+            lines[i] = (u"%0" + width  + u"d. %s") % (i + 1, escape(line))
+    return mark_safe(u'\n'.join(lines))
+linenumbers.is_safe = True
+linenumbers.needs_autoescape = True
+linenumbers = stringfilter(linenumbers)
+
+def lower(value):
+    """Converts a string into all lowercase."""
+    return value.lower()
+lower.is_safe = True
+lower = stringfilter(lower)
+
+def make_list(value):
+    """
+    Returns the value turned into a list.
+
+    For an integer, it's a list of digits.
+    For a string, it's a list of characters.
+    """
+    return list(value)
+make_list.is_safe = False
+make_list = stringfilter(make_list)
+
+def slugify(value):
+    """
+    Normalizes string, converts to lowercase, removes non-alpha characters,
+    and converts spaces to hyphens.
+    """
+    import unicodedata
+    value = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore')
+    value = unicode(re.sub('[^\w\s-]', '', value).strip().lower())
+    return mark_safe(re.sub('[-\s]+', '-', value))
+slugify.is_safe = True
+slugify = stringfilter(slugify)
+
+def stringformat(value, arg):
+    """
+    Formats the variable according to the arg, a string formatting specifier.
+
+    This specifier uses Python string formating syntax, with the exception that
+    the leading "%" is dropped.
+
+    See http://docs.python.org/lib/typesseq-strings.html for documentation
+    of Python string formatting
+    """
+    try:
+        return (u"%" + unicode(arg)) % value
+    except (ValueError, TypeError):
+        return u""
+stringformat.is_safe = True
+
+def title(value):
+    """Converts a string into titlecase."""
+    return re.sub("([a-z])'([A-Z])", lambda m: m.group(0).lower(), value.title())
+title.is_safe = True
+title = stringfilter(title)
+
+def truncatewords(value, arg):
+    """
+    Truncates a string after a certain number of words.
+
+    Argument: Number of words to truncate after.
+    """
+    from django.utils.text import truncate_words
+    try:
+        length = int(arg)
+    except ValueError: # Invalid literal for int().
+        return value # Fail silently.
+    return truncate_words(value, length)
+truncatewords.is_safe = True
+truncatewords = stringfilter(truncatewords)
+
+def truncatewords_html(value, arg):
+    """
+    Truncates HTML after a certain number of words.
+
+    Argument: Number of words to truncate after.
+    """
+    from django.utils.text import truncate_html_words
+    try:
+        length = int(arg)
+    except ValueError: # invalid literal for int()
+        return value # Fail silently.
+    return truncate_html_words(value, length)
+truncatewords_html.is_safe = True
+truncatewords_html = stringfilter(truncatewords_html)
+
+def upper(value):
+    """Converts a string into all uppercase."""
+    return value.upper()
+upper.is_safe = False
+upper = stringfilter(upper)
+
+def urlencode(value):
+    """Escapes a value for use in a URL."""
+    from django.utils.http import urlquote
+    return urlquote(value)
+urlencode.is_safe = False
+urlencode = stringfilter(urlencode)
+
+def urlize(value, autoescape=None):
+    """Converts URLs in plain text into clickable links."""
+    from django.utils.html import urlize
+    return mark_safe(urlize(value, nofollow=True, autoescape=autoescape))
+urlize.is_safe=True
+urlize.needs_autoescape = True
+urlize = stringfilter(urlize)
+
+def urlizetrunc(value, limit, autoescape=None):
+    """
+    Converts URLs into clickable links, truncating URLs to the given character
+    limit, and adding 'rel=nofollow' attribute to discourage spamming.
+
+    Argument: Length to truncate URLs to.
+    """
+    from django.utils.html import urlize
+    return mark_safe(urlize(value, trim_url_limit=int(limit), nofollow=True,
+                            autoescape=autoescape))
+urlizetrunc.is_safe = True
+urlizetrunc.needs_autoescape = True
+urlizetrunc = stringfilter(urlizetrunc)
+
+def wordcount(value):
+    """Returns the number of words."""
+    return len(value.split())
+wordcount.is_safe = False
+wordcount = stringfilter(wordcount)
+
+def wordwrap(value, arg):
+    """
+    Wraps words at specified line length.
+
+    Argument: number of characters to wrap the text at.
+    """
+    from django.utils.text import wrap
+    return wrap(value, int(arg))
+wordwrap.is_safe = True
+wordwrap = stringfilter(wordwrap)
+
+def ljust(value, arg):
+    """
+    Left-aligns the value in a field of a given width.
+
+    Argument: field size.
+    """
+    return value.ljust(int(arg))
+ljust.is_safe = True
+ljust = stringfilter(ljust)
+
+def rjust(value, arg):
+    """
+    Right-aligns the value in a field of a given width.
+
+    Argument: field size.
+    """
+    return value.rjust(int(arg))
+rjust.is_safe = True
+rjust = stringfilter(rjust)
+
+def center(value, arg):
+    """Centers the value in a field of a given width."""
+    return value.center(int(arg))
+center.is_safe = True
+center = stringfilter(center)
+
+def cut(value, arg):
+    """
+    Removes all values of arg from the given string.
+    """
+    safe = isinstance(value, SafeData)
+    value = value.replace(arg, u'')
+    if safe and arg != ';':
+        return mark_safe(value)
+    return value
+cut = stringfilter(cut)
+
+###################
+# HTML STRINGS    #
+###################
+
+def escape(value):
+    """
+    Marks the value as a string that should not be auto-escaped.
+    """
+    from django.utils.safestring import mark_for_escaping
+    return mark_for_escaping(value)
+escape.is_safe = True
+escape = stringfilter(escape)
+
+def force_escape(value):
+    """
+    Escapes a string's HTML. This returns a new string containing the escaped
+    characters (as opposed to "escape", which marks the content for later
+    possible escaping).
+    """
+    from django.utils.html import escape
+    return mark_safe(escape(value))
+force_escape = stringfilter(force_escape)
+force_escape.is_safe = True
+
+def linebreaks(value, autoescape=None):
+    """
+    Replaces line breaks in plain text with appropriate HTML; a single
+    newline becomes an HTML line break (``<br />``) and a new line
+    followed by a blank line becomes a paragraph break (``</p>``).
+    """
+    from django.utils.html import linebreaks
+    autoescape = autoescape and not isinstance(value, SafeData)
+    return mark_safe(linebreaks(value, autoescape))
+linebreaks.is_safe = True
+linebreaks.needs_autoescape = True
+linebreaks = stringfilter(linebreaks)
+
+def linebreaksbr(value, autoescape=None):
+    """
+    Converts all newlines in a piece of plain text to HTML line breaks
+    (``<br />``).
+    """
+    if autoescape and not isinstance(value, SafeData):
+        from django.utils.html import escape
+        value = escape(value)
+    return mark_safe(value.replace('\n', '<br />'))
+linebreaksbr.is_safe = True
+linebreaksbr.needs_autoescape = True
+linebreaksbr = stringfilter(linebreaksbr)
+
+def safe(value):
+    """
+    Marks the value as a string that should not be auto-escaped.
+    """
+    from django.utils.safestring import mark_safe
+    return mark_safe(value)
+safe.is_safe = True
+safe = stringfilter(safe)
+
+def removetags(value, tags):
+    """Removes a space separated list of [X]HTML tags from the output."""
+    tags = [re.escape(tag) for tag in tags.split()]
+    tags_re = u'(%s)' % u'|'.join(tags)
+    starttag_re = re.compile(ur'<%s(/?>|(\s+[^>]*>))' % tags_re, re.U)
+    endtag_re = re.compile(u'</%s>' % tags_re)
+    value = starttag_re.sub(u'', value)
+    value = endtag_re.sub(u'', value)
+    return value
+removetags.is_safe = True
+removetags = stringfilter(removetags)
+
+def striptags(value):
+    """Strips all [X]HTML tags."""
+    from django.utils.html import strip_tags
+    return strip_tags(value)
+striptags.is_safe = True
+striptags = stringfilter(striptags)
+
+###################
+# LISTS           #
+###################
+
+def dictsort(value, arg):
+    """
+    Takes a list of dicts, returns that list sorted by the property given in
+    the argument.
+    """
+    var_resolve = Variable(arg).resolve
+    decorated = [(var_resolve(item), item) for item in value]
+    decorated.sort()
+    return [item[1] for item in decorated]
+dictsort.is_safe = False
+
+def dictsortreversed(value, arg):
+    """
+    Takes a list of dicts, returns that list sorted in reverse order by the
+    property given in the argument.
+    """
+    var_resolve = Variable(arg).resolve
+    decorated = [(var_resolve(item), item) for item in value]
+    decorated.sort()
+    decorated.reverse()
+    return [item[1] for item in decorated]
+dictsortreversed.is_safe = False
+
+def first(value):
+    """Returns the first item in a list."""
+    try:
+        return value[0]
+    except IndexError:
+        return u''
+first.is_safe = False
+
+def join(value, arg):
+    """Joins a list with a string, like Python's ``str.join(list)``."""
+    try:
+        data = arg.join(map(force_unicode, value))
+    except AttributeError: # fail silently but nicely
+        return value
+    safe_args = reduce(lambda lhs, rhs: lhs and isinstance(rhs, SafeData),
+            value, True)
+    if safe_args:
+        return mark_safe(data)
+    else:
+        return data
+join.is_safe = True
+
+def last(value):
+    "Returns the last item in a list"
+    try:
+        return value[-1]
+    except IndexError:
+        return u''
+last.is_safe = True
+
+def length(value):
+    """Returns the length of the value - useful for lists."""
+    return len(value)
+length.is_safe = True
+
+def length_is(value, arg):
+    """Returns a boolean of whether the value's length is the argument."""
+    return len(value) == int(arg)
+length_is.is_safe = True
+
+def random(value):
+    """Returns a random item from the list."""
+    return random_module.choice(value)
+random.is_safe = True
+
+def slice_(value, arg):
+    """
+    Returns a slice of the list.
+
+    Uses the same syntax as Python's list slicing; see
+    http://diveintopython.org/native_data_types/lists.html#odbchelper.list.slice
+    for an introduction.
+    """
+    try:
+        bits = []
+        for x in arg.split(u':'):
+            if len(x) == 0:
+                bits.append(None)
+            else:
+                bits.append(int(x))
+        return value[slice(*bits)]
+
+    except (ValueError, TypeError):
+        return value # Fail silently.
+slice_.is_safe = True
+
+def unordered_list(value, autoescape=None):
+    """
+    Recursively takes a self-nested list and returns an HTML unordered list --
+    WITHOUT opening and closing <ul> tags.
+
+    The list is assumed to be in the proper format. For example, if ``var``
+    contains: ``['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']]``,
+    then ``{{ var|unordered_list }}`` would return::
+
+        <li>States
+        <ul>
+                <li>Kansas
+                <ul>
+                        <li>Lawrence</li>
+                        <li>Topeka</li>
+                </ul>
+                </li>
+                <li>Illinois</li>
+        </ul>
+        </li>
+    """
+    if autoescape:
+        from django.utils.html import conditional_escape
+        escaper = conditional_escape
+    else:
+        escaper = lambda x: x
+    def convert_old_style_list(list_):
+        """
+        Converts old style lists to the new easier to understand format.
+
+        The old list format looked like:
+            ['Item 1', [['Item 1.1', []], ['Item 1.2', []]]
+
+        And it is converted to:
+            ['Item 1', ['Item 1.1', 'Item 1.2]]
+        """
+        if not isinstance(list_, (tuple, list)) or len(list_) != 2:
+            return list_, False
+        first_item, second_item = list_
+        if second_item == []:
+            return [first_item], True
+        old_style_list = True
+        new_second_item = []
+        for sublist in second_item:
+            item, old_style_list = convert_old_style_list(sublist)
+            if not old_style_list:
+                break
+            new_second_item.extend(item)
+        if old_style_list:
+            second_item = new_second_item
+        return [first_item, second_item], old_style_list
+    def _helper(list_, tabs=1):
+        indent = u'\t' * tabs
+        output = []
+
+        list_length = len(list_)
+        i = 0
+        while i < list_length:
+            title = list_[i]
+            sublist = ''
+            sublist_item = None
+            if isinstance(title, (list, tuple)):
+                sublist_item = title
+                title = ''
+            elif i < list_length - 1:
+                next_item = list_[i+1]
+                if next_item and isinstance(next_item, (list, tuple)):
+                    # The next item is a sub-list.
+                    sublist_item = next_item
+                    # We've processed the next item now too.
+                    i += 1
+            if sublist_item:
+                sublist = _helper(sublist_item, tabs+1)
+                sublist = '\n%s<ul>\n%s\n%s</ul>\n%s' % (indent, sublist,
+                                                         indent, indent)
+            output.append('%s<li>%s%s</li>' % (indent,
+                    escaper(force_unicode(title)), sublist))
+            i += 1
+        return '\n'.join(output)
+    value, converted = convert_old_style_list(value)
+    return mark_safe(_helper(value))
+unordered_list.is_safe = True
+unordered_list.needs_autoescape = True
+
+###################
+# INTEGERS        #
+###################
+
+def add(value, arg):
+    """Adds the arg to the value."""
+    return int(value) + int(arg)
+add.is_safe = False
+
+def get_digit(value, arg):
+    """
+    Given a whole number, returns the requested digit of it, where 1 is the
+    right-most digit, 2 is the second-right-most digit, etc. Returns the
+    original value for invalid input (if input or argument is not an integer,
+    or if argument is less than 1). Otherwise, output is always an integer.
+    """
+    try:
+        arg = int(arg)
+        value = int(value)
+    except ValueError:
+        return value # Fail silently for an invalid argument
+    if arg < 1:
+        return value
+    try:
+        return int(str(value)[-arg])
+    except IndexError:
+        return 0
+get_digit.is_safe = False
+
+###################
+# DATES           #
+###################
+
+def date(value, arg=None):
+    """Formats a date according to the given format."""
+    from django.utils.dateformat import format
+    if not value:
+        return u''
+    if arg is None:
+        arg = settings.DATE_FORMAT
+    return format(value, arg)
+date.is_safe = False
+
+def time(value, arg=None):
+    """Formats a time according to the given format."""
+    from django.utils.dateformat import time_format
+    if value in (None, u''):
+        return u''
+    if arg is None:
+        arg = settings.TIME_FORMAT
+    return time_format(value, arg)
+time.is_safe = False
+
+def timesince(value, arg=None):
+    """Formats a date as the time since that date (i.e. "4 days, 6 hours")."""
+    from django.utils.timesince import timesince
+    if not value:
+        return u''
+    if arg:
+        return timesince(value, arg)
+    return timesince(value)
+timesince.is_safe = False
+
+def timeuntil(value, arg=None):
+    """Formats a date as the time until that date (i.e. "4 days, 6 hours")."""
+    from django.utils.timesince import timesince
+    from datetime import datetime
+    if not value:
+        return u''
+    if arg:
+        return timesince(arg, value)
+    return timesince(datetime.now(), value)
+timeuntil.is_safe = False
+
+###################
+# LOGIC           #
+###################
+
+def default(value, arg):
+    """If value is unavailable, use given default."""
+    return value or arg
+default.is_safe = False
+
+def default_if_none(value, arg):
+    """If value is None, use given default."""
+    if value is None:
+        return arg
+    return value
+default_if_none.is_safe = False
+
+def divisibleby(value, arg):
+    """Returns True if the value is devisible by the argument."""
+    return int(value) % int(arg) == 0
+divisibleby.is_safe = False
+
+def yesno(value, arg=None):
+    """
+    Given a string mapping values for true, false and (optionally) None,
+    returns one of those strings accoding to the value:
+
+    ==========  ======================  ==================================
+    Value       Argument                Outputs
+    ==========  ======================  ==================================
+    ``True``    ``"yeah,no,maybe"``     ``yeah``
+    ``False``   ``"yeah,no,maybe"``     ``no``
+    ``None``    ``"yeah,no,maybe"``     ``maybe``
+    ``None``    ``"yeah,no"``           ``"no"`` (converts None to False
+                                        if no mapping for None is given.
+    ==========  ======================  ==================================
+    """
+    if arg is None:
+        arg = ugettext('yes,no,maybe')
+    bits = arg.split(u',')
+    if len(bits) < 2:
+        return value # Invalid arg.
+    try:
+        yes, no, maybe = bits
+    except ValueError:
+        # Unpack list of wrong size (no "maybe" value provided).
+        yes, no, maybe = bits[0], bits[1], bits[1]
+    if value is None:
+        return maybe
+    if value:
+        return yes
+    return no
+yesno.is_safe = False
+
+###################
+# MISC            #
+###################
+
+def filesizeformat(bytes):
+    """
+    Formats the value like a 'human-readable' file size (i.e. 13 KB, 4.1 MB,
+    102 bytes, etc).
+    """
+    try:
+        bytes = float(bytes)
+    except TypeError:
+        return u"0 bytes"
+
+    if bytes < 1024:
+        return ungettext("%(size)d byte", "%(size)d bytes", bytes) % {'size': bytes}
+    if bytes < 1024 * 1024:
+        return ugettext("%.1f KB") % (bytes / 1024)
+    if bytes < 1024 * 1024 * 1024:
+        return ugettext("%.1f MB") % (bytes / (1024 * 1024))
+    return ugettext("%.1f GB") % (bytes / (1024 * 1024 * 1024))
+filesizeformat.is_safe = True
+
+def pluralize(value, arg=u's'):
+    """
+    Returns a plural suffix if the value is not 1. By default, 's' is used as
+    the suffix:
+
+    * If value is 0, vote{{ value|pluralize }} displays "0 votes".
+    * If value is 1, vote{{ value|pluralize }} displays "1 vote".
+    * If value is 2, vote{{ value|pluralize }} displays "2 votes".
+
+    If an argument is provided, that string is used instead:
+
+    * If value is 0, class{{ value|pluralize:"es" }} displays "0 classes".
+    * If value is 1, class{{ value|pluralize:"es" }} displays "1 class".
+    * If value is 2, class{{ value|pluralize:"es" }} displays "2 classes".
+
+    If the provided argument contains a comma, the text before the comma is
+    used for the singular case and the text after the comma is used for the
+    plural case:
+
+    * If value is 0, cand{{ value|pluralize:"y,ies" }} displays "0 candies".
+    * If value is 1, cand{{ value|pluralize:"y,ies" }} displays "1 candy".
+    * If value is 2, cand{{ value|pluralize:"y,ies" }} displays "2 candies".
+    """
+    if not u',' in arg:
+        arg = u',' + arg
+    bits = arg.split(u',')
+    if len(bits) > 2:
+        return u''
+    singular_suffix, plural_suffix = bits[:2]
+
+    try:
+        if int(value) != 1:
+            return plural_suffix
+    except ValueError: # Invalid string that's not a number.
+        pass
+    except TypeError: # Value isn't a string or a number; maybe it's a list?
+        try:
+            if len(value) != 1:
+                return plural_suffix
+        except TypeError: # len() of unsized object.
+            pass
+    return singular_suffix
+pluralize.is_safe = False
+
+def phone2numeric(value):
+    """Takes a phone number and converts it in to its numerical equivalent."""
+    from django.utils.text import phone2numeric
+    return phone2numeric(value)
+phone2numeric.is_safe = True
+
+def pprint(value):
+    """A wrapper around pprint.pprint -- for debugging, really."""
+    from pprint import pformat
+    try:
+        return pformat(value)
+    except Exception, e:
+        return u"Error in formatting: %s" % force_unicode(e, errors="replace")
+pprint.is_safe = True
+
+# Syntax: register.filter(name of filter, callback)
+register.filter(add)
+register.filter(addslashes)
+register.filter(capfirst)
+register.filter(center)
+register.filter(cut)
+register.filter(date)
+register.filter(default)
+register.filter(default_if_none)
+register.filter(dictsort)
+register.filter(dictsortreversed)
+register.filter(divisibleby)
+register.filter(escape)
+register.filter(escapejs)
+register.filter(filesizeformat)
+register.filter(first)
+register.filter(fix_ampersands)
+register.filter(floatformat)
+register.filter(force_escape)
+register.filter(get_digit)
+register.filter(iriencode)
+register.filter(join)
+register.filter(last)
+register.filter(length)
+register.filter(length_is)
+register.filter(linebreaks)
+register.filter(linebreaksbr)
+register.filter(linenumbers)
+register.filter(ljust)
+register.filter(lower)
+register.filter(make_list)
+register.filter(phone2numeric)
+register.filter(pluralize)
+register.filter(pprint)
+register.filter(removetags)
+register.filter(random)
+register.filter(rjust)
+register.filter(safe)
+register.filter('slice', slice_)
+register.filter(slugify)
+register.filter(stringformat)
+register.filter(striptags)
+register.filter(time)
+register.filter(timesince)
+register.filter(timeuntil)
+register.filter(title)
+register.filter(truncatewords)
+register.filter(truncatewords_html)
+register.filter(unordered_list)
+register.filter(upper)
+register.filter(urlencode)
+register.filter(urlize)
+register.filter(urlizetrunc)
+register.filter(wordcount)
+register.filter(wordwrap)
+register.filter(yesno)
diff --git a/webapp/django/template/defaulttags.py b/webapp/django/template/defaulttags.py
new file mode 100644
index 0000000..489faa2
--- /dev/null
+++ b/webapp/django/template/defaulttags.py
@@ -0,0 +1,1108 @@
+"""Default tags used by the template system, available to all templates."""
+
+import sys
+import re
+from itertools import cycle as itertools_cycle
+try:
+    reversed
+except NameError:
+    from django.utils.itercompat import reversed     # Python 2.3 fallback
+
+from django.template import Node, NodeList, Template, Context, Variable
+from django.template import TemplateSyntaxError, VariableDoesNotExist, BLOCK_TAG_START, BLOCK_TAG_END, VARIABLE_TAG_START, VARIABLE_TAG_END, SINGLE_BRACE_START, SINGLE_BRACE_END, COMMENT_TAG_START, COMMENT_TAG_END
+from django.template import get_library, Library, InvalidTemplateLibrary
+from django.conf import settings
+from django.utils.encoding import smart_str, smart_unicode
+from django.utils.itercompat import groupby
+from django.utils.safestring import mark_safe
+
+register = Library()
+
+class AutoEscapeControlNode(Node):
+    """Implements the actions of the autoescape tag."""
+    def __init__(self, setting, nodelist):
+        self.setting, self.nodelist = setting, nodelist
+
+    def render(self, context):
+        old_setting = context.autoescape
+        context.autoescape = self.setting
+        output = self.nodelist.render(context)
+        context.autoescape = old_setting
+        if self.setting:
+            return mark_safe(output)
+        else:
+            return output
+
+class CommentNode(Node):
+    def render(self, context):
+        return ''
+
+class CycleNode(Node):
+    def __init__(self, cyclevars, variable_name=None):
+        self.cycle_iter = itertools_cycle([Variable(v) for v in cyclevars])
+        self.variable_name = variable_name
+
+    def render(self, context):
+        value = self.cycle_iter.next().resolve(context)
+        if self.variable_name:
+            context[self.variable_name] = value
+        return value
+
+class DebugNode(Node):
+    def render(self, context):
+        from pprint import pformat
+        output = [pformat(val) for val in context]
+        output.append('\n\n')
+        output.append(pformat(sys.modules))
+        return ''.join(output)
+
+class FilterNode(Node):
+    def __init__(self, filter_expr, nodelist):
+        self.filter_expr, self.nodelist = filter_expr, nodelist
+
+    def render(self, context):
+        output = self.nodelist.render(context)
+        # Apply filters.
+        context.update({'var': output})
+        filtered = self.filter_expr.resolve(context)
+        context.pop()
+        return filtered
+
+class FirstOfNode(Node):
+    def __init__(self, vars):
+        self.vars = map(Variable, vars)
+
+    def render(self, context):
+        for var in self.vars:
+            try:
+                value = var.resolve(context)
+            except VariableDoesNotExist:
+                continue
+            if value:
+                return smart_unicode(value)
+        return u''
+
+class ForNode(Node):
+    def __init__(self, loopvars, sequence, is_reversed, nodelist_loop):
+        self.loopvars, self.sequence = loopvars, sequence
+        self.is_reversed = is_reversed
+        self.nodelist_loop = nodelist_loop
+
+    def __repr__(self):
+        reversed_text = self.is_reversed and ' reversed' or ''
+        return "<For Node: for %s in %s, tail_len: %d%s>" % \
+            (', '.join(self.loopvars), self.sequence, len(self.nodelist_loop),
+             reversed_text)
+
+    def __iter__(self):
+        for node in self.nodelist_loop:
+            yield node
+
+    def get_nodes_by_type(self, nodetype):
+        nodes = []
+        if isinstance(self, nodetype):
+            nodes.append(self)
+        nodes.extend(self.nodelist_loop.get_nodes_by_type(nodetype))
+        return nodes
+
+    def render(self, context):
+        nodelist = NodeList()
+        if 'forloop' in context:
+            parentloop = context['forloop']
+        else:
+            parentloop = {}
+        context.push()
+        try:
+            values = self.sequence.resolve(context, True)
+        except VariableDoesNotExist:
+            values = []
+        if values is None:
+            values = []
+        if not hasattr(values, '__len__'):
+            values = list(values)
+        len_values = len(values)
+        if self.is_reversed:
+            values = reversed(values)
+        unpack = len(self.loopvars) > 1
+        # Create a forloop value in the context.  We'll update counters on each
+        # iteration just below.
+        loop_dict = context['forloop'] = {'parentloop': parentloop}
+        for i, item in enumerate(values):
+            # Shortcuts for current loop iteration number.
+            loop_dict['counter0'] = i
+            loop_dict['counter'] = i+1
+            # Reverse counter iteration numbers.
+            loop_dict['revcounter'] = len_values - i
+            loop_dict['revcounter0'] = len_values - i - 1
+            # Boolean values designating first and last times through loop.
+            loop_dict['first'] = (i == 0)
+            loop_dict['last'] = (i == len_values - 1)
+
+            if unpack:
+                # If there are multiple loop variables, unpack the item into
+                # them.
+                context.update(dict(zip(self.loopvars, item)))
+            else:
+                context[self.loopvars[0]] = item
+            for node in self.nodelist_loop:
+                nodelist.append(node.render(context))
+            if unpack:
+                # The loop variables were pushed on to the context so pop them
+                # off again. This is necessary because the tag lets the length
+                # of loopvars differ to the length of each set of items and we
+                # don't want to leave any vars from the previous loop on the
+                # context.
+                context.pop()
+        context.pop()
+        return nodelist.render(context)
+
+class IfChangedNode(Node):
+    def __init__(self, nodelist_true, nodelist_false, *varlist):
+        self.nodelist_true, self.nodelist_false = nodelist_true, nodelist_false
+        self._last_seen = None
+        self._varlist = map(Variable, varlist)
+        self._id = str(id(self))
+
+    def render(self, context):
+        if 'forloop' in context and self._id not in context['forloop']:
+            self._last_seen = None
+            context['forloop'][self._id] = 1
+        try:
+            if self._varlist:
+                # Consider multiple parameters.  This automatically behaves
+                # like an OR evaluation of the multiple variables.
+                compare_to = [var.resolve(context) for var in self._varlist]
+            else:
+                compare_to = self.nodelist_true.render(context)
+        except VariableDoesNotExist:
+            compare_to = None
+
+        if compare_to != self._last_seen:
+            firstloop = (self._last_seen == None)
+            self._last_seen = compare_to
+            context.push()
+            context['ifchanged'] = {'firstloop': firstloop}
+            content = self.nodelist_true.render(context)
+            context.pop()
+            return content
+        elif self.nodelist_false:
+            return self.nodelist_false.render(context)
+        return ''
+
+class IfEqualNode(Node):
+    def __init__(self, var1, var2, nodelist_true, nodelist_false, negate):
+        self.var1, self.var2 = Variable(var1), Variable(var2)
+        self.nodelist_true, self.nodelist_false = nodelist_true, nodelist_false
+        self.negate = negate
+
+    def __repr__(self):
+        return "<IfEqualNode>"
+
+    def render(self, context):
+        try:
+            val1 = self.var1.resolve(context)
+        except VariableDoesNotExist:
+            val1 = None
+        try:
+            val2 = self.var2.resolve(context)
+        except VariableDoesNotExist:
+            val2 = None
+        if (self.negate and val1 != val2) or (not self.negate and val1 == val2):
+            return self.nodelist_true.render(context)
+        return self.nodelist_false.render(context)
+
+class IfNode(Node):
+    def __init__(self, bool_exprs, nodelist_true, nodelist_false, link_type):
+        self.bool_exprs = bool_exprs
+        self.nodelist_true, self.nodelist_false = nodelist_true, nodelist_false
+        self.link_type = link_type
+
+    def __repr__(self):
+        return "<If node>"
+
+    def __iter__(self):
+        for node in self.nodelist_true:
+            yield node
+        for node in self.nodelist_false:
+            yield node
+
+    def get_nodes_by_type(self, nodetype):
+        nodes = []
+        if isinstance(self, nodetype):
+            nodes.append(self)
+        nodes.extend(self.nodelist_true.get_nodes_by_type(nodetype))
+        nodes.extend(self.nodelist_false.get_nodes_by_type(nodetype))
+        return nodes
+
+    def render(self, context):
+        if self.link_type == IfNode.LinkTypes.or_:
+            for ifnot, bool_expr in self.bool_exprs:
+                try:
+                    value = bool_expr.resolve(context, True)
+                except VariableDoesNotExist:
+                    value = None
+                if (value and not ifnot) or (ifnot and not value):
+                    return self.nodelist_true.render(context)
+            return self.nodelist_false.render(context)
+        else:
+            for ifnot, bool_expr in self.bool_exprs:
+                try:
+                    value = bool_expr.resolve(context, True)
+                except VariableDoesNotExist:
+                    value = None
+                if not ((value and not ifnot) or (ifnot and not value)):
+                    return self.nodelist_false.render(context)
+            return self.nodelist_true.render(context)
+
+    class LinkTypes:
+        and_ = 0,
+        or_ = 1
+
+class RegroupNode(Node):
+    def __init__(self, target, expression, var_name):
+        self.target, self.expression = target, expression
+        self.var_name = var_name
+
+    def render(self, context):
+        obj_list = self.target.resolve(context, True)
+        if obj_list == None:
+            # target variable wasn't found in context; fail silently.
+            context[self.var_name] = []
+            return ''
+        # List of dictionaries in the format:
+        # {'grouper': 'key', 'list': [list of contents]}.
+        context[self.var_name] = [
+            {'grouper': key, 'list': list(val)}
+            for key, val in
+            groupby(obj_list, lambda v, f=self.expression.resolve: f(v, True))
+        ]
+        return ''
+
+def include_is_allowed(filepath):
+    for root in settings.ALLOWED_INCLUDE_ROOTS:
+        if filepath.startswith(root):
+            return True
+    return False
+
+class SsiNode(Node):
+    def __init__(self, filepath, parsed):
+        self.filepath, self.parsed = filepath, parsed
+
+    def render(self, context):
+        if not include_is_allowed(self.filepath):
+            if settings.DEBUG:
+                return "[Didn't have permission to include file]"
+            else:
+                return '' # Fail silently for invalid includes.
+        try:
+            fp = open(self.filepath, 'r')
+            output = fp.read()
+            fp.close()
+        except IOError:
+            output = ''
+        if self.parsed:
+            try:
+                t = Template(output, name=self.filepath)
+                return t.render(context)
+            except TemplateSyntaxError, e:
+                if settings.DEBUG:
+                    return "[Included template had syntax error: %s]" % e
+                else:
+                    return '' # Fail silently for invalid included templates.
+        return output
+
+class LoadNode(Node):
+    def render(self, context):
+        return ''
+
+class NowNode(Node):
+    def __init__(self, format_string):
+        self.format_string = format_string
+
+    def render(self, context):
+        from datetime import datetime
+        from django.utils.dateformat import DateFormat
+        df = DateFormat(datetime.now())
+        return df.format(self.format_string)
+
+class SpacelessNode(Node):
+    def __init__(self, nodelist):
+        self.nodelist = nodelist
+
+    def render(self, context):
+        from django.utils.html import strip_spaces_between_tags
+        return strip_spaces_between_tags(self.nodelist.render(context).strip())
+
+class TemplateTagNode(Node):
+    mapping = {'openblock': BLOCK_TAG_START,
+               'closeblock': BLOCK_TAG_END,
+               'openvariable': VARIABLE_TAG_START,
+               'closevariable': VARIABLE_TAG_END,
+               'openbrace': SINGLE_BRACE_START,
+               'closebrace': SINGLE_BRACE_END,
+               'opencomment': COMMENT_TAG_START,
+               'closecomment': COMMENT_TAG_END,
+               }
+
+    def __init__(self, tagtype):
+        self.tagtype = tagtype
+
+    def render(self, context):
+        return self.mapping.get(self.tagtype, '')
+
+class URLNode(Node):
+    def __init__(self, view_name, args, kwargs):
+        self.view_name = view_name
+        self.args = args
+        self.kwargs = kwargs
+
+    def render(self, context):
+        from django.core.urlresolvers import reverse, NoReverseMatch
+        args = [arg.resolve(context) for arg in self.args]
+        kwargs = dict([(smart_str(k,'ascii'), v.resolve(context))
+                       for k, v in self.kwargs.items()])
+        try:
+            return reverse(self.view_name, args=args, kwargs=kwargs)
+        except NoReverseMatch:
+            project_name = settings.SETTINGS_MODULE.split('.')[0]
+            return reverse(project_name + '.' + self.view_name,
+                           args=args, kwargs=kwargs)
+
+class WidthRatioNode(Node):
+    def __init__(self, val_expr, max_expr, max_width):
+        self.val_expr = val_expr
+        self.max_expr = max_expr
+        self.max_width = max_width
+
+    def render(self, context):
+        try:
+            value = self.val_expr.resolve(context)
+            maxvalue = self.max_expr.resolve(context)
+        except VariableDoesNotExist:
+            return ''
+        try:
+            value = float(value)
+            maxvalue = float(maxvalue)
+            ratio = (value / maxvalue) * int(self.max_width)
+        except (ValueError, ZeroDivisionError):
+            return ''
+        return str(int(round(ratio)))
+
+class WithNode(Node):
+    def __init__(self, var, name, nodelist):
+        self.var = var
+        self.name = name
+        self.nodelist = nodelist
+
+    def __repr__(self):
+        return "<WithNode>"
+
+    def render(self, context):
+        val = self.var.resolve(context)
+        context.push()
+        context[self.name] = val
+        output = self.nodelist.render(context)
+        context.pop()
+        return output
+
+#@register.tag
+def autoescape(parser, token):
+    """
+    Force autoescape behaviour for this block.
+    """
+    args = token.contents.split()
+    if len(args) != 2:
+        raise TemplateSyntaxError("'Autoescape' tag requires exactly one argument.")
+    arg = args[1]
+    if arg not in (u'on', u'off'):
+        raise TemplateSyntaxError("'Autoescape' argument should be 'on' or 'off'")
+    nodelist = parser.parse(('endautoescape',))
+    parser.delete_first_token()
+    return AutoEscapeControlNode((arg == 'on'), nodelist)
+autoescape = register.tag(autoescape)
+
+#@register.tag
+def comment(parser, token):
+    """
+    Ignores everything between ``{% comment %}`` and ``{% endcomment %}``.
+    """
+    parser.skip_past('endcomment')
+    return CommentNode()
+comment = register.tag(comment)
+
+#@register.tag
+def cycle(parser, token):
+    """
+    Cycles among the given strings each time this tag is encountered.
+
+    Within a loop, cycles among the given strings each time through
+    the loop::
+
+        {% for o in some_list %}
+            <tr class="{% cycle 'row1' 'row2' %}">
+                ...
+            </tr>
+        {% endfor %}
+
+    Outside of a loop, give the values a unique name the first time you call
+    it, then use that name each sucessive time through::
+
+            <tr class="{% cycle 'row1' 'row2' 'row3' as rowcolors %}">...</tr>
+            <tr class="{% cycle rowcolors %}">...</tr>
+            <tr class="{% cycle rowcolors %}">...</tr>
+
+    You can use any number of values, separated by spaces. Commas can also
+    be used to separate values; if a comma is used, the cycle values are
+    interpreted as literal strings.
+    """
+
+    # Note: This returns the exact same node on each {% cycle name %} call;
+    # that is, the node object returned from {% cycle a b c as name %} and the
+    # one returned from {% cycle name %} are the exact same object. This
+    # shouldn't cause problems (heh), but if it does, now you know.
+    #
+    # Ugly hack warning: This stuffs the named template dict into parser so
+    # that names are only unique within each template (as opposed to using
+    # a global variable, which would make cycle names have to be unique across
+    # *all* templates.
+
+    args = token.split_contents()
+
+    if len(args) < 2:
+        raise TemplateSyntaxError("'cycle' tag requires at least two arguments")
+
+    if ',' in args[1]:
+        # Backwards compatibility: {% cycle a,b %} or {% cycle a,b as foo %}
+        # case.
+        args[1:2] = ['"%s"' % arg for arg in args[1].split(",")]
+
+    if len(args) == 2:
+        # {% cycle foo %} case.
+        name = args[1]
+        if not hasattr(parser, '_namedCycleNodes'):
+            raise TemplateSyntaxError("No named cycles in template. '%s' is not defined" % name)
+        if not name in parser._namedCycleNodes:
+            raise TemplateSyntaxError("Named cycle '%s' does not exist" % name)
+        return parser._namedCycleNodes[name]
+
+    if len(args) > 4 and args[-2] == 'as':
+        name = args[-1]
+        node = CycleNode(args[1:-2], name)
+        if not hasattr(parser, '_namedCycleNodes'):
+            parser._namedCycleNodes = {}
+        parser._namedCycleNodes[name] = node
+    else:
+        node = CycleNode(args[1:])
+    return node
+cycle = register.tag(cycle)
+
+def debug(parser, token):
+    """
+    Outputs a whole load of debugging information, including the current
+    context and imported modules.
+
+    Sample usage::
+
+        <pre>
+            {% debug %}
+        </pre>
+    """
+    return DebugNode()
+debug = register.tag(debug)
+
+#@register.tag(name="filter")
+def do_filter(parser, token):
+    """
+    Filters the contents of the block through variable filters.
+
+    Filters can also be piped through each other, and they can have
+    arguments -- just like in variable syntax.
+
+    Sample usage::
+
+        {% filter force_escape|lower %}
+            This text will be HTML-escaped, and will appear in lowercase.
+        {% endfilter %}
+    """
+    _, rest = token.contents.split(None, 1)
+    filter_expr = parser.compile_filter("var|%s" % (rest))
+    for func, unused in filter_expr.filters:
+        if getattr(func, '_decorated_function', func).__name__ in ('escape', 'safe'):
+            raise TemplateSyntaxError('"filter %s" is not permitted.  Use the "autoescape" tag instead.' % func.__name__)
+    nodelist = parser.parse(('endfilter',))
+    parser.delete_first_token()
+    return FilterNode(filter_expr, nodelist)
+do_filter = register.tag("filter", do_filter)
+
+#@register.tag
+def firstof(parser, token):
+    """
+    Outputs the first variable passed that is not False.
+
+    Outputs nothing if all the passed variables are False.
+
+    Sample usage::
+
+        {% firstof var1 var2 var3 %}
+
+    This is equivalent to::
+
+        {% if var1 %}
+            {{ var1 }}
+        {% else %}{% if var2 %}
+            {{ var2 }}
+        {% else %}{% if var3 %}
+            {{ var3 }}
+        {% endif %}{% endif %}{% endif %}
+
+    but obviously much cleaner!
+
+    You can also use a literal string as a fallback value in case all
+    passed variables are False::
+
+        {% firstof var1 var2 var3 "fallback value" %}
+
+    """
+    bits = token.split_contents()[1:]
+    if len(bits) < 1:
+        raise TemplateSyntaxError("'firstof' statement requires at least one"
+                                  " argument")
+    return FirstOfNode(bits)
+firstof = register.tag(firstof)
+
+#@register.tag(name="for")
+def do_for(parser, token):
+    """
+    Loops over each item in an array.
+
+    For example, to display a list of athletes given ``athlete_list``::
+
+        <ul>
+        {% for athlete in athlete_list %}
+            <li>{{ athlete.name }}</li>
+        {% endfor %}
+        </ul>
+
+    You can loop over a list in reverse by using
+    ``{% for obj in list reversed %}``.
+
+    You can also unpack multiple values from a two-dimensional array::
+
+        {% for key,value in dict.items %}
+            {{ key }}: {{ value }}
+        {% endfor %}
+
+    The for loop sets a number of variables available within the loop:
+
+        ==========================  ================================================
+        Variable                    Description
+        ==========================  ================================================
+        ``forloop.counter``         The current iteration of the loop (1-indexed)
+        ``forloop.counter0``        The current iteration of the loop (0-indexed)
+        ``forloop.revcounter``      The number of iterations from the end of the
+                                    loop (1-indexed)
+        ``forloop.revcounter0``     The number of iterations from the end of the
+                                    loop (0-indexed)
+        ``forloop.first``           True if this is the first time through the loop
+        ``forloop.last``            True if this is the last time through the loop
+        ``forloop.parentloop``      For nested loops, this is the loop "above" the
+                                    current one
+        ==========================  ================================================
+
+    """
+    bits = token.contents.split()
+    if len(bits) < 4:
+        raise TemplateSyntaxError("'for' statements should have at least four"
+                                  " words: %s" % token.contents)
+
+    is_reversed = bits[-1] == 'reversed'
+    in_index = is_reversed and -3 or -2
+    if bits[in_index] != 'in':
+        raise TemplateSyntaxError("'for' statements should use the format"
+                                  " 'for x in y': %s" % token.contents)
+
+    loopvars = re.sub(r' *, *', ',', ' '.join(bits[1:in_index])).split(',')
+    for var in loopvars:
+        if not var or ' ' in var:
+            raise TemplateSyntaxError("'for' tag received an invalid argument:"
+                                      " %s" % token.contents)
+
+    sequence = parser.compile_filter(bits[in_index+1])
+    nodelist_loop = parser.parse(('endfor',))
+    parser.delete_first_token()
+    return ForNode(loopvars, sequence, is_reversed, nodelist_loop)
+do_for = register.tag("for", do_for)
+
+def do_ifequal(parser, token, negate):
+    bits = list(token.split_contents())
+    if len(bits) != 3:
+        raise TemplateSyntaxError, "%r takes two arguments" % bits[0]
+    end_tag = 'end' + bits[0]
+    nodelist_true = parser.parse(('else', end_tag))
+    token = parser.next_token()
+    if token.contents == 'else':
+        nodelist_false = parser.parse((end_tag,))
+        parser.delete_first_token()
+    else:
+        nodelist_false = NodeList()
+    return IfEqualNode(bits[1], bits[2], nodelist_true, nodelist_false, negate)
+
+#@register.tag
+def ifequal(parser, token):
+    """
+    Outputs the contents of the block if the two arguments equal each other.
+
+    Examples::
+
+        {% ifequal user.id comment.user_id %}
+            ...
+        {% endifequal %}
+
+        {% ifnotequal user.id comment.user_id %}
+            ...
+        {% else %}
+            ...
+        {% endifnotequal %}
+    """
+    return do_ifequal(parser, token, False)
+ifequal = register.tag(ifequal)
+
+#@register.tag
+def ifnotequal(parser, token):
+    """
+    Outputs the contents of the block if the two arguments are not equal.
+    See ifequal.
+    """
+    return do_ifequal(parser, token, True)
+ifnotequal = register.tag(ifnotequal)
+
+#@register.tag(name="if")
+def do_if(parser, token):
+    """
+    The ``{% if %}`` tag evaluates a variable, and if that variable is "true"
+    (i.e., exists, is not empty, and is not a false boolean value), the
+    contents of the block are output:
+
+    ::
+
+        {% if athlete_list %}
+            Number of athletes: {{ athlete_list|count }}
+        {% else %}
+            No athletes.
+        {% endif %}
+
+    In the above, if ``athlete_list`` is not empty, the number of athletes will
+    be displayed by the ``{{ athlete_list|count }}`` variable.
+
+    As you can see, the ``if`` tag can take an option ``{% else %}`` clause
+    that will be displayed if the test fails.
+
+    ``if`` tags may use ``or``, ``and`` or ``not`` to test a number of
+    variables or to negate a given variable::
+
+        {% if not athlete_list %}
+            There are no athletes.
+        {% endif %}
+
+        {% if athlete_list or coach_list %}
+            There are some athletes or some coaches.
+        {% endif %}
+
+        {% if athlete_list and coach_list %}
+            Both atheletes and coaches are available.
+        {% endif %}
+
+        {% if not athlete_list or coach_list %}
+            There are no athletes, or there are some coaches.
+        {% endif %}
+
+        {% if athlete_list and not coach_list %}
+            There are some athletes and absolutely no coaches.
+        {% endif %}
+
+    ``if`` tags do not allow ``and`` and ``or`` clauses with the same tag,
+    because the order of logic would be ambigous. For example, this is
+    invalid::
+
+        {% if athlete_list and coach_list or cheerleader_list %}
+
+    If you need to combine ``and`` and ``or`` to do advanced logic, just use
+    nested if tags. For example::
+
+        {% if athlete_list %}
+            {% if coach_list or cheerleader_list %}
+                We have athletes, and either coaches or cheerleaders!
+            {% endif %}
+        {% endif %}
+    """
+    bits = token.contents.split()
+    del bits[0]
+    if not bits:
+        raise TemplateSyntaxError("'if' statement requires at least one argument")
+    # Bits now looks something like this: ['a', 'or', 'not', 'b', 'or', 'c.d']
+    bitstr = ' '.join(bits)
+    boolpairs = bitstr.split(' and ')
+    boolvars = []
+    if len(boolpairs) == 1:
+        link_type = IfNode.LinkTypes.or_
+        boolpairs = bitstr.split(' or ')
+    else:
+        link_type = IfNode.LinkTypes.and_
+        if ' or ' in bitstr:
+            raise TemplateSyntaxError, "'if' tags can't mix 'and' and 'or'"
+    for boolpair in boolpairs:
+        if ' ' in boolpair:
+            try:
+                not_, boolvar = boolpair.split()
+            except ValueError:
+                raise TemplateSyntaxError, "'if' statement improperly formatted"
+            if not_ != 'not':
+                raise TemplateSyntaxError, "Expected 'not' in if statement"
+            boolvars.append((True, parser.compile_filter(boolvar)))
+        else:
+            boolvars.append((False, parser.compile_filter(boolpair)))
+    nodelist_true = parser.parse(('else', 'endif'))
+    token = parser.next_token()
+    if token.contents == 'else':
+        nodelist_false = parser.parse(('endif',))
+        parser.delete_first_token()
+    else:
+        nodelist_false = NodeList()
+    return IfNode(boolvars, nodelist_true, nodelist_false, link_type)
+do_if = register.tag("if", do_if)
+
+#@register.tag
+def ifchanged(parser, token):
+    """
+    Checks if a value has changed from the last iteration of a loop.
+
+    The 'ifchanged' block tag is used within a loop. It has two possible uses.
+
+    1. Checks its own rendered contents against its previous state and only
+       displays the content if it has changed. For example, this displays a
+       list of days, only displaying the month if it changes::
+
+            <h1>Archive for {{ year }}</h1>
+
+            {% for date in days %}
+                {% ifchanged %}<h3>{{ date|date:"F" }}</h3>{% endifchanged %}
+                <a href="{{ date|date:"M/d"|lower }}/">{{ date|date:"j" }}</a>
+            {% endfor %}
+
+    2. If given a variable, check whether that variable has changed.
+       For example, the following shows the date every time it changes, but
+       only shows the hour if both the hour and the date have changed::
+
+            {% for date in days %}
+                {% ifchanged date.date %} {{ date.date }} {% endifchanged %}
+                {% ifchanged date.hour date.date %}
+                    {{ date.hour }}
+                {% endifchanged %}
+            {% endfor %}
+    """
+    bits = token.contents.split()
+    nodelist_true = parser.parse(('else', 'endifchanged'))
+    token = parser.next_token()
+    if token.contents == 'else':
+        nodelist_false = parser.parse(('endifchanged',))
+        parser.delete_first_token()
+    else:
+        nodelist_false = NodeList()
+    return IfChangedNode(nodelist_true, nodelist_false, *bits[1:])
+ifchanged = register.tag(ifchanged)
+
+#@register.tag
+def ssi(parser, token):
+    """
+    Outputs the contents of a given file into the page.
+
+    Like a simple "include" tag, the ``ssi`` tag includes the contents
+    of another file -- which must be specified using an absolute path --
+    in the current page::
+
+        {% ssi /home/html/ljworld.com/includes/right_generic.html %}
+
+    If the optional "parsed" parameter is given, the contents of the included
+    file are evaluated as template code, with the current context::
+
+        {% ssi /home/html/ljworld.com/includes/right_generic.html parsed %}
+    """
+    bits = token.contents.split()
+    parsed = False
+    if len(bits) not in (2, 3):
+        raise TemplateSyntaxError("'ssi' tag takes one argument: the path to"
+                                  " the file to be included")
+    if len(bits) == 3:
+        if bits[2] == 'parsed':
+            parsed = True
+        else:
+            raise TemplateSyntaxError("Second (optional) argument to %s tag"
+                                      " must be 'parsed'" % bits[0])
+    return SsiNode(bits[1], parsed)
+ssi = register.tag(ssi)
+
+#@register.tag
+def load(parser, token):
+    """
+    Loads a custom template tag set.
+
+    For example, to load the template tags in
+    ``django/templatetags/news/photos.py``::
+
+        {% load news.photos %}
+    """
+    bits = token.contents.split()
+    for taglib in bits[1:]:
+        # add the library to the parser
+        try:
+            lib = get_library("django.templatetags.%s" % taglib)
+            parser.add_library(lib)
+        except InvalidTemplateLibrary, e:
+            raise TemplateSyntaxError("'%s' is not a valid tag library: %s" %
+                                      (taglib, e))
+    return LoadNode()
+load = register.tag(load)
+
+#@register.tag
+def now(parser, token):
+    """
+    Displays the date, formatted according to the given string.
+
+    Uses the same format as PHP's ``date()`` function; see http://php.net/date
+    for all the possible values.
+
+    Sample usage::
+
+        It is {% now "jS F Y H:i" %}
+    """
+    bits = token.contents.split('"')
+    if len(bits) != 3:
+        raise TemplateSyntaxError, "'now' statement takes one argument"
+    format_string = bits[1]
+    return NowNode(format_string)
+now = register.tag(now)
+
+#@register.tag
+def regroup(parser, token):
+    """
+    Regroups a list of alike objects by a common attribute.
+
+    This complex tag is best illustrated by use of an example:  say that
+    ``people`` is a list of ``Person`` objects that have ``first_name``,
+    ``last_name``, and ``gender`` attributes, and you'd like to display a list
+    that looks like:
+
+        * Male:
+            * George Bush
+            * Bill Clinton
+        * Female:
+            * Margaret Thatcher
+            * Colendeeza Rice
+        * Unknown:
+            * Pat Smith
+
+    The following snippet of template code would accomplish this dubious task::
+
+        {% regroup people by gender as grouped %}
+        <ul>
+        {% for group in grouped %}
+            <li>{{ group.grouper }}
+            <ul>
+                {% for item in group.list %}
+                <li>{{ item }}</li>
+                {% endfor %}
+            </ul>
+        {% endfor %}
+        </ul>
+
+    As you can see, ``{% regroup %}`` populates a variable with a list of
+    objects with ``grouper`` and ``list`` attributes.  ``grouper`` contains the
+    item that was grouped by; ``list`` contains the list of objects that share
+    that ``grouper``.  In this case, ``grouper`` would be ``Male``, ``Female``
+    and ``Unknown``, and ``list`` is the list of people with those genders.
+
+    Note that `{% regroup %}`` does not work when the list to be grouped is not
+    sorted by the key you are grouping by!  This means that if your list of
+    people was not sorted by gender, you'd need to make sure it is sorted
+    before using it, i.e.::
+
+        {% regroup people|dictsort:"gender" by gender as grouped %}
+
+    """
+    firstbits = token.contents.split(None, 3)
+    if len(firstbits) != 4:
+        raise TemplateSyntaxError, "'regroup' tag takes five arguments"
+    target = parser.compile_filter(firstbits[1])
+    if firstbits[2] != 'by':
+        raise TemplateSyntaxError("second argument to 'regroup' tag must be 'by'")
+    lastbits_reversed = firstbits[3][::-1].split(None, 2)
+    if lastbits_reversed[1][::-1] != 'as':
+        raise TemplateSyntaxError("next-to-last argument to 'regroup' tag must"
+                                  " be 'as'")
+
+    expression = parser.compile_filter(lastbits_reversed[2][::-1])
+
+    var_name = lastbits_reversed[0][::-1]
+    return RegroupNode(target, expression, var_name)
+regroup = register.tag(regroup)
+
+def spaceless(parser, token):
+    """
+    Removes whitespace between HTML tags, including tab and newline characters.
+
+    Example usage::
+
+        {% spaceless %}
+            <p>
+                <a href="foo/">Foo</a>
+            </p>
+        {% endspaceless %}
+
+    This example would return this HTML::
+
+        <p><a href="foo/">Foo</a></p>
+
+    Only space between *tags* is normalized -- not space between tags and text.
+    In this example, the space around ``Hello`` won't be stripped::
+
+        {% spaceless %}
+            <strong>
+                Hello
+            </strong>
+        {% endspaceless %}
+    """
+    nodelist = parser.parse(('endspaceless',))
+    parser.delete_first_token()
+    return SpacelessNode(nodelist)
+spaceless = register.tag(spaceless)
+
+#@register.tag
+def templatetag(parser, token):
+    """
+    Outputs one of the bits used to compose template tags.
+
+    Since the template system has no concept of "escaping", to display one of
+    the bits used in template tags, you must use the ``{% templatetag %}`` tag.
+
+    The argument tells which template bit to output:
+
+        ==================  =======
+        Argument            Outputs
+        ==================  =======
+        ``openblock``       ``{%``
+        ``closeblock``      ``%}``
+        ``openvariable``    ``{{``
+        ``closevariable``   ``}}``
+        ``openbrace``       ``{``
+        ``closebrace``      ``}``
+        ``opencomment``     ``{#``
+        ``closecomment``    ``#}``
+        ==================  =======
+    """
+    bits = token.contents.split()
+    if len(bits) != 2:
+        raise TemplateSyntaxError, "'templatetag' statement takes one argument"
+    tag = bits[1]
+    if tag not in TemplateTagNode.mapping:
+        raise TemplateSyntaxError("Invalid templatetag argument: '%s'."
+                                  " Must be one of: %s" %
+                                  (tag, TemplateTagNode.mapping.keys()))
+    return TemplateTagNode(tag)
+templatetag = register.tag(templatetag)
+
+def url(parser, token):
+    """
+    Returns an absolute URL matching given view with its parameters.
+
+    This is a way to define links that aren't tied to a particular URL
+    configuration::
+
+        {% url path.to.some_view arg1,arg2,name1=value1 %}
+
+    The first argument is a path to a view. It can be an absolute python path
+    or just ``app_name.view_name`` without the project name if the view is
+    located inside the project.  Other arguments are comma-separated values
+    that will be filled in place of positional and keyword arguments in the
+    URL. All arguments for the URL should be present.
+
+    For example if you have a view ``app_name.client`` taking client's id and
+    the corresponding line in a URLconf looks like this::
+
+        ('^client/(\d+)/$', 'app_name.client')
+
+    and this app's URLconf is included into the project's URLconf under some
+    path::
+
+        ('^clients/', include('project_name.app_name.urls'))
+
+    then in a template you can create a link for a certain client like this::
+
+        {% url app_name.client client.id %}
+
+    The URL will look like ``/clients/client/123/``.
+    """
+    bits = token.contents.split(' ', 2)
+    if len(bits) < 2:
+        raise TemplateSyntaxError("'%s' takes at least one argument"
+                                  " (path to a view)" % bits[0])
+    args = []
+    kwargs = {}
+    if len(bits) > 2:
+        for arg in bits[2].split(','):
+            if '=' in arg:
+                k, v = arg.split('=', 1)
+                k = k.strip()
+                kwargs[k] = parser.compile_filter(v)
+            else:
+                args.append(parser.compile_filter(arg))
+    return URLNode(bits[1], args, kwargs)
+url = register.tag(url)
+
+#@register.tag
+def widthratio(parser, token):
+    """
+    For creating bar charts and such, this tag calculates the ratio of a given
+    value to a maximum value, and then applies that ratio to a constant.
+
+    For example::
+
+        <img src='bar.gif' height='10' width='{% widthratio this_value max_value 100 %}' />
+
+    Above, if ``this_value`` is 175 and ``max_value`` is 200, the the image in
+    the above example will be 88 pixels wide (because 175/200 = .875;
+    .875 * 100 = 87.5 which is rounded up to 88).
+    """
+    bits = token.contents.split()
+    if len(bits) != 4:
+        raise TemplateSyntaxError("widthratio takes three arguments")
+    tag, this_value_expr, max_value_expr, max_width = bits
+    try:
+        max_width = int(max_width)
+    except ValueError:
+        raise TemplateSyntaxError("widthratio final argument must be an integer")
+    return WidthRatioNode(parser.compile_filter(this_value_expr),
+                          parser.compile_filter(max_value_expr), max_width)
+widthratio = register.tag(widthratio)
+
+#@register.tag
+def do_with(parser, token):
+    """
+    Adds a value to the context (inside of this block) for caching and easy
+    access.
+
+    For example::
+
+        {% with person.some_sql_method as total %}
+            {{ total }} object{{ total|pluralize }}
+        {% endwith %}
+    """
+    bits = list(token.split_contents())
+    if len(bits) != 4 or bits[2] != "as":
+        raise TemplateSyntaxError("%r expected format is 'value as name'" %
+                                  bits[0])
+    var = parser.compile_filter(bits[1])
+    name = bits[3]
+    nodelist = parser.parse(('endwith',))
+    parser.delete_first_token()
+    return WithNode(var, name, nodelist)
+do_with = register.tag('with', do_with)
diff --git a/webapp/django/template/loader.py b/webapp/django/template/loader.py
new file mode 100644
index 0000000..1d7d945
--- /dev/null
+++ b/webapp/django/template/loader.py
@@ -0,0 +1,119 @@
+# Wrapper for loading templates from storage of some sort (e.g. filesystem, database).
+#
+# This uses the TEMPLATE_LOADERS setting, which is a list of loaders to use.
+# Each loader is expected to have this interface:
+#
+#    callable(name, dirs=[])
+#
+# name is the template name.
+# dirs is an optional list of directories to search instead of TEMPLATE_DIRS.
+#
+# The loader should return a tuple of (template_source, path). The path returned
+# might be shown to the user for debugging purposes, so it should identify where
+# the template was loaded from.
+#
+# Each loader should have an "is_usable" attribute set. This is a boolean that
+# specifies whether the loader can be used in this Python installation. Each
+# loader is responsible for setting this when it's initialized.
+#
+# For example, the eggs loader (which is capable of loading templates from
+# Python eggs) sets is_usable to False if the "pkg_resources" module isn't
+# installed, because pkg_resources is necessary to read eggs.
+
+from django.core.exceptions import ImproperlyConfigured
+from django.template import Origin, Template, Context, TemplateDoesNotExist, add_to_builtins
+from django.conf import settings
+
+template_source_loaders = None
+
+class LoaderOrigin(Origin):
+    def __init__(self, display_name, loader, name, dirs):
+        super(LoaderOrigin, self).__init__(display_name)
+        self.loader, self.loadname, self.dirs = loader, name, dirs
+
+    def reload(self):
+        return self.loader(self.loadname, self.dirs)[0]
+
+def make_origin(display_name, loader, name, dirs):
+    if settings.TEMPLATE_DEBUG:
+        return LoaderOrigin(display_name, loader, name, dirs)
+    else:
+        return None
+
+def find_template_source(name, dirs=None):
+    # Calculate template_source_loaders the first time the function is executed
+    # because putting this logic in the module-level namespace may cause
+    # circular import errors. See Django ticket #1292.
+    global template_source_loaders
+    if template_source_loaders is None:
+        loaders = []
+        for path in settings.TEMPLATE_LOADERS:
+            i = path.rfind('.')
+            module, attr = path[:i], path[i+1:]
+            try:
+                mod = __import__(module, globals(), locals(), [attr])
+            except ImportError, e:
+                raise ImproperlyConfigured, 'Error importing template source loader %s: "%s"' % (module, e)
+            try:
+                func = getattr(mod, attr)
+            except AttributeError:
+                raise ImproperlyConfigured, 'Module "%s" does not define a "%s" callable template source loader' % (module, attr)
+            if not func.is_usable:
+                import warnings
+                warnings.warn("Your TEMPLATE_LOADERS setting includes %r, but your Python installation doesn't support that type of template loading. Consider removing that line from TEMPLATE_LOADERS." % path)
+            else:
+                loaders.append(func)
+        template_source_loaders = tuple(loaders)
+    for loader in template_source_loaders:
+        try:
+            source, display_name = loader(name, dirs)
+            return (source, make_origin(display_name, loader, name, dirs))
+        except TemplateDoesNotExist:
+            pass
+    raise TemplateDoesNotExist, name
+
+def get_template(template_name):
+    """
+    Returns a compiled Template object for the given template name,
+    handling template inheritance recursively.
+    """
+    source, origin = find_template_source(template_name)
+    template = get_template_from_string(source, origin, template_name)
+    return template
+
+def get_template_from_string(source, origin=None, name=None):
+    """
+    Returns a compiled Template object for the given template code,
+    handling template inheritance recursively.
+    """
+    return Template(source, origin, name)
+
+def render_to_string(template_name, dictionary=None, context_instance=None):
+    """
+    Loads the given template_name and renders it with the given dictionary as
+    context. The template_name may be a string to load a single template using
+    get_template, or it may be a tuple to use select_template to find one of
+    the templates in the list. Returns a string.
+    """
+    dictionary = dictionary or {}
+    if isinstance(template_name, (list, tuple)):
+        t = select_template(template_name)
+    else:
+        t = get_template(template_name)
+    if context_instance:
+        context_instance.update(dictionary)
+    else:
+        context_instance = Context(dictionary)
+    return t.render(context_instance)
+
+def select_template(template_name_list):
+    "Given a list of template names, returns the first that can be loaded."
+    for template_name in template_name_list:
+        try:
+            return get_template(template_name)
+        except TemplateDoesNotExist:
+            continue
+    # If we get here, none of the templates could be loaded
+    raise TemplateDoesNotExist, ', '.join(template_name_list)
+
+add_to_builtins('django.template.loader_tags')
diff --git a/webapp/django/template/loader_tags.py b/webapp/django/template/loader_tags.py
new file mode 100644
index 0000000..38b2fff
--- /dev/null
+++ b/webapp/django/template/loader_tags.py
@@ -0,0 +1,192 @@
+from django.template import TemplateSyntaxError, TemplateDoesNotExist, Variable
+from django.template import Library, Node, TextNode
+from django.template.loader import get_template, get_template_from_string, find_template_source
+from django.conf import settings
+from django.utils.safestring import mark_safe
+
+register = Library()
+
+class ExtendsError(Exception):
+    pass
+
+class BlockNode(Node):
+    def __init__(self, name, nodelist, parent=None):
+        self.name, self.nodelist, self.parent = name, nodelist, parent
+
+    def __repr__(self):
+        return "<Block Node: %s. Contents: %r>" % (self.name, self.nodelist)
+
+    def render(self, context):
+        context.push()
+        # Save context in case of block.super().
+        self.context = context
+        context['block'] = self
+        result = self.nodelist.render(context)
+        context.pop()
+        return result
+
+    def super(self):
+        if self.parent:
+            return mark_safe(self.parent.render(self.context))
+        return ''
+
+    def add_parent(self, nodelist):
+        if self.parent:
+            self.parent.add_parent(nodelist)
+        else:
+            self.parent = BlockNode(self.name, nodelist)
+
+class ExtendsNode(Node):
+    must_be_first = True
+
+    def __init__(self, nodelist, parent_name, parent_name_expr, template_dirs=None):
+        self.nodelist = nodelist
+        self.parent_name, self.parent_name_expr = parent_name, parent_name_expr
+        self.template_dirs = template_dirs
+
+    def __repr__(self):
+        if self.parent_name_expr:
+            return "<ExtendsNode: extends %s>" % self.parent_name_expr.token
+        return '<ExtendsNode: extends "%s">' % self.parent_name
+
+    def get_parent(self, context):
+        if self.parent_name_expr:
+            self.parent_name = self.parent_name_expr.resolve(context)
+        parent = self.parent_name
+        if not parent:
+            error_msg = "Invalid template name in 'extends' tag: %r." % parent
+            if self.parent_name_expr:
+                error_msg += " Got this from the '%s' variable." % self.parent_name_expr.token
+            raise TemplateSyntaxError, error_msg
+        if hasattr(parent, 'render'):
+            return parent # parent is a Template object
+        try:
+            source, origin = find_template_source(parent, self.template_dirs)
+        except TemplateDoesNotExist:
+            raise TemplateSyntaxError, "Template %r cannot be extended, because it doesn't exist" % parent
+        else:
+            return get_template_from_string(source, origin, parent)
+
+    def render(self, context):
+        compiled_parent = self.get_parent(context)
+        parent_blocks = dict([(n.name, n) for n in compiled_parent.nodelist.get_nodes_by_type(BlockNode)])
+        for block_node in self.nodelist.get_nodes_by_type(BlockNode):
+            # Check for a BlockNode with this node's name, and replace it if found.
+            try:
+                parent_block = parent_blocks[block_node.name]
+            except KeyError:
+                # This BlockNode wasn't found in the parent template, but the
+                # parent block might be defined in the parent's *parent*, so we
+                # add this BlockNode to the parent's ExtendsNode nodelist, so
+                # it'll be checked when the parent node's render() is called.
+
+                # Find out if the parent template has a parent itself
+                for node in compiled_parent.nodelist:
+                    if not isinstance(node, TextNode):
+                        # If the first non-text node is an extends, handle it.
+                        if isinstance(node, ExtendsNode):
+                            node.nodelist.append(block_node)
+                        # Extends must be the first non-text node, so once you find
+                        # the first non-text node you can stop looking. 
+                        break
+            else:
+                # Keep any existing parents and add a new one. Used by BlockNode.
+                parent_block.parent = block_node.parent
+                parent_block.add_parent(parent_block.nodelist)
+                parent_block.nodelist = block_node.nodelist
+        return compiled_parent.render(context)
+
+class ConstantIncludeNode(Node):
+    def __init__(self, template_path):
+        try:
+            t = get_template(template_path)
+            self.template = t
+        except:
+            if settings.TEMPLATE_DEBUG:
+                raise
+            self.template = None
+
+    def render(self, context):
+        if self.template:
+            return self.template.render(context)
+        else:
+            return ''
+
+class IncludeNode(Node):
+    def __init__(self, template_name):
+        self.template_name = Variable(template_name)
+
+    def render(self, context):
+        try:
+            template_name = self.template_name.resolve(context)
+            t = get_template(template_name)
+            return t.render(context)
+        except TemplateSyntaxError, e:
+            if settings.TEMPLATE_DEBUG:
+                raise
+            return ''
+        except:
+            return '' # Fail silently for invalid included templates.
+
+def do_block(parser, token):
+    """
+    Define a block that can be overridden by child templates.
+    """
+    bits = token.contents.split()
+    if len(bits) != 2:
+        raise TemplateSyntaxError, "'%s' tag takes only one argument" % bits[0]
+    block_name = bits[1]
+    # Keep track of the names of BlockNodes found in this template, so we can
+    # check for duplication.
+    try:
+        if block_name in parser.__loaded_blocks:
+            raise TemplateSyntaxError, "'%s' tag with name '%s' appears more than once" % (bits[0], block_name)
+        parser.__loaded_blocks.append(block_name)
+    except AttributeError: # parser.__loaded_blocks isn't a list yet
+        parser.__loaded_blocks = [block_name]
+    nodelist = parser.parse(('endblock', 'endblock %s' % block_name))
+    parser.delete_first_token()
+    return BlockNode(block_name, nodelist)
+
+def do_extends(parser, token):
+    """
+    Signal that this template extends a parent template.
+
+    This tag may be used in two ways: ``{% extends "base" %}`` (with quotes)
+    uses the literal value "base" as the name of the parent template to extend,
+    or ``{% extends variable %}`` uses the value of ``variable`` as either the
+    name of the parent template to extend (if it evaluates to a string) or as
+    the parent tempate itelf (if it evaluates to a Template object).
+    """
+    bits = token.contents.split()
+    if len(bits) != 2:
+        raise TemplateSyntaxError, "'%s' takes one argument" % bits[0]
+    parent_name, parent_name_expr = None, None
+    if bits[1][0] in ('"', "'") and bits[1][-1] == bits[1][0]:
+        parent_name = bits[1][1:-1]
+    else:
+        parent_name_expr = parser.compile_filter(bits[1])
+    nodelist = parser.parse()
+    if nodelist.get_nodes_by_type(ExtendsNode):
+        raise TemplateSyntaxError, "'%s' cannot appear more than once in the same template" % bits[0]
+    return ExtendsNode(nodelist, parent_name, parent_name_expr)
+
+def do_include(parser, token):
+    """
+    Loads a template and renders it with the current context.
+
+    Example::
+
+        {% include "foo/some_include" %}
+    """
+    bits = token.contents.split()
+    if len(bits) != 2:
+        raise TemplateSyntaxError, "%r tag takes one argument: the name of the template to be included" % bits[0]
+    path = bits[1]
+    if path[0] in ('"', "'") and path[-1] == path[0]:
+        return ConstantIncludeNode(path[1:-1])
+    return IncludeNode(bits[1])
+
+register.tag('block', do_block)
+register.tag('extends', do_extends)
+register.tag('include', do_include)
diff --git a/webapp/django/template/loaders/__init__.py b/webapp/django/template/loaders/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/template/loaders/__init__.py
diff --git a/webapp/django/template/loaders/app_directories.py b/webapp/django/template/loaders/app_directories.py
new file mode 100644
index 0000000..f0f4b1a
--- /dev/null
+++ b/webapp/django/template/loaders/app_directories.py
@@ -0,0 +1,52 @@
+"""
+Wrapper for loading templates from "template" directories in INSTALLED_APPS
+packages.
+"""
+
+import os
+
+from django.conf import settings
+from django.core.exceptions import ImproperlyConfigured
+from django.template import TemplateDoesNotExist
+from django.utils._os import safe_join
+
+# At compile time, cache the directories to search.
+app_template_dirs = []
+for app in settings.INSTALLED_APPS:
+    i = app.rfind('.')
+    if i == -1:
+        m, a = app, None
+    else:
+        m, a = app[:i], app[i+1:]
+    try:
+        if a is None:
+            mod = __import__(m, {}, {}, [])
+        else:
+            mod = getattr(__import__(m, {}, {}, [a]), a)
+    except ImportError, e:
+        raise ImproperlyConfigured, 'ImportError %s: %s' % (app, e.args[0])
+    template_dir = os.path.join(os.path.dirname(mod.__file__), 'templates')
+    if os.path.isdir(template_dir):
+        app_template_dirs.append(template_dir)
+
+# It won't change, so convert it to a tuple to save memory.
+app_template_dirs = tuple(app_template_dirs)
+
+def get_template_sources(template_name, template_dirs=None):
+    if not template_dirs:
+        template_dirs = app_template_dirs
+    for template_dir in template_dirs:
+        try:
+            yield safe_join(template_dir, template_name)
+        except ValueError:
+            # The joined path was located outside of template_dir.
+            pass
+
+def load_template_source(template_name, template_dirs=None):
+    for filepath in get_template_sources(template_name, template_dirs):
+        try:
+            return (open(filepath).read().decode(settings.FILE_CHARSET), filepath)
+        except IOError:
+            pass
+    raise TemplateDoesNotExist, template_name
+load_template_source.is_usable = True
diff --git a/webapp/django/template/loaders/eggs.py b/webapp/django/template/loaders/eggs.py
new file mode 100644
index 0000000..946c2b4
--- /dev/null
+++ b/webapp/django/template/loaders/eggs.py
@@ -0,0 +1,25 @@
+# Wrapper for loading templates from eggs via pkg_resources.resource_string.
+
+try:
+    from pkg_resources import resource_string
+except ImportError:
+    resource_string = None
+
+from django.template import TemplateDoesNotExist
+from django.conf import settings
+
+def load_template_source(template_name, template_dirs=None):
+    """
+    Loads templates from Python eggs via pkg_resource.resource_string.
+
+    For every installed app, it tries to get the resource (app, template_name).
+    """
+    if resource_string is not None:
+        pkg_name = 'templates/' + template_name
+        for app in settings.INSTALLED_APPS:
+            try:
+                return (resource_string(app, pkg_name).decode(settings.FILE_CHARSET), 'egg:%s:%s' % (app, pkg_name))
+            except:
+                pass
+    raise TemplateDoesNotExist, template_name
+load_template_source.is_usable = resource_string is not None
diff --git a/webapp/django/template/loaders/filesystem.py b/webapp/django/template/loaders/filesystem.py
new file mode 100644
index 0000000..9997eb9
--- /dev/null
+++ b/webapp/django/template/loaders/filesystem.py
@@ -0,0 +1,31 @@
+"""
+Wrapper for loading templates from the filesystem.
+"""
+
+from django.conf import settings
+from django.template import TemplateDoesNotExist
+from django.utils._os import safe_join
+
+def get_template_sources(template_name, template_dirs=None):
+    if not template_dirs:
+        template_dirs = settings.TEMPLATE_DIRS
+    for template_dir in template_dirs:
+        try:
+            yield safe_join(template_dir, template_name)
+        except ValueError:
+            # The joined path was located outside of template_dir.
+            pass
+
+def load_template_source(template_name, template_dirs=None):
+    tried = []
+    for filepath in get_template_sources(template_name, template_dirs):
+        try:
+            return (open(filepath).read().decode(settings.FILE_CHARSET), filepath)
+        except IOError:
+            tried.append(filepath)
+    if tried:
+        error_msg = "Tried %s" % tried
+    else:
+        error_msg = "Your TEMPLATE_DIRS setting is empty. Change it to point to at least one template directory."
+    raise TemplateDoesNotExist, error_msg
+load_template_source.is_usable = True
diff --git a/webapp/django/templatetags/__init__.py b/webapp/django/templatetags/__init__.py
new file mode 100644
index 0000000..9204535
--- /dev/null
+++ b/webapp/django/templatetags/__init__.py
@@ -0,0 +1,7 @@
+from django.conf import settings
+
+for a in settings.INSTALLED_APPS:
+    try:
+        __path__.extend(__import__(a + '.templatetags', {}, {}, ['']).__path__)
+    except ImportError:
+        pass
diff --git a/webapp/django/templatetags/cache.py b/webapp/django/templatetags/cache.py
new file mode 100644
index 0000000..9c6ca76
--- /dev/null
+++ b/webapp/django/templatetags/cache.py
@@ -0,0 +1,61 @@
+from django.template import Library, Node, TemplateSyntaxError, Variable, VariableDoesNotExist
+from django.template import resolve_variable
+from django.core.cache import cache
+from django.utils.encoding import force_unicode
+from django.utils.http import urlquote
+
+register = Library()
+
+class CacheNode(Node):
+    def __init__(self, nodelist, expire_time_var, fragment_name, vary_on):
+        self.nodelist = nodelist
+        self.expire_time_var = Variable(expire_time_var)
+        self.fragment_name = fragment_name
+        self.vary_on = vary_on
+
+    def render(self, context):
+        try:
+            expire_time = self.expire_time_var.resolve(context)
+        except VariableDoesNotExist:
+            raise TemplateSyntaxError('"cache" tag got an unknkown variable: %r' % self.expire_time_var.var)
+        try:
+            expire_time = int(expire_time)
+        except (ValueError, TypeError):
+            raise TemplateSyntaxError('"cache" tag got a non-integer timeout value: %r' % expire_time)
+        # Build a unicode key for this fragment and all vary-on's.
+        cache_key = u':'.join([self.fragment_name] + [urlquote(resolve_variable(var, context)) for var in self.vary_on])
+        value = cache.get(cache_key)
+        if value is None:
+            value = self.nodelist.render(context)
+            cache.set(cache_key, value, expire_time)
+        return value
+
+def do_cache(parser, token):
+    """
+    This will cache the contents of a template fragment for a given amount
+    of time.
+
+    Usage::
+
+        {% load cache %}
+        {% cache [expire_time] [fragment_name] %}
+            .. some expensive processing ..
+        {% endcache %}
+
+    This tag also supports varying by a list of arguments::
+
+        {% load cache %}
+        {% cache [expire_time] [fragment_name] [var1] [var2] .. %}
+            .. some expensive processing ..
+        {% endcache %}
+
+    Each unique set of arguments will result in a unique cache entry.
+    """
+    nodelist = parser.parse(('endcache',))
+    parser.delete_first_token()
+    tokens = token.contents.split()
+    if len(tokens) < 3:
+        raise TemplateSyntaxError(u"'%r' tag requires at least 2 arguments." % tokens[0])
+    return CacheNode(nodelist, tokens[1], tokens[2], tokens[3:])
+
+register.tag('cache', do_cache)
diff --git a/webapp/django/templatetags/i18n.py b/webapp/django/templatetags/i18n.py
new file mode 100644
index 0000000..190cb70
--- /dev/null
+++ b/webapp/django/templatetags/i18n.py
@@ -0,0 +1,259 @@
+import re
+
+from django.template import Node, Variable, VariableNode
+from django.template import TemplateSyntaxError, TokenParser, Library
+from django.template import TOKEN_TEXT, TOKEN_VAR
+from django.utils import translation
+from django.utils.encoding import force_unicode
+
+register = Library()
+
+class GetAvailableLanguagesNode(Node):
+    def __init__(self, variable):
+        self.variable = variable
+
+    def render(self, context):
+        from django.conf import settings
+        context[self.variable] = [(k, translation.ugettext(v)) for k, v in settings.LANGUAGES]
+        return ''
+
+class GetCurrentLanguageNode(Node):
+    def __init__(self, variable):
+        self.variable = variable
+
+    def render(self, context):
+        context[self.variable] = translation.get_language()
+        return ''
+
+class GetCurrentLanguageBidiNode(Node):
+    def __init__(self, variable):
+        self.variable = variable
+
+    def render(self, context):
+        context[self.variable] = translation.get_language_bidi()
+        return ''
+
+class TranslateNode(Node):
+    def __init__(self, value, noop):
+        self.value = Variable(value)
+        self.noop = noop
+
+    def render(self, context):
+        value = self.value.resolve(context)
+        if self.noop:
+            return value
+        else:
+            return translation.ugettext(value)
+
+class BlockTranslateNode(Node):
+    def __init__(self, extra_context, singular, plural=None, countervar=None,
+            counter=None):
+        self.extra_context = extra_context
+        self.singular = singular
+        self.plural = plural
+        self.countervar = countervar
+        self.counter = counter
+
+    def render_token_list(self, tokens):
+        result = []
+        vars = []
+        for token in tokens:
+            if token.token_type == TOKEN_TEXT:
+                result.append(token.contents)
+            elif token.token_type == TOKEN_VAR:
+                result.append(u'%%(%s)s' % token.contents)
+                vars.append(token.contents)
+        return ''.join(result), vars
+
+    def render(self, context):
+        tmp_context = {}
+        for var, val in self.extra_context.items():
+            tmp_context[var] = val.render(context)
+        # Update() works like a push(), so corresponding context.pop() is at
+        # the end of function
+        context.update(tmp_context)
+        singular, vars = self.render_token_list(self.singular)
+        if self.plural and self.countervar and self.counter:
+            count = self.counter.resolve(context)
+            context[self.countervar] = count
+            plural, vars = self.render_token_list(self.plural)
+            result = translation.ungettext(singular, plural, count)
+        else:
+            result = translation.ugettext(singular)
+        # Escape all isolated '%' before substituting in the context.
+        result = re.sub(u'%(?!\()', u'%%', result)
+        data = dict([(v, force_unicode(context[v])) for v in vars])
+        context.pop()
+        return result % data
+
+def do_get_available_languages(parser, token):
+    """
+    This will store a list of available languages
+    in the context.
+
+    Usage::
+
+        {% get_available_languages as languages %}
+        {% for language in languages %}
+        ...
+        {% endfor %}
+
+    This will just pull the LANGUAGES setting from
+    your setting file (or the default settings) and
+    put it into the named variable.
+    """
+    args = token.contents.split()
+    if len(args) != 3 or args[1] != 'as':
+        raise TemplateSyntaxError, "'get_available_languages' requires 'as variable' (got %r)" % args
+    return GetAvailableLanguagesNode(args[2])
+
+def do_get_current_language(parser, token):
+    """
+    This will store the current language in the context.
+
+    Usage::
+
+        {% get_current_language as language %}
+
+    This will fetch the currently active language and
+    put it's value into the ``language`` context
+    variable.
+    """
+    args = token.contents.split()
+    if len(args) != 3 or args[1] != 'as':
+        raise TemplateSyntaxError, "'get_current_language' requires 'as variable' (got %r)" % args
+    return GetCurrentLanguageNode(args[2])
+
+def do_get_current_language_bidi(parser, token):
+    """
+    This will store the current language layout in the context.
+
+    Usage::
+
+        {% get_current_language_bidi as bidi %}
+
+    This will fetch the currently active language's layout and
+    put it's value into the ``bidi`` context variable.
+    True indicates right-to-left layout, otherwise left-to-right
+    """
+    args = token.contents.split()
+    if len(args) != 3 or args[1] != 'as':
+        raise TemplateSyntaxError, "'get_current_language_bidi' requires 'as variable' (got %r)" % args
+    return GetCurrentLanguageBidiNode(args[2])
+
+def do_translate(parser, token):
+    """
+    This will mark a string for translation and will
+    translate the string for the current language.
+
+    Usage::
+
+        {% trans "this is a test" %}
+
+    This will mark the string for translation so it will
+    be pulled out by mark-messages.py into the .po files
+    and will run the string through the translation engine.
+
+    There is a second form::
+
+        {% trans "this is a test" noop %}
+
+    This will only mark for translation, but will return
+    the string unchanged. Use it when you need to store
+    values into forms that should be translated later on.
+
+    You can use variables instead of constant strings
+    to translate stuff you marked somewhere else::
+
+        {% trans variable %}
+
+    This will just try to translate the contents of
+    the variable ``variable``. Make sure that the string
+    in there is something that is in the .po file.
+    """
+    class TranslateParser(TokenParser):
+        def top(self):
+            value = self.value()
+            if self.more():
+                if self.tag() == 'noop':
+                    noop = True
+                else:
+                    raise TemplateSyntaxError, "only option for 'trans' is 'noop'"
+            else:
+                noop = False
+            return (value, noop)
+    value, noop = TranslateParser(token.contents).top()
+    return TranslateNode(value, noop)
+
+def do_block_translate(parser, token):
+    """
+    This will translate a block of text with parameters.
+
+    Usage::
+
+        {% blocktrans with foo|filter as bar and baz|filter as boo %}
+        This is {{ bar }} and {{ boo }}.
+        {% endblocktrans %}
+
+    Additionally, this supports pluralization::
+
+        {% blocktrans count var|length as count %}
+        There is {{ count }} object.
+        {% plural %}
+        There are {{ count }} objects.
+        {% endblocktrans %}
+
+    This is much like ngettext, only in template syntax.
+    """
+    class BlockTranslateParser(TokenParser):
+        def top(self):
+            countervar = None
+            counter = None
+            extra_context = {}
+            while self.more():
+                tag = self.tag()
+                if tag == 'with' or tag == 'and':
+                    value = self.value()
+                    if self.tag() != 'as':
+                        raise TemplateSyntaxError, "variable bindings in 'blocktrans' must be 'with value as variable'"
+                    extra_context[self.tag()] = VariableNode(
+                            parser.compile_filter(value))
+                elif tag == 'count':
+                    counter = parser.compile_filter(self.value())
+                    if self.tag() != 'as':
+                        raise TemplateSyntaxError, "counter specification in 'blocktrans' must be 'count value as variable'"
+                    countervar = self.tag()
+                else:
+                    raise TemplateSyntaxError, "unknown subtag %s for 'blocktrans' found" % tag
+            return (countervar, counter, extra_context)
+
+    countervar, counter, extra_context = BlockTranslateParser(token.contents).top()
+
+    singular = []
+    plural = []
+    while parser.tokens:
+        token = parser.next_token()
+        if token.token_type in (TOKEN_VAR, TOKEN_TEXT):
+            singular.append(token)
+        else:
+            break
+    if countervar and counter:
+        if token.contents.strip() != 'plural':
+            raise TemplateSyntaxError, "'blocktrans' doesn't allow other block tags inside it"
+        while parser.tokens:
+            token = parser.next_token()
+            if token.token_type in (TOKEN_VAR, TOKEN_TEXT):
+                plural.append(token)
+            else:
+                break
+    if token.contents.strip() != 'endblocktrans':
+        raise TemplateSyntaxError, "'blocktrans' doesn't allow other block tags (seen %r) inside it" % token.contents
+
+    return BlockTranslateNode(extra_context, singular, plural, countervar,
+            counter)
+
+register.tag('get_available_languages', do_get_available_languages)
+register.tag('get_current_language', do_get_current_language)
+register.tag('get_current_language_bidi', do_get_current_language_bidi)
+register.tag('trans', do_translate)
+register.tag('blocktrans', do_block_translate)
diff --git a/webapp/django/test/__init__.py b/webapp/django/test/__init__.py
new file mode 100644
index 0000000..554e72b
--- /dev/null
+++ b/webapp/django/test/__init__.py
@@ -0,0 +1,6 @@
+"""
+Django Unit Test and Doctest framework.
+"""
+
+from django.test.client import Client
+from django.test.testcases import TestCase
diff --git a/webapp/django/test/_doctest.py b/webapp/django/test/_doctest.py
new file mode 100644
index 0000000..a56483c
--- /dev/null
+++ b/webapp/django/test/_doctest.py
@@ -0,0 +1,2693 @@
+# This is a slightly modified version of the doctest.py that shipped with Python 2.4
+# It incorporates changes that have been submitted the the Python ticket tracker
+# as ticket #1521051. These changes allow for a DoctestRunner and Doctest base
+# class to be specified when constructing a DoctestSuite.
+
+# Module doctest.
+# Released to the public domain 16-Jan-2001, by Tim Peters (tim@python.org).
+# Major enhancements and refactoring by:
+#     Jim Fulton
+#     Edward Loper
+
+# Provided as-is; use at your own risk; no warranty; no promises; enjoy!
+
+r"""Module doctest -- a framework for running examples in docstrings.
+
+In simplest use, end each module M to be tested with:
+
+def _test():
+    import doctest
+    doctest.testmod()
+
+if __name__ == "__main__":
+    _test()
+
+Then running the module as a script will cause the examples in the
+docstrings to get executed and verified:
+
+python M.py
+
+This won't display anything unless an example fails, in which case the
+failing example(s) and the cause(s) of the failure(s) are printed to stdout
+(why not stderr? because stderr is a lame hack <0.2 wink>), and the final
+line of output is "Test failed.".
+
+Run it with the -v switch instead:
+
+python M.py -v
+
+and a detailed report of all examples tried is printed to stdout, along
+with assorted summaries at the end.
+
+You can force verbose mode by passing "verbose=True" to testmod, or prohibit
+it by passing "verbose=False".  In either of those cases, sys.argv is not
+examined by testmod.
+
+There are a variety of other ways to run doctests, including integration
+with the unittest framework, and support for running non-Python text
+files containing doctests.  There are also many ways to override parts
+of doctest's default behaviors.  See the Library Reference Manual for
+details.
+"""
+
+__docformat__ = 'reStructuredText en'
+
+__all__ = [
+    # 0, Option Flags
+    'register_optionflag',
+    'DONT_ACCEPT_TRUE_FOR_1',
+    'DONT_ACCEPT_BLANKLINE',
+    'NORMALIZE_WHITESPACE',
+    'ELLIPSIS',
+    'IGNORE_EXCEPTION_DETAIL',
+    'COMPARISON_FLAGS',
+    'REPORT_UDIFF',
+    'REPORT_CDIFF',
+    'REPORT_NDIFF',
+    'REPORT_ONLY_FIRST_FAILURE',
+    'REPORTING_FLAGS',
+    # 1. Utility Functions
+    'is_private',
+    # 2. Example & DocTest
+    'Example',
+    'DocTest',
+    # 3. Doctest Parser
+    'DocTestParser',
+    # 4. Doctest Finder
+    'DocTestFinder',
+    # 5. Doctest Runner
+    'DocTestRunner',
+    'OutputChecker',
+    'DocTestFailure',
+    'UnexpectedException',
+    'DebugRunner',
+    # 6. Test Functions
+    'testmod',
+    'testfile',
+    'run_docstring_examples',
+    # 7. Tester
+    'Tester',
+    # 8. Unittest Support
+    'DocTestSuite',
+    'DocFileSuite',
+    'set_unittest_reportflags',
+    # 9. Debugging Support
+    'script_from_examples',
+    'testsource',
+    'debug_src',
+    'debug',
+]
+
+import __future__
+
+import sys, traceback, inspect, linecache, os, re
+import unittest, difflib, pdb, tempfile
+import warnings
+from StringIO import StringIO
+
+if sys.platform.startswith('java'):
+    # On Jython, isclass() reports some modules as classes. Patch it.
+    def patch_isclass(isclass):
+        def patched_isclass(obj):
+            return isclass(obj) and hasattr(obj, '__module__')
+        return patched_isclass
+    inspect.isclass = patch_isclass(inspect.isclass)
+
+# Don't whine about the deprecated is_private function in this
+# module's tests.
+warnings.filterwarnings("ignore", "is_private", DeprecationWarning,
+                        __name__, 0)
+
+# There are 4 basic classes:
+#  - Example: a <source, want> pair, plus an intra-docstring line number.
+#  - DocTest: a collection of examples, parsed from a docstring, plus
+#    info about where the docstring came from (name, filename, lineno).
+#  - DocTestFinder: extracts DocTests from a given object's docstring and
+#    its contained objects' docstrings.
+#  - DocTestRunner: runs DocTest cases, and accumulates statistics.
+#
+# So the basic picture is:
+#
+#                             list of:
+# +------+                   +---------+                   +-------+
+# |object| --DocTestFinder-> | DocTest | --DocTestRunner-> |results|
+# +------+                   +---------+                   +-------+
+#                            | Example |
+#                            |   ...   |
+#                            | Example |
+#                            +---------+
+
+# Option constants.
+
+OPTIONFLAGS_BY_NAME = {}
+def register_optionflag(name):
+    flag = 1 << len(OPTIONFLAGS_BY_NAME)
+    OPTIONFLAGS_BY_NAME[name] = flag
+    return flag
+
+DONT_ACCEPT_TRUE_FOR_1 = register_optionflag('DONT_ACCEPT_TRUE_FOR_1')
+DONT_ACCEPT_BLANKLINE = register_optionflag('DONT_ACCEPT_BLANKLINE')
+NORMALIZE_WHITESPACE = register_optionflag('NORMALIZE_WHITESPACE')
+ELLIPSIS = register_optionflag('ELLIPSIS')
+IGNORE_EXCEPTION_DETAIL = register_optionflag('IGNORE_EXCEPTION_DETAIL')
+
+COMPARISON_FLAGS = (DONT_ACCEPT_TRUE_FOR_1 |
+                    DONT_ACCEPT_BLANKLINE |
+                    NORMALIZE_WHITESPACE |
+                    ELLIPSIS |
+                    IGNORE_EXCEPTION_DETAIL)
+
+REPORT_UDIFF = register_optionflag('REPORT_UDIFF')
+REPORT_CDIFF = register_optionflag('REPORT_CDIFF')
+REPORT_NDIFF = register_optionflag('REPORT_NDIFF')
+REPORT_ONLY_FIRST_FAILURE = register_optionflag('REPORT_ONLY_FIRST_FAILURE')
+
+REPORTING_FLAGS = (REPORT_UDIFF |
+                   REPORT_CDIFF |
+                   REPORT_NDIFF |
+                   REPORT_ONLY_FIRST_FAILURE)
+
+# Special string markers for use in `want` strings:
+BLANKLINE_MARKER = '<BLANKLINE>'
+ELLIPSIS_MARKER = '...'
+
+######################################################################
+## Table of Contents
+######################################################################
+#  1. Utility Functions
+#  2. Example & DocTest -- store test cases
+#  3. DocTest Parser -- extracts examples from strings
+#  4. DocTest Finder -- extracts test cases from objects
+#  5. DocTest Runner -- runs test cases
+#  6. Test Functions -- convenient wrappers for testing
+#  7. Tester Class -- for backwards compatibility
+#  8. Unittest Support
+#  9. Debugging Support
+# 10. Example Usage
+
+######################################################################
+## 1. Utility Functions
+######################################################################
+
+def is_private(prefix, base):
+    """prefix, base -> true iff name prefix + "." + base is "private".
+
+    Prefix may be an empty string, and base does not contain a period.
+    Prefix is ignored (although functions you write conforming to this
+    protocol may make use of it).
+    Return true iff base begins with an (at least one) underscore, but
+    does not both begin and end with (at least) two underscores.
+
+    >>> is_private("a.b", "my_func")
+    False
+    >>> is_private("____", "_my_func")
+    True
+    >>> is_private("someclass", "__init__")
+    False
+    >>> is_private("sometypo", "__init_")
+    True
+    >>> is_private("x.y.z", "_")
+    True
+    >>> is_private("_x.y.z", "__")
+    False
+    >>> is_private("", "")  # senseless but consistent
+    False
+    """
+    warnings.warn("is_private is deprecated; it wasn't useful; "
+                  "examine DocTestFinder.find() lists instead",
+                  DeprecationWarning, stacklevel=2)
+    return base[:1] == "_" and not base[:2] == "__" == base[-2:]
+
+def _extract_future_flags(globs):
+    """
+    Return the compiler-flags associated with the future features that
+    have been imported into the given namespace (globs).
+    """
+    flags = 0
+    for fname in __future__.all_feature_names:
+        feature = globs.get(fname, None)
+        if feature is getattr(__future__, fname):
+            flags |= feature.compiler_flag
+    return flags
+
+def _normalize_module(module, depth=2):
+    """
+    Return the module specified by `module`.  In particular:
+      - If `module` is a module, then return module.
+      - If `module` is a string, then import and return the
+        module with that name.
+      - If `module` is None, then return the calling module.
+        The calling module is assumed to be the module of
+        the stack frame at the given depth in the call stack.
+    """
+    if inspect.ismodule(module):
+        return module
+    elif isinstance(module, (str, unicode)):
+        return __import__(module, globals(), locals(), ["*"])
+    elif module is None:
+        return sys.modules[sys._getframe(depth).f_globals['__name__']]
+    else:
+        raise TypeError("Expected a module, string, or None")
+
+def _indent(s, indent=4):
+    """
+    Add the given number of space characters to the beginning every
+    non-blank line in `s`, and return the result.
+    """
+    # This regexp matches the start of non-blank lines:
+    return re.sub('(?m)^(?!$)', indent*' ', s)
+
+def _exception_traceback(exc_info):
+    """
+    Return a string containing a traceback message for the given
+    exc_info tuple (as returned by sys.exc_info()).
+    """
+    # Get a traceback message.
+    excout = StringIO()
+    exc_type, exc_val, exc_tb = exc_info
+    traceback.print_exception(exc_type, exc_val, exc_tb, file=excout)
+    return excout.getvalue()
+
+# Override some StringIO methods.
+class _SpoofOut(StringIO):
+    def getvalue(self):
+        result = StringIO.getvalue(self)
+        # If anything at all was written, make sure there's a trailing
+        # newline.  There's no way for the expected output to indicate
+        # that a trailing newline is missing.
+        if result and not result.endswith("\n"):
+            result += "\n"
+        # Prevent softspace from screwing up the next test case, in
+        # case they used print with a trailing comma in an example.
+        if hasattr(self, "softspace"):
+            del self.softspace
+        return result
+
+    def truncate(self,   size=None):
+        StringIO.truncate(self, size)
+        if hasattr(self, "softspace"):
+            del self.softspace
+
+# Worst-case linear-time ellipsis matching.
+def _ellipsis_match(want, got):
+    """
+    Essentially the only subtle case:
+    >>> _ellipsis_match('aa...aa', 'aaa')
+    False
+    """
+    if ELLIPSIS_MARKER not in want:
+        return want == got
+
+    # Find "the real" strings.
+    ws = want.split(ELLIPSIS_MARKER)
+    assert len(ws) >= 2
+
+    # Deal with exact matches possibly needed at one or both ends.
+    startpos, endpos = 0, len(got)
+    w = ws[0]
+    if w:   # starts with exact match
+        if got.startswith(w):
+            startpos = len(w)
+            del ws[0]
+        else:
+            return False
+    w = ws[-1]
+    if w:   # ends with exact match
+        if got.endswith(w):
+            endpos -= len(w)
+            del ws[-1]
+        else:
+            return False
+
+    if startpos > endpos:
+        # Exact end matches required more characters than we have, as in
+        # _ellipsis_match('aa...aa', 'aaa')
+        return False
+
+    # For the rest, we only need to find the leftmost non-overlapping
+    # match for each piece.  If there's no overall match that way alone,
+    # there's no overall match period.
+    for w in ws:
+        # w may be '' at times, if there are consecutive ellipses, or
+        # due to an ellipsis at the start or end of `want`.  That's OK.
+        # Search for an empty string succeeds, and doesn't change startpos.
+        startpos = got.find(w, startpos, endpos)
+        if startpos < 0:
+            return False
+        startpos += len(w)
+
+    return True
+
+def _comment_line(line):
+    "Return a commented form of the given line"
+    line = line.rstrip()
+    if line:
+        return '# '+line
+    else:
+        return '#'
+
+class _OutputRedirectingPdb(pdb.Pdb):
+    """
+    A specialized version of the python debugger that redirects stdout
+    to a given stream when interacting with the user.  Stdout is *not*
+    redirected when traced code is executed.
+    """
+    def __init__(self, out):
+        self.__out = out
+        self.__debugger_used = False
+        pdb.Pdb.__init__(self)
+
+    def set_trace(self):
+        self.__debugger_used = True
+        pdb.Pdb.set_trace(self)
+
+    def set_continue(self):
+        # Calling set_continue unconditionally would break unit test coverage
+        # reporting, as Bdb.set_continue calls sys.settrace(None).
+        if self.__debugger_used:
+            pdb.Pdb.set_continue(self)
+
+    def trace_dispatch(self, *args):
+        # Redirect stdout to the given stream.
+        save_stdout = sys.stdout
+        sys.stdout = self.__out
+        # Call Pdb's trace dispatch method.
+        try:
+            return pdb.Pdb.trace_dispatch(self, *args)
+        finally:
+            sys.stdout = save_stdout
+
+# [XX] Normalize with respect to os.path.pardir?
+def _module_relative_path(module, path):
+    if not inspect.ismodule(module):
+        raise TypeError, 'Expected a module: %r' % module
+    if path.startswith('/'):
+        raise ValueError, 'Module-relative files may not have absolute paths'
+
+    # Find the base directory for the path.
+    if hasattr(module, '__file__'):
+        # A normal module/package
+        basedir = os.path.split(module.__file__)[0]
+    elif module.__name__ == '__main__':
+        # An interactive session.
+        if len(sys.argv)>0 and sys.argv[0] != '':
+            basedir = os.path.split(sys.argv[0])[0]
+        else:
+            basedir = os.curdir
+    else:
+        # A module w/o __file__ (this includes builtins)
+        raise ValueError("Can't resolve paths relative to the module " +
+                         module + " (it has no __file__)")
+
+    # Combine the base directory and the path.
+    return os.path.join(basedir, *(path.split('/')))
+
+######################################################################
+## 2. Example & DocTest
+######################################################################
+## - An "example" is a <source, want> pair, where "source" is a
+##   fragment of source code, and "want" is the expected output for
+##   "source."  The Example class also includes information about
+##   where the example was extracted from.
+##
+## - A "doctest" is a collection of examples, typically extracted from
+##   a string (such as an object's docstring).  The DocTest class also
+##   includes information about where the string was extracted from.
+
+class Example:
+    """
+    A single doctest example, consisting of source code and expected
+    output.  `Example` defines the following attributes:
+
+      - source: A single Python statement, always ending with a newline.
+        The constructor adds a newline if needed.
+
+      - want: The expected output from running the source code (either
+        from stdout, or a traceback in case of exception).  `want` ends
+        with a newline unless it's empty, in which case it's an empty
+        string.  The constructor adds a newline if needed.
+
+      - exc_msg: The exception message generated by the example, if
+        the example is expected to generate an exception; or `None` if
+        it is not expected to generate an exception.  This exception
+        message is compared against the return value of
+        `traceback.format_exception_only()`.  `exc_msg` ends with a
+        newline unless it's `None`.  The constructor adds a newline
+        if needed.
+
+      - lineno: The line number within the DocTest string containing
+        this Example where the Example begins.  This line number is
+        zero-based, with respect to the beginning of the DocTest.
+
+      - indent: The example's indentation in the DocTest string.
+        I.e., the number of space characters that preceed the
+        example's first prompt.
+
+      - options: A dictionary mapping from option flags to True or
+        False, which is used to override default options for this
+        example.  Any option flags not contained in this dictionary
+        are left at their default value (as specified by the
+        DocTestRunner's optionflags).  By default, no options are set.
+    """
+    def __init__(self, source, want, exc_msg=None, lineno=0, indent=0,
+                 options=None):
+        # Normalize inputs.
+        if not source.endswith('\n'):
+            source += '\n'
+        if want and not want.endswith('\n'):
+            want += '\n'
+        if exc_msg is not None and not exc_msg.endswith('\n'):
+            exc_msg += '\n'
+        # Store properties.
+        self.source = source
+        self.want = want
+        self.lineno = lineno
+        self.indent = indent
+        if options is None: options = {}
+        self.options = options
+        self.exc_msg = exc_msg
+
+class DocTest:
+    """
+    A collection of doctest examples that should be run in a single
+    namespace.  Each `DocTest` defines the following attributes:
+
+      - examples: the list of examples.
+
+      - globs: The namespace (aka globals) that the examples should
+        be run in.
+
+      - name: A name identifying the DocTest (typically, the name of
+        the object whose docstring this DocTest was extracted from).
+
+      - filename: The name of the file that this DocTest was extracted
+        from, or `None` if the filename is unknown.
+
+      - lineno: The line number within filename where this DocTest
+        begins, or `None` if the line number is unavailable.  This
+        line number is zero-based, with respect to the beginning of
+        the file.
+
+      - docstring: The string that the examples were extracted from,
+        or `None` if the string is unavailable.
+    """
+    def __init__(self, examples, globs, name, filename, lineno, docstring):
+        """
+        Create a new DocTest containing the given examples.  The
+        DocTest's globals are initialized with a copy of `globs`.
+        """
+        assert not isinstance(examples, basestring), \
+               "DocTest no longer accepts str; use DocTestParser instead"
+        self.examples = examples
+        self.docstring = docstring
+        self.globs = globs.copy()
+        self.name = name
+        self.filename = filename
+        self.lineno = lineno
+
+    def __repr__(self):
+        if len(self.examples) == 0:
+            examples = 'no examples'
+        elif len(self.examples) == 1:
+            examples = '1 example'
+        else:
+            examples = '%d examples' % len(self.examples)
+        return ('<DocTest %s from %s:%s (%s)>' %
+                (self.name, self.filename, self.lineno, examples))
+
+
+    # This lets us sort tests by name:
+    def __cmp__(self, other):
+        if not isinstance(other, DocTest):
+            return -1
+        return cmp((self.name, self.filename, self.lineno, id(self)),
+                   (other.name, other.filename, other.lineno, id(other)))
+
+######################################################################
+## 3. DocTestParser
+######################################################################
+
+class DocTestParser:
+    """
+    A class used to parse strings containing doctest examples.
+    """
+    # This regular expression is used to find doctest examples in a
+    # string.  It defines three groups: `source` is the source code
+    # (including leading indentation and prompts); `indent` is the
+    # indentation of the first (PS1) line of the source code; and
+    # `want` is the expected output (including leading indentation).
+    _EXAMPLE_RE = re.compile(r'''
+        # Source consists of a PS1 line followed by zero or more PS2 lines.
+        (?P<source>
+            (?:^(?P<indent> [ ]*) >>>    .*)    # PS1 line
+            (?:\n           [ ]*  \.\.\. .*)*)  # PS2 lines
+        \n?
+        # Want consists of any non-blank lines that do not start with PS1.
+        (?P<want> (?:(?![ ]*$)    # Not a blank line
+                     (?![ ]*>>>)  # Not a line starting with PS1
+                     .*$\n?       # But any other line
+                  )*)
+        ''', re.MULTILINE | re.VERBOSE)
+
+    # A regular expression for handling `want` strings that contain
+    # expected exceptions.  It divides `want` into three pieces:
+    #    - the traceback header line (`hdr`)
+    #    - the traceback stack (`stack`)
+    #    - the exception message (`msg`), as generated by
+    #      traceback.format_exception_only()
+    # `msg` may have multiple lines.  We assume/require that the
+    # exception message is the first non-indented line starting with a word
+    # character following the traceback header line.
+    _EXCEPTION_RE = re.compile(r"""
+        # Grab the traceback header.  Different versions of Python have
+        # said different things on the first traceback line.
+        ^(?P<hdr> Traceback\ \(
+            (?: most\ recent\ call\ last
+            |   innermost\ last
+            ) \) :
+        )
+        \s* $                # toss trailing whitespace on the header.
+        (?P<stack> .*?)      # don't blink: absorb stuff until...
+        ^ (?P<msg> \w+ .*)   #     a line *starts* with alphanum.
+        """, re.VERBOSE | re.MULTILINE | re.DOTALL)
+
+    # A callable returning a true value iff its argument is a blank line
+    # or contains a single comment.
+    _IS_BLANK_OR_COMMENT = re.compile(r'^[ ]*(#.*)?$').match
+
+    def parse(self, string, name='<string>'):
+        """
+        Divide the given string into examples and intervening text,
+        and return them as a list of alternating Examples and strings.
+        Line numbers for the Examples are 0-based.  The optional
+        argument `name` is a name identifying this string, and is only
+        used for error messages.
+        """
+        string = string.expandtabs()
+        # If all lines begin with the same indentation, then strip it.
+        min_indent = self._min_indent(string)
+        if min_indent > 0:
+            string = '\n'.join([l[min_indent:] for l in string.split('\n')])
+
+        output = []
+        charno, lineno = 0, 0
+        # Find all doctest examples in the string:
+        for m in self._EXAMPLE_RE.finditer(string):
+            # Add the pre-example text to `output`.
+            output.append(string[charno:m.start()])
+            # Update lineno (lines before this example)
+            lineno += string.count('\n', charno, m.start())
+            # Extract info from the regexp match.
+            (source, options, want, exc_msg) = \
+                     self._parse_example(m, name, lineno)
+            # Create an Example, and add it to the list.
+            if not self._IS_BLANK_OR_COMMENT(source):
+                output.append( Example(source, want, exc_msg,
+                                    lineno=lineno,
+                                    indent=min_indent+len(m.group('indent')),
+                                    options=options) )
+            # Update lineno (lines inside this example)
+            lineno += string.count('\n', m.start(), m.end())
+            # Update charno.
+            charno = m.end()
+        # Add any remaining post-example text to `output`.
+        output.append(string[charno:])
+        return output
+
+    def get_doctest(self, string, globs, name, filename, lineno):
+        """
+        Extract all doctest examples from the given string, and
+        collect them into a `DocTest` object.
+
+        `globs`, `name`, `filename`, and `lineno` are attributes for
+        the new `DocTest` object.  See the documentation for `DocTest`
+        for more information.
+        """
+        return DocTest(self.get_examples(string, name), globs,
+                       name, filename, lineno, string)
+
+    def get_examples(self, string, name='<string>'):
+        """
+        Extract all doctest examples from the given string, and return
+        them as a list of `Example` objects.  Line numbers are
+        0-based, because it's most common in doctests that nothing
+        interesting appears on the same line as opening triple-quote,
+        and so the first interesting line is called \"line 1\" then.
+
+        The optional argument `name` is a name identifying this
+        string, and is only used for error messages.
+        """
+        return [x for x in self.parse(string, name)
+                if isinstance(x, Example)]
+
+    def _parse_example(self, m, name, lineno):
+        """
+        Given a regular expression match from `_EXAMPLE_RE` (`m`),
+        return a pair `(source, want)`, where `source` is the matched
+        example's source code (with prompts and indentation stripped);
+        and `want` is the example's expected output (with indentation
+        stripped).
+
+        `name` is the string's name, and `lineno` is the line number
+        where the example starts; both are used for error messages.
+        """
+        # Get the example's indentation level.
+        indent = len(m.group('indent'))
+
+        # Divide source into lines; check that they're properly
+        # indented; and then strip their indentation & prompts.
+        source_lines = m.group('source').split('\n')
+        self._check_prompt_blank(source_lines, indent, name, lineno)
+        self._check_prefix(source_lines[1:], ' '*indent + '.', name, lineno)
+        source = '\n'.join([sl[indent+4:] for sl in source_lines])
+
+        # Divide want into lines; check that it's properly indented; and
+        # then strip the indentation.  Spaces before the last newline should
+        # be preserved, so plain rstrip() isn't good enough.
+        want = m.group('want')
+        want_lines = want.split('\n')
+        if len(want_lines) > 1 and re.match(r' *$', want_lines[-1]):
+            del want_lines[-1]  # forget final newline & spaces after it
+        self._check_prefix(want_lines, ' '*indent, name,
+                           lineno + len(source_lines))
+        want = '\n'.join([wl[indent:] for wl in want_lines])
+
+        # If `want` contains a traceback message, then extract it.
+        m = self._EXCEPTION_RE.match(want)
+        if m:
+            exc_msg = m.group('msg')
+        else:
+            exc_msg = None
+
+        # Extract options from the source.
+        options = self._find_options(source, name, lineno)
+
+        return source, options, want, exc_msg
+
+    # This regular expression looks for option directives in the
+    # source code of an example.  Option directives are comments
+    # starting with "doctest:".  Warning: this may give false
+    # positives for string-literals that contain the string
+    # "#doctest:".  Eliminating these false positives would require
+    # actually parsing the string; but we limit them by ignoring any
+    # line containing "#doctest:" that is *followed* by a quote mark.
+    _OPTION_DIRECTIVE_RE = re.compile(r'#\s*doctest:\s*([^\n\'"]*)$',
+                                      re.MULTILINE)
+
+    def _find_options(self, source, name, lineno):
+        """
+        Return a dictionary containing option overrides extracted from
+        option directives in the given source string.
+
+        `name` is the string's name, and `lineno` is the line number
+        where the example starts; both are used for error messages.
+        """
+        options = {}
+        # (note: with the current regexp, this will match at most once:)
+        for m in self._OPTION_DIRECTIVE_RE.finditer(source):
+            option_strings = m.group(1).replace(',', ' ').split()
+            for option in option_strings:
+                if (option[0] not in '+-' or
+                    option[1:] not in OPTIONFLAGS_BY_NAME):
+                    raise ValueError('line %r of the doctest for %s '
+                                     'has an invalid option: %r' %
+                                     (lineno+1, name, option))
+                flag = OPTIONFLAGS_BY_NAME[option[1:]]
+                options[flag] = (option[0] == '+')
+        if options and self._IS_BLANK_OR_COMMENT(source):
+            raise ValueError('line %r of the doctest for %s has an option '
+                             'directive on a line with no example: %r' %
+                             (lineno, name, source))
+        return options
+
+    # This regular expression finds the indentation of every non-blank
+    # line in a string.
+    _INDENT_RE = re.compile('^([ ]*)(?=\S)', re.MULTILINE)
+
+    def _min_indent(self, s):
+        "Return the minimum indentation of any non-blank line in `s`"
+        indents = [len(indent) for indent in self._INDENT_RE.findall(s)]
+        if len(indents) > 0:
+            return min(indents)
+        else:
+            return 0
+
+    def _check_prompt_blank(self, lines, indent, name, lineno):
+        """
+        Given the lines of a source string (including prompts and
+        leading indentation), check to make sure that every prompt is
+        followed by a space character.  If any line is not followed by
+        a space character, then raise ValueError.
+        """
+        for i, line in enumerate(lines):
+            if len(line) >= indent+4 and line[indent+3] != ' ':
+                raise ValueError('line %r of the docstring for %s '
+                                 'lacks blank after %s: %r' %
+                                 (lineno+i+1, name,
+                                  line[indent:indent+3], line))
+
+    def _check_prefix(self, lines, prefix, name, lineno):
+        """
+        Check that every line in the given list starts with the given
+        prefix; if any line does not, then raise a ValueError.
+        """
+        for i, line in enumerate(lines):
+            if line and not line.startswith(prefix):
+                raise ValueError('line %r of the docstring for %s has '
+                                 'inconsistent leading whitespace: %r' %
+                                 (lineno+i+1, name, line))
+
+
+######################################################################
+## 4. DocTest Finder
+######################################################################
+
+class DocTestFinder:
+    """
+    A class used to extract the DocTests that are relevant to a given
+    object, from its docstring and the docstrings of its contained
+    objects.  Doctests can currently be extracted from the following
+    object types: modules, functions, classes, methods, staticmethods,
+    classmethods, and properties.
+    """
+
+    def __init__(self, verbose=False, parser=DocTestParser(),
+                 recurse=True, _namefilter=None, exclude_empty=True):
+        """
+        Create a new doctest finder.
+
+        The optional argument `parser` specifies a class or
+        function that should be used to create new DocTest objects (or
+        objects that implement the same interface as DocTest).  The
+        signature for this factory function should match the signature
+        of the DocTest constructor.
+
+        If the optional argument `recurse` is false, then `find` will
+        only examine the given object, and not any contained objects.
+
+        If the optional argument `exclude_empty` is false, then `find`
+        will include tests for objects with empty docstrings.
+        """
+        self._parser = parser
+        self._verbose = verbose
+        self._recurse = recurse
+        self._exclude_empty = exclude_empty
+        # _namefilter is undocumented, and exists only for temporary backward-
+        # compatibility support of testmod's deprecated isprivate mess.
+        self._namefilter = _namefilter
+
+    def find(self, obj, name=None, module=None, globs=None,
+             extraglobs=None):
+        """
+        Return a list of the DocTests that are defined by the given
+        object's docstring, or by any of its contained objects'
+        docstrings.
+
+        The optional parameter `module` is the module that contains
+        the given object.  If the module is not specified or is None, then
+        the test finder will attempt to automatically determine the
+        correct module.  The object's module is used:
+
+            - As a default namespace, if `globs` is not specified.
+            - To prevent the DocTestFinder from extracting DocTests
+              from objects that are imported from other modules.
+            - To find the name of the file containing the object.
+            - To help find the line number of the object within its
+              file.
+
+        Contained objects whose module does not match `module` are ignored.
+
+        If `module` is False, no attempt to find the module will be made.
+        This is obscure, of use mostly in tests:  if `module` is False, or
+        is None but cannot be found automatically, then all objects are
+        considered to belong to the (non-existent) module, so all contained
+        objects will (recursively) be searched for doctests.
+
+        The globals for each DocTest is formed by combining `globs`
+        and `extraglobs` (bindings in `extraglobs` override bindings
+        in `globs`).  A new copy of the globals dictionary is created
+        for each DocTest.  If `globs` is not specified, then it
+        defaults to the module's `__dict__`, if specified, or {}
+        otherwise.  If `extraglobs` is not specified, then it defaults
+        to {}.
+
+        """
+        # If name was not specified, then extract it from the object.
+        if name is None:
+            name = getattr(obj, '__name__', None)
+            if name is None:
+                raise ValueError("DocTestFinder.find: name must be given "
+                        "when obj.__name__ doesn't exist: %r" %
+                                 (type(obj),))
+
+        # Find the module that contains the given object (if obj is
+        # a module, then module=obj.).  Note: this may fail, in which
+        # case module will be None.
+        if module is False:
+            module = None
+        elif module is None:
+            module = inspect.getmodule(obj)
+
+        # Read the module's source code.  This is used by
+        # DocTestFinder._find_lineno to find the line number for a
+        # given object's docstring.
+        try:
+            file = inspect.getsourcefile(obj) or inspect.getfile(obj)
+            source_lines = linecache.getlines(file)
+            if not source_lines:
+                source_lines = None
+        except TypeError:
+            source_lines = None
+
+        # Initialize globals, and merge in extraglobs.
+        if globs is None:
+            if module is None:
+                globs = {}
+            else:
+                globs = module.__dict__.copy()
+        else:
+            globs = globs.copy()
+        if extraglobs is not None:
+            globs.update(extraglobs)
+
+        # Recursively explore `obj`, extracting DocTests.
+        tests = []
+        self._find(tests, obj, name, module, source_lines, globs, {})
+        return tests
+
+    def _filter(self, obj, prefix, base):
+        """
+        Return true if the given object should not be examined.
+        """
+        return (self._namefilter is not None and
+                self._namefilter(prefix, base))
+
+    def _from_module(self, module, object):
+        """
+        Return true if the given object is defined in the given
+        module.
+        """
+        if module is None:
+            return True
+        elif inspect.isfunction(object):
+            return module.__dict__ is object.func_globals
+        elif inspect.isclass(object):
+            return module.__name__ == object.__module__
+        elif inspect.getmodule(object) is not None:
+            return module is inspect.getmodule(object)
+        elif hasattr(object, '__module__'):
+            return module.__name__ == object.__module__
+        elif isinstance(object, property):
+            return True # [XX] no way not be sure.
+        else:
+            raise ValueError("object must be a class or function")
+
+    def _find(self, tests, obj, name, module, source_lines, globs, seen):
+        """
+        Find tests for the given object and any contained objects, and
+        add them to `tests`.
+        """
+        if self._verbose:
+            print 'Finding tests in %s' % name
+
+        # If we've already processed this object, then ignore it.
+        if id(obj) in seen:
+            return
+        seen[id(obj)] = 1
+
+        # Find a test for this object, and add it to the list of tests.
+        test = self._get_test(obj, name, module, globs, source_lines)
+        if test is not None:
+            tests.append(test)
+
+        # Look for tests in a module's contained objects.
+        if inspect.ismodule(obj) and self._recurse:
+            for valname, val in obj.__dict__.items():
+                # Check if this contained object should be ignored.
+                if self._filter(val, name, valname):
+                    continue
+                valname = '%s.%s' % (name, valname)
+                # Recurse to functions & classes.
+                if ((inspect.isfunction(val) or inspect.isclass(val)) and
+                    self._from_module(module, val)):
+                    self._find(tests, val, valname, module, source_lines,
+                               globs, seen)
+
+        # Look for tests in a module's __test__ dictionary.
+        if inspect.ismodule(obj) and self._recurse:
+            for valname, val in getattr(obj, '__test__', {}).items():
+                if not isinstance(valname, basestring):
+                    raise ValueError("DocTestFinder.find: __test__ keys "
+                                     "must be strings: %r" %
+                                     (type(valname),))
+                if not (inspect.isfunction(val) or inspect.isclass(val) or
+                        inspect.ismethod(val) or inspect.ismodule(val) or
+                        isinstance(val, basestring)):
+                    raise ValueError("DocTestFinder.find: __test__ values "
+                                     "must be strings, functions, methods, "
+                                     "classes, or modules: %r" %
+                                     (type(val),))
+                valname = '%s.__test__.%s' % (name, valname)
+                self._find(tests, val, valname, module, source_lines,
+                           globs, seen)
+
+        # Look for tests in a class's contained objects.
+        if inspect.isclass(obj) and self._recurse:
+            for valname, val in obj.__dict__.items():
+                # Check if this contained object should be ignored.
+                if self._filter(val, name, valname):
+                    continue
+                # Special handling for staticmethod/classmethod.
+                if isinstance(val, staticmethod):
+                    val = getattr(obj, valname)
+                if isinstance(val, classmethod):
+                    val = getattr(obj, valname).im_func
+
+                # Recurse to methods, properties, and nested classes.
+                if ((inspect.isfunction(val) or inspect.isclass(val) or
+                      isinstance(val, property)) and
+                      self._from_module(module, val)):
+                    valname = '%s.%s' % (name, valname)
+                    self._find(tests, val, valname, module, source_lines,
+                               globs, seen)
+
+    def _get_test(self, obj, name, module, globs, source_lines):
+        """
+        Return a DocTest for the given object, if it defines a docstring;
+        otherwise, return None.
+        """
+        # Extract the object's docstring.  If it doesn't have one,
+        # then return None (no test for this object).
+        if isinstance(obj, basestring):
+            docstring = obj
+        else:
+            try:
+                if obj.__doc__ is None:
+                    docstring = ''
+                else:
+                    docstring = obj.__doc__
+                    if not isinstance(docstring, basestring):
+                        docstring = str(docstring)
+            except (TypeError, AttributeError):
+                docstring = ''
+
+        # Find the docstring's location in the file.
+        lineno = self._find_lineno(obj, source_lines)
+
+        # Don't bother if the docstring is empty.
+        if self._exclude_empty and not docstring:
+            return None
+
+        # Return a DocTest for this object.
+        if module is None:
+            filename = None
+        else:
+            filename = getattr(module, '__file__', module.__name__)
+            if filename[-4:] in (".pyc", ".pyo"):
+                filename = filename[:-1]
+        return self._parser.get_doctest(docstring, globs, name,
+                                        filename, lineno)
+
+    def _find_lineno(self, obj, source_lines):
+        """
+        Return a line number of the given object's docstring.  Note:
+        this method assumes that the object has a docstring.
+        """
+        lineno = None
+
+        # Find the line number for modules.
+        if inspect.ismodule(obj):
+            lineno = 0
+
+        # Find the line number for classes.
+        # Note: this could be fooled if a class is defined multiple
+        # times in a single file.
+        if inspect.isclass(obj):
+            if source_lines is None:
+                return None
+            pat = re.compile(r'^\s*class\s*%s\b' %
+                             getattr(obj, '__name__', '-'))
+            for i, line in enumerate(source_lines):
+                if pat.match(line):
+                    lineno = i
+                    break
+
+        # Find the line number for functions & methods.
+        if inspect.ismethod(obj): obj = obj.im_func
+        if inspect.isfunction(obj): obj = obj.func_code
+        if inspect.istraceback(obj): obj = obj.tb_frame
+        if inspect.isframe(obj): obj = obj.f_code
+        if inspect.iscode(obj):
+            lineno = getattr(obj, 'co_firstlineno', None)-1
+
+        # Find the line number where the docstring starts.  Assume
+        # that it's the first line that begins with a quote mark.
+        # Note: this could be fooled by a multiline function
+        # signature, where a continuation line begins with a quote
+        # mark.
+        if lineno is not None:
+            if source_lines is None:
+                return lineno+1
+            pat = re.compile('(^|.*:)\s*\w*("|\')')
+            for lineno in range(lineno, len(source_lines)):
+                if pat.match(source_lines[lineno]):
+                    return lineno
+
+        # We couldn't find the line number.
+        return None
+
+######################################################################
+## 5. DocTest Runner
+######################################################################
+
+class DocTestRunner:
+    """
+    A class used to run DocTest test cases, and accumulate statistics.
+    The `run` method is used to process a single DocTest case.  It
+    returns a tuple `(f, t)`, where `t` is the number of test cases
+    tried, and `f` is the number of test cases that failed.
+
+        >>> tests = DocTestFinder().find(_TestClass)
+        >>> runner = DocTestRunner(verbose=False)
+        >>> for test in tests:
+        ...     print runner.run(test)
+        (0, 2)
+        (0, 1)
+        (0, 2)
+        (0, 2)
+
+    The `summarize` method prints a summary of all the test cases that
+    have been run by the runner, and returns an aggregated `(f, t)`
+    tuple:
+
+        >>> runner.summarize(verbose=1)
+        4 items passed all tests:
+           2 tests in _TestClass
+           2 tests in _TestClass.__init__
+           2 tests in _TestClass.get
+           1 tests in _TestClass.square
+        7 tests in 4 items.
+        7 passed and 0 failed.
+        Test passed.
+        (0, 7)
+
+    The aggregated number of tried examples and failed examples is
+    also available via the `tries` and `failures` attributes:
+
+        >>> runner.tries
+        7
+        >>> runner.failures
+        0
+
+    The comparison between expected outputs and actual outputs is done
+    by an `OutputChecker`.  This comparison may be customized with a
+    number of option flags; see the documentation for `testmod` for
+    more information.  If the option flags are insufficient, then the
+    comparison may also be customized by passing a subclass of
+    `OutputChecker` to the constructor.
+
+    The test runner's display output can be controlled in two ways.
+    First, an output function (`out) can be passed to
+    `TestRunner.run`; this function will be called with strings that
+    should be displayed.  It defaults to `sys.stdout.write`.  If
+    capturing the output is not sufficient, then the display output
+    can be also customized by subclassing DocTestRunner, and
+    overriding the methods `report_start`, `report_success`,
+    `report_unexpected_exception`, and `report_failure`.
+    """
+    # This divider string is used to separate failure messages, and to
+    # separate sections of the summary.
+    DIVIDER = "*" * 70
+
+    def __init__(self, checker=None, verbose=None, optionflags=0):
+        """
+        Create a new test runner.
+
+        Optional keyword arg `checker` is the `OutputChecker` that
+        should be used to compare the expected outputs and actual
+        outputs of doctest examples.
+
+        Optional keyword arg 'verbose' prints lots of stuff if true,
+        only failures if false; by default, it's true iff '-v' is in
+        sys.argv.
+
+        Optional argument `optionflags` can be used to control how the
+        test runner compares expected output to actual output, and how
+        it displays failures.  See the documentation for `testmod` for
+        more information.
+        """
+        self._checker = checker or OutputChecker()
+        if verbose is None:
+            verbose = '-v' in sys.argv
+        self._verbose = verbose
+        self.optionflags = optionflags
+        self.original_optionflags = optionflags
+
+        # Keep track of the examples we've run.
+        self.tries = 0
+        self.failures = 0
+        self._name2ft = {}
+
+        # Create a fake output target for capturing doctest output.
+        self._fakeout = _SpoofOut()
+
+    #/////////////////////////////////////////////////////////////////
+    # Reporting methods
+    #/////////////////////////////////////////////////////////////////
+
+    def report_start(self, out, test, example):
+        """
+        Report that the test runner is about to process the given
+        example.  (Only displays a message if verbose=True)
+        """
+        if self._verbose:
+            if example.want:
+                out('Trying:\n' + _indent(example.source) +
+                    'Expecting:\n' + _indent(example.want))
+            else:
+                out('Trying:\n' + _indent(example.source) +
+                    'Expecting nothing\n')
+
+    def report_success(self, out, test, example, got):
+        """
+        Report that the given example ran successfully.  (Only
+        displays a message if verbose=True)
+        """
+        if self._verbose:
+            out("ok\n")
+
+    def report_failure(self, out, test, example, got):
+        """
+        Report that the given example failed.
+        """
+        out(self._failure_header(test, example) +
+            self._checker.output_difference(example, got, self.optionflags))
+
+    def report_unexpected_exception(self, out, test, example, exc_info):
+        """
+        Report that the given example raised an unexpected exception.
+        """
+        out(self._failure_header(test, example) +
+            'Exception raised:\n' + _indent(_exception_traceback(exc_info)))
+
+    def _failure_header(self, test, example):
+        out = [self.DIVIDER]
+        if test.filename:
+            if test.lineno is not None and example.lineno is not None:
+                lineno = test.lineno + example.lineno + 1
+            else:
+                lineno = '?'
+            out.append('File "%s", line %s, in %s' %
+                       (test.filename, lineno, test.name))
+        else:
+            out.append('Line %s, in %s' % (example.lineno+1, test.name))
+        out.append('Failed example:')
+        source = example.source
+        out.append(_indent(source))
+        return '\n'.join(out)
+
+    #/////////////////////////////////////////////////////////////////
+    # DocTest Running
+    #/////////////////////////////////////////////////////////////////
+
+    def __run(self, test, compileflags, out):
+        """
+        Run the examples in `test`.  Write the outcome of each example
+        with one of the `DocTestRunner.report_*` methods, using the
+        writer function `out`.  `compileflags` is the set of compiler
+        flags that should be used to execute examples.  Return a tuple
+        `(f, t)`, where `t` is the number of examples tried, and `f`
+        is the number of examples that failed.  The examples are run
+        in the namespace `test.globs`.
+        """
+        # Keep track of the number of failures and tries.
+        failures = tries = 0
+
+        # Save the option flags (since option directives can be used
+        # to modify them).
+        original_optionflags = self.optionflags
+
+        SUCCESS, FAILURE, BOOM = range(3) # `outcome` state
+
+        check = self._checker.check_output
+
+        # Process each example.
+        for examplenum, example in enumerate(test.examples):
+
+            # If REPORT_ONLY_FIRST_FAILURE is set, then suppress
+            # reporting after the first failure.
+            quiet = (self.optionflags & REPORT_ONLY_FIRST_FAILURE and
+                     failures > 0)
+
+            # Merge in the example's options.
+            self.optionflags = original_optionflags
+            if example.options:
+                for (optionflag, val) in example.options.items():
+                    if val:
+                        self.optionflags |= optionflag
+                    else:
+                        self.optionflags &= ~optionflag
+
+            # Record that we started this example.
+            tries += 1
+            if not quiet:
+                self.report_start(out, test, example)
+
+            # Use a special filename for compile(), so we can retrieve
+            # the source code during interactive debugging (see
+            # __patched_linecache_getlines).
+            filename = '<doctest %s[%d]>' % (test.name, examplenum)
+
+            # Run the example in the given context (globs), and record
+            # any exception that gets raised.  (But don't intercept
+            # keyboard interrupts.)
+            try:
+                # Don't blink!  This is where the user's code gets run.
+                exec compile(example.source, filename, "single",
+                             compileflags, 1) in test.globs
+                self.debugger.set_continue() # ==== Example Finished ====
+                exception = None
+            except KeyboardInterrupt:
+                raise
+            except:
+                exception = sys.exc_info()
+                self.debugger.set_continue() # ==== Example Finished ====
+
+            got = self._fakeout.getvalue()  # the actual output
+            self._fakeout.truncate(0)
+            outcome = FAILURE   # guilty until proved innocent or insane
+
+            # If the example executed without raising any exceptions,
+            # verify its output.
+            if exception is None:
+                if check(example.want, got, self.optionflags):
+                    outcome = SUCCESS
+
+            # The example raised an exception:  check if it was expected.
+            else:
+                exc_info = sys.exc_info()
+                exc_msg = traceback.format_exception_only(*exc_info[:2])[-1]
+                if not quiet:
+                    got += _exception_traceback(exc_info)
+
+                # If `example.exc_msg` is None, then we weren't expecting
+                # an exception.
+                if example.exc_msg is None:
+                    outcome = BOOM
+
+                # We expected an exception:  see whether it matches.
+                elif check(example.exc_msg, exc_msg, self.optionflags):
+                    outcome = SUCCESS
+
+                # Another chance if they didn't care about the detail.
+                elif self.optionflags & IGNORE_EXCEPTION_DETAIL:
+                    m1 = re.match(r'[^:]*:', example.exc_msg)
+                    m2 = re.match(r'[^:]*:', exc_msg)
+                    if m1 and m2 and check(m1.group(0), m2.group(0),
+                                           self.optionflags):
+                        outcome = SUCCESS
+
+            # Report the outcome.
+            if outcome is SUCCESS:
+                if not quiet:
+                    self.report_success(out, test, example, got)
+            elif outcome is FAILURE:
+                if not quiet:
+                    self.report_failure(out, test, example, got)
+                failures += 1
+            elif outcome is BOOM:
+                if not quiet:
+                    self.report_unexpected_exception(out, test, example,
+                                                     exc_info)
+                failures += 1
+            else:
+                assert False, ("unknown outcome", outcome)
+
+        # Restore the option flags (in case they were modified)
+        self.optionflags = original_optionflags
+
+        # Record and return the number of failures and tries.
+        self.__record_outcome(test, failures, tries)
+        return failures, tries
+
+    def __record_outcome(self, test, f, t):
+        """
+        Record the fact that the given DocTest (`test`) generated `f`
+        failures out of `t` tried examples.
+        """
+        f2, t2 = self._name2ft.get(test.name, (0,0))
+        self._name2ft[test.name] = (f+f2, t+t2)
+        self.failures += f
+        self.tries += t
+
+    __LINECACHE_FILENAME_RE = re.compile(r'<doctest '
+                                         r'(?P<name>[\w\.]+)'
+                                         r'\[(?P<examplenum>\d+)\]>$')
+    def __patched_linecache_getlines(self, filename, module_globals=None):
+        m = self.__LINECACHE_FILENAME_RE.match(filename)
+        if m and m.group('name') == self.test.name:
+            example = self.test.examples[int(m.group('examplenum'))]
+            return example.source.splitlines(True)
+        else:
+            if sys.version_info < (2, 5, 0):
+                return self.save_linecache_getlines(filename)
+            else:
+                return self.save_linecache_getlines(filename, module_globals)
+
+    def run(self, test, compileflags=None, out=None, clear_globs=True):
+        """
+        Run the examples in `test`, and display the results using the
+        writer function `out`.
+
+        The examples are run in the namespace `test.globs`.  If
+        `clear_globs` is true (the default), then this namespace will
+        be cleared after the test runs, to help with garbage
+        collection.  If you would like to examine the namespace after
+        the test completes, then use `clear_globs=False`.
+
+        `compileflags` gives the set of flags that should be used by
+        the Python compiler when running the examples.  If not
+        specified, then it will default to the set of future-import
+        flags that apply to `globs`.
+
+        The output of each example is checked using
+        `DocTestRunner.check_output`, and the results are formatted by
+        the `DocTestRunner.report_*` methods.
+        """
+        self.test = test
+
+        if compileflags is None:
+            compileflags = _extract_future_flags(test.globs)
+
+        save_stdout = sys.stdout
+        if out is None:
+            out = save_stdout.write
+        sys.stdout = self._fakeout
+
+        # Patch pdb.set_trace to restore sys.stdout during interactive
+        # debugging (so it's not still redirected to self._fakeout).
+        # Note that the interactive output will go to *our*
+        # save_stdout, even if that's not the real sys.stdout; this
+        # allows us to write test cases for the set_trace behavior.
+        save_set_trace = pdb.set_trace
+        self.debugger = _OutputRedirectingPdb(save_stdout)
+        self.debugger.reset()
+        pdb.set_trace = self.debugger.set_trace
+
+        # Patch linecache.getlines, so we can see the example's source
+        # when we're inside the debugger.
+        self.save_linecache_getlines = linecache.getlines
+        linecache.getlines = self.__patched_linecache_getlines
+
+        try:
+            return self.__run(test, compileflags, out)
+        finally:
+            sys.stdout = save_stdout
+            pdb.set_trace = save_set_trace
+            linecache.getlines = self.save_linecache_getlines
+            if clear_globs:
+                test.globs.clear()
+
+    #/////////////////////////////////////////////////////////////////
+    # Summarization
+    #/////////////////////////////////////////////////////////////////
+    def summarize(self, verbose=None):
+        """
+        Print a summary of all the test cases that have been run by
+        this DocTestRunner, and return a tuple `(f, t)`, where `f` is
+        the total number of failed examples, and `t` is the total
+        number of tried examples.
+
+        The optional `verbose` argument controls how detailed the
+        summary is.  If the verbosity is not specified, then the
+        DocTestRunner's verbosity is used.
+        """
+        if verbose is None:
+            verbose = self._verbose
+        notests = []
+        passed = []
+        failed = []
+        totalt = totalf = 0
+        for x in self._name2ft.items():
+            name, (f, t) = x
+            assert f <= t
+            totalt += t
+            totalf += f
+            if t == 0:
+                notests.append(name)
+            elif f == 0:
+                passed.append( (name, t) )
+            else:
+                failed.append(x)
+        if verbose:
+            if notests:
+                print len(notests), "items had no tests:"
+                notests.sort()
+                for thing in notests:
+                    print "   ", thing
+            if passed:
+                print len(passed), "items passed all tests:"
+                passed.sort()
+                for thing, count in passed:
+                    print " %3d tests in %s" % (count, thing)
+        if failed:
+            print self.DIVIDER
+            print len(failed), "items had failures:"
+            failed.sort()
+            for thing, (f, t) in failed:
+                print " %3d of %3d in %s" % (f, t, thing)
+        if verbose:
+            print totalt, "tests in", len(self._name2ft), "items."
+            print totalt - totalf, "passed and", totalf, "failed."
+        if totalf:
+            print "***Test Failed***", totalf, "failures."
+        elif verbose:
+            print "Test passed."
+        return totalf, totalt
+
+    #/////////////////////////////////////////////////////////////////
+    # Backward compatibility cruft to maintain doctest.master.
+    #/////////////////////////////////////////////////////////////////
+    def merge(self, other):
+        d = self._name2ft
+        for name, (f, t) in other._name2ft.items():
+            if name in d:
+                print "*** DocTestRunner.merge: '" + name + "' in both" \
+                    " testers; summing outcomes."
+                f2, t2 = d[name]
+                f = f + f2
+                t = t + t2
+            d[name] = f, t
+
+class OutputChecker:
+    """
+    A class used to check the whether the actual output from a doctest
+    example matches the expected output.  `OutputChecker` defines two
+    methods: `check_output`, which compares a given pair of outputs,
+    and returns true if they match; and `output_difference`, which
+    returns a string describing the differences between two outputs.
+    """
+    def check_output(self, want, got, optionflags):
+        """
+        Return True iff the actual output from an example (`got`)
+        matches the expected output (`want`).  These strings are
+        always considered to match if they are identical; but
+        depending on what option flags the test runner is using,
+        several non-exact match types are also possible.  See the
+        documentation for `TestRunner` for more information about
+        option flags.
+        """
+        # Handle the common case first, for efficiency:
+        # if they're string-identical, always return true.
+        if got == want:
+            return True
+
+        # The values True and False replaced 1 and 0 as the return
+        # value for boolean comparisons in Python 2.3.
+        if not (optionflags & DONT_ACCEPT_TRUE_FOR_1):
+            if (got,want) == ("True\n", "1\n"):
+                return True
+            if (got,want) == ("False\n", "0\n"):
+                return True
+
+        # <BLANKLINE> can be used as a special sequence to signify a
+        # blank line, unless the DONT_ACCEPT_BLANKLINE flag is used.
+        if not (optionflags & DONT_ACCEPT_BLANKLINE):
+            # Replace <BLANKLINE> in want with a blank line.
+            want = re.sub('(?m)^%s\s*?$' % re.escape(BLANKLINE_MARKER),
+                          '', want)
+            # If a line in got contains only spaces, then remove the
+            # spaces.
+            got = re.sub('(?m)^\s*?$', '', got)
+            if got == want:
+                return True
+
+        # This flag causes doctest to ignore any differences in the
+        # contents of whitespace strings.  Note that this can be used
+        # in conjunction with the ELLIPSIS flag.
+        if optionflags & NORMALIZE_WHITESPACE:
+            got = ' '.join(got.split())
+            want = ' '.join(want.split())
+            if got == want:
+                return True
+
+        # The ELLIPSIS flag says to let the sequence "..." in `want`
+        # match any substring in `got`.
+        if optionflags & ELLIPSIS:
+            if _ellipsis_match(want, got):
+                return True
+
+        # We didn't find any match; return false.
+        return False
+
+    # Should we do a fancy diff?
+    def _do_a_fancy_diff(self, want, got, optionflags):
+        # Not unless they asked for a fancy diff.
+        if not optionflags & (REPORT_UDIFF |
+                              REPORT_CDIFF |
+                              REPORT_NDIFF):
+            return False
+
+        # If expected output uses ellipsis, a meaningful fancy diff is
+        # too hard ... or maybe not.  In two real-life failures Tim saw,
+        # a diff was a major help anyway, so this is commented out.
+        # [todo] _ellipsis_match() knows which pieces do and don't match,
+        # and could be the basis for a kick-ass diff in this case.
+        ##if optionflags & ELLIPSIS and ELLIPSIS_MARKER in want:
+        ##    return False
+
+        # ndiff does intraline difference marking, so can be useful even
+        # for 1-line differences.
+        if optionflags & REPORT_NDIFF:
+            return True
+
+        # The other diff types need at least a few lines to be helpful.
+        return want.count('\n') > 2 and got.count('\n') > 2
+
+    def output_difference(self, example, got, optionflags):
+        """
+        Return a string describing the differences between the
+        expected output for a given example (`example`) and the actual
+        output (`got`).  `optionflags` is the set of option flags used
+        to compare `want` and `got`.
+        """
+        want = example.want
+        # If <BLANKLINE>s are being used, then replace blank lines
+        # with <BLANKLINE> in the actual output string.
+        if not (optionflags & DONT_ACCEPT_BLANKLINE):
+            got = re.sub('(?m)^[ ]*(?=\n)', BLANKLINE_MARKER, got)
+
+        # Check if we should use diff.
+        if self._do_a_fancy_diff(want, got, optionflags):
+            # Split want & got into lines.
+            want_lines = want.splitlines(True)  # True == keep line ends
+            got_lines = got.splitlines(True)
+            # Use difflib to find their differences.
+            if optionflags & REPORT_UDIFF:
+                diff = difflib.unified_diff(want_lines, got_lines, n=2)
+                diff = list(diff)[2:] # strip the diff header
+                kind = 'unified diff with -expected +actual'
+            elif optionflags & REPORT_CDIFF:
+                diff = difflib.context_diff(want_lines, got_lines, n=2)
+                diff = list(diff)[2:] # strip the diff header
+                kind = 'context diff with expected followed by actual'
+            elif optionflags & REPORT_NDIFF:
+                engine = difflib.Differ(charjunk=difflib.IS_CHARACTER_JUNK)
+                diff = list(engine.compare(want_lines, got_lines))
+                kind = 'ndiff with -expected +actual'
+            else:
+                assert 0, 'Bad diff option'
+            # Remove trailing whitespace on diff output.
+            diff = [line.rstrip() + '\n' for line in diff]
+            return 'Differences (%s):\n' % kind + _indent(''.join(diff))
+
+        # If we're not using diff, then simply list the expected
+        # output followed by the actual output.
+        if want and got:
+            return 'Expected:\n%sGot:\n%s' % (_indent(want), _indent(got))
+        elif want:
+            return 'Expected:\n%sGot nothing\n' % _indent(want)
+        elif got:
+            return 'Expected nothing\nGot:\n%s' % _indent(got)
+        else:
+            return 'Expected nothing\nGot nothing\n'
+
+class DocTestFailure(Exception):
+    """A DocTest example has failed in debugging mode.
+
+    The exception instance has variables:
+
+    - test: the DocTest object being run
+
+    - excample: the Example object that failed
+
+    - got: the actual output
+    """
+    def __init__(self, test, example, got):
+        self.test = test
+        self.example = example
+        self.got = got
+
+    def __str__(self):
+        return str(self.test)
+
+class UnexpectedException(Exception):
+    """A DocTest example has encountered an unexpected exception
+
+    The exception instance has variables:
+
+    - test: the DocTest object being run
+
+    - excample: the Example object that failed
+
+    - exc_info: the exception info
+    """
+    def __init__(self, test, example, exc_info):
+        self.test = test
+        self.example = example
+        self.exc_info = exc_info
+
+    def __str__(self):
+        return str(self.test)
+
+class DebugRunner(DocTestRunner):
+    r"""Run doc tests but raise an exception as soon as there is a failure.
+
+       If an unexpected exception occurs, an UnexpectedException is raised.
+       It contains the test, the example, and the original exception:
+
+         >>> runner = DebugRunner(verbose=False)
+         >>> test = DocTestParser().get_doctest('>>> raise KeyError\n42',
+         ...                                    {}, 'foo', 'foo.py', 0)
+         >>> try:
+         ...     runner.run(test)
+         ... except UnexpectedException, failure:
+         ...     pass
+
+         >>> failure.test is test
+         True
+
+         >>> failure.example.want
+         '42\n'
+
+         >>> exc_info = failure.exc_info
+         >>> raise exc_info[0], exc_info[1], exc_info[2]
+         Traceback (most recent call last):
+         ...
+         KeyError
+
+       We wrap the original exception to give the calling application
+       access to the test and example information.
+
+       If the output doesn't match, then a DocTestFailure is raised:
+
+         >>> test = DocTestParser().get_doctest('''
+         ...      >>> x = 1
+         ...      >>> x
+         ...      2
+         ...      ''', {}, 'foo', 'foo.py', 0)
+
+         >>> try:
+         ...    runner.run(test)
+         ... except DocTestFailure, failure:
+         ...    pass
+
+       DocTestFailure objects provide access to the test:
+
+         >>> failure.test is test
+         True
+
+       As well as to the example:
+
+         >>> failure.example.want
+         '2\n'
+
+       and the actual output:
+
+         >>> failure.got
+         '1\n'
+
+       If a failure or error occurs, the globals are left intact:
+
+         >>> del test.globs['__builtins__']
+         >>> test.globs
+         {'x': 1}
+
+         >>> test = DocTestParser().get_doctest('''
+         ...      >>> x = 2
+         ...      >>> raise KeyError
+         ...      ''', {}, 'foo', 'foo.py', 0)
+
+         >>> runner.run(test)
+         Traceback (most recent call last):
+         ...
+         UnexpectedException: <DocTest foo from foo.py:0 (2 examples)>
+
+         >>> del test.globs['__builtins__']
+         >>> test.globs
+         {'x': 2}
+
+       But the globals are cleared if there is no error:
+
+         >>> test = DocTestParser().get_doctest('''
+         ...      >>> x = 2
+         ...      ''', {}, 'foo', 'foo.py', 0)
+
+         >>> runner.run(test)
+         (0, 1)
+
+         >>> test.globs
+         {}
+
+       """
+
+    def run(self, test, compileflags=None, out=None, clear_globs=True):
+        r = DocTestRunner.run(self, test, compileflags, out, False)
+        if clear_globs:
+            test.globs.clear()
+        return r
+
+    def report_unexpected_exception(self, out, test, example, exc_info):
+        raise UnexpectedException(test, example, exc_info)
+
+    def report_failure(self, out, test, example, got):
+        raise DocTestFailure(test, example, got)
+
+######################################################################
+## 6. Test Functions
+######################################################################
+# These should be backwards compatible.
+
+# For backward compatibility, a global instance of a DocTestRunner
+# class, updated by testmod.
+master = None
+
+def testmod(m=None, name=None, globs=None, verbose=None, isprivate=None,
+            report=True, optionflags=0, extraglobs=None,
+            raise_on_error=False, exclude_empty=False):
+    """m=None, name=None, globs=None, verbose=None, isprivate=None,
+       report=True, optionflags=0, extraglobs=None, raise_on_error=False,
+       exclude_empty=False
+
+    Test examples in docstrings in functions and classes reachable
+    from module m (or the current module if m is not supplied), starting
+    with m.__doc__.  Unless isprivate is specified, private names
+    are not skipped.
+
+    Also test examples reachable from dict m.__test__ if it exists and is
+    not None.  m.__test__ maps names to functions, classes and strings;
+    function and class docstrings are tested even if the name is private;
+    strings are tested directly, as if they were docstrings.
+
+    Return (#failures, #tests).
+
+    See doctest.__doc__ for an overview.
+
+    Optional keyword arg "name" gives the name of the module; by default
+    use m.__name__.
+
+    Optional keyword arg "globs" gives a dict to be used as the globals
+    when executing examples; by default, use m.__dict__.  A copy of this
+    dict is actually used for each docstring, so that each docstring's
+    examples start with a clean slate.
+
+    Optional keyword arg "extraglobs" gives a dictionary that should be
+    merged into the globals that are used to execute examples.  By
+    default, no extra globals are used.  This is new in 2.4.
+
+    Optional keyword arg "verbose" prints lots of stuff if true, prints
+    only failures if false; by default, it's true iff "-v" is in sys.argv.
+
+    Optional keyword arg "report" prints a summary at the end when true,
+    else prints nothing at the end.  In verbose mode, the summary is
+    detailed, else very brief (in fact, empty if all tests passed).
+
+    Optional keyword arg "optionflags" or's together module constants,
+    and defaults to 0.  This is new in 2.3.  Possible values (see the
+    docs for details):
+
+        DONT_ACCEPT_TRUE_FOR_1
+        DONT_ACCEPT_BLANKLINE
+        NORMALIZE_WHITESPACE
+        ELLIPSIS
+        IGNORE_EXCEPTION_DETAIL
+        REPORT_UDIFF
+        REPORT_CDIFF
+        REPORT_NDIFF
+        REPORT_ONLY_FIRST_FAILURE
+
+    Optional keyword arg "raise_on_error" raises an exception on the
+    first unexpected exception or failure. This allows failures to be
+    post-mortem debugged.
+
+    Deprecated in Python 2.4:
+    Optional keyword arg "isprivate" specifies a function used to
+    determine whether a name is private.  The default function is
+    treat all functions as public.  Optionally, "isprivate" can be
+    set to doctest.is_private to skip over functions marked as private
+    using the underscore naming convention; see its docs for details.
+
+    Advanced tomfoolery:  testmod runs methods of a local instance of
+    class doctest.Tester, then merges the results into (or creates)
+    global Tester instance doctest.master.  Methods of doctest.master
+    can be called directly too, if you want to do something unusual.
+    Passing report=0 to testmod is especially useful then, to delay
+    displaying a summary.  Invoke doctest.master.summarize(verbose)
+    when you're done fiddling.
+    """
+    global master
+
+    if isprivate is not None:
+        warnings.warn("the isprivate argument is deprecated; "
+                      "examine DocTestFinder.find() lists instead",
+                      DeprecationWarning)
+
+    # If no module was given, then use __main__.
+    if m is None:
+        # DWA - m will still be None if this wasn't invoked from the command
+        # line, in which case the following TypeError is about as good an error
+        # as we should expect
+        m = sys.modules.get('__main__')
+
+    # Check that we were actually given a module.
+    if not inspect.ismodule(m):
+        raise TypeError("testmod: module required; %r" % (m,))
+
+    # If no name was given, then use the module's name.
+    if name is None:
+        name = m.__name__
+
+    # Find, parse, and run all tests in the given module.
+    finder = DocTestFinder(_namefilter=isprivate, exclude_empty=exclude_empty)
+
+    if raise_on_error:
+        runner = DebugRunner(verbose=verbose, optionflags=optionflags)
+    else:
+        runner = DocTestRunner(verbose=verbose, optionflags=optionflags)
+
+    for test in finder.find(m, name, globs=globs, extraglobs=extraglobs):
+        runner.run(test)
+
+    if report:
+        runner.summarize()
+
+    if master is None:
+        master = runner
+    else:
+        master.merge(runner)
+
+    return runner.failures, runner.tries
+
+def testfile(filename, module_relative=True, name=None, package=None,
+             globs=None, verbose=None, report=True, optionflags=0,
+             extraglobs=None, raise_on_error=False, parser=DocTestParser()):
+    """
+    Test examples in the given file.  Return (#failures, #tests).
+
+    Optional keyword arg "module_relative" specifies how filenames
+    should be interpreted:
+
+      - If "module_relative" is True (the default), then "filename"
+         specifies a module-relative path.  By default, this path is
+         relative to the calling module's directory; but if the
+         "package" argument is specified, then it is relative to that
+         package.  To ensure os-independence, "filename" should use
+         "/" characters to separate path segments, and should not
+         be an absolute path (i.e., it may not begin with "/").
+
+      - If "module_relative" is False, then "filename" specifies an
+        os-specific path.  The path may be absolute or relative (to
+        the current working directory).
+
+    Optional keyword arg "name" gives the name of the test; by default
+    use the file's basename.
+
+    Optional keyword argument "package" is a Python package or the
+    name of a Python package whose directory should be used as the
+    base directory for a module relative filename.  If no package is
+    specified, then the calling module's directory is used as the base
+    directory for module relative filenames.  It is an error to
+    specify "package" if "module_relative" is False.
+
+    Optional keyword arg "globs" gives a dict to be used as the globals
+    when executing examples; by default, use {}.  A copy of this dict
+    is actually used for each docstring, so that each docstring's
+    examples start with a clean slate.
+
+    Optional keyword arg "extraglobs" gives a dictionary that should be
+    merged into the globals that are used to execute examples.  By
+    default, no extra globals are used.
+
+    Optional keyword arg "verbose" prints lots of stuff if true, prints
+    only failures if false; by default, it's true iff "-v" is in sys.argv.
+
+    Optional keyword arg "report" prints a summary at the end when true,
+    else prints nothing at the end.  In verbose mode, the summary is
+    detailed, else very brief (in fact, empty if all tests passed).
+
+    Optional keyword arg "optionflags" or's together module constants,
+    and defaults to 0.  Possible values (see the docs for details):
+
+        DONT_ACCEPT_TRUE_FOR_1
+        DONT_ACCEPT_BLANKLINE
+        NORMALIZE_WHITESPACE
+        ELLIPSIS
+        IGNORE_EXCEPTION_DETAIL
+        REPORT_UDIFF
+        REPORT_CDIFF
+        REPORT_NDIFF
+        REPORT_ONLY_FIRST_FAILURE
+
+    Optional keyword arg "raise_on_error" raises an exception on the
+    first unexpected exception or failure. This allows failures to be
+    post-mortem debugged.
+
+    Optional keyword arg "parser" specifies a DocTestParser (or
+    subclass) that should be used to extract tests from the files.
+
+    Advanced tomfoolery:  testmod runs methods of a local instance of
+    class doctest.Tester, then merges the results into (or creates)
+    global Tester instance doctest.master.  Methods of doctest.master
+    can be called directly too, if you want to do something unusual.
+    Passing report=0 to testmod is especially useful then, to delay
+    displaying a summary.  Invoke doctest.master.summarize(verbose)
+    when you're done fiddling.
+    """
+    global master
+
+    if package and not module_relative:
+        raise ValueError("Package may only be specified for module-"
+                         "relative paths.")
+
+    # Relativize the path
+    if module_relative:
+        package = _normalize_module(package)
+        filename = _module_relative_path(package, filename)
+
+    # If no name was given, then use the file's name.
+    if name is None:
+        name = os.path.basename(filename)
+
+    # Assemble the globals.
+    if globs is None:
+        globs = {}
+    else:
+        globs = globs.copy()
+    if extraglobs is not None:
+        globs.update(extraglobs)
+
+    if raise_on_error:
+        runner = DebugRunner(verbose=verbose, optionflags=optionflags)
+    else:
+        runner = DocTestRunner(verbose=verbose, optionflags=optionflags)
+
+    # Read the file, convert it to a test, and run it.
+    s = open(filename).read()
+    test = parser.get_doctest(s, globs, name, filename, 0)
+    runner.run(test)
+
+    if report:
+        runner.summarize()
+
+    if master is None:
+        master = runner
+    else:
+        master.merge(runner)
+
+    return runner.failures, runner.tries
+
+def run_docstring_examples(f, globs, verbose=False, name="NoName",
+                           compileflags=None, optionflags=0):
+    """
+    Test examples in the given object's docstring (`f`), using `globs`
+    as globals.  Optional argument `name` is used in failure messages.
+    If the optional argument `verbose` is true, then generate output
+    even if there are no failures.
+
+    `compileflags` gives the set of flags that should be used by the
+    Python compiler when running the examples.  If not specified, then
+    it will default to the set of future-import flags that apply to
+    `globs`.
+
+    Optional keyword arg `optionflags` specifies options for the
+    testing and output.  See the documentation for `testmod` for more
+    information.
+    """
+    # Find, parse, and run all tests in the given module.
+    finder = DocTestFinder(verbose=verbose, recurse=False)
+    runner = DocTestRunner(verbose=verbose, optionflags=optionflags)
+    for test in finder.find(f, name, globs=globs):
+        runner.run(test, compileflags=compileflags)
+
+######################################################################
+## 7. Tester
+######################################################################
+# This is provided only for backwards compatibility.  It's not
+# actually used in any way.
+
+class Tester:
+    def __init__(self, mod=None, globs=None, verbose=None,
+                 isprivate=None, optionflags=0):
+
+        warnings.warn("class Tester is deprecated; "
+                      "use class doctest.DocTestRunner instead",
+                      DeprecationWarning, stacklevel=2)
+        if mod is None and globs is None:
+            raise TypeError("Tester.__init__: must specify mod or globs")
+        if mod is not None and not inspect.ismodule(mod):
+            raise TypeError("Tester.__init__: mod must be a module; %r" %
+                            (mod,))
+        if globs is None:
+            globs = mod.__dict__
+        self.globs = globs
+
+        self.verbose = verbose
+        self.isprivate = isprivate
+        self.optionflags = optionflags
+        self.testfinder = DocTestFinder(_namefilter=isprivate)
+        self.testrunner = DocTestRunner(verbose=verbose,
+                                        optionflags=optionflags)
+
+    def runstring(self, s, name):
+        test = DocTestParser().get_doctest(s, self.globs, name, None, None)
+        if self.verbose:
+            print "Running string", name
+        (f,t) = self.testrunner.run(test)
+        if self.verbose:
+            print f, "of", t, "examples failed in string", name
+        return (f,t)
+
+    def rundoc(self, object, name=None, module=None):
+        f = t = 0
+        tests = self.testfinder.find(object, name, module=module,
+                                     globs=self.globs)
+        for test in tests:
+            (f2, t2) = self.testrunner.run(test)
+            (f,t) = (f+f2, t+t2)
+        return (f,t)
+
+    def rundict(self, d, name, module=None):
+        import new
+        m = new.module(name)
+        m.__dict__.update(d)
+        if module is None:
+            module = False
+        return self.rundoc(m, name, module)
+
+    def run__test__(self, d, name):
+        import new
+        m = new.module(name)
+        m.__test__ = d
+        return self.rundoc(m, name)
+
+    def summarize(self, verbose=None):
+        return self.testrunner.summarize(verbose)
+
+    def merge(self, other):
+        self.testrunner.merge(other.testrunner)
+
+######################################################################
+## 8. Unittest Support
+######################################################################
+
+_unittest_reportflags = 0
+
+def set_unittest_reportflags(flags):
+    """Sets the unittest option flags.
+
+    The old flag is returned so that a runner could restore the old
+    value if it wished to:
+
+      >>> old = _unittest_reportflags
+      >>> set_unittest_reportflags(REPORT_NDIFF |
+      ...                          REPORT_ONLY_FIRST_FAILURE) == old
+      True
+
+      >>> import doctest
+      >>> doctest._unittest_reportflags == (REPORT_NDIFF |
+      ...                                   REPORT_ONLY_FIRST_FAILURE)
+      True
+
+    Only reporting flags can be set:
+
+      >>> set_unittest_reportflags(ELLIPSIS)
+      Traceback (most recent call last):
+      ...
+      ValueError: ('Only reporting flags allowed', 8)
+
+      >>> set_unittest_reportflags(old) == (REPORT_NDIFF |
+      ...                                   REPORT_ONLY_FIRST_FAILURE)
+      True
+    """
+    global _unittest_reportflags
+
+    if (flags & REPORTING_FLAGS) != flags:
+        raise ValueError("Only reporting flags allowed", flags)
+    old = _unittest_reportflags
+    _unittest_reportflags = flags
+    return old
+
+
+class DocTestCase(unittest.TestCase):
+
+    def __init__(self, test, optionflags=0, setUp=None, tearDown=None,
+                 checker=None, runner=DocTestRunner):
+
+        unittest.TestCase.__init__(self)
+        self._dt_optionflags = optionflags
+        self._dt_checker = checker
+        self._dt_test = test
+        self._dt_setUp = setUp
+        self._dt_tearDown = tearDown
+        self._dt_runner = runner
+
+    def setUp(self):
+        test = self._dt_test
+
+        if self._dt_setUp is not None:
+            self._dt_setUp(test)
+
+    def tearDown(self):
+        test = self._dt_test
+
+        if self._dt_tearDown is not None:
+            self._dt_tearDown(test)
+
+        test.globs.clear()
+
+    def runTest(self):
+        test = self._dt_test
+        old = sys.stdout
+        new = StringIO()
+        optionflags = self._dt_optionflags
+
+        if not (optionflags & REPORTING_FLAGS):
+            # The option flags don't include any reporting flags,
+            # so add the default reporting flags
+            optionflags |= _unittest_reportflags
+
+        runner = self._dt_runner(optionflags=optionflags,
+                                 checker=self._dt_checker, verbose=False)
+
+        try:
+            runner.DIVIDER = "-"*70
+            failures, tries = runner.run(
+                test, out=new.write, clear_globs=False)
+        finally:
+            sys.stdout = old
+
+        if failures:
+            raise self.failureException(self.format_failure(new.getvalue()))
+
+    def format_failure(self, err):
+        test = self._dt_test
+        if test.lineno is None:
+            lineno = 'unknown line number'
+        else:
+            lineno = '%s' % test.lineno
+        lname = '.'.join(test.name.split('.')[-1:])
+        return ('Failed doctest test for %s\n'
+                '  File "%s", line %s, in %s\n\n%s'
+                % (test.name, test.filename, lineno, lname, err)
+                )
+
+    def debug(self):
+        r"""Run the test case without results and without catching exceptions
+
+           The unit test framework includes a debug method on test cases
+           and test suites to support post-mortem debugging.  The test code
+           is run in such a way that errors are not caught.  This way a
+           caller can catch the errors and initiate post-mortem debugging.
+
+           The DocTestCase provides a debug method that raises
+           UnexpectedException errors if there is an unexepcted
+           exception:
+
+             >>> test = DocTestParser().get_doctest('>>> raise KeyError\n42',
+             ...                {}, 'foo', 'foo.py', 0)
+             >>> case = DocTestCase(test)
+             >>> try:
+             ...     case.debug()
+             ... except UnexpectedException, failure:
+             ...     pass
+
+           The UnexpectedException contains the test, the example, and
+           the original exception:
+
+             >>> failure.test is test
+             True
+
+             >>> failure.example.want
+             '42\n'
+
+             >>> exc_info = failure.exc_info
+             >>> raise exc_info[0], exc_info[1], exc_info[2]
+             Traceback (most recent call last):
+             ...
+             KeyError
+
+           If the output doesn't match, then a DocTestFailure is raised:
+
+             >>> test = DocTestParser().get_doctest('''
+             ...      >>> x = 1
+             ...      >>> x
+             ...      2
+             ...      ''', {}, 'foo', 'foo.py', 0)
+             >>> case = DocTestCase(test)
+
+             >>> try:
+             ...    case.debug()
+             ... except DocTestFailure, failure:
+             ...    pass
+
+           DocTestFailure objects provide access to the test:
+
+             >>> failure.test is test
+             True
+
+           As well as to the example:
+
+             >>> failure.example.want
+             '2\n'
+
+           and the actual output:
+
+             >>> failure.got
+             '1\n'
+
+           """
+
+        self.setUp()
+        runner = DebugRunner(optionflags=self._dt_optionflags,
+                             checker=self._dt_checker, verbose=False)
+        runner.run(self._dt_test)
+        self.tearDown()
+
+    def id(self):
+        return self._dt_test.name
+
+    def __repr__(self):
+        name = self._dt_test.name.split('.')
+        return "%s (%s)" % (name[-1], '.'.join(name[:-1]))
+
+    __str__ = __repr__
+
+    def shortDescription(self):
+        return "Doctest: " + self._dt_test.name
+
+def DocTestSuite(module=None, globs=None, extraglobs=None, test_finder=None,
+                 test_class=DocTestCase, **options):
+    """
+    Convert doctest tests for a module to a unittest test suite.
+
+    This converts each documentation string in a module that
+    contains doctest tests to a unittest test case.  If any of the
+    tests in a doc string fail, then the test case fails.  An exception
+    is raised showing the name of the file containing the test and a
+    (sometimes approximate) line number.
+
+    The `module` argument provides the module to be tested.  The argument
+    can be either a module or a module name.
+
+    If no argument is given, the calling module is used.
+
+    A number of options may be provided as keyword arguments:
+
+    setUp
+      A set-up function.  This is called before running the
+      tests in each file. The setUp function will be passed a DocTest
+      object.  The setUp function can access the test globals as the
+      globs attribute of the test passed.
+
+    tearDown
+      A tear-down function.  This is called after running the
+      tests in each file.  The tearDown function will be passed a DocTest
+      object.  The tearDown function can access the test globals as the
+      globs attribute of the test passed.
+
+    globs
+      A dictionary containing initial global variables for the tests.
+
+    optionflags
+       A set of doctest option flags expressed as an integer.
+    """
+
+    if test_finder is None:
+        test_finder = DocTestFinder()
+
+    module = _normalize_module(module)
+    tests = test_finder.find(module, globs=globs, extraglobs=extraglobs)
+    if globs is None:
+        globs = module.__dict__
+    if not tests:
+        # Why do we want to do this? Because it reveals a bug that might
+        # otherwise be hidden.
+        raise ValueError(module, "has no tests")
+
+    tests.sort()
+    suite = unittest.TestSuite()
+    for test in tests:
+        if len(test.examples) == 0:
+            continue
+        if not test.filename:
+            filename = module.__file__
+            if filename[-4:] in (".pyc", ".pyo"):
+                filename = filename[:-1]
+            test.filename = filename
+        suite.addTest(test_class(test, **options))
+
+    return suite
+
+class DocFileCase(DocTestCase):
+
+    def id(self):
+        return '_'.join(self._dt_test.name.split('.'))
+
+    def __repr__(self):
+        return self._dt_test.filename
+    __str__ = __repr__
+
+    def format_failure(self, err):
+        return ('Failed doctest test for %s\n  File "%s", line 0\n\n%s'
+                % (self._dt_test.name, self._dt_test.filename, err)
+                )
+
+def DocFileTest(path, module_relative=True, package=None,
+                globs=None, parser=DocTestParser(), **options):
+    if globs is None:
+        globs = {}
+
+    if package and not module_relative:
+        raise ValueError("Package may only be specified for module-"
+                         "relative paths.")
+
+    # Relativize the path.
+    if module_relative:
+        package = _normalize_module(package)
+        path = _module_relative_path(package, path)
+
+    # Find the file and read it.
+    name = os.path.basename(path)
+    doc = open(path).read()
+
+    # Convert it to a test, and wrap it in a DocFileCase.
+    test = parser.get_doctest(doc, globs, name, path, 0)
+    return DocFileCase(test, **options)
+
+def DocFileSuite(*paths, **kw):
+    """A unittest suite for one or more doctest files.
+
+    The path to each doctest file is given as a string; the
+    interpretation of that string depends on the keyword argument
+    "module_relative".
+
+    A number of options may be provided as keyword arguments:
+
+    module_relative
+      If "module_relative" is True, then the given file paths are
+      interpreted as os-independent module-relative paths.  By
+      default, these paths are relative to the calling module's
+      directory; but if the "package" argument is specified, then
+      they are relative to that package.  To ensure os-independence,
+      "filename" should use "/" characters to separate path
+      segments, and may not be an absolute path (i.e., it may not
+      begin with "/").
+
+      If "module_relative" is False, then the given file paths are
+      interpreted as os-specific paths.  These paths may be absolute
+      or relative (to the current working directory).
+
+    package
+      A Python package or the name of a Python package whose directory
+      should be used as the base directory for module relative paths.
+      If "package" is not specified, then the calling module's
+      directory is used as the base directory for module relative
+      filenames.  It is an error to specify "package" if
+      "module_relative" is False.
+
+    setUp
+      A set-up function.  This is called before running the
+      tests in each file. The setUp function will be passed a DocTest
+      object.  The setUp function can access the test globals as the
+      globs attribute of the test passed.
+
+    tearDown
+      A tear-down function.  This is called after running the
+      tests in each file.  The tearDown function will be passed a DocTest
+      object.  The tearDown function can access the test globals as the
+      globs attribute of the test passed.
+
+    globs
+      A dictionary containing initial global variables for the tests.
+
+    optionflags
+      A set of doctest option flags expressed as an integer.
+
+    parser
+      A DocTestParser (or subclass) that should be used to extract
+      tests from the files.
+    """
+    suite = unittest.TestSuite()
+
+    # We do this here so that _normalize_module is called at the right
+    # level.  If it were called in DocFileTest, then this function
+    # would be the caller and we might guess the package incorrectly.
+    if kw.get('module_relative', True):
+        kw['package'] = _normalize_module(kw.get('package'))
+
+    for path in paths:
+        suite.addTest(DocFileTest(path, **kw))
+
+    return suite
+
+######################################################################
+## 9. Debugging Support
+######################################################################
+
+def script_from_examples(s):
+    r"""Extract script from text with examples.
+
+       Converts text with examples to a Python script.  Example input is
+       converted to regular code.  Example output and all other words
+       are converted to comments:
+
+       >>> text = '''
+       ...       Here are examples of simple math.
+       ...
+       ...           Python has super accurate integer addition
+       ...
+       ...           >>> 2 + 2
+       ...           5
+       ...
+       ...           And very friendly error messages:
+       ...
+       ...           >>> 1/0
+       ...           To Infinity
+       ...           And
+       ...           Beyond
+       ...
+       ...           You can use logic if you want:
+       ...
+       ...           >>> if 0:
+       ...           ...    blah
+       ...           ...    blah
+       ...           ...
+       ...
+       ...           Ho hum
+       ...           '''
+
+       >>> print script_from_examples(text)
+       # Here are examples of simple math.
+       #
+       #     Python has super accurate integer addition
+       #
+       2 + 2
+       # Expected:
+       ## 5
+       #
+       #     And very friendly error messages:
+       #
+       1/0
+       # Expected:
+       ## To Infinity
+       ## And
+       ## Beyond
+       #
+       #     You can use logic if you want:
+       #
+       if 0:
+          blah
+          blah
+       #
+       #     Ho hum
+       """
+    output = []
+    for piece in DocTestParser().parse(s):
+        if isinstance(piece, Example):
+            # Add the example's source code (strip trailing NL)
+            output.append(piece.source[:-1])
+            # Add the expected output:
+            want = piece.want
+            if want:
+                output.append('# Expected:')
+                output += ['## '+l for l in want.split('\n')[:-1]]
+        else:
+            # Add non-example text.
+            output += [_comment_line(l)
+                       for l in piece.split('\n')[:-1]]
+
+    # Trim junk on both ends.
+    while output and output[-1] == '#':
+        output.pop()
+    while output and output[0] == '#':
+        output.pop(0)
+    # Combine the output, and return it.
+    return '\n'.join(output)
+
+def testsource(module, name):
+    """Extract the test sources from a doctest docstring as a script.
+
+    Provide the module (or dotted name of the module) containing the
+    test to be debugged and the name (within the module) of the object
+    with the doc string with tests to be debugged.
+    """
+    module = _normalize_module(module)
+    tests = DocTestFinder().find(module)
+    test = [t for t in tests if t.name == name]
+    if not test:
+        raise ValueError(name, "not found in tests")
+    test = test[0]
+    testsrc = script_from_examples(test.docstring)
+    return testsrc
+
+def debug_src(src, pm=False, globs=None):
+    """Debug a single doctest docstring, in argument `src`'"""
+    testsrc = script_from_examples(src)
+    debug_script(testsrc, pm, globs)
+
+def debug_script(src, pm=False, globs=None):
+    "Debug a test script.  `src` is the script, as a string."
+    import pdb
+
+    # Note that tempfile.NameTemporaryFile() cannot be used.  As the
+    # docs say, a file so created cannot be opened by name a second time
+    # on modern Windows boxes, and execfile() needs to open it.
+    srcfilename = tempfile.mktemp(".py", "doctestdebug")
+    f = open(srcfilename, 'w')
+    f.write(src)
+    f.close()
+
+    try:
+        if globs:
+            globs = globs.copy()
+        else:
+            globs = {}
+
+        if pm:
+            try:
+                execfile(srcfilename, globs, globs)
+            except:
+                print sys.exc_info()[1]
+                pdb.post_mortem(sys.exc_info()[2])
+        else:
+            # Note that %r is vital here.  '%s' instead can, e.g., cause
+            # backslashes to get treated as metacharacters on Windows.
+            pdb.run("execfile(%r)" % srcfilename, globs, globs)
+
+    finally:
+        os.remove(srcfilename)
+
+def debug(module, name, pm=False):
+    """Debug a single doctest docstring.
+
+    Provide the module (or dotted name of the module) containing the
+    test to be debugged and the name (within the module) of the object
+    with the docstring with tests to be debugged.
+    """
+    module = _normalize_module(module)
+    testsrc = testsource(module, name)
+    debug_script(testsrc, pm, module.__dict__)
+
+######################################################################
+## 10. Example Usage
+######################################################################
+class _TestClass:
+    """
+    A pointless class, for sanity-checking of docstring testing.
+
+    Methods:
+        square()
+        get()
+
+    >>> _TestClass(13).get() + _TestClass(-12).get()
+    1
+    >>> hex(_TestClass(13).square().get())
+    '0xa9'
+    """
+
+    def __init__(self, val):
+        """val -> _TestClass object with associated value val.
+
+        >>> t = _TestClass(123)
+        >>> print t.get()
+        123
+        """
+
+        self.val = val
+
+    def square(self):
+        """square() -> square TestClass's associated value
+
+        >>> _TestClass(13).square().get()
+        169
+        """
+
+        self.val = self.val ** 2
+        return self
+
+    def get(self):
+        """get() -> return TestClass's associated value.
+
+        >>> x = _TestClass(-42)
+        >>> print x.get()
+        -42
+        """
+
+        return self.val
+
+__test__ = {"_TestClass": _TestClass,
+            "string": r"""
+                      Example of a string object, searched as-is.
+                      >>> x = 1; y = 2
+                      >>> x + y, x * y
+                      (3, 2)
+                      """,
+
+            "bool-int equivalence": r"""
+                                    In 2.2, boolean expressions displayed
+                                    0 or 1.  By default, we still accept
+                                    them.  This can be disabled by passing
+                                    DONT_ACCEPT_TRUE_FOR_1 to the new
+                                    optionflags argument.
+                                    >>> 4 == 4
+                                    1
+                                    >>> 4 == 4
+                                    True
+                                    >>> 4 > 4
+                                    0
+                                    >>> 4 > 4
+                                    False
+                                    """,
+
+            "blank lines": r"""
+                Blank lines can be marked with <BLANKLINE>:
+                    >>> print 'foo\n\nbar\n'
+                    foo
+                    <BLANKLINE>
+                    bar
+                    <BLANKLINE>
+            """,
+
+            "ellipsis": r"""
+                If the ellipsis flag is used, then '...' can be used to
+                elide substrings in the desired output:
+                    >>> print range(1000) #doctest: +ELLIPSIS
+                    [0, 1, 2, ..., 999]
+            """,
+
+            "whitespace normalization": r"""
+                If the whitespace normalization flag is used, then
+                differences in whitespace are ignored.
+                    >>> print range(30) #doctest: +NORMALIZE_WHITESPACE
+                    [0, 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]
+            """,
+           }
+
+def _test():
+    r = unittest.TextTestRunner()
+    r.run(DocTestSuite())
+
+if __name__ == "__main__":
+    _test()
diff --git a/webapp/django/test/client.py b/webapp/django/test/client.py
new file mode 100644
index 0000000..4d57f2d
--- /dev/null
+++ b/webapp/django/test/client.py
@@ -0,0 +1,335 @@
+import urllib
+import sys
+import os
+try:
+    from cStringIO import StringIO
+except ImportError:
+    from StringIO import StringIO
+
+from django.conf import settings
+from django.contrib.auth import authenticate, login
+from django.core.handlers.base import BaseHandler
+from django.core.handlers.wsgi import WSGIRequest
+from django.core.signals import got_request_exception
+from django.http import SimpleCookie, HttpRequest
+from django.template import TemplateDoesNotExist
+from django.test import signals
+from django.utils.functional import curry
+from django.utils.encoding import smart_str
+from django.utils.http import urlencode
+from django.utils.itercompat import is_iterable
+
+BOUNDARY = 'BoUnDaRyStRiNg'
+MULTIPART_CONTENT = 'multipart/form-data; boundary=%s' % BOUNDARY
+
+
+class FakePayload(object):
+    """
+    A wrapper around StringIO that restricts what can be read since data from
+    the network can't be seeked and cannot be read outside of its content
+    length. This makes sure that views can't do anything under the test client
+    that wouldn't work in Real Life.
+    """
+    def __init__(self, content):
+        self.__content = StringIO(content)
+        self.__len = len(content)
+
+    def read(self, num_bytes=None):
+        if num_bytes is None:
+            num_bytes = self.__len or 1
+        assert self.__len >= num_bytes, "Cannot read more than the available bytes from the HTTP incoming data."
+        content = self.__content.read(num_bytes)
+        self.__len -= num_bytes
+        return content
+
+
+class ClientHandler(BaseHandler):
+    """
+    A HTTP Handler that can be used for testing purposes.
+    Uses the WSGI interface to compose requests, but returns
+    the raw HttpResponse object
+    """
+    def __call__(self, environ):
+        from django.conf import settings
+        from django.core import signals
+
+        # Set up middleware if needed. We couldn't do this earlier, because
+        # settings weren't available.
+        if self._request_middleware is None:
+            self.load_middleware()
+
+        signals.request_started.send(sender=self.__class__)
+        try:
+            request = WSGIRequest(environ)
+            response = self.get_response(request)
+
+            # Apply response middleware.
+            for middleware_method in self._response_middleware:
+                response = middleware_method(request, response)
+            response = self.apply_response_fixes(request, response)
+        finally:
+            signals.request_finished.send(sender=self.__class__)
+
+        return response
+
+def store_rendered_templates(store, signal, sender, template, context, **kwargs):
+    """
+    Stores templates and contexts that are rendered.
+    """
+    store.setdefault('template',[]).append(template)
+    store.setdefault('context',[]).append(context)
+
+def encode_multipart(boundary, data):
+    """
+    Encodes multipart POST data from a dictionary of form values.
+
+    The key will be used as the form data name; the value will be transmitted
+    as content. If the value is a file, the contents of the file will be sent
+    as an application/octet-stream; otherwise, str(value) will be sent.
+    """
+    lines = []
+    to_str = lambda s: smart_str(s, settings.DEFAULT_CHARSET)
+
+    # Not by any means perfect, but good enough for our purposes.
+    is_file = lambda thing: hasattr(thing, "read") and callable(thing.read)
+
+    # Each bit of the multipart form data could be either a form value or a
+    # file, or a *list* of form values and/or files. Remember that HTTP field
+    # names can be duplicated!
+    for (key, value) in data.items():
+        if is_file(value):
+            lines.extend(encode_file(boundary, key, value))
+        elif not isinstance(value, basestring) and is_iterable(value):
+            for item in value:
+                if is_file(item):
+                    lines.extend(encode_file(boundary, key, item))
+                else:
+                    lines.extend([
+                        '--' + boundary,
+                        'Content-Disposition: form-data; name="%s"' % to_str(key),
+                        '',
+                        to_str(item)
+                    ])
+        else:
+            lines.extend([
+                '--' + boundary,
+                'Content-Disposition: form-data; name="%s"' % to_str(key),
+                '',
+                to_str(value)
+            ])
+
+    lines.extend([
+        '--' + boundary + '--',
+        '',
+    ])
+    return '\r\n'.join(lines)
+
+def encode_file(boundary, key, file):
+    to_str = lambda s: smart_str(s, settings.DEFAULT_CHARSET)
+    return [
+        '--' + boundary,
+        'Content-Disposition: form-data; name="%s"; filename="%s"' \
+            % (to_str(key), to_str(os.path.basename(file.name))),
+        'Content-Type: application/octet-stream',
+        '',
+        file.read()
+    ]
+    
+class Client:
+    """
+    A class that can act as a client for testing purposes.
+
+    It allows the user to compose GET and POST requests, and
+    obtain the response that the server gave to those requests.
+    The server Response objects are annotated with the details
+    of the contexts and templates that were rendered during the
+    process of serving the request.
+
+    Client objects are stateful - they will retain cookie (and
+    thus session) details for the lifetime of the Client instance.
+
+    This is not intended as a replacement for Twill/Selenium or
+    the like - it is here to allow testing against the
+    contexts and templates produced by a view, rather than the
+    HTML rendered to the end-user.
+    """
+    def __init__(self, **defaults):
+        self.handler = ClientHandler()
+        self.defaults = defaults
+        self.cookies = SimpleCookie()
+        self.exc_info = None
+
+    def store_exc_info(self, **kwargs):
+        """
+        Stores exceptions when they are generated by a view.
+        """
+        self.exc_info = sys.exc_info()
+
+    def _session(self):
+        """
+        Obtains the current session variables.
+        """
+        if 'django.contrib.sessions' in settings.INSTALLED_APPS:
+            engine = __import__(settings.SESSION_ENGINE, {}, {}, [''])
+            cookie = self.cookies.get(settings.SESSION_COOKIE_NAME, None)
+            if cookie:
+                return engine.SessionStore(cookie.value)
+        return {}
+    session = property(_session)
+
+    def request(self, **request):
+        """
+        The master request method. Composes the environment dictionary
+        and passes to the handler, returning the result of the handler.
+        Assumes defaults for the query environment, which can be overridden
+        using the arguments to the request.
+        """
+        environ = {
+            'HTTP_COOKIE':      self.cookies,
+            'PATH_INFO':         '/',
+            'QUERY_STRING':      '',
+            'REQUEST_METHOD':    'GET',
+            'SCRIPT_NAME':       '',
+            'SERVER_NAME':       'testserver',
+            'SERVER_PORT':       80,
+            'SERVER_PROTOCOL':   'HTTP/1.1',
+        }
+        environ.update(self.defaults)
+        environ.update(request)
+
+        # Curry a data dictionary into an instance of the template renderer
+        # callback function.
+        data = {}
+        on_template_render = curry(store_rendered_templates, data)
+        signals.template_rendered.connect(on_template_render)
+
+        # Capture exceptions created by the handler.
+        got_request_exception.connect(self.store_exc_info)
+
+        try:
+            response = self.handler(environ)
+        except TemplateDoesNotExist, e:
+            # If the view raises an exception, Django will attempt to show
+            # the 500.html template. If that template is not available,
+            # we should ignore the error in favor of re-raising the
+            # underlying exception that caused the 500 error. Any other
+            # template found to be missing during view error handling
+            # should be reported as-is.
+            if e.args != ('500.html',):
+                raise
+
+        # Look for a signalled exception, clear the current context
+        # exception data, then re-raise the signalled exception.
+        # Also make sure that the signalled exception is cleared from
+        # the local cache!
+        if self.exc_info:
+            exc_info = self.exc_info
+            self.exc_info = None
+            raise exc_info[1], None, exc_info[2]
+
+        # Save the client and request that stimulated the response.
+        response.client = self
+        response.request = request
+
+        # Add any rendered template detail to the response.
+        # If there was only one template rendered (the most likely case),
+        # flatten the list to a single element.
+        for detail in ('template', 'context'):
+            if data.get(detail):
+                if len(data[detail]) == 1:
+                    setattr(response, detail, data[detail][0]);
+                else:
+                    setattr(response, detail, data[detail])
+            else:
+                setattr(response, detail, None)
+
+        # Update persistent cookie data.
+        if response.cookies:
+            self.cookies.update(response.cookies)
+
+        return response
+
+    def get(self, path, data={}, **extra):
+        """
+        Requests a response from the server using GET.
+        """
+        r = {
+            'CONTENT_LENGTH':  None,
+            'CONTENT_TYPE':    'text/html; charset=utf-8',
+            'PATH_INFO':       urllib.unquote(path),
+            'QUERY_STRING':    urlencode(data, doseq=True),
+            'REQUEST_METHOD': 'GET',
+        }
+        r.update(extra)
+
+        return self.request(**r)
+
+    def post(self, path, data={}, content_type=MULTIPART_CONTENT, **extra):
+        """
+        Requests a response from the server using POST.
+        """
+        if content_type is MULTIPART_CONTENT:
+            post_data = encode_multipart(BOUNDARY, data)
+        else:
+            post_data = data
+
+        r = {
+            'CONTENT_LENGTH': len(post_data),
+            'CONTENT_TYPE':   content_type,
+            'PATH_INFO':      urllib.unquote(path),
+            'REQUEST_METHOD': 'POST',
+            'wsgi.input':     FakePayload(post_data),
+        }
+        r.update(extra)
+
+        return self.request(**r)
+
+    def login(self, **credentials):
+        """
+        Sets the Client to appear as if it has successfully logged into a site.
+
+        Returns True if login is possible; False if the provided credentials
+        are incorrect, or the user is inactive, or if the sessions framework is
+        not available.
+        """
+        user = authenticate(**credentials)
+        if user and user.is_active \
+                and 'django.contrib.sessions' in settings.INSTALLED_APPS:
+            engine = __import__(settings.SESSION_ENGINE, {}, {}, [''])
+
+            # Create a fake request to store login details.
+            request = HttpRequest()
+            if self.session:
+                request.session = self.session
+            else:
+                request.session = engine.SessionStore()
+            login(request, user)
+
+            # Set the cookie to represent the session.
+            session_cookie = settings.SESSION_COOKIE_NAME
+            self.cookies[session_cookie] = request.session.session_key
+            cookie_data = {
+                'max-age': None,
+                'path': '/',
+                'domain': settings.SESSION_COOKIE_DOMAIN,
+                'secure': settings.SESSION_COOKIE_SECURE or None,
+                'expires': None,
+            }
+            self.cookies[session_cookie].update(cookie_data)
+
+            # Save the session values.
+            request.session.save()
+
+            return True
+        else:
+            return False
+
+    def logout(self):
+        """
+        Removes the authenticated user's cookies.
+
+        Causes the authenticated user to be logged out.
+        """
+        session = __import__(settings.SESSION_ENGINE, {}, {}, ['']).SessionStore()
+        session.delete(session_key=self.cookies[settings.SESSION_COOKIE_NAME].value)
+        self.cookies = SimpleCookie()
diff --git a/webapp/django/test/signals.py b/webapp/django/test/signals.py
new file mode 100644
index 0000000..a328a77
--- /dev/null
+++ b/webapp/django/test/signals.py
@@ -0,0 +1,3 @@
+from django.dispatch import Signal
+
+template_rendered = Signal(providing_args=["template", "context"])
diff --git a/webapp/django/test/simple.py b/webapp/django/test/simple.py
new file mode 100644
index 0000000..ce9f59e
--- /dev/null
+++ b/webapp/django/test/simple.py
@@ -0,0 +1,148 @@
+import unittest
+from django.conf import settings
+from django.db.models import get_app, get_apps
+from django.test import _doctest as doctest
+from django.test.utils import setup_test_environment, teardown_test_environment
+from django.test.testcases import OutputChecker, DocTestRunner
+
+# The module name for tests outside models.py
+TEST_MODULE = 'tests'
+    
+doctestOutputChecker = OutputChecker()
+
+def get_tests(app_module):
+    try:
+        app_path = app_module.__name__.split('.')[:-1]
+        test_module = __import__('.'.join(app_path + [TEST_MODULE]), {}, {}, TEST_MODULE)
+    except ImportError, e:
+        # Couldn't import tests.py. Was it due to a missing file, or
+        # due to an import error in a tests.py that actually exists?
+        import os.path
+        from imp import find_module
+        try:
+            mod = find_module(TEST_MODULE, [os.path.dirname(app_module.__file__)])
+        except ImportError:
+            # 'tests' module doesn't exist. Move on.
+            test_module = None
+        else:
+            # The module exists, so there must be an import error in the 
+            # test module itself. We don't need the module; so if the
+            # module was a single file module (i.e., tests.py), close the file
+            # handle returned by find_module. Otherwise, the test module
+            # is a directory, and there is nothing to close.
+            if mod[0]:
+                mod[0].close()
+            raise
+    return test_module
+    
+def build_suite(app_module):
+    "Create a complete Django test suite for the provided application module"
+    suite = unittest.TestSuite()
+    
+    # Load unit and doctests in the models.py module. If module has
+    # a suite() method, use it. Otherwise build the test suite ourselves.
+    if hasattr(app_module, 'suite'):
+        suite.addTest(app_module.suite())
+    else:
+        suite.addTest(unittest.defaultTestLoader.loadTestsFromModule(app_module))
+        try:
+            suite.addTest(doctest.DocTestSuite(app_module,
+                                               checker=doctestOutputChecker,
+                                               runner=DocTestRunner))
+        except ValueError:
+            # No doc tests in models.py
+            pass
+    
+    # Check to see if a separate 'tests' module exists parallel to the 
+    # models module
+    test_module = get_tests(app_module)
+    if test_module:
+        # Load unit and doctests in the tests.py module. If module has
+        # a suite() method, use it. Otherwise build the test suite ourselves.
+        if hasattr(test_module, 'suite'):
+            suite.addTest(test_module.suite())
+        else:
+            suite.addTest(unittest.defaultTestLoader.loadTestsFromModule(test_module))
+            try:            
+                suite.addTest(doctest.DocTestSuite(test_module, 
+                                                   checker=doctestOutputChecker,
+                                                   runner=DocTestRunner))
+            except ValueError:
+                # No doc tests in tests.py
+                pass
+    return suite
+
+def build_test(label):
+    """Construct a test case a test with the specified label. Label should 
+    be of the form model.TestClass or model.TestClass.test_method. Returns
+    an instantiated test or test suite corresponding to the label provided.
+        
+    """
+    parts = label.split('.')
+    if len(parts) < 2 or len(parts) > 3:
+        raise ValueError("Test label '%s' should be of the form app.TestCase or app.TestCase.test_method" % label)
+    
+    app_module = get_app(parts[0])
+    TestClass = getattr(app_module, parts[1], None)
+
+    # Couldn't find the test class in models.py; look in tests.py
+    if TestClass is None:
+        test_module = get_tests(app_module)
+        if test_module:
+            TestClass = getattr(test_module, parts[1], None)
+
+    if len(parts) == 2: # label is app.TestClass
+        try:
+            return unittest.TestLoader().loadTestsFromTestCase(TestClass)
+        except TypeError:
+            raise ValueError("Test label '%s' does not refer to a test class" % label)            
+    else: # label is app.TestClass.test_method
+        return TestClass(parts[2])
+
+def run_tests(test_labels, verbosity=1, interactive=True, extra_tests=[]):
+    """
+    Run the unit tests for all the test labels in the provided list.
+    Labels must be of the form:
+     - app.TestClass.test_method
+        Run a single specific test method
+     - app.TestClass
+        Run all the test methods in a given class
+     - app
+        Search for doctests and unittests in the named application.
+
+    When looking for tests, the test runner will look in the models and
+    tests modules for the application.
+    
+    A list of 'extra' tests may also be provided; these tests
+    will be added to the test suite.
+    
+    Returns the number of tests that failed.
+    """
+    setup_test_environment()
+    
+    settings.DEBUG = False    
+    suite = unittest.TestSuite()
+    
+    if test_labels:
+        for label in test_labels:
+            if '.' in label:
+                suite.addTest(build_test(label))
+            else:
+                app = get_app(label)
+                suite.addTest(build_suite(app))
+    else:
+        for app in get_apps():
+            suite.addTest(build_suite(app))
+    
+    for test in extra_tests:
+        suite.addTest(test)
+
+    old_name = settings.DATABASE_NAME
+    from django.db import connection
+    connection.creation.create_test_db(verbosity, autoclobber=not interactive)
+    result = unittest.TextTestRunner(verbosity=verbosity).run(suite)
+    connection.creation.destroy_test_db(old_name, verbosity)
+    
+    teardown_test_environment()
+    
+    return len(result.failures) + len(result.errors)
diff --git a/webapp/django/test/testcases.py b/webapp/django/test/testcases.py
new file mode 100644
index 0000000..dcab078
--- /dev/null
+++ b/webapp/django/test/testcases.py
@@ -0,0 +1,356 @@
+import re
+import unittest
+from urlparse import urlsplit, urlunsplit
+from xml.dom.minidom import parseString, Node
+
+from django.conf import settings
+from django.core import mail
+from django.core.management import call_command
+from django.core.urlresolvers import clear_url_caches
+from django.db import transaction
+from django.http import QueryDict
+from django.test import _doctest as doctest
+from django.test.client import Client
+from django.utils import simplejson
+
+normalize_long_ints = lambda s: re.sub(r'(?<![\w])(\d+)L(?![\w])', '\\1', s)
+
+def to_list(value):
+    """
+    Puts value into a list if it's not already one.
+    Returns an empty list if value is None.
+    """
+    if value is None:
+        value = []
+    elif not isinstance(value, list):
+        value = [value]
+    return value
+
+
+class OutputChecker(doctest.OutputChecker):
+    def check_output(self, want, got, optionflags):
+        "The entry method for doctest output checking. Defers to a sequence of child checkers"
+        checks = (self.check_output_default,
+                  self.check_output_long,
+                  self.check_output_xml,
+                  self.check_output_json)
+        for check in checks:
+            if check(want, got, optionflags):
+                return True
+        return False
+
+    def check_output_default(self, want, got, optionflags):
+        "The default comparator provided by doctest - not perfect, but good for most purposes"
+        return doctest.OutputChecker.check_output(self, want, got, optionflags)
+
+    def check_output_long(self, want, got, optionflags):
+        """Doctest does an exact string comparison of output, which means long
+        integers aren't equal to normal integers ("22L" vs. "22"). The
+        following code normalizes long integers so that they equal normal
+        integers.
+        """
+        return normalize_long_ints(want) == normalize_long_ints(got)
+
+    def check_output_xml(self, want, got, optionsflags):
+        """Tries to do a 'xml-comparision' of want and got.  Plain string
+        comparision doesn't always work because, for example, attribute
+        ordering should not be important.
+        
+        Based on http://codespeak.net/svn/lxml/trunk/src/lxml/doctestcompare.py
+        """
+        _norm_whitespace_re = re.compile(r'[ \t\n][ \t\n]+')
+        def norm_whitespace(v):
+            return _norm_whitespace_re.sub(' ', v)
+
+        def child_text(element):
+            return ''.join([c.data for c in element.childNodes
+                            if c.nodeType == Node.TEXT_NODE])
+
+        def children(element):
+            return [c for c in element.childNodes
+                    if c.nodeType == Node.ELEMENT_NODE]
+
+        def norm_child_text(element):
+            return norm_whitespace(child_text(element))
+
+        def attrs_dict(element):
+            return dict(element.attributes.items())
+
+        def check_element(want_element, got_element):
+            if want_element.tagName != got_element.tagName:
+                return False
+            if norm_child_text(want_element) != norm_child_text(got_element):
+                return False
+            if attrs_dict(want_element) != attrs_dict(got_element):
+                return False
+            want_children = children(want_element)
+            got_children = children(got_element)
+            if len(want_children) != len(got_children):
+                return False
+            for want, got in zip(want_children, got_children):
+                if not check_element(want, got):
+                    return False
+            return True
+
+        want, got = self._strip_quotes(want, got)
+        want = want.replace('\\n','\n')
+        got = got.replace('\\n','\n')
+
+        # If the string is not a complete xml document, we may need to add a
+        # root element. This allow us to compare fragments, like "<foo/><bar/>"
+        if not want.startswith('<?xml'):
+            wrapper = '<root>%s</root>'
+            want = wrapper % want
+            got = wrapper % got
+            
+        # Parse the want and got strings, and compare the parsings.
+        try:
+            want_root = parseString(want).firstChild
+            got_root = parseString(got).firstChild
+        except:
+            return False
+        return check_element(want_root, got_root)
+
+    def check_output_json(self, want, got, optionsflags):
+        "Tries to compare want and got as if they were JSON-encoded data"
+        want, got = self._strip_quotes(want, got)
+        try:
+            want_json = simplejson.loads(want)
+            got_json = simplejson.loads(got)
+        except:
+            return False
+        return want_json == got_json
+
+    def _strip_quotes(self, want, got):
+        """
+        Strip quotes of doctests output values:
+
+        >>> o = OutputChecker()
+        >>> o._strip_quotes("'foo'")
+        "foo"
+        >>> o._strip_quotes('"foo"')
+        "foo"
+        >>> o._strip_quotes("u'foo'")
+        "foo"
+        >>> o._strip_quotes('u"foo"')
+        "foo"
+        """
+        def is_quoted_string(s):
+            s = s.strip()
+            return (len(s) >= 2
+                    and s[0] == s[-1]
+                    and s[0] in ('"', "'"))
+
+        def is_quoted_unicode(s):
+            s = s.strip()
+            return (len(s) >= 3
+                    and s[0] == 'u'
+                    and s[1] == s[-1]
+                    and s[1] in ('"', "'"))
+
+        if is_quoted_string(want) and is_quoted_string(got):
+            want = want.strip()[1:-1]
+            got = got.strip()[1:-1]
+        elif is_quoted_unicode(want) and is_quoted_unicode(got):
+            want = want.strip()[2:-1]
+            got = got.strip()[2:-1]
+        return want, got
+
+
+class DocTestRunner(doctest.DocTestRunner):
+    def __init__(self, *args, **kwargs):
+        doctest.DocTestRunner.__init__(self, *args, **kwargs)
+        self.optionflags = doctest.ELLIPSIS
+
+    def report_unexpected_exception(self, out, test, example, exc_info):
+        doctest.DocTestRunner.report_unexpected_exception(self, out, test,
+                                                          example, exc_info)
+        # Rollback, in case of database errors. Otherwise they'd have
+        # side effects on other tests.
+        transaction.rollback_unless_managed()
+
+class TestCase(unittest.TestCase):
+    def _pre_setup(self):
+        """Performs any pre-test setup. This includes:
+
+            * Flushing the database.
+            * If the Test Case class has a 'fixtures' member, installing the 
+              named fixtures.
+            * If the Test Case class has a 'urls' member, replace the
+              ROOT_URLCONF with it.
+            * Clearing the mail test outbox.
+        """
+        call_command('flush', verbosity=0, interactive=False)
+        if hasattr(self, 'fixtures'):
+            # We have to use this slightly awkward syntax due to the fact
+            # that we're using *args and **kwargs together.
+            call_command('loaddata', *self.fixtures, **{'verbosity': 0})
+        if hasattr(self, 'urls'):
+            self._old_root_urlconf = settings.ROOT_URLCONF
+            settings.ROOT_URLCONF = self.urls
+            clear_url_caches()
+        mail.outbox = []
+
+    def __call__(self, result=None):
+        """
+        Wrapper around default __call__ method to perform common Django test
+        set up. This means that user-defined Test Cases aren't required to
+        include a call to super().setUp().
+        """
+        self.client = Client()
+        try:
+            self._pre_setup()
+        except (KeyboardInterrupt, SystemExit):
+            raise
+        except Exception:
+            import sys
+            result.addError(self, sys.exc_info())
+            return
+        super(TestCase, self).__call__(result)
+        try:
+            self._post_teardown()
+        except (KeyboardInterrupt, SystemExit):
+            raise
+        except Exception:
+            import sys
+            result.addError(self, sys.exc_info())
+            return
+
+    def _post_teardown(self):
+        """ Performs any post-test things. This includes:
+
+            * Putting back the original ROOT_URLCONF if it was changed.
+        """
+        if hasattr(self, '_old_root_urlconf'):
+            settings.ROOT_URLCONF = self._old_root_urlconf
+            clear_url_caches()
+
+    def assertRedirects(self, response, expected_url, status_code=302,
+                        target_status_code=200, host=None):
+        """Asserts that a response redirected to a specific URL, and that the
+        redirect URL can be loaded.
+
+        Note that assertRedirects won't work for external links since it uses
+        TestClient to do a request.
+        """
+        self.assertEqual(response.status_code, status_code,
+            ("Response didn't redirect as expected: Response code was %d"
+             " (expected %d)" % (response.status_code, status_code)))
+        url = response['Location']
+        scheme, netloc, path, query, fragment = urlsplit(url)
+        e_scheme, e_netloc, e_path, e_query, e_fragment = urlsplit(expected_url)
+        if not (e_scheme or e_netloc):
+            expected_url = urlunsplit(('http', host or 'testserver', e_path,
+                    e_query, e_fragment))
+        self.assertEqual(url, expected_url,
+            "Response redirected to '%s', expected '%s'" % (url, expected_url))
+
+        # Get the redirection page, using the same client that was used
+        # to obtain the original response.
+        redirect_response = response.client.get(path, QueryDict(query))
+        self.assertEqual(redirect_response.status_code, target_status_code,
+            ("Couldn't retrieve redirection page '%s': response code was %d"
+             " (expected %d)") %
+                 (path, redirect_response.status_code, target_status_code))
+
+    def assertContains(self, response, text, count=None, status_code=200):
+        """
+        Asserts that a response indicates that a page was retrieved
+        successfully, (i.e., the HTTP status code was as expected), and that
+        ``text`` occurs ``count`` times in the content of the response.
+        If ``count`` is None, the count doesn't matter - the assertion is true
+        if the text occurs at least once in the response.
+        """
+        self.assertEqual(response.status_code, status_code,
+            "Couldn't retrieve page: Response code was %d (expected %d)'" %
+                (response.status_code, status_code))
+        real_count = response.content.count(text)
+        if count is not None:
+            self.assertEqual(real_count, count,
+                "Found %d instances of '%s' in response (expected %d)" %
+                    (real_count, text, count))
+        else:
+            self.failUnless(real_count != 0,
+                            "Couldn't find '%s' in response" % text)
+
+    def assertNotContains(self, response, text, status_code=200):
+        """
+        Asserts that a response indicates that a page was retrieved
+        successfully, (i.e., the HTTP status code was as expected), and that
+        ``text`` doesn't occurs in the content of the response.
+        """
+        self.assertEqual(response.status_code, status_code,
+            "Couldn't retrieve page: Response code was %d (expected %d)'" %
+                (response.status_code, status_code))
+        self.assertEqual(response.content.count(text), 0,
+                         "Response should not contain '%s'" % text)
+
+    def assertFormError(self, response, form, field, errors):
+        """
+        Asserts that a form used to render the response has a specific field
+        error.
+        """
+        # Put context(s) into a list to simplify processing.
+        contexts = to_list(response.context)
+        if not contexts:
+            self.fail('Response did not use any contexts to render the'
+                      ' response')
+
+        # Put error(s) into a list to simplify processing.
+        errors = to_list(errors)
+
+        # Search all contexts for the error.
+        found_form = False
+        for i,context in enumerate(contexts):
+            if form not in context:
+                continue
+            found_form = True
+            for err in errors:
+                if field:
+                    if field in context[form].errors:
+                        field_errors = context[form].errors[field]
+                        self.failUnless(err in field_errors,
+                                        "The field '%s' on form '%s' in"
+                                        " context %d does not contain the"
+                                        " error '%s' (actual errors: %s)" %
+                                            (field, form, i, err,
+                                             repr(field_errors)))
+                    elif field in context[form].fields:
+                        self.fail("The field '%s' on form '%s' in context %d"
+                                  " contains no errors" % (field, form, i))
+                    else:
+                        self.fail("The form '%s' in context %d does not"
+                                  " contain the field '%s'" %
+                                      (form, i, field))
+                else:
+                    non_field_errors = context[form].non_field_errors()
+                    self.failUnless(err in non_field_errors,
+                        "The form '%s' in context %d does not contain the"
+                        " non-field error '%s' (actual errors: %s)" %
+                            (form, i, err, non_field_errors))
+        if not found_form:
+            self.fail("The form '%s' was not used to render the response" %
+                          form)
+
+    def assertTemplateUsed(self, response, template_name):
+        """
+        Asserts that the template with the provided name was used in rendering
+        the response.
+        """
+        template_names = [t.name for t in to_list(response.template)]
+        if not template_names:
+            self.fail('No templates used to render the response')
+        self.failUnless(template_name in template_names,
+            (u"Template '%s' was not a template used to render the response."
+             u" Actual template(s) used: %s") % (template_name,
+                                                 u', '.join(template_names)))
+
+    def assertTemplateNotUsed(self, response, template_name):
+        """
+        Asserts that the template with the provided name was NOT used in
+        rendering the response.
+        """
+        template_names = [t.name for t in to_list(response.template)]
+        self.failIf(template_name in template_names,
+            (u"Template '%s' was used unexpectedly in rendering the"
+             u" response") % template_name)
diff --git a/webapp/django/test/utils.py b/webapp/django/test/utils.py
new file mode 100644
index 0000000..69bd25b
--- /dev/null
+++ b/webapp/django/test/utils.py
@@ -0,0 +1,67 @@
+import sys, time, os
+from django.conf import settings
+from django.db import connection
+from django.core import mail
+from django.test import signals
+from django.template import Template
+from django.utils.translation import deactivate
+
+def instrumented_test_render(self, context):
+    """
+    An instrumented Template render method, providing a signal
+    that can be intercepted by the test system Client
+    """
+    signals.template_rendered.send(sender=self, template=self, context=context)
+    return self.nodelist.render(context)
+
+class TestSMTPConnection(object):
+    """A substitute SMTP connection for use during test sessions.
+    The test connection stores email messages in a dummy outbox,
+    rather than sending them out on the wire.
+
+    """
+    def __init__(*args, **kwargs):
+        pass
+    def open(self):
+        "Mock the SMTPConnection open() interface"
+        pass
+    def close(self):
+        "Mock the SMTPConnection close() interface"
+        pass
+    def send_messages(self, messages):
+        "Redirect messages to the dummy outbox"
+        mail.outbox.extend(messages)
+        return len(messages)
+
+def setup_test_environment():
+    """Perform any global pre-test setup. This involves:
+
+        - Installing the instrumented test renderer
+        - Diverting the email sending functions to a test buffer
+        - Setting the active locale to match the LANGUAGE_CODE setting.
+    """
+    Template.original_render = Template.render
+    Template.render = instrumented_test_render
+
+    mail.original_SMTPConnection = mail.SMTPConnection
+    mail.SMTPConnection = TestSMTPConnection
+
+    mail.outbox = []
+
+    deactivate()
+
+def teardown_test_environment():
+    """Perform any global post-test teardown. This involves:
+
+        - Restoring the original test renderer
+        - Restoring the email sending functions
+
+    """
+    Template.render = Template.original_render
+    del Template.original_render
+
+    mail.SMTPConnection = mail.original_SMTPConnection
+    del mail.original_SMTPConnection
+
+    del mail.outbox
+
diff --git a/webapp/django/utils/__init__.py b/webapp/django/utils/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/utils/__init__.py
diff --git a/webapp/django/utils/_decimal.py b/webapp/django/utils/_decimal.py
new file mode 100644
index 0000000..677d26b
--- /dev/null
+++ b/webapp/django/utils/_decimal.py
@@ -0,0 +1,3079 @@
+# Copyright (c) 2004 Python Software Foundation.
+# All rights reserved.
+
+# Written by Eric Price <eprice at tjhsst.edu>
+#    and Facundo Batista <facundo at taniquetil.com.ar>
+#    and Raymond Hettinger <python at rcn.com>
+#    and Aahz <aahz at pobox.com>
+#    and Tim Peters
+
+# This module is currently Py2.3 compatible and should be kept that way
+# unless a major compelling advantage arises.  IOW, 2.3 compatibility is
+# strongly preferred, but not guaranteed.
+
+# Also, this module should be kept in sync with the latest updates of
+# the IBM specification as it evolves.  Those updates will be treated
+# as bug fixes (deviation from the spec is a compatibility, usability
+# bug) and will be backported.  At this point the spec is stabilizing
+# and the updates are becoming fewer, smaller, and less significant.
+
+"""
+This is a Py2.3 implementation of decimal floating point arithmetic based on
+the General Decimal Arithmetic Specification:
+
+    www2.hursley.ibm.com/decimal/decarith.html
+
+and IEEE standard 854-1987:
+
+    www.cs.berkeley.edu/~ejr/projects/754/private/drafts/854-1987/dir.html
+
+Decimal floating point has finite precision with arbitrarily large bounds.
+
+The purpose of the module is to support arithmetic using familiar
+"schoolhouse" rules and to avoid the some of tricky representation
+issues associated with binary floating point.  The package is especially
+useful for financial applications or for contexts where users have
+expectations that are at odds with binary floating point (for instance,
+in binary floating point, 1.00 % 0.1 gives 0.09999999999999995 instead
+of the expected Decimal("0.00") returned by decimal floating point).
+
+Here are some examples of using the decimal module:
+
+>>> from decimal import *
+>>> setcontext(ExtendedContext)
+>>> Decimal(0)
+Decimal("0")
+>>> Decimal("1")
+Decimal("1")
+>>> Decimal("-.0123")
+Decimal("-0.0123")
+>>> Decimal(123456)
+Decimal("123456")
+>>> Decimal("123.45e12345678901234567890")
+Decimal("1.2345E+12345678901234567892")
+>>> Decimal("1.33") + Decimal("1.27")
+Decimal("2.60")
+>>> Decimal("12.34") + Decimal("3.87") - Decimal("18.41")
+Decimal("-2.20")
+>>> dig = Decimal(1)
+>>> print dig / Decimal(3)
+0.333333333
+>>> getcontext().prec = 18
+>>> print dig / Decimal(3)
+0.333333333333333333
+>>> print dig.sqrt()
+1
+>>> print Decimal(3).sqrt()
+1.73205080756887729
+>>> print Decimal(3) ** 123
+4.85192780976896427E+58
+>>> inf = Decimal(1) / Decimal(0)
+>>> print inf
+Infinity
+>>> neginf = Decimal(-1) / Decimal(0)
+>>> print neginf
+-Infinity
+>>> print neginf + inf
+NaN
+>>> print neginf * inf
+-Infinity
+>>> print dig / 0
+Infinity
+>>> getcontext().traps[DivisionByZero] = 1
+>>> print dig / 0
+Traceback (most recent call last):
+  ...
+  ...
+  ...
+DivisionByZero: x / 0
+>>> c = Context()
+>>> c.traps[InvalidOperation] = 0
+>>> print c.flags[InvalidOperation]
+0
+>>> c.divide(Decimal(0), Decimal(0))
+Decimal("NaN")
+>>> c.traps[InvalidOperation] = 1
+>>> print c.flags[InvalidOperation]
+1
+>>> c.flags[InvalidOperation] = 0
+>>> print c.flags[InvalidOperation]
+0
+>>> print c.divide(Decimal(0), Decimal(0))
+Traceback (most recent call last):
+  ...
+  ...
+  ...
+InvalidOperation: 0 / 0
+>>> print c.flags[InvalidOperation]
+1
+>>> c.flags[InvalidOperation] = 0
+>>> c.traps[InvalidOperation] = 0
+>>> print c.divide(Decimal(0), Decimal(0))
+NaN
+>>> print c.flags[InvalidOperation]
+1
+>>>
+"""
+
+__all__ = [
+    # Two major classes
+    'Decimal', 'Context',
+
+    # Contexts
+    'DefaultContext', 'BasicContext', 'ExtendedContext',
+
+    # Exceptions
+    'DecimalException', 'Clamped', 'InvalidOperation', 'DivisionByZero',
+    'Inexact', 'Rounded', 'Subnormal', 'Overflow', 'Underflow',
+
+    # Constants for use in setting up contexts
+    'ROUND_DOWN', 'ROUND_HALF_UP', 'ROUND_HALF_EVEN', 'ROUND_CEILING',
+    'ROUND_FLOOR', 'ROUND_UP', 'ROUND_HALF_DOWN',
+
+    # Functions for manipulating contexts
+    'setcontext', 'getcontext'
+]
+
+import copy as _copy
+
+#Rounding
+ROUND_DOWN = 'ROUND_DOWN'
+ROUND_HALF_UP = 'ROUND_HALF_UP'
+ROUND_HALF_EVEN = 'ROUND_HALF_EVEN'
+ROUND_CEILING = 'ROUND_CEILING'
+ROUND_FLOOR = 'ROUND_FLOOR'
+ROUND_UP = 'ROUND_UP'
+ROUND_HALF_DOWN = 'ROUND_HALF_DOWN'
+
+#Rounding decision (not part of the public API)
+NEVER_ROUND = 'NEVER_ROUND'    # Round in division (non-divmod), sqrt ONLY
+ALWAYS_ROUND = 'ALWAYS_ROUND'  # Every operation rounds at end.
+
+#Errors
+
+class DecimalException(ArithmeticError):
+    """Base exception class.
+
+    Used exceptions derive from this.
+    If an exception derives from another exception besides this (such as
+    Underflow (Inexact, Rounded, Subnormal) that indicates that it is only
+    called if the others are present.  This isn't actually used for
+    anything, though.
+
+    handle  -- Called when context._raise_error is called and the
+               trap_enabler is set.  First argument is self, second is the
+               context.  More arguments can be given, those being after
+               the explanation in _raise_error (For example,
+               context._raise_error(NewError, '(-x)!', self._sign) would
+               call NewError().handle(context, self._sign).)
+
+    To define a new exception, it should be sufficient to have it derive
+    from DecimalException.
+    """
+    def handle(self, context, *args):
+        pass
+
+
+class Clamped(DecimalException):
+    """Exponent of a 0 changed to fit bounds.
+
+    This occurs and signals clamped if the exponent of a result has been
+    altered in order to fit the constraints of a specific concrete
+    representation. This may occur when the exponent of a zero result would
+    be outside the bounds of a representation, or  when a large normal
+    number would have an encoded exponent that cannot be represented. In
+    this latter case, the exponent is reduced to fit and the corresponding
+    number of zero digits are appended to the coefficient ("fold-down").
+    """
+
+
+class InvalidOperation(DecimalException):
+    """An invalid operation was performed.
+
+    Various bad things cause this:
+
+    Something creates a signaling NaN
+    -INF + INF
+     0 * (+-)INF
+     (+-)INF / (+-)INF
+    x % 0
+    (+-)INF % x
+    x._rescale( non-integer )
+    sqrt(-x) , x > 0
+    0 ** 0
+    x ** (non-integer)
+    x ** (+-)INF
+    An operand is invalid
+    """
+    def handle(self, context, *args):
+        if args:
+            if args[0] == 1: #sNaN, must drop 's' but keep diagnostics
+                return Decimal( (args[1]._sign, args[1]._int, 'n') )
+        return NaN
+
+class ConversionSyntax(InvalidOperation):
+    """Trying to convert badly formed string.
+
+    This occurs and signals invalid-operation if an string is being
+    converted to a number and it does not conform to the numeric string
+    syntax. The result is [0,qNaN].
+    """
+
+    def handle(self, context, *args):
+        return (0, (0,), 'n') #Passed to something which uses a tuple.
+
+class DivisionByZero(DecimalException, ZeroDivisionError):
+    """Division by 0.
+
+    This occurs and signals division-by-zero if division of a finite number
+    by zero was attempted (during a divide-integer or divide operation, or a
+    power operation with negative right-hand operand), and the dividend was
+    not zero.
+
+    The result of the operation is [sign,inf], where sign is the exclusive
+    or of the signs of the operands for divide, or is 1 for an odd power of
+    -0, for power.
+    """
+
+    def handle(self, context, sign, double = None, *args):
+        if double is not None:
+            return (Infsign[sign],)*2
+        return Infsign[sign]
+
+class DivisionImpossible(InvalidOperation):
+    """Cannot perform the division adequately.
+
+    This occurs and signals invalid-operation if the integer result of a
+    divide-integer or remainder operation had too many digits (would be
+    longer than precision). The result is [0,qNaN].
+    """
+
+    def handle(self, context, *args):
+        return (NaN, NaN)
+
+class DivisionUndefined(InvalidOperation, ZeroDivisionError):
+    """Undefined result of division.
+
+    This occurs and signals invalid-operation if division by zero was
+    attempted (during a divide-integer, divide, or remainder operation), and
+    the dividend is also zero. The result is [0,qNaN].
+    """
+
+    def handle(self, context, tup=None, *args):
+        if tup is not None:
+            return (NaN, NaN) #for 0 %0, 0 // 0
+        return NaN
+
+class Inexact(DecimalException):
+    """Had to round, losing information.
+
+    This occurs and signals inexact whenever the result of an operation is
+    not exact (that is, it needed to be rounded and any discarded digits
+    were non-zero), or if an overflow or underflow condition occurs. The
+    result in all cases is unchanged.
+
+    The inexact signal may be tested (or trapped) to determine if a given
+    operation (or sequence of operations) was inexact.
+    """
+    pass
+
+class InvalidContext(InvalidOperation):
+    """Invalid context.  Unknown rounding, for example.
+
+    This occurs and signals invalid-operation if an invalid context was
+    detected during an operation. This can occur if contexts are not checked
+    on creation and either the precision exceeds the capability of the
+    underlying concrete representation or an unknown or unsupported rounding
+    was specified. These aspects of the context need only be checked when
+    the values are required to be used. The result is [0,qNaN].
+    """
+
+    def handle(self, context, *args):
+        return NaN
+
+class Rounded(DecimalException):
+    """Number got rounded (not  necessarily changed during rounding).
+
+    This occurs and signals rounded whenever the result of an operation is
+    rounded (that is, some zero or non-zero digits were discarded from the
+    coefficient), or if an overflow or underflow condition occurs. The
+    result in all cases is unchanged.
+
+    The rounded signal may be tested (or trapped) to determine if a given
+    operation (or sequence of operations) caused a loss of precision.
+    """
+    pass
+
+class Subnormal(DecimalException):
+    """Exponent < Emin before rounding.
+
+    This occurs and signals subnormal whenever the result of a conversion or
+    operation is subnormal (that is, its adjusted exponent is less than
+    Emin, before any rounding). The result in all cases is unchanged.
+
+    The subnormal signal may be tested (or trapped) to determine if a given
+    or operation (or sequence of operations) yielded a subnormal result.
+    """
+    pass
+
+class Overflow(Inexact, Rounded):
+    """Numerical overflow.
+
+    This occurs and signals overflow if the adjusted exponent of a result
+    (from a conversion or from an operation that is not an attempt to divide
+    by zero), after rounding, would be greater than the largest value that
+    can be handled by the implementation (the value Emax).
+
+    The result depends on the rounding mode:
+
+    For round-half-up and round-half-even (and for round-half-down and
+    round-up, if implemented), the result of the operation is [sign,inf],
+    where sign is the sign of the intermediate result. For round-down, the
+    result is the largest finite number that can be represented in the
+    current precision, with the sign of the intermediate result. For
+    round-ceiling, the result is the same as for round-down if the sign of
+    the intermediate result is 1, or is [0,inf] otherwise. For round-floor,
+    the result is the same as for round-down if the sign of the intermediate
+    result is 0, or is [1,inf] otherwise. In all cases, Inexact and Rounded
+    will also be raised.
+   """
+
+    def handle(self, context, sign, *args):
+        if context.rounding in (ROUND_HALF_UP, ROUND_HALF_EVEN,
+                                     ROUND_HALF_DOWN, ROUND_UP):
+            return Infsign[sign]
+        if sign == 0:
+            if context.rounding == ROUND_CEILING:
+                return Infsign[sign]
+            return Decimal((sign, (9,)*context.prec,
+                            context.Emax-context.prec+1))
+        if sign == 1:
+            if context.rounding == ROUND_FLOOR:
+                return Infsign[sign]
+            return Decimal( (sign, (9,)*context.prec,
+                             context.Emax-context.prec+1))
+
+
+class Underflow(Inexact, Rounded, Subnormal):
+    """Numerical underflow with result rounded to 0.
+
+    This occurs and signals underflow if a result is inexact and the
+    adjusted exponent of the result would be smaller (more negative) than
+    the smallest value that can be handled by the implementation (the value
+    Emin). That is, the result is both inexact and subnormal.
+
+    The result after an underflow will be a subnormal number rounded, if
+    necessary, so that its exponent is not less than Etiny. This may result
+    in 0 with the sign of the intermediate result and an exponent of Etiny.
+
+    In all cases, Inexact, Rounded, and Subnormal will also be raised.
+    """
+
+# List of public traps and flags
+_signals = [Clamped, DivisionByZero, Inexact, Overflow, Rounded,
+           Underflow, InvalidOperation, Subnormal]
+
+# Map conditions (per the spec) to signals
+_condition_map = {ConversionSyntax:InvalidOperation,
+                  DivisionImpossible:InvalidOperation,
+                  DivisionUndefined:InvalidOperation,
+                  InvalidContext:InvalidOperation}
+
+##### Context Functions #######################################
+
+# The getcontext() and setcontext() function manage access to a thread-local
+# current context.  Py2.4 offers direct support for thread locals.  If that
+# is not available, use threading.currentThread() which is slower but will
+# work for older Pythons.  If threads are not part of the build, create a
+# mock threading object with threading.local() returning the module namespace.
+
+try:
+    import threading
+except ImportError:
+    # Python was compiled without threads; create a mock object instead
+    import sys
+    class MockThreading:
+        def local(self, sys=sys):
+            return sys.modules[__name__]
+    threading = MockThreading()
+    del sys, MockThreading
+
+try:
+    threading.local
+
+except AttributeError:
+
+    #To fix reloading, force it to create a new context
+    #Old contexts have different exceptions in their dicts, making problems.
+    if hasattr(threading.currentThread(), '__decimal_context__'):
+        del threading.currentThread().__decimal_context__
+
+    def setcontext(context):
+        """Set this thread's context to context."""
+        if context in (DefaultContext, BasicContext, ExtendedContext):
+            context = context.copy()
+            context.clear_flags()
+        threading.currentThread().__decimal_context__ = context
+
+    def getcontext():
+        """Returns this thread's context.
+
+        If this thread does not yet have a context, returns
+        a new context and sets this thread's context.
+        New contexts are copies of DefaultContext.
+        """
+        try:
+            return threading.currentThread().__decimal_context__
+        except AttributeError:
+            context = Context()
+            threading.currentThread().__decimal_context__ = context
+            return context
+
+else:
+
+    local = threading.local()
+    if hasattr(local, '__decimal_context__'):
+        del local.__decimal_context__
+
+    def getcontext(_local=local):
+        """Returns this thread's context.
+
+        If this thread does not yet have a context, returns
+        a new context and sets this thread's context.
+        New contexts are copies of DefaultContext.
+        """
+        try:
+            return _local.__decimal_context__
+        except AttributeError:
+            context = Context()
+            _local.__decimal_context__ = context
+            return context
+
+    def setcontext(context, _local=local):
+        """Set this thread's context to context."""
+        if context in (DefaultContext, BasicContext, ExtendedContext):
+            context = context.copy()
+            context.clear_flags()
+        _local.__decimal_context__ = context
+
+    del threading, local        # Don't contaminate the namespace
+
+
+##### Decimal class ###########################################
+
+class Decimal(object):
+    """Floating point class for decimal arithmetic."""
+
+    __slots__ = ('_exp','_int','_sign', '_is_special')
+    # Generally, the value of the Decimal instance is given by
+    #  (-1)**_sign * _int * 10**_exp
+    # Special values are signified by _is_special == True
+
+    # We're immutable, so use __new__ not __init__
+    def __new__(cls, value="0", context=None):
+        """Create a decimal point instance.
+
+        >>> Decimal('3.14')              # string input
+        Decimal("3.14")
+        >>> Decimal((0, (3, 1, 4), -2))  # tuple input (sign, digit_tuple, exponent)
+        Decimal("3.14")
+        >>> Decimal(314)                 # int or long
+        Decimal("314")
+        >>> Decimal(Decimal(314))        # another decimal instance
+        Decimal("314")
+        """
+
+        self = object.__new__(cls)
+        self._is_special = False
+
+        # From an internal working value
+        if isinstance(value, _WorkRep):
+            self._sign = value.sign
+            self._int = tuple(map(int, str(value.int)))
+            self._exp = int(value.exp)
+            return self
+
+        # From another decimal
+        if isinstance(value, Decimal):
+            self._exp  = value._exp
+            self._sign = value._sign
+            self._int  = value._int
+            self._is_special  = value._is_special
+            return self
+
+        # From an integer
+        if isinstance(value, (int,long)):
+            if value >= 0:
+                self._sign = 0
+            else:
+                self._sign = 1
+            self._exp = 0
+            self._int = tuple(map(int, str(abs(value))))
+            return self
+
+        # tuple/list conversion (possibly from as_tuple())
+        if isinstance(value, (list,tuple)):
+            if len(value) != 3:
+                raise ValueError, 'Invalid arguments'
+            if value[0] not in (0,1):
+                raise ValueError, 'Invalid sign'
+            for digit in value[1]:
+                if not isinstance(digit, (int,long)) or digit < 0:
+                    raise ValueError, "The second value in the tuple must be composed of non negative integer elements."
+
+            self._sign = value[0]
+            self._int  = tuple(value[1])
+            if value[2] in ('F','n','N'):
+                self._exp = value[2]
+                self._is_special = True
+            else:
+                self._exp  = int(value[2])
+            return self
+
+        if isinstance(value, float):
+            raise TypeError("Cannot convert float to Decimal.  " +
+                            "First convert the float to a string")
+
+        # Other argument types may require the context during interpretation
+        if context is None:
+            context = getcontext()
+
+        # From a string
+        # REs insist on real strings, so we can too.
+        if isinstance(value, basestring):
+            if _isinfinity(value):
+                self._exp = 'F'
+                self._int = (0,)
+                self._is_special = True
+                if _isinfinity(value) == 1:
+                    self._sign = 0
+                else:
+                    self._sign = 1
+                return self
+            if _isnan(value):
+                sig, sign, diag = _isnan(value)
+                self._is_special = True
+                if len(diag) > context.prec: #Diagnostic info too long
+                    self._sign, self._int, self._exp = \
+                                context._raise_error(ConversionSyntax)
+                    return self
+                if sig == 1:
+                    self._exp = 'n' #qNaN
+                else: #sig == 2
+                    self._exp = 'N' #sNaN
+                self._sign = sign
+                self._int = tuple(map(int, diag)) #Diagnostic info
+                return self
+            try:
+                self._sign, self._int, self._exp = _string2exact(value)
+            except ValueError:
+                self._is_special = True
+                self._sign, self._int, self._exp = context._raise_error(ConversionSyntax)
+            return self
+
+        raise TypeError("Cannot convert %r to Decimal" % value)
+
+    def _isnan(self):
+        """Returns whether the number is not actually one.
+
+        0 if a number
+        1 if NaN
+        2 if sNaN
+        """
+        if self._is_special:
+            exp = self._exp
+            if exp == 'n':
+                return 1
+            elif exp == 'N':
+                return 2
+        return 0
+
+    def _isinfinity(self):
+        """Returns whether the number is infinite
+
+        0 if finite or not a number
+        1 if +INF
+        -1 if -INF
+        """
+        if self._exp == 'F':
+            if self._sign:
+                return -1
+            return 1
+        return 0
+
+    def _check_nans(self, other = None, context=None):
+        """Returns whether the number is not actually one.
+
+        if self, other are sNaN, signal
+        if self, other are NaN return nan
+        return 0
+
+        Done before operations.
+        """
+
+        self_is_nan = self._isnan()
+        if other is None:
+            other_is_nan = False
+        else:
+            other_is_nan = other._isnan()
+
+        if self_is_nan or other_is_nan:
+            if context is None:
+                context = getcontext()
+
+            if self_is_nan == 2:
+                return context._raise_error(InvalidOperation, 'sNaN',
+                                        1, self)
+            if other_is_nan == 2:
+                return context._raise_error(InvalidOperation, 'sNaN',
+                                        1, other)
+            if self_is_nan:
+                return self
+
+            return other
+        return 0
+
+    def __nonzero__(self):
+        """Is the number non-zero?
+
+        0 if self == 0
+        1 if self != 0
+        """
+        if self._is_special:
+            return 1
+        return sum(self._int) != 0
+
+    def __cmp__(self, other, context=None):
+        other = _convert_other(other)
+        if other is NotImplemented:
+            return other
+
+        if self._is_special or other._is_special:
+            ans = self._check_nans(other, context)
+            if ans:
+                return 1 # Comparison involving NaN's always reports self > other
+
+            # INF = INF
+            return cmp(self._isinfinity(), other._isinfinity())
+
+        if not self and not other:
+            return 0 #If both 0, sign comparison isn't certain.
+
+        #If different signs, neg one is less
+        if other._sign < self._sign:
+            return -1
+        if self._sign < other._sign:
+            return 1
+
+        self_adjusted = self.adjusted()
+        other_adjusted = other.adjusted()
+        if self_adjusted == other_adjusted and \
+           self._int + (0,)*(self._exp - other._exp) == \
+           other._int + (0,)*(other._exp - self._exp):
+            return 0 #equal, except in precision. ([0]*(-x) = [])
+        elif self_adjusted > other_adjusted and self._int[0] != 0:
+            return (-1)**self._sign
+        elif self_adjusted < other_adjusted and other._int[0] != 0:
+            return -((-1)**self._sign)
+
+        # Need to round, so make sure we have a valid context
+        if context is None:
+            context = getcontext()
+
+        context = context._shallow_copy()
+        rounding = context._set_rounding(ROUND_UP) #round away from 0
+
+        flags = context._ignore_all_flags()
+        res = self.__sub__(other, context=context)
+
+        context._regard_flags(*flags)
+
+        context.rounding = rounding
+
+        if not res:
+            return 0
+        elif res._sign:
+            return -1
+        return 1
+
+    def __eq__(self, other):
+        if not isinstance(other, (Decimal, int, long)):
+            return NotImplemented
+        return self.__cmp__(other) == 0
+
+    def __ne__(self, other):
+        if not isinstance(other, (Decimal, int, long)):
+            return NotImplemented
+        return self.__cmp__(other) != 0
+
+    def compare(self, other, context=None):
+        """Compares one to another.
+
+        -1 => a < b
+        0  => a = b
+        1  => a > b
+        NaN => one is NaN
+        Like __cmp__, but returns Decimal instances.
+        """
+        other = _convert_other(other)
+        if other is NotImplemented:
+            return other
+
+        #compare(NaN, NaN) = NaN
+        if (self._is_special or other and other._is_special):
+            ans = self._check_nans(other, context)
+            if ans:
+                return ans
+
+        return Decimal(self.__cmp__(other, context))
+
+    def __hash__(self):
+        """x.__hash__() <==> hash(x)"""
+        # Decimal integers must hash the same as the ints
+        # Non-integer decimals are normalized and hashed as strings
+        # Normalization assures that hast(100E-1) == hash(10)
+        if self._is_special:
+            if self._isnan():
+                raise TypeError('Cannot hash a NaN value.')
+            return hash(str(self))
+        i = int(self)
+        if self == Decimal(i):
+            return hash(i)
+        assert self.__nonzero__()   # '-0' handled by integer case
+        return hash(str(self.normalize()))
+
+    def as_tuple(self):
+        """Represents the number as a triple tuple.
+
+        To show the internals exactly as they are.
+        """
+        return (self._sign, self._int, self._exp)
+
+    def __repr__(self):
+        """Represents the number as an instance of Decimal."""
+        # Invariant:  eval(repr(d)) == d
+        return 'Decimal("%s")' % str(self)
+
+    def __str__(self, eng = 0, context=None):
+        """Return string representation of the number in scientific notation.
+
+        Captures all of the information in the underlying representation.
+        """
+
+        if self._is_special:
+            if self._isnan():
+                minus = '-'*self._sign
+                if self._int == (0,):
+                    info = ''
+                else:
+                    info = ''.join(map(str, self._int))
+                if self._isnan() == 2:
+                    return minus + 'sNaN' + info
+                return minus + 'NaN' + info
+            if self._isinfinity():
+                minus = '-'*self._sign
+                return minus + 'Infinity'
+
+        if context is None:
+            context = getcontext()
+
+        tmp = map(str, self._int)
+        numdigits = len(self._int)
+        leftdigits = self._exp + numdigits
+        if eng and not self: #self = 0eX wants 0[.0[0]]eY, not [[0]0]0eY
+            if self._exp < 0 and self._exp >= -6: #short, no need for e/E
+                s = '-'*self._sign + '0.' + '0'*(abs(self._exp))
+                return s
+            #exp is closest mult. of 3 >= self._exp
+            exp = ((self._exp - 1)// 3 + 1) * 3
+            if exp != self._exp:
+                s = '0.'+'0'*(exp - self._exp)
+            else:
+                s = '0'
+            if exp != 0:
+                if context.capitals:
+                    s += 'E'
+                else:
+                    s += 'e'
+                if exp > 0:
+                    s += '+' #0.0e+3, not 0.0e3
+                s += str(exp)
+            s = '-'*self._sign + s
+            return s
+        if eng:
+            dotplace = (leftdigits-1)%3+1
+            adjexp = leftdigits -1 - (leftdigits-1)%3
+        else:
+            adjexp = leftdigits-1
+            dotplace = 1
+        if self._exp == 0:
+            pass
+        elif self._exp < 0 and adjexp >= 0:
+            tmp.insert(leftdigits, '.')
+        elif self._exp < 0 and adjexp >= -6:
+            tmp[0:0] = ['0'] * int(-leftdigits)
+            tmp.insert(0, '0.')
+        else:
+            if numdigits > dotplace:
+                tmp.insert(dotplace, '.')
+            elif numdigits < dotplace:
+                tmp.extend(['0']*(dotplace-numdigits))
+            if adjexp:
+                if not context.capitals:
+                    tmp.append('e')
+                else:
+                    tmp.append('E')
+                    if adjexp > 0:
+                        tmp.append('+')
+                tmp.append(str(adjexp))
+        if eng:
+            while tmp[0:1] == ['0']:
+                tmp[0:1] = []
+            if len(tmp) == 0 or tmp[0] == '.' or tmp[0].lower() == 'e':
+                tmp[0:0] = ['0']
+        if self._sign:
+            tmp.insert(0, '-')
+
+        return ''.join(tmp)
+
+    def to_eng_string(self, context=None):
+        """Convert to engineering-type string.
+
+        Engineering notation has an exponent which is a multiple of 3, so there
+        are up to 3 digits left of the decimal place.
+
+        Same rules for when in exponential and when as a value as in __str__.
+        """
+        return self.__str__(eng=1, context=context)
+
+    def __neg__(self, context=None):
+        """Returns a copy with the sign switched.
+
+        Rounds, if it has reason.
+        """
+        if self._is_special:
+            ans = self._check_nans(context=context)
+            if ans:
+                return ans
+
+        if not self:
+            # -Decimal('0') is Decimal('0'), not Decimal('-0')
+            sign = 0
+        elif self._sign:
+            sign = 0
+        else:
+            sign = 1
+
+        if context is None:
+            context = getcontext()
+        if context._rounding_decision == ALWAYS_ROUND:
+            return Decimal((sign, self._int, self._exp))._fix(context)
+        return Decimal( (sign, self._int, self._exp))
+
+    def __pos__(self, context=None):
+        """Returns a copy, unless it is a sNaN.
+
+        Rounds the number (if more then precision digits)
+        """
+        if self._is_special:
+            ans = self._check_nans(context=context)
+            if ans:
+                return ans
+
+        sign = self._sign
+        if not self:
+            # + (-0) = 0
+            sign = 0
+
+        if context is None:
+            context = getcontext()
+
+        if context._rounding_decision == ALWAYS_ROUND:
+            ans = self._fix(context)
+        else:
+            ans = Decimal(self)
+        ans._sign = sign
+        return ans
+
+    def __abs__(self, round=1, context=None):
+        """Returns the absolute value of self.
+
+        If the second argument is 0, do not round.
+        """
+        if self._is_special:
+            ans = self._check_nans(context=context)
+            if ans:
+                return ans
+
+        if not round:
+            if context is None:
+                context = getcontext()
+            context = context._shallow_copy()
+            context._set_rounding_decision(NEVER_ROUND)
+
+        if self._sign:
+            ans = self.__neg__(context=context)
+        else:
+            ans = self.__pos__(context=context)
+
+        return ans
+
+    def __add__(self, other, context=None):
+        """Returns self + other.
+
+        -INF + INF (or the reverse) cause InvalidOperation errors.
+        """
+        other = _convert_other(other)
+        if other is NotImplemented:
+            return other
+
+        if context is None:
+            context = getcontext()
+
+        if self._is_special or other._is_special:
+            ans = self._check_nans(other, context)
+            if ans:
+                return ans
+
+            if self._isinfinity():
+                #If both INF, same sign => same as both, opposite => error.
+                if self._sign != other._sign and other._isinfinity():
+                    return context._raise_error(InvalidOperation, '-INF + INF')
+                return Decimal(self)
+            if other._isinfinity():
+                return Decimal(other)  #Can't both be infinity here
+
+        shouldround = context._rounding_decision == ALWAYS_ROUND
+
+        exp = min(self._exp, other._exp)
+        negativezero = 0
+        if context.rounding == ROUND_FLOOR and self._sign != other._sign:
+            #If the answer is 0, the sign should be negative, in this case.
+            negativezero = 1
+
+        if not self and not other:
+            sign = min(self._sign, other._sign)
+            if negativezero:
+                sign = 1
+            return Decimal( (sign, (0,), exp))
+        if not self:
+            exp = max(exp, other._exp - context.prec-1)
+            ans = other._rescale(exp, watchexp=0, context=context)
+            if shouldround:
+                ans = ans._fix(context)
+            return ans
+        if not other:
+            exp = max(exp, self._exp - context.prec-1)
+            ans = self._rescale(exp, watchexp=0, context=context)
+            if shouldround:
+                ans = ans._fix(context)
+            return ans
+
+        op1 = _WorkRep(self)
+        op2 = _WorkRep(other)
+        op1, op2 = _normalize(op1, op2, shouldround, context.prec)
+
+        result = _WorkRep()
+        if op1.sign != op2.sign:
+            # Equal and opposite
+            if op1.int == op2.int:
+                if exp < context.Etiny():
+                    exp = context.Etiny()
+                    context._raise_error(Clamped)
+                return Decimal((negativezero, (0,), exp))
+            if op1.int < op2.int:
+                op1, op2 = op2, op1
+                #OK, now abs(op1) > abs(op2)
+            if op1.sign == 1:
+                result.sign = 1
+                op1.sign, op2.sign = op2.sign, op1.sign
+            else:
+                result.sign = 0
+                #So we know the sign, and op1 > 0.
+        elif op1.sign == 1:
+            result.sign = 1
+            op1.sign, op2.sign = (0, 0)
+        else:
+            result.sign = 0
+        #Now, op1 > abs(op2) > 0
+
+        if op2.sign == 0:
+            result.int = op1.int + op2.int
+        else:
+            result.int = op1.int - op2.int
+
+        result.exp = op1.exp
+        ans = Decimal(result)
+        if shouldround:
+            ans = ans._fix(context)
+        return ans
+
+    __radd__ = __add__
+
+    def __sub__(self, other, context=None):
+        """Return self + (-other)"""
+        other = _convert_other(other)
+        if other is NotImplemented:
+            return other
+
+        if self._is_special or other._is_special:
+            ans = self._check_nans(other, context=context)
+            if ans:
+                return ans
+
+        # -Decimal(0) = Decimal(0), which we don't want since
+        # (-0 - 0 = -0 + (-0) = -0, but -0 + 0 = 0.)
+        # so we change the sign directly to a copy
+        tmp = Decimal(other)
+        tmp._sign = 1-tmp._sign
+
+        return self.__add__(tmp, context=context)
+
+    def __rsub__(self, other, context=None):
+        """Return other + (-self)"""
+        other = _convert_other(other)
+        if other is NotImplemented:
+            return other
+
+        tmp = Decimal(self)
+        tmp._sign = 1 - tmp._sign
+        return other.__add__(tmp, context=context)
+
+    def _increment(self, round=1, context=None):
+        """Special case of add, adding 1eExponent
+
+        Since it is common, (rounding, for example) this adds
+        (sign)*one E self._exp to the number more efficiently than add.
+
+        For example:
+        Decimal('5.624e10')._increment() == Decimal('5.625e10')
+        """
+        if self._is_special:
+            ans = self._check_nans(context=context)
+            if ans:
+                return ans
+
+            return Decimal(self) # Must be infinite, and incrementing makes no difference
+
+        L = list(self._int)
+        L[-1] += 1
+        spot = len(L)-1
+        while L[spot] == 10:
+            L[spot] = 0
+            if spot == 0:
+                L[0:0] = [1]
+                break
+            L[spot-1] += 1
+            spot -= 1
+        ans = Decimal((self._sign, L, self._exp))
+
+        if context is None:
+            context = getcontext()
+        if round and context._rounding_decision == ALWAYS_ROUND:
+            ans = ans._fix(context)
+        return ans
+
+    def __mul__(self, other, context=None):
+        """Return self * other.
+
+        (+-) INF * 0 (or its reverse) raise InvalidOperation.
+        """
+        other = _convert_other(other)
+        if other is NotImplemented:
+            return other
+
+        if context is None:
+            context = getcontext()
+
+        resultsign = self._sign ^ other._sign
+
+        if self._is_special or other._is_special:
+            ans = self._check_nans(other, context)
+            if ans:
+                return ans
+
+            if self._isinfinity():
+                if not other:
+                    return context._raise_error(InvalidOperation, '(+-)INF * 0')
+                return Infsign[resultsign]
+
+            if other._isinfinity():
+                if not self:
+                    return context._raise_error(InvalidOperation, '0 * (+-)INF')
+                return Infsign[resultsign]
+
+        resultexp = self._exp + other._exp
+        shouldround = context._rounding_decision == ALWAYS_ROUND
+
+        # Special case for multiplying by zero
+        if not self or not other:
+            ans = Decimal((resultsign, (0,), resultexp))
+            if shouldround:
+                #Fixing in case the exponent is out of bounds
+                ans = ans._fix(context)
+            return ans
+
+        # Special case for multiplying by power of 10
+        if self._int == (1,):
+            ans = Decimal((resultsign, other._int, resultexp))
+            if shouldround:
+                ans = ans._fix(context)
+            return ans
+        if other._int == (1,):
+            ans = Decimal((resultsign, self._int, resultexp))
+            if shouldround:
+                ans = ans._fix(context)
+            return ans
+
+        op1 = _WorkRep(self)
+        op2 = _WorkRep(other)
+
+        ans = Decimal( (resultsign, map(int, str(op1.int * op2.int)), resultexp))
+        if shouldround:
+            ans = ans._fix(context)
+
+        return ans
+    __rmul__ = __mul__
+
+    def __div__(self, other, context=None):
+        """Return self / other."""
+        return self._divide(other, context=context)
+    __truediv__ = __div__
+
+    def _divide(self, other, divmod = 0, context=None):
+        """Return a / b, to context.prec precision.
+
+        divmod:
+        0 => true division
+        1 => (a //b, a%b)
+        2 => a //b
+        3 => a%b
+
+        Actually, if divmod is 2 or 3 a tuple is returned, but errors for
+        computing the other value are not raised.
+        """
+        other = _convert_other(other)
+        if other is NotImplemented:
+            if divmod in (0, 1):
+                return NotImplemented
+            return (NotImplemented, NotImplemented)
+
+        if context is None:
+            context = getcontext()
+
+        sign = self._sign ^ other._sign
+
+        if self._is_special or other._is_special:
+            ans = self._check_nans(other, context)
+            if ans:
+                if divmod:
+                    return (ans, ans)
+                return ans
+
+            if self._isinfinity() and other._isinfinity():
+                if divmod:
+                    return (context._raise_error(InvalidOperation,
+                                            '(+-)INF // (+-)INF'),
+                            context._raise_error(InvalidOperation,
+                                            '(+-)INF % (+-)INF'))
+                return context._raise_error(InvalidOperation, '(+-)INF/(+-)INF')
+
+            if self._isinfinity():
+                if divmod == 1:
+                    return (Infsign[sign],
+                            context._raise_error(InvalidOperation, 'INF % x'))
+                elif divmod == 2:
+                    return (Infsign[sign], NaN)
+                elif divmod == 3:
+                    return (Infsign[sign],
+                            context._raise_error(InvalidOperation, 'INF % x'))
+                return Infsign[sign]
+
+            if other._isinfinity():
+                if divmod:
+                    return (Decimal((sign, (0,), 0)), Decimal(self))
+                context._raise_error(Clamped, 'Division by infinity')
+                return Decimal((sign, (0,), context.Etiny()))
+
+        # Special cases for zeroes
+        if not self and not other:
+            if divmod:
+                return context._raise_error(DivisionUndefined, '0 / 0', 1)
+            return context._raise_error(DivisionUndefined, '0 / 0')
+
+        if not self:
+            if divmod:
+                otherside = Decimal(self)
+                otherside._exp = min(self._exp, other._exp)
+                return (Decimal((sign, (0,), 0)),  otherside)
+            exp = self._exp - other._exp
+            if exp < context.Etiny():
+                exp = context.Etiny()
+                context._raise_error(Clamped, '0e-x / y')
+            if exp > context.Emax:
+                exp = context.Emax
+                context._raise_error(Clamped, '0e+x / y')
+            return Decimal( (sign, (0,), exp) )
+
+        if not other:
+            if divmod:
+                return context._raise_error(DivisionByZero, 'divmod(x,0)',
+                                           sign, 1)
+            return context._raise_error(DivisionByZero, 'x / 0', sign)
+
+        #OK, so neither = 0, INF or NaN
+
+        shouldround = context._rounding_decision == ALWAYS_ROUND
+
+        #If we're dividing into ints, and self < other, stop.
+        #self.__abs__(0) does not round.
+        if divmod and (self.__abs__(0, context) < other.__abs__(0, context)):
+
+            if divmod == 1 or divmod == 3:
+                exp = min(self._exp, other._exp)
+                ans2 = self._rescale(exp, context=context, watchexp=0)
+                if shouldround:
+                    ans2 = ans2._fix(context)
+                return (Decimal( (sign, (0,), 0) ),
+                        ans2)
+
+            elif divmod == 2:
+                #Don't round the mod part, if we don't need it.
+                return (Decimal( (sign, (0,), 0) ), Decimal(self))
+
+        op1 = _WorkRep(self)
+        op2 = _WorkRep(other)
+        op1, op2, adjust = _adjust_coefficients(op1, op2)
+        res = _WorkRep( (sign, 0, (op1.exp - op2.exp)) )
+        if divmod and res.exp > context.prec + 1:
+            return context._raise_error(DivisionImpossible)
+
+        prec_limit = 10 ** context.prec
+        while 1:
+            while op2.int <= op1.int:
+                res.int += 1
+                op1.int -= op2.int
+            if res.exp == 0 and divmod:
+                if res.int >= prec_limit and shouldround:
+                    return context._raise_error(DivisionImpossible)
+                otherside = Decimal(op1)
+                frozen = context._ignore_all_flags()
+
+                exp = min(self._exp, other._exp)
+                otherside = otherside._rescale(exp, context=context, watchexp=0)
+                context._regard_flags(*frozen)
+                if shouldround:
+                    otherside = otherside._fix(context)
+                return (Decimal(res), otherside)
+
+            if op1.int == 0 and adjust >= 0 and not divmod:
+                break
+            if res.int >= prec_limit and shouldround:
+                if divmod:
+                    return context._raise_error(DivisionImpossible)
+                shouldround=1
+                # Really, the answer is a bit higher, so adding a one to
+                # the end will make sure the rounding is right.
+                if op1.int != 0:
+                    res.int *= 10
+                    res.int += 1
+                    res.exp -= 1
+
+                break
+            res.int *= 10
+            res.exp -= 1
+            adjust += 1
+            op1.int *= 10
+            op1.exp -= 1
+
+            if res.exp == 0 and divmod and op2.int > op1.int:
+                #Solves an error in precision.  Same as a previous block.
+
+                if res.int >= prec_limit and shouldround:
+                    return context._raise_error(DivisionImpossible)
+                otherside = Decimal(op1)
+                frozen = context._ignore_all_flags()
+
+                exp = min(self._exp, other._exp)
+                otherside = otherside._rescale(exp, context=context)
+
+                context._regard_flags(*frozen)
+
+                return (Decimal(res), otherside)
+
+        ans = Decimal(res)
+        if shouldround:
+            ans = ans._fix(context)
+        return ans
+
+    def __rdiv__(self, other, context=None):
+        """Swaps self/other and returns __div__."""
+        other = _convert_other(other)
+        if other is NotImplemented:
+            return other
+        return other.__div__(self, context=context)
+    __rtruediv__ = __rdiv__
+
+    def __divmod__(self, other, context=None):
+        """
+        (self // other, self % other)
+        """
+        return self._divide(other, 1, context)
+
+    def __rdivmod__(self, other, context=None):
+        """Swaps self/other and returns __divmod__."""
+        other = _convert_other(other)
+        if other is NotImplemented:
+            return other
+        return other.__divmod__(self, context=context)
+
+    def __mod__(self, other, context=None):
+        """
+        self % other
+        """
+        other = _convert_other(other)
+        if other is NotImplemented:
+            return other
+
+        if self._is_special or other._is_special:
+            ans = self._check_nans(other, context)
+            if ans:
+                return ans
+
+        if self and not other:
+            return context._raise_error(InvalidOperation, 'x % 0')
+
+        return self._divide(other, 3, context)[1]
+
+    def __rmod__(self, other, context=None):
+        """Swaps self/other and returns __mod__."""
+        other = _convert_other(other)
+        if other is NotImplemented:
+            return other
+        return other.__mod__(self, context=context)
+
+    def remainder_near(self, other, context=None):
+        """
+        Remainder nearest to 0-  abs(remainder-near) <= other/2
+        """
+        other = _convert_other(other)
+        if other is NotImplemented:
+            return other
+
+        if self._is_special or other._is_special:
+            ans = self._check_nans(other, context)
+            if ans:
+                return ans
+        if self and not other:
+            return context._raise_error(InvalidOperation, 'x % 0')
+
+        if context is None:
+            context = getcontext()
+        # If DivisionImpossible causes an error, do not leave Rounded/Inexact
+        # ignored in the calling function.
+        context = context._shallow_copy()
+        flags = context._ignore_flags(Rounded, Inexact)
+        #keep DivisionImpossible flags
+        (side, r) = self.__divmod__(other, context=context)
+
+        if r._isnan():
+            context._regard_flags(*flags)
+            return r
+
+        context = context._shallow_copy()
+        rounding = context._set_rounding_decision(NEVER_ROUND)
+
+        if other._sign:
+            comparison = other.__div__(Decimal(-2), context=context)
+        else:
+            comparison = other.__div__(Decimal(2), context=context)
+
+        context._set_rounding_decision(rounding)
+        context._regard_flags(*flags)
+
+        s1, s2 = r._sign, comparison._sign
+        r._sign, comparison._sign = 0, 0
+
+        if r < comparison:
+            r._sign, comparison._sign = s1, s2
+            #Get flags now
+            self.__divmod__(other, context=context)
+            return r._fix(context)
+        r._sign, comparison._sign = s1, s2
+
+        rounding = context._set_rounding_decision(NEVER_ROUND)
+
+        (side, r) = self.__divmod__(other, context=context)
+        context._set_rounding_decision(rounding)
+        if r._isnan():
+            return r
+
+        decrease = not side._iseven()
+        rounding = context._set_rounding_decision(NEVER_ROUND)
+        side = side.__abs__(context=context)
+        context._set_rounding_decision(rounding)
+
+        s1, s2 = r._sign, comparison._sign
+        r._sign, comparison._sign = 0, 0
+        if r > comparison or decrease and r == comparison:
+            r._sign, comparison._sign = s1, s2
+            context.prec += 1
+            if len(side.__add__(Decimal(1), context=context)._int) >= context.prec:
+                context.prec -= 1
+                return context._raise_error(DivisionImpossible)[1]
+            context.prec -= 1
+            if self._sign == other._sign:
+                r = r.__sub__(other, context=context)
+            else:
+                r = r.__add__(other, context=context)
+        else:
+            r._sign, comparison._sign = s1, s2
+
+        return r._fix(context)
+
+    def __floordiv__(self, other, context=None):
+        """self // other"""
+        return self._divide(other, 2, context)[0]
+
+    def __rfloordiv__(self, other, context=None):
+        """Swaps self/other and returns __floordiv__."""
+        other = _convert_other(other)
+        if other is NotImplemented:
+            return other
+        return other.__floordiv__(self, context=context)
+
+    def __float__(self):
+        """Float representation."""
+        return float(str(self))
+
+    def __int__(self):
+        """Converts self to an int, truncating if necessary."""
+        if self._is_special:
+            if self._isnan():
+                context = getcontext()
+                return context._raise_error(InvalidContext)
+            elif self._isinfinity():
+                raise OverflowError, "Cannot convert infinity to long"
+        if self._exp >= 0:
+            s = ''.join(map(str, self._int)) + '0'*self._exp
+        else:
+            s = ''.join(map(str, self._int))[:self._exp]
+        if s == '':
+            s = '0'
+        sign = '-'*self._sign
+        return int(sign + s)
+
+    def __long__(self):
+        """Converts to a long.
+
+        Equivalent to long(int(self))
+        """
+        return long(self.__int__())
+
+    def _fix(self, context):
+        """Round if it is necessary to keep self within prec precision.
+
+        Rounds and fixes the exponent.  Does not raise on a sNaN.
+
+        Arguments:
+        self - Decimal instance
+        context - context used.
+        """
+        if self._is_special:
+            return self
+        if context is None:
+            context = getcontext()
+        prec = context.prec
+        ans = self._fixexponents(context)
+        if len(ans._int) > prec:
+            ans = ans._round(prec, context=context)
+            ans = ans._fixexponents(context)
+        return ans
+
+    def _fixexponents(self, context):
+        """Fix the exponents and return a copy with the exponent in bounds.
+        Only call if known to not be a special value.
+        """
+        folddown = context._clamp
+        Emin = context.Emin
+        ans = self
+        ans_adjusted = ans.adjusted()
+        if ans_adjusted < Emin:
+            Etiny = context.Etiny()
+            if ans._exp < Etiny:
+                if not ans:
+                    ans = Decimal(self)
+                    ans._exp = Etiny
+                    context._raise_error(Clamped)
+                    return ans
+                ans = ans._rescale(Etiny, context=context)
+                #It isn't zero, and exp < Emin => subnormal
+                context._raise_error(Subnormal)
+                if context.flags[Inexact]:
+                    context._raise_error(Underflow)
+            else:
+                if ans:
+                    #Only raise subnormal if non-zero.
+                    context._raise_error(Subnormal)
+        else:
+            Etop = context.Etop()
+            if folddown and ans._exp > Etop:
+                context._raise_error(Clamped)
+                ans = ans._rescale(Etop, context=context)
+            else:
+                Emax = context.Emax
+                if ans_adjusted > Emax:
+                    if not ans:
+                        ans = Decimal(self)
+                        ans._exp = Emax
+                        context._raise_error(Clamped)
+                        return ans
+                    context._raise_error(Inexact)
+                    context._raise_error(Rounded)
+                    return context._raise_error(Overflow, 'above Emax', ans._sign)
+        return ans
+
+    def _round(self, prec=None, rounding=None, context=None):
+        """Returns a rounded version of self.
+
+        You can specify the precision or rounding method.  Otherwise, the
+        context determines it.
+        """
+
+        if self._is_special:
+            ans = self._check_nans(context=context)
+            if ans:
+                return ans
+
+            if self._isinfinity():
+                return Decimal(self)
+
+        if context is None:
+            context = getcontext()
+
+        if rounding is None:
+            rounding = context.rounding
+        if prec is None:
+            prec = context.prec
+
+        if not self:
+            if prec <= 0:
+                dig = (0,)
+                exp = len(self._int) - prec + self._exp
+            else:
+                dig = (0,) * prec
+                exp = len(self._int) + self._exp - prec
+            ans = Decimal((self._sign, dig, exp))
+            context._raise_error(Rounded)
+            return ans
+
+        if prec == 0:
+            temp = Decimal(self)
+            temp._int = (0,)+temp._int
+            prec = 1
+        elif prec < 0:
+            exp = self._exp + len(self._int) - prec - 1
+            temp = Decimal( (self._sign, (0, 1), exp))
+            prec = 1
+        else:
+            temp = Decimal(self)
+
+        numdigits = len(temp._int)
+        if prec == numdigits:
+            return temp
+
+        # See if we need to extend precision
+        expdiff = prec - numdigits
+        if expdiff > 0:
+            tmp = list(temp._int)
+            tmp.extend([0] * expdiff)
+            ans =  Decimal( (temp._sign, tmp, temp._exp - expdiff))
+            return ans
+
+        #OK, but maybe all the lost digits are 0.
+        lostdigits = self._int[expdiff:]
+        if lostdigits == (0,) * len(lostdigits):
+            ans = Decimal( (temp._sign, temp._int[:prec], temp._exp - expdiff))
+            #Rounded, but not Inexact
+            context._raise_error(Rounded)
+            return ans
+
+        # Okay, let's round and lose data
+
+        this_function = getattr(temp, self._pick_rounding_function[rounding])
+        #Now we've got the rounding function
+
+        if prec != context.prec:
+            context = context._shallow_copy()
+            context.prec = prec
+        ans = this_function(prec, expdiff, context)
+        context._raise_error(Rounded)
+        context._raise_error(Inexact, 'Changed in rounding')
+
+        return ans
+
+    _pick_rounding_function = {}
+
+    def _round_down(self, prec, expdiff, context):
+        """Also known as round-towards-0, truncate."""
+        return Decimal( (self._sign, self._int[:prec], self._exp - expdiff) )
+
+    def _round_half_up(self, prec, expdiff, context, tmp = None):
+        """Rounds 5 up (away from 0)"""
+
+        if tmp is None:
+            tmp = Decimal( (self._sign,self._int[:prec], self._exp - expdiff))
+        if self._int[prec] >= 5:
+            tmp = tmp._increment(round=0, context=context)
+            if len(tmp._int) > prec:
+                return Decimal( (tmp._sign, tmp._int[:-1], tmp._exp + 1))
+        return tmp
+
+    def _round_half_even(self, prec, expdiff, context):
+        """Round 5 to even, rest to nearest."""
+
+        tmp = Decimal( (self._sign, self._int[:prec], self._exp - expdiff))
+        half = (self._int[prec] == 5)
+        if half:
+            for digit in self._int[prec+1:]:
+                if digit != 0:
+                    half = 0
+                    break
+        if half:
+            if self._int[prec-1] & 1 == 0:
+                return tmp
+        return self._round_half_up(prec, expdiff, context, tmp)
+
+    def _round_half_down(self, prec, expdiff, context):
+        """Round 5 down"""
+
+        tmp = Decimal( (self._sign, self._int[:prec], self._exp - expdiff))
+        half = (self._int[prec] == 5)
+        if half:
+            for digit in self._int[prec+1:]:
+                if digit != 0:
+                    half = 0
+                    break
+        if half:
+            return tmp
+        return self._round_half_up(prec, expdiff, context, tmp)
+
+    def _round_up(self, prec, expdiff, context):
+        """Rounds away from 0."""
+        tmp = Decimal( (self._sign, self._int[:prec], self._exp - expdiff) )
+        for digit in self._int[prec:]:
+            if digit != 0:
+                tmp = tmp._increment(round=1, context=context)
+                if len(tmp._int) > prec:
+                    return Decimal( (tmp._sign, tmp._int[:-1], tmp._exp + 1))
+                else:
+                    return tmp
+        return tmp
+
+    def _round_ceiling(self, prec, expdiff, context):
+        """Rounds up (not away from 0 if negative.)"""
+        if self._sign:
+            return self._round_down(prec, expdiff, context)
+        else:
+            return self._round_up(prec, expdiff, context)
+
+    def _round_floor(self, prec, expdiff, context):
+        """Rounds down (not towards 0 if negative)"""
+        if not self._sign:
+            return self._round_down(prec, expdiff, context)
+        else:
+            return self._round_up(prec, expdiff, context)
+
+    def __pow__(self, n, modulo = None, context=None):
+        """Return self ** n (mod modulo)
+
+        If modulo is None (default), don't take it mod modulo.
+        """
+        n = _convert_other(n)
+        if n is NotImplemented:
+            return n
+
+        if context is None:
+            context = getcontext()
+
+        if self._is_special or n._is_special or n.adjusted() > 8:
+            #Because the spot << doesn't work with really big exponents
+            if n._isinfinity() or n.adjusted() > 8:
+                return context._raise_error(InvalidOperation, 'x ** INF')
+
+            ans = self._check_nans(n, context)
+            if ans:
+                return ans
+
+        if not n._isinteger():
+            return context._raise_error(InvalidOperation, 'x ** (non-integer)')
+
+        if not self and not n:
+            return context._raise_error(InvalidOperation, '0 ** 0')
+
+        if not n:
+            return Decimal(1)
+
+        if self == Decimal(1):
+            return Decimal(1)
+
+        sign = self._sign and not n._iseven()
+        n = int(n)
+
+        if self._isinfinity():
+            if modulo:
+                return context._raise_error(InvalidOperation, 'INF % x')
+            if n > 0:
+                return Infsign[sign]
+            return Decimal( (sign, (0,), 0) )
+
+        #with ludicrously large exponent, just raise an overflow and return inf.
+        if not modulo and n > 0 and (self._exp + len(self._int) - 1) * n > context.Emax \
+           and self:
+
+            tmp = Decimal('inf')
+            tmp._sign = sign
+            context._raise_error(Rounded)
+            context._raise_error(Inexact)
+            context._raise_error(Overflow, 'Big power', sign)
+            return tmp
+
+        elength = len(str(abs(n)))
+        firstprec = context.prec
+
+        if not modulo and firstprec + elength + 1 > DefaultContext.Emax:
+            return context._raise_error(Overflow, 'Too much precision.', sign)
+
+        mul = Decimal(self)
+        val = Decimal(1)
+        context = context._shallow_copy()
+        context.prec = firstprec + elength + 1
+        if n < 0:
+            #n is a long now, not Decimal instance
+            n = -n
+            mul = Decimal(1).__div__(mul, context=context)
+
+        spot = 1
+        while spot <= n:
+            spot <<= 1
+
+        spot >>= 1
+        #Spot is the highest power of 2 less than n
+        while spot:
+            val = val.__mul__(val, context=context)
+            if val._isinfinity():
+                val = Infsign[sign]
+                break
+            if spot & n:
+                val = val.__mul__(mul, context=context)
+            if modulo is not None:
+                val = val.__mod__(modulo, context=context)
+            spot >>= 1
+        context.prec = firstprec
+
+        if context._rounding_decision == ALWAYS_ROUND:
+            return val._fix(context)
+        return val
+
+    def __rpow__(self, other, context=None):
+        """Swaps self/other and returns __pow__."""
+        other = _convert_other(other)
+        if other is NotImplemented:
+            return other
+        return other.__pow__(self, context=context)
+
+    def normalize(self, context=None):
+        """Normalize- strip trailing 0s, change anything equal to 0 to 0e0"""
+
+        if self._is_special:
+            ans = self._check_nans(context=context)
+            if ans:
+                return ans
+
+        dup = self._fix(context)
+        if dup._isinfinity():
+            return dup
+
+        if not dup:
+            return Decimal( (dup._sign, (0,), 0) )
+        end = len(dup._int)
+        exp = dup._exp
+        while dup._int[end-1] == 0:
+            exp += 1
+            end -= 1
+        return Decimal( (dup._sign, dup._int[:end], exp) )
+
+
+    def quantize(self, exp, rounding=None, context=None, watchexp=1):
+        """Quantize self so its exponent is the same as that of exp.
+
+        Similar to self._rescale(exp._exp) but with error checking.
+        """
+        if self._is_special or exp._is_special:
+            ans = self._check_nans(exp, context)
+            if ans:
+                return ans
+
+            if exp._isinfinity() or self._isinfinity():
+                if exp._isinfinity() and self._isinfinity():
+                    return self  #if both are inf, it is OK
+                if context is None:
+                    context = getcontext()
+                return context._raise_error(InvalidOperation,
+                                        'quantize with one INF')
+        return self._rescale(exp._exp, rounding, context, watchexp)
+
+    def same_quantum(self, other):
+        """Test whether self and other have the same exponent.
+
+        same as self._exp == other._exp, except NaN == sNaN
+        """
+        if self._is_special or other._is_special:
+            if self._isnan() or other._isnan():
+                return self._isnan() and other._isnan() and True
+            if self._isinfinity() or other._isinfinity():
+                return self._isinfinity() and other._isinfinity() and True
+        return self._exp == other._exp
+
+    def _rescale(self, exp, rounding=None, context=None, watchexp=1):
+        """Rescales so that the exponent is exp.
+
+        exp = exp to scale to (an integer)
+        rounding = rounding version
+        watchexp: if set (default) an error is returned if exp is greater
+        than Emax or less than Etiny.
+        """
+        if context is None:
+            context = getcontext()
+
+        if self._is_special:
+            if self._isinfinity():
+                return context._raise_error(InvalidOperation, 'rescale with an INF')
+
+            ans = self._check_nans(context=context)
+            if ans:
+                return ans
+
+        if watchexp and (context.Emax  < exp or context.Etiny() > exp):
+            return context._raise_error(InvalidOperation, 'rescale(a, INF)')
+
+        if not self:
+            ans = Decimal(self)
+            ans._int = (0,)
+            ans._exp = exp
+            return ans
+
+        diff = self._exp - exp
+        digits = len(self._int) + diff
+
+        if watchexp and digits > context.prec:
+            return context._raise_error(InvalidOperation, 'Rescale > prec')
+
+        tmp = Decimal(self)
+        tmp._int = (0,) + tmp._int
+        digits += 1
+
+        if digits < 0:
+            tmp._exp = -digits + tmp._exp
+            tmp._int = (0,1)
+            digits = 1
+        tmp = tmp._round(digits, rounding, context=context)
+
+        if tmp._int[0] == 0 and len(tmp._int) > 1:
+            tmp._int = tmp._int[1:]
+        tmp._exp = exp
+
+        tmp_adjusted = tmp.adjusted()
+        if tmp and tmp_adjusted < context.Emin:
+            context._raise_error(Subnormal)
+        elif tmp and tmp_adjusted > context.Emax:
+            return context._raise_error(InvalidOperation, 'rescale(a, INF)')
+        return tmp
+
+    def to_integral(self, rounding=None, context=None):
+        """Rounds to the nearest integer, without raising inexact, rounded."""
+        if self._is_special:
+            ans = self._check_nans(context=context)
+            if ans:
+                return ans
+        if self._exp >= 0:
+            return self
+        if context is None:
+            context = getcontext()
+        flags = context._ignore_flags(Rounded, Inexact)
+        ans = self._rescale(0, rounding, context=context)
+        context._regard_flags(flags)
+        return ans
+
+    def sqrt(self, context=None):
+        """Return the square root of self.
+
+        Uses a converging algorithm (Xn+1 = 0.5*(Xn + self / Xn))
+        Should quadratically approach the right answer.
+        """
+        if self._is_special:
+            ans = self._check_nans(context=context)
+            if ans:
+                return ans
+
+            if self._isinfinity() and self._sign == 0:
+                return Decimal(self)
+
+        if not self:
+            #exponent = self._exp / 2, using round_down.
+            #if self._exp < 0:
+            #    exp = (self._exp+1) // 2
+            #else:
+            exp = (self._exp) // 2
+            if self._sign == 1:
+                #sqrt(-0) = -0
+                return Decimal( (1, (0,), exp))
+            else:
+                return Decimal( (0, (0,), exp))
+
+        if context is None:
+            context = getcontext()
+
+        if self._sign == 1:
+            return context._raise_error(InvalidOperation, 'sqrt(-x), x > 0')
+
+        tmp = Decimal(self)
+
+        expadd = tmp._exp // 2
+        if tmp._exp & 1:
+            tmp._int += (0,)
+            tmp._exp = 0
+        else:
+            tmp._exp = 0
+
+        context = context._shallow_copy()
+        flags = context._ignore_all_flags()
+        firstprec = context.prec
+        context.prec = 3
+        if tmp.adjusted() & 1 == 0:
+            ans = Decimal( (0, (8,1,9), tmp.adjusted()  - 2) )
+            ans = ans.__add__(tmp.__mul__(Decimal((0, (2,5,9), -2)),
+                                          context=context), context=context)
+            ans._exp -= 1 + tmp.adjusted() // 2
+        else:
+            ans = Decimal( (0, (2,5,9), tmp._exp + len(tmp._int)- 3) )
+            ans = ans.__add__(tmp.__mul__(Decimal((0, (8,1,9), -3)),
+                                          context=context), context=context)
+            ans._exp -= 1 + tmp.adjusted()  // 2
+
+        #ans is now a linear approximation.
+
+        Emax, Emin = context.Emax, context.Emin
+        context.Emax, context.Emin = DefaultContext.Emax, DefaultContext.Emin
+
+        half = Decimal('0.5')
+
+        maxp = firstprec + 2
+        rounding = context._set_rounding(ROUND_HALF_EVEN)
+        while 1:
+            context.prec = min(2*context.prec - 2, maxp)
+            ans = half.__mul__(ans.__add__(tmp.__div__(ans, context=context),
+                                           context=context), context=context)
+            if context.prec == maxp:
+                break
+
+        #round to the answer's precision-- the only error can be 1 ulp.
+        context.prec = firstprec
+        prevexp = ans.adjusted()
+        ans = ans._round(context=context)
+
+        #Now, check if the other last digits are better.
+        context.prec = firstprec + 1
+        # In case we rounded up another digit and we should actually go lower.
+        if prevexp != ans.adjusted():
+            ans._int += (0,)
+            ans._exp -= 1
+
+
+        lower = ans.__sub__(Decimal((0, (5,), ans._exp-1)), context=context)
+        context._set_rounding(ROUND_UP)
+        if lower.__mul__(lower, context=context) > (tmp):
+            ans = ans.__sub__(Decimal((0, (1,), ans._exp)), context=context)
+
+        else:
+            upper = ans.__add__(Decimal((0, (5,), ans._exp-1)),context=context)
+            context._set_rounding(ROUND_DOWN)
+            if upper.__mul__(upper, context=context) < tmp:
+                ans = ans.__add__(Decimal((0, (1,), ans._exp)),context=context)
+
+        ans._exp += expadd
+
+        context.prec = firstprec
+        context.rounding = rounding
+        ans = ans._fix(context)
+
+        rounding = context._set_rounding_decision(NEVER_ROUND)
+        if not ans.__mul__(ans, context=context) == self:
+            # Only rounded/inexact if here.
+            context._regard_flags(flags)
+            context._raise_error(Rounded)
+            context._raise_error(Inexact)
+        else:
+            #Exact answer, so let's set the exponent right.
+            #if self._exp < 0:
+            #    exp = (self._exp +1)// 2
+            #else:
+            exp = self._exp // 2
+            context.prec += ans._exp - exp
+            ans = ans._rescale(exp, context=context)
+            context.prec = firstprec
+            context._regard_flags(flags)
+        context.Emax, context.Emin = Emax, Emin
+
+        return ans._fix(context)
+
+    def max(self, other, context=None):
+        """Returns the larger value.
+
+        like max(self, other) except if one is not a number, returns
+        NaN (and signals if one is sNaN).  Also rounds.
+        """
+        other = _convert_other(other)
+        if other is NotImplemented:
+            return other
+
+        if self._is_special or other._is_special:
+            # if one operand is a quiet NaN and the other is number, then the
+            # number is always returned
+            sn = self._isnan()
+            on = other._isnan()
+            if sn or on:
+                if on == 1 and sn != 2:
+                    return self
+                if sn == 1 and on != 2:
+                    return other
+                return self._check_nans(other, context)
+
+        ans = self
+        c = self.__cmp__(other)
+        if c == 0:
+            # if both operands are finite and equal in numerical value
+            # then an ordering is applied:
+            #
+            # if the signs differ then max returns the operand with the
+            # positive sign and min returns the operand with the negative sign
+            #
+            # if the signs are the same then the exponent is used to select
+            # the result.
+            if self._sign != other._sign:
+                if self._sign:
+                    ans = other
+            elif self._exp < other._exp and not self._sign:
+                ans = other
+            elif self._exp > other._exp and self._sign:
+                ans = other
+        elif c == -1:
+            ans = other
+
+        if context is None:
+            context = getcontext()
+        if context._rounding_decision == ALWAYS_ROUND:
+            return ans._fix(context)
+        return ans
+
+    def min(self, other, context=None):
+        """Returns the smaller value.
+
+        like min(self, other) except if one is not a number, returns
+        NaN (and signals if one is sNaN).  Also rounds.
+        """
+        other = _convert_other(other)
+        if other is NotImplemented:
+            return other
+
+        if self._is_special or other._is_special:
+            # if one operand is a quiet NaN and the other is number, then the
+            # number is always returned
+            sn = self._isnan()
+            on = other._isnan()
+            if sn or on:
+                if on == 1 and sn != 2:
+                    return self
+                if sn == 1 and on != 2:
+                    return other
+                return self._check_nans(other, context)
+
+        ans = self
+        c = self.__cmp__(other)
+        if c == 0:
+            # if both operands are finite and equal in numerical value
+            # then an ordering is applied:
+            #
+            # if the signs differ then max returns the operand with the
+            # positive sign and min returns the operand with the negative sign
+            #
+            # if the signs are the same then the exponent is used to select
+            # the result.
+            if self._sign != other._sign:
+                if other._sign:
+                    ans = other
+            elif self._exp > other._exp and not self._sign:
+                ans = other
+            elif self._exp < other._exp and self._sign:
+                ans = other
+        elif c == 1:
+            ans = other
+
+        if context is None:
+            context = getcontext()
+        if context._rounding_decision == ALWAYS_ROUND:
+            return ans._fix(context)
+        return ans
+
+    def _isinteger(self):
+        """Returns whether self is an integer"""
+        if self._exp >= 0:
+            return True
+        rest = self._int[self._exp:]
+        return rest == (0,)*len(rest)
+
+    def _iseven(self):
+        """Returns 1 if self is even.  Assumes self is an integer."""
+        if self._exp > 0:
+            return 1
+        return self._int[-1+self._exp] & 1 == 0
+
+    def adjusted(self):
+        """Return the adjusted exponent of self"""
+        try:
+            return self._exp + len(self._int) - 1
+        #If NaN or Infinity, self._exp is string
+        except TypeError:
+            return 0
+
+    # support for pickling, copy, and deepcopy
+    def __reduce__(self):
+        return (self.__class__, (str(self),))
+
+    def __copy__(self):
+        if type(self) == Decimal:
+            return self     # I'm immutable; therefore I am my own clone
+        return self.__class__(str(self))
+
+    def __deepcopy__(self, memo):
+        if type(self) == Decimal:
+            return self     # My components are also immutable
+        return self.__class__(str(self))
+
+##### Context class ###########################################
+
+
+# get rounding method function:
+rounding_functions = [name for name in Decimal.__dict__.keys() if name.startswith('_round_')]
+for name in rounding_functions:
+    #name is like _round_half_even, goes to the global ROUND_HALF_EVEN value.
+    globalname = name[1:].upper()
+    val = globals()[globalname]
+    Decimal._pick_rounding_function[val] = name
+
+del name, val, globalname, rounding_functions
+
+class Context(object):
+    """Contains the context for a Decimal instance.
+
+    Contains:
+    prec - precision (for use in rounding, division, square roots..)
+    rounding - rounding type. (how you round)
+    _rounding_decision - ALWAYS_ROUND, NEVER_ROUND -- do you round?
+    traps - If traps[exception] = 1, then the exception is
+                    raised when it is caused.  Otherwise, a value is
+                    substituted in.
+    flags  - When an exception is caused, flags[exception] is incremented.
+             (Whether or not the trap_enabler is set)
+             Should be reset by user of Decimal instance.
+    Emin -   Minimum exponent
+    Emax -   Maximum exponent
+    capitals -      If 1, 1*10^1 is printed as 1E+1.
+                    If 0, printed as 1e1
+    _clamp - If 1, change exponents if too high (Default 0)
+    """
+
+    def __init__(self, prec=None, rounding=None,
+                 traps=None, flags=None,
+                 _rounding_decision=None,
+                 Emin=None, Emax=None,
+                 capitals=None, _clamp=0,
+                 _ignored_flags=None):
+        if flags is None:
+            flags = []
+        if _ignored_flags is None:
+            _ignored_flags = []
+        if not isinstance(flags, dict):
+            flags = dict([(s,s in flags) for s in _signals])
+            del s
+        if traps is not None and not isinstance(traps, dict):
+            traps = dict([(s,s in traps) for s in _signals])
+            del s
+        for name, val in locals().items():
+            if val is None:
+                setattr(self, name, _copy.copy(getattr(DefaultContext, name)))
+            else:
+                setattr(self, name, val)
+        del self.self
+
+    def __repr__(self):
+        """Show the current context."""
+        s = []
+        s.append('Context(prec=%(prec)d, rounding=%(rounding)s, Emin=%(Emin)d, Emax=%(Emax)d, capitals=%(capitals)d' % vars(self))
+        s.append('flags=[' + ', '.join([f.__name__ for f, v in self.flags.items() if v]) + ']')
+        s.append('traps=[' + ', '.join([t.__name__ for t, v in self.traps.items() if v]) + ']')
+        return ', '.join(s) + ')'
+
+    def clear_flags(self):
+        """Reset all flags to zero"""
+        for flag in self.flags:
+            self.flags[flag] = 0
+
+    def _shallow_copy(self):
+        """Returns a shallow copy from self."""
+        nc = Context(self.prec, self.rounding, self.traps, self.flags,
+                         self._rounding_decision, self.Emin, self.Emax,
+                         self.capitals, self._clamp, self._ignored_flags)
+        return nc
+
+    def copy(self):
+        """Returns a deep copy from self."""
+        nc = Context(self.prec, self.rounding, self.traps.copy(), self.flags.copy(),
+                         self._rounding_decision, self.Emin, self.Emax,
+                         self.capitals, self._clamp, self._ignored_flags)
+        return nc
+    __copy__ = copy
+
+    def _raise_error(self, condition, explanation = None, *args):
+        """Handles an error
+
+        If the flag is in _ignored_flags, returns the default response.
+        Otherwise, it increments the flag, then, if the corresponding
+        trap_enabler is set, it reaises the exception.  Otherwise, it returns
+        the default value after incrementing the flag.
+        """
+        error = _condition_map.get(condition, condition)
+        if error in self._ignored_flags:
+            #Don't touch the flag
+            return error().handle(self, *args)
+
+        self.flags[error] += 1
+        if not self.traps[error]:
+            #The errors define how to handle themselves.
+            return condition().handle(self, *args)
+
+        # Errors should only be risked on copies of the context
+        #self._ignored_flags = []
+        raise error, explanation
+
+    def _ignore_all_flags(self):
+        """Ignore all flags, if they are raised"""
+        return self._ignore_flags(*_signals)
+
+    def _ignore_flags(self, *flags):
+        """Ignore the flags, if they are raised"""
+        # Do not mutate-- This way, copies of a context leave the original
+        # alone.
+        self._ignored_flags = (self._ignored_flags + list(flags))
+        return list(flags)
+
+    def _regard_flags(self, *flags):
+        """Stop ignoring the flags, if they are raised"""
+        if flags and isinstance(flags[0], (tuple,list)):
+            flags = flags[0]
+        for flag in flags:
+            self._ignored_flags.remove(flag)
+
+    def __hash__(self):
+        """A Context cannot be hashed."""
+        # We inherit object.__hash__, so we must deny this explicitly
+        raise TypeError, "Cannot hash a Context."
+
+    def Etiny(self):
+        """Returns Etiny (= Emin - prec + 1)"""
+        return int(self.Emin - self.prec + 1)
+
+    def Etop(self):
+        """Returns maximum exponent (= Emax - prec + 1)"""
+        return int(self.Emax - self.prec + 1)
+
+    def _set_rounding_decision(self, type):
+        """Sets the rounding decision.
+
+        Sets the rounding decision, and returns the current (previous)
+        rounding decision.  Often used like:
+
+        context = context._shallow_copy()
+        # That so you don't change the calling context
+        # if an error occurs in the middle (say DivisionImpossible is raised).
+
+        rounding = context._set_rounding_decision(NEVER_ROUND)
+        instance = instance / Decimal(2)
+        context._set_rounding_decision(rounding)
+
+        This will make it not round for that operation.
+        """
+
+        rounding = self._rounding_decision
+        self._rounding_decision = type
+        return rounding
+
+    def _set_rounding(self, type):
+        """Sets the rounding type.
+
+        Sets the rounding type, and returns the current (previous)
+        rounding type.  Often used like:
+
+        context = context.copy()
+        # so you don't change the calling context
+        # if an error occurs in the middle.
+        rounding = context._set_rounding(ROUND_UP)
+        val = self.__sub__(other, context=context)
+        context._set_rounding(rounding)
+
+        This will make it round up for that operation.
+        """
+        rounding = self.rounding
+        self.rounding= type
+        return rounding
+
+    def create_decimal(self, num='0'):
+        """Creates a new Decimal instance but using self as context."""
+        d = Decimal(num, context=self)
+        return d._fix(self)
+
+    #Methods
+    def abs(self, a):
+        """Returns the absolute value of the operand.
+
+        If the operand is negative, the result is the same as using the minus
+        operation on the operand. Otherwise, the result is the same as using
+        the plus operation on the operand.
+
+        >>> ExtendedContext.abs(Decimal('2.1'))
+        Decimal("2.1")
+        >>> ExtendedContext.abs(Decimal('-100'))
+        Decimal("100")
+        >>> ExtendedContext.abs(Decimal('101.5'))
+        Decimal("101.5")
+        >>> ExtendedContext.abs(Decimal('-101.5'))
+        Decimal("101.5")
+        """
+        return a.__abs__(context=self)
+
+    def add(self, a, b):
+        """Return the sum of the two operands.
+
+        >>> ExtendedContext.add(Decimal('12'), Decimal('7.00'))
+        Decimal("19.00")
+        >>> ExtendedContext.add(Decimal('1E+2'), Decimal('1.01E+4'))
+        Decimal("1.02E+4")
+        """
+        return a.__add__(b, context=self)
+
+    def _apply(self, a):
+        return str(a._fix(self))
+
+    def compare(self, a, b):
+        """Compares values numerically.
+
+        If the signs of the operands differ, a value representing each operand
+        ('-1' if the operand is less than zero, '0' if the operand is zero or
+        negative zero, or '1' if the operand is greater than zero) is used in
+        place of that operand for the comparison instead of the actual
+        operand.
+
+        The comparison is then effected by subtracting the second operand from
+        the first and then returning a value according to the result of the
+        subtraction: '-1' if the result is less than zero, '0' if the result is
+        zero or negative zero, or '1' if the result is greater than zero.
+
+        >>> ExtendedContext.compare(Decimal('2.1'), Decimal('3'))
+        Decimal("-1")
+        >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.1'))
+        Decimal("0")
+        >>> ExtendedContext.compare(Decimal('2.1'), Decimal('2.10'))
+        Decimal("0")
+        >>> ExtendedContext.compare(Decimal('3'), Decimal('2.1'))
+        Decimal("1")
+        >>> ExtendedContext.compare(Decimal('2.1'), Decimal('-3'))
+        Decimal("1")
+        >>> ExtendedContext.compare(Decimal('-3'), Decimal('2.1'))
+        Decimal("-1")
+        """
+        return a.compare(b, context=self)
+
+    def divide(self, a, b):
+        """Decimal division in a specified context.
+
+        >>> ExtendedContext.divide(Decimal('1'), Decimal('3'))
+        Decimal("0.333333333")
+        >>> ExtendedContext.divide(Decimal('2'), Decimal('3'))
+        Decimal("0.666666667")
+        >>> ExtendedContext.divide(Decimal('5'), Decimal('2'))
+        Decimal("2.5")
+        >>> ExtendedContext.divide(Decimal('1'), Decimal('10'))
+        Decimal("0.1")
+        >>> ExtendedContext.divide(Decimal('12'), Decimal('12'))
+        Decimal("1")
+        >>> ExtendedContext.divide(Decimal('8.00'), Decimal('2'))
+        Decimal("4.00")
+        >>> ExtendedContext.divide(Decimal('2.400'), Decimal('2.0'))
+        Decimal("1.20")
+        >>> ExtendedContext.divide(Decimal('1000'), Decimal('100'))
+        Decimal("10")
+        >>> ExtendedContext.divide(Decimal('1000'), Decimal('1'))
+        Decimal("1000")
+        >>> ExtendedContext.divide(Decimal('2.40E+6'), Decimal('2'))
+        Decimal("1.20E+6")
+        """
+        return a.__div__(b, context=self)
+
+    def divide_int(self, a, b):
+        """Divides two numbers and returns the integer part of the result.
+
+        >>> ExtendedContext.divide_int(Decimal('2'), Decimal('3'))
+        Decimal("0")
+        >>> ExtendedContext.divide_int(Decimal('10'), Decimal('3'))
+        Decimal("3")
+        >>> ExtendedContext.divide_int(Decimal('1'), Decimal('0.3'))
+        Decimal("3")
+        """
+        return a.__floordiv__(b, context=self)
+
+    def divmod(self, a, b):
+        return a.__divmod__(b, context=self)
+
+    def max(self, a,b):
+        """max compares two values numerically and returns the maximum.
+
+        If either operand is a NaN then the general rules apply.
+        Otherwise, the operands are compared as as though by the compare
+        operation. If they are numerically equal then the left-hand operand
+        is chosen as the result. Otherwise the maximum (closer to positive
+        infinity) of the two operands is chosen as the result.
+
+        >>> ExtendedContext.max(Decimal('3'), Decimal('2'))
+        Decimal("3")
+        >>> ExtendedContext.max(Decimal('-10'), Decimal('3'))
+        Decimal("3")
+        >>> ExtendedContext.max(Decimal('1.0'), Decimal('1'))
+        Decimal("1")
+        >>> ExtendedContext.max(Decimal('7'), Decimal('NaN'))
+        Decimal("7")
+        """
+        return a.max(b, context=self)
+
+    def min(self, a,b):
+        """min compares two values numerically and returns the minimum.
+
+        If either operand is a NaN then the general rules apply.
+        Otherwise, the operands are compared as as though by the compare
+        operation. If they are numerically equal then the left-hand operand
+        is chosen as the result. Otherwise the minimum (closer to negative
+        infinity) of the two operands is chosen as the result.
+
+        >>> ExtendedContext.min(Decimal('3'), Decimal('2'))
+        Decimal("2")
+        >>> ExtendedContext.min(Decimal('-10'), Decimal('3'))
+        Decimal("-10")
+        >>> ExtendedContext.min(Decimal('1.0'), Decimal('1'))
+        Decimal("1.0")
+        >>> ExtendedContext.min(Decimal('7'), Decimal('NaN'))
+        Decimal("7")
+        """
+        return a.min(b, context=self)
+
+    def minus(self, a):
+        """Minus corresponds to unary prefix minus in Python.
+
+        The operation is evaluated using the same rules as subtract; the
+        operation minus(a) is calculated as subtract('0', a) where the '0'
+        has the same exponent as the operand.
+
+        >>> ExtendedContext.minus(Decimal('1.3'))
+        Decimal("-1.3")
+        >>> ExtendedContext.minus(Decimal('-1.3'))
+        Decimal("1.3")
+        """
+        return a.__neg__(context=self)
+
+    def multiply(self, a, b):
+        """multiply multiplies two operands.
+
+        If either operand is a special value then the general rules apply.
+        Otherwise, the operands are multiplied together ('long multiplication'),
+        resulting in a number which may be as long as the sum of the lengths
+        of the two operands.
+
+        >>> ExtendedContext.multiply(Decimal('1.20'), Decimal('3'))
+        Decimal("3.60")
+        >>> ExtendedContext.multiply(Decimal('7'), Decimal('3'))
+        Decimal("21")
+        >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('0.8'))
+        Decimal("0.72")
+        >>> ExtendedContext.multiply(Decimal('0.9'), Decimal('-0'))
+        Decimal("-0.0")
+        >>> ExtendedContext.multiply(Decimal('654321'), Decimal('654321'))
+        Decimal("4.28135971E+11")
+        """
+        return a.__mul__(b, context=self)
+
+    def normalize(self, a):
+        """normalize reduces an operand to its simplest form.
+
+        Essentially a plus operation with all trailing zeros removed from the
+        result.
+
+        >>> ExtendedContext.normalize(Decimal('2.1'))
+        Decimal("2.1")
+        >>> ExtendedContext.normalize(Decimal('-2.0'))
+        Decimal("-2")
+        >>> ExtendedContext.normalize(Decimal('1.200'))
+        Decimal("1.2")
+        >>> ExtendedContext.normalize(Decimal('-120'))
+        Decimal("-1.2E+2")
+        >>> ExtendedContext.normalize(Decimal('120.00'))
+        Decimal("1.2E+2")
+        >>> ExtendedContext.normalize(Decimal('0.00'))
+        Decimal("0")
+        """
+        return a.normalize(context=self)
+
+    def plus(self, a):
+        """Plus corresponds to unary prefix plus in Python.
+
+        The operation is evaluated using the same rules as add; the
+        operation plus(a) is calculated as add('0', a) where the '0'
+        has the same exponent as the operand.
+
+        >>> ExtendedContext.plus(Decimal('1.3'))
+        Decimal("1.3")
+        >>> ExtendedContext.plus(Decimal('-1.3'))
+        Decimal("-1.3")
+        """
+        return a.__pos__(context=self)
+
+    def power(self, a, b, modulo=None):
+        """Raises a to the power of b, to modulo if given.
+
+        The right-hand operand must be a whole number whose integer part (after
+        any exponent has been applied) has no more than 9 digits and whose
+        fractional part (if any) is all zeros before any rounding. The operand
+        may be positive, negative, or zero; if negative, the absolute value of
+        the power is used, and the left-hand operand is inverted (divided into
+        1) before use.
+
+        If the increased precision needed for the intermediate calculations
+        exceeds the capabilities of the implementation then an Invalid operation
+        condition is raised.
+
+        If, when raising to a negative power, an underflow occurs during the
+        division into 1, the operation is not halted at that point but
+        continues.
+
+        >>> ExtendedContext.power(Decimal('2'), Decimal('3'))
+        Decimal("8")
+        >>> ExtendedContext.power(Decimal('2'), Decimal('-3'))
+        Decimal("0.125")
+        >>> ExtendedContext.power(Decimal('1.7'), Decimal('8'))
+        Decimal("69.7575744")
+        >>> ExtendedContext.power(Decimal('Infinity'), Decimal('-2'))
+        Decimal("0")
+        >>> ExtendedContext.power(Decimal('Infinity'), Decimal('-1'))
+        Decimal("0")
+        >>> ExtendedContext.power(Decimal('Infinity'), Decimal('0'))
+        Decimal("1")
+        >>> ExtendedContext.power(Decimal('Infinity'), Decimal('1'))
+        Decimal("Infinity")
+        >>> ExtendedContext.power(Decimal('Infinity'), Decimal('2'))
+        Decimal("Infinity")
+        >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('-2'))
+        Decimal("0")
+        >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('-1'))
+        Decimal("-0")
+        >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('0'))
+        Decimal("1")
+        >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('1'))
+        Decimal("-Infinity")
+        >>> ExtendedContext.power(Decimal('-Infinity'), Decimal('2'))
+        Decimal("Infinity")
+        >>> ExtendedContext.power(Decimal('0'), Decimal('0'))
+        Decimal("NaN")
+        """
+        return a.__pow__(b, modulo, context=self)
+
+    def quantize(self, a, b):
+        """Returns a value equal to 'a' (rounded) and having the exponent of 'b'.
+
+        The coefficient of the result is derived from that of the left-hand
+        operand. It may be rounded using the current rounding setting (if the
+        exponent is being increased), multiplied by a positive power of ten (if
+        the exponent is being decreased), or is unchanged (if the exponent is
+        already equal to that of the right-hand operand).
+
+        Unlike other operations, if the length of the coefficient after the
+        quantize operation would be greater than precision then an Invalid
+        operation condition is raised. This guarantees that, unless there is an
+        error condition, the exponent of the result of a quantize is always
+        equal to that of the right-hand operand.
+
+        Also unlike other operations, quantize will never raise Underflow, even
+        if the result is subnormal and inexact.
+
+        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.001'))
+        Decimal("2.170")
+        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.01'))
+        Decimal("2.17")
+        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('0.1'))
+        Decimal("2.2")
+        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+0'))
+        Decimal("2")
+        >>> ExtendedContext.quantize(Decimal('2.17'), Decimal('1e+1'))
+        Decimal("0E+1")
+        >>> ExtendedContext.quantize(Decimal('-Inf'), Decimal('Infinity'))
+        Decimal("-Infinity")
+        >>> ExtendedContext.quantize(Decimal('2'), Decimal('Infinity'))
+        Decimal("NaN")
+        >>> ExtendedContext.quantize(Decimal('-0.1'), Decimal('1'))
+        Decimal("-0")
+        >>> ExtendedContext.quantize(Decimal('-0'), Decimal('1e+5'))
+        Decimal("-0E+5")
+        >>> ExtendedContext.quantize(Decimal('+35236450.6'), Decimal('1e-2'))
+        Decimal("NaN")
+        >>> ExtendedContext.quantize(Decimal('-35236450.6'), Decimal('1e-2'))
+        Decimal("NaN")
+        >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-1'))
+        Decimal("217.0")
+        >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e-0'))
+        Decimal("217")
+        >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+1'))
+        Decimal("2.2E+2")
+        >>> ExtendedContext.quantize(Decimal('217'), Decimal('1e+2'))
+        Decimal("2E+2")
+        """
+        return a.quantize(b, context=self)
+
+    def remainder(self, a, b):
+        """Returns the remainder from integer division.
+
+        The result is the residue of the dividend after the operation of
+        calculating integer division as described for divide-integer, rounded to
+        precision digits if necessary. The sign of the result, if non-zero, is
+        the same as that of the original dividend.
+
+        This operation will fail under the same conditions as integer division
+        (that is, if integer division on the same two operands would fail, the
+        remainder cannot be calculated).
+
+        >>> ExtendedContext.remainder(Decimal('2.1'), Decimal('3'))
+        Decimal("2.1")
+        >>> ExtendedContext.remainder(Decimal('10'), Decimal('3'))
+        Decimal("1")
+        >>> ExtendedContext.remainder(Decimal('-10'), Decimal('3'))
+        Decimal("-1")
+        >>> ExtendedContext.remainder(Decimal('10.2'), Decimal('1'))
+        Decimal("0.2")
+        >>> ExtendedContext.remainder(Decimal('10'), Decimal('0.3'))
+        Decimal("0.1")
+        >>> ExtendedContext.remainder(Decimal('3.6'), Decimal('1.3'))
+        Decimal("1.0")
+        """
+        return a.__mod__(b, context=self)
+
+    def remainder_near(self, a, b):
+        """Returns to be "a - b * n", where n is the integer nearest the exact
+        value of "x / b" (if two integers are equally near then the even one
+        is chosen). If the result is equal to 0 then its sign will be the
+        sign of a.
+
+        This operation will fail under the same conditions as integer division
+        (that is, if integer division on the same two operands would fail, the
+        remainder cannot be calculated).
+
+        >>> ExtendedContext.remainder_near(Decimal('2.1'), Decimal('3'))
+        Decimal("-0.9")
+        >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('6'))
+        Decimal("-2")
+        >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('3'))
+        Decimal("1")
+        >>> ExtendedContext.remainder_near(Decimal('-10'), Decimal('3'))
+        Decimal("-1")
+        >>> ExtendedContext.remainder_near(Decimal('10.2'), Decimal('1'))
+        Decimal("0.2")
+        >>> ExtendedContext.remainder_near(Decimal('10'), Decimal('0.3'))
+        Decimal("0.1")
+        >>> ExtendedContext.remainder_near(Decimal('3.6'), Decimal('1.3'))
+        Decimal("-0.3")
+        """
+        return a.remainder_near(b, context=self)
+
+    def same_quantum(self, a, b):
+        """Returns True if the two operands have the same exponent.
+
+        The result is never affected by either the sign or the coefficient of
+        either operand.
+
+        >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.001'))
+        False
+        >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('0.01'))
+        True
+        >>> ExtendedContext.same_quantum(Decimal('2.17'), Decimal('1'))
+        False
+        >>> ExtendedContext.same_quantum(Decimal('Inf'), Decimal('-Inf'))
+        True
+        """
+        return a.same_quantum(b)
+
+    def sqrt(self, a):
+        """Returns the square root of a non-negative number to context precision.
+
+        If the result must be inexact, it is rounded using the round-half-even
+        algorithm.
+
+        >>> ExtendedContext.sqrt(Decimal('0'))
+        Decimal("0")
+        >>> ExtendedContext.sqrt(Decimal('-0'))
+        Decimal("-0")
+        >>> ExtendedContext.sqrt(Decimal('0.39'))
+        Decimal("0.624499800")
+        >>> ExtendedContext.sqrt(Decimal('100'))
+        Decimal("10")
+        >>> ExtendedContext.sqrt(Decimal('1'))
+        Decimal("1")
+        >>> ExtendedContext.sqrt(Decimal('1.0'))
+        Decimal("1.0")
+        >>> ExtendedContext.sqrt(Decimal('1.00'))
+        Decimal("1.0")
+        >>> ExtendedContext.sqrt(Decimal('7'))
+        Decimal("2.64575131")
+        >>> ExtendedContext.sqrt(Decimal('10'))
+        Decimal("3.16227766")
+        >>> ExtendedContext.prec
+        9
+        """
+        return a.sqrt(context=self)
+
+    def subtract(self, a, b):
+        """Return the difference between the two operands.
+
+        >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.07'))
+        Decimal("0.23")
+        >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('1.30'))
+        Decimal("0.00")
+        >>> ExtendedContext.subtract(Decimal('1.3'), Decimal('2.07'))
+        Decimal("-0.77")
+        """
+        return a.__sub__(b, context=self)
+
+    def to_eng_string(self, a):
+        """Converts a number to a string, using scientific notation.
+
+        The operation is not affected by the context.
+        """
+        return a.to_eng_string(context=self)
+
+    def to_sci_string(self, a):
+        """Converts a number to a string, using scientific notation.
+
+        The operation is not affected by the context.
+        """
+        return a.__str__(context=self)
+
+    def to_integral(self, a):
+        """Rounds to an integer.
+
+        When the operand has a negative exponent, the result is the same
+        as using the quantize() operation using the given operand as the
+        left-hand-operand, 1E+0 as the right-hand-operand, and the precision
+        of the operand as the precision setting, except that no flags will
+        be set. The rounding mode is taken from the context.
+
+        >>> ExtendedContext.to_integral(Decimal('2.1'))
+        Decimal("2")
+        >>> ExtendedContext.to_integral(Decimal('100'))
+        Decimal("100")
+        >>> ExtendedContext.to_integral(Decimal('100.0'))
+        Decimal("100")
+        >>> ExtendedContext.to_integral(Decimal('101.5'))
+        Decimal("102")
+        >>> ExtendedContext.to_integral(Decimal('-101.5'))
+        Decimal("-102")
+        >>> ExtendedContext.to_integral(Decimal('10E+5'))
+        Decimal("1.0E+6")
+        >>> ExtendedContext.to_integral(Decimal('7.89E+77'))
+        Decimal("7.89E+77")
+        >>> ExtendedContext.to_integral(Decimal('-Inf'))
+        Decimal("-Infinity")
+        """
+        return a.to_integral(context=self)
+
+class _WorkRep(object):
+    __slots__ = ('sign','int','exp')
+    # sign: 0 or 1
+    # int:  int or long
+    # exp:  None, int, or string
+
+    def __init__(self, value=None):
+        if value is None:
+            self.sign = None
+            self.int = 0
+            self.exp = None
+        elif isinstance(value, Decimal):
+            self.sign = value._sign
+            cum = 0
+            for digit  in value._int:
+                cum = cum * 10 + digit
+            self.int = cum
+            self.exp = value._exp
+        else:
+            # assert isinstance(value, tuple)
+            self.sign = value[0]
+            self.int = value[1]
+            self.exp = value[2]
+
+    def __repr__(self):
+        return "(%r, %r, %r)" % (self.sign, self.int, self.exp)
+
+    __str__ = __repr__
+
+
+
+def _normalize(op1, op2, shouldround = 0, prec = 0):
+    """Normalizes op1, op2 to have the same exp and length of coefficient.
+
+    Done during addition.
+    """
+    # Yes, the exponent is a long, but the difference between exponents
+    # must be an int-- otherwise you'd get a big memory problem.
+    numdigits = int(op1.exp - op2.exp)
+    if numdigits < 0:
+        numdigits = -numdigits
+        tmp = op2
+        other = op1
+    else:
+        tmp = op1
+        other = op2
+
+
+    if shouldround and numdigits > prec + 1:
+        # Big difference in exponents - check the adjusted exponents
+        tmp_len = len(str(tmp.int))
+        other_len = len(str(other.int))
+        if numdigits > (other_len + prec + 1 - tmp_len):
+            # If the difference in adjusted exps is > prec+1, we know
+            # other is insignificant, so might as well put a 1 after the precision.
+            # (since this is only for addition.)  Also stops use of massive longs.
+
+            extend = prec + 2 - tmp_len
+            if extend <= 0:
+                extend = 1
+            tmp.int *= 10 ** extend
+            tmp.exp -= extend
+            other.int = 1
+            other.exp = tmp.exp
+            return op1, op2
+
+    tmp.int *= 10 ** numdigits
+    tmp.exp -= numdigits
+    return op1, op2
+
+def _adjust_coefficients(op1, op2):
+    """Adjust op1, op2 so that op2.int * 10 > op1.int >= op2.int.
+
+    Returns the adjusted op1, op2 as well as the change in op1.exp-op2.exp.
+
+    Used on _WorkRep instances during division.
+    """
+    adjust = 0
+    #If op1 is smaller, make it larger
+    while op2.int > op1.int:
+        op1.int *= 10
+        op1.exp -= 1
+        adjust += 1
+
+    #If op2 is too small, make it larger
+    while op1.int >= (10 * op2.int):
+        op2.int *= 10
+        op2.exp -= 1
+        adjust -= 1
+
+    return op1, op2, adjust
+
+##### Helper Functions ########################################
+
+def _convert_other(other):
+    """Convert other to Decimal.
+
+    Verifies that it's ok to use in an implicit construction.
+    """
+    if isinstance(other, Decimal):
+        return other
+    if isinstance(other, (int, long)):
+        return Decimal(other)
+    return NotImplemented
+
+_infinity_map = {
+    'inf' : 1,
+    'infinity' : 1,
+    '+inf' : 1,
+    '+infinity' : 1,
+    '-inf' : -1,
+    '-infinity' : -1
+}
+
+def _isinfinity(num):
+    """Determines whether a string or float is infinity.
+
+    +1 for negative infinity; 0 for finite ; +1 for positive infinity
+    """
+    num = str(num).lower()
+    return _infinity_map.get(num, 0)
+
+def _isnan(num):
+    """Determines whether a string or float is NaN
+
+    (1, sign, diagnostic info as string) => NaN
+    (2, sign, diagnostic info as string) => sNaN
+    0 => not a NaN
+    """
+    num = str(num).lower()
+    if not num:
+        return 0
+
+    #get the sign, get rid of trailing [+-]
+    sign = 0
+    if num[0] == '+':
+        num = num[1:]
+    elif num[0] == '-':  #elif avoids '+-nan'
+        num = num[1:]
+        sign = 1
+
+    if num.startswith('nan'):
+        if len(num) > 3 and not num[3:].isdigit(): #diagnostic info
+            return 0
+        return (1, sign, num[3:].lstrip('0'))
+    if num.startswith('snan'):
+        if len(num) > 4 and not num[4:].isdigit():
+            return 0
+        return (2, sign, num[4:].lstrip('0'))
+    return 0
+
+
+##### Setup Specific Contexts ################################
+
+# The default context prototype used by Context()
+# Is mutable, so that new contexts can have different default values
+
+DefaultContext = Context(
+        prec=28, rounding=ROUND_HALF_EVEN,
+        traps=[DivisionByZero, Overflow, InvalidOperation],
+        flags=[],
+        _rounding_decision=ALWAYS_ROUND,
+        Emax=999999999,
+        Emin=-999999999,
+        capitals=1
+)
+
+# Pre-made alternate contexts offered by the specification
+# Don't change these; the user should be able to select these
+# contexts and be able to reproduce results from other implementations
+# of the spec.
+
+BasicContext = Context(
+        prec=9, rounding=ROUND_HALF_UP,
+        traps=[DivisionByZero, Overflow, InvalidOperation, Clamped, Underflow],
+        flags=[],
+)
+
+ExtendedContext = Context(
+        prec=9, rounding=ROUND_HALF_EVEN,
+        traps=[],
+        flags=[],
+)
+
+
+##### Useful Constants (internal use only) ####################
+
+#Reusable defaults
+Inf = Decimal('Inf')
+negInf = Decimal('-Inf')
+
+#Infsign[sign] is infinity w/ that sign
+Infsign = (Inf, negInf)
+
+NaN = Decimal('NaN')
+
+
+##### crud for parsing strings #################################
+import re
+
+# There's an optional sign at the start, and an optional exponent
+# at the end.  The exponent has an optional sign and at least one
+# digit.  In between, must have either at least one digit followed
+# by an optional fraction, or a decimal point followed by at least
+# one digit.  Yuck.
+
+_parser = re.compile(r"""
+#    \s*
+    (?P<sign>[-+])?
+    (
+        (?P<int>\d+) (\. (?P<frac>\d*))?
+    |
+        \. (?P<onlyfrac>\d+)
+    )
+    ([eE](?P<exp>[-+]? \d+))?
+#    \s*
+    $
+""", re.VERBOSE).match #Uncomment the \s* to allow leading or trailing spaces.
+
+del re
+
+# return sign, n, p s.t. float string value == -1**sign * n * 10**p exactly
+
+def _string2exact(s):
+    m = _parser(s)
+    if m is None:
+        raise ValueError("invalid literal for Decimal: %r" % s)
+
+    if m.group('sign') == "-":
+        sign = 1
+    else:
+        sign = 0
+
+    exp = m.group('exp')
+    if exp is None:
+        exp = 0
+    else:
+        exp = int(exp)
+
+    intpart = m.group('int')
+    if intpart is None:
+        intpart = ""
+        fracpart = m.group('onlyfrac')
+    else:
+        fracpart = m.group('frac')
+        if fracpart is None:
+            fracpart = ""
+
+    exp -= len(fracpart)
+
+    mantissa = intpart + fracpart
+    tmp = map(int, mantissa)
+    backup = tmp
+    while tmp and tmp[0] == 0:
+        del tmp[0]
+
+    # It's a zero
+    if not tmp:
+        if backup:
+            return (sign, tuple(backup), exp)
+        return (sign, (0,), exp)
+    mantissa = tuple(tmp)
+
+    return (sign, mantissa, exp)
+
+
+if __name__ == '__main__':
+    import doctest, sys
+    doctest.testmod(sys.modules[__name__])
diff --git a/webapp/django/utils/_os.py b/webapp/django/utils/_os.py
new file mode 100644
index 0000000..30d7cbd
--- /dev/null
+++ b/webapp/django/utils/_os.py
@@ -0,0 +1,23 @@
+from os.path import join, normcase, abspath, sep
+
+def safe_join(base, *paths):
+    """
+    Joins one or more path components to the base path component intelligently.
+    Returns a normalized, absolute version of the final path.
+
+    The final path must be located inside of the base path component (otherwise
+    a ValueError is raised).
+    """
+    # We need to use normcase to ensure we don't false-negative on case
+    # insensitive operating systems (like Windows).
+    final_path = normcase(abspath(join(base, *paths)))
+    base_path = normcase(abspath(base))
+    base_path_len = len(base_path)
+    # Ensure final_path starts with base_path and that the next character after
+    # the final path is os.sep (or nothing, in which case final_path must be
+    # equal to base_path).
+    if not final_path.startswith(base_path) \
+       or final_path[base_path_len:base_path_len+1] not in ('', sep):
+        raise ValueError('the joined path is located outside of the base path'
+                         ' component')
+    return final_path
diff --git a/webapp/django/utils/_threading_local.py b/webapp/django/utils/_threading_local.py
new file mode 100644
index 0000000..bf9a257
--- /dev/null
+++ b/webapp/django/utils/_threading_local.py
@@ -0,0 +1,240 @@
+"""Thread-local objects
+
+(Note that this module provides a Python version of thread
+ threading.local class.  Depending on the version of Python you're
+ using, there may be a faster one available.  You should always import
+ the local class from threading.)
+
+Thread-local objects support the management of thread-local data.
+If you have data that you want to be local to a thread, simply create
+a thread-local object and use its attributes:
+
+  >>> mydata = local()
+  >>> mydata.number = 42
+  >>> mydata.number
+  42
+
+You can also access the local-object's dictionary:
+
+  >>> mydata.__dict__
+  {'number': 42}
+  >>> mydata.__dict__.setdefault('widgets', [])
+  []
+  >>> mydata.widgets
+  []
+
+What's important about thread-local objects is that their data are
+local to a thread. If we access the data in a different thread:
+
+  >>> log = []
+  >>> def f():
+  ...     items = mydata.__dict__.items()
+  ...     items.sort()
+  ...     log.append(items)
+  ...     mydata.number = 11
+  ...     log.append(mydata.number)
+
+  >>> import threading
+  >>> thread = threading.Thread(target=f)
+  >>> thread.start()
+  >>> thread.join()
+  >>> log
+  [[], 11]
+
+we get different data.  Furthermore, changes made in the other thread
+don't affect data seen in this thread:
+
+  >>> mydata.number
+  42
+
+Of course, values you get from a local object, including a __dict__
+attribute, are for whatever thread was current at the time the
+attribute was read.  For that reason, you generally don't want to save
+these values across threads, as they apply only to the thread they
+came from.
+
+You can create custom local objects by subclassing the local class:
+
+  >>> class MyLocal(local):
+  ...     number = 2
+  ...     initialized = False
+  ...     def __init__(self, **kw):
+  ...         if self.initialized:
+  ...             raise SystemError('__init__ called too many times')
+  ...         self.initialized = True
+  ...         self.__dict__.update(kw)
+  ...     def squared(self):
+  ...         return self.number ** 2
+
+This can be useful to support default values, methods and
+initialization.  Note that if you define an __init__ method, it will be
+called each time the local object is used in a separate thread.  This
+is necessary to initialize each thread's dictionary.
+
+Now if we create a local object:
+
+  >>> mydata = MyLocal(color='red')
+
+Now we have a default number:
+
+  >>> mydata.number
+  2
+
+an initial color:
+
+  >>> mydata.color
+  'red'
+  >>> del mydata.color
+
+And a method that operates on the data:
+
+  >>> mydata.squared()
+  4
+
+As before, we can access the data in a separate thread:
+
+  >>> log = []
+  >>> thread = threading.Thread(target=f)
+  >>> thread.start()
+  >>> thread.join()
+  >>> log
+  [[('color', 'red'), ('initialized', True)], 11]
+
+without affecting this thread's data:
+
+  >>> mydata.number
+  2
+  >>> mydata.color
+  Traceback (most recent call last):
+  ...
+  AttributeError: 'MyLocal' object has no attribute 'color'
+
+Note that subclasses can define slots, but they are not thread
+local. They are shared across threads:
+
+  >>> class MyLocal(local):
+  ...     __slots__ = 'number'
+
+  >>> mydata = MyLocal()
+  >>> mydata.number = 42
+  >>> mydata.color = 'red'
+
+So, the separate thread:
+
+  >>> thread = threading.Thread(target=f)
+  >>> thread.start()
+  >>> thread.join()
+
+affects what we see:
+
+  >>> mydata.number
+  11
+
+>>> del mydata
+"""
+
+# Threading import is at end
+
+class _localbase(object):
+    __slots__ = '_local__key', '_local__args', '_local__lock'
+
+    def __new__(cls, *args, **kw):
+        self = object.__new__(cls)
+        key = '_local__key', 'thread.local.' + str(id(self))
+        object.__setattr__(self, '_local__key', key)
+        object.__setattr__(self, '_local__args', (args, kw))
+        object.__setattr__(self, '_local__lock', RLock())
+
+        if args or kw and (cls.__init__ is object.__init__):
+            raise TypeError("Initialization arguments are not supported")
+
+        # We need to create the thread dict in anticipation of
+        # __init__ being called, to make sure we don't call it
+        # again ourselves.
+        dict = object.__getattribute__(self, '__dict__')
+        currentThread().__dict__[key] = dict
+
+        return self
+
+def _patch(self):
+    key = object.__getattribute__(self, '_local__key')
+    d = currentThread().__dict__.get(key)
+    if d is None:
+        d = {}
+        currentThread().__dict__[key] = d
+        object.__setattr__(self, '__dict__', d)
+
+        # we have a new instance dict, so call out __init__ if we have
+        # one
+        cls = type(self)
+        if cls.__init__ is not object.__init__:
+            args, kw = object.__getattribute__(self, '_local__args')
+            cls.__init__(self, *args, **kw)
+    else:
+        object.__setattr__(self, '__dict__', d)
+
+class local(_localbase):
+
+    def __getattribute__(self, name):
+        lock = object.__getattribute__(self, '_local__lock')
+        lock.acquire()
+        try:
+            _patch(self)
+            return object.__getattribute__(self, name)
+        finally:
+            lock.release()
+
+    def __setattr__(self, name, value):
+        lock = object.__getattribute__(self, '_local__lock')
+        lock.acquire()
+        try:
+            _patch(self)
+            return object.__setattr__(self, name, value)
+        finally:
+            lock.release()
+
+    def __delattr__(self, name):
+        lock = object.__getattribute__(self, '_local__lock')
+        lock.acquire()
+        try:
+            _patch(self)
+            return object.__delattr__(self, name)
+        finally:
+            lock.release()
+
+
+    def __del__():
+        threading_enumerate = enumerate
+        __getattribute__ = object.__getattribute__
+
+        def __del__(self):
+            key = __getattribute__(self, '_local__key')
+
+            try:
+                threads = list(threading_enumerate())
+            except:
+                # if enumerate fails, as it seems to do during
+                # shutdown, we'll skip cleanup under the assumption
+                # that there is nothing to clean up
+                return
+
+            for thread in threads:
+                try:
+                    __dict__ = thread.__dict__
+                except AttributeError:
+                    # Thread is dying, rest in peace
+                    continue
+
+                if key in __dict__:
+                    try:
+                        del __dict__[key]
+                    except KeyError:
+                        pass # didn't have anything in this thread
+
+        return __del__
+    __del__ = __del__()
+
+try:
+    from threading import currentThread, enumerate, RLock
+except ImportError:
+    from dummy_threading import currentThread, enumerate, RLock
diff --git a/webapp/django/utils/autoreload.py b/webapp/django/utils/autoreload.py
new file mode 100644
index 0000000..8d9d6f2
--- /dev/null
+++ b/webapp/django/utils/autoreload.py
@@ -0,0 +1,119 @@
+# Autoreloading launcher.
+# Borrowed from Peter Hunt and the CherryPy project (http://www.cherrypy.org).
+# Some taken from Ian Bicking's Paste (http://pythonpaste.org/).
+#
+# Portions copyright (c) 2004, CherryPy Team (team@cherrypy.org)
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without modification,
+# are permitted provided that the following conditions are met:
+#
+#     * Redistributions of source code must retain the above copyright notice,
+#       this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright notice,
+#       this list of conditions and the following disclaimer in the documentation
+#       and/or other materials provided with the distribution.
+#     * Neither the name of the CherryPy Team nor the names of its contributors
+#       may be used to endorse or promote products derived from this software
+#       without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import os, sys, time
+
+try:
+    import thread
+except ImportError:
+    import dummy_thread as thread
+
+# This import does nothing, but it's necessary to avoid some race conditions
+# in the threading module. See http://code.djangoproject.com/ticket/2330 .
+try:
+    import threading
+except ImportError:
+    pass
+
+
+RUN_RELOADER = True
+
+_mtimes = {}
+_win = (sys.platform == "win32")
+
+def code_changed():
+    global _mtimes, _win
+    for filename in filter(lambda v: v, map(lambda m: getattr(m, "__file__", None), sys.modules.values())):
+        if filename.endswith(".pyc") or filename.endswith(".pyo"):
+            filename = filename[:-1]
+        if not os.path.exists(filename):
+            continue # File might be in an egg, so it can't be reloaded.
+        stat = os.stat(filename)
+        mtime = stat.st_mtime
+        if _win:
+            mtime -= stat.st_ctime
+        if filename not in _mtimes:
+            _mtimes[filename] = mtime
+            continue
+        if mtime != _mtimes[filename]:
+            _mtimes = {}
+            return True
+    return False
+
+def reloader_thread():
+    while RUN_RELOADER:
+        if code_changed():
+            sys.exit(3) # force reload
+        time.sleep(1)
+
+def restart_with_reloader():
+    while True:
+        args = [sys.executable] + sys.argv
+        if sys.platform == "win32":
+            args = ['"%s"' % arg for arg in args]
+        new_environ = os.environ.copy()
+        new_environ["RUN_MAIN"] = 'true'
+        exit_code = os.spawnve(os.P_WAIT, sys.executable, args, new_environ)
+        if exit_code != 3:
+            return exit_code
+
+def python_reloader(main_func, args, kwargs):
+    if os.environ.get("RUN_MAIN") == "true":
+        thread.start_new_thread(main_func, args, kwargs)
+        try:
+            reloader_thread()
+        except KeyboardInterrupt:
+            pass
+    else:
+        try:
+            sys.exit(restart_with_reloader())
+        except KeyboardInterrupt:
+            pass
+
+def jython_reloader(main_func, args, kwargs):
+    from _systemrestart import SystemRestart
+    thread.start_new_thread(main_func, args)
+    while True:
+        if code_changed():
+            raise SystemRestart
+        time.sleep(1)
+
+
+def main(main_func, args=None, kwargs=None):
+    if args is None:
+        args = ()
+    if kwargs is None:
+        kwargs = {}
+    if sys.platform.startswith('java'):
+        reloader = jython_reloader
+    else:
+        reloader = python_reloader
+    reloader(main_func, args, kwargs)
+
diff --git a/webapp/django/utils/cache.py b/webapp/django/utils/cache.py
new file mode 100644
index 0000000..9c566ae
--- /dev/null
+++ b/webapp/django/utils/cache.py
@@ -0,0 +1,204 @@
+"""
+This module contains helper functions for controlling caching. It does so by
+managing the "Vary" header of responses. It includes functions to patch the
+header of response objects directly and decorators that change functions to do
+that header-patching themselves.
+
+For information on the Vary header, see:
+
+    http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.44
+
+Essentially, the "Vary" HTTP header defines which headers a cache should take
+into account when building its cache key. Requests with the same path but
+different header content for headers named in "Vary" need to get different
+cache keys to prevent delivery of wrong content.
+
+An example: i18n middleware would need to distinguish caches by the
+"Accept-language" header.
+"""
+
+import re
+import time
+try:
+    set
+except NameError:
+    from sets import Set as set   # Python 2.3 fallback
+
+from django.conf import settings
+from django.core.cache import cache
+from django.utils.encoding import smart_str, iri_to_uri
+from django.utils.http import http_date
+from django.utils.hashcompat import md5_constructor
+
+cc_delim_re = re.compile(r'\s*,\s*')
+
+def patch_cache_control(response, **kwargs):
+    """
+    This function patches the Cache-Control header by adding all
+    keyword arguments to it. The transformation is as follows:
+
+    * All keyword parameter names are turned to lowercase, and underscores
+      are converted to hyphens.
+    * If the value of a parameter is True (exactly True, not just a
+      true value), only the parameter name is added to the header.
+    * All other parameters are added with their value, after applying
+      str() to it.
+    """
+    def dictitem(s):
+        t = s.split('=', 1)
+        if len(t) > 1:
+            return (t[0].lower(), t[1])
+        else:
+            return (t[0].lower(), True)
+
+    def dictvalue(t):
+        if t[1] is True:
+            return t[0]
+        else:
+            return t[0] + '=' + smart_str(t[1])
+
+    if response.has_header('Cache-Control'):
+        cc = cc_delim_re.split(response['Cache-Control'])
+        cc = dict([dictitem(el) for el in cc])
+    else:
+        cc = {}
+
+    # If there's already a max-age header but we're being asked to set a new
+    # max-age, use the minimum of the two ages. In practice this happens when
+    # a decorator and a piece of middleware both operate on a given view.
+    if 'max-age' in cc and 'max_age' in kwargs:
+        kwargs['max_age'] = min(cc['max-age'], kwargs['max_age'])
+
+    for (k, v) in kwargs.items():
+        cc[k.replace('_', '-')] = v
+    cc = ', '.join([dictvalue(el) for el in cc.items()])
+    response['Cache-Control'] = cc
+
+def get_max_age(response):
+    """
+    Returns the max-age from the response Cache-Control header as an integer
+    (or ``None`` if it wasn't found or wasn't an integer.
+    """
+    if not response.has_header('Cache-Control'):
+        return
+    cc = dict([_to_tuple(el) for el in
+        cc_delim_re.split(response['Cache-Control'])])
+    if 'max-age' in cc:
+        try:
+            return int(cc['max-age'])
+        except (ValueError, TypeError):
+            pass
+
+def patch_response_headers(response, cache_timeout=None):
+    """
+    Adds some useful headers to the given HttpResponse object:
+        ETag, Last-Modified, Expires and Cache-Control
+
+    Each header is only added if it isn't already set.
+
+    cache_timeout is in seconds. The CACHE_MIDDLEWARE_SECONDS setting is used
+    by default.
+    """
+    if cache_timeout is None:
+        cache_timeout = settings.CACHE_MIDDLEWARE_SECONDS
+    if cache_timeout < 0:
+        cache_timeout = 0 # Can't have max-age negative
+    if not response.has_header('ETag'):
+        response['ETag'] = '"%s"' % md5_constructor(response.content).hexdigest()
+    if not response.has_header('Last-Modified'):
+        response['Last-Modified'] = http_date()
+    if not response.has_header('Expires'):
+        response['Expires'] = http_date(time.time() + cache_timeout)
+    patch_cache_control(response, max_age=cache_timeout)
+
+def add_never_cache_headers(response):
+    """
+    Adds headers to a response to indicate that a page should never be cached.
+    """
+    patch_response_headers(response, cache_timeout=-1)
+
+def patch_vary_headers(response, newheaders):
+    """
+    Adds (or updates) the "Vary" header in the given HttpResponse object.
+    newheaders is a list of header names that should be in "Vary". Existing
+    headers in "Vary" aren't removed.
+    """
+    # Note that we need to keep the original order intact, because cache
+    # implementations may rely on the order of the Vary contents in, say,
+    # computing an MD5 hash.
+    if response.has_header('Vary'):
+        vary_headers = cc_delim_re.split(response['Vary'])
+    else:
+        vary_headers = []
+    # Use .lower() here so we treat headers as case-insensitive.
+    existing_headers = set([header.lower() for header in vary_headers])
+    additional_headers = [newheader for newheader in newheaders
+                          if newheader.lower() not in existing_headers]
+    response['Vary'] = ', '.join(vary_headers + additional_headers)
+
+def _generate_cache_key(request, headerlist, key_prefix):
+    """Returns a cache key from the headers given in the header list."""
+    ctx = md5_constructor()
+    for header in headerlist:
+        value = request.META.get(header, None)
+        if value is not None:
+            ctx.update(value)
+    return 'views.decorators.cache.cache_page.%s.%s.%s' % (
+               key_prefix, iri_to_uri(request.path), ctx.hexdigest())
+
+def get_cache_key(request, key_prefix=None):
+    """
+    Returns a cache key based on the request path. It can be used in the
+    request phase because it pulls the list of headers to take into account
+    from the global path registry and uses those to build a cache key to check
+    against.
+
+    If there is no headerlist stored, the page needs to be rebuilt, so this
+    function returns None.
+    """
+    if key_prefix is None:
+        key_prefix = settings.CACHE_MIDDLEWARE_KEY_PREFIX
+    cache_key = 'views.decorators.cache.cache_header.%s.%s' % (
+                    key_prefix, iri_to_uri(request.path))
+    headerlist = cache.get(cache_key, None)
+    if headerlist is not None:
+        return _generate_cache_key(request, headerlist, key_prefix)
+    else:
+        return None
+
+def learn_cache_key(request, response, cache_timeout=None, key_prefix=None):
+    """
+    Learns what headers to take into account for some request path from the
+    response object. It stores those headers in a global path registry so that
+    later access to that path will know what headers to take into account
+    without building the response object itself. The headers are named in the
+    Vary header of the response, but we want to prevent response generation.
+
+    The list of headers to use for cache key generation is stored in the same
+    cache as the pages themselves. If the cache ages some data out of the
+    cache, this just means that we have to build the response once to get at
+    the Vary header and so at the list of headers to use for the cache key.
+    """
+    if key_prefix is None:
+        key_prefix = settings.CACHE_MIDDLEWARE_KEY_PREFIX
+    if cache_timeout is None:
+        cache_timeout = settings.CACHE_MIDDLEWARE_SECONDS
+    cache_key = 'views.decorators.cache.cache_header.%s.%s' % (
+                    key_prefix, iri_to_uri(request.path))
+    if response.has_header('Vary'):
+        headerlist = ['HTTP_'+header.upper().replace('-', '_')
+                      for header in cc_delim_re.split(response['Vary'])]
+        cache.set(cache_key, headerlist, cache_timeout)
+        return _generate_cache_key(request, headerlist, key_prefix)
+    else:
+        # if there is no Vary header, we still need a cache key
+        # for the request.path
+        cache.set(cache_key, [], cache_timeout)
+        return _generate_cache_key(request, [], key_prefix)
+
+
+def _to_tuple(s):
+    t = s.split('=',1)
+    if len(t) == 2:
+        return t[0].lower(), t[1]
+    return t[0].lower(), True
diff --git a/webapp/django/utils/checksums.py b/webapp/django/utils/checksums.py
new file mode 100644
index 0000000..970f563
--- /dev/null
+++ b/webapp/django/utils/checksums.py
@@ -0,0 +1,22 @@
+"""
+Common checksum routines (used in multiple localflavor/ cases, for example).
+"""
+
+__all__ = ['luhn',]
+
+LUHN_ODD_LOOKUP = (0, 2, 4, 6, 8, 1, 3, 5, 7, 9) # sum_of_digits(index * 2)
+
+def luhn(candidate):
+    """
+    Checks a candidate number for validity according to the Luhn
+    algorithm (used in validation of, for example, credit cards).
+    Both numeric and string candidates are accepted.
+    """
+    if not isinstance(candidate, basestring):
+        candidate = str(candidate)
+    try:
+        evens = sum([int(c) for c in candidate[-1::-2]])
+        odds = sum([LUHN_ODD_LOOKUP[int(c)] for c in candidate[-2::-2]])
+        return ((evens + odds) % 10 == 0)
+    except ValueError:  # Raised if an int conversion fails
+        return False
diff --git a/webapp/django/utils/daemonize.py b/webapp/django/utils/daemonize.py
new file mode 100644
index 0000000..68e5392
--- /dev/null
+++ b/webapp/django/utils/daemonize.py
@@ -0,0 +1,58 @@
+import os
+import sys
+
+if os.name == 'posix':
+    def become_daemon(our_home_dir='.', out_log='/dev/null',
+                      err_log='/dev/null', umask=022):
+        "Robustly turn into a UNIX daemon, running in our_home_dir."
+        # First fork
+        try:
+            if os.fork() > 0:
+                sys.exit(0)     # kill off parent
+        except OSError, e:
+            sys.stderr.write("fork #1 failed: (%d) %s\n" % (e.errno, e.strerror))
+            sys.exit(1)
+        os.setsid()
+        os.chdir(our_home_dir)
+        os.umask(umask)
+
+        # Second fork
+        try:
+            if os.fork() > 0:
+                os._exit(0)
+        except OSError, e:
+            sys.stderr.write("fork #2 failed: (%d) %s\n" % (e.errno, e.strerror))
+            os._exit(1)
+
+        si = open('/dev/null', 'r')
+        so = open(out_log, 'a+', 0)
+        se = open(err_log, 'a+', 0)
+        os.dup2(si.fileno(), sys.stdin.fileno())
+        os.dup2(so.fileno(), sys.stdout.fileno())
+        os.dup2(se.fileno(), sys.stderr.fileno())
+        # Set custom file descriptors so that they get proper buffering.
+        sys.stdout, sys.stderr = so, se
+else:
+    def become_daemon(our_home_dir='.', out_log=None, err_log=None, umask=022):
+        """
+        If we're not running under a POSIX system, just simulate the daemon
+        mode by doing redirections and directory changing.
+        """
+        os.chdir(our_home_dir)
+        os.umask(umask)
+        sys.stdin.close()
+        sys.stdout.close()
+        sys.stderr.close()
+        if err_log:
+            sys.stderr = open(err_log, 'a', 0)
+        else:
+            sys.stderr = NullDevice()
+        if out_log:
+            sys.stdout = open(out_log, 'a', 0)
+        else:
+            sys.stdout = NullDevice()
+
+    class NullDevice:
+        "A writeable object that writes to nowhere -- like /dev/null."
+        def write(self, s):
+            pass
diff --git a/webapp/django/utils/datastructures.py b/webapp/django/utils/datastructures.py
new file mode 100644
index 0000000..5837c3d
--- /dev/null
+++ b/webapp/django/utils/datastructures.py
@@ -0,0 +1,421 @@
+class MergeDict(object):
+    """
+    A simple class for creating new "virtual" dictionaries that actually look
+    up values in more than one dictionary, passed in the constructor.
+
+    If a key appears in more than one of the given dictionaries, only the
+    first occurrence will be used.
+    """
+    def __init__(self, *dicts):
+        self.dicts = dicts
+
+    def __getitem__(self, key):
+        for dict_ in self.dicts:
+            try:
+                return dict_[key]
+            except KeyError:
+                pass
+        raise KeyError
+
+    def __copy__(self):
+        return self.__class__(*self.dicts)
+
+    def get(self, key, default=None):
+        try:
+            return self[key]
+        except KeyError:
+            return default
+
+    def getlist(self, key):
+        for dict_ in self.dicts:
+            if key in dict_.keys():
+                return dict_.getlist(key)
+        return []
+
+    def items(self):
+        item_list = []
+        for dict_ in self.dicts:
+            item_list.extend(dict_.items())
+        return item_list
+
+    def has_key(self, key):
+        for dict_ in self.dicts:
+            if key in dict_:
+                return True
+        return False
+
+    __contains__ = has_key
+
+    def copy(self):
+        """Returns a copy of this object."""
+        return self.__copy__()
+
+class SortedDict(dict):
+    """
+    A dictionary that keeps its keys in the order in which they're inserted.
+    """
+    def __new__(cls, *args, **kwargs):
+        instance = super(SortedDict, cls).__new__(cls, *args, **kwargs)
+        instance.keyOrder = []
+        return instance
+
+    def __init__(self, data=None):
+        if data is None:
+            data = {}
+        super(SortedDict, self).__init__(data)
+        if isinstance(data, dict):
+            self.keyOrder = data.keys()
+        else:
+            self.keyOrder = []
+            for key, value in data:
+                if key not in self.keyOrder:
+                    self.keyOrder.append(key)
+
+    def __deepcopy__(self, memo):
+        from copy import deepcopy
+        return self.__class__([(key, deepcopy(value, memo))
+                               for key, value in self.iteritems()])
+
+    def __setitem__(self, key, value):
+        super(SortedDict, self).__setitem__(key, value)
+        if key not in self.keyOrder:
+            self.keyOrder.append(key)
+
+    def __delitem__(self, key):
+        super(SortedDict, self).__delitem__(key)
+        self.keyOrder.remove(key)
+
+    def __iter__(self):
+        for k in self.keyOrder:
+            yield k
+
+    def pop(self, k, *args):
+        result = super(SortedDict, self).pop(k, *args)
+        try:
+            self.keyOrder.remove(k)
+        except ValueError:
+            # Key wasn't in the dictionary in the first place. No problem.
+            pass
+        return result
+
+    def popitem(self):
+        result = super(SortedDict, self).popitem()
+        self.keyOrder.remove(result[0])
+        return result
+
+    def items(self):
+        return zip(self.keyOrder, self.values())
+
+    def iteritems(self):
+        for key in self.keyOrder:
+            yield key, super(SortedDict, self).__getitem__(key)
+
+    def keys(self):
+        return self.keyOrder[:]
+
+    def iterkeys(self):
+        return iter(self.keyOrder)
+
+    def values(self):
+        return [super(SortedDict, self).__getitem__(k) for k in self.keyOrder]
+
+    def itervalues(self):
+        for key in self.keyOrder:
+            yield super(SortedDict, self).__getitem__(key)
+
+    def update(self, dict_):
+        for k, v in dict_.items():
+            self.__setitem__(k, v)
+
+    def setdefault(self, key, default):
+        if key not in self.keyOrder:
+            self.keyOrder.append(key)
+        return super(SortedDict, self).setdefault(key, default)
+
+    def value_for_index(self, index):
+        """Returns the value of the item at the given zero-based index."""
+        return self[self.keyOrder[index]]
+
+    def insert(self, index, key, value):
+        """Inserts the key, value pair before the item with the given index."""
+        if key in self.keyOrder:
+            n = self.keyOrder.index(key)
+            del self.keyOrder[n]
+            if n < index:
+                index -= 1
+        self.keyOrder.insert(index, key)
+        super(SortedDict, self).__setitem__(key, value)
+
+    def copy(self):
+        """Returns a copy of this object."""
+        # This way of initializing the copy means it works for subclasses, too.
+        obj = self.__class__(self)
+        obj.keyOrder = self.keyOrder[:]
+        return obj
+
+    def __repr__(self):
+        """
+        Replaces the normal dict.__repr__ with a version that returns the keys
+        in their sorted order.
+        """
+        return '{%s}' % ', '.join(['%r: %r' % (k, v) for k, v in self.items()])
+
+    def clear(self):
+        super(SortedDict, self).clear()
+        self.keyOrder = []
+
+class MultiValueDictKeyError(KeyError):
+    pass
+
+class MultiValueDict(dict):
+    """
+    A subclass of dictionary customized to handle multiple values for the
+    same key.
+
+    >>> d = MultiValueDict({'name': ['Adrian', 'Simon'], 'position': ['Developer']})
+    >>> d['name']
+    'Simon'
+    >>> d.getlist('name')
+    ['Adrian', 'Simon']
+    >>> d.get('lastname', 'nonexistent')
+    'nonexistent'
+    >>> d.setlist('lastname', ['Holovaty', 'Willison'])
+
+    This class exists to solve the irritating problem raised by cgi.parse_qs,
+    which returns a list for every key, even though most Web forms submit
+    single name-value pairs.
+    """
+    def __init__(self, key_to_list_mapping=()):
+        super(MultiValueDict, self).__init__(key_to_list_mapping)
+
+    def __repr__(self):
+        return "<%s: %s>" % (self.__class__.__name__,
+                             super(MultiValueDict, self).__repr__())
+
+    def __getitem__(self, key):
+        """
+        Returns the last data value for this key, or [] if it's an empty list;
+        raises KeyError if not found.
+        """
+        try:
+            list_ = super(MultiValueDict, self).__getitem__(key)
+        except KeyError:
+            raise MultiValueDictKeyError, "Key %r not found in %r" % (key, self)
+        try:
+            return list_[-1]
+        except IndexError:
+            return []
+
+    def __setitem__(self, key, value):
+        super(MultiValueDict, self).__setitem__(key, [value])
+
+    def __copy__(self):
+        return self.__class__(super(MultiValueDict, self).items())
+
+    def __deepcopy__(self, memo=None):
+        import copy
+        if memo is None:
+            memo = {}
+        result = self.__class__()
+        memo[id(self)] = result
+        for key, value in dict.items(self):
+            dict.__setitem__(result, copy.deepcopy(key, memo),
+                             copy.deepcopy(value, memo))
+        return result
+
+    def get(self, key, default=None):
+        """
+        Returns the last data value for the passed key. If key doesn't exist
+        or value is an empty list, then default is returned.
+        """
+        try:
+            val = self[key]
+        except KeyError:
+            return default
+        if val == []:
+            return default
+        return val
+
+    def getlist(self, key):
+        """
+        Returns the list of values for the passed key. If key doesn't exist,
+        then an empty list is returned.
+        """
+        try:
+            return super(MultiValueDict, self).__getitem__(key)
+        except KeyError:
+            return []
+
+    def setlist(self, key, list_):
+        super(MultiValueDict, self).__setitem__(key, list_)
+
+    def setdefault(self, key, default=None):
+        if key not in self:
+            self[key] = default
+        return self[key]
+
+    def setlistdefault(self, key, default_list=()):
+        if key not in self:
+            self.setlist(key, default_list)
+        return self.getlist(key)
+
+    def appendlist(self, key, value):
+        """Appends an item to the internal list associated with key."""
+        self.setlistdefault(key, [])
+        super(MultiValueDict, self).__setitem__(key, self.getlist(key) + [value])
+
+    def items(self):
+        """
+        Returns a list of (key, value) pairs, where value is the last item in
+        the list associated with the key.
+        """
+        return [(key, self[key]) for key in self.keys()]
+
+    def iteritems(self):
+        """
+        Yields (key, value) pairs, where value is the last item in the list
+        associated with the key.
+        """
+        for key in self.keys():
+            yield (key, self[key])
+
+    def lists(self):
+        """Returns a list of (key, list) pairs."""
+        return super(MultiValueDict, self).items()
+
+    def values(self):
+        """Returns a list of the last value on every key list."""
+        return [self[key] for key in self.keys()]
+
+    def copy(self):
+        """Returns a copy of this object."""
+        return self.__deepcopy__()
+
+    def update(self, *args, **kwargs):
+        """
+        update() extends rather than replaces existing key lists.
+        Also accepts keyword args.
+        """
+        if len(args) > 1:
+            raise TypeError, "update expected at most 1 arguments, got %d" % len(args)
+        if args:
+            other_dict = args[0]
+            if isinstance(other_dict, MultiValueDict):
+                for key, value_list in other_dict.lists():
+                    self.setlistdefault(key, []).extend(value_list)
+            else:
+                try:
+                    for key, value in other_dict.items():
+                        self.setlistdefault(key, []).append(value)
+                except TypeError:
+                    raise ValueError, "MultiValueDict.update() takes either a MultiValueDict or dictionary"
+        for key, value in kwargs.iteritems():
+            self.setlistdefault(key, []).append(value)
+
+class DotExpandedDict(dict):
+    """
+    A special dictionary constructor that takes a dictionary in which the keys
+    may contain dots to specify inner dictionaries. It's confusing, but this
+    example should make sense.
+
+    >>> d = DotExpandedDict({'person.1.firstname': ['Simon'], \
+            'person.1.lastname': ['Willison'], \
+            'person.2.firstname': ['Adrian'], \
+            'person.2.lastname': ['Holovaty']})
+    >>> d
+    {'person': {'1': {'lastname': ['Willison'], 'firstname': ['Simon']}, '2': {'lastname': ['Holovaty'], 'firstname': ['Adrian']}}}
+    >>> d['person']
+    {'1': {'lastname': ['Willison'], 'firstname': ['Simon']}, '2': {'lastname': ['Holovaty'], 'firstname': ['Adrian']}}
+    >>> d['person']['1']
+    {'lastname': ['Willison'], 'firstname': ['Simon']}
+
+    # Gotcha: Results are unpredictable if the dots are "uneven":
+    >>> DotExpandedDict({'c.1': 2, 'c.2': 3, 'c': 1})
+    {'c': 1}
+    """
+    def __init__(self, key_to_list_mapping):
+        for k, v in key_to_list_mapping.items():
+            current = self
+            bits = k.split('.')
+            for bit in bits[:-1]:
+                current = current.setdefault(bit, {})
+            # Now assign value to current position
+            try:
+                current[bits[-1]] = v
+            except TypeError: # Special-case if current isn't a dict.
+                current = {bits[-1]: v}
+
+class ImmutableList(tuple):
+    """
+    A tuple-like object that raises useful errors when it is asked to mutate.
+
+    Example::
+
+        >>> a = ImmutableList(range(5), warning="You cannot mutate this.")
+        >>> a[3] = '4'
+        Traceback (most recent call last):
+            ...
+        AttributeError: You cannot mutate this.
+    """
+
+    def __new__(cls, *args, **kwargs):
+        if 'warning' in kwargs:
+            warning = kwargs['warning']
+            del kwargs['warning']
+        else:
+            warning = 'ImmutableList object is immutable.'
+        self = tuple.__new__(cls, *args, **kwargs)
+        self.warning = warning
+        return self
+
+    def complain(self, *wargs, **kwargs):
+        if isinstance(self.warning, Exception):
+            raise self.warning
+        else:
+            raise AttributeError, self.warning
+
+    # All list mutation functions complain.
+    __delitem__  = complain
+    __delslice__ = complain
+    __iadd__     = complain
+    __imul__     = complain
+    __setitem__  = complain
+    __setslice__ = complain
+    append       = complain
+    extend       = complain
+    insert       = complain
+    pop          = complain
+    remove       = complain
+    sort         = complain
+    reverse      = complain
+
+class DictWrapper(dict):
+    """
+    Wraps accesses to a dictionary so that certain values (those starting with
+    the specified prefix) are passed through a function before being returned.
+    The prefix is removed before looking up the real value.
+
+    Used by the SQL construction code to ensure that values are correctly
+    quoted before being used.
+    """
+    def __init__(self, data, func, prefix):
+        super(DictWrapper, self).__init__(data)
+        self.func = func
+        self.prefix = prefix
+
+    def __getitem__(self, key):
+        """
+        Retrieves the real value after stripping the prefix string (if
+        present). If the prefix is present, pass the value through self.func
+        before returning, otherwise return the raw value.
+        """
+        if key.startswith(self.prefix):
+            use_func = True
+            key = key[len(self.prefix):]
+        else:
+            use_func = False
+        value = super(DictWrapper, self).__getitem__(key)
+        if use_func:
+            return self.func(value)
+        return value
+
diff --git a/webapp/django/utils/dateformat.py b/webapp/django/utils/dateformat.py
new file mode 100644
index 0000000..8da9385
--- /dev/null
+++ b/webapp/django/utils/dateformat.py
@@ -0,0 +1,269 @@
+"""
+PHP date() style date formatting
+See http://www.php.net/date for format strings
+
+Usage:
+>>> import datetime
+>>> d = datetime.datetime.now()
+>>> df = DateFormat(d)
+>>> print df.format('jS F Y H:i')
+7th October 2003 11:39
+>>>
+"""
+
+from django.utils.dates import MONTHS, MONTHS_3, MONTHS_AP, WEEKDAYS, WEEKDAYS_ABBR
+from django.utils.tzinfo import LocalTimezone
+from django.utils.translation import ugettext as _
+from django.utils.encoding import force_unicode
+from calendar import isleap, monthrange
+import re, time
+
+re_formatchars = re.compile(r'(?<!\\)([aAbBdDfFgGhHiIjlLmMnNOPrsStTUwWyYzZ])')
+re_escaped = re.compile(r'\\(.)')
+
+class Formatter(object):
+    def format(self, formatstr):
+        pieces = []
+        for i, piece in enumerate(re_formatchars.split(force_unicode(formatstr))):
+            if i % 2:
+                pieces.append(force_unicode(getattr(self, piece)()))
+            elif piece:
+                pieces.append(re_escaped.sub(r'\1', piece))
+        return u''.join(pieces)
+
+class TimeFormat(Formatter):
+    def __init__(self, t):
+        self.data = t
+
+    def a(self):
+        "'a.m.' or 'p.m.'"
+        if self.data.hour > 11:
+            return _('p.m.')
+        return _('a.m.')
+
+    def A(self):
+        "'AM' or 'PM'"
+        if self.data.hour > 11:
+            return _('PM')
+        return _('AM')
+
+    def B(self):
+        "Swatch Internet time"
+        raise NotImplementedError
+
+    def f(self):
+        """
+        Time, in 12-hour hours and minutes, with minutes left off if they're
+        zero.
+        Examples: '1', '1:30', '2:05', '2'
+        Proprietary extension.
+        """
+        if self.data.minute == 0:
+            return self.g()
+        return u'%s:%s' % (self.g(), self.i())
+
+    def g(self):
+        "Hour, 12-hour format without leading zeros; i.e. '1' to '12'"
+        if self.data.hour == 0:
+            return 12
+        if self.data.hour > 12:
+            return self.data.hour - 12
+        return self.data.hour
+
+    def G(self):
+        "Hour, 24-hour format without leading zeros; i.e. '0' to '23'"
+        return self.data.hour
+
+    def h(self):
+        "Hour, 12-hour format; i.e. '01' to '12'"
+        return u'%02d' % self.g()
+
+    def H(self):
+        "Hour, 24-hour format; i.e. '00' to '23'"
+        return u'%02d' % self.G()
+
+    def i(self):
+        "Minutes; i.e. '00' to '59'"
+        return u'%02d' % self.data.minute
+
+    def P(self):
+        """
+        Time, in 12-hour hours, minutes and 'a.m.'/'p.m.', with minutes left off
+        if they're zero and the strings 'midnight' and 'noon' if appropriate.
+        Examples: '1 a.m.', '1:30 p.m.', 'midnight', 'noon', '12:30 p.m.'
+        Proprietary extension.
+        """
+        if self.data.minute == 0 and self.data.hour == 0:
+            return _('midnight')
+        if self.data.minute == 0 and self.data.hour == 12:
+            return _('noon')
+        return u'%s %s' % (self.f(), self.a())
+
+    def s(self):
+        "Seconds; i.e. '00' to '59'"
+        return u'%02d' % self.data.second
+
+class DateFormat(TimeFormat):
+    year_days = [None, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334]
+
+    def __init__(self, dt):
+        # Accepts either a datetime or date object.
+        self.data = dt
+        self.timezone = getattr(dt, 'tzinfo', None)
+        if hasattr(self.data, 'hour') and not self.timezone:
+            self.timezone = LocalTimezone(dt)
+
+    def b(self):
+        "Month, textual, 3 letters, lowercase; e.g. 'jan'"
+        return MONTHS_3[self.data.month]
+
+    def d(self):
+        "Day of the month, 2 digits with leading zeros; i.e. '01' to '31'"
+        return u'%02d' % self.data.day
+
+    def D(self):
+        "Day of the week, textual, 3 letters; e.g. 'Fri'"
+        return WEEKDAYS_ABBR[self.data.weekday()]
+
+    def F(self):
+        "Month, textual, long; e.g. 'January'"
+        return MONTHS[self.data.month]
+
+    def I(self):
+        "'1' if Daylight Savings Time, '0' otherwise."
+        if self.timezone.dst(self.data):
+            return u'1'
+        else:
+            return u'0'
+
+    def j(self):
+        "Day of the month without leading zeros; i.e. '1' to '31'"
+        return self.data.day
+
+    def l(self):
+        "Day of the week, textual, long; e.g. 'Friday'"
+        return WEEKDAYS[self.data.weekday()]
+
+    def L(self):
+        "Boolean for whether it is a leap year; i.e. True or False"
+        return isleap(self.data.year)
+
+    def m(self):
+        "Month; i.e. '01' to '12'"
+        return u'%02d' % self.data.month
+
+    def M(self):
+        "Month, textual, 3 letters; e.g. 'Jan'"
+        return MONTHS_3[self.data.month].title()
+
+    def n(self):
+        "Month without leading zeros; i.e. '1' to '12'"
+        return self.data.month
+
+    def N(self):
+        "Month abbreviation in Associated Press style. Proprietary extension."
+        return MONTHS_AP[self.data.month]
+
+    def O(self):
+        "Difference to Greenwich time in hours; e.g. '+0200'"
+        seconds = self.Z()
+        return u"%+03d%02d" % (seconds // 3600, (seconds // 60) % 60)
+
+    def r(self):
+        "RFC 2822 formatted date; e.g. 'Thu, 21 Dec 2000 16:01:07 +0200'"
+        return self.format('D, j M Y H:i:s O')
+
+    def S(self):
+        "English ordinal suffix for the day of the month, 2 characters; i.e. 'st', 'nd', 'rd' or 'th'"
+        if self.data.day in (11, 12, 13): # Special case
+            return u'th'
+        last = self.data.day % 10
+        if last == 1:
+            return u'st'
+        if last == 2:
+            return u'nd'
+        if last == 3:
+            return u'rd'
+        return u'th'
+
+    def t(self):
+        "Number of days in the given month; i.e. '28' to '31'"
+        return u'%02d' % monthrange(self.data.year, self.data.month)[1]
+
+    def T(self):
+        "Time zone of this machine; e.g. 'EST' or 'MDT'"
+        name = self.timezone.tzname(self.data)
+        if name is None:
+            name = self.format('O')
+        return unicode(name)
+
+    def U(self):
+        "Seconds since the Unix epoch (January 1 1970 00:00:00 GMT)"
+        off = self.timezone.utcoffset(self.data)
+        return int(time.mktime(self.data.timetuple())) + off.seconds * 60
+
+    def w(self):
+        "Day of the week, numeric, i.e. '0' (Sunday) to '6' (Saturday)"
+        return (self.data.weekday() + 1) % 7
+
+    def W(self):
+        "ISO-8601 week number of year, weeks starting on Monday"
+        # Algorithm from http://www.personal.ecu.edu/mccartyr/ISOwdALG.txt
+        week_number = None
+        jan1_weekday = self.data.replace(month=1, day=1).weekday() + 1
+        weekday = self.data.weekday() + 1
+        day_of_year = self.z()
+        if day_of_year <= (8 - jan1_weekday) and jan1_weekday > 4:
+            if jan1_weekday == 5 or (jan1_weekday == 6 and isleap(self.data.year-1)):
+                week_number = 53
+            else:
+                week_number = 52
+        else:
+            if isleap(self.data.year):
+                i = 366
+            else:
+                i = 365
+            if (i - day_of_year) < (4 - weekday):
+                week_number = 1
+            else:
+                j = day_of_year + (7 - weekday) + (jan1_weekday - 1)
+                week_number = j // 7
+                if jan1_weekday > 4:
+                    week_number -= 1
+        return week_number
+
+    def y(self):
+        "Year, 2 digits; e.g. '99'"
+        return unicode(self.data.year)[2:]
+
+    def Y(self):
+        "Year, 4 digits; e.g. '1999'"
+        return self.data.year
+
+    def z(self):
+        "Day of the year; i.e. '0' to '365'"
+        doy = self.year_days[self.data.month] + self.data.day
+        if self.L() and self.data.month > 2:
+            doy += 1
+        return doy
+
+    def Z(self):
+        """
+        Time zone offset in seconds (i.e. '-43200' to '43200'). The offset for
+        timezones west of UTC is always negative, and for those east of UTC is
+        always positive.
+        """
+        offset = self.timezone.utcoffset(self.data)
+        # Only days can be negative, so negative offsets have days=-1 and
+        # seconds positive. Positive offsets have days=0
+        return offset.days * 86400 + offset.seconds
+
+def format(value, format_string):
+    "Convenience function"
+    df = DateFormat(value)
+    return df.format(format_string)
+
+def time_format(value, format_string):
+    "Convenience function"
+    tf = TimeFormat(value)
+    return tf.format(format_string)
diff --git a/webapp/django/utils/dates.py b/webapp/django/utils/dates.py
new file mode 100644
index 0000000..4427af8
--- /dev/null
+++ b/webapp/django/utils/dates.py
@@ -0,0 +1,33 @@
+"Commonly-used date structures"
+
+from django.utils.translation import ugettext_lazy as _
+
+WEEKDAYS = {
+    0:_('Monday'), 1:_('Tuesday'), 2:_('Wednesday'), 3:_('Thursday'), 4:_('Friday'),
+    5:_('Saturday'), 6:_('Sunday')
+}
+WEEKDAYS_ABBR = {
+    0:_('Mon'), 1:_('Tue'), 2:_('Wed'), 3:_('Thu'), 4:_('Fri'),
+    5:_('Sat'), 6:_('Sun')
+}
+WEEKDAYS_REV = {
+    'monday':0, 'tuesday':1, 'wednesday':2, 'thursday':3, 'friday':4,
+    'saturday':5, 'sunday':6
+}
+MONTHS = {
+    1:_('January'), 2:_('February'), 3:_('March'), 4:_('April'), 5:_('May'), 6:_('June'),
+    7:_('July'), 8:_('August'), 9:_('September'), 10:_('October'), 11:_('November'),
+    12:_('December')
+}
+MONTHS_3 = {
+    1:_('jan'), 2:_('feb'), 3:_('mar'), 4:_('apr'), 5:_('may'), 6:_('jun'),
+    7:_('jul'), 8:_('aug'), 9:_('sep'), 10:_('oct'), 11:_('nov'), 12:_('dec')
+}
+MONTHS_3_REV = {
+    'jan':1, 'feb':2, 'mar':3, 'apr':4, 'may':5, 'jun':6, 'jul':7, 'aug':8,
+    'sep':9, 'oct':10, 'nov':11, 'dec':12
+}
+MONTHS_AP = { # month names in Associated Press style
+    1:_('Jan.'), 2:_('Feb.'), 3:_('March'), 4:_('April'), 5:_('May'), 6:_('June'), 7:_('July'),
+    8:_('Aug.'), 9:_('Sept.'), 10:_('Oct.'), 11:_('Nov.'), 12:_('Dec.')
+}
diff --git a/webapp/django/utils/datetime_safe.py b/webapp/django/utils/datetime_safe.py
new file mode 100644
index 0000000..a048ecd
--- /dev/null
+++ b/webapp/django/utils/datetime_safe.py
@@ -0,0 +1,89 @@
+# Python's datetime strftime doesn't handle dates before 1900.
+# These classes override date and datetime to support the formatting of a date
+# through its full "proleptic Gregorian" date range.
+#
+# Based on code submitted to comp.lang.python by Andrew Dalke
+#
+# >>> datetime_safe.date(1850, 8, 2).strftime("%Y/%M/%d was a %A")
+# '1850/08/02 was a Friday'
+
+from datetime import date as real_date, datetime as real_datetime
+import re
+import time
+
+class date(real_date):
+    def strftime(self, fmt):
+        return strftime(self, fmt)
+
+class datetime(real_datetime):
+    def strftime(self, fmt):
+        return strftime(self, fmt)
+
+    def combine(self, date, time):
+        return datetime(date.year, date.month, date.day, time.hour, time.minute, time.microsecond, time.tzinfo)
+
+    def date(self):
+        return date(self.year, self.month, self.day)
+
+def new_date(d):
+    "Generate a safe date from a datetime.date object."
+    return date(d.year, d.month, d.day)
+
+def new_datetime(d):
+    """
+    Generate a safe datetime from a datetime.date or datetime.datetime object.
+    """
+    kw = [d.year, d.month, d.day]
+    if isinstance(d, real_datetime):
+        kw.extend([d.hour, d.minute, d.second, d.microsecond, d.tzinfo])
+    return datetime(*kw)
+
+# This library does not support strftime's "%s" or "%y" format strings.
+# Allowed if there's an even number of "%"s because they are escaped.
+_illegal_formatting = re.compile(r"((^|[^%])(%%)*%[sy])")
+
+def _findall(text, substr):
+    # Also finds overlaps
+    sites = []
+    i = 0
+    while 1:
+        j = text.find(substr, i)
+        if j == -1:
+            break
+        sites.append(j)
+        i=j+1
+    return sites
+
+def strftime(dt, fmt):
+    if dt.year >= 1900:
+        return super(type(dt), dt).strftime(fmt)
+    illegal_formatting = _illegal_formatting.search(fmt)
+    if illegal_formatting:
+        raise TypeError("strftime of dates before 1900 does not handle" + illegal_formatting.group(0))
+
+    year = dt.year
+    # For every non-leap year century, advance by
+    # 6 years to get into the 28-year repeat cycle
+    delta = 2000 - year
+    off = 6 * (delta // 100 + delta // 400)
+    year = year + off
+
+    # Move to around the year 2000
+    year = year + ((2000 - year) // 28) * 28
+    timetuple = dt.timetuple()
+    s1 = time.strftime(fmt, (year,) + timetuple[1:])
+    sites1 = _findall(s1, str(year))
+
+    s2 = time.strftime(fmt, (year+28,) + timetuple[1:])
+    sites2 = _findall(s2, str(year+28))
+
+    sites = []
+    for site in sites1:
+        if site in sites2:
+            sites.append(site)
+
+    s = s1
+    syear = "%4d" % (dt.year,)
+    for site in sites:
+        s = s[:site] + syear + s[site+4:]
+    return s
diff --git a/webapp/django/utils/decorators.py b/webapp/django/utils/decorators.py
new file mode 100644
index 0000000..8fc4c1d
--- /dev/null
+++ b/webapp/django/utils/decorators.py
@@ -0,0 +1,61 @@
+"Functions that help with dynamically creating decorators for views."
+
+import types
+try:
+    from functools import wraps
+except ImportError:
+    from django.utils.functional import wraps  # Python 2.3, 2.4 fallback.
+
+def decorator_from_middleware(middleware_class):
+    """
+    Given a middleware class (not an instance), returns a view decorator. This
+    lets you use middleware functionality on a per-view basis.
+    """
+    def _decorator_from_middleware(*args, **kwargs):
+        # For historical reasons, these "decorators" are also called as
+        # dec(func, *args) instead of dec(*args)(func). We handle both forms
+        # for backwards compatibility.
+        has_func = True
+        try:
+            view_func = kwargs.pop('view_func')
+        except KeyError:
+            if len(args):
+                view_func, args = args[0], args[1:]
+            else:
+                has_func = False
+        if not (has_func and isinstance(view_func, types.FunctionType)):
+            # We are being called as a decorator.
+            if has_func:
+                args = (view_func,) + args
+            middleware = middleware_class(*args, **kwargs)
+
+            def decorator_func(fn):
+                return _decorator_from_middleware(fn, *args, **kwargs)
+            return decorator_func
+
+        middleware = middleware_class(*args, **kwargs)
+
+        def _wrapped_view(request, *args, **kwargs):
+            if hasattr(middleware, 'process_request'):
+                result = middleware.process_request(request)
+                if result is not None:
+                    return result
+            if hasattr(middleware, 'process_view'):
+                result = middleware.process_view(request, view_func, args, kwargs)
+                if result is not None:
+                    return result
+            try:
+                response = view_func(request, *args, **kwargs)
+            except Exception, e:
+                if hasattr(middleware, 'process_exception'):
+                    result = middleware.process_exception(request, e)
+                    if result is not None:
+                        return result
+                raise
+            if hasattr(middleware, 'process_response'):
+                result = middleware.process_response(request, response)
+                if result is not None:
+                    return result
+            return response
+        return wraps(view_func)(_wrapped_view)
+    return _decorator_from_middleware
diff --git a/webapp/django/utils/encoding.py b/webapp/django/utils/encoding.py
new file mode 100644
index 0000000..c54e676
--- /dev/null
+++ b/webapp/django/utils/encoding.py
@@ -0,0 +1,100 @@
+import types
+import urllib
+import datetime
+from django.utils.functional import Promise
+
+class DjangoUnicodeDecodeError(UnicodeDecodeError):
+    def __init__(self, obj, *args):
+        self.obj = obj
+        UnicodeDecodeError.__init__(self, *args)
+
+    def __str__(self):
+        original = UnicodeDecodeError.__str__(self)
+        return '%s. You passed in %r (%s)' % (original, self.obj,
+                type(self.obj))
+
+class StrAndUnicode(object):
+    """
+    A class whose __str__ returns its __unicode__ as a UTF-8 bytestring.
+
+    Useful as a mix-in.
+    """
+    def __str__(self):
+        return self.__unicode__().encode('utf-8')
+
+def smart_unicode(s, encoding='utf-8', strings_only=False, errors='strict'):
+    """
+    Returns a unicode object representing 's'. Treats bytestrings using the
+    'encoding' codec.
+
+    If strings_only is True, don't convert (some) non-string-like objects.
+    """
+    if isinstance(s, Promise):
+        # The input is the result of a gettext_lazy() call.
+        return s
+    return force_unicode(s, encoding, strings_only, errors)
+
+def force_unicode(s, encoding='utf-8', strings_only=False, errors='strict'):
+    """
+    Similar to smart_unicode, except that lazy instances are resolved to
+    strings, rather than kept as lazy objects.
+
+    If strings_only is True, don't convert (some) non-string-like objects.
+    """
+    if strings_only and isinstance(s, (types.NoneType, int, long, datetime.datetime, datetime.date, datetime.time, float)):
+        return s
+    try:
+        if not isinstance(s, basestring,):
+            if hasattr(s, '__unicode__'):
+                s = unicode(s)
+            else:
+                s = unicode(str(s), encoding, errors)
+        elif not isinstance(s, unicode):
+            # Note: We use .decode() here, instead of unicode(s, encoding,
+            # errors), so that if s is a SafeString, it ends up being a
+            # SafeUnicode at the end.
+            s = s.decode(encoding, errors)
+    except UnicodeDecodeError, e:
+        raise DjangoUnicodeDecodeError(s, *e.args)
+    return s
+
+def smart_str(s, encoding='utf-8', strings_only=False, errors='strict'):
+    """
+    Returns a bytestring version of 's', encoded as specified in 'encoding'.
+
+    If strings_only is True, don't convert (some) non-string-like objects.
+    """
+    if strings_only and isinstance(s, (types.NoneType, int)):
+        return s
+    if isinstance(s, Promise):
+        return unicode(s).encode(encoding, errors)
+    elif not isinstance(s, basestring):
+        try:
+            return str(s)
+        except UnicodeEncodeError:
+            return unicode(s).encode(encoding, errors)
+    elif isinstance(s, unicode):
+        return s.encode(encoding, errors)
+    elif s and encoding != 'utf-8':
+        return s.decode('utf-8', errors).encode(encoding, errors)
+    else:
+        return s
+
+def iri_to_uri(iri):
+    """
+    Convert an Internationalized Resource Identifier (IRI) portion to a URI
+    portion that is suitable for inclusion in a URL.
+
+    This is the algorithm from section 3.1 of RFC 3987.  However, since we are
+    assuming input is either UTF-8 or unicode already, we can simplify things a
+    little from the full method.
+
+    Returns an ASCII string containing the encoded result.
+    """
+    # The list of safe characters here is constructed from the printable ASCII
+    # characters that are not explicitly excluded by the list at the end of
+    # section 3.1 of RFC 3987.
+    if iri is None:
+        return iri
+    return urllib.quote(smart_str(iri), safe='/#%[]=:;$&()+,!?*')
+
diff --git a/webapp/django/utils/feedgenerator.py b/webapp/django/utils/feedgenerator.py
new file mode 100644
index 0000000..de924a3
--- /dev/null
+++ b/webapp/django/utils/feedgenerator.py
@@ -0,0 +1,351 @@
+"""
+Syndication feed generation library -- used for generating RSS, etc.
+
+Sample usage:
+
+>>> from django.utils import feedgenerator
+>>> feed = feedgenerator.Rss201rev2Feed(
+...     title=u"Poynter E-Media Tidbits",
+...     link=u"http://www.poynter.org/column.asp?id=31",
+...     description=u"A group weblog by the sharpest minds in online media/journalism/publishing.",
+...     language=u"en",
+... )
+>>> feed.add_item(title="Hello", link=u"http://www.holovaty.com/test/", description="Testing.")
+>>> fp = open('test.rss', 'w')
+>>> feed.write(fp, 'utf-8')
+>>> fp.close()
+
+For definitions of the different versions of RSS, see:
+http://diveintomark.org/archives/2004/02/04/incompatible-rss
+"""
+
+import re
+import datetime
+from django.utils.xmlutils import SimplerXMLGenerator
+from django.utils.encoding import force_unicode, iri_to_uri
+
+def rfc2822_date(date):
+    # We do this ourselves to be timezone aware, email.Utils is not tz aware.
+    if date.tzinfo:
+        time_str = date.strftime('%a, %d %b %Y %H:%M:%S ')
+        offset = date.tzinfo.utcoffset(date)
+        timezone = (offset.days * 24 * 60) + (offset.seconds / 60)
+        hour, minute = divmod(timezone, 60)
+        return time_str + "%+03d%02d" % (hour, minute)
+    else:
+        return date.strftime('%a, %d %b %Y %H:%M:%S -0000')
+
+def rfc3339_date(date):
+    if date.tzinfo:
+        time_str = date.strftime('%Y-%m-%dT%H:%M:%S')
+        offset = date.tzinfo.utcoffset(date)
+        timezone = (offset.days * 24 * 60) + (offset.seconds / 60)
+        hour, minute = divmod(timezone, 60)
+        return time_str + "%+03d:%02d" % (hour, minute)
+    else:
+        return date.strftime('%Y-%m-%dT%H:%M:%SZ')
+
+def get_tag_uri(url, date):
+    "Creates a TagURI. See http://diveintomark.org/archives/2004/05/28/howto-atom-id"
+    tag = re.sub('^http://', '', url)
+    if date is not None:
+        tag = re.sub('/', ',%s:/' % date.strftime('%Y-%m-%d'), tag, 1)
+    tag = re.sub('#', '/', tag)
+    return u'tag:' + tag
+
+class SyndicationFeed(object):
+    "Base class for all syndication feeds. Subclasses should provide write()"
+    def __init__(self, title, link, description, language=None, author_email=None,
+            author_name=None, author_link=None, subtitle=None, categories=None,
+            feed_url=None, feed_copyright=None, feed_guid=None, ttl=None, **kwargs):
+        to_unicode = lambda s: force_unicode(s, strings_only=True)
+        if categories:
+            categories = [force_unicode(c) for c in categories]
+        self.feed = {
+            'title': to_unicode(title),
+            'link': iri_to_uri(link),
+            'description': to_unicode(description),
+            'language': to_unicode(language),
+            'author_email': to_unicode(author_email),
+            'author_name': to_unicode(author_name),
+            'author_link': iri_to_uri(author_link),
+            'subtitle': to_unicode(subtitle),
+            'categories': categories or (),
+            'feed_url': iri_to_uri(feed_url),
+            'feed_copyright': to_unicode(feed_copyright),
+            'id': feed_guid or link,
+            'ttl': ttl,
+        }
+        self.feed.update(kwargs)
+        self.items = []
+
+    def add_item(self, title, link, description, author_email=None,
+        author_name=None, author_link=None, pubdate=None, comments=None,
+        unique_id=None, enclosure=None, categories=(), item_copyright=None,
+        ttl=None, **kwargs):
+        """
+        Adds an item to the feed. All args are expected to be Python Unicode
+        objects except pubdate, which is a datetime.datetime object, and
+        enclosure, which is an instance of the Enclosure class.
+        """
+        to_unicode = lambda s: force_unicode(s, strings_only=True)
+        if categories:
+            categories = [to_unicode(c) for c in categories]
+        item = {
+            'title': to_unicode(title),
+            'link': iri_to_uri(link),
+            'description': to_unicode(description),
+            'author_email': to_unicode(author_email),
+            'author_name': to_unicode(author_name),
+            'author_link': iri_to_uri(author_link),
+            'pubdate': pubdate,
+            'comments': to_unicode(comments),
+            'unique_id': to_unicode(unique_id),
+            'enclosure': enclosure,
+            'categories': categories or (),
+            'item_copyright': to_unicode(item_copyright),
+            'ttl': ttl,
+        }
+        item.update(kwargs)
+        self.items.append(item)
+
+    def num_items(self):
+        return len(self.items)
+
+    def root_attributes(self):
+        """
+        Return extra attributes to place on the root (i.e. feed/channel) element.
+        Called from write().
+        """
+        return {}
+
+    def add_root_elements(self, handler):
+        """
+        Add elements in the the root (i.e. feed/channel) element. Called
+        from write().
+        """
+        pass
+
+    def item_attributes(self, item):
+        """
+        Return extra attributes to place on each item (i.e. item/entry) element.
+        """
+        return {}
+
+    def add_item_elements(self, handler, item):
+        """
+        Add elements on each item (i.e. item/entry) element.
+        """
+        pass
+
+    def write(self, outfile, encoding):
+        """
+        Outputs the feed in the given encoding to outfile, which is a file-like
+        object. Subclasses should override this.
+        """
+        raise NotImplementedError
+
+    def writeString(self, encoding):
+        """
+        Returns the feed in the given encoding as a string.
+        """
+        from StringIO import StringIO
+        s = StringIO()
+        self.write(s, encoding)
+        return s.getvalue()
+
+    def latest_post_date(self):
+        """
+        Returns the latest item's pubdate. If none of them have a pubdate,
+        this returns the current date/time.
+        """
+        updates = [i['pubdate'] for i in self.items if i['pubdate'] is not None]
+        if len(updates) > 0:
+            updates.sort()
+            return updates[-1]
+        else:
+            return datetime.datetime.now()
+
+class Enclosure(object):
+    "Represents an RSS enclosure"
+    def __init__(self, url, length, mime_type):
+        "All args are expected to be Python Unicode objects"
+        self.length, self.mime_type = length, mime_type
+        self.url = iri_to_uri(url)
+
+class RssFeed(SyndicationFeed):
+    mime_type = 'application/rss+xml'
+    def write(self, outfile, encoding):
+        handler = SimplerXMLGenerator(outfile, encoding)
+        handler.startDocument()
+        handler.startElement(u"rss", self.rss_attributes())
+        handler.startElement(u"channel", self.root_attributes())
+        self.add_root_elements(handler)
+        self.write_items(handler)
+        self.endChannelElement(handler)
+        handler.endElement(u"rss")
+
+    def rss_attributes(self):
+        return {u"version": self._version}
+
+    def write_items(self, handler):
+        for item in self.items:
+            handler.startElement(u'item', self.item_attributes(item))
+            self.add_item_elements(handler, item)
+            handler.endElement(u"item")
+
+    def add_root_elements(self, handler):
+        handler.addQuickElement(u"title", self.feed['title'])
+        handler.addQuickElement(u"link", self.feed['link'])
+        handler.addQuickElement(u"description", self.feed['description'])
+        if self.feed['language'] is not None:
+            handler.addQuickElement(u"language", self.feed['language'])
+        for cat in self.feed['categories']:
+            handler.addQuickElement(u"category", cat)
+        if self.feed['feed_copyright'] is not None:
+            handler.addQuickElement(u"copyright", self.feed['feed_copyright'])
+        handler.addQuickElement(u"lastBuildDate", rfc2822_date(self.latest_post_date()).decode('utf-8'))
+        if self.feed['ttl'] is not None:
+            handler.addQuickElement(u"ttl", self.feed['ttl'])
+
+    def endChannelElement(self, handler):
+        handler.endElement(u"channel")
+
+class RssUserland091Feed(RssFeed):
+    _version = u"0.91"
+    def add_item_elements(self, handler, item):
+        handler.addQuickElement(u"title", item['title'])
+        handler.addQuickElement(u"link", item['link'])
+        if item['description'] is not None:
+            handler.addQuickElement(u"description", item['description'])
+
+class Rss201rev2Feed(RssFeed):
+    # Spec: http://blogs.law.harvard.edu/tech/rss
+    _version = u"2.0"
+    def add_item_elements(self, handler, item):
+        handler.addQuickElement(u"title", item['title'])
+        handler.addQuickElement(u"link", item['link'])
+        if item['description'] is not None:
+            handler.addQuickElement(u"description", item['description'])
+
+        # Author information.
+        if item["author_name"] and item["author_email"]:
+            handler.addQuickElement(u"author", "%s (%s)" % \
+                (item['author_email'], item['author_name']))
+        elif item["author_email"]:
+            handler.addQuickElement(u"author", item["author_email"])
+        elif item["author_name"]:
+            handler.addQuickElement(u"dc:creator", item["author_name"], {"xmlns:dc": u"http://purl.org/dc/elements/1.1/"})
+
+        if item['pubdate'] is not None:
+            handler.addQuickElement(u"pubDate", rfc2822_date(item['pubdate']).decode('utf-8'))
+        if item['comments'] is not None:
+            handler.addQuickElement(u"comments", item['comments'])
+        if item['unique_id'] is not None:
+            handler.addQuickElement(u"guid", item['unique_id'])
+        if item['ttl'] is not None:
+            handler.addQuickElement(u"ttl", item['ttl'])
+
+        # Enclosure.
+        if item['enclosure'] is not None:
+            handler.addQuickElement(u"enclosure", '',
+                {u"url": item['enclosure'].url, u"length": item['enclosure'].length,
+                    u"type": item['enclosure'].mime_type})
+
+        # Categories.
+        for cat in item['categories']:
+            handler.addQuickElement(u"category", cat)
+
+class Atom1Feed(SyndicationFeed):
+    # Spec: http://atompub.org/2005/07/11/draft-ietf-atompub-format-10.html
+    mime_type = 'application/atom+xml'
+    ns = u"http://www.w3.org/2005/Atom"
+
+    def write(self, outfile, encoding):
+        handler = SimplerXMLGenerator(outfile, encoding)
+        handler.startDocument()
+        handler.startElement(u'feed', self.root_attributes())
+        self.add_root_elements(handler)
+        self.write_items(handler)
+        handler.endElement(u"feed")
+
+    def root_attributes(self):
+        if self.feed['language'] is not None:
+            return {u"xmlns": self.ns, u"xml:lang": self.feed['language']}
+        else:
+            return {u"xmlns": self.ns}
+
+    def add_root_elements(self, handler):
+        handler.addQuickElement(u"title", self.feed['title'])
+        handler.addQuickElement(u"link", "", {u"rel": u"alternate", u"href": self.feed['link']})
+        if self.feed['feed_url'] is not None:
+            handler.addQuickElement(u"link", "", {u"rel": u"self", u"href": self.feed['feed_url']})
+        handler.addQuickElement(u"id", self.feed['id'])
+        handler.addQuickElement(u"updated", rfc3339_date(self.latest_post_date()).decode('utf-8'))
+        if self.feed['author_name'] is not None:
+            handler.startElement(u"author", {})
+            handler.addQuickElement(u"name", self.feed['author_name'])
+            if self.feed['author_email'] is not None:
+                handler.addQuickElement(u"email", self.feed['author_email'])
+            if self.feed['author_link'] is not None:
+                handler.addQuickElement(u"uri", self.feed['author_link'])
+            handler.endElement(u"author")
+        if self.feed['subtitle'] is not None:
+            handler.addQuickElement(u"subtitle", self.feed['subtitle'])
+        for cat in self.feed['categories']:
+            handler.addQuickElement(u"category", "", {u"term": cat})
+        if self.feed['feed_copyright'] is not None:
+            handler.addQuickElement(u"rights", self.feed['feed_copyright'])
+
+    def write_items(self, handler):
+        for item in self.items:
+            handler.startElement(u"entry", self.item_attributes(item))
+            self.add_item_elements(handler, item)
+            handler.endElement(u"entry")
+
+    def add_item_elements(self, handler, item):
+        handler.addQuickElement(u"title", item['title'])
+        handler.addQuickElement(u"link", u"", {u"href": item['link'], u"rel": u"alternate"})
+        if item['pubdate'] is not None:
+            handler.addQuickElement(u"updated", rfc3339_date(item['pubdate']).decode('utf-8'))
+
+        # Author information.
+        if item['author_name'] is not None:
+            handler.startElement(u"author", {})
+            handler.addQuickElement(u"name", item['author_name'])
+            if item['author_email'] is not None:
+                handler.addQuickElement(u"email", item['author_email'])
+            if item['author_link'] is not None:
+                handler.addQuickElement(u"uri", item['author_link'])
+            handler.endElement(u"author")
+
+        # Unique ID.
+        if item['unique_id'] is not None:
+            unique_id = item['unique_id']
+        else:
+            unique_id = get_tag_uri(item['link'], item['pubdate'])
+        handler.addQuickElement(u"id", unique_id)
+
+        # Summary.
+        if item['description'] is not None:
+            handler.addQuickElement(u"summary", item['description'], {u"type": u"html"})
+
+        # Enclosure.
+        if item['enclosure'] is not None:
+            handler.addQuickElement(u"link", '',
+                {u"rel": u"enclosure",
+                 u"href": item['enclosure'].url,
+                 u"length": item['enclosure'].length,
+                 u"type": item['enclosure'].mime_type})
+
+        # Categories.
+        for cat in item['categories']:
+            handler.addQuickElement(u"category", u"", {u"term": cat})
+
+        # Rights.
+        if item['item_copyright'] is not None:
+            handler.addQuickElement(u"rights", item['item_copyright'])
+
+# This isolates the decision of what the system default is, so calling code can
+# do "feedgenerator.DefaultFeed" instead of "feedgenerator.Rss201rev2Feed".
+DefaultFeed = Rss201rev2Feed
diff --git a/webapp/django/utils/functional.py b/webapp/django/utils/functional.py
new file mode 100644
index 0000000..9a12eda
--- /dev/null
+++ b/webapp/django/utils/functional.py
@@ -0,0 +1,253 @@
+# License for code in this file that was taken from Python 2.5.
+
+# PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
+# --------------------------------------------
+#
+# 1. This LICENSE AGREEMENT is between the Python Software Foundation
+# ("PSF"), and the Individual or Organization ("Licensee") accessing and
+# otherwise using this software ("Python") in source or binary form and
+# its associated documentation.
+#
+# 2. Subject to the terms and conditions of this License Agreement, PSF
+# hereby grants Licensee a nonexclusive, royalty-free, world-wide
+# license to reproduce, analyze, test, perform and/or display publicly,
+# prepare derivative works, distribute, and otherwise use Python
+# alone or in any derivative version, provided, however, that PSF's
+# License Agreement and PSF's notice of copyright, i.e., "Copyright (c)
+# 2001, 2002, 2003, 2004, 2005, 2006, 2007 Python Software Foundation;
+# All Rights Reserved" are retained in Python alone or in any derivative
+# version prepared by Licensee.
+#
+# 3. In the event Licensee prepares a derivative work that is based on
+# or incorporates Python or any part thereof, and wants to make
+# the derivative work available to others as provided herein, then
+# Licensee hereby agrees to include in any such work a brief summary of
+# the changes made to Python.
+#
+# 4. PSF is making Python available to Licensee on an "AS IS"
+# basis.  PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+# IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
+# DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
+# FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
+# INFRINGE ANY THIRD PARTY RIGHTS.
+#
+# 5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
+# FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
+# A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
+# OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+#
+# 6. This License Agreement will automatically terminate upon a material
+# breach of its terms and conditions.
+#
+# 7. Nothing in this License Agreement shall be deemed to create any
+# relationship of agency, partnership, or joint venture between PSF and
+# Licensee.  This License Agreement does not grant permission to use PSF
+# trademarks or trade name in a trademark sense to endorse or promote
+# products or services of Licensee, or any third party.
+#
+# 8. By copying, installing or otherwise using Python, Licensee
+# agrees to be bound by the terms and conditions of this License
+# Agreement.
+
+
+def curry(_curried_func, *args, **kwargs):
+    def _curried(*moreargs, **morekwargs):
+        return _curried_func(*(args+moreargs), **dict(kwargs, **morekwargs))
+    return _curried
+
+### Begin from Python 2.5 functools.py ########################################
+
+# Summary of changes made to the Python 2.5 code below:
+#   * swapped ``partial`` for ``curry`` to maintain backwards-compatibility
+#     in Django.
+#   * Wrapped the ``setattr`` call in ``update_wrapper`` with a try-except
+#     block to make it compatible with Python 2.3, which doesn't allow
+#     assigning to ``__name__``.
+
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007 Python Software Foundation.
+# All Rights Reserved.
+
+###############################################################################
+
+# update_wrapper() and wraps() are tools to help write
+# wrapper functions that can handle naive introspection
+
+WRAPPER_ASSIGNMENTS = ('__module__', '__name__', '__doc__')
+WRAPPER_UPDATES = ('__dict__',)
+def update_wrapper(wrapper,
+                   wrapped,
+                   assigned = WRAPPER_ASSIGNMENTS,
+                   updated = WRAPPER_UPDATES):
+    """Update a wrapper function to look like the wrapped function
+
+       wrapper is the function to be updated
+       wrapped is the original function
+       assigned is a tuple naming the attributes assigned directly
+       from the wrapped function to the wrapper function (defaults to
+       functools.WRAPPER_ASSIGNMENTS)
+       updated is a tuple naming the attributes off the wrapper that
+       are updated with the corresponding attribute from the wrapped
+       function (defaults to functools.WRAPPER_UPDATES)
+    """
+    for attr in assigned:
+        try:
+            setattr(wrapper, attr, getattr(wrapped, attr))
+        except TypeError: # Python 2.3 doesn't allow assigning to __name__.
+            pass
+    for attr in updated:
+        getattr(wrapper, attr).update(getattr(wrapped, attr))
+    # Return the wrapper so this can be used as a decorator via curry()
+    return wrapper
+
+def wraps(wrapped,
+          assigned = WRAPPER_ASSIGNMENTS,
+          updated = WRAPPER_UPDATES):
+    """Decorator factory to apply update_wrapper() to a wrapper function
+
+       Returns a decorator that invokes update_wrapper() with the decorated
+       function as the wrapper argument and the arguments to wraps() as the
+       remaining arguments. Default arguments are as for update_wrapper().
+       This is a convenience function to simplify applying curry() to
+       update_wrapper().
+    """
+    return curry(update_wrapper, wrapped=wrapped,
+                 assigned=assigned, updated=updated)
+
+### End from Python 2.5 functools.py ##########################################
+
+def memoize(func, cache, num_args):
+    """
+    Wrap a function so that results for any argument tuple are stored in
+    'cache'. Note that the args to the function must be usable as dictionary
+    keys.
+
+    Only the first num_args are considered when creating the key.
+    """
+    def wrapper(*args):
+        mem_args = args[:num_args]
+        if mem_args in cache:
+            return cache[mem_args]
+        result = func(*args)
+        cache[mem_args] = result
+        return result
+    return wraps(func)(wrapper)
+
+class Promise(object):
+    """
+    This is just a base class for the proxy class created in
+    the closure of the lazy function. It can be used to recognize
+    promises in code.
+    """
+    pass
+
+def lazy(func, *resultclasses):
+    """
+    Turns any callable into a lazy evaluated callable. You need to give result
+    classes or types -- at least one is needed so that the automatic forcing of
+    the lazy evaluation code is triggered. Results are not memoized; the
+    function is evaluated on every access.
+    """
+    class __proxy__(Promise):
+        """
+        Encapsulate a function call and act as a proxy for methods that are
+        called on the result of that function. The function is not evaluated
+        until one of the methods on the result is called.
+        """
+        __dispatch = None
+
+        def __init__(self, args, kw):
+            self.__func = func
+            self.__args = args
+            self.__kw = kw
+            if self.__dispatch is None:
+                self.__prepare_class__()
+
+        def __prepare_class__(cls):
+            cls.__dispatch = {}
+            for resultclass in resultclasses:
+                cls.__dispatch[resultclass] = {}
+                for (k, v) in resultclass.__dict__.items():
+                    if hasattr(cls, k):
+                        continue
+                    setattr(cls, k, cls.__promise__(resultclass, k, v))
+            cls._delegate_str = str in resultclasses
+            cls._delegate_unicode = unicode in resultclasses
+            assert not (cls._delegate_str and cls._delegate_unicode), "Cannot call lazy() with both str and unicode return types."
+            if cls._delegate_unicode:
+                cls.__unicode__ = cls.__unicode_cast
+            elif cls._delegate_str:
+                cls.__str__ = cls.__str_cast
+        __prepare_class__ = classmethod(__prepare_class__)
+
+        def __promise__(cls, klass, funcname, func):
+            # Builds a wrapper around some magic method and registers that magic
+            # method for the given type and method name.
+            def __wrapper__(self, *args, **kw):
+                # Automatically triggers the evaluation of a lazy value and
+                # applies the given magic method of the result type.
+                res = self.__func(*self.__args, **self.__kw)
+                for t in type(res).mro():
+                    if t in self.__dispatch:
+                        return self.__dispatch[t][funcname](res, *args, **kw)
+                raise TypeError("Lazy object returned unexpected type.")
+
+            if klass not in cls.__dispatch:
+                cls.__dispatch[klass] = {}
+            cls.__dispatch[klass][funcname] = func
+            return __wrapper__
+        __promise__ = classmethod(__promise__)
+
+        def __unicode_cast(self):
+            return self.__func(*self.__args, **self.__kw)
+
+        def __str_cast(self):
+            return str(self.__func(*self.__args, **self.__kw))
+
+        def __cmp__(self, rhs):
+            if self._delegate_str:
+                s = str(self.__func(*self.__args, **self.__kw))
+            elif self._delegate_unicode:
+                s = unicode(self.__func(*self.__args, **self.__kw))
+            else:
+                s = self.__func(*self.__args, **self.__kw)
+            if isinstance(rhs, Promise):
+                return -cmp(rhs, s)
+            else:
+                return cmp(s, rhs)
+
+        def __mod__(self, rhs):
+            if self._delegate_str:
+                return str(self) % rhs
+            elif self._delegate_unicode:
+                return unicode(self) % rhs
+            else:
+                raise AssertionError('__mod__ not supported for non-string types')
+
+        def __deepcopy__(self, memo):
+            # Instances of this class are effectively immutable. It's just a
+            # collection of functions. So we don't need to do anything
+            # complicated for copying.
+            memo[id(self)] = self
+            return self
+
+    def __wrapper__(*args, **kw):
+        # Creates the proxy object, instead of the actual value.
+        return __proxy__(args, kw)
+
+    return wraps(func)(__wrapper__)
+
+def allow_lazy(func, *resultclasses):
+    """
+    A decorator that allows a function to be called with one or more lazy
+    arguments. If none of the args are lazy, the function is evaluated
+    immediately, otherwise a __proxy__ is returned that will evaluate the
+    function when needed.
+    """
+    def wrapper(*args, **kwargs):
+        for arg in list(args) + kwargs.values():
+            if isinstance(arg, Promise):
+                break
+        else:
+            return func(*args, **kwargs)
+        return lazy(func, *resultclasses)(*args, **kwargs)
+    return wraps(func)(wrapper)
diff --git a/webapp/django/utils/hashcompat.py b/webapp/django/utils/hashcompat.py
new file mode 100644
index 0000000..8880d92
--- /dev/null
+++ b/webapp/django/utils/hashcompat.py
@@ -0,0 +1,16 @@
+"""
+The md5 and sha modules are deprecated since Python 2.5, replaced by the
+hashlib module containing both hash algorithms. Here, we provide a common
+interface to the md5 and sha constructors, preferring the hashlib module when
+available.
+"""
+
+try:
+    import hashlib
+    md5_constructor = hashlib.md5
+    sha_constructor = hashlib.sha1
+except ImportError:
+    import md5
+    md5_constructor = md5.new
+    import sha
+    sha_constructor = sha.new
diff --git a/webapp/django/utils/html.py b/webapp/django/utils/html.py
new file mode 100644
index 0000000..9b3fad8
--- /dev/null
+++ b/webapp/django/utils/html.py
@@ -0,0 +1,165 @@
+"""HTML utilities suitable for global use."""
+
+import re
+import string
+
+from django.utils.safestring import SafeData, mark_safe
+from django.utils.encoding import force_unicode
+from django.utils.functional import allow_lazy
+from django.utils.http import urlquote
+
+# Configuration for urlize() function.
+LEADING_PUNCTUATION  = ['(', '<', '&lt;']
+TRAILING_PUNCTUATION = ['.', ',', ')', '>', '\n', '&gt;']
+
+# List of possible strings used for bullets in bulleted lists.
+DOTS = ['&middot;', '*', '\xe2\x80\xa2', '&#149;', '&bull;', '&#8226;']
+
+unencoded_ampersands_re = re.compile(r'&(?!(\w+|#\d+);)')
+word_split_re = re.compile(r'(\s+)')
+punctuation_re = re.compile('^(?P<lead>(?:%s)*)(?P<middle>.*?)(?P<trail>(?:%s)*)$' % \
+    ('|'.join([re.escape(x) for x in LEADING_PUNCTUATION]),
+    '|'.join([re.escape(x) for x in TRAILING_PUNCTUATION])))
+simple_email_re = re.compile(r'^\S+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9._-]+$')
+link_target_attribute_re = re.compile(r'(<a [^>]*?)target=[^\s>]+')
+html_gunk_re = re.compile(r'(?:<br clear="all">|<i><\/i>|<b><\/b>|<em><\/em>|<strong><\/strong>|<\/?smallcaps>|<\/?uppercase>)', re.IGNORECASE)
+hard_coded_bullets_re = re.compile(r'((?:<p>(?:%s).*?[a-zA-Z].*?</p>\s*)+)' % '|'.join([re.escape(x) for x in DOTS]), re.DOTALL)
+trailing_empty_content_re = re.compile(r'(?:<p>(?:&nbsp;|\s|<br \/>)*?</p>\s*)+\Z')
+del x # Temporary variable
+
+def escape(html):
+    """Returns the given HTML with ampersands, quotes and carets encoded."""
+    return mark_safe(force_unicode(html).replace('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;').replace('"', '&quot;').replace("'", '&#39;'))
+escape = allow_lazy(escape, unicode)
+
+def conditional_escape(html):
+    """
+    Similar to escape(), except that it doesn't operate on pre-escaped strings.
+    """
+    if isinstance(html, SafeData):
+        return html
+    else:
+        return escape(html)
+
+def linebreaks(value, autoescape=False):
+    """Converts newlines into <p> and <br />s."""
+    value = re.sub(r'\r\n|\r|\n', '\n', force_unicode(value)) # normalize newlines
+    paras = re.split('\n{2,}', value)
+    if autoescape:
+        paras = [u'<p>%s</p>' % escape(p.strip()).replace('\n', '<br />') for p in paras]
+    else:
+        paras = [u'<p>%s</p>' % p.strip().replace('\n', '<br />') for p in paras]
+    return u'\n\n'.join(paras)
+linebreaks = allow_lazy(linebreaks, unicode)
+
+def strip_tags(value):
+    """Returns the given HTML with all tags stripped."""
+    return re.sub(r'<[^>]*?>', '', force_unicode(value))
+strip_tags = allow_lazy(strip_tags)
+
+def strip_spaces_between_tags(value):
+    """Returns the given HTML with spaces between tags removed."""
+    return re.sub(r'>\s+<', '><', force_unicode(value))
+strip_spaces_between_tags = allow_lazy(strip_spaces_between_tags, unicode)
+
+def strip_entities(value):
+    """Returns the given HTML with all entities (&something;) stripped."""
+    return re.sub(r'&(?:\w+|#\d+);', '', force_unicode(value))
+strip_entities = allow_lazy(strip_entities, unicode)
+
+def fix_ampersands(value):
+    """Returns the given HTML with all unencoded ampersands encoded correctly."""
+    return unencoded_ampersands_re.sub('&amp;', force_unicode(value))
+fix_ampersands = allow_lazy(fix_ampersands, unicode)
+
+def urlize(text, trim_url_limit=None, nofollow=False, autoescape=False):
+    """
+    Converts any URLs in text into clickable links.
+
+    Works on http://, https://, www. links and links ending in .org, .net or
+    .com. Links can have trailing punctuation (periods, commas, close-parens)
+    and leading punctuation (opening parens) and it'll still do the right
+    thing.
+
+    If trim_url_limit is not None, the URLs in link text longer than this limit
+    will truncated to trim_url_limit-3 characters and appended with an elipsis.
+
+    If nofollow is True, the URLs in link text will get a rel="nofollow"
+    attribute.
+
+    If autoescape is True, the link text and URLs will get autoescaped.
+    """
+    trim_url = lambda x, limit=trim_url_limit: limit is not None and (len(x) > limit and ('%s...' % x[:max(0, limit - 3)])) or x
+    safe_input = isinstance(text, SafeData)
+    words = word_split_re.split(force_unicode(text))
+    nofollow_attr = nofollow and ' rel="nofollow"' or ''
+    for i, word in enumerate(words):
+        match = None
+        if '.' in word or '@' in word or ':' in word:
+            match = punctuation_re.match(word)
+        if match:
+            lead, middle, trail = match.groups()
+            # Make URL we want to point to.
+            url = None
+            if middle.startswith('http://') or middle.startswith('https://'):
+                url = urlquote(middle, safe='/&=:;#?+*')
+            elif middle.startswith('www.') or ('@' not in middle and \
+                    middle and middle[0] in string.ascii_letters + string.digits and \
+                    (middle.endswith('.org') or middle.endswith('.net') or middle.endswith('.com'))):
+                url = urlquote('http://%s' % middle, safe='/&=:;#?+*')
+            elif '@' in middle and not ':' in middle and simple_email_re.match(middle):
+                url = 'mailto:%s' % middle
+                nofollow_attr = ''
+            # Make link.
+            if url:
+                trimmed = trim_url(middle)
+                if autoescape and not safe_input:
+                    lead, trail = escape(lead), escape(trail)
+                    url, trimmed = escape(url), escape(trimmed)
+                middle = '<a href="%s"%s>%s</a>' % (url, nofollow_attr, trimmed)
+                words[i] = mark_safe('%s%s%s' % (lead, middle, trail))
+            else:
+                if safe_input:
+                    words[i] = mark_safe(word)
+                elif autoescape:
+                    words[i] = escape(word)
+        elif safe_input:
+            words[i] = mark_safe(word)
+        elif autoescape:
+            words[i] = escape(word)
+    return u''.join(words)
+urlize = allow_lazy(urlize, unicode)
+
+def clean_html(text):
+    """
+    Clean the given HTML.  Specifically, do the following:
+        * Convert <b> and <i> to <strong> and <em>.
+        * Encode all ampersands correctly.
+        * Remove all "target" attributes from <a> tags.
+        * Remove extraneous HTML, such as presentational tags that open and
+          immediately close and <br clear="all">.
+        * Convert hard-coded bullets into HTML unordered lists.
+        * Remove stuff like "<p>&nbsp;&nbsp;</p>", but only if it's at the
+          bottom of the text.
+    """
+    from django.utils.text import normalize_newlines
+    text = normalize_newlines(force_unicode(text))
+    text = re.sub(r'<(/?)\s*b\s*>', '<\\1strong>', text)
+    text = re.sub(r'<(/?)\s*i\s*>', '<\\1em>', text)
+    text = fix_ampersands(text)
+    # Remove all target="" attributes from <a> tags.
+    text = link_target_attribute_re.sub('\\1', text)
+    # Trim stupid HTML such as <br clear="all">.
+    text = html_gunk_re.sub('', text)
+    # Convert hard-coded bullets into HTML unordered lists.
+    def replace_p_tags(match):
+        s = match.group().replace('</p>', '</li>')
+        for d in DOTS:
+            s = s.replace('<p>%s' % d, '<li>')
+        return u'<ul>\n%s\n</ul>' % s
+    text = hard_coded_bullets_re.sub(replace_p_tags, text)
+    # Remove stuff like "<p>&nbsp;&nbsp;</p>", but only if it's at the bottom
+    # of the text.
+    text = trailing_empty_content_re.sub('', text)
+    return text
+clean_html = allow_lazy(clean_html, unicode)
diff --git a/webapp/django/utils/http.py b/webapp/django/utils/http.py
new file mode 100644
index 0000000..7d2af95
--- /dev/null
+++ b/webapp/django/utils/http.py
@@ -0,0 +1,96 @@
+import urllib
+from email.Utils import formatdate
+
+from django.utils.encoding import smart_str, force_unicode
+from django.utils.functional import allow_lazy
+
+def urlquote(url, safe='/'):
+    """
+    A version of Python's urllib.quote() function that can operate on unicode
+    strings. The url is first UTF-8 encoded before quoting. The returned string
+    can safely be used as part of an argument to a subsequent iri_to_uri() call
+    without double-quoting occurring.
+    """
+    return force_unicode(urllib.quote(smart_str(url), safe))
+
+urlquote = allow_lazy(urlquote, unicode)
+
+def urlquote_plus(url, safe=''):
+    """
+    A version of Python's urllib.quote_plus() function that can operate on
+    unicode strings. The url is first UTF-8 encoded before quoting. The
+    returned string can safely be used as part of an argument to a subsequent
+    iri_to_uri() call without double-quoting occurring.
+    """
+    return force_unicode(urllib.quote_plus(smart_str(url), safe))
+urlquote_plus = allow_lazy(urlquote_plus, unicode)
+
+def urlencode(query, doseq=0):
+    """
+    A version of Python's urllib.urlencode() function that can operate on
+    unicode strings. The parameters are first case to UTF-8 encoded strings and
+    then encoded as per normal.
+    """
+    if hasattr(query, 'items'):
+        query = query.items()
+    return urllib.urlencode(
+        [(smart_str(k),
+         isinstance(v, (list,tuple)) and [smart_str(i) for i in v] or smart_str(v))
+            for k, v in query],
+        doseq)
+
+def cookie_date(epoch_seconds=None):
+    """
+    Formats the time to ensure compatibility with Netscape's cookie standard.
+
+    Accepts a floating point number expressed in seconds since the epoch, in
+    UTC - such as that outputted by time.time(). If set to None, defaults to
+    the current time.
+
+    Outputs a string in the format 'Wdy, DD-Mon-YYYY HH:MM:SS GMT'.
+    """
+    rfcdate = formatdate(epoch_seconds)
+    return '%s-%s-%s GMT' % (rfcdate[:7], rfcdate[8:11], rfcdate[12:25])
+
+def http_date(epoch_seconds=None):
+    """
+    Formats the time to match the RFC1123 date format as specified by HTTP
+    RFC2616 section 3.3.1.
+
+    Accepts a floating point number expressed in seconds since the epoch, in
+    UTC - such as that outputted by time.time(). If set to None, defaults to
+    the current time.
+
+    Outputs a string in the format 'Wdy, DD Mon YYYY HH:MM:SS GMT'.
+    """
+    rfcdate = formatdate(epoch_seconds)
+    return '%s GMT' % rfcdate[:25]
+
+# Base 36 functions: useful for generating compact URLs
+
+def base36_to_int(s):
+    """
+    Convertd a base 36 string to an integer
+    """
+    return int(s, 36)
+
+def int_to_base36(i):
+    """
+    Converts an integer to a base36 string
+    """
+    digits = "0123456789abcdefghijklmnopqrstuvwxyz"
+    factor = 0
+    # Find starting factor
+    while True:
+        factor += 1
+        if i < 36 ** factor:
+            factor -= 1
+            break
+    base36 = []
+    # Construct base36 representation
+    while factor >= 0:
+        j = 36 ** factor
+        base36.append(digits[i / j])
+        i = i % j
+        factor -= 1
+    return ''.join(base36)
diff --git a/webapp/django/utils/itercompat.py b/webapp/django/utils/itercompat.py
new file mode 100644
index 0000000..c166da3
--- /dev/null
+++ b/webapp/django/utils/itercompat.py
@@ -0,0 +1,74 @@
+"""
+Providing iterator functions that are not in all version of Python we support.
+Where possible, we try to use the system-native version and only fall back to
+these implementations if necessary.
+"""
+
+import itertools
+
+def compat_tee(iterable):
+    """
+    Return two independent iterators from a single iterable.
+
+    Based on http://www.python.org/doc/2.3.5/lib/itertools-example.html
+    """
+    # Note: Using a dictionary and a list as the default arguments here is
+    # deliberate and safe in this instance.
+    def gen(next, data={}, cnt=[0]):
+        dpop = data.pop
+        for i in itertools.count():
+            if i == cnt[0]:
+                item = data[i] = next()
+                cnt[0] += 1
+            else:
+                item = dpop(i)
+            yield item
+    next = iter(iterable).next
+    return gen(next), gen(next)
+
+def groupby(iterable, keyfunc=None):
+    """
+    Taken from http://docs.python.org/lib/itertools-functions.html
+    """
+    if keyfunc is None:
+        keyfunc = lambda x:x
+    iterable = iter(iterable)
+    l = [iterable.next()]
+    lastkey = keyfunc(l[0])
+    for item in iterable:
+        key = keyfunc(item)
+        if key != lastkey:
+            yield lastkey, l
+            lastkey = key
+            l = [item]
+        else:
+            l.append(item)
+    yield lastkey, l
+
+# Not really in itertools, since it's a builtin in Python 2.4 and later, but it
+# does operate as an iterator.
+def reversed(data):
+    for index in xrange(len(data)-1, -1, -1):
+        yield data[index]
+
+if hasattr(itertools, 'tee'):
+    tee = itertools.tee
+else:
+    tee = compat_tee
+if hasattr(itertools, 'groupby'):
+    groupby = itertools.groupby
+
+def is_iterable(x):
+    "A implementation independent way of checking for iterables"
+    try:
+        iter(x)
+    except TypeError:
+        return False
+    else:
+        return True
+
+def sorted(in_value):
+    "A naive implementation of sorted"
+    out_value = in_value[:]
+    out_value.sort()
+    return out_value
diff --git a/webapp/django/utils/safestring.py b/webapp/django/utils/safestring.py
new file mode 100644
index 0000000..2e31c23
--- /dev/null
+++ b/webapp/django/utils/safestring.py
@@ -0,0 +1,119 @@
+"""
+Functions for working with "safe strings": strings that can be displayed safely
+without further escaping in HTML. Marking something as a "safe string" means
+that the producer of the string has already turned characters that should not
+be interpreted by the HTML engine (e.g. '<') into the appropriate entities.
+"""
+from django.utils.functional import curry, Promise
+
+class EscapeData(object):
+    pass
+
+class EscapeString(str, EscapeData):
+    """
+    A string that should be HTML-escaped when output.
+    """
+    pass
+
+class EscapeUnicode(unicode, EscapeData):
+    """
+    A unicode object that should be HTML-escaped when output.
+    """
+    pass
+
+class SafeData(object):
+    pass
+
+class SafeString(str, SafeData):
+    """
+    A string subclass that has been specifically marked as "safe" (requires no
+    further escaping) for HTML output purposes.
+    """
+    def __add__(self, rhs):
+        """
+        Concatenating a safe string with another safe string or safe unicode
+        object is safe. Otherwise, the result is no longer safe.
+        """
+        t = super(SafeString, self).__add__(rhs)
+        if isinstance(rhs, SafeUnicode):
+            return SafeUnicode(t)
+        elif isinstance(rhs, SafeString):
+            return SafeString(t)
+        return t
+        
+    def _proxy_method(self, *args, **kwargs):
+        """
+        Wrap a call to a normal unicode method up so that we return safe
+        results. The method that is being wrapped is passed in the 'method'
+        argument.
+        """
+        method = kwargs.pop('method')
+        data = method(self, *args, **kwargs)
+        if isinstance(data, str):
+            return SafeString(data)
+        else:
+            return SafeUnicode(data)
+
+    decode = curry(_proxy_method, method = str.decode)
+
+class SafeUnicode(unicode, SafeData):
+    """
+    A unicode subclass that has been specifically marked as "safe" for HTML
+    output purposes.
+    """
+    def __add__(self, rhs):
+        """
+        Concatenating a safe unicode object with another safe string or safe
+        unicode object is safe. Otherwise, the result is no longer safe.
+        """
+        t = super(SafeUnicode, self).__add__(rhs)
+        if isinstance(rhs, SafeData):
+            return SafeUnicode(t)
+        return t
+    
+    def _proxy_method(self, *args, **kwargs):
+        """
+        Wrap a call to a normal unicode method up so that we return safe
+        results. The method that is being wrapped is passed in the 'method'
+        argument.
+        """
+        method = kwargs.pop('method')
+        data = method(self, *args, **kwargs)
+        if isinstance(data, str):
+            return SafeString(data)
+        else:
+            return SafeUnicode(data)
+
+    encode = curry(_proxy_method, method = unicode.encode)
+
+def mark_safe(s):
+    """
+    Explicitly mark a string as safe for (HTML) output purposes. The returned
+    object can be used everywhere a string or unicode object is appropriate.
+
+    Can be called multiple times on a single string.
+    """
+    if isinstance(s, SafeData):
+        return s
+    if isinstance(s, str) or (isinstance(s, Promise) and s._delegate_str):
+        return SafeString(s)
+    if isinstance(s, (unicode, Promise)):
+        return SafeUnicode(s)
+    return SafeString(str(s))
+
+def mark_for_escaping(s):
+    """
+    Explicitly mark a string as requiring HTML escaping upon output. Has no
+    effect on SafeData subclasses.
+
+    Can be called multiple times on a single string (the resulting escaping is
+    only applied once).
+    """
+    if isinstance(s, (SafeData, EscapeData)):
+        return s
+    if isinstance(s, str) or (isinstance(s, Promise) and s._delegate_str):
+        return EscapeString(s)
+    if isinstance(s, (unicode, Promise)):
+        return EscapeUnicode(s)
+    return EscapeString(str(s))
+
diff --git a/webapp/django/utils/simplejson/LICENSE.txt b/webapp/django/utils/simplejson/LICENSE.txt
new file mode 100644
index 0000000..ad95f29
--- /dev/null
+++ b/webapp/django/utils/simplejson/LICENSE.txt
@@ -0,0 +1,19 @@
+Copyright (c) 2006 Bob Ippolito
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/webapp/django/utils/simplejson/__init__.py b/webapp/django/utils/simplejson/__init__.py
new file mode 100644
index 0000000..130940f
--- /dev/null
+++ b/webapp/django/utils/simplejson/__init__.py
@@ -0,0 +1,376 @@
+r"""
+A simple, fast, extensible JSON encoder and decoder
+
+JSON (JavaScript Object Notation) <http://json.org> is a subset of
+JavaScript syntax (ECMA-262 3rd edition) used as a lightweight data
+interchange format.
+
+simplejson exposes an API familiar to uses of the standard library
+marshal and pickle modules.
+
+Encoding basic Python object hierarchies::
+    
+    >>> import simplejson
+    >>> simplejson.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
+    '["foo", {"bar": ["baz", null, 1.0, 2]}]'
+    >>> print simplejson.dumps("\"foo\bar")
+    "\"foo\bar"
+    >>> print simplejson.dumps(u'\u1234')
+    "\u1234"
+    >>> print simplejson.dumps('\\')
+    "\\"
+    >>> print simplejson.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True)
+    {"a": 0, "b": 0, "c": 0}
+    >>> from StringIO import StringIO
+    >>> io = StringIO()
+    >>> simplejson.dump(['streaming API'], io)
+    >>> io.getvalue()
+    '["streaming API"]'
+
+Compact encoding::
+
+    >>> import simplejson
+    >>> simplejson.dumps([1,2,3,{'4': 5, '6': 7}], separators=(',',':'))
+    '[1,2,3,{"4":5,"6":7}]'
+
+Pretty printing::
+
+    >>> import simplejson
+    >>> print simplejson.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4)
+    {
+        "4": 5, 
+        "6": 7
+    }
+
+Decoding JSON::
+    
+    >>> import simplejson
+    >>> simplejson.loads('["foo", {"bar":["baz", null, 1.0, 2]}]')
+    [u'foo', {u'bar': [u'baz', None, 1.0, 2]}]
+    >>> simplejson.loads('"\\"foo\\bar"')
+    u'"foo\x08ar'
+    >>> from StringIO import StringIO
+    >>> io = StringIO('["streaming API"]')
+    >>> simplejson.load(io)
+    [u'streaming API']
+
+Specializing JSON object decoding::
+
+    >>> import simplejson
+    >>> def as_complex(dct):
+    ...     if '__complex__' in dct:
+    ...         return complex(dct['real'], dct['imag'])
+    ...     return dct
+    ... 
+    >>> simplejson.loads('{"__complex__": true, "real": 1, "imag": 2}',
+    ...     object_hook=as_complex)
+    (1+2j)
+    >>> import decimal
+    >>> simplejson.loads('1.1', parse_float=decimal.Decimal)
+    Decimal("1.1")
+
+Extending JSONEncoder::
+    
+    >>> import simplejson
+    >>> class ComplexEncoder(simplejson.JSONEncoder):
+    ...     def default(self, obj):
+    ...         if isinstance(obj, complex):
+    ...             return [obj.real, obj.imag]
+    ...         return simplejson.JSONEncoder.default(self, obj)
+    ... 
+    >>> dumps(2 + 1j, cls=ComplexEncoder)
+    '[2.0, 1.0]'
+    >>> ComplexEncoder().encode(2 + 1j)
+    '[2.0, 1.0]'
+    >>> list(ComplexEncoder().iterencode(2 + 1j))
+    ['[', '2.0', ', ', '1.0', ']']
+    
+
+Using simplejson from the shell to validate and
+pretty-print::
+    
+    $ echo '{"json":"obj"}' | python -msimplejson.tool
+    {
+        "json": "obj"
+    }
+    $ echo '{ 1.2:3.4}' | python -msimplejson.tool
+    Expecting property name: line 1 column 2 (char 2)
+
+Note that the JSON produced by this module's default settings
+is a subset of YAML, so it may be used as a serializer for that as well.
+"""
+__version__ = '1.9.2'
+__all__ = [
+    'dump', 'dumps', 'load', 'loads',
+    'JSONDecoder', 'JSONEncoder',
+]
+
+if __name__ == '__main__':
+    import warnings
+    warnings.warn('python -msimplejson is deprecated, use python -msiplejson.tool', DeprecationWarning)
+    from django.utils.simplejson.decoder import JSONDecoder
+    from django.utils.simplejson.encoder import JSONEncoder
+else:
+    from decoder import JSONDecoder
+    from encoder import JSONEncoder
+
+_default_encoder = JSONEncoder(
+    skipkeys=False,
+    ensure_ascii=True,
+    check_circular=True,
+    allow_nan=True,
+    indent=None,
+    separators=None,
+    encoding='utf-8',
+    default=None,
+)
+
+def dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True,
+        allow_nan=True, cls=None, indent=None, separators=None,
+        encoding='utf-8', default=None, **kw):
+    """
+    Serialize ``obj`` as a JSON formatted stream to ``fp`` (a
+    ``.write()``-supporting file-like object).
+
+    If ``skipkeys`` is ``True`` then ``dict`` keys that are not basic types
+    (``str``, ``unicode``, ``int``, ``long``, ``float``, ``bool``, ``None``) 
+    will be skipped instead of raising a ``TypeError``.
+
+    If ``ensure_ascii`` is ``False``, then the some chunks written to ``fp``
+    may be ``unicode`` instances, subject to normal Python ``str`` to
+    ``unicode`` coercion rules. Unless ``fp.write()`` explicitly
+    understands ``unicode`` (as in ``codecs.getwriter()``) this is likely
+    to cause an error.
+
+    If ``check_circular`` is ``False``, then the circular reference check
+    for container types will be skipped and a circular reference will
+    result in an ``OverflowError`` (or worse).
+
+    If ``allow_nan`` is ``False``, then it will be a ``ValueError`` to
+    serialize out of range ``float`` values (``nan``, ``inf``, ``-inf``)
+    in strict compliance of the JSON specification, instead of using the
+    JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``).
+
+    If ``indent`` is a non-negative integer, then JSON array elements and object
+    members will be pretty-printed with that indent level. An indent level
+    of 0 will only insert newlines. ``None`` is the most compact representation.
+
+    If ``separators`` is an ``(item_separator, dict_separator)`` tuple
+    then it will be used instead of the default ``(', ', ': ')`` separators.
+    ``(',', ':')`` is the most compact JSON representation.
+
+    ``encoding`` is the character encoding for str instances, default is UTF-8.
+
+    ``default(obj)`` is a function that should return a serializable version
+    of obj or raise TypeError. The default simply raises TypeError.
+
+    To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the
+    ``.default()`` method to serialize additional types), specify it with
+    the ``cls`` kwarg.
+    """
+    # cached encoder
+    if (skipkeys is False and ensure_ascii is True and
+        check_circular is True and allow_nan is True and
+        cls is None and indent is None and separators is None and
+        encoding == 'utf-8' and default is None and not kw):
+        iterable = _default_encoder.iterencode(obj)
+    else:
+        if cls is None:
+            cls = JSONEncoder
+        iterable = cls(skipkeys=skipkeys, ensure_ascii=ensure_ascii,
+            check_circular=check_circular, allow_nan=allow_nan, indent=indent,
+            separators=separators, encoding=encoding,
+            default=default, **kw).iterencode(obj)
+    # could accelerate with writelines in some versions of Python, at
+    # a debuggability cost
+    for chunk in iterable:
+        fp.write(chunk)
+
+
+def dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True,
+        allow_nan=True, cls=None, indent=None, separators=None,
+        encoding='utf-8', default=None, **kw):
+    """
+    Serialize ``obj`` to a JSON formatted ``str``.
+
+    If ``skipkeys`` is ``True`` then ``dict`` keys that are not basic types
+    (``str``, ``unicode``, ``int``, ``long``, ``float``, ``bool``, ``None``) 
+    will be skipped instead of raising a ``TypeError``.
+
+    If ``ensure_ascii`` is ``False``, then the return value will be a
+    ``unicode`` instance subject to normal Python ``str`` to ``unicode``
+    coercion rules instead of being escaped to an ASCII ``str``.
+
+    If ``check_circular`` is ``False``, then the circular reference check
+    for container types will be skipped and a circular reference will
+    result in an ``OverflowError`` (or worse).
+
+    If ``allow_nan`` is ``False``, then it will be a ``ValueError`` to
+    serialize out of range ``float`` values (``nan``, ``inf``, ``-inf``) in
+    strict compliance of the JSON specification, instead of using the
+    JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``).
+
+    If ``indent`` is a non-negative integer, then JSON array elements and
+    object members will be pretty-printed with that indent level. An indent
+    level of 0 will only insert newlines. ``None`` is the most compact
+    representation.
+
+    If ``separators`` is an ``(item_separator, dict_separator)`` tuple
+    then it will be used instead of the default ``(', ', ': ')`` separators.
+    ``(',', ':')`` is the most compact JSON representation.
+
+    ``encoding`` is the character encoding for str instances, default is UTF-8.
+
+    ``default(obj)`` is a function that should return a serializable version
+    of obj or raise TypeError. The default simply raises TypeError.
+
+    To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the
+    ``.default()`` method to serialize additional types), specify it with
+    the ``cls`` kwarg.
+    """
+    # cached encoder
+    if (skipkeys is False and ensure_ascii is True and
+        check_circular is True and allow_nan is True and
+        cls is None and indent is None and separators is None and
+        encoding == 'utf-8' and default is None and not kw):
+        return _default_encoder.encode(obj)
+    if cls is None:
+        cls = JSONEncoder
+    return cls(
+        skipkeys=skipkeys, ensure_ascii=ensure_ascii,
+        check_circular=check_circular, allow_nan=allow_nan, indent=indent,
+        separators=separators, encoding=encoding, default=default,
+        **kw).encode(obj)
+
+
+_default_decoder = JSONDecoder(encoding=None, object_hook=None)
+
+
+def load(fp, encoding=None, cls=None, object_hook=None, parse_float=None,
+        parse_int=None, parse_constant=None, **kw):
+    """
+    Deserialize ``fp`` (a ``.read()``-supporting file-like object containing
+    a JSON document) to a Python object.
+
+    If the contents of ``fp`` is encoded with an ASCII based encoding other
+    than utf-8 (e.g. latin-1), then an appropriate ``encoding`` name must
+    be specified. Encodings that are not ASCII based (such as UCS-2) are
+    not allowed, and should be wrapped with
+    ``codecs.getreader(fp)(encoding)``, or simply decoded to a ``unicode``
+    object and passed to ``loads()``
+
+    ``object_hook`` is an optional function that will be called with the
+    result of any object literal decode (a ``dict``). The return value of
+    ``object_hook`` will be used instead of the ``dict``. This feature
+    can be used to implement custom decoders (e.g. JSON-RPC class hinting).
+    
+    To use a custom ``JSONDecoder`` subclass, specify it with the ``cls``
+    kwarg.
+    """
+    return loads(fp.read(),
+        encoding=encoding, cls=cls, object_hook=object_hook,
+        parse_float=parse_float, parse_int=parse_int,
+        parse_constant=parse_constant, **kw)
+
+
+def loads(s, encoding=None, cls=None, object_hook=None, parse_float=None,
+        parse_int=None, parse_constant=None, **kw):
+    """
+    Deserialize ``s`` (a ``str`` or ``unicode`` instance containing a JSON
+    document) to a Python object.
+
+    If ``s`` is a ``str`` instance and is encoded with an ASCII based encoding
+    other than utf-8 (e.g. latin-1) then an appropriate ``encoding`` name
+    must be specified. Encodings that are not ASCII based (such as UCS-2)
+    are not allowed and should be decoded to ``unicode`` first.
+
+    ``object_hook`` is an optional function that will be called with the
+    result of any object literal decode (a ``dict``). The return value of
+    ``object_hook`` will be used instead of the ``dict``. This feature
+    can be used to implement custom decoders (e.g. JSON-RPC class hinting).
+
+    ``parse_float``, if specified, will be called with the string
+    of every JSON float to be decoded. By default this is equivalent to
+    float(num_str). This can be used to use another datatype or parser
+    for JSON floats (e.g. decimal.Decimal).
+
+    ``parse_int``, if specified, will be called with the string
+    of every JSON int to be decoded. By default this is equivalent to
+    int(num_str). This can be used to use another datatype or parser
+    for JSON integers (e.g. float).
+
+    ``parse_constant``, if specified, will be called with one of the
+    following strings: -Infinity, Infinity, NaN, null, true, false.
+    This can be used to raise an exception if invalid JSON numbers
+    are encountered.
+
+    To use a custom ``JSONDecoder`` subclass, specify it with the ``cls``
+    kwarg.
+    """
+    if (cls is None and encoding is None and object_hook is None and
+            parse_int is None and parse_float is None and
+            parse_constant is None and not kw):
+        return _default_decoder.decode(s)
+    if cls is None:
+        cls = JSONDecoder
+    if object_hook is not None:
+        kw['object_hook'] = object_hook
+    if parse_float is not None:
+        kw['parse_float'] = parse_float
+    if parse_int is not None:
+        kw['parse_int'] = parse_int
+    if parse_constant is not None:
+        kw['parse_constant'] = parse_constant
+    return cls(encoding=encoding, **kw).decode(s)
+
+
+#
+# Compatibility cruft from other libraries
+#
+
+
+def decode(s):
+    """
+    demjson, python-cjson API compatibility hook. Use loads(s) instead.
+    """
+    import warnings
+    warnings.warn("simplejson.loads(s) should be used instead of decode(s)",
+        DeprecationWarning)
+    return loads(s)
+
+
+def encode(obj):
+    """
+    demjson, python-cjson compatibility hook. Use dumps(s) instead.
+    """
+    import warnings
+    warnings.warn("simplejson.dumps(s) should be used instead of encode(s)",
+        DeprecationWarning)
+    return dumps(obj)
+
+
+def read(s):
+    """
+    jsonlib, JsonUtils, python-json, json-py API compatibility hook.
+    Use loads(s) instead.
+    """
+    import warnings
+    warnings.warn("simplejson.loads(s) should be used instead of read(s)",
+        DeprecationWarning)
+    return loads(s)
+
+
+def write(obj):
+    """
+    jsonlib, JsonUtils, python-json, json-py API compatibility hook.
+    Use dumps(s) instead.
+    """
+    import warnings
+    warnings.warn("simplejson.dumps(s) should be used instead of write(s)",
+        DeprecationWarning)
+    return dumps(obj)
+
+
+if __name__ == '__main__':
+    import simplejson.tool
+    simplejson.tool.main()
diff --git a/webapp/django/utils/simplejson/decoder.py b/webapp/django/utils/simplejson/decoder.py
new file mode 100644
index 0000000..cef9fc0
--- /dev/null
+++ b/webapp/django/utils/simplejson/decoder.py
@@ -0,0 +1,343 @@
+"""
+Implementation of JSONDecoder
+"""
+import re
+import sys
+
+from django.utils.simplejson.scanner import Scanner, pattern
+try:
+    from django.utils.simplejson._speedups import scanstring as c_scanstring
+except ImportError:
+    pass
+
+FLAGS = re.VERBOSE | re.MULTILINE | re.DOTALL
+
+def _floatconstants():
+    import struct
+    import sys
+    _BYTES = '7FF80000000000007FF0000000000000'.decode('hex')
+    if sys.byteorder != 'big':
+        _BYTES = _BYTES[:8][::-1] + _BYTES[8:][::-1]
+    nan, inf = struct.unpack('dd', _BYTES)
+    return nan, inf, -inf
+
+NaN, PosInf, NegInf = _floatconstants()
+
+
+def linecol(doc, pos):
+    lineno = doc.count('\n', 0, pos) + 1
+    if lineno == 1:
+        colno = pos
+    else:
+        colno = pos - doc.rindex('\n', 0, pos)
+    return lineno, colno
+
+
+def errmsg(msg, doc, pos, end=None):
+    lineno, colno = linecol(doc, pos)
+    if end is None:
+        return '%s: line %d column %d (char %d)' % (msg, lineno, colno, pos)
+    endlineno, endcolno = linecol(doc, end)
+    return '%s: line %d column %d - line %d column %d (char %d - %d)' % (
+        msg, lineno, colno, endlineno, endcolno, pos, end)
+
+
+_CONSTANTS = {
+    '-Infinity': NegInf,
+    'Infinity': PosInf,
+    'NaN': NaN,
+    'true': True,
+    'false': False,
+    'null': None,
+}
+
+def JSONConstant(match, context, c=_CONSTANTS):
+    s = match.group(0)
+    fn = getattr(context, 'parse_constant', None)
+    if fn is None:
+        rval = c[s]
+    else:
+        rval = fn(s)
+    return rval, None
+pattern('(-?Infinity|NaN|true|false|null)')(JSONConstant)
+
+
+def JSONNumber(match, context):
+    match = JSONNumber.regex.match(match.string, *match.span())
+    integer, frac, exp = match.groups()
+    if frac or exp:
+        fn = getattr(context, 'parse_float', None) or float
+        res = fn(integer + (frac or '') + (exp or ''))
+    else:
+        fn = getattr(context, 'parse_int', None) or int
+        res = fn(integer)
+    return res, None
+pattern(r'(-?(?:0|[1-9]\d*))(\.\d+)?([eE][-+]?\d+)?')(JSONNumber)
+
+
+STRINGCHUNK = re.compile(r'(.*?)(["\\\x00-\x1f])', FLAGS)
+BACKSLASH = {
+    '"': u'"', '\\': u'\\', '/': u'/',
+    'b': u'\b', 'f': u'\f', 'n': u'\n', 'r': u'\r', 't': u'\t',
+}
+
+DEFAULT_ENCODING = "utf-8"
+
+def py_scanstring(s, end, encoding=None, strict=True, _b=BACKSLASH, _m=STRINGCHUNK.match):
+    if encoding is None:
+        encoding = DEFAULT_ENCODING
+    chunks = []
+    _append = chunks.append
+    begin = end - 1
+    while 1:
+        chunk = _m(s, end)
+        if chunk is None:
+            raise ValueError(
+                errmsg("Unterminated string starting at", s, begin))
+        end = chunk.end()
+        content, terminator = chunk.groups()
+        if content:
+            if not isinstance(content, unicode):
+                content = unicode(content, encoding)
+            _append(content)
+        if terminator == '"':
+            break
+        elif terminator != '\\':
+            if strict:
+                raise ValueError(errmsg("Invalid control character %r at", s, end))
+            else:
+                _append(terminator)
+                continue
+        try:
+            esc = s[end]
+        except IndexError:
+            raise ValueError(
+                errmsg("Unterminated string starting at", s, begin))
+        if esc != 'u':
+            try:
+                m = _b[esc]
+            except KeyError:
+                raise ValueError(
+                    errmsg("Invalid \\escape: %r" % (esc,), s, end))
+            end += 1
+        else:
+            esc = s[end + 1:end + 5]
+            next_end = end + 5
+            msg = "Invalid \\uXXXX escape"
+            try:
+                if len(esc) != 4:
+                    raise ValueError
+                uni = int(esc, 16)
+                if 0xd800 <= uni <= 0xdbff and sys.maxunicode > 65535:
+                    msg = "Invalid \\uXXXX\\uXXXX surrogate pair"
+                    if not s[end + 5:end + 7] == '\\u':
+                        raise ValueError
+                    esc2 = s[end + 7:end + 11]
+                    if len(esc2) != 4:
+                        raise ValueError
+                    uni2 = int(esc2, 16)
+                    uni = 0x10000 + (((uni - 0xd800) << 10) | (uni2 - 0xdc00))
+                    next_end += 6
+                m = unichr(uni)
+            except ValueError:
+                raise ValueError(errmsg(msg, s, end))
+            end = next_end
+        _append(m)
+    return u''.join(chunks), end
+
+
+# Use speedup
+try:
+    scanstring = c_scanstring
+except NameError:
+    scanstring = py_scanstring
+
+def JSONString(match, context):
+    encoding = getattr(context, 'encoding', None)
+    strict = getattr(context, 'strict', True)
+    return scanstring(match.string, match.end(), encoding, strict)
+pattern(r'"')(JSONString)
+
+
+WHITESPACE = re.compile(r'\s*', FLAGS)
+
+def JSONObject(match, context, _w=WHITESPACE.match):
+    pairs = {}
+    s = match.string
+    end = _w(s, match.end()).end()
+    nextchar = s[end:end + 1]
+    # Trivial empty object
+    if nextchar == '}':
+        return pairs, end + 1
+    if nextchar != '"':
+        raise ValueError(errmsg("Expecting property name", s, end))
+    end += 1
+    encoding = getattr(context, 'encoding', None)
+    strict = getattr(context, 'strict', True)
+    iterscan = JSONScanner.iterscan
+    while True:
+        key, end = scanstring(s, end, encoding, strict)
+        end = _w(s, end).end()
+        if s[end:end + 1] != ':':
+            raise ValueError(errmsg("Expecting : delimiter", s, end))
+        end = _w(s, end + 1).end()
+        try:
+            value, end = iterscan(s, idx=end, context=context).next()
+        except StopIteration:
+            raise ValueError(errmsg("Expecting object", s, end))
+        pairs[key] = value
+        end = _w(s, end).end()
+        nextchar = s[end:end + 1]
+        end += 1
+        if nextchar == '}':
+            break
+        if nextchar != ',':
+            raise ValueError(errmsg("Expecting , delimiter", s, end - 1))
+        end = _w(s, end).end()
+        nextchar = s[end:end + 1]
+        end += 1
+        if nextchar != '"':
+            raise ValueError(errmsg("Expecting property name", s, end - 1))
+    object_hook = getattr(context, 'object_hook', None)
+    if object_hook is not None:
+        pairs = object_hook(pairs)
+    return pairs, end
+pattern(r'{')(JSONObject)
+
+
+def JSONArray(match, context, _w=WHITESPACE.match):
+    values = []
+    s = match.string
+    end = _w(s, match.end()).end()
+    # Look-ahead for trivial empty array
+    nextchar = s[end:end + 1]
+    if nextchar == ']':
+        return values, end + 1
+    iterscan = JSONScanner.iterscan
+    while True:
+        try:
+            value, end = iterscan(s, idx=end, context=context).next()
+        except StopIteration:
+            raise ValueError(errmsg("Expecting object", s, end))
+        values.append(value)
+        end = _w(s, end).end()
+        nextchar = s[end:end + 1]
+        end += 1
+        if nextchar == ']':
+            break
+        if nextchar != ',':
+            raise ValueError(errmsg("Expecting , delimiter", s, end))
+        end = _w(s, end).end()
+    return values, end
+pattern(r'\[')(JSONArray)
+
+
+ANYTHING = [
+    JSONObject,
+    JSONArray,
+    JSONString,
+    JSONConstant,
+    JSONNumber,
+]
+
+JSONScanner = Scanner(ANYTHING)
+
+
+class JSONDecoder(object):
+    """
+    Simple JSON <http://json.org> decoder
+
+    Performs the following translations in decoding by default:
+    
+    +---------------+-------------------+
+    | JSON          | Python            |
+    +===============+===================+
+    | object        | dict              |
+    +---------------+-------------------+
+    | array         | list              |
+    +---------------+-------------------+
+    | string        | unicode           |
+    +---------------+-------------------+
+    | number (int)  | int, long         |
+    +---------------+-------------------+
+    | number (real) | float             |
+    +---------------+-------------------+
+    | true          | True              |
+    +---------------+-------------------+
+    | false         | False             |
+    +---------------+-------------------+
+    | null          | None              |
+    +---------------+-------------------+
+
+    It also understands ``NaN``, ``Infinity``, and ``-Infinity`` as
+    their corresponding ``float`` values, which is outside the JSON spec.
+    """
+
+    _scanner = Scanner(ANYTHING)
+    __all__ = ['__init__', 'decode', 'raw_decode']
+
+    def __init__(self, encoding=None, object_hook=None, parse_float=None,
+            parse_int=None, parse_constant=None, strict=True):
+        """
+        ``encoding`` determines the encoding used to interpret any ``str``
+        objects decoded by this instance (utf-8 by default).  It has no
+        effect when decoding ``unicode`` objects.
+        
+        Note that currently only encodings that are a superset of ASCII work,
+        strings of other encodings should be passed in as ``unicode``.
+
+        ``object_hook``, if specified, will be called with the result
+        of every JSON object decoded and its return value will be used in
+        place of the given ``dict``.  This can be used to provide custom
+        deserializations (e.g. to support JSON-RPC class hinting).
+
+        ``parse_float``, if specified, will be called with the string
+        of every JSON float to be decoded. By default this is equivalent to
+        float(num_str). This can be used to use another datatype or parser
+        for JSON floats (e.g. decimal.Decimal).
+
+        ``parse_int``, if specified, will be called with the string
+        of every JSON int to be decoded. By default this is equivalent to
+        int(num_str). This can be used to use another datatype or parser
+        for JSON integers (e.g. float).
+
+        ``parse_constant``, if specified, will be called with one of the
+        following strings: -Infinity, Infinity, NaN, null, true, false.
+        This can be used to raise an exception if invalid JSON numbers
+        are encountered.
+        """
+        self.encoding = encoding
+        self.object_hook = object_hook
+        self.parse_float = parse_float
+        self.parse_int = parse_int
+        self.parse_constant = parse_constant
+        self.strict = strict
+
+    def decode(self, s, _w=WHITESPACE.match):
+        """
+        Return the Python representation of ``s`` (a ``str`` or ``unicode``
+        instance containing a JSON document)
+        """
+        obj, end = self.raw_decode(s, idx=_w(s, 0).end())
+        end = _w(s, end).end()
+        if end != len(s):
+            raise ValueError(errmsg("Extra data", s, end, len(s)))
+        return obj
+
+    def raw_decode(self, s, **kw):
+        """
+        Decode a JSON document from ``s`` (a ``str`` or ``unicode`` beginning
+        with a JSON document) and return a 2-tuple of the Python
+        representation and the index in ``s`` where the document ended.
+
+        This can be used to decode a JSON document from a string that may
+        have extraneous data at the end.
+        """
+        kw.setdefault('context', self)
+        try:
+            obj, end = self._scanner.iterscan(s, **kw).next()
+        except StopIteration:
+            raise ValueError("No JSON object could be decoded")
+        return obj, end
+
+__all__ = ['JSONDecoder']
diff --git a/webapp/django/utils/simplejson/encoder.py b/webapp/django/utils/simplejson/encoder.py
new file mode 100644
index 0000000..e6c01f6
--- /dev/null
+++ b/webapp/django/utils/simplejson/encoder.py
@@ -0,0 +1,385 @@
+"""
+Implementation of JSONEncoder
+"""
+import re
+
+try:
+    from django.utils.simplejson._speedups import encode_basestring_ascii as c_encode_basestring_ascii
+except ImportError:
+    pass
+
+ESCAPE = re.compile(r'[\x00-\x1f\\"\b\f\n\r\t]')
+ESCAPE_ASCII = re.compile(r'([\\"]|[^\ -~])')
+HAS_UTF8 = re.compile(r'[\x80-\xff]')
+ESCAPE_DCT = {
+    '\\': '\\\\',
+    '"': '\\"',
+    '\b': '\\b',
+    '\f': '\\f',
+    '\n': '\\n',
+    '\r': '\\r',
+    '\t': '\\t',
+}
+for i in range(0x20):
+    ESCAPE_DCT.setdefault(chr(i), '\\u%04x' % (i,))
+
+# Assume this produces an infinity on all machines (probably not guaranteed)
+INFINITY = float('1e66666')
+FLOAT_REPR = repr
+
+def floatstr(o, allow_nan=True):
+    # Check for specials.  Note that this type of test is processor- and/or
+    # platform-specific, so do tests which don't depend on the internals.
+
+    if o != o:
+        text = 'NaN'
+    elif o == INFINITY:
+        text = 'Infinity'
+    elif o == -INFINITY:
+        text = '-Infinity'
+    else:
+        return FLOAT_REPR(o)
+
+    if not allow_nan:
+        raise ValueError("Out of range float values are not JSON compliant: %r"
+            % (o,))
+
+    return text
+
+
+def encode_basestring(s):
+    """
+    Return a JSON representation of a Python string
+    """
+    def replace(match):
+        return ESCAPE_DCT[match.group(0)]
+    return '"' + ESCAPE.sub(replace, s) + '"'
+
+
+def py_encode_basestring_ascii(s):
+    if isinstance(s, str) and HAS_UTF8.search(s) is not None:
+        s = s.decode('utf-8')
+    def replace(match):
+        s = match.group(0)
+        try:
+            return ESCAPE_DCT[s]
+        except KeyError:
+            n = ord(s)
+            if n < 0x10000:
+                return '\\u%04x' % (n,)
+            else:
+                # surrogate pair
+                n -= 0x10000
+                s1 = 0xd800 | ((n >> 10) & 0x3ff)
+                s2 = 0xdc00 | (n & 0x3ff)
+                return '\\u%04x\\u%04x' % (s1, s2)
+    return '"' + str(ESCAPE_ASCII.sub(replace, s)) + '"'
+
+
+try:
+    encode_basestring_ascii = c_encode_basestring_ascii
+except NameError:
+    encode_basestring_ascii = py_encode_basestring_ascii
+
+
+class JSONEncoder(object):
+    """
+    Extensible JSON <http://json.org> encoder for Python data structures.
+
+    Supports the following objects and types by default:
+    
+    +-------------------+---------------+
+    | Python            | JSON          |
+    +===================+===============+
+    | dict              | object        |
+    +-------------------+---------------+
+    | list, tuple       | array         |
+    +-------------------+---------------+
+    | str, unicode      | string        |
+    +-------------------+---------------+
+    | int, long, float  | number        |
+    +-------------------+---------------+
+    | True              | true          |
+    +-------------------+---------------+
+    | False             | false         |
+    +-------------------+---------------+
+    | None              | null          |
+    +-------------------+---------------+
+
+    To extend this to recognize other objects, subclass and implement a
+    ``.default()`` method with another method that returns a serializable
+    object for ``o`` if possible, otherwise it should call the superclass
+    implementation (to raise ``TypeError``).
+    """
+    __all__ = ['__init__', 'default', 'encode', 'iterencode']
+    item_separator = ', '
+    key_separator = ': '
+    def __init__(self, skipkeys=False, ensure_ascii=True,
+            check_circular=True, allow_nan=True, sort_keys=False,
+            indent=None, separators=None, encoding='utf-8', default=None):
+        """
+        Constructor for JSONEncoder, with sensible defaults.
+
+        If skipkeys is False, then it is a TypeError to attempt
+        encoding of keys that are not str, int, long, float or None.  If
+        skipkeys is True, such items are simply skipped.
+
+        If ensure_ascii is True, the output is guaranteed to be str
+        objects with all incoming unicode characters escaped.  If
+        ensure_ascii is false, the output will be unicode object.
+
+        If check_circular is True, then lists, dicts, and custom encoded
+        objects will be checked for circular references during encoding to
+        prevent an infinite recursion (which would cause an OverflowError).
+        Otherwise, no such check takes place.
+
+        If allow_nan is True, then NaN, Infinity, and -Infinity will be
+        encoded as such.  This behavior is not JSON specification compliant,
+        but is consistent with most JavaScript based encoders and decoders.
+        Otherwise, it will be a ValueError to encode such floats.
+
+        If sort_keys is True, then the output of dictionaries will be
+        sorted by key; this is useful for regression tests to ensure
+        that JSON serializations can be compared on a day-to-day basis.
+
+        If indent is a non-negative integer, then JSON array
+        elements and object members will be pretty-printed with that
+        indent level.  An indent level of 0 will only insert newlines.
+        None is the most compact representation.
+
+        If specified, separators should be a (item_separator, key_separator)
+        tuple.  The default is (', ', ': ').  To get the most compact JSON
+        representation you should specify (',', ':') to eliminate whitespace.
+
+        If specified, default is a function that gets called for objects
+        that can't otherwise be serialized.  It should return a JSON encodable
+        version of the object or raise a ``TypeError``.
+
+        If encoding is not None, then all input strings will be
+        transformed into unicode using that encoding prior to JSON-encoding.
+        The default is UTF-8.
+        """
+
+        self.skipkeys = skipkeys
+        self.ensure_ascii = ensure_ascii
+        self.check_circular = check_circular
+        self.allow_nan = allow_nan
+        self.sort_keys = sort_keys
+        self.indent = indent
+        self.current_indent_level = 0
+        if separators is not None:
+            self.item_separator, self.key_separator = separators
+        if default is not None:
+            self.default = default
+        self.encoding = encoding
+
+    def _newline_indent(self):
+        return '\n' + (' ' * (self.indent * self.current_indent_level))
+
+    def _iterencode_list(self, lst, markers=None):
+        if not lst:
+            yield '[]'
+            return
+        if markers is not None:
+            markerid = id(lst)
+            if markerid in markers:
+                raise ValueError("Circular reference detected")
+            markers[markerid] = lst
+        yield '['
+        if self.indent is not None:
+            self.current_indent_level += 1
+            newline_indent = self._newline_indent()
+            separator = self.item_separator + newline_indent
+            yield newline_indent
+        else:
+            newline_indent = None
+            separator = self.item_separator
+        first = True
+        for value in lst:
+            if first:
+                first = False
+            else:
+                yield separator
+            for chunk in self._iterencode(value, markers):
+                yield chunk
+        if newline_indent is not None:
+            self.current_indent_level -= 1
+            yield self._newline_indent()
+        yield ']'
+        if markers is not None:
+            del markers[markerid]
+
+    def _iterencode_dict(self, dct, markers=None):
+        if not dct:
+            yield '{}'
+            return
+        if markers is not None:
+            markerid = id(dct)
+            if markerid in markers:
+                raise ValueError("Circular reference detected")
+            markers[markerid] = dct
+        yield '{'
+        key_separator = self.key_separator
+        if self.indent is not None:
+            self.current_indent_level += 1
+            newline_indent = self._newline_indent()
+            item_separator = self.item_separator + newline_indent
+            yield newline_indent
+        else:
+            newline_indent = None
+            item_separator = self.item_separator
+        first = True
+        if self.ensure_ascii:
+            encoder = encode_basestring_ascii
+        else:
+            encoder = encode_basestring
+        allow_nan = self.allow_nan
+        if self.sort_keys:
+            keys = dct.keys()
+            keys.sort()
+            items = [(k, dct[k]) for k in keys]
+        else:
+            items = dct.iteritems()
+        _encoding = self.encoding
+        _do_decode = (_encoding is not None
+            and not (_encoding == 'utf-8'))
+        for key, value in items:
+            if isinstance(key, str):
+                if _do_decode:
+                    key = key.decode(_encoding)
+            elif isinstance(key, basestring):
+                pass
+            # JavaScript is weakly typed for these, so it makes sense to
+            # also allow them.  Many encoders seem to do something like this.
+            elif isinstance(key, float):
+                key = floatstr(key, allow_nan)
+            elif isinstance(key, (int, long)):
+                key = str(key)
+            elif key is True:
+                key = 'true'
+            elif key is False:
+                key = 'false'
+            elif key is None:
+                key = 'null'
+            elif self.skipkeys:
+                continue
+            else:
+                raise TypeError("key %r is not a string" % (key,))
+            if first:
+                first = False
+            else:
+                yield item_separator
+            yield encoder(key)
+            yield key_separator
+            for chunk in self._iterencode(value, markers):
+                yield chunk
+        if newline_indent is not None:
+            self.current_indent_level -= 1
+            yield self._newline_indent()
+        yield '}'
+        if markers is not None:
+            del markers[markerid]
+
+    def _iterencode(self, o, markers=None):
+        if isinstance(o, basestring):
+            if self.ensure_ascii:
+                encoder = encode_basestring_ascii
+            else:
+                encoder = encode_basestring
+            _encoding = self.encoding
+            if (_encoding is not None and isinstance(o, str)
+                    and not (_encoding == 'utf-8')):
+                o = o.decode(_encoding)
+            yield encoder(o)
+        elif o is None:
+            yield 'null'
+        elif o is True:
+            yield 'true'
+        elif o is False:
+            yield 'false'
+        elif isinstance(o, (int, long)):
+            yield str(o)
+        elif isinstance(o, float):
+            yield floatstr(o, self.allow_nan)
+        elif isinstance(o, (list, tuple)):
+            for chunk in self._iterencode_list(o, markers):
+                yield chunk
+        elif isinstance(o, dict):
+            for chunk in self._iterencode_dict(o, markers):
+                yield chunk
+        else:
+            if markers is not None:
+                markerid = id(o)
+                if markerid in markers:
+                    raise ValueError("Circular reference detected")
+                markers[markerid] = o
+            for chunk in self._iterencode_default(o, markers):
+                yield chunk
+            if markers is not None:
+                del markers[markerid]
+
+    def _iterencode_default(self, o, markers=None):
+        newobj = self.default(o)
+        return self._iterencode(newobj, markers)
+
+    def default(self, o):
+        """
+        Implement this method in a subclass such that it returns
+        a serializable object for ``o``, or calls the base implementation
+        (to raise a ``TypeError``).
+
+        For example, to support arbitrary iterators, you could
+        implement default like this::
+            
+            def default(self, o):
+                try:
+                    iterable = iter(o)
+                except TypeError:
+                    pass
+                else:
+                    return list(iterable)
+                return JSONEncoder.default(self, o)
+        """
+        raise TypeError("%r is not JSON serializable" % (o,))
+
+    def encode(self, o):
+        """
+        Return a JSON string representation of a Python data structure.
+
+        >>> JSONEncoder().encode({"foo": ["bar", "baz"]})
+        '{"foo": ["bar", "baz"]}'
+        """
+        # This is for extremely simple cases and benchmarks.
+        if isinstance(o, basestring):
+            if isinstance(o, str):
+                _encoding = self.encoding
+                if (_encoding is not None 
+                        and not (_encoding == 'utf-8')):
+                    o = o.decode(_encoding)
+            if self.ensure_ascii:
+                return encode_basestring_ascii(o)
+            else:
+                return encode_basestring(o)
+        # This doesn't pass the iterator directly to ''.join() because the
+        # exceptions aren't as detailed.  The list call should be roughly
+        # equivalent to the PySequence_Fast that ''.join() would do.
+        chunks = list(self.iterencode(o))
+        return ''.join(chunks)
+
+    def iterencode(self, o):
+        """
+        Encode the given object and yield each string
+        representation as available.
+        
+        For example::
+            
+            for chunk in JSONEncoder().iterencode(bigobject):
+                mysocket.write(chunk)
+        """
+        if self.check_circular:
+            markers = {}
+        else:
+            markers = None
+        return self._iterencode(o, markers)
+
+__all__ = ['JSONEncoder']
diff --git a/webapp/django/utils/simplejson/scanner.py b/webapp/django/utils/simplejson/scanner.py
new file mode 100644
index 0000000..2a18390
--- /dev/null
+++ b/webapp/django/utils/simplejson/scanner.py
@@ -0,0 +1,67 @@
+"""
+Iterator based sre token scanner
+"""
+import re
+from re import VERBOSE, MULTILINE, DOTALL
+import sre_parse
+import sre_compile
+import sre_constants
+from sre_constants import BRANCH, SUBPATTERN
+
+__all__ = ['Scanner', 'pattern']
+
+FLAGS = (VERBOSE | MULTILINE | DOTALL)
+
+class Scanner(object):
+    def __init__(self, lexicon, flags=FLAGS):
+        self.actions = [None]
+        # Combine phrases into a compound pattern
+        s = sre_parse.Pattern()
+        s.flags = flags
+        p = []
+        for idx, token in enumerate(lexicon):
+            phrase = token.pattern
+            try:
+                subpattern = sre_parse.SubPattern(s,
+                    [(SUBPATTERN, (idx + 1, sre_parse.parse(phrase, flags)))])
+            except sre_constants.error:
+                raise
+            p.append(subpattern)
+            self.actions.append(token)
+
+        s.groups = len(p) + 1 # NOTE(guido): Added to make SRE validation work
+        p = sre_parse.SubPattern(s, [(BRANCH, (None, p))])
+        self.scanner = sre_compile.compile(p)
+
+    def iterscan(self, string, idx=0, context=None):
+        """
+        Yield match, end_idx for each match
+        """
+        match = self.scanner.scanner(string, idx).match
+        actions = self.actions
+        lastend = idx
+        end = len(string)
+        while True:
+            m = match()
+            if m is None:
+                break
+            matchbegin, matchend = m.span()
+            if lastend == matchend:
+                break
+            action = actions[m.lastindex]
+            if action is not None:
+                rval, next_pos = action(m, context)
+                if next_pos is not None and next_pos != matchend:
+                    # "fast forward" the scanner
+                    matchend = next_pos
+                    match = self.scanner.scanner(string, matchend).match
+                yield rval, matchend
+            lastend = matchend
+
+
+def pattern(pattern, flags=FLAGS):
+    def decorator(fn):
+        fn.pattern = pattern
+        fn.regex = re.compile(pattern, flags)
+        return fn
+    return decorator
\ No newline at end of file
diff --git a/webapp/django/utils/simplejson/tool.py b/webapp/django/utils/simplejson/tool.py
new file mode 100644
index 0000000..d0eb8ad
--- /dev/null
+++ b/webapp/django/utils/simplejson/tool.py
@@ -0,0 +1,44 @@
+r"""
+Using simplejson from the shell to validate and
+pretty-print::
+    
+    $ echo '{"json":"obj"}' | python -msimplejson
+    {
+        "json": "obj"
+    }
+    $ echo '{ 1.2:3.4}' | python -msimplejson
+    Expecting property name: line 1 column 2 (char 2)
+
+Note that the JSON produced by this module's default settings
+is a subset of YAML, so it may be used as a serializer for that as well.
+"""
+import django.utils.simplejson
+
+#
+# Pretty printer:
+#     curl http://mochikit.com/examples/ajax_tables/domains.json | python -msimplejson.tool
+#
+
+def main():
+    import sys
+    if len(sys.argv) == 1:
+        infile = sys.stdin
+        outfile = sys.stdout
+    elif len(sys.argv) == 2:
+        infile = open(sys.argv[1], 'rb')
+        outfile = sys.stdout
+    elif len(sys.argv) == 3:
+        infile = open(sys.argv[1], 'rb')
+        outfile = open(sys.argv[2], 'wb')
+    else:
+        raise SystemExit("%s [infile [outfile]]" % (sys.argv[0],))
+    try:
+        obj = simplejson.load(infile)
+    except ValueError, e:
+        raise SystemExit(e)
+    simplejson.dump(obj, outfile, sort_keys=True, indent=4)
+    outfile.write('\n')
+
+
+if __name__ == '__main__':
+    main()
diff --git a/webapp/django/utils/stopwords.py b/webapp/django/utils/stopwords.py
new file mode 100644
index 0000000..18aeb7f
--- /dev/null
+++ b/webapp/django/utils/stopwords.py
@@ -0,0 +1,42 @@
+# Performance note: I benchmarked this code using a set instead of
+# a list for the stopwords and was surprised to find that the list
+# performed /better/ than the set - maybe because it's only a small
+# list.
+
+stopwords = '''
+i
+a
+an
+are
+as
+at
+be
+by
+for
+from
+how
+in
+is
+it
+of
+on
+or
+that
+the
+this
+to
+was
+what
+when
+where
+'''.split()
+
+def strip_stopwords(sentence):
+    "Removes stopwords - also normalizes whitespace"
+    words = sentence.split()
+    sentence = []
+    for word in words:
+        if word.lower() not in stopwords:
+            sentence.append(word)
+    return u' '.join(sentence)
+
diff --git a/webapp/django/utils/synch.py b/webapp/django/utils/synch.py
new file mode 100644
index 0000000..2e808c1
--- /dev/null
+++ b/webapp/django/utils/synch.py
@@ -0,0 +1,87 @@
+"""
+Synchronization primitives:
+
+    - reader-writer lock (preference to writers)
+
+(Contributed to Django by eugene@lazutkin.com)
+"""
+
+try:
+    import threading
+except ImportError:
+    import dummy_threading as threading
+
+class RWLock:
+    """
+    Classic implementation of reader-writer lock with preference to writers.
+
+    Readers can access a resource simultaneously.
+    Writers get an exclusive access.
+
+    API is self-descriptive:
+        reader_enters()
+        reader_leaves()
+        writer_enters()
+        writer_leaves()
+    """
+    def __init__(self):
+        self.mutex     = threading.RLock()
+        self.can_read  = threading.Semaphore(0)
+        self.can_write = threading.Semaphore(0)
+        self.active_readers  = 0
+        self.active_writers  = 0
+        self.waiting_readers = 0
+        self.waiting_writers = 0
+
+    def reader_enters(self):
+        self.mutex.acquire()
+        try:
+            if self.active_writers == 0 and self.waiting_writers == 0:
+                self.active_readers += 1
+                self.can_read.release()
+            else:
+                self.waiting_readers += 1
+        finally:
+            self.mutex.release()
+        self.can_read.acquire()
+
+    def reader_leaves(self):
+        self.mutex.acquire()
+        try:
+            self.active_readers -= 1
+            if self.active_readers == 0 and self.waiting_writers != 0:
+                self.active_writers  += 1
+                self.waiting_writers -= 1
+                self.can_write.release()
+        finally:
+            self.mutex.release()
+
+    def writer_enters(self):
+        self.mutex.acquire()
+        try:
+            if self.active_writers == 0 and self.waiting_writers == 0 and self.active_readers == 0:
+                self.active_writers += 1
+                self.can_write.release()
+            else:
+                self.waiting_writers += 1
+        finally:
+            self.mutex.release()
+        self.can_write.acquire()
+
+    def writer_leaves(self):
+        self.mutex.acquire()
+        try:
+            self.active_writers -= 1
+            if self.waiting_writers != 0:
+                self.active_writers  += 1
+                self.waiting_writers -= 1
+                self.can_write.release()
+            elif self.waiting_readers != 0:
+                t = self.waiting_readers
+                self.waiting_readers = 0
+                self.active_readers += t
+                while t > 0:
+                    self.can_read.release()
+                    t -= 1
+        finally:
+            self.mutex.release()
diff --git a/webapp/django/utils/termcolors.py b/webapp/django/utils/termcolors.py
new file mode 100644
index 0000000..17a600f
--- /dev/null
+++ b/webapp/django/utils/termcolors.py
@@ -0,0 +1,68 @@
+"""
+termcolors.py
+"""
+
+color_names = ('black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white')
+foreground = dict([(color_names[x], '3%s' % x) for x in range(8)])
+background = dict([(color_names[x], '4%s' % x) for x in range(8)])
+del color_names
+
+RESET = '0'
+opt_dict = {'bold': '1', 'underscore': '4', 'blink': '5', 'reverse': '7', 'conceal': '8'}
+
+def colorize(text='', opts=(), **kwargs):
+    """
+    Returns your text, enclosed in ANSI graphics codes.
+
+    Depends on the keyword arguments 'fg' and 'bg', and the contents of
+    the opts tuple/list.
+
+    Returns the RESET code if no parameters are given.
+
+    Valid colors:
+        'black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white'
+
+    Valid options:
+        'bold'
+        'underscore'
+        'blink'
+        'reverse'
+        'conceal'
+        'noreset' - string will not be auto-terminated with the RESET code
+
+    Examples:
+        colorize('hello', fg='red', bg='blue', opts=('blink',))
+        colorize()
+        colorize('goodbye', opts=('underscore',))
+        print colorize('first line', fg='red', opts=('noreset',))
+        print 'this should be red too'
+        print colorize('and so should this')
+        print 'this should not be red'
+    """
+    text = str(text)
+    code_list = []
+    if text == '' and len(opts) == 1 and opts[0] == 'reset':
+        return '\x1b[%sm' % RESET
+    for k, v in kwargs.iteritems():
+        if k == 'fg':
+            code_list.append(foreground[v])
+        elif k == 'bg':
+            code_list.append(background[v])
+    for o in opts:
+        if o in opt_dict:
+            code_list.append(opt_dict[o])
+    if 'noreset' not in opts:
+        text = text + '\x1b[%sm' % RESET
+    return ('\x1b[%sm' % ';'.join(code_list)) + text
+
+def make_style(opts=(), **kwargs):
+    """
+    Returns a function with default parameters for colorize()
+
+    Example:
+        bold_red = make_style(opts=('bold',), fg='red')
+        print bold_red('hello')
+        KEYWORD = make_style(fg='yellow')
+        COMMENT = make_style(fg='blue', opts=('bold',))
+    """
+    return lambda text: colorize(text, opts, **kwargs)
diff --git a/webapp/django/utils/text.py b/webapp/django/utils/text.py
new file mode 100644
index 0000000..3686a45
--- /dev/null
+++ b/webapp/django/utils/text.py
@@ -0,0 +1,248 @@
+import re
+from django.conf import settings
+from django.utils.encoding import force_unicode
+from django.utils.functional import allow_lazy
+from django.utils.translation import ugettext_lazy
+from htmlentitydefs import name2codepoint
+
+# Capitalizes the first letter of a string.
+capfirst = lambda x: x and force_unicode(x)[0].upper() + force_unicode(x)[1:]
+capfirst = allow_lazy(capfirst, unicode)
+
+def wrap(text, width):
+    """
+    A word-wrap function that preserves existing line breaks and most spaces in
+    the text. Expects that existing line breaks are posix newlines.
+    """
+    text = force_unicode(text)
+    def _generator():
+        it = iter(text.split(' '))
+        word = it.next()
+        yield word
+        pos = len(word) - word.rfind('\n') - 1
+        for word in it:
+            if "\n" in word:
+                lines = word.split('\n')
+            else:
+                lines = (word,)
+            pos += len(lines[0]) + 1
+            if pos > width:
+                yield '\n'
+                pos = len(lines[-1])
+            else:
+                yield ' '
+                if len(lines) > 1:
+                    pos = len(lines[-1])
+            yield word
+    return u''.join(_generator())
+wrap = allow_lazy(wrap, unicode)
+
+def truncate_words(s, num):
+    "Truncates a string after a certain number of words."
+    s = force_unicode(s)
+    length = int(num)
+    words = s.split()
+    if len(words) > length:
+        words = words[:length]
+        if not words[-1].endswith('...'):
+            words.append('...')
+    return u' '.join(words)
+truncate_words = allow_lazy(truncate_words, unicode)
+
+def truncate_html_words(s, num):
+    """
+    Truncates html to a certain number of words (not counting tags and
+    comments). Closes opened tags if they were correctly closed in the given
+    html.
+    """
+    s = force_unicode(s)
+    length = int(num)
+    if length <= 0:
+        return u''
+    html4_singlets = ('br', 'col', 'link', 'base', 'img', 'param', 'area', 'hr', 'input')
+    # Set up regular expressions
+    re_words = re.compile(r'&.*?;|<.*?>|(\w[\w-]*)', re.U)
+    re_tag = re.compile(r'<(/)?([^ ]+?)(?: (/)| .*?)?>')
+    # Count non-HTML words and keep note of open tags
+    pos = 0
+    ellipsis_pos = 0
+    words = 0
+    open_tags = []
+    while words <= length:
+        m = re_words.search(s, pos)
+        if not m:
+            # Checked through whole string
+            break
+        pos = m.end(0)
+        if m.group(1):
+            # It's an actual non-HTML word
+            words += 1
+            if words == length:
+                ellipsis_pos = pos
+            continue
+        # Check for tag
+        tag = re_tag.match(m.group(0))
+        if not tag or ellipsis_pos:
+            # Don't worry about non tags or tags after our truncate point
+            continue
+        closing_tag, tagname, self_closing = tag.groups()
+        tagname = tagname.lower()  # Element names are always case-insensitive
+        if self_closing or tagname in html4_singlets:
+            pass
+        elif closing_tag:
+            # Check for match in open tags list
+            try:
+                i = open_tags.index(tagname)
+            except ValueError:
+                pass
+            else:
+                # SGML: An end tag closes, back to the matching start tag, all unclosed intervening start tags with omitted end tags
+                open_tags = open_tags[i+1:]
+        else:
+            # Add it to the start of the open tags list
+            open_tags.insert(0, tagname)
+    if words <= length:
+        # Don't try to close tags if we don't need to truncate
+        return s
+    out = s[:ellipsis_pos] + ' ...'
+    # Close any tags still open
+    for tag in open_tags:
+        out += '</%s>' % tag
+    # Return string
+    return out
+truncate_html_words = allow_lazy(truncate_html_words, unicode)
+
+def get_valid_filename(s):
+    """
+    Returns the given string converted to a string that can be used for a clean
+    filename. Specifically, leading and trailing spaces are removed; other
+    spaces are converted to underscores; and all non-filename-safe characters
+    are removed.
+    >>> get_valid_filename("john's portrait in 2004.jpg")
+    u'johns_portrait_in_2004.jpg'
+    """
+    s = force_unicode(s).strip().replace(' ', '_')
+    return re.sub(r'[^-A-Za-z0-9_.]', '', s)
+get_valid_filename = allow_lazy(get_valid_filename, unicode)
+
+def get_text_list(list_, last_word=ugettext_lazy(u'or')):
+    """
+    >>> get_text_list(['a', 'b', 'c', 'd'])
+    u'a, b, c or d'
+    >>> get_text_list(['a', 'b', 'c'], 'and')
+    u'a, b and c'
+    >>> get_text_list(['a', 'b'], 'and')
+    u'a and b'
+    >>> get_text_list(['a'])
+    u'a'
+    >>> get_text_list([])
+    u''
+    """
+    if len(list_) == 0: return u''
+    if len(list_) == 1: return force_unicode(list_[0])
+    return u'%s %s %s' % (', '.join([force_unicode(i) for i in list_][:-1]), force_unicode(last_word), force_unicode(list_[-1]))
+get_text_list = allow_lazy(get_text_list, unicode)
+
+def normalize_newlines(text):
+    return force_unicode(re.sub(r'\r\n|\r|\n', '\n', text))
+normalize_newlines = allow_lazy(normalize_newlines, unicode)
+
+def recapitalize(text):
+    "Recapitalizes text, placing caps after end-of-sentence punctuation."
+    text = force_unicode(text).lower()
+    capsRE = re.compile(r'(?:^|(?<=[\.\?\!] ))([a-z])')
+    text = capsRE.sub(lambda x: x.group(1).upper(), text)
+    return text
+recapitalize = allow_lazy(recapitalize)
+
+def phone2numeric(phone):
+    "Converts a phone number with letters into its numeric equivalent."
+    letters = re.compile(r'[A-PR-Y]', re.I)
+    char2number = lambda m: {'a': '2', 'c': '2', 'b': '2', 'e': '3',
+         'd': '3', 'g': '4', 'f': '3', 'i': '4', 'h': '4', 'k': '5',
+         'j': '5', 'm': '6', 'l': '5', 'o': '6', 'n': '6', 'p': '7',
+         's': '7', 'r': '7', 'u': '8', 't': '8', 'w': '9', 'v': '8',
+         'y': '9', 'x': '9'}.get(m.group(0).lower())
+    return letters.sub(char2number, phone)
+phone2numeric = allow_lazy(phone2numeric)
+
+# From http://www.xhaus.com/alan/python/httpcomp.html#gzip
+# Used with permission.
+def compress_string(s):
+    import cStringIO, gzip
+    zbuf = cStringIO.StringIO()
+    zfile = gzip.GzipFile(mode='wb', compresslevel=6, fileobj=zbuf)
+    zfile.write(s)
+    zfile.close()
+    return zbuf.getvalue()
+
+ustring_re = re.compile(u"([\u0080-\uffff])")
+
+def javascript_quote(s, quote_double_quotes=False):
+
+    def fix(match):
+        return r"\u%04x" % ord(match.group(1))
+
+    if type(s) == str:
+        s = s.decode('utf-8')
+    elif type(s) != unicode:
+        raise TypeError, s
+    s = s.replace('\\', '\\\\')
+    s = s.replace('\r', '\\r')
+    s = s.replace('\n', '\\n')
+    s = s.replace('\t', '\\t')
+    s = s.replace("'", "\\'")
+    if quote_double_quotes:
+        s = s.replace('"', '&quot;')
+    return str(ustring_re.sub(fix, s))
+javascript_quote = allow_lazy(javascript_quote, unicode)
+
+smart_split_re = re.compile('("(?:[^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|\'(?:[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\'|[^\\s]+)')
+def smart_split(text):
+    r"""
+    Generator that splits a string by spaces, leaving quoted phrases together.
+    Supports both single and double quotes, and supports escaping quotes with
+    backslashes. In the output, strings will keep their initial and trailing
+    quote marks.
+
+    >>> list(smart_split(r'This is "a person\'s" test.'))
+    [u'This', u'is', u'"a person\\\'s"', u'test.']
+   	>>> list(smart_split(r"Another 'person\'s' test.")) 
+   	[u'Another', u"'person's'", u'test.']
+   	>>> list(smart_split(r'A "\"funky\" style" test.')) 
+   	[u'A', u'""funky" style"', u'test.']
+    """
+    text = force_unicode(text)
+    for bit in smart_split_re.finditer(text):
+        bit = bit.group(0)
+        if bit[0] == '"' and bit[-1] == '"':
+            yield '"' + bit[1:-1].replace('\\"', '"').replace('\\\\', '\\') + '"'
+        elif bit[0] == "'" and bit[-1] == "'":
+            yield "'" + bit[1:-1].replace("\\'", "'").replace("\\\\", "\\") + "'"
+        else:
+            yield bit
+smart_split = allow_lazy(smart_split, unicode)
+
+def _replace_entity(match):
+     text = match.group(1)
+     if text[0] == u'#':
+         text = text[1:]
+         try:
+             if text[0] in u'xX':
+                 c = int(text[1:], 16)
+             else:
+                 c = int(text)
+             return unichr(c)
+         except ValueError:
+             return match.group(0)
+     else:
+         try:
+             return unichr(name2codepoint[text])
+         except (ValueError, KeyError):
+             return match.group(0)
+
+_entity_re = re.compile(r"&(#?[xX]?(?:[0-9a-fA-F]+|\w{1,8}));")
+
+def unescape_entities(text):
+     return _entity_re.sub(_replace_entity, text)
+unescape_entities = allow_lazy(unescape_entities, unicode)
diff --git a/webapp/django/utils/thread_support.py b/webapp/django/utils/thread_support.py
new file mode 100644
index 0000000..2b97d16
--- /dev/null
+++ b/webapp/django/utils/thread_support.py
@@ -0,0 +1,12 @@
+"""
+Code used in a couple of places to work with the current thread's environment.
+Current users include i18n and request prefix handling.
+"""
+
+try:
+    import threading
+    currentThread = threading.currentThread
+except ImportError:
+    def currentThread():
+        return "no threading"
+
diff --git a/webapp/django/utils/timesince.py b/webapp/django/utils/timesince.py
new file mode 100644
index 0000000..e1132c3
--- /dev/null
+++ b/webapp/django/utils/timesince.py
@@ -0,0 +1,67 @@
+import datetime
+import time
+
+from django.utils.tzinfo import LocalTimezone
+from django.utils.translation import ungettext, ugettext
+
+def timesince(d, now=None):
+    """
+    Takes two datetime objects and returns the time between d and now
+    as a nicely formatted string, e.g. "10 minutes".  If d occurs after now,
+    then "0 minutes" is returned.
+
+    Units used are years, months, weeks, days, hours, and minutes.
+    Seconds and microseconds are ignored.  Up to two adjacent units will be
+    displayed.  For example, "2 weeks, 3 days" and "1 year, 3 months" are
+    possible outputs, but "2 weeks, 3 hours" and "1 year, 5 days" are not.
+
+    Adapted from http://blog.natbat.co.uk/archive/2003/Jun/14/time_since
+    """
+    chunks = (
+      (60 * 60 * 24 * 365, lambda n: ungettext('year', 'years', n)),
+      (60 * 60 * 24 * 30, lambda n: ungettext('month', 'months', n)),
+      (60 * 60 * 24 * 7, lambda n : ungettext('week', 'weeks', n)),
+      (60 * 60 * 24, lambda n : ungettext('day', 'days', n)),
+      (60 * 60, lambda n: ungettext('hour', 'hours', n)),
+      (60, lambda n: ungettext('minute', 'minutes', n))
+    )
+    # Convert datetime.date to datetime.datetime for comparison
+    if d.__class__ is not datetime.datetime:
+        d = datetime.datetime(d.year, d.month, d.day)
+    if now:
+        t = now.timetuple()
+    else:
+        t = time.localtime()
+    if d.tzinfo:
+        tz = LocalTimezone(d)
+    else:
+        tz = None
+    now = datetime.datetime(t[0], t[1], t[2], t[3], t[4], t[5], tzinfo=tz)
+
+    # ignore microsecond part of 'd' since we removed it from 'now'
+    delta = now - (d - datetime.timedelta(0, 0, d.microsecond))
+    since = delta.days * 24 * 60 * 60 + delta.seconds
+    if since <= 0:
+        # d is in the future compared to now, stop processing.
+        return u'0 ' + ugettext('minutes')
+    for i, (seconds, name) in enumerate(chunks):
+        count = since // seconds
+        if count != 0:
+            break
+    s = ugettext('%(number)d %(type)s') % {'number': count, 'type': name(count)}
+    if i + 1 < len(chunks):
+        # Now get the second item
+        seconds2, name2 = chunks[i + 1]
+        count2 = (since - (seconds * count)) // seconds2
+        if count2 != 0:
+            s += ugettext(', %(number)d %(type)s') % {'number': count2, 'type': name2(count2)}
+    return s
+
+def timeuntil(d, now=None):
+    """
+    Like timesince, but returns a string measuring the time until
+    the given time.
+    """
+    if now == None:
+        now = datetime.datetime.now()
+    return timesince(now, d)
diff --git a/webapp/django/utils/translation/__init__.py b/webapp/django/utils/translation/__init__.py
new file mode 100644
index 0000000..43ce3e5
--- /dev/null
+++ b/webapp/django/utils/translation/__init__.py
@@ -0,0 +1,111 @@
+"""
+Internationalization support.
+"""
+from django.utils.functional import lazy
+from django.utils.encoding import force_unicode
+
+__all__ = ['gettext', 'gettext_noop', 'gettext_lazy', 'ngettext',
+        'ngettext_lazy', 'string_concat', 'activate', 'deactivate',
+        'get_language', 'get_language_bidi', 'get_date_formats',
+        'get_partial_date_formats', 'check_for_language', 'to_locale',
+        'get_language_from_request', 'templatize', 'ugettext',
+        'ungettext', 'deactivate_all']
+
+# Here be dragons, so a short explanation of the logic won't hurt:
+# We are trying to solve two problems: (1) access settings, in particular
+# settings.USE_I18N, as late as possible, so that modules can be imported
+# without having to first configure Django, and (2) if some other code creates
+# a reference to one of these functions, don't break that reference when we
+# replace the functions with their real counterparts (once we do access the
+# settings).
+
+def delayed_loader(*args, **kwargs):
+    """
+    Replace each real_* function with the corresponding function from either
+    trans_real or trans_null (e.g. real_gettext is replaced with
+    trans_real.gettext or trans_null.gettext). This function is run once, the
+    first time any i18n method is called. It replaces all the i18n methods at
+    once at that time.
+    """
+    import traceback
+    from django.conf import settings
+    if settings.USE_I18N:
+        import trans_real as trans
+    else:
+        import trans_null as trans
+    caller = traceback.extract_stack(limit=2)[0][2]
+    g = globals()
+    for name in __all__:
+        if hasattr(trans, name):
+            g['real_%s' % name] = getattr(trans, name)
+
+    # Make the originally requested function call on the way out the door.
+    return g['real_%s' % caller](*args, **kwargs)
+
+g = globals()
+for name in __all__:
+    g['real_%s' % name] = delayed_loader
+del g, delayed_loader
+
+def gettext_noop(message):
+    return real_gettext_noop(message)
+
+ugettext_noop = gettext_noop
+
+def gettext(message):
+    return real_gettext(message)
+
+def ngettext(singular, plural, number):
+    return real_ngettext(singular, plural, number)
+
+def ugettext(message):
+    return real_ugettext(message)
+
+def ungettext(singular, plural, number):
+    return real_ungettext(singular, plural, number)
+
+ngettext_lazy = lazy(ngettext, str)
+gettext_lazy = lazy(gettext, str)
+ungettext_lazy = lazy(ungettext, unicode)
+ugettext_lazy = lazy(ugettext, unicode)
+
+def activate(language):
+    return real_activate(language)
+
+def deactivate():
+    return real_deactivate()
+
+def get_language():
+    return real_get_language()
+
+def get_language_bidi():
+    return real_get_language_bidi()
+
+def get_date_formats():
+    return real_get_date_formats()
+
+def get_partial_date_formats():
+    return real_get_partial_date_formats()
+
+def check_for_language(lang_code):
+    return real_check_for_language(lang_code)
+
+def to_locale(language):
+    return real_to_locale(language)
+
+def get_language_from_request(request):
+    return real_get_language_from_request(request)
+
+def templatize(src):
+    return real_templatize(src)
+
+def deactivate_all():
+    return real_deactivate_all()
+
+def string_concat(*strings):
+    """
+    Lazy variant of string concatenation, needed for translations that are
+    constructed from multiple parts.
+    """
+    return u''.join([force_unicode(s) for s in strings])
+string_concat = lazy(string_concat, unicode)
diff --git a/webapp/django/utils/translation/trans_null.py b/webapp/django/utils/translation/trans_null.py
new file mode 100644
index 0000000..98c6de6
--- /dev/null
+++ b/webapp/django/utils/translation/trans_null.py
@@ -0,0 +1,53 @@
+# These are versions of the functions in django.utils.translation.trans_real
+# that don't actually do anything. This is purely for performance, so that
+# settings.USE_I18N = False can use this module rather than trans_real.py.
+
+from django.conf import settings
+from django.utils.encoding import force_unicode
+from django.utils.safestring import mark_safe, SafeData
+
+def ngettext(singular, plural, number):
+    if number == 1: return singular
+    return plural
+ngettext_lazy = ngettext
+
+def ungettext(singular, plural, number):
+    return force_unicode(ngettext(singular, plural, number))
+
+activate = lambda x: None
+deactivate = deactivate_all = lambda: None
+get_language = lambda: settings.LANGUAGE_CODE
+get_language_bidi = lambda: settings.LANGUAGE_CODE in settings.LANGUAGES_BIDI
+get_date_formats = lambda: (settings.DATE_FORMAT, settings.DATETIME_FORMAT, settings.TIME_FORMAT)
+get_partial_date_formats = lambda: (settings.YEAR_MONTH_FORMAT, settings.MONTH_DAY_FORMAT)
+check_for_language = lambda x: True
+
+TECHNICAL_ID_MAP = {
+    "DATE_WITH_TIME_FULL": settings.DATETIME_FORMAT,
+    "DATE_FORMAT": settings.DATE_FORMAT,
+    "DATETIME_FORMAT": settings.DATETIME_FORMAT,
+    "TIME_FORMAT": settings.TIME_FORMAT,
+    "YEAR_MONTH_FORMAT": settings.YEAR_MONTH_FORMAT,
+    "MONTH_DAY_FORMAT": settings.MONTH_DAY_FORMAT,
+}
+
+def gettext(message):
+    result = TECHNICAL_ID_MAP.get(message, message)
+    if isinstance(message, SafeData):
+        return mark_safe(result)
+    return result
+
+def ugettext(message):
+    return force_unicode(gettext(message))
+
+gettext_noop = gettext_lazy = _ = gettext
+
+def to_locale(language):
+    p = language.find('-')
+    if p >= 0:
+        return language[:p].lower()+'_'+language[p+1:].upper()
+    else:
+        return language.lower()
+
+def get_language_from_request(request):
+    return settings.LANGUAGE_CODE
diff --git a/webapp/django/utils/translation/trans_real.py b/webapp/django/utils/translation/trans_real.py
new file mode 100644
index 0000000..93bb3c9
--- /dev/null
+++ b/webapp/django/utils/translation/trans_real.py
@@ -0,0 +1,541 @@
+"""Translation helper functions."""
+
+import locale
+import os
+import re
+import sys
+import gettext as gettext_module
+from cStringIO import StringIO
+
+from django.utils.safestring import mark_safe, SafeData
+from django.utils.thread_support import currentThread
+
+# Translations are cached in a dictionary for every language+app tuple.
+# The active translations are stored by threadid to make them thread local.
+_translations = {}
+_active = {}
+
+# The default translation is based on the settings file.
+_default = None
+
+# This is a cache for normalized accept-header languages to prevent multiple
+# file lookups when checking the same locale on repeated requests.
+_accepted = {}
+
+# Format of Accept-Language header values. From RFC 2616, section 14.4 and 3.9.
+accept_language_re = re.compile(r'''
+        ([A-Za-z]{1,8}(?:-[A-Za-z]{1,8})*|\*)   # "en", "en-au", "x-y-z", "*"
+        (?:;q=(0(?:\.\d{,3})?|1(?:.0{,3})?))?   # Optional "q=1.00", "q=0.8"
+        (?:\s*,\s*|$)                            # Multiple accepts per header.
+        ''', re.VERBOSE)
+
+def to_locale(language, to_lower=False):
+    """
+    Turns a language name (en-us) into a locale name (en_US). If 'to_lower' is
+    True, the last component is lower-cased (en_us).
+    """
+    p = language.find('-')
+    if p >= 0:
+        if to_lower:
+            return language[:p].lower()+'_'+language[p+1:].lower()
+        else:
+            return language[:p].lower()+'_'+language[p+1:].upper()
+    else:
+        return language.lower()
+
+def to_language(locale):
+    """Turns a locale name (en_US) into a language name (en-us)."""
+    p = locale.find('_')
+    if p >= 0:
+        return locale[:p].lower()+'-'+locale[p+1:].lower()
+    else:
+        return locale.lower()
+
+class DjangoTranslation(gettext_module.GNUTranslations):
+    """
+    This class sets up the GNUTranslations context with regard to output
+    charset. Django uses a defined DEFAULT_CHARSET as the output charset on
+    Python 2.4. With Python 2.3, use DjangoTranslation23.
+    """
+    def __init__(self, *args, **kw):
+        from django.conf import settings
+        gettext_module.GNUTranslations.__init__(self, *args, **kw)
+        # Starting with Python 2.4, there's a function to define
+        # the output charset. Before 2.4, the output charset is
+        # identical with the translation file charset.
+        try:
+            self.set_output_charset('utf-8')
+        except AttributeError:
+            pass
+        self.django_output_charset = 'utf-8'
+        self.__language = '??'
+
+    def merge(self, other):
+        self._catalog.update(other._catalog)
+
+    def set_language(self, language):
+        self.__language = language
+
+    def language(self):
+        return self.__language
+
+    def __repr__(self):
+        return "<DjangoTranslation lang:%s>" % self.__language
+
+class DjangoTranslation23(DjangoTranslation):
+    """
+    Compatibility class that is only used with Python 2.3.
+    Python 2.3 doesn't support set_output_charset on translation objects and
+    needs this wrapper class to make sure input charsets from translation files
+    are correctly translated to output charsets.
+
+    With a full switch to Python 2.4, this can be removed from the source.
+    """
+    def gettext(self, msgid):
+        res = self.ugettext(msgid)
+        return res.encode(self.django_output_charset)
+
+    def ngettext(self, msgid1, msgid2, n):
+        res = self.ungettext(msgid1, msgid2, n)
+        return res.encode(self.django_output_charset)
+
+def translation(language):
+    """
+    Returns a translation object.
+
+    This translation object will be constructed out of multiple GNUTranslations
+    objects by merging their catalogs. It will construct a object for the
+    requested language and add a fallback to the default language, if it's
+    different from the requested language.
+    """
+    global _translations
+
+    t = _translations.get(language, None)
+    if t is not None:
+        return t
+
+    from django.conf import settings
+
+    # set up the right translation class
+    klass = DjangoTranslation
+    if sys.version_info < (2, 4):
+        klass = DjangoTranslation23
+
+    globalpath = os.path.join(os.path.dirname(sys.modules[settings.__module__].__file__), 'locale')
+
+    if settings.SETTINGS_MODULE is not None:
+        parts = settings.SETTINGS_MODULE.split('.')
+        project = __import__(parts[0], {}, {}, [])
+        projectpath = os.path.join(os.path.dirname(project.__file__), 'locale')
+    else:
+        projectpath = None
+
+    def _fetch(lang, fallback=None):
+
+        global _translations
+
+        loc = to_locale(lang)
+
+        res = _translations.get(lang, None)
+        if res is not None:
+            return res
+
+        def _translation(path):
+            try:
+                t = gettext_module.translation('django', path, [loc], klass)
+                t.set_language(lang)
+                return t
+            except IOError, e:
+                return None
+
+        res = _translation(globalpath)
+
+        # We want to ensure that, for example,  "en-gb" and "en-us" don't share
+        # the same translation object (thus, merging en-us with a local update
+        # doesn't affect en-gb), even though they will both use the core "en"
+        # translation. So we have to subvert Python's internal gettext caching.
+        base_lang = lambda x: x.split('-', 1)[0]
+        if base_lang(lang) in [base_lang(trans) for trans in _translations]:
+            res._info = res._info.copy()
+            res._catalog = res._catalog.copy()
+
+        def _merge(path):
+            t = _translation(path)
+            if t is not None:
+                if res is None:
+                    return t
+                else:
+                    res.merge(t)
+            return res
+
+        for localepath in settings.LOCALE_PATHS:
+            if os.path.isdir(localepath):
+                res = _merge(localepath)
+
+        if projectpath and os.path.isdir(projectpath):
+            res = _merge(projectpath)
+
+        for appname in settings.INSTALLED_APPS:
+            p = appname.rfind('.')
+            if p >= 0:
+                app = getattr(__import__(appname[:p], {}, {}, [appname[p+1:]]), appname[p+1:])
+            else:
+                app = __import__(appname, {}, {}, [])
+
+            apppath = os.path.join(os.path.dirname(app.__file__), 'locale')
+
+            if os.path.isdir(apppath):
+                res = _merge(apppath)
+
+        if res is None:
+            if fallback is not None:
+                res = fallback
+            else:
+                return gettext_module.NullTranslations()
+        _translations[lang] = res
+        return res
+
+    default_translation = _fetch(settings.LANGUAGE_CODE)
+    current_translation = _fetch(language, fallback=default_translation)
+
+    return current_translation
+
+def activate(language):
+    """
+    Fetches the translation object for a given tuple of application name and
+    language and installs it as the current translation object for the current
+    thread.
+    """
+    _active[currentThread()] = translation(language)
+
+def deactivate():
+    """
+    Deinstalls the currently active translation object so that further _ calls
+    will resolve against the default translation object, again.
+    """
+    global _active
+    if currentThread() in _active:
+        del _active[currentThread()]
+
+def deactivate_all():
+    """
+    Makes the active translation object a NullTranslations() instance. This is
+    useful when we want delayed translations to appear as the original string
+    for some reason.
+    """
+    _active[currentThread()] = gettext_module.NullTranslations()
+
+def get_language():
+    """Returns the currently selected language."""
+    t = _active.get(currentThread(), None)
+    if t is not None:
+        try:
+            return to_language(t.language())
+        except AttributeError:
+            pass
+    # If we don't have a real translation object, assume it's the default language.
+    from django.conf import settings
+    return settings.LANGUAGE_CODE
+
+def get_language_bidi():
+    """
+    Returns selected language's BiDi layout.
+    False = left-to-right layout
+    True = right-to-left layout
+    """
+    from django.conf import settings
+    return get_language() in settings.LANGUAGES_BIDI
+
+def catalog():
+    """
+    Returns the current active catalog for further processing.
+    This can be used if you need to modify the catalog or want to access the
+    whole message catalog instead of just translating one string.
+    """
+    global _default, _active
+    t = _active.get(currentThread(), None)
+    if t is not None:
+        return t
+    if _default is None:
+        from django.conf import settings
+        _default = translation(settings.LANGUAGE_CODE)
+    return _default
+
+def do_translate(message, translation_function):
+    """
+    Translates 'message' using the given 'translation_function' name -- which
+    will be either gettext or ugettext. It uses the current thread to find the
+    translation object to use. If no current translation is activated, the
+    message will be run through the default translation object.
+    """
+    global _default, _active
+    t = _active.get(currentThread(), None)
+    if t is not None:
+        result = getattr(t, translation_function)(message)
+    else:
+        if _default is None:
+            from django.conf import settings
+            _default = translation(settings.LANGUAGE_CODE)
+        result = getattr(_default, translation_function)(message)
+    if isinstance(message, SafeData):
+        return mark_safe(result)
+    return result
+
+def gettext(message):
+    return do_translate(message, 'gettext')
+
+def ugettext(message):
+    return do_translate(message, 'ugettext')
+
+def gettext_noop(message):
+    """
+    Marks strings for translation but doesn't translate them now. This can be
+    used to store strings in global variables that should stay in the base
+    language (because they might be used externally) and will be translated
+    later.
+    """
+    return message
+
+def do_ntranslate(singular, plural, number, translation_function):
+    global _default, _active
+
+    t = _active.get(currentThread(), None)
+    if t is not None:
+        return getattr(t, translation_function)(singular, plural, number)
+    if _default is None:
+        from django.conf import settings
+        _default = translation(settings.LANGUAGE_CODE)
+    return getattr(_default, translation_function)(singular, plural, number)
+
+def ngettext(singular, plural, number):
+    """
+    Returns a UTF-8 bytestring of the translation of either the singular or
+    plural, based on the number.
+    """
+    return do_ntranslate(singular, plural, number, 'ngettext')
+
+def ungettext(singular, plural, number):
+    """
+    Returns a unicode strings of the translation of either the singular or
+    plural, based on the number.
+    """
+    return do_ntranslate(singular, plural, number, 'ungettext')
+
+def check_for_language(lang_code):
+    """
+    Checks whether there is a global language file for the given language
+    code. This is used to decide whether a user-provided language is
+    available. This is only used for language codes from either the cookies or
+    session.
+    """
+    from django.conf import settings
+    globalpath = os.path.join(os.path.dirname(sys.modules[settings.__module__].__file__), 'locale')
+    if gettext_module.find('django', globalpath, [to_locale(lang_code)]) is not None:
+        return True
+    else:
+        return False
+
+def get_language_from_request(request):
+    """
+    Analyzes the request to find what language the user wants the system to
+    show. Only languages listed in settings.LANGUAGES are taken into account.
+    If the user requests a sublanguage where we have a main language, we send
+    out the main language.
+    """
+    global _accepted
+    from django.conf import settings
+    globalpath = os.path.join(os.path.dirname(sys.modules[settings.__module__].__file__), 'locale')
+    supported = dict(settings.LANGUAGES)
+
+    if hasattr(request, 'session'):
+        lang_code = request.session.get('django_language', None)
+        if lang_code in supported and lang_code is not None and check_for_language(lang_code):
+            return lang_code
+
+    lang_code = request.COOKIES.get(settings.LANGUAGE_COOKIE_NAME)
+    if lang_code and lang_code in supported and check_for_language(lang_code):
+        return lang_code
+
+    accept = request.META.get('HTTP_ACCEPT_LANGUAGE', '')
+    for accept_lang, unused in parse_accept_lang_header(accept):
+        if accept_lang == '*':
+            break
+
+        # We have a very restricted form for our language files (no encoding
+        # specifier, since they all must be UTF-8 and only one possible
+        # language each time. So we avoid the overhead of gettext.find() and
+        # work out the MO file manually.
+
+        # 'normalized' is the root name of the locale in POSIX format (which is
+        # the format used for the directories holding the MO files).
+        normalized = locale.locale_alias.get(to_locale(accept_lang, True))
+        if not normalized:
+            continue
+        # Remove the default encoding from locale_alias.
+        normalized = normalized.split('.')[0]
+
+        if normalized in _accepted:
+            # We've seen this locale before and have an MO file for it, so no
+            # need to check again.
+            return _accepted[normalized]
+
+        for lang, dirname in ((accept_lang, normalized),
+                (accept_lang.split('-')[0], normalized.split('_')[0])):
+            if lang not in supported:
+                continue
+            langfile = os.path.join(globalpath, dirname, 'LC_MESSAGES',
+                    'django.mo')
+            if os.path.exists(langfile):
+                _accepted[normalized] = lang
+            return lang
+
+    return settings.LANGUAGE_CODE
+
+def get_date_formats():
+    """
+    Checks whether translation files provide a translation for some technical
+    message ID to store date and time formats. If it doesn't contain one, the
+    formats provided in the settings will be used.
+    """
+    from django.conf import settings
+    date_format = ugettext('DATE_FORMAT')
+    datetime_format = ugettext('DATETIME_FORMAT')
+    time_format = ugettext('TIME_FORMAT')
+    if date_format == 'DATE_FORMAT':
+        date_format = settings.DATE_FORMAT
+    if datetime_format == 'DATETIME_FORMAT':
+        datetime_format = settings.DATETIME_FORMAT
+    if time_format == 'TIME_FORMAT':
+        time_format = settings.TIME_FORMAT
+    return date_format, datetime_format, time_format
+
+def get_partial_date_formats():
+    """
+    Checks whether translation files provide a translation for some technical
+    message ID to store partial date formats. If it doesn't contain one, the
+    formats provided in the settings will be used.
+    """
+    from django.conf import settings
+    year_month_format = ugettext('YEAR_MONTH_FORMAT')
+    month_day_format = ugettext('MONTH_DAY_FORMAT')
+    if year_month_format == 'YEAR_MONTH_FORMAT':
+        year_month_format = settings.YEAR_MONTH_FORMAT
+    if month_day_format == 'MONTH_DAY_FORMAT':
+        month_day_format = settings.MONTH_DAY_FORMAT
+    return year_month_format, month_day_format
+
+dot_re = re.compile(r'\S')
+def blankout(src, char):
+    """
+    Changes every non-whitespace character to the given char.
+    Used in the templatize function.
+    """
+    return dot_re.sub(char, src)
+
+inline_re = re.compile(r"""^\s*trans\s+((?:".*?")|(?:'.*?'))\s*""")
+block_re = re.compile(r"""^\s*blocktrans(?:\s+|$)""")
+endblock_re = re.compile(r"""^\s*endblocktrans$""")
+plural_re = re.compile(r"""^\s*plural$""")
+constant_re = re.compile(r"""_\(((?:".*?")|(?:'.*?'))\)""")
+
+def templatize(src):
+    """
+    Turns a Django template into something that is understood by xgettext. It
+    does so by translating the Django translation tags into standard gettext
+    function invocations.
+    """
+    from django.template import Lexer, TOKEN_TEXT, TOKEN_VAR, TOKEN_BLOCK
+    out = StringIO()
+    intrans = False
+    inplural = False
+    singular = []
+    plural = []
+    for t in Lexer(src, None).tokenize():
+        if intrans:
+            if t.token_type == TOKEN_BLOCK:
+                endbmatch = endblock_re.match(t.contents)
+                pluralmatch = plural_re.match(t.contents)
+                if endbmatch:
+                    if inplural:
+                        out.write(' ngettext(%r,%r,count) ' % (''.join(singular), ''.join(plural)))
+                        for part in singular:
+                            out.write(blankout(part, 'S'))
+                        for part in plural:
+                            out.write(blankout(part, 'P'))
+                    else:
+                        out.write(' gettext(%r) ' % ''.join(singular))
+                        for part in singular:
+                            out.write(blankout(part, 'S'))
+                    intrans = False
+                    inplural = False
+                    singular = []
+                    plural = []
+                elif pluralmatch:
+                    inplural = True
+                else:
+                    raise SyntaxError("Translation blocks must not include other block tags: %s" % t.contents)
+            elif t.token_type == TOKEN_VAR:
+                if inplural:
+                    plural.append('%%(%s)s' % t.contents)
+                else:
+                    singular.append('%%(%s)s' % t.contents)
+            elif t.token_type == TOKEN_TEXT:
+                if inplural:
+                    plural.append(t.contents)
+                else:
+                    singular.append(t.contents)
+        else:
+            if t.token_type == TOKEN_BLOCK:
+                imatch = inline_re.match(t.contents)
+                bmatch = block_re.match(t.contents)
+                cmatches = constant_re.findall(t.contents)
+                if imatch:
+                    g = imatch.group(1)
+                    if g[0] == '"': g = g.strip('"')
+                    elif g[0] == "'": g = g.strip("'")
+                    out.write(' gettext(%r) ' % g)
+                elif bmatch:
+                    for fmatch in constant_re.findall(t.contents):
+                        out.write(' _(%s) ' % fmatch)
+                    intrans = True
+                    inplural = False
+                    singular = []
+                    plural = []
+                elif cmatches:
+                    for cmatch in cmatches:
+                        out.write(' _(%s) ' % cmatch)
+                else:
+                    out.write(blankout(t.contents, 'B'))
+            elif t.token_type == TOKEN_VAR:
+                parts = t.contents.split('|')
+                cmatch = constant_re.match(parts[0])
+                if cmatch:
+                    out.write(' _(%s) ' % cmatch.group(1))
+                for p in parts[1:]:
+                    if p.find(':_(') >= 0:
+                        out.write(' %s ' % p.split(':',1)[1])
+                    else:
+                        out.write(blankout(p, 'F'))
+            else:
+                out.write(blankout(t.contents, 'X'))
+    return out.getvalue()
+
+def parse_accept_lang_header(lang_string):
+    """
+    Parses the lang_string, which is the body of an HTTP Accept-Language
+    header, and returns a list of (lang, q-value), ordered by 'q' values.
+
+    Any format errors in lang_string results in an empty list being returned.
+    """
+    result = []
+    pieces = accept_language_re.split(lang_string)
+    if pieces[-1]:
+        return []
+    for i in range(0, len(pieces) - 1, 3):
+        first, lang, priority = pieces[i : i + 3]
+        if first:
+            return []
+        priority = priority and float(priority) or 1.0
+        result.append((lang, priority))
+    result.sort(lambda x, y: -cmp(x[1], y[1]))
+    return result
diff --git a/webapp/django/utils/tree.py b/webapp/django/utils/tree.py
new file mode 100644
index 0000000..a9028b8
--- /dev/null
+++ b/webapp/django/utils/tree.py
@@ -0,0 +1,153 @@
+"""
+A class for storing a tree graph. Primarily used for filter constructs in the
+ORM.
+"""
+
+from copy import deepcopy
+
+class Node(object):
+    """
+    A single internal node in the tree graph. A Node should be viewed as a
+    connection (the root) with the children being either leaf nodes or other
+    Node instances.
+    """
+    # Standard connector type. Clients usually won't use this at all and
+    # subclasses will usually override the value.
+    default = 'DEFAULT'
+
+    def __init__(self, children=None, connector=None, negated=False):
+        """
+        Constructs a new Node. If no connector is given, the default will be
+        used.
+
+        Warning: You probably don't want to pass in the 'negated' parameter. It
+        is NOT the same as constructing a node and calling negate() on the
+        result.
+        """
+        self.children = children and children[:] or []
+        self.connector = connector or self.default
+        self.subtree_parents = []
+        self.negated = negated
+
+    # We need this because of django.db.models.query_utils.Q. Q. __init__() is
+    # problematic, but it is a natural Node subclass in all other respects.
+    def _new_instance(cls, children=None, connector=None, negated=False):
+        """
+        This is called to create a new instance of this class when we need new
+        Nodes (or subclasses) in the internal code in this class. Normally, it
+        just shadows __init__(). However, subclasses with an __init__ signature
+        that is not an extension of Node.__init__ might need to implement this
+        method to allow a Node to create a new instance of them (if they have
+        any extra setting up to do).
+        """
+        obj = Node(children, connector, negated)
+        obj.__class__ = cls
+        return obj
+    _new_instance = classmethod(_new_instance)
+
+    def __str__(self):
+        if self.negated:
+            return '(NOT (%s: %s))' % (self.connector, ', '.join([str(c) for c
+                    in self.children]))
+        return '(%s: %s)' % (self.connector, ', '.join([str(c) for c in
+                self.children]))
+
+    def __deepcopy__(self, memodict):
+        """
+        Utility method used by copy.deepcopy().
+        """
+        obj = Node(connector=self.connector, negated=self.negated)
+        obj.__class__ = self.__class__
+        obj.children = deepcopy(self.children, memodict)
+        obj.subtree_parents = deepcopy(self.subtree_parents, memodict)
+        return obj
+
+    def __len__(self):
+        """
+        The size of a node if the number of children it has.
+        """
+        return len(self.children)
+
+    def __nonzero__(self):
+        """
+        For truth value testing.
+        """
+        return bool(self.children)
+
+    def __contains__(self, other):
+        """
+        Returns True is 'other' is a direct child of this instance.
+        """
+        return other in self.children
+
+    def add(self, node, conn_type):
+        """
+        Adds a new node to the tree. If the conn_type is the same as the root's
+        current connector type, the node is added to the first level.
+        Otherwise, the whole tree is pushed down one level and a new root
+        connector is created, connecting the existing tree and the new node.
+        """
+        if node in self.children and conn_type == self.connector:
+            return
+        if len(self.children) < 2:
+            self.connector = conn_type
+        if self.connector == conn_type:
+            if isinstance(node, Node) and (node.connector == conn_type or
+                    len(node) == 1):
+                self.children.extend(node.children)
+            else:
+                self.children.append(node)
+        else:
+            obj = self._new_instance(self.children, self.connector,
+                    self.negated)
+            self.connector = conn_type
+            self.children = [obj, node]
+
+    def negate(self):
+        """
+        Negate the sense of the root connector. This reorganises the children
+        so that the current node has a single child: a negated node containing
+        all the previous children. This slightly odd construction makes adding
+        new children behave more intuitively.
+
+        Interpreting the meaning of this negate is up to client code. This
+        method is useful for implementing "not" arrangements.
+        """
+        self.children = [self._new_instance(self.children, self.connector,
+                not self.negated)]
+        self.connector = self.default
+
+    def start_subtree(self, conn_type):
+        """
+        Sets up internal state so that new nodes are added to a subtree of the
+        current node. The conn_type specifies how the sub-tree is joined to the
+        existing children.
+        """
+        if len(self.children) == 1:
+            self.connector = conn_type
+        elif self.connector != conn_type:
+            self.children = [self._new_instance(self.children, self.connector,
+                    self.negated)]
+            self.connector = conn_type
+            self.negated = False
+
+        self.subtree_parents.append(self.__class__(self.children,
+                self.connector, self.negated))
+        self.connector = self.default
+        self.negated = False
+        self.children = []
+
+    def end_subtree(self):
+        """
+        Closes off the most recently unmatched start_subtree() call.
+
+        This puts the current state into a node of the parent tree and returns
+        the current instances state to be the parent.
+        """
+        obj = self.subtree_parents.pop()
+        node = self.__class__(self.children, self.connector)
+        self.connector = obj.connector
+        self.negated = obj.negated
+        self.children = obj.children
+        self.children.append(node)
+
diff --git a/webapp/django/utils/tzinfo.py b/webapp/django/utils/tzinfo.py
new file mode 100644
index 0000000..58cfcd5
--- /dev/null
+++ b/webapp/django/utils/tzinfo.py
@@ -0,0 +1,82 @@
+"Implementation of tzinfo classes for use with datetime.datetime."
+
+import locale
+import time
+from datetime import timedelta, tzinfo
+from django.utils.encoding import smart_unicode
+
+try:
+    DEFAULT_ENCODING = locale.getdefaultlocale()[1] or 'ascii'
+except:
+    # Any problems at all determining the locale and we fallback. See #5846.
+    DEFAULT_ENCODING = 'ascii'
+
+class FixedOffset(tzinfo):
+    "Fixed offset in minutes east from UTC."
+    def __init__(self, offset):
+        if isinstance(offset, timedelta):
+            self.__offset = offset
+            offset = self.__offset.seconds // 60
+        else:
+            self.__offset = timedelta(minutes=offset)
+
+        self.__name = u"%+03d%02d" % (offset / 60, offset % 60)
+
+    def __repr__(self):
+        return self.__name
+
+    def utcoffset(self, dt):
+        return self.__offset
+
+    def tzname(self, dt):
+        return self.__name
+
+    def dst(self, dt):
+        return timedelta(0)
+
+class LocalTimezone(tzinfo):
+    "Proxy timezone information from time module."
+    def __init__(self, dt):
+        tzinfo.__init__(self)
+        self._tzname = self.tzname(dt)
+
+    def __repr__(self):
+        return self._tzname
+
+    def utcoffset(self, dt):
+        if self._isdst(dt):
+            return timedelta(seconds=-time.altzone)
+        else:
+            return timedelta(seconds=-time.timezone)
+
+    def dst(self, dt):
+        if self._isdst(dt):
+            return timedelta(seconds=-time.altzone) - timedelta(seconds=-time.timezone)
+        else:
+            return timedelta(0)
+
+    def tzname(self, dt):
+        try:
+            return smart_unicode(time.tzname[self._isdst(dt)], DEFAULT_ENCODING)
+        except UnicodeDecodeError:
+            return None
+
+    def _isdst(self, dt):
+        tt = (dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.weekday(), 0, -1)
+        try:
+            stamp = time.mktime(tt)
+        except (OverflowError, ValueError):
+            # 32 bit systems can't handle dates after Jan 2038, and certain
+            # systems can't handle dates before ~1901-12-01:
+            #
+            # >>> time.mktime((1900, 1, 13, 0, 0, 0, 0, 0, 0))
+            # OverflowError: mktime argument out of range
+            # >>> time.mktime((1850, 1, 13, 0, 0, 0, 0, 0, 0))
+            # ValueError: year out of range
+            #
+            # In this case, we fake the date, because we only care about the
+            # DST flag.
+            tt = (2037,) + tt[1:]
+            stamp = time.mktime(tt)
+        tt = time.localtime(stamp)
+        return tt.tm_isdst > 0
diff --git a/webapp/django/utils/version.py b/webapp/django/utils/version.py
new file mode 100644
index 0000000..cf80856
--- /dev/null
+++ b/webapp/django/utils/version.py
@@ -0,0 +1,39 @@
+import django
+import os.path
+import re
+
+def get_svn_revision(path=None):
+    """
+    Returns the SVN revision in the form SVN-XXXX,
+    where XXXX is the revision number.
+
+    Returns SVN-unknown if anything goes wrong, such as an unexpected
+    format of internal SVN files.
+
+    If path is provided, it should be a directory whose SVN info you want to
+    inspect. If it's not provided, this will use the root django/ package
+    directory.
+    """
+    rev = None
+    if path is None:
+        path = django.__path__[0]
+    entries_path = '%s/.svn/entries' % path
+
+    if os.path.exists(entries_path):
+        entries = open(entries_path, 'r').read()
+        # Versions >= 7 of the entries file are flat text.  The first line is
+        # the version number. The next set of digits after 'dir' is the revision.
+        if re.match('(\d+)', entries):
+            rev_match = re.search('\d+\s+dir\s+(\d+)', entries)
+            if rev_match:
+                rev = rev_match.groups()[0]
+        # Older XML versions of the file specify revision as an attribute of
+        # the first entries node.
+        else:
+            from xml.dom import minidom
+            dom = minidom.parse(entries_path)
+            rev = dom.getElementsByTagName('entry')[0].getAttribute('revision')
+
+    if rev:
+        return u'SVN-%s' % rev
+    return u'SVN-unknown'
diff --git a/webapp/django/utils/xmlutils.py b/webapp/django/utils/xmlutils.py
new file mode 100644
index 0000000..a1eb5fb
--- /dev/null
+++ b/webapp/django/utils/xmlutils.py
@@ -0,0 +1,14 @@
+"""
+Utilities for XML generation/parsing.
+"""
+
+from xml.sax.saxutils import XMLGenerator
+
+class SimplerXMLGenerator(XMLGenerator):
+    def addQuickElement(self, name, contents=None, attrs=None):
+        "Convenience method for adding an element with no children"
+        if attrs is None: attrs = {}
+        self.startElement(name, attrs)
+        if contents is not None:
+            self.characters(contents)
+        self.endElement(name)
diff --git a/webapp/django/views/__init__.py b/webapp/django/views/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/views/__init__.py
diff --git a/webapp/django/views/debug.py b/webapp/django/views/debug.py
new file mode 100644
index 0000000..72631b3
--- /dev/null
+++ b/webapp/django/views/debug.py
@@ -0,0 +1,802 @@
+import os
+import re
+import sys
+import datetime
+
+from django.conf import settings
+from django.template import Template, Context, TemplateDoesNotExist
+from django.utils.html import escape
+from django.http import HttpResponse, HttpResponseServerError, HttpResponseNotFound
+from django.utils.encoding import smart_unicode
+
+HIDDEN_SETTINGS = re.compile('SECRET|PASSWORD|PROFANITIES_LIST')
+
+def linebreak_iter(template_source):
+    yield 0
+    p = template_source.find('\n')
+    while p >= 0:
+        yield p+1
+        p = template_source.find('\n', p+1)
+    yield len(template_source) + 1
+
+def get_safe_settings():
+    "Returns a dictionary of the settings module, with sensitive settings blurred out."
+    settings_dict = {}
+    for k in dir(settings):
+        if k.isupper():
+            if HIDDEN_SETTINGS.search(k):
+                settings_dict[k] = '********************'
+            else:
+                settings_dict[k] = getattr(settings, k)
+    return settings_dict
+
+def technical_500_response(request, exc_type, exc_value, tb):
+    """
+    Create a technical server error response. The last three arguments are
+    the values returned from sys.exc_info() and friends.
+    """
+    reporter = ExceptionReporter(request, exc_type, exc_value, tb)
+    html = reporter.get_traceback_html()
+    return HttpResponseServerError(html, mimetype='text/html')
+
+class ExceptionReporter:
+    """
+    A class to organize and coordinate reporting on exceptions.
+    """
+    def __init__(self, request, exc_type, exc_value, tb):
+        self.request = request
+        self.exc_type = exc_type
+        self.exc_value = exc_value
+        self.tb = tb
+
+        self.template_info = None
+        self.template_does_not_exist = False
+        self.loader_debug_info = None
+
+        # Handle deprecated string exceptions
+        if isinstance(self.exc_type, basestring):
+            self.exc_value = Exception('Deprecated String Exception: %r' % self.exc_type)
+            self.exc_type = type(self.exc_value)
+
+    def get_traceback_html(self):
+        "Return HTML code for traceback."
+
+        if issubclass(self.exc_type, TemplateDoesNotExist):
+            from django.template.loader import template_source_loaders
+            self.template_does_not_exist = True
+            self.loader_debug_info = []
+            for loader in template_source_loaders:
+                try:
+                    source_list_func = getattr(__import__(loader.__module__, {}, {}, ['get_template_sources']), 'get_template_sources')
+                    # NOTE: This assumes exc_value is the name of the template that
+                    # the loader attempted to load.
+                    template_list = [{'name': t, 'exists': os.path.exists(t)} \
+                        for t in source_list_func(str(self.exc_value))]
+                except (ImportError, AttributeError):
+                    template_list = []
+                self.loader_debug_info.append({
+                    'loader': loader.__module__ + '.' + loader.__name__,
+                    'templates': template_list,
+                })
+        if settings.TEMPLATE_DEBUG and hasattr(self.exc_value, 'source'):
+            self.get_template_exception_info()
+
+        frames = self.get_traceback_frames()
+
+        unicode_hint = ''
+        if issubclass(self.exc_type, UnicodeError):
+            start = getattr(self.exc_value, 'start', None)
+            end = getattr(self.exc_value, 'end', None)
+            if start is not None and end is not None:
+                unicode_str = self.exc_value.args[1]
+                unicode_hint = smart_unicode(unicode_str[max(start-5, 0):min(end+5, len(unicode_str))], 'ascii', errors='replace')
+        from django import get_version
+        t = Template(TECHNICAL_500_TEMPLATE, name='Technical 500 template')
+        c = Context({
+            'exception_type': self.exc_type.__name__,
+            'exception_value': smart_unicode(self.exc_value, errors='replace'),
+            'unicode_hint': unicode_hint,
+            'frames': frames,
+            'lastframe': frames[-1],
+            'request': self.request,
+            'request_protocol': self.request.is_secure() and "https" or "http",
+            'settings': get_safe_settings(),
+            'sys_executable': sys.executable,
+            'sys_version_info': '%d.%d.%d' % sys.version_info[0:3],
+            'server_time': datetime.datetime.now(),
+            'django_version_info': get_version(),
+            'sys_path' : sys.path,
+            'template_info': self.template_info,
+            'template_does_not_exist': self.template_does_not_exist,
+            'loader_debug_info': self.loader_debug_info,
+        })
+        return t.render(c)
+
+    def get_template_exception_info(self):
+        origin, (start, end) = self.exc_value.source
+        template_source = origin.reload()
+        context_lines = 10
+        line = 0
+        upto = 0
+        source_lines = []
+        before = during = after = ""
+        for num, next in enumerate(linebreak_iter(template_source)):
+            if start >= upto and end <= next:
+                line = num
+                before = escape(template_source[upto:start])
+                during = escape(template_source[start:end])
+                after = escape(template_source[end:next])
+            source_lines.append( (num, escape(template_source[upto:next])) )
+            upto = next
+        total = len(source_lines)
+
+        top = max(1, line - context_lines)
+        bottom = min(total, line + 1 + context_lines)
+
+        self.template_info = {
+            'message': self.exc_value.args[0],
+            'source_lines': source_lines[top:bottom],
+            'before': before,
+            'during': during,
+            'after': after,
+            'top': top,
+            'bottom': bottom,
+            'total': total,
+            'line': line,
+            'name': origin.name,
+        }
+
+    def _get_lines_from_file(self, filename, lineno, context_lines, loader=None, module_name=None):
+        """
+        Returns context_lines before and after lineno from file.
+        Returns (pre_context_lineno, pre_context, context_line, post_context).
+        """
+        source = None
+        if loader is not None and hasattr(loader, "get_source"):
+            source = loader.get_source(module_name)
+            if source is not None:
+                source = source.splitlines()
+        if source is None:
+            try:
+                f = open(filename)
+                try:
+                    source = f.readlines()
+                finally:
+                    f.close()
+            except (OSError, IOError):
+                pass
+        if source is None:
+            return None, [], None, []
+
+        encoding = 'ascii'
+        for line in source[:2]:
+            # File coding may be specified. Match pattern from PEP-263
+            # (http://www.python.org/dev/peps/pep-0263/)
+            match = re.search(r'coding[:=]\s*([-\w.]+)', line)
+            if match:
+                encoding = match.group(1)
+                break
+        source = [unicode(sline, encoding, 'replace') for sline in source]
+
+        lower_bound = max(0, lineno - context_lines)
+        upper_bound = lineno + context_lines
+
+        pre_context = [line.strip('\n') for line in source[lower_bound:lineno]]
+        context_line = source[lineno].strip('\n')
+        post_context = [line.strip('\n') for line in source[lineno+1:upper_bound]]
+
+        return lower_bound, pre_context, context_line, post_context
+
+    def get_traceback_frames(self):
+        frames = []
+        tb = self.tb
+        while tb is not None:
+            # support for __traceback_hide__ which is used by a few libraries
+            # to hide internal frames.
+            if tb.tb_frame.f_locals.get('__traceback_hide__'):
+                tb = tb.tb_next
+                continue
+            filename = tb.tb_frame.f_code.co_filename
+            function = tb.tb_frame.f_code.co_name
+            lineno = tb.tb_lineno - 1
+            loader = tb.tb_frame.f_globals.get('__loader__')
+            module_name = tb.tb_frame.f_globals.get('__name__')
+            pre_context_lineno, pre_context, context_line, post_context = self._get_lines_from_file(filename, lineno, 7, loader, module_name)
+            if pre_context_lineno is not None:
+                frames.append({
+                    'tb': tb,
+                    'filename': filename,
+                    'function': function,
+                    'lineno': lineno + 1,
+                    'vars': tb.tb_frame.f_locals.items(),
+                    'id': id(tb),
+                    'pre_context': pre_context,
+                    'context_line': context_line,
+                    'post_context': post_context,
+                    'pre_context_lineno': pre_context_lineno + 1,
+                })
+            tb = tb.tb_next
+
+        if not frames:
+            frames = [{
+                'filename': '&lt;unknown&gt;',
+                'function': '?',
+                'lineno': '?',
+                'context_line': '???',
+            }]
+
+        return frames
+
+    def format_exception(self):
+        """
+        Return the same data as from traceback.format_exception.
+        """
+        import traceback
+        frames = self.get_traceback_frames()
+        tb = [ (f['filename'], f['lineno'], f['function'], f['context_line']) for f in frames ]
+        list = ['Traceback (most recent call last):\n']
+        list += traceback.format_list(tb)
+        list += traceback.format_exception_only(self.exc_type, self.exc_value)
+        return list
+
+
+def technical_404_response(request, exception):
+    "Create a technical 404 error response. The exception should be the Http404."
+    try:
+        tried = exception.args[0]['tried']
+    except (IndexError, TypeError):
+        tried = []
+    else:
+        if not tried:
+            # tried exists but is an empty list. The URLconf must've been empty.
+            return empty_urlconf(request)
+
+    t = Template(TECHNICAL_404_TEMPLATE, name='Technical 404 template')
+    c = Context({
+        'root_urlconf': settings.ROOT_URLCONF,
+        'request_path': request.path[1:], # Trim leading slash
+        'urlpatterns': tried,
+        'reason': str(exception),
+        'request': request,
+        'request_protocol': request.is_secure() and "https" or "http",
+        'settings': get_safe_settings(),
+    })
+    return HttpResponseNotFound(t.render(c), mimetype='text/html')
+
+def empty_urlconf(request):
+    "Create an empty URLconf 404 error response."
+    t = Template(EMPTY_URLCONF_TEMPLATE, name='Empty URLConf template')
+    c = Context({
+        'project_name': settings.SETTINGS_MODULE.split('.')[0]
+    })
+    return HttpResponse(t.render(c), mimetype='text/html')
+
+#
+# Templates are embedded in the file so that we know the error handler will
+# always work even if the template loader is broken.
+#
+
+TECHNICAL_500_TEMPLATE = """
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html lang="en">
+<head>
+  <meta http-equiv="content-type" content="text/html; charset=utf-8">
+  <meta name="robots" content="NONE,NOARCHIVE">
+  <title>{{ exception_type }} at {{ request.path|escape }}</title>
+  <style type="text/css">
+    html * { padding:0; margin:0; }
+    body * { padding:10px 20px; }
+    body * * { padding:0; }
+    body { font:small sans-serif; }
+    body>div { border-bottom:1px solid #ddd; }
+    h1 { font-weight:normal; }
+    h2 { margin-bottom:.8em; }
+    h2 span { font-size:80%; color:#666; font-weight:normal; }
+    h3 { margin:1em 0 .5em 0; }
+    h4 { margin:0 0 .5em 0; font-weight: normal; }
+    table { border:1px solid #ccc; border-collapse: collapse; width:100%; background:white; }
+    tbody td, tbody th { vertical-align:top; padding:2px 3px; }
+    thead th { padding:1px 6px 1px 3px; background:#fefefe; text-align:left; font-weight:normal; font-size:11px; border:1px solid #ddd; }
+    tbody th { width:12em; text-align:right; color:#666; padding-right:.5em; }
+    table.vars { margin:5px 0 2px 40px; }
+    table.vars td, table.req td { font-family:monospace; }
+    table td.code { width:100%; }
+    table td.code div { overflow:hidden; }
+    table.source th { color:#666; }
+    table.source td { font-family:monospace; white-space:pre; border-bottom:1px solid #eee; }
+    ul.traceback { list-style-type:none; }
+    ul.traceback li.frame { margin-bottom:1em; }
+    div.context { margin: 10px 0; }
+    div.context ol { padding-left:30px; margin:0 10px; list-style-position: inside; }
+    div.context ol li { font-family:monospace; white-space:pre; color:#666; cursor:pointer; }
+    div.context ol.context-line li { color:black; background-color:#ccc; }
+    div.context ol.context-line li span { float: right; }
+    div.commands { margin-left: 40px; }
+    div.commands a { color:black; text-decoration:none; }
+    #summary { background: #ffc; }
+    #summary h2 { font-weight: normal; color: #666; }
+    #explanation { background:#eee; }
+    #template, #template-not-exist { background:#f6f6f6; }
+    #template-not-exist ul { margin: 0 0 0 20px; }
+    #unicode-hint { background:#eee; }
+    #traceback { background:#eee; }
+    #requestinfo { background:#f6f6f6; padding-left:120px; }
+    #summary table { border:none; background:transparent; }
+    #requestinfo h2, #requestinfo h3 { position:relative; margin-left:-100px; }
+    #requestinfo h3 { margin-bottom:-1em; }
+    .error { background: #ffc; }
+    .specific { color:#cc3300; font-weight:bold; }
+    h2 span.commands { font-size:.7em;}
+    span.commands a:link {color:#5E5694;}
+    pre.exception_value { font-family: sans-serif; color: #666; font-size: 1.5em; margin: 10px 0 10px 0; }
+  </style>
+  <script type="text/javascript">
+  //<!--
+    function getElementsByClassName(oElm, strTagName, strClassName){
+        // Written by Jonathan Snook, http://www.snook.ca/jon; Add-ons by Robert Nyman, http://www.robertnyman.com
+        var arrElements = (strTagName == "*" && document.all)? document.all :
+        oElm.getElementsByTagName(strTagName);
+        var arrReturnElements = new Array();
+        strClassName = strClassName.replace(/\-/g, "\\-");
+        var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
+        var oElement;
+        for(var i=0; i<arrElements.length; i++){
+            oElement = arrElements[i];
+            if(oRegExp.test(oElement.className)){
+                arrReturnElements.push(oElement);
+            }
+        }
+        return (arrReturnElements)
+    }
+    function hideAll(elems) {
+      for (var e = 0; e < elems.length; e++) {
+        elems[e].style.display = 'none';
+      }
+    }
+    window.onload = function() {
+      hideAll(getElementsByClassName(document, 'table', 'vars'));
+      hideAll(getElementsByClassName(document, 'ol', 'pre-context'));
+      hideAll(getElementsByClassName(document, 'ol', 'post-context'));
+      hideAll(getElementsByClassName(document, 'div', 'pastebin'));
+    }
+    function toggle() {
+      for (var i = 0; i < arguments.length; i++) {
+        var e = document.getElementById(arguments[i]);
+        if (e) {
+          e.style.display = e.style.display == 'none' ? 'block' : 'none';
+        }
+      }
+      return false;
+    }
+    function varToggle(link, id) {
+      toggle('v' + id);
+      var s = link.getElementsByTagName('span')[0];
+      var uarr = String.fromCharCode(0x25b6);
+      var darr = String.fromCharCode(0x25bc);
+      s.innerHTML = s.innerHTML == uarr ? darr : uarr;
+      return false;
+    }
+    function switchPastebinFriendly(link) {
+      s1 = "Switch to copy-and-paste view";
+      s2 = "Switch back to interactive view";
+      link.innerHTML = link.innerHTML == s1 ? s2 : s1;
+      toggle('browserTraceback', 'pastebinTraceback');
+      return false;
+    }
+    //-->
+  </script>
+</head>
+<body>
+<div id="summary">
+  <h1>{{ exception_type }} at {{ request.path|escape }}</h1>
+  <pre class="exception_value">{{ exception_value|escape }}</pre>
+  <table class="meta">
+    <tr>
+      <th>Request Method:</th>
+      <td>{{ request.META.REQUEST_METHOD }}</td>
+    </tr>
+    <tr>
+      <th>Request URL:</th>
+      <td>{{ request_protocol }}://{{ request.META.HTTP_HOST }}{{ request.path|escape }}</td>
+    </tr>
+    <tr>
+      <th>Exception Type:</th>
+      <td>{{ exception_type }}</td>
+    </tr>
+    <tr>
+      <th>Exception Value:</th>
+      <td><pre>{{ exception_value|escape }}<pre></td>
+    </tr>
+    <tr>
+      <th>Exception Location:</th>
+      <td>{{ lastframe.filename|escape }} in {{ lastframe.function|escape }}, line {{ lastframe.lineno }}</td>
+    </tr>
+    <tr>
+      <th>Python Executable:</th>
+      <td>{{ sys_executable|escape }}</td>
+    </tr>
+    <tr>
+      <th>Python Version:</th>
+      <td>{{ sys_version_info }}</td>
+    </tr>
+    <tr>
+      <th>Python Path:</th>
+      <td>{{ sys_path }}</td>
+    </tr>
+    <tr>
+      <th>Server time:</th>
+      <td>{{server_time|date:"r"}}</td>
+    </tr>
+  </table>
+</div>
+{% if unicode_hint %}
+<div id="unicode-hint">
+    <h2>Unicode error hint</h2>
+    <p>The string that could not be encoded/decoded was: <strong>{{ unicode_hint|escape }}</strong></p>
+</div>
+{% endif %}
+{% if template_does_not_exist %}
+<div id="template-not-exist">
+    <h2>Template-loader postmortem</h2>
+    {% if loader_debug_info %}
+        <p>Django tried loading these templates, in this order:</p>
+        <ul>
+        {% for loader in loader_debug_info %}
+            <li>Using loader <code>{{ loader.loader }}</code>:
+                <ul>{% for t in loader.templates %}<li><code>{{ t.name }}</code> (File {% if t.exists %}exists{% else %}does not exist{% endif %})</li>{% endfor %}</ul>
+            </li>
+        {% endfor %}
+        </ul>
+    {% else %}
+        <p>Django couldn't find any templates because your <code>TEMPLATE_LOADERS</code> setting is empty!</p>
+    {% endif %}
+</div>
+{% endif %}
+{% if template_info %}
+<div id="template">
+   <h2>Template error</h2>
+   <p>In template <code>{{ template_info.name }}</code>, error at line <strong>{{ template_info.line }}</strong></p>
+   <h3>{{ template_info.message }}</h3>
+   <table class="source{% if template_info.top %} cut-top{% endif %}{% ifnotequal template_info.bottom template_info.total %} cut-bottom{% endifnotequal %}">
+   {% for source_line in template_info.source_lines %}
+   {% ifequal source_line.0 template_info.line %}
+       <tr class="error"><th>{{ source_line.0 }}</th>
+       <td>{{ template_info.before }}<span class="specific">{{ template_info.during }}</span>{{ template_info.after }}</td></tr>
+   {% else %}
+      <tr><th>{{ source_line.0 }}</th>
+      <td>{{ source_line.1 }}</td></tr>
+   {% endifequal %}
+   {% endfor %}
+   </table>
+</div>
+{% endif %}
+<div id="traceback">
+  <h2>Traceback <span class="commands"><a href="#" onclick="return switchPastebinFriendly(this);">Switch to copy-and-paste view</a></span></h2>
+  {% autoescape off %}
+  <div id="browserTraceback">
+    <ul class="traceback">
+      {% for frame in frames %}
+        <li class="frame">
+          <code>{{ frame.filename|escape }}</code> in <code>{{ frame.function|escape }}</code>
+
+          {% if frame.context_line %}
+            <div class="context" id="c{{ frame.id }}">
+              {% if frame.pre_context %}
+                <ol start="{{ frame.pre_context_lineno }}" class="pre-context" id="pre{{ frame.id }}">{% for line in frame.pre_context %}<li onclick="toggle('pre{{ frame.id }}', 'post{{ frame.id }}')">{{ line|escape }}</li>{% endfor %}</ol>
+              {% endif %}
+              <ol start="{{ frame.lineno }}" class="context-line"><li onclick="toggle('pre{{ frame.id }}', 'post{{ frame.id }}')">{{ frame.context_line|escape }} <span>...</span></li></ol>
+              {% if frame.post_context %}
+                <ol start='{{ frame.lineno|add:"1" }}' class="post-context" id="post{{ frame.id }}">{% for line in frame.post_context %}<li onclick="toggle('pre{{ frame.id }}', 'post{{ frame.id }}')">{{ line|escape }}</li>{% endfor %}</ol>
+              {% endif %}
+            </div>
+          {% endif %}
+
+          {% if frame.vars %}
+            <div class="commands">
+                <a href="#" onclick="return varToggle(this, '{{ frame.id }}')"><span>&#x25b6;</span> Local vars</a>
+            </div>
+            <table class="vars" id="v{{ frame.id }}">
+              <thead>
+                <tr>
+                  <th>Variable</th>
+                  <th>Value</th>
+                </tr>
+              </thead>
+              <tbody>
+                {% for var in frame.vars|dictsort:"0" %}
+                  <tr>
+                    <td>{{ var.0|escape }}</td>
+                    <td class="code"><div>{{ var.1|pprint|escape }}</div></td>
+                  </tr>
+                {% endfor %}
+              </tbody>
+            </table>
+          {% endif %}
+        </li>
+      {% endfor %}
+    </ul>
+  </div>
+  {% endautoescape %}
+  <form action="http://dpaste.com/" name="pasteform" id="pasteform" method="post">
+  <div id="pastebinTraceback" class="pastebin">
+    <input type="hidden" name="language" value="PythonConsole">
+    <input type="hidden" name="title" value="{{ exception_type|escape }} at {{ request.path|escape }}">
+    <input type="hidden" name="source" value="Django Dpaste Agent">
+    <input type="hidden" name="poster" value="Django">
+    <textarea name="content" id="traceback_area" cols="140" rows="25">
+Environment:
+
+Request Method: {{ request.META.REQUEST_METHOD }}
+Request URL: {{ request_protocol }}://{{ request.META.HTTP_HOST }}{{ request.path|escape }}
+Django Version: {{ django_version_info }}
+Python Version: {{ sys_version_info }}
+Installed Applications:
+{{ settings.INSTALLED_APPS|pprint }}
+Installed Middleware:
+{{ settings.MIDDLEWARE_CLASSES|pprint }}
+
+{% if template_does_not_exist %}Template Loader Error:
+{% if loader_debug_info %}Django tried loading these templates, in this order:
+{% for loader in loader_debug_info %}Using loader {{ loader.loader }}:
+{% for t in loader.templates %}{{ t.name }} (File {% if t.exists %}exists{% else %}does not exist{% endif %})
+{% endfor %}{% endfor %}
+{% else %}Django couldn't find any templates because your TEMPLATE_LOADERS setting is empty!
+{% endif %}
+{% endif %}{% if template_info %}
+Template error:
+In template {{ template_info.name }}, error at line {{ template_info.line }}
+   {{ template_info.message }}{% for source_line in template_info.source_lines %}{% ifequal source_line.0 template_info.line %}
+   {{ source_line.0 }} : {{ template_info.before }} {{ template_info.during }} {{ template_info.after }}
+{% else %}
+   {{ source_line.0 }} : {{ source_line.1 }}
+{% endifequal %}{% endfor %}{% endif %}
+Traceback:
+{% for frame in frames %}File "{{ frame.filename|escape }}" in {{ frame.function|escape }}
+{% if frame.context_line %}  {{ frame.lineno }}. {{ frame.context_line|escape }}{% endif %}
+{% endfor %}
+Exception Type: {{ exception_type|escape }} at {{ request.path|escape }}
+Exception Value: {{ exception_value|escape }}
+</textarea>
+  <br><br>
+  <input type="submit" value="Share this traceback on a public Web site">
+  </div>
+</form>
+</div>
+
+<div id="requestinfo">
+  <h2>Request information</h2>
+
+  <h3 id="get-info">GET</h3>
+  {% if request.GET %}
+    <table class="req">
+      <thead>
+        <tr>
+          <th>Variable</th>
+          <th>Value</th>
+        </tr>
+      </thead>
+      <tbody>
+        {% for var in request.GET.items %}
+          <tr>
+            <td>{{ var.0 }}</td>
+            <td class="code"><div>{{ var.1|pprint }}</div></td>
+          </tr>
+        {% endfor %}
+      </tbody>
+    </table>
+  {% else %}
+    <p>No GET data</p>
+  {% endif %}
+
+  <h3 id="post-info">POST</h3>
+  {% if request.POST %}
+    <table class="req">
+      <thead>
+        <tr>
+          <th>Variable</th>
+          <th>Value</th>
+        </tr>
+      </thead>
+      <tbody>
+        {% for var in request.POST.items %}
+          <tr>
+            <td>{{ var.0 }}</td>
+            <td class="code"><div>{{ var.1|pprint }}</div></td>
+          </tr>
+        {% endfor %}
+      </tbody>
+    </table>
+  {% else %}
+    <p>No POST data</p>
+  {% endif %}
+
+  <h3 id="cookie-info">COOKIES</h3>
+  {% if request.COOKIES %}
+    <table class="req">
+      <thead>
+        <tr>
+          <th>Variable</th>
+          <th>Value</th>
+        </tr>
+      </thead>
+      <tbody>
+        {% for var in request.COOKIES.items %}
+          <tr>
+            <td>{{ var.0 }}</td>
+            <td class="code"><div>{{ var.1|pprint }}</div></td>
+          </tr>
+        {% endfor %}
+      </tbody>
+    </table>
+  {% else %}
+    <p>No cookie data</p>
+  {% endif %}
+
+  <h3 id="meta-info">META</h3>
+  <table class="req">
+    <thead>
+      <tr>
+        <th>Variable</th>
+        <th>Value</th>
+      </tr>
+    </thead>
+    <tbody>
+      {% for var in request.META.items|dictsort:"0" %}
+        <tr>
+          <td>{{ var.0 }}</td>
+          <td class="code"><div>{{ var.1|pprint }}</div></td>
+        </tr>
+      {% endfor %}
+    </tbody>
+  </table>
+
+  <h3 id="settings-info">Settings</h3>
+  <h4>Using settings module <code>{{ settings.SETTINGS_MODULE }}</code></h4>
+  <table class="req">
+    <thead>
+      <tr>
+        <th>Setting</th>
+        <th>Value</th>
+      </tr>
+    </thead>
+    <tbody>
+      {% for var in settings.items|dictsort:"0" %}
+        <tr>
+          <td>{{ var.0 }}</td>
+          <td class="code"><div>{{ var.1|pprint }}</div></td>
+        </tr>
+      {% endfor %}
+    </tbody>
+  </table>
+
+</div>
+
+<div id="explanation">
+  <p>
+    You're seeing this error because you have <code>DEBUG = True</code> in your
+    Django settings file. Change that to <code>False</code>, and Django will
+    display a standard 500 page.
+  </p>
+</div>
+</body>
+</html>
+"""
+
+TECHNICAL_404_TEMPLATE = """
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html lang="en">
+<head>
+  <meta http-equiv="content-type" content="text/html; charset=utf-8">
+  <title>Page not found at {{ request.path|escape }}</title>
+  <meta name="robots" content="NONE,NOARCHIVE">
+  <style type="text/css">
+    html * { padding:0; margin:0; }
+    body * { padding:10px 20px; }
+    body * * { padding:0; }
+    body { font:small sans-serif; background:#eee; }
+    body>div { border-bottom:1px solid #ddd; }
+    h1 { font-weight:normal; margin-bottom:.4em; }
+    h1 span { font-size:60%; color:#666; font-weight:normal; }
+    table { border:none; border-collapse: collapse; width:100%; }
+    td, th { vertical-align:top; padding:2px 3px; }
+    th { width:12em; text-align:right; color:#666; padding-right:.5em; }
+    #info { background:#f6f6f6; }
+    #info ol { margin: 0.5em 4em; }
+    #info ol li { font-family: monospace; }
+    #summary { background: #ffc; }
+    #explanation { background:#eee; border-bottom: 0px none; }
+  </style>
+</head>
+<body>
+  <div id="summary">
+    <h1>Page not found <span>(404)</span></h1>
+    <table class="meta">
+      <tr>
+        <th>Request Method:</th>
+        <td>{{ request.META.REQUEST_METHOD }}</td>
+      </tr>
+      <tr>
+        <th>Request URL:</th>
+      <td>{{ request_protocol }}://{{ request.META.HTTP_HOST }}{{ request.path|escape }}</td>
+      </tr>
+    </table>
+  </div>
+  <div id="info">
+    {% if urlpatterns %}
+      <p>
+      Using the URLconf defined in <code>{{ settings.ROOT_URLCONF }}</code>,
+      Django tried these URL patterns, in this order:
+      </p>
+      <ol>
+        {% for pattern in urlpatterns %}
+          <li>{{ pattern }}</li>
+        {% endfor %}
+      </ol>
+      <p>The current URL, <code>{{ request_path|escape }}</code>, didn't match any of these.</p>
+    {% else %}
+      <p>{{ reason }}</p>
+    {% endif %}
+  </div>
+
+  <div id="explanation">
+    <p>
+      You're seeing this error because you have <code>DEBUG = True</code> in
+      your Django settings file. Change that to <code>False</code>, and Django
+      will display a standard 404 page.
+    </p>
+  </div>
+</body>
+</html>
+"""
+
+EMPTY_URLCONF_TEMPLATE = """
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html lang="en"><head>
+  <meta http-equiv="content-type" content="text/html; charset=utf-8">
+  <meta name="robots" content="NONE,NOARCHIVE"><title>Welcome to Django</title>
+  <style type="text/css">
+    html * { padding:0; margin:0; }
+    body * { padding:10px 20px; }
+    body * * { padding:0; }
+    body { font:small sans-serif; }
+    body>div { border-bottom:1px solid #ddd; }
+    h1 { font-weight:normal; }
+    h2 { margin-bottom:.8em; }
+    h2 span { font-size:80%; color:#666; font-weight:normal; }
+    h3 { margin:1em 0 .5em 0; }
+    h4 { margin:0 0 .5em 0; font-weight: normal; }
+    table { border:1px solid #ccc; border-collapse: collapse; width:100%; background:white; }
+    tbody td, tbody th { vertical-align:top; padding:2px 3px; }
+    thead th { padding:1px 6px 1px 3px; background:#fefefe; text-align:left; font-weight:normal; font-size:11px; border:1px solid #ddd; }
+    tbody th { width:12em; text-align:right; color:#666; padding-right:.5em; }
+    ul { margin-left: 2em; margin-top: 1em; }
+    #summary { background: #e0ebff; }
+    #summary h2 { font-weight: normal; color: #666; }
+    #explanation { background:#eee; }
+    #instructions { background:#f6f6f6; }
+    #summary table { border:none; background:transparent; }
+  </style>
+</head>
+
+<body>
+<div id="summary">
+  <h1>It worked!</h1>
+  <h2>Congratulations on your first Django-powered page.</h2>
+</div>
+
+<div id="instructions">
+  <p>Of course, you haven't actually done any work yet. Here's what to do next:</p>
+  <ul>
+    <li>If you plan to use a database, edit the <code>DATABASE_*</code> settings in <code>{{ project_name }}/settings.py</code>.</li>
+    <li>Start your first app by running <code>python {{ project_name }}/manage.py startapp [appname]</code>.</li>
+  </ul>
+</div>
+
+<div id="explanation">
+  <p>
+    You're seeing this message because you have <code>DEBUG = True</code> in your
+    Django settings file and you haven't configured any URLs. Get to work!
+  </p>
+</div>
+</body></html>
+"""
diff --git a/webapp/django/views/decorators/__init__.py b/webapp/django/views/decorators/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/django/views/decorators/__init__.py
diff --git a/webapp/django/views/decorators/cache.py b/webapp/django/views/decorators/cache.py
new file mode 100644
index 0000000..8b620c1
--- /dev/null
+++ b/webapp/django/views/decorators/cache.py
@@ -0,0 +1,47 @@
+"""
+Decorator for views that tries getting the page from the cache and
+populates the cache if the page isn't in the cache yet.
+
+The cache is keyed by the URL and some data from the headers. Additionally
+there is the key prefix that is used to distinguish different cache areas
+in a multi-site setup. You could use the sites.get_current().domain, for
+example, as that is unique across a Django project.
+
+Additionally, all headers from the response's Vary header will be taken into
+account on caching -- just like the middleware does.
+"""
+
+try:
+    from functools import wraps
+except ImportError:
+    from django.utils.functional import wraps  # Python 2.3, 2.4 fallback.
+
+from django.utils.decorators import decorator_from_middleware
+from django.utils.cache import patch_cache_control, add_never_cache_headers
+from django.middleware.cache import CacheMiddleware
+
+cache_page = decorator_from_middleware(CacheMiddleware)
+
+def cache_control(**kwargs):
+
+    def _cache_controller(viewfunc):
+
+        def _cache_controlled(request, *args, **kw):
+            response = viewfunc(request, *args, **kw)
+            patch_cache_control(response, **kwargs)
+            return response
+
+        return wraps(viewfunc)(_cache_controlled)
+
+    return _cache_controller
+
+def never_cache(view_func):
+    """
+    Decorator that adds headers to a response so that it will
+    never be cached.
+    """
+    def _wrapped_view_func(request, *args, **kwargs):
+        response = view_func(request, *args, **kwargs)
+        add_never_cache_headers(response)
+        return response
+    return wraps(view_func)(_wrapped_view_func)
diff --git a/webapp/django/views/decorators/gzip.py b/webapp/django/views/decorators/gzip.py
new file mode 100644
index 0000000..dc6edad
--- /dev/null
+++ b/webapp/django/views/decorators/gzip.py
@@ -0,0 +1,6 @@
+"Decorator for views that gzips pages if the client supports it."
+
+from django.utils.decorators import decorator_from_middleware
+from django.middleware.gzip import GZipMiddleware
+
+gzip_page = decorator_from_middleware(GZipMiddleware)
diff --git a/webapp/django/views/decorators/http.py b/webapp/django/views/decorators/http.py
new file mode 100644
index 0000000..dd4f90e
--- /dev/null
+++ b/webapp/django/views/decorators/http.py
@@ -0,0 +1,39 @@
+"""
+Decorators for views based on HTTP headers.
+"""
+
+try:
+    from functools import wraps
+except ImportError:
+    from django.utils.functional import wraps  # Python 2.3, 2.4 fallback.
+
+from django.utils.decorators import decorator_from_middleware
+from django.middleware.http import ConditionalGetMiddleware
+from django.http import HttpResponseNotAllowed
+
+conditional_page = decorator_from_middleware(ConditionalGetMiddleware)
+
+def require_http_methods(request_method_list):
+    """
+    Decorator to make a view only accept particular request methods.  Usage::
+
+        @require_http_methods(["GET", "POST"])
+        def my_view(request):
+            # I can assume now that only GET or POST requests make it this far
+            # ...
+
+    Note that request methods should be in uppercase.
+    """
+    def decorator(func):
+        def inner(request, *args, **kwargs):
+            if request.method not in request_method_list:
+                return HttpResponseNotAllowed(request_method_list)
+            return func(request, *args, **kwargs)
+        return wraps(func)(inner)
+    return decorator
+
+require_GET = require_http_methods(["GET"])
+require_GET.__doc__ = "Decorator to require that a view only accept the GET method."
+
+require_POST = require_http_methods(["POST"])
+require_POST.__doc__ = "Decorator to require that a view only accept the POST method."
\ No newline at end of file
diff --git a/webapp/django/views/decorators/vary.py b/webapp/django/views/decorators/vary.py
new file mode 100644
index 0000000..ea1b8d3
--- /dev/null
+++ b/webapp/django/views/decorators/vary.py
@@ -0,0 +1,40 @@
+try:
+    from functools import wraps
+except ImportError:
+    from django.utils.functional import wraps  # Python 2.3, 2.4 fallback.
+
+from django.utils.cache import patch_vary_headers
+
+def vary_on_headers(*headers):
+    """
+    A view decorator that adds the specified headers to the Vary header of the
+    response. Usage:
+
+       @vary_on_headers('Cookie', 'Accept-language')
+       def index(request):
+           ...
+
+    Note that the header names are not case-sensitive.
+    """
+    def decorator(func):
+        def inner_func(*args, **kwargs):
+            response = func(*args, **kwargs)
+            patch_vary_headers(response, headers)
+            return response
+        return wraps(func)(inner_func)
+    return decorator
+
+def vary_on_cookie(func):
+    """
+    A view decorator that adds "Cookie" to the Vary header of a response. This
+    indicates that a page's contents depends on cookies. Usage:
+
+        @vary_on_cookie
+        def index(request):
+            ...
+    """
+    def inner_func(*args, **kwargs):
+        response = func(*args, **kwargs)
+        patch_vary_headers(response, ('Cookie',))
+        return response
+    return wraps(func)(inner_func)
diff --git a/webapp/django/views/defaults.py b/webapp/django/views/defaults.py
new file mode 100644
index 0000000..8a8fa47
--- /dev/null
+++ b/webapp/django/views/defaults.py
@@ -0,0 +1,89 @@
+from django.core.exceptions import ObjectDoesNotExist
+from django.template import Context, RequestContext, loader
+from django.contrib.contenttypes.models import ContentType
+from django.contrib.sites.models import Site
+from django import http
+
+def shortcut(request, content_type_id, object_id):
+    "Redirect to an object's page based on a content-type ID and an object ID."
+    # Look up the object, making sure it's got a get_absolute_url() function.
+    try:
+        content_type = ContentType.objects.get(pk=content_type_id)
+        obj = content_type.get_object_for_this_type(pk=object_id)
+    except ObjectDoesNotExist:
+        raise http.Http404, "Content type %s object %s doesn't exist" % (content_type_id, object_id)
+    try:
+        absurl = obj.get_absolute_url()
+    except AttributeError:
+        raise http.Http404, "%s objects don't have get_absolute_url() methods" % content_type.name
+
+    # Try to figure out the object's domain, so we can do a cross-site redirect
+    # if necessary.
+
+    # If the object actually defines a domain, we're done.
+    if absurl.startswith('http://') or absurl.startswith('https://'):
+        return http.HttpResponseRedirect(absurl)
+
+    object_domain = None
+
+    # Otherwise, we need to introspect the object's relationships for a
+    # relation to the Site object
+    opts = obj._meta
+
+    # First, look for an many-to-many relationship to sites
+    for field in opts.many_to_many:
+        if field.rel.to is Site:
+            try:
+                object_domain = getattr(obj, field.name).all()[0].domain
+            except IndexError:
+                pass
+            if object_domain is not None:
+                break
+
+    # Next look for a many-to-one relationship to site
+    if object_domain is None:
+        for field in obj._meta.fields:
+            if field.rel and field.rel.to is Site:
+                try:
+                    object_domain = getattr(obj, field.name).domain
+                except Site.DoesNotExist:
+                    pass
+                if object_domain is not None:
+                    break
+
+    # Fall back to the current site (if possible)
+    if object_domain is None:
+        try:
+            object_domain = Site.objects.get_current().domain
+        except Site.DoesNotExist:
+            pass
+
+    # If all that malarkey found an object domain, use it; otherwise fall back
+    # to whatever get_absolute_url() returned.
+    if object_domain is not None:
+        protocol = request.is_secure() and 'https' or 'http'
+        return http.HttpResponseRedirect('%s://%s%s' % (protocol, object_domain, absurl))
+    else:
+        return http.HttpResponseRedirect(absurl)
+
+def page_not_found(request, template_name='404.html'):
+    """
+    Default 404 handler.
+
+    Templates: `404.html`
+    Context:
+        request_path
+            The path of the requested URL (e.g., '/app/pages/bad_page/')
+    """
+    t = loader.get_template(template_name) # You need to create a 404.html template.
+    return http.HttpResponseNotFound(t.render(RequestContext(request, {'request_path': request.path})))
+
+def server_error(request, template_name='500.html'):
+    """
+    500 error handler.
+
+    Templates: `500.html`
+    Context: None
+    """
+    t = loader.get_template(template_name) # You need to create a 500.html template.
+    return http.HttpResponseServerError(t.render(Context({})))
diff --git a/webapp/django/views/generic/__init__.py b/webapp/django/views/generic/__init__.py
new file mode 100644
index 0000000..95c5fa9
--- /dev/null
+++ b/webapp/django/views/generic/__init__.py
@@ -0,0 +1,3 @@
+class GenericViewError(Exception):
+    """A problem in a generic view."""
+    pass
diff --git a/webapp/django/views/generic/create_update.py b/webapp/django/views/generic/create_update.py
new file mode 100644
index 0000000..634fb1b
--- /dev/null
+++ b/webapp/django/views/generic/create_update.py
@@ -0,0 +1,210 @@
+from django.forms.models import ModelFormMetaclass, ModelForm
+from django.template import RequestContext, loader
+from django.http import Http404, HttpResponse, HttpResponseRedirect
+from django.core.xheaders import populate_xheaders
+from django.core.exceptions import ObjectDoesNotExist, ImproperlyConfigured
+from django.utils.translation import ugettext
+from django.contrib.auth.views import redirect_to_login
+from django.views.generic import GenericViewError
+
+
+def apply_extra_context(extra_context, context):
+    """
+    Adds items from extra_context dict to context.  If a value in extra_context
+    is callable, then it is called and the result is added to context.
+    """
+    for key, value in extra_context.iteritems():
+        if callable(value):
+            context[key] = value()
+        else:
+            context[key] = value
+
+def get_model_and_form_class(model, form_class):
+    """
+    Returns a model and form class based on the model and form_class
+    parameters that were passed to the generic view.
+
+    If ``form_class`` is given then its associated model will be returned along
+    with ``form_class`` itself.  Otherwise, if ``model`` is given, ``model``
+    itself will be returned along with a ``ModelForm`` class created from
+    ``model``.
+    """
+    if form_class:
+        return form_class._meta.model, form_class
+    if model:
+        # The inner Meta class fails if model = model is used for some reason.
+        tmp_model = model
+        # TODO: we should be able to construct a ModelForm without creating
+        # and passing in a temporary inner class.
+        class Meta:
+            model = tmp_model
+        class_name = model.__name__ + 'Form'
+        form_class = ModelFormMetaclass(class_name, (ModelForm,), {'Meta': Meta})
+        return model, form_class
+    raise GenericViewError("Generic view must be called with either a model or"
+                           " form_class argument.")
+
+def redirect(post_save_redirect, obj):
+    """
+    Returns a HttpResponseRedirect to ``post_save_redirect``.
+
+    ``post_save_redirect`` should be a string, and can contain named string-
+    substitution place holders of ``obj`` field names.
+
+    If ``post_save_redirect`` is None, then redirect to ``obj``'s URL returned
+    by ``get_absolute_url()``.  If ``obj`` has no ``get_absolute_url`` method,
+    then raise ImproperlyConfigured.
+
+    This function is meant to handle the post_save_redirect parameter to the
+    ``create_object`` and ``update_object`` views.
+    """
+    if post_save_redirect:
+        return HttpResponseRedirect(post_save_redirect % obj.__dict__)
+    elif hasattr(obj, 'get_absolute_url'):
+        return HttpResponseRedirect(obj.get_absolute_url())
+    else:
+        raise ImproperlyConfigured(
+            "No URL to redirect to.  Either pass a post_save_redirect"
+            " parameter to the generic view or define a get_absolute_url"
+            " method on the Model.")
+
+def lookup_object(model, object_id, slug, slug_field):
+    """
+    Return the ``model`` object with the passed ``object_id``.  If
+    ``object_id`` is None, then return the the object whose ``slug_field``
+    equals the passed ``slug``.  If ``slug`` and ``slug_field`` are not passed,
+    then raise Http404 exception.
+    """
+    lookup_kwargs = {}
+    if object_id:
+        lookup_kwargs['%s__exact' % model._meta.pk.name] = object_id
+    elif slug and slug_field:
+        lookup_kwargs['%s__exact' % slug_field] = slug
+    else:
+        raise GenericViewError(
+            "Generic view must be called with either an object_id or a"
+            " slug/slug_field.")
+    try:
+        return model.objects.get(**lookup_kwargs)
+    except ObjectDoesNotExist:
+        raise Http404("No %s found for %s"
+                      % (model._meta.verbose_name, lookup_kwargs))
+
+def create_object(request, model=None, template_name=None,
+        template_loader=loader, extra_context=None, post_save_redirect=None,
+        login_required=False, context_processors=None, form_class=None):
+    """
+    Generic object-creation function.
+
+    Templates: ``<app_label>/<model_name>_form.html``
+    Context:
+        form
+            the form for the object
+    """
+    if extra_context is None: extra_context = {}
+    if login_required and not request.user.is_authenticated():
+        return redirect_to_login(request.path)
+
+    model, form_class = get_model_and_form_class(model, form_class)
+    if request.method == 'POST':
+        form = form_class(request.POST, request.FILES)
+        if form.is_valid():
+            new_object = form.save()
+            if request.user.is_authenticated():
+                request.user.message_set.create(message=ugettext("The %(verbose_name)s was created successfully.") % {"verbose_name": model._meta.verbose_name})
+            return redirect(post_save_redirect, new_object)
+    else:
+        form = form_class()
+
+    # Create the template, context, response
+    if not template_name:
+        template_name = "%s/%s_form.html" % (model._meta.app_label, model._meta.object_name.lower())
+    t = template_loader.get_template(template_name)
+    c = RequestContext(request, {
+        'form': form,
+    }, context_processors)
+    apply_extra_context(extra_context, c)
+    return HttpResponse(t.render(c))
+
+def update_object(request, model=None, object_id=None, slug=None,
+        slug_field='slug', template_name=None, template_loader=loader,
+        extra_context=None, post_save_redirect=None, login_required=False,
+        context_processors=None, template_object_name='object',
+        form_class=None):
+    """
+    Generic object-update function.
+
+    Templates: ``<app_label>/<model_name>_form.html``
+    Context:
+        form
+            the form for the object
+        object
+            the original object being edited
+    """
+    if extra_context is None: extra_context = {}
+    if login_required and not request.user.is_authenticated():
+        return redirect_to_login(request.path)
+
+    model, form_class = get_model_and_form_class(model, form_class)
+    obj = lookup_object(model, object_id, slug, slug_field)
+
+    if request.method == 'POST':
+        form = form_class(request.POST, request.FILES, instance=obj)
+        if form.is_valid():
+            obj = form.save()
+            if request.user.is_authenticated():
+                request.user.message_set.create(message=ugettext("The %(verbose_name)s was updated successfully.") % {"verbose_name": model._meta.verbose_name})
+            return redirect(post_save_redirect, obj)
+    else:
+        form = form_class(instance=obj)
+
+    if not template_name:
+        template_name = "%s/%s_form.html" % (model._meta.app_label, model._meta.object_name.lower())
+    t = template_loader.get_template(template_name)
+    c = RequestContext(request, {
+        'form': form,
+        template_object_name: obj,
+    }, context_processors)
+    apply_extra_context(extra_context, c)
+    response = HttpResponse(t.render(c))
+    populate_xheaders(request, response, model, getattr(obj, obj._meta.pk.attname))
+    return response
+
+def delete_object(request, model, post_delete_redirect, object_id=None,
+        slug=None, slug_field='slug', template_name=None,
+        template_loader=loader, extra_context=None, login_required=False,
+        context_processors=None, template_object_name='object'):
+    """
+    Generic object-delete function.
+
+    The given template will be used to confirm deletetion if this view is
+    fetched using GET; for safty, deletion will only be performed if this
+    view is POSTed.
+
+    Templates: ``<app_label>/<model_name>_confirm_delete.html``
+    Context:
+        object
+            the original object being deleted
+    """
+    if extra_context is None: extra_context = {}
+    if login_required and not request.user.is_authenticated():
+        return redirect_to_login(request.path)
+
+    obj = lookup_object(model, object_id, slug, slug_field)
+
+    if request.method == 'POST':
+        obj.delete()
+        if request.user.is_authenticated():
+            request.user.message_set.create(message=ugettext("The %(verbose_name)s was deleted.") % {"verbose_name": model._meta.verbose_name})
+        return HttpResponseRedirect(post_delete_redirect)
+    else:
+        if not template_name:
+            template_name = "%s/%s_confirm_delete.html" % (model._meta.app_label, model._meta.object_name.lower())
+        t = template_loader.get_template(template_name)
+        c = RequestContext(request, {
+            template_object_name: obj,
+        }, context_processors)
+        apply_extra_context(extra_context, c)
+        response = HttpResponse(t.render(c))
+        populate_xheaders(request, response, model, getattr(obj, obj._meta.pk.attname))
+        return response
diff --git a/webapp/django/views/generic/date_based.py b/webapp/django/views/generic/date_based.py
new file mode 100644
index 0000000..c5f1748
--- /dev/null
+++ b/webapp/django/views/generic/date_based.py
@@ -0,0 +1,352 @@
+import datetime
+import time
+
+from django.template import loader, RequestContext
+from django.core.exceptions import ObjectDoesNotExist
+from django.core.xheaders import populate_xheaders
+from django.db.models.fields import DateTimeField
+from django.http import Http404, HttpResponse
+
+def archive_index(request, queryset, date_field, num_latest=15,
+        template_name=None, template_loader=loader,
+        extra_context=None, allow_empty=True, context_processors=None,
+        mimetype=None, allow_future=False, template_object_name='latest'):
+    """
+    Generic top-level archive of date-based objects.
+
+    Templates: ``<app_label>/<model_name>_archive.html``
+    Context:
+        date_list
+            List of years
+        latest
+            Latest N (defaults to 15) objects by date
+    """
+    if extra_context is None: extra_context = {}
+    model = queryset.model
+    if not allow_future:
+        queryset = queryset.filter(**{'%s__lte' % date_field: datetime.datetime.now()})
+    date_list = queryset.dates(date_field, 'year')[::-1]
+    if not date_list and not allow_empty:
+        raise Http404, "No %s available" % model._meta.verbose_name
+
+    if date_list and num_latest:
+        latest = queryset.order_by('-'+date_field)[:num_latest]
+    else:
+        latest = None
+
+    if not template_name:
+        template_name = "%s/%s_archive.html" % (model._meta.app_label, model._meta.object_name.lower())
+    t = template_loader.get_template(template_name)
+    c = RequestContext(request, {
+        'date_list' : date_list,
+        template_object_name : latest,
+    }, context_processors)
+    for key, value in extra_context.items():
+        if callable(value):
+            c[key] = value()
+        else:
+            c[key] = value
+    return HttpResponse(t.render(c), mimetype=mimetype)
+
+def archive_year(request, year, queryset, date_field, template_name=None,
+        template_loader=loader, extra_context=None, allow_empty=False,
+        context_processors=None, template_object_name='object', mimetype=None,
+        make_object_list=False, allow_future=False):
+    """
+    Generic yearly archive view.
+
+    Templates: ``<app_label>/<model_name>_archive_year.html``
+    Context:
+        date_list
+            List of months in this year with objects
+        year
+            This year
+        object_list
+            List of objects published in the given month
+            (Only available if make_object_list argument is True)
+    """
+    if extra_context is None: extra_context = {}
+    model = queryset.model
+    now = datetime.datetime.now()
+
+    lookup_kwargs = {'%s__year' % date_field: year}
+
+    # Only bother to check current date if the year isn't in the past and future objects aren't requested.
+    if int(year) >= now.year and not allow_future:
+        lookup_kwargs['%s__lte' % date_field] = now
+    date_list = queryset.filter(**lookup_kwargs).dates(date_field, 'month')
+    if not date_list and not allow_empty:
+        raise Http404
+    if make_object_list:
+        object_list = queryset.filter(**lookup_kwargs)
+    else:
+        object_list = []
+    if not template_name:
+        template_name = "%s/%s_archive_year.html" % (model._meta.app_label, model._meta.object_name.lower())
+    t = template_loader.get_template(template_name)
+    c = RequestContext(request, {
+        'date_list': date_list,
+        'year': year,
+        '%s_list' % template_object_name: object_list,
+    }, context_processors)
+    for key, value in extra_context.items():
+        if callable(value):
+            c[key] = value()
+        else:
+            c[key] = value
+    return HttpResponse(t.render(c), mimetype=mimetype)
+
+def archive_month(request, year, month, queryset, date_field,
+        month_format='%b', template_name=None, template_loader=loader,
+        extra_context=None, allow_empty=False, context_processors=None,
+        template_object_name='object', mimetype=None, allow_future=False):
+    """
+    Generic monthly archive view.
+
+    Templates: ``<app_label>/<model_name>_archive_month.html``
+    Context:
+        month:
+            (date) this month
+        next_month:
+            (date) the first day of the next month, or None if the next month is in the future
+        previous_month:
+            (date) the first day of the previous month
+        object_list:
+            list of objects published in the given month
+    """
+    if extra_context is None: extra_context = {}
+    try:
+        date = datetime.date(*time.strptime(year+month, '%Y'+month_format)[:3])
+    except ValueError:
+        raise Http404
+
+    model = queryset.model
+    now = datetime.datetime.now()
+
+    # Calculate first and last day of month, for use in a date-range lookup.
+    first_day = date.replace(day=1)
+    if first_day.month == 12:
+        last_day = first_day.replace(year=first_day.year + 1, month=1)
+    else:
+        last_day = first_day.replace(month=first_day.month + 1)
+    lookup_kwargs = {
+        '%s__gte' % date_field: first_day,
+        '%s__lt' % date_field: last_day,
+    }
+
+    # Only bother to check current date if the month isn't in the past and future objects are requested.
+    if last_day >= now.date() and not allow_future:
+        lookup_kwargs['%s__lte' % date_field] = now
+    object_list = queryset.filter(**lookup_kwargs)
+    if not object_list and not allow_empty:
+        raise Http404
+
+    # Calculate the next month, if applicable.
+    if allow_future:
+        next_month = last_day + datetime.timedelta(days=1)
+    elif last_day < datetime.date.today():
+        next_month = last_day + datetime.timedelta(days=1)
+    else:
+        next_month = None
+
+    if not template_name:
+        template_name = "%s/%s_archive_month.html" % (model._meta.app_label, model._meta.object_name.lower())
+    t = template_loader.get_template(template_name)
+    c = RequestContext(request, {
+        '%s_list' % template_object_name: object_list,
+        'month': date,
+        'next_month': next_month,
+        'previous_month': first_day - datetime.timedelta(days=1),
+    }, context_processors)
+    for key, value in extra_context.items():
+        if callable(value):
+            c[key] = value()
+        else:
+            c[key] = value
+    return HttpResponse(t.render(c), mimetype=mimetype)
+
+def archive_week(request, year, week, queryset, date_field,
+        template_name=None, template_loader=loader,
+        extra_context=None, allow_empty=True, context_processors=None,
+        template_object_name='object', mimetype=None, allow_future=False):
+    """
+    Generic weekly archive view.
+
+    Templates: ``<app_label>/<model_name>_archive_week.html``
+    Context:
+        week:
+            (date) this week
+        object_list:
+            list of objects published in the given week
+    """
+    if extra_context is None: extra_context = {}
+    try:
+        date = datetime.date(*time.strptime(year+'-0-'+week, '%Y-%w-%U')[:3])
+    except ValueError:
+        raise Http404
+
+    model = queryset.model
+    now = datetime.datetime.now()
+
+    # Calculate first and last day of week, for use in a date-range lookup.
+    first_day = date
+    last_day = date + datetime.timedelta(days=7)
+    lookup_kwargs = {
+        '%s__gte' % date_field: first_day,
+        '%s__lt' % date_field: last_day,
+    }
+
+    # Only bother to check current date if the week isn't in the past and future objects aren't requested.
+    if last_day >= now.date() and not allow_future:
+        lookup_kwargs['%s__lte' % date_field] = now
+    object_list = queryset.filter(**lookup_kwargs)
+    if not object_list and not allow_empty:
+        raise Http404
+    if not template_name:
+        template_name = "%s/%s_archive_week.html" % (model._meta.app_label, model._meta.object_name.lower())
+    t = template_loader.get_template(template_name)
+    c = RequestContext(request, {
+        '%s_list' % template_object_name: object_list,
+        'week': date,
+    })
+    for key, value in extra_context.items():
+        if callable(value):
+            c[key] = value()
+        else:
+            c[key] = value
+    return HttpResponse(t.render(c), mimetype=mimetype)
+
+def archive_day(request, year, month, day, queryset, date_field,
+        month_format='%b', day_format='%d', template_name=None,
+        template_loader=loader, extra_context=None, allow_empty=False,
+        context_processors=None, template_object_name='object',
+        mimetype=None, allow_future=False):
+    """
+    Generic daily archive view.
+
+    Templates: ``<app_label>/<model_name>_archive_day.html``
+    Context:
+        object_list:
+            list of objects published that day
+        day:
+            (datetime) the day
+        previous_day
+            (datetime) the previous day
+        next_day
+            (datetime) the next day, or None if the current day is today
+    """
+    if extra_context is None: extra_context = {}
+    try:
+        date = datetime.date(*time.strptime(year+month+day, '%Y'+month_format+day_format)[:3])
+    except ValueError:
+        raise Http404
+
+    model = queryset.model
+    now = datetime.datetime.now()
+
+    if isinstance(model._meta.get_field(date_field), DateTimeField):
+        lookup_kwargs = {'%s__range' % date_field: (datetime.datetime.combine(date, datetime.time.min), datetime.datetime.combine(date, datetime.time.max))}
+    else:
+        lookup_kwargs = {date_field: date}
+
+    # Only bother to check current date if the date isn't in the past and future objects aren't requested.
+    if date >= now.date() and not allow_future:
+        lookup_kwargs['%s__lte' % date_field] = now
+    object_list = queryset.filter(**lookup_kwargs)
+    if not allow_empty and not object_list:
+        raise Http404
+
+    # Calculate the next day, if applicable.
+    if allow_future:
+        next_day = date + datetime.timedelta(days=1)
+    elif date < datetime.date.today():
+        next_day = date + datetime.timedelta(days=1)
+    else:
+        next_day = None
+
+    if not template_name:
+        template_name = "%s/%s_archive_day.html" % (model._meta.app_label, model._meta.object_name.lower())
+    t = template_loader.get_template(template_name)
+    c = RequestContext(request, {
+        '%s_list' % template_object_name: object_list,
+        'day': date,
+        'previous_day': date - datetime.timedelta(days=1),
+        'next_day': next_day,
+    }, context_processors)
+    for key, value in extra_context.items():
+        if callable(value):
+            c[key] = value()
+        else:
+            c[key] = value
+    return HttpResponse(t.render(c), mimetype=mimetype)
+
+def archive_today(request, **kwargs):
+    """
+    Generic daily archive view for today. Same as archive_day view.
+    """
+    today = datetime.date.today()
+    kwargs.update({
+        'year': str(today.year),
+        'month': today.strftime('%b').lower(),
+        'day': str(today.day),
+    })
+    return archive_day(request, **kwargs)
+
+def object_detail(request, year, month, day, queryset, date_field,
+        month_format='%b', day_format='%d', object_id=None, slug=None,
+        slug_field='slug', template_name=None, template_name_field=None,
+        template_loader=loader, extra_context=None, context_processors=None,
+        template_object_name='object', mimetype=None, allow_future=False):
+    """
+    Generic detail view from year/month/day/slug or year/month/day/id structure.
+
+    Templates: ``<app_label>/<model_name>_detail.html``
+    Context:
+        object:
+            the object to be detailed
+    """
+    if extra_context is None: extra_context = {}
+    try:
+        date = datetime.date(*time.strptime(year+month+day, '%Y'+month_format+day_format)[:3])
+    except ValueError:
+        raise Http404
+
+    model = queryset.model
+    now = datetime.datetime.now()
+
+    if isinstance(model._meta.get_field(date_field), DateTimeField):
+        lookup_kwargs = {'%s__range' % date_field: (datetime.datetime.combine(date, datetime.time.min), datetime.datetime.combine(date, datetime.time.max))}
+    else:
+        lookup_kwargs = {date_field: date}
+
+    # Only bother to check current date if the date isn't in the past and future objects aren't requested.
+    if date >= now.date() and not allow_future:
+        lookup_kwargs['%s__lte' % date_field] = now
+    if object_id:
+        lookup_kwargs['%s__exact' % model._meta.pk.name] = object_id
+    elif slug and slug_field:
+        lookup_kwargs['%s__exact' % slug_field] = slug
+    else:
+        raise AttributeError, "Generic detail view must be called with either an object_id or a slug/slugfield"
+    try:
+        obj = queryset.get(**lookup_kwargs)
+    except ObjectDoesNotExist:
+        raise Http404, "No %s found for" % model._meta.verbose_name
+    if not template_name:
+        template_name = "%s/%s_detail.html" % (model._meta.app_label, model._meta.object_name.lower())
+    if template_name_field:
+        template_name_list = [getattr(obj, template_name_field), template_name]
+        t = template_loader.select_template(template_name_list)
+    else:
+        t = template_loader.get_template(template_name)
+    c = RequestContext(request, {
+        template_object_name: obj,
+    }, context_processors)
+    for key, value in extra_context.items():
+        if callable(value):
+            c[key] = value()
+        else:
+            c[key] = value
+    response = HttpResponse(t.render(c), mimetype=mimetype)
+    populate_xheaders(request, response, model, getattr(obj, obj._meta.pk.name))
+    return response
diff --git a/webapp/django/views/generic/list_detail.py b/webapp/django/views/generic/list_detail.py
new file mode 100644
index 0000000..27e36bd
--- /dev/null
+++ b/webapp/django/views/generic/list_detail.py
@@ -0,0 +1,145 @@
+from django.template import loader, RequestContext
+from django.http import Http404, HttpResponse
+from django.core.xheaders import populate_xheaders
+from django.core.paginator import Paginator, InvalidPage
+from django.core.exceptions import ObjectDoesNotExist
+
+def object_list(request, queryset, paginate_by=None, page=None,
+        allow_empty=True, template_name=None, template_loader=loader,
+        extra_context=None, context_processors=None, template_object_name='object',
+        mimetype=None):
+    """
+    Generic list of objects.
+
+    Templates: ``<app_label>/<model_name>_list.html``
+    Context:
+        object_list
+            list of objects
+        is_paginated
+            are the results paginated?
+        results_per_page
+            number of objects per page (if paginated)
+        has_next
+            is there a next page?
+        has_previous
+            is there a prev page?
+        page
+            the current page
+        next
+            the next page
+        previous
+            the previous page
+        pages
+            number of pages, total
+        hits
+            number of objects, total
+        last_on_page
+            the result number of the last of object in the
+            object_list (1-indexed)
+        first_on_page
+            the result number of the first object in the
+            object_list (1-indexed)
+        page_range:
+            A list of the page numbers (1-indexed).
+    """
+    if extra_context is None: extra_context = {}
+    queryset = queryset._clone()
+    if paginate_by:
+        paginator = Paginator(queryset, paginate_by, allow_empty_first_page=allow_empty)
+        if not page:
+            page = request.GET.get('page', 1)
+        try:
+            page_number = int(page)
+        except ValueError:
+            if page == 'last':
+                page_number = paginator.num_pages
+            else:
+                # Page is not 'last', nor can it be converted to an int.
+                raise Http404
+        try:
+            page_obj = paginator.page(page_number)
+        except InvalidPage:
+            raise Http404
+        c = RequestContext(request, {
+            '%s_list' % template_object_name: page_obj.object_list,
+            'paginator': paginator,
+            'page_obj': page_obj,
+
+            # Legacy template context stuff. New templates should use page_obj
+            # to access this instead.
+            'is_paginated': page_obj.has_other_pages(),
+            'results_per_page': paginator.per_page,
+            'has_next': page_obj.has_next(),
+            'has_previous': page_obj.has_previous(),
+            'page': page_obj.number,
+            'next': page_obj.next_page_number(),
+            'previous': page_obj.previous_page_number(),
+            'first_on_page': page_obj.start_index(),
+            'last_on_page': page_obj.end_index(),
+            'pages': paginator.num_pages,
+            'hits': paginator.count,
+            'page_range': paginator.page_range,
+        }, context_processors)
+    else:
+        c = RequestContext(request, {
+            '%s_list' % template_object_name: queryset,
+            'paginator': None,
+            'page_obj': None,
+            'is_paginated': False,
+        }, context_processors)
+        if not allow_empty and len(queryset) == 0:
+            raise Http404
+    for key, value in extra_context.items():
+        if callable(value):
+            c[key] = value()
+        else:
+            c[key] = value
+    if not template_name:
+        model = queryset.model
+        template_name = "%s/%s_list.html" % (model._meta.app_label, model._meta.object_name.lower())
+    t = template_loader.get_template(template_name)
+    return HttpResponse(t.render(c), mimetype=mimetype)
+
+def object_detail(request, queryset, object_id=None, slug=None,
+        slug_field='slug', template_name=None, template_name_field=None,
+        template_loader=loader, extra_context=None,
+        context_processors=None, template_object_name='object',
+        mimetype=None):
+    """
+    Generic detail of an object.
+
+    Templates: ``<app_label>/<model_name>_detail.html``
+    Context:
+        object
+            the object
+    """
+    if extra_context is None: extra_context = {}
+    model = queryset.model
+    if object_id:
+        queryset = queryset.filter(pk=object_id)
+    elif slug and slug_field:
+        queryset = queryset.filter(**{slug_field: slug})
+    else:
+        raise AttributeError, "Generic detail view must be called with either an object_id or a slug/slug_field."
+    try:
+        obj = queryset.get()
+    except ObjectDoesNotExist:
+        raise Http404, "No %s found matching the query" % (model._meta.verbose_name)
+    if not template_name:
+        template_name = "%s/%s_detail.html" % (model._meta.app_label, model._meta.object_name.lower())
+    if template_name_field:
+        template_name_list = [getattr(obj, template_name_field), template_name]
+        t = template_loader.select_template(template_name_list)
+    else:
+        t = template_loader.get_template(template_name)
+    c = RequestContext(request, {
+        template_object_name: obj,
+    }, context_processors)
+    for key, value in extra_context.items():
+        if callable(value):
+            c[key] = value()
+        else:
+            c[key] = value
+    response = HttpResponse(t.render(c), mimetype=mimetype)
+    populate_xheaders(request, response, model, getattr(obj, obj._meta.pk.name))
+    return response
diff --git a/webapp/django/views/generic/simple.py b/webapp/django/views/generic/simple.py
new file mode 100644
index 0000000..0a68b82
--- /dev/null
+++ b/webapp/django/views/generic/simple.py
@@ -0,0 +1,37 @@
+from django.template import loader, RequestContext
+from django.http import HttpResponse, HttpResponsePermanentRedirect, HttpResponseGone
+
+def direct_to_template(request, template, extra_context=None, mimetype=None, **kwargs):
+    """
+    Render a given template with any extra URL parameters in the context as
+    ``{{ params }}``.
+    """
+    if extra_context is None: extra_context = {}
+    dictionary = {'params': kwargs}
+    for key, value in extra_context.items():
+        if callable(value):
+            dictionary[key] = value()
+        else:
+            dictionary[key] = value
+    c = RequestContext(request, dictionary)
+    t = loader.get_template(template)
+    return HttpResponse(t.render(c), mimetype=mimetype)
+
+def redirect_to(request, url, **kwargs):
+    """
+    Redirect to a given URL.
+
+    The given url may contain dict-style string formatting, which will be
+    interpolated against the params in the URL.  For example, to redirect from
+    ``/foo/<id>/`` to ``/bar/<id>/``, you could use the following URLconf::
+
+        urlpatterns = patterns('',
+            ('^foo/(?P<id>\d+)/$', 'django.views.generic.simple.redirect_to', {'url' : '/bar/%(id)s/'}),
+        )
+
+    If the given url is ``None``, a HttpResponseGone (410) will be issued.
+    """
+    if url is not None:
+        return HttpResponsePermanentRedirect(url % kwargs)
+    else:
+        return HttpResponseGone()
diff --git a/webapp/django/views/i18n.py b/webapp/django/views/i18n.py
new file mode 100644
index 0000000..e141c1d
--- /dev/null
+++ b/webapp/django/views/i18n.py
@@ -0,0 +1,193 @@
+from django import http
+from django.utils.translation import check_for_language, activate, to_locale, get_language
+from django.utils.text import javascript_quote
+from django.conf import settings
+import os
+import gettext as gettext_module
+
+def set_language(request):
+    """
+    Redirect to a given url while setting the chosen language in the
+    session or cookie. The url and the language code need to be
+    specified in the request parameters.
+
+    Since this view changes how the user will see the rest of the site, it must
+    only be accessed as a POST request. If called as a GET request, it will
+    redirect to the page in the request (the 'next' parameter) without changing
+    any state.
+    """
+    next = request.REQUEST.get('next', None)
+    if not next:
+        next = request.META.get('HTTP_REFERER', None)
+    if not next:
+        next = '/'
+    response = http.HttpResponseRedirect(next)
+    if request.method == 'POST':
+        lang_code = request.POST.get('language', None)
+        if lang_code and check_for_language(lang_code):
+            if hasattr(request, 'session'):
+                request.session['django_language'] = lang_code
+            else:
+                response.set_cookie(settings.LANGUAGE_COOKIE_NAME, lang_code)
+    return response
+
+NullSource = """
+/* gettext identity library */
+
+function gettext(msgid) { return msgid; }
+function ngettext(singular, plural, count) { return (count == 1) ? singular : plural; }
+function gettext_noop(msgid) { return msgid; }
+"""
+
+LibHead = """
+/* gettext library */
+
+var catalog = new Array();
+"""
+
+LibFoot = """
+
+function gettext(msgid) {
+  var value = catalog[msgid];
+  if (typeof(value) == 'undefined') {
+    return msgid;
+  } else {
+    return (typeof(value) == 'string') ? value : value[0];
+  }
+}
+
+function ngettext(singular, plural, count) {
+  value = catalog[singular];
+  if (typeof(value) == 'undefined') {
+    return (count == 1) ? singular : plural;
+  } else {
+    return value[pluralidx(count)];
+  }
+}
+
+function gettext_noop(msgid) { return msgid; }
+"""
+
+SimplePlural = """
+function pluralidx(count) { return (count == 1) ? 0 : 1; }
+"""
+
+InterPolate = r"""
+function interpolate(fmt, obj, named) {
+  if (named) {
+    return fmt.replace(/%\(\w+\)s/g, function(match){return String(obj[match.slice(2,-2)])});
+  } else {
+    return fmt.replace(/%s/g, function(match){return String(obj.shift())});
+  }
+}
+"""
+
+PluralIdx = r"""
+function pluralidx(n) {
+  var v=%s;
+  if (typeof(v) == 'boolean') {
+    return v ? 1 : 0;
+  } else {
+    return v;
+  }
+}
+"""
+
+def null_javascript_catalog(request, domain=None, packages=None):
+    """
+    Returns "identity" versions of the JavaScript i18n functions -- i.e.,
+    versions that don't actually do anything.
+    """
+    return http.HttpResponse(NullSource + InterPolate, 'text/javascript')
+
+def javascript_catalog(request, domain='djangojs', packages=None):
+    """
+    Returns the selected language catalog as a javascript library.
+
+    Receives the list of packages to check for translations in the
+    packages parameter either from an infodict or as a +-delimited
+    string from the request. Default is 'django.conf'.
+
+    Additionally you can override the gettext domain for this view,
+    but usually you don't want to do that, as JavaScript messages
+    go to the djangojs domain. But this might be needed if you
+    deliver your JavaScript source from Django templates.
+    """
+    if request.GET:
+        if 'language' in request.GET:
+            if check_for_language(request.GET['language']):
+                activate(request.GET['language'])
+    if packages is None:
+        packages = ['django.conf']
+    if type(packages) in (str, unicode):
+        packages = packages.split('+')
+    packages = [p for p in packages if p == 'django.conf' or p in settings.INSTALLED_APPS]
+    default_locale = to_locale(settings.LANGUAGE_CODE)
+    locale = to_locale(get_language())
+    t = {}
+    paths = []
+    # first load all english languages files for defaults
+    for package in packages:
+        p = __import__(package, {}, {}, [''])
+        path = os.path.join(os.path.dirname(p.__file__), 'locale')
+        paths.append(path)
+        try:
+            catalog = gettext_module.translation(domain, path, ['en'])
+            t.update(catalog._catalog)
+        except IOError:
+            # 'en' catalog was missing. This is harmless.
+            pass
+    # next load the settings.LANGUAGE_CODE translations if it isn't english
+    if default_locale != 'en':
+        for path in paths:
+            try:
+                catalog = gettext_module.translation(domain, path, [default_locale])
+            except IOError:
+                catalog = None
+            if catalog is not None:
+                t.update(catalog._catalog)
+    # last load the currently selected language, if it isn't identical to the default.
+    if locale != default_locale:
+        for path in paths:
+            try:
+                catalog = gettext_module.translation(domain, path, [locale])
+            except IOError:
+                catalog = None
+            if catalog is not None:
+                t.update(catalog._catalog)
+    src = [LibHead]
+    plural = None
+    if '' in t:
+        for l in t[''].split('\n'):
+            if l.startswith('Plural-Forms:'):
+                plural = l.split(':',1)[1].strip()
+    if plural is not None:
+        # this should actually be a compiled function of a typical plural-form:
+        # Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;
+        plural = [el.strip() for el in plural.split(';') if el.strip().startswith('plural=')][0].split('=',1)[1]
+        src.append(PluralIdx % plural)
+    else:
+        src.append(SimplePlural)
+    csrc = []
+    pdict = {}
+    for k, v in t.items():
+        if k == '':
+            continue
+        if type(k) in (str, unicode):
+            csrc.append("catalog['%s'] = '%s';\n" % (javascript_quote(k), javascript_quote(v)))
+        elif type(k) == tuple:
+            if k[0] not in pdict:
+                pdict[k[0]] = k[1]
+            else:
+                pdict[k[0]] = max(k[1], pdict[k[0]])
+            csrc.append("catalog['%s'][%d] = '%s';\n" % (javascript_quote(k[0]), k[1], javascript_quote(v)))
+        else:
+            raise TypeError, k
+    csrc.sort()
+    for k,v in pdict.items():
+        src.append("catalog['%s'] = [%s];\n" % (javascript_quote(k), ','.join(["''"]*(v+1))))
+    src.extend(csrc)
+    src.append(LibFoot)
+    src.append(InterPolate)
+    src = ''.join(src)
+    return http.HttpResponse(src, 'text/javascript')
diff --git a/webapp/django/views/static.py b/webapp/django/views/static.py
new file mode 100644
index 0000000..5a4d3ab
--- /dev/null
+++ b/webapp/django/views/static.py
@@ -0,0 +1,133 @@
+"""
+Views and functions for serving static files. These are only to be used
+during development, and SHOULD NOT be used in a production setting.
+"""
+
+import mimetypes
+import os
+import posixpath
+import re
+import stat
+import urllib
+from email.Utils import parsedate_tz, mktime_tz
+
+from django.template import loader
+from django.http import Http404, HttpResponse, HttpResponseRedirect, HttpResponseNotModified
+from django.template import Template, Context, TemplateDoesNotExist
+from django.utils.http import http_date
+
+def serve(request, path, document_root=None, show_indexes=False):
+    """
+    Serve static files below a given point in the directory structure.
+
+    To use, put a URL pattern such as::
+
+        (r'^(?P<path>.*)$', 'django.views.static.serve', {'document_root' : '/path/to/my/files/'})
+
+    in your URLconf. You must provide the ``document_root`` param. You may
+    also set ``show_indexes`` to ``True`` if you'd like to serve a basic index
+    of the directory.  This index view will use the template hardcoded below,
+    but if you'd like to override it, you can create a template called
+    ``static/directory_index``.
+    """
+
+    # Clean up given path to only allow serving files below document_root.
+    path = posixpath.normpath(urllib.unquote(path))
+    path = path.lstrip('/')
+    newpath = ''
+    for part in path.split('/'):
+        if not part:
+            # Strip empty path components.
+            continue
+        drive, part = os.path.splitdrive(part)
+        head, part = os.path.split(part)
+        if part in (os.curdir, os.pardir):
+            # Strip '.' and '..' in path.
+            continue
+        newpath = os.path.join(newpath, part).replace('\\', '/')
+    if newpath and path != newpath:
+        return HttpResponseRedirect(newpath)
+    fullpath = os.path.join(document_root, newpath)
+    if os.path.isdir(fullpath):
+        if show_indexes:
+            return directory_index(newpath, fullpath)
+        raise Http404, "Directory indexes are not allowed here."
+    if not os.path.exists(fullpath):
+        raise Http404, '"%s" does not exist' % fullpath
+    # Respect the If-Modified-Since header.
+    statobj = os.stat(fullpath)
+    if not was_modified_since(request.META.get('HTTP_IF_MODIFIED_SINCE'),
+                              statobj[stat.ST_MTIME], statobj[stat.ST_SIZE]):
+        return HttpResponseNotModified()
+    mimetype = mimetypes.guess_type(fullpath)[0] or 'application/octet-stream'
+    contents = open(fullpath, 'rb').read()
+    response = HttpResponse(contents, mimetype=mimetype)
+    response["Last-Modified"] = http_date(statobj[stat.ST_MTIME])
+    response["Content-Length"] = len(contents)
+    return response
+
+DEFAULT_DIRECTORY_INDEX_TEMPLATE = """
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
+    <meta http-equiv="Content-Language" content="en-us" />
+    <meta name="robots" content="NONE,NOARCHIVE" />
+    <title>Index of {{ directory|escape }}</title>
+  </head>
+  <body>
+    <h1>Index of {{ directory|escape }}</h1>
+    <ul>
+      {% for f in file_list %}
+      <li><a href="{{ f|urlencode }}">{{ f|escape }}</a></li>
+      {% endfor %}
+    </ul>
+  </body>
+</html>
+"""
+
+def directory_index(path, fullpath):
+    try:
+        t = loader.get_template('static/directory_index')
+    except TemplateDoesNotExist:
+        t = Template(DEFAULT_DIRECTORY_INDEX_TEMPLATE, name='Default directory index template')
+    files = []
+    for f in os.listdir(fullpath):
+        if not f.startswith('.'):
+            if os.path.isdir(os.path.join(fullpath, f)):
+                f += '/'
+            files.append(f)
+    c = Context({
+        'directory' : path + '/',
+        'file_list' : files,
+    })
+    return HttpResponse(t.render(c))
+
+def was_modified_since(header=None, mtime=0, size=0):
+    """
+    Was something modified since the user last downloaded it?
+
+    header
+      This is the value of the If-Modified-Since header.  If this is None,
+      I'll just return True.
+
+    mtime
+      This is the modification time of the item we're talking about.
+
+    size
+      This is the size of the item we're talking about.
+    """
+    try:
+        if header is None:
+            raise ValueError
+        matches = re.match(r"^([^;]+)(; length=([0-9]+))?$", header,
+                           re.IGNORECASE)
+        header_mtime = mktime_tz(parsedate_tz(matches.group(1)))
+        header_len = matches.group(3)
+        if header_len and int(header_len) != size:
+            raise ValueError
+        if mtime > header_mtime:
+            raise ValueError
+    except (AttributeError, ValueError):
+        return True
+    return False
diff --git a/webapp/git_upload.py b/webapp/git_upload.py
new file mode 100755
index 0000000..a6fa768
--- /dev/null
+++ b/webapp/git_upload.py
@@ -0,0 +1,253 @@
+#!/usr/bin/env python2.5
+#
+# Copyright 2007 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import getpass
+import logging
+import optparse
+import os
+import subprocess
+import sys
+from tempfile import mkstemp
+
+from codereview.proto_client import HttpRpc, Proxy
+from codereview.review_pb2 import ReviewService_Stub
+from codereview.upload_bundle_pb2 import *
+
+try:
+  import readline
+except ImportError:
+  pass
+
+MAX_SEGMENT_SIZE = 1020 * 1024
+
+# The logging verbosity:
+#  0: Errors only.
+#  1: Status messages.
+#  2: Info logs.
+#  3: Debug logs.
+verbosity = 1
+
+def StatusUpdate(msg):
+  """Print a status message to stdout.
+
+  If 'verbosity' is greater than 0, print the message.
+
+  Args:
+    msg: The string to print.
+  """
+  if verbosity > 0:
+    print msg
+
+
+def ErrorExit(msg):
+  """Print an error message to stderr and exit."""
+  print >>sys.stderr, msg
+  sys.exit(1)
+
+
+def RunShell(command, args=(), silent_ok=False):
+  command = "%s %s" % (command, " ".join(args))
+  logging.info("Running %s", command)
+  stream = os.popen(command, "r")
+  data = stream.read()
+  if stream.close():
+    ErrorExit("Got error status from %s" % command)
+  if not silent_ok and not data:
+    ErrorExit("No output from %s" % command)
+  return data
+
+
+def RunGit(*args):
+  argv = ["git"]
+  argv += args
+  retcode = subprocess.call(argv)
+  if retcode != 0:
+    raise OSError, retcode
+
+def GitVal(*args):
+  data = RunShell("git", args)
+  if data.rfind("\n") == len(data) - 1:
+    return data[0 : len(data) - 1]
+  return data
+
+
+parser = optparse.OptionParser(usage="%prog [options] [-- diff_options]")
+
+# Logging
+group = parser.add_option_group("Logging options")
+group.add_option("-q", "--quiet", action="store_const", const=0,
+                 dest="verbose", help="Print errors only.")
+group.add_option("-v", "--verbose", action="store_const", const=2,
+                 dest="verbose", default=1,
+                 help="Print info level logs (default).")
+group.add_option("--noisy", action="store_const", const=3,
+                 dest="verbose", help="Print all logs.")
+
+# Review server
+group = parser.add_option_group("Review server options")
+group.add_option("-s", "--server", action="store", dest="server",
+                 default="codereview.appspot.com",
+                 metavar="SERVER",
+                 help=("The server to upload to. The format is host[:port]. "
+                       "Defaults to 'codereview.appspot.com'."))
+group.add_option("-e", "--email", action="store", dest="email",
+                 metavar="EMAIL", default=None,
+                 help="The username to use. Will prompt if omitted.")
+group.add_option("-H", "--host", action="store", dest="host",
+                 metavar="HOST", default=None,
+                 help="Overrides the Host header sent with all RPCs.")
+group.add_option("--no_cookies", action="store_false",
+                 dest="save_cookies", default=True,
+                 help="Do not save authentication cookies to local disk.")
+
+# Git
+group = parser.add_option_group("Git options")
+group.add_option("-p", "--project", action="store", dest="dest_project",
+                 metavar="PROJECT",
+                 help=("Name of the Git repository to submit into."))
+group.add_option("-b", "--branch", action="store", dest="dest_branch",
+                 metavar="BRANCH",
+                 help=("Name of the branch the changes are proposed for."))
+group.add_option("-B", "--base", action="store", dest="base_commit",
+                 default="refs/remotes/origin/master",
+                 metavar="COMMIT",
+                 help=("Base commit for the bundle."))
+
+def GetRpcServer(options):
+  """Returns an RpcServer.
+
+  Returns:
+    A new RpcServer, on which RPC calls can be made.
+  """
+
+  def GetUserCredentials():
+    """Prompts the user for a username and password."""
+    email = options.email
+    if email is None:
+      email = raw_input("Email: ").strip()
+    password = getpass.getpass("Password for %s: " % email)
+    return (email, password)
+
+  # If this is the dev_appserver, use fake authentication.
+  host = (options.host or options.server).lower()
+  if host == "localhost" or host.startswith("localhost:"):
+    email = options.email
+    if email is None:
+      email = "test@example.com"
+      logging.info("Using debug user %s.  Override with --email" % email)
+
+    server = HttpRpc(
+        options.server,
+        lambda: (email, "password"),
+        host_override=options.host,
+        extra_headers={"Cookie":
+                       'dev_appserver_login="%s:False"' % email})
+    # Don't try to talk to ClientLogin.
+    server.authenticated = True
+    return server
+
+  if options.save_cookies:
+    cookie_file = ".gerrit_cookies"
+  else:
+    cookie_file = None
+
+  return HttpRpc(options.server, GetUserCredentials,
+                 host_override=options.host,
+                 cookie_file=cookie_file)
+
+
+def RealMain(argv, data=None):
+  logging.basicConfig(format=("%(asctime).19s %(levelname)s %(filename)s:"
+                              "%(lineno)s %(message)s "))
+  os.environ['LC_ALL'] = 'C'
+  options, args = parser.parse_args(argv[1:])
+
+  global verbosity
+  verbosity = options.verbose
+  if verbosity >= 3:
+    logging.getLogger().setLevel(logging.DEBUG)
+  elif verbosity >= 2:
+    logging.getLogger().setLevel(logging.INFO)
+
+  srv = GetRpcServer(options)
+  review = Proxy(ReviewService_Stub(srv))
+
+  git_dir = GitVal("rev-parse","--git-dir")
+
+  revlist = GitVal("rev-list",
+                   "^" + options.base_commit,
+                   "HEAD").split("\n")
+
+  tmp_fd, tmp_bundle = mkstemp(".bundle", ".gpq", git_dir)
+  os.close(tmp_fd)
+
+  try:
+    RunGit("bundle", "create",
+           tmp_bundle,
+           "^" + options.base_commit,
+           "HEAD")
+    fd = open(tmp_bundle, "rb")
+
+    bundle_id = None
+    segment_id = 0
+    next_data = fd.read(MAX_SEGMENT_SIZE)
+
+    while len(next_data) > 0:
+      this_data = next_data
+      next_data = fd.read(MAX_SEGMENT_SIZE)
+      segment_id += 1
+    
+      if bundle_id is None:
+        req = UploadBundleRequest()
+        req.dest_project = options.dest_project
+        req.dest_branch = options.dest_branch
+        for c in revlist:
+          req.contained_object.append(c)
+      else:
+        req = UploadBundleContinue()
+        req.bundle_id = bundle_id
+        req.segment_id = segment_id
+
+      req.bundle_data = this_data
+      if len(next_data) > 0:
+        req.partial_upload = True
+      else:
+        req.partial_upload = False
+
+      if bundle_id is None:
+        rsp = review.UploadBundle(req)
+      else:
+        rsp = review.ContinueBundle(req)
+
+      if rsp.status_code == UploadBundleResponse.CONTINUE:
+        bundle_id = rsp.bundle_id
+      else:
+        print rsp
+        break
+  finally:
+    os.unlink(tmp_bundle)
+
+def main():
+  try:
+    RealMain(sys.argv)
+  except KeyboardInterrupt:
+    print
+    StatusUpdate("Interrupted.")
+    sys.exit(1)
+
+
+if __name__ == "__main__":
+  main()
diff --git a/webapp/index.yaml b/webapp/index.yaml
new file mode 100644
index 0000000..5ff815c
--- /dev/null
+++ b/webapp/index.yaml
@@ -0,0 +1,176 @@
+indexes:
+
+# AUTOGENERATED
+
+# This index.yaml is automatically updated whenever the dev_appserver
+# detects that a new type of query is run.  If you want to manage the
+# index.yaml file manually, remove the above marker line (the line
+# saying "# AUTOGENERATED").  If you want to manage some indexes
+# manually, move them above the marker line.  The index.yaml file is
+# automatically uploaded to the admin console when you next deploy
+# your application using appcfg.py.
+
+# Used 2 times in query history.
+- kind: Account
+  properties:
+  - name: cla_verified
+  - name: welcomed
+  - name: individual_cla_version
+
+# Unused in query history -- copied from input.
+- kind: Account
+  properties:
+  - name: welcomed
+  - name: cla_verified
+  - name: individual_cla_version
+
+# Used 826 times in query history.
+- kind: Branch
+  properties:
+  - name: status
+  - name: merge_submitted
+
+# Used 22 times in query history.
+- kind: BuildAttempt
+  properties:
+  - name: success
+  - name: started
+
+# Used 42 times in query history.
+- kind: Change
+  properties:
+  - name: claimed
+  - name: closed
+  - name: dest_project
+  - name: modified
+    direction: desc
+
+# Used 9 times in query history.
+- kind: Change
+  properties:
+  - name: closed
+  - name: modified
+    direction: desc
+
+# Used 108 times in query history.
+- kind: Change
+  properties:
+  - name: closed
+  - name: owner
+  - name: modified
+    direction: desc
+
+# Used 54 times in query history.
+- kind: Change
+  properties:
+  - name: closed
+  - name: reviewers
+  - name: modified
+    direction: desc
+
+# Unused in query history -- copied from input.
+- kind: Change
+  properties:
+  - name: modified
+    direction: desc
+
+# Unused in query history -- copied from input.
+- kind: Change
+  properties:
+  - name: owner
+  - name: modified
+    direction: desc
+
+# Unused in query history -- copied from input.
+- kind: Change
+  properties:
+  - name: reviewers
+  - name: modified
+    direction: desc
+
+# Used 8 times in query history.
+- kind: Comment
+  properties:
+  - name: left
+  - name: lineno
+  - name: patch
+  - name: date
+
+# Unused in query history -- copied from input.
+- kind: Comment
+  properties:
+  - name: left
+  - name: patch
+  - name: date
+
+# Used 13 times in query history.
+- kind: Comment
+  properties:
+  - name: patch
+  - name: date
+
+# Unused in query history -- copied from input.
+- kind: Comment
+  ancestor: yes
+
+# Unused in query history -- copied from input.
+- kind: Comment
+  ancestor: yes
+  properties:
+  - name: author
+  - name: draft
+
+# Used 99 times in query history.
+- kind: Message
+  properties:
+  - name: change
+  - name: date
+
+# Unused in query history -- copied from input.
+- kind: Message
+  ancestor: yes
+
+# Used 132 times in query history.
+- kind: Patch
+  properties:
+  - name: patchset
+  - name: filename
+
+# Unused in query history -- copied from input.
+- kind: Patch
+  ancestor: yes
+
+# Used 361 times in query history.
+- kind: PatchSet
+  properties:
+  - name: change
+  - name: id
+
+# Unused in query history -- copied from input.
+- kind: PatchSet
+  ancestor: yes
+
+# Unused in query history -- copied from input.
+- kind: PatchSetFilenames
+  ancestor: yes
+
+# Unused in query history -- copied from input.
+- kind: ReceivedBundle
+  properties:
+  - name: owner
+  - name: created
+    direction: desc
+
+# Used 900 times in query history.
+- kind: ReceivedBundle
+  properties:
+  - name: state
+  - name: created
+
+# Used 14 times in query history.
+- kind: ReceivedBundleSegment
+  ancestor: yes
+
+# Used 113 times in query history.
+- kind: ReviewStatus
+  ancestor: yes
diff --git a/webapp/main.py b/webapp/main.py
new file mode 100644
index 0000000..a6cfa93
--- /dev/null
+++ b/webapp/main.py
@@ -0,0 +1,128 @@
+# Copyright 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Main program for Gerrit.
+
+This is also a template for running a Django app under Google App
+Engine, especially when using a newer version of Django than provided
+in the App Engine standard library.
+
+The site-specific code is all in other files: urls.py, models.py,
+views.py, settings.py.
+"""
+
+# Standard Python imports.
+import os
+import sys
+import logging
+
+# Log a message each time this module get loaded.
+logging.info('Loading %s, app version = %s',
+             __name__, os.getenv('CURRENT_VERSION_ID'))
+
+# Delete the preloaded copy of Django.
+for key in [key for key in sys.modules if key.startswith('django')]:
+  del sys.modules[key]
+
+# Force sys.path to have our own directory first, so we can import from it.
+sys.path.insert(0, os.path.abspath(os.path.dirname(__file__)))
+sys.path.insert(0, os.path.abspath('django.zip'))
+sys.path.insert(0, os.path.abspath('froofle.zip'))
+sys.path.insert(0, os.path.abspath('codereview.zip'))
+
+# Fail early if we can't import Django.  Log identifying information.
+import django
+logging.info('django.__file__ = %r, django.VERSION = %r',
+             django.__file__, django.VERSION)
+assert django.VERSION[0] >= 1,"This Django version is too old"
+
+# AppEngine imports.
+from google.appengine.ext.webapp import util
+
+# Helper to enter the debugger.  This passes in __stdin__ and
+# __stdout__, because stdin and stdout are connected to the request
+# and response streams.  You must import this from __main__ to use it.
+# (I tried to make it universally available via __builtin__, but that
+# doesn't seem to work for some reason.)
+def BREAKPOINT():
+  import pdb
+  p = pdb.Pdb(None, sys.__stdin__, sys.__stdout__)
+  p.set_trace()
+
+# Custom Django configuration.
+from django.conf import settings
+settings._target = None
+os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
+
+# Import various parts of Django.
+import django.core.handlers.wsgi
+import django.core.signals
+import django.db
+import django.dispatch.dispatcher
+import django.forms
+
+# Work-around to avoid warning about django.newforms in djangoforms.
+django.newforms = django.forms
+
+def log_exception(*args, **kwds):
+  """Django signal handler to log an exception."""
+  cls, err = sys.exc_info()[:2]
+  logging.exception('Exception in request: %s: %s', cls.__name__, err)
+
+# Log all exceptions detected by Django.
+django.core.signals.got_request_exception.connect(log_exception)
+
+# Unregister Django's default rollback event handler.
+django.core.signals.got_request_exception.disconnect(
+    django.db._rollback_on_exception)
+
+correct_path = None
+def real_main():
+  """Main program.
+  """
+  global correct_path
+
+  if correct_path is None:
+    correct_path = list(sys.path)
+  else:
+    sys.path[:] = correct_path
+
+  application = django.core.handlers.wsgi.WSGIHandler()
+  util.run_wsgi_app(application)
+
+def profile_main():
+  """Main program for profiling.
+  """
+  import cProfile, pstats, StringIO
+  prof = cProfile.Profile()
+  prof = prof.runctx('real_main()', globals(), locals())
+  stream = StringIO.StringIO()
+  stats = pstats.Stats(prof, stream=stream)
+  # stats.strip_dirs()  # Don't; too many modules are named __init__.py.
+  stats.sort_stats('time')  # 'time', 'cumulative' or 'calls'
+  stats.print_stats()  # Optional arg: how many to print
+  # The rest is optional.
+  # stats.print_callees()
+  # stats.print_callers()
+  print '\n<hr>'
+  print '<h1>Profile</h1>'
+  print '<pre>'
+  print stream.getvalue()[:1000000]
+  print '</pre>'
+
+# Set this to profile_main to enable profiling.
+main = real_main
+
+if __name__ == '__main__':
+  main()
diff --git a/webapp/settings.py b/webapp/settings.py
new file mode 100644
index 0000000..aed92fc
--- /dev/null
+++ b/webapp/settings.py
@@ -0,0 +1,40 @@
+# Copyright 2008 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Minimal Django settings."""
+
+import os
+
+APPEND_SLASH = False
+DEBUG = os.environ['SERVER_SOFTWARE'].startswith('Dev')
+INSTALLED_APPS = (
+    'codereview',
+)
+MIDDLEWARE_CLASSES = (
+    'codereview.middleware.NoCacheMiddleware',
+    'django.middleware.common.CommonMiddleware',
+    'django.middleware.http.ConditionalGetMiddleware',
+    'codereview.middleware.AddUserToRequestMiddleware',
+    'codereview.middleware.ClearXsrfKeyMiddleware',
+)
+ROOT_URLCONF = 'codereview.urls'
+TEMPLATE_CONTEXT_PROCESSORS = ()
+TEMPLATE_DEBUG = DEBUG
+TEMPLATE_DIRS = (
+    os.path.join(os.path.dirname(__file__), 'templates'),
+    )
+TEMPLATE_LOADERS = (
+    'django.template.loaders.filesystem.load_template_source',
+    )
+
diff --git a/webapp/static/ajax.js b/webapp/static/ajax.js
new file mode 100644
index 0000000..bc80e9b
--- /dev/null
+++ b/webapp/static/ajax.js
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2008 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var PROGRESS_ELEMENT_ID = "ajax_progress";
+var CONNECTION_ERROR_ELEMENT_ID = "ajax_error";
+
+var g_filesLoading = 0;
+
+/**
+ * Asynchronously get a url that contains a json file, and call the callback
+ * when done.
+ *
+ * The callback should have the following prototype:
+ *  callback(boolean success, Object result)
+ *
+ * Returns an object that can be used to cancel the request.
+ */
+function get_file_contents(url, callback) {
+    var running = true;
+
+    function set_progress_visibility(visible) {
+        var progress = document.getElementById(PROGRESS_ELEMENT_ID);
+        if (progress) {
+            progress.style.display = visible ? "block" : "none";
+        }
+    }
+
+    show_bad_connection_error(null);
+
+    var req;
+    if (window.XMLHttpRequest) {
+        req = new XMLHttpRequest();
+    } else if (window.ActiveXObject) {
+        req = new ActiveXObject("Microsoft.XMLHTTP");
+    } else {
+        return;
+    }
+
+    g_filesLoading++;
+    if (g_filesLoading > 0) {
+        set_progress_visibility(true);
+    }
+
+    req.open("GET", url, true);
+
+    req.onreadystatechange = function() {
+        if (req.readyState == 4) {
+            if (req.status == 200) {
+                callback(true, req.responseText);
+            } else {
+                callback(false, null);
+            }
+            g_filesLoading--;
+            if (g_filesLoading == 0) {
+                set_progress_visibility(false);
+            }
+            running = false;
+        }
+    };
+
+    req.send(null);
+
+
+    var controller = new Object();
+    controller.cancel = function() {
+        req.abort();
+        if (running) {
+            g_filesLoading--;
+            if (g_filesLoading == 0) {
+                set_progress_visibility(false);
+            }
+            running = false;
+        }
+    };
+    return controller;
+}
+
+/**
+ * like get_file_contents, but converts the result to a json object
+ */
+function get_json(url, callback) {
+    return get_file_contents(url, function(success, data) {
+                callback(success, eval("(" + data + ")"));
+            });
+}
+
+function show_bad_connection_error(err) {
+    var errorDiv = document.getElementById(CONNECTION_ERROR_ELEMENT_ID);
+    if (errorDiv) {
+        if (err) {
+            errorDiv.style.display = "block";
+        } else {
+            errorDiv.style.display = "none";
+        }
+    }
+}
+
+
diff --git a/webapp/static/android_heart.png b/webapp/static/android_heart.png
new file mode 100644
index 0000000..2b05dbd
--- /dev/null
+++ b/webapp/static/android_heart.png
Binary files differ
diff --git a/webapp/static/application_version b/webapp/static/application_version
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/static/application_version
diff --git a/webapp/static/bug.png b/webapp/static/bug.png
new file mode 100644
index 0000000..e832ce9
--- /dev/null
+++ b/webapp/static/bug.png
Binary files differ
diff --git a/webapp/static/check.png b/webapp/static/check.png
new file mode 100644
index 0000000..3e7db83
--- /dev/null
+++ b/webapp/static/check.png
Binary files differ
diff --git a/webapp/static/closedtriangle.gif b/webapp/static/closedtriangle.gif
new file mode 100644
index 0000000..d9e63a5
--- /dev/null
+++ b/webapp/static/closedtriangle.gif
Binary files differ
diff --git a/webapp/static/corp_cla.html b/webapp/static/corp_cla.html
new file mode 100644
index 0000000..1808425
--- /dev/null
+++ b/webapp/static/corp_cla.html
@@ -0,0 +1,110 @@
+<html>
+<body>
+<div style="text-align: left;">
+
+
+<font
+size="4">Android Open Source Project<br>Corporate Contributor License Grant ("Grant"), v1.0</font></h2><h3 class="title" style="text-align: center;"><a href="http://code.google.com/legal/corporate-cla-v1.0.html" style="color: rgb(85, 26, 139);"><span style="background-color: rgb(255, 255, 0);">http://code.google.com/legal/corporate-cla-v1.0.html</span></a></h3><p>In order to clarify the intellectual property license granted with
+Contributions from any person or entity, the Android Open Source
+Project (the "Project") must have a Contributor License Grant
+("Grant") on file that has been signed by each Contributor, indicating
+agreement to the license terms below. This license is for your
+protection as a Contributor as well as the protection of the Project
+and the Android Open Source Project Leads (the "Project Leads");
+it does not change your rights to use your own Contributions for
+any other purpose.</p><p>This version of the Grant allows an entity
+(the "Corporation") to submit Contributions to the Project Leads,
+to authorize Contributions submitted by its designated employees
+to the Project Leads, and to grant copyright and patent licenses
+thereto. If you have not already done so, please complete and send
+an original signed Grant to</p><blockquote>Google Inc.<br>Attn:
+Open Source Program Office<br>1600 Amphitheatre Pkwy<br>Building
+43<br>Mountain View, CA 94043<br>U.S.A.<br></blockquote><p>Scanned
+agreements may also be emailed in PDF form to
+cla-submissions@google.com</p><p>If necessary, you may send it by
+facsimile to (650) 887-1625. Please read this document carefully
+before signing and keep a copy for your records.</p><pre style="border: 1px solid silver; margin: 2em; padding: 0.5em; color: rgb(0, 112, 0); font-size: 100%; background-color: rgb(245, 245, 245);">Corporation name: ___________________________________________________<br><br><br><br>Corporation address: ________________________________________________<br><br><br><br>_____________________________________________________________________<br><br><br><br>_____________________________________________________________________<br><br><br><br>Point of Contact: ___________________________________________________<br><br><br><br>E-Mail: ____________________________________________________________<br><br><br><br>Telephone: _____________________<br><br><br><br>Fax: ___________________________<br><br></pre><p>You accept and agree
+to the following terms and conditions for Your present and future
+Contributions submitted to the Project. Except for the license
+granted herein to the Project Leads and recipients of software
+distributed by the Project Leads, You reserve all right, title, and
+interest in and to Your Contributions.</p><ol><li style="margin-bottom:
+0.25em;"><p>Definitions.</p><p>"You" (or "Your") shall mean the
+copyright owner or legal entity authorized by the copyright owner
+that is making this Grant to the Project Leads. For legal entities,
+the entity making a Contribution and all other entities that control,
+are controlled by, or are under common control with that entity are
+considered to be a single Contributor. For the purposes of this
+definition, "control" means (i) the power, direct or indirect, to
+cause the direction or management of such entity, whether by contract
+or otherwise, or (ii) ownership of fifty percent (50%) or more of
+the outstanding shares, or (iii) beneficial ownership of such
+entity.</p><p>"Contribution" shall mean the code, documentation or
+other original works of authorship expressly identified in Schedule
+B, as well as any original work of authorship, including any
+modifications or additions to an existing work, that is intentionally
+submitted by You to the Project Leads for inclusion in, or documentation
+of, any of the products managed or maintained by the Project Leads
+(the "Work"). For the purposes of this definition, "submitted" means
+any form of electronic, verbal, or written communication sent to
+the Project Leads or their representatives, including but not limited
+to communication on electronic mailing lists, source code control
+systems, and issue tracking systems that are managed by, or on
+behalf of, the Project Leads for the purpose of discussing and
+improving the Work, but excluding communication that is conspicuously
+marked or otherwise designated in writing by You as "Not a
+Contribution."</p></li><li style="margin-bottom: 0.25em;"><p>Grant
+of Copyright License. Subject to the terms and conditions of this
+Grant, You hereby grant to the Project Leads and to recipients of
+software distributed by the Project Leads a perpetual, worldwide,
+non-exclusive, no-charge, royalty-free, irrevocable copyright license
+to reproduce, prepare derivative works of, publicly display, publicly
+perform, sublicense, and distribute Your Contributions and such
+derivative works.</p></li><li style="margin-bottom: 0.25em;"><p>Grant
+of Patent License. Subject to the terms and conditions of this
+Grant, You hereby grant to the Project Leads and to recipients of
+software distributed by the Project Leads a perpetual, worldwide,
+non-exclusive, no-charge, royalty-free, irrevocable (except as
+stated in this section) patent license to make, have made, use,
+offer to sell, sell, import, and otherwise transfer the Work, where
+such license applies only to those patent claims licensable by You
+that are necessarily infringed by Your Contribution(s) alone or by
+combination of Your Contribution(s) with the Work to which such
+Contribution(s) was submitted. If any entity institutes patent
+litigation against You or any other entity (including a cross-claim
+or counterclaim in a lawsuit) alleging that your Contribution, or
+the Work to which you have contributed, constitutes direct or
+contributory patent infringement, then any patent licenses granted
+to that entity under this Grant for that Contribution or Work shall
+terminate as of the date such litigation is filed.</p></li><li
+style="margin-bottom: 0.25em;"><p>You represent that You are legally
+entitled to grant the above license. You represent further that
+each employee of the Corporation designated on Schedule A below (or
+in a subsequent written modification to that Schedule) is authorized
+to submit Contributions on behalf of the Corporation.</p></li><li
+style="margin-bottom: 0.25em;"><p>You represent that each of Your
+Contributions is Your original creation (see section 7 for submissions
+on behalf of others).</p></li><li style="margin-bottom: 0.25em;"><p>You
+are not expected to provide support for Your Contributions, except
+to the extent You desire to provide support. You may provide support
+for free, for a fee, or not at all. Unless required by applicable
+law or agreed to in writing, You provide Your Contributions on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+express or implied, including, without limitation, any warranties
+or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS
+FOR A PARTICULAR PURPOSE.</p></li><li style="margin-bottom: 0.25em;"><p>Should You wish to submit work that is not Your original
+creation, You may submit it to the Project Leads separately from
+any Contribution, identifying the complete details of its source
+and of any license or other restriction (including, but not limited
+to, related patents, trademarks, and license agreements) of which
+you are personally aware, and conspicuously marking the work as
+"Submitted on behalf of a third-party: [named here]". <span
+style="background-color: rgb(255, 255, 0);"></span><span
+style="background-color: rgb(255, 255, 0);"><br></span></p></li><li
+style="margin-bottom: 0.25em;"><p>It is your responsibility to
+notify the Project Leads when any change is required to the list
+of designated employees authorized to submit Contributions on behalf
+of the Corporation, or to the Corporation's Point of Contact with
+the Project.</p></li></ol><pre style="border: 1px solid silver; margin: 2em; padding: 0.5em; color: rgb(0, 112, 0); font-size: 100%; background-color: rgb(245, 245, 245);"> <br><br><br>Please sign: __________________________________   Date: _______________<br><br> <br><br>Title: _______________________________________________________________<br><br> <br><br>Corporation: __________________________________________________________<br><br></pre><h3><font size="3">Schedule A</font></h3>[Initial list of designated employees.  NB: authorization is not tied to particular Contributions.]<h3><font size="3">Schedule B</font></h3>[Identification of optional concurrent software grant. Would be left blank or omitted if there is no concurrent software grant.]<br>
+</body>
+</html>
diff --git a/webapp/static/customLogo.png b/webapp/static/customLogo.png
new file mode 100644
index 0000000..87a7f38
--- /dev/null
+++ b/webapp/static/customLogo.png
Binary files differ
diff --git a/webapp/static/favicon.ico b/webapp/static/favicon.ico
new file mode 100644
index 0000000..bc024d6
--- /dev/null
+++ b/webapp/static/favicon.ico
Binary files differ
diff --git a/webapp/static/opentriangle.gif b/webapp/static/opentriangle.gif
new file mode 100644
index 0000000..fefe684
--- /dev/null
+++ b/webapp/static/opentriangle.gif
Binary files differ
diff --git a/webapp/static/robots.txt b/webapp/static/robots.txt
new file mode 100644
index 0000000..c033917
--- /dev/null
+++ b/webapp/static/robots.txt
@@ -0,0 +1,8 @@
+# Directions for web crawlers.
+# See http://www.robotstxt.org/wc/norobots.html.
+
+User-agent: HTTrack
+User-agent: puf
+User-agent: MSIECrawler
+User-agent: Nutch
+Disallow: /
diff --git a/webapp/static/script.js b/webapp/static/script.js
new file mode 100644
index 0000000..463e24c
--- /dev/null
+++ b/webapp/static/script.js
@@ -0,0 +1,2805 @@
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Generic helpers
+
+/**
+ * Create a new XMLHttpRequest in a cross-browser-compatible way.
+ * @return XMLHttpRequest object
+ */
+function M_getXMLHttpRequest() {
+  try {
+    return new XMLHttpRequest();
+  } catch (e) { }
+
+  try {
+    return new ActiveXObject("Msxml2.XMLHTTP");
+  } catch (e) { }
+
+  try {
+    return new ActiveXObject("Microsoft.XMLHTTP");
+  } catch (e) { }
+
+  return null;
+}
+
+/**
+ * Finds the element's parent in the DOM tree.
+ * @param {Element} element The element whose parent we want to find
+ * @return The parent element of the given element
+ */
+function M_getParent(element) {
+  if (element.parentNode) {
+    return element.parentNode;
+  } else if (element.parentElement) {
+    // IE compatibility. Why follow standards when you can make up your own?
+    return element.parentElement;
+  }
+  return null;
+}
+
+/**
+ * Finds the event's target in a way that works on all browsers.
+ * @param {Event} e The event object whose target we want to find
+ * @return The element receiving the event
+ */
+function M_getEventTarget(e) {
+  var src = e.srcElement ? e.srcElement : e.target;
+  return src;
+}
+
+/**
+ * Function to determine if we are in a KHTML-based browser(Konq/Safari).
+ * @return Boolean of whether we are in a KHTML browser
+ */
+function M_isKHTML() {
+  var agt = navigator.userAgent.toLowerCase();
+  return (agt.indexOf("safari") != -1) || (agt.indexOf("khtml") != -1);
+}
+
+/**
+ * Function to determine if we are running in an IE browser.
+ * @return Boolean of whether we are running in IE
+ */
+function M_isIE() {
+  return (navigator.userAgent.toLowerCase().indexOf("msie") != -1) &&
+         !window.opera;
+}
+
+/**
+ * Stop the event bubbling in a browser-independent way. Sometimes required
+ * when it is not easy to return true when an event is handled.
+ * @param {Window} win The window in which this event is happening
+ * @param {Event} e The event that we want to cancel
+ */
+function M_stopBubble(win, e) {
+  if (!e) {
+    e = win.event;
+  }
+  e.cancelBubble = true;
+  if (e.stopPropagation) {
+    e.stopPropagation();
+  }
+}
+
+/**
+ * Return distance in pixels from the top of the document to the given element.
+ * @param {Element} element The element whose offset we want to find
+ * @return Integer value of the height of the element from the top
+ */
+function M_getPageOffsetTop(element) {
+  var y = element.offsetTop;
+  if (element.offsetParent != null) {
+    y += M_getPageOffsetTop(element.offsetParent);
+  }
+  return y;
+}
+
+/**
+ * Return distance in pixels of the given element from the left of the document.
+ * @param {Element} element The element whose offset we want to find
+ * @return Integer value of the horizontal position of the element
+ */
+function M_getPageOffsetLeft(element) {
+  var x = element.offsetLeft;
+  if (element.offsetParent != null) {
+    x += M_getPageOffsetLeft(element.offsetParent);
+  }
+  return x;
+}
+
+/**
+ * Find the height of the window viewport.
+ * @param {Window} win The window whose viewport we would like to measure
+ * @return Integer value of the height of the given window
+ */
+function M_getWindowHeight(win) {
+  return M_getWindowPropertyByBrowser_(win, M_getWindowHeightGetters_);
+}
+
+/**
+ * Find the vertical scroll position of the given window.
+ * @param {Window} win The window whose scroll position we want to find
+ * @return Integer value of the scroll position of the given window
+ */
+function M_getScrollTop(win) {
+  return M_getWindowPropertyByBrowser_(win, M_getScrollTopGetters_);
+}
+
+/**
+ * Scroll the target element into view at 1/3rd of the window height only if
+ * the scrolling direction matches the direction that was asked for.
+ * @param {Window} win The window in which the element resides
+ * @param {Element} element The element that we want to bring into view
+ * @param {Integer} direction Positive for scroll down, negative for scroll up
+ */
+function M_scrollIntoView(win, element, direction) {
+  var elTop = M_getPageOffsetTop(element);
+  var winHeight = M_getWindowHeight(win);
+  var targetScroll = elTop - winHeight / 3;
+  var scrollTop = M_getScrollTop(win);
+
+  if ((direction > 0 && scrollTop < targetScroll) ||
+      (direction < 0 && scrollTop > targetScroll)) {
+    win.scrollTo(M_getPageOffsetLeft(element), targetScroll);
+  }
+}
+
+/**
+ * Returns whether the element is visible.
+ * @param {Window} win The window that the element resides in
+ * @param {Element} element The element whose visibility we want to determine
+ * @return Boolean of whether the element is visible in the window or not
+ */
+function M_isElementVisible(win, element) {
+  var elTop = M_getPageOffsetTop(element);
+  var winHeight = M_getWindowHeight(win);
+  var winTop = M_getScrollTop(win);
+  if (elTop < winTop || elTop > winTop + winHeight) {
+    return false;
+  }
+  return true;
+}
+
+// Cross-browser compatibility quirks and methodology borrowed from
+// common.js
+
+var M_getWindowHeightGetters_ = {
+  ieQuirks_: function(win) {
+    return win.document.body.clientHeight;
+  },
+  ieStandards_: function(win) {
+    return win.document.documentElement.clientHeight;
+  },
+  dom_: function(win) {
+    return win.innerHeight;
+  }
+};
+
+var M_getScrollTopGetters_ = {
+  ieQuirks_: function(win) {
+    return win.document.body.scrollTop;
+  },
+  ieStandards_: function(win) {
+    return win.document.documentElement.scrollTop;
+  },
+  dom_: function(win) {
+    return win.pageYOffset;
+  }
+};
+
+/**
+ * Slightly modified from common.js: Konqueror has the CSS1Compat property
+ * but requires the standard DOM functionlity, not the IE one.
+ */
+function M_getWindowPropertyByBrowser_(win, getters) {
+  try {
+    if (!M_isKHTML() && "compatMode" in win.document &&
+        win.document.compatMode == "CSS1Compat") {
+      return getters.ieStandards_(win);
+    } else if (M_isIE()) {
+      return getters.ieQuirks_(win);
+    }
+  } catch (e) {
+    // Ignore for now and fall back to DOM method
+  }
+
+  return getters.dom_(win);
+}
+
+// Global search box magic (global.html)
+
+/**
+ * Handle the onblur action of the search box, replacing it with greyed out
+ * instruction text when it is empty.
+ * @param {Element} element The search box element
+ */
+function M_onSearchBlur(element) {
+  var defaultMsg = "Enter a changelist#, user, or group";
+  if (element.value.length == 0 || element.value == defaultMsg) {
+    element.style.color = "gray";
+    element.value = defaultMsg;
+  } else {
+    element.style.color = "";
+  }
+}
+
+/**
+ * Handle the onfocus action of the search box, emptying it out if no new text
+ * was entered.
+ * @param {Element} element The search box element
+ */
+function M_onSearchFocus(element) {
+  if (element.style.color == "gray") {
+    element.style.color = "";
+    element.value = "";
+  }
+}
+
+// Inline diffs (changelist.html)
+
+/**
+ * Creates an iframe to load the diff in the background and when that's done,
+ * calls a function to transfer the contents of the iframe into the current DOM.
+ * @param {Integer} suffix The number associated with that diff
+ * @param {String} url The URL that the diff should be fetched from
+ * @return false (for event bubbling purposes)
+ */
+function M_showInlineDiff(suffix, url) {
+  var hide = document.getElementById("hide-" + suffix);
+  var show = document.getElementById("show-" + suffix);
+  var frameDiv = document.getElementById("frameDiv-" + suffix);
+  var dumpDiv = document.getElementById("dumpDiv-" + suffix);
+  var diffTR = document.getElementById("diffTR-" + suffix);
+  var hideAll = document.getElementById("hide-alldiffs");
+  var showAll = document.getElementById("show-alldiffs");
+
+  /* Twiddle the "show/hide all diffs" link */
+  if (hide.style.display != "") {
+    M_CL_hiddenInlineDiffCount -= 1;
+    if (M_CL_hiddenInlineDiffCount == M_CL_maxHiddenInlineDiffCount) {
+      showAll.style.display = "inline";
+      hideAll.style.display = "none";
+    } else {
+      showAll.style.display = "none";
+      hideAll.style.display = "inline";
+    }
+  }
+
+  hide.style.display = "";
+  show.style.display = "none";
+  dumpDiv.style.display = "block"; // XXX why not ""?
+  diffTR.style.display = "";
+  if (!frameDiv.innerHTML) {
+    if (M_isKHTML()) {
+      frameDiv.style.display = "block"; // XXX why not ""?
+    }
+    frameDiv.innerHTML = "<iframe src='" + url + "'" +
+    " onload='M_dumpInlineDiffContent(this, \"" + suffix + "\")'"+
+    "height=1>your browser does not support iframes!</iframe>";
+  }
+  return false;
+}
+
+/**
+ * Hides the diff that was retrieved with M_showInlineDiff.
+ * @param {Integer} suffix The number associated with the diff we want to hide
+ */
+function M_hideInlineDiff(suffix) {
+  var hide = document.getElementById("hide-" + suffix);
+  var show = document.getElementById("show-" + suffix);
+  var dumpDiv = document.getElementById("dumpDiv-" + suffix);
+  var diffTR = document.getElementById("diffTR-" + suffix);
+  var hideAll = document.getElementById("hide-alldiffs");
+  var showAll = document.getElementById("show-alldiffs");
+
+  /* Twiddle the "show/hide all diffs" link */
+  if (hide.style.display != "none") {
+    M_CL_hiddenInlineDiffCount += 1;
+    if (M_CL_hiddenInlineDiffCount == M_CL_maxHiddenInlineDiffCount) {
+      showAll.style.display = "inline";
+      hideAll.style.display = "none";
+    } else {
+      showAll.style.display = "none";
+      hideAll.style.display = "inline";
+    }
+  }
+
+  hide.style.display = "none";
+  show.style.display = "inline";
+  diffTR.style.display = "none";
+  dumpDiv.style.display = "none";
+  return false;
+}
+
+/**
+ * Dumps the content of the given iframe into the appropriate div in order
+ * for the diff to be displayed.
+ * @param {Element} iframe The IFRAME that contains the diff data
+ * @param {Integer} suffix The number associated with the diff
+ */
+function M_dumpInlineDiffContent(iframe, suffix) {
+  var dumpDiv = document.getElementById("dumpDiv-" + suffix);
+  dumpDiv.style.display = "block"; // XXX why not ""?
+  dumpDiv.innerHTML = iframe.contentWindow.document.body.innerHTML;
+  // TODO: The following should work on all browsers instead of the
+  // innerHTML hack above. At this point I don't remember what the exact
+  // problem was, but it didn't work for some reason.
+  // dumpDiv.appendChild(iframe.contentWindow.document.body);
+  if (M_isKHTML()) {
+    var frameDiv = document.getElementById("frameDiv-" + suffix);
+    frameDiv.style.display = "none";
+  }
+}
+
+/**
+ * Goes through all the diffs and triggers the onclick action on them which
+ * should start the mechanism for displaying them.
+ * @param {Integer} num The number of diffs to display (0-indexed)
+ */
+function M_showAllDiffs(num) {
+  for (var i = 0; i < num; i++) {
+    var link = document.getElementById('show-' + i);
+    // Since the user may not have JS, the template only shows the diff inline
+    // for the onclick action, not the href. In order to activate it, we must
+    // call the link's onclick action.
+    if (link.className.indexOf("reverted") == -1) {
+      link.onclick();
+    }
+  }
+}
+
+/**
+ * Goes through all the diffs and hides them by triggering the hide link.
+ * @param {Integer} num The number of diffs to hide (0-indexed)
+ */
+function M_hideAllDiffs(num) {
+  for (var i = 0; i < num; i++) {
+    var link = document.getElementById('hide-' + i);
+    // If the user tries to hide, that means they have JS, which in turn means
+    // that we can just set href in the href of the hide link.
+    link.onclick();
+  }
+}
+
+// Inline comment submission forms (changelist.html, file.html)
+
+/**
+ * Changes the elements display style to "" which renders it visible.
+ * @param {String} id The id of the target element
+ */
+function M_showElement(id) {
+  var elt = document.getElementById(id);
+  if (elt) elt.style.display = "";
+}
+
+/**
+ * Changes the elements display style to "none" which renders it invisible.
+ * @param {String} id The id of the target element
+ */
+function M_hideElement(id) {
+  var elt = document.getElementById(id);
+  if (elt) elt.style.display = "none";
+}
+
+/**
+ * Toggle the visibility of a section. The little indicator triangle will also
+ * be toggled.
+ * @param {String} id The id of the target element
+ */
+var isSectionOpen = new Array();
+function M_toggleSection(id) {
+  var sectionStyle = document.getElementById(id).style;
+  var pointerStyle = document.getElementById(id + "-pointer").style;
+
+  if (sectionStyle.display == "none") {
+    sectionStyle.display = "";
+    pointerStyle.backgroundImage = "url('/static/opentriangle.gif')";
+    isSectionOpen[id] = true;
+  } else {
+    sectionStyle.display = "none";
+    pointerStyle.backgroundImage = "url('/static/closedtriangle.gif')";
+    isSectionOpen[id] = false;
+  }
+}
+
+var patchSetState = new Array();
+function M_onPatchSetReady() {
+  if (http_request.readyState != 4)
+    return;
+
+  var id = http_request.div_id;
+  var s = document.getElementById(id);
+  if (http_request.status == 200) {
+	patchSetState[id] = 1;
+    s.innerHTML = http_request.responseText;
+  } else {
+	patchSetState[id] = -1;
+    s.innerHTML = '<div style="color:red">'
+	  + 'Could not load the patchset.<br />'
+	  + http_request.status
+	  + '</div>';
+  }
+}
+
+/**
+ * Toggle the visiblity of a PatchSet section.
+ * @param {String} change_id the id of the change.
+ * @param {String} patchset_id the id of the patchset.
+ */
+function M_togglePatchSetSection(change_id, patchset_id) {
+  var id = 'ps-' + patchset_id;
+  M_toggleSection(id);
+  if (isSectionOpen[id]) {
+    if (patchSetState[id] == 1)
+      return;
+
+    var s = document.getElementById(id);
+    http_request = M_getXMLHttpRequest();
+    if (!http_request) {
+      patchSetState[id] = -1;
+      s.innerHTML = '<div style="color:red">Could not load.</div>';
+      return;
+    }
+
+    s.innerHTML = '<div>Loading...</div>';
+    var u = '/' + change_id + '/ajax_patchset/' + patchset_id;
+    http_request.open('GET', u, true);
+    http_request.onreadystatechange = M_onPatchSetReady;
+    http_request.div_id = id;
+    http_request.send(null);
+  }
+}
+
+function M_onPagedReady () {
+  if (http_request.readyState != 4)
+    return;
+
+  var section = http_request.section_name;
+  var links = document.getElementById('paged-' + section + '-links');
+  var progs = document.getElementById('paged-' + section + '-progress');
+
+  if (http_request.status != 200) {
+    links.style.display = '';
+    progs.style.display = 'none';
+    return;
+  }
+
+  var t = document.getElementById(http_request.table_id);
+  var last;
+  for (var i = 0; i < t.rows.length;) {
+    var r = t.rows[i];
+    if (r.className.indexOf('pagedrow-'+section) >= 0) {
+      t.deleteRow(i);
+      last = t.rows[i];
+    } else {
+      i++;
+    }
+  }
+
+  var text = http_request.responseText;
+  var lf = text.indexOf('\n');
+  var info = text.substring(0,lf).split(',');
+
+  var tmp = document.createElement('table');
+  tmp.innerHTML = text.substring(lf + 1);
+  while (0 < tmp.rows.length) {
+    if (last)
+      last.parentNode.insertBefore(tmp.rows[0], last);
+    else
+      t.tBodies[0].appendChild(tmp.rows[0]);
+  }
+
+  var opos = document.getElementById('paged-'+section+'-opos');
+  var oend = document.getElementById('paged-'+section+'-oend');
+
+  var opre = document.getElementById('paged-'+section+'-opre');
+  var onex = document.getElementById('paged-'+section+'-onex');
+
+  var prev = document.getElementById('paged-'+section+'-prev');
+  var next = document.getElementById('paged-'+section+'-next');
+
+  opos.innerHTML = info[0];
+  oend.innerHTML = info[1];
+  opre.innerHTML = info[2];
+  onex.innerHTML = info[3];
+
+  prev.style.display = info[2]!='' && parseInt(info[2]) ? '' : 'none';
+  next.style.display = info[3]!='' && parseInt(info[3]) ? '' : 'none';
+
+  links.style.display = '';
+  progs.style.display = 'none';
+
+  if (http_request.after_update)
+    http_request.after_update();
+}
+
+function M_PagedExec(base_url, section, table_id, offset, after) {
+  http_request = M_getXMLHttpRequest();
+  if (!http_request)
+    return;
+
+  var links = document.getElementById('paged-' + section + '-links');
+  var progs = document.getElementById('paged-' + section + '-progress');
+
+  links.style.display = 'none';
+  progs.style.display = '';
+
+  http_request.open('GET', base_url + '/' + offset, true);
+  http_request.onreadystatechange = M_onPagedReady;
+  http_request.section_name = section;
+  http_request.table_id = table_id;
+  http_request.after_update = after;
+  http_request.send(null);
+}
+
+function M_PagedPrev(base_url, section, table_id, after) {
+  var p = document.getElementById('paged-' + section + '-opre');
+  M_PagedExec(base_url, section, table_id, p.textContent, after);
+}
+
+function M_PagedNext(base_url, section, table_id, after) {
+  var p = document.getElementById('paged-' + section + '-onex');
+  M_PagedExec(base_url, section, table_id, p.textContent, after);
+}
+
+/**
+ * Toggle the visibility of the "Quick LGTM" link on the changelist page.
+ * @param {String} id The id of the target element
+ */
+function M_toggleQuickLGTM(id) {
+  M_toggleSection(id);
+  window.scrollTo(0, document.body.offsetHeight);
+}
+
+// Comment expand/collapse
+
+/**
+ * Toggles whether the specified changelist comment is expanded/collapsed.
+ * @param {Integer} cid The comment id, 0-indexed
+ */
+function M_switchChangelistComment(cid) {
+  M_switchCommentCommon_('cl', String(cid));
+}
+
+/**
+ * Toggles whether the specified file comment is expanded/collapsed.
+ * @param {Integer} cid The comment id, 0-indexed
+ */
+function M_switchFileComment(cid) {
+  M_switchCommentCommon_('file', String(cid));
+}
+
+/**
+ * Toggles whether the specified inline comment is expanded/collapsed.
+ * @param {Integer} cid The comment id, 0-indexed
+ * @param {Integer} lineno The lineno associated with the comment
+ * @param {String} side The side (a/b) associated with the comment
+ */
+function M_switchInlineComment(cid, lineno, side) {
+  M_switchCommentCommon_('inline', String(cid) + "-" + lineno + "-" + side);
+}
+
+/**
+ * Toggles whether the specified comment is expanded/collapsed on
+ * comment_form.html.
+ * @param {Integer} cid The comment id, 0-indexed
+ */
+function M_switchReviewComment(cid) {
+  M_switchCommentCommon_('cl', String(cid));
+}
+
+/**
+ * Toggle whether a moved_out region is expanded/collapsed.
+ * @param {Integer} start_line the line number of the first line to toggle
+ * @param {Integer} end_line the line number of the first line not to toggle
+ * We toggle all lines in [first_line, end_line).
+ */
+function M_switchMoveOut(start_line, end_line) {
+  for (var x = start_line; x < end_line; x++) {
+    var regionname = "move_out-" + x;
+    var region = document.getElementById(regionname);
+    if (region.style.display == "none") {
+      region.style.display = "";
+    } else {
+      region.style.display = "none";
+    }
+  }
+  hookState.gotoHook(0);
+}
+
+/**
+ * Used to expand all comments, hiding the preview and showing the comment.
+ * @param {String} prefix The level of the comment -- one of
+ *                        ('cl', 'file', 'inline')
+ * @param {Integer} num_comments The number of comments to show
+ */
+function M_showAllComments(prefix, num_comments) {
+  for (var i = 0; i < num_comments; i++) {
+    document.getElementById(prefix + "-preview-" + i).style.visibility =
+        "hidden";
+    document.getElementById(prefix + "-comment-" + i).style.display = "";
+  }
+}
+
+/**
+ * Used to collpase all comments, showing the preview and hiding the comment.
+ * @param {String} prefix The level of the comment -- one of
+ *                        ('cl', 'file', 'inline')
+ * @param {Integer} num_comments The number of comments to hide
+ */
+function M_hideAllComments(prefix, num_comments) {
+  for (var i = 0; i < num_comments; i++) {
+    document.getElementById(prefix + "-preview-" + i).style.visibility =
+        "visible";
+    document.getElementById(prefix + "-comment-" + i).style.display = "none";
+  }
+}
+
+// Common methods for comment handling (changelist.html, file.html,
+// comment_form.html)
+
+/**
+ * Toggles whether the specified comment is expanded/collapsed. Works in
+ * the review form.
+ * @param {String} prefix The prefix of the comment element name.
+ * @param {String} suffix The suffix of the comment element name.
+ */
+function M_switchCommentCommon_(prefix, suffix) {
+  prefix && (prefix +=  '-');
+  suffix && (suffix =  '-' + suffix);
+  var previewSpan = document.getElementById(prefix + 'preview' + suffix);
+  var commentDiv = document.getElementById(prefix + 'comment' + suffix);
+  if (!previewSpan || !commentDiv) {
+    alert('Failed to find comment element: ' +
+          prefix + 'comment' + suffix + '. Please send ' +
+          'this message with the URL to the app owner');
+    return;
+  }
+  if (previewSpan.style.visibility == 'hidden') {
+    previewSpan.style.visibility = 'visible';
+    commentDiv.style.display = 'none';
+  } else {
+    previewSpan.style.visibility = 'hidden';
+    commentDiv.style.display = '';
+  }
+}
+
+/**
+ * Expands all inline comments.
+ */
+function M_expandAllInlineComments() {
+  M_showAllInlineComments();
+  var comments = document.getElementsByName("inline-comment");
+  var commentsLength = comments.length;
+  for (var i = 0; i < commentsLength; i++) {
+    comments[i].style.display = "";
+  }
+  var previews = document.getElementsByName("inline-preview");
+  var previewsLength = previews.length;
+  for (var i = 0; i < previewsLength; i++) {
+    previews[i].style.display = "none";
+  }
+}
+
+/**
+ * Collapses all inline comments.
+ */
+function M_collapseAllInlineComments() {
+  M_showAllInlineComments();
+  var comments = document.getElementsByName("inline-comment");
+  var commentsLength = comments.length;
+  for (var i = 0; i < commentsLength; i++) {
+    comments[i].style.display = "none";
+  }
+  var previews = document.getElementsByName("inline-preview");
+  var previewsLength = previews.length;
+  for (var i = 0; i < previewsLength; i++) {
+    previews[i].style.display = "";
+  }
+}
+
+// Non-inline comment actions
+
+/**
+ * Sets up a reply form for a given comment (non-inline).
+ * @param {String} author The author of the comment being replied to
+ * @param {String} written_time The formatted time when that comment was written
+ * @param {String} ccs A string containing the ccs to default to
+ * @param {Integer} cid The number of the comment being replied to, so that the
+ *                      form may be placed in the appropriate location
+ * @param {String} prefix The level of the comment -- one of
+ *                        ('cl', 'file', 'inline')
+ * @param {Integer} opt_lineno (optional) The line number the comment should be
+ *                                        attached to
+ * @param {String} opt_snapshot (optional) The snapshot ID of the comment being
+ *                                         replied to
+ */
+function M_replyToComment(author, written_time, ccs, cid, prefix, opt_lineno,
+                          opt_snapshot) {
+  var form = document.getElementById("comment-form-" + cid);
+  if (!form) {
+    form = document.getElementById("dareplyform");
+    if (!form) {
+      form = document.getElementById("daform"); // XXX for file.html
+    }
+    form = form.cloneNode(true);
+    form.name = form.id = "comment-form-" + cid;
+    M_createResizer_(form, cid);
+    document.getElementById(prefix + "-comment-" + cid).appendChild(form);
+  }
+  form.style.display = "";
+  form.reply_to.value = cid;
+  form.ccs.value = ccs;
+  if (typeof opt_lineno != 'undefined' && typeof opt_snapshot != 'undefined') {
+    form.lineno.value = opt_lineno;
+    form.snapshot.value = opt_snapshot;
+  }
+  form.text.value = "On " + written_time + ", " + author + " wrote:\n";
+  var divs = document.getElementsByName("comment-text-" + cid);
+  M_setValueFromDivs(divs, form.text);
+  form.text.value += "\n";
+  form.text.focus();
+}
+
+
+/**
+/* TODO(andi): docstring
+ */
+function M_replyToMessage(message_id, written_time, author) {
+  var form = document.getElementById('message-reply-form');
+  form = form.cloneNode(true);
+  if (typeof form.message == 'undefined') {
+    var form_template = document.getElementById('message-reply-form');
+    form = document.createElement('form');
+    form.setAttribute('method', 'POST');
+    form.setAttribute('action', form_template.getAttribute('action'));
+    form.innerHTML = form_template.innerHTML;
+  }
+  container = document.getElementById('message-reply-'+message_id);
+  container.appendChild(form);
+  container.style.display = '';
+  form.discard.onclick = function () {
+    document.getElementById('message-reply-href-'+message_id).style.display = "";
+    document.getElementById('message-reply-'+message_id).innerHTML = "";
+    document.getElementById('message-reply-'+message_id).style.display = "none";
+  }
+  form.send_mail.id = 'message-reply-send-mail-'+message_id;
+  var lbl = document.getElementById(form.send_mail.id).nextSibling.nextSibling;
+  lbl.setAttribute('for', form.send_mail.id);
+  form.message.value = "On " + written_time + ", " + author + " wrote:\n";
+  var divs = document.getElementsByName("cl-message-" + message_id);
+  M_setValueFromDivs(divs, form.message);
+  form.message.value += "\n";
+  form.message.focus();
+  M_addTextResizer_(form);
+  document.getElementById('message-reply-href-'+message_id).style.display = "none";
+}
+
+
+/**
+ * Edits a non-inline draft comment.
+ * @param {Integer} cid The number of the comment to be edited
+ */
+function M_editComment(cid) {
+  var suffix = String(cid);
+  var form = document.getElementById("comment-form-" + suffix);
+  if (!form) {
+    alert("Form " + suffix + " does not exist. Please send this message " +
+          "with the URL to the app owner");
+    return false;
+  }
+  var texts = document.getElementsByName("comment-text-" + suffix);
+  var textsLength = texts.length;
+  for (var i = 0; i < textsLength; i++) {
+    texts[i].style.display = "none";
+  }
+  M_hideElement("edit-link-" + suffix);
+  M_hideElement("undo-link-" + suffix);
+  form.style.display = "";
+  form.text.focus();
+}
+
+/**
+ * Used to cancel comment editing, this will revert the text of the comment
+ * and hide its form.
+ * @param {Element} form The form that contains this comment
+ * @param {Integer} cid The number of the comment being hidden
+ */
+function M_resetAndHideComment(form, cid) {
+  form.text.blur();
+  form.text.value = form.oldtext.value;
+  form.style.display = "none";
+  var texts = document.getElementsByName("comment-text-" + cid);
+  var textsLength = texts.length;
+  for (var i = 0; i < textsLength; i++) {
+    texts[i].style.display = "";
+  }
+  M_showElement("edit-link-" + cid);
+}
+
+/**
+ * Removing a draft comment is the same as setting its text contents to nothing.
+ * @param {Element} form The form containing the draft comment to be discarded
+ * @return true in order for the form submission to continue
+ */
+function M_removeComment(form) {
+  form.text.value = "";
+  return true;
+}
+
+
+// Inline comments (file.html)
+
+/**
+ * Helper method to assign an onclick handler to an inline 'Cancel' button.
+ * @param {Element} form The form containing the cancel button
+ * @param {Function} cancelHandler A function with one 'form' argument
+ * @param {Array} opt_handlerParams An array whose first three elements are:
+ *   {String} cid The number of the comment
+ *   {String} lineno The line number of the comment
+ *   {String} side 'a' or 'b'
+ */
+function M_assignToCancel_(form, cancelHandler, opt_handlerParams) {
+  var elementsLength = form.elements.length;
+  for (var i = 0; i < elementsLength; ++i) {
+    if (form.elements[i].getAttribute("name") == "cancel") {
+      form.elements[i].onclick = function() {
+        if (typeof opt_handlerParams != "undefined") {
+          var cid = opt_handlerParams[0];
+          var lineno = opt_handlerParams[1];
+          var side = opt_handlerParams[2];
+          cancelHandler(form, cid, lineno, side);
+        } else {
+          cancelHandler(form);
+        }
+      };
+      return;
+    }
+  }
+}
+
+/**
+ * Helper method to assign an onclick handler to an inline '[+]' link.
+ * @param {Element} form The form containing the resizer
+ * @param {String} suffix The suffix of the comment form id: lineno-side
+ */
+function M_createResizer_(form, suffix) {
+  if (!form.hasResizer) {
+    var resizer = document.getElementById("resizer").cloneNode(true);
+    resizer.onclick = function() {
+      var form = document.getElementById("comment-form-" + suffix);
+      if (!form) return;
+      form.text.rows += 5;
+      form.text.focus();
+    };
+
+    // Using form.elements would be far more concise, but this hack is
+    // necessary because Konqueror/Safari don't populate form.elements at this
+    // point if the form is cloned.
+    var formContainer = null;
+    for (formContainer = form.firstChild; formContainer;
+         formContainer = formContainer.nextSibling) {
+      if (formContainer.getAttribute &&
+          formContainer.getAttribute("name") == "form-container") break;
+    }
+    if (!formContainer) return;
+
+    for (var n = formContainer.firstChild; n; n = n.nextSibling) {
+      if (n.nodeName == "TEXTAREA") {
+        formContainer.insertBefore(resizer, n.nextSibling);
+        resizer.style.display = "";
+      }
+    }
+    form.hasResizer = true;
+  }
+}
+
+/**
+ * Like M_createResizer_(), but updates the form's first textarea field.
+ * This is assumed not to be the last field.
+ * @param {Element} form The form whose textarea field to update.
+ */
+function M_addTextResizer_(form) {
+  var elementsLength = form.elements.length;
+  for (var i = 0; i < elementsLength; ++i) {
+    var node = form.elements[i];
+    if (node.nodeName == "TEXTAREA") {
+      var parent = M_getParent(node);
+      var resizer = document.getElementById("resizer").cloneNode(true);
+      var next = node.nextSibling;
+      parent.insertBefore(resizer, next);
+      resizer.onclick = function() {
+	node.rows += 5;
+	node.focus();
+      };
+      resizer.style.display = "";
+      if (next && next.className == "resizer") { // Remove old resizer.
+	parent.removeChild(next);
+      }
+      break;
+    }
+  }
+}
+
+/**
+ * Helper method to assign an onclick handler to an inline 'Save' button.
+ * @param {Element} form The form containing the save button
+ * @param {String} cid The number of the comment
+ * @param {String} lineno The line number of the comment
+ * @param {String} side 'a' or 'b'
+ */
+function M_assignToSave_(form, cid, lineno, side) {
+  var elementsLength = form.elements.length;
+  for (var i = 0; i < elementsLength; ++i) {
+    if (form.elements[i].getAttribute("name") == "save") {
+      form.elements[i].onclick = function() {
+        return M_submitInlineComment(form, cid, lineno, side);
+      };
+      return;
+    }
+  }
+}
+
+/**
+ * Creates an inline comment at the given line number and side of the diff.
+ * @param {String} lineno The line number of the new comment
+ * @param {String} side Either 'a' or 'b' signifying the side of the diff
+ */
+function M_createInlineComment(lineno, side) {
+  // The first field of the suffix is typically the cid, but we choose '-1'
+  // here since the backend has not assigned the new comment a cid yet.
+  var suffix = "-1-" + lineno + "-" + side;
+  var form = document.getElementById("comment-form-" + suffix);
+  if (!form) {
+    form = document.getElementById("dainlineform").cloneNode(true);
+    if (typeof form.save == "undefined") {
+      // For Opera form elements of the cloned form aren't accessible
+      // by name but using innerHTML works.
+      form = document.createElement("form");
+      form.innerHTML = document.getElementById("dainlineform").innerHTML;
+    }
+    form.name = form.id = "comment-form-" + suffix;
+    M_assignToCancel_(form, M_removeTempInlineComment);
+    M_createResizer_(form, suffix);
+    M_assignToSave_(form, "-1", lineno, side);
+    // There is a "text" node before the "div" node
+    form.childNodes[1].setAttribute("name", "comment-border");
+    var id = (side == 'a' ? "old" : "new") + "-line-" + lineno;
+    var td = document.getElementById(id);
+    td.appendChild(form);
+    var tr = M_getParent(td);
+    tr.setAttribute("name", "hook");
+    hookState.updateHooks();
+  }
+  form.style.display = "";
+  form.lineno.value = lineno;
+  if (side == 'b') {
+    form.snapshot.value = new_snapshot;
+  } else {
+    form.snapshot.value = old_snapshot;
+  }
+  form.side.value = side;
+  var savedDraftKey = "new-" + form.lineno.value + "-" + form.snapshot.value;
+  M_restoreDraftText_(savedDraftKey, form);
+  form.text.focus();
+  hookState.gotoHook(0);
+}
+
+/**
+ * Removes a never-submitted 'Reply' inline comment from existence (created via
+ * M_replyToInlineComment).
+ * @param {Element} form The form that contains the comment to be removed
+ * @param {String} cid The number of the comment
+ * @param {String} lineno The line number of the comment
+ * @param {String} side 'a' or 'b'
+ */
+function M_removeTempReplyInlineComment(form, cid, lineno, side) {
+  var divInlineComment = M_getParent(form);
+  var divCommentBorder = M_getParent(divInlineComment);
+  var td = M_getParent(divCommentBorder);
+  var tr = M_getParent(td);
+  form.cancel.blur();
+  // The order of the subsequent lines is sensitive to browser compatibility.
+  var suffix = cid + "-" + lineno + "-" + side;
+  M_saveDraftText_("reply-" + suffix, form.text.value);
+  divInlineComment.removeChild(form);
+  M_updateRowHook(tr);
+}
+
+/**
+ * Removes a never-submitted inline comment from existence (created via
+ * M_createInlineComment). Saves the existing text for the next time a draft is
+ * created on the same line.
+ * @param {Element} form The form that contains the comment to be removed
+ */
+function M_removeTempInlineComment(form) {
+  var td = M_getParent(form);
+  var tr = M_getParent(td);
+  // The order of the subsequent lines is sensitive to browser compatibility.
+  var savedDraftKey = "new-" + form.lineno.value + "-" + form.snapshot.value;
+  M_saveDraftText_(savedDraftKey, form.text.value);
+  form.cancel.blur();
+  td.removeChild(form);
+  M_updateRowHook(tr);
+}
+
+/**
+ * Helper to edit a draft inline comment.
+ * @param {String} cid The number of the comment
+ * @param {String} lineno The line number of the comment
+ * @param {String} side 'a' or 'b'
+ * @return {Element} The form that contains the comment
+ */
+function M_editInlineCommentCommon_(cid, lineno, side) {
+  var suffix = cid + "-" + lineno + "-" + side;
+  var form = document.getElementById("comment-form-" + suffix);
+  if (!form) {
+    alert("Form " + suffix + " does not exist. Please send this message " +
+          "with the URL to the app owner");
+    return false;
+  }
+  M_createResizer_(form, suffix);
+  var texts = document.getElementsByName("comment-text-" + suffix);
+  var textsLength = texts.length;
+  for (var i = 0; i < textsLength; i++) {
+    texts[i].style.display = "none";
+  }
+  M_hideElement("edit-link-" + suffix);
+  M_hideElement("undo-link-" + suffix);
+  form.style.display = "";
+  var parent = document.getElementById("inline-comment-" + suffix);
+  if (parent && parent.style.display == "none") {
+    M_switchInlineComment(cid, lineno, side);
+  }
+  form.text.focus();
+  hookState.gotoHook(0);
+  return form;
+}
+
+/**
+ * Edits a draft inline comment.
+ * @param {String} cid The number of the comment
+ * @param {String} lineno The line number of the comment
+ * @param {String} side 'a' or 'b'
+ */
+function M_editInlineComment(cid, lineno, side) {
+  M_editInlineCommentCommon_(cid, lineno, side);
+}
+
+/**
+ * Restores a canceled draft inline comment for editing.
+ * @param {String} cid The number of the comment
+ * @param {String} lineno The line number of the comment
+ * @param {String} side 'a' or 'b'
+ */
+function M_restoreEditInlineComment(cid, lineno, side) {
+  var form = M_editInlineCommentCommon_(cid, lineno, side);
+  var savedDraftKey = "edit-" + cid + "-" + lineno + "-" + side;
+  M_restoreDraftText_(savedDraftKey, form, false);
+}
+
+/**
+ * Helper to reply to an inline comment.
+ * @param {String} author The author of the comment being replied to
+ * @param {String} written_time The formatted time when that comment was written
+ * @param {String} ccs A string containing the ccs to default to
+ * @param {String} cid The number of the comment being replied to, so that the
+ *                     form may be placed in the appropriate location
+ * @param {String} lineno The line number of the comment
+ * @param {String} side 'a' or 'b'
+ * @param {String} opt_reply The response to pre-fill with.
+ * @param {Boolean} opt_submit This will submit the comment right after
+ *                             creation. Only makes sense when opt_reply is set
+ * @return {Element} The form that contains the comment
+ */
+function M_replyToInlineCommentCommon_(author, written_time, cid, lineno,
+                                       side, opt_reply, opt_submit) {
+  var suffix = cid + "-" + lineno + "-" + side;
+  var form = document.getElementById("comment-form-" + suffix);
+  if (!form) {
+    form = document.getElementById("dainlineform").cloneNode(true);
+    form.name = form.id = "comment-form-" + suffix;
+    M_assignToCancel_(form, M_removeTempReplyInlineComment,
+                      [cid, lineno, side]);
+    M_assignToSave_(form, cid, lineno, side);
+    M_createResizer_(form, suffix);
+    var parent = document.getElementById("inline-comment-" + suffix);
+    if (parent.style.display == "none") {
+      M_switchInlineComment(cid, lineno, side);
+    }
+    parent.appendChild(form);
+  }
+  form.style.display = "";
+  form.lineno.value = lineno;
+  if (side == 'b') {
+    form.snapshot.value = new_snapshot;
+  } else {
+    form.snapshot.value = old_snapshot;
+  }
+  form.side.value = side;
+  if (!M_restoreDraftText_("reply-" + suffix, form, false) ||
+      typeof opt_reply != "undefined") {
+    form.text.value = "On " + written_time + ", " + author + " wrote:\n";
+    var divs = document.getElementsByName("comment-text-" + suffix);
+    M_setValueFromDivs(divs, form.text);
+    form.text.value += "\n";
+    if (typeof opt_reply != "undefined") {
+      form.text.value += opt_reply;
+    }
+    if (opt_submit) {
+      M_submitInlineComment(form, cid, lineno, side);
+      return;
+    }
+  }
+  form.text.focus();
+  hookState.gotoHook(0);
+  return form;
+}
+
+/**
+ * Replies to an inline comment.
+ * @param {String} author The author of the comment being replied to
+ * @param {String} written_time The formatted time when that comment was written
+ * @param {String} ccs A string containing the ccs to default to
+ * @param {String} cid The number of the comment being replied to, so that the
+ *                     form may be placed in the appropriate location
+ * @param {String} lineno The line number of the comment
+ * @param {String} side 'a' or 'b'
+ * @param {String} opt_reply The response to pre-fill with.
+ * @param {Boolean} opt_submit This will submit the comment right after
+ *                             creation. Only makes sense when opt_reply is set
+ */
+function M_replyToInlineComment(author, written_time, cid, lineno, side,
+                                opt_reply, opt_submit) {
+  M_replyToInlineCommentCommon_(author, written_time, cid, lineno, side,
+                                opt_reply, opt_submit);
+}
+
+/**
+ * Restores a canceled draft inline comment for reply.
+ * @param {String} author The author of the comment being replied to
+ * @param {String} written_time The formatted time when that comment was written
+ * @param {String} ccs A string containing the ccs to default to
+ * @param {String} cid The number of the comment being replied to, so that the
+ *                     form may be placed in the appropriate location
+ * @param {String} lineno The line number of the comment
+ * @param {String} side 'a' or 'b'
+ */
+function M_restoreReplyInlineComment(author, written_time, cid, lineno,
+                                     side) {
+  var form = M_replyToInlineCommentCommon_(author, written_time, cid,
+                                           lineno, side);
+  var savedDraftKey = "reply-" + cid + "-" + lineno + "-" + side;
+  M_restoreDraftText_(savedDraftKey, form, false);
+}
+
+/**
+ * Updates an inline comment td with the given HTML.
+ * @param {Element} td The TD that contains the inline comment
+ * @param {String} html The text to be put into .innerHTML of the td
+ */
+function M_updateInlineComment(td, html) {
+  var tr = M_getParent(td);
+  if (!tr) {
+    alert("TD had no parent. Please notify the app owner.");
+    return;
+  }
+  // The server sends back " " to make things empty, for Safari
+  if (html.length <= 1) {
+    td.innerHTML = "";
+    M_updateRowHook(tr);
+  } else {
+    td.innerHTML = html;
+    tr.name = "hook";
+    hookState.updateHooks();
+  }
+}
+
+/**
+ * Updates a comment tr's name, depending on whether there are now comments
+ * in it or not. Also updates the hook cache if required. Assumes that the
+ * given TR already has name == "hook" and only tries to remove it if all
+ * are empty.
+ * @param {Element} tr The TR containing the potential comments
+ */
+function M_updateRowHook(tr) {
+  if (!(tr && tr.cells)) return;
+  // If all of the TR's cells are empty, remove the hook name
+  var i = 0;
+  var numCells = tr.cells.length;
+  for (i = 0; i < numCells; i++) {
+    if (tr.cells[i].innerHTML != "") {
+      break;
+    }
+  }
+  if (i == numCells) {
+    tr.setAttribute("name",  "");
+    hookState.updateHooks();
+  }
+  hookState.gotoHook(0);
+}
+
+/**
+ * Submits an inline comment and updates the DOM in AJAX fashion with the new
+ * comment data for that line.
+ * @param {Element} form The form containing the submitting comment
+ * @param {String} cid The number of the comment
+ * @param {String} lineno The line number of the comment
+ * @param {String} side 'a' or 'b'
+ * @return true if AJAX fails and the form should be submitted the "old" way,
+ *         or false if the form is submitted using AJAX, preventing the regular
+ *         form submission from proceeding
+ */
+function M_submitInlineComment(form, cid, lineno, side) {
+  var td = null;
+  if (form.side.value == 'a') {
+    td = document.getElementById("old-line-" + form.lineno.value);
+  } else {
+    td = document.getElementById("new-line-" + form.lineno.value);
+  }
+  if (!td) {
+    alert("Could not find snapshot " + form.snapshot.value + "! Please let " +
+          "the app owner know.");
+    return true;
+  }
+
+  // Clear saved draft state for affected new, edited, and replied comments
+  if (typeof cid != "undefined" && typeof lineno != "undefined" && side) {
+    var suffix = cid + "-" + lineno + "-" + side;
+    M_clearDraftText_("new-" + lineno + "-" + form.snapshot.value);
+    M_clearDraftText_("edit-" + suffix);
+    M_clearDraftText_("reply-" + suffix);
+    M_hideElement("undo-link-" + suffix);
+  }
+
+  var httpreq = M_getXMLHttpRequest();
+  if (!httpreq) {
+    // No AJAX. Oh well. Go ahead and submit this the old way.
+    return true;
+  }
+
+  // Konqueror jumps to a random location for some reason
+  var scrollTop = M_getScrollTop(window);
+
+  var aborted = false;
+
+  reenable_form = function() {
+    form.save.disabled = false;
+    form.cancel.disabled = false;
+    if (form.discard != null) {
+      form.discard.disabled = false;
+    }
+    form.text.disabled = false;
+    form.style.cursor = "auto";
+  };
+
+  // This timeout can potentially race with the request coming back OK. In
+  // general, if it hasn't come back for 60 seconds, it won't ever come back.
+  var httpreq_timeout = setTimeout(function() {
+    aborted = true;
+    httpreq.abort();
+    reenable_form();
+    alert("Comment could not be submitted for 60 seconds. Please ensure " +
+          "connectivity (and that the server is up) and try again.");
+  }, 60000);
+
+  httpreq.onreadystatechange = function () {
+    // Firefox 2.0, at least, runs this with readyState = 4 but all other
+    // fields unset when the timeout aborts the request, against all
+    // documentation.
+    if (httpreq.readyState == 4 && !aborted) {
+      clearTimeout(httpreq_timeout);
+      if (httpreq.status == 200) {
+        M_updateInlineComment(td, httpreq.responseText);
+      } else {
+        reenable_form();
+        alert("An error occurred while trying to submit the comment: " +
+              httpreq.statusText);
+      }
+      if (M_isKHTML()) {
+        window.scrollTo(0, scrollTop);
+      }
+    }
+  }
+  httpreq.open("POST", "/inline_draft", true);
+  httpreq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
+  var req = [];
+  var len = form.elements.length;
+  for (var i = 0; i < len; i++) {
+    var element = form.elements[i];
+    if (element.type == "hidden" || element.type == "textarea") {
+      req.push(element.name + "=" + encodeURIComponent(element.value));
+    }
+  }
+  req.push("side=" + side);
+
+  // Disable forever. If this succeeds, then the form will end up getting
+  // rewritten, and if it fails, the page should get a refresh anyways.
+  form.save.blur();
+  form.save.disabled = true;
+  form.cancel.blur();
+  form.cancel.disabled = true;
+  if (form.discard != null) {
+    form.discard.blur();
+    form.discard.disabled = true;
+  }
+  form.text.blur();
+  form.text.disabled = true;
+  form.style.cursor = "wait";
+
+  // Send the request
+  httpreq.send(req.join("&"));
+
+  // No need to resubmit this form.
+  return false;
+}
+
+/**
+ * Removes a draft inline comment.
+ * @param {Element} form The form that contains the comment to be removed
+ * @param {String} cid The number of the comment
+ * @param {String} lineno The line number of the comment
+ * @param {String} side 'a' or 'b'
+ */
+function M_removeInlineComment(form, cid, lineno, side) {
+  // Update state to save the canceled edit text
+  var snapshot = side == "a" ? old_snapshot : new_snapshot;
+  var savedDraftKey = "new-" + lineno + "-" + snapshot;
+  var savedText = form.text.value;
+  form.text.value = "";
+  var ret = M_submitInlineComment(form, cid, lineno, side);
+  M_saveDraftText_(savedDraftKey, savedText);
+  return ret;
+}
+
+/**
+ * Combines all the divs from a single comment (generated by multiple buckets)
+ * and undoes the escaping work done by Django filters, and inserts the result
+ * into a given textarea.
+ * @param {Array} divs An array of div elements to be combined
+ * @param {Element} text The textarea whose value needs to be updated
+ */
+function M_setValueFromDivs(divs, text) {
+  lines = [];
+  var divsLength = divs.length;
+  for (var i = 0; i < divsLength; i++) {
+    lines = lines.concat(divs[i].innerHTML.split("\n"));
+  }
+  for (var i = 0; i < lines.length; i++) {
+    // Undo the <a> tags added by urlize and enliven
+    lines[i] = lines[i].replace(/<a[^>]*>/ig, "");
+    lines[i] = lines[i].replace(/<\/a>/ig, "");
+    // Undo the escape Django filter
+    lines[i] = lines[i].replace(/&gt;/ig, ">");
+    lines[i] = lines[i].replace(/&lt;/ig, "<");
+    lines[i] = lines[i].replace(/&quot;/ig, "\"");
+    lines[i] = lines[i].replace(/&#39;/ig, "'");
+    lines[i] = lines[i].replace(/&amp;/ig, "&"); // Must be last
+    text.value += "> " + lines[i] + "\n";
+  }
+}
+
+/**
+ * Undo an edit of a draft inline comment, i.e. discard changes.
+ * @param {Element} form The form containing the edits
+ * @param {String} cid The number of the comment
+ * @param {String} lineno The line number of the comment
+ * @param {String} side 'a' or 'b'
+ */
+function M_resetAndHideInlineComment(form, cid, lineno, side) {
+  // Update canceled edit state
+  var suffix = cid + "-" + lineno + "-" + side;
+  M_saveDraftText_("edit-" + suffix, form.text.value);
+  if (form.text.value != form.oldtext.value) {
+    M_showElement("undo-link-" + suffix);
+  }
+
+  form.text.blur();
+  form.text.value = form.oldtext.value;
+  form.style.display = "none";
+  var texts = document.getElementsByName("comment-text-" + suffix);
+  var textsLength = texts.length;
+  for (var i = 0; i < textsLength; i++) {
+    texts[i].style.display = "";
+  }
+  M_showElement("edit-link-" + suffix);
+  hookState.gotoHook(0);
+}
+
+/**
+ * Toggles whether we display quoted text or not, both for inline and regular
+ * comments. Inline comments will have lineno and side defined.
+ * @param {String} cid The comment number
+ * @param {String} bid The bucket number in that comment
+ * @param {String} lineno (optional) Line number of the comment
+ * @param {String} side (optional) 'a' or 'b'
+ */
+function M_switchQuotedText(cid, bid, lineno, side) {
+  var tmp = ""
+  if (typeof lineno != 'undefined' && typeof side != 'undefined')
+    tmp = "-" + lineno + "-" + side;
+  var div = document.getElementById("comment-text-" + cid + tmp + "-" + bid)
+  if (div.style.display == "none") {
+    div.style.display = "";
+  } else {
+    div.style.display = "none";
+  }
+  if (tmp != "") {
+    hookState.gotoHook(0);
+  }
+}
+
+/**
+ * Handler for the double click event in the code table element. Creates a new
+ * inline comment for that line of code on the right side of the diff.
+ * @param {Event} evt The event object for this double-click event
+ */
+function M_handleTableDblClick(evt) {
+  if (!logged_in) {
+    if (!login_warned) {
+      login_warned = true;
+      alert("Please sign in to enter inline comments.");
+    }
+    return;
+  }
+  var evt = evt ? evt : (event ? event : null);
+  var target = M_getEventTarget(evt);
+  if (target.tagName == 'INPUT' || target.tagName == 'TEXTAREA') {
+    return;
+  }
+  while (target != null && target.tagName != 'TD') {
+    target = M_getParent(target);
+  }
+  if (target == null) {
+    return;
+  }
+  var side = null;
+  if (target.id.substr(0, 7) == "newcode") {
+    side = 'b';
+  } else if (target.id.substr(0, 7) == "oldcode") {
+    side = 'a';
+  }
+  if (side != null) {
+    M_createInlineComment(parseInt(target.id.substr(7)), side);
+  }
+}
+
+/**
+ * Makes all inline comments visible. This is the default view.
+ */
+function M_showAllInlineComments() {
+  var hide = document.getElementById("hide-all-inline");
+  var show = document.getElementById("show-all-inline");
+  hide.style.display = "";
+  var elements = document.getElementsByName("comment-border");
+  var elementsLength = elements.length;
+  for (var i = 0; i < elementsLength; i++) {
+    var tr = M_getParent(M_getParent(elements[i]));
+    tr.style.display = "";
+    tr.name = "hook";
+  }
+  show.style.display = "none";
+  hookState.updateHooks();
+}
+
+/**
+ * Hides all inline comments, to make code easier ot read.
+ */
+function M_hideAllInlineComments() {
+  var hide = document.getElementById("hide-all-inline");
+  var show = document.getElementById("show-all-inline");
+  show.style.display = "";
+  var elements = document.getElementsByName("comment-border");
+  var elementsLength = elements.length;
+  for (var i = 0; i < elementsLength; i++) {
+    var tr = M_getParent(M_getParent(elements[i]));
+    tr.style.display = "none";
+    tr.name = "";
+  }
+  hide.style.display = "none";
+  hookState.updateHooks();
+}
+
+/**
+ * Flips between making inline comments visible and invisible.
+ */
+function M_toggleAllInlineComments() {
+  var show = document.getElementById("show-all-inline");
+  if (!show) {
+    return;
+  }
+  if (show.style.display == "none") {
+    M_hideAllInlineComments();
+  } else {
+    M_showAllInlineComments();
+  }
+}
+
+// File view keyboard navigation
+
+/**
+ * M_HookState class. Keeps track of the current 'hook' that we are on and
+ * responds to n/p/N/P events.
+ * @param {Window} win The window that the table is in.
+ * @constructor
+ */
+function M_HookState(win) {
+  /**
+   * -2 == top of page; -1 == diff; or index into hooks array
+   * @type Integer
+   */
+  this.hookPos = -2;
+
+  /**
+   * A cache of visible table rows with tr.name == "hook"
+   * @type Array
+   */
+  this.visibleHookCache = [];
+
+  /**
+   * The indicator element that we move around
+   * @type Element
+   */
+  this.indicator = document.getElementById("hook-sel");
+
+  /**
+   * Caches whether we are in an IE browser
+   * @type Boolean
+   */
+  this.isIE = M_isIE();
+
+  /**
+   * The window that the table with the hooks is in
+   * @type Window
+   */
+  this.win = win;
+}
+
+/**
+ * Find all the hook locations in a browser-portable fashion, and store them
+ * in a cache.
+ * @return Array of TR elements.
+ */
+M_HookState.prototype.computeHooks_ = function() {
+  var allHooks = null;
+  if (this.isIE) {
+    // IE only recognizes the 'name' attribute on tags that are supposed to
+    // have one, such as... not TR.
+    var tmpHooks = document.getElementsByTagName("TR");
+    var tmpHooksLength = tmpHooks.length;
+    allHooks = [];
+    for (var i = 0; i < tmpHooksLength; i++) {
+      if (tmpHooks[i].name == "hook") {
+        allHooks.push(tmpHooks[i]);
+      }
+    }
+  } else {
+    allHooks = document.getElementsByName("hook");
+  }
+  var visibleHooks = [];
+  var allHooksLength = allHooks.length;
+  for (var i = 0; i < allHooksLength; i++) {
+    var hook = allHooks[i];
+    if (hook.style.display == "") {
+      visibleHooks.push(hook);
+    }
+  }
+  this.visibleHookCache = visibleHooks;
+  return visibleHooks;
+};
+
+/**
+ * Recompute all the hook positions, update the hookPos, and update the
+ * indicator's position if necessary, but do not scroll.
+ */
+M_HookState.prototype.updateHooks = function() {
+  var curHook = null;
+  if (this.hookPos >= 0 && this.hookPos < this.visibleHookCache.length) {
+    curHook = this.visibleHookCache[this.hookPos];
+  }
+  this.computeHooks_();
+  var newHookPos = -1;
+  if (curHook != null) {
+    for (var i = 0; i < this.visibleHookCache.length; i++) {
+      if (this.visibleHookCache[i] == curHook) {
+        newHookPos = i;
+        break;
+      }
+    }
+  }
+  if (newHookPos != -1) {
+    this.hookPos = newHookPos;
+  }
+  this.gotoHook(0);
+};
+
+/**
+ * Update the indicator's position to be at the top of the table row.
+ * @param {Element} tr The tr whose top the indicator will be lined up with.
+ */
+M_HookState.prototype.updateIndicator_ = function(tr) {
+  // Find out where the table's top is, and add one so that when we align
+  // the position indicator, it takes off 1px from one tr and 1px from another.
+  // This must be computed every time since the top of the table may move due
+  // to window resizing.
+  var tableTop = M_getPageOffsetTop(document.getElementById("table-top")) + 1;
+
+  this.indicator.style.top = String(M_getPageOffsetTop(tr) -
+                                    tableTop) + "px";
+  var totWidth = 0;
+  var numCells = tr.cells.length;
+  for (var i = 0; i < numCells; i++) {
+    totWidth += tr.cells[i].clientWidth;
+  }
+  this.indicator.style.left = "0px";
+  this.indicator.style.width = totWidth + "px";
+  this.indicator.style.display = "";
+};
+
+/**
+ * Update the indicator's position, and potentially scroll to the proper
+ * location. Computes the new position based on current scroll position, and
+ * whether the previously selected hook was visible.
+ * @param {Integer} direction Scroll direction: -1 for up only, 1 for down only,
+ *                            0 for no scrolling.
+ */
+M_HookState.prototype.gotoHook = function(direction) {
+  var hooks = this.visibleHookCache;
+
+  // Hide the current selection image
+  this.indicator.style.display = "none";
+
+  // Add a border to all td's in the selected row
+  if (this.hookPos < -1) {
+    if (direction != 0) {
+      window.scrollTo(0, 0);
+    }
+    this.hookPos = -2;
+  } else if (this.hookPos == -1) {
+    var diffs = document.getElementsByName("diffs");
+    if (diffs && diffs.length >= 1) {
+      diffs = diffs[0];
+    }
+    if (diffs && direction != 0) {
+      window.scrollTo(0, M_getPageOffsetTop(diffs));
+    }
+    this.updateIndicator_(document.getElementById("thecode").rows[0]);
+  } else {
+    if (this.hookPos < hooks.length) {
+      var hook = hooks[this.hookPos];
+      for (var i = 0; i < hook.cells.length; i++) {
+        var td = hook.cells[i];
+        if (td.id != null && td.id != "") {
+          if (direction != 0) {
+            M_scrollIntoView(this.win, td, direction);
+          }
+          break;
+        }
+      }
+      // Found one!
+      this.updateIndicator_(hook);
+    } else {
+      if (direction != 0) {
+        window.scrollTo(0, document.body.offsetHeight);
+      }
+      this.hookPos = hooks.length;
+      var thecode = document.getElementById("thecode");
+      this.updateIndicator_(thecode.rows[thecode.rows.length - 1]);
+    }
+  }
+};
+
+/**
+ * Set this.hookPos to the next desired hook.
+ * @param {Boolean} findComment Whether to look only for comment hooks
+ */
+M_HookState.prototype.incrementHook_ = function(findComment) {
+  var hooks = this.visibleHookCache;
+  if (findComment) {
+    this.hookPos = Math.max(0, this.hookPos + 1);
+    while (this.hookPos < hooks.length &&
+           hooks[this.hookPos].className != "inline-comments") {
+      this.hookPos++;
+    }
+  } else {
+    this.hookPos = Math.min(hooks.length, this.hookPos + 1);
+  }
+};
+
+/**
+ * Set this.hookPos to the previous desired hook.
+ * @param {Boolean} findComment Whether to look only for comment hooks
+ */
+M_HookState.prototype.decrementHook_ = function(findComment) {
+  var hooks = this.visibleHookCache;
+  if (findComment) {
+    this.hookPos = Math.min(hooks.length - 1, this.hookPos - 1);
+    while (this.hookPos >= 0 &&
+           hooks[this.hookPos].className != "inline-comments") {
+      this.hookPos--;
+    }
+  } else {
+    this.hookPos = Math.max(-2, this.hookPos - 1);
+  }
+};
+
+/**
+ * Find the first document element in sorted array elts whose vertical position
+ * is greater than the given height from the top of the document. Optionally
+ * look only for comment elements.
+ *
+ * @param {Integer} height The height in pixels from the top
+ * @param {Array.<Element>} elts Document elements
+ * @param {Boolean} findComment Whether to look only for comment elements
+ * @return {Integer} The index of such an element, or elts.length otherwise
+ */
+function M_findElementAfter_(height, elts, findComment) {
+  for (var i = 0; i < elts.length; ++i) {
+    if (M_getPageOffsetTop(elts[i]) > height) {
+      if (!findComment || elts[i].className == "inline-comments") {
+        return i;
+      }
+    }
+  }
+  return elts.length;
+}
+
+/**
+ * Find the last document element in sorted array elts whose vertical position
+ * is less than the given height from the top of the document. Optionally
+ * look only for comment elements.
+ *
+ * @param {Integer} height The height in pixels from the top
+ * @param {Array.<Element>} elts Document elements
+ * @param {Boolean} findComment Whether to look only for comment elements
+ * @return {Integer} The index of such an element, or -1 otherwise
+ */
+function M_findElementBefore_(height, elts, findComment) {
+  for (var i = elts.length - 1; i >= 0; --i) {
+    if (M_getPageOffsetTop(elts[i]) < height) {
+      if (!findComment || elts[i].className == "inline-comments") {
+        return i;
+      }
+    }
+  }
+  return -1;
+}
+
+/**
+ * Move to the next hook indicator and scroll.
+ * @param opt_findComment {Boolean} Whether to look only for comment hooks
+ */
+M_HookState.prototype.gotoNextHook = function(opt_findComment) {
+  // If the current hook is not on the page, select the first hook that is
+  // either on the screen or below.
+  var hooks = this.visibleHookCache;
+  var diffs = document.getElementsByName("diffs");
+  var thecode = document.getElementById("thecode");
+  var findComment = Boolean(opt_findComment);
+  if (diffs && diffs.length >= 1) {
+    diffs = diffs[0];
+  }
+  if (this.hookPos >= 0 && this.hookPos < hooks.length &&
+      M_isElementVisible(this.win, hooks[this.hookPos].cells[0])) {
+    this.incrementHook_(findComment);
+  } else if (this.hookPos == -2 &&
+             (M_isElementVisible(this.win, diffs) ||
+              M_getScrollTop(this.win) < M_getPageOffsetTop(diffs))) {
+    this.incrementHook_(findComment)
+  } else if (this.hookPos < hooks.length || (this.hookPos >= hooks.length &&
+             !M_isElementVisible(
+               this.win, thecode.rows[thecode.rows.length - 1].cells[0]))) {
+    var scrollTop = M_getScrollTop(this.win);
+    this.hookPos = M_findElementAfter_(scrollTop, hooks, findComment);
+  }
+  this.gotoHook(1);
+};
+
+/**
+ * Move to the previous hook indicator and scroll.
+ * @param opt_findComment {Boolean} Whether to look only for comment hooks
+ */
+M_HookState.prototype.gotoPrevHook = function(opt_findComment) {
+  // If the current hook is not on the page, select the last hook that is
+  // above the bottom of the screen window.
+  var hooks = this.visibleHookCache;
+  var diffs = document.getElementsByName("diffs");
+  var findComment = Boolean(opt_findComment);
+  if (diffs && diffs.length >= 1) {
+    diffs = diffs[0];
+  }
+  if (this.hookPos == 0 && findComment) {
+    this.hookPos = -2;
+  } else if (this.hookPos >= 0 && this.hookPos < hooks.length &&
+      M_isElementVisible(this.win, hooks[this.hookPos].cells[0])) {
+    this.decrementHook_(findComment);
+  } else if (this.hookPos > hooks.length) {
+    this.hookPos = hooks.length;
+  } else if (this.hookPos == -1 && M_isElementVisible(this.win, diffs)) {
+    this.decrementHook_(findComment);
+  } else if (this.hookPos == -2 && M_getScrollTop(this.win) == 0) {
+  } else {
+    var scrollBot = M_getScrollTop(this.win) + M_getWindowHeight(this.win);
+    this.hookPos = M_findElementBefore_(scrollBot, hooks, findComment);
+  }
+  // The top of the diffs table is irrelevant if we want comment hooks.
+  if (findComment && this.hookPos <= -1) {
+    this.hookPos = -2;
+  }
+  this.gotoHook(-1);
+};
+
+/**
+ * If the currently selected hook is a comment, either respond to it or edit
+ * the draft if there is one already. Prefer the right side of the table.
+ */
+M_HookState.prototype.respond = function() {
+  var hooks = this.visibleHookCache;
+  if (this.hookPos >= 0 && this.hookPos < hooks.length &&
+      M_isElementVisible(this.win, hooks[this.hookPos].cells[0])) {
+    // Go through this tr and try responding to the last comment. The general
+    // hope is that these are returned in DOM order
+    var comments = hooks[this.hookPos].getElementsByTagName("div");
+    var commentsLength = comments.length;
+    if (comments && commentsLength > 0) {
+      var last = null;
+      for (var i = commentsLength - 1; i >= 0; i--) {
+        if (comments[i].getAttribute("name") == "comment-border") {
+          last = comments[i];
+          break;
+        }
+      }
+      if (last) {
+        var links = last.getElementsByTagName("a");
+        if (links) {
+          for (var i = links.length - 1; i >= 0; i--) {
+            if (links[i].getAttribute("name") == "comment-reply" &&
+                links[i].style.display != "none") {
+              document.location.href = links[i].href;
+              return;
+            }
+          }
+        }
+      }
+    }
+    // Create a comment at this line
+    // TODO: Implement this in a sane fashion, e.g. opens up a comment
+    // at the end of the diff chunk.
+    /*
+    var tr = hooks[this.hookPos];
+    for (var i = tr.cells.length - 1; i >= 0; i--) {
+      if (tr.cells[i].id.substr(0, 7) == "newcode") {
+        createInlineComment(parseInt(tr.cells[i].id.substr(7)), 'b');
+        return;
+      } else if (tr.cells[i].id.substr(0, 7) == "oldcode") {
+        createInlineComment(parseInt(tr.cells[i].id.substr(7)), 'a');
+        return;
+      }
+    }
+    */
+  }
+};
+
+// Intra-line diff handling
+
+/**
+ * IntraLineDiff class. Initializes structures to keep track of highlighting
+ * state.
+ * @constructor
+ */
+function M_IntraLineDiff() {
+  /**
+   * Whether we are showing intra-line changes or not
+   * @type Boolean
+   */
+  this.intraLine = true;
+
+  /**
+   * "oldreplace" css rule
+   * @type CSSStyleRule
+   */
+  this.oldReplace = null;
+
+  /**
+   * "oldlight" css rule
+   * @type CSSStyleRule
+   */
+  this.oldLight = null;
+
+  /**
+   * "newreplace" css rule
+   * @type CSSStyleRule
+   */
+  this.newReplace = null;
+
+  /**
+   * "newlight" css rule
+   * @type CSSStyleRule
+   */
+  this.newLight = null;
+
+  /**
+   * backup of the "oldreplace" css rule's background color
+   * @type DOMString
+   */
+  this.saveOldReplaceBkgClr = null;
+
+  /**
+   * backup of the "newreplace" css rule's background color
+   * @type DOMString
+   */
+  this.saveNewReplaceBkgClr = null;
+
+  /**
+   * "oldreplace1" css rule's background color
+   * @type DOMString
+   */
+  this.oldIntraBkgClr = null;
+
+  /**
+   * "newreplace1" css rule's background color
+   * @type DOMString
+   */
+  this.newIntraBkgClr = null;
+
+  this.findStyles_();
+}
+
+/**
+ * Finds the styles in the document and keeps references to them in this class
+ * instance.
+ */
+M_IntraLineDiff.prototype.findStyles_ = function() {
+  var ss = document.styleSheets[0];
+  var rules = [];
+  if (ss.cssRules) {
+    rules = ss.cssRules;
+  } else if (ss.rules) {
+    rules = ss.rules;
+  }
+  for (var i = 0; i < rules.length; i++) {
+    var rule = rules[i];
+    if (rule.selectorText == ".oldreplace1") {
+      this.oldIntraBkgClr = rule.style.backgroundColor;
+    } else if (rule.selectorText == ".newreplace1") {
+      this.newIntraBkgClr = rule.style.backgroundColor;
+    } else if (rule.selectorText == ".oldreplace") {
+      this.oldReplace = rule;
+      this.saveOldReplaceBkgClr = this.oldReplace.style.backgroundColor;
+    } else if (rule.selectorText == ".newreplace") {
+      this.newReplace = rule;
+      this.saveNewReplaceBkgClr = this.newReplace.style.backgroundColor;
+    } else if (rule.selectorText == ".oldlight") {
+      this.oldLight = rule;
+    } else if (rule.selectorText == ".newlight") {
+      this.newLight = rule;
+    }
+  }
+};
+
+/**
+ * Toggle the highlighting of the intra line diffs, alternatively turning
+ * them on and off.
+ */
+M_IntraLineDiff.prototype.toggle = function() {
+  if (this.intraLine) {
+    this.oldReplace.style.backgroundColor = this.oldIntraBkgClr;
+    this.oldLight.style.backgroundColor = this.oldIntraBkgClr;
+    this.newReplace.style.backgroundColor = this.newIntraBkgClr;
+    this.newLight.style.backgroundColor = this.newIntraBkgClr;
+    this.intraLine = false;
+  } else {
+    this.oldReplace.style.backgroundColor = this.saveOldReplaceBkgClr;
+    this.oldLight.style.backgroundColor = this.saveOldReplaceBkgClr;
+    this.newReplace.style.backgroundColor = this.saveNewReplaceBkgClr;
+    this.newLight.style.backgroundColor = this.saveNewReplaceBkgClr;
+    this.intraLine = true;
+  }
+};
+
+/**
+ * A click handler common to just about every page, set in global.html.
+ * @param {Event} evt The event object that triggered this handler.
+ * @return false if the event was handled.
+ */
+function M_clickCommon(evt) {
+  if (helpDisplayed) {
+    var help = document.getElementById("help");
+    help.style.display = "none";
+    helpDisplayed = false;
+    return false;
+  }
+  return true;
+}
+
+/**
+ * Common keypress handling code for all pages.
+ * @param {Event} evt The event object that triggered this callback
+ * @param {function(string)} handler Handles the specific key pressed;
+ *        returns false if the key press was handled.
+ * @param {function(Event, Node, int, string)} input_handler
+ *        Handles the event in case that the event source is an input field.
+ *        returns false if the key press was handled.
+ * @return false if the event was handled
+ */
+function M_keyPressCommon(evt, handler, input_handler) {
+  var evt = (evt) ? evt : ((event) ? event : null);
+  if (evt) {
+    var src = M_getEventTarget(evt);
+    var nodename = src.nodeName;
+    var key, code;
+    if (evt.keyCode) {
+      code = evt.keyCode;
+    } else if (evt.which) {
+      code = evt.which;
+    }
+    key = String.fromCharCode(code);
+    if (nodename == "TEXTAREA" || nodename == "INPUT" ) {
+      if (typeof input_handler != 'undefined') {
+        return input_handler(evt, src, code, key);
+      }
+      return true;
+    }
+    if (evt.altKey || evt.altLeft ||
+        evt.ctrlKey || evt.ctrlLeft ||
+        evt.metaKey) {
+      // Ignore if any modifier keys are set
+      return true;
+    }
+    if (key == '?' ||
+	code == (window.event ? 27 /* ESC */ : evt.DOM_VK_ESCAPE)) {
+      var help = document.getElementById("help");
+      if (help && typeof helpDisplayed != "undefined") {
+	// Only allow the help to be turned on with the ? key.
+	if (helpDisplayed || key == '?') {
+	  helpDisplayed = !helpDisplayed;
+	}
+	help.style.display = helpDisplayed ? "" : "none";
+      }
+      return false;
+    }
+    return handler(key);
+  }
+  return true;
+}
+
+/**
+ * Helper event handler for the keypress event in a comment textarea.
+ * @param {Event} evt The event object that triggered this callback
+ * @param {Node} src The textarea document element
+ * @param {int} code The key code of the key press
+ * @param {String} key The string describing the key press
+ * @return false if the key press was handled
+ */
+function M_commentTextKeyPress_(evt, src, code, key) {
+  if (src.nodeName == "TEXTAREA") {
+    if (evt.ctrlKey || evt.ctrlLeft) {
+      if (key == 's' || code == 19 /* ASCII code for ^S */) {
+        // Save the form corresponding to this text area.
+        M_disableCarefulUnload();
+        if (src.form.save.onclick) {
+          return src.form.save.onclick();
+        } else {
+          src.form.submit();
+          return false;
+        }
+      }
+    } else if (evt.altKey || evt.altLeft) {
+    } else if (evt.shiftKey || evt.shiftLeft) {
+    } else if (evt.metaKey) {
+    } else {
+      if (code == (window.event ? 27 /* ASCII code for Escape */
+                                : evt.DOM_VK_ESCAPE)) {
+        return src.form.cancel.onclick();
+      }
+    }
+  }
+  return true;
+}
+
+/**
+ * Event handler for the keypress event in the file view.
+ * @param {Event} evt The event object that triggered this callback
+ * @return false if the key press was handled
+ */
+function M_keyPress(evt) {
+  return M_keyPressCommon(evt, function(key) {
+    if (key == 'n') {
+      // next diff
+      if (hookState) hookState.gotoNextHook();
+    } else if (key == 'p') {
+      // previous diff
+      if (hookState) hookState.gotoPrevHook();
+    } else if (key == 'N') {
+      // next comment
+      if (hookState) hookState.gotoNextHook(true);
+    } else if (key == 'P') {
+      // previous comment
+      if (hookState) hookState.gotoPrevHook(true);
+    } else if (key == 'j') {
+      // next file
+      var nextFile = document.getElementById('nextFile');
+      if (nextFile) {
+        document.location.href = nextFile.href;
+      } else {
+        M_upToChangelist();
+      }
+    } else if (key == 'k') {
+      // prev file
+      var prevFile = document.getElementById('prevFile');
+      if (prevFile) {
+        document.location.href = prevFile.href;
+      } else {
+        M_upToChangelist();
+      }
+    } else if (key == 'm') {
+      document.location.href = publish_link;
+    } else if (key == 'u') {
+      // up to CL
+      M_upToChangelist();
+    } else if (key == 'i') {
+      // toggle intra line diff
+      if (intraLineDiff) intraLineDiff.toggle();
+    } else if (key == 's') {
+      // toggle show/hide inline comments
+      M_toggleAllInlineComments();
+    } else if (key == 'e') {
+      M_expandAllInlineComments();
+    } else if (key == 'c') {
+      M_collapseAllInlineComments();
+    } else if (key == '\r' || key == '\n') {
+      // respond to current comment
+      if (hookState) hookState.respond();
+    } else {
+      return true;
+    }
+    return false;
+  }, M_commentTextKeyPress_);
+}
+
+/**
+ * Event handler for the keypress event in the changelist view.
+ * @param {Event} evt The event object that triggered this callback
+ * @return false if the key press was handled
+ */
+function M_changelistKeyPress(evt) {
+  return M_keyPressCommon(evt, function(key) {
+    if (key == 'o' || key == '\r' || key == '\n') {
+      if (dashboardState) {
+	var child = dashboardState.curTR.cells[1].firstChild;
+	while (child && child.nextSibling && child.nodeName != "A") {
+	  child = child.nextSibling;
+	}
+	if (child && child.nodeName == "A") {
+	  location.href = child.href;
+	}
+      }
+    } else if (key == 'i') {
+      if (dashboardState) {
+	var child = dashboardState.curTR.cells[2].firstChild;
+	while (child && child.nextSibling &&
+	       (child.nodeName != "A" || child.style.display == "none")) {
+	  child = child.nextSibling;
+	}
+	if (child && child.nodeName == "A") {
+	  child.onclick();
+	}
+      }
+    } else if (key == 'I') {
+      if (M_CL_hiddenInlineDiffCount == M_CL_maxHiddenInlineDiffCount) {
+        M_showAllDiffs(M_CL_maxHiddenInlineDiffCount);
+      } else {
+	M_hideAllDiffs(M_CL_maxHiddenInlineDiffCount);
+      }
+    } else if (key == 'k') {
+      if (dashboardState) dashboardState.gotoPrev();
+    } else if (key == 'j') {
+      if (dashboardState) dashboardState.gotoNext();
+    } else if (key == 'm') {
+      document.location.href = publish_link;
+    } else if (key == 'u') {
+      // back to dashboard
+      document.location.href = '/';
+    } else {
+      return true;
+    }
+    return false;
+  });
+}
+
+/**
+ * Goes from the file view back up to the changelist view.
+ */
+function M_upToChangelist() {
+  var upCL = document.getElementById('upCL');
+  if (upCL) {
+    document.location.href = upCL.href;
+  }
+}
+
+/**
+ * Asynchronously request static analysis warnings as comments.
+ * @param {String} cl The current changelist
+ * @param {String} depot_path The id of the target element
+ * @param {String} a The version number of the left side to be analyzed
+ * @param {String} b The version number of the right side to be analyzed
+ */
+function M_getBugbotComments(cl, depot_path, a, b) {
+  var httpreq = M_getXMLHttpRequest();
+  if (!httpreq) {
+    return;
+  }
+
+  // Konqueror jumps to a random location for some reason
+  var scrollTop = M_getScrollTop(window);
+
+  httpreq.onreadystatechange = function () {
+    // Firefox 2.0, at least, runs this with readyState = 4 but all other
+    // fields unset when the timeout aborts the request, against all
+    // documentation.
+    if (httpreq.readyState == 4) {
+      if (httpreq.status == 200) {
+        M_updateWarningStatus(httpreq.responseText);
+      }
+      if (M_isKHTML()) {
+        window.scrollTo(0, scrollTop);
+      }
+    }
+  }
+  httpreq.open("GET", "/warnings/" + cl + "/" + depot_path +
+               "?a=" + a + "&b=" + b, true);
+  httpreq.send(null);
+}
+
+/**
+ * Updates a warning status td with the given HTML.
+ * @param {String} result The new html to replace the existing content
+ */
+function M_updateWarningStatus(result) {
+  var elem = document.getElementById("warnings");
+  elem.innerHTML = result;
+  if (hookState) hookState.updateHooks();
+}
+
+/* Ripped off from Caribou */
+var M_CONFIRM_DISCARD_NEW_MSG = "Your draft comment has not been saved " +
+                                "or sent.\n\nDiscard your comment?";
+
+var M_useCarefulUnload = true;
+
+
+/**
+ * Return an alert if the specified textarea is visible and non-empty.
+ */
+function M_carefulUnload(text_area_id) {
+  return function () {
+    var text_area = document.getElementById(text_area_id);
+    if (!text_area) return;
+    var text_parent = M_getParent(text_area);
+    if (M_useCarefulUnload && text_area.style.display != "none"
+                           && text_parent.style.display != "none"
+                           && goog.string.trim(text_area.value)) {
+      return M_CONFIRM_DISCARD_NEW_MSG;
+    }
+  };
+}
+
+function M_disableCarefulUnload() {
+  M_useCarefulUnload = false;
+}
+
+// History Table
+
+/**
+ * Toggles visibility of the snapshots that belong to the given parent.
+ * @param {String} parent The parent's index
+ * @param {Boolean} opt_show If present, whether to show or hide the group
+ */
+function M_toggleGroup(parent, opt_show) {
+  var children = M_historyChildren[parent];
+  if (children.length == 1) {  // No children.
+    return;
+  }
+
+  var show = (typeof opt_show != "undefined") ? opt_show :
+    (document.getElementById("history-" + children[1]).style.display != "");
+  for (var i = 1; i < children.length; i++) {
+    var child = document.getElementById("history-" + children[i]);
+    child.style.display = show ? "" : "none";
+  }
+
+  var arrow = document.getElementById("triangle-" + parent);
+  if (arrow) {
+    arrow.className = "triangle-" + (show ? "open" : "closed");
+  }
+}
+
+/**
+ * Makes the given groups visible.
+ * @param {Array.<Number>} parents The indexes of the parents of the groups
+ *     to show.
+ */
+function M_expandGroups(parents) {
+  for (var i = 0; i < parents.length; i++) {
+    M_toggleGroup(parents[i], true);
+  }
+  document.getElementById("history-expander").style.display = "none";
+  document.getElementById("history-collapser").style.display = "";
+}
+
+/**
+ * Hides the given parents, except for groups that contain the
+ * selected radio buttons.
+ * @param {Array.<Number>} parents The indexes of the parents of the groups
+ *     to hide.
+ */
+function M_collapseGroups(parents) {
+  // Find the selected snapshots
+  var parentsToLeaveOpen = {};
+  var form = document.getElementById("history-form");
+  var formLength = form.a.length;
+  for (var i = 0; i < formLength; i++) {
+    if (form.a[i].checked || form.b[i].checked) {
+      var element = "history-" + form.a[i].value;
+      var name = document.getElementById(element).getAttribute("name");
+      if (name != "parent") {
+        // The name of a child is "parent-%d" % parent_index.
+        var parentIndex = Number(name.match(/parent-(\d+)/)[1]);
+        parentsToLeaveOpen[parentIndex] = true;
+      }
+    }
+  }
+
+  // Collapse the parents we need to collapse.
+  for (var i = 0; i < parents.length; i++) {
+    if (!(parents[i] in parentsToLeaveOpen)) {
+      M_toggleGroup(parents[i], false);
+    }
+  }
+  document.getElementById("history-expander").style.display = "";
+  document.getElementById("history-collapser").style.display = "none";
+}
+
+/**
+ * Expands the reverted files section of the files list in the changelist view.
+ *
+ * @param {String} tableid The id of the table element that contains hidden TR's
+ * @param {String} hide The id of the element to hide after this is completed.
+ */
+function M_showRevertedFiles(tableid, hide) {
+  var table = document.getElementById(tableid);
+  if (!table) return;
+  var rowsLength = table.rows.length;
+  for (var i = 0; i < rowsLength; i++) {
+    var row = table.rows[i];
+    if (row.getAttribute("name") == "afile") row.style.display = "";
+  }
+  if (dashboardState) dashboardState.initialize();
+  var h = document.getElementById(hide);
+  if (h) h.style.display = "none";
+}
+
+// Undo draft cancel
+
+/**
+ * An associative array mapping keys that identify inline comments to draft
+ * text values.
+ *   New inline comments have keys 'new-lineno-snapshot_id'
+ *   Edit inline comments have keys 'edit-cid-lineno-side'
+ *   Reply inline comments have keys 'reply-cid-lineno-side'
+ * @type Object
+ */
+var M_savedInlineDrafts = new Object();
+
+/**
+ * Saves draft text from a form.
+ * @param {String} draftKey The key identifying the saved draft text
+ * @param {String} text The draft text to be saved
+ */
+function M_saveDraftText_(draftKey, text) {
+  M_savedInlineDrafts[draftKey] = text;
+}
+
+/**
+ * Clears saved draft text. Does nothing with an invalid key.
+ * @param {String} draftKey The key identifying the saved draft text
+ */
+function M_clearDraftText_(draftKey) {
+  delete M_savedInlineDrafts[draftKey];
+}
+
+/**
+ * Restores saved draft text to a form. Does nothing with an invalid key.
+ * @param {String} draftKey The key identifying the saved draft text
+ * @param {Element} form The form that contains the comment to be restored
+ * @param {Element} opt_selectAll Whether the restored text should be selected.
+ *                                True by default.
+ * @return {Boolean} true if we found a saved draft and false otherwise
+ */
+function M_restoreDraftText_(draftKey, form, opt_selectAll) {
+  if (M_savedInlineDrafts[draftKey]) {
+    form.text.value = M_savedInlineDrafts[draftKey];
+    if (typeof opt_selectAll == 'undefined' || opt_selectAll) {
+      form.text.select();
+    }
+    return true;
+  }
+  return false;
+}
+
+// Dashboard CL navigation
+
+/**
+ * M_DashboardState class. Keeps track of the current position of
+ * the selector on the dashboard, and moves it on keypress.
+ * @param {Window} win The window that the dashboard table is in.
+ * @param {String} trName The name of TRs that we will move between.
+ * @param {String} cookieName The cookie name to store the marker position into.
+ * @constructor
+ */
+function M_DashboardState(win, trName, cookieName) {
+  /**
+   * The position of the marker, 0-indexed into the trCache array.
+   * @ype Integer
+   */
+  this.trPos = 0;
+
+  /**
+   * The current TR object that the marker is pointing at.
+   * @type Element
+   */
+  this.curTR = null;
+
+  /**
+   * Array of tr rows that we are moving between. Computed once (updateable).
+   * @type Array
+   */
+  this.trCache = [];
+
+  /**
+   * The window that the table is in, used for positioning information.
+   * @type Window
+   */
+  this.win = win;
+
+  /**
+   * The expected name of tr's that we are going to cache.
+   * @type String
+   */
+  this.trName = trName;
+
+  /**
+   * The name of the cookie value where the marker position is stored.
+   * @type String
+   */
+  this.cookieName = cookieName;
+
+  this.initialize();
+}
+
+/**
+ * Initializes the clCache array, and moves the marker into the first position.
+ */
+M_DashboardState.prototype.initialize = function() {
+  var filter = function(arr, lambda) {
+    var ret = [];
+    var arrLength = arr.length;
+    for (var i = 0; i < arrLength; i++) {
+      if (lambda(arr[i])) {
+	ret.push(arr[i]);
+      }
+    }
+    return ret;
+  };
+  var cache;
+  if (M_isIE()) {
+    // IE does not recognize the 'name' attribute on TR tags
+    cache = filter(document.getElementsByTagName("TR"),
+		   function (elem) { return elem.name == this.trName; });
+  } else {
+    cache = document.getElementsByName(this.trName);
+  }
+
+  this.trCache = filter(cache, function (elem) {
+    return elem.style.display != "none";
+  });
+
+  if (document.cookie && this.cookieName) {
+    cookie_values = document.cookie.split(";");
+    for (var i=0; i<cookie_values.length; i++) {
+      name = cookie_values[i].split("=")[0].replace(/ /g, '');
+      if (name == this.cookieName) {
+        this.trPos = cookie_values[i].split("=")[1];
+      }
+    }
+  }
+
+  this.goto_(0);
+}
+
+/**
+ * Moves the cursor to the curCL position, and potentially scrolls the page to
+ * bring the cursor into view.
+ * @param {Integer} direction Positive for scrolling down, negative for
+ *                            scrolling up, and 0 for no scrolling.
+ */
+M_DashboardState.prototype.goto_ = function(direction) {
+  var oldTR = this.curTR;
+  if (oldTR) {
+    oldTR.cells[0].firstChild.style.visibility = "hidden";
+  }
+  this.curTR = this.trCache[this.trPos];
+  this.curTR.cells[0].firstChild.style.visibility = "";
+  if (this.cookieName) {
+    document.cookie = this.cookieName+'='+this.trPos;
+  }
+
+  if (!M_isElementVisible(this.win, this.curTR)) {
+    M_scrollIntoView(this.win, this.curTR, direction);
+  }
+}
+
+/**
+ * Moves the cursor up one.
+ */
+M_DashboardState.prototype.gotoPrev = function() {
+  if (this.trPos > 0) this.trPos--;
+  this.goto_(-1);
+}
+
+/**
+ * Moves the cursor down one.
+ */
+M_DashboardState.prototype.gotoNext = function() {
+  if (this.trPos < this.trCache.length - 1) this.trPos++;
+  this.goto_(1);
+}
+
+/**
+ * Event handler for dashboard key presses. Dispatches cursor moves, as well as
+ * opening CLs.
+ */
+function M_dashboardKeyPress(evt) {
+  return M_keyPressCommon(evt, function(key) {
+    if (key == 'k') {
+      if (dashboardState) dashboardState.gotoPrev();
+    } else if (key == 'j') {
+      if (dashboardState) dashboardState.gotoNext();
+    } else if (key == 'o' || key == '\r' || key == '\n') {
+      if (dashboardState) {
+	var child = dashboardState.curTR.cells[2].firstChild;
+	while (child && child.nodeName != "A") {
+	  child = child.firstChild;
+	}
+	if (child) {
+	  location.href = child.href;
+	}
+      }
+    } else {
+      return true;
+    }
+    return false;
+  });
+}
+
+/*
+ * Function to request more context between diff chunks.
+ * See _ShortenBuffer() in codereview/engine.py.
+ */
+function M_expandSkipped(id_before, id_after, where, id_skip) {
+  links = document.getElementById('skiplinks-'+id_skip).childNodes;
+  for (var i=0; i<links.length; i++) {
+	links[i].href = '#skiplinks-'+id_skip;
+  }
+  tr = document.getElementById('skip-'+id_skip);
+  var httpreq = M_getXMLHttpRequest();
+  if (!httpreq) {
+    html = '<td colspan="2" style="text-align: center;">';
+    html = html + 'Failed to retrieve additional lines. ';
+    html = html + 'Please update your context settings.';
+    html = html + '</td>';
+    tr.innerHTML = html;
+  }
+  aborted = false;
+  httpreq.onreadystatechange = function () {
+    if (httpreq.readyState == 4 && !aborted) {
+      if (httpreq.status == 200) {
+        response = eval('('+httpreq.responseText+')');
+        for (var i=0; i<response.length; i++) {
+          var data = response[i];
+          var row = document.createElement("tr");
+          for (var j=0; j<data[0].length; j++) {
+            row.setAttribute(data[0][j][0], data[0][j][1]);
+          }
+          if ( where == 't' ) {
+            tr.parentNode.insertBefore(row, tr);
+          } else {
+            tr.parentNode.insertBefore(row, tr.nextSibling);
+          }
+          row.innerHTML = data[1];
+        }
+        var curr = document.getElementById('skipcount-'+id_skip);
+        var new_count = parseInt(curr.innerHTML)-response.length/2;
+        if ( new_count > 0 ) {
+          if ( where == 'b' ) {
+            var new_before = id_before;
+            var new_after = id_after-response.length/2;
+          } else {
+            var new_before = id_before+response.length/2;
+            var new_after = id_after;
+          }
+          curr.innerHTML = new_count;
+          if ( new_count <= 10 ) {
+  	    html = '<a href="javascript:M_expandSkipped('+new_before;
+            html += ','+new_after+',\'b\','+id_skip+');">Show</a>  ';
+          } else {
+            var html = '<a href="javascript:M_expandSkipped('+new_before;
+            html += ','+new_after+',\'t\', '+id_skip+');">Show 10 above</a> ';
+            html += '<a href="javascript:M_expandSkipped('+new_before;
+            html += ','+new_after+',\'b\','+id_skip+');">Show 10 below</a> ';
+          }
+          document.getElementById('skiplinks-'+(id_skip)).innerHTML = html;
+        } else {
+          tr.parentNode.removeChild(tr);
+        }
+        if (hookState.hookPos != -2 &&
+            M_isElementVisible(window, hookState.indicator)) {
+          hookState.gotoHook(-1);
+        }
+      }
+    }
+  }
+
+  url = skipped_lines_url+id_before+'/'+id_after+'/'+where;
+  httpreq.open('GET', url, true);
+  httpreq.send('');
+}
+
+/**
+ * Finds the element position.
+ */
+function M_getElementPosition(obj) {
+  var curleft = curtop = 0;
+  if (obj.offsetParent) {
+    do {
+      curleft += obj.offsetLeft;
+      curtop += obj.offsetTop;
+    } while (obj = obj.offsetParent);
+  }
+  return [curleft,curtop];
+}
+
+/**
+ * Position the user info popup according to the mouse event coordinates
+ */
+function M_positionUserInfoPopup(obj, userPopupDiv) {
+  pos = M_getElementPosition(obj);
+  userPopupDiv.style.left = pos[0] + "px";
+  userPopupDiv.style.top = pos[1] + 20 + "px";
+}
+
+/**
+ * Brings up user info popup using ajax
+ */
+function M_showUserInfoPopup(obj) {
+  var DIV_ID = "userPopupDiv";
+  var userPopupDiv = document.getElementById(DIV_ID);
+  var url = obj.getAttribute("href")
+  var index = url.indexOf("/user/");
+  var user_key = url.substring(index + 6);
+
+  if (!userPopupDiv) {
+    var userPopupDiv = document.createElement("div");
+    userPopupDiv.className = "popup";
+    userPopupDiv.id = DIV_ID;
+    userPopupDiv.filter = 'alpha(opacity=85)';
+    userPopupDiv.opacity = '0.85';
+    userPopupDiv.innerHTML = "";
+    userPopupDiv.onmouseout = function() {
+      userPopupDiv.style.visibility = 'hidden';
+    }
+    document.body.appendChild(userPopupDiv);
+  }
+  M_positionUserInfoPopup(obj, userPopupDiv);
+
+  var httpreq = M_getXMLHttpRequest();
+  if (!httpreq) {
+    return true;
+  }
+
+  var aborted = false;
+  var httpreq_timeout = setTimeout(function() {
+    aborted = true;
+    httpreq.abort();
+  }, 5000);
+
+  httpreq.onreadystatechange = function () {
+    if (httpreq.readyState == 4 && !aborted) {
+      clearTimeout(httpreq_timeout);
+      if (httpreq.status == 200) {
+        userPopupDiv = document.getElementById(DIV_ID);
+        userPopupDiv.innerHTML=httpreq.responseText;
+        userPopupDiv.style.visibility = "visible";
+      } else {
+        //Better fail silently here because it's not
+        //critical functionality
+      }
+    }
+  }
+  httpreq.open("GET", "/user_popup/" + user_key, true);
+  httpreq.send(null);
+  obj.onmouseout = function() {
+    aborted = true;
+    userPopupDiv.style.visibility = 'hidden';
+    obj.onmouseout = null;
+  }
+}
+
+/**
+ * TODO(jiayao,andi): docstring
+ */
+function M_showPopUp(obj, id) {
+  var popup = document.getElementById(id);
+  var pos = M_getElementPosition(obj);
+  popup.style.left = pos[0]+'px';
+  popup.style.top = pos[1]+20+'px';
+  popup.style.visibility = 'visible';
+  obj.onmouseout = function() {
+    popup.style.visibility = 'hidden';
+    obj.onmouseout = null;
+  }
+}
+
+/**
+ * TODO(andi): docstring
+ */
+function M_jumpToPatch(select, change, patchset, unified) {
+  if ( unified ) {
+    part = 'patch';
+  } else {
+    part = 'diff';
+  }
+  document.location.href = '/'+change+'/'+part+'/'+patchset+'/'+select.value;
+}
+
+/**
+ * Add or remove a star to/from the given change.
+ * @param {Integer} id The change id.
+ * @param {String} url The url fragment to append: "/star" or "/unstar".
+ */
+function M_setChangeStar_(id, url, xsrf) {
+  var httpreq = M_getXMLHttpRequest();
+  if (!httpreq) {
+    return true;
+  }
+  httpreq.onreadystatechange = function () {
+    if (httpreq.readyState == 4) {
+      if (httpreq.status == 200) {
+	  var elem = document.getElementById("change-star-" + id);
+	  elem.innerHTML = httpreq.responseText;
+      }
+    }
+  }
+
+  body = ''
+  body += 'change_id=' + escape('' + id);
+  body += '&'
+  body += 'xsrf=' + xsrf.replace(/\+/g, '%2B')
+
+  httpreq.open("POST", url, true);
+  httpreq.setRequestHeader('Content-Type',
+                           'application/x-www-form-urlencoded');
+  httpreq.send(body)
+}
diff --git a/webapp/static/star-dark.gif b/webapp/static/star-dark.gif
new file mode 100644
index 0000000..e8dc0a3
--- /dev/null
+++ b/webapp/static/star-dark.gif
Binary files differ
diff --git a/webapp/static/star-lite.gif b/webapp/static/star-lite.gif
new file mode 100644
index 0000000..77619f0
--- /dev/null
+++ b/webapp/static/star-lite.gif
Binary files differ
diff --git a/webapp/static/style.css b/webapp/static/style.css
new file mode 100644
index 0000000..41adbdc
--- /dev/null
+++ b/webapp/static/style.css
@@ -0,0 +1,549 @@
+div {
+}
+
+body {
+  min-width: 600px;
+  margin: 0;
+  padding: 5px 5px 0 5px;
+  border: 0px;
+}
+
+
+/* ****** Common styles ****** */
+
+/* the little gray help text */
+.tips {
+  color: #777;
+  font-size: 12px; 
+}
+
+
+/* ****** The stuff at the top ****** */
+
+#top_nav, #masthead {
+  margin: 0 -5px 0 -5px;
+  padding: 0px 5px 0 5px;
+  border-bottom: 1px solid #b0bdcc;
+}
+
+#top_nav_left {
+  float: left;
+}
+
+#top_nav_right {
+  text-align: right;
+  right: 0;
+}
+
+#masthead {
+  height: 86px;
+}
+
+#masthead_logotype {
+  padding: 0;
+  margin: 7px 0 0 2px;
+  float: left;
+}
+
+#masthead_bugdroid {
+  margin-right: -5px;
+  float: right;
+}
+
+
+/* ****** Left nav bar ****** */
+
+#left_nav, #main_content {
+  float: left;
+}
+
+#left_nav {
+  font-family: Arial,Verdana,sans-serif;
+  font-size: 13px;
+  width: 155px;
+  margin-top: 5px;
+}
+
+.left_nav_box {
+  margin: 10px 0 6px 0;
+  overflow: hidden;
+  border: 1px solid #b0bdcc;
+  background-color: #d4e9a9;
+}
+
+#left_nav h4 {
+  font-weight: bold;
+  margin: 0;
+  padding: 3px 5px 3px 5px;
+  background-color: #a5c639;
+  color: white;
+}
+
+#left_nav ul {
+  list-style: none;
+  margin: 5px;
+  padding: 0;
+}
+
+#left_nav ul li {
+  font-family: Verdana,sans-serif;
+  font-size: 12px;
+}
+
+#left_nav ul a {
+  outline-color: -moz-use-text-color;
+  outline-style: none;
+  outline-width: medium;
+  color: #336600;
+}
+
+#left_nav ul a:visited {
+  color: #551a8b;
+}
+
+#left_nav ul a:hover {
+  color: #551a8b;
+}
+
+/* ****** Right / expandable column ****** */
+#main_content_parent {
+  float: right;
+  position: absolute;
+  margin-top: 8px;
+  left: 180px;
+  right: 25px;
+}
+
+#page_footer {
+  color: #b0bdcc;
+  padding-bottom: 15px;
+  text-align: right;
+  right: 0;
+}
+
+/* ****** Main content ****** */
+
+#main_content {
+  width: 100%;
+  min-width: 435px;
+  font-family: Arial,Verdana,sans-serif;
+  font-size: 11pt;
+  padding: 0 0 20px 0;
+}
+
+h1 {
+  margin: 3px 0 8px 0;
+  padding: 0;
+  font-size: 16pt;
+  font-weight: bold;
+}
+
+/* ****** Changes ****** */
+
+.change-list {
+  width: 100%;
+  border-collapse: separate;
+  border-spacing: 0;
+}
+
+.change-list th {
+  background-color: #d4e9a9;
+}
+
+.change-list .header-columns, .change-list .header-title {
+  border-top: solid 8px white;
+}
+
+.change-list .pagination {
+  font-weight: normal;
+  text-align: right;
+}
+
+.change-list td, .change-list th {
+  text-align: left;
+  padding: 2px 6px 1px 6px;
+  margin: 0;
+}
+
+.change-list .header-columns {
+  font-weight: normal;
+  padding-top: 1px;
+}
+
+.change-list .header-columns {
+  border: 1px solid white;
+}
+
+.change-list td {
+  border-bottom: 1px solid #d4e9a9;
+  border-right: 1px solid #d4e9a9;
+}
+
+.change-list td:first-child {
+  border-bottom: 1px solid #d4e9a9;
+  border-left: 1px solid #d4e9a9;
+}
+
+.change-list td.selection {
+  border-right: hidden;
+  width: 14px;
+}
+
+.change-list td.star {
+  border-bottom: 1px solid #d4e9a9;
+  border-right: hidden;
+}
+
+.change-list .disabled {
+  color: #444;
+}
+
+/* ****** User Info Popup ****** */
+
+.popup {
+  visibility: hidden;
+  background-color: #a5c639;
+  border: 4px solid white;
+  position: absolute;
+}
+
+.popup-name {
+  background-color: #a5c639;
+  color: white;
+  margin: 4px 4px 0 4px;
+  border-left: 2px solid white;
+  border-top: 2px solid white;
+  border-right: 2px solid white;
+  padding: 3px 8px 3px 8px;
+}
+
+.popup-info {
+  background-color: white;
+  margin: 0 4px 4px 4px;
+  padding: 11px;
+}
+
+/* ****** User Info Popup ****** */
+
+.settings {
+  width: 100%;
+  margin-bottom: 20px;
+  border-collapse: collapse;
+  border-spacing: 0;
+  border: 1px solid #b0bdcc;
+}
+
+.settings th, .settings td {
+  border: 2px solid white;
+  text-align: left;
+  vertical-align: top;
+}
+
+.settings thead th {
+  background-color: #a5c639;
+  color: white;
+  padding: 1px 10px 1px 10px;
+}
+
+.settings tbody th, .settings tbody td {
+  background-color: #d4e9a9;
+  padding: 5px 10px 5px 10px;
+  white-space: nowrap;
+}
+
+.settings tbody td {
+  width: 100%;
+}
+
+
+/* ****** User Info Popup ****** */
+
+.project-field {
+  display: block;
+}
+
+
+/* ****** Change page ****** */
+
+.toggled_section {
+  margin: 0 0 20px 0;
+  padding: 0 0 0 15px;
+}
+
+.toggled_section h2 {
+  margin: 0 0 10px 0;
+  padding: 0;
+}
+
+.toggled_section_pointer {
+  margin-left: -15px;
+  padding-left: 15px;
+  background-image: url('/static/closedtriangle.gif');
+  background-position: center left;
+  background-repeat: no-repeat;
+  background-align: left;
+  text-decoration: none;
+  color: black;
+}
+
+.opentriangle {
+  background-image: url('/static/opentriangle.gif');
+}
+
+.change_description {
+  padding: 0;
+  margin: 0;
+}
+
+.change_details th {
+  text-align: left;
+  padding-right: 10px;
+}
+
+table.change_info_table {
+  border-collapse: collapse;
+  border-spacing: 0;
+  border-top: hidden;
+}
+
+table.change_info_table th {
+  border: 2px solid white;
+  font-weight: normal;
+  text-align: left;
+  vertical-align: top;
+  background-color: #d4e9a9;
+  padding: 2px 4px 0px 6px;
+  white-space: nowrap;
+  border-bottom: hidden;
+}
+
+table.change_info_table th.leftmost {
+  border-left: 2px solid #d4e9a9;
+}
+
+table.change_info_table th.rightmost {
+  border-right: 1px solid #d4e9a9;
+}
+
+table.change_info_table td {
+  border: 1px solid #d4e9a9;
+  padding: 2px 6px 1px 6px;
+}
+
+table.change_info_table .score {
+  text-align: center;
+}
+
+table.change_info_table .hint {
+  border: none;
+  background-color: white;
+  color: #444;
+}
+
+.change_actions {
+  margin-top: 5px;
+}
+
+.change_actions .action {
+  padding-right: 30px;
+  vertical-align: top;
+}
+
+.change_status {
+  margin: 5px 0 0 0;
+}
+
+.change_status ul {
+  margin: 0;
+  padding: 0 0 0 20px;
+}
+
+/** messages **/
+
+.message {
+  border: 1px solid #d4e9a9;
+  margin-top: 5px;
+  margin-bottom: 5px;
+}
+
+.message .header {
+  background-color: #d4e9a9;
+  white-space: nowrap;
+  cursor: pointer;
+  overflow: hidden;
+}
+
+.message .message-body {
+  padding: 5px;
+}
+
+.message .message-body pre {
+  margin: 0;
+  padding: 0;
+  font-size: 13px;
+}
+
+.message .message-actions {
+  padding: 0 5px 0 5px;
+  border-top: 1px solid #d4e9a9;
+  font-size: 12px;
+}
+
+.message .message-reply {
+  padding: 5px 5px 5px 5px;
+}
+
+/* ****** Diff page ****** */
+
+.code_diff {
+  margin-top: 90px;
+  margin-left: -100px;
+  width: 100%;
+  display: table;
+  border: 1px solid #b0bdcc;
+}
+
+.code_diff .codenav {
+  background-color: #d4e9a9;
+  padding: 2px 5px 2px 5px;
+  text-align: center;
+}
+
+.code_diff th {
+  padding: 3px 0 3px 0;
+  font-size: 12px;
+  min-width: 450px;
+}
+
+.comment-border textarea {
+  margin: 5px 5px 5px 0;
+  font-size: 12px;
+}
+
+.comment-border {
+  background-color: #d4e9a9;
+  padding: 5px;
+  font-size: 12px;
+}
+
+div.inline-comment-title {
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis; /* An IE-only feature */
+  cursor: pointer;
+}
+
+.comment-text {
+  font-family: monospace;
+  font-size: 12px;
+  padding: 5px;
+}
+
+/** begin code **/
+
+/* Old/new styles for replace, delete, insert, equal, blank (no text) */
+.olddark, .newdark, .oldreplace, .olddelete, .oldinsert, .oldequal, .oldblank,
+.oldlight, .newlight, .oldreplace1, .newreplace1,
+.newreplace, .newdelete, .newinsert, .newequal, .newblank,
+.oldmove, .oldchangemove, .oldchangemove1, .oldmove_out, .oldchangemove_out,
+.newmove, .newchangemove, .newchangemove1,
+.udiffadd, .udiffremove, .udiff, .debug-info {
+  white-space: pre;
+  font-family: monospace;
+  font-size: 12px;
+  vertical-align: top;
+}
+
+.oldlight {
+  background-color: #fee;
+  font-size: 100%;
+}
+
+.newlight {
+  background-color: #dfd;
+  font-size: 100%;
+}
+
+.olddark {
+  background-color: #faa;
+  font-size: 100%;
+}
+
+.newdark {
+  background-color: #9f9;
+  font-size: 100%;
+}
+
+.oldblank, .newblank {
+  background-color: #eee;
+}
+
+.oldreplace1 {
+  background-color: #faa;
+}
+
+.newreplace1 {
+  background-color: #9f9;
+}
+
+.newchangemove1 {
+  background-color: #9f9;
+}
+
+.oldreplace {
+  background-color: #fee;
+}
+
+.olddelete {
+  background-color: #faa;
+}
+
+.newreplace {
+  background-color: #dfd;
+}
+
+.newchangemove {
+  background-color: #dfd;
+}
+
+.newinsert {
+  background-color: #9f9;
+}
+
+.oldinsert, newdelete {
+  background-color: #ddd;
+}
+
+.oldequal, .newequal, .newmove {
+  background-color: #fff;
+}
+
+.oldmove, .oldchangemove, .oldchangemove1, .moved_header, .moved_lno {
+  background-color: #ff9;
+}
+
+.oldmove_out, .oldchangemove_out, .moved_out_header {
+  background-color: #fc8;
+}
+
+.movelight {
+  background-color: #ff9;
+  font-size: 100%;
+}
+
+.oldmovedark {
+  background-color: #faa;
+  font-size: 100%;
+}
+
+.newmovedark {
+  background-color: #9f9;
+  font-size: 100%;
+}
+
+#signin-link {
+  margin-top: 20px;
+}
+
+/** end code **/
+
diff --git a/webapp/static/widgets.js b/webapp/static/widgets.js
new file mode 100644
index 0000000..3187d1a
--- /dev/null
+++ b/webapp/static/widgets.js
@@ -0,0 +1,358 @@
+/*
+ * Copyright (C) 2008 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+// utilities
+// =============================================================================
+
+function trim(str)
+{
+    return str.replace(/^\s+|\s+$/g, '');
+}
+
+function add_input(mom, type, name, value)
+{
+    var input = document.createElement("input");
+    input.type = type;
+    if (name) input.name = name
+    if (value) input.value = value;
+    mom.appendChild(input);
+    return input;
+}
+
+function add_option(select, text, value, selected)
+{
+    var opt = document.createElement("option");
+    opt.text = text;
+    opt.value = value;
+    opt.selected = selected;
+    select.appendChild(opt);
+    return opt;
+}
+
+function set_error(me, error)
+{
+    var o = me.error_div;
+    if (error) {
+        var N = o.childNodes.length;
+        for (var i=0; i<N; i++) {
+            o.removeChild(o.childNodes[0]);
+        }
+        o.appendChild(document.createTextNode(error));
+        o.style.display = "block";
+    } else {
+        o.style.display = "none";
+    }
+}
+
+// UserGroupField
+// =============================================================================
+
+function UserGroupField_add_keydown(ev, me)
+{
+    if (ev.keyCode == 13) {
+        // enter
+        UserGroupField_add(me);
+        return false;
+    }
+    return true;
+}
+
+function UserGroupField_insertEntry(me, entry)
+{
+    var type = entry["type"];
+    var key = entry["key"];
+    var display_name;
+    if (type == "user") {
+        display_name = entry["real_name"] + " <" + entry["email"] + ">";
+    } else if (type == "group") {
+        display_name = "Group: " + entry["name"];
+    }
+
+    var tr = me.table.insertRow(me.table.rows.length-1);
+    var td = tr.insertCell(-1);
+    td.appendChild(document.createTextNode(display_name));
+    var td = tr.insertCell(-1);
+    var input = document.createElement("input");
+    var input = add_input(td, "button", null, "delete");
+    input.onclick = function () { UserGroupField_delete(me, tr); };
+    add_input(td, "hidden", me.name + "_keys", key);
+
+    me.people[me.people.length] = key;
+}
+
+function UserGroupField_insertField(mom, name, allow_users, allow_groups, initial)
+{
+    var me = new Object();
+    me.name = name;
+    me.allow_users = allow_users;
+    me.allow_groups = allow_groups;
+    me.people = []; // The users and groups already added
+
+    // the table
+    me.table = document.createElement("table");
+
+    // the add field button
+    var tr = me.table.insertRow(-1);
+    var td = tr.insertCell(-1);
+    me.add_text = add_input(td, "text", name + "_add", "");
+    me.add_text.onkeypress = function(ev) {
+            return UserGroupField_add_keydown(ev, me);
+        };
+    var td = tr.insertCell(-1);
+    var add_button = add_input(td, "button", null, "add");
+    add_button.onclick = function() {
+            UserGroupField_add(me);
+        };
+    var td = tr.insertCell(-1);
+    me.error_div = document.createElement("div");
+    me.error_div.style.display = "none";
+    me.error_div.style.color = "red"; // TODO(joeo) CSS!
+    td.appendChild(me.error_div);
+
+    for (var i=0; i<initial.length; i++) {
+        UserGroupField_insertEntry(me, initial[i]);
+    }
+
+    mom.appendChild(me.table);
+}
+
+function UserGroupField_add(me)
+{
+    // figure out the value they want
+    var val = trim(me.add_text.value);
+    if (val.length == 0) {
+        // bail if it is empty
+        me.add_text.value = "";
+        return;
+    }
+
+    if (me.add_text.ajaxController) {
+        me.add_text.ajaxController.cancel();
+    }
+    me.add_text.ajaxController = get_json(
+            "/admin/people_info?op=get_user_info&id=" + escape(val)
+                + "&allow_users=" + me.allow_users + "&allow_groups=" + me.allow_groups,
+            function(success, result) {
+                if (!success) {
+                    show_bad_connection_error("UserGroupField_add_callback");
+                    return;
+                }
+                
+                if (!result) {
+                    if (me.allow_users && me.allow_groups) {
+                        set_error(me, "Not a registered email address or group name.");
+                    } else if (me.allow_users) {
+                        set_error(me, "Not a registered email address.");
+                    } else if (me.allow_groups) {
+                        set_error(me, "Not a registered group name.");
+                    }
+                    return;
+                }
+
+                // check to make sure it is not a duplicate
+                var key = result["key"];
+                var type = result["type"];
+                for (var i=0; i<me.people.length; i++) {
+                    if (me.people[i] == key) {
+                        if (type == "user") {
+                            set_error(me, "That user is already added.");
+                        } else {
+                            set_error(me, "That group is already added.");
+                        }
+                        return;
+                    }
+                }
+
+                // add the new row and hidden inputs
+                UserGroupField_insertEntry(me, result);
+
+                // clear the error and text box
+                set_error(me, null);
+                me.add_text.value = "";
+            });
+}
+
+function UserGroupField_delete(me, tr)
+{
+    me.table.deleteRow(tr);
+}
+
+
+// ApproversField
+// =============================================================================
+
+function ApproversField_insertEntry(me, entry)
+{
+    var files;
+    var key;
+    var approvers;
+    var verifiers;
+    var bad_files;
+    if (entry) {
+        files = entry["files"];
+        bad_files = entry["bad_files"];
+        key = entry["key"];
+        approvers = entry["approvers"];
+        verifiers = entry["verifiers"];
+    } else {
+        files = "";
+        bad_files = "";
+        key = "added_" + me.key_index;
+        me.key_index = me.key_index + 1;
+        approvers = [];
+        verifiers = [];
+    }
+    var field_key = me.name + "_" + key;
+
+    var tr = me.table.insertRow(me.table.rows.length);
+    var td = tr.insertCell(-1);
+
+    var style = me.styles["approval"];
+    if (style) {
+        td.className = style;
+    }
+
+    if (bad_files.length > 0) {
+        var bad_files_div = document.createElement("div");
+        td.appendChild(bad_files_div);
+        bad_files_div.className = "bad_files";
+        bad_files_div.appendChild(document.createTextNode("Illegal file paths:"));
+        var bad_files_ul = document.createElement("ul");
+        bad_files_div.appendChild(bad_files_ul);
+        for (var i in bad_files) {
+            var bad_file_li = document.createElement("li");
+            bad_files_ul.appendChild(bad_file_li);
+            bad_file_li.appendChild(document.createTextNode(bad_files[i]));
+        }
+    }
+
+    var textarea = document.createElement("textarea");
+    textarea.name = field_key + "_files";
+    textarea.cols = 100;
+    textarea.rows = 5;
+    textarea.appendChild(document.createTextNode(files));
+    td.appendChild(textarea);
+
+    me.keys_field = add_input(td, "hidden", me.name + "_keys", key);
+
+    var field_table = document.createElement("table");
+    field_table.width = "100%";
+    td.appendChild(field_table);
+    var field_tr = field_table.insertRow(-1);
+    var field_td = document.createElement("th");
+    field_tr.appendChild(field_td);
+    field_td.appendChild(document.createTextNode("Approvers"));
+    field_td = document.createElement("th");
+    field_tr.appendChild(field_td);
+    field_td.appendChild(document.createTextNode("Verifiers"));
+    var field_tr = field_table.insertRow(-1);
+    field_td = field_tr.insertCell(-1);
+    UserGroupField_insertField(field_td, field_key + "_approvers", true, true, approvers);
+    
+    field_td = field_tr.insertCell(-1);
+    UserGroupField_insertField(field_td, field_key + "_verifiers", true, true, verifiers);
+
+    
+    var td = tr.insertCell(-1);
+    td.vAlign = "top";
+    var input = add_input(td, "button", null, "delete");
+    input.onclick = function () { ApproversField_delete(me, tr); };
+    if (style) {
+        td.className = style;
+    }
+}
+
+function ApproversField_insertField(mom, name, initial, styles)
+{
+    var me = new Object();
+    me.name = name;
+    me.key_index = 0;
+    me.styles = styles;
+
+    mom = document.getElementById(mom);
+
+    me.div = document.createElement("div");
+    me.table = document.createElement("table");
+    me.div.appendChild(me.table);
+
+    for (var i=0; i<initial.length; i++) {
+        ApproversField_insertEntry(me, initial[i]);
+    }
+
+    var add_button = add_input(me.div, "button", null, "Add Approver");
+    add_button.onclick = function() { ApproversField_add(me); };
+
+    mom.appendChild(me.div);
+}
+
+function ApproversField_add(me)
+{
+    ApproversField_insertEntry(me, null);
+}
+
+function ApproversField_delete(me, tr)
+{
+    me.table.deleteRow(tr);
+}
+
+
+// ApproversField
+// =============================================================================
+
+function ProjectField_insertEntry(me, name, project_list, value)
+{
+    var s = document.createElement("select");
+    s.name = name;
+    s.className = "project-field"
+    me.mom.appendChild(s);
+    add_option(s, "--", null, value == null);
+    for (var i in project_list) {
+        var p = project_list[i];
+        add_option(s, p["name"], p["key"], p["key"] == value);
+    }
+    me.last = s;
+
+    s.onclick = function() {
+            if (s.selectedIndex == 0) {
+                // the -- item
+                if (s != me.last) {
+                    me.mom.removeChild(s);
+                }
+            } else {
+                if (s == me.last) {
+                    ProjectField_insertEntry(me, name, project_list, "--");
+                }
+            }
+        };
+}
+
+function ProjectField_insertField(mom, name, project_list, initial)
+{
+    var me = new Object();
+    me.mom = mom;
+
+    var current = new Array(initial.length);
+    for (var i in initial) {
+        current[i] = initial[i];
+    }
+
+    for (var i in current) {
+        ProjectField_insertEntry(me, name, project_list, current[i]);
+    }
+    ProjectField_insertEntry(me, name, project_list, null);
+}
+
diff --git a/webapp/static/x.png b/webapp/static/x.png
new file mode 100644
index 0000000..825397b
--- /dev/null
+++ b/webapp/static/x.png
Binary files differ
diff --git a/webapp/static/zippyplus.gif b/webapp/static/zippyplus.gif
new file mode 100644
index 0000000..596b212
--- /dev/null
+++ b/webapp/static/zippyplus.gif
Binary files differ
diff --git a/webapp/templates/404.html b/webapp/templates/404.html
new file mode 100644
index 0000000..e45a7d3
--- /dev/null
+++ b/webapp/templates/404.html
@@ -0,0 +1 @@
+<h1>404 Not Found</h1>
diff --git a/webapp/templates/500.html b/webapp/templates/500.html
new file mode 100644
index 0000000..58e8bf1
--- /dev/null
+++ b/webapp/templates/500.html
@@ -0,0 +1 @@
+<h1>500 Server Error</h1>
diff --git a/webapp/templates/admin.html b/webapp/templates/admin.html
new file mode 100644
index 0000000..0ae226e
--- /dev/null
+++ b/webapp/templates/admin.html
@@ -0,0 +1,7 @@
+{%extends "admin_base.html"%}
+{%block title1%}Admin{%endblock%}
+{%block body%}
+
+
+{%endblock%}
+
diff --git a/webapp/templates/admin_base.html b/webapp/templates/admin_base.html
new file mode 100644
index 0000000..134134f
--- /dev/null
+++ b/webapp/templates/admin_base.html
@@ -0,0 +1,21 @@
+{%extends "base.html"%}
+
+{%block mainmenu2%}
+  <div class="left_nav_box">
+  <h4>Admin</h4>
+  <ul>
+  {% if request.user_is_admin %}
+    <li><a href="{%url codereview.people.admin_users%}">Users</a></li>
+    <li><a href="{%url codereview.people.admin_groups%}">Groups</a></li>
+  {% endif %}
+  {% if request.user_is_admin or request.projects_owned_by_user %}
+    <li><a href="{%url codereview.project.project_list%}">Projects</a></li>
+  {% endif %}
+  {% if is_gae_admin %}
+    <li><a href="{%url codereview.views.admin_settings%}">Settings</a></li>
+  {% endif %}
+  </ul>
+  </div><!-- div class="left_nav_box" -->
+{%endblock%}
+
+
diff --git a/webapp/templates/admin_datastore_delete.html b/webapp/templates/admin_datastore_delete.html
new file mode 100644
index 0000000..d5a36d1
--- /dev/null
+++ b/webapp/templates/admin_datastore_delete.html
@@ -0,0 +1,47 @@
+{%extends "admin_base.html"%}
+{%block title1%}Data Store Delete{%endblock%}
+{%block body%}
+
+<h2>Data Store Delete</h2>
+
+<div id="warning-message">
+<p>If you really mean to delete your data
+store enter <code>DELETE EVERYTHING</code>
+into the box below.
+</p>
+
+<p><b><i><font color="rd">
+Once started, there is no going back from this operation.
+</font></i></b></p>
+</div>
+
+<p id="active-message" style="display:none">
+<font color="red"><blink>Deleting... please wait ...</blink></font>
+</p>
+
+<form
+  name="delete_form"
+  method="POST"
+  action="{%url codereview.views.admin_datastore_delete%}">
+<table>
+{{form}}
+<tr><td><input type="submit" value="Delete Everything" /></td></tr>
+</table>
+</form>
+
+<script type="text/javascript"><!--
+if (document.delete_form.really.value == 'DELETE EVERYTHING') {
+  var hide;
+
+  hide = document.getElementById('warning-message');
+  hide.style.display = 'none';
+
+  hide = document.getElementById('active-message');
+  hide.style.display = 'inline';
+
+  setTimeout('document.delete_form.submit()', 500);
+}
+// -->
+</script>
+
+{%endblock%}
diff --git a/webapp/templates/admin_datastore_upgrade.html b/webapp/templates/admin_datastore_upgrade.html
new file mode 100644
index 0000000..33aae7f
--- /dev/null
+++ b/webapp/templates/admin_datastore_upgrade.html
@@ -0,0 +1,45 @@
+{%extends "admin_base.html"%}
+{%block title1%}Data Store Upgrade{%endblock%}
+{%block body%}
+
+<h2>Data Store Upgrade</h2>
+
+<div id="warning-message">
+<p>If you really mean to upgrade your data store enter
+<code>UPGRADE</code> into the box below.</p>
+
+<p><b><i><font color="rd">
+Once started, there is no going back from this operation.
+</font></i></b></p>
+</div>
+
+<p id="active-message" style="display:none">
+<font color="red"><blink>Upgrading... please wait ...</blink></font>
+</p>
+
+<form
+  name="upgrade_form"
+  method="POST"
+  action="{%url codereview.views.admin_datastore_upgrade%}">
+<table>
+{{form}}
+<tr><td><input type="submit" value="Upgrade" /></td></tr>
+</table>
+</form>
+
+<script type="text/javascript"><!--
+if (document.upgrade_form.really.value == 'UPGRADE') {
+  var hide;
+
+  hide = document.getElementById('warning-message');
+  hide.style.display = 'none';
+
+  hide = document.getElementById('active-message');
+  hide.style.display = 'inline';
+
+  setTimeout('document.upgrade_form.submit()', 500);
+}
+// -->
+</script>
+
+{%endblock%}
diff --git a/webapp/templates/admin_group.html b/webapp/templates/admin_group.html
new file mode 100644
index 0000000..086b1e3
--- /dev/null
+++ b/webapp/templates/admin_group.html
@@ -0,0 +1,33 @@
+{%extends "admin_base.html"%}
+{%block title1%}Users{%endblock%}
+{%block body%}
+
+{%if group%}
+<h2>Group {{group.name}}</h2>
+{%else%}
+<h2>New Group</h2>
+{%endif%}
+
+<form
+{%if group%}
+action="{%url codereview.people.admin_group group.name%}"
+{%else%}
+action="{%url codereview.people.admin_group_new%}"
+{%endif%}
+method="post">
+<table>
+{{form}}
+<tr><td><input name="save" type="submit" value="Save"></td></tr>
+</table>
+</form>
+
+{%if group and is_gae_admin%}
+<h2>Delete Group {{group.name}}</h2>
+
+<form action="{{del_url}}" method="post">
+{{del_url|form_xsrf}}
+<input type="submit" value="Delete Group"> There is no undo!
+</form>
+{%endif%}
+
+{%endblock%}
diff --git a/webapp/templates/admin_groups.html b/webapp/templates/admin_groups.html
new file mode 100644
index 0000000..7c4eea2
--- /dev/null
+++ b/webapp/templates/admin_groups.html
@@ -0,0 +1,23 @@
+{%extends "admin_base.html"%}
+{%block title1%}Groups{%endblock%}
+{%block body%}
+
+<h2>Groups</h2>
+
+<p><a href="{%url codereview.people.admin_group_new%}">New Group</a></p>
+<div class="change-list" style="width: inherit;">
+  <table id="queues" style="width: inherit;">
+    <tr>
+        <th>Name</th>
+        <th>Description</th>
+    </tr>
+    {%for group in groups%}
+    <tr>
+        <td><a href="{%url codereview.people.admin_group group.name%}">{{group.name}}</a></td>
+        <td>{{group.comment}}</td>
+    </tr>
+    {%endfor%}
+  </table>
+</div>
+
+{%endblock%}
diff --git a/webapp/templates/admin_project.html b/webapp/templates/admin_project.html
new file mode 100644
index 0000000..8bda24a
--- /dev/null
+++ b/webapp/templates/admin_project.html
@@ -0,0 +1,57 @@
+{%extends "admin_base.html"%}
+{%block title1%}Users{%endblock%}
+{%block body%}
+
+{%if project%}
+<h2>Project {{project.name}}</h2>
+{%else%}
+<h2>New Project</h2>
+{%endif%}
+
+<form
+{%if project%}
+action="{%url codereview.project.project_edit project.name%}"
+{%else%}
+action="{%url codereview.project.project_new%}"
+{%endif%}
+method="post">
+
+{{form.xsrf}}
+{%if form.xsrf.errors%}
+<ul>
+  {%for e in form.xsrf.errors%}
+    <li>{{e}}</li>
+  {%endfor%}
+</ul>
+{%endif%}
+
+<table class="largeform">
+<tr><th class="largeform_field">{{form.name.label_tag}}</th></tr>
+<tr><td class="largeform_field">{{form.name}}</td></tr>
+
+<tr><th class="largeform_field">{{form.comment.label_tag}}</th></tr>
+<tr><td class="largeform_field">{{form.comment}}</td></tr>
+
+<tr><th class="largeform_field">{{form.owners.label_tag}}</th></tr>
+<tr><td class="largeform_field">{{form.owners}}</td></tr>
+
+<tr><th class="largeform_field">Code Review</th></tr>
+<tr><td class="largeform_field">{{form.code_reviews}}</td></tr>
+
+
+<tr><td>
+    <input name="save" type="submit" value="Save">
+</td></tr>
+</table>
+</form>
+
+{%if project and is_gae_admin%}
+<h2>Delete Project {{project.name}}</h2>
+
+<form action="{{del_url}}" method="post">
+{{del_url|form_xsrf}}
+<input type="submit" value="Delete Project"> There is no undo!
+</form>
+{%endif%}
+
+{%endblock%}
diff --git a/webapp/templates/admin_projects.html b/webapp/templates/admin_projects.html
new file mode 100644
index 0000000..2ad86d0
--- /dev/null
+++ b/webapp/templates/admin_projects.html
@@ -0,0 +1,26 @@
+{%extends "admin_base.html"%}
+{%block title1%}Project{%endblock%}
+{%block body%}
+
+<h2>Projects</h2>
+
+{% if request.user_is_admin %}
+<p><a href="{%url codereview.project.project_new%}">New Project</a></p>
+{% endif %}
+
+<div class="change-list" style="width: inherit;">
+  <table id="queues" style="width: inherit;">
+    <tr>
+        <th>Name</th>
+        <th>Description</th>
+    </tr>
+    {%for project in projects%}
+    <tr>
+        <td><a href="{%url codereview.project.project_edit project.name%}">{{project.name}}</a></td>
+        <td>{{project.comment}}</td>
+    </tr>
+    {%endfor%}
+  </table>
+</div>
+
+{%endblock%}
diff --git a/webapp/templates/admin_settings.html b/webapp/templates/admin_settings.html
new file mode 100644
index 0000000..5d57787
--- /dev/null
+++ b/webapp/templates/admin_settings.html
@@ -0,0 +1,25 @@
+{%extends "admin_base.html"%}
+{%block title1%}Settings{%endblock%}
+{%block body%}
+
+<h2>Settings</h2>
+
+<h3>Internal API Key:</h3>
+<code>{{settings.internal_api_key}}</code><br/>
+
+<h3>"From" email:</h3>
+<code>{%if settings.from_email %}{{settings.from_email}}{%else%}NONE SET{%endif%}</code>
+<form method="get" action="/admin/settings/from_email" style="margin-left: 30px; display: inline;">
+  <input type="submit" value="Edit"/>
+</form>
+<form method="post" action="/admin/settings/from_email_test"  style="display: inline;">
+  <input type="hidden" name="xsrf" value="{{from_email_test_xsrf}}"/>
+  <input type="submit" value="Test" />
+</form>
+
+<h3>Track code for <a href="http://www.google.com/analytics/">Google Analytics</a>:</h3>
+<form method="get" action="/admin/settings/analytics">
+  <code>{%if settings.analytics %}{{settings.analytics}}{%else%}NONE SET{%endif%}</code>
+  <input type="submit" value="Edit" style="margin-left: 30px;"/>
+</form>
+{%endblock%}
diff --git a/webapp/templates/admin_settings_analytics.html b/webapp/templates/admin_settings_analytics.html
new file mode 100644
index 0000000..3968f9d
--- /dev/null
+++ b/webapp/templates/admin_settings_analytics.html
@@ -0,0 +1,12 @@
+{%extends "admin_base.html"%}
+{%block title1%}Settings: Analytics{%endblock%}
+{%block body%}
+
+<form action="/admin/settings/analytics" method="post">
+<table>
+{{form}}
+<tr><td><input name="save" type="submit" value="Save"></td></tr>
+</table>
+</form>
+
+{%endblock%}
diff --git a/webapp/templates/admin_settings_from_email.html b/webapp/templates/admin_settings_from_email.html
new file mode 100644
index 0000000..3d130a6
--- /dev/null
+++ b/webapp/templates/admin_settings_from_email.html
@@ -0,0 +1,12 @@
+{%extends "admin_base.html"%}
+{%block title1%}Settings: From email{%endblock%}
+{%block body%}
+
+<form action="/admin/settings/from_email" method="post">
+<table>
+{{form}}
+<tr><td><input name="save" type="submit" value="Save"></td></tr>
+</table>
+</form>
+
+{%endblock%}
diff --git a/webapp/templates/admin_settings_from_email_test.html b/webapp/templates/admin_settings_from_email_test.html
new file mode 100644
index 0000000..1af151d
--- /dev/null
+++ b/webapp/templates/admin_settings_from_email_test.html
@@ -0,0 +1,13 @@
+{%extends "admin_base.html"%}
+{%block title1%}Settings{%endblock%}
+{%block body%}
+
+<h1>From Email</h1>
+
+<b>Status</b>
+<pre style="border: 1px solid gray; min-height: 10px;">{{status}}</pre>
+<b>Email</b>
+<pre style="border: 1px solid gray; min-height: 10px;">{{address}}</pre>
+
+{%endblock%}
+
diff --git a/webapp/templates/admin_user.html b/webapp/templates/admin_user.html
new file mode 100644
index 0000000..ce1c188
--- /dev/null
+++ b/webapp/templates/admin_user.html
@@ -0,0 +1,79 @@
+{%extends "admin_base.html"%}
+{%block title1%}Users{%endblock%}
+{%block body%}
+
+<h2>User {{email}}</h2>
+
+<form action="{%url codereview.people.admin_user email%}" method="POST">
+{{form.xsrf}}
+{%if form.xsrf.errors%}
+<ul>
+  {%for e in form.xsrf.errors%}
+    <li>{{e}}</li>
+  {%endfor%}
+</ul>
+{%endif%}
+
+{{form.dest}}
+
+<table class="largeform">
+<tr><th class="largeform_field">User Information</th></tr>
+<tr><td class="largeform_field">
+<table>
+  <tr><th>Name:</th>
+      <td>{{form.real_name}}{{form.real_name.errors}}</td>
+  </tr>
+  <tr><th>Preferred Email:</th>
+      <td>{{form.preferred_email}}{{form.preferred_email.errors}}</td>
+  </tr>
+  <tr><th>Mailing address:</th>
+      <td>{{form.mailing_address}}{{form.mailing_address.errors}}</td>
+  </tr>
+  <tr><th>Country:</th>
+      <td>{{form.mailing_address_country}}{{form.mailing_address_country.errors}}</td>
+  </tr>
+  <tr><th>Phone Number:</th>
+      <td>{{form.phone_number}}{{form.phone_number.errors}}</td>
+  </tr>
+  <tr><th>Fax Number:</th>
+      <td>{{form.fax_number}}{{form.fax_number.errors}}</td>
+  </tr>
+</table>
+</table>
+
+<table class="largeform">
+<tr><th class="largeform_field">Groups</th></tr>
+<tr><td class="largeform_field">{{form.groups}}</td></tr>
+</table>
+
+<table class="largeform">
+<tr><th class="largeform_field">Contributor License Agreement</th></tr>
+<tr><td class="largeform_field">
+<table>
+  <tr><th>CLA Verified:</th>
+      <td>{{form.cla_verified}}
+      <font color="#555">Changes to this field are logged.</font>
+      </td>
+  </tr>
+  <tr><th>CLA Verified By:</th>
+      <td>{{form.initial.cla_verified_by}}</td>
+  </tr>
+  <tr><th>CLA First Verified:</th>
+      <td>{{form.initial.cla_verified_timestamp}}</td>
+  </tr>
+  <tr><th>Individual CLA Version:</th>
+      <td>{{form.initial.individual_cla_version}}</td>
+  </tr>
+  <tr><th>Individual CLA Timestamp:</th>
+      <td>{{form.initial.individual_cla_timestamp}}</td>
+  </tr>
+  <tr><th>Comments:</th>
+      <td>{{form.cla_comments}}</td>
+  </tr>
+</table>
+</table>
+
+<input name="save" type="submit" value="Save">
+</form>
+
+{%endblock%}
diff --git a/webapp/templates/admin_users.html b/webapp/templates/admin_users.html
new file mode 100644
index 0000000..cb3661f
--- /dev/null
+++ b/webapp/templates/admin_users.html
@@ -0,0 +1,27 @@
+{%extends "admin_base.html"%}
+{%block title1%}Users{%endblock%}
+{%block body%}
+
+<a href="/admin/users">All Users</a>
+|
+<a href="/admin/users/verify_cla">Users w/ unverified CLA</a>
+
+
+<h2>Users</h2>
+
+<div class="change-list" style="width: inherit;">
+  <table id="queues" style="width: inherit;">
+    <tr>
+        <th>Name</th>
+        <th>Email</th>
+    </tr>
+    {%for user in users%}
+    <tr>
+        <td>{{user.real_name}}</td>
+        <td><a href="{%url codereview.people.admin_user user.email%}">{{user.email}}</a></td>
+    </tr>
+    {%endfor%}
+  </table>
+</div>
+
+{%endblock%}
diff --git a/webapp/templates/all.html b/webapp/templates/all.html
new file mode 100644
index 0000000..f793438
--- /dev/null
+++ b/webapp/templates/all.html
@@ -0,0 +1,47 @@
+{%extends "changes_base.html"%}
+
+{%block title1%}Recent Changes -{%endblock%}
+
+{%block body%}
+
+<script language="JavaScript" type="text/javascript"><!--
+function keyPressIntermediary(evt) {
+  return M_dashboardKeyPress(evt);
+}
+document.onkeypress = keyPressIntermediary;
+-->
+</script>
+
+
+<h1>Recent Changes</h1>
+
+<table class="change-list">
+<tr><td colspan="8" class="pagination" style="border: none;">
+  {%if newest%}
+    <a class="novisit" href="{{newest}}">&laquo; Newest</a>
+  {%endif%}
+  {%if prev%}
+    <a class="novisit" href="{{prev}}">&lsaquo; Newer</a>
+  {%endif%}
+  <b>{{first}}{%if last%} - {{last}}{%endif%}</b>
+  {%if next%}<a class="novisit" href="{{next}}">Older &rsaquo;</a>
+  {%else%}<span style="color:gray">Older &rsaquo;</span>{%endif%}
+</td></tr>
+
+{%include "change_heading.html"%}
+
+{%if not changes%}
+  <tr><td colspan="8"><span class="disabled">(None)</span></td></tr>
+{%else%}
+  {%for change in changes%}
+    {%include "change_row.html"%}
+  {%endfor%}
+{%endif%}
+
+</table>
+
+<script language="JavaScript" type="text/javascript"><!--
+var dashboardState = new M_DashboardState(window,'change');
+-->
+</script>
+{%endblock%}
diff --git a/webapp/templates/base.html b/webapp/templates/base.html
new file mode 100644
index 0000000..206a8fa
--- /dev/null
+++ b/webapp/templates/base.html
@@ -0,0 +1,203 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+  "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+  <title>
+    {%if is_dev%}
+      (DEV)
+    {%endif%}
+    {%block title1%}
+      {%if patch%}{{patch.filename}} -{%endif%}
+    {%endblock%}
+    {%block title2%}
+      {%if change%}Change {{change.key.id}}: {{change.subject|truncatewords:11}} -{%endif%}
+    {%endblock%}
+    Code Review
+  </title>
+  <link rel="icon" href="/favicon.ico" />
+  <link type="text/css" rel="stylesheet" href="/static/style.css" />
+  <script type="text/javascript" src="/static/ajax.js"></script>
+  <script type="text/javascript" src="/static/script.js"></script>
+  <script type="text/javascript" src="/static/widgets.js"></script>
+{%if star_url%}
+  <script type="text/javascript"><!--
+  function M_addChangeStar(id) {
+    return M_setChangeStar_(id, '{{star_url}}', '{{star_url|bare_xsrf}}');
+  }
+  function M_removeChangeStar(id) {
+    return M_setChangeStar_(id, '{{unstar_url}}', '{{unstar_url|bare_xsrf}}');
+  }
+  // -->
+  </script>
+{%endif%}
+{%block additionalhead%}{%endblock%}
+</head>
+<body>
+
+<div id="ajax_progress" class="ajax_progress" style="display: none;">
+    Loading
+</div>
+<div id="ajax_error" style="display: none;">
+    There was an error connecting to the server.  Please try again.
+</div>
+
+<!-- Begin help window -->
+<script type="text/javascript"><!--
+var helpDisplayed = false;
+document.onclick = M_clickCommon;
+{%if change%}
+var publish_link = "{%url codereview.views.publish change.key.id%}";
+{%endif%}
+// -->
+</script>
+<div id="help" style="display: none;">
+{%block help%}{%endblock%}
+<div style="font-size: medium; text-align: center;">Keyboard Shortcuts</div>
+<hr />
+<table width="100%">
+
+  <tr valign="top">
+    <td>
+      <table width="100%">
+        <tr>
+          <td></td><th>File</th>
+        </tr>
+        <tr>
+          <td class="shortcut"><span class="letter">u</span> <b>:</b></td><td>up to change</td>
+        </tr>
+        <tr>
+          <td class="shortcut"><span class="letter">m</span> <b>:</b></td><td>publish + mail comments</td>
+        </tr>
+        <tr>
+          <td class="shortcut"><span class="letter">j</span> / <span class="letter">k</span> <b>:</b></td><td>jump to file after / before current file</td>
+        </tr>
+        <tr>
+          <td></td><th>Side-by-side diff</th>
+        </tr>
+        <tr>
+          <td class="shortcut"><span class="letter">i</span> <b>:</b></td><td>toggle intra-line diffs</td>
+        </tr>
+        <tr>
+          <td class="shortcut"><span class="letter">e</span> <b>:</b></td><td>expand all comments</td>
+        </tr>
+        <tr>
+          <td class="shortcut"><span class="letter">c</span> <b>:</b></td><td>collapse all comments</td>
+        </tr>
+        <tr>
+          <td class="shortcut"><span class="letter">s</span> <b>:</b></td><td>toggle showing all comments</td>
+        </tr>
+        <tr>
+          <td class="shortcut"><span class="letter">n</span> / <span class="letter">p</span> <b>:</b></td><td>next / previous diff chunk or comment</td>
+        </tr>
+        <tr>
+          <td class="shortcut"><span class="letter">N</span> / <span class="letter">P</span> <b>:</b></td><td>next / previous comment</td>
+        </tr>
+        <tr>
+          <td class="shortcut"><span class="letter">&lt;Enter&gt;</span> <b>:</b></td><td>respond to / edit current comment</td>
+        </tr>
+      </table>
+    </td>
+    <td>
+      <table width="100%"> 
+        <tr>
+         <td></td><th>Change</th>
+        </tr>
+        <tr>
+          <td class="shortcut"><span class="letter">u</span> <b>:</b></td><td>up to list of changes</td>
+        </tr>
+        <tr>
+          <td class="shortcut"><span class="letter">m</span> <b>:</b></td><td>publish + mail comments</td>
+        </tr>
+        <tr><td>&nbsp;</td></tr>
+        <tr><td></td><th>Change List</th></tr>
+        <tr>
+          <td class="shortcut"><span class="letter">j</span> / <span class="letter">k</span> <b>:</b></td><td>jump to change after / before current change</td>
+        </tr>
+        <tr>
+          <td class="shortcut"><span class="letter">o</span> / <span class="letter">&lt;Enter&gt;</span> <b>:</b></td><td>open current change</td>
+        </tr>
+        <tr><td>&nbsp;</td></tr>
+        <tr><td>&nbsp;</td></tr>
+        <tr>
+          <td></td><th>Comment editing</th>
+        </tr>
+        <tr>
+          <td class="shortcut"><span class="letter">&lt;Ctrl&gt;</span> + <span class="letter">s</span> <b>:</b></td><td>save comment</td>
+        </tr>
+        <tr>
+          <td class="shortcut"><span class="letter">&lt;Esc&gt;</span> <b>:</b></td><td>cancel edit</td>
+        </tr>
+      </table>
+    </td>
+  </tr>
+
+</table>
+</div>
+<!-- End help window -->
+
+<div id="top_nav">
+<div id="top_nav_left">
+{%if is_dev%}
+  <font style="color:green; font-weight:bold">DEVELOPMENT SERVER</font>
+{%endif%}
+</div>
+
+<div id="top_nav_right">
+{%if user%}
+  <b>{{user.email}} ({{user|real_name:"x"}})</b> |
+  <a class="novisit" href="{%url codereview.settings.settings%}">Settings</a> |
+{%endif%}
+{%if is_dev%}
+  <a class="novisit" target="_blank" href="/_ah/admin">Dev Admin</a> |
+{%endif%}
+{%if user%}
+  <a class="novisit" href="{{sign_out}}">Sign out</a>
+{% else %}
+  <a class="novisit" href="{{sign_in}}">Sign in</a>
+{%endif%}
+</div><!-- top_nav_right -->
+</div><!-- top_nav -->
+
+<div id="masthead">
+<a href="/"><img id="masthead_logotype" src="/static/customLogo.png" border="0" /></a>
+<img id="masthead_bugdroid"  src="/static/android_heart.png"/>
+</div>
+
+<div id="left_nav">
+  {%if user %}
+  <div class="left_nav_box">
+    <h4>Tools</h4>
+    <ul>
+      <li><a href="{%url codereview.views.mine %}">Code Review</a></li>
+      {%if request.show_admin_tab %}
+      <li><a href="{%url codereview.views.admin %}">Admin</a></li>
+      {%endif %}
+    </ul>
+  </div><!-- div class="left_nav_box" -->
+  {%endif %}
+{%block mainmenu2%}{%endblock%}
+</div>
+
+
+<div id="main_content_parent">
+<div id="main_content">
+{%block body%}BODY GOES HERE{%endblock%}
+</div><!-- main_content -->
+<div id="page_footer">
+Gerrit &mdash; {%include "live_revision.html"%}
+</div><!-- page_footer -->
+</div><!-- main_content_parent -->
+{%if analytics%}
+<script type="text/javascript">
+  var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." :
+  "http://www.");
+  document.write(unescape("%3Cscript src='" + gaJsHost +
+  "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
+</script>
+<script type="text/javascript">
+  var pageTracker = _gat._getTracker("{{analytics}}");
+  pageTracker._trackPageview();
+</script>
+{%endif%}
+</body>
+</html>
diff --git a/webapp/templates/bundle_heading.html b/webapp/templates/bundle_heading.html
new file mode 100644
index 0000000..5caf258
--- /dev/null
+++ b/webapp/templates/bundle_heading.html
@@ -0,0 +1,9 @@
+<tr align="left">
+  <th class="first" colspan="3" align="right">Id</th>
+  <th>Status</th>
+  <th>Owner</th>
+  <th colspan="2">Repository</th>
+  <th colspan="2">Branch</th>
+  <th>Submitted</th>
+  <th>Last updated</th>
+</tr>
diff --git a/webapp/templates/bundle_row.html b/webapp/templates/bundle_row.html
new file mode 100644
index 0000000..38ac75e
--- /dev/null
+++ b/webapp/templates/bundle_row.html
@@ -0,0 +1,14 @@
+<tr name="change">
+  <td class="first" width="14"><img src="/static/closedtriangle.gif" 
+    style="visibility: hidden;" width="12" height="9" /></td>
+  <td width="17" align="center"></td>
+  <td align="right">
+    <div class="subject">{{bundle.key.id}}</div>
+  </td>
+  <td align="left">{{bundle.state}}</td>
+  <td><div class="users">{{bundle.owner|show_user}}</div></td>
+  <td colspan="2" align="left">{{bundle.dest_project.name}}</td>
+  <td colspan="2" align="left">{%if bundle.dest_branch %}{{bundle.dest_branch.short_name}}{%endif %}</td>
+  <td><div class="date">{{bundle.created|timesince}}</div></td>
+  <td><div class="date">{{bundle.modified|timesince}}</div></td>
+</tr>
diff --git a/webapp/templates/change.html b/webapp/templates/change.html
new file mode 100644
index 0000000..3a2ff07
--- /dev/null
+++ b/webapp/templates/change.html
@@ -0,0 +1,310 @@
+{%extends "change_base.html"%}
+
+{%block change_body%}
+
+{%if last_patchset.draft_count%}
+  <div class="error">
+    You have <b>{{last_patchset.draft_count}} draft</b>
+    comment{{last_patchset.draft_count|pluralize}}. Drafts are not viewable by others;
+    use <a class="novisit" href="{%url codereview.views.publish change.key.id%}">
+    Publish+Mail Comments</a> ('m') to let others view them.
+  </div>
+{%endif%}
+
+
+<div class="toggled_section">
+  <h2><a id="change-description-pointer"
+     href="javascript:M_toggleSection('change-description')"
+     class="toggled_section_pointer opentriangle">
+    Description</a></h2>
+  <div id="change-description">
+  <table width="100%" style=""><tr><td style="vertical-align: top;">
+{%if change.description%}
+    <pre class="change_description">{{change.description|wordwrap:80|urlize}}</pre>
+{%endif%}</td><td style="vertical-align: top;" align="right">
+    <table class="change_details">
+      <tr>
+        <th>Project</th>
+        <td>{{change.dest_project.name}}</td>
+      </tr>
+      <tr>
+        <th>Branch</th>
+        <td>{{change.dest_branch.short_name}}</td>
+      </tr>
+      <tr>
+        <th>Created</th>
+        <td>{{change.created|timesince}} ago by {{change.owner|show_user}}</td>
+      </tr>
+      <tr>
+        <th>Modified</th>
+        <td>{{change.modified|timesince}} ago</td>
+      </tr>
+    </table>
+  </td></tr>
+  </table>
+  </div>
+</div>
+
+<div class="toggled_section">
+  <h2>
+    <a id="ps-dependson-pointer"
+       href="javascript:M_toggleSection('ps-dependson')"
+       class="toggled_section_pointer {%if show_dependencies %}opentriangle{% endif %}">
+        Dependencies
+    </a>
+  </h2>
+  <div id="ps-dependson"
+       style="{%if not show_dependencies %}display:none{% endif %}">
+    <table class="change-list">
+      {%include "change_heading.html"%}
+      <tr><th colspan="8" class="header-title">Depends On</th></tr>
+      {%if not depends_on%}
+        <tr><td colspan="8" class="disabled">(None)</td></tr>
+      {%else%}
+        {%for change in depends_on%}
+          {%include "change_row.html"%}
+        {%endfor%}
+      {%endif%}
+
+      <tr><th colspan="8" class="header-title">Needed By</th></tr>
+      {%if not needed_by%}
+        <tr><td colspan="8" class="disabled">(None)</td></tr>
+      {%else%}
+        {%for change in needed_by%}
+          {%include "change_row.html"%}
+        {%endfor%}
+      {%endif%}
+    </table>
+  </div>
+</div>
+
+<div class="toggled_section">
+  <h2>
+    <a id="ps-approvals-pointer"
+       href="javascript:M_toggleSection('ps-approvals')"
+       class="toggled_section_pointer opentriangle">
+        Approvals
+    </a>
+  </h2>
+  <div id="ps-approvals" style="padding-left:4px;">
+    <table class="change_info_table" cellpadding="0" cellspacing="0" border="0" id="">
+      <tr>
+        <th class="leftmost">Reviewer</th>
+        <th class="score">Verified</th>
+        <th class="score rightmost">Code review</th>
+        <th class="hint"></th>
+      </tr>
+      <tr>
+        <td>{{change.owner|show_user}}</td>
+        <td class="score">{%if author_status.verified %}<img src="/static/check.png">{%endif%}</td>
+        <td class="score">{{author_status.lgtm|review_status_icons}}</td>
+        <td class="hint">{% ifequal author_status.lgtm "lgtm" %}Self approved.{% endifequal %}</td>
+      </tr>
+      {% for rs in review_status %}
+      <tr>
+        <td>{{rs.user|show_user}}</td>
+        <td class="score">{%if rs.verified %}<img src="/static/check.png">{%endif%}</td>
+        <td class="score">{{rs.lgtm|review_status_icons}}</td>
+        <td class="hint">{{rs.lgtm|review_status_text}}</font>
+      </tr>
+      {% endfor %}
+    </table>
+
+    {%if user%}
+    <table class="change_actions"><tr>
+      <td class="action">
+        <form method="get" action="{%url codereview.views.publish change.key.id%}">
+          <input type="submit" value="Publish+Mail Comments" />
+        </form>
+      </td>
+
+      <td class="action">
+        <form action="{{merge_url}}" method="post">
+          {{merge_url|form_xsrf}}
+          <input type="submit"
+            {%if show_submit_button %}{%else%}disabled{%endif%}
+              value="{%if show_submit_button %}Submit Patch Set {{last_patchset.id}}{%else%}Can't Submit{%endif%}"/>
+        </form>
+        <div class="change_status">
+          {%if last_patchset and not last_patchset.complete%}
+            Patch Set Still Uploading
+          {%endif%}
+          {%if change.is_submitted%}
+            {%if change.merged%}
+              Merged
+            {%else%}
+              Merge Pending
+            {%endif%}
+          {%else%}
+            {%if ready_to_submit%}
+              {%if user_can_submit%}
+              {%else%}
+                Ready to submit
+              {%endif%}
+            {%else%}
+              <ul>
+                {%if last_patchset and not last_patchset.complete%}
+                  <li>Patch Set Still Uploading</li>
+                {%endif%}
+                {%if is_rejected %}
+                  <li>Change Rejected</li>
+                {%endif%}
+                {%if not is_approved %}
+                  <li>Needs Code Review</li>
+                {%endif%}
+                {%if not is_verified %}
+                  <li>Needs Verification</li>
+                {%endif%}
+              </ul>
+            {%endif%}
+          {%endif%}
+      </td>
+
+      {%ifequal change.owner user %}
+      <td class="action">
+        <form method="get" action="{%url codereview.views.edit change.key.id%}">
+          <input type="submit" value="Edit Change"/>
+        </form>
+      </td>
+      {%endifequal%}
+    </tr></table>
+    {%endif%}
+  </div>
+</div>
+
+{%for patchset in patchsets%}
+<div class="toggled_section">
+  <h2>
+    <a id="ps-{{patchset.key.id}}-pointer"
+       href="javascript:M_togglePatchSetSection('{{change.key.id}}','{{patchset.key.id}}')"
+       class="toggled_section_pointer {%if forloop.last%}opentriangle{%endif%}">
+      Patch Set {{patchset.id}}
+      {%if patchset.message%}: {{patchset.message}}{%endif%}
+    </a>
+  </h2>
+  {%if forloop.last%}
+    <div id="ps-{{patchset.key.id}}">
+      {%include "patchset.html"%}
+    </div>
+  {%else%}
+    <div id="ps-{{patchset.key.id}}"
+         style="display:none">
+    </div>
+  {%endif%}
+</div>
+{%endfor%}
+
+{%if messages%}
+<div class="toggled_section">
+  <h2>
+    <a id="messages-pointer"
+       href="javascript:M_toggleSection('messages')"
+       class="toggled_section_pointer opentriangle">
+      Messages
+    </a>
+  </h2>
+
+  {%if messages%}<div><i>Total messages: {{messages|length}}</i></div>{%endif%}
+
+  <div id="messages">
+    <div style="margin-bottom: .5em;">
+      <a href="javascript:M_showAllComments('cl', {{messages|length}})">
+        Expand All Messages</a>
+      |
+      <a href="javascript:M_hideAllComments('cl', {{messages|length}})">
+        Collapse All Messages</a>
+    </div>
+ 
+    {%for message in messages%}
+      <div class="message">
+        <div class="header">
+          <table border="0" width="100%" cellspacing="0" cellpadding="0">
+            <tr class="comment_title"
+                onclick="M_switchChangelistComment({{forloop.counter0}})">
+              <td style="padding-left: 5px; white-space: nowrap;">
+                <b>{{message.sender|real_name}}</b>
+              </td>
+              <td>
+                <table style="table-layout:fixed; white-space: nowrap;"
+                       width="100%">
+                  <tr>
+                    <td>
+                      <div style="white-space: nowrap; overflow: hidden;{%if forloop.last%} visibility: hidden;{%endif%}"
+                           class="extra"
+                           id="cl-preview-{{forloop.counter0}}">
+                          {{message.text|truncatewords:15}}
+                       </div>
+                    </td>
+                  </tr>
+                </table>
+              </td>
+              <td align="right" style="white-space: nowrap; padding-right: 5px;">
+                {{message.date|timesince}} ago
+              </td>
+            </tr>
+          </table>
+        </div>
+
+        <div id="cl-comment-{{forloop.counter0}}"
+             {%if forloop.last%}{%else%}style="display: none;"{%endif%}>
+          <div class="message-body">
+            <pre name="cl-message-{{forloop.counter0}}"
+            >{{message.text|wordwrap:80|urlize}}</pre>
+          </div>
+          <div class="message-actions">
+            {%if user%}
+              <a href="javascript:M_replyToMessage('{{forloop.counter0}}', '{{message.date|date:"Y/m/d H:i:s"}}', '{{message.sender|real_name:"x"}}')"
+                 id="message-reply-href-{{forloop.counter0}}">Reply</a>
+              <div class="message-reply" id="message-reply-{{forloop.counter0}}"
+                   style="display:none;"></div>
+            {%else%}
+              <a href="{{sign_in}}">Sign in</a> to reply to this message.
+            {%endif%}
+          </div>
+        </div>
+
+      </div>
+    {%endfor%}
+    
+    
+    <div>
+      <a href="javascript:M_showAllComments('cl', {{messages|length}})">
+      Expand All Messages</a>
+      |
+      <a href="javascript:M_hideAllComments('cl', {{messages|length}})">
+      Collapse All Messages</a>
+    </div>
+
+  </div>
+</div>
+{%endif%}
+
+
+<script language="JavaScript" type="text/javascript">
+  <!--
+    document.onkeypress = function(evt) { return M_changelistKeyPress(evt); }
+  // -->
+</script>
+
+
+{%if user%}
+  <div style="display:none;">
+    <form method="POST" action="{{reply_url}}" id="message-reply-form">
+      <div>
+        <textarea rows="7" cols="70" name="message"></textarea>
+      </div>
+      {{reply_url|form_xsrf}}
+      <input type="hidden" name="message_only" value="1" />
+      <input type="submit" value="Send Message" />
+      <input type="button" value="Discard" name="discard" />
+      <input type="checkbox" name="send_mail" value="1" 
+             id="message-reply-send-mail" checked="checked" />
+      <label>Send mail to reviewers</label>
+    </form>
+  </div>
+  <a id="resizer" class="resizer" style="display:none;cursor:pointer">
+    <img src="/static/zippyplus.gif">
+  </a>
+{%endif%}
+
+{%endblock%}
diff --git a/webapp/templates/change_base.html b/webapp/templates/change_base.html
new file mode 100644
index 0000000..b23a687
--- /dev/null
+++ b/webapp/templates/change_base.html
@@ -0,0 +1,35 @@
+{%extends "changes_base.html"%}
+
+{%block body%}
+  <h1>
+    {%include "change_star.html"%}
+    <a href="{%url codereview.views.show change.key.id%}"
+               onmouseover="M_showPopUp(this, 'popup-change');">
+            Change {{change.key.id}}</a>:
+    {{change.subject|truncatewords:11}}
+    {%if change.merged %} (Merged)
+    {%else%}{%if change.closed %} (Closed) {%endif%}
+    {%endif%}
+  </h1>
+
+  {%block change_body%}BODY GOES HERE{%endblock%}
+
+{%endblock%}
+
+
+{%block popup%}
+  {%if change%}
+    <div class="popup" id="popup-change">
+      <b>Change {{change.key.id}}: {{change.subject|truncatewords:11}}
+      {%if change.merged %} (Merged)
+      {%else%}{%if change.closed %} (Closed) {%endif%}
+      {%endif%}</b><br/>
+      Created {{change.created|timesince}} ago by {{change.owner|real_name}}<br/>
+      Modified {{change.modified|timesince}} ago<br/>
+      Reviewers: {{change.reviewers|real_names}}<br/>
+      Comments: {{change.num_comments}}
+      {%if change.num_drafts%} <span style="color: red;">+
+	{{change.num_drafts}} drafts</span>{%endif%}
+    </div>
+  {%endif%}
+{%endblock%}
diff --git a/webapp/templates/change_heading.html b/webapp/templates/change_heading.html
new file mode 100644
index 0000000..5aad090
--- /dev/null
+++ b/webapp/templates/change_heading.html
@@ -0,0 +1,8 @@
+<tr align="left">
+  <th class="header-columns" colspan="3" style="text-align: right;">Id</th>
+  <th class="header-columns">Subject</th>
+  <th class="header-columns" width="10%">Owner</th>
+  <th class="header-columns">Reviewers</th>
+  <th class="header-columns" width="8%">Comments</th>
+  <th class="header-columns" width="8%" style="white-space:nowrap">Last Update</th>
+</tr>
diff --git a/webapp/templates/change_pagedrow.html b/webapp/templates/change_pagedrow.html
new file mode 100644
index 0000000..5dfbb86
--- /dev/null
+++ b/webapp/templates/change_pagedrow.html
@@ -0,0 +1,4 @@
+{{change_opos}},{{change_oend}},{{change_prev}},{{change_next}}
+{%for change in change_list%}
+{%include "change_row.html"%}
+{%endfor%}
diff --git a/webapp/templates/change_revision_unknown.html b/webapp/templates/change_revision_unknown.html
new file mode 100644
index 0000000..7119535
--- /dev/null
+++ b/webapp/templates/change_revision_unknown.html
@@ -0,0 +1,5 @@
+{%extends "change_base.html"%}
+
+{% block body %}
+Revision <code>{{hash}}</code> not found.
+{% endblock %}
diff --git a/webapp/templates/change_revision_uploading.html b/webapp/templates/change_revision_uploading.html
new file mode 100644
index 0000000..f41b52e
--- /dev/null
+++ b/webapp/templates/change_revision_uploading.html
@@ -0,0 +1,12 @@
+{%extends "change_base.html"%}
+
+{%block additionalhead%}
+<meta http-equiv="Refresh" content="5; URL=/r/{{hash}}" />
+{%endblock%}
+
+{% block body %}
+<p>The upload of <code>{{hash}}</code> is still being processed.</p>
+<p>Please try again in a few seconds.</p>
+<p>If your browser does not automatically refresh this page,
+<a href="/r/{{hash}}">click here</a>.</p>
+{% endblock %}
diff --git a/webapp/templates/change_row.html b/webapp/templates/change_row.html
new file mode 100644
index 0000000..4faf16b
--- /dev/null
+++ b/webapp/templates/change_row.html
@@ -0,0 +1,27 @@
+<tr
+    class="pagedrow-{{change.paginate_row_type}}"
+    {%if change.num_drafts%}style="color:red"{%endif%}
+    name="change">
+  <td class="selection"><img src="/static/closedtriangle.gif"
+            style="visibility: hidden;" width="12" height="9" /></td>
+  <td class="star" width="17" align="center">{%include "change_star.html"%}</td>
+  <td class="id" align="right"><div class="subject"><a class="noul"
+         href="{%url codereview.views.show change.key.id%}">{{change.key.id}}</a>
+     </div>
+  </td>
+  <td><a href="{%url codereview.views.show change.key.id%}">
+        {{change.subject|truncatewords:11}}</a>
+      {%if change.merged%} (Merged)
+      {%else%}{%if change.closed and not closed_changes%} (Closed) {%endif%}
+      {%endif%}</td>
+  <td><div>{{change.owner|show_user}}</div></td>
+  <td><div>{{change.reviewers|show_users}}</div></td>
+  <td>{%firstof change.num_comments%}
+      {%if change.num_drafts%}
+        <span style="color:red">+
+          {{change.num_drafts}} draft{{change.num_drafts|pluralize}}
+        </span>
+      {%endif%}
+  </td>
+  <td>{{change.modified|abbrevtimesince}}</td>
+</tr>
diff --git a/webapp/templates/change_star.html b/webapp/templates/change_star.html
new file mode 100644
index 0000000..2083e0f
--- /dev/null
+++ b/webapp/templates/change_star.html
@@ -0,0 +1,11 @@
+<span id="change-star-{{change.key.id}}">
+  {%if change.is_starred%}
+    <a href="javascript:M_removeChangeStar({{change.key.id}})">
+      <img src="/static/star-lite.gif" width="15" height="15" border="0"></a>
+  {%else%}
+    {%if request.user%}
+      <a href="javascript:M_addChangeStar({{change.key.id}})">
+	<img src="/static/star-dark.gif" width="15" height="15" border="0"></a>
+    {%endif%}
+  {%endif%}
+</span>
diff --git a/webapp/templates/changes_base.html b/webapp/templates/changes_base.html
new file mode 100644
index 0000000..c25fc64
--- /dev/null
+++ b/webapp/templates/changes_base.html
@@ -0,0 +1,25 @@
+{%extends "base.html" %}
+
+{%block mainmenu2 %}
+  <div class="left_nav_box">
+  <h4>Code Reviews</h4>
+  {%if user %}
+  <ul>
+    <li><a href="{%url codereview.views.mine %}">My Changes</a></li>
+    <li><a href="{%url codereview.views.unclaimed %}">Unclaimed Changes</a></li>
+    <li><a href="{%url codereview.views.all %}">Recent Changes</a></li>
+    <li><a href="{%url codereview.views.starred %}">Starred Changes</a></li>
+  </ul>
+  {%else%}
+  <ul>
+    <li><a href="{%url codereview.views.index %}">Recent Changes</a></li>
+    <li id="signin-link">
+      <a class="novisit" href="{{sign_in}}">Sign in</a> with your
+      <a href="https://www.google.com/accounts/NewAccount">Google Account</a>
+      to add comments.
+    </li>
+  </ul>
+  {%endif%}
+  </div><!-- div class="left_nav_box" -->
+{%endblock%}
+
diff --git a/webapp/templates/context_select.html b/webapp/templates/context_select.html
new file mode 100644
index 0000000..5679903
--- /dev/null
+++ b/webapp/templates/context_select.html
@@ -0,0 +1,12 @@
+<form method="GET" action="">
+  <label for="id_context">Context:</label>
+  <select id="context" name="context" 
+  onchange="this.form.elements[1].disabled=true; this.form.submit()">
+    {%for val in context_values%}
+      <option value="{{val}}"
+      {%ifequal val context%} selected="selected"{%endifequal%}>
+      {{val}} lines</option>
+    {%endfor%}
+  </select>
+  <input type="submit" value="Adjust context" />
+</form>
diff --git a/webapp/templates/delete_loop.html b/webapp/templates/delete_loop.html
new file mode 100644
index 0000000..6566920
--- /dev/null
+++ b/webapp/templates/delete_loop.html
@@ -0,0 +1,8 @@
+{%extends "change_base.html"%}
+{%block title1%}Deleting Change -{%endblock%}
+{%block change_body%}
+<form action="{{del_url}}" method="post">
+<input type="hidden" value="{{del_url|xsrf}}" />
+<input type="submit" value="Continue">
+</form>
+{%endblock%}
diff --git a/webapp/templates/diff.html b/webapp/templates/diff.html
new file mode 100644
index 0000000..020bab1
--- /dev/null
+++ b/webapp/templates/diff.html
@@ -0,0 +1,130 @@
+{%extends "change_base.html"%}
+
+{%block change_body%}
+
+<script language="JavaScript" type="text/javascript"><!--
+function keyPressIntermediary(evt) {
+  return M_keyPress(evt);
+}
+document.onkeypress = keyPressIntermediary;
+{%if user%}
+logged_in = true;
+{%else%}
+logged_in = false;
+login_warned = false;
+{%endif%}
+// -->
+</script>
+
+
+{%if user%}
+<!-- Form used by in-line comment JS; XXX filled in by JS code -->
+<form id="dainlineform" style="display: none;"
+      action="{{inline_draft_url}}" method="post">
+  <div class="comment-border" name="form-container">
+    {{inline_draft_url|form_xsrf}}
+    <input type="hidden" name="snapshot" value="XXX">
+    <input type="hidden" name="lineno" value="XXX">
+    <input type="hidden" name="side" value="XXX">
+    <input type="hidden" name="change" value="{{change.key.id}}">
+    <input type="hidden" name="patchset" value="{{patchset.key.id}}">
+    <input type="hidden" name="patch" value="{{patch.id}}">
+    <textarea name="text" cols="60" rows="5"></textarea><br>
+    <input type="submit" name="save" value="Save"
+           onclick="return M_submitInlineComment(this.form);">
+    <input type="reset" name="cancel" value="Cancel"
+           onclick="M_removeTempInlineComment(this.form)">
+  </div>
+  <div class="comment-border" style="padding: 0pt;"></div>
+</form>
+<a id="resizer" style="display:none;cursor:pointer"><img src="/static/zippyplus.gif"></a>
+{%endif%}
+
+
+
+
+<table style="width: 100%; margin-top: 5px;"><tr>
+  {%if user%}
+  <td style="vertical-align: top; padding-right: 50px;">
+    <div>
+      <form method="get" action="{%url codereview.views.publish change.key.id%}">
+        <input type="submit" value="Publish &amp; Mail Comments" />
+      </form>
+    </div>
+    <div class="tips" style="margin-top: 5px;">
+      Double-click a line to add a draft in-line comment.<br/>
+      Use n/p to move between diff chunks.<br/>
+      <span style="color:#f77">Draft comments are only viewable by you.</span>
+      {%else%}
+      Please Sign in to add in-line comments.
+    </div>
+  </td>
+  {%endif%}
+  <td style="vertical-align: top;">
+    <div style="text-align: left;">
+      <div>{%include "context_select.html"%}</div>
+      <div style="margin-top: 5px;">
+        Jump to:
+        <select onchange="M_jumpToPatch(this, {{change.key.id}}, {{patchset.key.id}});">
+          {%for jump_patch in patchset.patches %}
+            <option value="{{jump_patch.id}}"
+              {%ifequal jump_patch.id patch.id%} selected="selected"{%endifequal%}
+              >{{jump_patch.filename}}</option>
+          {% endfor %}
+        </select>
+      </div>
+      <div style="margin-top: 3px;">
+        <b>Patch Set: {%if patchset.message%}{{patchset.message}}{%endif%}</b>
+        Uploaded {{patchset.created|timesince}} ago
+        {%ifnotequal patchset.owner change.owner%}
+          by <b>{{patchset.owner|show_user}}</b>
+        {%endifnotequal%}
+      </div>
+    </div>
+
+
+  </td>
+  <td>
+  </td>
+</tr></table>
+
+
+<div class="code_diff">
+{%include "diff_navigation.html"%}
+
+<div style="position:relative;" id="table-top">
+
+<span id="hook-sel" style="display:none;"></span>
+
+<table border="0" cellpadding="0" cellspacing="0" id="thecode" style="width: 100%;"
+       ondblclick="M_handleTableDblClick(event)">
+<colgroup style="width: 50%;">
+<colgroup style="width: 50%;">
+<tr><th>OLD</th><th>NEW</th></tr>
+
+{%for row in rows%}{{row|safe}}{%endfor%}
+
+<tr><th>OLD</th><th>NEW</th></tr>
+
+</table>
+
+</div>
+{%include "diff_navigation.html"%}
+</div>
+
+</script>
+<script language="JavaScript" type="text/javascript"><!--
+var old_snapshot = "old";
+var new_snapshot = "new";
+var intraLineDiff = new M_IntraLineDiff();
+var hookState = new M_HookState(window);
+hookState.updateHooks();
+
+var skipped_lines_url =
+'/{{change.key.id}}/diff_skipped_lines/{{patchset.key.id}}/{{patch.id}}/'
+;
+
+// -->
+</script>
+{%endblock%}
+
diff --git a/webapp/templates/diff2.html b/webapp/templates/diff2.html
new file mode 100644
index 0000000..cbacf00
--- /dev/null
+++ b/webapp/templates/diff2.html
@@ -0,0 +1,202 @@
+{%extends "change_base.html"%}
+{%block title1%}{{patch_right.filename}} -{%endblock%}
+{%block body%}
+
+<script language="JavaScript" type="text/javascript"><!--
+function keyPressIntermediary(evt) {
+  return M_keyPress(evt);
+}
+document.onkeypress = keyPressIntermediary;
+{%if user%}
+logged_in = true;
+{%else%}
+logged_in = false;
+login_warned = false;
+{%endif%}
+// -->
+</script>
+
+{%if user%}
+<!-- Form used by in-line comment JS; XXX filled in by JS code -->
+<form id="dainlineform" style="display: none;"
+      action="{{inline_draft_url}}" method="post">
+  <div class="comment-border" name="form-container">
+    {{inline_draft_url|form_xsrf}}
+    <input type="hidden" name="snapshot" value="XXX">
+    <input type="hidden" name="lineno" value="XXX">
+    <input type="hidden" name="side" value="XXX">
+    <input type="hidden" name="change" value="{{change.key.id}}">
+    <input type="hidden" name="ps_left" value="{{ps_left.key.id}}">
+    <input type="hidden" name="patch_left" value="{{patch_left.key.id}}">
+    <input type="hidden" name="ps_right" value="{{ps_right.key.id}}">
+    <input type="hidden" name="patch_right" value="{{patch_right.key.id}}">
+    <textarea name="text" cols="60" rows="5"></textarea><br>
+    <input type="submit" name="save" value="Save"
+           onclick="return M_submitInlineComment(this.form);">
+    <input type="reset" name="cancel" value="Cancel"
+           onclick="M_removeTempInlineComment(this.form)">
+  </div>
+  <div class="comment-border" style="padding: 0pt;"></div>
+</form>
+<a id="resizer" style="display:none;cursor:pointer"><img src="/static/zippyplus.gif"></a>
+{%endif%}
+
+<div style="float: left;">
+  <h2 style="margin-bottom: 0em; margin-top: 0em;">Delta Between Two Patch Sets: {{patch_right.filename}}</h2>
+  <div style="margin-top: .2em;">
+    {%include "change_star.html"%}
+    <b>Change <a href="{%url codereview.views.show change.key.id%}" onmouseover="M_showPopUp(this, 'popup-change');" id="upCL">{{change.key.id}}</a>:</b>
+  {{change.subject|truncatewords:11}}
+  {%if change.merged%} (Merged)
+  {%else%}{%if change.closed%} (Closed) {%endif%}
+  {%endif%}
+  </div>
+  <div style="margin-top: .4em;">
+    <b>Left Patch Set: {%if ps_left.message%}{{ps_left.message}}{%endif%}</b>
+    <span class="extra">
+    Created {{ps_left.created|timesince}} ago
+    {%ifnotequal ps_left.owner change.owner%}
+    by <b>{{ps_left.owner|show_user}}</b>{%endifnotequal%}
+    </span>
+  </div>
+  <div style="margin-top: .4em;">
+    <b>Right Patch Set: {%if ps_right.message%}{{ps_right.message}}{%endif%}</b>
+    <span class="extra">
+    Created {{ps_right.created|timesince}} ago
+    {%ifnotequal ps_right.owner change.owner%}
+    by <b>{{ps_right.owner|show_user}}</b>{%endifnotequal%}
+    </span>
+  </div>
+  <div style="margin-top: .4em;" class="help">
+    Use n/p to move between diff chunks;
+    N/P to move between comments.
+    {%if user%}
+    Double-click a line to add a draft in-line comment.
+    <br><span style="color:red">Draft comments are only viewable by you;</span>
+    use <a href="{%url codereview.views.publish change.key.id%}" class="novisit">Publish+Mail Comments</a> ('m') to let others view them.
+    {%else%}
+    Please Sign in to add in-line comments.
+    {%endif%}
+  </div>
+</div>
+<div style="float: right; color: #333333; background-color: #eeeeec; border: 1px solid lightgray; -moz-border-radius: 5px 5px 5px 5px; padding: 5px;">
+  <div>{%include "context_select.html"%}</div>
+  <div>
+    Jump to: <select onchange="M_jumpToPatch(this, {{change.key.id}}, {{patchset.key.id}});">
+      {% for jump_patch in ps_right.patches %}
+        <option value="{{jump_patch.id}}"
+         {%ifequal jump_patch.id patch.id%} selected="selected"{%endifequal%}>{{jump_patch.filename}}</option>
+      {% endfor %}
+    </select>
+  </div>
+  <div>
+    Left: <a href="{%url codereview.views.diff change.key.id,ps_left.key.id,patch_left.key.id%}"
+             title="View regular side by side diff">Side by side diff</a>
+          |
+          <a href="{%url codereview.views.download_patch change.key.id,ps_left.key.id,patch_left.key.id%}"
+             title="Download patch for {{patch_left.filename}}">Download</a>
+          <br/>
+    Right: <a href="{%url codereview.views.diff change.key.id,ps_right.key.id,patch_right.key.id%}"
+              title="View regular side by side diff">Side by side diff</a>
+           |
+           <a href="{%url codereview.views.download_patch change.key.id,ps_right.key.id,patch_right.key.id%}"
+             title="Download patch for {{patch_right.filename}}">Download</a>
+    {%if user%}
+  </div>
+  <div style="margin-top: 5px;">
+    <a class="novisit" href="{%url codereview.views.publish change.key.id%}">Publish+Mail
+    Comments</a> ('m')
+    {%endif%}
+  </div>
+</div>
+<div style="clear: both;"></div>
+
+
+<div class="code" style="margin-top: 1.3em; display: table; margin-left: auto; margin-right: auto;">
+<div class="codenav">
+{%comment%}
+For some reason,
+{%url codereview.views.diff change.key.id,patchset.key.id,patch.prev.key.id%}
+doesn't work.  Go figure.  Bleah.  So use absolute URLs.
+{%endcomment%}
+{%if patch_right.prev%}
+<a id="prevFile" 
+   href="/{{change.key.id}}/diff2/{{ps_left.key.id}}:{{ps_right.key.id}}/{{patch_right.prev.key.id}}">
+&laquo; {{patch_right.prev.filename}}</a> ('k'){%else%}
+<span class="disabled">&laquo; no previous file</span>{%endif%}
+|
+{%if patch_right.next%}
+<a id="nextFile"
+   href="/{{change.key.id}}/diff2/{{ps_left.key.id}}:{{ps_right.key.id}}/{{patch_right.next.key.id}}">
+{{patch_right.next.filename}} &raquo;</a> ('j'){%else%}
+<span class="disabled">no next file &raquo;</span>{%endif%}
+|
+<a href="javascript:if (intraLineDiff) intraLineDiff.toggle()">
+Toggle Intra-line Diffs</a> ('i')
+|
+<a href="javascript:M_expandAllInlineComments()">Expand Comments</a> ('e')
+|
+<a href="javascript:M_collapseAllInlineComments()">Collapse Comments</a> ('c')
+|
+<a id="show-all-inline"
+   style="display:none"
+   href="javascript:M_showAllInlineComments()">Show Comments</a>
+<a id="hide-all-inline"
+   href="javascript:M_hideAllInlineComments()">Hide Comments</a> ('s')
+</div>
+<div style="position:relative" id="table-top">
+
+<span id="hook-sel" style="display:none;"></span>
+
+<table border="0" cellpadding="0" cellspacing="0" id="thecode"
+       ondblclick="M_handleTableDblClick(event)">
+
+<tr><th>LEFT</th><th>RIGHT</th></tr>
+
+{%for row in rows%}{{row|safe}}{%endfor%}
+
+<tr><th>LEFT</th><th>RIGHT</th></tr>
+
+</table>
+
+</div>
+
+<div class="codenav">
+{%if patch_right.prev%}
+<a id="prevFile"
+   href="/{{change.key.id}}/diff2/{{ps_left.key.id}}:{{ps_right.key.id}}/{{patch_right.prev.key.id}}">
+&laquo; {{patch_right.prev.filename}}</a> ('k'){%else%}
+<span class="disabled">&laquo; no previous file</span>{%endif%}
+|
+{%if patch_right.next%}
+<a id="nextFile"
+   href="/{{change.key.id}}/diff2/{{ps_left.key.id}}:{{ps_right.key.id}}/{{patch_right.next.key.id}}">
+{{patch_right.next.filename}} &raquo;</a> ('j'){%else%}
+<span class="disabled">no next file &raquo;</span>{%endif%}
+|
+<a href="javascript:if (intraLineDiff) intraLineDiff.toggle()">
+Toggle Intra-line Diffs</a> ('i')
+|
+<a href="javascript:M_expandAllInlineComments()">Expand Comments</a> ('e')
+|
+<a href="javascript:M_collapseAllInlineComments()">Collapse Comments</a> ('c')
+|
+<a href="javascript:M_toggleAllInlineComments()">
+Toggle Comments</a> ('s')
+</div>
+
+</div>
+</script>
+<script language="JavaScript" type="text/javascript"><!--
+var old_snapshot = "new";
+var new_snapshot = "new";
+var intraLineDiff = new M_IntraLineDiff();
+var hookState = new M_HookState(window);
+hookState.updateHooks();
+
+var skipped_lines_url = ('/' + {{change.key.id}} + '/diff2_skipped_lines/' +
+                         {{ps_left.key.id}} + ':' + {{ps_right.key.id}} + '/' +
+                         {{patch_id}} + '/');
+// -->
+</script>
+{%endblock%}
diff --git a/webapp/templates/diff_navigation.html b/webapp/templates/diff_navigation.html
new file mode 100644
index 0000000..7bb925d
--- /dev/null
+++ b/webapp/templates/diff_navigation.html
@@ -0,0 +1,36 @@
+<div class="tips codenav">
+{%comment%}
+For some reason,
+{%url codereview.views.diff change.key.id,patchset.key.id,patch.prev.key.id%}
+doesn't work.  Go figure.  Bleah.  So use absolute URLs.
+{%endcomment%}
+{%if patch.prev%}
+<a id="prevFile" 
+   href="/{{change.key.id}}/diff/{{patchset.key.id}}/{%spaceless%}
+   {{patch.prev.id}}{%if context%}?context={{context}}{%endif%}
+   {%endspaceless%}">
+&laquo; {{patch.prev.filename}}</a> ('k'){%else%}
+<span class="disabled">&laquo; no previous file</span>{%endif%}
+|
+{%if patch.next%}
+<a id="nextFile"
+   href="/{{change.key.id}}/diff/{{patchset.key.id}}/{%spaceless%}
+   {{patch.next.id}}{%if context %}?context={{context}}{%endif%}
+   {%endspaceless%}">
+{{patch.next.filename}} &raquo;</a> ('j'){%else%}
+<span class="disabled">no next file &raquo;</span>{%endif%}
+|
+
+<a href="javascript:if (intraLineDiff) intraLineDiff.toggle()">
+Toggle Intra-line Diffs</a> ('i')
+|
+<a href="javascript:M_expandAllInlineComments()">Expand Comments</a> ('e')
+|
+<a href="javascript:M_collapseAllInlineComments()">Collapse Comments</a> ('c')
+|
+<a id="show-all-inline"
+   style="display:none"
+   href="javascript:M_showAllInlineComments()">Show Comments</a>
+<a id="hide-all-inline"
+   href="javascript:M_hideAllInlineComments()">Hide Comments</a> ('s')
+</div>
diff --git a/webapp/templates/edit.html b/webapp/templates/edit.html
new file mode 100644
index 0000000..119b8c6
--- /dev/null
+++ b/webapp/templates/edit.html
@@ -0,0 +1,33 @@
+{%extends "change_base.html"%}
+{%block title1%}Edit Change -{%endblock%}
+{%block change_body%}
+<form action="{%url codereview.views.edit change.key.id%}"
+      method="post" id="edit-form">
+<table>
+{{form}}
+<tr><td><input type="submit" value="Update Change"></td></tr>
+</table>
+</form>
+
+<a id="resizer" style="display:none;cursor:pointer">
+<img src="/static/zippyplus.gif"></a>
+<script language="JavaScript" type="text/javascript"><!--
+M_addTextResizer_(document.getElementById("edit-form"));
+--></script>
+
+<p>
+<ul>
+<li>Owner: {{change.owner|show_user}}
+<li>Created: {{change.created|date:"Y/m/d H:i:s"}}
+<li>Last updated: {{change.modified|date:"Y/m/d H:i:s"}}
+</ul>
+</p>
+
+<h2>Delete This Change</h2>
+
+<form action="{{del_url}}" method="post">
+{{del_url|form_xsrf}}
+<input type="submit" value="Delete Change"> There is no undo!
+</form>
+
+{%endblock%}
diff --git a/webapp/templates/inline_comment.html b/webapp/templates/inline_comment.html
new file mode 100644
index 0000000..a832a15
--- /dev/null
+++ b/webapp/templates/inline_comment.html
@@ -0,0 +1,67 @@
+{%for c in comments%}
+<div class="comment-border{%if c.confidence%} conf{{c.confidence}}{%endif%} {{c.backend}}" name="comment-border">
+<div class="inline-comment-title" onclick="M_switchInlineComment({{forloop.counter0}}, {{lineno}}, '{{side}}')">
+{%if c.draft%}<b>(Draft)</b>{%else%}<b>{{c.author|real_name}}</b>{%endif%}
+{%if c.confidence_text%} <b>(confidence {{c.confidence_text}})</b>{%endif%}
+{{c.date|date:"Y/m/d H:i:s"}}
+<span id="inline-preview-{{forloop.counter0}}-{{lineno}}-{{side}}" 
+  class="extra" name="inline-preview"
+  {%if c.draft%}style="visibility: hidden"{%endif%}>{{c.shorttext}}</span>
+</div>
+<div id="inline-comment-{{forloop.counter0}}-{{lineno}}-{{side}}"
+     class="inline-comment"
+     name="inline-comment"
+     {%if c.draft%}ondblclick="M_editInlineComment({{forloop.counter0}}, {{lineno}}, '{{side}}'); M_stopBubble(window, event);"{%endif%}
+     {%if not c.draft%}style="display: none"{%endif%}>
+{%for bucket in c.buckets%}
+{%if bucket.quoted%}
+<div><a class="comment-hide-link" href="javascript:M_switchQuotedText({{forloop.parentloop.counter0}}, {{forloop.counter0}}, {{lineno}}, '{{side}}')">(Un)hide quoted text</a></div>
+{%endif%}
+<div name="comment-text-{{forloop.parentloop.counter0}}-{{lineno}}-{{side}}"
+id="comment-text-{{forloop.parentloop.counter0}}-{{lineno}}-{{side}}-{{forloop.counter0}}"
+class="{%if bucket.quoted%}comment-text-quoted{%else%}comment-text{%endif%}"
+{%if bucket.quoted%}style="display: none"{%endif%}
+>{{bucket.text|wordwrap:"80"|escape|urlize}}</div>
+{%endfor%}
+{%if c.draft%}
+<a name="comment-reply"
+   id="edit-link-{{forloop.counter0}}-{{lineno}}-{{side}}"
+   href="javascript:M_editInlineComment({{forloop.counter0}}, {{lineno}}, '{{side}}')"><b>Edit</b></a>
+<a name="comment-reply"
+   id="undo-link-{{forloop.counter0}}-{{lineno}}-{{side}}"
+   style="display:none"
+   href="javascript:M_restoreEditInlineComment({{forloop.counter0}}, {{lineno}}, '{{side}}')"><b>Undo cancel</b></a>
+<form id="comment-form-{{forloop.counter0}}-{{lineno}}-{{side}}"
+      name="comment-form-{{forloop.counter0}}-{{lineno}}-{{side}}"
+      style="display:none" action="{{inline_draft_url}}" method = "POST">
+<div name="form-container">
+{{inline_draft_url|form_xsrf}}
+<input type="hidden" name="change" value="{{change.key.id}}">
+<input type="hidden" name="patchset" value="{{patchset.key.id}}">
+<input type="hidden" name="patch" value="{{patch.id}}">
+<input type="hidden" name="snapshot" value="{{snapshot}}">
+<input type="hidden" name="side" value="{{side}}">
+<input type="hidden" name="file" value="{{file.depot_path|escape}}">
+<input type="hidden" name="lineno" value="{{lineno}}">
+<input type="hidden" name="oldtext" value="{{c.text}}">
+{%if c.message_id%}<input type="hidden" name="message_id" value="{{c.message_id}}">{%endif%}
+<textarea name="text" cols="60" rows="5">{{c.text}}</textarea><br>
+<input type="submit" name="save" value="Save" onclick="return M_submitInlineComment(this.form, {{forloop.counter0}}, {{lineno}}, '{{side}}')">
+<input type="reset" name="cancel" value="Cancel" onclick="M_resetAndHideInlineComment(this.form, {{forloop.counter0}}, {{lineno}}, '{{side}}')">
+<input type="submit" name="discard" value="Discard" onclick="return M_removeInlineComment(this.form, {{forloop.counter0}}, {{lineno}}, '{{side}}')">
+</div>
+</form>
+{%else%}
+{%if user%}
+<a name="comment-reply"
+   href="javascript:M_replyToInlineComment('{{c.author|real_name:"x"}}', '{{c.date|date:"Y/m/d H:i:s"}}', {{forloop.counter0}}, {{lineno}}, '{{side}}')"
+><b>Reply</b></a>
+{%if c.backend%}<a href="javascript:M_replyToInlineComment('{{c.author|real_name:"x"}}', '{{c.date|date:"Y/m/d H:i:s"}}', {{forloop.counter0}}, {{lineno}}, '{{side}}', 'Please fix.', true)"><b>Please fix</b></a>
+{%else%}<a href="javascript:M_replyToInlineComment('{{c.author|real_name:"x"}}', '{{c.date|date:"Y/m/d H:i:s"}}', {{forloop.counter0}}, {{lineno}}, '{{side}}', 'Done.', true)"><b>Done</b></a>{%endif%}
+{%ifequal c.backend "bugbot"%} &nbsp; <a target="_blank" href="http://bugbotexp{{file.depot_path|escape}}"><b>&raquo; Suppress</b></a>{%endifequal%}
+{%endif%}
+{%endif%}
+</div>
+</div>
+{%endfor%}
+<div class="comment-border" style="padding: 0"></div>
diff --git a/webapp/templates/live_revision.html b/webapp/templates/live_revision.html
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/webapp/templates/live_revision.html
diff --git a/webapp/templates/mails/clean_merge.txt b/webapp/templates/mails/clean_merge.txt
new file mode 100644
index 0000000..de8fdf6
--- /dev/null
+++ b/webapp/templates/mails/clean_merge.txt
@@ -0,0 +1,10 @@
+{%autoescape off%}
+Hi.
+
+Your change has been successfully merged into the git repository.
+
+For more details, see {%autoescape off%}{{url}}{%endautoescape%}
+
+-Your friendly git merger
+
+{%endautoescape%}
diff --git a/webapp/templates/mails/comment.txt b/webapp/templates/mails/comment.txt
new file mode 100644
index 0000000..32f251a
--- /dev/null
+++ b/webapp/templates/mails/comment.txt
@@ -0,0 +1,7 @@
+{%autoescape off%}{%if message%}{{message|wordwrap:"72"}}
+
+{%endif%}{%if details%}{{details|wordwrap:"72"}}
+{%endif%}{%endautoescape%}
+--
+To respond, visit {%autoescape off%}{{url}}{%endautoescape%}
+
diff --git a/webapp/templates/mails/from_email_test.txt b/webapp/templates/mails/from_email_test.txt
new file mode 100644
index 0000000..3a6891d
--- /dev/null
+++ b/webapp/templates/mails/from_email_test.txt
@@ -0,0 +1,8 @@
+
+Test.
+
+If you received this email in error, we apologize.  Please reply-all and
+we'll make sure it doesn't happen again.
+
+
+
diff --git a/webapp/templates/mails/missing_dependency.txt b/webapp/templates/mails/missing_dependency.txt
new file mode 100644
index 0000000..97f69e4
--- /dev/null
+++ b/webapp/templates/mails/missing_dependency.txt
@@ -0,0 +1,13 @@
+{%autoescape off%}
+Hi.
+
+Your change could not be merged because of a missing dependency.  As
+soon as change XXX is submitted, your change will be submitted
+automatically.
+
+Your change: {%autoescape off%}{{url}}{%endautoescape%}
+The missing change: {%autoescape off%}{{url}}{%endautoescape%}
+
+-Your friendly git merger
+
+{%endautoescape%}
diff --git a/webapp/templates/mails/path_conflict.txt b/webapp/templates/mails/path_conflict.txt
new file mode 100644
index 0000000..2ba59b9
--- /dev/null
+++ b/webapp/templates/mails/path_conflict.txt
@@ -0,0 +1,10 @@
+{%autoescape off%}
+Hi.
+
+Your change has not been successfully merged into the git repository.
+
+You need to resolve the following files before it can be submitted:
+
+-Your friendly git merger
+
+{%endautoescape%}
diff --git a/webapp/templates/patch.html b/webapp/templates/patch.html
new file mode 100644
index 0000000..3a17018
--- /dev/null
+++ b/webapp/templates/patch.html
@@ -0,0 +1,163 @@
+{%extends "change_base.html"%}
+{%block body%}
+
+<script language="JavaScript" type="text/javascript"><!--
+function keyPressIntermediary(evt) {
+  return M_keyPress(evt);
+}
+document.onkeypress = keyPressIntermediary;
+{%if user%}
+logged_in = true;
+{%else%}
+logged_in = false;
+login_warned = false;
+{%endif%}
+// -->
+</script>
+
+{%if user%}
+<!-- Form used by in-line comment JS; XXX filled in by JS code -->
+<form id="dainlineform" style="display: none;"
+      action="{{inline_draft_url}}" method="post">
+  <div class="comment-border" name="form-container">
+    {{inline_draft_url|form_xsrf}}
+    <input type="hidden" name="snapshot" value="XXX">
+    <input type="hidden" name="lineno" value="XXX">
+    <input type="hidden" name="side" value="XXX">
+    <input type="hidden" name="change" value="{{change.key.id}}">
+    <input type="hidden" name="patchset" value="{{patchset.key.id}}">
+    <input type="hidden" name="patch" value="{{patch.id}}">
+    <textarea name="text" cols="60" rows="5"></textarea><br>
+    <input type="submit" name="save" value="Save"
+           onclick="return M_submitInlineComment(this.form);">
+    <input type="reset" name="cancel" value="Cancel"
+           onclick="M_removeTempInlineComment(this.form)">
+  </div>
+  <div class="comment-border" style="padding: 0pt;"></div>
+</form>
+<a id="resizer" style="display:none;cursor:pointer"><img src="/static/zippyplus.gif"></a>
+{%endif%}
+
+<div style="float: left;">
+  <h2 style="margin-bottom: 0em; margin-top: 0em;">Unified Diff: {{patch.filename}}</h2>
+  {%ifnotequal patch.nav_type "patch"%}
+    <span style="color:red">Side-by-side diff isn't available for this file because of its large size.</span>
+  {%endifnotequal%}
+  <div style="margin-top: .2em;">{%include "change_star.html"%}
+    <b>Change <a href="{%url codereview.views.show change.key.id%}" onmouseover="M_showPopUp(this, 'popup-change');" id="upCL">{{change.key.id}}</a>:</b>
+  {{change.subject|truncatewords:11}}
+  {%if change.merged%} (Merged)
+  {%else%}{%if change.closed%} (Closed) {%endif%}
+  {%endif%}
+  </div>
+  <div style="margin-top: .4em;">
+    <b>Patch Set: {%if patchset.message%}{{patchset.message}}{%endif%}</b>
+    <span class="extra">
+    Created {{patchset.created|timesince}} ago
+    {%ifnotequal patchset.owner change.owner%}
+    by <b>{{patchset.owner|show_user}}</b>{%endifnotequal%}
+    </span>
+  </div>
+  <div style="margin-top: .4em;" class="help">
+    Use n/p to move between diff chunks;
+    N/P to move between comments.
+    {%if user%}
+    Double-click a line to add a draft in-line comment.
+    <br><span style="color:red">Draft comments are only viewable by you;</span>
+    use <a href="{%url codereview.views.publish change.key.id%}" class="novisit">Publish+Mail Comments</a> ('m') to let others view them.
+    {%else%}
+    Please Sign in to add in-line comments.
+    {%endif%}
+  </div>
+</div>
+<div style="float: right; color: #333333; background-color: #eeeeec; border: 1px solid lightgray; -moz-border-radius: 5px 5px 5px 5px; padding: 5px;">
+  <div>
+    Jump to: <select onchange="M_jumpToPatch(this, {{change.key.id}}, {{patchset.key.id}}, true);">
+      {% for jump_patch in patchset.patch_set %}
+        <option value="{{jump_patch.id}}"
+         {%ifequal jump_patch.id patch.id%} selected="selected"{%endifequal%}>{{jump_patch.filename}}</option>
+      {% endfor %}
+    </select>
+  </div>
+  <div style="margin-top: 5px;">
+    <a href="{%url codereview.views.diff change.key.id,patchset.key.id,patch.id%}">
+    View side by-side-diff with in-line comments</a>
+  </div>
+  <div style="margin-top: 5px;">
+    <a href="{%url codereview.views.download_patch change.key.id,patchset.key.id,patch.id%}"
+       title="Download patch for {{patch.filename}}">
+      Download patch
+    </a>
+  </div>
+  {%if user%}
+  <div style="margin-top: 5px;">
+    <a class="novisit" href="{%url codereview.views.publish change.key.id%}">Publish+Mail
+    Comments</a> ('m')
+  </div>
+  {%endif%}
+</div>
+<div style="clear: both;"></div>
+
+<div class="code" style="margin-top: 1.3em; display: table; margin-left: auto; margin-right: auto;">
+
+<div class="codenav">
+{%if patch.prev%}
+<a id="prevFile" 
+   href="{%url codereview.views.patch change.key.id,patchset.key.id,patch.prev.id%}">
+&laquo; {{patch.prev.filename}}</a> ('k'){%else%}
+<span class="disabled">&laquo; no previous file</span>{%endif%}
+|
+{%if patch.next%}
+<a id="nextFile"
+   href="{%url codereview.views.patch change.key.id,patchset.key.id,patch.next.id%}">
+{{patch.next.filename}} &raquo;</a> ('j'){%else%}
+<span class="disabled">no next file &raquo;</span>{%endif%}
+|
+<a href="javascript:M_expandAllInlineComments()">Expand Comments</a> ('e')
+|
+<a href="javascript:M_collapseAllInlineComments()">Collapse Comments</a> ('c')
+|
+<a id="show-all-inline"
+   style="display:none"
+   href="javascript:M_showAllInlineComments()">Show Comments</a>
+<a id="hide-all-inline"
+   href="javascript:M_hideAllInlineComments()">Hide Comments</a> ('s')
+</div>
+
+<div style="position:relative" id="table-top">
+
+<span id="hook-sel" style="display:none;"></span>
+
+<table style="padding: 5px;" cellpadding="0" cellspacing="0" id="thecode"
+       ondblclick="M_handleTableDblClick(event)">
+{%for row in rows%}{{row|safe}}{%endfor%}
+</table>
+
+</div>
+<div class="codenav">
+{%if patch.prev%}
+<a id="prevFile"
+   href="{%url codereview.views.patch change.key.id,patchset.key.id,patch.prev.id%}">
+&laquo; {{patch.prev.filename}}</a> ('k'){%else%}
+<span class="disabled">&laquo; no previous file</span>{%endif%}
+|
+{%if patch.next%}
+<a id="nextFile"
+   href="{%url codereview.views.patch change.key.id,patchset.key.id,patch.next.id%}">
+{{patch.next.filename}} &raquo;</a> ('j'){%else%}
+<span class="disabled">no next file &raquo;</span>{%endif%}
+</div>
+</div>
+
+</script>
+<script language="JavaScript" type="text/javascript"><!--
+var old_snapshot = "old";
+var new_snapshot = "new";
+var intraLineDiff = new M_IntraLineDiff();
+var hookState = new M_HookState(window);
+hookState.updateHooks();
+
+
+// -->
+</script>
+{%endblock%}
diff --git a/webapp/templates/patchset.html b/webapp/templates/patchset.html
new file mode 100644
index 0000000..f029cac
--- /dev/null
+++ b/webapp/templates/patchset.html
@@ -0,0 +1,81 @@
+{%if patchset.n_comments or patchset.n_drafts%}
+  <div>
+    <i>Total comments:</i> {{patchset.n_comments}}
+    {%if patchset.n_drafts%}
+      <span style="color:red">
+        <b>+ {{patchset.n_drafts}} draft{{patchset.n_drafts|pluralize}}</b>
+      </span>
+    {%endif%}
+  </div>
+{%endif%}
+
+<div class="change-list">
+  <div class="pagination">
+    <div style="float: left;">
+      <i>Created:</i> {{patchset.created|timesince}} ago
+      {%ifnotequal patchset.owner change.owner%}
+      by <b>{{patchset.owner|real_name}}</b>{%endifnotequal%}
+    </div>
+    <div style="clear:both;"></div>
+  </div>
+ 
+{%if patchset.freaking_huge%}
+  <div style="margin-top: 5px; float: left;" class="error">
+  Patch Set {{patchset.id}} has too many files.
+  </div>
+  <div style="clear:both;"></div>
+{%else%}
+  <table class="change_info_table" style="clear:both;">
+    <tr align="left">
+      <th class="leftmost"></th>
+      <th>Side-by-side diffs</th>
+      <th>Delta from patch set</th>
+      <th>Comments</th>
+      <th colspan="3" class="rightmost">Unified diffs</th>
+    </tr>
+  {%for patch in patchset.patches%}
+    <tr>
+      <td>{%if patch.status%}{{patch.status}}{%endif%}</td>
+      <td>
+        <a class="noul"
+           href="{%url codereview.views.diff change.key.id,patch.patchset.key.id,patch.id%}"
+          >{{patch.filename}}
+        </a>
+      </td>
+      <td>{%comment%}{%for other in patchsets%}{%ifnotequal other patchset%}{%for opatch in other.patches%}{%ifequal opatch.filename patch.filename%}{%ifnotequal opatch.patch_hash patch.patch_hash%}
+      <a href="/{{change.key.id}}/diff2/{{other.key.id}}:{{patchset.key.id}}/{{patch.id}}" title="Delta from patch set {{forloop.parentloop.counter}}">{{forloop.parentloop.counter}}</a>&nbsp;{%endifnotequal%}{%endifequal%}{%endfor%}{%endifnotequal%}{%endfor%}
+      {%endcomment%}
+      </td>
+      <td>
+        {%if patch.num_comments or patch.num_drafts%}<b>{%endif%}
+          {{patch.num_comments}} comment{{patch.num_comments|pluralize}}
+          {%if patch.num_drafts%}
+          <span style="color:red">+
+            {{patch.num_drafts}} draft{{patch.num_drafts|pluralize}}
+          </span>
+        {%endif%}
+        {%if patch.num_comments or patch.num_drafts%}</b>{%endif%}
+      </td>
+      <td>
+        <a href="{%url codereview.views.patch change.key.id,patch.patchset.key.id,patch.id%}">
+          View
+        </a>
+      </td>
+      <td>
+        <a href="{%url codereview.views.download_patch change.key.id,patch.patchset.key.id,patch.id%}"
+           title="Download patch for {{patch.filename}}">
+          Download
+        </a>
+      </td>
+    </tr>
+  {%endfor%}
+  </table>
+{%endif%}
+
+  {%if not patchset.complete%}
+    <div style="margin-top: 5px; float: left;" class="error">
+    Patch Set {{patchset.id}} is still being uploaded ...
+    </div>
+    <div style="clear:both;"></div>
+  {%endif%}
+</div>
diff --git a/webapp/templates/patchset_patchrow.html b/webapp/templates/patchset_patchrow.html
new file mode 100644
index 0000000..422aa50
--- /dev/null
+++ b/webapp/templates/patchset_patchrow.html
@@ -0,0 +1,34 @@
+<tr>
+  <td>{%if patch.status%}{{patch.status}}{%endif%}</td>
+  <td>
+    <a class="noul"
+       href="{%url codereview.views.diff change.key.id,patch.patchset.key.id,patch.id%}"
+      >{{patch.filename}}
+    </a>
+  </td>
+  <td>{%comment%}{%for other in patchsets%}{%ifnotequal other patchset%}{%for opatch in other.patches%}{%ifequal opatch.filename patch.filename%}{%ifnotequal opatch.patch_hash patch.patch_hash%}
+  <a href="/{{change.key.id}}/diff2/{{other.key.id}}:{{patchset.key.id}}/{{patch.id}}" title="Delta from patch set {{forloop.parentloop.counter}}">{{forloop.parentloop.counter}}</a>&nbsp;{%endifnotequal%}{%endifequal%}{%endfor%}{%endifnotequal%}{%endfor%}
+  {%endcomment%}
+  </td>
+  <td>
+    {%if patch.num_comments or patch.num_drafts%}<b>{%endif%}
+      {{patch.num_comments}} comment{{patch.num_comments|pluralize}}
+      {%if patch.num_drafts%}
+      <span style="color:red">+
+        {{patch.num_drafts}} draft{{patch.num_drafts|pluralize}}
+      </span>
+    {%endif%}
+    {%if patch.num_comments or patch.num_drafts%}</b>{%endif%}
+  </td>
+  <td>
+    <a href="{%url codereview.views.patch change.key.id,patch.patchset.key.id,patch.id%}">
+      View
+    </a>
+  </td>
+  <td>
+    <a href="{%url codereview.views.download_patch change.key.id,patch.patchset.key.id,patch.id%}"
+       title="Download patch for {{patch.filename}}">
+      Download
+    </a>
+  </td>
+</tr>
diff --git a/webapp/templates/publish.html b/webapp/templates/publish.html
new file mode 100644
index 0000000..d4303ef
--- /dev/null
+++ b/webapp/templates/publish.html
@@ -0,0 +1,39 @@
+{%extends "change_base.html"%}
+{%block title1%}Publish+Mail -{%endblock%}
+{%block change_body%}
+<h2>Publish + Mail Draft Comments</h2>
+
+<div>
+  <form action="{%url codereview.views.publish change.key.id%}"
+        method="post" id="publish-form">
+  <table>
+  {{form}}
+  <tr>
+    <td></td>
+    <td>
+  {%ifequal user change.owner%}
+      <input type="submit" value="Publish Comments">
+  {%else%}
+      <input type="submit" value="Publish Comments + Approvals">
+  {%endifequal%}
+     </td>
+  </tr>
+  </table>
+  </form>
+
+  <a id="resizer" style="display:none;cursor:pointer">
+  <img src="/static/zippyplus.gif"></a>
+  <script language="JavaScript" type="text/javascript"><!--
+  M_addTextResizer_(document.getElementById("publish-form"));
+  --></script>
+
+</div>
+{%if preview%}
+<div style="margin-top: 3em;">
+  <h3>Unpublished Drafts:</h3>
+  <pre class="description">{{preview|wordwrap:"80"|urlize}}</pre>
+</div>
+{%endif%}
+<div style="clear:both"></div>
+
+{%endblock%}
diff --git a/webapp/templates/settings.html b/webapp/templates/settings.html
new file mode 100644
index 0000000..8139287
--- /dev/null
+++ b/webapp/templates/settings.html
@@ -0,0 +1,42 @@
+{%extends "base.html"%}
+{%block title1%}Settings -{%endblock%}
+{%block body%}
+<h1>Settings for {{user.email}}</h1>
+
+<form action="{%url codereview.settings.settings%}" method="POST">
+
+{{form.xsrf}}
+{%if form.xsrf.errors%}
+<ul>
+  {%for e in form.xsrf.errors%}
+    <li>{{e}}</li>
+  {%endfor%}
+</ul>
+{%endif%}
+
+<table class="settings">
+<thead>
+<tr><th colspan="2">Display Options</th></tr>
+</thead>
+<tbody>
+<tr><th>Diff context</th>
+    <td>{{form.context}}{{form.context.errors}}</td></tr>
+</td></tr>
+</tbody>
+</table>
+
+
+<table class="settings">
+<thead>
+<tr><th colspan="2">Projects</th></tr>
+</thead>
+<tbody>
+<tr><th>View unclaimed changes<br/>for projects</th>
+    <td>{{form.unclaimed_changes_projects}}</td></tr>
+</tbody>
+</table>
+
+<input type="submit" value="Update Settings">
+</form>
+
+{%endblock%}
diff --git a/webapp/templates/settings_welcome_1.html b/webapp/templates/settings_welcome_1.html
new file mode 100644
index 0000000..49a9b8e
--- /dev/null
+++ b/webapp/templates/settings_welcome_1.html
@@ -0,0 +1,38 @@
+{%extends "base.html"%}
+{%block title1%}Settings -{%endblock%}
+{%block body%}
+<h2>Hi!</h2>
+
+<form name="welcome" action="{{post_url}}" method="POST">
+
+{{form.xsrf}}
+{%if form.xsrf.errors%}
+<ul>
+  {%for e in form.xsrf.errors%}
+    <li>{{e}}</li>
+  {%endfor%}
+</ul>
+{%endif%}
+
+{{form.dest}}
+<input type="hidden" name="step" value="1" />
+
+<p>Hi, welcome to Android.  Before we can get going, we need a little bit of
+information from you.</p>
+
+<table>
+<table class="largeform">
+<tr><th class="largeform_field">Your name</th></tr>
+<tr><td class="largeform_field">{{form.real_name}}
+
+<p>We like to maintain a friendly atmosphere here, and we feel that calling people
+by their real name helps that.
+<p><i>Also, we can't accept code submitted without
+knowing who really submitted it.</i>
+</td></tr>
+</table>
+
+<input type="submit" value="Continue">
+</form>
+
+{%endblock%}
diff --git a/webapp/templates/settings_welcome_2.html b/webapp/templates/settings_welcome_2.html
new file mode 100644
index 0000000..7d61b0a
--- /dev/null
+++ b/webapp/templates/settings_welcome_2.html
@@ -0,0 +1,60 @@
+{%extends "base.html"%}
+{%block title1%}Settings -{%endblock%}
+{%block body%}
+<h2>Hi!</h2>
+
+<form name="welcome" action="{{post_url}}" method="POST">
+
+{{form.xsrf}}
+{%if form.xsrf.errors%}
+<ul>
+  {%for e in form.xsrf.errors%}
+    <li>{{e}}</li>
+  {%endfor%}
+</ul>
+{%endif%}
+
+{{form.dest}}
+<input type="hidden" name="step" value="2" />
+
+<p>Hi, welcome to Android.  Before we can get going, we need a little bit of
+information from you.</p>
+
+<table class="largeform">
+<tr><th class="largeform_field">Contributor License Grant</th></tr>
+<tr><td class="largeform_field">
+If you're going to contribute code, we need you to sign a "contributor
+license grant."  This affirms that you are granting the Android Project 
+the right to use the code you contribute.  Please read the agreement for all
+of the details.
+<p>Which one would you like?</p>
+<ul style="list-style: none;">
+  <li><input type="radio" id="id_cla_none" value="none" name="cla"
+      {% ifequal form.initial.cla 'none' %}checked{% endifequal %}
+      /><label
+      for="id_cla_none"> <b>None right now.</b>
+      If you don't want to do this now, you can go to your user settings
+      page and do it later.<br/>
+      </label></li>
+  <li><input type="radio" id="id_cla_individual" value="individual" name="cla"
+      {% ifequal form.initial.cla 'individual' %}checked{% endifequal %}
+      /><label for="id_cla_individual"> <b>Individual.</b>
+      If you are going to be contributing code on your own, this is the one
+      you want.  You can sign this one online.</label></li>
+  <li><input type="radio" id="id_cla_corporate" value="corporate" name="cla"
+      {% ifequal form.initial.cla 'corporate' %}checked{% endifequal %}
+      /><label for="id_cla_corporate"> <b>Corporate.</b>
+      If you are going to be contributing code
+      on behalf of your company, this is the one you want.  We'll give
+      you a form that will need to printed, signed and sent back via
+      post, email or fax.</label></li>
+</ul>
+</table>
+
+<input type="button" name="back" value="Back" onclick="document.welcome.submit();">
+<input type="submit" name="continue" value="Continue">
+
+</form>
+
+{%endblock%}
+
diff --git a/webapp/templates/settings_welcome_3_corporate.html b/webapp/templates/settings_welcome_3_corporate.html
new file mode 100644
index 0000000..87340c4
--- /dev/null
+++ b/webapp/templates/settings_welcome_3_corporate.html
@@ -0,0 +1,69 @@
+{%extends "base.html"%}
+{%block title1%}Settings -{%endblock%}
+{%block body%}
+<h2>Hi!</h2>
+
+<form name="welcome" action="{{post_url}}" method="POST">
+
+{{form.xsrf}}
+{%if form.xsrf.errors%}
+<ul>
+  {%for e in form.xsrf.errors%}
+    <li>{{e}}</li>
+  {%endfor%}
+</ul>
+{%endif%}
+
+{{form.dest}}
+<input type="hidden" name="step" value="3corp" />
+
+<p>Hi, welcome to Android.  Before we can get going, we need a little bit of
+information from you.</p>
+
+<hr/>
+
+<table class="largeform">
+<tr><th class="largeform_field">Contributor License Grant</th></tr>
+<tr><td class="largeform_field">
+Please print out this document:
+<div style="padding-left: 30px; font-family: monospace;"><br/><a href="/static/corp_cla.html" target="_blank">Corporate Contributor License Agreement</a></div>
+
+<p>Next have an authorized person sign it.
+
+<p>Then send it via one of the following methods:
+
+<p>Email a scanned copy to:
+<div style="padding-left: 30px; font-family: monospace;">
+    cla-submissions@google.com
+</div>
+
+<p>Fax to:
+<div style="padding-left: 30px; font-family: monospace;">
+    (650) 887-1625
+</div>
+
+<p>Or via post to:
+
+<div style="padding-left: 30px; font-family: monospace;">
+    Google Inc.<br/>
+    Attn: Open Source Program Office<br/>
+    1600 Amphitheatre Pkwy<br/>
+    Building 43<br/>
+    Mountain View, CA 94043<br/>
+    U.S.A.<br/>
+</div>
+
+<p>We will contact you with further details when we receive your completed paperwork.
+
+</td></tr>
+</table>
+<hr/>
+
+
+<input type="button" name="back" value="Back" onclick="document.welcome.submit();">
+<input type="submit" name="continue" value="Continue">
+
+</form>
+
+{%endblock%}
+
diff --git a/webapp/templates/settings_welcome_3_individual.html b/webapp/templates/settings_welcome_3_individual.html
new file mode 100644
index 0000000..e19c1d0
--- /dev/null
+++ b/webapp/templates/settings_welcome_3_individual.html
@@ -0,0 +1,161 @@
+{%extends "base.html"%}
+{%block title1%}Settings -{%endblock%}
+{%block body%}
+<h2>Hi!</h2>
+
+<form name="welcome" action="{{post_url}}" method="POST">
+
+{{form.xsrf}}
+{%if form.xsrf.errors%}
+<ul>
+  {%for e in form.xsrf.errors%}
+    <li>{{e}}</li>
+  {%endfor%}
+</ul>
+{%endif%}
+
+{{form.dest}}
+<input type="hidden" name="step" value="3ind" />
+
+<p>Hi, welcome to Android.  Before we can get going, we need a little bit of
+information from you.</p>
+
+<table class="largeform">
+<tr><th class="largeform_field">Individual Contributor License Grant</th></tr>
+<tr><td class="largeform_field">
+
+<p
+{% if form.i_agree.errors %}
+    style="color: red;"
+{% endif %}
+>Please read the following, and agree to it by typing the words "I AGREE" in the box below.</p>
+
+
+<hr>
+
+<div style="padding: 0 30px 0 30px;">
+
+
+<div dir="ltr"><p style="margin:0px">In
+order to clarify the intellectual property license granted with
+Contributions from any person or entity, the Android Open Source
+Project (the "Project") must have a Contributor License Grant ("Grant")
+on file that has been signed by each Contributor, indicating agreement
+to the license terms below. This license is for your protection as a
+Contributor as well as the protection of the Project and the Android
+Open Source Project Leads (the "Project Leads"); it does not change
+your rights to use your own Contributions for any other purpose.  If
+you have not already done so, please complete and send an original
+signed Grant to</p><blockquote style="border:1px dashed rgb(221, 221, 221);padding:10px">Google Inc.<br />Attn: Open Source Program Office<br />1600 Amphitheatre Pkwy<br />Building 43<br />Mountain View, CA 94043<br />U.S.A.<br /></blockquote><p style="margin:0px">Scanned
+agreements may also be emailed in PDF form to
+cla-submissions@google.com, sent by facsimile to (650) 887-1625, or
+signed electronically with the form below.</p><p style="margin:0px">Please read this document carefully before signing and keep a copy for your records.</p><pre style="border:1px solid silver;margin:2em;padding:0.5em;color:rgb(0, 112, 0);font-size:100%;background-color:rgb(245, 245, 245)"> <br /><br />Full name: ____________________________  E-Mail: ______________________<br />   <br />    <br />   <br />Mailing Address: ______________________  Telephone: ___________________<br />   <br />    <br />   <br />_______________________________________  Facsimile: ___________________<br />   <br />    <br />   <br />_______________________________________  Country:   ___________________<br />   <br />   <br /></pre><p style="margin:0px">You
+accept and agree to the following terms and conditions for Your present
+and future Contributions submitted to the Project. Except for the
+license granted herein to the Project Leads and recipients of software
+distributed by the Project Leads, You reserve all right, title, and
+interest in and to Your Contributions.</p><p style="margin:0px"><br /></p><ol style="margin-top:0px;margin-bottom:0px"><li style="margin-top:0px;margin-bottom:0px"><p style="margin:0px">Definitions.
+"You" (or "Your") shall mean the copyright owner or legal entity
+authorized by the copyright owner that is making this Grant. For legal
+entities, the entity making a Contribution and all other entities that
+control, are controlled by, or are under common control with that
+entity are considered to be a single Contributor. For the purposes of
+this definition, "control" means (i) the power, direct or indirect, to
+cause the direction or management of such entity, whether by contract
+or otherwise, or (ii) ownership of fifty percent (50%) or more of the
+outstanding shares, or (iii) beneficial ownership of such entity.
+"Contribution" shall mean any original work of authorship, including
+any modifications or additions to an existing work, that is
+intentionally submitted by You to the Project Leads for inclusion in,
+or documentation of, any of the products managed or maintained by the
+Project Leads (the "Work"). For the purposes of this definition,
+"submitted" means any form of electronic, verbal, or written
+communication sent to the Project Leads or their representatives,
+including but not limited to communication on electronic mailing lists,
+source code control systems, and issue tracking systems that are
+managed by, or on behalf of, the Project Leads for the purpose of
+discussing and improving the Work, but excluding communication that is
+conspicuously marked or otherwise designated in writing by You as "Not
+a Contribution."</p></li><li style="margin-top:0px;margin-bottom:0px"><p style="margin:0px">Grant
+of Copyright License. Subject to the terms and conditions of this
+Grant, You hereby grant to the Project Leads and to recipients of
+software distributed by the Project Leads a perpetual, worldwide,
+non-exclusive, no-charge, royalty-free, irrevocable copyright license
+to reproduce, prepare derivative works of, publicly display, publicly
+perform, sublicense, and distribute Your Contributions and such
+derivative works.</p></li><li style="margin-top:0px;margin-bottom:0px"><p style="margin:0px">Grant
+of Patent License. Subject to the terms and conditions of this Grant,
+You hereby grant to the Project Leads and to recipients of software
+distributed by the Project Leads a perpetual, worldwide, non-exclusive,
+no-charge, royalty-free, irrevocable (except as stated in this section)
+patent license to make, have made, use, offer to sell, sell, import,
+and otherwise transfer the Work, where such license applies only to
+those patent claims licensable by You that are necessarily infringed by
+Your Contribution(s) alone or by combination of Your Contribution(s)
+with the Work to which such Contribution(s) was submitted. If any
+entity institutes patent litigation against You or any other entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+your Contribution, or the Work to which you have contributed,
+constitutes direct or contributory patent infringement, then any patent
+licenses granted to that entity under this Grant for that Contribution
+or Work shall terminate as of the date such litigation is filed.</p></li><li style="margin-top:0px;margin-bottom:0px"><p style="margin:0px">You
+represent that you are legally entitled to grant the above license. If
+your employer(s) has rights to intellectual property that you create
+that includes your Contributions, you represent that you have received
+permission to make Contributions on behalf of that employer, that your
+employer has waived such rights for your Contributions to the Project
+Leads, or that your employer has executed a separate Corporate
+Contributor License Grant with the Project Leads.</p></li><li style="margin-top:0px;margin-bottom:0px"><p style="margin:0px">You
+represent that each of Your Contributions is Your original creation
+(see section 7 for submissions on behalf of others). You represent that
+Your Contribution submissions include complete details of any
+third-party license or other restriction (including, but not limited
+to, related patents and trademarks) of which you are personally aware
+and which are associated with any part of Your Contributions.</p></li><li style="margin-top:0px;margin-bottom:0px"><p style="margin:0px">You
+are not expected to provide support for Your Contributions, except to
+the extent You desire to provide support. You may provide support for
+free, for a fee, or not at all. Unless required by applicable law or
+agreed to in writing, You provide Your Contributions on an "AS IS"
+BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+implied, including, without limitation, any warranties or conditions of
+TITLE, NON- INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR
+PURPOSE.</p></li><li style="margin-top:0px;margin-bottom:0px"><p style="margin:0px">Should
+You wish to submit work that is not Your original creation, You may
+submit it to the Project Leads separately from any Contribution,
+identifying the complete details of its source and of any license or
+other restriction (including, but not limited to, related patents,
+trademarks, and license agreements) of which you are personally aware,
+and conspicuously marking the work as "Submitted on behalf of a
+third-party: [named here]".  <span style="background-color:rgb(255, 255, 0)"><br /></span></p></li><li style="margin-top:0px;margin-bottom:0px"><p style="margin:0px">You
+agree to notify the Project Leads of any facts or circumstances of
+which you become aware that would make these representations inaccurate
+in any respect.</p></li></ol></div>
+
+
+</div>
+
+<p>I agree: {{form.i_agree}}</p>
+<hr/>
+<p>We need to collect the following information as well:
+<table>
+<tr><td><b>Mailing Address</b></td>
+    <td>{{form.mailing_address}}{{form.mailing_address.errors}}</td></tr>
+<tr><td><b>Country</b></td>
+    <td>{{form.mailing_address_country}}{{form.mailing_address_country.errors}}</td></tr>
+<tr><td><b>Phone Number</b></td>
+    <td>{{form.phone_number}}{{form.phone_number.errors}}</td></tr>
+<tr><td><b>Fax Number (optional)</b></td>
+    <td>{{form.fax_number}}{{form.fax_number.errors}}</td></tr>
+</table>
+</p>
+
+</td></tr>
+</table>
+
+<input type="button" name="back" value="Back" onclick="document.welcome.submit();">
+<input type="submit" name="continue" value="Continue">
+
+</form>
+
+{%endblock%}
+
diff --git a/webapp/templates/settings_welcome_4.html b/webapp/templates/settings_welcome_4.html
new file mode 100644
index 0000000..a362578
--- /dev/null
+++ b/webapp/templates/settings_welcome_4.html
@@ -0,0 +1,26 @@
+{%extends "base.html"%}
+{%block title1%}Settings -{%endblock%}
+{%block body%}
+<h2>Hi!</h2>
+
+<form name="welcome" action="{{post_url}}" method="POST">
+
+{{form.xsrf}}
+{%if form.xsrf.errors%}
+<ul>
+  {%for e in form.xsrf.errors%}
+    <li>{{e}}</li>
+  {%endfor%}
+</ul>
+{%endif%}
+
+{{form.dest}}
+<input type="hidden" name="step" value="4" />
+
+<p>Thanks!  Happy androiding.</p>
+
+
+<input type="submit" value="Done">
+</form>
+
+{%endblock%}
diff --git a/webapp/templates/starred.html b/webapp/templates/starred.html
new file mode 100644
index 0000000..dbe21cb
--- /dev/null
+++ b/webapp/templates/starred.html
@@ -0,0 +1,32 @@
+{%extends "changes_base.html"%}
+
+{%block title1%}Starred Changes -{%endblock%}
+
+{%block body%}
+
+<script language="JavaScript" type="text/javascript"><!--
+function keyPressIntermediary(evt) {
+  return M_dashboardKeyPress(evt);
+}
+document.onkeypress = keyPressIntermediary;
+-->
+</script>
+
+<h1>Starred Changes</h1>
+
+<table class="change-list">
+  {%include "change_heading.html"%}
+  {%if not changes%}
+    <tr><td colspan="8"><span class="disabled">(None)</span></td></tr>
+  {%else%}
+    {%for change in changes%}
+      {%include "change_row.html"%}
+    {%endfor%}
+  {%endif%}
+</table>
+
+<script language="JavaScript" type="text/javascript"><!--
+var dashboardState = new M_DashboardState(window,'change');
+-->
+</script>
+{%endblock%}
diff --git a/webapp/templates/unclaimed.html b/webapp/templates/unclaimed.html
new file mode 100644
index 0000000..2c6c6fd
--- /dev/null
+++ b/webapp/templates/unclaimed.html
@@ -0,0 +1,49 @@
+{%extends "changes_base.html"%}
+{%block title1%}Unclaimed changes -{%endblock%}
+
+{%block body%}
+
+<script language="JavaScript" type="text/javascript"><!--
+function keyPressIntermediary(evt) {
+  return M_dashboardKeyPress(evt);
+}
+document.onkeypress = keyPressIntermediary;
+-->
+</script>
+
+
+<h1>Unclaimed changes</h1>
+<table class="change-list">
+  
+{%include "change_heading.html"%}
+
+{% if not projects %}
+<tr>
+  <td colspan="8">
+    <span class="disabled">(None)</span>
+  </td>
+</tr>
+{% endif %}
+
+{% for project in projects %}
+<tr>
+  <th colspan="8" class="header-title">Project: {{project.name}}</th>
+</tr>
+
+{%if not project.changes%}
+  <tr>
+    <td colspan="8">
+      <span class="disabled">(None)</span>
+    </td>
+  </tr>
+{%else%}
+  {%for change in project.changes%}
+    {%include "change_row.html"%}
+  {%endfor%}
+{%endif%}
+
+{%endfor%}
+
+</table>
+
+{%endblock%}
diff --git a/webapp/templates/user.html b/webapp/templates/user.html
new file mode 100644
index 0000000..396b8e9
--- /dev/null
+++ b/webapp/templates/user.html
@@ -0,0 +1,133 @@
+{%extends "changes_base.html"%}
+
+{%block title1%}Changes for {{email|real_name}} -{%endblock%}
+
+{%block body%}
+
+<script language="JavaScript" type="text/javascript"><!--
+function keyPressIntermediary(evt) {
+  return M_dashboardKeyPress(evt);
+}
+document.onkeypress = keyPressIntermediary;
+-->
+</script>
+
+
+<h1>Changes for {{email|real_name}}</h1>
+<table class="change-list" id="user-queues">
+{%include "change_heading.html"%}
+
+<tr>
+<th colspan="6" class="header-title">Changes Created by {{email|real_name}}</th>
+<th colspan="2" class="header-title pagination">
+  {%if mine_list%}
+    <span id="paged-mine-links">
+    <a href="javascript:M_PagedPrev('/ajax_user_mine/{{email}}','mine','user-queues',M_OnAfterPaged)"
+      id="paged-mine-prev"
+      {%if not mine_prev%}style="display:none"{%endif%}
+    >&lt; Newer</a>
+    <span id="paged-mine-opos">{{mine_opos}}</span>
+    -
+    <span id="paged-mine-oend">{{mine_oend}}</span>
+    <a href="javascript:M_PagedNext('/ajax_user_mine/{{email}}','mine','user-queues',M_OnAfterPaged)"
+      id="paged-mine-next"
+      {%if not mine_next%}style="display:none"{%endif%}
+    >Older &gt;</a>
+    </span>
+    <span id="paged-mine-progress" style="display:none" class="ajax_progress">Loading</span>
+    <span id="paged-mine-opre" style="display:none">{{mine_prev}}</span>
+    <span id="paged-mine-onex" style="display:none">{{mine_next}}</span>
+  {%endif%}
+</th>
+</tr>
+{%if not mine_list%}
+<tr>
+  <td colspan="8">
+    <span class="disabled">(None)</span>
+  </td>
+</tr>
+{%else%}
+{%for change in mine_list%}
+  {%include "change_row.html"%}
+{%endfor%}
+{%endif%}
+
+<tr>
+<th colspan="6" class="header-title">Changes Reviewable by {{email|real_name}}</th>
+<th colspan="2" class="header-title pagination">
+  {%if review_list%}
+    <span id="paged-review-links">
+    <a href="javascript:M_PagedPrev('/ajax_user_review/{{email}}','review','user-queues',M_OnAfterPaged)"
+      id="paged-review-prev"
+      {%if not review_prev%}style="display:none"{%endif%}
+    >&lt; Newer</a>
+    <span id="paged-review-opos">{{review_opos}}</span>
+    -
+    <span id="paged-review-oend">{{review_oend}}</span>
+    <a href="javascript:M_PagedNext('/ajax_user_review/{{email}}','review','user-queues',M_OnAfterPaged)"
+      id="paged-review-next"
+      {%if not review_next%}style="display:none"{%endif%}
+    >Older &gt;</a>
+    </span>
+    <span id="paged-review-progress" style="display:none" class="ajax_progress">Loading</span>
+    <span id="paged-review-opre" style="display:none">{{review_prev}}</span>
+    <span id="paged-review-onex" style="display:none">{{review_next}}</span>
+  {%endif%}
+</th>
+</tr>
+{%if not review_list%}
+<tr>
+  <td colspan="8">
+    <span class="disabled">(None)</span>
+  </td>
+</tr>
+{%else%}
+{%for change in review_list%}
+  {%include "change_row.html"%}
+{%endfor%}
+{%endif%}
+
+<tr>
+<th colspan="6" class="header-title">Recently Closed Changes Created by {{email|real_name}}</th>
+<th colspan="2" class="header-title pagination">
+  {%if closed_list%}
+    <span id="paged-closed-links">
+    <a href="javascript:M_PagedPrev('/ajax_user_closed/{{email}}','closed','user-queues',M_OnAfterPaged)"
+      id="paged-closed-prev"
+      {%if not closed_prev%}style="display:none"{%endif%}
+    >&lt; Newer</a>
+    <span id="paged-closed-opos">{{closed_opos}}</span>
+    -
+    <span id="paged-closed-oend">{{closed_oend}}</span>
+    <a href="javascript:M_PagedNext('/ajax_user_closed/{{email}}','closed','user-queues',M_OnAfterPaged)"
+      id="paged-closed-next"
+      {%if not closed_next%}style="display:none"{%endif%}
+    >Older &gt;</a>
+    </span>
+    <span id="paged-closed-progress" style="display:none" class="ajax_progress">Loading</span>
+    <span id="paged-closed-opre" style="display:none">{{closed_prev}}</span>
+    <span id="paged-closed-onex" style="display:none">{{closed_next}}</span>
+  {%endif%}
+</th>
+</tr>
+{%if not closed_list%}
+<tr>
+  <td colspan="8">
+    <span class="disabled">(None)</span>
+  </td>
+</tr>
+{%else%}
+{%for change in closed_list%}
+  {%include "change_row.html"%}
+{%endfor%}
+{%endif%}
+</table>
+
+<script language="JavaScript" type="text/javascript"><!--
+var dashboardState = new M_DashboardState(window,'change', 'M_myDashboardChangeMarker');
+function M_OnAfterPaged() {
+  dashboardState = new M_DashboardState(window,'change', 'M_myDashboardChangeMarker');
+}
+-->
+</script>
+{%endblock%}
diff --git a/webapp/templates/user_popup.html b/webapp/templates/user_popup.html
new file mode 100644
index 0000000..95e8067
--- /dev/null
+++ b/webapp/templates/user_popup.html
@@ -0,0 +1,7 @@
+<div class="popup-name">
+<b>{{account.real_name}}</b><br/>
+{{account.email}}
+</div>
+<div class="popup-info">
+{%if not account.cla_verified%}<br/><i>No CLA</i>{%endif%}
+</div>